From bdbf6932eb85c0c8b2c20a89ae8f83cfa0ece696 Mon Sep 17 00:00:00 2001 From: theplatformx Date: Sun, 11 Oct 2026 01:33:55 +0700 Subject: [PATCH 1/3] feat: add coded StudioX TradingView motion study --- projects/studiox-v3/.gitignore | 15 + projects/studiox-v3/BRIEF.md | 18 + projects/studiox-v3/README.md | 26 + projects/studiox-v3/STORYBOARD.md | 41 + projects/studiox-v3/assets/Display.ttf | Bin 0 -> 23276 bytes projects/studiox-v3/assets/FONT-LICENSE.txt | 78 + projects/studiox-v3/assets/GSAP-NOTICE.md | 93 + projects/studiox-v3/assets/Mono.ttf | Bin 0 -> 17824 bytes projects/studiox-v3/assets/Serif.ttf | Bin 0 -> 28264 bytes projects/studiox-v3/hyperframes.json | 13 + projects/studiox-v3/index.html | 75 + projects/studiox-v3/index.motion.json | 14 + projects/studiox-v3/meta.json | 5 + projects/studiox-v3/motion.js | 152 ++ projects/studiox-v3/package-lock.json | 1855 +++++++++++++++++ projects/studiox-v3/package.json | 19 + projects/studiox-v3/scripts/build-score.py | 127 ++ .../studiox-v3/scripts/prepare-assets.mjs | 26 + projects/studiox-v3/scripts/render-film.mjs | 22 + 19 files changed, 2579 insertions(+) create mode 100644 projects/studiox-v3/.gitignore create mode 100644 projects/studiox-v3/BRIEF.md create mode 100644 projects/studiox-v3/README.md create mode 100644 projects/studiox-v3/STORYBOARD.md create mode 100644 projects/studiox-v3/assets/Display.ttf create mode 100644 projects/studiox-v3/assets/FONT-LICENSE.txt create mode 100644 projects/studiox-v3/assets/GSAP-NOTICE.md create mode 100644 projects/studiox-v3/assets/Mono.ttf create mode 100644 projects/studiox-v3/assets/Serif.ttf create mode 100644 projects/studiox-v3/hyperframes.json create mode 100644 projects/studiox-v3/index.html create mode 100644 projects/studiox-v3/index.motion.json create mode 100644 projects/studiox-v3/meta.json create mode 100644 projects/studiox-v3/motion.js create mode 100644 projects/studiox-v3/package-lock.json create mode 100644 projects/studiox-v3/package.json create mode 100644 projects/studiox-v3/scripts/build-score.py create mode 100644 projects/studiox-v3/scripts/prepare-assets.mjs create mode 100644 projects/studiox-v3/scripts/render-film.mjs diff --git a/projects/studiox-v3/.gitignore b/projects/studiox-v3/.gitignore new file mode 100644 index 00000000000..264e0652fef --- /dev/null +++ b/projects/studiox-v3/.gitignore @@ -0,0 +1,15 @@ +node_modules/ +renders/ +snapshots/ +.hyperframes/ +assets/gsap.min.js +assets/score.wav +assets/score-premaster.wav +assets/catalyst-source.mp3 +validation.json +*.log +__pycache__/ +AGENTS.md +CLAUDE.md +audio-cues.json +index-video.html diff --git a/projects/studiox-v3/BRIEF.md b/projects/studiox-v3/BRIEF.md new file mode 100644 index 00000000000..0d428f40984 --- /dev/null +++ b/projects/studiox-v3/BRIEF.md @@ -0,0 +1,18 @@ +# StudioX Viewport · TradingView motion study + +## Intent + +- Thirty-second 16:9, 1920 × 1080, 30 fps independent concept film. +- TradingView is the subject. StudioX Viewport is the creator credit; StudioX has no space. +- A coded moving market signal drives the action. Motion is continuous and causally linked across cuts. No screenshot pan or static image montage. +- Premium editorial type, energetic but readable. Closing phrase: “Great ideas should move faster.” +- Code-driven charts and UI are clearly illustrative, not current prices, financial advice, or an official TradingView promotion. +- Full music and sound mix, with prominent accents tied to authored visual beats. + +## Production choice + +Follow the signal from macro data into a chart, through an illustrative chart interaction, and out through kinetic typography. The source remains editable HTML/CSS/SVG/GSAP; Hyperframes captures frames and mixes audio. The previous cut is reference for brand copy only, not a motion template. + +## Scope + +One finished MP4, source, storyboard, audio cues, reproducible build and checks. Existing fork and PR remain intact; this is a new project directory. diff --git a/projects/studiox-v3/README.md b/projects/studiox-v3/README.md new file mode 100644 index 00000000000..1432c381259 --- /dev/null +++ b/projects/studiox-v3/README.md @@ -0,0 +1,26 @@ +# StudioX Viewport × TradingView · 30-second motion study + +An independent concept film. The market signal is a moving vector object throughout the cut: it draws a path, creates a chart, becomes a cursor and annotation, morphs three chart views, converges three panels, and becomes the typographic seam. All chart and interface data are illustrative. This is not a TradingView endorsement, current price display, or trading recommendation. + +## Reproduce + +Node 22+, Python 3 with NumPy, FFmpeg, curl and Chrome/Chromium are required. Hyperframes and GSAP are pinned in `package-lock.json`. + +```bash +cd projects/studiox-v3 +npm ci +npm run assets +npm run lint +npm run check +npm run render +``` + +If Chrome is installed outside the usual path, set `HYPERFRAMES_BROWSER_PATH` to its binary. `scripts/prepare-assets.mjs` verifies the SHA-256 hash of the licensed music source, copies the pinned GSAP runtime, and generates the 30-second WAV. `scripts/render-film.mjs` renders the coded picture in Hyperframes and muxes the authored score with FFmpeg. This avoids a Hyperframes 0.8.145 audio-normalization failure observed during this export. Assets and renders are excluded from git where they can be rebuilt. The font files and their license are retained with the source. `STORYBOARD.md` records the visual sequence; `motion.js` authors deterministic GSAP animation; `scripts/build-score.py` authors the sectional music edit and event sound cues. + +## Media credit + +Music: **“Catalyst” by Scott Buckley**, CC BY 4.0, https://www.scottbuckley.com.au/library/catalyst/ . Four excerpts and original effects are remixed and mastered for the cut; the on-film music credit must be retained in public exports. See https://creativecommons.org/licenses/by/4.0/ . Fonts: DejaVu subsets, license in `assets/FONT-LICENSE.txt`. GSAP notice: `assets/GSAP-NOTICE.md`. + +## Quality gates + +The browser check catches broken rendering, clipping, text collisions and basic contrast; it cannot grade editorial rhythm. Review the rendered MP4 with audio and check the motion at 9.4–10.3, 19.5–20.3 and 26.8–28.5. This film is 30 seconds by request, separate from the planned 60-second deliverable. diff --git a/projects/studiox-v3/STORYBOARD.md b/projects/studiox-v3/STORYBOARD.md new file mode 100644 index 00000000000..d207871548e --- /dev/null +++ b/projects/studiox-v3/STORYBOARD.md @@ -0,0 +1,41 @@ +# StudioX Viewport / TradingView — 30-second motion study + +Canvas 1920×1080 at 30 fps. Midnight `#081321`, ivory `#F0F0EA`, signal cyan `#5DE5E1`, TradingView blue `#2D6DF6`, warning coral `#FF695D`. One persistent luminous signal point at the center of each transformation. The act boundaries use a bright energy wipe carried by that point, not unrelated slides. Silence and negative space are used between dense passages. + +## 00:00–00:10 · Discover the signal + +0.0–1.6: Near-black. Thin pulsing data strokes race across frame. The signal point changes direction and draws a sharp vector path. Large words `THE MARKET` appear as the path intersects them, then `DOESN’T WAIT` locks on a musical impact. + +1.6–4.0: Camera pulls back from the moving point: strokes resolve into a chart axis and candlesticks grow sequentially under it. The signal passes from one candle to the next. Counter lines and crosshair respond to it. + +4.0–7.4: The same point becomes a pointer in an illustrative TradingView chart surface. A drag draws a diagonal annotation along two actual chart pivots. Text `SEE THE MOMENT` arrives after the gesture, not before it. + +7.4–10.0: The chart surface rotates and descends through a masked zoom into the latest candle; the signal expands into a circular light at 960,540 for the next act. + +## 00:10–00:20 · Act on context + +10.0–12.8: Circular light contracts to a selection target in a reconfigured wide chart. A thin cursor line scans, triggering tooltips and an active timeframe. Header `CHANGE THE VIEW`. + +12.8–16.5: Three timeframe controls change sequentially. The chart's geometry morphs between three different local vector data paths in the same graph; grid labels and highlight respond to the active state. Camera changes scale in coordination with the data, then settles. + +16.5–18.8: The chart splits into three perspectives (macro, intraday, watchlist), each animating a distinct response. They converge along matched trajectories rather than fading to a different card. + +18.8–20.0: A bright cyan signal traces across the merged horizon and becomes one large horizontal stroke for the typographic climax. + +## 00:20–00:30 · Payoff and credit + +20.0–22.8: Horizontal stroke cuts open giant editorial typography `GREAT IDEAS`. Each word acts on the stroke and repositions the composition. + +22.8–25.0: The words `SHOULD MOVE` travel with the accelerating line, breaking through a field of measured ticks. Kinetic typography is the subject. + +25.0–27.1: `FASTER.` forms at full scale from the travel trails, then settles into stillness. + +27.1–30.0: The signal folds into a restrained TradingView wordmark and a separate `CREATED BY STUDIOX VIEWPORT` credit. A final line continues moving beneath the lockup; legal and music credit remain small but readable. + +## Sound direction + +~120–128 BPM pulse with a composed beat grid; deliberate dropouts at 10.0 and 20.0, build through 25.0, restrained branded release at 27.1. Directional effects and short low impacts follow visible causes. Do not disguise a continuous music excerpt as editing. + +## Proof frames + +0.0, 1.2, 3.0, 5.4, 8.7, 10.3, 14.4, 17.7, 20.5, 23.8, 25.9, 28.2, 29.9 plus frame runs straddling 10.0, 20.0 and 27.1. Review motion sequences as video, not only posters. diff --git a/projects/studiox-v3/assets/Display.ttf b/projects/studiox-v3/assets/Display.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ba7ef7c04808793316fecfe4259e0a211015b213 GIT binary patch literal 23276 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 RY&Qw?8I5f>JV8mf{{yXJHXr~1 literal 0 HcmV?d00001 diff --git a/projects/studiox-v3/assets/FONT-LICENSE.txt b/projects/studiox-v3/assets/FONT-LICENSE.txt new file mode 100644 index 00000000000..d1fcfc8e8f2 --- /dev/null +++ b/projects/studiox-v3/assets/FONT-LICENSE.txt @@ -0,0 +1,78 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: DejaVu fonts +Upstream-Author: Stepan Roh (original author), + see /usr/share/doc/fonts-dejavu-core/AUTHORS for full list +Source: https://dejavu-fonts.github.io/ + +Files: * +Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. + Bitstream Vera is a trademark of Bitstream, Inc. + DejaVu changes are in public domain. +License: bitstream-vera + Permission is hereby granted, free of charge, to any person obtaining a copy + of the fonts accompanying this license ("Fonts") and associated + documentation files (the "Font Software"), to reproduce and distribute the + Font Software, including without limitation the rights to use, copy, merge, + publish, distribute, and/or sell copies of the Font Software, and to permit + persons to whom the Font Software is furnished to do so, subject to the + following conditions: + . + The above copyright and trademark notices and this permission notice shall + be included in all copies of one or more of the Font Software typefaces. + . + The Font Software may be modified, altered, or added to, and in particular + the designs of glyphs or characters in the Fonts may be modified and + additional glyphs or characters may be added to the Fonts, only if the fonts + are renamed to names not containing either the words "Bitstream" or the word + "Vera". + . + This License becomes null and void to the extent applicable to Fonts or Font + Software that has been modified and is distributed under the "Bitstream + Vera" names. + . + The Font Software may be sold as part of a larger software package but no + copy of one or more of the Font Software typefaces may be sold by itself. + . + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, + TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME + FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING + ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF + THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE + FONT SOFTWARE. + . + Except as contained in this notice, the names of Gnome, the Gnome + Foundation, and Bitstream Inc., shall not be used in advertising or + otherwise to promote the sale, use or other dealings in this Font Software + without prior written authorization from the Gnome Foundation or Bitstream + Inc., respectively. For further information, contact: fonts at gnome dot + org. + +Files: debian/* +Copyright: (C) 2005-2006 Peter Cernak + (C) 2006-2011 Davide Viti + (C) 2011-2013 Christian Perrier + (C) 2013 Fabian Greffrath +License: GPL-2+ + This program is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later + version. + . + This program is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the GNU General Public License for more + details. + . + You should have received a copy of the GNU General Public + License along with this package; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301 USA + . + On Debian systems, the full text of the GNU General Public + License version 2 can be found in the file + /usr/share/common-licenses/GPL-2'. diff --git a/projects/studiox-v3/assets/GSAP-NOTICE.md b/projects/studiox-v3/assets/GSAP-NOTICE.md new file mode 100644 index 00000000000..abd1fa4abc0 --- /dev/null +++ b/projects/studiox-v3/assets/GSAP-NOTICE.md @@ -0,0 +1,93 @@ +# GSAP (GreenSock Animation Platform) + +[![GSAP - Animate anything](https://gsap.com/GSAP-share-image.png)](https://gsap.com) + +GSAP is a **framework-agnostic** JavaScript animation library that turns developers into animation superheroes. Build high-performance animations that work in **every** major browser. Animate CSS, SVG, canvas, React, Vue, WebGL, colors, strings, motion paths, generic objects... anything JavaScript can touch! GSAP's ScrollTrigger plugin delivers jaw-dropping scroll-based animations with minimal code. gsap.matchMedia() makes building responsive, accessibility-friendly animations a breeze. + +No other library delivers such advanced sequencing, reliability, and tight control while solving real-world problems on over 12 million sites. GSAP works around countless browser inconsistencies; your animations ***just work***. At its core, GSAP is a high-speed property manipulator, updating values over time with extreme accuracy. It's up to 20x faster than jQuery! + +GSAP is completely flexible; sprinkle it wherever you want. **Zero dependencies.** + +There are many optional plugins and easing functions for achieving advanced effects easily like scrolling, morphing, [text splitting](https://gsap.com/docs/v3/Plugins/SplitText), animating along a motion path or FLIP animations. There's even a handy Observer for normalizing event detection across browsers/devices. + + +### Get Started + +[![Get Started with GSAP](https://gsap.com/_img/github/get-started.jpg)](https://gsap.com/get-started) + + +## Docs & Installation + +View the full documentation here, including an installation guide. + +### CDN + +```html + +``` + +See JSDelivr's dedicated GSAP page for quick CDN links to the core files/plugins. There are more installation instructions at gsap.com. + +**Every major ad network excludes GSAP from file size calculations** and most have it on their own CDNs, so contact them for the appropriate URL(s). + +### NPM +See the guide to using GSAP via NPM here. + +```javascript +npm install gsap +``` + +GSAP's core can animate almost anything including CSS and attributes, plus it includes all of the utility methods like interpolate(), mapRange(), most of the eases, and it can do snapping and modifiers. + +```javascript +// typical import +import gsap from "gsap"; + +// get other plugins: +import ScrollTrigger from "gsap/ScrollTrigger"; +import Flip from "gsap/Flip"; +import Draggable from "gsap/Draggable"; + +// or all tools are exported from the "all" file (excluding members-only plugins): +import { gsap, ScrollTrigger, Draggable, MotionPathPlugin } from "gsap/all"; + +// don't forget to register plugins +gsap.registerPlugin(ScrollTrigger, Draggable, Flip, MotionPathPlugin); +``` + +The NPM files are ES modules, but there's also a /dist/ directory with UMD files for extra compatibility. + +## GSAP is FREE! + +Thanks to [Webflow](https://webflow.com), GSAP is now **100% FREE** including ALL of the bonus plugins like [SplitText](https://gsap.com/docs/v3/Plugins/SplitText), [MorphSVG](https://gsap.com/docs/v3/Plugins/MorphSVGPlugin), and all the others that were exclusively available to Club GSAP members. That's right - the entire GSAP toolset is FREE, even for commercial use! 🤯 Read more [here](https://webflow.com/blog/gsap-becomes-free) + +### ScrollTrigger & ScrollSmoother + +If you're looking for scroll-driven animations, GSAP's ScrollTrigger plugin is the standard. There's a companion ScrollSmoother as well. + +[![ScrollTrigger](https://gsap.com/_img/github/scrolltrigger.jpg)](https://gsap.com/docs/v3/Plugins/ScrollTrigger) + +### Using React? + +There's a @gsap/react package that exposes a `useGSAP()` hook which is a drop-in replacement for `useEffect()`/`useLayoutEffect()`, automating cleanup tasks. Please read the React guide for details. + +### Resources + +* gsap.com +* Getting started guide +* Docs +* Demos & starter templates +* Community forums +* Ease Visualizer +* Showcase +* YouTube Channel +* Cheat sheet +* Webflow + +### Need help? +Ask in the friendly GSAP forums. Or share your knowledge and help someone else - it's a great way to sharpen your skills! Report any bugs there too (or file an issue here if you prefer). + +### License +GreenSock's standard "no charge" license can be viewed at https://gsap.com/standard-license. + +Copyright (c) 2008-2025, GreenSock. All rights reserved. \ No newline at end of file diff --git a/projects/studiox-v3/assets/Mono.ttf b/projects/studiox-v3/assets/Mono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d48a0da607e13a0e965f93efe8312efbf50396d1 GIT binary patch literal 17824 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 DLtx;) literal 0 HcmV?d00001 diff --git a/projects/studiox-v3/hyperframes.json b/projects/studiox-v3/hyperframes.json new file mode 100644 index 00000000000..ec2e3c2efd5 --- /dev/null +++ b/projects/studiox-v3/hyperframes.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://hyperframes.heygen.com/schema/hyperframes.json", + "registry": "https://raw.githubusercontent.com/heygen-com/hyperframes/main/registry", + "paths": { + "blocks": "compositions", + "components": "compositions/components", + "assets": "assets" + }, + "media": { + "autoProxy": true + }, + "authoringSkill": "product-launch-video" +} diff --git a/projects/studiox-v3/index.html b/projects/studiox-v3/index.html new file mode 100644 index 00000000000..59dabc40a18 --- /dev/null +++ b/projects/studiox-v3/index.html @@ -0,0 +1,75 @@ + + + + + TradingView · StudioX Viewport + + + + +
+
+
+
+
01 / IN MOTION
THE MARKET
DOESN’T WAIT.
+
TradingView / CHARTEXPLOREIDEASILLUSTRATIVE EXPERIENCE
⌖╱⌗○
+
SEE THE MOMENT.
+
+
02 / A DIFFERENT PERSPECTIVE
CHANGE THE VIEW.
1D1W1M
+
+
ONE SIGNAL. MORE CONTEXT.
HYPOTHETICAL DATA / NO LIVE PRICES
+
+
+
+
03 / STUDIOX VIEWPORT
GREAT
IDEAS
SHOULD
MOVE
FASTER.
+
TradingView
Great ideas should move faster.
CREATED BY STUDIOX VIEWPORT
+
+
+ +
+ + + diff --git a/projects/studiox-v3/index.motion.json b/projects/studiox-v3/index.motion.json new file mode 100644 index 00000000000..d581ff16efb --- /dev/null +++ b/projects/studiox-v3/index.motion.json @@ -0,0 +1,14 @@ +{ + "duration": 30, + "assertions": [ + {"kind":"appearsBy","selector":"#market","bySec":1.0}, + {"kind":"appearsBy","selector":"#wait","bySec":1.7}, + {"kind":"appearsBy","selector":"#surface","bySec":4.7}, + {"kind":"appearsBy","selector":"#see","bySec":7.5}, + {"kind":"appearsBy","selector":"#viewTitle","bySec":10.9}, + {"kind":"appearsBy","selector":"#faster","bySec":26.0}, + {"kind":"appearsBy","selector":"#brand","bySec":28.0}, + {"kind":"staysInFrame","selector":"#brand"}, + {"kind":"staysInFrame","selector":"#studio"} + ] +} diff --git a/projects/studiox-v3/meta.json b/projects/studiox-v3/meta.json new file mode 100644 index 00000000000..80e09f8a5ca --- /dev/null +++ b/projects/studiox-v3/meta.json @@ -0,0 +1,5 @@ +{ + "id": "studiox-v3", + "name": "studiox-v3", + "createdAt": "2026-10-10T18:15:46.718Z" +} \ No newline at end of file diff --git a/projects/studiox-v3/motion.js b/projects/studiox-v3/motion.js new file mode 100644 index 00000000000..ff3290e1de3 --- /dev/null +++ b/projects/studiox-v3/motion.js @@ -0,0 +1,152 @@ +/* Every visible state is a deterministic function of the Hyperframes-seeked GSAP timeline. */ +(() => { + const ns = 'http://www.w3.org/2000/svg'; + const $ = (s) => document.querySelector(s); + const make = (tag, attributes, parent) => { + const n = document.createElementNS(ns, tag); + for (const [key, value] of Object.entries(attributes)) n.setAttribute(key, value); + parent.appendChild(n); + return n; + }; + const grid1 = $('#grid1'); + for (let x = 110; x <= 1810; x += 100) make('line', { x1:x, x2:x, y1:145, y2:914 }, grid1); + for (let y = 200; y <= 900; y += 100) make('line', { x1:110, x2:1810, y1:y, y2:y }, grid1); + + const points = Array.from({length:65}, (_,i) => { + const x = 90 + i*27; + const y = 642 - i*3.35 + 68*Math.sin(i*.49) + 30*Math.cos(i*.21) + 13*Math.sin(i*1.8); + return [x,Math.round(y)]; + }); + const path = (p) => p.map(([x,y],i) => `${i?'L':'M'} ${x.toFixed(1)} ${y.toFixed(1)}`).join(' '); + $('#price').setAttribute('d',path(points)); + const priceLength = $('#price').getTotalLength(); + $('#price').style.strokeDasharray = `${priceLength}`; + $('#price').style.strokeDashoffset = `${priceLength}`; + + const candles = []; + for (let i=0;i<43;i++) { + const a = points[Math.min(i*1+5,60)], x = 220+i*31.5; + const span = 19+14*(1+Math.sin(i*1.7)); + const top = a[1] - span/2, down = i%5===1 || i%7===3; + const wick = make('line',{x1:x+7,x2:x+7,y1:top-21,y2:top+span+24,stroke:down?'#ff695d':'#5de5e1'},$('#candles')); + const body = make('rect',{x,y:top,width:14,height:span,rx:1,class:down?'down':''},$('#candles')); + candles.push(wick,body); + } + + const graphShape = (mode) => Array.from({length:72},(_,i) => { + const x = 24+i*23.7; + const y = mode===0 ? 376-i*2.3+64*Math.sin(i*.38)+16*Math.cos(i*1.2) + : mode===1 ? 355-i*1.25+103*Math.sin(i*.21)+33*Math.cos(i*.57) + : 401-i*3.2+69*Math.sin(i*.13)+65*Math.cos(i*.37); + return [x,Math.max(64,Math.min(542,y))]; + }); + const shapes = [0,1,2].map((m)=>path(graphShape(m))); + $('#graphPath').setAttribute('d',shapes[0]); + $('#graphFill').setAttribute('d',`${shapes[0]} L 1706 589 L 24 589 Z`); + const graphLength = $('#graphPath').getTotalLength(); + $('#graphPath').style.strokeDasharray = `${graphLength*2}`; + $('#graphPath').style.strokeDashoffset = `${graphLength*2}`; + + for(let i=0;i<3;i++) { + const p = Array.from({length:25},(_,j)=>[12+j*19,330-j*5+67*Math.sin(j*(.37+i*.14))+28*Math.cos(j*(.77+i*.23))]); + const el = $(`#panel${i+1}`); el.setAttribute('d',path(p)); + const length=el.getTotalLength(); el.style.strokeDasharray=`${length}`; el.style.strokeDashoffset=`${length}`; + } + for(let i=0;i<14;i++) { + const line=document.createElement('i');line.style.top=`${156+i*53}px`;line.style.width=`${250+(i*97)%550}px`; + $('#speed').appendChild(line); + } + + const tl=gsap.timeline({paused:true,defaults:{ease:'power3.out'}}); + tl.set('#act2',{opacity:0},0).set('#act3',{opacity:0},0) + .set('#tf1',{backgroundColor:'#5de5e1',color:'#071629'},0) + .set('#surface',{opacity:0,y:68,scale:.92},0).set('#see',{opacity:0,y:70},0) + .set('#hook .kicker',{opacity:0},0).set('#market',{opacity:0,y:180},0).set('#wait',{opacity:0,y:180},0) + .set('#chartWorld',{scale:1.52,x:-245,y:96},0).set('#candles',{opacity:0},0) + .set('#cross1, #cross2, #trend',{opacity:0},0).set('#cursor',{opacity:0},0) + .set('#wipe1',{scale:0,opacity:0},0) + .set('#graphPath',{strokeDashoffset:graphLength*2},0).set('#scan',{opacity:0,x:0},0) + .set('#panels',{opacity:0},0).set('#merge',{scaleX:0,opacity:0},0) + .set('#wipe2',{scale:0,opacity:0},0) + .set('#great, #ideas, #should, #move, #faster',{opacity:0},0) + .set('#endcard',{clipPath:'inset(100% 0 0 0)'},0) + .set('#brand,#tag,#studio,#foot',{opacity:0},0); + + // 0–10: the signal draws a chart, becomes a cursor, and marks a cause on that chart. + tl.fromTo('#hook .kicker',{opacity:0},{opacity:1,duration:.45},.08) + .fromTo('#market',{opacity:0,y:180},{opacity:1,y:0,duration:.62,ease:'power4.out'},.40) + .fromTo('#wait',{opacity:0,y:180},{opacity:1,y:0,duration:.55,ease:'power4.out'},1.04) + .to('#price',{strokeDashoffset:0,duration:3.55,ease:'power1.inOut'},.12) + .fromTo('#signal',{x:82,y:635},{x:598,y:654,duration:1.08,ease:'power1.inOut'},.16) + .to('#signal',{x:1085,y:410,duration:1.08,ease:'power1.inOut'},1.24) + .to('#signal',{x:1772,y:405,duration:1.22,ease:'power1.inOut'},2.32) + .to('#hook',{opacity:0,y:-95,duration:.54,ease:'power2.in'},2.07) + .to('#chartWorld',{scale:1,x:0,y:0,duration:1.35,ease:'power3.out'},2.35) + .to('#candles',{opacity:1,duration:.23},2.55) + .fromTo(candles,{scaleY:0,transformOrigin:'50% 100%'},{scaleY:1,duration:.45,stagger:.035,ease:'power3.out'},2.49) + .to('#signal',{opacity:0,duration:.25},3.60) + .to('#surface',{opacity:1,y:0,scale:1,duration:.72,ease:'power3.out'},3.85) + .to('#cross1, #cross2',{opacity:.68,duration:.24},4.35) + .fromTo('#cursor',{opacity:0,x:260,y:850},{opacity:1,x:449,y:693,duration:.78,ease:'power2.inOut'},4.28) + .to('#cursor',{x:1170,y:450,duration:1.70,ease:'power1.inOut'},5.13) + .to('#cross1',{attr:{y1:452,y2:452},duration:1.64,ease:'power1.inOut'},5.13) + .to('#cross2',{attr:{x1:1170,x2:1170},duration:1.64,ease:'power1.inOut'},5.13) + .to('#trend',{opacity:1,strokeDashoffset:0,duration:1.68,ease:'power1.inOut'},5.15) + .fromTo('#see',{opacity:0,y:72},{opacity:1,y:0,duration:.60},6.82) + .to('#cursor',{scale:.62,x:1330,y:355,duration:.52,ease:'power2.in'},7.76) + .to('#chartWorld',{scale:2.4,x:-1130,y:390,duration:1.38,ease:'power2.inOut'},8.14) + .to('#surface',{opacity:0,duration:.28,ease:'power2.in'},8.50) + .to('#see',{opacity:0,x:-205,duration:.42,ease:'power2.in'},8.54) + .to('#wipe1',{opacity:1,scale:31,duration:.61,ease:'power3.in'},9.39); + + // 10–20: one chart changes its time basis; three perspectives converge into one stroke. + tl.set('#act2',{opacity:1},10).set('#act1',{opacity:0},10.12) + .fromTo('#viewTitle',{opacity:0,y:65},{opacity:1,y:0,duration:.58},10.15) + .fromTo('#act2 .kicker',{opacity:0},{opacity:1,duration:.55},10.18) + .to('#wipe1',{opacity:0,duration:.12},10.10) + .to('#graphPath',{strokeDashoffset:0,duration:2.15,ease:'power1.inOut'},10.30) + .fromTo('#scan',{opacity:0,x:78},{opacity:1,x:832,duration:1.93,ease:'power1.inOut'},10.42) + .to('#scan',{x:1420,duration:1.42,ease:'power1.inOut'},12.35) + .to('#tf1',{backgroundColor:'#112b42',color:'#9db4c1',duration:.15},12.86) + .to('#tf2',{backgroundColor:'#5de5e1',color:'#071629',duration:.15},12.86) + .to('#graphPath',{attr:{d:shapes[1]},duration:1.2,ease:'power2.inOut'},12.85) + .to('#graphFill',{attr:{d:`${shapes[1]} L 1706 589 L 24 589 Z`},duration:1.2,ease:'power2.inOut'},12.85) + .to('#tf2',{backgroundColor:'#112b42',color:'#9db4c1',duration:.15},14.50) + .to('#tf3',{backgroundColor:'#5de5e1',color:'#071629',duration:.15},14.50) + .to('#graphPath',{attr:{d:shapes[2]},duration:1.2,ease:'power2.inOut'},14.50) + .to('#graphFill',{attr:{d:`${shapes[2]} L 1706 589 L 24 589 Z`},duration:1.2,ease:'power2.inOut'},14.50) + .to('#graph',{scale:1.08,x:-66,duration:.65,ease:'power2.inOut'},15.5) + .to('#viewTitle',{opacity:0,y:-75,duration:.36,ease:'power2.in'},16.15) + .to('#graph,#timeframes,#viewFoot,#dataFoot',{opacity:0,duration:.28},16.34) + .fromTo('#panels',{opacity:0},{opacity:1,duration:.22},16.55) + .fromTo('.panel',{scale:.25,y:420,rotationY:35,opacity:0},{scale:1,y:0,rotationY:0,opacity:1,duration:.80,stagger:.13,ease:'power3.out'},16.57) + .to('#panel1,#panel2,#panel3',{strokeDashoffset:0,duration:1.55,stagger:.15,ease:'power1.inOut'},16.80) + .to('.panel',{x:(i)=>[595,0,-595][i],scale:.08,rotationY:0,duration:.63,ease:'power2.inOut'},18.66) + .to('#panels',{opacity:0,duration:.10},19.27) + .to('#merge',{opacity:1,scaleX:1,duration:.52,ease:'power2.inOut'},19.10) + .to('#wipe2',{opacity:1,scale:32,duration:.52,ease:'power3.in'},19.48); + + // 20–30: typography physically collides with the travelling line, then gives the brand a hold. + tl.set('#act3',{opacity:1},20).set('#act2',{opacity:0},20.12) + .to('#wipe2',{opacity:0,duration:.12},20.10) + .fromTo('#great',{opacity:0,x:-560},{opacity:1,x:0,duration:.56,ease:'power4.out'},20.18) + .fromTo('#ideas',{opacity:0,x:680},{opacity:1,x:0,duration:.62,ease:'power4.out'},21.08) + .to('#seam',{scaleX:.84,x:146,duration:.82,ease:'power2.inOut'},21.55) + .to('#great,#ideas',{opacity:0,x:-650,duration:.42,ease:'power3.in'},22.60) + .fromTo('#should',{opacity:0,y:-175},{opacity:1,y:0,duration:.51,ease:'power4.out'},22.95) + .fromTo('#move',{opacity:0,x:470},{opacity:1,x:0,duration:.49,ease:'power4.out'},23.68) + .fromTo('#speed i',{opacity:0,x:750},{opacity:.32,x:-1150,duration:.93,stagger:.025,ease:'power2.in'},24.06) + .to('#should,#move',{opacity:0,x:-410,duration:.42,ease:'power3.in'},24.65) + .fromTo('#faster',{opacity:0,scale:1.52,x:510,filter:'blur(12px)'},{opacity:1,scale:1,x:0,filter:'blur(0px)',duration:.64,ease:'power4.out'},25.04) + .to('#seam',{scaleX:1,x:0,duration:.50},25.23) + .to('#faster',{opacity:0,scale:.96,duration:.37,ease:'power2.in'},26.60) + .to('#act3 .kicker',{opacity:0,duration:.20},26.77) + .to('#endcard',{clipPath:'inset(0% 0 0 0)',duration:.53,ease:'power3.inOut'},26.93) + .fromTo('#brand',{opacity:0,y:120},{opacity:1,y:0,duration:.55},27.40) + .fromTo('#tag',{opacity:0,y:35},{opacity:1,y:0,duration:.52},27.84) + .to('#creditline',{width:1640,duration:.68,ease:'power2.inOut'},28.05) + .fromTo('#studio,#foot',{opacity:0,y:25},{opacity:1,y:0,duration:.40,stagger:.14},28.40); + + window.__timelines=window.__timelines||{}; + window.__timelines['studiox-v3']=tl; +})(); diff --git a/projects/studiox-v3/package-lock.json b/projects/studiox-v3/package-lock.json new file mode 100644 index 00000000000..40aac8056d0 --- /dev/null +++ b/projects/studiox-v3/package-lock.json @@ -0,0 +1,1855 @@ +{ + "name": "studiox-viewport-tradingview-motion-study", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "studiox-viewport-tradingview-motion-study", + "version": "1.0.0", + "dependencies": { + "gsap": "3.14.2", + "hyperframes": "0.8.145" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hono/node-server": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.4.tgz", + "integrity": "sha512-2g1qeHl4BduwDn6L8nkAvDrPUWPMlkQ//a5NhP/zIyaXKMjZNRV+cG9Csu+BiJFf6+68pqzjf4Hi5sJGKHuS1g==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "hono": "^4 || ^5.0.0-0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", + "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", + "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", + "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", + "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", + "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", + "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", + "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", + "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", + "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", + "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", + "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", + "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", + "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", + "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", + "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", + "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", + "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", + "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", + "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", + "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", + "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", + "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", + "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", + "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", + "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", + "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.4.tgz", + "integrity": "sha512-okJ6yQMc0SBexOKxMi966omwAV1uAPwgF/YMZdb04gZQPXVjWHl9bmXjZYtIcsN1+PN3Bz4iFfGK3g+c6lZJ0Q==", + "license": "Apache-2.0", + "dependencies": { + "modern-tar": "^0.8.5", + "yargs": "^18.0.0" + }, + "bin": { + "browsers": "lib/main-cli.js" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "proxy-agent": ">=8.0.1", + "yauzl": "^2.10.0 || ^3.4.0" + }, + "peerDependenciesMeta": { + "proxy-agent": { + "optional": true + }, + "yauzl": { + "optional": true + } + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/adm-zip": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.6.1.tgz", + "integrity": "sha512-Xwrja8nx9e5o2N1my4DsKCeKpdrnACyr1wtbPxBDgGzKzKyE9kRtBFA8mWldI+RVlD7CBZNWY/wQ2+ydwOR6kQ==", + "license": "MIT", + "engines": { + "node": ">=14.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/bundle-name": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chromium-bidi": { + "version": "157.0.8090-0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-157.0.8090-0.tgz", + "integrity": "sha512-KJw7IQgqXwxpJgJlEIPg5mr2ZoqA+jkTRtc5EABI7sUJ3bu3cpI7NuEBoj4Gn1AsF78CaT9So5WQWspK3/wYag==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^4.6.5" + }, + "engines": { + "node": ">=20.19.0 <22.0.0 || >=22.12.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1696802", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1696802.tgz", + "integrity": "sha512-FO5/SENfvc2K8wRnWQflKcwuoTH4dBkXCWTQ9ebIWtuX8JM5+ZvCotaEmkfh21pO7TvIKGTM3hG4xFiq9WTwmg==", + "license": "BSD-3-Clause" + }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.1.tgz", + "integrity": "sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==", + "license": "MIT", + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/gsap": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.14.2.tgz", + "integrity": "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==", + "license": "Standard 'no charge' license: https://gsap.com/standard-license." + }, + "node_modules/hono": { + "version": "4.13.13", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.13.tgz", + "integrity": "sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hyperframes": { + "version": "0.8.145", + "resolved": "https://registry.npmjs.org/hyperframes/-/hyperframes-0.8.145.tgz", + "integrity": "sha512-SoRPORdfQkZtNaINqw/qPs/Nic+yz89Ii9TcVzwWWrQr9ZtqAZuMWja1cGgvw8AZy4QXQxRyW/okd55G57ClKQ==", + "license": "Apache-2.0", + "dependencies": { + "@hono/node-server": "^2.0.5", + "@puppeteer/browsers": "^3.2.2", + "adm-zip": "^0.6.0", + "citty": "^0.2.1", + "compare-versions": "^6.1.1", + "css-tree": "^3.2.1", + "debug": "^4.4.0", + "esbuild": "^0.25.12", + "fontkit": "^2.0.4", + "giget": "^3.2.0", + "hono": "^4.0.0", + "ignore": "^5.3.2", + "open": "^10.0.0", + "postcss": "^8.5.8", + "prettier": "^3.8.1", + "puppeteer-core": "^25.10.0", + "sharp": "^0.35.0" + }, + "bin": { + "hyperframes": "bin/hyperframes.mjs", + "hyperframes-localize-fonts": "bin/hyperframes-localize-fonts.mjs" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "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==", + "license": "MIT" + }, + "node_modules/modern-tar": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.8.5.tgz", + "integrity": "sha512-snEhs+6G5Tjd4I7tLCDOaoln2RgE0bD19RzEKgvgK2hZ5VKy3MpLhLTZ2fWpXSTg4K2cyPwp+VHATFJhxfnOeA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "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/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.29.tgz", + "integrity": "sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ==", + "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.19", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz", + "integrity": "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/puppeteer-core": { + "version": "25.13.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.13.0.tgz", + "integrity": "sha512-cyBS0OEx3e9NS53B5F6+UazXtR7f9Tw0cR1/FbPW59/hV6JPZbkIiMnxK2543IkFp3rsGlLn1iPDLF77TJsJsA==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "3.2.4", + "chromium-bidi": "157.0.8090-0", + "devtools-protocol": "0.0.1696802", + "typed-query-selector": "^2.12.3", + "webdriver-bidi-protocol": "1.0.1", + "ws": "^8.21.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.5.tgz", + "integrity": "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==", + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.5", + "@img/sharp-darwin-x64": "0.35.5", + "@img/sharp-freebsd-wasm32": "0.35.5", + "@img/sharp-libvips-darwin-arm64": "1.3.4", + "@img/sharp-libvips-darwin-x64": "1.3.4", + "@img/sharp-libvips-linux-arm": "1.3.4", + "@img/sharp-libvips-linux-arm64": "1.3.4", + "@img/sharp-libvips-linux-ppc64": "1.3.4", + "@img/sharp-libvips-linux-riscv64": "1.3.4", + "@img/sharp-libvips-linux-s390x": "1.3.4", + "@img/sharp-libvips-linux-x64": "1.3.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4", + "@img/sharp-libvips-linuxmusl-x64": "1.3.4", + "@img/sharp-linux-arm": "0.35.5", + "@img/sharp-linux-arm64": "0.35.5", + "@img/sharp-linux-ppc64": "0.35.5", + "@img/sharp-linux-riscv64": "0.35.5", + "@img/sharp-linux-s390x": "0.35.5", + "@img/sharp-linux-x64": "0.35.5", + "@img/sharp-linuxmusl-arm64": "0.35.5", + "@img/sharp-linuxmusl-x64": "0.35.5", + "@img/sharp-webcontainers-wasm32": "0.35.5", + "@img/sharp-win32-arm64": "0.35.5", + "@img/sharp-win32-ia32": "0.35.5", + "@img/sharp-win32-x64": "0.35.5" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "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==", + "license": "0BSD" + }, + "node_modules/typed-query-selector": { + "version": "2.12.3", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.3.tgz", + "integrity": "sha512-/dtuMZyutHLlrxWhhC1uib00ELUr2dZ8C9B8YzZYsJmeE3V56OxRblrSM2UaF142pcMtak7ehZ6+poWGeehNIg==", + "license": "MIT" + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/webdriver-bidi-protocol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-1.0.1.tgz", + "integrity": "sha512-WXWs/aXF2a6Al1Z2/V/7Gp2oPZOAAmHjJOTmv4KCXRJ122IMj3tSSMc6a4q3K4QOmhQbse/Ahr+oTVJOU2dUiw==", + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ws": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.2.0.tgz", + "integrity": "sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/zod": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", + "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/projects/studiox-v3/package.json b/projects/studiox-v3/package.json new file mode 100644 index 00000000000..04d2265e1c2 --- /dev/null +++ b/projects/studiox-v3/package.json @@ -0,0 +1,19 @@ +{ + "name": "studiox-viewport-tradingview-motion-study", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "A coded 30-second TradingView concept film created by StudioX Viewport", + "scripts": { + "assets": "node scripts/prepare-assets.mjs", + "lint": "hyperframes lint", + "check": "hyperframes check --samples 28", + "render": "node scripts/render-film.mjs", + "render:looks": "hyperframes render --fps 30 --quality looks --output renders/StudioX-Viewport-Looks.mp4" + }, + "dependencies": { + "gsap": "3.14.2", + "hyperframes": "0.8.145" + }, + "engines": {"node": ">=22"} +} diff --git a/projects/studiox-v3/scripts/build-score.py b/projects/studiox-v3/scripts/build-score.py new file mode 100644 index 00000000000..1591a99e339 --- /dev/null +++ b/projects/studiox-v3/scripts/build-score.py @@ -0,0 +1,127 @@ +"""Thirty-second scored edit with sectional music cuts and event-driven sound design.""" +from pathlib import Path +import json +import subprocess +import wave +import numpy as np + +ROOT = Path(__file__).resolve().parents[1] +SR, SECONDS = 48000, 30 +N = SR * SECONDS +t = np.arange(N, dtype=np.float64) / SR +rng = np.random.default_rng(3041) +mix = np.zeros((N, 2), dtype=np.float64) +events = [] + +def decode(at, length): + raw = subprocess.run([ + 'ffmpeg', '-v', 'error', '-ss', str(at), '-i', str(ROOT/'assets/catalyst-source.mp3'), + '-t', str(length), '-f', 'f32le', '-ac', '2', '-ar', str(SR), 'pipe:1' + ], check=True, capture_output=True).stdout + samples = np.frombuffer(raw, dtype='= 27: break + q=np.arange(round(.34*SR))/SR + soft=np.sin(2*np.pi*(56*q+21*(1-np.exp(-q*18))/18))*np.exp(-q*19) + add(float(beat),soft,.075 if beat%2 else .115,0,'rhythm pulse') + if int(beat*2)%2: + tick(float(beat)+.25,pan=(-1 if int(beat*2)%4 else 1),pitch=3800,gain=.010) + +for at, strength in [(0.42,.65),(1.04,.75),(2.35,.8),(3.85,.62),(7.76,.65), + (10.0,1.25),(12.85,.58),(14.50,.63),(16.57,.95),(18.66,.72), + (20.0,1.35),(21.08,1.0),(22.95,.9),(23.68,.72), + (25.04,1.45),(26.93,1.05),(27.40,.54)]: + impact(at,strength,pan=(-.23 if int(at)%2 else .22)) +for at, pan in [(2.15,-1),(3.62,1),(4.18,-1),(5.03,1),(7.54,1), + (9.16,1),(12.60,-1),(14.27,1),(16.34,-1),(18.43,1), + (19.23,1),(20.82,-1),(22.72,1),(24.47,-1),(26.70,1)]: + cut(at,pan) +for at, pan in [(4.28,-.4),(5.13,.4),(6.82,.6),(10.42,-.5),(12.86,.5),(14.51,-.5)]: + tick(at,pan,1300,.048) +for at,dur in [(8.12,1.82),(18.30,1.62),(24.15,.86)]: rise(at,dur) + +# Short gaps before the light wipes reveal impacts instead of masking them. +for at in [10,20]: + lo,hi=round((at-.11)*SR),round((at-.015)*SR) + mix[lo:hi]*=np.linspace(1,.14,hi-lo)[:,None] +mix*=np.minimum(1,(30-t)/.35)[:,None] +peak=np.max(np.abs(mix)) +if peak > .93: mix*=.93/peak + +premaster=ROOT/'assets/score-premaster.wav' +with wave.open(str(premaster),'wb') as out: + out.setparams((2,2,SR,N,'NONE','not compressed')) + out.writeframes((np.clip(mix,-.999,.999)*32767).astype(']*><\/audio>/; +if (!audio.test(source)) throw new Error('Expected scored audio slot was not found'); +await writeFile(path.join(root, 'index-video.html'), source.replace(audio, '')); +await mkdir(path.join(root, 'renders'), {recursive:true}); +const silent = path.join(root, 'renders', 'StudioX-Viewport-Picture.mp4'); +const final = path.join(root, 'renders', 'StudioX-Viewport-Motion-Study.mp4'); +const hyperframes = path.join(root, 'node_modules', '.bin', 'hyperframes'); +execFileSync(hyperframes, ['render', '--composition', 'index-video.html', + '--fps', '30', '--quality', 'delivery', '--output', silent, + '--workers', '2', '--no-low-memory-mode'], {cwd:root,stdio:'inherit'}); +execFileSync('ffmpeg', ['-v', 'error', '-y', '-i', silent, + '-i', path.join(root, 'assets', 'score.wav'), '-map', '0:v:0', '-map', '1:a:0', + '-c:v', 'copy', '-c:a', 'aac', '-b:a', '256k', '-ar', '48000', + '-t', '30', '-movflags', '+faststart', final], {cwd:root,stdio:'inherit'}); +console.log(`Delivered ${final}`); From c66614730d7dc26d2210ebd6ffadc80f808c7866 Mon Sep 17 00:00:00 2001 From: theplatformx Date: Sun, 11 Oct 2026 01:40:38 +0700 Subject: [PATCH 2/3] fix: tighten end-card handoff and clean render entry --- projects/studiox-v3/motion.js | 17 ++++++++--------- projects/studiox-v3/scripts/render-film.mjs | 15 ++++++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/projects/studiox-v3/motion.js b/projects/studiox-v3/motion.js index ff3290e1de3..282d064e702 100644 --- a/projects/studiox-v3/motion.js +++ b/projects/studiox-v3/motion.js @@ -69,7 +69,7 @@ .set('#panels',{opacity:0},0).set('#merge',{scaleX:0,opacity:0},0) .set('#wipe2',{scale:0,opacity:0},0) .set('#great, #ideas, #should, #move, #faster',{opacity:0},0) - .set('#endcard',{clipPath:'inset(100% 0 0 0)'},0) + .set('#endcard',{clipPath:'inset(0 0 100% 0)'},0) .set('#brand,#tag,#studio,#foot',{opacity:0},0); // 0–10: the signal draws a chart, becomes a cursor, and marks a cause on that chart. @@ -127,7 +127,7 @@ .to('#wipe2',{opacity:1,scale:32,duration:.52,ease:'power3.in'},19.48); // 20–30: typography physically collides with the travelling line, then gives the brand a hold. - tl.set('#act3',{opacity:1},20).set('#act2',{opacity:0},20.12) + tl.set('#act3',{opacity:1},20).set('#act2',{opacity:0},20) .to('#wipe2',{opacity:0,duration:.12},20.10) .fromTo('#great',{opacity:0,x:-560},{opacity:1,x:0,duration:.56,ease:'power4.out'},20.18) .fromTo('#ideas',{opacity:0,x:680},{opacity:1,x:0,duration:.62,ease:'power4.out'},21.08) @@ -139,13 +139,12 @@ .to('#should,#move',{opacity:0,x:-410,duration:.42,ease:'power3.in'},24.65) .fromTo('#faster',{opacity:0,scale:1.52,x:510,filter:'blur(12px)'},{opacity:1,scale:1,x:0,filter:'blur(0px)',duration:.64,ease:'power4.out'},25.04) .to('#seam',{scaleX:1,x:0,duration:.50},25.23) - .to('#faster',{opacity:0,scale:.96,duration:.37,ease:'power2.in'},26.60) - .to('#act3 .kicker',{opacity:0,duration:.20},26.77) - .to('#endcard',{clipPath:'inset(0% 0 0 0)',duration:.53,ease:'power3.inOut'},26.93) - .fromTo('#brand',{opacity:0,y:120},{opacity:1,y:0,duration:.55},27.40) - .fromTo('#tag',{opacity:0,y:35},{opacity:1,y:0,duration:.52},27.84) - .to('#creditline',{width:1640,duration:.68,ease:'power2.inOut'},28.05) - .fromTo('#studio,#foot',{opacity:0,y:25},{opacity:1,y:0,duration:.40,stagger:.14},28.40); + .to('#endcard',{clipPath:'inset(0% 0 0 0)',duration:.50,ease:'power3.inOut'},26.85) + .set('#act3 .kicker,#faster',{display:'none'},27.37) + .fromTo('#brand',{opacity:0,y:120},{opacity:1,y:0,duration:.52},27.06) + .fromTo('#tag',{opacity:0,y:35},{opacity:1,y:0,duration:.48},27.53) + .to('#creditline',{width:1640,duration:.68,ease:'power2.inOut'},27.92) + .fromTo('#studio,#foot',{opacity:0,y:25},{opacity:1,y:0,duration:.40,stagger:.14},28.28); window.__timelines=window.__timelines||{}; window.__timelines['studiox-v3']=tl; diff --git a/projects/studiox-v3/scripts/render-film.mjs b/projects/studiox-v3/scripts/render-film.mjs index 9e0098146a0..84789f64a16 100644 --- a/projects/studiox-v3/scripts/render-film.mjs +++ b/projects/studiox-v3/scripts/render-film.mjs @@ -1,4 +1,4 @@ -import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { readFile, writeFile, mkdir, unlink } from 'node:fs/promises'; import { execFileSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; import path from 'node:path'; @@ -7,14 +7,19 @@ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const source = await readFile(path.join(root, 'index.html'), 'utf8'); const audio = /\s*