From bd001a71fa60c169784fe68ebe1f32dfd7b2ca1c Mon Sep 17 00:00:00 2001 From: Tomas Horsky Date: Mon, 15 Jun 2026 00:06:10 +0900 Subject: [PATCH] add jurney animation --- public/plane.webp | Bin 0 -> 8252 bytes src/App.svelte | 57 +++- src/lib/world-map/JourneyView.svelte | 391 +++++++++++++++++++++++++++ src/lib/world-map/WorldMap.svelte | 2 +- 4 files changed, 448 insertions(+), 2 deletions(-) create mode 100644 public/plane.webp create mode 100644 src/lib/world-map/JourneyView.svelte diff --git a/public/plane.webp b/public/plane.webp new file mode 100644 index 0000000000000000000000000000000000000000..6003f20f2076625bb5c8a5cd7caa62274d34ac8e GIT binary patch literal 8252 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 { initAuth(); }); @@ -30,7 +47,14 @@ {#if screen === 'worldmap'}
-
+
+ {#if journeyActive} + + {:else} + + + {/if} +
{:else} @@ -71,5 +95,36 @@ .map-area { flex: 1; overflow: hidden; + position: relative; + } + + .journey-play-btn { + position: absolute; + bottom: 24px; + right: 24px; + z-index: 10; + width: 44px; + height: 44px; + border-radius: 50%; + border: none; + background: #8b5cf6; + color: #fff; + font-size: 20px; + line-height: 1; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 2px 12px rgba(139, 92, 246, 0.4); + transition: background 0.15s ease, transform 0.1s ease, box-shadow 0.15s ease; + } + + .journey-play-btn:hover { + background: #7c3aed; + box-shadow: 0 4px 18px rgba(139, 92, 246, 0.55); + } + + .journey-play-btn:active { + transform: scale(0.92); } diff --git a/src/lib/world-map/JourneyView.svelte b/src/lib/world-map/JourneyView.svelte new file mode 100644 index 0000000..aa6fccd --- /dev/null +++ b/src/lib/world-map/JourneyView.svelte @@ -0,0 +1,391 @@ + + +
+ + {#if isFinished} +
Journey complete!
+ {/if} +
+ + diff --git a/src/lib/world-map/WorldMap.svelte b/src/lib/world-map/WorldMap.svelte index 81b1a2f..4257d89 100644 --- a/src/lib/world-map/WorldMap.svelte +++ b/src/lib/world-map/WorldMap.svelte @@ -81,9 +81,9 @@ } function updateAllFills() { - if (!_paths || !_g) return; const sel = getSelected(); const hc = getHomeCountryCode(); + if (!_paths || !_g) return; _paths.attr('fill', d => countryColor(d, sel, hc)); _g.selectAll('.micro-state').attr('fill', d => countryColor(d, sel, hc)); }