From 2e091da01a45b42960d74b7791b3a3cd02a8060a Mon Sep 17 00:00:00 2001 From: Koishi Date: Mon, 23 Feb 2026 18:29:00 +0800 Subject: [PATCH 01/52] feat: new beach ui --- frontend.new/index.html | 1173 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 1173 insertions(+) create mode 100644 frontend.new/index.html diff --git a/frontend.new/index.html b/frontend.new/index.html new file mode 100644 index 00000000..1ad4852f --- /dev/null +++ b/frontend.new/index.html @@ -0,0 +1,1173 @@ + + + + + +Sunset Beach + + + + + + + +
+ + +
+ + +
+ + + +
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ +
Drag or press arrow keys to explore the coastline
+ + + + From 879cdc475c13ce5bceb2783112aeefae851522b8 Mon Sep 17 00:00:00 2001 From: Koishi Date: Mon, 23 Feb 2026 18:30:12 +0800 Subject: [PATCH 02/52] feat: new beach ui --- frontend.new/index.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 frontend.new/index.html diff --git a/frontend.new/index.html b/frontend.new/index.html old mode 100644 new mode 100755 From 8e096a030a3c0217c4728276e30ba02139e13c1c Mon Sep 17 00:00:00 2001 From: Koishi Date: Mon, 23 Feb 2026 22:20:50 +0800 Subject: [PATCH 03/52] perf: improve css performance --- frontend.new/index.html | 94 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 10 deletions(-) diff --git a/frontend.new/index.html b/frontend.new/index.html index 1ad4852f..b717582e 100755 --- a/frontend.new/index.html +++ b/frontend.new/index.html @@ -29,6 +29,7 @@ top: 0; left: 0; height: 100%; will-change: transform; + contain: layout style paint; } /* ============================================================ @@ -317,6 +318,7 @@ background: rgba(255, 225, 160, 0.5); border-radius: 50%; filter: blur(1.5px); + animation-fill-mode: backwards; } @keyframes streakCalm { @@ -351,6 +353,24 @@ 100% { opacity: 0.25; transform: translateX(-50%) scaleX(0.85) translateY(0); } } +.reflection-glow { + position: absolute; + left: 50%; + transform: translateX(-50%); + border-radius: 50%; + pointer-events: none; + animation-fill-mode: backwards; +} + +@keyframes glowShimmer { + 0% { opacity: 0.35; transform: translateX(-50%) scaleX(0.92) translateY(0); } + 20% { opacity: 0.7; transform: translateX(-50%) scaleX(1.06) translateY(3px); } + 45% { opacity: 0.5; transform: translateX(-50%) scaleX(0.96) translateY(-2px); } + 65% { opacity: 0.8; transform: translateX(-50%) scaleX(1.03) translateY(2px); } + 85% { opacity: 0.45; transform: translateX(-50%) scaleX(0.98) translateY(-1px); } + 100% { opacity: 0.35; transform: translateX(-50%) scaleX(0.92) translateY(0); } +} + /* ============================================================ LAYER 5 — WAVES (3 staggered layers: far / mid / near) Watercolor / picture-book aesthetic @@ -398,7 +418,6 @@ left: -2%; width: 104%; pointer-events: none; opacity: 0; - will-change: transform, opacity; border-radius: 50% 50% 45% 55% / 60% 60% 50% 50%; } @@ -407,7 +426,6 @@ position: absolute; border-radius: 50%; pointer-events: none; - will-change: opacity, transform; } @keyframes particleGlow { @@ -688,6 +706,7 @@ /* ---------- Clouds ---------- */ const cloudsEl = document.getElementById('clouds'); + const cloudsFrag = document.createDocumentFragment(); const cloudData = [ { x: 5, y: 18, w: 180, h: 40, bright: false }, { x: 15, y: 30, w: 240, h: 50, bright: true }, @@ -708,8 +727,9 @@ width:${c.w}px;height:${c.h}px; animation: cloudDrift${i % 3} ${20 + i * 3}s ease-in-out infinite alternate; `; - cloudsEl.appendChild(el); + cloudsFrag.appendChild(el); }); + cloudsEl.appendChild(cloudsFrag); const cloudStyle = document.createElement('style'); cloudStyle.textContent = ` @@ -805,6 +825,7 @@ /* ---------- Ocean shimmer streaks ---------- */ const oceanEl = document.getElementById('ocean'); + const oceanFrag = document.createDocumentFragment(); for (let i = 0; i < 25; i++) { const sh = document.createElement('div'); sh.className = 'shimmer'; @@ -815,7 +836,7 @@ animation-delay:${Math.random() * 5}s; animation-duration:${3 + Math.random() * 4}s; `; - oceanEl.appendChild(sh); + oceanFrag.appendChild(sh); } /* ---------- Ocean wave-lines ---------- */ @@ -827,11 +848,38 @@ animation-delay:${i * 0.5}s; opacity:${0.2 + Math.random() * 0.3}; `; - oceanEl.appendChild(wl); + oceanFrag.appendChild(wl); } + oceanEl.appendChild(oceanFrag); - /* ---------- Sun reflection streaks (wave-synced where overlapping) ---------- */ + /* ---------- Sun reflection — glow column + detail streaks ---------- */ const reflLayer = document.getElementById('sunReflectionLayer'); + const reflFrag = document.createDocumentFragment(); + + /* Base glow blocks — large soft overlapping blobs forming a continuous light column */ + const glowBlocks = [ + { top: 1, h: 22, w: 160, alpha: 0.45, blur: 20, dur: 6 }, + { top: 12, h: 28, w: 240, alpha: 0.38, blur: 25, dur: 7.5 }, + { top: 30, h: 26, w: 300, alpha: 0.30, blur: 22, dur: 5.5 }, + { top: 48, h: 22, w: 250, alpha: 0.22, blur: 20, dur: 8 }, + { top: 62, h: 18, w: 180, alpha: 0.15, blur: 18, dur: 6.5 }, + ]; + glowBlocks.forEach((b, i) => { + const el = document.createElement('div'); + el.className = 'reflection-glow'; + el.style.cssText = ` + top:${b.top}%; + width:${b.w}px; + height:${b.h}%; + background:radial-gradient(ellipse, rgba(255,215,140,${b.alpha}) 0%, rgba(255,200,120,${(b.alpha * 0.5).toFixed(3)}) 40%, transparent 70%); + filter:blur(${b.blur}px); + animation:glowShimmer ${b.dur}s ease-in-out ${(i * 1.3).toFixed(1)}s infinite; + animation-fill-mode:backwards; + `; + reflFrag.appendChild(el); + }); + + /* Detail streaks */ const widthCurve = [9,8,7,6,5,3,3,5,4,7,2,4,4,6,3,3,3,5,4,2,2,3,3,5,6,6,7,7,8]; for (let i = 0; i < 45; i++) { const t = i / 45; @@ -873,9 +921,11 @@ background:rgba(${r},${g},${b},${brightness.toFixed(2)}); animation:${animName} ${animDur}s ease-in-out infinite ${animDir}; animation-delay:${(Math.random() * 4).toFixed(1)}s; + animation-fill-mode:backwards; `; - reflLayer.appendChild(streak); + reflFrag.appendChild(streak); } + reflLayer.appendChild(reflFrag); /* ---------- WAVE SYSTEM — wavefront rows advancing to shore ---------- */ @@ -883,6 +933,7 @@ function rf(lo, hi) { return lo + Math.random() * (hi - lo); } function createWavefronts(container, config) { + var frag = document.createDocumentFragment(); for (var i = 0; i < config.rows; i++) { var baseDelay = (i * config.cycle / config.rows) + rf(-0.8, 0.8); if (baseDelay < 0) baseDelay += config.cycle; @@ -959,10 +1010,11 @@ 'background:' + bg + ';' + 'filter:blur(' + blur.toFixed(1) + 'px);' + 'animation:' + config.anim + ' ' + cycleJitter.toFixed(1) + 's ease-in-out ' + segDelay.toFixed(1) + 's infinite;'; - container.appendChild(el); + frag.appendChild(el); } } } + container.appendChild(frag); } /* Far: dreamy, faint — 6 segments with smooth curvature */ @@ -1003,6 +1055,7 @@ /* ---------- Wave particle sparkles ---------- */ function createWaveParticles(container, count, topMin, topMax) { + var frag = document.createDocumentFragment(); for (var i = 0; i < count; i++) { var p = document.createElement('div'); p.className = 'wave-particle'; @@ -1027,8 +1080,9 @@ 'background:radial-gradient(circle,' + color + ' 0%,transparent 70%);' + 'box-shadow:0 0 ' + (size * 1.5).toFixed(0) + 'px ' + color + ';' + 'animation:particleGlow ' + dur.toFixed(1) + 's ease-in-out ' + delay.toFixed(1) + 's infinite;'; - container.appendChild(p); + frag.appendChild(p); } + container.appendChild(frag); } @@ -1037,6 +1091,7 @@ /* Sparkles on wet sand zone */ createWaveParticles(sandLayer, 35, 1, 16); + const sandFrag = document.createDocumentFragment(); for (let i = 0; i < 80; i++) { const g = document.createElement('div'); g.className = 'sand-grain'; @@ -1047,8 +1102,9 @@ width:${1 + Math.random() * 2}px; height:${1 + Math.random() * 2}px; `; - sandLayer.appendChild(g); + sandFrag.appendChild(g); } + sandLayer.appendChild(sandFrag); /* ========== PARALLAX ENGINE ========== */ const layers = document.querySelectorAll('.layer[data-speed]'); let targetOffset = 0; @@ -1090,6 +1146,7 @@ }); } + let animating = true; let prevT = performance.now(); function loop(now) { const dt = Math.min((now - prevT) / 1000, 0.1); @@ -1100,8 +1157,22 @@ targetOffset = Math.max(-maxOffset, Math.min(maxOffset, targetOffset)); currentOffset += (targetOffset - currentOffset) * ease; applyParallax(); + + if (Math.abs(targetOffset - currentOffset) < 0.5 && !keys.ArrowLeft && !keys.ArrowRight && !dragging) { + currentOffset = targetOffset; + applyParallax(); + animating = false; + return; + } requestAnimationFrame(loop); } + function startLoop() { + if (!animating) { + animating = true; + prevT = performance.now(); + requestAnimationFrame(loop); + } + } requestAnimationFrame(loop); /* ---------- KEYBOARD ---------- */ @@ -1109,6 +1180,7 @@ if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { e.preventDefault(); keys[e.key] = true; + startLoop(); hideHint(); } }); @@ -1128,6 +1200,7 @@ dragStartX = e.clientX; offsetAtDragStart = targetOffset; document.body.classList.add('dragging'); + startLoop(); hideHint(); }); document.addEventListener('mousemove', e => { @@ -1153,6 +1226,7 @@ document.addEventListener('touchstart', e => { touchStartX = e.touches[0].clientX; touchOffsetStart = targetOffset; + startLoop(); hideHint(); }, { passive: true }); document.addEventListener('touchmove', e => { From f43e11be3281818473a7e178437a127f3f7f9f14 Mon Sep 17 00:00:00 2001 From: Koishi Date: Tue, 24 Feb 2026 00:53:17 +0800 Subject: [PATCH 04/52] perf: improve css performance --- frontend.new/assets/sand.png | 3 + frontend.new/index.html | 133 +++++------------------------------ 2 files changed, 21 insertions(+), 115 deletions(-) create mode 100644 frontend.new/assets/sand.png diff --git a/frontend.new/assets/sand.png b/frontend.new/assets/sand.png new file mode 100644 index 00000000..f149b922 --- /dev/null +++ b/frontend.new/assets/sand.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e711c76072727fa9358c89f836164928a573e501f0cbc9a0b48d225a08811f9 +size 1394947 diff --git a/frontend.new/index.html b/frontend.new/index.html index b717582e..06f44ca7 100755 --- a/frontend.new/index.html +++ b/frontend.new/index.html @@ -68,7 +68,7 @@ ============================================================ */ .seagull-layer { width: 400vw; - z-index: 4; + z-index: 7; top: 0; height: 40%; pointer-events: none; } @@ -377,23 +377,26 @@ ============================================================ */ .wave-layer-far { width: 400vw; - z-index: 14; + z-index: 24; top: 33%; height: 18%; pointer-events: none; + contain: layout style; filter: url(#watercolor-far) blur(1.5px); } .wave-layer-mid { width: 400vw; - z-index: 17; + z-index: 26; top: 35%; height: 16%; pointer-events: none; + contain: layout style; filter: url(#watercolor-mid) blur(0.8px); } .wave-layer-near { width: 400vw; - z-index: 22; + z-index: 28; top: 36%; height: 16%; pointer-events: none; + contain: layout style; filter: url(#watercolor-near) blur(0.3px); } @@ -513,84 +516,12 @@ height: calc(58% + 2px); } -.sand { - width: 100%; height: 100%; - background: linear-gradient( - to bottom, - rgba(100, 160, 200, 0) 0%, - rgba(110, 165, 198, 0.08) 2%, - rgba(130, 175, 192, 0.18) 4.5%, - rgba(155, 188, 182, 0.32) 7.5%, - rgba(178, 198, 168, 0.48) 11%, - rgba(200, 202, 156, 0.62) 15%, - rgba(218, 206, 155, 0.78) 19%, - rgba(232, 210, 162, 0.92) 23%, - #e0cca0 28%, - #e6d4ae 38%, - #ecdcba 52%, - #f0e2c6 70%, - #f4e8d0 86%, - #f8eed8 100% - ); -} - -.sand-wet { - position: absolute; - top: 0; - width: 100%; - height: 18%; - background: linear-gradient( - to bottom, - rgba(80, 140, 180, 0.15), - rgba(110, 158, 178, 0.06), - transparent - ); -} - -/* --- Tidal zone (滩涂) — wet sand transition --- */ -.tidal-zone { - position: absolute; - top: 22%; - width: 100%; - height: 74%; - pointer-events: none; - filter: url(#tidal-distort); - background: linear-gradient( - to top, - rgba(145, 115, 78, 0.30) 0%, - rgba(155, 125, 85, 0.24) 15%, - rgba(168, 140, 98, 0.18) 30%, - rgba(182, 158, 115, 0.10) 46%, - rgba(198, 175, 135, 0.05) 60%, - rgba(210, 190, 160, 0.02) 76%, - rgba(220, 205, 175, 0.008) 88%, - transparent 100% - ); -} -.tidal-zone-accent { +.sand-texture { position: absolute; - top: 18%; - width: 100%; - height: 22%; + top: 0; left: 0; + width: 100%; height: 100%; + display: block; pointer-events: none; - filter: url(#tidal-distort-accent); - background: linear-gradient( - to top, - transparent 0%, - rgba(130, 100, 62, 0.06) 8%, - rgba(135, 105, 68, 0.16) 22%, - rgba(145, 115, 75, 0.28) 40%, - rgba(162, 135, 95, 0.16) 62%, - rgba(180, 155, 118, 0.05) 82%, - transparent 100% - ); -} - -.sand-grain { - position: absolute; - width: 2px; height: 2px; - background: rgba(210, 195, 170, 0.5); - border-radius: 50%; } /* ============================================================ @@ -635,18 +566,6 @@ - - - - - - - - - - - - @@ -660,7 +579,7 @@ -
+
@@ -680,7 +599,7 @@
-
+
@@ -688,10 +607,7 @@
-
-
-
-
+
@@ -1086,32 +1002,19 @@ } - /* ---------- Sand grains ---------- */ + /* ---------- Sand sparkles ---------- */ const sandLayer = document.getElementById('sandLayer'); /* Sparkles on wet sand zone */ createWaveParticles(sandLayer, 35, 1, 16); - const sandFrag = document.createDocumentFragment(); - for (let i = 0; i < 80; i++) { - const g = document.createElement('div'); - g.className = 'sand-grain'; - g.style.cssText = ` - left:${Math.random() * 100}%; - top:${22 + Math.random() * 78}%; - opacity:${0.2 + Math.random() * 0.4}; - width:${1 + Math.random() * 2}px; - height:${1 + Math.random() * 2}px; - `; - sandFrag.appendChild(g); - } - sandLayer.appendChild(sandFrag); + /* ========== PARALLAX ENGINE ========== */ const layers = document.querySelectorAll('.layer[data-speed]'); let targetOffset = 0; let currentOffset = 0; let maxOffset = vw * 1.5; - const scrollSpeed = 8; - const ease = 0.08; + const scrollSpeed = 24; + const ease = 0.14; const keys = { ArrowLeft: false, ArrowRight: false }; From 4fc11570ff61e5c42116206acff0e98915efe199 Mon Sep 17 00:00:00 2001 From: Koishi Date: Tue, 24 Feb 2026 02:09:32 +0800 Subject: [PATCH 05/52] perf: better css --- frontend.new/assets/render-sand.js | 189 +++++ frontend.new/index.html | 115 ++- frontend.new/package-lock.json | 1135 ++++++++++++++++++++++++++++ frontend.new/package.json | 5 + 4 files changed, 1411 insertions(+), 33 deletions(-) create mode 100644 frontend.new/assets/render-sand.js create mode 100644 frontend.new/package-lock.json create mode 100644 frontend.new/package.json diff --git a/frontend.new/assets/render-sand.js b/frontend.new/assets/render-sand.js new file mode 100644 index 00000000..74634ba7 --- /dev/null +++ b/frontend.new/assets/render-sand.js @@ -0,0 +1,189 @@ +#!/usr/bin/env node +/** + * render-sand.js — 用 Puppeteer 将沙滩 CSS 渲染为 sand.png + * + * 用法: node assets/render-sand.js + * + * 可调参数在下方 CONFIG 区域,改完后重新运行即可。 + * 生成: assets/sand.png (7680×630, RGBA, 透明顶部渐变到 #f8eed8) + */ + +const puppeteer = require('puppeteer'); +const path = require('path'); + +// ============ CONFIG ============ +const WIDTH = 7680; +const HEIGHT = 630; +const OUTPUT = path.join(__dirname, process.argv[2] || 'sand.png'); +// ================================ + +const html = ` + + + + + + + + +
+
+
+
+
+
+ + + +`; + +(async () => { + const browser = await puppeteer.launch({ + headless: 'new', + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--default-background-color=00000000', // transparent + `--window-size=${WIDTH},${HEIGHT}`, + ], + }); + + const page = await browser.newPage(); + await page.setViewport({ width: WIDTH, height: HEIGHT, deviceScaleFactor: 1 }); + await page.setContent(html, { waitUntil: 'networkidle0' }); + + // 等待 SVG filter 渲染完成 + await new Promise(r => setTimeout(r, 500)); + + await page.screenshot({ + path: OUTPUT, + type: 'png', + omitBackground: true, + clip: { x: 0, y: 0, width: WIDTH, height: HEIGHT }, + }); + + await browser.close(); + console.log('sand.png saved to', OUTPUT, `(${WIDTH}x${HEIGHT})`); +})(); diff --git a/frontend.new/index.html b/frontend.new/index.html index 06f44ca7..3577c524 100755 --- a/frontend.new/index.html +++ b/frontend.new/index.html @@ -439,31 +439,83 @@ 100% { opacity: 0; transform: translateY(-8px) scale(0.4); } } -/* Wavefront — rush onto shore, linger, pull back */ -@keyframes advanceFar { - 0% { transform: translateY(0); opacity: 0; } - 15% { opacity: 0.3; } - 42% { transform: translateY(5vh); opacity: 0.35; } - 58% { transform: translateY(5.5vh); opacity: 0.2; } - 85% { transform: translateY(2vh); opacity: 0.06; } +/* Wavefront — rush onto shore, immediately retreat (3 reach variants per layer) + Timing per segment: + rush-in → cubic-bezier(0.25,0.6,0.35,1) smooth deceleration to zero + retreat → cubic-bezier(0.35,0.1,0.7,0.5) brief hesitation then crisp pull-back +*/ +@keyframes advanceFarS { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(3.2vh); opacity: 0.45; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceFarM { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(4.5vh); opacity: 0.5; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceFarL { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(5vh); opacity: 0.55; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } 100% { transform: translateY(0); opacity: 0; } } -@keyframes advanceMid { - 0% { transform: translateY(0); opacity: 0; } - 12% { opacity: 0.45; } - 40% { transform: translateY(6vh); opacity: 0.5; } - 55% { transform: translateY(6.5vh); opacity: 0.3; } - 82% { transform: translateY(2vh); opacity: 0.08; } +@keyframes advanceMidS { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(3.6vh); opacity: 0.55; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceMidM { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(5.2vh); opacity: 0.65; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceMidL { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(6vh); opacity: 0.7; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } 100% { transform: translateY(0); opacity: 0; } } -@keyframes advanceNear { - 0% { transform: translateY(0) scaleX(0.98); opacity: 0; } - 10% { opacity: 0.6; } - 38% { transform: translateY(7vh) scaleX(1.03); opacity: 0.7; } - 52% { transform: translateY(7.5vh) scaleX(1.05); opacity: 0.45; } - 80% { transform: translateY(2.5vh) scaleX(1.0); opacity: 0.1; } +@keyframes advanceNearS { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(4.5vh) scaleX(1.03); opacity: 0.75; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } + 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } +} +@keyframes advanceNearM { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(6vh) scaleX(1.05); opacity: 0.85; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } + 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } +} +@keyframes advanceNearL { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(7vh) scaleX(1.05); opacity: 0.9; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } } @@ -545,22 +597,19 @@ - + - - -Sunset Beach - + + + Sunset Beach - - - - -
- - -
- - -
- - - -
- - -
-
-
-
-
- - -
-
-
-
- - -
-
- - -
-
-
-
-
- - -
- -
- -
- -
Drag or press arrow keys to explore the coastline
- - +
+ diff --git a/frontend.new/package-lock.json b/frontend.new/package-lock.json index f5b0a0d3..3ce504aa 100644 --- a/frontend.new/package-lock.json +++ b/frontend.new/package-lock.json @@ -1,17 +1,30 @@ { - "name": "frontend.new", + "name": "beach-scene", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "beach-scene", + "version": "0.1.0", "dependencies": { - "puppeteer": "^24.37.5" + "vue": "^3.5.13" + }, + "devDependencies": { + "@types/node": "^25.3.0", + "@vitejs/plugin-vue": "^5.2.3", + "puppeteer": "^24.37.5", + "tsx": "^4.21.0", + "typescript": "~5.7.3", + "vite": "^6.2.4", + "vue-tsc": "^2.2.8" } }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -22,6 +35,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", @@ -31,10 +53,487 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, "node_modules/@puppeteer/browsers": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "debug": "^4.4.3", @@ -52,18 +551,377 @@ "node": ">=18" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "dev": true, "license": "MIT", - "optional": true, + "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -72,25 +930,214 @@ "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.29.tgz", + "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.29", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz", + "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz", + "integrity": "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.29", + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz", + "integrity": "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.29.tgz", + "integrity": "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.29.tgz", + "integrity": "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz", + "integrity": "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.29", + "@vue/runtime-core": "3.5.29", + "@vue/shared": "3.5.29", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.29.tgz", + "integrity": "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29" + }, + "peerDependencies": { + "vue": "3.5.29" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", + "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "license": "MIT" + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14" } }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -100,6 +1147,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -115,12 +1163,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, "license": "Python-2.0" }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.1" @@ -133,6 +1183,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "react-native-b4a": "*" @@ -143,10 +1194,21 @@ } } }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/bare-events": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "bare-abort-controller": "*" @@ -161,6 +1223,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.4.tgz", "integrity": "sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -183,9 +1246,10 @@ } }, "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.7.0.tgz", + "integrity": "sha512-64Rcwj8qlnTZU8Ps6JJEdSmxBEUGgI7g8l+lMtsJLl4IsfTcHMTfJ188u2iGV6P6YPRZrtv72B2kjn+hp+Yv3g==", + "dev": true, "license": "Apache-2.0", "optional": true, "engines": { @@ -196,6 +1260,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -206,6 +1271,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.0.tgz", "integrity": "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -229,6 +1295,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -239,15 +1306,30 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -257,6 +1339,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -266,6 +1349,7 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -279,6 +1363,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -293,6 +1378,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -305,12 +1391,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.1", @@ -333,19 +1421,34 @@ } } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14" } }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -363,6 +1466,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, "license": "MIT", "dependencies": { "ast-types": "^0.13.4", @@ -377,6 +1481,7 @@ "version": "0.0.1566079", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1566079.tgz", "integrity": "sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==", + "dev": true, "license": "BSD-3-Clause", "peer": true }, @@ -384,21 +1489,36 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -408,15 +1528,59 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -426,6 +1590,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -447,6 +1612,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -460,15 +1626,23 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -478,6 +1652,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "bare-events": "^2.7.0" @@ -487,6 +1662,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", @@ -507,21 +1683,57 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, "license": "MIT" }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -531,6 +1743,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, "license": "MIT", "dependencies": { "pump": "^3.0.0" @@ -542,10 +1755,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/get-uri": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", @@ -556,10 +1783,21 @@ "node": ">= 14" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.0", @@ -573,6 +1811,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -586,6 +1825,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -602,6 +1842,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, "license": "MIT", "engines": { "node": ">= 12" @@ -611,12 +1852,14 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, "license": "MIT" }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -626,12 +1869,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -644,39 +1889,95 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, "license": "MIT" }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz", + "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, "license": "MIT" }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, "license": "MIT" }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -686,6 +1987,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -695,6 +1997,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", @@ -714,6 +2017,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, "license": "MIT", "dependencies": { "degenerator": "^5.0.0", @@ -727,6 +2031,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -739,6 +2044,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -753,10 +2059,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, "license": "MIT" }, "node_modules/picocolors": { @@ -765,10 +2079,53 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -778,6 +2135,7 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -797,12 +2155,14 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, "license": "MIT" }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -813,6 +2173,7 @@ "version": "24.37.5", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.37.5.tgz", "integrity": "sha512-3PAOIQLceyEmn1Fi76GkGO2EVxztv5OtdlB1m8hMUZL3f8KDHnlvXbvCXv+Ls7KzF1R0KdKBqLuT/Hhrok12hQ==", + "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -834,6 +2195,7 @@ "version": "24.37.5", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.37.5.tgz", "integrity": "sha512-ybL7iE78YPN4T6J+sPLO7r0lSByp/0NN6PvfBEql219cOnttoTFzCWKiBOjstXSqi/OKpwae623DWAsL7cn2MQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.13.0", @@ -852,6 +2214,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -861,15 +2224,72 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -882,6 +2302,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -892,6 +2313,7 @@ "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, "license": "MIT", "dependencies": { "ip-address": "^10.0.1", @@ -906,6 +2328,7 @@ "version": "8.0.5", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -920,16 +2343,27 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/streamx": { "version": "2.23.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dev": true, "license": "MIT", "dependencies": { "events-universal": "^1.0.0", @@ -941,6 +2375,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -955,6 +2390,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -967,6 +2403,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dev": true, "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -981,6 +2418,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, "license": "MIT", "dependencies": { "b4a": "^1.6.4", @@ -992,6 +2430,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1002,40 +2441,704 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "node_modules/typed-query-selector": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, "license": "MIT" }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.29.tgz", + "integrity": "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-sfc": "3.5.29", + "@vue/runtime-dom": "3.5.29", + "@vue/server-renderer": "3.5.29", + "@vue/shared": "3.5.29" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } }, "node_modules/webdriver-bidi-protocol": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "dev": true, "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -1053,12 +3156,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/ws": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -1080,6 +3185,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -1089,6 +3195,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -1107,6 +3214,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -1116,6 +3224,7 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", @@ -1126,6 +3235,7 @@ "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/frontend.new/package.json b/frontend.new/package.json index 052fb49d..500fe563 100644 --- a/frontend.new/package.json +++ b/frontend.new/package.json @@ -1,5 +1,24 @@ { + "name": "beach-scene", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview", + "render-sand": "tsx assets/render-sand.ts" + }, "dependencies": { - "puppeteer": "^24.37.5" + "vue": "^3.5.13" + }, + "devDependencies": { + "@types/node": "^25.3.0", + "@vitejs/plugin-vue": "^5.2.3", + "puppeteer": "^24.37.5", + "tsx": "^4.21.0", + "typescript": "~5.7.3", + "vite": "^6.2.4", + "vue-tsc": "^2.2.8" } } diff --git a/frontend.new/src/App.vue b/frontend.new/src/App.vue new file mode 100644 index 00000000..48f14ed5 --- /dev/null +++ b/frontend.new/src/App.vue @@ -0,0 +1,7 @@ + + + diff --git a/frontend.new/src/assets/sand.png b/frontend.new/src/assets/sand.png new file mode 100644 index 00000000..f149b922 --- /dev/null +++ b/frontend.new/src/assets/sand.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e711c76072727fa9358c89f836164928a573e501f0cbc9a0b48d225a08811f9 +size 1394947 diff --git a/frontend.new/src/components/scene/BeachScene.vue b/frontend.new/src/components/scene/BeachScene.vue new file mode 100644 index 00000000..01fca9a3 --- /dev/null +++ b/frontend.new/src/components/scene/BeachScene.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/frontend.new/src/components/scene/CloudLayer.vue b/frontend.new/src/components/scene/CloudLayer.vue new file mode 100644 index 00000000..d75af339 --- /dev/null +++ b/frontend.new/src/components/scene/CloudLayer.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/frontend.new/src/components/scene/HintOverlay.vue b/frontend.new/src/components/scene/HintOverlay.vue new file mode 100644 index 00000000..bbd5b489 --- /dev/null +++ b/frontend.new/src/components/scene/HintOverlay.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/frontend.new/src/components/scene/OceanLayer.vue b/frontend.new/src/components/scene/OceanLayer.vue new file mode 100644 index 00000000..fe7f7c8f --- /dev/null +++ b/frontend.new/src/components/scene/OceanLayer.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/frontend.new/src/components/scene/SandLayer.vue b/frontend.new/src/components/scene/SandLayer.vue new file mode 100644 index 00000000..33bbce3a --- /dev/null +++ b/frontend.new/src/components/scene/SandLayer.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/frontend.new/src/components/scene/SeagullLayer.vue b/frontend.new/src/components/scene/SeagullLayer.vue new file mode 100644 index 00000000..539606cc --- /dev/null +++ b/frontend.new/src/components/scene/SeagullLayer.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/frontend.new/src/components/scene/SkyLayer.vue b/frontend.new/src/components/scene/SkyLayer.vue new file mode 100644 index 00000000..d31aa18f --- /dev/null +++ b/frontend.new/src/components/scene/SkyLayer.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/frontend.new/src/components/scene/SunLayer.vue b/frontend.new/src/components/scene/SunLayer.vue new file mode 100644 index 00000000..cfb97b8a --- /dev/null +++ b/frontend.new/src/components/scene/SunLayer.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/frontend.new/src/components/scene/SunReflectionLayer.vue b/frontend.new/src/components/scene/SunReflectionLayer.vue new file mode 100644 index 00000000..ec3e56fe --- /dev/null +++ b/frontend.new/src/components/scene/SunReflectionLayer.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/frontend.new/src/components/scene/WaveLayer.vue b/frontend.new/src/components/scene/WaveLayer.vue new file mode 100644 index 00000000..66bcdb29 --- /dev/null +++ b/frontend.new/src/components/scene/WaveLayer.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/frontend.new/src/composables/useAnimationLoop.ts b/frontend.new/src/composables/useAnimationLoop.ts new file mode 100644 index 00000000..5ddba309 --- /dev/null +++ b/frontend.new/src/composables/useAnimationLoop.ts @@ -0,0 +1,36 @@ +import { ref, onUnmounted } from 'vue' + +export function useAnimationLoop(callback: (dt: number) => boolean) { + const animating = ref(false) + let rafId = 0 + let prevT = 0 + + function loop(now: number) { + const dt = Math.min((now - prevT) / 1000, 0.1) + prevT = now + + const shouldContinue = callback(dt) + if (shouldContinue) { + rafId = requestAnimationFrame(loop) + } else { + animating.value = false + } + } + + function start() { + if (!animating.value) { + animating.value = true + prevT = performance.now() + rafId = requestAnimationFrame(loop) + } + } + + function stop() { + animating.value = false + cancelAnimationFrame(rafId) + } + + onUnmounted(stop) + + return { animating, start, stop } +} diff --git a/frontend.new/src/composables/useInputHandler.ts b/frontend.new/src/composables/useInputHandler.ts new file mode 100644 index 00000000..caf0de0d --- /dev/null +++ b/frontend.new/src/composables/useInputHandler.ts @@ -0,0 +1,16 @@ +import { inject, onMounted, type Ref } from 'vue' +import { PARALLAX_KEY, type ParallaxContext } from './useParallax' + +export function useInputHandler() { + // This composable is now merged into useParallax for simplicity. + // If you need access to the parallax context from a child component, use this: + const ctx = inject(PARALLAX_KEY) + + function registerLayer(el: HTMLElement | null, speed: number) { + if (el && ctx) { + ctx.registerLayer(el, speed) + } + } + + return { registerLayer } +} diff --git a/frontend.new/src/composables/useParallax.ts b/frontend.new/src/composables/useParallax.ts new file mode 100644 index 00000000..a2e8a81e --- /dev/null +++ b/frontend.new/src/composables/useParallax.ts @@ -0,0 +1,180 @@ +import { ref, reactive, onMounted, onUnmounted, provide, type InjectionKey, type Ref } from 'vue' +import { PARALLAX_EASE, SCROLL_SPEED } from '@/constants/layers' +import { useAnimationLoop } from './useAnimationLoop' + +export interface ParallaxContext { + currentOffset: Ref + registerLayer: (el: HTMLElement, speed: number) => void + startLoop: () => void + hideHint: () => void +} + +export const PARALLAX_KEY: InjectionKey = Symbol('parallax') + +export function useParallax() { + const targetOffset = ref(0) + const currentOffset = ref(0) + const maxOffset = ref(0) + const hintHidden = ref(false) + + const keys = reactive({ ArrowLeft: false, ArrowRight: false }) + let dragging = false + + interface LayerMeta { + el: HTMLElement + speed: number + centerShift: number + } + const layerMeta: LayerMeta[] = [] + + function recalcParallax() { + const vw = window.innerWidth + maxOffset.value = vw * 1.5 + layerMeta.forEach(m => { + m.centerShift = -(m.el.offsetWidth - vw) / 2 + }) + targetOffset.value = Math.max(-maxOffset.value, Math.min(maxOffset.value, targetOffset.value)) + currentOffset.value = Math.max(-maxOffset.value, Math.min(maxOffset.value, currentOffset.value)) + } + + function applyParallax() { + const offset = currentOffset.value + layerMeta.forEach(m => { + m.el.style.transform = `translateX(${m.centerShift - offset * m.speed}px)` + }) + } + + const { start: startLoop } = useAnimationLoop((_dt: number) => { + if (keys.ArrowLeft) targetOffset.value -= SCROLL_SPEED + if (keys.ArrowRight) targetOffset.value += SCROLL_SPEED + targetOffset.value = Math.max(-maxOffset.value, Math.min(maxOffset.value, targetOffset.value)) + currentOffset.value += (targetOffset.value - currentOffset.value) * PARALLAX_EASE + applyParallax() + + if ( + Math.abs(targetOffset.value - currentOffset.value) < 0.5 && + !keys.ArrowLeft && + !keys.ArrowRight && + !dragging + ) { + currentOffset.value = targetOffset.value + applyParallax() + return false + } + return true + }) + + function registerLayer(el: HTMLElement, speed: number) { + const vw = window.innerWidth + layerMeta.push({ + el, + speed, + centerShift: -(el.offsetWidth - vw) / 2, + }) + } + + function hideHint() { + hintHidden.value = true + } + + /* --- Input handlers --- */ + function onKeyDown(e: KeyboardEvent) { + if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { + e.preventDefault() + keys[e.key] = true + startLoop() + hideHint() + } + } + function onKeyUp(e: KeyboardEvent) { + if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { + keys[e.key] = false + } + } + + let dragStartX = 0 + let offsetAtDragStart = 0 + + function onMouseDown(e: MouseEvent) { + dragging = true + dragStartX = e.clientX + offsetAtDragStart = targetOffset.value + document.body.classList.add('dragging') + startLoop() + hideHint() + } + function onMouseMove(e: MouseEvent) { + if (!dragging) return + const dx = e.clientX - dragStartX + targetOffset.value = offsetAtDragStart - dx * 1.8 + } + function onMouseUp() { + dragging = false + document.body.classList.remove('dragging') + } + function onBlur() { + dragging = false + document.body.classList.remove('dragging') + keys.ArrowLeft = false + keys.ArrowRight = false + } + + let touchStartX = 0 + let touchOffsetStart = 0 + + function onTouchStart(e: TouchEvent) { + touchStartX = e.touches[0].clientX + touchOffsetStart = targetOffset.value + startLoop() + hideHint() + } + function onTouchMove(e: TouchEvent) { + const dx = e.touches[0].clientX - touchStartX + targetOffset.value = touchOffsetStart - dx * 1.8 + } + + let resizeRaf = 0 + + onMounted(() => { + recalcParallax() + applyParallax() + startLoop() + + document.addEventListener('keydown', onKeyDown) + document.addEventListener('keyup', onKeyUp) + document.addEventListener('mousedown', onMouseDown) + document.addEventListener('mousemove', onMouseMove) + document.addEventListener('mouseup', onMouseUp) + window.addEventListener('blur', onBlur) + document.addEventListener('touchstart', onTouchStart, { passive: true }) + document.addEventListener('touchmove', onTouchMove, { passive: true }) + window.addEventListener('resize', () => { + cancelAnimationFrame(resizeRaf) + resizeRaf = requestAnimationFrame(recalcParallax) + }) + + setTimeout(() => { hintHidden.value = true }, 6000) + }) + + onUnmounted(() => { + document.removeEventListener('keydown', onKeyDown) + document.removeEventListener('keyup', onKeyUp) + document.removeEventListener('mousedown', onMouseDown) + document.removeEventListener('mousemove', onMouseMove) + document.removeEventListener('mouseup', onMouseUp) + window.removeEventListener('blur', onBlur) + document.removeEventListener('touchstart', onTouchStart) + document.removeEventListener('touchmove', onTouchMove) + }) + + const ctx: ParallaxContext = { + currentOffset, + registerLayer, + startLoop, + hideHint, + } + + provide(PARALLAX_KEY, ctx) + + return { currentOffset, hintHidden, registerLayer, startLoop, hideHint } +} diff --git a/frontend.new/src/composables/useProceduralElements.ts b/frontend.new/src/composables/useProceduralElements.ts new file mode 100644 index 00000000..e6e7a427 --- /dev/null +++ b/frontend.new/src/composables/useProceduralElements.ts @@ -0,0 +1,137 @@ +import type { + ShimmerStyle, + WaveLineStyle, + ReflectionStreakStyle, + ReflectionGlowStyle, + WaveParticleStyle, +} from '@/types/scene' +import { GLOW_BLOCKS, REFLECTION_WIDTH_CURVE, REFLECTION_STREAK_COUNT } from '@/constants/reflections' + +export function generateShimmers(count: number): ShimmerStyle[] { + const items: ShimmerStyle[] = [] + for (let i = 0; i < count; i++) { + items.push({ + top: `${10 + Math.random() * 80}%`, + left: `${Math.random() * 100}%`, + width: `${30 + Math.random() * 80}px`, + animationDelay: `${Math.random() * 5}s`, + animationDuration: `${3 + Math.random() * 4}s`, + }) + } + return items +} + +export function generateWaveLines(count: number): WaveLineStyle[] { + const items: WaveLineStyle[] = [] + for (let i = 0; i < count; i++) { + items.push({ + top: `${5 + i * 8}%`, + animationDelay: `${i * 0.5}s`, + opacity: `${0.2 + Math.random() * 0.3}`, + }) + } + return items +} + +export function generateReflectionGlows(): ReflectionGlowStyle[] { + return GLOW_BLOCKS.map((b, i) => ({ + top: `${b.top}%`, + width: `${b.w}px`, + height: `${b.h}%`, + background: `radial-gradient(ellipse, rgba(255,215,140,${b.alpha}) 0%, rgba(255,200,120,${(b.alpha * 0.5).toFixed(3)}) 40%, transparent 70%)`, + filter: `blur(${b.blur}px)`, + animation: `glowShimmer ${b.dur}s ease-in-out ${(i * 1.3).toFixed(1)}s infinite`, + animationFillMode: 'backwards', + })) +} + +export function generateReflectionStreaks(): ReflectionStreakStyle[] { + const items: ReflectionStreakStyle[] = [] + for (let i = 0; i < REFLECTION_STREAK_COUNT; i++) { + const t = i / REFLECTION_STREAK_COUNT + const ci = t * (REFLECTION_WIDTH_CURVE.length - 1) + const lo = Math.floor(ci) + const hi = Math.min(lo + 1, REFLECTION_WIDTH_CURVE.length - 1) + const wFactor = REFLECTION_WIDTH_CURVE[lo] + (REFLECTION_WIDTH_CURVE[hi] - REFLECTION_WIDTH_CURVE[lo]) * (ci - lo) + const w = 30 + wFactor * 27 + Math.random() * 20 + const h = 1.5 + t * 3.5 + Math.random() * 1.5 + const offsetX = (Math.random() - 0.5) * (8 + wFactor * 5) + const brightness = 0.72 - t * 0.52 + const r = 255 + const g = 190 + Math.floor(Math.random() * 30) + const b = 80 + Math.floor(Math.random() * 40) + + let animName: string + let animDur: string + let animDir: string + + if (t > 0.55) { + animName = 'streakWaveStrong' + animDur = (4 + Math.random() * 3).toFixed(1) + animDir = 'normal' + } else if (t > 0.3) { + animName = 'streakWaveMid' + animDur = (5 + Math.random() * 3).toFixed(1) + animDir = 'normal' + } else if (t > 0.12) { + animName = 'streakWaveGentle' + animDur = (6 + Math.random() * 3).toFixed(1) + animDir = 'normal' + } else { + animName = 'streakCalm' + animDur = (2.5 + Math.random() * 2.5).toFixed(1) + animDir = 'alternate' + } + + items.push({ + top: `${1 + t * 72}%`, + marginLeft: `${offsetX}px`, + width: `${w}px`, + height: `${h}px`, + background: `rgba(${r},${g},${b},${brightness.toFixed(2)})`, + animation: `${animName} ${animDur}s ease-in-out infinite ${animDir}`, + animationDelay: `${(Math.random() * 4).toFixed(1)}s`, + animationFillMode: 'backwards', + }) + } + return items +} + +export function generateWaveParticles(count: number, topMin: number, topMax: number): WaveParticleStyle[] { + const items: WaveParticleStyle[] = [] + const colors = [ + (a: number) => `rgba(255,245,220,${a.toFixed(2)})`, + (a: number) => `rgba(255,235,200,${a.toFixed(2)})`, + (a: number) => `rgba(255,225,180,${a.toFixed(2)})`, + (a: number) => `rgba(255,255,240,${a.toFixed(2)})`, + ] + const alphaRanges = [ + [0.3, 0.5], + [0.25, 0.45], + [0.2, 0.4], + [0.35, 0.45], + ] + + for (let i = 0; i < count; i++) { + const size = 2 + Math.random() * 3 + const x = Math.random() * 100 + const y = topMin + Math.random() * (topMax - topMin) + const dur = 3 + Math.random() * 5 + const delay = Math.random() * dur + const ci = Math.floor(Math.random() * colors.length) + const [aMin, aRange] = alphaRanges[ci] + const alpha = aMin + Math.random() * aRange + const color = colors[ci](alpha) + + items.push({ + left: `${x.toFixed(1)}%`, + top: `${y.toFixed(1)}%`, + width: `${size.toFixed(1)}px`, + height: `${size.toFixed(1)}px`, + background: `radial-gradient(circle,${color} 0%,transparent 70%)`, + boxShadow: `0 0 ${(size * 1.5).toFixed(0)}px ${color}`, + animation: `particleGlow ${dur.toFixed(1)}s ease-in-out ${delay.toFixed(1)}s infinite`, + }) + } + return items +} diff --git a/frontend.new/src/composables/useWaveSystem.ts b/frontend.new/src/composables/useWaveSystem.ts new file mode 100644 index 00000000..1aaca932 --- /dev/null +++ b/frontend.new/src/composables/useWaveSystem.ts @@ -0,0 +1,78 @@ +import type { WavefrontConfig, WavefrontStyle } from '@/types/scene' +import { rf } from '@/utils/random' + +export function generateWavefronts(config: WavefrontConfig): WavefrontStyle[] { + const styles: WavefrontStyle[] = [] + + for (let i = 0; i < config.rows; i++) { + let baseDelay = (i * config.cycle / config.rows) + rf(-0.8, 0.8) + if (baseDelay < 0) baseDelay += config.cycle + + const segs = config.segs + const segBase = 100 / segs + + for (let s = 0; s < segs; s++) { + const layers = 1 + (Math.random() > 0.6 ? 1 : 0) + for (let j = 0; j < layers; j++) { + const overlap = segBase * 0.85 + const left = s * segBase - overlap / 2 + rf(-2, 2) + const width = segBase + overlap + rf(-2, 4) + + const nx = segs > 1 ? s / (segs - 1) : 0.5 + const phaseOffset = config.phaseSpread * ( + 0.6 * Math.sin(nx * Math.PI * 4 + config.phaseSeed) + + 0.4 * Math.sin(nx * Math.PI * 9 + config.phaseSeed * 1.7) + ) + rf(-0.3, 0.3) + + const vertOffset = config.vertSpread * ( + 0.5 * Math.sin(nx * Math.PI * 6 + config.phaseSeed * 0.8) + + 0.5 * Math.sin(nx * Math.PI * 13 + config.phaseSeed * 2.3) + ) + rf(-1.5, 1.5) + const segTop = config.startTop + vertOffset + + let segDelay = baseDelay + phaseOffset + j * rf(0.2, 0.5) + segDelay = ((segDelay % config.cycle) + config.cycle) % config.cycle + + const h = config.hMin + rf(0, config.hVar) + const alpha = config.alphaMin + rf(0, config.alphaVar) + const blur = config.blur + rf(-0.4, 0.6) + const cycleJitter = config.cycle + rf(-1.2, 1.2) + + const cx = 30 + rf(0, 40) + const { r, g, b } = config + const bg = `radial-gradient(ellipse at ${cx.toFixed(0)}% 50%, ` + + `rgba(${r},${g},${b},${alpha.toFixed(3)}) 0%, ` + + `rgba(${r},${g},${b},${(alpha * 0.4).toFixed(3)}) 55%, ` + + `transparent 100%)` + + const br = [ + (35 + rf(0, 30)).toFixed(0) + '%', + (35 + rf(0, 30)).toFixed(0) + '%', + (30 + rf(0, 25)).toFixed(0) + '%', + (30 + rf(0, 25)).toFixed(0) + '%', + ] + const brV = [ + (50 + rf(0, 30)).toFixed(0) + '%', + (50 + rf(0, 30)).toFixed(0) + '%', + (40 + rf(0, 25)).toFixed(0) + '%', + (40 + rf(0, 25)).toFixed(0) + '%', + ] + + const animName = config.anims[Math.floor(Math.random() * config.anims.length)] + + styles.push({ + top: segTop.toFixed(1) + '%', + left: left.toFixed(1) + '%', + width: width.toFixed(1) + '%', + height: h.toFixed(1) + 'px', + borderRadius: br.join(' ') + ' / ' + brV.join(' '), + background: bg, + filter: `blur(${blur.toFixed(1)}px)`, + animation: `${animName} ${cycleJitter.toFixed(1)}s ease-in-out ${segDelay.toFixed(1)}s infinite`, + }) + } + } + } + + return styles +} diff --git a/frontend.new/src/constants/clouds.ts b/frontend.new/src/constants/clouds.ts new file mode 100644 index 00000000..8dbdf501 --- /dev/null +++ b/frontend.new/src/constants/clouds.ts @@ -0,0 +1,14 @@ +import type { CloudData } from '@/types/scene' + +export const CLOUD_DATA: CloudData[] = [ + { x: 5, y: 18, w: 180, h: 40, bright: false }, + { x: 15, y: 30, w: 240, h: 50, bright: true }, + { x: 28, y: 12, w: 160, h: 35, bright: false }, + { x: 38, y: 40, w: 200, h: 45, bright: true }, + { x: 50, y: 22, w: 280, h: 55, bright: true }, + { x: 58, y: 8, w: 140, h: 30, bright: false }, + { x: 68, y: 35, w: 220, h: 48, bright: true }, + { x: 78, y: 15, w: 190, h: 38, bright: false }, + { x: 88, y: 28, w: 170, h: 42, bright: true }, + { x: 95, y: 10, w: 200, h: 40, bright: false }, +] diff --git a/frontend.new/src/constants/colors.ts b/frontend.new/src/constants/colors.ts new file mode 100644 index 00000000..afdfd116 --- /dev/null +++ b/frontend.new/src/constants/colors.ts @@ -0,0 +1,34 @@ +export const SKY_GRADIENT = [ + '#f2b8c8 0%', + '#f0bcc6 5%', + '#eebac0 10%', + '#edb8bc 15%', + '#ecb4b6 20%', + '#ebb0b0 25%', + '#eaaea8 30%', + '#ebaca2 35%', + '#eca89c 40%', + '#eea898 46%', + '#f0a894 52%', + '#f2ac92 58%', + '#f4b490 64%', + '#f6be90 70%', + '#f8c890 76%', + '#fad494 82%', + '#fce09c 88%', + '#fdeaa8 94%', + '#fef0b0 100%', +] + +export const OCEAN_GRADIENT = [ + '#2a6ea8 0%', + '#2d72a4 8%', + '#3278a8 18%', + '#3880b0 30%', + '#4088b4 42%', + '#4a92b8 55%', + '#589ec0 68%', + '#68acc8 80%', + '#7cbad0 92%', + '#90c8d8 100%', +] diff --git a/frontend.new/src/constants/layers.ts b/frontend.new/src/constants/layers.ts new file mode 100644 index 00000000..eb1e548c --- /dev/null +++ b/frontend.new/src/constants/layers.ts @@ -0,0 +1,17 @@ +import type { LayerConfig } from '@/types/scene' + +export const LAYERS: Record = { + sky: { speed: 0.05, zIndex: 1, width: '300vw' }, + clouds: { speed: 0.15, zIndex: 5, width: '400vw', top: '0', height: '45%' }, + seagulls: { speed: 0.18, zIndex: 7, width: '400vw', top: '0', height: '40%' }, + sun: { speed: 0.08, zIndex: 6, width: '300vw' }, + ocean: { speed: 0.3, zIndex: 10, width: '400vw', top: '33%', height: '67%' }, + sunReflection: { speed: 0.08, zIndex: 11, width: '300vw', top: '33%', height: '67%' }, + waveFar: { speed: 0.32, zIndex: 24, width: '400vw', top: '33%', height: '18%' }, + waveMid: { speed: 0.35, zIndex: 26, width: '400vw', top: '35%', height: '16%' }, + waveNear: { speed: 0.48, zIndex: 28, width: '400vw', top: '36%', height: '16%' }, + sand: { speed: 0.55, zIndex: 20, width: '400vw' }, +} + +export const PARALLAX_EASE = 0.14 +export const SCROLL_SPEED = 24 diff --git a/frontend.new/src/constants/reflections.ts b/frontend.new/src/constants/reflections.ts new file mode 100644 index 00000000..9ceb8273 --- /dev/null +++ b/frontend.new/src/constants/reflections.ts @@ -0,0 +1,24 @@ +import type { WispData, GlowBlockData } from '@/types/scene' + +export const WISP_DATA: WispData[] = [ + { x: 5, y: 24, w: 700, h: 4.5, color: 'rgba(215, 135, 125, 0.55)', blur: 6 }, + { x: 22, y: 27, w: 550, h: 4, color: 'rgba(220, 140, 130, 0.50)', blur: 5 }, + { x: 72, y: 25, w: 580, h: 4, color: 'rgba(218, 138, 128, 0.48)', blur: 6 }, + { x: 85, y: 26, w: 500, h: 3.5, color: 'rgba(216, 136, 126, 0.45)', blur: 5.5 }, + { x: 0, y: 28.5, w: 620, h: 4, color: 'rgba(222, 142, 132, 0.48)', blur: 7 }, + { x: 62, y: 29, w: 450, h: 3.5, color: 'rgba(212, 132, 122, 0.45)', blur: 6 }, + /* Through-sun wisps */ + { x: 41, y: 29, w: 1000, h: 12, color: 'linear-gradient(to right, transparent 0%, rgba(210, 120, 110, 0.80) 35%, rgba(195, 100, 95, 0.95) 50%, rgba(210, 120, 110, 0.80) 65%, transparent 100%)', blur: 5, behind: true }, + { x: 43, y: 30.5, w: 800, h: 8, color: 'linear-gradient(to right, transparent 0%, rgba(215, 128, 118, 0.65) 30%, rgba(205, 110, 105, 0.82) 50%, rgba(215, 128, 118, 0.65) 70%, transparent 100%)', blur: 4, behind: true }, +] + +export const GLOW_BLOCKS: GlowBlockData[] = [ + { top: 1, h: 22, w: 160, alpha: 0.45, blur: 20, dur: 6 }, + { top: 12, h: 28, w: 240, alpha: 0.38, blur: 25, dur: 7.5 }, + { top: 30, h: 26, w: 300, alpha: 0.30, blur: 22, dur: 5.5 }, + { top: 48, h: 22, w: 250, alpha: 0.22, blur: 20, dur: 8 }, + { top: 62, h: 18, w: 180, alpha: 0.15, blur: 18, dur: 6.5 }, +] + +export const REFLECTION_WIDTH_CURVE = [9,8,7,6,5,3,3,5,4,7,2,4,4,6,3,3,3,5,4,2,2,3,3,5,6,6,7,7,8] +export const REFLECTION_STREAK_COUNT = 45 diff --git a/frontend.new/src/constants/seagulls.ts b/frontend.new/src/constants/seagulls.ts new file mode 100644 index 00000000..79b79a84 --- /dev/null +++ b/frontend.new/src/constants/seagulls.ts @@ -0,0 +1,12 @@ +import type { SeagullData } from '@/types/scene' + +export const SEAGULL_DATA: SeagullData[] = [ + { x: 5, y: 15, s: 7, c: 'rgba(40,35,30,0.7)', fd: 30, wd: 1.2 }, + { x: 22, y: 55, s: 5, c: 'rgba(50,45,40,0.55)', fd: 35, wd: 1.5 }, + { x: 42, y: 25, s: 9, c: 'rgba(35,30,25,0.65)', fd: 32, wd: 1.1 }, + { x: 58, y: 80, s: 5, c: 'rgba(60,55,50,0.45)', fd: 38, wd: 1.8 }, + { x: 70, y: 40, s: 7, c: 'rgba(255,250,240,0.6)', fd: 33, wd: 1.3 }, + { x: 85, y: 12, s: 8, c: 'rgba(45,40,35,0.6)', fd: 30, wd: 1.0 }, + { x: 15, y: 70, s: 6, c: 'rgba(255,248,235,0.55)', fd: 36, wd: 1.6 }, + { x: 50, y: 48, s: 6, c: 'rgba(40,35,30,0.5)', fd: 34, wd: 1.4 }, +] diff --git a/frontend.new/src/constants/waves.ts b/frontend.new/src/constants/waves.ts new file mode 100644 index 00000000..72d03f98 --- /dev/null +++ b/frontend.new/src/constants/waves.ts @@ -0,0 +1,61 @@ +import type { WavefrontConfig, WaveLayerVariant } from '@/types/scene' + +export const WAVE_FAR_CONFIG: WavefrontConfig = { + rows: 2, cycle: 34, segs: 12, + phaseSpread: 5, phaseSeed: 0.7, + vertSpread: 6, + startTop: 55, + hMin: 6, hVar: 6, + r: 170, g: 205, b: 215, + alphaMin: 0.22, alphaVar: 0.18, + blur: 2, anims: ['advanceFarS', 'advanceFarM', 'advanceFarL'], +} + +export const WAVE_MID_CONFIG: WavefrontConfig = { + rows: 2, cycle: 26, segs: 14, + phaseSpread: 4.5, phaseSeed: 2.1, + vertSpread: 7, + startTop: 65, + hMin: 8, hVar: 7, + r: 155, g: 198, b: 210, + alphaMin: 0.28, alphaVar: 0.22, + blur: 1.2, anims: ['advanceMidS', 'advanceMidM', 'advanceMidL'], +} + +export const WAVE_NEAR_CONFIG: WavefrontConfig = { + rows: 2, cycle: 20, segs: 16, + phaseSpread: 4, phaseSeed: 4.3, + vertSpread: 8, + startTop: 72, + hMin: 10, hVar: 8, + r: 185, g: 220, b: 230, + alphaMin: 0.35, alphaVar: 0.28, + blur: 0.6, anims: ['advanceNearS', 'advanceNearM', 'advanceNearL'], +} + +export const WAVE_LAYERS: WaveLayerVariant[] = [ + { + className: 'wave-layer-far', + speed: 0.32, + filterId: 'watercolor-far', + blurPx: 1.5, + config: WAVE_FAR_CONFIG, + showShoreWash: false, + }, + { + className: 'wave-layer-mid', + speed: 0.35, + filterId: 'watercolor-mid', + blurPx: 0.8, + config: WAVE_MID_CONFIG, + showShoreWash: false, + }, + { + className: 'wave-layer-near', + speed: 0.48, + filterId: 'watercolor-near', + blurPx: 0.3, + config: WAVE_NEAR_CONFIG, + showShoreWash: true, + }, +] diff --git a/frontend.new/src/main.ts b/frontend.new/src/main.ts new file mode 100644 index 00000000..f8200dcf --- /dev/null +++ b/frontend.new/src/main.ts @@ -0,0 +1,8 @@ +import { createApp } from 'vue' +import App from './App.vue' + +import './styles/reset.css' +import './styles/variables.css' +import './styles/animations.css' + +createApp(App).mount('#app') diff --git a/frontend.new/src/styles/animations.css b/frontend.new/src/styles/animations.css new file mode 100644 index 00000000..cd8f16cb --- /dev/null +++ b/frontend.new/src/styles/animations.css @@ -0,0 +1,214 @@ +/* ============================================================ + Cloud drift animations + ============================================================ */ +@keyframes cloudDrift0 { + 0% { transform: translateX(0); } + 100% { transform: translateX(30px); } +} +@keyframes cloudDrift1 { + 0% { transform: translateX(0); } + 100% { transform: translateX(-25px); } +} +@keyframes cloudDrift2 { + 0% { transform: translateX(0); } + 100% { transform: translateX(20px); } +} + +/* ============================================================ + Seagull wing flap animations + ============================================================ */ +@keyframes gullWing { + 0%, 100% { transform: rotate(-8deg); } + 50% { transform: rotate(-18deg); } +} +@keyframes gullWingR { + 0%, 100% { transform: rotate(8deg); } + 50% { transform: rotate(18deg); } +} + +/* ============================================================ + Sun glow pulse + ============================================================ */ +@keyframes glowPulse { + 0%, 100% { opacity: 1; transform: translate(-50%, -50%) scale(1); } + 50% { opacity: 0.92; transform: translate(-50%, -50%) scale(1.04); } +} + +/* ============================================================ + Horizon wisp drift + ============================================================ */ +@keyframes wispDrift { + 0% { opacity: 0.5; transform: translateX(0) scaleX(1); } + 50% { opacity: 0.8; transform: translateX(10px) scaleX(1.03); } + 100% { opacity: 0.5; transform: translateX(-8px) scaleX(0.97); } +} + +/* ============================================================ + Ocean shimmer + ============================================================ */ +@keyframes shimmerFloat { + 0%, 100% { opacity: 0; transform: scaleX(0.5); } + 50% { opacity: 1; transform: scaleX(1); } +} + +/* ============================================================ + Ocean wave line drift + ============================================================ */ +@keyframes waveLineDrift { + 0% { transform: translateX(0); } + 100% { transform: translateX(-140px); } +} + +/* ============================================================ + Sun reflection streak animations + ============================================================ */ +@keyframes streakCalm { + 0% { opacity: 0.3; transform: translateX(-50%) scaleX(0.85); } + 100% { opacity: 1; transform: translateX(-50%) scaleX(1.15); } +} + +@keyframes streakWaveGentle { + 0% { opacity: 0.3; transform: translateX(-50%) scaleX(0.9) translateY(0); } + 25% { opacity: 0.65; transform: translateX(-50%) scaleX(1.0) translateY(1.5px); } + 50% { opacity: 1; transform: translateX(-50%) scaleX(1.1) translateY(0); } + 75% { opacity: 0.5; transform: translateX(-50%) scaleX(1.0) translateY(-1px); } + 100% { opacity: 0.3; transform: translateX(-50%) scaleX(0.9) translateY(0); } +} + +@keyframes streakWaveMid { + 0% { opacity: 0.3; transform: translateX(-50%) scaleX(0.85) translateY(0); } + 18% { opacity: 0.7; transform: translateX(-50%) scaleX(1.0) translateY(3px); } + 38% { opacity: 1; transform: translateX(-50%) scaleX(1.15) translateY(0.5px); } + 58% { opacity: 0.55; transform: translateX(-50%) scaleX(1.05) translateY(-2.5px); } + 78% { opacity: 0.4; transform: translateX(-50%) scaleX(0.92) translateY(1.5px); } + 100% { opacity: 0.3; transform: translateX(-50%) scaleX(0.85) translateY(0); } +} + +@keyframes streakWaveStrong { + 0% { opacity: 0.25; transform: translateX(-50%) scaleX(0.85) translateY(0); } + 14% { opacity: 0.8; transform: translateX(-50%) scaleX(1.0) translateY(5px); } + 30% { opacity: 1; transform: translateX(-50%) scaleX(1.15) translateY(1px); } + 48% { opacity: 0.6; transform: translateX(-50%) scaleX(1.08) translateY(-4px); } + 64% { opacity: 0.45; transform: translateX(-50%) scaleX(0.95) translateY(3px); } + 82% { opacity: 0.35; transform: translateX(-50%) scaleX(0.88) translateY(-1px); } + 100% { opacity: 0.25; transform: translateX(-50%) scaleX(0.85) translateY(0); } +} + +/* ============================================================ + Reflection glow shimmer + ============================================================ */ +@keyframes glowShimmer { + 0% { opacity: 0.35; transform: translateX(-50%) scaleX(0.92) translateY(0); } + 20% { opacity: 0.7; transform: translateX(-50%) scaleX(1.06) translateY(3px); } + 45% { opacity: 0.5; transform: translateX(-50%) scaleX(0.96) translateY(-2px); } + 65% { opacity: 0.8; transform: translateX(-50%) scaleX(1.03) translateY(2px); } + 85% { opacity: 0.45; transform: translateX(-50%) scaleX(0.98) translateY(-1px); } + 100% { opacity: 0.35; transform: translateX(-50%) scaleX(0.92) translateY(0); } +} + +/* ============================================================ + Wave advance animations — Far layer + ============================================================ */ +@keyframes advanceFarS { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(3.2vh); opacity: 0.45; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceFarM { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(4.5vh); opacity: 0.5; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceFarL { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(5vh); opacity: 0.55; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} + +/* ============================================================ + Wave advance animations — Mid layer + ============================================================ */ +@keyframes advanceMidS { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(3.6vh); opacity: 0.55; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceMidM { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(5.2vh); opacity: 0.65; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceMidL { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(6vh); opacity: 0.7; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} + +/* ============================================================ + Wave advance animations — Near layer + ============================================================ */ +@keyframes advanceNearS { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(4.5vh) scaleX(1.03); opacity: 0.75; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } + 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } +} +@keyframes advanceNearM { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(6vh) scaleX(1.05); opacity: 0.85; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } + 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } +} +@keyframes advanceNearL { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(7vh) scaleX(1.05); opacity: 0.9; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } + 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } +} + +/* ============================================================ + Wave particle glow + ============================================================ */ +@keyframes particleGlow { + 0% { opacity: 0; transform: translateY(0) scale(0.5); } + 20% { opacity: 1; transform: translateY(-2px) scale(1); } + 50% { opacity: 0.7; transform: translateY(-4px) scale(0.9); } + 80% { opacity: 0.3; transform: translateY(-6px) scale(0.7); } + 100% { opacity: 0; transform: translateY(-8px) scale(0.4); } +} + +/* ============================================================ + Shore wash pulse + ============================================================ */ +@keyframes shoreWashPulse { + 0% { opacity: 0.5; transform: translateY(0px); } + 20% { opacity: 0.75; transform: translateY(-3px); } + 45% { opacity: 0.9; transform: translateY(-5px); } + 65% { opacity: 0.8; transform: translateY(-3px); } + 85% { opacity: 0.55; transform: translateY(1px); } + 100% { opacity: 0.5; transform: translateY(0px); } +} diff --git a/frontend.new/src/styles/reset.css b/frontend.new/src/styles/reset.css new file mode 100644 index 00000000..06ccb246 --- /dev/null +++ b/frontend.new/src/styles/reset.css @@ -0,0 +1,28 @@ +*, *::before, *::after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html, body { + width: 100%; + height: 100%; + overflow: hidden; + cursor: grab; + user-select: none; + -webkit-user-select: none; + background: #f5e0c8; +} + +body.dragging { + cursor: grabbing; +} + +.layer { + position: absolute; + top: 0; + left: 0; + height: 100%; + will-change: transform; + contain: layout style paint; +} diff --git a/frontend.new/src/styles/variables.css b/frontend.new/src/styles/variables.css new file mode 100644 index 00000000..edd5839c --- /dev/null +++ b/frontend.new/src/styles/variables.css @@ -0,0 +1,30 @@ +:root { + /* Sky gradient stops */ + --sky-top: #f2b8c8; + --sky-bottom: #fef0b0; + + /* Ocean gradient */ + --ocean-top: #2a6ea8; + --ocean-bottom: #90c8d8; + + /* Sand */ + --sand-bg: #f5e0c8; + + /* Sun */ + --sun-center: #fff5d0; + --sun-mid: #ffe8a8; + --sun-edge: #ffd880; + + /* Cloud */ + --cloud-base: rgba(255, 225, 195, 0.22); + --cloud-bright: rgba(255, 205, 150, 0.28); + + /* Hint */ + --hint-color: rgba(180, 130, 80, 0.6); + + /* Shimmer */ + --shimmer-color: rgba(255, 225, 160, 0.4); + + /* Reflection */ + --reflection-streak: rgba(255, 225, 160, 0.5); +} diff --git a/frontend.new/src/types/scene.ts b/frontend.new/src/types/scene.ts new file mode 100644 index 00000000..c15a2281 --- /dev/null +++ b/frontend.new/src/types/scene.ts @@ -0,0 +1,87 @@ +/* Scene type definitions */ +import type { CSSProperties } from 'vue' + +export interface LayerConfig { + speed: number + zIndex: number + width: string + top?: string + height?: string +} + +export interface CloudData { + x: number + y: number + w: number + h: number + bright: boolean +} + +export interface SeagullData { + x: number + y: number + s: number + c: string + fd: number + wd: number +} + +export interface WispData { + x: number + y: number + w: number + h: number + color: string + blur: number + behind?: boolean +} + +export interface GlowBlockData { + top: number + h: number + w: number + alpha: number + blur: number + dur: number +} + +export interface WavefrontConfig { + rows: number + cycle: number + segs: number + phaseSpread: number + phaseSeed: number + vertSpread: number + startTop: number + hMin: number + hVar: number + r: number + g: number + b: number + alphaMin: number + alphaVar: number + blur: number + anims: string[] +} + +export interface WaveLayerVariant { + className: string + speed: number + filterId: string + blurPx: number + config: WavefrontConfig + showShoreWash: boolean +} + +export type WavefrontStyle = CSSProperties +export type ShimmerStyle = CSSProperties +export type WaveLineStyle = CSSProperties +export type ReflectionStreakStyle = CSSProperties +export type ReflectionGlowStyle = CSSProperties +export type WaveParticleStyle = CSSProperties + +export interface ParallaxState { + targetOffset: number + currentOffset: number + maxOffset: number +} diff --git a/frontend.new/src/utils/random.ts b/frontend.new/src/utils/random.ts new file mode 100644 index 00000000..665fc464 --- /dev/null +++ b/frontend.new/src/utils/random.ts @@ -0,0 +1,4 @@ +/** Random float in [lo, hi] */ +export function rf(lo: number, hi: number): number { + return lo + Math.random() * (hi - lo) +} diff --git a/frontend.new/tsconfig.json b/frontend.new/tsconfig.json new file mode 100644 index 00000000..781dd562 --- /dev/null +++ b/frontend.new/tsconfig.json @@ -0,0 +1,6 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.node.json" } + ] +} diff --git a/frontend.new/tsconfig.node.json b/frontend.new/tsconfig.node.json new file mode 100644 index 00000000..14a4a67b --- /dev/null +++ b/frontend.new/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "noEmit": true, + "paths": { + "@/*": ["./src/*"] + }, + "composite": true + }, + "include": [ + "vite.config.ts", + "env.d.ts", + "src/**/*.ts", + "src/**/*.vue" + ] +} diff --git a/frontend.new/vite.config.ts b/frontend.new/vite.config.ts new file mode 100644 index 00000000..4343664e --- /dev/null +++ b/frontend.new/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import { fileURLToPath, URL } from 'node:url' + +export default defineConfig({ + plugins: [vue()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } +}) From 822fda6a059c17e35db85a16d44465d90df760f5 Mon Sep 17 00:00:00 2001 From: Kanye-Est Date: Sat, 28 Feb 2026 22:18:51 +0800 Subject: [PATCH 07/52] feat: place assets --- frontend.new/package-lock.json | 2 - .../src/components/scene/BeachScene.vue | 2 + .../src/components/scene/SpritesLayer.vue | 48 +++++++++++++++++++ frontend.new/src/constants/layers.ts | 1 + frontend.new/src/constants/sprites.ts | 45 +++++++++++++++++ frontend.new/tsconfig.node.json | 3 +- frontend.new/vite.config.ts | 3 +- 7 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 frontend.new/src/components/scene/SpritesLayer.vue create mode 100644 frontend.new/src/constants/sprites.ts diff --git a/frontend.new/package-lock.json b/frontend.new/package-lock.json index 3ce504aa..60a49a15 100644 --- a/frontend.new/package-lock.json +++ b/frontend.new/package-lock.json @@ -921,7 +921,6 @@ "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -2477,7 +2476,6 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" diff --git a/frontend.new/src/components/scene/BeachScene.vue b/frontend.new/src/components/scene/BeachScene.vue index 01fca9a3..661caf83 100644 --- a/frontend.new/src/components/scene/BeachScene.vue +++ b/frontend.new/src/components/scene/BeachScene.vue @@ -29,6 +29,7 @@ + @@ -45,6 +46,7 @@ import OceanLayer from './OceanLayer.vue' import SunReflectionLayer from './SunReflectionLayer.vue' import WaveLayer from './WaveLayer.vue' import SandLayer from './SandLayer.vue' +import SpritesLayer from './SpritesLayer.vue' import HintOverlay from './HintOverlay.vue' const { hintHidden } = useParallax() diff --git a/frontend.new/src/components/scene/SpritesLayer.vue b/frontend.new/src/components/scene/SpritesLayer.vue new file mode 100644 index 00000000..57408955 --- /dev/null +++ b/frontend.new/src/components/scene/SpritesLayer.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/frontend.new/src/constants/layers.ts b/frontend.new/src/constants/layers.ts index eb1e548c..9409b6d5 100644 --- a/frontend.new/src/constants/layers.ts +++ b/frontend.new/src/constants/layers.ts @@ -11,6 +11,7 @@ export const LAYERS: Record = { waveMid: { speed: 0.35, zIndex: 26, width: '400vw', top: '35%', height: '16%' }, waveNear: { speed: 0.48, zIndex: 28, width: '400vw', top: '36%', height: '16%' }, sand: { speed: 0.55, zIndex: 20, width: '400vw' }, + sprites: { speed: 0.55, zIndex: 22, width: '400vw' }, } export const PARALLAX_EASE = 0.14 diff --git a/frontend.new/src/constants/sprites.ts b/frontend.new/src/constants/sprites.ts new file mode 100644 index 00000000..3133cffe --- /dev/null +++ b/frontend.new/src/constants/sprites.ts @@ -0,0 +1,45 @@ +export interface SpriteData { + id: string + src: string + left: string + top: string + width: string + rotate?: number +} + +import carImg from '@assets/car.png' +import jishiImg from '@assets/jishi.png' +import stoneImg from '@assets/stone.png' +import crabImg from '@assets/crab.png' +import shellImg from '@assets/shell_2d.png' + +export const SPRITES: SpriteData[] = [ + // car: 往右移一点 50→54%,大小翻倍 18→36vw + { id: 'car', src: carImg, left: '38%', top: '10%', width: '45vw' }, + // jishi: 往右移一点 18→24%,大小翻倍 22→44vw + { id: 'jishi', src: jishiImg, left: '24%', top: '28%', width: '44vw' }, + // stone: 往左移一点 80→72% + { id: 'stone', src: stoneImg, left: '72%', top: '5%', width: '14vw' }, + // crab: 放在 car 左边,位置再往下一点点 + { id: 'crab', src: crabImg, left: '60%', top: '12%', width: '6vw' }, + + // --- car 周围的贝壳 --- + { id: 'shell-0', src: shellImg, left: '50%', top: '25%', width: '4vw', rotate: 0 }, + { id: 'shell-1', src: shellImg, left: '48.5%', top: '43%', width: '4vw', rotate: -7.5 }, + { id: 'shell-2', src: shellImg, left: '49.6%', top: '70%', width: '4vw', rotate: 30 }, + { id: 'shell-3', src: shellImg, left: '55%', top: '25%', width: '3.5vw', rotate: 20 }, + { id: 'shell-4', src: shellImg, left: '60%', top: '35%', width: '4.5vw', rotate: -30 }, + { id: 'shell-5', src: shellImg, left: '65%', top: '35%', width: '3.8vw', rotate: 45 }, + { id: 'shell-6', src: shellImg, left: '70%', top: '40%', width: '4.2vw', rotate: 10 }, + { id: 'shell-7', src: shellImg, left: '75%', top: '45%', width: '3.5vw', rotate: -25 }, + + // --- car 周围新增贝壳 --- + { id: 'shell-6', src: shellImg, left: '58%', top: '45%', width: '3.8vw', rotate: 35 }, + { id: 'shell-7', src: shellImg, left: '68%', top: '38%', width: '4vw', rotate: -10 }, + { id: 'shell-8', src: shellImg, left: '53%', top: '60%', width: '4.3vw', rotate: 50 }, + + // --- jishi 旁边的贝壳 --- + { id: 'shell-9', src: shellImg, left: '22%', top: '32%', width: '4vw', rotate: 15 }, + { id: 'shell-10', src: shellImg, left: '30%', top: '45%', width: '3.5vw', rotate: -40 }, + { id: 'shell-11', src: shellImg, left: '26%', top: '55%', width: '4.2vw', rotate: 25 }, +] diff --git a/frontend.new/tsconfig.node.json b/frontend.new/tsconfig.node.json index 14a4a67b..40086666 100644 --- a/frontend.new/tsconfig.node.json +++ b/frontend.new/tsconfig.node.json @@ -12,7 +12,8 @@ "skipLibCheck": true, "noEmit": true, "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@assets/*": ["../assets/*"] }, "composite": true }, diff --git a/frontend.new/vite.config.ts b/frontend.new/vite.config.ts index 4343664e..208f4876 100644 --- a/frontend.new/vite.config.ts +++ b/frontend.new/vite.config.ts @@ -6,7 +6,8 @@ export default defineConfig({ plugins: [vue()], resolve: { alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)) + '@': fileURLToPath(new URL('./src', import.meta.url)), + '@assets': fileURLToPath(new URL('../assets', import.meta.url)) } } }) From f8967ee12400582419fa5fd695b9c00ffcb82c46 Mon Sep 17 00:00:00 2001 From: Koishi Date: Sat, 28 Feb 2026 23:50:35 +0800 Subject: [PATCH 08/52] refactor: consolidate assets into src/assets and fix import paths Move all runtime assets into src/assets/, remove redundant @assets alias (pointed to root assets/ outside src), fix sprite imports to use @/assets, and move render-sand.ts tooling script to scripts/. Co-Authored-By: Claude Opus 4.5 --- frontend.new/assets/sand.png | 3 --- frontend.new/{assets => scripts}/render-sand.ts | 6 +++--- frontend.new/src/assets/bar.png | 3 +++ frontend.new/src/assets/car.png | 3 +++ frontend.new/src/assets/crab.png | 3 +++ frontend.new/src/assets/shell.png | 3 +++ frontend.new/src/assets/stone.png | 3 +++ frontend.new/src/constants/sprites.ts | 16 ++++++++-------- frontend.new/tsconfig.node.json | 3 +-- frontend.new/vite.config.ts | 1 - 10 files changed, 27 insertions(+), 17 deletions(-) delete mode 100644 frontend.new/assets/sand.png rename frontend.new/{assets => scripts}/render-sand.ts (95%) create mode 100644 frontend.new/src/assets/bar.png create mode 100644 frontend.new/src/assets/car.png create mode 100644 frontend.new/src/assets/crab.png create mode 100644 frontend.new/src/assets/shell.png create mode 100644 frontend.new/src/assets/stone.png diff --git a/frontend.new/assets/sand.png b/frontend.new/assets/sand.png deleted file mode 100644 index f149b922..00000000 --- a/frontend.new/assets/sand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e711c76072727fa9358c89f836164928a573e501f0cbc9a0b48d225a08811f9 -size 1394947 diff --git a/frontend.new/assets/render-sand.ts b/frontend.new/scripts/render-sand.ts similarity index 95% rename from frontend.new/assets/render-sand.ts rename to frontend.new/scripts/render-sand.ts index 2effecc6..634f22ea 100644 --- a/frontend.new/assets/render-sand.ts +++ b/frontend.new/scripts/render-sand.ts @@ -2,10 +2,10 @@ /** * render-sand.ts — 用 Puppeteer 将沙滩 CSS 渲染为 sand.png * - * 用法: npx tsx assets/render-sand.ts [输出文件名] + * 用法: npx tsx scripts/render-sand.ts [输出文件名] * * 可调参数在下方 CONFIG 区域,改完后重新运行即可。 - * 生成: assets/sand.png (7680×630, RGBA, 透明顶部渐变到 #f8eed8) + * 生成: src/assets/sand.png (7680×630, RGBA, 透明顶部渐变到 #f8eed8) */ import puppeteer from 'puppeteer' @@ -17,7 +17,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)) // ============ CONFIG ============ const WIDTH = 7680 const HEIGHT = 630 -const OUTPUT = path.join(__dirname, process.argv[2] || 'sand.png') +const OUTPUT = path.join(__dirname, '..', 'src', 'assets', process.argv[2] || 'sand.png') // ================================ const html = ` diff --git a/frontend.new/src/assets/bar.png b/frontend.new/src/assets/bar.png new file mode 100644 index 00000000..e6a5bb81 --- /dev/null +++ b/frontend.new/src/assets/bar.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b045af3566243717970feee1c7771636004883184c4ea7d12cc70033ca3de0c9 +size 1429359 diff --git a/frontend.new/src/assets/car.png b/frontend.new/src/assets/car.png new file mode 100644 index 00000000..c8dcee9d --- /dev/null +++ b/frontend.new/src/assets/car.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68d759de45a6d4b476dc7b8aa1a9131ccc53ce4536ecf0304194efa4f878f449 +size 1873572 diff --git a/frontend.new/src/assets/crab.png b/frontend.new/src/assets/crab.png new file mode 100644 index 00000000..a63cdda0 --- /dev/null +++ b/frontend.new/src/assets/crab.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82d08be6c9b3fae4410d53a938c0e9b1c8e969fe9929f46c921f1627d53e4683 +size 848766 diff --git a/frontend.new/src/assets/shell.png b/frontend.new/src/assets/shell.png new file mode 100644 index 00000000..05866ae3 --- /dev/null +++ b/frontend.new/src/assets/shell.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1aa4f64ee3a58ba2cf24a056b40974bc87b1543df26750ea58911e1d415b14a2 +size 1014759 diff --git a/frontend.new/src/assets/stone.png b/frontend.new/src/assets/stone.png new file mode 100644 index 00000000..a46e93e5 --- /dev/null +++ b/frontend.new/src/assets/stone.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac963f0db7d961c0df57c444967679557393e68583b43ac1c2c20520b8ae1355 +size 955700 diff --git a/frontend.new/src/constants/sprites.ts b/frontend.new/src/constants/sprites.ts index 3133cffe..3e0ada5f 100644 --- a/frontend.new/src/constants/sprites.ts +++ b/frontend.new/src/constants/sprites.ts @@ -7,17 +7,17 @@ export interface SpriteData { rotate?: number } -import carImg from '@assets/car.png' -import jishiImg from '@assets/jishi.png' -import stoneImg from '@assets/stone.png' -import crabImg from '@assets/crab.png' -import shellImg from '@assets/shell_2d.png' +import carImg from '@/assets/car.png' +import barImg from '@/assets/bar.png' +import stoneImg from '@/assets/stone.png' +import crabImg from '@/assets/crab.png' +import shellImg from '@/assets/shell.png' export const SPRITES: SpriteData[] = [ // car: 往右移一点 50→54%,大小翻倍 18→36vw { id: 'car', src: carImg, left: '38%', top: '10%', width: '45vw' }, - // jishi: 往右移一点 18→24%,大小翻倍 22→44vw - { id: 'jishi', src: jishiImg, left: '24%', top: '28%', width: '44vw' }, + // bar: 往右移一点 18→24%,大小翻倍 22→44vw + { id: 'bar', src: barImg, left: '24%', top: '28%', width: '44vw' }, // stone: 往左移一点 80→72% { id: 'stone', src: stoneImg, left: '72%', top: '5%', width: '14vw' }, // crab: 放在 car 左边,位置再往下一点点 @@ -38,7 +38,7 @@ export const SPRITES: SpriteData[] = [ { id: 'shell-7', src: shellImg, left: '68%', top: '38%', width: '4vw', rotate: -10 }, { id: 'shell-8', src: shellImg, left: '53%', top: '60%', width: '4.3vw', rotate: 50 }, - // --- jishi 旁边的贝壳 --- + // --- bar 旁边的贝壳 --- { id: 'shell-9', src: shellImg, left: '22%', top: '32%', width: '4vw', rotate: 15 }, { id: 'shell-10', src: shellImg, left: '30%', top: '45%', width: '3.5vw', rotate: -40 }, { id: 'shell-11', src: shellImg, left: '26%', top: '55%', width: '4.2vw', rotate: 25 }, diff --git a/frontend.new/tsconfig.node.json b/frontend.new/tsconfig.node.json index 40086666..14a4a67b 100644 --- a/frontend.new/tsconfig.node.json +++ b/frontend.new/tsconfig.node.json @@ -12,8 +12,7 @@ "skipLibCheck": true, "noEmit": true, "paths": { - "@/*": ["./src/*"], - "@assets/*": ["../assets/*"] + "@/*": ["./src/*"] }, "composite": true }, diff --git a/frontend.new/vite.config.ts b/frontend.new/vite.config.ts index 208f4876..18315c3c 100644 --- a/frontend.new/vite.config.ts +++ b/frontend.new/vite.config.ts @@ -7,7 +7,6 @@ export default defineConfig({ resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), - '@assets': fileURLToPath(new URL('../assets', import.meta.url)) } } }) From bbf9d2a3c8be7a8f301d7ea2139014e526ee9858 Mon Sep 17 00:00:00 2001 From: Kanye-Est Date: Mon, 2 Mar 2026 13:32:59 +0800 Subject: [PATCH 09/52] feat: placement modified --- .../src/components/scene/SpritesLayer.vue | 8 +++- frontend.new/src/constants/layers.ts | 2 +- frontend.new/src/constants/sprites.ts | 40 +++++++------------ 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/frontend.new/src/components/scene/SpritesLayer.vue b/frontend.new/src/components/scene/SpritesLayer.vue index 57408955..4b831304 100644 --- a/frontend.new/src/components/scene/SpritesLayer.vue +++ b/frontend.new/src/components/scene/SpritesLayer.vue @@ -10,7 +10,11 @@ left: s.left, top: s.top, width: s.width, - transform: s.rotate ? `rotate(${s.rotate}deg)` : undefined, + transform: [ + s.rotate ? `rotate(${s.rotate}deg)` : '', + s.scaleX ? `scaleX(${s.scaleX})` : '', + s.scaleY ? `scaleY(${s.scaleY})` : '', + ].filter(Boolean).join(' ') || undefined, }" /> @@ -35,7 +39,7 @@ onMounted(() => { -
- + + + + +
+ + +
+ + +
+ + + +
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ +
Drag or press arrow keys to explore the coastline
+ + From fe44c2a677fe8917bd9b2ecd2508d936e53f2249 Mon Sep 17 00:00:00 2001 From: Koishi Date: Mon, 23 Feb 2026 22:20:50 +0800 Subject: [PATCH 11/52] perf: improve css performance --- frontend.new/index.html | 94 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 10 deletions(-) diff --git a/frontend.new/index.html b/frontend.new/index.html index 1ad4852f..b717582e 100755 --- a/frontend.new/index.html +++ b/frontend.new/index.html @@ -29,6 +29,7 @@ top: 0; left: 0; height: 100%; will-change: transform; + contain: layout style paint; } /* ============================================================ @@ -317,6 +318,7 @@ background: rgba(255, 225, 160, 0.5); border-radius: 50%; filter: blur(1.5px); + animation-fill-mode: backwards; } @keyframes streakCalm { @@ -351,6 +353,24 @@ 100% { opacity: 0.25; transform: translateX(-50%) scaleX(0.85) translateY(0); } } +.reflection-glow { + position: absolute; + left: 50%; + transform: translateX(-50%); + border-radius: 50%; + pointer-events: none; + animation-fill-mode: backwards; +} + +@keyframes glowShimmer { + 0% { opacity: 0.35; transform: translateX(-50%) scaleX(0.92) translateY(0); } + 20% { opacity: 0.7; transform: translateX(-50%) scaleX(1.06) translateY(3px); } + 45% { opacity: 0.5; transform: translateX(-50%) scaleX(0.96) translateY(-2px); } + 65% { opacity: 0.8; transform: translateX(-50%) scaleX(1.03) translateY(2px); } + 85% { opacity: 0.45; transform: translateX(-50%) scaleX(0.98) translateY(-1px); } + 100% { opacity: 0.35; transform: translateX(-50%) scaleX(0.92) translateY(0); } +} + /* ============================================================ LAYER 5 — WAVES (3 staggered layers: far / mid / near) Watercolor / picture-book aesthetic @@ -398,7 +418,6 @@ left: -2%; width: 104%; pointer-events: none; opacity: 0; - will-change: transform, opacity; border-radius: 50% 50% 45% 55% / 60% 60% 50% 50%; } @@ -407,7 +426,6 @@ position: absolute; border-radius: 50%; pointer-events: none; - will-change: opacity, transform; } @keyframes particleGlow { @@ -688,6 +706,7 @@ /* ---------- Clouds ---------- */ const cloudsEl = document.getElementById('clouds'); + const cloudsFrag = document.createDocumentFragment(); const cloudData = [ { x: 5, y: 18, w: 180, h: 40, bright: false }, { x: 15, y: 30, w: 240, h: 50, bright: true }, @@ -708,8 +727,9 @@ width:${c.w}px;height:${c.h}px; animation: cloudDrift${i % 3} ${20 + i * 3}s ease-in-out infinite alternate; `; - cloudsEl.appendChild(el); + cloudsFrag.appendChild(el); }); + cloudsEl.appendChild(cloudsFrag); const cloudStyle = document.createElement('style'); cloudStyle.textContent = ` @@ -805,6 +825,7 @@ /* ---------- Ocean shimmer streaks ---------- */ const oceanEl = document.getElementById('ocean'); + const oceanFrag = document.createDocumentFragment(); for (let i = 0; i < 25; i++) { const sh = document.createElement('div'); sh.className = 'shimmer'; @@ -815,7 +836,7 @@ animation-delay:${Math.random() * 5}s; animation-duration:${3 + Math.random() * 4}s; `; - oceanEl.appendChild(sh); + oceanFrag.appendChild(sh); } /* ---------- Ocean wave-lines ---------- */ @@ -827,11 +848,38 @@ animation-delay:${i * 0.5}s; opacity:${0.2 + Math.random() * 0.3}; `; - oceanEl.appendChild(wl); + oceanFrag.appendChild(wl); } + oceanEl.appendChild(oceanFrag); - /* ---------- Sun reflection streaks (wave-synced where overlapping) ---------- */ + /* ---------- Sun reflection — glow column + detail streaks ---------- */ const reflLayer = document.getElementById('sunReflectionLayer'); + const reflFrag = document.createDocumentFragment(); + + /* Base glow blocks — large soft overlapping blobs forming a continuous light column */ + const glowBlocks = [ + { top: 1, h: 22, w: 160, alpha: 0.45, blur: 20, dur: 6 }, + { top: 12, h: 28, w: 240, alpha: 0.38, blur: 25, dur: 7.5 }, + { top: 30, h: 26, w: 300, alpha: 0.30, blur: 22, dur: 5.5 }, + { top: 48, h: 22, w: 250, alpha: 0.22, blur: 20, dur: 8 }, + { top: 62, h: 18, w: 180, alpha: 0.15, blur: 18, dur: 6.5 }, + ]; + glowBlocks.forEach((b, i) => { + const el = document.createElement('div'); + el.className = 'reflection-glow'; + el.style.cssText = ` + top:${b.top}%; + width:${b.w}px; + height:${b.h}%; + background:radial-gradient(ellipse, rgba(255,215,140,${b.alpha}) 0%, rgba(255,200,120,${(b.alpha * 0.5).toFixed(3)}) 40%, transparent 70%); + filter:blur(${b.blur}px); + animation:glowShimmer ${b.dur}s ease-in-out ${(i * 1.3).toFixed(1)}s infinite; + animation-fill-mode:backwards; + `; + reflFrag.appendChild(el); + }); + + /* Detail streaks */ const widthCurve = [9,8,7,6,5,3,3,5,4,7,2,4,4,6,3,3,3,5,4,2,2,3,3,5,6,6,7,7,8]; for (let i = 0; i < 45; i++) { const t = i / 45; @@ -873,9 +921,11 @@ background:rgba(${r},${g},${b},${brightness.toFixed(2)}); animation:${animName} ${animDur}s ease-in-out infinite ${animDir}; animation-delay:${(Math.random() * 4).toFixed(1)}s; + animation-fill-mode:backwards; `; - reflLayer.appendChild(streak); + reflFrag.appendChild(streak); } + reflLayer.appendChild(reflFrag); /* ---------- WAVE SYSTEM — wavefront rows advancing to shore ---------- */ @@ -883,6 +933,7 @@ function rf(lo, hi) { return lo + Math.random() * (hi - lo); } function createWavefronts(container, config) { + var frag = document.createDocumentFragment(); for (var i = 0; i < config.rows; i++) { var baseDelay = (i * config.cycle / config.rows) + rf(-0.8, 0.8); if (baseDelay < 0) baseDelay += config.cycle; @@ -959,10 +1010,11 @@ 'background:' + bg + ';' + 'filter:blur(' + blur.toFixed(1) + 'px);' + 'animation:' + config.anim + ' ' + cycleJitter.toFixed(1) + 's ease-in-out ' + segDelay.toFixed(1) + 's infinite;'; - container.appendChild(el); + frag.appendChild(el); } } } + container.appendChild(frag); } /* Far: dreamy, faint — 6 segments with smooth curvature */ @@ -1003,6 +1055,7 @@ /* ---------- Wave particle sparkles ---------- */ function createWaveParticles(container, count, topMin, topMax) { + var frag = document.createDocumentFragment(); for (var i = 0; i < count; i++) { var p = document.createElement('div'); p.className = 'wave-particle'; @@ -1027,8 +1080,9 @@ 'background:radial-gradient(circle,' + color + ' 0%,transparent 70%);' + 'box-shadow:0 0 ' + (size * 1.5).toFixed(0) + 'px ' + color + ';' + 'animation:particleGlow ' + dur.toFixed(1) + 's ease-in-out ' + delay.toFixed(1) + 's infinite;'; - container.appendChild(p); + frag.appendChild(p); } + container.appendChild(frag); } @@ -1037,6 +1091,7 @@ /* Sparkles on wet sand zone */ createWaveParticles(sandLayer, 35, 1, 16); + const sandFrag = document.createDocumentFragment(); for (let i = 0; i < 80; i++) { const g = document.createElement('div'); g.className = 'sand-grain'; @@ -1047,8 +1102,9 @@ width:${1 + Math.random() * 2}px; height:${1 + Math.random() * 2}px; `; - sandLayer.appendChild(g); + sandFrag.appendChild(g); } + sandLayer.appendChild(sandFrag); /* ========== PARALLAX ENGINE ========== */ const layers = document.querySelectorAll('.layer[data-speed]'); let targetOffset = 0; @@ -1090,6 +1146,7 @@ }); } + let animating = true; let prevT = performance.now(); function loop(now) { const dt = Math.min((now - prevT) / 1000, 0.1); @@ -1100,8 +1157,22 @@ targetOffset = Math.max(-maxOffset, Math.min(maxOffset, targetOffset)); currentOffset += (targetOffset - currentOffset) * ease; applyParallax(); + + if (Math.abs(targetOffset - currentOffset) < 0.5 && !keys.ArrowLeft && !keys.ArrowRight && !dragging) { + currentOffset = targetOffset; + applyParallax(); + animating = false; + return; + } requestAnimationFrame(loop); } + function startLoop() { + if (!animating) { + animating = true; + prevT = performance.now(); + requestAnimationFrame(loop); + } + } requestAnimationFrame(loop); /* ---------- KEYBOARD ---------- */ @@ -1109,6 +1180,7 @@ if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { e.preventDefault(); keys[e.key] = true; + startLoop(); hideHint(); } }); @@ -1128,6 +1200,7 @@ dragStartX = e.clientX; offsetAtDragStart = targetOffset; document.body.classList.add('dragging'); + startLoop(); hideHint(); }); document.addEventListener('mousemove', e => { @@ -1153,6 +1226,7 @@ document.addEventListener('touchstart', e => { touchStartX = e.touches[0].clientX; touchOffsetStart = targetOffset; + startLoop(); hideHint(); }, { passive: true }); document.addEventListener('touchmove', e => { From 80c6865c8bd3842ffba497805eef92de0a927902 Mon Sep 17 00:00:00 2001 From: Koishi Date: Tue, 24 Feb 2026 00:53:17 +0800 Subject: [PATCH 12/52] perf: improve css performance --- frontend.new/assets/sand.png | 3 + frontend.new/index.html | 133 +++++------------------------------ 2 files changed, 21 insertions(+), 115 deletions(-) create mode 100644 frontend.new/assets/sand.png diff --git a/frontend.new/assets/sand.png b/frontend.new/assets/sand.png new file mode 100644 index 00000000..f149b922 --- /dev/null +++ b/frontend.new/assets/sand.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e711c76072727fa9358c89f836164928a573e501f0cbc9a0b48d225a08811f9 +size 1394947 diff --git a/frontend.new/index.html b/frontend.new/index.html index b717582e..06f44ca7 100755 --- a/frontend.new/index.html +++ b/frontend.new/index.html @@ -68,7 +68,7 @@ ============================================================ */ .seagull-layer { width: 400vw; - z-index: 4; + z-index: 7; top: 0; height: 40%; pointer-events: none; } @@ -377,23 +377,26 @@ ============================================================ */ .wave-layer-far { width: 400vw; - z-index: 14; + z-index: 24; top: 33%; height: 18%; pointer-events: none; + contain: layout style; filter: url(#watercolor-far) blur(1.5px); } .wave-layer-mid { width: 400vw; - z-index: 17; + z-index: 26; top: 35%; height: 16%; pointer-events: none; + contain: layout style; filter: url(#watercolor-mid) blur(0.8px); } .wave-layer-near { width: 400vw; - z-index: 22; + z-index: 28; top: 36%; height: 16%; pointer-events: none; + contain: layout style; filter: url(#watercolor-near) blur(0.3px); } @@ -513,84 +516,12 @@ height: calc(58% + 2px); } -.sand { - width: 100%; height: 100%; - background: linear-gradient( - to bottom, - rgba(100, 160, 200, 0) 0%, - rgba(110, 165, 198, 0.08) 2%, - rgba(130, 175, 192, 0.18) 4.5%, - rgba(155, 188, 182, 0.32) 7.5%, - rgba(178, 198, 168, 0.48) 11%, - rgba(200, 202, 156, 0.62) 15%, - rgba(218, 206, 155, 0.78) 19%, - rgba(232, 210, 162, 0.92) 23%, - #e0cca0 28%, - #e6d4ae 38%, - #ecdcba 52%, - #f0e2c6 70%, - #f4e8d0 86%, - #f8eed8 100% - ); -} - -.sand-wet { - position: absolute; - top: 0; - width: 100%; - height: 18%; - background: linear-gradient( - to bottom, - rgba(80, 140, 180, 0.15), - rgba(110, 158, 178, 0.06), - transparent - ); -} - -/* --- Tidal zone (滩涂) — wet sand transition --- */ -.tidal-zone { - position: absolute; - top: 22%; - width: 100%; - height: 74%; - pointer-events: none; - filter: url(#tidal-distort); - background: linear-gradient( - to top, - rgba(145, 115, 78, 0.30) 0%, - rgba(155, 125, 85, 0.24) 15%, - rgba(168, 140, 98, 0.18) 30%, - rgba(182, 158, 115, 0.10) 46%, - rgba(198, 175, 135, 0.05) 60%, - rgba(210, 190, 160, 0.02) 76%, - rgba(220, 205, 175, 0.008) 88%, - transparent 100% - ); -} -.tidal-zone-accent { +.sand-texture { position: absolute; - top: 18%; - width: 100%; - height: 22%; + top: 0; left: 0; + width: 100%; height: 100%; + display: block; pointer-events: none; - filter: url(#tidal-distort-accent); - background: linear-gradient( - to top, - transparent 0%, - rgba(130, 100, 62, 0.06) 8%, - rgba(135, 105, 68, 0.16) 22%, - rgba(145, 115, 75, 0.28) 40%, - rgba(162, 135, 95, 0.16) 62%, - rgba(180, 155, 118, 0.05) 82%, - transparent 100% - ); -} - -.sand-grain { - position: absolute; - width: 2px; height: 2px; - background: rgba(210, 195, 170, 0.5); - border-radius: 50%; } /* ============================================================ @@ -635,18 +566,6 @@ - - - - - - - - - - - - @@ -660,7 +579,7 @@ -
+
@@ -680,7 +599,7 @@
-
+
@@ -688,10 +607,7 @@
-
-
-
-
+
@@ -1086,32 +1002,19 @@ } - /* ---------- Sand grains ---------- */ + /* ---------- Sand sparkles ---------- */ const sandLayer = document.getElementById('sandLayer'); /* Sparkles on wet sand zone */ createWaveParticles(sandLayer, 35, 1, 16); - const sandFrag = document.createDocumentFragment(); - for (let i = 0; i < 80; i++) { - const g = document.createElement('div'); - g.className = 'sand-grain'; - g.style.cssText = ` - left:${Math.random() * 100}%; - top:${22 + Math.random() * 78}%; - opacity:${0.2 + Math.random() * 0.4}; - width:${1 + Math.random() * 2}px; - height:${1 + Math.random() * 2}px; - `; - sandFrag.appendChild(g); - } - sandLayer.appendChild(sandFrag); + /* ========== PARALLAX ENGINE ========== */ const layers = document.querySelectorAll('.layer[data-speed]'); let targetOffset = 0; let currentOffset = 0; let maxOffset = vw * 1.5; - const scrollSpeed = 8; - const ease = 0.08; + const scrollSpeed = 24; + const ease = 0.14; const keys = { ArrowLeft: false, ArrowRight: false }; From 534571aa391e12d4b1ac217cb95ac2a35ed031da Mon Sep 17 00:00:00 2001 From: Koishi Date: Tue, 24 Feb 2026 02:09:32 +0800 Subject: [PATCH 13/52] perf: better css --- frontend.new/assets/render-sand.js | 189 +++ frontend.new/index.html | 115 +- frontend.new/package-lock.json | 2124 +--------------------------- frontend.new/package.json | 21 +- 4 files changed, 280 insertions(+), 2169 deletions(-) create mode 100644 frontend.new/assets/render-sand.js diff --git a/frontend.new/assets/render-sand.js b/frontend.new/assets/render-sand.js new file mode 100644 index 00000000..74634ba7 --- /dev/null +++ b/frontend.new/assets/render-sand.js @@ -0,0 +1,189 @@ +#!/usr/bin/env node +/** + * render-sand.js — 用 Puppeteer 将沙滩 CSS 渲染为 sand.png + * + * 用法: node assets/render-sand.js + * + * 可调参数在下方 CONFIG 区域,改完后重新运行即可。 + * 生成: assets/sand.png (7680×630, RGBA, 透明顶部渐变到 #f8eed8) + */ + +const puppeteer = require('puppeteer'); +const path = require('path'); + +// ============ CONFIG ============ +const WIDTH = 7680; +const HEIGHT = 630; +const OUTPUT = path.join(__dirname, process.argv[2] || 'sand.png'); +// ================================ + +const html = ` + + + + + + + + +
+
+
+
+
+
+ + + +`; + +(async () => { + const browser = await puppeteer.launch({ + headless: 'new', + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--default-background-color=00000000', // transparent + `--window-size=${WIDTH},${HEIGHT}`, + ], + }); + + const page = await browser.newPage(); + await page.setViewport({ width: WIDTH, height: HEIGHT, deviceScaleFactor: 1 }); + await page.setContent(html, { waitUntil: 'networkidle0' }); + + // 等待 SVG filter 渲染完成 + await new Promise(r => setTimeout(r, 500)); + + await page.screenshot({ + path: OUTPUT, + type: 'png', + omitBackground: true, + clip: { x: 0, y: 0, width: WIDTH, height: HEIGHT }, + }); + + await browser.close(); + console.log('sand.png saved to', OUTPUT, `(${WIDTH}x${HEIGHT})`); +})(); diff --git a/frontend.new/index.html b/frontend.new/index.html index 06f44ca7..3577c524 100755 --- a/frontend.new/index.html +++ b/frontend.new/index.html @@ -439,31 +439,83 @@ 100% { opacity: 0; transform: translateY(-8px) scale(0.4); } } -/* Wavefront — rush onto shore, linger, pull back */ -@keyframes advanceFar { - 0% { transform: translateY(0); opacity: 0; } - 15% { opacity: 0.3; } - 42% { transform: translateY(5vh); opacity: 0.35; } - 58% { transform: translateY(5.5vh); opacity: 0.2; } - 85% { transform: translateY(2vh); opacity: 0.06; } +/* Wavefront — rush onto shore, immediately retreat (3 reach variants per layer) + Timing per segment: + rush-in → cubic-bezier(0.25,0.6,0.35,1) smooth deceleration to zero + retreat → cubic-bezier(0.35,0.1,0.7,0.5) brief hesitation then crisp pull-back +*/ +@keyframes advanceFarS { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(3.2vh); opacity: 0.45; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceFarM { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(4.5vh); opacity: 0.5; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceFarL { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 28% { transform: translateY(5vh); opacity: 0.55; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 56% { transform: translateY(0); opacity: 0; } 100% { transform: translateY(0); opacity: 0; } } -@keyframes advanceMid { - 0% { transform: translateY(0); opacity: 0; } - 12% { opacity: 0.45; } - 40% { transform: translateY(6vh); opacity: 0.5; } - 55% { transform: translateY(6.5vh); opacity: 0.3; } - 82% { transform: translateY(2vh); opacity: 0.08; } +@keyframes advanceMidS { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(3.6vh); opacity: 0.55; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceMidM { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(5.2vh); opacity: 0.65; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } + 100% { transform: translateY(0); opacity: 0; } +} +@keyframes advanceMidL { + 0% { transform: translateY(0); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 26% { transform: translateY(6vh); opacity: 0.7; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 54% { transform: translateY(0); opacity: 0; } 100% { transform: translateY(0); opacity: 0; } } -@keyframes advanceNear { - 0% { transform: translateY(0) scaleX(0.98); opacity: 0; } - 10% { opacity: 0.6; } - 38% { transform: translateY(7vh) scaleX(1.03); opacity: 0.7; } - 52% { transform: translateY(7.5vh) scaleX(1.05); opacity: 0.45; } - 80% { transform: translateY(2.5vh) scaleX(1.0); opacity: 0.1; } +@keyframes advanceNearS { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(4.5vh) scaleX(1.03); opacity: 0.75; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } + 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } +} +@keyframes advanceNearM { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(6vh) scaleX(1.05); opacity: 0.85; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } + 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } +} +@keyframes advanceNearL { + 0% { transform: translateY(0) scaleX(0.98); opacity: 0; + animation-timing-function: cubic-bezier(0.25, 0.6, 0.35, 1); } + 24% { transform: translateY(7vh) scaleX(1.05); opacity: 0.9; + animation-timing-function: cubic-bezier(0.35, 0.1, 0.7, 0.5); } + 52% { transform: translateY(0) scaleX(0.98); opacity: 0; } 100% { transform: translateY(0) scaleX(0.98); opacity: 0; } } @@ -545,22 +597,19 @@ - + - - -Sunset Beach - + + + Sunset Beach - - - - -
- - -
- - -
- - - -
- - -
-
-
-
-
- - -
-
-
-
- - -
-
- - -
-
-
-
-
- - -
- -
- -
- -
Drag or press arrow keys to explore the coastline
- - +
+ diff --git a/frontend.new/package-lock.json b/frontend.new/package-lock.json index f5b0a0d3..3ce504aa 100644 --- a/frontend.new/package-lock.json +++ b/frontend.new/package-lock.json @@ -1,17 +1,30 @@ { - "name": "frontend.new", + "name": "beach-scene", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "beach-scene", + "version": "0.1.0", "dependencies": { - "puppeteer": "^24.37.5" + "vue": "^3.5.13" + }, + "devDependencies": { + "@types/node": "^25.3.0", + "@vitejs/plugin-vue": "^5.2.3", + "puppeteer": "^24.37.5", + "tsx": "^4.21.0", + "typescript": "~5.7.3", + "vite": "^6.2.4", + "vue-tsc": "^2.2.8" } }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -22,6 +35,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", @@ -31,10 +53,487 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, "node_modules/@puppeteer/browsers": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "debug": "^4.4.3", @@ -52,18 +551,377 @@ "node": ">=18" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "dev": true, "license": "MIT", - "optional": true, + "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -72,25 +930,214 @@ "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.29.tgz", + "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.29", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz", + "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz", + "integrity": "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.29", + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz", + "integrity": "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.29.tgz", + "integrity": "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.29.tgz", + "integrity": "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz", + "integrity": "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.29", + "@vue/runtime-core": "3.5.29", + "@vue/shared": "3.5.29", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.29.tgz", + "integrity": "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29" + }, + "peerDependencies": { + "vue": "3.5.29" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", + "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "license": "MIT" + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14" } }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -100,6 +1147,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -115,12 +1163,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, "license": "Python-2.0" }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.1" @@ -133,6 +1183,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "react-native-b4a": "*" @@ -143,10 +1194,21 @@ } } }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/bare-events": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "bare-abort-controller": "*" @@ -161,6 +1223,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.4.tgz", "integrity": "sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -183,9 +1246,10 @@ } }, "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.7.0.tgz", + "integrity": "sha512-64Rcwj8qlnTZU8Ps6JJEdSmxBEUGgI7g8l+lMtsJLl4IsfTcHMTfJ188u2iGV6P6YPRZrtv72B2kjn+hp+Yv3g==", + "dev": true, "license": "Apache-2.0", "optional": true, "engines": { @@ -196,6 +1260,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -206,6 +1271,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.0.tgz", "integrity": "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -229,6 +1295,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -239,15 +1306,30 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -257,6 +1339,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -266,6 +1349,7 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -279,6 +1363,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -293,6 +1378,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -305,12 +1391,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.1", @@ -333,19 +1421,34 @@ } } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14" } }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -363,6 +1466,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, "license": "MIT", "dependencies": { "ast-types": "^0.13.4", @@ -377,6 +1481,7 @@ "version": "0.0.1566079", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1566079.tgz", "integrity": "sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==", + "dev": true, "license": "BSD-3-Clause", "peer": true }, @@ -384,21 +1489,36 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -408,15 +1528,59 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -426,6 +1590,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -447,6 +1612,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -460,15 +1626,23 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -478,6 +1652,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "bare-events": "^2.7.0" @@ -487,6 +1662,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", @@ -507,21 +1683,57 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, "license": "MIT" }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -531,6 +1743,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, "license": "MIT", "dependencies": { "pump": "^3.0.0" @@ -542,10 +1755,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/get-uri": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", @@ -556,10 +1783,21 @@ "node": ">= 14" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.0", @@ -573,6 +1811,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -586,6 +1825,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -602,6 +1842,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, "license": "MIT", "engines": { "node": ">= 12" @@ -611,12 +1852,14 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, "license": "MIT" }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -626,12 +1869,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -644,39 +1889,95 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, "license": "MIT" }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz", + "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, "license": "MIT" }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, "license": "MIT" }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -686,6 +1987,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -695,6 +1997,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", @@ -714,6 +2017,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, "license": "MIT", "dependencies": { "degenerator": "^5.0.0", @@ -727,6 +2031,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -739,6 +2044,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -753,10 +2059,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, "license": "MIT" }, "node_modules/picocolors": { @@ -765,10 +2079,53 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -778,6 +2135,7 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -797,12 +2155,14 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, "license": "MIT" }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -813,6 +2173,7 @@ "version": "24.37.5", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.37.5.tgz", "integrity": "sha512-3PAOIQLceyEmn1Fi76GkGO2EVxztv5OtdlB1m8hMUZL3f8KDHnlvXbvCXv+Ls7KzF1R0KdKBqLuT/Hhrok12hQ==", + "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -834,6 +2195,7 @@ "version": "24.37.5", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.37.5.tgz", "integrity": "sha512-ybL7iE78YPN4T6J+sPLO7r0lSByp/0NN6PvfBEql219cOnttoTFzCWKiBOjstXSqi/OKpwae623DWAsL7cn2MQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.13.0", @@ -852,6 +2214,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -861,15 +2224,72 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -882,6 +2302,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -892,6 +2313,7 @@ "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, "license": "MIT", "dependencies": { "ip-address": "^10.0.1", @@ -906,6 +2328,7 @@ "version": "8.0.5", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -920,16 +2343,27 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/streamx": { "version": "2.23.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dev": true, "license": "MIT", "dependencies": { "events-universal": "^1.0.0", @@ -941,6 +2375,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -955,6 +2390,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -967,6 +2403,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dev": true, "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -981,6 +2418,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, "license": "MIT", "dependencies": { "b4a": "^1.6.4", @@ -992,6 +2430,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1002,40 +2441,704 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "node_modules/typed-query-selector": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, "license": "MIT" }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.29.tgz", + "integrity": "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-sfc": "3.5.29", + "@vue/runtime-dom": "3.5.29", + "@vue/server-renderer": "3.5.29", + "@vue/shared": "3.5.29" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } }, "node_modules/webdriver-bidi-protocol": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "dev": true, "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -1053,12 +3156,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/ws": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -1080,6 +3185,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -1089,6 +3195,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -1107,6 +3214,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -1116,6 +3224,7 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", @@ -1126,6 +3235,7 @@ "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/frontend.new/package.json b/frontend.new/package.json index 052fb49d..500fe563 100644 --- a/frontend.new/package.json +++ b/frontend.new/package.json @@ -1,5 +1,24 @@ { + "name": "beach-scene", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview", + "render-sand": "tsx assets/render-sand.ts" + }, "dependencies": { - "puppeteer": "^24.37.5" + "vue": "^3.5.13" + }, + "devDependencies": { + "@types/node": "^25.3.0", + "@vitejs/plugin-vue": "^5.2.3", + "puppeteer": "^24.37.5", + "tsx": "^4.21.0", + "typescript": "~5.7.3", + "vite": "^6.2.4", + "vue-tsc": "^2.2.8" } } diff --git a/frontend.new/src/components/scene/BeachScene.vue b/frontend.new/src/components/scene/BeachScene.vue index 661caf83..640b144f 100644 --- a/frontend.new/src/components/scene/BeachScene.vue +++ b/frontend.new/src/components/scene/BeachScene.vue @@ -29,7 +29,10 @@ +<<<<<<< HEAD +======= +>>>>>>> 227d7bc (refactor: restructure beach scene into Vue 3 + Vite + TypeScript) @@ -46,7 +49,10 @@ import OceanLayer from './OceanLayer.vue' import SunReflectionLayer from './SunReflectionLayer.vue' import WaveLayer from './WaveLayer.vue' import SandLayer from './SandLayer.vue' +<<<<<<< HEAD import SpritesLayer from './SpritesLayer.vue' +======= +>>>>>>> 227d7bc (refactor: restructure beach scene into Vue 3 + Vite + TypeScript) import HintOverlay from './HintOverlay.vue' const { hintHidden } = useParallax() From d4bc5be1d90dfee99b7dec513b92aedb992b71df Mon Sep 17 00:00:00 2001 From: Kanye-Est Date: Sat, 28 Feb 2026 22:18:51 +0800 Subject: [PATCH 15/52] feat: place assets --- frontend.new/package-lock.json | 2 - .../src/components/scene/BeachScene.vue | 6 --- .../src/components/scene/SpritesLayer.vue | 8 +-- frontend.new/src/constants/layers.ts | 2 +- frontend.new/src/constants/sprites.ts | 50 ++++++++++++------- frontend.new/tsconfig.node.json | 3 +- frontend.new/vite.config.ts | 1 + 7 files changed, 37 insertions(+), 35 deletions(-) diff --git a/frontend.new/package-lock.json b/frontend.new/package-lock.json index 3ce504aa..60a49a15 100644 --- a/frontend.new/package-lock.json +++ b/frontend.new/package-lock.json @@ -921,7 +921,6 @@ "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -2477,7 +2476,6 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" diff --git a/frontend.new/src/components/scene/BeachScene.vue b/frontend.new/src/components/scene/BeachScene.vue index 640b144f..661caf83 100644 --- a/frontend.new/src/components/scene/BeachScene.vue +++ b/frontend.new/src/components/scene/BeachScene.vue @@ -29,10 +29,7 @@ -<<<<<<< HEAD -======= ->>>>>>> 227d7bc (refactor: restructure beach scene into Vue 3 + Vite + TypeScript) @@ -49,10 +46,7 @@ import OceanLayer from './OceanLayer.vue' import SunReflectionLayer from './SunReflectionLayer.vue' import WaveLayer from './WaveLayer.vue' import SandLayer from './SandLayer.vue' -<<<<<<< HEAD import SpritesLayer from './SpritesLayer.vue' -======= ->>>>>>> 227d7bc (refactor: restructure beach scene into Vue 3 + Vite + TypeScript) import HintOverlay from './HintOverlay.vue' const { hintHidden } = useParallax() diff --git a/frontend.new/src/components/scene/SpritesLayer.vue b/frontend.new/src/components/scene/SpritesLayer.vue index 4b831304..57408955 100644 --- a/frontend.new/src/components/scene/SpritesLayer.vue +++ b/frontend.new/src/components/scene/SpritesLayer.vue @@ -10,11 +10,7 @@ left: s.left, top: s.top, width: s.width, - transform: [ - s.rotate ? `rotate(${s.rotate}deg)` : '', - s.scaleX ? `scaleX(${s.scaleX})` : '', - s.scaleY ? `scaleY(${s.scaleY})` : '', - ].filter(Boolean).join(' ') || undefined, + transform: s.rotate ? `rotate(${s.rotate}deg)` : undefined, }" /> @@ -39,7 +35,7 @@ onMounted(() => { - - - - -
-
-
-
-
-
- - - -` - -async function main(): Promise { - const browser = await puppeteer.launch({ - headless: true, - args: [ - '--no-sandbox', - '--disable-setuid-sandbox', - '--default-background-color=00000000', - `--window-size=${WIDTH},${HEIGHT}`, - ], - }) - - const page = await browser.newPage() - await page.setViewport({ width: WIDTH, height: HEIGHT, deviceScaleFactor: 1 }) - await page.setContent(html, { waitUntil: 'networkidle0' }) - - // 等待 SVG filter 渲染完成 - await new Promise(r => setTimeout(r, 500)) - - await page.screenshot({ - path: OUTPUT, - type: 'png', - omitBackground: true, - clip: { x: 0, y: 0, width: WIDTH, height: HEIGHT }, - }) - - await browser.close() - console.log('sand.png saved to', OUTPUT, `(${WIDTH}x${HEIGHT})`) -} - -main() diff --git a/frontend.new/assets/sand.png b/frontend.new/assets/sand.png deleted file mode 100644 index f149b922..00000000 --- a/frontend.new/assets/sand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e711c76072727fa9358c89f836164928a573e501f0cbc9a0b48d225a08811f9 -size 1394947 diff --git a/frontend.new/src/constants/sprites.ts b/frontend.new/src/constants/sprites.ts index 3133cffe..3e0ada5f 100644 --- a/frontend.new/src/constants/sprites.ts +++ b/frontend.new/src/constants/sprites.ts @@ -7,17 +7,17 @@ export interface SpriteData { rotate?: number } -import carImg from '@assets/car.png' -import jishiImg from '@assets/jishi.png' -import stoneImg from '@assets/stone.png' -import crabImg from '@assets/crab.png' -import shellImg from '@assets/shell_2d.png' +import carImg from '@/assets/car.png' +import barImg from '@/assets/bar.png' +import stoneImg from '@/assets/stone.png' +import crabImg from '@/assets/crab.png' +import shellImg from '@/assets/shell.png' export const SPRITES: SpriteData[] = [ // car: 往右移一点 50→54%,大小翻倍 18→36vw { id: 'car', src: carImg, left: '38%', top: '10%', width: '45vw' }, - // jishi: 往右移一点 18→24%,大小翻倍 22→44vw - { id: 'jishi', src: jishiImg, left: '24%', top: '28%', width: '44vw' }, + // bar: 往右移一点 18→24%,大小翻倍 22→44vw + { id: 'bar', src: barImg, left: '24%', top: '28%', width: '44vw' }, // stone: 往左移一点 80→72% { id: 'stone', src: stoneImg, left: '72%', top: '5%', width: '14vw' }, // crab: 放在 car 左边,位置再往下一点点 @@ -38,7 +38,7 @@ export const SPRITES: SpriteData[] = [ { id: 'shell-7', src: shellImg, left: '68%', top: '38%', width: '4vw', rotate: -10 }, { id: 'shell-8', src: shellImg, left: '53%', top: '60%', width: '4.3vw', rotate: 50 }, - // --- jishi 旁边的贝壳 --- + // --- bar 旁边的贝壳 --- { id: 'shell-9', src: shellImg, left: '22%', top: '32%', width: '4vw', rotate: 15 }, { id: 'shell-10', src: shellImg, left: '30%', top: '45%', width: '3.5vw', rotate: -40 }, { id: 'shell-11', src: shellImg, left: '26%', top: '55%', width: '4.2vw', rotate: 25 }, diff --git a/frontend.new/tsconfig.node.json b/frontend.new/tsconfig.node.json index 40086666..14a4a67b 100644 --- a/frontend.new/tsconfig.node.json +++ b/frontend.new/tsconfig.node.json @@ -12,8 +12,7 @@ "skipLibCheck": true, "noEmit": true, "paths": { - "@/*": ["./src/*"], - "@assets/*": ["../assets/*"] + "@/*": ["./src/*"] }, "composite": true }, diff --git a/frontend.new/vite.config.ts b/frontend.new/vite.config.ts index 208f4876..18315c3c 100644 --- a/frontend.new/vite.config.ts +++ b/frontend.new/vite.config.ts @@ -7,7 +7,6 @@ export default defineConfig({ resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), - '@assets': fileURLToPath(new URL('../assets', import.meta.url)) } } }) From 1a6c66223dba1b236160105e31283903a6096ae7 Mon Sep 17 00:00:00 2001 From: Kanye-Est Date: Mon, 2 Mar 2026 13:32:59 +0800 Subject: [PATCH 17/52] feat: placement modified --- .../src/components/scene/SpritesLayer.vue | 8 +++- frontend.new/src/constants/layers.ts | 2 +- frontend.new/src/constants/sprites.ts | 40 +++++++------------ 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/frontend.new/src/components/scene/SpritesLayer.vue b/frontend.new/src/components/scene/SpritesLayer.vue index 57408955..4b831304 100644 --- a/frontend.new/src/components/scene/SpritesLayer.vue +++ b/frontend.new/src/components/scene/SpritesLayer.vue @@ -10,7 +10,11 @@ left: s.left, top: s.top, width: s.width, - transform: s.rotate ? `rotate(${s.rotate}deg)` : undefined, + transform: [ + s.rotate ? `rotate(${s.rotate}deg)` : '', + s.scaleX ? `scaleX(${s.scaleX})` : '', + s.scaleY ? `scaleY(${s.scaleY})` : '', + ].filter(Boolean).join(' ') || undefined, }" /> @@ -35,7 +39,7 @@ onMounted(() => { diff --git a/frontend.new/src/components/overlay/ChatPanel.vue b/frontend.new/src/components/overlay/ChatPanel.vue new file mode 100644 index 00000000..2150f552 --- /dev/null +++ b/frontend.new/src/components/overlay/ChatPanel.vue @@ -0,0 +1,231 @@ + + + + + diff --git a/frontend.new/src/components/overlay/CommunityPanel.vue b/frontend.new/src/components/overlay/CommunityPanel.vue new file mode 100644 index 00000000..5c921564 --- /dev/null +++ b/frontend.new/src/components/overlay/CommunityPanel.vue @@ -0,0 +1,528 @@ +