From 74280b5980380f166d6812c986451d3024cde3e2 Mon Sep 17 00:00:00 2001 From: "Factory: factory-dev" <138933559+factory-droid[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2026 12:43:19 +0000 Subject: [PATCH 1/6] feat(droid-control): render showcase videos with fframes instead of Remotion The showcase composition now renders through fframes, a Rust SVG video framework, instead of Remotion + headless Chrome. Every layer of the Showcase composition is ported 1:1 (presets, palettes, title card, window chrome and layouts, zoom/spotlight/callout effects, keystrokes, sections, code annotations, all five transition styles, noise/grade/watermark, Droid outro), checked frame by frame against Remotion stills. The droid-showcase binary owns what render-showcase.sh used to do in bash and Python: props validation and defaults, clip staging, .cast conversion via agg, probing, rendering on every core, the H.264 encode, and work-dir cleanup on exit or SIGINT/SIGTERM. render-showcase.sh keeps its CLI and becomes a thin build-and-exec wrapper. The resolved render plan is printed as one `showcase plan: {...}` stderr line, which the helper tests assert on against the real binary instead of an npx shim. Rendering no longer needs Node, npm deps or Chrome, embeds Geist so output is identical across machines, and drops the Remotion company license requirement. Co-authored-by: factory-ain3sh --- .github/workflows/droid-control-tests.yml | 57 +- .gitignore | 2 - plugins/droid-control/ARCHITECTURE.md | 42 +- plugins/droid-control/NOTICES.md | 10 +- plugins/droid-control/README.md | 13 +- .../diagrams/architecture-routing.excalidraw | 4 +- .../diagrams/architecture-routing.svg | 2 +- .../capture-compose-verify.excalidraw | 20 +- .../diagrams/capture-compose-verify.svg | 2 +- plugins/droid-control/fframes/.gitignore | 1 + plugins/droid-control/fframes/Cargo.lock | 2730 ++++++++ plugins/droid-control/fframes/Cargo.toml | 35 + .../droid-control/fframes/media/GEIST-OFL.txt | 92 + .../fframes/media/Geist-Bold.ttf | Bin 0 -> 128824 bytes .../fframes/media/Geist-Light.ttf | Bin 0 -> 125444 bytes .../fframes/media/Geist-Medium.ttf | Bin 0 -> 127660 bytes .../fframes/media/Geist-Regular.ttf | Bin 0 -> 126048 bytes .../fframes/media/Geist-SemiBold.ttf | Bin 0 -> 127872 bytes .../fframes/media/GeistMono-Medium.ttf | Bin 0 -> 149328 bytes .../fframes/media/GeistMono-Regular.ttf | Bin 0 -> 148516 bytes .../media/bg-halftone-rotor.png} | Bin plugins/droid-control/fframes/rustfmt.toml | 2 + plugins/droid-control/fframes/src/clips.rs | 145 + plugins/droid-control/fframes/src/code.rs | 103 + plugins/droid-control/fframes/src/content.rs | 265 + plugins/droid-control/fframes/src/fonts.rs | 178 + plugins/droid-control/fframes/src/lib.rs | 26 + plugins/droid-control/fframes/src/main.rs | 115 + plugins/droid-control/fframes/src/motion.rs | 132 + plugins/droid-control/fframes/src/outro.rs | 113 + plugins/droid-control/fframes/src/overlays.rs | 460 ++ plugins/droid-control/fframes/src/props.rs | 366 ++ plugins/droid-control/fframes/src/render.rs | 127 + plugins/droid-control/fframes/src/scenery.rs | 121 + plugins/droid-control/fframes/src/showcase.rs | 191 + plugins/droid-control/fframes/src/stage.rs | 122 + plugins/droid-control/fframes/src/svg.rs | 440 ++ plugins/droid-control/fframes/src/theme.rs | 133 + plugins/droid-control/fframes/src/timing.rs | 89 + plugins/droid-control/fframes/src/title.rs | 189 + .../droid-control/fframes/src/transition.rs | 249 + .../droid-control/remotion/package-lock.json | 5526 ----------------- plugins/droid-control/remotion/package.json | 29 - plugins/droid-control/remotion/src/Root.tsx | 37 - .../src/components/ActiveInputPulse.tsx | 40 - .../remotion/src/components/Background.tsx | 126 - .../src/components/CalloutOverlay.tsx | 93 - .../src/components/CodeAnnotationOverlay.tsx | 243 - .../src/components/ColorGradeOverlay.tsx | 45 - .../remotion/src/components/DroidOutro.tsx | 110 - .../remotion/src/components/DroidWordmark.tsx | 53 - .../src/components/DynamicShadowParallax.tsx | 23 - .../src/components/FloatingParticles.tsx | 58 - .../remotion/src/components/GlitchTitle.tsx | 233 - .../remotion/src/components/GlowLines.tsx | 93 - .../src/components/KeystrokeOverlay.tsx | 99 - .../remotion/src/components/NoiseOverlay.tsx | 33 - .../remotion/src/components/RotorMark.tsx | 23 - .../remotion/src/components/SectionHeader.tsx | 108 - .../src/components/SectionTransition.tsx | 79 - .../src/components/ShowcaseTransition.tsx | 335 - .../src/components/SpotlightOverlay.tsx | 77 - .../src/components/StaggeredPanelEntrance.tsx | 37 - .../remotion/src/components/TitleCard.tsx | 260 - .../remotion/src/components/Watermark.tsx | 36 - .../remotion/src/components/WindowChrome.tsx | 145 - .../src/components/WindowReflection.tsx | 20 - .../remotion/src/components/ZoomEffect.tsx | 133 - .../remotion/src/compositions/Showcase.tsx | 418 -- plugins/droid-control/remotion/src/index.ts | 4 - .../remotion/src/lib/duration.ts | 39 - .../remotion/src/lib/palettes.ts | 41 - .../droid-control/remotion/src/lib/presets.ts | 72 - .../droid-control/remotion/src/lib/schema.ts | 104 - .../remotion/tests/duration.test.mts | 62 - plugins/droid-control/remotion/tsconfig.json | 18 - .../droid-control/scripts/render-showcase.sh | 277 +- .../skills/droid-control/SKILL.md | 16 +- .../droid-control/atoms/compose/ATOM.md | 56 +- .../droid-control/atoms/showcase/ATOM.md | 26 +- .../tests/test_render_showcase.py | 373 +- 81 files changed, 6667 insertions(+), 9509 deletions(-) create mode 100644 plugins/droid-control/fframes/.gitignore create mode 100644 plugins/droid-control/fframes/Cargo.lock create mode 100644 plugins/droid-control/fframes/Cargo.toml create mode 100644 plugins/droid-control/fframes/media/GEIST-OFL.txt create mode 100644 plugins/droid-control/fframes/media/Geist-Bold.ttf create mode 100644 plugins/droid-control/fframes/media/Geist-Light.ttf create mode 100644 plugins/droid-control/fframes/media/Geist-Medium.ttf create mode 100644 plugins/droid-control/fframes/media/Geist-Regular.ttf create mode 100644 plugins/droid-control/fframes/media/Geist-SemiBold.ttf create mode 100644 plugins/droid-control/fframes/media/GeistMono-Medium.ttf create mode 100644 plugins/droid-control/fframes/media/GeistMono-Regular.ttf rename plugins/droid-control/{remotion/public/bg-halftone-rotor.jpg => fframes/media/bg-halftone-rotor.png} (100%) create mode 100644 plugins/droid-control/fframes/rustfmt.toml create mode 100644 plugins/droid-control/fframes/src/clips.rs create mode 100644 plugins/droid-control/fframes/src/code.rs create mode 100644 plugins/droid-control/fframes/src/content.rs create mode 100644 plugins/droid-control/fframes/src/fonts.rs create mode 100644 plugins/droid-control/fframes/src/lib.rs create mode 100644 plugins/droid-control/fframes/src/main.rs create mode 100644 plugins/droid-control/fframes/src/motion.rs create mode 100644 plugins/droid-control/fframes/src/outro.rs create mode 100644 plugins/droid-control/fframes/src/overlays.rs create mode 100644 plugins/droid-control/fframes/src/props.rs create mode 100644 plugins/droid-control/fframes/src/render.rs create mode 100644 plugins/droid-control/fframes/src/scenery.rs create mode 100644 plugins/droid-control/fframes/src/showcase.rs create mode 100644 plugins/droid-control/fframes/src/stage.rs create mode 100644 plugins/droid-control/fframes/src/svg.rs create mode 100644 plugins/droid-control/fframes/src/theme.rs create mode 100644 plugins/droid-control/fframes/src/timing.rs create mode 100644 plugins/droid-control/fframes/src/title.rs create mode 100644 plugins/droid-control/fframes/src/transition.rs delete mode 100644 plugins/droid-control/remotion/package-lock.json delete mode 100644 plugins/droid-control/remotion/package.json delete mode 100644 plugins/droid-control/remotion/src/Root.tsx delete mode 100644 plugins/droid-control/remotion/src/components/ActiveInputPulse.tsx delete mode 100644 plugins/droid-control/remotion/src/components/Background.tsx delete mode 100644 plugins/droid-control/remotion/src/components/CalloutOverlay.tsx delete mode 100644 plugins/droid-control/remotion/src/components/CodeAnnotationOverlay.tsx delete mode 100644 plugins/droid-control/remotion/src/components/ColorGradeOverlay.tsx delete mode 100644 plugins/droid-control/remotion/src/components/DroidOutro.tsx delete mode 100644 plugins/droid-control/remotion/src/components/DroidWordmark.tsx delete mode 100644 plugins/droid-control/remotion/src/components/DynamicShadowParallax.tsx delete mode 100644 plugins/droid-control/remotion/src/components/FloatingParticles.tsx delete mode 100644 plugins/droid-control/remotion/src/components/GlitchTitle.tsx delete mode 100644 plugins/droid-control/remotion/src/components/GlowLines.tsx delete mode 100644 plugins/droid-control/remotion/src/components/KeystrokeOverlay.tsx delete mode 100644 plugins/droid-control/remotion/src/components/NoiseOverlay.tsx delete mode 100644 plugins/droid-control/remotion/src/components/RotorMark.tsx delete mode 100644 plugins/droid-control/remotion/src/components/SectionHeader.tsx delete mode 100644 plugins/droid-control/remotion/src/components/SectionTransition.tsx delete mode 100644 plugins/droid-control/remotion/src/components/ShowcaseTransition.tsx delete mode 100644 plugins/droid-control/remotion/src/components/SpotlightOverlay.tsx delete mode 100644 plugins/droid-control/remotion/src/components/StaggeredPanelEntrance.tsx delete mode 100644 plugins/droid-control/remotion/src/components/TitleCard.tsx delete mode 100644 plugins/droid-control/remotion/src/components/Watermark.tsx delete mode 100644 plugins/droid-control/remotion/src/components/WindowChrome.tsx delete mode 100644 plugins/droid-control/remotion/src/components/WindowReflection.tsx delete mode 100644 plugins/droid-control/remotion/src/components/ZoomEffect.tsx delete mode 100644 plugins/droid-control/remotion/src/compositions/Showcase.tsx delete mode 100644 plugins/droid-control/remotion/src/index.ts delete mode 100644 plugins/droid-control/remotion/src/lib/duration.ts delete mode 100644 plugins/droid-control/remotion/src/lib/palettes.ts delete mode 100644 plugins/droid-control/remotion/src/lib/presets.ts delete mode 100644 plugins/droid-control/remotion/src/lib/schema.ts delete mode 100644 plugins/droid-control/remotion/tests/duration.test.mts delete mode 100644 plugins/droid-control/remotion/tsconfig.json diff --git a/.github/workflows/droid-control-tests.yml b/.github/workflows/droid-control-tests.yml index fbddada..c9b6838 100644 --- a/.github/workflows/droid-control-tests.yml +++ b/.github/workflows/droid-control-tests.yml @@ -6,7 +6,7 @@ on: - 'plugins/droid-control/bin/tctl' - 'plugins/droid-control/scripts/render-showcase.sh' - 'plugins/droid-control/tests/**' - - 'plugins/droid-control/remotion/**' + - 'plugins/droid-control/fframes/**' - '.github/workflows/droid-control-tests.yml' push: branches: [master] @@ -14,62 +14,43 @@ on: - 'plugins/droid-control/bin/tctl' - 'plugins/droid-control/scripts/render-showcase.sh' - 'plugins/droid-control/tests/**' - - 'plugins/droid-control/remotion/**' + - 'plugins/droid-control/fframes/**' - '.github/workflows/droid-control-tests.yml' env: PYTHONDONTWRITEBYTECODE: 1 + CARGO_TERM_COLOR: always jobs: - render-helper: - name: render-showcase.sh behavior + showcase: + name: Showcase composition, render helper, real renders runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install ffmpeg and agg + - name: Install ffmpeg, agg, and the fframes build dependencies run: | set -euo pipefail sudo apt-get update - sudo apt-get install -y --no-install-recommends ffmpeg + sudo apt-get install -y --no-install-recommends ffmpeg clang libclang-dev libx264-dev curl -fsSL -o agg https://github.com/asciinema/agg/releases/download/v1.9.0/agg-x86_64-unknown-linux-gnu echo "f111e315cd71056b116302342553dd765b7297579ed511f111d0cedb442aeda6 agg" | sha256sum -c - sudo install -m 0755 agg /usr/local/bin/agg - - name: Run helper integration tests - run: python3 -m unittest discover -v -s plugins/droid-control/tests -p 'test_*.py' - - remotion: - name: Remotion typecheck, duration tests, real render - runs-on: ubuntu-latest - defaults: - run: - working-directory: plugins/droid-control/remotion - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 + - uses: dtolnay/rust-toolchain@stable with: - # node --test with built-in type stripping (22.18+); Remotion runtime itself needs >= 18 - node-version: 22 - cache: npm - cache-dependency-path: plugins/droid-control/remotion/package-lock.json + components: clippy, rustfmt - - run: npm ci - - - run: npx tsc --noEmit -p . - - - run: npm test + - uses: Swatinem/rust-cache@v2 + with: + workspaces: plugins/droid-control/fframes - - name: Install ffmpeg and the Remotion browser + - name: Format, lint, and unit tests + working-directory: plugins/droid-control/fframes run: | - set -euo pipefail - sudo apt-get update - sudo apt-get install -y --no-install-recommends ffmpeg - npx remotion browser ensure + cargo fmt --check + cargo clippy --all-targets --release -- -D warnings + cargo test --release - - name: Render a synthetic clip through render-showcase.sh and check the encoded file - working-directory: . - env: - RENDER_SHOWCASE_E2E: 1 - run: python3 -m unittest discover -v -s plugins/droid-control/tests -p 'test_*.py' -k RealRender + - name: Helper integration tests and real renders + run: python3 -m unittest discover -v -s plugins/droid-control/tests -p 'test_*.py' diff --git a/.gitignore b/.gitignore index 13af873..c2a48c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ .factory/ node_modules/ -# Per-render clip staging created by render-showcase.sh; only survives a SIGKILL -plugins/droid-control/remotion/public/render-*/ diff --git a/plugins/droid-control/ARCHITECTURE.md b/plugins/droid-control/ARCHITECTURE.md index ba3e9ca..7d6a5b1 100644 --- a/plugins/droid-control/ARCHITECTURE.md +++ b/plugins/droid-control/ARCHITECTURE.md @@ -10,7 +10,7 @@ Editable source: [`diagrams/architecture-routing.excalidraw`](diagrams/architect The plugin is designed to keep a droid focused while it operates real software: -- **Low context load:** load the Linux tuistory path without dragging in Windows KVM notes, macOS VM controls, browser automation, and Remotion internals. +- **Low context load:** load the Linux tuistory path without dragging in Windows KVM notes, macOS VM controls, browser automation, and renderer internals. - **Evidence-first workflows:** every command starts by making commitments, then ends by verifying the artifact against those commitments. - **Parallel execution:** independent capture environments and render jobs can run in workers. Shared desktop input stays serialized; session names do not isolate focus. - **Clear ownership:** commands decide *what* must be produced; atoms decide *how* to execute their slice. @@ -91,7 +91,7 @@ The parent droid keeps judgment. Workers get exact commands. | Interpret PR / claim / QA goal | Parent | Requires context and judgment. | | Write the interaction script | Parent | Defines the proof story. | | Capture baseline and candidate branches | Workers only for independent environments | A shared desktop must be captured serially. | -| Render Remotion video | Worker droid | Mechanical once props and clips are fixed. | +| Render showcase video | Worker droid | Mechanical once props and clips are fixed. | | Verify commitments | Parent | Requires the original contract and evidence judgment. | This boundary follows the stage handoffs. Capture workers need resolved `tctl` commands and worktree paths, not PR context. Render workers need a props JSON and clip paths, not a feature explanation. @@ -126,32 +126,32 @@ Browser/Electron and native-desktop workflows intentionally do **not** go throug ## Video composition -The compose stage uses the Remotion project in `remotion/` as a single video engine. The droid writes a `Showcase` props JSON; `scripts/render-showcase.sh` handles the mechanical rendering pipeline: +The compose stage uses the [fframes](https://github.com/dmtrKovalenko/fframes) project in `fframes/` as a single video engine: a Rust crate whose `droid-showcase` binary renders the `Showcase` composition from SVG frames. The droid writes a `Showcase` props JSON; `scripts/render-showcase.sh` builds the binary on first use (cargo) and runs it. The binary owns the mechanical rendering pipeline: -1. Accept `.cast`, `.mp4`, and `.webm` clips only; normalize props and resolve fidelity (omitted: side-by-side `inspect`, single `standard`). +1. Accept `.cast`, `.mp4`, and `.webm` clips only; validate props and resolve defaults and fidelity (omitted: side-by-side `inspect`, single `standard`). 2. Convert `.cast` recordings through `agg` and `ffmpeg` at 1x, keeping the recording's timeline. -3. Stage clips as `clip-` inside a directory created under Remotion `public/` for this render only. -4. Set `clipDuration` to the longest clip with `ffprobe`. -5. Render the `Showcase` composition as limited-range `yuv420p`/`bt709` H.264, or one frame with `--still`. -6. Remove that render's staged directory and conversion outputs on exit. +3. Stage clips as `clip-` inside a work directory created for this render only. +4. Probe every clip with `ffprobe`; the longest one sets the content length. +5. Print the resolved plan (`showcase plan: {...}` on stderr), then render every frame on all cores and encode limited-range `yuv420p`/`bt709` H.264 through `ffmpeg`, or one PNG frame with `--still`. +6. Remove that render's work directory on exit, failure, or SIGINT/SIGTERM. -`remotion/src/lib/duration.ts` owns the timeline: the composition applies `speed` once to every clip, the clips run for `clipDuration / speed`, and the content sequence is padded by one crossfade on each side so the clips start after the title crossfade and the final frame is held through the outro crossfade. Total length is `4s title + clipDuration / speed + 3.5s outro`; a shorter clip holds its final frame. This keeps droids out of the common failure modes: two `recording.mp4` inputs overwriting each other in `public/`, concurrent renders deleting each other's clips, mismatched `clipDuration`, casts sped up twice, wrong `agg` theme, invalid pixel formats, and hand-written Remotion commands with missing encode flags. +`fframes/src/timing.rs` owns the timeline: the composition applies `speed` once to every clip, the clips run for `longest clip / speed`, and the content sequence is padded by one crossfade on each side so the clips start after the title crossfade and the final frame is held through the outro crossfade. Total length is `4s title + longest clip / speed + 3.5s outro`; a shorter clip holds its final frame. This keeps droids out of the common failure modes: two `recording.mp4` inputs overwriting each other, concurrent renders deleting each other's clips, a mismatched clip duration, casts sped up twice, wrong `agg` theme, invalid pixel formats, and hand-written encode commands with missing flags. ### Composition surface -The `Showcase` composition in `remotion/src/compositions/Showcase.tsx` is the only video entry point. Everything else lives in `remotion/src/components/` and is composed by props: +`fframes/src/showcase.rs` is the only video entry point (`Showcase`, an fframes `Video`). It composes the layer modules by props: -| Layer | Purpose | Controlled by | -|---|---|---| -| Background + FloatingParticles | Preset-driven warmth or coolness | `preset` | -| TitleCard / DroidOutro | Opening and closing cards (outro plays fanning rotor → crossfade → DROID wordmark) | `title`, `subtitle`, `speedNote` | -| Window chrome + layouts | `SingleLayout` or `SideBySideLayout` | `layout`, `labels`, `objectFit` | -| ZoomEffect / SpotlightOverlay / KeystrokeOverlay / SectionHeader | Timed in-scene overlays | `effects`, `keys`, `sections` | -| CodeAnnotationOverlay | Timed syntax-highlighted code cards | `codeAnnotations` | -| Transition presentation | Title→content and content→outro crossfade | `transitionStyle` (default `motion-blur`) | -| NoiseOverlay + ColorGradeOverlay + Watermark | Topmost polish pass | `fidelity`, `preset` | +| Layer | Module | Purpose | Controlled by | +|---|---|---|---| +| Background + particles | `scenery.rs` | Preset-driven warmth or coolness | `preset` | +| Title card / Droid outro | `title.rs`, `outro.rs` | Opening and closing cards (outro plays fanning rotor → crossfade → DROID wordmark) | `title`, `subtitle`, `speedNote` | +| Window chrome + layouts | `content.rs` | Single or side-by-side windows, panel entrances, zooms, spotlights | `layout`, `labels`, `windowTitle`, `objectFit`, `effects` | +| Callouts / section sweeps and headers / keystrokes | `overlays.rs` | Timed in-scene overlays | `effects`, `sections`, `keys` | +| Code cards | `overlays.rs`, `code.rs` | Timed syntax-highlighted code cards | `codeAnnotations` | +| Transition presentation | `transition.rs` | Title→content and content→outro crossfade | `transitionStyle` (default `motion-blur`) | +| Noise + colour grade + watermark | `scenery.rs` | Topmost polish pass | `fidelity`, `preset` | -The key property is that the main composition is data-driven: the droid never writes Remotion JSX. Adding a new overlay or transition style is a new component plus a schema field, not a new composition. +The key property is that the main composition is data-driven: the droid never writes composition code. Adding a new overlay or transition style is a new layer function plus a props field, not a new composition. Fonts (Geist, Geist Mono) are embedded in the binary, so renders look the same on every machine. ## Platform isolation @@ -182,7 +182,7 @@ Use the same composition rules when adding capability: | New user workflow | Add a command that parses arguments into commitments, then routes through existing atoms. | | New target type | Add one target atom and one target-route row. | | New capture backend | Add a driver atom or extend `tctl` only if it belongs behind the same terminal boundary. | -| New visual treatment | Add Remotion props/schema support and document compose/showcase behavior. | +| New visual treatment | Add props support and a layer in `fframes/src/`, then document compose/showcase behavior. | | New platform mechanics | Add a `platforms/.md` file under the relevant atom. | If a change makes every droid read more global instructions, it is probably fighting the architecture. Prefer a new scoped surface over a larger shared surface. diff --git a/plugins/droid-control/NOTICES.md b/plugins/droid-control/NOTICES.md index 4249560..3616a89 100644 --- a/plugins/droid-control/NOTICES.md +++ b/plugins/droid-control/NOTICES.md @@ -8,10 +8,10 @@ This plugin depends on several third-party tools and libraries. Executables are ## Video rendering -- **[Remotion](https://www.remotion.dev/)** -- React-based video renderer used by the compose/showcase pipeline. Remotion is free for individuals, small teams (<=3 employees), and non-profits. Larger companies require a [company license](https://www.remotion.pro/). See the [full license terms](https://github.com/remotion-dev/remotion/blob/main/LICENSE.md). -- **[React](https://react.dev/)** -- MIT License -- **[Zod](https://zod.dev/)** -- MIT License -- **[prism-react-renderer](https://github.com/FormidableLabs/prism-react-renderer)** -- MIT License. Powers the syntax highlighting in the `CodeAnnotationOverlay` component. +- **[fframes](https://github.com/dmtrKovalenko/fframes)** (MIT) -- Rust SVG-based video framework that renders the `fframes/` showcase composition. Its SVG stack, [svgr/usvgr](https://github.com/dmtrKovalenko/fframes), is MPL-2.0; its clip decoder statically links [FFmpeg](https://ffmpeg.org/) (LGPL-2.1+) through `ffmpeg-sys-fframes` (WTFPL). +- **[Geist and Geist Mono](https://github.com/vercel/geist-font)** -- SIL Open Font License 1.1, embedded in the renderer from `fframes/media/` (license text in `fframes/media/GEIST-OFL.txt`). +- **[syntect](https://github.com/trishume/syntect)** (MIT) and **[two-face](https://github.com/CosmicHorrorDev/two-face)** (MIT OR Apache-2.0) -- syntax highlighting for code annotations. +- **[clap](https://github.com/clap-rs/clap)**, **[serde](https://serde.rs/)**, **[signal-hook](https://github.com/vorner/signal-hook)**, **[tempfile](https://github.com/Stebalien/tempfile)** -- MIT OR Apache-2.0. ## Terminal automation @@ -31,4 +31,4 @@ This plugin depends on several third-party tools and libraries. Executables are ## Design influences -- **[@hyperframes/shader-transitions](https://github.com/heygen-com/hyperframes/tree/main/packages/shader-transitions)** (Apache-2.0) -- the `transitionStyle` prop's naming and taxonomy (`whip-pan`, `light-leak`, `flash`, `glitch-lite`) was shaped by Hyperframes' shader-transitions catalog. Implementations in `ShowcaseTransition.tsx` are original Remotion-native CSS/SVG overlays, not GLSL ports. +- **[@hyperframes/shader-transitions](https://github.com/heygen-com/hyperframes/tree/main/packages/shader-transitions)** (Apache-2.0) -- the `transitionStyle` prop's naming and taxonomy (`whip-pan`, `light-leak`, `flash`, `glitch-lite`) was shaped by Hyperframes' shader-transitions catalog. Implementations in `fframes/src/transition.rs` are original SVG filter and overlay effects, not GLSL ports. diff --git a/plugins/droid-control/README.md b/plugins/droid-control/README.md index f9c33f6..933aeec 100644 --- a/plugins/droid-control/README.md +++ b/plugins/droid-control/README.md @@ -39,9 +39,9 @@ droid plugin marketplace add https://github.com/Factory-AI/factory-plugins # Install the plugin droid plugin install droid-control@factory-plugins --scope user -# Install Remotion dependencies (one-time, only needed for video rendering) +# Build the video renderer (one-time, only needed for video rendering; needs Rust, clang, libx264) # Find the plugin install path with: droid plugin list --scope user -cd /remotion && npm install +cargo build --release --manifest-path /fframes/Cargo.toml ``` Or use the `/plugins` UI: Browse tab, select droid-control, install. @@ -80,9 +80,9 @@ For the full rationale and runtime pipeline, see [`ARCHITECTURE.md`](ARCHITECTUR ## Video rendering -The compose stage uses [Remotion](https://www.remotion.dev/) for video compositing. Presets provide window chrome, spacing, palettes, backgrounds, particles, noise, color grading, configurable transitions (`motion-blur`, `flash`, `whip-pan`, `light-leak`, `glitch-lite`), zooms, spotlights, callout annotations, keystroke overlays, section headers, and syntax-highlighted code annotations. +The compose stage uses [fframes](https://github.com/dmtrKovalenko/fframes), a Rust SVG video framework, for video compositing. Presets provide window chrome, spacing, palettes, backgrounds, particles, noise, color grading, configurable transitions (`motion-blur`, `flash`, `whip-pan`, `light-leak`, `glitch-lite`), zooms, spotlights, callout annotations, keystroke overlays, section headers, and syntax-highlighted code annotations. -The `render-showcase.sh` helper owns the full pipeline: `.cast` conversion via `agg`, per-render clip staging, longest-clip duration, Remotion rendering (or a `--still` preview), and cleanup. Playback `speed` is applied once by the composition to every clip. +The `render-showcase.sh` helper owns the full pipeline: `.cast` conversion via `agg`, per-render clip staging, longest-clip duration, rendering on every core (or a `--still` preview), and cleanup. It builds the `droid-showcase` binary from `fframes/` on first use. Playback `speed` is applied once by the composition to every clip. ## Prerequisites @@ -95,7 +95,7 @@ The `render-showcase.sh` helper owns the full pipeline: `.cast` conversion via ` | browser-use | All | `agent-browser` | | desktop-use | All | `cua-driver` | | compose | All | `ffmpeg`, `ffprobe`, `agg` | -| showcase | All | Node.js (>= 18), Chrome/Chromium | +| showcase | All | Rust (stable, via rustup), clang/libclang, libx264 | ```bash npm install -g tuistory # virtual PTY driver @@ -104,7 +104,8 @@ cargo install --git https://github.com/asciinema/agg # .cast -> .gif converter sudo apt-get install -y ffmpeg # video processing agent-browser install # browser automation (downloads Chromium) curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/cua-driver/scripts/install.sh | bash # native desktop GUI automation -cd plugins/droid-control/remotion && npm install # Remotion video rendering +sudo apt-get install -y clang libclang-dev libx264-dev # renderer build deps (macOS: xcode-select --install; brew install x264) +cargo build --release --manifest-path plugins/droid-control/fframes/Cargo.toml # video renderer ``` Only install what you need, with approval. Terminal demos need tuistory, asciinema, agg, and ffmpeg. Web/Electron automation defaults to browser-use; an explicit cua-only/native-input request uses desktop-use instead. Native desktop automation needs cua-driver plus the graphical session and OS permissions reported by its preflight. Recording and rendering have additional dependencies; they are not required for ordinary desktop tasks. diff --git a/plugins/droid-control/diagrams/architecture-routing.excalidraw b/plugins/droid-control/diagrams/architecture-routing.excalidraw index b62d5c5..11137c7 100644 --- a/plugins/droid-control/diagrams/architecture-routing.excalidraw +++ b/plugins/droid-control/diagrams/architecture-routing.excalidraw @@ -985,7 +985,7 @@ "textAlign": "center", "verticalAlign": "middle", "containerId": "compose", - "originalText": "Compose\nRemotion props\nrender-showcase", + "originalText": "Compose\nShowcase props\nrender-showcase", "autoResize": true, "lineHeight": 1.25, "id": "t_compose", @@ -993,7 +993,7 @@ "y": 758, "width": 194, "height": 104, - "text": "Compose\nRemotion props\nrender-showcase" + "text": "Compose\nShowcase props\nrender-showcase" }, { "angle": 0, diff --git a/plugins/droid-control/diagrams/architecture-routing.svg b/plugins/droid-control/diagrams/architecture-routing.svg index f388cb6..aed3f49 100644 --- a/plugins/droid-control/diagrams/architecture-routing.svg +++ b/plugins/droid-control/diagrams/architecture-routing.svg @@ -74,7 +74,7 @@ Compose -Remotion props +Showcase props render-showcase diff --git a/plugins/droid-control/diagrams/capture-compose-verify.excalidraw b/plugins/droid-control/diagrams/capture-compose-verify.excalidraw index 2324427..9e270dd 100644 --- a/plugins/droid-control/diagrams/capture-compose-verify.excalidraw +++ b/plugins/droid-control/diagrams/capture-compose-verify.excalidraw @@ -970,7 +970,7 @@ "isDeleted": false, "boundElements": [ { - "id": "t_remotion", + "id": "t_showcase", "type": "text" } ], @@ -978,7 +978,7 @@ "link": null, "locked": false, "type": "rectangle", - "id": "remotion", + "id": "showcase", "x": 820, "y": 620, "width": 300, @@ -1009,16 +1009,16 @@ "fontSize": 18, "textAlign": "center", "verticalAlign": "middle", - "containerId": "remotion", - "originalText": "Remotion Showcase\n\nlayout + presets\nwindow chrome\nparticles / zoom / spotlight", + "containerId": "showcase", + "originalText": "fframes Showcase\n\nlayout + presets\nwindow chrome\nparticles / zoom / spotlight", "autoResize": true, "lineHeight": 1.25, - "id": "t_remotion", + "id": "t_showcase", "x": 828, "y": 628, "width": 284, "height": 129, - "text": "Remotion Showcase\n\nlayout + presets\nwindow chrome\nparticles / zoom / spotlight" + "text": "fframes Showcase\n\nlayout + presets\nwindow chrome\nparticles / zoom / spotlight" }, { "angle": 0, @@ -1135,7 +1135,7 @@ "link": null, "locked": false, "type": "arrow", - "id": "a_render_remotion", + "id": "a_render_showcase", "x": 970, "y": 550, "width": 0, @@ -1159,7 +1159,7 @@ ] }, "endBinding": { - "elementId": "remotion", + "elementId": "showcase", "fixedPoint": [ 0.5, 0 @@ -1329,7 +1329,7 @@ "link": null, "locked": false, "type": "arrow", - "id": "a_remotion_verify", + "id": "a_showcase_verify", "x": 1120, "y": 692, "width": 125, @@ -1346,7 +1346,7 @@ ], "lastCommittedPoint": null, "startBinding": { - "elementId": "remotion", + "elementId": "showcase", "fixedPoint": [ 1, 0.5 diff --git a/plugins/droid-control/diagrams/capture-compose-verify.svg b/plugins/droid-control/diagrams/capture-compose-verify.svg index 0f664f9..c57940b 100644 --- a/plugins/droid-control/diagrams/capture-compose-verify.svg +++ b/plugins/droid-control/diagrams/capture-compose-verify.svg @@ -80,7 +80,7 @@ longest-clip duration -Remotion Showcase +fframes Showcase layout + presets window chrome diff --git a/plugins/droid-control/fframes/.gitignore b/plugins/droid-control/fframes/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/plugins/droid-control/fframes/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/plugins/droid-control/fframes/Cargo.lock b/plugins/droid-control/fframes/Cargo.lock new file mode 100644 index 0000000..8a63292 --- /dev/null +++ b/plugins/droid-control/fframes/Cargo.lock @@ -0,0 +1,2730 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "arbitrary" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bc62ac97cc33321f50863d514c3bc38a453947a8f9e781137e47c7401020aed" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom 8.0.0", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.13.2", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex 1.3.0", + "syn 2.0.119", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "bitstream-io" +version = "4.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" +dependencies = [ + "no_std_io2", +] + +[[package]] +name = "built" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.7", +] + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "cc" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50a649af8a827553c29fb0cb4bd4a6f1a0dd695bd3232b9bc98bd9c8a3ffbb8b" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex 2.0.1", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "clang-sys" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.7", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + +[[package]] +name = "console" +version = "0.16.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96a4956774c13c126a8b5af4daa79384f4d826534c95a02d76afb39e2ab64e3" +dependencies = [ + "encode_unicode", + "libc", + "unicode-width", + "windows-sys 0.61.2", +] + +[[package]] +name = "const_panic" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9603f79528ece8163c496f8932121cb36cfe46259e9c907bb3d8205139d7caa3" +dependencies = [ + "typewit", +] + +[[package]] +name = "crc32fast" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "droid-showcase" +version = "0.1.0" +dependencies = [ + "clap", + "fframes", + "serde", + "serde_json", + "serde_path_to_error", + "signal-hook", + "syntect", + "tempfile", + "two-face", +] + +[[package]] +name = "either" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" + +[[package]] +name = "either_n" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c91ae510829160d5cfb19eb4ae7b6e01d44b767ca8f727c6cee936e53cc9ae5" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + +[[package]] +name = "exr" +version = "1.74.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide 0.8.9", + "num-complex", + "pulp", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fancy-regex" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fax" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "ffmpeg-sys-fframes" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc8123240ea935f4d766323979843650afd6d00b475c561d3bb8a59a2e6e31f" +dependencies = [ + "bindgen", + "cc", + "libc", + "num_cpus", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "fframes" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "004b1d0fec651ea8c5f62aa5be88696ffeeb6dcf37b194ce5c13b68b188f1016" +dependencies = [ + "colored", + "fframes-media", + "fframes-media-dir-macro", + "futures", + "image", + "indicatif", + "kamadak-exif", + "konst", + "lazy_static", + "libm", + "log", + "lru", + "memmap", + "microfft", + "num", + "once_cell", + "parking_lot", + "rangemap", + "rayon", + "serde", + "svgr", + "svgr-macro", + "ttf-parser 0.25.1", + "usvgr", + "uuid", + "wasm-bindgen", +] + +[[package]] +name = "fframes-media" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44b7ac1e484226f05bfac8ee35de8949dd3c51425fec1cb84d5e17313a0c3177" +dependencies = [ + "base64 0.22.1", + "bytemuck", + "ffmpeg-sys-fframes", + "image", + "itoa", + "libc", + "ttf-parser 0.25.1", + "usvgr", + "wasm-bindgen", + "webvtt-parser", +] + +[[package]] +name = "fframes-media-dir-macro" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db0011bdfc7620d44fd128ea3f49b1d63767bac78f40d8b8db592e4119d9e166" +dependencies = [ + "base64 0.22.1", + "bytemuck", + "fframes-media", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "fontconfig-parser" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.20.0", +] + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.7", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "gif" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif 0.14.2", + "image-webp", + "moxcms", + "num-traits", + "png 0.18.1", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "indicatif" +version = "0.18.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c" +dependencies = [ + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" + +[[package]] +name = "js-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "kamadak-exif" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" +dependencies = [ + "mutate_once", +] + +[[package]] +name = "konst" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97feab15b395d1860944abe6a8dd8ed9f8eadfae01750fada8427abda531d887" +dependencies = [ + "const_panic", + "konst_kernel", + "konst_proc_macros", + "typewit", +] + +[[package]] +name = "konst_kernel" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b1eb7788f3824c629b1116a7a9060d6e898c358ebff59070093d51103dcc3c" +dependencies = [ + "typewit", +] + +[[package]] +name = "konst_proc_macros" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00af7901ba50898c9e545c24d5c580c96a982298134e8037d8978b6594782c07" + +[[package]] +name = "kurbo" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a53776d271cfb873b17c618af0298445c88afc52837f3e948fa3fafd131f449" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "kurbo" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" +dependencies = [ + "arrayvec", + "euclid", + "smallvec", +] + +[[package]] +name = "lazy_static" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" + +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] + +[[package]] +name = "microfft" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b6673eb0cc536241d6734c2ca45abfdbf90e9e7791c66a36a7ba3c315b76cf" +dependencies = [ + "cfg-if", + "num-complex", + "static_assertions", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "mutate_once" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom_locate" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3" +dependencies = [ + "bytecount", + "memchr", + "nom 7.1.3", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "bytemuck", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pulp" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rangemap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a611d15b50743feb4c76b7d03edcb0e64f399c26961e4efe6975bc398be6aa3d" + +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.14.0", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rust-fuzzy-search" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a157657054ffe556d8858504af8a672a054a6e0bd9e8ee531059100c0fa11bb2" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustix" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags 2.13.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "rustybuzz" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0ae5692c5beaad6a9e22830deeed7874eae8a4e3ba4076fb48e12c56856222c" +dependencies = [ + "bitflags 2.13.2", + "bytemuck", + "smallvec", + "ttf-parser 0.20.0", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "self-rust-tokenize" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c3191133be4b3e5c19f3a9f23efb784e982060373c0f3c9f3362fcfcb5d1e6" +dependencies = [ + "proc-macro2", + "quote", + "self-rust-tokenize-derive", +] + +[[package]] +name = "self-rust-tokenize-derive" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0d9ce060439c2bc0821a7e8b3123ee1743bebd88101a9357c3405010ed7826" +dependencies = [ + "syn-helpers", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.7", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b" + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "svgr" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7693be4358db6d2b20e039a8b9ff93b3736e481ad36ab435ccdb489da104214" +dependencies = [ + "gif 0.12.0", + "jpeg-decoder", + "log", + "pico-args", + "png 0.17.16", + "rgb", + "svgrtypes", + "tiny-skia", + "usvgr", +] + +[[package]] +name = "svgr-macro" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad73ddb90343b270413fcf4e84e2860f836b87ed1f2bfb1627fd149f8a80e5f" +dependencies = [ + "lazy_static", + "proc-macro-crate", + "proc-macro2", + "quote", + "rust-fuzzy-search", + "simplecss", + "syn 2.0.119", + "usvgr", +] + +[[package]] +name = "svgrtypes" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bbca5efc5d159da4ce7ef452d7a65dfd58ed6c71b5454304fd2d9ae9786c6c4" +dependencies = [ + "kurbo 0.8.3", + "proc-macro2", + "quote", + "siphasher 0.3.11", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d62a2e0561533f2ca2561d0cf27fd9fedb640a1bf2616ff5d5c80d99017faadc" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-helpers" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c391dcee7e7a1efd7dc921922b97b4be54129a195b6baec95bb2a223203d9d" +dependencies = [ + "either_n", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "syntect" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "656b45c05d95a5704399aeef6bd0ddec7b2b3531b7c9e900abbf7c4d2190c925" +dependencies = [ + "bincode", + "fancy-regex", + "flate2", + "fnv", + "once_cell", + "regex-syntax", + "serde", + "serde_derive", + "thiserror", + "walkdir", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.7", +] + +[[package]] +name = "tiff" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png 0.17.16", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinyvec" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + +[[package]] +name = "toml_datetime" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.17+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3641d5bbb5349a79e1020a242d251efbc546ad8048d133958323ce9c40a9c9c" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" +dependencies = [ + "winnow", +] + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "two-face" +version = "0.5.2+bat-0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915be7adc2ff6f4338acbf71f3eda0a146f46003b992a1669c674308610efdac" +dependencies = [ + "serde", + "serde_derive", + "syntect", +] + +[[package]] +name = "typewit" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "214ca0b2191785cbc06209b9ca1861e048e39b5ba33574b3cedd58363d5bb5f6" +dependencies = [ + "typewit_proc_macros", +] + +[[package]] +name = "typewit_proc_macros" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" + +[[package]] +name = "unicode-ccc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "usvgr" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6aeccea458c5a0ca94be0f1a5eabf44d4b754316101569f3cae399c53debb5" +dependencies = [ + "ahash", + "base64 0.21.7", + "data-url", + "flate2", + "fontdb", + "kurbo 0.11.3", + "log", + "lru", + "pico-args", + "quote", + "roxmltree", + "rustybuzz", + "self-rust-tokenize", + "simplecss", + "siphasher 1.0.4", + "smallvec", + "strict-num", + "svgrtypes", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc1186384beb7dd8eedea376413fd654937285ea6c9cfbb928dc3043ea4b606" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.7", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webvtt-parser" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579514a240693530a03c73287e3cad2a9d4a984863b39cb64c0c65fd64096be0" +dependencies = [ + "nom 7.1.3", + "nom_locate", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + +[[package]] +name = "zerocopy" +version = "0.8.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86502bf56ac7c77571a32e2647bb2a15894565e981fb2a48d7bde2d91c965a9d" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5457206954b06561e2608c7e19cf58b1926586d999c246eebe4502f7e2039d1a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zune-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] diff --git a/plugins/droid-control/fframes/Cargo.toml b/plugins/droid-control/fframes/Cargo.toml new file mode 100644 index 0000000..9456ace --- /dev/null +++ b/plugins/droid-control/fframes/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "droid-showcase" +version = "0.1.0" +edition = "2024" +publish = false +description = "droid-control showcase composition, rendered with fframes" + +[dependencies] +clap = { version = "4", features = ["derive"] } +fframes = { version = "=1.2.0", features = ["compile-time-svgtree"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +serde_path_to_error = "0.1" +signal-hook = "0.3" +tempfile = "3" +syntect = { version = "5.3", default-features = false, features = ["parsing", "default-syntaxes", "regex-fancy"] } +two-face = { version = "0.5", default-features = false, features = ["syntect-fancy"] } + +[lib] +name = "droid_showcase" +path = "src/lib.rs" +doctest = false + +[[bin]] +name = "droid-showcase" +path = "src/main.rs" + +# A standalone workspace: the plugin repository has no Cargo workspace of its own. +[workspace] + +[profile.dev] +opt-level = 1 + +[profile.dev.package."*"] +opt-level = 3 diff --git a/plugins/droid-control/fframes/media/GEIST-OFL.txt b/plugins/droid-control/fframes/media/GEIST-OFL.txt new file mode 100644 index 0000000..8d003fe --- /dev/null +++ b/plugins/droid-control/fframes/media/GEIST-OFL.txt @@ -0,0 +1,92 @@ +Copyright (c) 2023 Vercel, in collaboration with basement.studio + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION AND CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +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 THE +COPYRIGHT HOLDER 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. diff --git a/plugins/droid-control/fframes/media/Geist-Bold.ttf b/plugins/droid-control/fframes/media/Geist-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..863b2868c15bfce525a09174b4d322c12b5d498c GIT binary patch literal 128824 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 uU+YqKA^+Hg0}M|ZQ+?e zq`w6W>97*!7;_GV=~ortEMWvs;OvLicMl7Gl6jA_@B8MZ_V%|>URZ6`*#p8=MaM!o z_#M`dOej_{8m&nY#Cb?nX~Uo%1GbkuMhCVORq6DCB6V?SG---bRg7Q}7OSUMh(cJx zVjhG6q{L0DnGHKy;^X23#bWp$uNP06wJavyBRpuDXBL ztov8Vzs;SU@NDi3oqu}$`bTfL;nDT$PtWh(zG1^{w{6(4UGxpl`T0Ic#~r zU93T6oqZ$1qR!FQNhIin5%8!`PSw?n2Kb+_ApY=5mQA&5<(iVfLRR(1zwn z33C!UDvht9G+yX|`40c#2r&0a7|>6^kSxTRlgC-8ySzSMIugyba=r2h{D;LsYl|1G zY|}{P6YaFNdF7F9{H8n_KY8UjF6_nMlxLvrJ?s}ae?x8G_6=<(+(_?`bU(qQ4mE`C zo_;l`Pn((7xESDhiJMoS$?>l%#Q4XFULGwMjQ#=GWrD}GL75tF#}7XxmSd6VUQb%F zC!{y%^jI{IoFI*|bXtH(p*6bEU-4c`7P�pPzfl3BlJ2!6(-L##Tlv!~kwGv37q= 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 Ckp1KU literal 0 HcmV?d00001 diff --git a/plugins/droid-control/fframes/media/Geist-Medium.ttf b/plugins/droid-control/fframes/media/Geist-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..96cb22f8bb85577f3d56c497ee82913883da0fbd GIT binary patch literal 127660 zcmcG%31HR5wLd=d{oXD6cC(O#aBprllAC=GNeEd8kPs3GAps28fDpsJh=_<(5fN9G z3IbYGTuSi<7r?5uYI)ZB)cSlrpS4uc=d+et>a*5bx%qw0%=d0tsPF&pLnq(wojEge z=FFKhXU?3NFXN1{aQx9ROMPwK^c6o@XJP!-X2y6=ee;}o{eOM!6yv*}Vr*V){k-|r z)sybHmhs=d#hCf=IrFmf%74H5Gr&HIQo4FqcCR^5s+?mitd=p;_TEh!EY|P{qfZqjp%gUu2x|cus@=J_=xfQ>&S9Pyk`iuF$eVXx3;A4ndvwHo8&|`nUgyKIy z@mH@|w{(r}7xzXomWuYWcNx)&zy7a}1m9V{B&7T=EJXbbG3>t{TQ-lLpVs)V8ZH?Q z^h?wMM`mCO#o{0Gseg3-Cu4qH!zGtX{1Rn8nMi-tHwDa_Y#pevfa#Gl9nag5bbD|h z`i3)|(!#$&3R89~?TBxXPu|J$_*5#x_3uYa8E)pET<7}THn*mcy~r$oS0oO)DsHea z_Crcn%+y=V!u(NYnli-9|Mc)A3!^gCk5RURwJE=3_A$frNRuHH&rqcszyJS+_fXfo zE7VE2e1-5jU|wf|^yD$DOhbOy zLewpY`~5iKPr&2A41t(kRJJXjupBP?+`HQN+X_C z|D3=Nvto>s^l`&=NSgz^<}iaYXZQ<<%$W!cG7SF_&tNT%;uVBk&OmcaCU~A#0s$XC z{GE3|KQ$=b!+)eFkJUn(`(3YY6!lS^qXV`5{~)NpLb*i$s}MkIz8m<+P=RN$G6Csh zg&x2if~=?TfcC_@G7IHgDKsN}tT0xd92TWkj1K6tY-KWwx?)IU`HELy-%2_Q+D>7~ z%0D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

qKjwHQ!ob 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, +} + +#[derive(Deserialize)] +struct ProbeFormat { + duration: Option, +} + +#[derive(Deserialize)] +struct ProbePacket { + pts_time: Option, +} + +impl Clip { + pub fn probe_all(paths: &[PathBuf]) -> Result, String> { + let mut names = HashSet::new(); + paths + .iter() + .map(|path| { + let clip = Clip::probe(path)?; + if !names.insert(clip.name.clone()) { + return Err(format!( + "clips must have distinct file names, {} repeats one (stage them as clip-.)", + path.display() + )); + } + Ok(clip) + }) + .collect() + } + + fn probe(path: &Path) -> Result { + let output = Command::new("ffprobe") + .args([ + "-v", + "error", + "-select_streams", + "v:0", + "-show_entries", + "format=duration:packet=pts_time", + "-of", + "json", + ]) + .arg(path) + .output() + .map_err(|err| format!("could not run ffprobe: {err}"))?; + if !output.status.success() { + return Err(format!( + "ffprobe could not read clip {}: {}", + path.display(), + String::from_utf8_lossy(&output.stderr).trim() + )); + } + let probe: Probe = serde_json::from_slice(&output.stdout) + .map_err(|err| format!("unexpected ffprobe output for {}: {err}", path.display()))?; + Clip::from_probe(path, &probe) + } + + fn from_probe(path: &Path, probe: &Probe) -> Result { + let seconds = |value: &Option| value.as_deref().and_then(|v| v.parse::().ok()); + let duration = seconds(&probe.format.duration) + .ok_or_else(|| format!("ffprobe could not read a duration from clip: {}", path.display()))?; + let last_pts = probe + .packets + .iter() + .filter_map(|packet| seconds(&packet.pts_time)) + .fold(None, |max: Option, pts| Some(max.map_or(pts, |m| m.max(pts)))) + .ok_or_else(|| format!("clip has no video frames: {}", path.display()))?; + let name = path + .file_name() + .and_then(|name| name.to_str()) + .ok_or_else(|| format!("clip path has no UTF-8 file name: {}", path.display()))? + .to_owned(); + Ok(Clip { + name, + path: path.to_owned(), + duration, + // The decoder shows the first frame at or after the requested time, so the last + // frame's own timestamp (not the container end) is the latest offset to ask for. + last_frame: (last_pts * FPS as f64 + 1e-6).floor().max(0.) as usize, + }) + } +} + +/// The longest clip in source seconds, rounded to centiseconds. +pub fn longest(clips: &[Clip]) -> Option { + clips.iter().map(|clip| (clip.duration * 100.).round() / 100.).reduce(f64::max) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn probe(json: &str) -> Result { + Clip::from_probe(Path::new("/tmp/clip-0.mp4"), &serde_json::from_str(json).unwrap()) + } + + #[test] + fn last_frame_comes_from_the_last_presented_packet() { + let clip = probe( + r#"{"format":{"duration":"5.000000"},"packets":[{"pts_time":"0.000000"},{"pts_time":"4.966667"},{"pts_time":"4.933333"}]}"#, + ) + .unwrap(); + assert_eq!(clip.name, "clip-0.mp4"); + assert_eq!(clip.duration, 5.); + assert_eq!(clip.last_frame, 149); + } + + #[test] + fn unreadable_probes_are_errors() { + assert!(probe(r#"{"format":{"duration":"N/A"},"packets":[{"pts_time":"0"}]}"#).is_err()); + assert!(probe(r#"{"format":{"duration":"1.0"},"packets":[]}"#).is_err()); + } + + #[test] + fn longest_rounds_to_centiseconds() { + let clip = |duration| Clip { name: String::new(), path: PathBuf::new(), duration, last_frame: 0 }; + assert_eq!(longest(&[clip(1.234), clip(5.006)]), Some(5.01)); + assert_eq!(longest(&[]), None); + } +} diff --git a/plugins/droid-control/fframes/src/code.rs b/plugins/droid-control/fframes/src/code.rs new file mode 100644 index 0000000..f5be9c9 --- /dev/null +++ b/plugins/droid-control/fframes/src/code.rs @@ -0,0 +1,103 @@ +//! Syntax highlighting for code annotations in the colours of prism's vsDark theme, with +//! the palette's text colour for unclassified tokens. + +use crate::svg::Rgba; +use std::str::FromStr; +use std::sync::LazyLock; +use syntect::easy::HighlightLines; +use syntect::highlighting::{Color, ScopeSelectors, StyleModifier, Theme, ThemeItem, ThemeSettings}; +use syntect::parsing::{SyntaxReference, SyntaxSet}; +use syntect::util::LinesWithEndings; + +static SYNTAXES: LazyLock = LazyLock::new(two_face::syntax::extra_newlines); + +/// prism-react-renderer's vsDark token colours, keyed by TextMate scope. +const VS_DARK: &[(&str, (u8, u8, u8))] = &[ + ("comment, punctuation.definition.comment", (106, 153, 85)), + ( + "keyword, storage, constant.language.null, constant.language.undefined, variable.language, support.function.builtin", + (86, 156, 214), + ), + ("keyword.operator, punctuation", (212, 212, 212)), + ("constant.numeric", (181, 206, 168)), + ("string, punctuation.definition.string", (206, 145, 120)), + ("entity.name.tag", (78, 201, 176)), + ("entity.other.attribute-name", (156, 220, 254)), + ("entity.name.function, support.function, meta.function-call entity.name", (220, 220, 170)), + ("entity.name.type, entity.name.class, support.class, support.type, entity.other.inherited-class", (78, 201, 176)), + ("constant.character", (209, 105, 105)), +]; + +fn theme(plain: Rgba) -> Theme { + let color = |(r, g, b): (u8, u8, u8)| Color { r, g, b, a: 255 }; + Theme { + settings: ThemeSettings { foreground: Some(color((plain.0, plain.1, plain.2))), ..ThemeSettings::default() }, + scopes: VS_DARK + .iter() + .map(|(scope, rgb)| ThemeItem { + scope: ScopeSelectors::from_str(scope).expect("valid scope selectors"), + style: StyleModifier { foreground: Some(color(*rgb)), ..StyleModifier::default() }, + }) + .collect(), + ..Theme::default() + } +} + +fn syntax(language: &str) -> &'static SyntaxReference { + let token = match language.to_ascii_lowercase().as_str() { + "shell" | "zsh" | "console" => "bash".to_owned(), + "markup" | "svg" | "xml" => "html".to_owned(), + other => other.to_owned(), + }; + SYNTAXES.find_syntax_by_token(&token).unwrap_or_else(|| SYNTAXES.find_syntax_plain_text()) +} + +/// Coloured tokens per line of `code` (one trailing newline dropped, like the overlay). +pub fn highlight(code: &str, language: &str, plain: Rgba) -> Vec> { + let theme = theme(plain); + let mut highlighter = HighlightLines::new(syntax(language), &theme); + let code = code.strip_suffix('\n').unwrap_or(code); + LinesWithEndings::from(code) + .map(|line| { + let tokens = highlighter.highlight_line(line, &SYNTAXES).unwrap_or_default(); + tokens + .into_iter() + .map(|(style, text)| { + let c = style.foreground; + (Rgba(c.r, c.g, c.b, 1.), text.trim_end_matches(['\n', '\r']).to_owned()) + }) + .filter(|(_, text)| !text.is_empty()) + .collect() + }) + .chain(code.ends_with('\n').then(Vec::new)) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + const TEXT: Rgba = Rgba(240, 232, 224, 1.); + + fn color_of(lines: &[Vec<(Rgba, String)>], token: &str) -> Rgba { + lines.iter().flatten().find(|(_, text)| text.contains(token)).unwrap().0 + } + + #[test] + fn tsx_tokens_take_vs_dark_colours() { + let lines = highlight("const answer = \"42\"; // why\n", "tsx", TEXT); + assert_eq!(lines.len(), 1); + assert_eq!(color_of(&lines, "const"), Rgba(86, 156, 214, 1.)); + assert_eq!(color_of(&lines, "42"), Rgba(206, 145, 120, 1.)); + assert_eq!(color_of(&lines, "why"), Rgba(106, 153, 85, 1.)); + assert_eq!(color_of(&lines, "answer"), TEXT); + } + + #[test] + fn unknown_languages_render_plain_and_keep_blank_lines() { + let lines = highlight("a\n\nb", "klingon", TEXT); + assert_eq!(lines.len(), 3); + assert!(lines[1].is_empty()); + assert!(lines.iter().flatten().all(|(color, _)| *color == TEXT)); + } +} diff --git a/plugins/droid-control/fframes/src/content.rs b/plugins/droid-control/fframes/src/content.rs new file mode 100644 index 0000000..b20086d --- /dev/null +++ b/plugins/droid-control/fframes/src/content.rs @@ -0,0 +1,265 @@ +//! The clip layer: window chrome around each clip, the panel entrances, directed zooms and +//! spotlights. Everything here runs on the clip clock (frames since the first clip frame). + +use crate::clips::Clip; +use crate::fonts::Font; +use crate::motion::{Bezier, interpolate_eased}; +use crate::props::{Effect, Layout, ObjectFit, Region}; +use crate::svg::{Anchor, Card, Rect, Rgba, Shadow, Similarity, TextStyle, faded, rounded_rect_d}; +use crate::theme::{Bar, BarSide, Palette, PresetConfig}; +use fframes::usvgr::PreloadedImageData; +use fframes::{FFramesContext, FFramesSyncedVideoFrame, Frame, Svgr, SyncVideoFrameInput, svgr}; +use std::sync::Arc; + +const BAR_HEIGHT: f32 = 36.; +const SIDE_BY_SIDE_GAP: f32 = 16.; + +const WARM_SHADOWS: [Shadow; 3] = [ + Shadow::new(8., 60., Rgba(30, 12, 4, 0.6)), + Shadow::new(2., 20., Rgba(60, 24, 8, 0.3)), + Shadow::new(0., 120., Rgba(238, 96, 24, 0.07)), +]; +const COOL_SHADOWS: [Shadow; 2] = [Shadow::new(8., 40., Rgba(0, 0, 0, 0.45)), Shadow::new(2., 12., Rgba(0, 0, 0, 0.3))]; + +/// What the clip layer draws from: the composition's look and its clip sources. +pub struct Stage<'s> { + pub palette: &'s Palette, + pub config: &'s PresetConfig, + pub size: (f32, f32), + pub layout: Layout, + pub clips: &'s [Clip], + pub labels: &'s [String], + pub window_title: &'s str, + pub speed: f64, + pub object_fit: ObjectFit, + pub effects: &'s [Effect], +} + +impl Stage<'_> { + /// The windows with their clips at `frame` on the clip clock, inside every zoom. + pub fn layout<'a>(&self, frame: usize, video: &Frame, ctx: &FFramesContext<'_, '_>) -> Svgr<'a> { + let (w, h) = self.size; + let m = self.config.margin; + let f = frame as f32; + let entrance = |delay: f32| interpolate_eased(f, &[delay, delay + 15.], &[0., 1.], Bezier::EXPO_OUT.f()); + let windows: Svgr = match self.layout { + Layout::Single => self.clips.first().map_or_else(Svgr::empty, |clip| { + let inner = Rect::new(m, m, w - 2. * m, h - 2. * m); + let progress = entrance(0.); + let place = Similarity::scale_about(0.92 + 0.08 * progress, inner.cx(), inner.cy()); + let title = (!self.window_title.is_empty()).then_some(self.window_title); + faded(progress, self.window("window0", inner, title, self.frame_of(clip, frame, video, ctx), place)) + }), + Layout::SideBySide => { + let shown = &self.clips[..self.clips.len().min(2)]; + let panel_w = ((w - 2. * m - SIDE_BY_SIDE_GAP) / 2.).floor(); + let panel_h = h - 2. * m; + // Panels are content-box: the 1px border sits outside the panel size. + let row = shown.len() as f32 * (panel_w + 2.) + (shown.len().max(1) - 1) as f32 * SIDE_BY_SIDE_GAP; + let left = (w - row) / 2.; + shown + .iter() + .enumerate() + .map(|(i, clip)| { + let inner = Rect::new( + left + i as f32 * (panel_w + 2. + SIDE_BY_SIDE_GAP) + 1., + (h - panel_h) / 2., + panel_w, + panel_h, + ); + let progress = entrance(i as f32 * 6.); + let place = Similarity::translate(0., 12. * (1. - progress)).then(Similarity::scale_about( + 0.92 + 0.08 * progress, + inner.cx(), + inner.cy(), + )); + let label = self.labels.get(i).cloned().unwrap_or_else(|| format!("Clip {}", i + 1)); + let image = self.frame_of(clip, frame, video, ctx); + faded(progress, self.window(&format!("window{i}"), inner, Some(&label), image, place)) + }) + .collect() + } + }; + self.effects.iter().fold(windows, |content, effect| match effect { + Effect::Zoom { t, dur, to } => { + let scale = zoom_scale(f, *t, *dur, to); + let origin = (to.x.0 + to.w.0 / 2.) * w; + let place = Similarity::scale_about(scale, origin, (to.y.0 + to.h.0 / 2.) * h); + svgr!({content}) + } + _ => content, + }) + } + + /// Dimmed frame with a rounded cutout around each active spotlight region. + pub fn spotlights<'a>(&self, frame: usize) -> Svgr<'a> { + let (w, h) = self.size; + let f = frame as f32; + self.effects + .iter() + .filter_map(|effect| match effect { + Effect::Spotlight { t, dur, on, dim } => { + let (start, end) = (t * 30., (t + dur) * 30.); + if f < start || f > end { + return None; + } + let local = f - start; + let total = end - start; + let fade_in = interpolate_eased(local, &[0., 9.], &[0., 1.], Bezier::EXPO_OUT.f()); + let fade_out = crate::motion::interpolate(local, &[total - 9., total], &[1., 0.]); + let hole = Rect::new(on.x.0 * w, on.y.0 * h, on.w.0 * w, on.h.0 * h); + let d = format!("M0 0H{w}V{h}H0Z{}", rounded_rect_d(hole, 8.)); + Some(faded( + fade_in.min(fade_out), + svgr!(), + )) + } + _ => None, + }) + .collect() + } + + /// The clip frame shown `frame` frames after playback started: `speed` source frames per + /// output frame, holding the last frame once the clip ends. + fn frame_of( + &self, + clip: &Clip, + frame: usize, + video: &Frame, + ctx: &FFramesContext<'_, '_>, + ) -> Option> { + let mut at = video.clone(); + at.index = ((frame as f64 * self.speed + 1e-9).floor() as usize).min(clip.last_frame); + let input = SyncVideoFrameInput { start_from: 0., looping: false, editor_fallback_image: None }; + at.get_synced_video_frame(ctx, &clip.name, &input).map(|decoded| decoded.into_image().href()) + } + + /// Window chrome around `inner` (the content size; the 1px border lies outside it). + fn window<'a>( + &self, + id: &str, + inner: Rect, + title: Option<&str>, + image: Option>, + place: Similarity, + ) -> Svgr<'a> { + let PresetConfig { bar, bar_side, radius, padding, shadow, .. } = *self.config; + let palette = self.palette; + let bar_height = if bar == Bar::None { 0. } else { BAR_HEIGHT }; + let shadows: &[Shadow] = match (shadow, palette.warm) { + (false, _) => &[], + (true, true) => &WARM_SHADOWS, + (true, false) => &COOL_SHADOWS, + }; + + let window_bar = if bar == Bar::None { + Svgr::empty() + } else { + let cy = inner.y + BAR_HEIGHT / 2.; + let (first, step) = match bar_side { + BarSide::Left => (inner.x + 8. + 14., 20.), + BarSide::Right => (inner.right() - 8. - 80. + 62., -20.), + }; + let dots: Svgr = ["#ff5f57", "#febc2e", "#28c840"] + .into_iter() + .enumerate() + .map(|(i, color)| { + let cx = first + i as f32 * step; + match bar { + Bar::Rings => { + svgr!() + } + _ => svgr!(), + } + }) + .collect(); + let label = title.map_or_else(Svgr::empty, |title| { + let style = TextStyle::new(Font::sans(400), 13.); + style.draw( + title.to_owned(), + inner.cx(), + style.baseline(inner.y, BAR_HEIGHT), + Rgba::hex(palette.muted), + Anchor::Middle, + ) + }); + svgr!({dots}{label}) + }; + + let content = Rect::new( + inner.x + padding, + inner.y + bar_height + padding, + inner.w - 2. * padding, + inner.h - bar_height - 2. * padding, + ); + let clip_id = format!("{id}-content"); + let clip_url = format!("url(#{clip_id})"); + let aspect = match self.object_fit { + ObjectFit::Contain => "xMidYMid meet", + ObjectFit::Cover => "xMidYMid slice", + ObjectFit::Fill => "none", + }; + let video = image.map_or_else(Svgr::empty, |href| { + svgr!() + }); + + let card = Card { + id, + rect: inner.outset(1.), + radius, + fill: Rgba::hex(palette.surface), + border: Rgba::WHITE.alpha(0.06), + accent: None, + shadows, + frost: None, + to_screen: place, + }; + svgr!( + + {card.draw(svgr!( + + {window_bar} + + + + {video} + + ))} + + ) + } +} + +/// Directed zoom into `to`: ease in over the first 30%, hold, ease out over the last 30%. +fn zoom_scale(f: f32, t: f32, dur: f32, to: &Region) -> f32 { + let (start, end) = (t * 30., (t + dur) * 30.); + let (in_end, hold_end) = (start + (end - start) * 0.3, start + (end - start) * 0.7); + let ease = Bezier(0.25, 0.1, 0.25, 1.); + let progress = if f < start || f > end { + 0. + } else if f <= in_end { + interpolate_eased(f, &[start, in_end], &[0., 1.], ease.f()) + } else if f <= hold_end { + 1. + } else { + interpolate_eased(f, &[hold_end, end], &[1., 0.], ease.f()) + }; + let target = (1. / to.w.0.max(0.01)).min(1. / to.h.0.max(0.01)); + 1. + (target - 1.) * progress +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::props::Pct; + + #[test] + fn zoom_fills_the_frame_with_the_region_during_the_hold() { + let to = Region { x: Pct(0.25), y: Pct(0.25), w: Pct(0.5), h: Pct(0.25) }; + assert_eq!(zoom_scale(0., 1., 2., &to), 1.); + assert!(zoom_scale(40., 1., 2., &to) > 1.); + assert_eq!(zoom_scale(48., 1., 2., &to), 2.); + assert_eq!(zoom_scale(60., 1., 2., &to), 2.); + assert_eq!(zoom_scale(91., 1., 2., &to), 1.); + } +} diff --git a/plugins/droid-control/fframes/src/fonts.rs b/plugins/droid-control/fframes/src/fonts.rs new file mode 100644 index 0000000..0ff9878 --- /dev/null +++ b/plugins/droid-control/fframes/src/fonts.rs @@ -0,0 +1,178 @@ +//! The embedded Geist families: registered with fframes for drawing and measured here for +//! layout, so boxes are sized from the same font files the renderer draws with. + +use fframes::RawFontData; +use fframes::ttf_parser::{Face, GlyphId}; +use std::sync::{Arc, LazyLock}; + +pub const SANS: &str = "Geist"; +pub const MONO: &str = "Geist Mono"; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Font { + pub family: &'static str, + pub weight: u16, +} + +struct Embedded { + file: &'static str, + font: Font, + bytes: &'static [u8], +} + +macro_rules! embedded { + ($file:literal, $family:expr, $weight:literal) => { + Embedded { + file: $file, + font: Font { family: $family, weight: $weight }, + bytes: include_bytes!(concat!("../media/", $file)), + } + }; +} + +const EMBEDDED: [Embedded; 7] = [ + embedded!("Geist-Light.ttf", SANS, 300), + embedded!("Geist-Regular.ttf", SANS, 400), + embedded!("Geist-Medium.ttf", SANS, 500), + embedded!("Geist-SemiBold.ttf", SANS, 600), + embedded!("Geist-Bold.ttf", SANS, 700), + embedded!("GeistMono-Regular.ttf", MONO, 400), + embedded!("GeistMono-Medium.ttf", MONO, 500), +]; + +static FACES: LazyLock)>> = LazyLock::new(|| { + EMBEDDED.iter().map(|e| (e.font, Face::parse(e.bytes, 0).expect("embedded fonts parse"))).collect() +}); + +/// The font files for the fframes media provider. +pub fn font_data() -> Vec { + EMBEDDED.iter().map(|e| RawFontData { file_name: e.file.to_owned(), data: Arc::new(e.bytes) }).collect() +} + +impl Font { + pub const fn sans(weight: u16) -> Self { + Self { family: SANS, weight } + } + + pub const fn mono(weight: u16) -> Self { + Self { family: MONO, weight } + } + + fn face(self) -> &'static Face<'static> { + FACES + .iter() + .find(|(font, _)| *font == self) + .map(|(_, face)| face) + .unwrap_or_else(|| panic!("{self:?} is not an embedded font")) + } + + fn em(self, units: i16) -> f32 { + f32::from(units) / f32::from(self.face().units_per_em()) + } + + /// Advance width of `text` at `size` px with CSS `letter-spacing` (in em) after every + /// character. + pub fn width(self, text: &str, size: f32, letter_spacing: f32) -> f32 { + let face = self.face(); + let scale = size / f32::from(face.units_per_em()); + text.chars() + .map(|c| { + let glyph = face.glyph_index(c).unwrap_or(GlyphId(0)); + f32::from(face.glyph_hor_advance(glyph).unwrap_or(0)) * scale + letter_spacing * size + }) + .sum() + } + + /// CSS `line-height: normal`. + pub fn normal_line_height(self, size: f32) -> f32 { + let face = self.face(); + (self.em(face.ascender()) - self.em(face.descender()) + self.em(face.line_gap())) * size + } + + /// Distance from the top of a CSS line box `line_height` px tall to the text baseline. + pub fn baseline(self, size: f32, line_height: f32) -> f32 { + let face = self.face(); + let ascent = self.em(face.ascender()) * size; + let descent = -self.em(face.descender()) * size; + (line_height - ascent - descent) / 2. + ascent + } + + /// Greedy word wrap at `max_width`, the way a browser breaks `white-space: normal` text. + pub fn wrap(self, text: &str, size: f32, letter_spacing: f32, max_width: f32) -> Vec { + let space = self.width(" ", size, letter_spacing); + let mut lines: Vec<(String, f32)> = Vec::new(); + for word in text.split_whitespace() { + let width = self.width(word, size, letter_spacing); + match lines.last_mut() { + Some((line, line_width)) if *line_width + space + width <= max_width => { + line.push(' '); + line.push_str(word); + *line_width += space + width; + } + _ => lines.push((word.to_owned(), width)), + } + } + lines.into_iter().map(|(line, _)| line).collect() + } +} + +/// Runs of non-blank characters with their column, for monospaced text whose spacing must +/// survive SVG whitespace collapsing (code, the ASCII wordmark). +pub fn mono_runs(line: &str) -> Vec<(usize, String)> { + let mut runs: Vec<(usize, String)> = Vec::new(); + let mut column = 0; + for c in line.chars() { + match c { + '\t' => column = (column / 8 + 1) * 8, + c if c.is_whitespace() => column += 1, + c => { + match runs.last_mut() { + Some((start, run)) if *start + run.chars().count() == column => run.push(c), + _ => runs.push((column, c.to_string())), + } + column += 1; + } + } + } + runs +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn geist_metrics_give_the_css_normal_line_height() { + let font = Font::sans(400); + assert!((font.normal_line_height(100.) - 130.).abs() < 0.5); + assert!(font.baseline(100., 130.) > 95. && font.baseline(100., 130.) < 105.); + } + + #[test] + fn width_scales_with_size_and_letter_spacing() { + let font = Font::sans(700); + let base = font.width("Droid", 100., 0.); + assert!((font.width("Droid", 50., 0.) * 2. - base).abs() < 0.01); + assert!((font.width("Droid", 100., -0.04) - (base - 5. * 4.)).abs() < 0.01); + } + + #[test] + fn wrap_breaks_between_words_only() { + let font = Font::sans(500); + let one_word = font.width("autonomous", 24., 0.); + let lines = font.wrap("autonomous engineering droid", 24., 0., one_word + 1.); + assert_eq!(lines, ["autonomous", "engineering", "droid"]); + assert_eq!(font.wrap("short", 24., 0., 1.), ["short"]); + } + + #[test] + fn geist_mono_draws_the_wordmark_blocks() { + let face = Font::mono(400).face(); + assert!(face.glyph_index('█').is_some()); + } + + #[test] + fn mono_runs_keep_columns_through_spaces_and_tabs() { + assert_eq!(mono_runs(" ab c\td"), [(2, "ab".to_owned()), (6, "c".to_owned()), (8, "d".to_owned())]); + } +} diff --git a/plugins/droid-control/fframes/src/lib.rs b/plugins/droid-control/fframes/src/lib.rs new file mode 100644 index 0000000..e9a3f8e --- /dev/null +++ b/plugins/droid-control/fframes/src/lib.rs @@ -0,0 +1,26 @@ +//! The droid-control showcase composition, rendered with fframes. +//! +//! A showcase is a title card, one or two screen recordings in window chrome with timed +//! overlays (keystrokes, sections, zooms, spotlights, callouts, code), and the Droid outro. +//! [`Showcase`] draws any frame as SVG; [`render`] rasterises stills and whole videos. + +pub mod clips; +pub mod code; +pub mod fonts; +pub mod motion; +pub mod props; +pub mod render; +pub mod stage; +pub mod svg; +pub mod theme; +pub mod timing; + +mod content; +mod outro; +mod overlays; +mod scenery; +mod showcase; +mod title; +mod transition; + +pub use showcase::Showcase; diff --git a/plugins/droid-control/fframes/src/main.rs b/plugins/droid-control/fframes/src/main.rs new file mode 100644 index 0000000..d865d92 --- /dev/null +++ b/plugins/droid-control/fframes/src/main.rs @@ -0,0 +1,115 @@ +//! `droid-showcase`: renders the droid-control showcase video (or one still) from props JSON +//! and clip files. + +use clap::Parser; +use droid_showcase::clips::Clip; +use droid_showcase::props::ShowcaseProps; +use droid_showcase::{Showcase, render, stage}; +use serde_json::json; +use signal_hook::consts::{SIGINT, SIGTERM}; +use signal_hook::iterator::Signals; +use std::fs; +use std::path::{Path, PathBuf}; +use std::process::ExitCode; + +/// Render a droid-control showcase: title card, clips with overlays, Droid outro. +#[derive(Debug, Parser)] +#[command(name = "droid-showcase", version)] +struct Cli { + /// Props JSON file. + #[arg(long, value_name = "FILE", required_unless_present = "props_inline", conflicts_with = "props_inline")] + props: Option, + /// Props JSON given inline. + #[arg(long, value_name = "JSON")] + props_inline: Option, + /// Fidelity profile (compact, standard, inspect); overrides the props. + #[arg(long, value_name = "PROFILE")] + fidelity: Option, + /// Render only this frame, as a PNG. + #[arg(long, value_name = "FRAME")] + still: Option, + /// Output file: an .mp4, or a .png with --still. + #[arg(long, short)] + output: PathBuf, + /// Clips (.cast, .mp4 or .webm); side-by-side shows the first two. + #[arg(required = true, value_name = "CLIP")] + clips: Vec, +} + +fn main() -> ExitCode { + let cli = Cli::parse(); + let work_dir = match tempfile::Builder::new().prefix("droid-showcase-").tempdir() { + Ok(dir) => dir.keep(), + Err(err) => { + eprintln!("error: could not create a work directory: {err}"); + return ExitCode::FAILURE; + } + }; + remove_on_signal(work_dir.clone()); + let result = run(&cli, &work_dir); + let _ = fs::remove_dir_all(&work_dir); + match result { + Ok(()) => { + println!("{}", cli.output.display()); + ExitCode::SUCCESS + } + Err(err) => { + eprintln!("error: {err}"); + ExitCode::FAILURE + } + } +} + +/// Ctrl-C or a cancelled task stops the render without leaving staged clips behind; the +/// ffmpeg and agg children share the process group and stop with it. +fn remove_on_signal(work_dir: PathBuf) { + let mut signals = Signals::new([SIGINT, SIGTERM]).expect("SIGINT and SIGTERM handlers install"); + std::thread::spawn(move || { + if let Some(signal) = signals.forever().next() { + let _ = fs::remove_dir_all(&work_dir); + std::process::exit(128 + signal); + } + }); +} + +fn run(cli: &Cli, work_dir: &Path) -> Result<(), String> { + let json = match (&cli.props, &cli.props_inline) { + (Some(file), _) => { + fs::read_to_string(file).map_err(|err| format!("props file is not readable: {}: {err}", file.display()))? + } + (None, Some(inline)) => inline.clone(), + (None, None) => unreachable!("clap requires --props or --props-inline"), + }; + for clip in &cli.clips { + stage::kind(clip)?; + fs::File::open(clip).map_err(|err| format!("clip is not readable: {}: {err}", clip.display()))?; + } + let props = ShowcaseProps::from_json(&json, cli.fidelity.as_deref())?; + let encoding = props.fidelity.encoding(); + + let staged = stage::stage(&cli.clips, work_dir, &encoding)?; + let clips = Clip::probe_all(&staged)?; + let showcase = Showcase::new(props, clips)?; + + let props = showcase.props(); + let timeline = showcase.timeline(); + let plan = json!({ + "fidelity": props.fidelity, + "width": props.width, + "height": props.height, + "speed": props.speed, + "longestClip": droid_showcase::clips::longest(showcase.clips()), + "frames": timeline.total(), + "crf": encoding.crf, + "preset": encoding.preset, + "clips": showcase.clips().iter().map(|clip| clip.path.display().to_string()).collect::>(), + "workDir": work_dir.display().to_string(), + }); + eprintln!("showcase plan: {plan}"); + + let media = render::media(showcase.clips()); + match cli.still { + Some(frame) => render::still(&showcase, &media, frame, &cli.output), + None => render::video(&showcase, &media, &cli.output), + } +} diff --git a/plugins/droid-control/fframes/src/motion.rs b/plugins/droid-control/fframes/src/motion.rs new file mode 100644 index 0000000..182ccc8 --- /dev/null +++ b/plugins/droid-control/fframes/src/motion.rs @@ -0,0 +1,132 @@ +//! Keyframe interpolation and easing: inputs are clamped to the keyframe range, CSS +//! cubic-bezier easings shape each segment. + +/// Piecewise-linear interpolation over increasing `input` stops, clamped at both ends. +pub fn interpolate(x: f32, input: &[f32], output: &[f32]) -> f32 { + interpolate_eased(x, input, output, linear) +} + +/// Like [`interpolate`], with `easing` applied to the progress of every segment. +pub fn interpolate_eased(x: f32, input: &[f32], output: &[f32], easing: impl Fn(f32) -> f32) -> f32 { + debug_assert!(input.len() == output.len() && input.len() >= 2); + let last = input.len() - 1; + let segment = (1..last).take_while(|&i| x >= input[i]).last().unwrap_or(0); + let (a, b) = (input[segment], input[segment + 1]); + let t = if b > a { ((x - a) / (b - a)).clamp(0., 1.) } else { 1. }; + output[segment] + (output[segment + 1] - output[segment]) * easing(t) +} + +pub fn linear(t: f32) -> f32 { + t +} + +/// CSS `cubic-bezier(x1, y1, x2, y2)`. +#[derive(Debug, Clone, Copy)] +pub struct Bezier(pub f32, pub f32, pub f32, pub f32); + +impl Bezier { + pub const EXPO_OUT: Bezier = Bezier(0.16, 1., 0.3, 1.); + + pub fn ease(self, t: f32) -> f32 { + let Bezier(x1, y1, x2, y2) = self; + if t <= 0. || t >= 1. { + return t.clamp(0., 1.); + } + let curve = |p1: f64, p2: f64, s: f64| { + let u = 1. - s; + 3. * u * u * s * p1 + 3. * u * s * s * p2 + s * s * s + }; + let slope = |p1: f64, p2: f64, s: f64| { + let u = 1. - s; + 3. * u * u * p1 + 6. * u * s * (p2 - p1) + 3. * s * s * (1. - p2) + }; + let (x1, x2, target) = (f64::from(x1), f64::from(x2), f64::from(t)); + let mut s = target; + for _ in 0..8 { + let d = slope(x1, x2, s); + if d.abs() < 1e-7 { + break; + } + s -= (curve(x1, x2, s) - target) / d; + } + if !(0. ..=1.).contains(&s) || (curve(x1, x2, s) - target).abs() > 1e-6 { + let (mut lo, mut hi) = (0., 1.); + s = target; + for _ in 0..40 { + if curve(x1, x2, s) < target { + lo = s; + } else { + hi = s; + } + s = (lo + hi) / 2.; + } + } + curve(f64::from(y1), f64::from(y2), s) as f32 + } + + pub fn f(self) -> impl Fn(f32) -> f32 { + move |t| self.ease(t) + } +} + +/// `Easing.out(Easing.back(s))`: overshoots the end, then settles. +pub fn back_out(s: f32) -> impl Fn(f32) -> f32 { + move |t| { + let u = 1. - t; + 1. - u * u * ((s + 1.) * u - s) + } +} + +/// `Easing.out(Easing.cubic)`. +pub fn cubic_out(t: f32) -> f32 { + 1. - (1. - t).powi(3) +} + +/// Remotion's deterministic `random(seed)`: mulberry32 over a Java-style string hash. +pub fn seeded_random(seed: &str) -> f32 { + let hash = seed + .encode_utf16() + .fold(0i32, |hash, unit| hash.wrapping_shl(5).wrapping_sub(hash).wrapping_add(i32::from(unit))); + let mut t = (hash as u32).wrapping_add(0x6d2b_79f5); + t = (t ^ (t >> 15)).wrapping_mul(t | 1); + t ^= t.wrapping_add((t ^ (t >> 7)).wrapping_mul(t | 61)); + f64::from(t ^ (t >> 14)) as f32 / 4_294_967_296. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn interpolate_clamps_and_walks_segments() { + let stops = [0., 0.35, 0.55, 0.85, 1.]; + let values = [0., 0.25, 1., 0.2, 0.]; + assert_eq!(interpolate(-1., &stops, &values), 0.); + assert!((interpolate(0.45, &stops, &values) - 0.625).abs() < 1e-6); + assert_eq!(interpolate(2., &stops, &values), 0.); + } + + #[test] + fn bezier_matches_css_endpoints_and_midpoint() { + let ease = Bezier(0.25, 0.1, 0.25, 1.); + assert_eq!(ease.ease(0.), 0.); + assert_eq!(ease.ease(1.), 1.); + // CSS `ease` at 50% progress. + assert!((ease.ease(0.5) - 0.8024).abs() < 1e-3); + } + + #[test] + fn back_out_overshoots_then_settles() { + let ease = back_out(1.5); + assert!(ease(0.6) > 1.); + assert!((ease(1.) - 1.).abs() < 1e-6); + } + + #[test] + fn seeded_random_is_deterministic_and_in_unit_range() { + let value = seeded_random("glitch-x-1000"); + assert_eq!(value, seeded_random("glitch-x-1000")); + assert!((0. ..1.).contains(&value)); + assert_ne!(value, seeded_random("glitch-x-1001")); + } +} diff --git a/plugins/droid-control/fframes/src/outro.rs b/plugins/droid-control/fframes/src/outro.rs new file mode 100644 index 0000000..c43a66c --- /dev/null +++ b/plugins/droid-control/fframes/src/outro.rs @@ -0,0 +1,113 @@ +//! The closing card: eight rotor wedges pop in as one blade and fan out into the mark, +//! then crossfade into the ASCII DROID wordmark. + +use crate::fonts::{Font, mono_runs}; +use crate::motion::{back_out, cubic_out, interpolate, interpolate_eased}; +use crate::svg::{Anchor, ROTOR_PATH, ROTOR_VIEWBOX, Rect, Rgba, TextStyle, blended, faded, glow}; +use crate::theme::Palette; +use fframes::{Svgr, svgr}; + +const DROID_ASCII: [&str; 7] = [ + " ██████████ ██████████ ██████████ ███ ██████████", + " ███ ███ ███ ███ ███ ███ ███ ███ ███", + " ███ ███ ███ ███ ███ ███ ███ ███ ███", + " ███ ███ ██████████ ███ ███ ███ ███ ███", + " ███ ███ ███ ███ ███ ███ ███ ███ ███", + " ███ ███ ███ ███ ███ ███ ███ ███ ███", + " ██████████ ███ ███ ██████████ ███ ██████████", +]; +const TAGLINE: &str = "AUTONOMOUS ENGINEERING"; +/// The rotor's hub in its own viewBox; every wedge spins around it. +const HUB: (f32, f32) = (303.105, 319.528); +const FAN_END: f32 = 45.; +const CROSSFADE_END: f32 = 75.; + +pub fn draw<'a>(palette: &Palette, (w, h): (f32, f32), frame: usize) -> Svgr<'a> { + let f = frame as f32; + let wedges = interpolate(f, &[FAN_END, CROSSFADE_END], &[1., 0.]); + let wordmark = 1. - wedges; + svgr!( + + + {faded(wedges, fan(f, w / 2., h / 2.))} + {faded(wordmark, wordmark_layer(palette, w, h))} + + ) +} + +/// Eight copies of the mark clipped to one 45-degree slice: scaled in together, then each +/// rotated `i * 45` degrees so the slices tile the whole rotor. +fn fan<'a>(f: f32, cx: f32, cy: f32) -> Svgr<'a> { + let scale = interpolate_eased(f, &[0., 12.], &[0., 1.], back_out(1.5)); + let glitching = f > 12. && f < 24. && (f as usize).is_multiple_of(3); + let opacity = if glitching { 0.5 } else { interpolate(f, &[0., 12.], &[0., 1.]) }; + if scale <= 0. { + return Svgr::empty(); + } + let (hx, hy) = HUB; + let slice = format!("{hx},{hy} {vw},{hy} {vw},{top}", vw = ROTOR_VIEWBOX.0, top = hy - (ROTOR_VIEWBOX.0 - hx)); + let blades: Svgr = (0..8) + .map(|i| { + let angle = interpolate_eased(f, &[12., FAN_END], &[0., i as f32 * 45.], cubic_out); + let place = format!("translate({cx} {cy}) scale({scale}) rotate({angle}) translate({} {})", -hx, -hy); + blended( + "screen", + opacity, + svgr!( + + + + ), + ) + }) + .collect(); + svgr!( + + + + + {blades} + + ) +} + +fn wordmark_layer<'a>(palette: &Palette, w: f32, h: f32) -> Svgr<'a> { + let mono = TextStyle::new(Font::mono(400), 24.); + let line_height = 24. * 1.2; + let tagline = TextStyle::new(Font::sans(300), 32.).spaced(0.2); + let tagline_height = tagline.normal_line_height(); + let block_height = DROID_ASCII.len() as f32 * line_height; + let top = (h - block_height - 40. - tagline_height) / 2.; + let advance = mono.width("█"); + let columns = DROID_ASCII.iter().map(|line| line.chars().count()).max().unwrap_or(0); + let left = (w - columns as f32 * advance) / 2.; + let block_area = Rect::new(left, top, columns as f32 * advance, block_height); + + let ascii = |fill: Rgba| -> Svgr<'a> { + DROID_ASCII + .iter() + .enumerate() + .flat_map(|(row, line)| { + let baseline = mono.baseline(top + row as f32 * line_height, line_height); + mono_runs(line).into_iter().map(move |(column, run)| { + mono.draw(run, left + column as f32 * advance, baseline, fill, Anchor::Start) + }) + }) + .collect() + }; + + let accent = Rgba::hex(palette.accent); + let tagline_top = top + block_height + 40.; + let tagline_baseline = tagline.baseline(tagline_top, tagline_height); + let tagline_text = |fill: Rgba| tagline.draw(TAGLINE.to_owned(), w / 2., tagline_baseline, fill, Anchor::Middle); + let tagline_width = tagline.width(TAGLINE); + let tagline_area = Rect::new((w - tagline_width) / 2., tagline_top, tagline_width, tagline_height); + svgr!( + + {glow("outro-ascii-glow".to_owned(), 10., block_area, ascii(Rgba::WHITE.alpha(0.4)))} + {ascii(Rgba::WHITE)} + {glow("outro-tagline-glow".to_owned(), 7.5, tagline_area, tagline_text(accent.a8(0x66)))} + {tagline_text(accent)} + + ) +} diff --git a/plugins/droid-control/fframes/src/overlays.rs b/plugins/droid-control/fframes/src/overlays.rs new file mode 100644 index 0000000..25755d3 --- /dev/null +++ b/plugins/droid-control/fframes/src/overlays.rs @@ -0,0 +1,460 @@ +//! Timed overlays on the clip clock: callouts, section sweeps and headers, keystrokes and +//! code annotations. Every panel frosts the scene behind it. + +use crate::code::highlight; +use crate::fonts::Font; +use crate::motion::{Bezier, interpolate, interpolate_eased}; +use crate::props::{CodeAnnotation, CodePosition, Effect, Keystroke, Section}; +use crate::svg::{Anchor, Card, Edge, Frost, Rect, Rgba, Shadow, Similarity, TextStyle, blur, faded, stops}; +use crate::theme::{Palette, PresetConfig}; +use fframes::{Svgr, svgr}; + +/// Overshooting pop-in shared by callouts and keystrokes. +const POP: Bezier = Bezier(0.34, 1.56, 0.64, 1.); + +fn frame_of(seconds: f32) -> f32 { + (seconds * 30.).round() +} + +pub struct Overlays<'s, 'a> { + pub palette: &'s Palette, + pub config: &'s PresetConfig, + pub size: (f32, f32), + /// The scene behind the overlays, for their frosted backdrops. + pub backdrop: &'s Svgr<'a>, +} + +impl<'a> Overlays<'_, 'a> { + fn frost(&self, sigma: f32) -> Option> { + Some(Frost { scene: self.backdrop, sigma }) + } + + /// Text pills centred on percentage positions. + pub fn callouts(&self, effects: &[Effect], frame: usize) -> Svgr<'a> { + let (w, h) = self.size; + let f = frame as f32; + let style = TextStyle::new(Font::sans(500), 24.); + let line_height = 24. * 1.4; + effects + .iter() + .enumerate() + .filter_map(|(i, effect)| { + let Effect::Callout { t, dur, text, at } = effect else { return None }; + let (enter, exit) = (frame_of(*t), frame_of(t + dur)); + if f < enter || f >= exit { + return None; + } + let local = f - enter; + let pop = interpolate_eased(local, &[0., 7.5], &[0., 1.], POP.f()); + let fade = interpolate(local, &[exit - enter - 6., exit - enter], &[1., 0.]); + + // Shrink-to-fit next to `left`, capped at 40% of the width. + let (left, top) = (at.x.0 * w, at.y.0 * h); + let (border_x, padding_x) = (1. + 3., 48.); + let max_content = style.width(text); + let min_content = text.split_whitespace().map(|word| style.width(word)).fold(0., f32::max); + let available = w - left - padding_x - border_x; + let content_w = max_content.min(min_content.max(available)).min(0.4 * w); + let lines = style.font.wrap(text, style.size, 0., content_w); + let rect_w = content_w + padding_x + border_x; + let rect_h = lines.len() as f32 * line_height + 24. + 2.; + let rect = Rect::new(left - rect_w / 2., top - rect_h / 2., rect_w, rect_h); + let place = Similarity::scale_about(0.85 + 0.15 * pop, left, top); + + let text_x = rect.x + 3. + 24. + content_w / 2.; + let fill = Rgba::hex(self.palette.text); + let text: Svgr = lines + .into_iter() + .enumerate() + .map(|(row, line)| { + let baseline = style.baseline(rect.y + 1. + 12. + row as f32 * line_height, line_height); + style.draw(line, text_x, baseline, fill, Anchor::Middle) + }) + .collect(); + let card = Card { + id: &format!("callout{i}"), + rect, + radius: 12., + fill: Rgba::hex(self.palette.surface).a8(0xE6), + border: Rgba::hex(self.palette.border), + accent: Some((Edge::Left, 3., Rgba::hex(self.palette.accent))), + shadows: &[Shadow::new(8., 32., Rgba(0, 0, 0, 0.35))], + frost: self.frost(12.), + to_screen: place, + }; + Some(faded(pop.min(fade), svgr!({card.draw(text)}))) + }) + .collect() + } + + /// A frosted band sweeping across the frame at every section boundary after the first. + pub fn section_sweeps(&self, sections: &[Section], frame: usize) -> Svgr<'a> { + let (w, h) = self.size; + let f = frame as f32; + let sweep = 15.; + sections + .iter() + .enumerate() + .skip(1) + .filter_map(|(i, section)| { + let start = frame_of(section.t); + if f < start || f > start + sweep { + return None; + } + let local = f - start; + let x = interpolate_eased(local, &[0., sweep], &[-0.1, 1.1], Bezier(0.4, 0., 0.2, 1.).f()); + let opacity = interpolate(local, &[0., sweep * 0.15, sweep * 0.85, sweep], &[0., 1., 1., 0.]); + let band = Rect::new(x * w - 0.1 * w, 0., 0.2 * w, h); + let id = format!("sweep{i}"); + let clip = format!("url(#{id}-clip)"); + let sheen = format!("url(#{id}-sheen)"); + let frost = Frost { scene: self.backdrop, sigma: 28. }.draw(&id, band, Similarity::IDENTITY); + let white = Rgba::WHITE; + Some(faded( + opacity, + svgr!( + + + + + {frost} + + {stops(&[(0., white.alpha(0.)), (0.5, white.alpha(0.04)), (1., white.alpha(0.))])} + + + + ), + )) + }) + .collect() + } + + /// Section titles at the top: each slides in and stays until the next one (or the end of + /// the content, `end` frames on the clip clock). + pub fn section_headers(&self, sections: &[Section], frame: usize, end: usize) -> Svgr<'a> { + let (w, _) = self.size; + let f = frame as f32; + let end = end as f32; + let style = TextStyle::new(Font::sans(600), 28.).spaced(-0.02); + sections + .iter() + .enumerate() + .filter_map(|(i, section)| { + let enter = frame_of(section.t); + let next = sections.get(i + 1).map_or(end, |next| frame_of(next.t)); + let exit = next.min(end); + if f < enter || f >= exit { + return None; + } + let local = f - enter; + let total = exit - enter; + let entered = interpolate_eased(local, &[0., 12.], &[0., 1.], Bezier(0.22, 1., 0.36, 1.).f()); + let exited = interpolate_eased(local, &[total - 9., total], &[0., 1.], Bezier(0.32, 0., 0.67, 0.).f()); + let dy = -20. * (1. - entered) + 20. * exited; + + let line_height = style.normal_line_height(); + let rect_w = style.width(§ion.title) + 64. + 2.; + let rect = Rect::new( + (w - rect_w) / 2., + (self.config.margin / 2. - 20.).max(30.), + rect_w, + line_height + 24. + 3., + ); + let place = Similarity::translate(0., dy); + let baseline = style.baseline(rect.y + 1. + 12., line_height); + let text = + style.draw(section.title.clone(), w / 2., baseline, Rgba::hex(self.palette.text), Anchor::Middle); + let card = Card { + id: &format!("section{i}"), + rect, + radius: 16., + fill: Rgba::hex(self.palette.surface).a8(0xE6), + border: Rgba::hex(self.palette.border), + accent: Some((Edge::Bottom, 2., Rgba::hex(self.palette.accent).a8(0x80))), + shadows: &[Shadow::new(8., 32., Rgba(0, 0, 0, 0.4))], + frost: self.frost(12.), + to_screen: place, + }; + Some(faded(entered * (1. - exited), svgr!({card.draw(text)}))) + }) + .collect() + } + + /// Key pills above the bottom edge; a key gives way to the next one early. + pub fn keystrokes(&self, keys: &[Keystroke], frame: usize) -> Svgr<'a> { + let (w, h) = self.size; + let f = frame as f32; + let style = TextStyle::new(Font::mono(500), 22.); + keys.iter() + .enumerate() + .filter_map(|(i, key)| { + let enter = frame_of(key.t); + let natural_exit = frame_of(key.t + key.dur.unwrap_or(1.2)); + let exit = keys.get(i + 1).map_or(natural_exit, |next| natural_exit.min(frame_of(next.t))); + if f < enter || f >= exit { + return None; + } + let local = f - enter; + let pop = interpolate_eased(local, &[0., 6.], &[0., 1.], POP.f()); + let fade = interpolate(local, &[exit - enter - 4.5, exit - enter], &[1., 0.]); + + let line_height = style.normal_line_height(); + let rect_w = style.width(&key.label) + 40. + 2.; + let rect_h = line_height + 16. + 2.; + let bottom = (self.config.margin + 40.).max(50.); + let rect = Rect::new((w - rect_w) / 2., h - bottom - rect_h, rect_w, rect_h); + let place = Similarity::scale_about(0.8 + 0.2 * pop, rect.cx(), rect.cy()); + let baseline = style.baseline(rect.y + 1. + 8., line_height); + let text = + style.draw(key.label.clone(), w / 2., baseline, Rgba::hex(self.palette.text), Anchor::Middle); + let card = Card { + id: &format!("key{i}"), + rect, + radius: 8., + fill: Rgba::hex(self.palette.surface).a8(0xBF), + border: Rgba::hex(self.palette.border), + accent: None, + shadows: &[], + frost: self.frost(8.), + to_screen: place, + }; + Some(faded(pop.min(fade), svgr!({card.draw(text)}))) + }) + .collect() + } + + pub fn code_cards(&self, cards: &[CodeCard], frame: usize) -> Svgr<'a> { + cards.iter().enumerate().map(|(i, card)| self.code_card(i, card, frame as f32)).collect() + } + + fn code_card(&self, index: usize, card: &CodeCard, f: f32) -> Svgr<'a> { + if f < card.enter || f >= card.exit { + return Svgr::empty(); + } + let local = f - card.enter; + let total = card.exit - card.enter; + let entered = interpolate_eased(local, &[0., 10.5], &[0., 1.], Bezier::EXPO_OUT.f()); + let exited = interpolate(local, &[(total - 10.5).max(0.), total], &[0., 1.]); + let rect = card.rect; + let place = Similarity::scale_about(0.96 + 0.04 * entered, rect.cx(), rect.cy()); + let palette = self.palette; + let muted = Rgba::hex(palette.muted); + let accent = Rgba::hex(palette.accent); + let id = format!("code{index}"); + + let content_x = rect.x + 1. + 16.; + let content_y = rect.y + 1. + 16.; + let title: Svgr = card + .title + .iter() + .enumerate() + .map(|(row, line)| { + let line_height = CODE_TITLE.normal_line_height(); + let baseline = CODE_TITLE.baseline(content_y + row as f32 * line_height, line_height); + CODE_TITLE.draw(line.clone(), content_x, baseline, muted, Anchor::Start) + }) + .collect(); + + let code_y = content_y + card.title_height(); + let pre = Rect::new(content_x, code_y, card.content_w, card.lines.len() as f32 * CODE_LINE_HEIGHT); + let advance = CODE.width("0"); + let gutter_w = (card.lines.len().to_string().len() + 1) as f32 * advance; + let text_x = content_x + 2.; + let rows: Svgr = card + .lines + .iter() + .enumerate() + .map(|(row, line)| { + let top = code_y + row as f32 * CODE_LINE_HEIGHT; + let baseline = CODE.baseline(top, CODE_LINE_HEIGHT); + // The row's left border falls outside the clipped

; only its tint shows.
+                let tint = if line.highlighted {
+                    svgr!()
+                } else {
+                    Svgr::empty()
+                };
+                let number = CODE.draw((row + 1).to_string(), text_x + gutter_w, baseline, muted, Anchor::End);
+                let tokens: Svgr = line
+                    .runs
+                    .iter()
+                    .map(|(column, color, run)| {
+                        CODE.draw(run.clone(), text_x + gutter_w + 12. + *column as f32 * advance, baseline, *color, Anchor::Start)
+                    })
+                    .collect();
+                let text = svgr!({number}{tokens});
+                let text = if line.focused {
+                    text
+                } else {
+                    let filter = format!("{id}-unfocused{row}");
+                    let url = format!("url(#{filter})");
+                    let area = Rect::new(pre.x, top, pre.w, CODE_LINE_HEIGHT);
+                    svgr!({blur(filter, 1.2, area)}{text})
+                };
+                svgr!({tint}{text})
+            })
+            .collect();
+        let pre_clip = format!("{id}-pre");
+        let pre_url = format!("url(#{pre_clip})");
+        let ring = rect.outset(0.5);
+
+        let panel = Card {
+            id: &id,
+            rect,
+            radius: 12.,
+            fill: Rgba::hex(palette.surface).a8(0xF2),
+            border: Rgba::hex(palette.border),
+            accent: Some((Edge::Bottom, 2., accent.a8(0xAA))),
+            shadows: &[Shadow::new(18., 48., Rgba(0, 0, 0, 0.45))],
+            frost: self.frost(10.),
+            to_screen: place,
+        };
+        let drawn = svgr!(
+            
+                
+                {panel.draw(svgr!(
+                    
+                        {title}
+                        
+                            
+                        
+                        {rows}
+                    
+                ))}
+            
+        );
+        let sigma = 6. * (1. - entered);
+        let drawn = if sigma > 0.01 {
+            let filter = format!("{id}-enter");
+            let url = format!("url(#{filter})");
+            svgr!({blur(filter, sigma, rect.outset(60.))}{drawn})
+        } else {
+            drawn
+        };
+        faded(entered * (1. - exited), svgr!({drawn}))
+    }
+}
+
+const CODE: TextStyle = TextStyle::new(Font::mono(400), 14.);
+const CODE_LINE_HEIGHT: f32 = 14. * 1.5;
+const CODE_TITLE: TextStyle = TextStyle::new(Font::sans(500), 11.).spaced(0.1);
+
+pub struct CodeLine {
+    /// Non-blank runs: column, colour, text.
+    runs: Vec<(usize, Rgba, String)>,
+    highlighted: bool,
+    focused: bool,
+}
+
+/// A code annotation laid out once: wrapped title, highlighted lines and the panel rect.
+pub struct CodeCard {
+    enter: f32,
+    exit: f32,
+    title: Vec,
+    lines: Vec,
+    content_w: f32,
+    rect: Rect,
+}
+
+impl CodeCard {
+    pub fn new(annotation: &CodeAnnotation, palette: &Palette, config: &PresetConfig, (w, h): (f32, f32)) -> Self {
+        let tokens = highlight(&annotation.code, &annotation.language, Rgba::hex(palette.text));
+        let has_focus = !annotation.focus.is_empty();
+        let lines: Vec = tokens
+            .into_iter()
+            .enumerate()
+            .map(|(i, tokens)| {
+                let number = i as u32 + 1;
+                CodeLine {
+                    runs: columns(&tokens),
+                    highlighted: annotation.highlight.iter().any(|range| range.contains(number)),
+                    focused: !has_focus || annotation.focus.iter().any(|range| range.contains(number)),
+                }
+            })
+            .collect();
+
+        let advance = CODE.width("0");
+        let gutter_w = (lines.len().to_string().len() + 1) as f32 * advance + 12.;
+        let line_w = |line: &CodeLine| {
+            line.runs.last().map_or(0., |(column, _, run)| (column + run.chars().count()) as f32 * advance)
+        };
+        let code_w = 2. + gutter_w + lines.iter().map(line_w).fold(0., f32::max);
+        let title = annotation.title.to_uppercase();
+        let max_content = code_w.max(CODE_TITLE.width(&title));
+        let min_content = code_w.max(title.split_whitespace().map(|word| CODE_TITLE.width(word)).fold(0., f32::max));
+        let edge = (config.margin + 24.).max(40.);
+        let chrome = 32. + 2.;
+        let available = match annotation.position {
+            CodePosition::Center => w / 2. - chrome,
+            CodePosition::TopRight | CodePosition::BottomLeft => w - edge - chrome,
+        };
+        let content_w = max_content.min(min_content.max(available)).min(0.42 * w).max(320.);
+        let title = if title.is_empty() {
+            Vec::new()
+        } else {
+            CODE_TITLE.font.wrap(&title, CODE_TITLE.size, CODE_TITLE.letter_spacing, content_w)
+        };
+
+        let mut card = CodeCard {
+            enter: (annotation.t * 30.).round(),
+            exit: ((annotation.t + annotation.dur) * 30.).round(),
+            title,
+            lines,
+            content_w,
+            rect: Rect::new(0., 0., content_w + chrome, 0.),
+        };
+        card.rect.h = card.title_height() + card.lines.len() as f32 * CODE_LINE_HEIGHT + 32. + 1. + 2.;
+        (card.rect.x, card.rect.y) = match annotation.position {
+            CodePosition::Center => ((w - card.rect.w) / 2., (h - card.rect.h) / 2.),
+            CodePosition::TopRight => (w - edge - card.rect.w, edge),
+            CodePosition::BottomLeft => (edge, h - edge - card.rect.h),
+        };
+        card
+    }
+
+    fn title_height(&self) -> f32 {
+        if self.title.is_empty() { 0. } else { self.title.len() as f32 * CODE_TITLE.normal_line_height() + 10. }
+    }
+}
+
+/// Splits highlighted tokens into non-blank runs at their column (tabs stop every 8).
+fn columns(tokens: &[(Rgba, String)]) -> Vec<(usize, Rgba, String)> {
+    let mut runs: Vec<(usize, Rgba, String)> = Vec::new();
+    let mut column = 0;
+    for (color, text) in tokens {
+        let mut open = false;
+        for c in text.chars() {
+            match c {
+                '\t' => {
+                    column = (column / 8 + 1) * 8;
+                    open = false;
+                }
+                c if c.is_whitespace() => {
+                    column += 1;
+                    open = false;
+                }
+                c => {
+                    match runs.last_mut() {
+                        Some((_, _, run)) if open => run.push(c),
+                        _ => runs.push((column, *color, c.to_string())),
+                    }
+                    open = true;
+                    column += 1;
+                }
+            }
+        }
+    }
+    runs
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn columns_split_on_blanks_and_colour_changes() {
+        let red = Rgba(255, 0, 0, 1.);
+        let blue = Rgba(0, 0, 255, 1.);
+        let runs = columns(&[(red, "\tlet x".to_owned()), (blue, "=1".to_owned())]);
+        assert_eq!(runs, [(8, red, "let".to_owned()), (12, red, "x".to_owned()), (13, blue, "=1".to_owned())]);
+    }
+}
diff --git a/plugins/droid-control/fframes/src/props.rs b/plugins/droid-control/fframes/src/props.rs
new file mode 100644
index 0000000..336fce8
--- /dev/null
+++ b/plugins/droid-control/fframes/src/props.rs
@@ -0,0 +1,366 @@
+//! The Showcase props contract. Missing fields take the composition defaults and unknown
+//! fields are ignored. Clips are not props: they are passed to the binary and probed.
+
+use serde::{Deserialize, Deserializer, Serialize};
+use serde_json::{Map, Value};
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum Preset {
+    Macos,
+    Minimal,
+    Hero,
+    Presentation,
+    Factory,
+    FactoryHero,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum Layout {
+    Single,
+    SideBySide,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum Fidelity {
+    Compact,
+    Standard,
+    Inspect,
+}
+
+/// How clip video is sized inside its panel.
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum ObjectFit {
+    /// Preserve the aspect ratio and letterbox.
+    #[default]
+    Contain,
+    /// Fill the panel and crop the overflow.
+    Cover,
+    /// Stretch to the panel (distorts the aspect ratio).
+    Fill,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum TransitionStyle {
+    #[default]
+    MotionBlur,
+    Flash,
+    WhipPan,
+    LightLeak,
+    GlitchLite,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+pub struct Keystroke {
+    pub t: f32,
+    pub label: String,
+    pub dur: Option,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+pub struct Section {
+    pub t: f32,
+    pub title: String,
+}
+
+/// A CSS-style percentage such as `"25%"`, stored as a fraction (0.25).
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub struct Pct(pub f32);
+
+impl<'de> Deserialize<'de> for Pct {
+    fn deserialize>(deserializer: D) -> Result {
+        let raw = String::deserialize(deserializer)?;
+        let number = raw.trim().trim_end_matches('%').trim();
+        number
+            .parse::()
+            .ok()
+            .filter(|value| value.is_finite())
+            .map(|value| Pct(value / 100.))
+            .ok_or_else(|| serde::de::Error::custom(format!("expected a percentage like \"25%\", got {raw:?}")))
+    }
+}
+
+#[derive(Debug, Clone, Copy, Deserialize)]
+pub struct Region {
+    pub x: Pct,
+    pub y: Pct,
+    pub w: Pct,
+    pub h: Pct,
+}
+
+#[derive(Debug, Clone, Copy, Deserialize)]
+pub struct Point {
+    pub x: Pct,
+    pub y: Pct,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+#[serde(tag = "fx", rename_all = "kebab-case")]
+pub enum Effect {
+    FadeIn {
+        t: f32,
+        dur: f32,
+    },
+    FadeOut {
+        t: f32,
+        dur: f32,
+    },
+    Zoom {
+        t: f32,
+        dur: f32,
+        to: Region,
+    },
+    Spotlight {
+        t: f32,
+        dur: f32,
+        on: Region,
+        #[serde(default = "default_dim")]
+        dim: f32,
+    },
+    Callout {
+        t: f32,
+        dur: f32,
+        text: String,
+        at: Point,
+    },
+}
+
+fn default_dim() -> f32 {
+    0.6
+}
+
+impl Effect {
+    /// Schema-valid effects this composition does not draw.
+    pub fn unrendered_name(&self) -> Option<&'static str> {
+        match self {
+            Effect::FadeIn { .. } => Some("fade-in"),
+            Effect::FadeOut { .. } => Some("fade-out"),
+            _ => None,
+        }
+    }
+}
+
+/// Inclusive 1-based line range.
+#[derive(Debug, Clone, Copy, Deserialize)]
+pub struct CodeRange {
+    pub start: u32,
+    pub end: u32,
+}
+
+impl CodeRange {
+    pub fn contains(&self, line: u32) -> bool {
+        (self.start..=self.end).contains(&line)
+    }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum CodePosition {
+    Center,
+    #[default]
+    TopRight,
+    BottomLeft,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+pub struct CodeAnnotation {
+    pub t: f32,
+    pub dur: f32,
+    pub code: String,
+    #[serde(default = "default_language")]
+    pub language: String,
+    #[serde(default)]
+    pub title: String,
+    #[serde(default)]
+    pub highlight: Vec,
+    #[serde(default)]
+    pub focus: Vec,
+    #[serde(default)]
+    pub position: CodePosition,
+}
+
+fn default_language() -> String {
+    "tsx".to_owned()
+}
+
+#[derive(Debug, Clone, Deserialize)]
+#[serde(default, rename_all = "camelCase")]
+pub struct ShowcaseProps {
+    pub layout: Layout,
+    pub labels: Vec,
+    pub title: String,
+    pub subtitle: String,
+    pub preset: Preset,
+    pub keys: Vec,
+    pub effects: Vec,
+    pub sections: Vec
, + /// Output size; omitted => 2560x1440 for `inspect`, 1920x1080 otherwise. + pub width: u32, + pub height: u32, + pub speed_note: String, + pub window_title: String, + /// Playback multiplier applied once, to every clip. Overlay times (keys, sections, + /// effects, codeAnnotations) are already output seconds. + pub speed: f64, + /// Omitted => `inspect` for side-by-side, `standard` otherwise. + pub fidelity: Fidelity, + pub object_fit: ObjectFit, + /// Timed syntax-highlighted code overlays, relative to the first clip frame. + pub code_annotations: Vec, + /// Presentation of the title->content and content->outro transitions. + pub transition_style: TransitionStyle, +} + +impl Default for ShowcaseProps { + fn default() -> Self { + Self { + layout: Layout::Single, + labels: Vec::new(), + title: "Demo".to_owned(), + subtitle: String::new(), + preset: Preset::Factory, + keys: Vec::new(), + effects: Vec::new(), + sections: Vec::new(), + width: 1920, + height: 1080, + speed_note: String::new(), + window_title: String::new(), + speed: 1., + fidelity: Fidelity::Standard, + object_fit: ObjectFit::Contain, + code_annotations: Vec::new(), + transition_style: TransitionStyle::MotionBlur, + } + } +} + +impl ShowcaseProps { + /// Parses props JSON. `fidelity` (a profile name) overrides the one in the JSON; the + /// fidelity and output size defaults depend on other fields, so they are resolved here. + pub fn from_json(json: &str, fidelity: Option<&str>) -> Result { + if json.trim().is_empty() { + return Err("props JSON is empty".to_owned()); + } + let mut value: Value = serde_json::from_str(json).map_err(|err| format!("props JSON is invalid: {err}"))?; + let object = value.as_object_mut().ok_or("props JSON must be an object")?; + resolve_defaults(object, fidelity); + let props: Self = serde_path_to_error::deserialize(value).map_err(|err| format!("invalid props: {err}"))?; + props.validate()?; + Ok(props) + } + + fn validate(&self) -> Result<(), String> { + if !(self.speed.is_finite() && self.speed > 0.) { + return Err(format!("invalid props: speed must be a positive finite number, got {}", self.speed)); + } + if self.width == 0 || self.height == 0 || self.width % 2 == 1 || self.height % 2 == 1 { + return Err(format!( + "invalid props: width and height must be positive even numbers (yuv420p), got {}x{}", + self.width, self.height + )); + } + let ranges = self.code_annotations.iter().flat_map(|a| a.highlight.iter().chain(&a.focus)); + if ranges.clone().any(|range| range.start == 0 || range.end == 0) { + return Err("invalid props: code line ranges are 1-based (start and end must be positive)".to_owned()); + } + Ok(()) + } +} + +fn resolve_defaults(props: &mut Map, fidelity: Option<&str>) { + fn default(props: &mut Map, key: &str, value: impl Into) { + if props.get(key).is_none_or(Value::is_null) { + props.insert(key.to_owned(), value.into()); + } + } + if let Some(fidelity) = fidelity { + props.insert("fidelity".to_owned(), Value::from(fidelity)); + } + let side_by_side = props.get("layout").and_then(Value::as_str) == Some("side-by-side"); + default(props, "fidelity", if side_by_side { "inspect" } else { "standard" }); + let inspect = props.get("fidelity").and_then(Value::as_str) == Some("inspect"); + default(props, "width", if inspect { 2560 } else { 1920 }); + default(props, "height", if inspect { 1440 } else { 1080 }); +} + +#[cfg(test)] +mod tests { + use super::*; + + fn parse(json: &str) -> ShowcaseProps { + ShowcaseProps::from_json(json, None).unwrap() + } + + #[test] + fn missing_fields_take_composition_defaults() { + let props = parse(r#"{"clips":["ignored.mp4"],"unknown":1}"#); + assert_eq!(props.preset, Preset::Factory); + assert_eq!(props.fidelity, Fidelity::Standard); + assert_eq!((props.width, props.height), (1920, 1080)); + assert_eq!(props.speed, 1.); + assert_eq!(props.transition_style, TransitionStyle::MotionBlur); + } + + #[test] + fn fidelity_defaults_by_layout_and_sizes_by_fidelity() { + let side = parse(r#"{"layout":"side-by-side"}"#); + assert_eq!(side.fidelity, Fidelity::Inspect); + assert_eq!((side.width, side.height), (2560, 1440)); + + let explicit = parse(r#"{"layout":"side-by-side","fidelity":"compact","height":720}"#); + assert_eq!(explicit.fidelity, Fidelity::Compact); + assert_eq!((explicit.width, explicit.height), (1920, 720)); + + let overridden = ShowcaseProps::from_json(r#"{"fidelity":"compact"}"#, Some("inspect")).unwrap(); + assert_eq!(overridden.fidelity, Fidelity::Inspect); + assert_eq!(overridden.width, 2560); + } + + #[test] + fn effects_parse_by_fx_tag_with_percent_regions() { + let props = parse( + r#"{"effects":[ + {"fx":"zoom","t":1,"dur":2,"to":{"x":"10%","y":"20%","w":"50%","h":"40%"},"ease":"x"}, + {"fx":"spotlight","t":1,"dur":2,"on":{"x":"0%","y":"0%","w":"50%","h":"50%"}}, + {"fx":"fade-out","t":1,"dur":2} + ]}"#, + ); + let Effect::Zoom { to, .. } = &props.effects[0] else { panic!("zoom") }; + assert_eq!((to.x, to.w), (Pct(0.1), Pct(0.5))); + let Effect::Spotlight { dim, .. } = &props.effects[1] else { panic!("spotlight") }; + assert_eq!(*dim, 0.6); + assert_eq!(props.effects[2].unrendered_name(), Some("fade-out")); + } + + #[test] + fn code_annotations_take_schema_defaults() { + let props = parse(r#"{"codeAnnotations":[{"t":0,"dur":1,"code":"x"}]}"#); + let annotation = &props.code_annotations[0]; + assert_eq!(annotation.language, "tsx"); + assert_eq!(annotation.position, CodePosition::TopRight); + assert!(annotation.highlight.is_empty() && annotation.focus.is_empty()); + } + + #[test] + fn invalid_values_are_rejected() { + for json in [ + "", + "[]", + r#"{"speed":0}"#, + r#"{"speed":-2}"#, + r#"{"speed":true}"#, + r#"{"width":641}"#, + r#"{"preset":"neon"}"#, + r#"{"fidelity":"ultra"}"#, + r#"{"effects":[{"fx":"zoom","t":0,"dur":1,"to":{"x":"left","y":"0%","w":"1%","h":"1%"}}]}"#, + r#"{"codeAnnotations":[{"t":0,"dur":1,"code":"x","highlight":[{"start":0,"end":1}]}]}"#, + ] { + assert!(ShowcaseProps::from_json(json, None).is_err(), "{json} must be rejected"); + } + } +} diff --git a/plugins/droid-control/fframes/src/render.rs b/plugins/droid-control/fframes/src/render.rs new file mode 100644 index 0000000..5266749 --- /dev/null +++ b/plugins/droid-control/fframes/src/render.rs @@ -0,0 +1,127 @@ +//! Rasterising the composition at the props size: single PNG stills, and whole videos +//! rendered on every core and piped to ffmpeg for the H.264 encode. + +use crate::Showcase; +use crate::clips::Clip; +use crate::fonts; +use fframes::media::VideoMedia; +use fframes::{Color, CpuFrameRenderer, DynamicMediaProvider, FrameRenderer, Previewer, RenderOptions, RgbaFrame}; +use std::collections::HashMap; +use std::io::Write; +use std::path::Path; +use std::process::{Command, Stdio}; +use std::sync::mpsc; +use std::thread; + +/// Consecutive frames per worker turn: long enough runs keep each worker's decoders reading +/// forward, short enough that the in-order writer never waits long. +const BLOCK: usize = 8; + +/// The clip files and the embedded fonts, as fframes media. +pub fn media(clips: &[Clip]) -> DynamicMediaProvider<'static> { + let videos = + clips.iter().map(|clip| (clip.name.clone(), VideoMedia { path: clip.path.clone(), metadata: None })).collect(); + DynamicMediaProvider::new(HashMap::new(), HashMap::new(), HashMap::new(), videos, fonts::font_data()) +} + +struct FrameSource<'a> { + previewer: Previewer<'a, 'a, Showcase>, + renderer: CpuFrameRenderer, + size: (u32, u32), +} + +impl<'a> FrameSource<'a> { + fn new(showcase: &'a Showcase, media: &'a DynamicMediaProvider<'static>) -> Result { + // System fonts back the embedded Geist families for glyphs they lack (CJK, symbols). + let options = RenderOptions { media: Some(media), load_system_fonts: true, ..Default::default() }; + let previewer = + Previewer::new(showcase, &options).map_err(|err| format!("could not prepare the renderer: {err}"))?; + let props = showcase.props(); + Ok(Self { previewer, renderer: CpuFrameRenderer::default(), size: (props.width, props.height) }) + } + + fn render(&mut self, frame: usize) -> Result { + let tree = self.previewer.svg_tree(frame).map_err(|err| format!("frame {frame}: {err}"))?; + let (width, height) = self.size; + self.renderer.render_tree(&tree, Color::BLACK, width, height).map_err(|err| format!("frame {frame}: {err}")) + } +} + +/// Renders one frame to a PNG. +pub fn still( + showcase: &Showcase, + media: &DynamicMediaProvider<'static>, + frame: usize, + output: &Path, +) -> Result<(), String> { + let total = showcase.timeline().total(); + if frame >= total { + return Err(format!("--still {frame} is past the last frame ({})", total - 1)); + } + FrameSource::new(showcase, media)? + .render(frame)? + .save_png(output) + .map_err(|err| format!("could not write {}: {err}", output.display())) +} + +/// Renders every frame and encodes them to H.264 (yuv420p, BT.709 limited range). +pub fn video(showcase: &Showcase, media: &DynamicMediaProvider<'static>, output: &Path) -> Result<(), String> { + let total = showcase.timeline().total(); + let props = showcase.props(); + let encoding = props.fidelity.encoding(); + let mut ffmpeg = Command::new("ffmpeg") + .args(["-hide_banner", "-loglevel", "error", "-y", "-f", "rawvideo", "-pix_fmt", "rgba"]) + .args(["-s", &format!("{}x{}", props.width, props.height), "-framerate", "30", "-i", "-"]) + .args(["-c:v", "libx264", "-preset", encoding.preset, "-crf", &encoding.crf.to_string()]) + .args(["-vf", "scale=out_color_matrix=bt709:out_range=tv", "-pix_fmt", "yuv420p"]) + .args(["-colorspace", "bt709", "-color_primaries", "bt709", "-color_trc", "bt709", "-color_range", "tv"]) + .args(["-movflags", "+faststart"]) + .arg(output) + .stdin(Stdio::piped()) + .spawn() + .map_err(|err| format!("could not run ffmpeg: {err}"))?; + let mut encoder = ffmpeg.stdin.take().expect("ffmpeg stdin is piped"); + let workers = thread::available_parallelism().map_or(1, usize::from).min(total.div_ceil(BLOCK)).max(1); + + let rendered = thread::scope(|scope| { + // Worker `w` renders blocks w, w + workers, ...; the writer drains them in frame order. + let queues: Vec>> = (0..workers) + .map(|worker| { + let (frames, queue) = mpsc::sync_channel(BLOCK); + scope.spawn(move || { + let mut source = match FrameSource::new(showcase, media) { + Ok(source) => source, + Err(err) => return drop(frames.send(Err(err))), + }; + for frame in (0..total).filter(|frame| (frame / BLOCK) % workers == worker) { + let result = source.render(frame); + let failed = result.is_err(); + if frames.send(result).is_err() || failed { + return; + } + } + }); + queue + }) + .collect(); + for frame in 0..total { + let rgba = queues[(frame / BLOCK) % workers].recv().map_err(|_| "a render worker stopped".to_owned())??; + encoder.write_all(&rgba.pixels).map_err(|err| format!("ffmpeg stopped accepting frames: {err}"))?; + if (frame + 1) % 30 == 0 || frame + 1 == total { + eprint!("\rrendered {}/{total} frames", frame + 1); + } + } + eprintln!(); + Ok::<(), String>(()) + }); + drop(encoder); + if rendered.is_err() { + let _ = ffmpeg.kill(); + } + let status = ffmpeg.wait().map_err(|err| format!("ffmpeg did not finish: {err}"))?; + rendered?; + if !status.success() { + return Err(format!("ffmpeg failed to encode {} ({status})", output.display())); + } + Ok(()) +} diff --git a/plugins/droid-control/fframes/src/scenery.rs b/plugins/droid-control/fframes/src/scenery.rs new file mode 100644 index 0000000..a618dcf --- /dev/null +++ b/plugins/droid-control/fframes/src/scenery.rs @@ -0,0 +1,121 @@ +//! Layers that frame every segment: the warm background, drifting particles, the rotor +//! watermark, film grain and the final colour grade. + +use crate::svg::{Rect, Rgba, blended, faded, rotor, stops}; +use crate::theme::{BgStyle, Palette, PresetConfig}; +use fframes::media::ImageData; +use fframes::{Svgr, svgr}; +use std::f32::consts::FRAC_1_SQRT_2; + +/// A CSS `radial-gradient(ellipse at center, ...)` (farthest-corner) filling `r`. +fn radial<'a>(id: String, r: Rect, css: &[(f32, Rgba)]) -> Svgr<'a> { + let fill = format!("url(#{id})"); + svgr!( + + {stops(css)} + + + ) +} + +/// Full-bleed background. Warm palettes get a vignette, four corner glows that intensify +/// from a mild wash to a rich bloom over `total` frames, and the halftone rotor texture. +pub fn background<'a>( + id: &str, + palette: &Palette, + config: &PresetConfig, + halftone: &ImageData<'_>, + (w, h): (f32, f32), + frame: usize, + total: usize, +) -> Svgr<'a> { + let full = Rect::new(0., 0., w, h); + let bg = Rgba::hex(palette.bg); + if !palette.warm { + return match config.bg_style { + BgStyle::Gradient => radial( + format!("{id}-cool"), + full, + &[(0., bg), (0.5, Rgba::hex("#0f0f1a")), (0.8, Rgba::hex("#121220")), (1., Rgba::hex("#1a1028"))], + ), + BgStyle::Solid => svgr!(), + }; + } + + let warmth = (frame as f32 / total as f32).clamp(0., 1.); + let glow = 0.05 + 0.15 * warmth; + let blob = |name: &str, (x, y, bw, bh): (f32, f32, f32, f32), color: Rgba, edge: f32| { + radial(format!("{id}-{name}"), Rect::new(x * w, y * h, bw * w, bh * h), &[(0., color), (edge, color.alpha(0.))]) + }; + let halftone_side = w.max(h); + svgr!( + + {radial( + format!("{id}-vignette"), + full, + &[(0., bg), (0.55, Rgba::hex("#1a0e08")), (0.85, Rgba::hex("#2a1510")), (1., Rgba::hex("#351a12"))], + )} + {blob("bl", (-0.1, 0.5, 0.6, 0.6), Rgba(200, 80, 20, glow), 0.7)} + {blob("tr", (0.55, -0.15, 0.55, 0.55), Rgba(180, 60, 15, glow * 0.8), 0.7)} + {blob("br", (0.6, 0.55, 0.45, 0.5), Rgba(160, 40, 10, glow * 0.6), 0.65)} + {blob("tl", (-0.05, -0.08, 0.4, 0.4), Rgba(238, 96, 24, glow * 0.4), 0.6)} + {blended("screen", 0.15, svgr!( + + ))} + + ) +} + +/// 30 accent dots on slow Lissajous paths. +pub fn particles<'a>(accent: &'a str, (w, h): (f32, f32), frame: usize) -> Svgr<'a> { + let f = frame as f32; + let dots: Svgr = (0..30) + .map(|i| { + let base_x = ((i * 73 + 17) % 100) as f32 / 100. * w; + let base_y = ((i * 47 + 31) % 100) as f32 / 100. * h; + let size = (2 + (i % 3) * 2) as f32; + let dx = (f * 0.008 + (i * 13 + 7) as f32 * 0.1).sin() * 60.; + let dy = (f * 0.006 + (i * 19 + 11) as f32 * 0.1).cos() * 40.; + svgr!() + }) + .collect(); + faded(0.07, dots) +} + +/// The rotor in the bottom-right corner, fading in to 20% over the first second. +pub fn watermark<'a>((w, h): (f32, f32), frame: usize) -> Svgr<'a> { + let size = 48.; + faded(0.2 * (frame as f32 / 30.).min(1.), rotor(w - 32. - size, h - 24. - size, size, "white")) +} + +/// Static fractal noise, overlay-blended. +pub fn noise<'a>((w, h): (f32, f32), opacity: f32) -> Svgr<'a> { + blended( + "overlay", + opacity, + svgr!( + + + + + + + ), + ) +} + +/// The topmost grade: a colour-blended temperature tint and a soft corner vignette. +pub fn grade<'a>(palette: &Palette, (w, h): (f32, f32), intensity: f32) -> Svgr<'a> { + let tint = if palette.warm { Rgba(200, 120, 40, intensity) } else { Rgba(80, 100, 200, intensity * 0.75) }; + svgr!( + + {blended("color", 1., svgr!())} + {radial( + "grade-vignette".to_owned(), + Rect::new(0., 0., w, h), + &[(0.4, Rgba::BLACK.alpha(0.)), (1., Rgba::BLACK.alpha(0.15))], + )} + + ) +} diff --git a/plugins/droid-control/fframes/src/showcase.rs b/plugins/droid-control/fframes/src/showcase.rs new file mode 100644 index 0000000..b4f04f7 --- /dev/null +++ b/plugins/droid-control/fframes/src/showcase.rs @@ -0,0 +1,191 @@ +//! The Showcase composition: background and particles under a title card, the clip content +//! with its overlays and the Droid outro (joined by two transitions), then the watermark, +//! film grain and colour grade on top. + +use crate::clips::{self, Clip}; +use crate::content::Stage; +use crate::outro; +use crate::overlays::{CodeCard, Overlays}; +use crate::props::{Effect, ShowcaseProps}; +use crate::scenery; +use crate::theme::{Palette, PresetConfig}; +use crate::timing::{self, TITLE_FRAMES, TRANSITION_FRAMES, Timeline}; +use crate::title::{TitleCard, TitleLayout}; +use crate::transition::{Direction, Transition}; +use fframes::media::ImageData; +use fframes::{AudioMap, Duration, FFramesContext, Frame, Svgr, Video, svgr}; +use std::collections::HashSet; + +const HALFTONE: &[u8] = include_bytes!("../media/bg-halftone-rotor.png"); + +pub struct Showcase { + props: ShowcaseProps, + clips: Vec, + timeline: Timeline, + palette: &'static Palette, + config: &'static PresetConfig, + size: (f32, f32), + halftone: ImageData<'static>, + title: TitleLayout, + code_cards: Vec, +} + +impl Showcase { + /// `clips` are probed sources; the longest one sets the content length. + pub fn new(props: ShowcaseProps, clips: Vec) -> Result { + let mut warned = HashSet::new(); + for name in props.effects.iter().filter_map(Effect::unrendered_name) { + if warned.insert(name) { + eprintln!("Showcase: effect fx='{name}' is schema-valid but not rendered by this composition"); + } + } + let palette = props.preset.palette(); + let config = props.preset.config(); + let size = (props.width as f32, props.height as f32); + let halftone = ImageData::new_from_bytes("bg-halftone-rotor.png", HALFTONE) + .map_err(|err| format!("could not decode the embedded halftone texture: {err:?}"))?; + let code_cards = props.code_annotations.iter().map(|a| CodeCard::new(a, palette, config, size)).collect(); + Ok(Self { + timeline: Timeline { content: timing::content_frames(clips::longest(&clips), props.speed) }, + title: TitleLayout::new(&props.title, &props.subtitle, size.0), + props, + clips, + palette, + config, + size, + halftone, + code_cards, + }) + } + + pub fn props(&self) -> &ShowcaseProps { + &self.props + } + + pub fn clips(&self) -> &[Clip] { + &self.clips + } + + pub fn timeline(&self) -> Timeline { + self.timeline + } + + fn background<'a>(&self, id: &str, frame: usize, total: usize) -> Svgr<'a> { + scenery::background(id, self.palette, self.config, &self.halftone, self.size, frame, total) + } + + /// Title, content and outro with their transitions at global `frame.index`. + fn series<'a>(&'a self, frame: &Frame, ctx: &FFramesContext<'_, '_>) -> Svgr<'a> { + let f = frame.index; + let (content_start, outro_start) = (self.timeline.content_start(), self.timeline.outro_start()); + let transition = Transition { style: self.props.transition_style, warm: self.palette.warm, size: self.size }; + let progress = |since: usize| since as f32 / TRANSITION_FRAMES as f32; + let mut scenes = Vec::with_capacity(2); + if f < TITLE_FRAMES { + let props = &self.props; + let card = TitleCard { + layout: &self.title, + title: &props.title, + subtitle: &props.subtitle, + speed_note: &props.speed_note, + palette: self.palette, + size: self.size, + }; + let title = card.draw(f); + scenes.push(match f.checked_sub(content_start) { + Some(since) => transition.present(Direction::Exiting, progress(since), title), + None => title, + }); + } + if (content_start..outro_start + TRANSITION_FRAMES).contains(&f) { + let local = f - content_start; + let content = self.content(local, frame, ctx); + scenes.push(if local < TRANSITION_FRAMES { + transition.present(Direction::Entering, progress(local), content) + } else if f >= outro_start { + transition.present(Direction::Exiting, progress(f - outro_start), content) + } else { + content + }); + } + if let Some(local) = f.checked_sub(outro_start) { + let outro = outro::draw(self.palette, self.size, local); + scenes.push(if local < TRANSITION_FRAMES { + transition.present(Direction::Entering, progress(local), outro) + } else { + outro + }); + } + scenes.into_iter().collect() + } + + /// The content segment at `local` frames into it. The clips and every overlay start one + /// transition in, so overlay times are seconds from the first clip frame. + fn content<'a>(&'a self, local: usize, frame: &Frame, ctx: &FFramesContext<'_, '_>) -> Svgr<'a> { + let sequence = self.timeline.content_sequence(); + let background = self.background("content-bg", local, sequence); + let Some(clock) = local.checked_sub(TRANSITION_FRAMES) else { + return background; + }; + let props = &self.props; + let stage = Stage { + palette: self.palette, + config: self.config, + size: self.size, + layout: props.layout, + clips: &self.clips, + labels: &props.labels, + window_title: &props.window_title, + speed: props.speed, + object_fit: props.object_fit, + effects: &props.effects, + }; + let backdrop: Svgr = + [background, stage.layout(clock, frame, ctx), stage.spotlights(clock)].into_iter().collect(); + let overlays = Overlays { palette: self.palette, config: self.config, size: self.size, backdrop: &backdrop }; + let sweeps = + if props.sections.len() > 1 { overlays.section_sweeps(&props.sections, clock) } else { Svgr::empty() }; + let drawn = svgr!( + + {overlays.callouts(&props.effects, clock)} + {sweeps} + {overlays.section_headers(&props.sections, clock, sequence - TRANSITION_FRAMES)} + {overlays.keystrokes(&props.keys, clock)} + {overlays.code_cards(&self.code_cards, clock)} + + ); + [backdrop, drawn].into_iter().collect() + } +} + +impl Video for Showcase { + const FPS: usize = timing::FPS; + // Nominal: `render` rasterises every frame at the props size, whatever these say. + const WIDTH: usize = 1920; + const HEIGHT: usize = 1080; + + fn duration(&self) -> Duration<'_> { + Duration::Frames(self.timeline.total()) + } + + fn audio(&self) -> AudioMap<'_> { + AudioMap::none() + } + + fn render_frame<'a>(&'a self, frame: Frame, ctx: &FFramesContext<'a, '_>) -> Svgr<'a> { + let f = frame.index; + let (w, h) = self.size; + let treatment = self.props.fidelity.treatment(); + let watermark = if self.props.preset.is_factory() { scenery::watermark(self.size, f) } else { Svgr::empty() }; + svgr!( + + {self.background("bg", f, self.timeline.total())} + {scenery::particles(self.palette.accent, self.size, f)} + {self.series(&frame, ctx)} + {watermark} + {scenery::noise(self.size, treatment.noise_opacity)} + {scenery::grade(self.palette, self.size, treatment.grade_intensity)} + + ) + } +} diff --git a/plugins/droid-control/fframes/src/stage.rs b/plugins/droid-control/fframes/src/stage.rs new file mode 100644 index 0000000..f49233b --- /dev/null +++ b/plugins/droid-control/fframes/src/stage.rs @@ -0,0 +1,122 @@ +//! Clip staging: every input gets a distinct `clip-` name inside the render's work +//! directory (fframes keys decoders by file name), and asciinema casts become MP4s on their +//! own timeline. + +use crate::theme::Encoding; +use serde::Deserialize; +use std::fs; +use std::io::{BufRead, BufReader}; +use std::path::{Path, PathBuf}; +use std::process::Command; + +/// The Droid CLI terminal palette for agg. +const DROID_CLI_THEME: &str = "181818,e0d0c0,15161e,f7768e,9ece6a,e0af68,7aa2f7,bb9af7,7dcfff,a9b1d6,414868,f7768e,9ece6a,e0af68,7aa2f7,bb9af7,7dcfff,c0caf5"; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Kind { + Cast, + Video, +} + +/// The clip kind by extension; anything else (stills included) is refused. +pub fn kind(clip: &Path) -> Result { + match clip.extension().and_then(|ext| ext.to_str()) { + Some("cast") => Ok(Kind::Cast), + Some("mp4" | "webm") => Ok(Kind::Video), + _ => Err(format!( + "unsupported clip type: {} (clips are .cast, .mp4, or .webm; stills belong in the screenshot artifact path)", + clip.display() + )), + } +} + +/// Links (or converts) every clip into `work_dir` and returns the staged paths in order. +pub fn stage(clips: &[PathBuf], work_dir: &Path, encoding: &Encoding) -> Result, String> { + clips + .iter() + .enumerate() + .map(|(index, clip)| match kind(clip)? { + Kind::Cast => { + let staged = work_dir.join(format!("clip-{index}.mp4")); + convert_cast(clip, &staged, encoding)?; + Ok(staged) + } + Kind::Video => { + let ext = clip.extension().and_then(|ext| ext.to_str()).unwrap_or_default(); + let staged = work_dir.join(format!("clip-{index}.{ext}")); + let source = + fs::canonicalize(clip).map_err(|err| format!("clip is not readable: {}: {err}", clip.display()))?; + std::os::unix::fs::symlink(&source, &staged) + .map_err(|err| format!("could not stage {}: {err}", clip.display()))?; + Ok(staged) + } + }) + .collect() +} + +#[derive(Deserialize)] +struct CastHeader { + #[serde(default = "default_cols")] + width: u32, + #[serde(default = "default_rows")] + height: u32, +} + +fn default_cols() -> u32 { + 120 +} + +fn default_rows() -> u32 { + 36 +} + +fn run(command: &mut Command, what: &str) -> Result<(), String> { + let output = command.output().map_err(|err| format!("could not run {what}: {err}"))?; + if output.status.success() { + return Ok(()); + } + Err(format!("{what} failed ({}): {}", output.status, String::from_utf8_lossy(&output.stderr).trim())) +} + +/// agg renders the cast at its own pace (no idle compression: the composition applies +/// `speed` to every clip alike), then ffmpeg encodes the GIF. +fn convert_cast(cast: &Path, output: &Path, encoding: &Encoding) -> Result<(), String> { + let file = fs::File::open(cast).map_err(|err| format!("clip is not readable: {}: {err}", cast.display()))?; + let mut header = String::new(); + BufReader::new(file).read_line(&mut header).map_err(|err| format!("could not read {}: {err}", cast.display()))?; + let header: CastHeader = + serde_json::from_str(&header).map_err(|err| format!("not an asciinema cast: {}: {err}", cast.display()))?; + let gif = output.with_extension("gif"); + run( + Command::new("agg") + .args(["--speed", "1", "--idle-time-limit", "1000000000", "--renderer", "fontdue"]) + .args(["--cols", &header.width.to_string(), "--rows", &header.height.to_string()]) + .args(["--fps-cap", &encoding.cast_fps_cap.to_string(), "--theme", DROID_CLI_THEME]) + .arg(cast) + .arg(&gif), + "agg", + )?; + run( + Command::new("ffmpeg") + .args(["-v", "error", "-y", "-i"]) + .arg(&gif) + .args(["-movflags", "+faststart", "-pix_fmt", "yuv420p", "-preset", encoding.preset]) + .args(["-crf", &encoding.crf.to_string(), "-vf", "scale=trunc(iw/2)*2:trunc(ih/2)*2"]) + .arg(output), + "ffmpeg", + )?; + fs::remove_file(&gif).map_err(|err| format!("could not remove {}: {err}", gif.display())) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn only_casts_and_videos_are_clips() { + assert_eq!(kind(Path::new("a/demo.cast")), Ok(Kind::Cast)); + assert_eq!(kind(Path::new("demo.webm")), Ok(Kind::Video)); + let refused = kind(Path::new("proof.png")).unwrap_err(); + assert!(refused.starts_with("unsupported clip type: proof.png"), "{refused}"); + } +} diff --git a/plugins/droid-control/fframes/src/svg.rs b/plugins/droid-control/fframes/src/svg.rs new file mode 100644 index 0000000..7bc6696 --- /dev/null +++ b/plugins/droid-control/fframes/src/svg.rs @@ -0,0 +1,440 @@ +//! SVG building blocks shared by the layers: geometry, colours, blur filters and the +//! rounded "card" every overlay is drawn as. + +use crate::fonts::Font; +use fframes::{Svgr, svgr}; +use std::fmt; + +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Rect { + pub x: f32, + pub y: f32, + pub w: f32, + pub h: f32, +} + +impl Rect { + pub const fn new(x: f32, y: f32, w: f32, h: f32) -> Self { + Self { x, y, w, h } + } + + pub fn cx(&self) -> f32 { + self.x + self.w / 2. + } + + pub fn cy(&self) -> f32 { + self.y + self.h / 2. + } + + pub fn right(&self) -> f32 { + self.x + self.w + } + + pub fn bottom(&self) -> f32 { + self.y + self.h + } + + pub fn outset(&self, by: f32) -> Rect { + Rect::new(self.x - by, self.y - by, self.w + 2. * by, self.h + 2. * by) + } + + pub fn offset(&self, dx: f32, dy: f32) -> Rect { + Rect::new(self.x + dx, self.y + dy, self.w, self.h) + } +} + +/// A CSS colour with straight alpha. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Rgba(pub u8, pub u8, pub u8, pub f32); + +impl Rgba { + pub const WHITE: Rgba = Rgba(255, 255, 255, 1.); + pub const BLACK: Rgba = Rgba(0, 0, 0, 1.); + + /// `#rrggbb`. + pub fn hex(hex: &str) -> Rgba { + let channel = |i: usize| u8::from_str_radix(&hex[i..i + 2], 16).expect("palette colours are #rrggbb"); + Rgba(channel(1), channel(3), channel(5), 1.) + } + + pub fn alpha(self, alpha: f32) -> Rgba { + Rgba(self.0, self.1, self.2, alpha) + } + + /// The alpha of an 8-digit CSS hex suffix, e.g. `#181818E6` is `hex("#181818").a8(0xE6)`. + pub fn a8(self, alpha: u8) -> Rgba { + self.alpha(f32::from(alpha) / 255.) + } + + pub fn rgb(&self) -> String { + format!("rgb({},{},{})", self.0, self.1, self.2) + } +} + +impl fmt::Display for Rgba { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "rgba({},{},{},{})", self.0, self.1, self.2, self.3) + } +} + +/// A uniform scale followed by a translation, `p -> s * p + (dx, dy)`: every overlay +/// transform (CSS `translate` and `scale` around a `transform-origin`) has this shape. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Similarity { + pub s: f32, + pub dx: f32, + pub dy: f32, +} + +impl Similarity { + pub const IDENTITY: Similarity = Similarity { s: 1., dx: 0., dy: 0. }; + + pub fn translate(dx: f32, dy: f32) -> Self { + Self { s: 1., dx, dy } + } + + /// CSS `scale(s)` around (`cx`, `cy`). + pub fn scale_about(s: f32, cx: f32, cy: f32) -> Self { + Self { s, dx: cx - s * cx, dy: cy - s * cy } + } + + /// `self` followed by `outer`. + pub fn then(self, outer: Similarity) -> Self { + Self { s: self.s * outer.s, dx: self.dx * outer.s + outer.dx, dy: self.dy * outer.s + outer.dy } + } + + pub fn inverse(self) -> Self { + Self { s: 1. / self.s, dx: -self.dx / self.s, dy: -self.dy / self.s } + } + + pub fn apply(self, r: Rect) -> Rect { + Rect::new(r.x * self.s + self.dx, r.y * self.s + self.dy, r.w * self.s, r.h * self.s) + } + + pub fn attr(self) -> String { + format!("matrix({} 0 0 {} {} {})", self.s, self.s, self.dx, self.dy) + } +} + +/// `` with `opacity`, skipping the group entirely once it is invisible. +pub fn faded<'a>(opacity: f32, content: Svgr<'a>) -> Svgr<'a> { + if opacity <= 0. { + return Svgr::empty(); + } + svgr!({content}) +} + +/// `` composited with a CSS `mix-blend-mode` (only accepted through `style`). +pub fn blended<'a>(mode: &str, opacity: f32, content: Svgr<'a>) -> Svgr<'a> { + if opacity <= 0. { + return Svgr::empty(); + } + svgr!({content}) +} + +/// The Factory rotor mark, `ROTOR_VIEWBOX` units wide and tall. +pub const ROTOR_PATH: &str = "M396.406 180.565C395.606 180.367 394.858 179.997 394.213 179.483C393.568 178.968 393.041 178.321 392.671 177.585C392.299 176.848 392.092 176.04 392.061 175.216C392.031 174.391 392.179 173.571 392.496 172.809C403.427 146.207 408.25 124.922 400.466 116.012C379.851 92.371 297.179 139.382 270.819 155.303C270.113 155.728 269.324 155.995 268.505 156.086C267.687 156.178 266.858 156.091 266.076 155.833C265.294 155.575 264.576 155.152 263.973 154.591C263.369 154.031 262.894 153.346 262.579 152.586C251.499 126.04 239.85 107.576 228.044 106.775C196.75 104.634 171.526 196.337 164.142 226.226C163.945 227.026 163.577 227.775 163.064 228.419C162.55 229.065 161.903 229.591 161.167 229.962C160.432 230.334 159.625 230.541 158.801 230.571C157.977 230.602 157.157 230.454 156.396 230.137C129.794 219.206 108.499 214.383 99.5981 222.167C75.9574 242.782 122.96 325.454 138.881 351.814C139.307 352.519 139.575 353.308 139.667 354.128C139.759 354.946 139.674 355.776 139.416 356.558C139.158 357.341 138.733 358.059 138.172 358.662C137.61 359.266 136.925 359.74 136.163 360.053C109.626 371.133 91.1623 382.782 90.3522 394.588C88.22 425.882 179.915 451.107 209.813 458.491C210.612 458.69 211.358 459.059 212.001 459.573C212.644 460.087 213.169 460.735 213.538 461.47C213.909 462.205 214.117 463.011 214.146 463.834C214.177 464.656 214.03 465.477 213.714 466.236C202.783 492.838 197.96 514.132 205.744 523.034C226.359 546.675 309.041 499.672 335.4 483.751C336.106 483.325 336.896 483.057 337.715 482.965C338.534 482.872 339.363 482.958 340.145 483.217C340.928 483.475 341.645 483.899 342.249 484.461C342.852 485.022 343.327 485.708 343.641 486.469C354.721 513.006 366.36 531.471 378.175 532.281C409.47 534.413 434.693 442.718 442.068 412.82C442.267 412.02 442.637 411.272 443.152 410.629C443.666 409.985 444.314 409.46 445.051 409.089C445.787 408.719 446.595 408.512 447.419 408.483C448.243 408.453 449.063 408.601 449.824 408.919C476.425 419.85 497.711 424.663 506.621 416.888C530.262 396.273 483.25 313.591 467.329 287.232C466.906 286.526 466.64 285.736 466.55 284.919C466.459 284.1 466.546 283.272 466.804 282.49C467.062 281.708 467.485 280.991 468.045 280.388C468.604 279.785 469.288 279.308 470.047 278.992C496.593 267.912 515.057 256.263 515.858 244.457C517.999 213.162 426.295 187.94 396.406 180.565ZM360.503 150.564C366.518 161.346 335.521 233.191 312.467 283.443C312.082 284.283 311.449 284.985 310.652 285.454C309.856 285.923 308.934 286.138 308.012 286.068C307.09 285.998 306.211 285.647 305.495 285.063C304.778 284.478 304.258 283.689 304.003 282.8C294.692 250.127 284.05 211.739 272.663 179.15C272.216 177.871 272.238 176.474 272.726 175.21C273.214 173.946 274.136 172.897 275.325 172.25C303.761 156.719 352.421 136.095 360.503 150.564ZM224.226 159.456C236.098 162.827 264.981 235.547 284.208 287.382C284.529 288.247 284.577 289.191 284.346 290.085C284.114 290.979 283.615 291.781 282.915 292.383C282.214 292.986 281.346 293.359 280.427 293.453C279.508 293.548 278.583 293.359 277.774 292.912C248.063 276.422 213.416 256.776 182.317 241.785C181.1 241.194 180.131 240.191 179.584 238.953C179.036 237.715 178.946 236.323 179.329 235.025C188.481 203.964 208.277 154.94 224.226 159.456ZM134.151 262.11C144.924 256.095 216.778 287.093 267.02 310.147C267.861 310.532 268.563 311.166 269.032 311.963C269.501 312.759 269.716 313.681 269.646 314.602C269.575 315.524 269.225 316.402 268.64 317.119C268.056 317.835 267.267 318.357 266.378 318.611C233.714 327.922 195.316 338.564 162.727 349.952C161.45 350.396 160.055 350.373 158.793 349.885C157.531 349.397 156.483 348.477 155.837 347.288C140.334 318.852 119.673 270.192 134.151 262.11ZM143.043 398.388C146.405 386.516 219.133 357.632 270.968 338.405C271.834 338.085 272.778 338.037 273.672 338.268C274.567 338.5 275.368 338.999 275.971 339.699C276.572 340.4 276.947 341.268 277.041 342.186C277.135 343.105 276.946 344.031 276.499 344.84C260 374.552 240.353 409.198 225.362 440.287C224.777 441.509 223.774 442.482 222.535 443.031C221.296 443.581 219.902 443.671 218.603 443.286C187.541 434.189 138.518 414.338 143.043 398.388ZM245.698 488.463C239.673 477.69 270.679 405.837 293.733 355.594C294.119 354.753 294.753 354.051 295.549 353.582C296.346 353.113 297.267 352.899 298.189 352.969C299.111 353.038 299.99 353.389 300.706 353.973C301.422 354.558 301.943 355.348 302.197 356.237C311.508 388.9 322.151 427.299 333.538 459.887C333.982 461.166 333.957 462.56 333.468 463.823C332.979 465.085 332.056 466.132 330.866 466.777C302.439 482.28 253.77 502.941 245.726 488.463H245.698ZM381.974 479.57C370.093 476.209 341.21 403.481 321.983 351.646C321.661 350.779 321.612 349.833 321.843 348.937C322.074 348.041 322.575 347.238 323.277 346.635C323.979 346.032 324.85 345.659 325.77 345.566C326.691 345.473 327.618 345.665 328.426 346.115C358.129 362.605 392.784 382.261 423.874 397.252C425.095 397.839 426.065 398.842 426.613 400.081C427.161 401.32 427.249 402.713 426.863 404.012C417.719 435.12 397.924 484.095 381.974 479.57ZM472.049 376.916C461.267 382.94 389.423 351.934 339.171 328.88C338.331 328.494 337.628 327.861 337.159 327.064C336.69 326.268 336.477 325.346 336.547 324.425C336.616 323.503 336.966 322.625 337.551 321.908C338.135 321.191 338.925 320.671 339.814 320.417C372.486 311.106 410.876 300.463 443.464 289.075C444.745 288.631 446.141 288.655 447.405 289.145C448.668 289.635 449.717 290.558 450.364 291.748C465.857 320.175 486.519 368.843 472.049 376.916ZM463.157 240.639C459.787 252.52 387.067 281.404 335.233 300.631C334.365 300.953 333.42 301.002 332.524 300.771C331.628 300.539 330.825 300.039 330.222 299.337C329.619 298.635 329.247 297.764 329.154 296.843C329.06 295.923 329.251 294.996 329.702 294.187C346.192 264.485 365.838 229.829 380.829 198.739C381.418 197.521 382.421 196.551 383.66 196.004C384.898 195.456 386.291 195.366 387.589 195.751C418.65 204.894 467.673 224.689 463.157 240.639Z"; +pub const ROTOR_VIEWBOX: (f32, f32) = (613., 650.); + +/// The rotor mark fitted into a `size`-px square at (`x`, `y`), like `` with the +/// default `xMidYMid meet`. +pub fn rotor<'a>(x: f32, y: f32, size: f32, fill: &'a str) -> Svgr<'a> { + let (vw, vh) = ROTOR_VIEWBOX; + let s = size / vw.max(vh); + let place = Similarity { s, dx: x + (size - vw * s) / 2., dy: y + (size - vh * s) / 2. }; + svgr!() +} + +/// Path data of a rounded rectangle, for even-odd cutouts. +pub fn rounded_rect_d(r: Rect, radius: f32) -> String { + let k = radius.min(r.w / 2.).min(r.h / 2.); + format!( + "M{} {}H{}A{k} {k} 0 0 1 {} {}V{}A{k} {k} 0 0 1 {} {}H{}A{k} {k} 0 0 1 {} {}V{}A{k} {k} 0 0 1 {} {}Z", + r.x + k, + r.y, + r.right() - k, + r.right(), + r.y + k, + r.bottom() - k, + r.right() - k, + r.bottom(), + r.x + k, + r.x, + r.bottom() - k, + r.y + k, + r.x + k, + r.y, + ) +} + +/// A Gaussian blur filter over `region` (user space), padded so the blur is not cut off. +/// `sigma` is the CSS `blur()` value; CSS shadows blur by half their radius. +pub fn blur<'a>(id: String, sigma: f32, region: Rect) -> Svgr<'a> { + let region = region.outset(3. * sigma); + svgr!( + + + + ) +} + +/// A CSS shadow without offset (`text-shadow: 0 0 <2 * sigma>px`): `shape`, already drawn in +/// the shadow colour, blurred over `area`. +pub fn glow<'a>(id: String, sigma: f32, area: Rect, shape: Svgr<'a>) -> Svgr<'a> { + let url = format!("url(#{id})"); + svgr!({blur(id, sigma, area)}{shape}) +} + +/// Gradient stops in CSS terms (offsets may fall outside 0..1); SVG clamps offsets, so the +/// list is resampled at both edges to keep the colours a browser would show. +pub fn stops<'a>(css: &[(f32, Rgba)]) -> Svgr<'a> { + // CSS moves a stop placed before an earlier one up to that earlier position. + let css: Vec<(f32, Rgba)> = css + .iter() + .scan(f32::NEG_INFINITY, |max, &(offset, color)| { + *max = max.max(offset); + Some((*max, color)) + }) + .collect(); + let css = css.as_slice(); + let lerp = |a: Rgba, b: Rgba, t: f32| { + let ch = |x: u8, y: u8| (f32::from(x) + (f32::from(y) - f32::from(x)) * t).round() as u8; + Rgba(ch(a.0, b.0), ch(a.1, b.1), ch(a.2, b.2), a.3 + (b.3 - a.3) * t) + }; + let at = |offset: f32| { + let next = css.iter().position(|(o, _)| *o >= offset).unwrap_or(css.len() - 1); + if next == 0 { + return css[0].1; + } + let ((o0, c0), (o1, c1)) = (css[next - 1], css[next]); + if o1 <= o0 { c1 } else { lerp(c0, c1, ((offset - o0) / (o1 - o0)).clamp(0., 1.)) } + }; + let mut resolved = vec![(0., at(0.))]; + resolved.extend(css.iter().copied().filter(|(o, _)| *o > 0. && *o < 1.)); + resolved.push((1., at(1.))); + resolved + .into_iter() + .map(|(offset, color)| svgr!()) + .collect() +} + +/// A CSS `box-shadow` (no spread): offset, blur radius and colour. +#[derive(Debug, Clone, Copy)] +pub struct Shadow { + pub dy: f32, + pub blur: f32, + pub color: Rgba, +} + +impl Shadow { + pub const fn new(dy: f32, blur: f32, color: Rgba) -> Self { + Self { dy, blur, color } + } + + pub fn draw<'a>(&self, id: String, rect: Rect, radius: f32) -> Svgr<'a> { + let shape = rect.offset(0., self.dy); + let filter = format!("url(#{id})"); + svgr!( + + {blur(id, self.blur / 2., shape)} + + + ) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Edge { + Left, + Bottom, +} + +/// A CSS `backdrop-filter: blur()`: the scene behind an element, blurred and shown through it. +#[derive(Clone, Copy)] +pub struct Frost<'s, 'a> { + pub scene: &'s Svgr<'a>, + pub sigma: f32, +} + +impl<'a> Frost<'_, 'a> { + /// The blurred scene over `area`, in the coordinates of a box placed by `to_screen`. + pub fn draw(&self, id: &str, area: Rect, to_screen: Similarity) -> Svgr<'a> { + let filter = format!("{id}-frost"); + let url = format!("url(#{filter})"); + svgr!( + + {blur(filter, self.sigma, to_screen.apply(area))} + {self.scene.clone()} + + ) + } +} + +/// A rounded box with a 1px border, optionally one thicker accent edge, shadows and a frosted +/// backdrop: the shape of the window and of every overlay pill and panel. +pub struct Card<'s, 'a> { + pub id: &'s str, + pub rect: Rect, + pub radius: f32, + pub fill: Rgba, + pub border: Rgba, + pub accent: Option<(Edge, f32, Rgba)>, + /// CSS order: the first shadow is drawn on top. + pub shadows: &'s [Shadow], + pub frost: Option>, + /// Where the card is drawn on screen, for the frosted backdrop. + pub to_screen: Similarity, +} + +impl<'a> Card<'_, 'a> { + pub fn draw(&self, content: Svgr<'a>) -> Svgr<'a> { + let Card { id, rect: r, radius, fill, border, accent, shadows, frost, to_screen } = self; + let clip_id = format!("{id}-clip"); + let clip = format!("url(#{clip_id})"); + let shadows = if shadows.is_empty() { + Svgr::empty() + } else { + // A CSS box-shadow is only painted outside the box. + let reach = shadows.iter().map(|s| s.dy.abs() + 1.5 * s.blur).fold(0., f32::max); + let outer = r.outset(reach); + let outside_id = format!("{id}-outside"); + let outside = format!("url(#{outside_id})"); + let d = format!( + "M{} {}H{}V{}H{}Z{}", + outer.x, + outer.y, + outer.right(), + outer.bottom(), + outer.x, + rounded_rect_d(*r, *radius) + ); + let drawn: Svgr = shadows + .iter() + .enumerate() + .rev() + .map(|(i, shadow)| shadow.draw(format!("{id}-shadow{i}"), *r, *radius)) + .collect(); + svgr!( + + + + + {drawn} + + ) + }; + let frost = frost.map_or_else(Svgr::empty, |frost| frost.draw(id, *r, *to_screen)); + let accent = match accent { + Some((Edge::Left, width, color)) => { + svgr!() + } + Some((Edge::Bottom, width, color)) => { + svgr!() + } + None => Svgr::empty(), + }; + svgr!( + + {shadows} + + + + + {frost} + + {content} + + {accent} + + + ) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Anchor { + Start, + Middle, + End, +} + +impl Anchor { + fn attr(self) -> &'static str { + match self { + Anchor::Start => "start", + Anchor::Middle => "middle", + Anchor::End => "end", + } + } +} + +/// A font at a size with CSS `letter-spacing` in em. +#[derive(Debug, Clone, Copy)] +pub struct TextStyle { + pub font: Font, + pub size: f32, + pub letter_spacing: f32, +} + +impl TextStyle { + pub const fn new(font: Font, size: f32) -> Self { + Self { font, size, letter_spacing: 0. } + } + + pub const fn spaced(self, letter_spacing: f32) -> Self { + Self { letter_spacing, ..self } + } + + pub fn width(&self, text: &str) -> f32 { + self.font.width(text, self.size, self.letter_spacing) + } + + pub fn normal_line_height(&self) -> f32 { + self.font.normal_line_height(self.size) + } + + /// Baseline of a line box starting at `top`. + pub fn baseline(&self, top: f32, line_height: f32) -> f32 { + top + self.font.baseline(self.size, line_height) + } + + pub fn draw<'a>(&self, content: String, x: f32, baseline: f32, fill: Rgba, anchor: Anchor) -> Svgr<'a> { + // CSS letter-spacing trails the last glyph too, which shifts centred text left. + let x = match anchor { + Anchor::Start => x, + Anchor::Middle => x - self.letter_spacing * self.size / 2., + Anchor::End => x - self.letter_spacing * self.size, + }; + svgr!( + + {content} + + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hex_colours_take_css_alpha_suffixes() { + assert_eq!(Rgba::hex("#EE6018").a8(0x80), Rgba(238, 96, 24, 128. / 255.)); + assert_eq!(Rgba::hex("#181818").alpha(0.5).to_string(), "rgba(24,24,24,0.5)"); + } + + #[test] + fn similarity_composes_and_inverts() { + let place = Similarity::scale_about(2., 10., 10.).then(Similarity::translate(5., 0.)); + let r = place.apply(Rect::new(10., 10., 4., 4.)); + assert_eq!(r, Rect::new(15., 10., 8., 8.)); + assert_eq!(place.inverse().apply(r), Rect::new(10., 10., 4., 4.)); + } + + #[test] + fn rounded_rect_radius_is_capped_by_the_short_side() { + let d = rounded_rect_d(Rect::new(0., 0., 10., 4.), 8.); + assert!(d.starts_with("M2 0H8A2 2"), "{d}"); + } +} diff --git a/plugins/droid-control/fframes/src/theme.rs b/plugins/droid-control/fframes/src/theme.rs new file mode 100644 index 0000000..d44efa8 --- /dev/null +++ b/plugins/droid-control/fframes/src/theme.rs @@ -0,0 +1,133 @@ +//! Palettes, window presets and fidelity treatments. + +use crate::props::{Fidelity, Preset}; + +#[derive(Debug)] +pub struct Palette { + pub bg: &'static str, + pub surface: &'static str, + pub accent: &'static str, + pub border: &'static str, + pub text: &'static str, + pub muted: &'static str, + /// The Factory palette carries a warm treatment throughout (glows, grade, shadows). + pub warm: bool, +} + +const FACTORY: Palette = Palette { + bg: "#0a0804", + surface: "#181818", + accent: "#EE6018", + border: "#342F2D", + text: "#f0e8e0", + muted: "#948781", + warm: true, +}; + +const CATPPUCCIN: Palette = Palette { + bg: "#0d1117", + surface: "#181818", + accent: "#89b4fa", + border: "#313244", + text: "#cdd6f4", + muted: "#6c7086", + warm: false, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Bar { + Colorful, + Rings, + None, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BarSide { + Left, + Right, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BgStyle { + Solid, + Gradient, +} + +#[derive(Debug)] +pub struct PresetConfig { + pub bar: Bar, + pub bar_side: BarSide, + pub radius: f32, + pub padding: f32, + pub margin: f32, + pub shadow: bool, + pub bg_style: BgStyle, +} + +const fn preset(radius: f32, padding: f32, margin: f32, shadow: bool, bg_style: BgStyle) -> PresetConfig { + PresetConfig { bar: Bar::Colorful, bar_side: BarSide::Left, radius, padding, margin, shadow, bg_style } +} + +const MACOS: PresetConfig = preset(12., 20., 60., true, BgStyle::Solid); +const MINIMAL: PresetConfig = PresetConfig { bar: Bar::None, ..preset(8., 16., 32., false, BgStyle::Solid) }; +const HERO: PresetConfig = preset(16., 24., 80., true, BgStyle::Gradient); +const PRESENTATION: PresetConfig = preset(12., 24., 48., true, BgStyle::Solid); +const FACTORY_PRESET: PresetConfig = preset(12., 20., 80., true, BgStyle::Solid); +const FACTORY_HERO: PresetConfig = preset(12., 24., 80., true, BgStyle::Gradient); + +impl Preset { + pub fn palette(self) -> &'static Palette { + match self { + Preset::Factory | Preset::FactoryHero => &FACTORY, + _ => &CATPPUCCIN, + } + } + + pub fn config(self) -> &'static PresetConfig { + match self { + Preset::Macos => &MACOS, + Preset::Minimal => &MINIMAL, + Preset::Hero => &HERO, + Preset::Presentation => &PRESENTATION, + Preset::Factory => &FACTORY_PRESET, + Preset::FactoryHero => &FACTORY_HERO, + } + } + + pub fn is_factory(self) -> bool { + matches!(self, Preset::Factory | Preset::FactoryHero) + } +} + +/// Film grain and colour grade strength: lighter where detail must stay readable. +pub struct Treatment { + pub noise_opacity: f32, + pub grade_intensity: f32, +} + +impl Fidelity { + pub fn treatment(self) -> Treatment { + match self { + Fidelity::Compact => Treatment { noise_opacity: 0.03, grade_intensity: 0.04 }, + Fidelity::Standard => Treatment { noise_opacity: 0.02, grade_intensity: 0.025 }, + Fidelity::Inspect => Treatment { noise_opacity: 0.008, grade_intensity: 0.012 }, + } + } +} + +/// x264 settings of the final encode and of `.cast` conversions, and agg's frame-rate cap. +pub struct Encoding { + pub crf: u8, + pub preset: &'static str, + pub cast_fps_cap: u8, +} + +impl Fidelity { + pub fn encoding(self) -> Encoding { + match self { + Fidelity::Compact => Encoding { crf: 21, preset: "medium", cast_fps_cap: 24 }, + Fidelity::Standard => Encoding { crf: 18, preset: "slow", cast_fps_cap: 30 }, + Fidelity::Inspect => Encoding { crf: 14, preset: "slow", cast_fps_cap: 30 }, + } + } +} diff --git a/plugins/droid-control/fframes/src/timing.rs b/plugins/droid-control/fframes/src/timing.rs new file mode 100644 index 0000000..4245905 --- /dev/null +++ b/plugins/droid-control/fframes/src/timing.rs @@ -0,0 +1,89 @@ +//! The showcase timeline: title card, clip content, outro, joined by two transitions. + +pub const FPS: usize = 30; +pub const TITLE_FRAMES: usize = 4 * FPS; +/// 3.5 s. +pub const OUTRO_FRAMES: usize = 7 * FPS / 2; +pub const TRANSITION_FRAMES: usize = 15; + +/// Frames during which the clips actually play: the longest source clip (in source seconds) +/// at `speed`. A video without clips holds its empty content for 10 s. +pub fn content_frames(longest_clip: Option, speed: f64) -> usize { + ((longest_clip.unwrap_or(10.) / speed) * FPS as f64).ceil() as usize +} + +/// Frame ranges of the three segments. The content segment pads the clips with one +/// transition on each side: the title crossfade precedes playback, and the outro crossfade +/// begins after the frame-rounded playback interval and shows held frames. Both transitions +/// overlap that padding, so the total is simply title + clips + outro. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Timeline { + pub content: usize, +} + +impl Timeline { + pub fn content_sequence(&self) -> usize { + self.content + 2 * TRANSITION_FRAMES + } + + pub fn content_start(&self) -> usize { + TITLE_FRAMES - TRANSITION_FRAMES + } + + /// The first clip frame: playback starts once the title crossfade is over. + pub fn clips_start(&self) -> usize { + TITLE_FRAMES + } + + pub fn outro_start(&self) -> usize { + TITLE_FRAMES + self.content + } + + pub fn total(&self) -> usize { + TITLE_FRAMES + self.content + OUTRO_FRAMES + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn content_frames_are_the_longest_source_divided_by_speed() { + assert_eq!(content_frames(Some(5.), 2.), 75); + } + + #[test] + fn content_frames_round_up_partial_frames() { + assert_eq!(content_frames(Some(5.01), 3.), 51); + } + + #[test] + fn videos_without_clips_hold_10s_of_content() { + assert_eq!(content_frames(None, 1.), 300); + } + + #[test] + fn content_sequence_pads_the_clips_by_one_transition_on_each_side() { + let timeline = Timeline { content: content_frames(Some(5.), 2.) }; + assert_eq!(timeline.content_sequence(), 75 + 2 * TRANSITION_FRAMES); + } + + #[test] + fn content_shorter_than_a_transition_still_outlasts_both_transitions() { + let timeline = Timeline { content: content_frames(Some(5.), 20.) }; + assert_eq!(timeline.content, 8); + assert!(timeline.content_sequence() > 2 * TRANSITION_FRAMES); + assert_eq!(timeline.total(), 120 + 8 + 105); + } + + #[test] + fn segments_overlap_by_one_transition_and_total_title_clips_outro() { + let timeline = Timeline { content: content_frames(Some(5.), 2.) }; + let sequence_total = TITLE_FRAMES + timeline.content_sequence() + OUTRO_FRAMES - 2 * TRANSITION_FRAMES; + assert_eq!(timeline.total(), sequence_total); + assert_eq!(timeline.total(), 300); + assert_eq!(timeline.content_start() + TRANSITION_FRAMES, timeline.clips_start()); + assert_eq!(timeline.content_start() + timeline.content_sequence() - TRANSITION_FRAMES, timeline.outro_start()); + } +} diff --git a/plugins/droid-control/fframes/src/title.rs b/plugins/droid-control/fframes/src/title.rs new file mode 100644 index 0000000..3319e48 --- /dev/null +++ b/plugins/droid-control/fframes/src/title.rs @@ -0,0 +1,189 @@ +//! The opening title card: tagline, title and subtitle rise in while the rotor sweeps an +//! accent line under the title (a gradient sweep for cool palettes), all inside a slow +//! breathing zoom. + +use crate::fonts::Font; +use crate::motion::{Bezier, interpolate, interpolate_eased}; +use crate::svg::{Anchor, Rect, Rgba, Similarity, TextStyle, faded, glow, rotor, stops}; +use crate::theme::Palette; +use crate::timing::TITLE_FRAMES; +use fframes::{Svgr, svgr}; + +const TITLE_MAX_SIZE: f32 = 64.; +const SUBTITLE_MAX_SIZE: f32 = 24.; +const SWEEP_WIDTH: f32 = 280.; +const ROTOR_SIZE: f32 = 28.; + +/// Title and subtitle sizes, fitted once to 80% and 70% of the width. +#[derive(Debug, Clone, Copy)] +pub struct TitleLayout { + title: TextStyle, + subtitle: TextStyle, +} + +fn fit(text: &str, style: TextStyle, within: f32, max: f32) -> TextStyle { + let at_100 = TextStyle { size: 100., ..style }.width(text); + let size = if at_100 > 0. { (within * 100. / at_100).min(max) } else { max }; + TextStyle { size, ..style } +} + +impl TitleLayout { + pub fn new(title: &str, subtitle: &str, width: f32) -> Self { + let subtitle = if subtitle.is_empty() { " " } else { subtitle }; + Self { + title: fit(title, TextStyle::new(Font::sans(700), 0.).spaced(-0.04), width * 0.8, TITLE_MAX_SIZE), + subtitle: fit(subtitle, TextStyle::new(Font::sans(400), 0.), width * 0.7, SUBTITLE_MAX_SIZE), + } + } +} + +pub struct TitleCard<'s> { + pub layout: &'s TitleLayout, + pub title: &'s str, + pub subtitle: &'s str, + pub speed_note: &'s str, + pub palette: &'s Palette, + pub size: (f32, f32), +} + +impl TitleCard<'_> { + pub fn draw<'a>(&self, frame: usize) -> Svgr<'a> { + let TitleCard { layout, title, subtitle, speed_note, palette, size: (w, h) } = *self; + let f = frame as f32; + let expo = || Bezier::EXPO_OUT.f(); + let tagline = interpolate_eased(f, &[0., 12.], &[0., 1.], expo()); + let entrance = interpolate_eased(f, &[0., 18.], &[0., 1.], expo()); + let rise = interpolate_eased(f, &[4.5, 22.5], &[0., 1.], expo()); + + let note_style = TextStyle::new(Font::mono(400), 14.).spaced(0.08); + let note = speed_note.to_uppercase(); + let note_height = if note.is_empty() { 0. } else { note_style.normal_line_height() + 16. }; + let title_height = layout.title.normal_line_height(); + let accent_height = if palette.warm { 16. + ROTOR_SIZE + 8. + 16. } else { 20. + 2. + 20. }; + let subtitle_height = if subtitle.is_empty() { 0. } else { layout.subtitle.normal_line_height() }; + let top = (h - note_height - title_height - accent_height - subtitle_height) / 2.; + let title_top = top + note_height; + let accent_top = title_top + title_height; + let subtitle_top = accent_top + accent_height; + let cx = w / 2.; + + let note = if note.is_empty() { + Svgr::empty() + } else { + let text = note_style.draw( + note, + cx, + note_style.baseline(top, note_style.normal_line_height()), + Rgba::hex(palette.muted), + Anchor::Middle, + ); + faded(tagline, svgr!({text})) + }; + + let accent = Rgba::hex(palette.accent); + let title_baseline = layout.title.baseline(title_top, title_height); + let title_text = |fill: Rgba| layout.title.draw(title.to_owned(), cx, title_baseline, fill, Anchor::Middle); + let title_area = + Rect::new(cx - layout.title.width(title) / 2., title_top, layout.title.width(title), title_height); + let place_title = Similarity::scale_about(1.08 - 0.08 * entrance, cx, title_top + title_height / 2.) + .then(Similarity::translate(0., 30. * (1. - entrance))); + let title = faded( + entrance, + svgr!( + + {glow("title-glow-far".to_owned(), 20., title_area, title_text(accent.a8(0x1a)))} + {glow("title-glow-near".to_owned(), 10., title_area, title_text(accent.a8(0x4d)))} + {title_text(Rgba::hex(palette.text))} + + ), + ); + + let accent_line = if palette.warm { + self.rotor_sweep(f, cx - SWEEP_WIDTH / 2., accent_top + 16. + (ROTOR_SIZE + 8.) / 2.) + } else { + Self::gradient_sweep(f, palette, cx, accent_top + 20.) + }; + + let subtitle = if subtitle.is_empty() { + Svgr::empty() + } else { + let baseline = layout.subtitle.baseline(subtitle_top, subtitle_height); + let text = + layout.subtitle.draw(subtitle.to_owned(), cx, baseline, Rgba::hex(palette.muted), Anchor::Middle); + faded(rise, svgr!({text})) + }; + + let breathing = 1. + 0.04 * Bezier(0.45, 0., 0.55, 1.).ease(f / TITLE_FRAMES as f32); + svgr!( + + {note} + {title} + {accent_line} + {subtitle} + + ) + } + + /// The spinning rotor rolls right while a gradient trail grows behind it. + fn rotor_sweep<'a>(&self, f: f32, left: f32, cy: f32) -> Svgr<'a> { + let (start, end) = (4.5, 21.); + let progress = interpolate_eased(f, &[start, end], &[0., 1.], Bezier::EXPO_OUT.f()); + let x = progress * SWEEP_WIDTH; + let rotor_opacity = interpolate(f, &[start, start + 2.4, end, end + 7.5], &[0., 1., 1., 0.]); + let trail_opacity = interpolate(f, &[start, start + 3.], &[0., 1.]); + let accent = Rgba::hex(self.palette.accent); + + let trail = if x > 0. { + faded( + trail_opacity, + svgr!( + + + {stops(&[(0., accent.alpha(0.)), (0.3, accent.a8(0x66)), (1., accent)])} + + + + ), + ) + } else { + Svgr::empty() + }; + + let (rx, ry) = (left + x - ROTOR_SIZE / 2., cy - ROTOR_SIZE / 2.); + let region = Rect::new(rx, ry, ROTOR_SIZE, ROTOR_SIZE).outset(12.); + let spin = format!("rotate({} {} {})", 720. * progress, left + x, cy); + let rotor = faded( + rotor_opacity, + svgr!( + + + + + {rotor(rx, ry, ROTOR_SIZE, "white")} + + ), + ); + svgr!({trail}{rotor}) + } + + /// A short accent line widens while a highlight sweeps through it. + fn gradient_sweep<'a>(f: f32, palette: &Palette, cx: f32, top: f32) -> Svgr<'a> { + let width = interpolate_eased(f, &[6., 21.], &[0., 120.], Bezier::EXPO_OUT.f()); + if width <= 0. { + return Svgr::empty(); + } + let position = interpolate_eased(f, &[6., 30.], &[-200., 100.], Bezier::EXPO_OUT.f()); + let accent = Rgba::hex(palette.accent); + let left = cx - width / 2.; + // `background-size: 200%` positioned at `position`%, repeating. + let tile = left - width * position / 100.; + svgr!( + + + {stops(&[(0., accent.alpha(0.)), (0.25, accent), (0.5, Rgba::WHITE), (0.75, accent), (1., accent.alpha(0.))])} + + + + ) + } +} diff --git a/plugins/droid-control/fframes/src/transition.rs b/plugins/droid-control/fframes/src/transition.rs new file mode 100644 index 0000000..050c5fb --- /dev/null +++ b/plugins/droid-control/fframes/src/transition.rs @@ -0,0 +1,249 @@ +//! The two scene transitions (title -> content, content -> outro). Each style restyles both +//! the exiting and the entering scene from the same 0..1 progress; the entering scene is +//! drawn on top. +//! +//! Style names follow @hyperframes/shader-transitions (Apache-2.0); the looks are drawn +//! here with SVG filters and blend modes. + +use crate::motion::{Bezier, interpolate, seeded_random}; +use crate::props::TransitionStyle; +use crate::svg::{Rect, Rgba, Similarity, blended, blur, faded, stops}; +use fframes::{Svgr, svgr}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Direction { + Entering, + Exiting, +} + +pub struct Transition { + pub style: TransitionStyle, + pub warm: bool, + pub size: (f32, f32), +} + +impl Transition { + /// `scene` restyled at `progress` (0..1) of the transition. + pub fn present<'a>(&self, direction: Direction, progress: f32, scene: Svgr<'a>) -> Svgr<'a> { + let p = progress; + let entering = direction == Direction::Entering; + let id = if entering { "enter" } else { "exit" }; + match self.style { + TransitionStyle::MotionBlur => { + if entering { + let (w, h) = self.size; + let place = Similarity::scale_about(1.03 - 0.03 * p, w / 2., h / 2.); + faded(p, svgr!({self.blurred(id, 6. * (1. - p), scene)})) + } else { + faded(1. - p, self.blurred(id, 6. * p, scene)) + } + } + TransitionStyle::Flash => { + if entering { + let flash = interpolate(p, &[0., 0.35, 0.55, 0.85, 1.], &[0., 0.25, 1., 0.2, 0.]); + let color = if self.warm { Rgba(255, 220, 180, 1.) } else { Rgba(235, 240, 255, 1.) }; + let (w, h) = self.size; + svgr!( + + {faded(((p - 0.45) / 0.35).clamp(0., 1.), scene)} + {blended("screen", flash, svgr!())} + + ) + } else { + faded((1. - (p - 0.2) / 0.35).clamp(0., 1.), scene) + } + } + TransitionStyle::WhipPan => { + let eased = Bezier(0.6, 0., 0.1, 1.).ease(p); + let (shift, sigma, opacity) = if entering { + ( + 0.3 * (1. - eased), + interpolate(p, &[0., 0.6, 1.], &[14., 4., 0.]), + interpolate(p, &[0., 0.2, 1.], &[0., 1., 1.]), + ) + } else { + ( + -0.3 * eased, + interpolate(p, &[0., 0.4, 1.], &[0., 10., 14.]), + interpolate(p, &[0., 0.8, 1.], &[1., 1., 0.]), + ) + }; + let place = Similarity::translate(shift * self.size.0, 0.); + faded(opacity, svgr!({self.blurred(id, sigma, scene)})) + } + TransitionStyle::LightLeak => { + if entering { + let scene_opacity = interpolate(p, &[0., 0.5, 1.], &[0., 0.4, 1.]); + let sweep = interpolate(p, &[0., 0.3, 0.6, 1.], &[0., 1., 0.6, 0.]); + svgr!({faded(scene_opacity, scene)}{blended("screen", sweep, self.light_leak(p))}) + } else { + faded(interpolate(p, &[0., 0.5, 1.], &[1., 0.6, 0.]), scene) + } + } + TransitionStyle::GlitchLite => self.glitch(entering, p, scene), + } + } + + /// CSS `filter: blur(sigma)` over the whole frame. + fn blurred<'a>(&self, id: &str, sigma: f32, scene: Svgr<'a>) -> Svgr<'a> { + if sigma <= 0.01 { + return scene; + } + let (w, h) = self.size; + let filter = format!("transition-{id}-blur"); + let url = format!("url(#{filter})"); + svgr!({blur(filter, sigma, Rect::new(0., 0., w, h))}{scene}) + } + + /// A warm (or cool) highlight band at 105 degrees, sweeping left to right. + fn light_leak<'a>(&self, p: f32) -> Svgr<'a> { + let (w, h) = self.size; + let leak = if self.warm { Rgba(238, 96, 24, 0.) } else { Rgba(137, 180, 250, 0.) }; + let at = -0.4 + 1.8 * p; + // CSS gradient line for 105deg: through the centre, long enough to reach the corners. + let angle = 105f32.to_radians(); + let (dx, dy) = (angle.sin(), -angle.cos()); + let half = (w * dx.abs() + h * dy.abs()) / 2.; + let (cx, cy) = (w / 2., h / 2.); + svgr!( + + + {stops(&[ + (0., leak), + (at - 0.3, leak), + (at, leak.alpha(0.45)), + (at + 0.12, Rgba(255, 240, 200, 0.35)), + (at + 0.4, leak), + (1., leak), + ])} + + + + ) + } + + /// RGB-split ghosts and a displaced horizontal band around the midpoint. + fn glitch<'a>(&self, entering: bool, p: f32, scene: Svgr<'a>) -> Svgr<'a> { + let (w, h) = self.size; + let scene_opacity = if entering { + interpolate(p, &[0., 0.4, 1.], &[0., 1., 1.]) + } else { + interpolate(p, &[0., 0.6, 1.], &[1., 1., 0.]) + }; + let intensity = interpolate(p, &[0., 0.35, 0.55, 0.75, 1.], &[0., 1., 1., 0.3, 0.]); + let seed = if entering { 1000 } else { 2000 }; + let random = + |name: &str, steps: f32| seeded_random(&format!("glitch-{name}-{}", (p * steps).round() as i32 + seed)); + let jitter = (random("x", 60.) - 0.5) * 16. * intensity; + let split = 6. * intensity; + let band_top = 20. + 40. * random("band-top", 30.); + let band_height = 6. + 14. * random("band-h", 30.); + let id = if entering { "enter" } else { "exit" }; + let shifted = + |dx: f32, content: Svgr<'a>| svgr!({content}); + + let ghost = |name: &str, hue: f32, dx: f32| { + if split <= 0. { + return Svgr::empty(); + } + let filter = format!("glitch-{id}-{name}"); + let url = format!("url(#{filter})"); + let tint = tint_matrix(hue); + blended( + "screen", + 0.45, + shifted( + dx, + svgr!( + + + + + + + + {scene.clone()} + + ), + ), + ) + }; + let band = if intensity > 0.6 { + let clip = format!("glitch-{id}-band"); + let url = format!("url(#{clip})"); + faded( + 0.85, + shifted( + jitter * 2.2, + svgr!( + + + + + {scene.clone()} + + ), + ), + ) + } else { + Svgr::empty() + }; + faded( + scene_opacity, + svgr!( + + {ghost("red", -50., jitter - split)} + {ghost("blue", 180., jitter + split)} + {shifted(jitter, scene.clone())} + {band} + + ), + ) + } +} + +/// `sepia(1) saturate(6) hue-rotate(hue) contrast(1.1)` as four colour matrices, applied in +/// turn so every step clamps like the CSS filter chain. +fn tint_matrix(hue: f32) -> [String; 4] { + let (sin, cos) = hue.to_radians().sin_cos(); + let s = 6.; + let rows = |m: [[f32; 3]; 3], offset: f32| { + m.iter() + .map(|row| format!("{} {} {} 0 {offset}", row[0], row[1], row[2])) + .chain(["0 0 0 1 0".to_owned()]) + .collect::>() + .join(" ") + }; + [ + rows([[0.393, 0.769, 0.189], [0.349, 0.686, 0.168], [0.272, 0.534, 0.131]], 0.), + rows( + [ + [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s], + [0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s], + [0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s], + ], + 0., + ), + rows( + [ + [ + 0.213 + cos * 0.787 - sin * 0.213, + 0.715 - cos * 0.715 - sin * 0.715, + 0.072 - cos * 0.072 + sin * 0.928, + ], + [ + 0.213 - cos * 0.213 + sin * 0.143, + 0.715 + cos * 0.285 + sin * 0.140, + 0.072 - cos * 0.072 - sin * 0.283, + ], + [ + 0.213 - cos * 0.213 - sin * 0.787, + 0.715 - cos * 0.715 + sin * 0.715, + 0.072 + cos * 0.928 + sin * 0.072, + ], + ], + 0., + ), + rows([[1.1, 0., 0.], [0., 1.1, 0.], [0., 0., 1.1]], -0.05), + ] +} diff --git a/plugins/droid-control/remotion/package-lock.json b/plugins/droid-control/remotion/package-lock.json deleted file mode 100644 index acb1704..0000000 --- a/plugins/droid-control/remotion/package-lock.json +++ /dev/null @@ -1,5526 +0,0 @@ -{ - "name": "droid-control-remotion", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "droid-control-remotion", - "version": "1.0.0", - "dependencies": { - "@remotion/cli": "4.0.445", - "@remotion/layout-utils": "4.0.445", - "@remotion/light-leaks": "4.0.445", - "@remotion/media": "4.0.445", - "@remotion/tailwind": "4.0.445", - "@remotion/transitions": "4.0.445", - "prism-react-renderer": "^2.4.1", - "react": "^19", - "react-dom": "^19", - "remotion": "4.0.445", - "zod": "4.3.6" - }, - "devDependencies": { - "@types/react": "^19", - "tailwindcss": "^4", - "typescript": "^5.7" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.13.tgz", - "integrity": "sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-4.2.1.tgz", - "integrity": "sha512-CEypeeykO9AN7JWkr1OEOQb0HRzZlPWGwV0Ya6DuVgFdDi6g3ma/cPZ5ZPZM4AWQikDpq/0llnGGlIL+j8afzw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.4.tgz", - "integrity": "sha512-tfOuvUQeo7Hz+FcuOd3LfXVp+342pnWUJ7D2y8NUpu1Ww6xnTbHLpz018/y6rtbHifJ3iIEf9ttxXd8KG7nL0Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.6.3.tgz", - "integrity": "sha512-pQPUPo32HW3/NuZxrwr3VJHE+vGqSTVI5gK4jGbuJ7eOFUrsTmZikXcVdInCVWOvuxK5xbCzwDWoTlZUCAKN+A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^4.1.0", - "@csstools/css-calc": "^1.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", - "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^2.4.1" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", - "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", - "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-3.0.1.tgz", - "integrity": "sha512-dD8W98dOYNOH/yX4V4HXOhfCOnvVAg8TtsL+qCGNoKXuq5z2C/d026wGWgySgC8cajXXo/wNezS31Glj5GcqrA==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-2.2.3.tgz", - "integrity": "sha512-b1ptNkr1UWP96EEHqKBWWaV5m/0hgYGctgA/RVZhONeP1L3T/8hwoqDm9bB23yVCfOgE9U93KI9j06+pEkJTvw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-color-parser": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.3.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-1.0.3.tgz", - "integrity": "sha512-QGXjGugTluqFZWzVf+S3wCiRiI0ukXlYqCi7OnpDotP/zaVTyl/aqZujLFzTOXy24BoWnu89frGMc79ohY5eog==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-color-parser": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.3.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-2.0.2.tgz", - "integrity": "sha512-iKYZlIs6JsNT7NKyRjyIyezTCHLh4L4BBB3F5Nx7Dc4Z/QmBgX+YJFuUSar8IM6KclGiAUFGomXFdYxAwJydlA==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-3.0.6.tgz", - "integrity": "sha512-rBOBTat/YMmB0G8VHwKqDEx+RZ4KCU9j42K8LwS0IpZnyThalZZF7BCSsZ6TFlZhcRZKlZy3LLFI2pLqjNVGGA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-color-parser": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.3.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-2.2.2.tgz", - "integrity": "sha512-W5Y5oaJ382HSlbdGfPf60d7dAK6Hqf10+Be1yZbd/TNNrQ/3dDdV1c07YwOXPQ3PZ6dvFMhxbIbn8EC3ki3nEg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-color-parser": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-2.0.4.tgz", - "integrity": "sha512-9W2ZbV7whWnr1Gt4qYgxMWzbevZMOvclUczT5vk4yR6vS53W/njiiUhtm/jh/BKYwQ1W3PECZjgAd2dH4ebJig==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^2.3.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-3.2.1.tgz", - "integrity": "sha512-AtANdV34kJl04Al62is3eQRk/BfOfyAvEmRJvbt+nx5REqImLC+2XhuE6skgkcPli1l8ONS67wS+l1sBzySc3Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-1.0.1.tgz", - "integrity": "sha512-eO9z2sMLddvlfFEW5Fxbjyd03zaO7cJafDurK4rCqyRt9P7aaWwha0LcSzoROlcZrw1NBV2JAp2vMKfPMQO1xw==", - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-1.0.1.tgz", - "integrity": "sha512-x1ge74eCSvpBkDDWppl+7FuD2dL68WP+wwP2qvdUcKY17vJksz+XoE1ZRV38uJgS6FNUwC0AxrPW5gy3MxsDHQ==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-1.0.3.tgz", - "integrity": "sha512-6zqcyRg9HSqIHIPMYdt6THWhRmE5/tyHKJQLysn2TeDf/ftq7Em9qwMTx98t2C/7UxIsYS8lOiHHxAVjWn2WUg==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-tokenizer": "^2.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.8.tgz", - "integrity": "sha512-KYQCal2i7XPNtHAUxCECdrC7tuxIWQCW+s8eMYs5r5PaAiVTeKwlrkRS096PFgojdNCmHeG0Cb7njtuNswNf+w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^1.2.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/media-query-list-parser": "^2.1.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-1.0.4.tgz", - "integrity": "sha512-IwyTbyR8E2y3kh6Fhrs251KjKBJeUPV5GlnUKnpU70PRFEN2DolWbf2V4+o/B9+Oj77P/DullLTulWEQ8uFtAA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-parser-algorithms": "^2.2.0", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/media-query-list-parser": "^2.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-2.0.2.tgz", - "integrity": "sha512-jbwrP8rN4e7LNaRcpx3xpMUjhtt34I9OV+zgbcsYAAk6k1+3kODXJBf95/JMYWhu9g1oif7r06QVUgfWsKxCFw==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-2.0.1.tgz", - "integrity": "sha512-TQT5g3JQ5gPXC239YuRK8jFceXF9d25ZvBkyjzBGGoW5st5sPXFVQS8OjYb9IJ/K3CdfK4528y483cgS2DJR/w==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-2.2.3.tgz", - "integrity": "sha512-AgJ2rWMnLCDcbSMTHSqBYn66DNLBym6JpBpCaqmwZ9huGdljjDRuH3DzOYzkgQ7Pm2K92IYIq54IvFHloUOdvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-color-parser": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.3.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-2.3.0.tgz", - "integrity": "sha512-Zd8ojyMlsL919TBExQ1I0CTpBDdyCpH/yOdqatZpuC3sd22K4SwC7+Yez3Q/vmXMWSAl+shjNeFZ7JMyxMjK+Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-1.0.2.tgz", - "integrity": "sha512-juCoVInkgH2TZPfOhyx6tIal7jW37L/0Tt+Vcl1LoxqQA9sxcg3JWYZ98pl1BonDnki6s/M7nXzFQHWsWMeHgw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-color-parser": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.3.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-2.0.2.tgz", - "integrity": "sha512-6Pvo4uexUCXt+Hz5iUtemQAcIuCYnL+ePs1khFR6/xPgC92aQLJ0zGHonWoewiBE+I++4gXK3pr+R1rlOFHe5w==", - "license": "CC0-1.0", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-2.1.1.tgz", - "integrity": "sha512-YCvdF0GCZK35nhLgs7ippcxDlRVe5QsSht3+EghqTjnYnyl3BbWIN6fYQ1dKWYTJ+7Bgi41TgqQFfJDcp9Xy/w==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-calc": "^1.1.1", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-2.2.4.tgz", - "integrity": "sha512-zPN56sQkS/7YTCVZhOBVCWf7AiNge8fXDl7JVaHLz2RyT4pnyK2gFjckWRLpO0A2xkm1lCgZ0bepYZTwAVd/5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/color-helpers": "^2.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand/node_modules/@csstools/color-helpers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-2.1.0.tgz", - "integrity": "sha512-OWkqBa7PDzZuJ3Ha7T5bxdSVfSCfTq6K1mbAhbO1MD+GSULGjrp45i5RudyJOedstSarN/3mdwu9upJE7gDXfw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-2.1.1.tgz", - "integrity": "sha512-XcXmHEFfHXhvYz40FtDlA4Fp4NQln2bWTsCwthd2c+MCnYArUYU3YaMqzR5CrKP3pMoGYTBnp5fMqf1HxItNyw==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-calc": "^1.1.1", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-2.0.1.tgz", - "integrity": "sha512-oJ9Xl29/yU8U7/pnMJRqAZd4YXNCfGEdcP4ywREuqm/xMqcgDNDppYRoCGDt40aaZQIEKBS79LytUDN/DHf0Ew==", - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@csstools/utilities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-1.0.0.tgz", - "integrity": "sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", - "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", - "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", - "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", - "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", - "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", - "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", - "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", - "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", - "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", - "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", - "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", - "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", - "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", - "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", - "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", - "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", - "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", - "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", - "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", - "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", - "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", - "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", - "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", - "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", - "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mediabunny/aac-encoder": { - "version": "1.39.2", - "resolved": "https://registry.npmjs.org/@mediabunny/aac-encoder/-/aac-encoder-1.39.2.tgz", - "integrity": "sha512-KD6KADVzAnW7tqhRFGBOX4uaiHbd0Yxvg0lfthj3wJLAEEgEBAvi43w+ZXWeEn54X/jpabrLe4bW/eYFFvlbUA==", - "license": "MPL-2.0", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" - }, - "peerDependencies": { - "mediabunny": "^1.0.0" - } - }, - "node_modules/@mediabunny/flac-encoder": { - "version": "1.39.2", - "resolved": "https://registry.npmjs.org/@mediabunny/flac-encoder/-/flac-encoder-1.39.2.tgz", - "integrity": "sha512-VwBr3AzZTPEEPvt4aladZiXwOf3W293eq213zDupGQi/taS8WWNqDd3eBdf8FfvlbXATfbRiycXDKyQ0HlOZaQ==", - "license": "MPL-2.0", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" - }, - "peerDependencies": { - "mediabunny": "^1.0.0" - } - }, - "node_modules/@mediabunny/mp3-encoder": { - "version": "1.39.2", - "resolved": "https://registry.npmjs.org/@mediabunny/mp3-encoder/-/mp3-encoder-1.39.2.tgz", - "integrity": "sha512-3rrodrGnUpUP8F2d1aRUl8IvjqK3jegkupbOzvOokooSAO5rXk2Lr5jZe7TnPeiVGiXfmnoJ7s9uyUOHlCd8qw==", - "license": "MPL-2.0", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" - }, - "peerDependencies": { - "mediabunny": "^1.0.0" - } - }, - "node_modules/@module-federation/error-codes": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", - "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", - "license": "MIT" - }, - "node_modules/@module-federation/runtime": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", - "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.22.0", - "@module-federation/runtime-core": "0.22.0", - "@module-federation/sdk": "0.22.0" - } - }, - "node_modules/@module-federation/runtime-core": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", - "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.22.0", - "@module-federation/sdk": "0.22.0" - } - }, - "node_modules/@module-federation/runtime-tools": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", - "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.22.0", - "@module-federation/webpack-bundler-runtime": "0.22.0" - } - }, - "node_modules/@module-federation/sdk": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", - "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", - "license": "MIT" - }, - "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", - "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.22.0", - "@module-federation/sdk": "0.22.0" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", - "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@remotion/bundler": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/bundler/-/bundler-4.0.445.tgz", - "integrity": "sha512-jA5VZfFeHv1gVfwdQAWUtKDDc7axVoB/wgCcmnlVh8jCKUZMJnUWewH5ac7FDEbZ/7zKie71naR8Ad0EgD4Hew==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@remotion/media-parser": "4.0.445", - "@remotion/studio": "4.0.445", - "@remotion/studio-shared": "4.0.445", - "@rspack/core": "1.7.6", - "@rspack/plugin-react-refresh": "1.6.1", - "esbuild": "0.25.0", - "loader-utils": "2.0.4", - "postcss": "8.5.1", - "postcss-value-parser": "4.2.0", - "react-refresh": "0.18.0", - "remotion": "4.0.445", - "source-map": "0.7.3", - "style-loader": "4.0.0", - "webpack": "5.105.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/cli": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/cli/-/cli-4.0.445.tgz", - "integrity": "sha512-lfAcT6tLSFmvdR1I4Re40Ym6JGMh/1muApJsn9blOkqJevAZr4lqK/Fjqf4pbcm2B4QslX6Uu5jWGoVJgli+fg==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@remotion/bundler": "4.0.445", - "@remotion/media-utils": "4.0.445", - "@remotion/player": "4.0.445", - "@remotion/renderer": "4.0.445", - "@remotion/studio": "4.0.445", - "@remotion/studio-server": "4.0.445", - "@remotion/studio-shared": "4.0.445", - "dotenv": "17.3.1", - "minimist": "1.2.6", - "prompts": "2.4.2", - "remotion": "4.0.445" - }, - "bin": { - "remotion": "remotion-cli.js", - "remotionb": "remotionb-cli.js", - "remotiond": "remotiond-cli.js" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/compositor-darwin-arm64": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-arm64/-/compositor-darwin-arm64-4.0.445.tgz", - "integrity": "sha512-yB2UNMb56l3grn1SpkHu4RMrmfXvC0j1hebgxUQYnp180AdhUq2oBHRArlm8O7HxctS7q0z2i4AYPh9oEkZkOw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@remotion/compositor-darwin-x64": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-x64/-/compositor-darwin-x64-4.0.445.tgz", - "integrity": "sha512-YFyuhS1wcKaIRptizZRjdcIHHg+MguHJGG4dqeSTSdxhYXky0+df9IuF/FFCN4ScWTbcn1KoaG/WdwglSId6/A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@remotion/compositor-linux-arm64-gnu": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-gnu/-/compositor-linux-arm64-gnu-4.0.445.tgz", - "integrity": "sha512-OoZXonYdLI9t+LJAo3z3HlZ6ujrHKrS5sFw4snBg8mNIcjfblplDnydLXhV1PemNlVtAkU2ZUE0H5abqAQKoaQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@remotion/compositor-linux-arm64-musl": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-musl/-/compositor-linux-arm64-musl-4.0.445.tgz", - "integrity": "sha512-fkqdErDMVbJdLlcfDh8LmEMZMfJAavxEOoVelLWkmDhNJnGvbPbDlwkITxg5H4U1ZBCjEF20lUAbLsIs7AD79Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@remotion/compositor-linux-x64-gnu": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-gnu/-/compositor-linux-x64-gnu-4.0.445.tgz", - "integrity": "sha512-JgcEWYsrIdVNkHYQsrBamrooXFPZRung7zPqMWIWmfM8TVXz2Ncid5JW8qMK+eRl/dQaBXw4V9WYaBfIj17JDA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@remotion/compositor-linux-x64-musl": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-musl/-/compositor-linux-x64-musl-4.0.445.tgz", - "integrity": "sha512-AAmWGt9TP2CrGRossBNBSerKMW8KIOpxSKTBjpaza5Yjjd+3S4XVhNlBnsTD/1cxw9HaQJ1um9detKsVev0Weg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@remotion/compositor-win32-x64-msvc": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/compositor-win32-x64-msvc/-/compositor-win32-x64-msvc-4.0.445.tgz", - "integrity": "sha512-qNa86D0j8kjFhU+t21/2IpyEsy1YIVHs9HkscxDOzN+SoW+9m3esWc4VSXnBZsu2PMq8zplYb79roQZGKk8BFw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@remotion/layout-utils": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/layout-utils/-/layout-utils-4.0.445.tgz", - "integrity": "sha512-VneNiJy6LkqO1VYyya+p+rt1lUfl88TpKz/lS84je6mUw/7++gzfhrVdWycFoQSralJxoft9885cU+hR9huwTw==", - "license": "MIT" - }, - "node_modules/@remotion/licensing": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/licensing/-/licensing-4.0.445.tgz", - "integrity": "sha512-IbRTYGNzw0CCqJpxpdMVYPDKU15gJKK3DEjxE9nU4UXJHCEaGglxU6KvnDK3ykjHawuMmND+gSSHpj++89l+Sg==", - "license": "MIT" - }, - "node_modules/@remotion/light-leaks": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/light-leaks/-/light-leaks-4.0.445.tgz", - "integrity": "sha512-9UIYrNP2uV9rtU/LeKIdXw5QIz7YzCf64cG6WH5PaKOHnMzHw8HfGlYwVS9s3+ruUSj2wnQPd2ZU8dZPYHiPVw==", - "license": "Remotion License", - "dependencies": { - "remotion": "4.0.445", - "zod": "4.3.6" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/media": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/media/-/media-4.0.445.tgz", - "integrity": "sha512-c/G6LP20nECovxzcuMb+80n6+Qea1APvC2Ewp8Mpr07IjAKVv9+FC+H4/omxhC/wXRXchwigEUV/Y964z0QCQg==", - "dependencies": { - "mediabunny": "1.39.2", - "remotion": "4.0.445", - "zod": "4.3.6" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/media-parser": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/media-parser/-/media-parser-4.0.445.tgz", - "integrity": "sha512-lKQnttWt2XCMQfr8eralZihnPAYDiJDG3uhhBfI13f4OHmKDSxjijP11w1k6JTbhIlER1Ijm/ZfSbQ3UjWQYgA==", - "license": "Remotion License https://remotion.dev/license" - }, - "node_modules/@remotion/media-utils": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/media-utils/-/media-utils-4.0.445.tgz", - "integrity": "sha512-pH7bM3Uq19I7zm0TR3kpRUfNh/jtBZjjLfV395kzO+ccdN1VQhfe5C/btQ/G0GIgwhP0mdm9jm8TZw2CTGQuSg==", - "license": "MIT", - "dependencies": { - "mediabunny": "1.39.2", - "remotion": "4.0.445" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/paths": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/paths/-/paths-4.0.445.tgz", - "integrity": "sha512-NRDlT0yJ4bgOLHjGFTENK3AOzAEhj06Tla3b6c0F9KtyrCGTHehmu2EE+FfA4tJl3VzH6j0xfQEhUZc/A62+JQ==", - "license": "MIT" - }, - "node_modules/@remotion/player": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/player/-/player-4.0.445.tgz", - "integrity": "sha512-AYhu6LXrL66FNOg5Md5DNF/BH0TQg7C26lESZozukVnSH6dmgJQgwtEcCH7l3hwDz+IJhZPn6Lbwo+2rpr2M+A==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "remotion": "4.0.445" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/renderer": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/renderer/-/renderer-4.0.445.tgz", - "integrity": "sha512-RejUK9zQxNt1h6b5gNHRGDIjFnun3ZQ6yyGE8PBnSXyU8ONMKLDq+2iDsE3CRftWdld3uNtWrVAhSabW9QRmqA==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@remotion/licensing": "4.0.445", - "@remotion/streaming": "4.0.445", - "execa": "5.1.1", - "extract-zip": "2.0.1", - "remotion": "4.0.445", - "source-map": "^0.8.0-beta.0", - "ws": "8.17.1" - }, - "optionalDependencies": { - "@remotion/compositor-darwin-arm64": "4.0.445", - "@remotion/compositor-darwin-x64": "4.0.445", - "@remotion/compositor-linux-arm64-gnu": "4.0.445", - "@remotion/compositor-linux-arm64-musl": "4.0.445", - "@remotion/compositor-linux-x64-gnu": "4.0.445", - "@remotion/compositor-linux-x64-musl": "4.0.445", - "@remotion/compositor-win32-x64-msvc": "4.0.445" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/renderer/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "deprecated": "The work that was done in this beta branch won't be included in future versions", - "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@remotion/shapes": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/shapes/-/shapes-4.0.445.tgz", - "integrity": "sha512-tPBHyoy8Fl3fHRDekeFJ7l6KG8H34KOAVexLx42AdhxNnMMKq2dqP1Mosqjw9mTdicKvZvrIbojZPQIbUhkb7g==", - "license": "MIT", - "dependencies": { - "@remotion/paths": "4.0.445" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/streaming": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/streaming/-/streaming-4.0.445.tgz", - "integrity": "sha512-NCy1XYSEGbPb/xkyt6WdFIlEawnYCFcprKHFCrZfAY7Pu7jgNuMDfgXDgmmQe3gvyuS6NxCEaJphZ6VToLoKKA==", - "license": "MIT" - }, - "node_modules/@remotion/studio": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/studio/-/studio-4.0.445.tgz", - "integrity": "sha512-wiGNDZHcvVbqyhlMCVypWqsd1l6JSiyc+7kcfBtSAABz1X4bWCmSuIC4K3s6CsOlhFzUjZJFtz3b3fi1a1Gzaw==", - "license": "MIT", - "dependencies": { - "@remotion/media-utils": "4.0.445", - "@remotion/player": "4.0.445", - "@remotion/renderer": "4.0.445", - "@remotion/studio-shared": "4.0.445", - "@remotion/web-renderer": "4.0.445", - "@remotion/zod-types": "4.0.445", - "mediabunny": "1.39.2", - "memfs": "3.4.3", - "open": "^8.4.2", - "remotion": "4.0.445", - "semver": "7.5.3", - "source-map": "0.7.3", - "zod": "4.3.6" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/studio-server": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/studio-server/-/studio-server-4.0.445.tgz", - "integrity": "sha512-fiSNJf0MroDILWLL611HAOiEXxAISe0g1Wk/c+guFixcPCFcAH4+BFGJrBPor+IO8GbO4MgWnt88CAMPf2ifTw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "7.24.1", - "@remotion/bundler": "4.0.445", - "@remotion/renderer": "4.0.445", - "@remotion/studio-shared": "4.0.445", - "memfs": "3.4.3", - "open": "^8.4.2", - "prettier": "3.8.1", - "recast": "0.23.11", - "remotion": "4.0.445", - "semver": "7.5.3", - "source-map": "0.7.3" - } - }, - "node_modules/@remotion/studio-shared": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/studio-shared/-/studio-shared-4.0.445.tgz", - "integrity": "sha512-OqGPFSklJ0E1p2P4sWwnh23xsnxWwhqGkz8payR49a+nYyueXaX+MvKLJrhiXgAMqt4L7507pqvYjRe2Ca96jw==", - "license": "MIT", - "dependencies": { - "remotion": "4.0.445" - } - }, - "node_modules/@remotion/studio/node_modules/@remotion/zod-types": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/zod-types/-/zod-types-4.0.445.tgz", - "integrity": "sha512-LSxbdQZY/ZA3gaQ7A+j18kcrEjgTJBQ8mqSl52VJl4X4gDcUUWiYp9k4hFBUOhAEMXHF8KInvf+RPAzHfpSLWg==", - "license": "MIT", - "dependencies": { - "remotion": "4.0.445" - }, - "peerDependencies": { - "zod": "4.3.6" - } - }, - "node_modules/@remotion/tailwind": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/tailwind/-/tailwind-4.0.445.tgz", - "integrity": "sha512-5xt/LjuKyObI8jcvMNcIi4YYaUZSWXHoIOlRdVumX7N0bvn+3qPrQCIzbGk3QuFJL/JvDEzC9jx5mlkA6uu8xg==", - "license": "MIT", - "dependencies": { - "autoprefixer": "10.4.20", - "postcss": "8.4.47", - "postcss-loader": "^7.3.0", - "postcss-preset-env": "^8.3.2", - "style-loader": "4.0.0", - "tailwindcss": "3.4.13" - }, - "peerDependencies": { - "@remotion/bundler": "4.0.445" - } - }, - "node_modules/@remotion/tailwind/node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "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.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@remotion/tailwind/node_modules/tailwindcss": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", - "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@remotion/transitions": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/transitions/-/transitions-4.0.445.tgz", - "integrity": "sha512-f82c17oAaAMAYVnEEhqEmnotRVItg/52G47jRGN6wNBDGaqvnZ4kTFHyXxTTO3EVZXUau9l+hyGad9y4PufnUg==", - "license": "UNLICENSED", - "dependencies": { - "@remotion/paths": "4.0.445", - "@remotion/shapes": "4.0.445", - "remotion": "4.0.445" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@remotion/web-renderer": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/@remotion/web-renderer/-/web-renderer-4.0.445.tgz", - "integrity": "sha512-EHOFdrqe/T3gUS7W1XbmcjAAeCSNJ5CDAcqy6EZWIVOf8nXJbPuh820SohOHdyPBFs5weola/Dt/XiYCunisCg==", - "license": "UNLICENSED", - "dependencies": { - "@mediabunny/aac-encoder": "1.39.2", - "@mediabunny/flac-encoder": "1.39.2", - "@mediabunny/mp3-encoder": "1.39.2", - "@remotion/licensing": "4.0.445", - "mediabunny": "1.39.2", - "remotion": "4.0.445" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/@rspack/binding": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.6.tgz", - "integrity": "sha512-/NrEcfo8Gx22hLGysanrV6gHMuqZSxToSci/3M4kzEQtF5cPjfOv5pqeLK/+B6cr56ul/OmE96cCdWcXeVnFjQ==", - "license": "MIT", - "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.7.6", - "@rspack/binding-darwin-x64": "1.7.6", - "@rspack/binding-linux-arm64-gnu": "1.7.6", - "@rspack/binding-linux-arm64-musl": "1.7.6", - "@rspack/binding-linux-x64-gnu": "1.7.6", - "@rspack/binding-linux-x64-musl": "1.7.6", - "@rspack/binding-wasm32-wasi": "1.7.6", - "@rspack/binding-win32-arm64-msvc": "1.7.6", - "@rspack/binding-win32-ia32-msvc": "1.7.6", - "@rspack/binding-win32-x64-msvc": "1.7.6" - } - }, - "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.6.tgz", - "integrity": "sha512-NZ9AWtB1COLUX1tA9HQQvWpTy07NSFfKBU8A6ylWd5KH8AePZztpNgLLAVPTuNO4CZXYpwcoclf8jG/luJcQdQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rspack/binding-darwin-x64": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.6.tgz", - "integrity": "sha512-J2g6xk8ZS7uc024dNTGTHxoFzFovAZIRixUG7PiciLKTMP78svbSSWrmW6N8oAsAkzYfJWwQpVgWfFNRHvYxSw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.6.tgz", - "integrity": "sha512-eQfcsaxhFrv5FmtaA7+O1F9/2yFDNIoPZzV/ZvqvFz5bBXVc4FAm/1fVpBg8Po/kX1h0chBc7Xkpry3cabFW8w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.6.tgz", - "integrity": "sha512-DfQXKiyPIl7i1yECHy4eAkSmlUzzsSAbOjgMuKn7pudsWf483jg0UUYutNgXSlBjc/QSUp7906Cg8oty9OfwPA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.6.tgz", - "integrity": "sha512-NdA+2X3lk2GGrMMnTGyYTzM3pn+zNjaqXqlgKmFBXvjfZqzSsKq3pdD1KHZCd5QHN+Fwvoszj0JFsquEVhE1og==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.6.tgz", - "integrity": "sha512-rEy6MHKob02t/77YNgr6dREyJ0e0tv1X6Xsg8Z5E7rPXead06zefUbfazj4RELYySWnM38ovZyJAkPx/gOn3VA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.6.tgz", - "integrity": "sha512-YupOrz0daSG+YBbCIgpDgzfMM38YpChv+afZpaxx5Ml7xPeAZIIdgWmLHnQ2rts73N2M1NspAiBwV00Xx0N4Vg==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "1.0.7" - } - }, - "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.6.tgz", - "integrity": "sha512-INj7aVXjBvlZ84kEhSK4kJ484ub0i+BzgnjDWOWM1K+eFYDZjLdAsQSS3fGGXwVc3qKbPIssFfnftATDMTEJHQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.6.tgz", - "integrity": "sha512-lXGvC+z67UMcw58In12h8zCa9IyYRmuptUBMItQJzu+M278aMuD1nETyGLL7e4+OZ2lvrnnBIcjXN1hfw2yRzw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.6.tgz", - "integrity": "sha512-zeUxEc0ZaPpmaYlCeWcjSJUPuRRySiSHN23oJ2Xyw0jsQ01Qm4OScPdr0RhEOFuK/UE+ANyRtDo4zJsY52Hadw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/core": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.6.tgz", - "integrity": "sha512-Iax6UhrfZqJajA778c1d5DBFbSIqPOSrI34kpNIiNpWd8Jq7mFIa+Z60SQb5ZQDZuUxcCZikjz5BxinFjTkg7Q==", - "license": "MIT", - "dependencies": { - "@module-federation/runtime-tools": "0.22.0", - "@rspack/binding": "1.7.6", - "@rspack/lite-tapable": "1.1.0" - }, - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.1" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@rspack/lite-tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", - "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", - "license": "MIT" - }, - "node_modules/@rspack/plugin-react-refresh": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.1.tgz", - "integrity": "sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==", - "license": "MIT", - "dependencies": { - "error-stack-parser": "^2.1.4", - "html-entities": "^2.6.0" - }, - "peerDependencies": { - "react-refresh": ">=0.10.0 <1.0.0", - "webpack-hot-middleware": "2.x" - }, - "peerDependenciesMeta": { - "webpack-hot-middleware": { - "optional": true - } - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.11.tgz", - "integrity": "sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==", - "license": "MIT", - "dependencies": { - "@types/dom-webcodecs": "*" - } - }, - "node_modules/@types/dom-webcodecs": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", - "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz", - "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" - } - }, - "node_modules/@types/prismjs": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", - "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.14", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz", - "integrity": "sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001785", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001785.tgz", - "integrity": "sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-5.0.2.tgz", - "integrity": "sha512-aCU4AZ7uEcVSUzagTlA9pHciz7aWPKA/YzrEkpdSopJ2pvhIxiQ5sYeMz1/KByxlIo4XBdvMNJAVKMg/GRnhfw==", - "license": "CC0-1.0", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-5.0.2.tgz", - "integrity": "sha512-q+U+4QdwwB7T9VEW/LyO6CFrLAeLqOykC5mDqJXc7aKZAhDbq7BvGT13VGJe+IwBfdN2o3Xdw2kJ5IxwV1Sc9Q==", - "license": "CC0-1.0", - "dependencies": { - "@csstools/selector-specificity": "^2.0.1", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-8.0.2.tgz", - "integrity": "sha512-OvFghizHJ45x7nsJJUSYLyQNTzsCU8yWjxAc/nhPQg1pbs18LMoET8N3kOweFDPy0JV0OSXN2iqRFhPBHYOeMA==", - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/cssdb": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", - "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "CC0-1.0" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/dotenv": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", - "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.331", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz", - "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==", - "license": "ISC" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", - "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" - } - }, - "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/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "license": "Unlicense" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mediabunny": { - "version": "1.39.2", - "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.39.2.tgz", - "integrity": "sha512-VcrisGRt+OI7tTPrziucJoCIPYIS/DEWY37TqzQVLWSUUHiyvsiRizEypQ3FOlhfIZ4ytAG/Mw4zxfetCTyKUg==", - "license": "MPL-2.0", - "workspaces": [ - "packages/*" - ], - "dependencies": { - "@types/dom-mediacapture-transform": "^0.1.11", - "@types/dom-webcodecs": "0.1.13" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" - } - }, - "node_modules/memfs": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", - "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", - "license": "Unlicense", - "dependencies": { - "fs-monkey": "1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "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/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", - "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.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-6.0.3.tgz", - "integrity": "sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-5.1.0.tgz", - "integrity": "sha512-w2R4py6zrVE1U7FwNaAc76tNQlG9GLkrBbcFw+VhUjyDDiV28vfZG+l4LyPmpoQpeSJVtu8VgNjE8Jv5SpC7dQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^2.3.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-9.0.4.tgz", - "integrity": "sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-8.0.2.tgz", - "integrity": "sha512-xWf/JmAxVoB5bltHpXk+uGRoGFwu4WDAR7210el+iyvTdqiKpDhtcT8N3edXMoVJY0WHFMrKMUieql/wRNiXkw==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-media": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-9.1.5.tgz", - "integrity": "sha512-GStyWMz7Qbo/Gtw1xVspzVSX8eipgNg4lpsO3CAeY4/A1mzok+RV6MCv3fg62trWijh/lYEj6vps4o8JcBBpDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.2", - "@csstools/css-parser-algorithms": "^2.2.0", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/media-query-list-parser": "^2.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-properties": { - "version": "13.3.12", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.12.tgz", - "integrity": "sha512-oPn/OVqONB2ZLNqN185LDyaVByELAA/u3l2CS2TS16x2j2XsmV4kd8U49+TMxmUsEU9d8fB/I10E6U7kB0L1BA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.13", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.12.tgz", - "integrity": "sha512-ctIoprBMJwByYMGjXG0F7IT2iMF2hnamQ+aWZETyBM0aAlyaYdVZTeUkk8RB+9h9wP+NdN3f01lfvKl2ZSqC0g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.13", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "postcss-selector-parser": "^6.1.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-7.0.2.tgz", - "integrity": "sha512-cMnslilYxBf9k3qejnovrUONZx1rXeUZJw06fgIUBzABJe3D2LiLL5WAER7Imt3nrkaIgG05XZBztueLEf5P8w==", - "license": "CC0-1.0", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-4.0.4.tgz", - "integrity": "sha512-nUAbUXURemLXIrl4Xoia2tiu5z/n8sY+BVDZApoeT9BlpByyrp02P/lFCRrRvZ/zrGRE+MOGLhk8o7VcMCtPtQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^2.3.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-8.0.2.tgz", - "integrity": "sha512-f/Vd+EC/GaKElknU59esVcRYr/Y3t1ZAQyL4u2xSOgkDy4bMCmG7VP5cGvj3+BTLNE9ETfEuz2nnt4qkZwTTeA==", - "license": "CC0-1.0", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-7.0.2.tgz", - "integrity": "sha512-AHAJ89UQBcqBvFgQJE9XasGuwMNkKsGj4D/f9Uk60jFmEBHpAL14DrnSk3Rj+SwZTr/WUG+mh+Rvf8fid/346w==", - "license": "CC0-1.0", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-4.0.1.tgz", - "integrity": "sha512-V5OuQGw4lBumPlwHWk/PRfMKjaq/LTGR4WDTemIMCaMevArVfCCA9wBJiL1VjDAd+rzuCIlkRoRvDsSiAaZ4Fg==", - "license": "CC0-1.0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-5.0.2.tgz", - "integrity": "sha512-Sszjwo0ubETX0Fi5MvpYzsONwrsjeabjMoc5YqHvURFItXgIu3HdCjcVuVKGMPGzKRhgaknmdM5uVWInWPJmeg==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-lab-function": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-5.2.3.tgz", - "integrity": "sha512-fi32AYKzji5/rvgxo5zXHFvAYBw0u0OzELbeCNjEZVLUir18Oj+9RmNphtM8QdLUaUnrfx8zy8vVYLmFLkdmrQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/css-color-parser": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.1.1", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.3.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-logical": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-6.2.0.tgz", - "integrity": "sha512-aqlfKGaY0nnbgI9jwUikp4gJKBqcH5noU/EdnIVceghaaDPYhZuyJVxlvWNy55tlTG5tunRKCTAX9yljLiFgmw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nesting": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-11.3.0.tgz", - "integrity": "sha512-JlS10AQm/RzyrUGgl5irVkAlZYTJ99mNueUl+Qab+TcHhVedLiylWVkKBhRale+rS9yWIJK48JVzQlq3LcSdeA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz", - "integrity": "sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-4.0.1.tgz", - "integrity": "sha512-HQZ0qi/9iSYHW4w3ogNqVNr2J49DHJAl7r8O2p0Meip38jsdnRPgiDW7r/LlLrrMBMe3KHkvNtAV2UmRVxzLIg==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-8.0.1.tgz", - "integrity": "sha512-Ow2LedN8sL4pq8ubukO77phSVt4QyCm35ZGCYXKvRFayAwcpgB0sjNJglDoTuRdUL32q/ZC1VkPBo0AOEr4Uiw==", - "license": "CC0-1.0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-8.5.1.tgz", - "integrity": "sha512-qhWnJJjP6ArLUINWJ38t6Aftxnv9NW6cXK0NuwcLCcRilbuw72dSFLkCVUJeCfHGgJiKzX+pnhkGiki0PEynWg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "CC0-1.0", - "dependencies": { - "@csstools/postcss-cascade-layers": "^3.0.1", - "@csstools/postcss-color-function": "^2.2.3", - "@csstools/postcss-color-mix-function": "^1.0.3", - "@csstools/postcss-font-format-keywords": "^2.0.2", - "@csstools/postcss-gradients-interpolation-method": "^3.0.6", - "@csstools/postcss-hwb-function": "^2.2.2", - "@csstools/postcss-ic-unit": "^2.0.4", - "@csstools/postcss-is-pseudo-class": "^3.2.1", - "@csstools/postcss-logical-float-and-clear": "^1.0.1", - "@csstools/postcss-logical-resize": "^1.0.1", - "@csstools/postcss-logical-viewport-units": "^1.0.3", - "@csstools/postcss-media-minmax": "^1.0.4", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^1.0.4", - "@csstools/postcss-nested-calc": "^2.0.2", - "@csstools/postcss-normalize-display-values": "^2.0.1", - "@csstools/postcss-oklab-function": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^2.3.0", - "@csstools/postcss-relative-color-syntax": "^1.0.2", - "@csstools/postcss-scope-pseudo-class": "^2.0.2", - "@csstools/postcss-stepped-value-functions": "^2.1.1", - "@csstools/postcss-text-decoration-shorthand": "^2.2.4", - "@csstools/postcss-trigonometric-functions": "^2.1.1", - "@csstools/postcss-unset-value": "^2.0.1", - "autoprefixer": "^10.4.14", - "browserslist": "^4.21.9", - "css-blank-pseudo": "^5.0.2", - "css-has-pseudo": "^5.0.2", - "css-prefers-color-scheme": "^8.0.2", - "cssdb": "^7.6.0", - "postcss-attribute-case-insensitive": "^6.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^5.1.0", - "postcss-color-hex-alpha": "^9.0.2", - "postcss-color-rebeccapurple": "^8.0.2", - "postcss-custom-media": "^9.1.5", - "postcss-custom-properties": "^13.2.0", - "postcss-custom-selectors": "^7.1.3", - "postcss-dir-pseudo-class": "^7.0.2", - "postcss-double-position-gradients": "^4.0.4", - "postcss-focus-visible": "^8.0.2", - "postcss-focus-within": "^7.0.2", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^4.0.1", - "postcss-image-set-function": "^5.0.2", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^5.2.3", - "postcss-logical": "^6.2.0", - "postcss-nesting": "^11.3.0", - "postcss-opacity-percentage": "^2.0.0", - "postcss-overflow-shorthand": "^4.0.1", - "postcss-page-break": "^3.0.4", - "postcss-place": "^8.0.1", - "postcss-pseudo-class-any-link": "^8.0.2", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^7.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-8.0.2.tgz", - "integrity": "sha512-FYTIuRE07jZ2CW8POvctRgArQJ43yxhr5vLmImdKUvjFCkR09kh8pIdlCwdx/jbFm7MiW4QP58L4oOUv3grQYA==", - "license": "CC0-1.0", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-7.0.2.tgz", - "integrity": "sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.4" - } - }, - "node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recast": { - "version": "0.23.11", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", - "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remotion": { - "version": "4.0.445", - "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.445.tgz", - "integrity": "sha512-SiEueQVsc93G8BAC1U1Ein+9vAKU7/17AgyXmGCADWyywObnRSPC6j7uJmvEDtwsxGWycP3vDV4e+fNd+41rUw==", - "license": "SEE LICENSE IN LICENSE.md", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/style-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", - "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", - "license": "MIT", - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.27.0" - } - }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", - "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", - "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", - "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "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/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "license": "BSD-2-Clause" - }, - "node_modules/webpack": { - "version": "5.105.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", - "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", - "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "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/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/plugins/droid-control/remotion/package.json b/plugins/droid-control/remotion/package.json deleted file mode 100644 index 893c1d3..0000000 --- a/plugins/droid-control/remotion/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "droid-control-remotion", - "version": "1.0.0", - "private": true, - "scripts": { - "dev": "npx remotion studio", - "render": "npx remotion render", - "still": "npx remotion still", - "test": "node --test 'tests/**/*.test.mts'" - }, - "dependencies": { - "@remotion/cli": "4.0.445", - "@remotion/layout-utils": "4.0.445", - "@remotion/light-leaks": "4.0.445", - "@remotion/media": "4.0.445", - "@remotion/tailwind": "4.0.445", - "@remotion/transitions": "4.0.445", - "prism-react-renderer": "^2.4.1", - "react": "^19", - "react-dom": "^19", - "remotion": "4.0.445", - "zod": "4.3.6" - }, - "devDependencies": { - "@types/react": "^19", - "tailwindcss": "^4", - "typescript": "^5.7" - } -} diff --git a/plugins/droid-control/remotion/src/Root.tsx b/plugins/droid-control/remotion/src/Root.tsx deleted file mode 100644 index f2a4d71..0000000 --- a/plugins/droid-control/remotion/src/Root.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Composition } from 'remotion'; -import { ShowcaseComposition, showcaseSchema } from './compositions/Showcase'; -import { calculateShowcaseDuration } from './lib/duration'; - -export const RemotionRoot: React.FC = () => { - return ( - <> - { - const fps = 30; - return { - durationInFrames: calculateShowcaseDuration(props, fps), - fps, - width: props.width ?? 1920, - height: props.height ?? 1080, - }; - }} - defaultProps={{ - clips: [], - layout: 'single' as const, - labels: [], - title: 'Demo', - subtitle: '', - preset: 'factory' as const, - fidelity: 'standard' as const, - keys: [], - effects: [], - width: 1920, - height: 1080, - }} - /> - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/ActiveInputPulse.tsx b/plugins/droid-control/remotion/src/components/ActiveInputPulse.tsx deleted file mode 100644 index 3493bfd..0000000 --- a/plugins/droid-control/remotion/src/components/ActiveInputPulse.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import { AbsoluteFill, useCurrentFrame, useVideoConfig } from 'remotion'; - -const TARGET_HZ = 1.5; - -export const ActiveInputPulse: React.FC<{ - y?: string; - color?: string; - active?: boolean; -}> = ({ y = '50%', color = '#EE6018', active = true }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - if (!active) { - return null; - } - - // Oscillate opacity between 0.08 and 0.22 at ~1.5 Hz - const omega = (2 * Math.PI * TARGET_HZ) / fps; - const sinValue = Math.sin(frame * omega); - const opacity = 0.15 + sinValue * 0.07; // range: 0.08 .. 0.22 - - return ( - -
- - ); -}; diff --git a/plugins/droid-control/remotion/src/components/Background.tsx b/plugins/droid-control/remotion/src/components/Background.tsx deleted file mode 100644 index c2f0f3d..0000000 --- a/plugins/droid-control/remotion/src/components/Background.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import { - AbsoluteFill, - useCurrentFrame, - useVideoConfig, - interpolate, - staticFile, -} from 'remotion'; -import type { Palette } from '../lib/palettes'; -import type { PresetConfig } from '../lib/presets'; - -/** - * Full-bleed background layer. - * - * For warm (Factory) palettes: a radial vignette (dark center, warm - * amber-brown edges) with 4 asymmetric corner glow blobs whose opacity - * intensifies over the video duration — from a mild warm wash (~0.05) to - * a rich reddish-amber bloom (~0.2). - * - * For cool palettes (Catppuccin, etc.): a cool-toned radial or flat fill. - */ -export const Background: React.FC<{ - palette: Palette; - config: PresetConfig; - totalFrames?: number; -}> = ({ palette, config, totalFrames }) => { - const frame = useCurrentFrame(); - const { durationInFrames } = useVideoConfig(); - const total = totalFrames ?? durationInFrames; - - const isWarm = palette.accent === '#EE6018'; - - if (isWarm) { - // Progressive warmth: 0 → 1 over full duration - const warmth = interpolate(frame, [0, total], [0, 1], { - extrapolateRight: 'clamp', - }); - - // Glow opacity ramps from subtle to prominent - const glowBase = interpolate(warmth, [0, 1], [0.05, 0.2]); - - return ( - - {/* Bottom-left: strongest warm amber glow */} -
- - {/* Top-right: slightly cooler amber */} -
- - {/* Bottom-right: deep red accent */} -
- - {/* Top-left: faint Factory-orange kiss */} -
- - {/* Halftone texture overlay */} - - - ); - } - - // Cool palettes — radial gradient or flat fill - if (config.bgStyle === 'gradient') { - return ( - - ); - } - - return ; -}; diff --git a/plugins/droid-control/remotion/src/components/CalloutOverlay.tsx b/plugins/droid-control/remotion/src/components/CalloutOverlay.tsx deleted file mode 100644 index 478b7ae..0000000 --- a/plugins/droid-control/remotion/src/components/CalloutOverlay.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; -import type { Effect } from '../lib/schema'; -import type { Palette } from '../lib/palettes'; - -type Callout = Extract; - -const CalloutPill: React.FC<{ - callout: Callout; - palette: Palette; - enterFrame: number; - exitFrame: number; -}> = ({ callout, palette, enterFrame, exitFrame }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const isVisible = frame >= enterFrame && frame < exitFrame; - if (!isVisible) return null; - - const localFrame = frame - enterFrame; - - // Pop-in animation over 0.25s (same overshoot bezier as KeystrokePill) - const enterProgress = interpolate(localFrame, [0, 0.25 * fps], [0, 1], { - easing: Easing.bezier(0.34, 1.56, 0.64, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - // Fade out over last 0.2s - const totalFrames = exitFrame - enterFrame; - const fadeOutStart = totalFrames - 0.2 * fps; - const exitOpacity = interpolate( - localFrame, - [fadeOutStart, totalFrames], - [1, 0], - { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - - const scale = interpolate(enterProgress, [0, 1], [0.85, 1]); - - return ( -
- {callout.text} -
- ); -}; - -export const CalloutOverlay: React.FC<{ - callouts: Callout[]; - palette: Palette; -}> = ({ callouts, palette }) => { - const { fps } = useVideoConfig(); - - return ( - <> - {callouts.map((callout) => ( - - ))} - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/CodeAnnotationOverlay.tsx b/plugins/droid-control/remotion/src/components/CodeAnnotationOverlay.tsx deleted file mode 100644 index 327a2a0..0000000 --- a/plugins/droid-control/remotion/src/components/CodeAnnotationOverlay.tsx +++ /dev/null @@ -1,243 +0,0 @@ -import React, { useMemo } from 'react'; -import { useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; -import { Highlight, themes, type PrismTheme } from 'prism-react-renderer'; -import type { CodeAnnotation, CodeRange } from '../lib/schema'; -import type { Palette } from '../lib/palettes'; -import type { PresetConfig } from '../lib/presets'; - -const MONO = - "'Geist Mono', 'Berkeley Mono', 'SF Mono', 'Cascadia Code', 'Fira Code', monospace"; - -const inRange = (line: number, ranges: CodeRange[]): boolean => - ranges.some((r) => line >= r.start && line <= r.end); - -const buildPrismTheme = (palette: Palette): PrismTheme => { - const base = themes.vsDark; - return { - ...base, - plain: { - ...base.plain, - color: palette.text, - backgroundColor: 'transparent', - }, - }; -}; - -const positionToAnchor = ( - position: CodeAnnotation['position'], - margin: number, -): React.CSSProperties => { - const edge = Math.max(40, margin + 24); - switch (position) { - case 'center': - return { - left: '50%', - top: '50%', - transform: 'translate(-50%, -50%)', - }; - case 'bottom-left': - return { left: edge, bottom: edge }; - case 'top-right': - default: - return { right: edge, top: edge }; - } -}; - -const CodeCard: React.FC<{ - annotation: CodeAnnotation; - palette: Palette; - config: PresetConfig; - enterFrame: number; - exitFrame: number; -}> = ({ annotation, palette, config, enterFrame, exitFrame }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - const lines = useMemo( - () => annotation.code.replace(/\n$/, '').split('\n'), - [annotation.code], - ); - const prismTheme = useMemo(() => buildPrismTheme(palette), [palette]); - - if (frame < enterFrame || frame >= exitFrame) return null; - - const localFrame = frame - enterFrame; - const totalFrames = exitFrame - enterFrame; - - const enterProgress = interpolate(localFrame, [0, 0.35 * fps], [0, 1], { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - const exitStart = Math.max(0, totalFrames - 0.35 * fps); - const exitProgress = interpolate( - localFrame, - [exitStart, totalFrames], - [0, 1], - { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }, - ); - - const opacity = enterProgress * (1 - exitProgress); - const scale = interpolate(enterProgress, [0, 1], [0.96, 1]); - const blur = interpolate(enterProgress, [0, 1], [6, 0]); - - const highlightRanges = annotation.highlight ?? []; - const focusRanges = annotation.focus ?? []; - const hasFocus = focusRanges.length > 0; - const anchor = positionToAnchor( - annotation.position ?? 'top-right', - config.margin, - ); - const maxLine = lines.length; - const gutterWidth = `${String(maxLine).length + 1}ch`; - - return ( -
- {annotation.title && ( -
- {annotation.title} -
- )} - - {({ tokens, getLineProps, getTokenProps }) => ( -
-            {tokens.map((line, i) => {
-              const lineNumber = i + 1;
-              const isHighlighted = inRange(lineNumber, highlightRanges);
-              const isFocused = !hasFocus || inRange(lineNumber, focusRanges);
-              const lineOpacity = isFocused ? 1 : 0.3;
-              const lineFilter = isFocused ? 'none' : 'blur(1.2px)';
-              const bg = isHighlighted ? `${palette.accent}22` : 'transparent';
-              const lineBorder = isHighlighted
-                ? `2px solid ${palette.accent}`
-                : `2px solid transparent`;
-              const { key: _lineKey, ...lineRest } = getLineProps({
-                line,
-                key: i,
-              });
-
-              return (
-                
- - {lineNumber} - - - {line.map((token, tokenIndex) => { - const { key: _tokenKey, ...tokenRest } = getTokenProps({ - token, - key: tokenIndex, - }); - return ( - - ); - })} - -
- ); - })} -
- )} -
-
- ); -}; - -export const CodeAnnotationOverlay: React.FC<{ - annotations: CodeAnnotation[]; - palette: Palette; - config: PresetConfig; -}> = ({ annotations, palette, config }) => { - const { fps } = useVideoConfig(); - - if (!annotations.length) return null; - - return ( - <> - {annotations.map((annotation, i) => { - const enterFrame = Math.round(annotation.t * fps); - const exitFrame = Math.round((annotation.t + annotation.dur) * fps); - return ( - - ); - })} - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/ColorGradeOverlay.tsx b/plugins/droid-control/remotion/src/components/ColorGradeOverlay.tsx deleted file mode 100644 index 83c870f..0000000 --- a/plugins/droid-control/remotion/src/components/ColorGradeOverlay.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import { AbsoluteFill } from 'remotion'; -import type { Palette } from '../lib/palettes'; - -/** - * Global colour-grade post-processing layer — analogous to a DaVinci Resolve - * colour grade applied over the final composite. - * - * - Factory (warm): warm amber tint via `mix-blend-mode: color` - * - Catppuccin (cool): cool blue tint at 75 % of the given intensity - * - A nested radial vignette darkens the corners for a cinematic frame. - * - * Place this as the **last** child in the z-stack so it sits above all - * content, including any noise overlays. - */ -export const ColorGradeOverlay: React.FC<{ - palette: Palette; - intensity?: number; -}> = ({ palette, intensity = 0.04 }) => { - const isWarm = palette.accent === '#EE6018'; - - const gradeColor = isWarm - ? `rgba(200, 120, 40, ${intensity})` - : `rgba(80, 100, 200, ${intensity * 0.75})`; - - return ( - - {/* Colour tint — shifts the entire frame's temperature */} - - - {/* Radial vignette — subtle darkening at the corners */} - - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/DroidOutro.tsx b/plugins/droid-control/remotion/src/components/DroidOutro.tsx deleted file mode 100644 index 716ea38..0000000 --- a/plugins/droid-control/remotion/src/components/DroidOutro.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import React from 'react'; -import { AbsoluteFill, useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; -import type { Palette } from '../lib/palettes'; -import { RotorMark } from './RotorMark'; -import { DroidWordmark } from './DroidWordmark'; - -export const DroidOutro: React.FC<{ - palette: Palette; -}> = ({ palette }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - const rotorCenterX = 303.105; - const rotorCenterY = 319.528; - const rotorCenterXPercent = (rotorCenterX / 613) * 100; - const rotorCenterYPercent = (rotorCenterY / 650) * 100; - const topRightSliceYPercent = ((rotorCenterY - (613 - rotorCenterX)) / 650) * 100; - - // Phase 1: Fan out the 8 triangles (0s to 1.5s) - const fanDuration = 1.5 * fps; - // Phase 2: Crossfade to ASCII Droid (1.5s to 2.5s) - const fadeDuration = 1.0 * fps; - - // 8 overlapping wedges that form the RotorMark logo - const wedges = Array.from({ length: 8 }).map((_, i) => { - // 1. Scale up as a single stacked blade (frames 0 to 12) - const scaleProgress = interpolate(frame, [0, 12], [0, 1], { - easing: Easing.out(Easing.back(1.5)), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - // 2. Fan out from the single blade (frames 12 to fanDuration) - const rotationProgress = interpolate(frame, [12, fanDuration], [0, i * 45], { - easing: Easing.out(Easing.cubic), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - // Glitch effect: flash opacity slightly during the fanning phase - const isGlitching = frame > 12 && frame < 24 && frame % 3 === 0; - const baseOpacity = interpolate(frame, [0, 12], [0, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const opacity = isGlitching ? 0.5 : baseOpacity; - - return ( -
- -
- ); - }); - - // Crossfade between the rotor triangles and the ASCII logo - const wedgesOpacity = interpolate(frame, [fanDuration, fanDuration + fadeDuration], [1, 0], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - const asciiOpacity = interpolate(frame, [fanDuration, fanDuration + fadeDuration], [0, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - return ( - - {/* The fanning rotor layer */} -
- {wedges} -
- - {/* The ASCII Droid wordmark layer */} -
- -
-
- ); -}; diff --git a/plugins/droid-control/remotion/src/components/DroidWordmark.tsx b/plugins/droid-control/remotion/src/components/DroidWordmark.tsx deleted file mode 100644 index 558f7f8..0000000 --- a/plugins/droid-control/remotion/src/components/DroidWordmark.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react'; -import type { Palette } from '../lib/palettes'; - -const DROID_ASCII = ` - ██████████ ██████████ ██████████ ███ ██████████ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ ██████████ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ███ ███ - ██████████ ███ ███ ██████████ ███ ██████████ -`.replace(/^\n/, '').trimEnd(); - -export const DroidWordmark: React.FC<{ - palette: Palette; - logoColor?: string; - taglineColor?: string; -}> = ({ palette, logoColor, taglineColor }) => ( -
-
- {DROID_ASCII} -
-
- AUTONOMOUS ENGINEERING -
-
-); diff --git a/plugins/droid-control/remotion/src/components/DynamicShadowParallax.tsx b/plugins/droid-control/remotion/src/components/DynamicShadowParallax.tsx deleted file mode 100644 index c88e353..0000000 --- a/plugins/droid-control/remotion/src/components/DynamicShadowParallax.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { useCurrentFrame, useVideoConfig, interpolate } from 'remotion'; - -/** - * Provides subtle shadow-offset parallax that shifts over the video duration, - * creating a subliminal sense of depth as if the light source drifts with a - * slow Ken Burns camera move. - * - * offsetX: 0 → 2 px (horizontal drift) - * offsetY: 8 → 10 px (vertical drift deepens) - */ -export function useShadowParallax(): { offsetX: number; offsetY: number } { - const frame = useCurrentFrame(); - const { durationInFrames } = useVideoConfig(); - - const offsetX = interpolate(frame, [0, durationInFrames], [0, 2], { - extrapolateRight: 'clamp', - }); - const offsetY = interpolate(frame, [0, durationInFrames], [8, 10], { - extrapolateRight: 'clamp', - }); - - return { offsetX, offsetY }; -} diff --git a/plugins/droid-control/remotion/src/components/FloatingParticles.tsx b/plugins/droid-control/remotion/src/components/FloatingParticles.tsx deleted file mode 100644 index 89ab1d7..0000000 --- a/plugins/droid-control/remotion/src/components/FloatingParticles.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import React, { useMemo } from 'react'; -import { AbsoluteFill, useCurrentFrame } from 'remotion'; - -interface ParticleSeed { - baseX: number; - baseY: number; - offsetX: number; - offsetY: number; - size: number; -} - -export const FloatingParticles: React.FC<{ - count?: number; - color?: string; - opacity?: number; -}> = ({ count = 30, color = '#EE6018', opacity = 0.07 }) => { - const frame = useCurrentFrame(); - - // Deterministic particle seeds — stable across frames, varies only by count - const seeds = useMemo( - () => - Array.from({ length: count }, (_, i) => ({ - baseX: (i * 73 + 17) % 100, - baseY: (i * 47 + 31) % 100, - offsetX: (i * 13 + 7) * 0.1, - offsetY: (i * 19 + 11) * 0.1, - size: 2 + (i % 3) * 2, // 2, 4, or 6px - })), - [count] - ); - - return ( - - {seeds.map((p, i) => { - // Slow Lissajous paths driven by frame count - const dx = Math.sin(frame * 0.008 + p.offsetX) * 60; - const dy = Math.cos(frame * 0.006 + p.offsetY) * 40; - - return ( -
- ); - })} - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/GlitchTitle.tsx b/plugins/droid-control/remotion/src/components/GlitchTitle.tsx deleted file mode 100644 index 9376167..0000000 --- a/plugins/droid-control/remotion/src/components/GlitchTitle.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import React, { useMemo } from 'react'; -import { - AbsoluteFill, - useCurrentFrame, - useVideoConfig, - interpolate, - Easing, -} from 'remotion'; -import type { Palette } from '../lib/palettes'; - -const BLOCK_SIZE = 12; -const GRID_WIDTH = 800; -const GRID_HEIGHT = 120; - -interface PixelBlock { - /** Grid-assembled position (top-left corner) */ - x: number; - y: number; - /** Scattered offset from assembled position */ - scatterDx: number; - scatterDy: number; - /** true = accent color, false = text color */ - isAccent: boolean; -} - -/** - * Deterministic "garbled" subtitle: replace ~30% of characters with random ASCII, - * seeded by character index. - */ -function garbleText(text: string): string { - const chars: string[] = []; - for (let i = 0; i < text.length; i++) { - const shouldGarble = (i * 17 + 3) % 10 < 3; // ~30% - if (shouldGarble && text[i] !== ' ') { - const code = 33 + ((i * 17) % 94); - chars.push(String.fromCharCode(code)); - } else { - chars.push(text[i]); - } - } - return chars.join(''); -} - -/** - * Build a deterministic grid of pixel blocks that represent the title area. - * Each block gets a fixed scatter target computed from its index. - */ -function buildBlockGrid(): PixelBlock[] { - const cols = Math.floor(GRID_WIDTH / BLOCK_SIZE); - const rows = Math.floor(GRID_HEIGHT / BLOCK_SIZE); - const blocks: PixelBlock[] = []; - - for (let row = 0; row < rows; row++) { - for (let col = 0; col < cols; col++) { - const i = row * cols + col; - blocks.push({ - x: col * BLOCK_SIZE, - y: row * BLOCK_SIZE, - scatterDx: Math.sin(i * 7.3 + 3.1) * 200, - scatterDy: Math.cos(i * 5.7 + 1.4) * 150, - isAccent: (i * 13 + 7) % 5 === 0, // ~20% accent - }); - } - } - - return blocks; -} - -export const GlitchTitle: React.FC<{ - title: string; - subtitle?: string; - palette: Palette; -}> = ({ title, subtitle, palette }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const blocks = useMemo(buildBlockGrid, []); - const garbled = useMemo( - () => (subtitle ? garbleText(subtitle) : undefined), - [subtitle] - ); - - // Phase boundaries in frames - const scatterEnd = Math.round(0.5 * fps); // ~15 frames at 30fps - const assembleEnd = Math.round(1.5 * fps); // ~45 frames at 30fps - - // --- Garbled subtitle fade-in (during scatter phase) --- - const garbledOpacity = interpolate(frame, [0, scatterEnd], [0, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - // --- Title text fade-in (after assembly completes) --- - const titleOpacity = interpolate( - frame, - [assembleEnd - Math.round(0.2 * fps), assembleEnd], - [0, 1], - { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - - return ( - - {/* Garbled subtitle line above the pixel grid */} - {garbled && ( -
- {garbled} -
- )} - - {/* Pixel block grid container */} -
- {/* Rendered pixel blocks */} - {/* Hoisted outside .map() — same value for every block */} - {(() => { - const scatterOpacity = interpolate(frame, [0, scatterEnd], [0, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const assembleProgress = interpolate( - frame, - [scatterEnd, assembleEnd], - [0, 1], - { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - return blocks.map((block, i) => { - // Phase (c): subtle jitter when assembled - const jitterX = - frame >= assembleEnd ? Math.sin(frame * 0.1 + i) * 1.5 : 0; - const jitterY = - frame >= assembleEnd ? Math.cos(frame * 0.13 + i * 0.7) * 1.5 : 0; - - // Interpolate from scatter position to grid position - const dx = interpolate( - assembleProgress, - [0, 1], - [block.scatterDx, 0] - ); - const dy = interpolate( - assembleProgress, - [0, 1], - [block.scatterDy, 0] - ); - - const opacity = frame < scatterEnd ? scatterOpacity : 1; - const x = block.x + dx + jitterX; - const y = block.y + dy + jitterY; - - return ( -
- ); - }); - })()} - - {/* Title text rendered on top of assembled blocks */} -
- {title} -
-
- - {/* Scanline overlay */} -
- - ); -}; diff --git a/plugins/droid-control/remotion/src/components/GlowLines.tsx b/plugins/droid-control/remotion/src/components/GlowLines.tsx deleted file mode 100644 index 516ce02..0000000 --- a/plugins/droid-control/remotion/src/components/GlowLines.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import React from 'react'; -import { - AbsoluteFill, - useCurrentFrame, - useVideoConfig, - interpolate, -} from 'remotion'; - -interface GlowEvent { - t: number; - y: string; // percentage within terminal content area - dur?: number; -} - -const DEFAULT_DURATION = 0.95; // seconds - -/** - * Renders a single glow bar for a content event. - * Fades in over 0.15s, holds for 0.3s, fades out over 0.5s. - */ -const GlowBar: React.FC<{ - event: GlowEvent; - color: string; - fps: number; - frame: number; -}> = ({ event, color, fps, frame }) => { - const totalDur = event.dur ?? DEFAULT_DURATION; - const startFrame = Math.round(event.t * fps); - - // Phase durations in frames - const fadeInFrames = Math.round(0.15 * fps); - const holdFrames = Math.round(0.3 * fps); - const fadeOutFrames = Math.max(0, Math.round((totalDur - 0.15 - 0.3) * fps)); - const endFrame = startFrame + fadeInFrames + holdFrames + fadeOutFrames; - - // Outside active range → don't render - if (frame < startFrame || frame > endFrame) { - return null; - } - - const fadeInEnd = startFrame + fadeInFrames; - const holdEnd = fadeInEnd + holdFrames; - - let opacity: number; - if (frame <= fadeInEnd) { - // Fade in - opacity = interpolate(frame, [startFrame, fadeInEnd], [0, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - } else if (frame <= holdEnd) { - // Hold at full - opacity = 1; - } else { - // Fade out - opacity = interpolate(frame, [holdEnd, endFrame], [1, 0], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - } - - return ( -
- ); -}; - -export const GlowLines: React.FC<{ - events: GlowEvent[]; - color?: string; -}> = ({ events, color = '#EE6018' }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - return ( - - {events.map((event, i) => ( - - ))} - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/KeystrokeOverlay.tsx b/plugins/droid-control/remotion/src/components/KeystrokeOverlay.tsx deleted file mode 100644 index ee776e8..0000000 --- a/plugins/droid-control/remotion/src/components/KeystrokeOverlay.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; -import type { Keystroke } from '../lib/schema'; -import type { Palette } from '../lib/palettes'; -import type { PresetConfig } from '../lib/presets'; - -const KeystrokePill: React.FC<{ - label: string; - palette: Palette; - config: PresetConfig; - enterFrame: number; - exitFrame: number; -}> = ({ label, palette, config, enterFrame, exitFrame }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const isVisible = frame >= enterFrame && frame < exitFrame; - if (!isVisible) return null; - - const localFrame = frame - enterFrame; - - // Pop-in animation over 0.2s - const enterProgress = interpolate(localFrame, [0, 0.2 * fps], [0, 1], { - easing: Easing.bezier(0.34, 1.56, 0.64, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - // Fade out over last 0.15s - const totalFrames = exitFrame - enterFrame; - const fadeOutStart = totalFrames - 0.15 * fps; - const exitOpacity = interpolate( - localFrame, - [fadeOutStart, totalFrames], - [1, 0], - { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - - const scale = interpolate(enterProgress, [0, 1], [0.8, 1]); - const enterOpacity = enterProgress; - - return ( -
- {label} -
- ); -}; - -export const KeystrokeOverlay: React.FC<{ - keys: Keystroke[]; - palette: Palette; - config: PresetConfig; -}> = ({ keys, palette, config }) => { - const { fps } = useVideoConfig(); - const defaultDur = 1.2; - - return ( - <> - {keys.map((key, i) => { - const enterFrame = Math.round(key.t * fps); - const naturalExit = Math.round((key.t + (key.dur ?? defaultDur)) * fps); - const nextStart = - i + 1 < keys.length ? Math.round(keys[i + 1].t * fps) : Infinity; - const exitFrame = Math.min(naturalExit, nextStart); - - return ( - - ); - })} - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/NoiseOverlay.tsx b/plugins/droid-control/remotion/src/components/NoiseOverlay.tsx deleted file mode 100644 index 5cb5608..0000000 --- a/plugins/droid-control/remotion/src/components/NoiseOverlay.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; -import { AbsoluteFill } from 'remotion'; - -export const NoiseOverlay: React.FC<{ - opacity?: number; -}> = ({ opacity = 0.03 }) => { - return ( - - - - - - - - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/RotorMark.tsx b/plugins/droid-control/remotion/src/components/RotorMark.tsx deleted file mode 100644 index 6c30e64..0000000 --- a/plugins/droid-control/remotion/src/components/RotorMark.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; - -const ROTOR_PATH = - 'M396.406 180.565C395.606 180.367 394.858 179.997 394.213 179.483C393.568 178.968 393.041 178.321 392.671 177.585C392.299 176.848 392.092 176.04 392.061 175.216C392.031 174.391 392.179 173.571 392.496 172.809C403.427 146.207 408.25 124.922 400.466 116.012C379.851 92.371 297.179 139.382 270.819 155.303C270.113 155.728 269.324 155.995 268.505 156.086C267.687 156.178 266.858 156.091 266.076 155.833C265.294 155.575 264.576 155.152 263.973 154.591C263.369 154.031 262.894 153.346 262.579 152.586C251.499 126.04 239.85 107.576 228.044 106.775C196.75 104.634 171.526 196.337 164.142 226.226C163.945 227.026 163.577 227.775 163.064 228.419C162.55 229.065 161.903 229.591 161.167 229.962C160.432 230.334 159.625 230.541 158.801 230.571C157.977 230.602 157.157 230.454 156.396 230.137C129.794 219.206 108.499 214.383 99.5981 222.167C75.9574 242.782 122.96 325.454 138.881 351.814C139.307 352.519 139.575 353.308 139.667 354.128C139.759 354.946 139.674 355.776 139.416 356.558C139.158 357.341 138.733 358.059 138.172 358.662C137.61 359.266 136.925 359.74 136.163 360.053C109.626 371.133 91.1623 382.782 90.3522 394.588C88.22 425.882 179.915 451.107 209.813 458.491C210.612 458.69 211.358 459.059 212.001 459.573C212.644 460.087 213.169 460.735 213.538 461.47C213.909 462.205 214.117 463.011 214.146 463.834C214.177 464.656 214.03 465.477 213.714 466.236C202.783 492.838 197.96 514.132 205.744 523.034C226.359 546.675 309.041 499.672 335.4 483.751C336.106 483.325 336.896 483.057 337.715 482.965C338.534 482.872 339.363 482.958 340.145 483.217C340.928 483.475 341.645 483.899 342.249 484.461C342.852 485.022 343.327 485.708 343.641 486.469C354.721 513.006 366.36 531.471 378.175 532.281C409.47 534.413 434.693 442.718 442.068 412.82C442.267 412.02 442.637 411.272 443.152 410.629C443.666 409.985 444.314 409.46 445.051 409.089C445.787 408.719 446.595 408.512 447.419 408.483C448.243 408.453 449.063 408.601 449.824 408.919C476.425 419.85 497.711 424.663 506.621 416.888C530.262 396.273 483.25 313.591 467.329 287.232C466.906 286.526 466.64 285.736 466.55 284.919C466.459 284.1 466.546 283.272 466.804 282.49C467.062 281.708 467.485 280.991 468.045 280.388C468.604 279.785 469.288 279.308 470.047 278.992C496.593 267.912 515.057 256.263 515.858 244.457C517.999 213.162 426.295 187.94 396.406 180.565ZM360.503 150.564C366.518 161.346 335.521 233.191 312.467 283.443C312.082 284.283 311.449 284.985 310.652 285.454C309.856 285.923 308.934 286.138 308.012 286.068C307.09 285.998 306.211 285.647 305.495 285.063C304.778 284.478 304.258 283.689 304.003 282.8C294.692 250.127 284.05 211.739 272.663 179.15C272.216 177.871 272.238 176.474 272.726 175.21C273.214 173.946 274.136 172.897 275.325 172.25C303.761 156.719 352.421 136.095 360.503 150.564ZM224.226 159.456C236.098 162.827 264.981 235.547 284.208 287.382C284.529 288.247 284.577 289.191 284.346 290.085C284.114 290.979 283.615 291.781 282.915 292.383C282.214 292.986 281.346 293.359 280.427 293.453C279.508 293.548 278.583 293.359 277.774 292.912C248.063 276.422 213.416 256.776 182.317 241.785C181.1 241.194 180.131 240.191 179.584 238.953C179.036 237.715 178.946 236.323 179.329 235.025C188.481 203.964 208.277 154.94 224.226 159.456ZM134.151 262.11C144.924 256.095 216.778 287.093 267.02 310.147C267.861 310.532 268.563 311.166 269.032 311.963C269.501 312.759 269.716 313.681 269.646 314.602C269.575 315.524 269.225 316.402 268.64 317.119C268.056 317.835 267.267 318.357 266.378 318.611C233.714 327.922 195.316 338.564 162.727 349.952C161.45 350.396 160.055 350.373 158.793 349.885C157.531 349.397 156.483 348.477 155.837 347.288C140.334 318.852 119.673 270.192 134.151 262.11ZM143.043 398.388C146.405 386.516 219.133 357.632 270.968 338.405C271.834 338.085 272.778 338.037 273.672 338.268C274.567 338.5 275.368 338.999 275.971 339.699C276.572 340.4 276.947 341.268 277.041 342.186C277.135 343.105 276.946 344.031 276.499 344.84C260 374.552 240.353 409.198 225.362 440.287C224.777 441.509 223.774 442.482 222.535 443.031C221.296 443.581 219.902 443.671 218.603 443.286C187.541 434.189 138.518 414.338 143.043 398.388ZM245.698 488.463C239.673 477.69 270.679 405.837 293.733 355.594C294.119 354.753 294.753 354.051 295.549 353.582C296.346 353.113 297.267 352.899 298.189 352.969C299.111 353.038 299.99 353.389 300.706 353.973C301.422 354.558 301.943 355.348 302.197 356.237C311.508 388.9 322.151 427.299 333.538 459.887C333.982 461.166 333.957 462.56 333.468 463.823C332.979 465.085 332.056 466.132 330.866 466.777C302.439 482.28 253.77 502.941 245.726 488.463H245.698ZM381.974 479.57C370.093 476.209 341.21 403.481 321.983 351.646C321.661 350.779 321.612 349.833 321.843 348.937C322.074 348.041 322.575 347.238 323.277 346.635C323.979 346.032 324.85 345.659 325.77 345.566C326.691 345.473 327.618 345.665 328.426 346.115C358.129 362.605 392.784 382.261 423.874 397.252C425.095 397.839 426.065 398.842 426.613 400.081C427.161 401.32 427.249 402.713 426.863 404.012C417.719 435.12 397.924 484.095 381.974 479.57ZM472.049 376.916C461.267 382.94 389.423 351.934 339.171 328.88C338.331 328.494 337.628 327.861 337.159 327.064C336.69 326.268 336.477 325.346 336.547 324.425C336.616 323.503 336.966 322.625 337.551 321.908C338.135 321.191 338.925 320.671 339.814 320.417C372.486 311.106 410.876 300.463 443.464 289.075C444.745 288.631 446.141 288.655 447.405 289.145C448.668 289.635 449.717 290.558 450.364 291.748C465.857 320.175 486.519 368.843 472.049 376.916ZM463.157 240.639C459.787 252.52 387.067 281.404 335.233 300.631C334.365 300.953 333.42 301.002 332.524 300.771C331.628 300.539 330.825 300.039 330.222 299.337C329.619 298.635 329.247 297.764 329.154 296.843C329.06 295.923 329.251 294.996 329.702 294.187C346.192 264.485 365.838 229.829 380.829 198.739C381.418 197.521 382.421 196.551 383.66 196.004C384.898 195.456 386.291 195.366 387.589 195.751C418.65 204.894 467.673 224.689 463.157 240.639Z'; - -export const RotorMark: React.FC<{ - size?: number; - width?: number; - height?: number; - color?: string; - style?: React.CSSProperties; -}> = ({ size = 24, width, height, color = 'white', style }) => ( - - - -); diff --git a/plugins/droid-control/remotion/src/components/SectionHeader.tsx b/plugins/droid-control/remotion/src/components/SectionHeader.tsx deleted file mode 100644 index 689c9c0..0000000 --- a/plugins/droid-control/remotion/src/components/SectionHeader.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import React from 'react'; -import { useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; -import type { Section } from '../lib/schema'; -import type { Palette } from '../lib/palettes'; -import type { PresetConfig } from '../lib/presets'; - -const SectionTitle: React.FC<{ - title: string; - palette: Palette; - config: PresetConfig; - enterFrame: number; - exitFrame: number; -}> = ({ title, palette, config, enterFrame, exitFrame }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const isVisible = frame >= enterFrame && frame < exitFrame; - if (!isVisible) return null; - - const localFrame = frame - enterFrame; - - // Slide down & fade in - const enterProgress = interpolate(localFrame, [0, 0.4 * fps], [0, 1], { - easing: Easing.bezier(0.22, 1, 0.36, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - const totalFrames = exitFrame - enterFrame; - const fadeOutStart = totalFrames - 0.3 * fps; - const exitProgress = interpolate( - localFrame, - [fadeOutStart, totalFrames], - [0, 1], - { - easing: Easing.bezier(0.32, 0, 0.67, 0), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - - const opacity = - interpolate(enterProgress, [0, 1], [0, 1]) * - interpolate(exitProgress, [0, 1], [1, 0]); - const translateY = - interpolate(enterProgress, [0, 1], [-20, 0]) - - interpolate(exitProgress, [0, 1], [0, -20]); - - return ( -
- {title} -
- ); -}; - -export const SectionHeaderOverlay: React.FC<{ - sections: Section[]; - palette: Palette; - config: PresetConfig; -}> = ({ sections, palette, config }) => { - const { fps, durationInFrames } = useVideoConfig(); - - return ( - <> - {sections.map((sec, i) => { - const enterFrame = Math.round(sec.t * fps); - const nextStart = - i + 1 < sections.length - ? Math.round(sections[i + 1].t * fps) - : durationInFrames; - const exitFrame = Math.min(nextStart, durationInFrames); - - return ( - - ); - })} - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/SectionTransition.tsx b/plugins/droid-control/remotion/src/components/SectionTransition.tsx deleted file mode 100644 index 4bd1fcc..0000000 --- a/plugins/droid-control/remotion/src/components/SectionTransition.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import React from 'react'; -import { - AbsoluteFill, - useCurrentFrame, - useVideoConfig, - interpolate, - Easing, -} from 'remotion'; -import type { Section } from '../lib/schema'; - -const SWEEP_DURATION_S = 0.5; -const BLUR_PX = 28; - -const FrostedSweep: React.FC<{ - triggerFrame: number; -}> = ({ triggerFrame }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const sweepFrames = Math.round(SWEEP_DURATION_S * fps); - const endFrame = triggerFrame + sweepFrames; - - if (frame < triggerFrame || frame > endFrame) return null; - - const localFrame = frame - triggerFrame; - - // Band sweeps from left (-10%) to right (110%) - const bandX = interpolate(localFrame, [0, sweepFrames], [-10, 110], { - easing: Easing.bezier(0.4, 0, 0.2, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - // Opacity: quick fade in, hold, quick fade out - const opacity = interpolate( - localFrame, - [0, sweepFrames * 0.15, sweepFrames * 0.85, sweepFrames], - [0, 1, 1, 0], - { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }, - ); - - return ( - -
- - ); -}; - -export const SectionTransitionOverlay: React.FC<{ - sections: Section[]; -}> = ({ sections }) => { - const { fps } = useVideoConfig(); - - // Skip the first section -- it marks the start, not a transition point - return ( - <> - {sections.slice(1).map((sec) => { - const triggerFrame = Math.round(sec.t * fps); - return ( - - ); - })} - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/ShowcaseTransition.tsx b/plugins/droid-control/remotion/src/components/ShowcaseTransition.tsx deleted file mode 100644 index 303091e..0000000 --- a/plugins/droid-control/remotion/src/components/ShowcaseTransition.tsx +++ /dev/null @@ -1,335 +0,0 @@ -// Transition style names (`whip-pan`, `light-leak`, `flash`, `glitch-lite`) and -// the "selectable enum of named transitions" API shape are inspired by -// @hyperframes/shader-transitions (Apache-2.0). Implementations below are -// original Remotion-native CSS/SVG overlays — no GLSL/WebGL involved. -// https://github.com/heygen-com/hyperframes/tree/main/packages/shader-transitions - -import React from 'react'; -import { AbsoluteFill, interpolate, Easing, random } from 'remotion'; -import type { - TransitionPresentation, - TransitionPresentationComponentProps, -} from '@remotion/transitions'; -import type { TransitionStyle } from '../lib/schema'; -import type { Palette } from '../lib/palettes'; - -type BaseProps = { - palette: Palette; -}; - -const clamp01 = (v: number): number => Math.min(1, Math.max(0, v)); - -// --------------------------------------------------------------------------- -// Motion blur: blur() + scale + opacity crossfade. (Existing aesthetic.) -// --------------------------------------------------------------------------- -const MotionBlurPresentation: React.FC< - TransitionPresentationComponentProps -> = ({ children, presentationDirection, presentationProgress }) => { - const maxBlur = 6; - const enterScale = 1.03; - const isEntering = presentationDirection === 'entering'; - - if (isEntering) { - const blur = interpolate(presentationProgress, [0, 1], [maxBlur, 0], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const scale = interpolate(presentationProgress, [0, 1], [enterScale, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - return ( - - {children} - - ); - } - - const blur = interpolate(presentationProgress, [0, 1], [0, maxBlur], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - return ( - - {children} - - ); -}; - -// --------------------------------------------------------------------------- -// Flash: hard cut emphasised by a warm/white flash overlay at the midpoint. -// --------------------------------------------------------------------------- -const FlashPresentation: React.FC< - TransitionPresentationComponentProps -> = ({ children, presentationDirection, presentationProgress, passedProps }) => { - const isEntering = presentationDirection === 'entering'; - const palette = passedProps.palette; - const isWarm = palette.accent === '#EE6018'; - - const sceneOpacity = isEntering - ? clamp01((presentationProgress - 0.45) / 0.35) - : clamp01(1 - (presentationProgress - 0.2) / 0.35); - - // Flash is rendered only on the entering side so the peak is single-source. - const flashOpacity = isEntering - ? interpolate( - presentationProgress, - [0, 0.35, 0.55, 0.85, 1], - [0, 0.25, 1, 0.2, 0], - { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }, - ) - : 0; - - const flashColor = isWarm - ? `rgba(255, 220, 180, ${flashOpacity})` - : `rgba(235, 240, 255, ${flashOpacity})`; - - return ( - - {children} - {flashOpacity > 0 && ( - - )} - - ); -}; - -// --------------------------------------------------------------------------- -// Whip-pan: horizontal pan + motion blur for energetic scene changes. -// --------------------------------------------------------------------------- -const WhipPanPresentation: React.FC< - TransitionPresentationComponentProps -> = ({ children, presentationDirection, presentationProgress }) => { - const isEntering = presentationDirection === 'entering'; - const easing = Easing.bezier(0.6, 0, 0.1, 1); - const eased = easing(presentationProgress); - const maxBlur = 14; - - if (isEntering) { - const translateX = interpolate(eased, [0, 1], [30, 0]); - const blur = interpolate(presentationProgress, [0, 0.6, 1], [maxBlur, 4, 0], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const opacity = interpolate(presentationProgress, [0, 0.2, 1], [0, 1, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - return ( - - {children} - - ); - } - - const translateX = interpolate(eased, [0, 1], [0, -30]); - const blur = interpolate(presentationProgress, [0, 0.4, 1], [0, 10, maxBlur], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const opacity = interpolate(presentationProgress, [0, 0.8, 1], [1, 1, 0], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - return ( - - {children} - - ); -}; - -// --------------------------------------------------------------------------- -// Light leak: warm moving gradient sweeps across while scenes crossfade. -// --------------------------------------------------------------------------- -const LightLeakPresentation: React.FC< - TransitionPresentationComponentProps -> = ({ children, presentationDirection, presentationProgress, passedProps }) => { - const isEntering = presentationDirection === 'entering'; - const palette = passedProps.palette; - const isWarm = palette.accent === '#EE6018'; - - const sceneOpacity = isEntering - ? interpolate(presentationProgress, [0, 0.5, 1], [0, 0.4, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }) - : interpolate(presentationProgress, [0, 0.5, 1], [1, 0.6, 0], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - const sweepOpacity = isEntering - ? interpolate( - presentationProgress, - [0, 0.3, 0.6, 1], - [0, 1, 0.6, 0], - { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }, - ) - : 0; - - const sweepPosition = interpolate(presentationProgress, [0, 1], [-40, 140]); - - const leakColor = isWarm ? '238, 96, 24' : '137, 180, 250'; - - return ( - - {children} - {sweepOpacity > 0 && ( - - )} - - ); -}; - -// --------------------------------------------------------------------------- -// Glitch-lite: brief RGB offset + clipped horizontal bands near midpoint. -// --------------------------------------------------------------------------- -const GlitchLitePresentation: React.FC< - TransitionPresentationComponentProps -> = ({ children, presentationDirection, presentationProgress }) => { - const isEntering = presentationDirection === 'entering'; - - const sceneOpacity = isEntering - ? interpolate(presentationProgress, [0, 0.4, 1], [0, 1, 1], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }) - : interpolate(presentationProgress, [0, 0.6, 1], [1, 1, 0], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - const glitchIntensity = interpolate( - presentationProgress, - [0, 0.35, 0.55, 0.75, 1], - [0, 1, 1, 0.3, 0], - { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }, - ); - - const seedBase = isEntering ? 1000 : 2000; - const jitterX = (random(`glitch-x-${Math.round(presentationProgress * 60) + seedBase}`) - 0.5) * 16 * glitchIntensity; - const rgbSplit = 6 * glitchIntensity; - - const bandTop = 20 + 40 * random(`glitch-band-top-${Math.round(presentationProgress * 30) + seedBase}`); - const bandHeight = 6 + 14 * random(`glitch-band-h-${Math.round(presentationProgress * 30) + seedBase}`); - const showBand = glitchIntensity > 0.6; - - return ( - - {/* Red ghost */} - 0 ? 0.45 : 0, - }} - > - - {children} - - - {/* Blue ghost */} - 0 ? 0.45 : 0, - }} - > - - {children} - - - {/* Main scene */} - - {children} - - {/* Displaced band */} - {showBand && ( - - {children} - - )} - - ); -}; - -const presentationMap: Record< - TransitionStyle, - React.FC> -> = { - 'motion-blur': MotionBlurPresentation, - flash: FlashPresentation, - 'whip-pan': WhipPanPresentation, - 'light-leak': LightLeakPresentation, - 'glitch-lite': GlitchLitePresentation, -}; - -export const getTransitionPresentation = ( - style: TransitionStyle, - palette: Palette, -): TransitionPresentation => { - const component = presentationMap[style]; - return { - component, - props: { palette }, - }; -}; diff --git a/plugins/droid-control/remotion/src/components/SpotlightOverlay.tsx b/plugins/droid-control/remotion/src/components/SpotlightOverlay.tsx deleted file mode 100644 index b54ee55..0000000 --- a/plugins/droid-control/remotion/src/components/SpotlightOverlay.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; - -interface Region { - x: string; - y: string; - w: string; - h: string; -} - -function pctToNum(val: string): number { - return parseFloat(val.replace('%', '')) / 100; -} - -export const SpotlightOverlay: React.FC<{ - startTime: number; - duration: number; - region: Region; - dim?: number; -}> = ({ startTime, duration, region, dim = 0.6 }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const startFrame = startTime * fps; - const endFrame = (startTime + duration) * fps; - - if (frame < startFrame || frame > endFrame) return null; - - const localFrame = frame - startFrame; - const totalFrames = endFrame - startFrame; - - // Fade in over 0.3s, fade out over 0.3s - const fadeIn = interpolate(localFrame, [0, 0.3 * fps], [0, 1], { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const fadeOut = interpolate( - localFrame, - [totalFrames - 0.3 * fps, totalFrames], - [1, 0], - { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - const opacity = Math.min(fadeIn, fadeOut); - - const rx = pctToNum(region.x); - const ry = pctToNum(region.y); - const rw = pctToNum(region.w); - const rh = pctToNum(region.h); - - // SVG mask: white everywhere except a black (transparent) cutout for the spotlight region. - // Use only the standard `maskImage` property (Chrome uses it in headless rendering). - const svgMask = `url("data:image/svg+xml,${encodeURIComponent( - `` + - `` + - `` + - `` - )}")`; - - return ( -
- ); -}; diff --git a/plugins/droid-control/remotion/src/components/StaggeredPanelEntrance.tsx b/plugins/droid-control/remotion/src/components/StaggeredPanelEntrance.tsx deleted file mode 100644 index 3701207..0000000 --- a/plugins/droid-control/remotion/src/components/StaggeredPanelEntrance.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import { useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; - -export const StaggeredPanelEntrance: React.FC<{ - delay?: number; - children: React.ReactNode; -}> = ({ delay = 0, children }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const startFrame = delay * fps; - const progress = interpolate( - frame, - [startFrame, startFrame + 0.5 * fps], - [0, 1], - { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - - const scale = interpolate(progress, [0, 1], [0.92, 1]); - const opacity = interpolate(progress, [0, 1], [0, 1]); - const translateY = interpolate(progress, [0, 1], [12, 0]); - - return ( -
- {children} -
- ); -}; diff --git a/plugins/droid-control/remotion/src/components/TitleCard.tsx b/plugins/droid-control/remotion/src/components/TitleCard.tsx deleted file mode 100644 index cac9bce..0000000 --- a/plugins/droid-control/remotion/src/components/TitleCard.tsx +++ /dev/null @@ -1,260 +0,0 @@ -import { - AbsoluteFill, - useCurrentFrame, - useVideoConfig, - interpolate, - Easing, -} from 'remotion'; -import { fitText } from '@remotion/layout-utils'; -import type { Palette } from '../lib/palettes'; -import { RotorMark } from './RotorMark'; -import { BreathingZoom } from './ZoomEffect'; - -const TITLE_MAX_FONT = 64; -const SUBTITLE_MAX_FONT = 24; -const TITLE_FONT_FAMILY = "'Geist', system-ui, sans-serif"; - -export const TitleCard: React.FC<{ - title: string; - subtitle: string; - palette: Palette; - speedNote?: string; -}> = ({ title, subtitle, palette, speedNote }) => { - const frame = useCurrentFrame(); - const { fps, width } = useVideoConfig(); - - const titleFontSize = Math.min( - TITLE_MAX_FONT, - fitText({ - text: title, - withinWidth: width * 0.8, - fontFamily: TITLE_FONT_FAMILY, - fontWeight: 700, - letterSpacing: '-0.04em', - }).fontSize, - ); - - const subtitleFontSize = Math.min( - SUBTITLE_MAX_FONT, - fitText({ - text: subtitle || ' ', - withinWidth: width * 0.7, - fontFamily: TITLE_FONT_FAMILY, - fontWeight: 400, - }).fontSize, - ); - - // Tagline fades in first (monospace label above title) - const taglineProgress = interpolate(frame, [0, 0.4 * fps], [0, 1], { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const taglineY = interpolate(taglineProgress, [0, 1], [15, 0]); - const taglineOpacity = taglineProgress; - - // Title: scale 1.08→1.0 + translateY 30→0 + fade in - const titleProgress = interpolate(frame, [0, 0.6 * fps], [0, 1], { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const titleY = interpolate(titleProgress, [0, 1], [30, 0]); - const titleScale = interpolate(titleProgress, [0, 1], [1.08, 1.0]); - const titleOpacity = titleProgress; - - // Subtitle follows with a slight delay - const subtitleProgress = interpolate( - frame, - [0.15 * fps, 0.75 * fps], - [0, 1], - { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - const subtitleY = interpolate(subtitleProgress, [0, 1], [20, 0]); - const subtitleOpacity = subtitleProgress; - - const isFactory = palette.accent === '#EE6018'; - - // --- Factory preset: spinning rotor leads the accent line --- - const SWEEP_WIDTH = 280; - const ROTOR_SIZE = 28; - const sweepStart = 0.15 * fps; - const sweepEnd = 0.7 * fps; - - // Rotor horizontal progress: 0 → SWEEP_WIDTH - const rotorProgress = interpolate(frame, [sweepStart, sweepEnd], [0, 1], { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const rotorX = rotorProgress * SWEEP_WIDTH; - - // Continuous spin: ties to progress so it rolls naturally - const rotorRotation = interpolate(rotorProgress, [0, 1], [0, 720]); - - // Rotor fades in at the start, fades out after reaching the end - const rotorOpacity = interpolate( - frame, - [sweepStart, sweepStart + 0.08 * fps, sweepEnd, sweepEnd + 0.25 * fps], - [0, 1, 1, 0], - { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' } - ); - - // Trail line grows to follow the rotor - const trailWidth = rotorX; - const trailOpacity = interpolate( - frame, - [sweepStart, sweepStart + 0.1 * fps], - [0, 1], - { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' } - ); - - // --- Non-factory: original simple line animation --- - const lineWidth = interpolate(frame, [0.2 * fps, 0.7 * fps], [0, 120], { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - const sweepPosition = interpolate( - frame, - [0.2 * fps, 0.2 * fps + 0.8 * fps], - [-200, 100], - { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - } - ); - - return ( - - - {/* Monospace tagline above title (shows speedNote if present) */} - {speedNote && ( -
- {speedNote} -
- )} - - {/* Title with glow, scale entrance, and accent text-shadow */} -
- {title} -
- - {/* Accent line — factory: spinning rotor with trailing line; other: gradient sweep */} - {isFactory ? ( -
- {/* Trailing line: grows from left edge toward the rotor */} -
- - {/* Spinning rotor at the leading edge */} -
- -
-
- ) : ( -
- )} - -
- {subtitle} -
- - - ); -}; diff --git a/plugins/droid-control/remotion/src/components/Watermark.tsx b/plugins/droid-control/remotion/src/components/Watermark.tsx deleted file mode 100644 index 051bdc3..0000000 --- a/plugins/droid-control/remotion/src/components/Watermark.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import { - AbsoluteFill, - useCurrentFrame, - useVideoConfig, - interpolate, -} from 'remotion'; -import { RotorMark } from './RotorMark'; - -export const Watermark: React.FC<{ - opacity?: number; - size?: number; -}> = ({ opacity = 0.2, size = 48 }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const fadeIn = interpolate(frame, [0, fps], [0, opacity], { - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - - return ( - -
- -
-
- ); -}; diff --git a/plugins/droid-control/remotion/src/components/WindowChrome.tsx b/plugins/droid-control/remotion/src/components/WindowChrome.tsx deleted file mode 100644 index 597a4e5..0000000 --- a/plugins/droid-control/remotion/src/components/WindowChrome.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import { useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; -import type { Palette } from '../lib/palettes'; -import type { PresetConfig } from '../lib/presets'; - -const TrafficLight: React.FC<{ - color: string; - cx: number; -}> = ({ color, cx }) => ; - -const TrafficLightRing: React.FC<{ - color: string; - cx: number; -}> = ({ color, cx }) => ( - -); - -const WindowBar: React.FC<{ - config: PresetConfig; - palette: Palette; - width: number; - title?: string; -}> = ({ config, palette, width, title }) => { - if (config.bar === 'none') return null; - - const Dot = config.bar === 'rings' ? TrafficLightRing : TrafficLight; - const isRight = config.barSide === 'right'; - - const dots = ( - - - - - - ); - - return ( -
- {dots} - {title && ( - - {title} - - )} -
- ); -}; - -export const WindowChrome: React.FC<{ - config: PresetConfig; - palette: Palette; - width: number; - height: number; - title?: string; - /** Set to false when an ancestor already handles the entrance animation. */ - animate?: boolean; - children: React.ReactNode; -}> = ({ config, palette, width, height, title, animate = true, children }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - // Animate the window scaling in over 0.5s with a crisp ease-out. - // Skipped when `animate` is false (e.g. StaggeredPanelEntrance handles it). - const enterProgress = animate - ? interpolate(frame, [0, 0.5 * fps], [0, 1], { - easing: Easing.bezier(0.16, 1, 0.3, 1), - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }) - : 1; - - const scale = interpolate(enterProgress, [0, 1], [0.92, 1]); - const opacity = enterProgress; - - const barHeight = config.bar !== 'none' ? 36 : 0; - const contentHeight = height - barHeight; - - return ( -
- -
- {children} -
-
- ); -}; diff --git a/plugins/droid-control/remotion/src/components/WindowReflection.tsx b/plugins/droid-control/remotion/src/components/WindowReflection.tsx deleted file mode 100644 index 6517d03..0000000 --- a/plugins/droid-control/remotion/src/components/WindowReflection.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; - -// Uses -webkit-box-reflect to avoid rendering children twice (which would -// double Video decoding and hurt render performance). -export const WindowReflection: React.FC<{ - opacity?: number; - children: React.ReactNode; -}> = ({ opacity = 0.06, children }) => { - return ( -
- {children} -
- ); -}; diff --git a/plugins/droid-control/remotion/src/components/ZoomEffect.tsx b/plugins/droid-control/remotion/src/components/ZoomEffect.tsx deleted file mode 100644 index bda28d1..0000000 --- a/plugins/droid-control/remotion/src/components/ZoomEffect.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import React from 'react'; -import { useCurrentFrame, useVideoConfig, interpolate, Easing } from 'remotion'; - -interface ZoomRegion { - x: string; - y: string; - w: string; - h: string; -} - -/** Parse a percentage string (e.g. "25%") to a 0–1 fraction. */ -function pctToFraction(val: string): number { - return parseFloat(val.replace('%', '')) / 100; -} - -/** Cinematic ease-in-out for directed zoom motion. */ -const ZOOM_EASING = Easing.bezier(0.25, 0.1, 0.25, 1); - -/** - * Directed zoom to a target region. - * - * Animates from the full view (scale=1) into a zoomed view where the - * target region fills the frame, then back out. - * - * Phases (relative to duration): - * 0–30% IN — scale up to target - * 30–70% HOLD — maintain zoom - * 70–100% OUT — scale back to 1 - */ -export const ZoomEffect: React.FC<{ - startTime: number; - duration: number; - to: ZoomRegion; - children: React.ReactNode; -}> = ({ startTime, duration, to, children }) => { - const frame = useCurrentFrame(); - const { fps } = useVideoConfig(); - - const startFrame = startTime * fps; - const endFrame = (startTime + duration) * fps; - const totalFrames = endFrame - startFrame; - - // Phase boundaries (absolute frame numbers) - const inEnd = startFrame + totalFrames * 0.3; - const holdEnd = startFrame + totalFrames * 0.7; - - // Convert percentage-based region to 0–1 fractions - const xFrac = pctToFraction(to.x); - const yFrac = pctToFraction(to.y); - const wFrac = pctToFraction(to.w); - const hFrac = pctToFraction(to.h); - - const targetScale = Math.min( - 1 / Math.max(0.01, wFrac), - 1 / Math.max(0.01, hFrac) - ); - - // Anchor scaling at the center of the target region so the camera - // "pushes in" toward that point. - const originX = (xFrac + wFrac / 2) * 100; - const originY = (yFrac + hFrac / 2) * 100; - - // Determine zoom progress (0 = full view, 1 = fully zoomed) based - // on the current phase. - let zoomProgress: number; - if (frame < startFrame || frame > endFrame) { - zoomProgress = 0; - } else if (frame <= inEnd) { - // IN — ease from 0 → 1 - zoomProgress = interpolate(frame, [startFrame, inEnd], [0, 1], { - easing: ZOOM_EASING, - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - } else if (frame <= holdEnd) { - // HOLD - zoomProgress = 1; - } else { - // OUT — ease from 1 → 0 - zoomProgress = interpolate(frame, [holdEnd, endFrame], [1, 0], { - easing: ZOOM_EASING, - extrapolateLeft: 'clamp', - extrapolateRight: 'clamp', - }); - } - - const currentScale = interpolate(zoomProgress, [0, 1], [1, targetScale]); - - return ( -
- {children} -
- ); -}; - -/** - * Ambient "breathing" Ken Burns zoom. - * - * Wraps children in a slowly scaling container (1.0 → 1.04) over the - * full composition duration, giving a subtle cinematic drift. - */ -export const BreathingZoom: React.FC<{ - children: React.ReactNode; -}> = ({ children }) => { - const frame = useCurrentFrame(); - const { durationInFrames } = useVideoConfig(); - - const scale = interpolate(frame, [0, durationInFrames], [1.0, 1.04], { - easing: Easing.bezier(0.45, 0, 0.55, 1), - extrapolateRight: 'clamp', - }); - - return ( -
- {children} -
- ); -}; diff --git a/plugins/droid-control/remotion/src/compositions/Showcase.tsx b/plugins/droid-control/remotion/src/compositions/Showcase.tsx deleted file mode 100644 index b373886..0000000 --- a/plugins/droid-control/remotion/src/compositions/Showcase.tsx +++ /dev/null @@ -1,418 +0,0 @@ -import React, { useMemo } from 'react'; -import { z } from 'zod'; -import { AbsoluteFill, Sequence, staticFile, useVideoConfig } from 'remotion'; -import { Video } from '@remotion/media'; -import { TransitionSeries, linearTiming } from '@remotion/transitions'; -import { getTransitionPresentation } from '../components/ShowcaseTransition'; -import { - fidelitySchema, - presetSchema, - layoutSchema, - keystrokeSchema, - effectSchema, - sectionSchema, - codeAnnotationSchema, - transitionStyleSchema, -} from '../lib/schema'; -import { getPalette } from '../lib/palettes'; -import { getPresetConfig } from '../lib/presets'; -import { - TITLE_DURATION_S, - OUTRO_DURATION_S, - TRANSITION_FRAMES, - contentSequenceFrames, - playbackSpeed, -} from '../lib/duration'; -import { Background } from '../components/Background'; -import { WindowChrome } from '../components/WindowChrome'; -import { TitleCard } from '../components/TitleCard'; -import { SectionHeaderOverlay } from '../components/SectionHeader'; -import { KeystrokeOverlay } from '../components/KeystrokeOverlay'; -import { SpotlightOverlay } from '../components/SpotlightOverlay'; -import { StaggeredPanelEntrance } from '../components/StaggeredPanelEntrance'; -import { NoiseOverlay } from '../components/NoiseOverlay'; -import { FloatingParticles } from '../components/FloatingParticles'; -import { ColorGradeOverlay } from '../components/ColorGradeOverlay'; -import { Watermark } from '../components/Watermark'; -import { ZoomEffect } from '../components/ZoomEffect'; -import { SectionTransitionOverlay } from '../components/SectionTransition'; -import { DroidOutro } from '../components/DroidOutro'; -import { CodeAnnotationOverlay } from '../components/CodeAnnotationOverlay'; -import { CalloutOverlay } from '../components/CalloutOverlay'; - -export const showcaseSchema = z.object({ - clips: z.array(z.string()), - layout: layoutSchema, - labels: z.array(z.string()), - title: z.string(), - subtitle: z.string(), - preset: presetSchema, - keys: z.array(keystrokeSchema), - effects: z.array(effectSchema), - sections: z.array(sectionSchema).optional(), - width: z.number().optional(), - height: z.number().optional(), - speedNote: z.string().optional(), - windowTitle: z.string().optional(), - // Longest source clip in source seconds; render-showcase.sh probes it. - clipDuration: z.number().optional(), - // Playback multiplier applied once, here, to every clip. Overlay times - // (keys, sections, effects, codeAnnotations) are already output seconds. - speed: z.number().positive().optional(), - // Resolved by render-showcase.sh (omitted there => chosen by layout). - fidelity: fidelitySchema, - // How clip video is sized inside its panel. - // - "contain" (default): preserve aspect ratio, letterbox if needed. Safe default. - // - "cover": fill the panel, crop overflow. Use when the clip aspect doesn't match the - // panel aspect (e.g. 16:9 landscape browser capture in a near-square side-by-side panel) - // and you'd rather crop edges than see giant black bars. - // - "fill": stretch to fill the panel (distorts aspect). Rarely what you want. - objectFit: z.enum(['contain', 'cover', 'fill']).optional(), - // Timed syntax-highlighted code overlays rendered during the main content - // sequence (above content, below noise/color grade). Timings are relative - // to the start of the main content clip. - codeAnnotations: z.array(codeAnnotationSchema).optional(), - // Presentation used for title->content and content->outro transitions. - // Defaults to 'motion-blur', which preserves existing aesthetic. - transitionStyle: transitionStyleSchema.optional(), -}); - -// Effect types this composition actually renders. Anything schema-valid but -// absent from this set is a silent no-op — warn instead of dropping quietly. -const RENDERED_FX = new Set(['zoom', 'spotlight', 'callout']); -const warnedUnrenderedFx = new Set(); - -const warnUnrenderedEffects = (effects: z.infer[]) => { - for (const effect of effects) { - if (RENDERED_FX.has(effect.fx) || warnedUnrenderedFx.has(effect.fx)) { - continue; - } - warnedUnrenderedFx.add(effect.fx); - console.warn( - `Showcase: effect fx='${effect.fx}' is schema-valid but not rendered by this composition` - ); - } -}; - -const visualTreatmentByFidelity = { - compact: { noiseOpacity: 0.03, gradeIntensity: 0.04 }, - standard: { noiseOpacity: 0.02, gradeIntensity: 0.025 }, - inspect: { noiseOpacity: 0.008, gradeIntensity: 0.012 }, -} as const; - -type ObjectFit = 'contain' | 'cover' | 'fill'; - -// One playback contract for every clip: `speed` is applied here and nowhere -// else, and a clip that ends before the content sequence does not loop -- it -// holds its last decoded frame, so a shorter comparison panel stays on its -// final state. -const ClipVideo: React.FC<{ - clip: string; - speed: number; - objectFit: ObjectFit; - surface: string; -}> = ({ clip, speed, objectFit, surface }) => ( -

_e`PJ@7?Hro{A8GiEbw#-HCsja8vnjlV+| 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 literal 0 HcmV?d00001 diff --git a/plugins/droid-control/fframes/media/Geist-Regular.ttf b/plugins/droid-control/fframes/media/Geist-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4da1b3a6dba4c809bea130138138754650e5a87e GIT binary patch literal 126048 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�yj3@rDuD5@3s_u9~XZY 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 literal 0 HcmV?d00001 diff --git a/plugins/droid-control/fframes/media/GeistMono-Regular.ttf b/plugins/droid-control/fframes/media/GeistMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..50c9d5a667bc397a1495b0bb45a52bef4184661c GIT binary patch literal 148516 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