diff --git a/projects/studiox-v2/.gitignore b/projects/studiox-v2/.gitignore new file mode 100644 index 00000000000..b153694f264 --- /dev/null +++ b/projects/studiox-v2/.gitignore @@ -0,0 +1,11 @@ +node_modules/ +renders/ +snapshots/ +.hyperframes/ +assets/gsap.min.js +assets/soundtrack.wav +assets/mix-premaster.wav +assets/catalyst-source.mp3 +assets/tradingview-chart-source.svg +assets/tradingview-chart.png +*.log diff --git a/projects/studiox-v2/README.md b/projects/studiox-v2/README.md new file mode 100644 index 00000000000..426baf3ea1b --- /dev/null +++ b/projects/studiox-v2/README.md @@ -0,0 +1,37 @@ +# TradingView — a StudioX Viewport concept film + +A 30-second, 1920 × 1080, 30 fps independent motion film. The edit combines editorial typography, local TradingView product artwork, illustrative chart studies, perspective panels, a tracked chart close-up, a three-beat montage and a quiet StudioX Viewport closing credit. No affiliation or commission from TradingView is represented. + +## Reproduce + +Requires Node 22+, Python 3 with NumPy, FFmpeg and curl. Hyperframes and GSAP versions are pinned in package-lock.json. A Chrome-compatible browser is required for validation and rendering; set HYPERFRAMES_BROWSER_PATH to an existing supported binary if the automatic download is unavailable. + +```bash +cd projects/studiox-v2 +npm ci +python3 -m pip install numpy==2.2.6 +npm run assets +npm run lint +npm run check +npm run render +``` + +The asset preparation script downloads two public source assets, verifies their SHA-256 hashes, rasterizes the product artwork, copies the installed GSAP runtime and builds the stereo soundtrack. All playback assets are local after preparation. A changed source hash stops preparation for review. + +`build_visuals.py` regenerates the seven scene templates and root orchestrator. Run `scripts/refine-moment.py` after it to apply the macro chart shot. Existing source HTML is ready to use; regeneration is optional. Scene timing and copy are documented in storyboard.json; sound events in audio-cues.json. Rendered media, installed dependencies and downloaded/generated assets are excluded from git. + +## Credits and sources + +Music: **“Catalyst” by Scott Buckley — released under CC BY 4.0. www.scottbuckley.com.au**. Source: https://www.scottbuckley.com.au/library/catalyst/ . License: https://creativecommons.org/licenses/by/4.0/ . Changes: 30-second excerpt beginning at source 80 seconds, fades, original layered sound effects and loudness mastering. The music attribution is included on the closing frame. Preserve it when sharing the video; include the same attribution in a YouTube description. + +Product artwork: TradingView's official features page, https://www.tradingview.com/features/ , `make-it-easy.ca34373f92d54032738c.svg`. Copyright and marks remain with TradingView. Artwork is used as the subject of this independent concept demonstration. Generated chart studies are illustrative and are labelled as such; they do not show current prices or trading recommendations. + +Fonts: subset DejaVu Sans Bold, DejaVu Sans Mono and DejaVu Serif; see assets/FONT-LICENSE.txt. Runtime: GSAP, see assets/GSAP-NOTICE.md. + +The audio mix targets −14 LUFS integrated and −1.5 dBTP. The measured local WAV is −14.22 LUFS, −1.50 dBTP, with 7.4 LU loudness range. These describe technical levels; final listening preference is subjective. + +## Validation and timing + +See validation.json for the final browser gate and export checks. Render time is measured separately from research, scripting, coding, revisions, asset preparation and delivery. + +Final export: 30.000 seconds, 900 H.264 frames at 1920 × 1080 / 30 fps, stereo AAC at 48 kHz, 15,984,932 bytes. Export audio measured −14.28 LUFS integrated and −1.49 dBTP. The successful two-worker beginframe render took 114.315 seconds. Use `npm run render:benchmark` for that capture profile; regular `npm run render` retains the engine’s automatic memory safeguards. diff --git a/projects/studiox-v2/assets/Display.ttf b/projects/studiox-v2/assets/Display.ttf new file mode 100644 index 00000000000..ba7ef7c0480 Binary files /dev/null and b/projects/studiox-v2/assets/Display.ttf differ diff --git a/projects/studiox-v2/assets/FONT-LICENSE.txt b/projects/studiox-v2/assets/FONT-LICENSE.txt new file mode 100644 index 00000000000..b3d93a1235a --- /dev/null +++ b/projects/studiox-v2/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-v2/assets/GSAP-NOTICE.md b/projects/studiox-v2/assets/GSAP-NOTICE.md new file mode 100644 index 00000000000..2bd669ce7b1 --- /dev/null +++ b/projects/studiox-v2/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-v2/assets/Mono.ttf b/projects/studiox-v2/assets/Mono.ttf new file mode 100644 index 00000000000..d48a0da607e Binary files /dev/null and b/projects/studiox-v2/assets/Mono.ttf differ diff --git a/projects/studiox-v2/assets/Serif.ttf b/projects/studiox-v2/assets/Serif.ttf new file mode 100644 index 00000000000..9b507712249 Binary files /dev/null and b/projects/studiox-v2/assets/Serif.ttf differ diff --git a/projects/studiox-v2/audio-cues.json b/projects/studiox-v2/audio-cues.json new file mode 100644 index 00000000000..120f176a152 --- /dev/null +++ b/projects/studiox-v2/audio-cues.json @@ -0,0 +1,172 @@ +{ + "music": { + "track": "Catalyst", + "composer": "Scott Buckley", + "sourceIn": 80, + "duration": 30, + "license": "CC BY 4.0", + "changes": "excerpt, fades and original SFX" + }, + "target": { + "integratedLUFS": -14, + "truePeakDbTP": -1.5 + }, + "events": [ + { + "time": 0.06, + "kind": "low impact / transient", + "gain": 0.154, + "pan": 0 + }, + { + "time": 0.28, + "kind": "glass detail", + "gain": 0.055, + "pan": -0.3 + }, + { + "time": 0.7, + "kind": "interface click", + "gain": 0.1, + "pan": -0.65 + }, + { + "time": 1.05, + "kind": "interface click", + "gain": 0.1, + "pan": 0.45 + }, + { + "time": 6.3, + "kind": "interface click", + "gain": 0.1, + "pan": 0.4 + }, + { + "time": 9.3, + "kind": "interface click", + "gain": 0.1, + "pan": -0.4 + }, + { + "time": 10.2, + "kind": "interface click", + "gain": 0.1, + "pan": 0.4 + }, + { + "time": 12.55, + "kind": "interface click", + "gain": 0.1, + "pan": 0 + }, + { + "time": 14.1, + "kind": "interface click", + "gain": 0.1, + "pan": 0.4 + }, + { + "time": 3.6, + "kind": "directional swish", + "gain": 0.25, + "pan": -0.4 + }, + { + "time": 7.55, + "kind": "directional swish", + "gain": 0.25, + "pan": 0.45 + }, + { + "time": 12.05, + "kind": "directional swish", + "gain": 0.25, + "pan": -0.45 + }, + { + "time": 16.4, + "kind": "directional swish", + "gain": 0.25, + "pan": 0.4 + }, + { + "time": 20.4, + "kind": "directional swish", + "gain": 0.25, + "pan": -0.2 + }, + { + "time": 24.45, + "kind": "directional swish", + "gain": 0.25, + "pan": 0.1 + }, + { + "time": 4, + "kind": "low impact / transient", + "gain": 0.187, + "pan": 0 + }, + { + "time": 8, + "kind": "low impact / transient", + "gain": 0.198, + "pan": -0.1 + }, + { + "time": 17, + "kind": "low impact / transient", + "gain": 0.231, + "pan": 0 + }, + { + "time": 18.33, + "kind": "low impact / transient", + "gain": 0.14300000000000002, + "pan": -0.3 + }, + { + "time": 19.67, + "kind": "low impact / transient", + "gain": 0.187, + "pan": 0.3 + }, + { + "time": 21, + "kind": "low impact / transient", + "gain": 0.253, + "pan": 0 + }, + { + "time": 25, + "kind": "low impact / transient", + "gain": 0.14300000000000002, + "pan": 0 + }, + { + "time": 23.1, + "kind": "glass detail", + "gain": 0.055, + "pan": 0.3 + }, + { + "time": 25.2, + "kind": "glass detail", + "gain": 0.055, + "pan": -0.2 + } + ], + "premasterAnalysis": { + "input_i": "-16.31", + "input_tp": "-2.04", + "input_lra": "9.00", + "input_thresh": "-26.59", + "output_i": "-13.68", + "output_tp": "-1.50", + "output_lra": "6.20", + "output_thresh": "-23.78", + "normalization_type": "dynamic", + "target_offset": "-0.32" + } +} diff --git a/projects/studiox-v2/build_visuals.py b/projects/studiox-v2/build_visuals.py new file mode 100644 index 00000000000..ce2e1777db9 --- /dev/null +++ b/projects/studiox-v2/build_visuals.py @@ -0,0 +1,63 @@ +from pathlib import Path +import math, json, sys +P=Path(__file__).parent +SELECT=set(sys.argv[1:]) +FONT='''@font-face{font-family:ViewportDisplay;src:url('assets/Display.ttf') format('truetype');font-weight:700;font-display:block}@font-face{font-family:ViewportMono;src:url('assets/Mono.ttf') format('truetype');font-weight:400;font-display:block}@font-face{font-family:ViewportSerif;src:url('assets/Serif.ttf') format('truetype');font-weight:400;font-display:block}''' +BASE='''*{box-sizing:border-box}.stage{position:absolute;inset:0;overflow:hidden;color:#F2EEE5;font-family:ViewportDisplay,sans-serif;font-weight:700;perspective:1800px}.serif{font-family:ViewportSerif,serif;font-weight:400;letter-spacing:-.055em;line-height:.94}.display{font-family:ViewportDisplay,sans-serif;font-weight:700;letter-spacing:-.065em;line-height:.96}.mono{font-family:ViewportMono,monospace;font-size:22px;font-weight:400;letter-spacing:.06em}.eyebrow{font-family:ViewportMono,monospace;font-size:23px;font-weight:400;letter-spacing:.1em}.mask{overflow:hidden;padding:10px 0 20px}.word{display:inline-block}.chapter{position:absolute;left:100px;top:74px}.scene-no{position:absolute;right:96px;top:74px;opacity:1}.hairline{position:absolute;left:100px;right:100px;top:119px;height:1px;background:rgba(242,238,229,.2)}.panel{position:absolute;background:#0D2035;border:1px solid #36506A;box-shadow:0 42px 100px rgba(0,0,0,.34);border-radius:12px;overflow:hidden}.panel-head{height:70px;border-bottom:1px solid #36506A;padding:23px 28px;display:flex;align-items:center;justify-content:space-between;font-family:ViewportMono,monospace;font-size:17px;font-weight:400;letter-spacing:.08em}.panel svg{display:block;width:100%;height:calc(100% - 70px)}.credit{position:absolute;bottom:38px;left:100px;right:100px;font-family:ViewportMono,monospace;font-weight:400;font-size:19px;letter-spacing:-.02em}.chart-note{font-family:ViewportMono,monospace;font-size:17px;font-weight:400;letter-spacing:.04em}.illustrative{position:absolute;bottom:25px;left:28px;z-index:3;color:#C5D3E4}.gridline{stroke:#ABC6E7;stroke-opacity:.13;stroke-width:1}.cross{position:absolute;inset:0;pointer-events:none}.cross-v{position:absolute;left:50%;top:0;bottom:0;border-left:1px dashed #6D97D4}.cross-h{position:absolute;top:50%;left:0;right:0;border-top:1px dashed #6D97D4}.cross-dot{position:absolute;left:calc(50% - 9px);top:calc(50% - 9px);width:18px;height:18px;background:#F2EEE5;border:5px solid #165DFF;border-radius:50%}.spline{fill:none;stroke:#165DFF;stroke-width:5;stroke-linecap:round;stroke-linejoin:round}''' +SCENES=[('sx2-markets',0,4,'Markets never stand still.'),('sx2-picture',4,4,'See the whole picture.'),('sx2-perspective',8,4.5,'Find your perspective.'),('sx2-moment',12.5,4.5,'Stay in the moment.'),('sx2-montage',17,4,'Chart. Explore. Connect.'),('sx2-product',21,4,'TradingView'),('sx2-close',25,5,'Great ideas should move faster.')] + +def chart(kind='candles',color='#64CFD7',ivory=False): + g=[] + for x in range(0,1201,120):g.append(f'') + for y in range(0,501,100):g.append(f'') + vals=[310-2.8*i+52*math.sin(i*.38)+18*math.cos(i*.91) for i in range(56)] + if kind=='candles': + for i,y in enumerate(vals): + x=25+i*21; op=y+math.sin(i*1.22)*22; cl=y+math.cos(i*.71)*23; c='#65D7C4' if cl') + else: + d='M '+' L '.join(f'{25+i*21},{y:.1f}' for i,y in enumerate(vals)) + g.append(f'') + g.append(f'') + if kind=='compare': + d2='M '+' L '.join(f'{25+i*21},{y+62*math.sin(i*.16)+40:.1f}' for i,y in enumerate(vals)) + g.append(f'') + return '' + +def panel(id,title='ILLUSTRATIVE CHART',kind='candles',extra=''): + note='' if id.startswith('sx2-perspective') else '
ILLUSTRATIVE · NOT LIVE DATA
' + return f'
{title}VIEW / 01
{chart(kind)}{note}
' + +def scene(id,dur,css,html,js): + if SELECT and id not in SELECT:return + content=f'''{id}''' + (P/'compositions'/f'{id}.html').write_text(content) + +# 01 — asymmetric editorial opening, moving chart at right. +s='sx2-markets' +scene(s,4,f'''#{s}-type{{position:absolute;left:100px;top:255px;width:1070px;font-size:160px;z-index:3}}#{s}-type .serif{{font-size:170px;color:#B5CBF6}}#{s}-panel{{left:1110px;top:185px;width:950px;height:805px;border-radius:0}}#{s}-rail{{position:absolute;left:1044px;top:185px;width:12px;height:805px;background:#165DFF;transform-origin:bottom}}#{s}-footer{{position:absolute;left:104px;bottom:105px;color:#B5CBF6}}''',f'''
TRADINGVIEW / A NEW PERSPECTIVE
01 — 07
Markets
never stand
still.
{panel(s+'-panel')}
''',f'''E("#{s}-type .word",{{y:220}},{{y:0,duration:.85,stagger:.15,ease:"power4.out"}},.15);E("#{s}-rail",{{scaleY:0}},{{scaleY:1,duration:1.1,ease:"power3.inOut"}},0);E("#{s}-panel",{{x:250,y:40,rotationY:-24,rotationX:8,opacity:0}},{{x:0,y:0,rotationY:-8,rotationX:0,opacity:1,duration:1.35,ease:"power3.out"}},.1);E("#{s}-panel .candle",{{scaleY:.2,opacity:0}},{{scaleY:1,opacity:1,duration:.65,stagger:.022,transformOrigin:"center bottom",ease:"power2.out"}},.6);tl.to("#{s}-panel",{{x:-75,y:-30,scale:1.05,duration:1.8,ease:"sine.inOut"}},2.1);''') +# 02 — real screenshot, luxurious optical plane rotation. +s='sx2-picture' +scene(s,4,f'''#{s}-root{{background:#165DFF}}#{s}-root .mono,#{s}-root .eyebrow{{color:#FFFFFF}}#{s}-title{{position:absolute;left:102px;top:156px;font-size:118px;z-index:4;width:1700px}}#{s}-title .serif{{margin-left:25px;font-size:142px}}#{s}-screen{{position:absolute;left:295px;top:350px;width:1430px;height:650px;border:10px solid #F2EEE5;border-radius:12px;box-shadow:0 70px 100px #05183688;overflow:hidden}}#{s}-screen img{{width:100%;height:100%;object-fit:cover;object-position:center}}#{s}-caption{{position:absolute;left:100px;bottom:50px;z-index:5;font-size:18px}}#{s}-shadow{{position:absolute;left:210px;top:395px;width:1410px;height:560px;background:#082C77;border-radius:10px}}''',f'''
01 / WIDEN THE FRAME
02 — 07
See thewhole picture.
TradingView chart interface from its public homepage
TRADINGVIEW / PRODUCT VIEW
''',f'''E("#{s}-title .word",{{y:185}},{{y:0,duration:.75,stagger:.13,ease:"power4.out"}},.08);E("#{s}-screen",{{x:200,y:140,rotationX:28,rotationY:-16,rotation:-6,scale:.85,opacity:0}},{{x:0,y:0,rotationX:0,rotationY:0,rotation:0,scale:1,opacity:1,duration:1.2,ease:"power3.out"}},.2);E("#{s}-shadow",{{x:210,opacity:0}},{{x:0,opacity:.7,duration:1.2,ease:"power3.out"}},.2);tl.to("#{s}-screen",{{scale:1.06,y:-30,duration:1.6,ease:"sine.inOut"}},2.35);''') +# 03 — layered product-adjacent illustrative studies. +s='sx2-perspective' +scene(s,4.5,f'''#{s}-title{{position:absolute;left:100px;top:220px;width:710px;font-size:126px;z-index:5}}#{s}-title .serif{{font-size:126px;color:#A8C7FF}}#{s}-a{{left:860px;top:365px;width:890px;height:470px;z-index:3}}#{s}-b{{left:1025px;top:205px;width:735px;height:410px;z-index:2;background:#13366D}}#{s}-c{{left:744px;top:594px;width:825px;height:375px;z-index:4}}#{s}-annotation{{position:absolute;left:105px;top:755px;width:410px;line-height:1.65;color:#AEC0D9;font-size:22px}}#{s}-path{{position:absolute;left:122px;top:844px;width:515px;height:88px}}''',f'''
02 / CHANGE THE ANGLE
03 — 07
Find your
perspective.
ONE MARKET.
MORE WAYS TO SEE IT.
{panel(s+'-b','PERSPECTIVE / 02','line')}{panel(s+'-a','PERSPECTIVE / 01')}{panel(s+'-c','PERSPECTIVE / 03','line')}
ILLUSTRATIVE CHARTS · NOT LIVE DATA
''',f'''E("#{s}-title .word",{{y:180}},{{y:0,duration:.7,stagger:.12,ease:"power4.out"}},.12);E("#{s}-b",{{x:310,y:-80,rotationY:-24,rotationX:10,rotation:8,opacity:0}},{{x:0,y:0,rotationY:-14,rotationX:7,rotation:5,opacity:1,duration:1.1,ease:"power3.out"}},.1);E("#{s}-a",{{x:250,y:70,rotationY:-24,rotationX:10,rotation:4,opacity:0}},{{x:0,y:0,rotationY:-10,rotationX:3,rotation:0,opacity:1,duration:1.1,ease:"power3.out"}},.24);E("#{s}-c",{{x:200,y:190,rotationY:-24,rotationX:10,rotation:-10,opacity:0}},{{x:0,y:0,rotationY:-7,rotationX:2,rotation:-4,opacity:1,duration:1.1,ease:"power3.out"}},.4);tl.to("#{s}-a",{{x:-60,y:-40,rotationY:0,rotationX:0,scale:1.05,duration:1.1,ease:"power2.inOut"}},2.2);tl.to("#{s}-b",{{x:35,y:-30,duration:1.1,ease:"power2.inOut"}},2.2);tl.to("#{s}-c",{{x:25,y:30,duration:1.1,ease:"power2.inOut"}},2.2);tl.to("#{s}-path path",{{strokeDashoffset:0,duration:1.8,ease:"power2.inOut"}},1.5);''') +# 04 — tracked crosshair. Chart and reticle share the same move window. +s='sx2-moment' +scene(s,4.5,f'''#{s}-root{{background:#F2EEE5}}#{s}-root .stage{{color:#071424}}#{s}-root .hairline{{background:#07142433}}#{s}-title{{position:absolute;left:100px;top:230px;font-size:142px;width:680px;z-index:4}}#{s}-title .serif{{font-size:112px;color:#165DFF}}#{s}-viewport{{position:absolute;left:820px;top:195px;width:1000px;height:760px;overflow:hidden;border:1px solid #9BB1CA;background:#E7EBEF}}#{s}-world{{position:absolute;left:-100px;top:110px;width:1300px;height:560px}}#{s}-world svg{{width:100%;height:100%}}#{s}-cursor{{position:absolute;left:690px;top:335px;width:700px;height:550px}}#{s}-note{{position:absolute;left:100px;bottom:120px;color:#52677F;font-size:20px;line-height:1.5}}#{s}-chart-label{{position:absolute;left:845px;top:223px;z-index:3;color:#52677F}}#{s}-reticle{{position:absolute;left:1358px;top:704px;width:22px;height:22px;border:2px solid #165DFF;border-radius:50%}}''',f'''
03 / FOCUS ON WHAT MOVES
04 — 07
Stay in
the moment.
{chart('line','#165DFF')}
ILLUSTRATIVE CHART · NOT LIVE DATA
A CLEARER VIEW.
A DIFFERENT PERSPECTIVE.
''',f'''E("#{s}-title .word",{{y:200}},{{y:0,duration:.8,stagger:.14,ease:"power4.out"}},.15);E("#{s}-viewport",{{x:200,opacity:0}},{{x:0,opacity:1,duration:.85,ease:"power3.out"}},0);E("#{s}-world .price-path",{{strokeDasharray:1800,strokeDashoffset:1800}},{{strokeDashoffset:0,duration:1.8,ease:"power2.inOut"}},.35);E("#{s}-cursor",{{x:360,y:-140,opacity:0}},{{x:0,y:0,opacity:1,duration:1.6,ease:"power3.inOut"}},.8);tl.to("#{s}-world",{{x:-95,y:45,scale:1.13,duration:1.6,ease:"power3.inOut"}},.8);tl.to("#{s}-cursor",{{x:105,y:-70,duration:1.0,ease:"power2.inOut"}},2.6);tl.to("#{s}-world",{{x:-195,y:90,scale:1.2,duration:1.0,ease:"power2.inOut"}},2.6);''') +def network(id): + return f'''
CONNECTED PERSPECTIVESABSTRACT / 03
ABSTRACT CONNECTION STUDY
''' +# 05 — three fast graphic phases share a continuous diagonal trajectory. +s='sx2-montage' +scene(s,4,f'''#{s}-root{{background:#165DFF}}#{s}-phase-a .mono{{color:#FFFFFF}}#{s}-phase-a,#{s}-phase-b,#{s}-phase-c{{position:absolute;inset:0}}#{s}-phase-b{{background:#F2EEE5;color:#071424;opacity:0}}#{s}-phase-c{{background:#071424;opacity:0}}.montage-number{{position:absolute;left:70px;top:140px;font-size:650px;line-height:1;color:#FFFFFF11}}.montage-type{{position:absolute;left:100px;top:400px;font-size:220px;z-index:4}}.montage-sub{{position:absolute;left:110px;bottom:125px;font-size:25px}}#{s}-card-a{{left:1120px;top:110px;width:900px;height:880px}}#{s}-card-b{{left:990px;top:190px;width:1040px;height:620px;background:#071424}}#{s}-card-c{{left:1120px;top:230px;width:890px;height:620px}}#{s}-slash{{position:absolute;left:1680px;top:-100px;width:28px;height:1400px;background:#B3D0FF;transform-origin:center}}''',f'''
Chart.
TURN SIGNAL INTO PERSPECTIVE.
{panel(s+'-card-a','ILLUSTRATIVE / CHART')}
Explore.
WIDEN YOUR POINT OF VIEW.
{panel(s+'-card-b','ILLUSTRATIVE / EXPLORE','compare')}
Connect.
FOLLOW THE THREAD.
{network(s+'-card-c')}
''',f'''E("#{s}-phase-a .montage-type",{{x:-220,skewX:-8}},{{x:0,skewX:0,duration:.38,ease:"expo.out"}},0);E("#{s}-card-a",{{x:350,rotation:12,rotationY:-20}},{{x:0,rotation:-5,rotationY:-12,duration:.6,ease:"power4.out"}},0);E("#{s}-slash",{{rotation:23,x:-2050}},{{rotation:23,x:0,duration:1.0,ease:"power2.inOut"}},.6);tl.set("#{s}-phase-a",{{opacity:0}},1.3333333333);tl.set("#{s}-phase-b",{{opacity:1}},1.3333333333);E("#{s}-phase-b .montage-type",{{y:150}},{{y:0,duration:.35,ease:"expo.out"}},1.3333333333);E("#{s}-card-b",{{x:350,rotationY:18,rotation:7}},{{x:0,rotationY:-8,rotation:-3,duration:.65,ease:"power4.out"}},1.3333333333);tl.set("#{s}-phase-b",{{opacity:0}},2.6666666667);tl.set("#{s}-phase-c",{{opacity:1}},2.6666666667);E("#{s}-phase-c .montage-type",{{scale:.8}},{{scale:1,duration:.38,ease:"power4.out"}},2.6666666667);E("#{s}-card-c",{{x:360,rotationY:18,rotation:8}},{{x:0,rotationY:-10,rotation:3,duration:.65,ease:"power4.out"}},2.6666666667);E("#{s}-card-c .network-path",{{strokeDashoffset:1200}},{{strokeDashoffset:0,duration:.8,stagger:.06,ease:"power2.inOut"}},2.72);E("#{s}-card-c .network-dot",{{opacity:0}},{{opacity:1,duration:.28,stagger:.16,ease:"power2.out"}},2.75);E("#{s}-card-b .price-path",{{strokeDasharray:1800,strokeDashoffset:1800}},{{strokeDashoffset:0,duration:.8,stagger:.12,ease:"power2.inOut"}},1.36);tl.to("#{s}-slash",{{x:500,duration:.5,ease:"power3.inOut"}},3.5);''') +# 06 — calm dimensional product signature. +s='sx2-product' +scene(s,4,f'''#{s}-root{{background:#165DFF}}#{s}-root .mono,#{s}-root .eyebrow{{color:#FFFFFF}}#{s}-word{{position:absolute;left:110px;top:200px;font-size:222px;z-index:4}}#{s}-rule{{position:absolute;left:115px;top:470px;width:1650px;height:2px;background:#A9C5FF;transform-origin:left}}#{s}-screen{{position:absolute;left:710px;top:595px;width:1230px;height:530px;overflow:hidden;border:8px solid #F2EEE5;border-radius:10px;box-shadow:0 45px 100px #07142466}}#{s}-screen img{{width:100%;height:100%;object-fit:cover}}#{s}-detail{{position:absolute;left:115px;top:606px;font-size:42px;width:570px;line-height:1.45;font-family:ViewportSerif,serif;font-weight:400}}#{s}-small{{position:absolute;left:115px;bottom:95px;letter-spacing:.07em;font-size:20px}}''',f'''
TRADINGVIEW / IN PERSPECTIVE
06 — 07
TradingView
See the whole picture.
Find your perspective.
TradingView chart interface
AN INDEPENDENT CONCEPT FILM
''',f'''E("#{s}-word .word",{{y:260}},{{y:0,duration:.9,ease:"power4.out"}},.05);E("#{s}-rule",{{scaleX:0}},{{scaleX:1,duration:1.2,ease:"power3.inOut"}},.3);E("#{s}-screen",{{x:250,y:190,rotation:-8,rotationY:-15,opacity:0}},{{x:0,y:0,rotation:-3,rotationY:-5,opacity:1,duration:1.3,ease:"power3.out"}},.1);E("#{s}-detail",{{y:25,opacity:0}},{{y:0,opacity:1,duration:.7,ease:"power2.out"}},.65);tl.to("#{s}-screen",{{y:-25,rotation:-2,duration:1.7,ease:"sine.inOut"}},2.1);''') +# 07 — quiet identity and a fully legible, credited five-second close. +s='sx2-close' +scene(s,5,f'''#{s}-root{{background:#071424}}#{s}-studio{{position:absolute;left:104px;top:92px;font-size:26px;color:#B9CFFE}}#{s}-title{{position:absolute;left:100px;top:255px;width:1730px;font-size:178px}}#{s}-title .serif{{font-size:208px;color:#B9CFFE}}#{s}-bar{{position:absolute;left:110px;top:784px;width:130px;height:12px;background:#165DFF;transform-origin:left}}#{s}-product{{position:absolute;right:104px;top:862px;font-size:36px}}#{s}-note{{position:absolute;left:104px;top:864px;font-size:20px;color:#B6C3D5}}#{s}-credit{{color:#B6C3D5}}''',f'''
CREATED BY STUDIOX VIEWPORT
Great ideas should
move faster.
TradingView
Independent concept film · Illustrative charts
Catalyst — Scott Buckley · CC BY 4.0 · scottbuckley.com.au
''',f'''E("#{s}-title .word",{{y:230}},{{y:0,duration:.85,stagger:.12,ease:"power4.out"}},.1);E("#{s}-studio",{{opacity:0,y:10}},{{opacity:1,y:0,duration:.5,ease:"power2.out"}},0);E("#{s}-bar",{{scaleX:0}},{{scaleX:1,duration:.7,ease:"power3.inOut"}},.5);''') +# Thin orchestrator: no animation of timed hosts. +if SELECT:sys.exit(0) +slots=''.join(f'
' for id,start,dur,copy in SCENES) +(P/'index.html').write_text(f'''TradingView — Created by StudioX Viewport
{slots}
''') +(P/'storyboard.json').write_text(json.dumps({'id':'studiox-v2','width':1920,'height':1080,'fps':30,'duration':30,'palette':{'ink':'#071424','blue':'#165DFF','ivory':'#F2EEE5'},'scenes':[{'id':id,'start':start,'duration':dur,'copy':copy,'file':f'compositions/{id}.html'} for id,start,dur,copy in SCENES],'source':'TradingView public homepage chart asset; additional vectors are illustrative','credit':'Catalyst — Scott Buckley · CC BY 4.0 · scottbuckley.com.au'},indent=2)) diff --git a/projects/studiox-v2/compositions/sx2-close.html b/projects/studiox-v2/compositions/sx2-close.html new file mode 100644 index 00000000000..f6bfa545e9d --- /dev/null +++ b/projects/studiox-v2/compositions/sx2-close.html @@ -0,0 +1,284 @@ + + + + + sx2-close + + + + + diff --git a/projects/studiox-v2/compositions/sx2-markets.html b/projects/studiox-v2/compositions/sx2-markets.html new file mode 100644 index 00000000000..be77f5a8e05 --- /dev/null +++ b/projects/studiox-v2/compositions/sx2-markets.html @@ -0,0 +1,598 @@ + + + + + sx2-markets + + + + + diff --git a/projects/studiox-v2/compositions/sx2-moment.html b/projects/studiox-v2/compositions/sx2-moment.html new file mode 100644 index 00000000000..71fd30729b9 --- /dev/null +++ b/projects/studiox-v2/compositions/sx2-moment.html @@ -0,0 +1,302 @@ + + + + + sx2-moment + + + + + diff --git a/projects/studiox-v2/compositions/sx2-montage.html b/projects/studiox-v2/compositions/sx2-montage.html new file mode 100644 index 00000000000..6d8b39fc131 --- /dev/null +++ b/projects/studiox-v2/compositions/sx2-montage.html @@ -0,0 +1,825 @@ + + + + + sx2-montage + + + + + diff --git a/projects/studiox-v2/compositions/sx2-perspective.html b/projects/studiox-v2/compositions/sx2-perspective.html new file mode 100644 index 00000000000..2248748e457 --- /dev/null +++ b/projects/studiox-v2/compositions/sx2-perspective.html @@ -0,0 +1,724 @@ + + + + + sx2-perspective + + + + + diff --git a/projects/studiox-v2/compositions/sx2-picture.html b/projects/studiox-v2/compositions/sx2-picture.html new file mode 100644 index 00000000000..afc8a66cd87 --- /dev/null +++ b/projects/studiox-v2/compositions/sx2-picture.html @@ -0,0 +1,317 @@ + + + + + sx2-picture + + + + + diff --git a/projects/studiox-v2/compositions/sx2-product.html b/projects/studiox-v2/compositions/sx2-product.html new file mode 100644 index 00000000000..350876d889b --- /dev/null +++ b/projects/studiox-v2/compositions/sx2-product.html @@ -0,0 +1,313 @@ + + + + + sx2-product + + + + + diff --git a/projects/studiox-v2/index.html b/projects/studiox-v2/index.html new file mode 100644 index 00000000000..b61d466be0e --- /dev/null +++ b/projects/studiox-v2/index.html @@ -0,0 +1,155 @@ + + + + + + TradingView — Created by StudioX Viewport + + + + +
+
+
+
+
+
+
+
+ +
+ + + diff --git a/projects/studiox-v2/index.motion.json b/projects/studiox-v2/index.motion.json new file mode 100644 index 00000000000..bdf6348d913 --- /dev/null +++ b/projects/studiox-v2/index.motion.json @@ -0,0 +1,9 @@ +{ + "duration": 30, + "assertions": [ + { "kind": "appearsBy", "selector": "#sx2-markets-type", "bySec": 1.2 }, + { "kind": "appearsBy", "selector": "#sx2-moment-title", "bySec": 13.5 }, + { "kind": "appearsBy", "selector": "#sx2-close-title", "bySec": 26.2 }, + { "kind": "staysInFrame", "selector": "#sx2-close-title" } + ] +} diff --git a/projects/studiox-v2/package-lock.json b/projects/studiox-v2/package-lock.json new file mode 100644 index 00000000000..9e7cd8b2032 --- /dev/null +++ b/projects/studiox-v2/package-lock.json @@ -0,0 +1,1856 @@ +{ + "name": "studiox-viewport-tradingview-film", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "studiox-viewport-tradingview-film", + "version": "1.0.0", + "dependencies": { + "gsap": "3.14.2", + "hyperframes": "0.8.145", + "sharp": "0.35.5" + }, + "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-v2/package.json b/projects/studiox-v2/package.json new file mode 100644 index 00000000000..793873fb1e6 --- /dev/null +++ b/projects/studiox-v2/package.json @@ -0,0 +1,23 @@ +{ + "name": "studiox-viewport-tradingview-film", + "version": "1.0.0", + "private": true, + "description": "A cinematic independent TradingView concept film created by StudioX Viewport", + "scripts": { + "assets": "node scripts/prepare-assets.mjs", + "visuals": "python3 build_visuals.py && python3 scripts/refine-moment.py", + "lint": "hyperframes lint", + "check": "hyperframes check --samples 21", + "preview": "hyperframes preview", + "render": "hyperframes render --fps 30 --quality delivery --output renders/StudioX-Viewport-TradingView.mp4", + "render:benchmark": "hyperframes render --fps 30 --quality delivery --output renders/StudioX-Viewport-TradingView.mp4 --workers 2 --no-low-memory-mode" + }, + "dependencies": { + "gsap": "3.14.2", + "hyperframes": "0.8.145", + "sharp": "0.35.5" + }, + "engines": { + "node": ">=22" + } +} diff --git a/projects/studiox-v2/scripts/mix-audio.py b/projects/studiox-v2/scripts/mix-audio.py new file mode 100644 index 00000000000..f7953ba06a2 --- /dev/null +++ b/projects/studiox-v2/scripts/mix-audio.py @@ -0,0 +1,96 @@ +"""Build a deterministic 30-second music/SFX mix; numpy and ffmpeg required.""" +from pathlib import Path +import json +import subprocess +import wave +import numpy as np + +ROOT = Path(__file__).resolve().parents[1] +SR = 48000 +N = SR * 30 +rng = np.random.default_rng(217) +source = ROOT / "assets/catalyst-source.mp3" +decoded = subprocess.run([ + "ffmpeg", "-v", "error", "-ss", "80", "-i", str(source), "-t", "30", + "-f", "f32le", "-ac", "2", "-ar", str(SR), "pipe:1" +], check=True, capture_output=True).stdout +music = np.frombuffer(decoded, dtype="' for x in range(-240,2401,160)) + ''.join(f'' for y in range(460,1181,120)) +html = r'''sx2-moment''' +html=html.replace('__GRID__',grid).replace('__PATH__',d).replace('__ROUTE__',json.dumps(points[4:11])) +(ROOT/'compositions'/'sx2-moment.html').write_text(html) +print('Updated compositions/sx2-moment.html') diff --git a/projects/studiox-v2/storyboard.json b/projects/studiox-v2/storyboard.json new file mode 100644 index 00000000000..d8933ffa188 --- /dev/null +++ b/projects/studiox-v2/storyboard.json @@ -0,0 +1,65 @@ +{ + "id": "studiox-v2", + "width": 1920, + "height": 1080, + "fps": 30, + "duration": 30, + "palette": { + "ink": "#071424", + "blue": "#165DFF", + "ivory": "#F2EEE5" + }, + "scenes": [ + { + "id": "sx2-markets", + "start": 0, + "duration": 4, + "copy": "Markets never stand still.", + "file": "compositions/sx2-markets.html" + }, + { + "id": "sx2-picture", + "start": 4, + "duration": 4, + "copy": "See the whole picture.", + "file": "compositions/sx2-picture.html" + }, + { + "id": "sx2-perspective", + "start": 8, + "duration": 4.5, + "copy": "Find your perspective.", + "file": "compositions/sx2-perspective.html" + }, + { + "id": "sx2-moment", + "start": 12.5, + "duration": 4.5, + "copy": "Stay in the moment.", + "file": "compositions/sx2-moment.html" + }, + { + "id": "sx2-montage", + "start": 17, + "duration": 4, + "copy": "Chart. Explore. Connect.", + "file": "compositions/sx2-montage.html" + }, + { + "id": "sx2-product", + "start": 21, + "duration": 4, + "copy": "TradingView", + "file": "compositions/sx2-product.html" + }, + { + "id": "sx2-close", + "start": 25, + "duration": 5, + "copy": "Great ideas should move faster.", + "file": "compositions/sx2-close.html" + } + ], + "source": "TradingView public homepage chart asset; additional vectors are illustrative", + "credit": "Catalyst \u2014 Scott Buckley \u00b7 CC BY 4.0 \u00b7 scottbuckley.com.au" +} diff --git a/projects/studiox-v2/validation.json b/projects/studiox-v2/validation.json new file mode 100644 index 00000000000..9d4f954b259 --- /dev/null +++ b/projects/studiox-v2/validation.json @@ -0,0 +1,136 @@ +{ + "status": "passed", + "browserSkipped": false, + "gate": { + "lint": { + "ok": true, + "errorCount": 0, + "warningCount": 3 + }, + "runtime": { + "ok": true, + "errorCount": 0, + "warningCount": 0 + }, + "layout": { + "ok": true, + "errorCount": 0, + "warningCount": 0 + }, + "motion": { + "ok": true, + "errorCount": 0, + "warningCount": 0 + }, + "contrast": { + "ok": true, + "errorCount": 0, + "warningCount": 0 + } + }, + "layoutSampleTimes": [ + 0.714, + 2.143, + 3.571, + 5, + 6.429, + 7.857, + 9.286, + 10.714, + 12.143, + 13.571, + 15, + 16.429, + 17.857, + 19.286, + 20.714, + 22.143, + 23.571, + 25, + 26.429, + 27.857, + 29.286 + ], + "motionSamples": 300, + "contrastSampleTimes": [ + 0.714, + 7.857, + 15, + 22.143, + 29.286 + ], + "remainingWarnings": "Three large formatted composition source files. No runtime, layout, motion or sampled contrast failures.", + "export": { + "programs": [], + "streams": [ + { + "codec_name": "h264", + "codec_type": "video", + "width": 1920, + "height": 1080, + "r_frame_rate": "30/1", + "duration": "30.000000", + "nb_frames": "900" + }, + { + "codec_name": "aac", + "codec_type": "audio", + "sample_rate": "48000", + "channels": 2, + "r_frame_rate": "0/0", + "duration": "30.000000", + "nb_frames": "1408" + } + ], + "format": { + "duration": "30.000000", + "size": "15984932" + } + }, + "exportAudio": { + "integratedLUFS": -14.28, + "truePeakDbTP": -1.49, + "loudnessRangeLU": 7.5 + }, + "render": { + "pipelineSeconds": 114.315, + "workers": 2, + "captureMode": "beginframe", + "gpu": "software", + "stageSeconds": { + "compile": 2.387, + "browser_probe": 0.612, + "video_extract": 0.004, + "audio_process": 2.143, + "file_server": 0.024, + "capture_streaming": 105.71, + "assemble": 2.379 + }, + "command": "hyperframes render --fps 30 --quality delivery --workers 2 --no-low-memory-mode --output renders/StudioX-Viewport-TradingView.mp4" + }, + "checks": [ + "Python and JavaScript syntax", + "oxfmt and oxlint", + "npm audit: zero vulnerabilities", + "pinned asset downloads and deterministic soundtrack generation", + "opening frames and final frame inspected", + "ffprobe: 900 frames, 30 seconds, H264, 1920x1080, 30 fps, stereo AAC at 48 kHz" + ], + "revisionNote": "An initial export was interrupted to correct entrance poses before the first frame. Its time is part of total production, not the successful render benchmark.", + "artifactSha256": "ca48deaa4e79900cf61a9102970f8279ea88e825ee2a092e70660603e852206e", + "productionTiming": { + "trackedThroughExportValidationSeconds": 1488.933, + "includes": [ + "research", + "scripting", + "coding", + "asset preparation", + "reviews", + "checks", + "interrupted export", + "successful export", + "file saving" + ], + "excludes": "Final GitHub documentation update and response" + } +}