diff --git a/packages/web/src/fx-sprites/DustPuff.svelte b/packages/web/src/fx-sprites/DustPuff.svelte
index 2bd1edf..60c7f4a 100644
--- a/packages/web/src/fx-sprites/DustPuff.svelte
+++ b/packages/web/src/fx-sprites/DustPuff.svelte
@@ -32,8 +32,8 @@
-
-
+
+
@@ -47,7 +47,7 @@
.puff.back { animation-name: blow-b; }
.puff.late { animation-delay: 0.08s; }
.puff.later { animation-delay: 0.16s; }
- .grit circle { fill: #5c523e; animation: grit-fall 0.6s ease-in forwards; }
+ .grit circle { fill: #4a4232; animation: grit-fall 0.6s ease-in forwards; }
@keyframes blow-a {
0% { opacity: 1; transform: translate(0, 0) scale(0.8); }
100% { opacity: 0; transform: translate(var(--ax), var(--ay)) scale(2); }
diff --git a/packages/web/src/fx-sprites/Portal.svelte b/packages/web/src/fx-sprites/Portal.svelte
index f9f92ca..6b325b2 100644
--- a/packages/web/src/fx-sprites/Portal.svelte
+++ b/packages/web/src/fx-sprites/Portal.svelte
@@ -2,6 +2,7 @@
import type { FxOf } from "../fx";
import { CELL } from "./geom";
let { fx }: { fx: FxOf<"portal" | "portal-cell"> } = $props();
+ const uid = $props.id();
{#if fx.kind === "portal"}
@@ -12,6 +13,17 @@
{:else}
+
+
+
+
+
+
+
+
@@ -55,6 +67,7 @@
stroke-dasharray: 7 5;
filter: drop-shadow(0 0 4px rgba(155, 227, 224, 0.8));
}
+ .void { animation: void-open 0.9s ease-out forwards; }
.veil.outer { stroke-width: 2.5; animation: veil-in 0.9s ease-in forwards; }
.veil.inner {
stroke: rgba(180, 138, 224, 0.8);
@@ -62,6 +75,12 @@
animation: veil-in 0.9s ease-in 0.2s forwards;
opacity: 0;
}
+ @keyframes void-open {
+ 0% { opacity: 0; transform: scale(0.4); }
+ 30% { opacity: 1; transform: scale(1); }
+ 75% { opacity: 0.9; transform: scale(0.92); }
+ 100% { opacity: 0; transform: scale(0.5); }
+ }
@keyframes veil-in {
0% { opacity: 0; transform: scale(1.25); }
25% { opacity: 1; }
diff --git a/packages/web/src/fx-sprites/Streak.svelte b/packages/web/src/fx-sprites/Streak.svelte
index 311cc86..8b3992c 100644
--- a/packages/web/src/fx-sprites/Streak.svelte
+++ b/packages/web/src/fx-sprites/Streak.svelte
@@ -11,7 +11,7 @@
-
@@ -20,18 +20,18 @@
fill: none;
stroke-linecap: round;
stroke-dasharray: 100 100;
- animation: draw-collapse 0.55s ease-out forwards;
+ animation: draw-collapse 0.68s ease-out forwards;
}
.trail.wide { stroke: rgba(233, 225, 203, 0.4); stroke-width: 7; }
.trail.bright { stroke: rgba(255, 253, 240, 0.9); stroke-width: 3; }
.head {
fill: #fffdf0;
- animation: head-life 0.5s ease-out forwards;
+ animation: head-life 0.6s ease-out forwards;
}
/* Draw from source to head, then the tail chases it into the destination. */
@keyframes draw-collapse {
0% { stroke-dashoffset: 100; opacity: 0.95; }
- 47% { stroke-dashoffset: 0; opacity: 0.95; }
+ 56% { stroke-dashoffset: 0; opacity: 0.95; }
100% { stroke-dashoffset: -100; opacity: 0; }
}
@keyframes head-life {
diff --git a/packages/web/src/fx-sprites/TacksOw.svelte b/packages/web/src/fx-sprites/TacksOw.svelte
index 75a4473..9f93389 100644
--- a/packages/web/src/fx-sprites/TacksOw.svelte
+++ b/packages/web/src/fx-sprites/TacksOw.svelte
@@ -14,8 +14,8 @@
{#each TACKS as t (t.cls)}
-
-
+
+
{/each}
@@ -34,10 +34,10 @@
.tack.late { animation-delay: 0.1s; }
.tack.later { animation-delay: 0.2s; }
@keyframes tack-hop {
- 0% { opacity: 0; transform: translateY(3px); }
- 25% { opacity: 1; transform: translateY(-6px); }
- 55% { transform: translateY(-1px); }
- 75% { transform: translateY(-4px); }
- 100% { opacity: 0; transform: translateY(-1px); }
+ 0% { opacity: 0; transform: translateY(4px); }
+ 22% { opacity: 1; transform: translateY(-10px); }
+ 50% { transform: translateY(-2px); }
+ 72% { transform: translateY(-7px); }
+ 100% { opacity: 0; transform: translateY(-2px); }
}
diff --git a/packages/web/src/fx-sprites/Whiff.svelte b/packages/web/src/fx-sprites/Whiff.svelte
index 8b90edd..7b844df 100644
--- a/packages/web/src/fx-sprites/Whiff.svelte
+++ b/packages/web/src/fx-sprites/Whiff.svelte
@@ -6,27 +6,27 @@
-
-
-
+
+
+