From ea43545f4b7d7473bf102c18256f87a5f8fb65c8 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 17:25:31 +0900 Subject: [PATCH 01/19] feat(pr-video): add remotion preview scenes --- DECISIONS.md | 5 + package.json | 10 +- pnpm-lock.yaml | 2975 ++++++++++++++++- remotion.config.ts | 18 + src/App.tsx | 6 + .../pr-video/components/pr-video-player.tsx | 23 + .../pr-video/components/team-po-pr-video.tsx | 1328 ++++++++ src/features/pr-video/constants.ts | 30 + src/features/pr-video/remotion-root.tsx | 17 + src/pages/pr-video-page.tsx | 64 + src/remotion-entry.tsx | 6 + tsconfig.node.json | 2 +- 12 files changed, 4456 insertions(+), 28 deletions(-) create mode 100644 remotion.config.ts create mode 100644 src/features/pr-video/components/pr-video-player.tsx create mode 100644 src/features/pr-video/components/team-po-pr-video.tsx create mode 100644 src/features/pr-video/constants.ts create mode 100644 src/features/pr-video/remotion-root.tsx create mode 100644 src/pages/pr-video-page.tsx create mode 100644 src/remotion-entry.tsx diff --git a/DECISIONS.md b/DECISIONS.md index c12810d..0f003fc 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -48,3 +48,8 @@ - Route performance approach: lazy-load route pages from `src/App.tsx`, especially `/team` and `/deck/*`, to keep the initial app bundle smaller without changing route ownership. - Team workspace structure: keep `/team` orchestration in `team-space-view.tsx`, split signed-in server-backed panels into focused `real-team-*` components, and keep the signed-out mock preview separate while sharing tabs, status helpers, and GitHub permission notices. - MSW maintainability: keep route handlers in `src/lib/api/mocks/handlers.ts`, but move reusable team-space fixture builders into `src/lib/api/mocks/team-space-fixtures.ts` so handler code focuses on request behavior. + +## 2026-06-11 +- PR video approach: use Remotion for frame-accurate React motion graphics and `@remotion/player` for in-app preview at `/pr-video` before rendering. +- Remotion dependency policy: keep `remotion`, `@remotion/cli`, and `@remotion/player` on the same exact version to avoid render/runtime mismatches. +- Remotion styling bridge: use `@remotion/tailwind` so Vite preview and Remotion CLI renders share the same Tailwind v3 visual system. diff --git a/package.json b/package.json index dc022ed..2d097bf 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,18 @@ "lint": "pnpm biome lint .", "format": "pnpm biome format --write .", "typecheck": "pnpm tsc --noEmit", - "preview": "vite preview" + "preview": "vite preview", + "video:studio": "remotion studio src/remotion-entry.tsx", + "video:still": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening-frame.png --frame=110 --scale=0.5", + "video:still:problem": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-problem-frame.png --frame=330 --scale=0.5", + "video:render": "remotion render src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening.mp4" }, "dependencies": { "@radix-ui/react-avatar": "^1.1.11", "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-separator": "^1.1.8", "@radix-ui/react-slot": "^1.2.4", + "@remotion/player": "4.0.475", "@tanstack/react-query": "^5.90.21", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -24,11 +29,14 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "react-router-dom": "^7.13.1", + "remotion": "4.0.475", "tailwind-merge": "^3.5.0", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@biomejs/biome": "^2.4.5", + "@remotion/cli": "4.0.475", + "@remotion/tailwind": "4.0.475", "@types/node": "^24.10.1", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75c46df..782b84f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@radix-ui/react-slot': specifier: ^1.2.4 version: 1.2.4(@types/react@19.2.14)(react@19.2.4) + '@remotion/player': + specifier: 4.0.475 + version: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-query': specifier: ^5.90.21 version: 5.90.21(react@19.2.4) @@ -44,16 +47,25 @@ importers: react-router-dom: specifier: ^7.13.1 version: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + remotion: + specifier: 4.0.475 + version: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) tailwind-merge: specifier: ^3.5.0 version: 3.5.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.19) + version: 1.0.7(tailwindcss@3.4.19(yaml@2.9.0)) devDependencies: '@biomejs/biome': specifier: ^2.4.5 version: 2.4.5 + '@remotion/cli': + specifier: 4.0.475 + version: 4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/tailwind': + specifier: 4.0.475 + version: 4.0.475(@remotion/bundler@4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@rspack/core@1.7.11)(typescript@5.9.3)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)) '@types/node': specifier: ^24.10.1 version: 24.11.0 @@ -65,7 +77,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.1.4(vite@7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1)) + version: 5.1.4(vite@7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1)(terser@5.48.0)(yaml@2.9.0)) autoprefixer: specifier: ^10.4.27 version: 10.4.27(postcss@8.5.8) @@ -74,13 +86,13 @@ importers: version: 8.5.8 tailwindcss: specifier: ^3.4.19 - version: 3.4.19 + version: 3.4.19(yaml@2.9.0) typescript: specifier: ~5.9.3 version: 5.9.3 vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1) + version: 7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1)(terser@5.48.0)(yaml@2.9.0) packages: @@ -142,6 +154,11 @@ packages: resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.24.1': + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} @@ -167,6 +184,10 @@ packages: resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -193,24 +214,28 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [musl] '@biomejs/cli-linux-arm64@2.4.5': resolution: {integrity: sha512-U1GAG6FTjhAO04MyH4xn23wRNBkT6H7NentHh+8UxD6ShXKBm5SY4RedKJzkUThANxb9rUKIPc7B8ew9Xo/cWg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-x64-musl@2.4.5': resolution: {integrity: sha512-NlKa7GpbQmNhZf9kakQeddqZyT7itN7jjWdakELeXyTU3pg/83fTysRRDPJD0akTfKDl6vZYNT9Zqn4MYZVBOA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [musl] '@biomejs/cli-linux-x64@2.4.5': resolution: {integrity: sha512-NdODlSugMzTlENPTa4z0xB82dTUlCpsrOxc43///aNkTLblIYH4XpYflBbf5ySlQuP8AA4AZd1qXhV07IdrHdQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [glibc] '@biomejs/cli-win32-arm64@2.4.5': resolution: {integrity: sha512-EBfrTqRIWOFSd7CQb/0ttjHMR88zm3hGravnDwUA9wHAaCAYsULKDebWcN5RmrEo1KBtl/gDVJMrFjNR0pdGUw==} @@ -224,162 +249,517 @@ packages: cpu: [x64] os: [win32] + '@csstools/cascade-layer-name-parser@1.0.13': + resolution: {integrity: sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.7.1 + '@csstools/css-tokenizer': ^2.4.1 + + '@csstools/color-helpers@2.1.0': + resolution: {integrity: sha512-OWkqBa7PDzZuJ3Ha7T5bxdSVfSCfTq6K1mbAhbO1MD+GSULGjrp45i5RudyJOedstSarN/3mdwu9upJE7gDXfw==} + engines: {node: ^14 || ^16 || >=18} + + '@csstools/color-helpers@4.2.1': + resolution: {integrity: sha512-CEypeeykO9AN7JWkr1OEOQb0HRzZlPWGwV0Ya6DuVgFdDi6g3ma/cPZ5ZPZM4AWQikDpq/0llnGGlIL+j8afzw==} + engines: {node: ^14 || ^16 || >=18} + + '@csstools/css-calc@1.2.4': + resolution: {integrity: sha512-tfOuvUQeo7Hz+FcuOd3LfXVp+342pnWUJ7D2y8NUpu1Ww6xnTbHLpz018/y6rtbHifJ3iIEf9ttxXd8KG7nL0Q==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.7.1 + '@csstools/css-tokenizer': ^2.4.1 + + '@csstools/css-color-parser@1.6.3': + resolution: {integrity: sha512-pQPUPo32HW3/NuZxrwr3VJHE+vGqSTVI5gK4jGbuJ7eOFUrsTmZikXcVdInCVWOvuxK5xbCzwDWoTlZUCAKN+A==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.6.1 + '@csstools/css-tokenizer': ^2.2.4 + + '@csstools/css-parser-algorithms@2.7.1': + resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-tokenizer': ^2.4.1 + + '@csstools/css-tokenizer@2.4.1': + resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==} + engines: {node: ^14 || ^16 || >=18} + + '@csstools/media-query-list-parser@2.1.13': + resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.7.1 + '@csstools/css-tokenizer': ^2.4.1 + + '@csstools/postcss-cascade-layers@3.0.1': + resolution: {integrity: sha512-dD8W98dOYNOH/yX4V4HXOhfCOnvVAg8TtsL+qCGNoKXuq5z2C/d026wGWgySgC8cajXXo/wNezS31Glj5GcqrA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-function@2.2.3': + resolution: {integrity: sha512-b1ptNkr1UWP96EEHqKBWWaV5m/0hgYGctgA/RVZhONeP1L3T/8hwoqDm9bB23yVCfOgE9U93KI9j06+pEkJTvw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-mix-function@1.0.3': + resolution: {integrity: sha512-QGXjGugTluqFZWzVf+S3wCiRiI0ukXlYqCi7OnpDotP/zaVTyl/aqZujLFzTOXy24BoWnu89frGMc79ohY5eog==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-font-format-keywords@2.0.2': + resolution: {integrity: sha512-iKYZlIs6JsNT7NKyRjyIyezTCHLh4L4BBB3F5Nx7Dc4Z/QmBgX+YJFuUSar8IM6KclGiAUFGomXFdYxAwJydlA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-gradients-interpolation-method@3.0.6': + resolution: {integrity: sha512-rBOBTat/YMmB0G8VHwKqDEx+RZ4KCU9j42K8LwS0IpZnyThalZZF7BCSsZ6TFlZhcRZKlZy3LLFI2pLqjNVGGA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-hwb-function@2.2.2': + resolution: {integrity: sha512-W5Y5oaJ382HSlbdGfPf60d7dAK6Hqf10+Be1yZbd/TNNrQ/3dDdV1c07YwOXPQ3PZ6dvFMhxbIbn8EC3ki3nEg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-ic-unit@2.0.4': + resolution: {integrity: sha512-9W2ZbV7whWnr1Gt4qYgxMWzbevZMOvclUczT5vk4yR6vS53W/njiiUhtm/jh/BKYwQ1W3PECZjgAd2dH4ebJig==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-is-pseudo-class@3.2.1': + resolution: {integrity: sha512-AtANdV34kJl04Al62is3eQRk/BfOfyAvEmRJvbt+nx5REqImLC+2XhuE6skgkcPli1l8ONS67wS+l1sBzySc3Q==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-float-and-clear@1.0.1': + resolution: {integrity: sha512-eO9z2sMLddvlfFEW5Fxbjyd03zaO7cJafDurK4rCqyRt9P7aaWwha0LcSzoROlcZrw1NBV2JAp2vMKfPMQO1xw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-resize@1.0.1': + resolution: {integrity: sha512-x1ge74eCSvpBkDDWppl+7FuD2dL68WP+wwP2qvdUcKY17vJksz+XoE1ZRV38uJgS6FNUwC0AxrPW5gy3MxsDHQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-viewport-units@1.0.3': + resolution: {integrity: sha512-6zqcyRg9HSqIHIPMYdt6THWhRmE5/tyHKJQLysn2TeDf/ftq7Em9qwMTx98t2C/7UxIsYS8lOiHHxAVjWn2WUg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-media-minmax@1.1.8': + resolution: {integrity: sha512-KYQCal2i7XPNtHAUxCECdrC7tuxIWQCW+s8eMYs5r5PaAiVTeKwlrkRS096PFgojdNCmHeG0Cb7njtuNswNf+w==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-media-queries-aspect-ratio-number-values@1.0.4': + resolution: {integrity: sha512-IwyTbyR8E2y3kh6Fhrs251KjKBJeUPV5GlnUKnpU70PRFEN2DolWbf2V4+o/B9+Oj77P/DullLTulWEQ8uFtAA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-nested-calc@2.0.2': + resolution: {integrity: sha512-jbwrP8rN4e7LNaRcpx3xpMUjhtt34I9OV+zgbcsYAAk6k1+3kODXJBf95/JMYWhu9g1oif7r06QVUgfWsKxCFw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-normalize-display-values@2.0.1': + resolution: {integrity: sha512-TQT5g3JQ5gPXC239YuRK8jFceXF9d25ZvBkyjzBGGoW5st5sPXFVQS8OjYb9IJ/K3CdfK4528y483cgS2DJR/w==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-oklab-function@2.2.3': + resolution: {integrity: sha512-AgJ2rWMnLCDcbSMTHSqBYn66DNLBym6JpBpCaqmwZ9huGdljjDRuH3DzOYzkgQ7Pm2K92IYIq54IvFHloUOdvA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-progressive-custom-properties@2.3.0': + resolution: {integrity: sha512-Zd8ojyMlsL919TBExQ1I0CTpBDdyCpH/yOdqatZpuC3sd22K4SwC7+Yez3Q/vmXMWSAl+shjNeFZ7JMyxMjK+Q==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-scope-pseudo-class@2.0.2': + resolution: {integrity: sha512-6Pvo4uexUCXt+Hz5iUtemQAcIuCYnL+ePs1khFR6/xPgC92aQLJ0zGHonWoewiBE+I++4gXK3pr+R1rlOFHe5w==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-stepped-value-functions@2.1.1': + resolution: {integrity: sha512-YCvdF0GCZK35nhLgs7ippcxDlRVe5QsSht3+EghqTjnYnyl3BbWIN6fYQ1dKWYTJ+7Bgi41TgqQFfJDcp9Xy/w==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-text-decoration-shorthand@2.2.4': + resolution: {integrity: sha512-zPN56sQkS/7YTCVZhOBVCWf7AiNge8fXDl7JVaHLz2RyT4pnyK2gFjckWRLpO0A2xkm1lCgZ0bepYZTwAVd/5A==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-trigonometric-functions@2.1.1': + resolution: {integrity: sha512-XcXmHEFfHXhvYz40FtDlA4Fp4NQln2bWTsCwthd2c+MCnYArUYU3YaMqzR5CrKP3pMoGYTBnp5fMqf1HxItNyw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-unset-value@2.0.1': + resolution: {integrity: sha512-oJ9Xl29/yU8U7/pnMJRqAZd4YXNCfGEdcP4ywREuqm/xMqcgDNDppYRoCGDt40aaZQIEKBS79LytUDN/DHf0Ew==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@csstools/selector-specificity@2.2.0': + resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.10 + + '@csstools/utilities@1.0.0': + resolution: {integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + '@emnapi/core@1.11.0': + resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} + + '@emnapi/runtime@1.11.0': + resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.27.3': resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.27.3': resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.27.3': resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.27.3': resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.27.3': resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.27.3': resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.3': resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.27.3': resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.27.3': resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.27.3': resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.27.3': resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.27.3': resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.27.3': resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.27.3': resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.27.3': resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.27.3': resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.3': resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.3': resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.3': resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.3': resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.3': resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.27.3': resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.27.3': resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.27.3': resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.27.3': resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} @@ -425,16 +805,55 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mediabunny/aac-encoder@1.45.0': + resolution: {integrity: sha512-vLQw8cY7Me6pvTTMkMhOiH9UCuINzfTOETCeDxbGNeNfDqc/7QlxloUH1Ylp/Zz2ek0O8kc6YdygV2vWAPakrA==} + peerDependencies: + mediabunny: ^1.0.0 + + '@mediabunny/flac-encoder@1.45.0': + resolution: {integrity: sha512-LfKbAMZVkxRS7PpEIVnWOY/l0KcHv+rjO7pYY3O0TPCZvbHWfrnQjn8JPacPIfuq6Yv7r4f8lhcl7yHSynoRkQ==} + peerDependencies: + mediabunny: ^1.0.0 + + '@mediabunny/mp3-encoder@1.45.0': + resolution: {integrity: sha512-Bobi6AaQYEc7TWmPJ8Q0/hcUtBN7pLUC2qjoC7oZR4FcGqGztby6k7A1SWlmswoMOEIhYsOrgDaemrSDAC0QVQ==} + peerDependencies: + mediabunny: ^1.0.0 + + '@module-federation/error-codes@0.22.0': + resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} + + '@module-federation/runtime-core@0.22.0': + resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} + + '@module-federation/runtime-tools@0.22.0': + resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} + + '@module-federation/runtime@0.22.0': + resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} + + '@module-federation/sdk@0.22.0': + resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} + + '@module-federation/webpack-bundler-runtime@0.22.0': + resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} + '@mswjs/interceptors@0.41.3': resolution: {integrity: sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==} engines: {node: '>=18'} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -562,6 +981,122 @@ packages: '@types/react': optional: true + '@remotion/bundler@4.0.475': + resolution: {integrity: sha512-vPXB4aUbqxoou2yjwJBPfHQ/1M1LyIEsCzc1AhPJwThkwP8tN9JI0xx3CYnKFwRErVE4VH4FYDwfrnHh44q+iQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/canvas-capture@4.0.475': + resolution: {integrity: sha512-58IfC14iAn6mVX5b7yom/zSr4Ieq5uR9J5ZJ9VjhnkqnrVrIyGV6/+rfrb4tvddWh+PvPiM+eCsTewmTVkusEQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/cli@4.0.475': + resolution: {integrity: sha512-cVzA7aFnw7Ofb+DH63MPTeR5gwzjXO+gwiZusv9uHZS4BpdC2kEP8mHfMxOpi6uJ9jeo4FtDrq/5nuZFzqSjcQ==} + hasBin: true + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/compositor-darwin-arm64@4.0.475': + resolution: {integrity: sha512-XjOQnLTDhK5ZnnKG/JeQ8ychl+GaJ96MGB1m+rXFTiHBgaUycrrGl90ZHNwPXwz7wAuHliqxet0Yexl5wDl8hg==} + cpu: [arm64] + os: [darwin] + + '@remotion/compositor-darwin-x64@4.0.475': + resolution: {integrity: sha512-7v8VpzJPtD/3JFVZ/s4Vg5jf7HyRInSnt9jSwBFlLB3UiulZlTkELIGkbXPPVQk2FNoUeQx84O26j8xslTO6wg==} + cpu: [x64] + os: [darwin] + + '@remotion/compositor-linux-arm64-gnu@4.0.475': + resolution: {integrity: sha512-Ta9Yc0Fx9FqZSHLIAhHSZI9oC+O9bMirKE3s20Ca55Z+AJM3417/zU/oUwe2aLd8ymU8xto4brMKkXkN+3YYmw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@remotion/compositor-linux-arm64-musl@4.0.475': + resolution: {integrity: sha512-c9wBI9moY+kB7ssuhtdMHcswaIzOHnx2gEiaKlVtZkETXmJ7Z7lYN2zuJWxG3CumYP2kJhN0pT49PgWGSF2ZAQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@remotion/compositor-linux-x64-gnu@4.0.475': + resolution: {integrity: sha512-sxb3hDPStV8qFT33rJrXkBSyuZCrc9g19jtXxNzgyy84FUUe/sUOl6T3T6lnGf3pH5MBSqGG92YFhZtxfk8hBw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@remotion/compositor-linux-x64-musl@4.0.475': + resolution: {integrity: sha512-AH7rSnhfDutT6YFcPElgpRY7wIykvOH26B5qT0tIJ03HejFhxoT7Iw3odSbqywWJ8tx5DV6vNJjYF5ePUfN1sg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@remotion/compositor-win32-x64-msvc@4.0.475': + resolution: {integrity: sha512-Qcd+QHa0ztJZkJAbP/cxmgrj5m4zhitaQRNIHn5+vpuMs4TVm7lW0vYdBHHCYyqw3Nd6hjpgKQzrtnlCF3flXg==} + cpu: [x64] + os: [win32] + + '@remotion/licensing@4.0.475': + resolution: {integrity: sha512-ZBDKg+iRa/mVoX/EWM40MypICKokWcG4c4RKQ4QKmy9JgJssbnFSy9mikPKMi/64J3KPEfAT1hv4JRKlNdoX5g==} + + '@remotion/media-parser@4.0.475': + resolution: {integrity: sha512-1vcyQ5gM8gexTxQ496KrV9C9vd1nHXsQh1qwc7Dz5UcY2KjPTSvPD14Z98TttMI595Y24Dofl+4r1+SjJJ/o+Q==} + + '@remotion/media-utils@4.0.475': + resolution: {integrity: sha512-Np8FkKw48IIJbtDImNPHJxbpieps15QBbm6FIn61ByCE7ppW/sDR5LH2zGAZjAIlF9ymqwuv+zD+x5orPVZatg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/player@4.0.475': + resolution: {integrity: sha512-s6kas1Io3+17AIE9QjEjv1r/h6xfcegVh+WLo+bSuDfYimnVZ0+YmU6wCUWC3E15rfDMhMa6X1OsDcNsdynOjg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/renderer@4.0.475': + resolution: {integrity: sha512-3uRfzWxHd1fCEkfZKQ32Tx0zZZl7c8LT8oMnUaAOB3eRfQjAOaA9n5qvkXNZmcekNZ5iu6rg61Tx04VCY4do9Q==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/streaming@4.0.475': + resolution: {integrity: sha512-wBxed6DczdwybFSNsZqVnmdnkCSWjkg0/Q37eTCfq56bJ6lM5IJ2ZiyEfswE7TfI0OFpp1CWOFWCGf27O7WTDw==} + + '@remotion/studio-server@4.0.475': + resolution: {integrity: sha512-+svVUYPzzhJAO4tUsjbsHSfEX62Sj3F2QFomdsT0vcbnxwWLtfNLUjgeUq0f6VqaM1nuK9AgoswQKI4clOO1Ng==} + + '@remotion/studio-shared@4.0.475': + resolution: {integrity: sha512-mbh/ZxF88WObG2KZkIDSfyFzbZDI+9BgwMuJXGZloBovEBgMzc2Cva/48wORDUh5QxWtyntxj0XozHdlw0gxIA==} + + '@remotion/studio@4.0.475': + resolution: {integrity: sha512-HLY3BQ6Md8S8WIfxC4a1p09WQw5f4EZqOddArinhoBCP3zFbfuCjTusecRJtfCtp0lbnx3Y5dpSc9H4bz5WLuQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/tailwind@4.0.475': + resolution: {integrity: sha512-RjMcAgoXKvnj9wtnCUz+86xvAG9XpIiuJ3Hv+vOmhh0Ws6gQkj9IaUdAaU6G0yGhE5Gb4qpt1yXO8TL27UNETw==} + peerDependencies: + '@remotion/bundler': 4.0.475 + + '@remotion/timeline-utils@4.0.475': + resolution: {integrity: sha512-81pb/Z+rN1nSQvsTXdj9DxaAhKBsfUhTUdpVTwxHMVIOxOE0n/dhWH7d6QbSWtV1IXKHC5xYdTJxLFgu8KztWQ==} + + '@remotion/web-renderer@4.0.475': + resolution: {integrity: sha512-3vftJV5R95PQuH/fk9qW4/e9u5MQ13d2UgmQYIiuWtLuQLXz6k0wDywpha3E3+Hg1yRb7wvod+j3eF9gzGRFEA==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@remotion/zod-types@4.0.475': + resolution: {integrity: sha512-Erd332l7MD2pH8/8VuixSbHYC37ydU9NxP+2wzlb9evrjkDj2mfOruQrbaAcO31kB/kgk7qzdM4QW6457FzeRw==} + peerDependencies: + zod: 4.3.6 + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -599,66 +1134,79 @@ packages: resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} @@ -690,29 +1238,124 @@ packages: cpu: [x64] os: [win32] - '@tanstack/query-core@5.90.20': - resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} - - '@tanstack/react-query@5.90.21': - resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} - peerDependencies: - react: ^18 || ^19 + '@rspack/binding-darwin-arm64@1.7.11': + resolution: {integrity: sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==} + cpu: [arm64] + os: [darwin] - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@rspack/binding-darwin-x64@1.7.11': + resolution: {integrity: sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==} + cpu: [x64] + os: [darwin] - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@rspack/binding-linux-arm64-gnu@1.7.11': + resolution: {integrity: sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@rspack/binding-linux-arm64-musl@1.7.11': + resolution: {integrity: sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rspack/binding-linux-x64-gnu@1.7.11': + resolution: {integrity: sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rspack/binding-linux-x64-musl@1.7.11': + resolution: {integrity: sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rspack/binding-wasm32-wasi@1.7.11': + resolution: {integrity: sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.7.11': + resolution: {integrity: sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.7.11': + resolution: {integrity: sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.7.11': + resolution: {integrity: sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.7.11': + resolution: {integrity: sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==} + + '@rspack/core@1.7.11': + resolution: {integrity: sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + + '@rspack/plugin-react-refresh@1.6.1': + resolution: {integrity: sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + webpack-hot-middleware: 2.x + peerDependenciesMeta: + webpack-hot-middleware: + optional: true + + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} + + '@tanstack/react-query@5.90.21': + resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} + peerDependencies: + react: ^18 || ^19 + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/dom-mediacapture-transform@0.1.11': + resolution: {integrity: sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==} + + '@types/dom-webcodecs@0.1.13': + resolution: {integrity: sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@24.11.0': resolution: {integrity: sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==} @@ -733,6 +1376,84 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -751,6 +1472,20 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + autoprefixer@10.4.27: resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} engines: {node: ^10 || ^12 || >=14} @@ -776,6 +1511,13 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -787,6 +1529,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -809,6 +1555,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -820,6 +1569,52 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-blank-pseudo@5.0.2: + resolution: {integrity: sha512-aCU4AZ7uEcVSUzagTlA9pHciz7aWPKA/YzrEkpdSopJ2pvhIxiQ5sYeMz1/KByxlIo4XBdvMNJAVKMg/GRnhfw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + css-has-pseudo@5.0.2: + resolution: {integrity: sha512-q+U+4QdwwB7T9VEW/LyO6CFrLAeLqOykC5mDqJXc7aKZAhDbq7BvGT13VGJe+IwBfdN2o3Xdw2kJ5IxwV1Sc9Q==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + css-loader@7.1.4: + resolution: {integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-prefers-color-scheme@8.0.2: + resolution: {integrity: sha512-OvFghizHJ45x7nsJJUSYLyQNTzsCU8yWjxAc/nhPQg1pbs18LMoET8N3kOweFDPy0JV0OSXN2iqRFhPBHYOeMA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + cssdb@7.11.2: + resolution: {integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -837,6 +1632,10 @@ packages: supports-color: optional: true + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -847,25 +1646,82 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + engines: {node: '>=12'} + electron-to-chromium@1.5.307: resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + enhanced-resolve@5.23.0: + resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==} + engines: {node: '>=10.13.0'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + esbuild@0.27.3: resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -882,9 +1738,15 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fs-monkey@1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -901,6 +1763,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -909,10 +1775,20 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphql@16.13.1: resolution: {integrity: sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -920,6 +1796,26 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -928,6 +1824,11 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -947,6 +1848,21 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true @@ -954,16 +1870,30 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + hasBin: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + lightningcss-android-arm64@1.31.1: resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} engines: {node: '>= 12.0.0'} @@ -999,24 +1929,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.31.1: resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} @@ -1034,6 +1968,10 @@ packages: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1041,14 +1979,35 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} + engines: {node: '>=6.11.5'} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lucide-react@0.577.0: resolution: {integrity: sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + mediabunny@1.45.0: + resolution: {integrity: sha512-oK3sMMYbucoF6LUX62L/2M9d+p9ve6KDQgL87kNfhsB0/XmTe9iRLUcgQgg9Gpgvi8Sb96zYfOUL6i17y0bdNg==} + + memfs@3.4.3: + resolution: {integrity: sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==} + engines: {node: '>= 4.0.0'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1057,6 +2016,21 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1082,6 +2056,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + node-releases@2.0.36: resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} @@ -1089,6 +2066,14 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1097,15 +2082,39 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1125,18 +2134,130 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + postcss-attribute-case-insensitive@6.0.3: + resolution: {integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-clamp@4.1.0: + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: ^8.4.6 + + postcss-color-functional-notation@5.1.0: + resolution: {integrity: sha512-w2R4py6zrVE1U7FwNaAc76tNQlG9GLkrBbcFw+VhUjyDDiV28vfZG+l4LyPmpoQpeSJVtu8VgNjE8Jv5SpC7dQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-color-hex-alpha@9.0.4: + resolution: {integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-color-rebeccapurple@8.0.2: + resolution: {integrity: sha512-xWf/JmAxVoB5bltHpXk+uGRoGFwu4WDAR7210el+iyvTdqiKpDhtcT8N3edXMoVJY0WHFMrKMUieql/wRNiXkw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-custom-media@9.1.5: + resolution: {integrity: sha512-GStyWMz7Qbo/Gtw1xVspzVSX8eipgNg4lpsO3CAeY4/A1mzok+RV6MCv3fg62trWijh/lYEj6vps4o8JcBBpDA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-custom-properties@13.3.12: + resolution: {integrity: sha512-oPn/OVqONB2ZLNqN185LDyaVByELAA/u3l2CS2TS16x2j2XsmV4kd8U49+TMxmUsEU9d8fB/I10E6U7kB0L1BA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-custom-selectors@7.1.12: + resolution: {integrity: sha512-ctIoprBMJwByYMGjXG0F7IT2iMF2hnamQ+aWZETyBM0aAlyaYdVZTeUkk8RB+9h9wP+NdN3f01lfvKl2ZSqC0g==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-dir-pseudo-class@7.0.2: + resolution: {integrity: sha512-cMnslilYxBf9k3qejnovrUONZx1rXeUZJw06fgIUBzABJe3D2LiLL5WAER7Imt3nrkaIgG05XZBztueLEf5P8w==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-double-position-gradients@4.0.4: + resolution: {integrity: sha512-nUAbUXURemLXIrl4Xoia2tiu5z/n8sY+BVDZApoeT9BlpByyrp02P/lFCRrRvZ/zrGRE+MOGLhk8o7VcMCtPtQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-focus-visible@8.0.2: + resolution: {integrity: sha512-f/Vd+EC/GaKElknU59esVcRYr/Y3t1ZAQyL4u2xSOgkDy4bMCmG7VP5cGvj3+BTLNE9ETfEuz2nnt4qkZwTTeA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-focus-within@7.0.2: + resolution: {integrity: sha512-AHAJ89UQBcqBvFgQJE9XasGuwMNkKsGj4D/f9Uk60jFmEBHpAL14DrnSk3Rj+SwZTr/WUG+mh+Rvf8fid/346w==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-font-variant@5.0.0: + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + + postcss-gap-properties@4.0.1: + resolution: {integrity: sha512-V5OuQGw4lBumPlwHWk/PRfMKjaq/LTGR4WDTemIMCaMevArVfCCA9wBJiL1VjDAd+rzuCIlkRoRvDsSiAaZ4Fg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-image-set-function@5.0.2: + resolution: {integrity: sha512-Sszjwo0ubETX0Fi5MvpYzsONwrsjeabjMoc5YqHvURFItXgIu3HdCjcVuVKGMPGzKRhgaknmdM5uVWInWPJmeg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 + postcss-initial@4.0.1: + resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} + peerDependencies: + postcss: ^8.0.0 + postcss-js@4.1.0: resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 + postcss-lab-function@5.2.3: + resolution: {integrity: sha512-fi32AYKzji5/rvgxo5zXHFvAYBw0u0OzELbeCNjEZVLUir18Oj+9RmNphtM8QdLUaUnrfx8zy8vVYLmFLkdmrQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1155,23 +2276,133 @@ packages: yaml: optional: true + postcss-loader@7.3.4: + resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + + postcss-logical@6.2.0: + resolution: {integrity: sha512-aqlfKGaY0nnbgI9jwUikp4gJKBqcH5noU/EdnIVceghaaDPYhZuyJVxlvWNy55tlTG5tunRKCTAX9yljLiFgmw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 + postcss-nesting@11.3.0: + resolution: {integrity: sha512-JlS10AQm/RzyrUGgl5irVkAlZYTJ99mNueUl+Qab+TcHhVedLiylWVkKBhRale+rS9yWIJK48JVzQlq3LcSdeA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-opacity-percentage@2.0.0: + resolution: {integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.2 + + postcss-overflow-shorthand@4.0.1: + resolution: {integrity: sha512-HQZ0qi/9iSYHW4w3ogNqVNr2J49DHJAl7r8O2p0Meip38jsdnRPgiDW7r/LlLrrMBMe3KHkvNtAV2UmRVxzLIg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-page-break@3.0.4: + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + + postcss-place@8.0.1: + resolution: {integrity: sha512-Ow2LedN8sL4pq8ubukO77phSVt4QyCm35ZGCYXKvRFayAwcpgB0sjNJglDoTuRdUL32q/ZC1VkPBo0AOEr4Uiw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-preset-env@8.3.2: + resolution: {integrity: sha512-VSAOsfxTXzO/gX5QljC8x8hN3ABbD9iqqLgqHqohBdNI5FhJptwpl96kpu+kYvvzK7BWwaHYou0IeYrp+NqmcQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-pseudo-class-any-link@8.0.2: + resolution: {integrity: sha512-FYTIuRE07jZ2CW8POvctRgArQJ43yxhr5vLmImdKUvjFCkR09kh8pIdlCwdx/jbFm7MiW4QP58L4oOUv3grQYA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-replace-overflow-wrap@4.0.0: + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + peerDependencies: + postcss: ^8.0.3 + + postcss-selector-not@7.0.2: + resolution: {integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-selector-parser@7.1.2: + resolution: {integrity: sha512-Wjvt4scRFouioIInHf51IFNP4ltJ2EngJM+cZPGiqbKetBfmP3vpdPV8ID2S6JS6/jdo74N8+aEYH9lQr2C6sA==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1212,10 +2443,28 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + remotion@4.0.475: + resolution: {integrity: sha512-eNYqqlawApiBwrtFOI9krXrwuz90tIdh/aDTqaTZWjMHPHBqyRn6TohCJ1x1+PgiUenboQ/8M3+t4ew2XtkZlA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -1239,21 +2488,64 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + + semver@7.8.4: + resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} + engines: {node: '>=10'} + hasBin: true + set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -1269,11 +2561,25 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + style-loader@4.0.0: + resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.27.0 + sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -1290,11 +2596,68 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' + tailwindcss@3.4.13: + resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} + engines: {node: '>=14.0.0'} + hasBin: true + tailwindcss@3.4.19: resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} engines: {node: '>=14.0.0'} hasBin: true + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.6.1: + resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + + terser@5.48.0: + resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + engines: {node: '>=10'} + hasBin: true + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1302,6 +2665,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -1313,6 +2679,10 @@ packages: resolution: {integrity: sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==} hasBin: true + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1321,9 +2691,15 @@ packages: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-fest@5.4.4: resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} engines: {node: '>=20'} @@ -1393,6 +2769,35 @@ packages: yaml: optional: true + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + engines: {node: '>=10.13.0'} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-sources@3.5.0: + resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} + engines: {node: '>=10.13.0'} + + webpack@5.105.0: + resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -1401,6 +2806,18 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + ws@8.20.1: + resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} + 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 + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -1408,6 +2825,14 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -1420,6 +2845,9 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + snapshots: '@alloc/quick-lru@5.2.0': {} @@ -1499,6 +2927,10 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 + '@babel/parser@7.24.1': + dependencies: + '@babel/types': 7.29.0 + '@babel/parser@7.29.0': dependencies: '@babel/types': 7.29.0 @@ -1531,6 +2963,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + to-fast-properties: 2.0.0 + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -1571,84 +3009,353 @@ snapshots: '@biomejs/cli-win32-x64@2.4.5': optional: true + '@csstools/cascade-layer-name-parser@1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/color-helpers@2.1.0': {} + + '@csstools/color-helpers@4.2.1': {} + + '@csstools/css-calc@1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/css-color-parser@1.6.3(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/color-helpers': 4.2.1 + '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/css-tokenizer@2.4.1': {} + + '@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/postcss-cascade-layers@3.0.1(postcss@8.5.10)': + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + '@csstools/postcss-color-function@2.2.3(postcss@8.5.10)': + dependencies: + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + postcss: 8.5.10 + + '@csstools/postcss-color-mix-function@1.0.3(postcss@8.5.10)': + dependencies: + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + postcss: 8.5.10 + + '@csstools/postcss-font-format-keywords@2.0.2(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-gradients-interpolation-method@3.0.6(postcss@8.5.10)': + dependencies: + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + postcss: 8.5.10 + + '@csstools/postcss-hwb-function@2.2.2(postcss@8.5.10)': + dependencies: + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + postcss: 8.5.10 + + '@csstools/postcss-ic-unit@2.0.4(postcss@8.5.10)': + dependencies: + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-is-pseudo-class@3.2.1(postcss@8.5.10)': + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + '@csstools/postcss-logical-float-and-clear@1.0.1(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + + '@csstools/postcss-logical-resize@1.0.1(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-logical-viewport-units@1.0.3(postcss@8.5.10)': + dependencies: + '@csstools/css-tokenizer': 2.4.1 + postcss: 8.5.10 + + '@csstools/postcss-media-minmax@1.1.8(postcss@8.5.10)': + dependencies: + '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + postcss: 8.5.10 + + '@csstools/postcss-media-queries-aspect-ratio-number-values@1.0.4(postcss@8.5.10)': + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + postcss: 8.5.10 + + '@csstools/postcss-nested-calc@2.0.2(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-normalize-display-values@2.0.1(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-oklab-function@2.2.3(postcss@8.5.10)': + dependencies: + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + postcss: 8.5.10 + + '@csstools/postcss-progressive-custom-properties@2.3.0(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-scope-pseudo-class@2.0.2(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + '@csstools/postcss-stepped-value-functions@2.1.1(postcss@8.5.10)': + dependencies: + '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + postcss: 8.5.10 + + '@csstools/postcss-text-decoration-shorthand@2.2.4(postcss@8.5.10)': + dependencies: + '@csstools/color-helpers': 2.1.0 + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-trigonometric-functions@2.1.1(postcss@8.5.10)': + dependencies: + '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + postcss: 8.5.10 + + '@csstools/postcss-unset-value@2.0.1(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + + '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)': + dependencies: + postcss-selector-parser: 6.1.2 + + '@csstools/utilities@1.0.0(postcss@8.5.10)': + dependencies: + postcss: 8.5.10 + + '@emnapi/core@1.11.0': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.3': optional: true + '@esbuild/aix-ppc64@0.28.0': + optional: true + '@esbuild/android-arm64@0.27.3': optional: true + '@esbuild/android-arm64@0.28.0': + optional: true + '@esbuild/android-arm@0.27.3': optional: true + '@esbuild/android-arm@0.28.0': + optional: true + '@esbuild/android-x64@0.27.3': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + '@esbuild/darwin-arm64@0.27.3': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + '@esbuild/darwin-x64@0.27.3': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + '@esbuild/freebsd-arm64@0.27.3': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + '@esbuild/freebsd-x64@0.27.3': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + '@esbuild/linux-arm64@0.27.3': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + '@esbuild/linux-arm@0.27.3': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + '@esbuild/linux-ia32@0.27.3': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + '@esbuild/linux-loong64@0.27.3': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + '@esbuild/linux-mips64el@0.27.3': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + '@esbuild/linux-ppc64@0.27.3': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + '@esbuild/linux-riscv64@0.27.3': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + '@esbuild/linux-s390x@0.27.3': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + '@esbuild/linux-x64@0.27.3': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + '@esbuild/netbsd-arm64@0.27.3': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + '@esbuild/netbsd-x64@0.27.3': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + '@esbuild/openbsd-arm64@0.27.3': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + '@esbuild/openbsd-x64@0.27.3': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + '@esbuild/openharmony-arm64@0.27.3': optional: true + '@esbuild/openharmony-arm64@0.28.0': + optional: true + '@esbuild/sunos-x64@0.27.3': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + '@esbuild/win32-arm64@0.27.3': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + '@esbuild/win32-ia32@0.27.3': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + '@esbuild/win32-x64@0.27.3': optional: true + '@esbuild/win32-x64@0.28.0': + optional: true + '@inquirer/ansi@1.0.2': {} '@inquirer/confirm@5.1.21(@types/node@24.11.0)': @@ -1689,6 +3396,11 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -1696,6 +3408,43 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@mediabunny/aac-encoder@1.45.0(mediabunny@1.45.0)': + dependencies: + mediabunny: 1.45.0 + + '@mediabunny/flac-encoder@1.45.0(mediabunny@1.45.0)': + dependencies: + mediabunny: 1.45.0 + + '@mediabunny/mp3-encoder@1.45.0(mediabunny@1.45.0)': + dependencies: + mediabunny: 1.45.0 + + '@module-federation/error-codes@0.22.0': {} + + '@module-federation/runtime-core@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/runtime-tools@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/webpack-bundler-runtime': 0.22.0 + + '@module-federation/runtime@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/runtime-core': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/sdk@0.22.0': {} + + '@module-federation/webpack-bundler-runtime@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/sdk': 0.22.0 + '@mswjs/interceptors@0.41.3': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -1705,6 +3454,13 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@tybys/wasm-util': 0.10.2 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1804,6 +3560,244 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@remotion/bundler@4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/media-parser': 4.0.475 + '@remotion/studio': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/timeline-utils': 4.0.475 + '@rspack/core': 1.7.11 + '@rspack/plugin-react-refresh': 1.6.1(react-refresh@0.18.0) + css-loader: 7.1.4(@rspack/core@1.7.11)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)) + esbuild: 0.28.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-refresh: 0.18.0 + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + style-loader: 4.0.0(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)) + webpack: 5.105.0(esbuild@0.28.0)(lightningcss@1.31.1)(postcss@8.5.8) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/canvas-capture@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + mediabunny: 1.45.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + '@remotion/cli@4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/bundler': 4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/media-utils': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/player': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-server': 4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + dotenv: 17.3.1 + minimist: 1.2.6 + prompts: 2.4.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/compositor-darwin-arm64@4.0.475': + optional: true + + '@remotion/compositor-darwin-x64@4.0.475': + optional: true + + '@remotion/compositor-linux-arm64-gnu@4.0.475': + optional: true + + '@remotion/compositor-linux-arm64-musl@4.0.475': + optional: true + + '@remotion/compositor-linux-x64-gnu@4.0.475': + optional: true + + '@remotion/compositor-linux-x64-musl@4.0.475': + optional: true + + '@remotion/compositor-win32-x64-msvc@4.0.475': + optional: true + + '@remotion/licensing@4.0.475': {} + + '@remotion/media-parser@4.0.475': {} + + '@remotion/media-utils@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + mediabunny: 1.45.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + '@remotion/player@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + '@remotion/renderer@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/licensing': 4.0.475 + '@remotion/streaming': 4.0.475 + execa: 5.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + source-map: 0.8.0-beta.0 + ws: 8.20.1 + optionalDependencies: + '@remotion/compositor-darwin-arm64': 4.0.475 + '@remotion/compositor-darwin-x64': 4.0.475 + '@remotion/compositor-linux-arm64-gnu': 4.0.475 + '@remotion/compositor-linux-arm64-musl': 4.0.475 + '@remotion/compositor-linux-x64-gnu': 4.0.475 + '@remotion/compositor-linux-x64-musl': 4.0.475 + '@remotion/compositor-win32-x64-msvc': 4.0.475 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@remotion/streaming@4.0.475': {} + + '@remotion/studio-server@4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + '@remotion/bundler': 4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + memfs: 3.4.3 + open: 8.4.2 + prettier: 3.8.1 + recast: 0.23.11 + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + semver: 7.5.3 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - react + - react-dom + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/studio-shared@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - react + - react-dom + + '@remotion/studio@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@remotion/canvas-capture': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/media-utils': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/player': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/timeline-utils': 4.0.475 + '@remotion/web-renderer': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/zod-types': 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + mediabunny: 1.45.0 + memfs: 3.4.3 + open: 8.4.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + semver: 7.5.3 + zod: 4.3.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@remotion/tailwind@4.0.475(@remotion/bundler@4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@rspack/core@1.7.11)(typescript@5.9.3)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8))': + dependencies: + '@remotion/bundler': 4.0.475(lightningcss@1.31.1)(postcss@8.5.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + autoprefixer: 10.4.20(postcss@8.5.10) + css-loader: 7.1.4(@rspack/core@1.7.11)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)) + postcss: 8.5.10 + postcss-loader: 7.3.4(postcss@8.5.10)(typescript@5.9.3)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)) + postcss-preset-env: 8.3.2(postcss@8.5.10) + style-loader: 4.0.0(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)) + tailwindcss: 3.4.13 + transitivePeerDependencies: + - '@rspack/core' + - ts-node + - typescript + - webpack + + '@remotion/timeline-utils@4.0.475': + dependencies: + mediabunny: 1.45.0 + + '@remotion/web-renderer@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@mediabunny/aac-encoder': 1.45.0(mediabunny@1.45.0) + '@mediabunny/flac-encoder': 1.45.0(mediabunny@1.45.0) + '@mediabunny/mp3-encoder': 1.45.0(mediabunny@1.45.0) + '@remotion/licensing': 4.0.475 + mediabunny: 1.45.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + '@remotion/zod-types@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)': + dependencies: + remotion: 4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + zod: 4.3.6 + transitivePeerDependencies: + - react + - react-dom + '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/rollup-android-arm-eabi@4.59.0': @@ -1881,6 +3875,65 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true + '@rspack/binding-darwin-arm64@1.7.11': + optional: true + + '@rspack/binding-darwin-x64@1.7.11': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.7.11': + optional: true + + '@rspack/binding-linux-arm64-musl@1.7.11': + optional: true + + '@rspack/binding-linux-x64-gnu@1.7.11': + optional: true + + '@rspack/binding-linux-x64-musl@1.7.11': + optional: true + + '@rspack/binding-wasm32-wasi@1.7.11': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.7.11': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.7.11': + optional: true + + '@rspack/binding-win32-x64-msvc@1.7.11': + optional: true + + '@rspack/binding@1.7.11': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.7.11 + '@rspack/binding-darwin-x64': 1.7.11 + '@rspack/binding-linux-arm64-gnu': 1.7.11 + '@rspack/binding-linux-arm64-musl': 1.7.11 + '@rspack/binding-linux-x64-gnu': 1.7.11 + '@rspack/binding-linux-x64-musl': 1.7.11 + '@rspack/binding-wasm32-wasi': 1.7.11 + '@rspack/binding-win32-arm64-msvc': 1.7.11 + '@rspack/binding-win32-ia32-msvc': 1.7.11 + '@rspack/binding-win32-x64-msvc': 1.7.11 + + '@rspack/core@1.7.11': + dependencies: + '@module-federation/runtime-tools': 0.22.0 + '@rspack/binding': 1.7.11 + '@rspack/lite-tapable': 1.1.0 + + '@rspack/lite-tapable@1.1.0': {} + + '@rspack/plugin-react-refresh@1.6.1(react-refresh@0.18.0)': + dependencies: + error-stack-parser: 2.1.4 + html-entities: 2.6.0 + react-refresh: 0.18.0 + '@tanstack/query-core@5.90.20': {} '@tanstack/react-query@5.90.21(react@19.2.4)': @@ -1888,6 +3941,11 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.4 + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.0 @@ -1909,8 +3967,26 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@types/dom-mediacapture-transform@0.1.11': + dependencies: + '@types/dom-webcodecs': 0.1.13 + + '@types/dom-webcodecs@0.1.13': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@types/estree@1.0.8': {} + '@types/json-schema@7.0.15': {} + '@types/node@24.11.0': dependencies: undici-types: 7.16.0 @@ -1925,7 +4001,7 @@ snapshots: '@types/statuses@2.0.6': {} - '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1))': + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -1933,10 +4009,112 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + 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 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + 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 + + '@webassemblyjs/wasm-gen@1.14.1': + 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 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + 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 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + acorn-import-phases@1.0.4(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv-formats@2.1.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-keywords@5.1.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + fast-deep-equal: 3.1.3 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-regex@5.0.1: {} ansi-styles@4.3.0: @@ -1952,6 +4130,31 @@ snapshots: arg@5.0.2: {} + argparse@2.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + autoprefixer@10.4.20(postcss@8.5.10): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001776 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + autoprefixer@10.4.27(postcss@8.5.10): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001776 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + autoprefixer@10.4.27(postcss@8.5.8): dependencies: browserslist: 4.28.1 @@ -1977,6 +4180,10 @@ snapshots: node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) + buffer-from@1.1.2: {} + + callsites@3.1.0: {} + camelcase-css@2.0.1: {} caniuse-lite@1.0.30001776: {} @@ -1993,6 +4200,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chrome-trace-event@1.0.4: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -2013,12 +4222,61 @@ snapshots: color-name@1.1.4: {} + commander@2.20.3: {} + commander@4.1.1: {} convert-source-map@2.0.0: {} cookie@1.1.1: {} + cosmiconfig@8.3.6(typescript@5.9.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.2.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-blank-pseudo@5.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + css-has-pseudo@5.0.2(postcss@8.5.10): + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + css-loader@7.1.4(@rspack/core@1.7.11)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)): + dependencies: + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.10) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.10) + postcss-modules-scope: 3.2.1(postcss@8.5.10) + postcss-modules-values: 4.0.0(postcss@8.5.10) + postcss-value-parser: 4.2.0 + semver: 7.8.4 + optionalDependencies: + '@rspack/core': 1.7.11 + webpack: 5.105.0(esbuild@0.28.0)(lightningcss@1.31.1)(postcss@8.5.8) + + css-prefers-color-scheme@8.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + cssdb@7.11.2: {} + cssesc@3.0.0: {} csstype@3.2.3: {} @@ -2027,6 +4285,8 @@ snapshots: dependencies: ms: 2.1.3 + define-lazy-prop@2.0.0: {} + detect-libc@2.1.2: optional: true @@ -2034,10 +4294,27 @@ snapshots: dlv@1.1.3: {} + dotenv@17.3.1: {} + electron-to-chromium@1.5.307: {} emoji-regex@8.0.0: {} + enhanced-resolve@5.23.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + es-module-lexer@2.1.0: {} + esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -2067,7 +4344,67 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 - escalade@3.2.0: {} + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + + escalade@3.2.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: dependencies: @@ -2077,6 +4414,8 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-uri@3.1.2: {} + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -2089,8 +4428,12 @@ snapshots: dependencies: to-regex-range: 5.0.1 + fraction.js@4.3.7: {} + fraction.js@5.3.4: {} + fs-monkey@1.0.3: {} + fsevents@2.3.3: optional: true @@ -2100,6 +4443,8 @@ snapshots: get-caller-file@2.0.5: {} + get-stream@6.0.1: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2108,14 +4453,35 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + + graceful-fs@4.2.11: {} + graphql@16.13.1: {} + has-flag@4.0.0: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 headers-polyfill@4.0.3: {} + html-entities@2.6.0: {} + + human-signals@2.1.0: {} + + icss-utils@5.1.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + is-arrayish@0.2.1: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -2124,6 +4490,8 @@ snapshots: dependencies: hasown: 2.0.2 + is-docker@2.2.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2136,14 +4504,38 @@ snapshots: is-number@7.0.0: {} + is-stream@2.0.1: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isexe@2.0.0: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 24.11.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jiti@1.21.7: {} js-tokens@4.0.0: {} + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + jsesc@3.1.0: {} + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + json5@2.2.3: {} + kleur@3.0.3: {} + lightningcss-android-arm64@1.31.1: optional: true @@ -2194,18 +4586,39 @@ snapshots: lightningcss-win32-x64-msvc: 1.31.1 optional: true + lilconfig@2.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} + loader-runner@4.3.2: {} + + lodash.sortby@4.7.0: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lucide-react@0.577.0(react@19.2.4): dependencies: react: 19.2.4 + mediabunny@1.45.0: + dependencies: + '@types/dom-mediacapture-transform': 0.1.11 + '@types/dom-webcodecs': 0.1.13 + + memfs@3.4.3: + dependencies: + fs-monkey: 1.0.3 + + merge-stream@2.0.0: {} + merge2@1.4.1: {} micromatch@4.0.8: @@ -2213,6 +4626,16 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + minimist@1.2.6: {} + ms@2.1.3: {} msw@2.12.10(@types/node@24.11.0)(typescript@5.9.3): @@ -2250,20 +4673,53 @@ snapshots: nanoid@3.3.11: {} + neo-async@2.6.2: {} + node-releases@2.0.36: {} normalize-path@3.0.0: {} + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + object-assign@4.1.1: {} object-hash@3.0.0: {} + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + outvariant@1.4.3: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-key@3.1.1: {} + path-parse@1.0.7: {} path-to-regexp@6.3.0: {} + path-type@4.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -2274,6 +4730,99 @@ snapshots: pirates@4.0.7: {} + postcss-attribute-case-insensitive@6.0.3(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-clamp@4.1.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-color-functional-notation@5.1.0(postcss@8.5.10): + dependencies: + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-color-hex-alpha@9.0.4(postcss@8.5.10): + dependencies: + '@csstools/utilities': 1.0.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-color-rebeccapurple@8.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-custom-media@9.1.5(postcss@8.5.10): + dependencies: + '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + postcss: 8.5.10 + + postcss-custom-properties@13.3.12(postcss@8.5.10): + dependencies: + '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/utilities': 1.0.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-custom-selectors@7.1.12(postcss@8.5.10): + dependencies: + '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-dir-pseudo-class@7.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-double-position-gradients@4.0.4(postcss@8.5.10): + dependencies: + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-focus-visible@8.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-focus-within@7.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-font-variant@5.0.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + postcss-gap-properties@4.0.1(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + postcss-image-set-function@5.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-import@15.1.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.11 + postcss-import@15.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -2281,36 +4830,219 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.11 + postcss-initial@4.0.1(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + postcss-js@4.1.0(postcss@8.5.10): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.10 + postcss-js@4.1.0(postcss@8.5.8): dependencies: camelcase-css: 2.0.1 postcss: 8.5.8 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.8): + postcss-lab-function@5.2.3(postcss@8.5.10): + dependencies: + '@csstools/css-color-parser': 1.6.3(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + postcss: 8.5.10 + + postcss-load-config@4.0.2(postcss@8.5.10): + dependencies: + lilconfig: 3.1.3 + yaml: 2.9.0 + optionalDependencies: + postcss: 8.5.10 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.8 + yaml: 2.9.0 + + postcss-loader@7.3.4(postcss@8.5.10)(typescript@5.9.3)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)): + dependencies: + cosmiconfig: 8.3.6(typescript@5.9.3) + jiti: 1.21.7 + postcss: 8.5.10 + semver: 7.8.4 + webpack: 5.105.0(esbuild@0.28.0)(lightningcss@1.31.1)(postcss@8.5.8) + transitivePeerDependencies: + - typescript + + postcss-logical@6.2.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.10): + dependencies: + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-selector-parser: 7.1.2 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 7.1.2 + + postcss-modules-values@4.0.0(postcss@8.5.10): + dependencies: + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 + + postcss-nested@6.2.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 postcss-nested@6.2.0(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-selector-parser: 6.1.2 + postcss-nesting@11.3.0(postcss@8.5.10): + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-opacity-percentage@2.0.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + postcss-overflow-shorthand@4.0.1(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-page-break@3.0.4(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + postcss-place@8.0.1(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + postcss-preset-env@8.3.2(postcss@8.5.10): + dependencies: + '@csstools/postcss-cascade-layers': 3.0.1(postcss@8.5.10) + '@csstools/postcss-color-function': 2.2.3(postcss@8.5.10) + '@csstools/postcss-color-mix-function': 1.0.3(postcss@8.5.10) + '@csstools/postcss-font-format-keywords': 2.0.2(postcss@8.5.10) + '@csstools/postcss-gradients-interpolation-method': 3.0.6(postcss@8.5.10) + '@csstools/postcss-hwb-function': 2.2.2(postcss@8.5.10) + '@csstools/postcss-ic-unit': 2.0.4(postcss@8.5.10) + '@csstools/postcss-is-pseudo-class': 3.2.1(postcss@8.5.10) + '@csstools/postcss-logical-float-and-clear': 1.0.1(postcss@8.5.10) + '@csstools/postcss-logical-resize': 1.0.1(postcss@8.5.10) + '@csstools/postcss-logical-viewport-units': 1.0.3(postcss@8.5.10) + '@csstools/postcss-media-minmax': 1.1.8(postcss@8.5.10) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 1.0.4(postcss@8.5.10) + '@csstools/postcss-nested-calc': 2.0.2(postcss@8.5.10) + '@csstools/postcss-normalize-display-values': 2.0.1(postcss@8.5.10) + '@csstools/postcss-oklab-function': 2.2.3(postcss@8.5.10) + '@csstools/postcss-progressive-custom-properties': 2.3.0(postcss@8.5.10) + '@csstools/postcss-scope-pseudo-class': 2.0.2(postcss@8.5.10) + '@csstools/postcss-stepped-value-functions': 2.1.1(postcss@8.5.10) + '@csstools/postcss-text-decoration-shorthand': 2.2.4(postcss@8.5.10) + '@csstools/postcss-trigonometric-functions': 2.1.1(postcss@8.5.10) + '@csstools/postcss-unset-value': 2.0.1(postcss@8.5.10) + autoprefixer: 10.4.27(postcss@8.5.10) + browserslist: 4.28.1 + css-blank-pseudo: 5.0.2(postcss@8.5.10) + css-has-pseudo: 5.0.2(postcss@8.5.10) + css-prefers-color-scheme: 8.0.2(postcss@8.5.10) + cssdb: 7.11.2 + postcss: 8.5.10 + postcss-attribute-case-insensitive: 6.0.3(postcss@8.5.10) + postcss-clamp: 4.1.0(postcss@8.5.10) + postcss-color-functional-notation: 5.1.0(postcss@8.5.10) + postcss-color-hex-alpha: 9.0.4(postcss@8.5.10) + postcss-color-rebeccapurple: 8.0.2(postcss@8.5.10) + postcss-custom-media: 9.1.5(postcss@8.5.10) + postcss-custom-properties: 13.3.12(postcss@8.5.10) + postcss-custom-selectors: 7.1.12(postcss@8.5.10) + postcss-dir-pseudo-class: 7.0.2(postcss@8.5.10) + postcss-double-position-gradients: 4.0.4(postcss@8.5.10) + postcss-focus-visible: 8.0.2(postcss@8.5.10) + postcss-focus-within: 7.0.2(postcss@8.5.10) + postcss-font-variant: 5.0.0(postcss@8.5.10) + postcss-gap-properties: 4.0.1(postcss@8.5.10) + postcss-image-set-function: 5.0.2(postcss@8.5.10) + postcss-initial: 4.0.1(postcss@8.5.10) + postcss-lab-function: 5.2.3(postcss@8.5.10) + postcss-logical: 6.2.0(postcss@8.5.10) + postcss-nesting: 11.3.0(postcss@8.5.10) + postcss-opacity-percentage: 2.0.0(postcss@8.5.10) + postcss-overflow-shorthand: 4.0.1(postcss@8.5.10) + postcss-page-break: 3.0.4(postcss@8.5.10) + postcss-place: 8.0.1(postcss@8.5.10) + postcss-pseudo-class-any-link: 8.0.2(postcss@8.5.10) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.10) + postcss-selector-not: 7.0.2(postcss@8.5.10) + postcss-value-parser: 4.2.0 + + postcss-pseudo-class-any-link@8.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-replace-overflow-wrap@4.0.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + postcss-selector-not@7.0.2(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} + postcss@8.5.10: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 + prettier@3.8.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + punycode@2.3.1: {} + queue-microtask@1.2.3: {} react-dom@19.2.4(react@19.2.4): @@ -2344,8 +5076,25 @@ snapshots: dependencies: picomatch: 2.3.1 + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + remotion@4.0.475(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + resolve@1.22.11: dependencies: is-core-module: 2.16.1 @@ -2393,14 +5142,50 @@ snapshots: scheduler@0.27.0: {} + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) + semver@6.3.1: {} + semver@7.5.3: + dependencies: + lru-cache: 6.0.0 + + semver@7.8.4: {} + set-cookie-parser@2.7.2: {} + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + stackframe@1.3.4: {} + statuses@2.0.2: {} strict-event-emitter@0.5.1: {} @@ -2415,6 +5200,12 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-final-newline@2.0.0: {} + + style-loader@4.0.0(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)): + dependencies: + webpack: 5.105.0(esbuild@0.28.0)(lightningcss@1.31.1)(postcss@8.5.8) + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -2425,17 +5216,48 @@ snapshots: tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} tagged-tag@1.0.0: {} tailwind-merge@3.5.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.19): + tailwindcss-animate@1.0.7(tailwindcss@3.4.19(yaml@2.9.0)): dependencies: - tailwindcss: 3.4.19 + tailwindcss: 3.4.19(yaml@2.9.0) - tailwindcss@3.4.19: + tailwindcss@3.4.13: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.10 + postcss-import: 15.1.0(postcss@8.5.10) + postcss-js: 4.1.0(postcss@8.5.10) + postcss-load-config: 4.0.2(postcss@8.5.10) + postcss-nested: 6.2.0(postcss@8.5.10) + postcss-selector-parser: 6.1.2 + resolve: 1.22.11 + sucrase: 3.35.1 + transitivePeerDependencies: + - ts-node + + tailwindcss@3.4.19(yaml@2.9.0): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -2454,7 +5276,7 @@ snapshots: postcss: 8.5.8 postcss-import: 15.1.0(postcss@8.5.8) postcss-js: 4.1.0(postcss@8.5.8) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8)(yaml@2.9.0) postcss-nested: 6.2.0(postcss@8.5.8) postcss-selector-parser: 6.1.2 resolve: 1.22.11 @@ -2463,6 +5285,27 @@ snapshots: - tsx - yaml + tapable@2.3.3: {} + + terser-webpack-plugin@5.6.1(esbuild@0.28.0)(lightningcss@1.31.1)(postcss@8.5.8)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.48.0 + webpack: 5.105.0(esbuild@0.28.0)(lightningcss@1.31.1)(postcss@8.5.8) + optionalDependencies: + esbuild: 0.28.0 + lightningcss: 1.31.1 + postcss: 8.5.8 + + terser@5.48.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -2471,6 +5314,8 @@ snapshots: dependencies: any-promise: 1.3.0 + tiny-invariant@1.3.3: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -2482,6 +5327,8 @@ snapshots: dependencies: tldts-core: 7.0.25 + to-fast-properties@2.0.0: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -2490,8 +5337,14 @@ snapshots: dependencies: tldts: 7.0.25 + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + ts-interface-checker@0.1.13: {} + tslib@2.8.1: {} + type-fest@5.4.4: dependencies: tagged-tag: 1.0.0 @@ -2514,7 +5367,7 @@ snapshots: util-deprecate@1.0.2: {} - vite@7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1): + vite@7.3.1(@types/node@24.11.0)(jiti@1.21.7)(lightningcss@1.31.1)(terser@5.48.0)(yaml@2.9.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -2527,6 +5380,68 @@ snapshots: fsevents: 2.3.3 jiti: 1.21.7 lightningcss: 1.31.1 + terser: 5.48.0 + yaml: 2.9.0 + + watchpack@2.5.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + webidl-conversions@4.0.2: {} + + webpack-sources@3.5.0: {} + + webpack@5.105.0(esbuild@0.28.0)(lightningcss@1.31.1)(postcss@8.5.8): + 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.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.23.0 + es-module-lexer: 2.1.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.2 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.1(esbuild@0.28.0)(lightningcss@1.31.1)(postcss@8.5.8)(webpack@5.105.0(lightningcss@1.31.1)(postcss@8.5.8)) + watchpack: 2.5.1 + webpack-sources: 3.5.0 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 wrap-ansi@6.2.0: dependencies: @@ -2540,10 +5455,16 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + ws@8.20.1: {} + y18n@5.0.8: {} yallist@3.1.1: {} + yallist@4.0.0: {} + + yaml@2.9.0: {} + yargs-parser@21.1.1: {} yargs@17.7.2: @@ -2557,3 +5478,5 @@ snapshots: yargs-parser: 21.1.1 yoctocolors-cjs@2.1.3: {} + + zod@4.3.6: {} diff --git a/remotion.config.ts b/remotion.config.ts new file mode 100644 index 0000000..9fff380 --- /dev/null +++ b/remotion.config.ts @@ -0,0 +1,18 @@ +import path from "node:path"; +import { Config } from "@remotion/cli/config"; +import { enableTailwind } from "@remotion/tailwind"; + +Config.overrideWebpackConfig((config) => { + const tailwindConfig = enableTailwind(config); + + return { + ...tailwindConfig, + resolve: { + ...tailwindConfig.resolve, + alias: { + ...(tailwindConfig.resolve?.alias ?? {}), + "@": path.resolve(process.cwd(), "src"), + }, + }, + }; +}); diff --git a/src/App.tsx b/src/App.tsx index 7f4d047..fa2ac8f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -56,6 +56,11 @@ const TeamSpacePage = lazy(() => default: TeamSpacePage, })), ); +const PrVideoPage = lazy(() => + import("@/pages/pr-video-page").then(({ PrVideoPage }) => ({ + default: PrVideoPage, + })), +); const TeamPoPresentationPage = lazy(() => import("@/pages/team-po-presentation-page").then( ({ TeamPoPresentationPage }) => ({ @@ -226,6 +231,7 @@ export function App() { } /> } /> } /> + } /> } /> diff --git a/src/features/pr-video/components/pr-video-player.tsx b/src/features/pr-video/components/pr-video-player.tsx new file mode 100644 index 0000000..251dbdc --- /dev/null +++ b/src/features/pr-video/components/pr-video-player.tsx @@ -0,0 +1,23 @@ +import { Player } from "@remotion/player"; + +import { TEAM_PO_PR_VIDEO } from "@/features/pr-video/constants"; +import { TeamPoPrVideo } from "@/features/pr-video/components/team-po-pr-video"; + +export function PrVideoPlayer() { + return ( +
+ +
+ ); +} diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx new file mode 100644 index 0000000..64c2a1b --- /dev/null +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -0,0 +1,1328 @@ +import type { CSSProperties } from "react"; +import { + Activity, + AlertTriangle, + CalendarClock, + Check, + CircleDashed, + GitBranch, + GitPullRequest, + MessageSquare, + Rocket, + Search, + Sparkles, + UsersRound, +} from "lucide-react"; +import { + AbsoluteFill, + Easing, + interpolate, + Sequence, + useCurrentFrame, + useVideoConfig, +} from "remotion"; + +const EASE_OUT = Easing.bezier(0.16, 1, 0.3, 1); +const EASE_IN_OUT = Easing.bezier(0.45, 0, 0.55, 1); +const OPENING_SCENE_FRAMES = 180; +const PROBLEM_SCENE_START_FRAME = 165; +const PROBLEM_SCENE_FRAMES = 195; + +const candidateRows = [ + { name: "Frontend", stack: "React", color: "bg-blue-500" }, + { name: "Backend", stack: "Spring", color: "bg-emerald-500" }, + { name: "Product", stack: "PM", color: "bg-amber-400" }, +] as const; + +const lifecycleStages = ["forming", "active", "shipping", "done"] as const; + +const heatmapCells = [ + { id: "cell-01", level: 0 }, + { id: "cell-02", level: 1 }, + { id: "cell-03", level: 2 }, + { id: "cell-04", level: 3 }, + { id: "cell-05", level: 2 }, + { id: "cell-06", level: 0 }, + { id: "cell-07", level: 1 }, + { id: "cell-08", level: 2 }, + { id: "cell-09", level: 3 }, + { id: "cell-10", level: 4 }, + { id: "cell-11", level: 2 }, + { id: "cell-12", level: 1 }, + { id: "cell-13", level: 0 }, + { id: "cell-14", level: 2 }, + { id: "cell-15", level: 3 }, + { id: "cell-16", level: 4 }, + { id: "cell-17", level: 3 }, + { id: "cell-18", level: 2 }, + { id: "cell-19", level: 1 }, + { id: "cell-20", level: 0 }, + { id: "cell-21", level: 2 }, + { id: "cell-22", level: 4 }, + { id: "cell-23", level: 4 }, + { id: "cell-24", level: 3 }, + { id: "cell-25", level: 2 }, + { id: "cell-26", level: 1 }, + { id: "cell-27", level: 0 }, + { id: "cell-28", level: 2 }, + { id: "cell-29", level: 3 }, + { id: "cell-30", level: 4 }, + { id: "cell-31", level: 2 }, + { id: "cell-32", level: 1 }, + { id: "cell-33", level: 3 }, + { id: "cell-34", level: 4 }, + { id: "cell-35", level: 2 }, +] as const; + +const issueNodes = [ + { + id: "recruit", + kind: "users", + title: "팀원 모집", + meta: "D+7 모집 중", + x: 18, + y: 154, + color: "blue", + delay: 0.1, + rotation: -4, + }, + { + id: "role", + kind: "search", + title: "역할 조율", + meta: "FE? BE? PM?", + x: 400, + y: 76, + color: "amber", + delay: 0.22, + rotation: 3, + }, + { + id: "chat", + kind: "message", + title: "대화 기록", + meta: "DM · 오픈채팅 · 댓글", + x: 205, + y: 300, + color: "emerald", + delay: 0.36, + rotation: -2, + }, + { + id: "schedule", + kind: "calendar", + title: "마감 일정", + meta: "다음 액션 미정", + x: 592, + y: 242, + color: "rose", + delay: 0.5, + rotation: 4, + }, + { + id: "github", + kind: "git", + title: "개발 기록", + meta: "PR · 이슈 · 리뷰 단절", + x: 86, + y: 506, + color: "indigo", + delay: 0.64, + rotation: 2, + }, +] as const; + +const painPoints = [ + { + id: "matching", + label: "팀 찾기", + title: "좋은 팀원을 만나기 전까지 시간이 새요", + detail: "모집글, 자기소개, 역할 기대치가 흩어져 있어요.", + color: "#3b82f6", + }, + { + id: "operation", + label: "팀 운영", + title: "시작해도 진행 상태가 금방 흐려져요", + detail: "마감, 역할, 체크리스트가 같은 기준으로 보이지 않아요.", + color: "#10b981", + }, + { + id: "shipping", + label: "완주", + title: "협업 루틴이 없으면 출시 전 동력이 꺼져요", + detail: "GitHub 기록과 다음 액션이 연결되지 않으면 멈추기 쉬워요.", + color: "#f59e0b", + }, +] as const; + +export function TeamPoPrVideo() { + return ( + + + + + + + + + ); +} + +function OpeningScene() { + const frame = useCurrentFrame(); + const { fps } = useVideoConfig(); + const camera = motionProgress( + frame, + seconds(4.7, fps), + seconds(1.1, fps), + EASE_IN_OUT, + ); + const cameraX = interpolate(camera, [0, 1], [0, -68]); + const cameraScale = interpolate(camera, [0, 1], [1, 1.025]); + + return ( + + +
+ + + +
+ +
+ ); +} + +function AnimatedBackground({ frame, fps }: { frame: number; fps: number }) { + const gridOpacity = motionProgress( + frame, + seconds(0.1, fps), + seconds(1.3, fps), + ); + const lineProgress = motionProgress( + frame, + seconds(0.5, fps), + seconds(4.4, fps), + ); + + return ( + <> +
+
+
+ {[ + { top: 122, width: 620, color: "rgba(59,130,246,0.22)", delay: 0 }, + { top: 238, width: 420, color: "rgba(16,185,129,0.2)", delay: 34 }, + { top: 742, width: 760, color: "rgba(99,102,241,0.18)", delay: 62 }, + { top: 880, width: 520, color: "rgba(245,158,11,0.2)", delay: 96 }, + ].map((line) => { + const travel = + ((frame + line.delay) % seconds(5.2, fps)) / seconds(5.2, fps); + const x = interpolate(travel, [0, 1], [-700, 2150]); + const opacity = Math.sin(travel * Math.PI) * lineProgress; + + return ( +
+ ); + })} +
+ + ); +} + +function LogoReveal({ frame, fps }: { frame: number; fps: number }) { + const prompt = motionProgress(frame, seconds(0.1, fps), seconds(0.75, fps)); + const blockOne = motionProgress( + frame, + seconds(0.45, fps), + seconds(0.42, fps), + ); + const blockTwo = motionProgress( + frame, + seconds(0.58, fps), + seconds(0.42, fps), + ); + const blockThree = motionProgress( + frame, + seconds(0.72, fps), + seconds(0.42, fps), + ); + const teamWord = motionProgress( + frame, + seconds(1.02, fps), + seconds(0.58, fps), + ); + const poWord = motionProgress(frame, seconds(1.78, fps), seconds(0.5, fps)); + const settle = motionProgress( + frame, + seconds(2.45, fps), + seconds(1.1, fps), + EASE_IN_OUT, + ); + + const logoStyle: CSSProperties = { + opacity: interpolate(frame, [0, seconds(0.35, fps)], [0, 1], { + extrapolateLeft: "clamp", + extrapolateRight: "clamp", + }), + transform: `translate3d(${interpolate(settle, [0, 1], [0, -24])}px, ${interpolate( + settle, + [0, 1], + [0, -8], + )}px, 0)`, + }; + + return ( +
+
+ + + + +
+ + Team + + + -po + +
+
+
+ ); +} + +function LogoBlock({ + progress, + x, + y, + color, +}: { + progress: number; + x: number; + y: number; + color: string; +}) { + return ( +
+ ); +} + +function ProductUiCluster({ frame, fps }: { frame: number; fps: number }) { + const cluster = motionProgress(frame, seconds(1.65, fps), seconds(0.9, fps)); + const drift = Math.sin(frame / 30) * 7; + + return ( +
+ + + + +
+ ); +} + +function FlowConnectors({ frame, fps }: { frame: number; fps: number }) { + const draw = motionProgress(frame, seconds(2.35, fps), seconds(1.6, fps)); + const dashOffset = 1120 * (1 - draw); + + return ( + + ); +} + +function MatchingCard({ frame, fps }: { frame: number; fps: number }) { + const style = cardStyle(frame, fps, 1.85, 0, 32); + const pulse = motionProgress( + frame, + seconds(2.55, fps), + seconds(2.5, fps), + EASE_IN_OUT, + ); + + return ( +
+
+
+
+ +
+
+

랜덤 팀 매칭

+

+ profile signal synced +

+
+
+ + 98% + +
+
+
+ {candidateRows.map((row, index) => { + const rowProgress = motionProgress( + frame, + seconds(2.35 + index * 0.18, fps), + seconds(0.55, fps), + ); + + return ( +
+ +
+

+ {row.name} +

+

+ {row.stack} +

+
+
+ ); + })} +
+ +
+
+ ); +} + +function OrbitNetwork({ pulse }: { pulse: number }) { + return ( +
+ + + + +
+ + +
+
+ ); +} + +function OrbitNode({ + label, + left, + top, + progress, +}: { + label: string; + left: number; + top: number; + progress: number; +}) { + return ( +
+ {label} +
+ ); +} + +function WorkspaceCard({ frame, fps }: { frame: number; fps: number }) { + const style = cardStyle(frame, fps, 2.25, 1.6, 42); + + return ( +
+
+
+
+ +
+
+

+ 팀 워크스페이스 +

+

+ lifecycle · checklist +

+
+
+
+ + active +
+
+ +
+ + + +
+
+ ); +} + +function LifecycleRail({ frame, fps }: { frame: number; fps: number }) { + const progress = motionProgress( + frame, + seconds(2.65, fps), + seconds(2.1, fps), + EASE_IN_OUT, + ); + + return ( +
+
+
+ {lifecycleStages.map((stage, index) => { + const active = motionProgress( + frame, + seconds(2.65 + index * 0.42, fps), + seconds(0.38, fps), + ); + + return ( +
0.65 ? "#3b82f6" : "#e2e8f0", + transform: `translate3d(-50%, -50%, 0) scale(${interpolate(active, [0, 1], [0.78, 1.08])})`, + }} + /> + ); + })} +
+
+ {lifecycleStages.map((stage) => ( + {stage} + ))} +
+
+ ); +} + +function ChecklistItem({ + frame, + fps, + index, + label, +}: { + frame: number; + fps: number; + index: number; + label: string; +}) { + const done = motionProgress( + frame, + seconds(3.2 + index * 0.32, fps), + seconds(0.35, fps), + ); + + return ( +
+
+
0.65 ? "#ecfdf5" : "#ffffff", + }} + > + +
+

{label}

+
+ + D-{4 - index} + +
+ ); +} + +function ProgressCard({ frame, fps }: { frame: number; fps: number }) { + const style = cardStyle(frame, fps, 2.68, 2.7, 46); + const barProgress = motionProgress( + frame, + seconds(3.05, fps), + seconds(1.6, fps), + EASE_IN_OUT, + ); + + return ( +
+
+
+
+ +
+
+

진척 리포트

+

+ GitHub + AI signal +

+
+
+
+ +
+
+
+
+ + + +
+ +
+
+ 이번 주 병목은 배포 체크리스트에 집중 +
+
+ ); +} + +function MetricBar({ + label, + progress, + target, + color, +}: { + label: string; + progress: number; + target: number; + color: string; +}) { + return ( +
+
+ {label} + {Math.round(target * progress)}% +
+
+
+
+
+ ); +} + +function Heatmap({ frame, fps }: { frame: number; fps: number }) { + return ( +
+ {heatmapCells.map((cell, index) => { + const reveal = motionProgress( + frame, + seconds(3.15 + index * 0.025, fps), + seconds(0.28, fps), + ); + const pulse = (Math.sin(frame / 11 + index) + 1) / 2; + const alpha = interpolate(cell.level, [0, 4], [0.12, 0.88]) * reveal; + + return ( +
+ ); + })} +
+ ); +} + +function SceneCaption({ frame, fps }: { frame: number; fps: number }) { + const caption = motionProgress(frame, seconds(2.05, fps), seconds(0.85, fps)); + const chips = motionProgress(frame, seconds(2.55, fps), seconds(0.9, fps)); + const highlight = motionProgress( + frame, + seconds(2.65, fps), + seconds(0.9, fps), + EASE_IN_OUT, + ); + + return ( +
+
+
+

+ 팀 찾기부터{" "} + + 완주까지 + + +

+

+ 사이드 프로젝트를{" "} + 계속 움직이게. +

+
+
+ {["랜덤 매칭", "라이프사이클", "진척 리포트"].map((label, index) => { + const item = Math.max(0, Math.min(1, chips - index * 0.16)); + + return ( + + {label} + + ); + })} +
+
+ ); +} + +function TransitionHint({ frame, fps }: { frame: number; fps: number }) { + const wipe = motionProgress( + frame, + seconds(5.15, fps), + seconds(0.72, fps), + EASE_IN_OUT, + ); + + return ( +
+
+
+
+ ); +} + +function ProblemScene() { + const frame = useCurrentFrame(); + const { fps } = useVideoConfig(); + const reveal = motionProgress(frame, 0, seconds(0.9, fps), EASE_IN_OUT); + const revealEdgeTop = interpolate(reveal, [0, 1], [108, -12]); + const revealEdgeBottom = interpolate(reveal, [0, 1], [100, -20]); + const content = motionProgress(frame, seconds(0.45, fps), seconds(0.95, fps)); + const settle = motionProgress( + frame, + seconds(2.8, fps), + seconds(1.7, fps), + EASE_IN_OUT, + ); + + return ( + + +
+
+ + Before Team-po +
+

+ 사이드 프로젝트, +
+ 시작 전부터 흩어져요 +

+

+ 팀원 찾기, 역할 조율, 진행 공유가 서로 다른 곳에 흩어지면 좋은 + 아이디어도 완주까지 가기 어렵습니다. +

+
+ + + + +
+ ); +} + +function ProblemBackground({ frame, fps }: { frame: number; fps: number }) { + const grid = motionProgress(frame, seconds(0.1, fps), seconds(1.3, fps)); + const sweep = ((frame % seconds(4.8, fps)) / seconds(4.8, fps)) * 1; + const sweepX = interpolate(sweep, [0, 1], [-520, 2200]); + + return ( + <> +
+
+
+
+ + ); +} + +function ScatteredIssueBoard({ + frame, + fps, + settle, +}: { + frame: number; + fps: number; + settle: number; +}) { + const board = motionProgress(frame, seconds(0.62, fps), seconds(1.0, fps)); + + return ( +
+ + {issueNodes.map((node) => ( + + ))} +
+
+ + 진행 신호가 분산됨 +
+
+ + + +
+
+
+ ); +} + +function IssueNode({ + frame, + fps, + node, +}: { + frame: number; + fps: number; + node: (typeof issueNodes)[number]; +}) { + const enter = motionProgress( + frame, + seconds(0.9 + node.delay, fps), + seconds(0.72, fps), + ); + const float = Math.sin(frame / 28 + node.x / 60) * 8; + const alert = motionProgress( + frame, + seconds(2.7 + node.delay, fps), + seconds(0.7, fps), + ); + + return ( +
+
+
+
+ +
+
+

+ {node.title} +

+

+ {node.meta} +

+
+
+
0.5 ? "#f59e0b" : "#dbeafe", + transform: `scale(${interpolate(alert, [0, 1], [0.75, 1.15])})`, + }} + /> +
+
+ ); +} + +function IssueIcon({ kind }: { kind: (typeof issueNodes)[number]["kind"] }) { + if (kind === "users") { + return ; + } + + if (kind === "search") { + return ; + } + + if (kind === "message") { + return ; + } + + if (kind === "calendar") { + return ; + } + + return ; +} + +function SignalBar({ + color, + delay, + frame, + fps, +}: { + color: string; + delay: number; + frame: number; + fps: number; +}) { + const progress = motionProgress( + frame, + seconds(delay, fps), + seconds(0.55, fps), + ); + + return ( +
+
+
+ ); +} + +function PainPointRail({ frame, fps }: { frame: number; fps: number }) { + return ( +
+ {painPoints.map((point, index) => { + const enter = motionProgress( + frame, + seconds(2.9 + index * 0.18, fps), + seconds(0.72, fps), + ); + + return ( +
+
+ + + {point.label} + +
+

+ {point.title} +

+

+ {point.detail} +

+
+ ); + })} +
+ ); +} + +function ProblemRevealEdge({ reveal }: { reveal: number }) { + return ( +
+ ); +} + +function issueColor(color: (typeof issueNodes)[number]["color"]) { + if (color === "blue") { + return "#3b82f6"; + } + + if (color === "emerald") { + return "#10b981"; + } + + if (color === "amber") { + return "#f59e0b"; + } + + if (color === "rose") { + return "#f43f5e"; + } + + return "#6366f1"; +} + +function cardStyle( + frame: number, + fps: number, + startSeconds: number, + floatOffset: number, + yOffset: number, +): CSSProperties { + const enter = motionProgress( + frame, + seconds(startSeconds, fps), + seconds(0.82, fps), + ); + const y = + interpolate(enter, [0, 1], [yOffset, 0]) + + Math.sin(frame / 27 + floatOffset) * 5; + + return { + opacity: enter, + transform: `translate3d(${interpolate(enter, [0, 1], [72, 0])}px, ${y}px, 0) scale(${interpolate( + enter, + [0, 1], + [0.94, 1], + )})`, + }; +} + +function seconds(value: number, fps: number) { + return Math.round(value * fps); +} + +function motionProgress( + frame: number, + start: number, + duration: number, + easing: (value: number) => number = EASE_OUT, +) { + return interpolate(frame, [start, start + duration], [0, 1], { + easing, + extrapolateLeft: "clamp", + extrapolateRight: "clamp", + }); +} diff --git a/src/features/pr-video/constants.ts b/src/features/pr-video/constants.ts new file mode 100644 index 0000000..9a3b58d --- /dev/null +++ b/src/features/pr-video/constants.ts @@ -0,0 +1,30 @@ +export const TEAM_PO_PR_VIDEO = { + id: "TeamPoPrVideo", + width: 1920, + height: 1080, + fps: 30, + durationInFrames: 360, +} as const; + +export const openingSceneTimeline = [ + { + time: "0.0s", + label: "프롬프트와 블록이 조립", + }, + { + time: "1.2s", + label: "Team 리빌 후 -po 등장", + }, + { + time: "2.0s", + label: "핵심 UI 카드 진입", + }, + { + time: "5.5s", + label: "사선 와이프로 문제 제기 씬 전환", + }, + { + time: "6.0s", + label: "팀 구성과 완주가 어려운 이유를 모션으로 제시", + }, +] as const; diff --git a/src/features/pr-video/remotion-root.tsx b/src/features/pr-video/remotion-root.tsx new file mode 100644 index 0000000..420fba9 --- /dev/null +++ b/src/features/pr-video/remotion-root.tsx @@ -0,0 +1,17 @@ +import { Composition } from "remotion"; + +import { TEAM_PO_PR_VIDEO } from "@/features/pr-video/constants"; +import { TeamPoPrVideo } from "@/features/pr-video/components/team-po-pr-video"; + +export function RemotionRoot() { + return ( + + ); +} diff --git a/src/pages/pr-video-page.tsx b/src/pages/pr-video-page.tsx new file mode 100644 index 0000000..1358a36 --- /dev/null +++ b/src/pages/pr-video-page.tsx @@ -0,0 +1,64 @@ +import { ArrowLeft, Film, MonitorPlay } from "lucide-react"; +import { Link } from "react-router-dom"; + +import { Button } from "@/components/ui/button"; +import { PrVideoPlayer } from "@/features/pr-video/components/pr-video-player"; +import { + TEAM_PO_PR_VIDEO, + openingSceneTimeline, +} from "@/features/pr-video/constants"; + +export function PrVideoPage() { + return ( +
+
+
+
+ +
+ + + Team-po PR Video + +
+

+ PR 영상 미리보기 +

+
+
+ + {TEAM_PO_PR_VIDEO.width}x{TEAM_PO_PR_VIDEO.height} ·{" "} + {TEAM_PO_PR_VIDEO.durationInFrames / TEAM_PO_PR_VIDEO.fps}s ·{" "} + {TEAM_PO_PR_VIDEO.fps}fps +
+
+ + + +
+ {openingSceneTimeline.map((item) => ( +
+

{item.time}

+

+ {item.label} +

+
+ ))} +
+
+
+ ); +} diff --git a/src/remotion-entry.tsx b/src/remotion-entry.tsx new file mode 100644 index 0000000..561b2c7 --- /dev/null +++ b/src/remotion-entry.tsx @@ -0,0 +1,6 @@ +import { registerRoot } from "remotion"; + +import { RemotionRoot } from "@/features/pr-video/remotion-root"; +import "@/index.css"; + +registerRoot(RemotionRoot); diff --git a/tsconfig.node.json b/tsconfig.node.json index e75109e..1827773 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -22,5 +22,5 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": ["vite.config.ts"] + "include": ["vite.config.ts", "remotion.config.ts"] } From 8d4ede9f83bcd223af9191411fefb409d73bab84 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 17:34:52 +0900 Subject: [PATCH 02/19] feat(pr-video): add matching demo scene --- package.json | 1 + .../pr-video/components/team-po-pr-video.tsx | 653 ++++++++++++++++++ src/features/pr-video/constants.ts | 10 +- src/pages/pr-video-page.tsx | 2 +- 4 files changed, 664 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2d097bf..6ceab02 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "video:studio": "remotion studio src/remotion-entry.tsx", "video:still": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening-frame.png --frame=110 --scale=0.5", "video:still:problem": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-problem-frame.png --frame=330 --scale=0.5", + "video:still:matching": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-matching-frame.png --frame=520 --scale=0.5", "video:render": "remotion render src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening.mp4" }, "dependencies": { diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 64c2a1b..b063054 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -2,14 +2,21 @@ import type { CSSProperties } from "react"; import { Activity, AlertTriangle, + BadgeCheck, CalendarClock, Check, CircleDashed, + Code2, + Database, GitBranch, GitPullRequest, + Layers3, MessageSquare, + Palette, Rocket, Search, + Shuffle, + SlidersHorizontal, Sparkles, UsersRound, } from "lucide-react"; @@ -27,6 +34,8 @@ const EASE_IN_OUT = Easing.bezier(0.45, 0, 0.55, 1); const OPENING_SCENE_FRAMES = 180; const PROBLEM_SCENE_START_FRAME = 165; const PROBLEM_SCENE_FRAMES = 195; +const MATCHING_SCENE_START_FRAME = 330; +const MATCHING_SCENE_FRAMES = 300; const candidateRows = [ { name: "Frontend", stack: "React", color: "bg-blue-500" }, @@ -156,6 +165,67 @@ const painPoints = [ }, ] as const; +const matchingProfiles = [ + { + id: "profile-fe", + name: "Frontend", + stack: "React · UI", + icon: "code", + color: "#3b82f6", + x: 98, + y: 118, + targetX: 94, + targetY: 166, + delay: 0.1, + score: 94, + }, + { + id: "profile-be", + name: "Backend", + stack: "Spring · API", + icon: "database", + color: "#10b981", + x: 612, + y: 124, + targetX: 594, + targetY: 166, + delay: 0.26, + score: 91, + }, + { + id: "profile-pm", + name: "Product", + stack: "PM · 기획", + icon: "layers", + color: "#f59e0b", + x: 126, + y: 456, + targetX: 102, + targetY: 486, + delay: 0.42, + score: 88, + }, + { + id: "profile-design", + name: "Design", + stack: "UX · System", + icon: "palette", + color: "#6366f1", + x: 580, + y: 448, + targetX: 584, + targetY: 486, + delay: 0.58, + score: 86, + }, +] as const; + +const matchingSignals = [ + { id: "goal", label: "목표", value: "MVP 출시", color: "#3b82f6" }, + { id: "pace", label: "속도", value: "주 2회", color: "#10b981" }, + { id: "role", label: "역할", value: "FE · BE · PM", color: "#f59e0b" }, +] as const; + export function TeamPoPrVideo() { return ( @@ -168,6 +238,12 @@ export function TeamPoPrVideo() { > + + + ); } @@ -1264,6 +1340,583 @@ function ProblemRevealEdge({ reveal }: { reveal: number }) { ); } +function MatchingScene() { + const frame = useCurrentFrame(); + const { fps } = useVideoConfig(); + const reveal = motionProgress(frame, 0, seconds(0.92, fps), EASE_IN_OUT); + const revealEdgeTop = interpolate(reveal, [0, 1], [110, -16]); + const revealEdgeBottom = interpolate(reveal, [0, 1], [100, -26]); + const intro = motionProgress(frame, seconds(0.35, fps), seconds(0.85, fps)); + const board = motionProgress(frame, seconds(0.7, fps), seconds(1.05, fps)); + + return ( + + + + + + + ); +} + +function MatchingBackground({ frame, fps }: { frame: number; fps: number }) { + const grid = motionProgress(frame, seconds(0.12, fps), seconds(1.2, fps)); + const scan = (frame % seconds(4.4, fps)) / seconds(4.4, fps); + + return ( + <> +
+
+
+ + ); +} + +function MatchingNarrativePanel({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const underline = motionProgress( + frame, + seconds(1.35, fps), + seconds(0.7, fps), + EASE_IN_OUT, + ); + const chips = motionProgress(frame, seconds(1.65, fps), seconds(0.9, fps)); + + return ( +
+
+ + Solution 01 +
+

+ 프로필 신호로 +
+ + 팀을 빠르게 묶어요 + + +

+

+ 관심사, 역할, 가능한 속도를 한 화면에서 맞춰 보고 +
+ 시작 가능한 조합만 선명하게 보여줍니다. +

+
+ {matchingSignals.map((signal, index) => { + const item = Math.max(0, Math.min(1, chips - index * 0.18)); + + return ( +
+
+ +

+ {signal.label} +

+
+

+ {signal.value} +

+
+ ); + })} +
+
+ ); +} + +function MatchingOrbitBoard({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const buttonClick = motionProgress( + frame, + seconds(1.85, fps), + seconds(0.45, fps), + EASE_IN_OUT, + ); + const panel = motionProgress(frame, seconds(3.2, fps), seconds(0.9, fps)); + const scan = motionProgress(frame, seconds(2.25, fps), seconds(0.9, fps)); + + return ( +
+
+
+ + + +
+ team-po.app/matching +
+
+ +
+
+
+ +
+
+

Team-po

+

+ Matching workspace +

+
+
+ + 팀 매칭 + + 팀 스페이스 + 리포트 +
+
+ +
+ +
+ + +
+
+
+

+ 추천 후보 +

+

+ 이번 주 바로 시작 가능한 프로필 +

+
+
+ + React, Spring, PM +
+
+ +
+ +
+ {matchingProfiles.map((profile, index) => ( + + ))} +
+ + +
+
+
+ +
+ ); +} + +function MatchingDemoCard({ + frame, + fps, + index, + profile, +}: { + frame: number; + fps: number; + index: number; + profile: (typeof matchingProfiles)[number]; +}) { + const enter = motionProgress( + frame, + seconds(1.0 + profile.delay, fps), + seconds(0.72, fps), + ); + const selected = motionProgress( + frame, + seconds(2.45 + index * 0.18, fps), + seconds(0.45, fps), + EASE_IN_OUT, + ); + + return ( +
0.55 ? profile.color : "#e2e8f0", + backgroundColor: selected > 0.55 ? "#f8fffc" : "#ffffff", + opacity: enter, + transform: `translate3d(0, ${interpolate(enter, [0, 1], [30, 0])}px, 0) scale(${interpolate(selected, [0, 1], [1, 1.025])})`, + }} + > +
+
+
+ +
+
+

+ {profile.name} +

+

+ {profile.stack} +

+
+
+
0.55 ? profile.color : "#e2e8f0", + backgroundColor: selected > 0.55 ? profile.color : "#ffffff", + }} + > + +
+
+
+
+

signal

+

+ {Math.round(profile.score * enter)}% +

+
+
+
+
+
+
+ ); +} + +function ProductCursor({ frame, fps }: { frame: number; fps: number }) { + const visible = motionProgress(frame, seconds(1.35, fps), seconds(0.35, fps)); + const click = motionProgress(frame, seconds(1.9, fps), seconds(0.35, fps)); + const selectClick = motionProgress( + frame, + seconds(2.65, fps), + seconds(0.45, fps), + ); + const x = interpolate( + frame, + [ + seconds(1.35, fps), + seconds(1.9, fps), + seconds(2.55, fps), + seconds(3.25, fps), + seconds(4.2, fps), + ], + [860, 940, 612, 752, 790], + { extrapolateLeft: "clamp", extrapolateRight: "clamp" }, + ); + const y = interpolate( + frame, + [ + seconds(1.35, fps), + seconds(1.9, fps), + seconds(2.55, fps), + seconds(3.25, fps), + seconds(4.2, fps), + ], + [146, 94, 326, 508, 640], + { extrapolateLeft: "clamp", extrapolateRight: "clamp" }, + ); + const ring = Math.max(click, selectClick); + + return ( +
+
+
+
+ ); +} + +function MatchingProfileIcon({ + icon, +}: { + icon: (typeof matchingProfiles)[number]["icon"]; +}) { + if (icon === "code") { + return ; + } + + if (icon === "database") { + return ; + } + + if (icon === "layers") { + return ; + } + + return ; +} + +function RecommendedTeamPanel({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const spark = motionProgress( + frame, + seconds(3.55, fps), + seconds(1.1, fps), + EASE_IN_OUT, + ); + + return ( +
+
+
+
+
+ +
+
+

+ MVP 런칭 스쿼드 추천 +

+

+ 목표, 속도, 역할 균형이 맞는 조합입니다. +

+
+
+
+ {["FE", "BE", "PM"].map((role, index) => ( +
+ {role} +
+ ))} +
+
+
+

match score

+

+ 98% +

+

+ 바로 팀 스페이스 생성 가능 +

+
+
+
+ ); +} + +function MatchingRevealEdge({ reveal }: { reveal: number }) { + return ( +
+ ); +} + function issueColor(color: (typeof issueNodes)[number]["color"]) { if (color === "blue") { return "#3b82f6"; diff --git a/src/features/pr-video/constants.ts b/src/features/pr-video/constants.ts index 9a3b58d..5506953 100644 --- a/src/features/pr-video/constants.ts +++ b/src/features/pr-video/constants.ts @@ -3,7 +3,7 @@ export const TEAM_PO_PR_VIDEO = { width: 1920, height: 1080, fps: 30, - durationInFrames: 360, + durationInFrames: 630, } as const; export const openingSceneTimeline = [ @@ -27,4 +27,12 @@ export const openingSceneTimeline = [ time: "6.0s", label: "팀 구성과 완주가 어려운 이유를 모션으로 제시", }, + { + time: "11.0s", + label: "랜덤 팀 매칭 씬으로 밝게 리빌", + }, + { + time: "13.5s", + label: "프로필 신호가 팀 조합으로 수렴", + }, ] as const; diff --git a/src/pages/pr-video-page.tsx b/src/pages/pr-video-page.tsx index 1358a36..29891b2 100644 --- a/src/pages/pr-video-page.tsx +++ b/src/pages/pr-video-page.tsx @@ -45,7 +45,7 @@ export function PrVideoPage() { -
+
{openingSceneTimeline.map((item) => (
Date: Thu, 11 Jun 2026 17:40:27 +0900 Subject: [PATCH 03/19] feat(pr-video): add workspace demo scene --- package.json | 1 + .../pr-video/components/team-po-pr-video.tsx | 605 ++++++++++++++++-- src/features/pr-video/constants.ts | 10 +- 3 files changed, 558 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index 6ceab02..8301b64 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "video:still": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening-frame.png --frame=110 --scale=0.5", "video:still:problem": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-problem-frame.png --frame=330 --scale=0.5", "video:still:matching": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-matching-frame.png --frame=520 --scale=0.5", + "video:still:workspace": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-workspace-frame.png --frame=820 --scale=0.5", "video:render": "remotion render src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening.mp4" }, "dependencies": { diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index b063054..2729ac0 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -36,6 +36,8 @@ const PROBLEM_SCENE_START_FRAME = 165; const PROBLEM_SCENE_FRAMES = 195; const MATCHING_SCENE_START_FRAME = 330; const MATCHING_SCENE_FRAMES = 300; +const WORKSPACE_SCENE_START_FRAME = 600; +const WORKSPACE_SCENE_FRAMES = 330; const candidateRows = [ { name: "Frontend", stack: "React", color: "bg-blue-500" }, @@ -226,6 +228,39 @@ const matchingSignals = [ { id: "role", label: "역할", value: "FE · BE · PM", color: "#f59e0b" }, ] as const; +const workspaceTasks = [ + { + id: "scope", + title: "이번 주 개발 범위 합의", + meta: "PM · FE · BE", + color: "#3b82f6", + column: "forming", + delay: 0.12, + }, + { + id: "contract", + title: "API 계약 정리", + meta: "Backend", + color: "#10b981", + column: "active", + delay: 0.28, + }, + { + id: "release", + title: "릴리즈 체크리스트 생성", + meta: "Team", + color: "#f59e0b", + column: "shipping", + delay: 0.44, + }, +] as const; + +const workspaceChecklist = [ + "역할과 목표 정리", + "이번 주 개발 범위 합의", + "데모 배포 체크", +] as const; + export function TeamPoPrVideo() { return ( @@ -244,6 +279,12 @@ export function TeamPoPrVideo() { > + + + ); } @@ -1644,7 +1685,7 @@ function MatchingOrbitBoard({
- +
); } @@ -1740,68 +1781,29 @@ function MatchingDemoCard({ ); } -function ProductCursor({ frame, fps }: { frame: number; fps: number }) { - const visible = motionProgress(frame, seconds(1.35, fps), seconds(0.35, fps)); - const click = motionProgress(frame, seconds(1.9, fps), seconds(0.35, fps)); - const selectClick = motionProgress( +function MatchingTouchPulse({ frame, fps }: { frame: number; fps: number }) { + const startButton = motionProgress( frame, - seconds(2.65, fps), - seconds(0.45, fps), + seconds(1.86, fps), + seconds(0.42, fps), ); - const x = interpolate( + const candidate = motionProgress( frame, - [ - seconds(1.35, fps), - seconds(1.9, fps), - seconds(2.55, fps), - seconds(3.25, fps), - seconds(4.2, fps), - ], - [860, 940, 612, 752, 790], - { extrapolateLeft: "clamp", extrapolateRight: "clamp" }, - ); - const y = interpolate( + seconds(2.62, fps), + seconds(0.5, fps), + ); + const teamPanel = motionProgress( frame, - [ - seconds(1.35, fps), - seconds(1.9, fps), - seconds(2.55, fps), - seconds(3.25, fps), - seconds(4.2, fps), - ], - [146, 94, 326, 508, 640], - { extrapolateLeft: "clamp", extrapolateRight: "clamp" }, - ); - const ring = Math.max(click, selectClick); + seconds(3.48, fps), + seconds(0.55, fps), + ); return ( -
-
-
-
+ <> + + + + ); } @@ -1917,6 +1919,495 @@ function MatchingRevealEdge({ reveal }: { reveal: number }) { ); } +function WorkspaceDemoScene() { + const frame = useCurrentFrame(); + const { fps } = useVideoConfig(); + const reveal = motionProgress(frame, 0, seconds(0.9, fps), EASE_IN_OUT); + const revealEdgeTop = interpolate(reveal, [0, 1], [112, -18]); + const revealEdgeBottom = interpolate(reveal, [0, 1], [102, -26]); + const intro = motionProgress(frame, seconds(0.32, fps), seconds(0.82, fps)); + const windowProgress = motionProgress( + frame, + seconds(0.62, fps), + seconds(1.0, fps), + ); + + return ( + + + + + + + ); +} + +function WorkspaceDemoBackground({ + frame, + fps, +}: { + frame: number; + fps: number; +}) { + const grid = motionProgress(frame, seconds(0.1, fps), seconds(1.1, fps)); + const sweep = (frame % seconds(5, fps)) / seconds(5, fps); + + return ( + <> +
+
+
+ + ); +} + +function WorkspaceNarrativePanel({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const underline = motionProgress( + frame, + seconds(1.25, fps), + seconds(0.72, fps), + EASE_IN_OUT, + ); + + return ( +
+
+ + Solution 02 +
+

+ 팀이 생기면 +
+ + 바로 운영 화면으로 + + +

+

+ 상태, 역할, 체크리스트가 한 페이지에서 움직여서 +
+ 팀이 “지금 뭘 해야 하는지” 바로 보입니다. +

+
+ ); +} + +function WorkspaceDemoWindow({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const stageProgress = motionProgress( + frame, + seconds(2.0, fps), + seconds(2.5, fps), + EASE_IN_OUT, + ); + const drawer = motionProgress(frame, seconds(3.35, fps), seconds(0.82, fps)); + + return ( +
+
+
+ + + +
+ team-po.app/team-space +
+
+ +
+ + +
+
+
+

+ MVP 런칭 스쿼드 +

+

+ 랜덤 매칭으로 생성된 팀 스페이스 +

+
+
+ + live +
+
+ + + +
+ + +
+ + + +
+
+
+
+ ); +} + +function WorkspaceStageRail({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const progressWidth = interpolate(progress, [0, 1], [12, 64]); + + return ( +
+
+
+ {lifecycleStages.map((stage, index) => { + const active = motionProgress( + frame, + seconds(1.6 + index * 0.42, fps), + seconds(0.45, fps), + ); + + return ( +
0.55 ? "#3b82f6" : "#e2e8f0", + color: active > 0.55 ? "#ffffff" : "#94a3b8", + transform: `translate3d(-50%, -50%, 0) scale(${interpolate(active, [0, 1], [0.82, 1.08])})`, + }} + > + +
+ ); + })} +
+
+ forming + active + shipping + done +
+
+ ); +} + +function WorkspaceBoard({ frame, fps }: { frame: number; fps: number }) { + const columns = ["forming", "active", "shipping"] as const; + + return ( +
+
+

작업 보드

+

+ 자동 동기화 +

+
+
+ {columns.map((column) => ( +
+

+ {column} +

+
+ {workspaceTasks + .filter((task) => task.column === column) + .map((task, index) => ( + + ))} +
+
+ ))} +
+
+ ); +} + +function WorkspaceTaskCard({ + frame, + fps, + index, + task, +}: { + frame: number; + fps: number; + index: number; + task: (typeof workspaceTasks)[number]; +}) { + const enter = motionProgress( + frame, + seconds(1.15 + task.delay, fps), + seconds(0.58, fps), + ); + const lift = motionProgress(frame, seconds(2.55, fps), seconds(0.65, fps)); + + return ( +
0.2 + ? "0 18px 38px rgba(16,185,129,0.16)" + : "0 1px 2px rgba(15,23,42,0.04)", + }} + > +
+ + + D-{4 - index} + +
+

+ {task.title} +

+

{task.meta}

+
+ ); +} + +function WorkspaceChecklist({ frame, fps }: { frame: number; fps: number }) { + return ( +
+
+

체크리스트

+ +
+
+ {workspaceChecklist.map((item, index) => { + const done = motionProgress( + frame, + seconds(2.0 + index * 0.36, fps), + seconds(0.42, fps), + ); + + return ( +
+
0.5 ? "#10b981" : "#dbeafe", + backgroundColor: done > 0.5 ? "#ecfdf5" : "#ffffff", + }} + > + +
+

{item}

+
+ ); + })} +
+
+

다음 액션

+

+ 릴리즈 체크리스트 생성 +

+
+
+ ); +} + +function WorkspaceActionDrawer({ progress }: { progress: number }) { + return ( +
+
+
+ +
+
+

active 단계로 전환

+

+ 팀원에게 다음 액션이 공유됩니다 +

+
+
+
+
+
+
+ ); +} + +function WorkspaceTouchPulse({ frame, fps }: { frame: number; fps: number }) { + const stageTap = motionProgress( + frame, + seconds(2.18, fps), + seconds(0.46, fps), + ); + const taskTap = motionProgress(frame, seconds(2.78, fps), seconds(0.48, fps)); + const drawerTap = motionProgress( + frame, + seconds(3.62, fps), + seconds(0.5, fps), + ); + + return ( + <> + + + + + ); +} + +function TouchPulse({ + color, + progress, + x, + y, +}: { + color: string; + progress: number; + x: number; + y: number; +}) { + return ( +
+
+
+ ); +} + function issueColor(color: (typeof issueNodes)[number]["color"]) { if (color === "blue") { return "#3b82f6"; diff --git a/src/features/pr-video/constants.ts b/src/features/pr-video/constants.ts index 5506953..efce5c2 100644 --- a/src/features/pr-video/constants.ts +++ b/src/features/pr-video/constants.ts @@ -3,7 +3,7 @@ export const TEAM_PO_PR_VIDEO = { width: 1920, height: 1080, fps: 30, - durationInFrames: 630, + durationInFrames: 930, } as const; export const openingSceneTimeline = [ @@ -35,4 +35,12 @@ export const openingSceneTimeline = [ time: "13.5s", label: "프로필 신호가 팀 조합으로 수렴", }, + { + time: "20.0s", + label: "팀 워크스페이스 기능 시연 UI 진입", + }, + { + time: "24.0s", + label: "라이프사이클과 체크리스트가 함께 업데이트", + }, ] as const; From 1a2d7f27b8a0b9c08f5448e1357a789ce1e678f4 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 17:43:49 +0900 Subject: [PATCH 04/19] feat(pr-video): add progress report demo scene --- package.json | 1 + .../pr-video/components/team-po-pr-video.tsx | 472 ++++++++++++++++++ src/features/pr-video/constants.ts | 10 +- 3 files changed, 482 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 8301b64..1ca5ba4 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "video:still:problem": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-problem-frame.png --frame=330 --scale=0.5", "video:still:matching": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-matching-frame.png --frame=520 --scale=0.5", "video:still:workspace": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-workspace-frame.png --frame=820 --scale=0.5", + "video:still:report": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-report-frame.png --frame=1120 --scale=0.5", "video:render": "remotion render src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening.mp4" }, "dependencies": { diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 2729ac0..ad1d5b6 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -38,6 +38,8 @@ const MATCHING_SCENE_START_FRAME = 330; const MATCHING_SCENE_FRAMES = 300; const WORKSPACE_SCENE_START_FRAME = 600; const WORKSPACE_SCENE_FRAMES = 330; +const REPORT_SCENE_START_FRAME = 900; +const REPORT_SCENE_FRAMES = 360; const candidateRows = [ { name: "Frontend", stack: "React", color: "bg-blue-500" }, @@ -261,6 +263,33 @@ const workspaceChecklist = [ "데모 배포 체크", ] as const; +const reportMetrics = [ + { id: "pr", label: "PR merged", value: 84, color: "#3b82f6" }, + { id: "task", label: "Tasks done", value: 72, color: "#10b981" }, + { id: "pace", label: "Shipping pace", value: 61, color: "#f59e0b" }, +] as const; + +const reportRows = [ + { + id: "row-pr", + title: "로그인 플로우 PR merged", + meta: "GitHub · 12분 전", + color: "#3b82f6", + }, + { + id: "row-task", + title: "배포 체크리스트 3개 완료", + meta: "Checklist · 오늘", + color: "#10b981", + }, + { + id: "row-risk", + title: "API 응답 지연 이슈 감지", + meta: "AI signal · 확인 필요", + color: "#f59e0b", + }, +] as const; + export function TeamPoPrVideo() { return ( @@ -285,6 +314,12 @@ export function TeamPoPrVideo() { > + + + ); } @@ -2408,6 +2443,443 @@ function TouchPulse({ ); } +function ReportDemoScene() { + const frame = useCurrentFrame(); + const { fps } = useVideoConfig(); + const reveal = motionProgress(frame, 0, seconds(0.92, fps), EASE_IN_OUT); + const revealEdgeTop = interpolate(reveal, [0, 1], [112, -18]); + const revealEdgeBottom = interpolate(reveal, [0, 1], [102, -28]); + const intro = motionProgress(frame, seconds(0.32, fps), seconds(0.84, fps)); + const windowProgress = motionProgress( + frame, + seconds(0.62, fps), + seconds(1.02, fps), + ); + + return ( + + + + + + + ); +} + +function ReportDemoBackground({ frame, fps }: { frame: number; fps: number }) { + const grid = motionProgress(frame, seconds(0.1, fps), seconds(1.1, fps)); + const sweep = (frame % seconds(4.8, fps)) / seconds(4.8, fps); + + return ( + <> +
+
+
+ + ); +} + +function ReportNarrativePanel({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const underline = motionProgress( + frame, + seconds(1.22, fps), + seconds(0.72, fps), + EASE_IN_OUT, + ); + + return ( +
+
+ + Solution 03 +
+

+ 진척은 자동으로 +
+ + 팀에게 돌아와요 + + +

+

+ GitHub, 체크리스트, 활동 신호를 묶어 +
+ 다음 액션이 필요한 지점을 바로 보여줍니다. +

+
+ ); +} + +function ReportDemoWindow({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const insight = motionProgress(frame, seconds(3.15, fps), seconds(0.9, fps)); + + return ( +
+
+
+ + + +
+ team-po.app/report +
+
+ +
+ + +
+
+
+

+ 진척 리포트 +

+

+ GitHub + 체크리스트 + 팀 활동 신호 +

+
+
+ + AI signal synced +
+
+ +
+ {reportMetrics.map((metric, index) => ( + + ))} +
+ +
+ + +
+ + + +
+
+
+
+ ); +} + +function ReportMetricCard({ + frame, + fps, + index, + metric, +}: { + frame: number; + fps: number; + index: number; + metric: (typeof reportMetrics)[number]; +}) { + const enter = motionProgress( + frame, + seconds(1.05 + index * 0.15, fps), + seconds(0.55, fps), + ); + const fill = motionProgress( + frame, + seconds(1.7 + index * 0.18, fps), + seconds(1.1, fps), + EASE_IN_OUT, + ); + + return ( +
+
+

{metric.label}

+ +
+

+ {Math.round(metric.value * fill)}% +

+
+
+
+
+ ); +} + +function ReportTrendChart({ frame, fps }: { frame: number; fps: number }) { + const draw = motionProgress(frame, seconds(1.8, fps), seconds(1.6, fps)); + const points = [ + { x: 32, y: 210 }, + { x: 112, y: 172 }, + { x: 192, y: 184 }, + { x: 272, y: 118 }, + { x: 352, y: 96 }, + { x: 432, y: 62 }, + ]; + + return ( +
+
+
+

완주 추세

+

+ 최근 6일 활동 흐름 +

+
+

+ +18% +

+
+ +
+ ); +} + +function ReportActivityList({ frame, fps }: { frame: number; fps: number }) { + return ( +
+
+

활동 신호

+ +
+
+ {reportRows.map((row, index) => { + const enter = motionProgress( + frame, + seconds(1.55 + index * 0.22, fps), + seconds(0.52, fps), + ); + + return ( +
+
+ +

+ {row.meta} +

+
+

+ {row.title} +

+
+ ); + })} +
+
+ ); +} + +function ReportInsightPanel({ progress }: { progress: number }) { + return ( +
+
+
+
+ +
+
+

+ 이번 주 병목은 API 응답 지연 +

+

+ 배포 체크리스트 전에 API 이슈를 먼저 닫는 것을 추천합니다. +

+
+
+
+

next action

+

BE 리뷰 요청

+
+
+
+ ); +} + +function ReportTouchPulse({ frame, fps }: { frame: number; fps: number }) { + const metricTap = motionProgress( + frame, + seconds(1.76, fps), + seconds(0.48, fps), + ); + const chartTap = motionProgress( + frame, + seconds(2.72, fps), + seconds(0.52, fps), + ); + const insightTap = motionProgress( + frame, + seconds(3.62, fps), + seconds(0.52, fps), + ); + + return ( + <> + + + + + ); +} + function issueColor(color: (typeof issueNodes)[number]["color"]) { if (color === "blue") { return "#3b82f6"; diff --git a/src/features/pr-video/constants.ts b/src/features/pr-video/constants.ts index efce5c2..8902726 100644 --- a/src/features/pr-video/constants.ts +++ b/src/features/pr-video/constants.ts @@ -3,7 +3,7 @@ export const TEAM_PO_PR_VIDEO = { width: 1920, height: 1080, fps: 30, - durationInFrames: 930, + durationInFrames: 1260, } as const; export const openingSceneTimeline = [ @@ -43,4 +43,12 @@ export const openingSceneTimeline = [ time: "24.0s", label: "라이프사이클과 체크리스트가 함께 업데이트", }, + { + time: "30.0s", + label: "진척 리포트 대시보드 UI 진입", + }, + { + time: "35.0s", + label: "GitHub 활동과 AI 인사이트가 다음 액션으로 연결", + }, ] as const; From 0def12dd94bf759b49025000aab42b961776d98a Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 17:48:05 +0900 Subject: [PATCH 05/19] feat(pr-video): add closing flow scene --- package.json | 1 + .../pr-video/components/team-po-pr-video.tsx | 413 ++++++++++++++++++ src/features/pr-video/constants.ts | 10 +- 3 files changed, 423 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ca5ba4..2d5f4eb 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "video:still:matching": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-matching-frame.png --frame=520 --scale=0.5", "video:still:workspace": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-workspace-frame.png --frame=820 --scale=0.5", "video:still:report": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-report-frame.png --frame=1120 --scale=0.5", + "video:still:closing": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-closing-frame.png --frame=1650 --scale=0.5", "video:render": "remotion render src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening.mp4" }, "dependencies": { diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index ad1d5b6..be901f3 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -40,6 +40,8 @@ const WORKSPACE_SCENE_START_FRAME = 600; const WORKSPACE_SCENE_FRAMES = 330; const REPORT_SCENE_START_FRAME = 900; const REPORT_SCENE_FRAMES = 360; +const CLOSING_SCENE_START_FRAME = 1230; +const CLOSING_SCENE_FRAMES = 600; const candidateRows = [ { name: "Frontend", stack: "React", color: "bg-blue-500" }, @@ -290,6 +292,33 @@ const reportRows = [ }, ] as const; +const closingFlow = [ + { + id: "matching", + label: "팀 매칭", + title: "역할과 목표가 맞는 팀 생성", + color: "#10b981", + }, + { + id: "workspace", + label: "운영", + title: "상태와 체크리스트로 같은 화면 보기", + color: "#3b82f6", + }, + { + id: "report", + label: "리포트", + title: "진척 신호가 다음 액션으로 연결", + color: "#6366f1", + }, + { + id: "shipping", + label: "완주", + title: "멈추기 전에 출시 루틴 유지", + color: "#f59e0b", + }, +] as const; + export function TeamPoPrVideo() { return ( @@ -320,6 +349,12 @@ export function TeamPoPrVideo() { > + + + ); } @@ -2880,6 +2915,384 @@ function ReportTouchPulse({ frame, fps }: { frame: number; fps: number }) { ); } +function ClosingDemoScene() { + const frame = useCurrentFrame(); + const { fps } = useVideoConfig(); + const reveal = motionProgress(frame, 0, seconds(0.92, fps), EASE_IN_OUT); + const revealEdgeTop = interpolate(reveal, [0, 1], [112, -18]); + const revealEdgeBottom = interpolate(reveal, [0, 1], [102, -28]); + const intro = motionProgress(frame, seconds(0.32, fps), seconds(0.84, fps)); + const windowProgress = motionProgress( + frame, + seconds(0.62, fps), + seconds(1.02, fps), + ); + + return ( + + + + + + + ); +} + +function ClosingBackground({ frame, fps }: { frame: number; fps: number }) { + const grid = motionProgress(frame, seconds(0.1, fps), seconds(1.1, fps)); + const sweep = (frame % seconds(5.4, fps)) / seconds(5.4, fps); + + return ( + <> +
+
+
+ + ); +} + +function ClosingBrandPanel({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const po = motionProgress(frame, seconds(0.9, fps), seconds(0.48, fps)); + const underline = motionProgress( + frame, + seconds(1.45, fps), + seconds(0.8, fps), + EASE_IN_OUT, + ); + + return ( +
+
+ +
+ Team + + -po + +
+
+

+ 팀 찾기부터 +
+ + 완주까지 한 흐름으로 + + +

+

+ 사이드 프로젝트가 시작만 하고 멈추지 않도록 +
+ 팀의 다음 액션을 계속 앞으로 밀어줍니다. +

+
+ ); +} + +function ClosingDashboardWindow({ + frame, + fps, + progress, +}: { + frame: number; + fps: number; + progress: number; +}) { + const launch = motionProgress( + frame, + seconds(4.2, fps), + seconds(1.2, fps), + EASE_IN_OUT, + ); + + return ( +
+
+
+ + + +
+ team-po.app/finish +
+
+ +
+
+
+

+ 프로젝트 완주 준비 완료 +

+

+ 팀 생성부터 출시 루틴까지 하나의 워크플로우 +

+
+
+ 팀 프로젝트 시작하기 +
+
+ +
+
+
+

+ 완주 플로우 +

+

+ ready +

+
+
+ {closingFlow.map((item, index) => ( + + ))} +
+
+ +
+

이번 팀

+

+ MVP 런칭 스쿼드 +

+
+ {[ + ["98%", "match"], + ["84%", "PR"], + ["72%", "tasks"], + ["D-3", "ship"], + ].map(([value, label], index) => { + const enter = motionProgress( + frame, + seconds(2.1 + index * 0.15, fps), + seconds(0.42, fps), + ); + + return ( +
+

+ {value} +

+

+ {label} +

+
+ ); + })} +
+
+

+ next action +

+

데모 배포 체크

+
+
+
+ +
+
+

+ 다음 7일 루틴 +

+

+ auto plan +

+
+
+ {["역할 확정", "API 리뷰", "데모 배포", "회고 작성"].map( + (item, index) => { + const enter = motionProgress( + frame, + seconds(3.0 + index * 0.16, fps), + seconds(0.42, fps), + ); + + return ( +
+

+ step {index + 1} +

+

+ {item} +

+
+ ); + }, + )} +
+
+ + +
+
+
+ ); +} + +function ClosingFlowCard({ + frame, + fps, + index, + item, +}: { + frame: number; + fps: number; + index: number; + item: (typeof closingFlow)[number]; +}) { + const enter = motionProgress( + frame, + seconds(1.25 + index * 0.2, fps), + seconds(0.55, fps), + ); + const active = motionProgress( + frame, + seconds(2.65 + index * 0.24, fps), + seconds(0.45, fps), + ); + + return ( +
0.5 ? item.color : "#e2e8f0", + opacity: enter, + transform: `translate3d(0, ${interpolate(enter, [0, 1], [24, 0])}px, 0) scale(${interpolate(active, [0, 1], [1, 1.025])})`, + }} + > +
+
+ +
+

+ {item.label} +

+
+

+ {item.title} +

+
+ ); +} + +function ClosingTouchPulse({ frame, fps }: { frame: number; fps: number }) { + const cardTap = motionProgress(frame, seconds(2.9, fps), seconds(0.55, fps)); + const launchTap = motionProgress( + frame, + seconds(4.25, fps), + seconds(0.6, fps), + ); + + return ( + <> + + + + ); +} + function issueColor(color: (typeof issueNodes)[number]["color"]) { if (color === "blue") { return "#3b82f6"; diff --git a/src/features/pr-video/constants.ts b/src/features/pr-video/constants.ts index 8902726..2e46da2 100644 --- a/src/features/pr-video/constants.ts +++ b/src/features/pr-video/constants.ts @@ -3,7 +3,7 @@ export const TEAM_PO_PR_VIDEO = { width: 1920, height: 1080, fps: 30, - durationInFrames: 1260, + durationInFrames: 1830, } as const; export const openingSceneTimeline = [ @@ -51,4 +51,12 @@ export const openingSceneTimeline = [ time: "35.0s", label: "GitHub 활동과 AI 인사이트가 다음 액션으로 연결", }, + { + time: "41.0s", + label: "Team-po 전체 완주 플로우 요약", + }, + { + time: "55.0s", + label: "팀 프로젝트 시작 CTA로 클로징", + }, ] as const; From 08814fbc49e952b76a4454ccb4b8d07e2b109b88 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 17:56:42 +0900 Subject: [PATCH 06/19] feat(pr-video): add logo finale scene --- package.json | 3 +- .../pr-video/components/team-po-pr-video.tsx | 177 +++++++++++++++++- src/features/pr-video/constants.ts | 8 +- 3 files changed, 182 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 2d5f4eb..0a5cf7e 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "video:still:matching": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-matching-frame.png --frame=520 --scale=0.5", "video:still:workspace": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-workspace-frame.png --frame=820 --scale=0.5", "video:still:report": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-report-frame.png --frame=1120 --scale=0.5", - "video:still:closing": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-closing-frame.png --frame=1650 --scale=0.5", + "video:still:closing": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-closing-frame.png --frame=1440 --scale=0.5", + "video:still:finale": "remotion still src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-finale-frame.png --frame=1645 --scale=0.5", "video:render": "remotion render src/remotion-entry.tsx TeamPoPrVideo artifacts/pr-video/team-po-pr-opening.mp4" }, "dependencies": { diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index be901f3..ee1ddd8 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -41,7 +41,9 @@ const WORKSPACE_SCENE_FRAMES = 330; const REPORT_SCENE_START_FRAME = 900; const REPORT_SCENE_FRAMES = 360; const CLOSING_SCENE_START_FRAME = 1230; -const CLOSING_SCENE_FRAMES = 600; +const CLOSING_SCENE_FRAMES = 300; +const FINALE_SCENE_START_FRAME = 1500; +const FINALE_SCENE_FRAMES = 270; const candidateRows = [ { name: "Frontend", stack: "React", color: "bg-blue-500" }, @@ -355,6 +357,12 @@ export function TeamPoPrVideo() { > + + + ); } @@ -3293,6 +3301,173 @@ function ClosingTouchPulse({ frame, fps }: { frame: number; fps: number }) { ); } +function FinaleLogoScene() { + const frame = useCurrentFrame(); + const { fps } = useVideoConfig(); + const reveal = motionProgress(frame, 0, seconds(0.82, fps), EASE_IN_OUT); + const prompt = motionProgress(frame, seconds(0.22, fps), seconds(0.6, fps)); + const blockOne = motionProgress( + frame, + seconds(0.46, fps), + seconds(0.44, fps), + ); + const blockTwo = motionProgress(frame, seconds(0.6, fps), seconds(0.44, fps)); + const blockThree = motionProgress( + frame, + seconds(0.74, fps), + seconds(0.44, fps), + ); + const team = motionProgress(frame, seconds(0.9, fps), seconds(0.62, fps)); + const po = motionProgress(frame, seconds(1.36, fps), seconds(0.5, fps)); + const message = motionProgress(frame, seconds(1.86, fps), seconds(0.8, fps)); + const underline = motionProgress( + frame, + seconds(2.2, fps), + seconds(0.9, fps), + EASE_IN_OUT, + ); + const finalPulse = motionProgress( + frame, + seconds(4.2, fps), + seconds(1.4, fps), + EASE_IN_OUT, + ); + + return ( + +
+
+ {[ + { top: 150, delay: 0, color: "rgba(59,130,246,0.22)" }, + { top: 826, delay: 42, color: "rgba(16,185,129,0.22)" }, + { top: 936, delay: 88, color: "rgba(245,158,11,0.2)" }, + ].map((line) => { + const travel = + ((frame + line.delay) % seconds(5.6, fps)) / seconds(5.6, fps); + + return ( +
+ ); + })} + +
+ + + + +
+ + Team + + + -po + +
+
+ +
+

+ 사이드 프로젝트를 +
+ + 끝까지 움직이게 + + +

+

+ 팀 찾기부터 완주까지, Team-po +

+
+ +
+ 팀 프로젝트의 시작과 + 완주를 한 곳에서 +
+ + ); +} + function issueColor(color: (typeof issueNodes)[number]["color"]) { if (color === "blue") { return "#3b82f6"; diff --git a/src/features/pr-video/constants.ts b/src/features/pr-video/constants.ts index 2e46da2..fd061d9 100644 --- a/src/features/pr-video/constants.ts +++ b/src/features/pr-video/constants.ts @@ -3,7 +3,7 @@ export const TEAM_PO_PR_VIDEO = { width: 1920, height: 1080, fps: 30, - durationInFrames: 1830, + durationInFrames: 1770, } as const; export const openingSceneTimeline = [ @@ -53,10 +53,10 @@ export const openingSceneTimeline = [ }, { time: "41.0s", - label: "Team-po 전체 완주 플로우 요약", + label: "Team-po 전체 완주 플로우를 짧게 요약", }, { - time: "55.0s", - label: "팀 프로젝트 시작 CTA로 클로징", + time: "50.0s", + label: "로고 기반 임팩트 메시지로 피날레", }, ] as const; From b9e8abcdbb24f3a8df72d4ebff7e5dff7716b506 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 18:10:31 +0900 Subject: [PATCH 07/19] fix(pr-video): emphasize problem signal and align demo colors --- .../pr-video/components/team-po-pr-video.tsx | 146 ++++++++++++------ 1 file changed, 95 insertions(+), 51 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index ee1ddd8..5577d71 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -712,7 +712,7 @@ function MatchingCard({ frame, fps }: { frame: number; fps: number }) { function OrbitNetwork({ pulse }: { pulse: number }) { return ( -
+
-
+
+
@@ -956,7 +956,7 @@ function ProgressCard({ frame, fps }: { frame: number; fps: number }) {
-
+
이번 주 병목은 배포 체크리스트에 집중
@@ -1222,6 +1222,21 @@ function ScatteredIssueBoard({ settle: number; }) { const board = motionProgress(frame, seconds(0.62, fps), seconds(1.0, fps)); + const signalReveal = motionProgress( + frame, + seconds(2.18, fps), + seconds(0.78, fps), + EASE_OUT, + ); + const signalFocus = motionProgress( + frame, + seconds(2.62, fps), + seconds(0.86, fps), + EASE_IN_OUT, + ); + const signalScale = + interpolate(signalReveal, [0, 1], [0.88, 1]) * + interpolate(signalFocus, [0, 0.52, 1], [1, 1.045, 1.01]); return (
))}
-
- - 진행 신호가 분산됨 +
+
+ +
+
+

+ 핵심 병목 +

+

+ 진행 신호가 분산됨 +

+
-
- - - +

+ 팀 찾기, 역할 조율, 진척 공유가 이어지지 않아 다음 액션이 흐려집니다. +

+
+ + +
@@ -1652,10 +1688,10 @@ function MatchingOrbitBoard({
-
-

+

+

AI 추천 기준

-

+

역할 균형과 진행 가능성을 함께 계산

@@ -1923,7 +1959,7 @@ function RecommendedTeamPanel({ return (
-
+

MVP 런칭 스쿼드 추천

-

+

목표, 속도, 역할 균형이 맞는 조합입니다.

@@ -1947,7 +1983,7 @@ function RecommendedTeamPanel({
{["FE", "BE", "PM"].map((role, index) => (
-

match score

-

+

match score

+

98%

-

+

바로 팀 스페이스 생성 가능

@@ -2170,10 +2206,12 @@ function WorkspaceDemoWindow({
체크리스트
회의 기록
-
-

이번 주

-

Active

-

+

+

이번 주

+

+ Active +

+

3개 태스크 진행 중

@@ -2404,25 +2442,25 @@ function WorkspaceChecklist({ frame, fps }: { frame: number; fps: number }) { function WorkspaceActionDrawer({ progress }: { progress: number }) { return (
-
+

active 단계로 전환

-

+

팀원에게 다음 액션이 공유됩니다

-
-
+
+
); @@ -2645,10 +2683,12 @@ function ReportDemoWindow({
회고
-
-

이번 주

-

Shipping

-

+

+

이번 주

+

+ Shipping +

+

릴리즈까지 D-3

@@ -2868,7 +2908,7 @@ function ReportActivityList({ frame, fps }: { frame: number; fps: number }) { function ReportInsightPanel({ progress }: { progress: number }) { return (
-
+

이번 주 병목은 API 응답 지연

-

+

배포 체크리스트 전에 API 이슈를 먼저 닫는 것을 추천합니다.

-
-

next action

-

BE 리뷰 요청

+
+

next action

+

+ BE 리뷰 요청 +

@@ -3111,7 +3153,7 @@ function ClosingDashboardWindow({

-
-

+

+

next action

-

데모 배포 체크

+

+ 데모 배포 체크 +

From 51f04e43c345d790bd36a03d2bc6aaf2d4cab851 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 18:16:59 +0900 Subject: [PATCH 08/19] feat(pr-video): sharpen problem scene framing --- .../pr-video/components/team-po-pr-video.tsx | 189 +++++++++++++++++- 1 file changed, 180 insertions(+), 9 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 5577d71..4d1f7be 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -149,6 +149,34 @@ const issueNodes = [ }, ] as const; +const problemConvergencePaths = [ + { + id: "from-recruit", + d: "M144 216 C272 304 392 370 520 432", + stroke: "rgba(245,158,11,0.4)", + }, + { + id: "from-role", + d: "M548 144 C580 246 574 332 548 430", + stroke: "rgba(239,68,68,0.34)", + }, + { + id: "from-chat", + d: "M344 366 C414 390 482 414 536 438", + stroke: "rgba(16,185,129,0.34)", + }, + { + id: "from-schedule", + d: "M724 306 C676 358 620 398 566 438", + stroke: "rgba(245,158,11,0.38)", + }, + { + id: "from-github", + d: "M238 566 C350 526 452 478 536 448", + stroke: "rgba(99,102,241,0.34)", + }, +] as const; + const painPoints = [ { id: "matching", @@ -1126,6 +1154,7 @@ function ProblemScene() { const revealEdgeTop = interpolate(reveal, [0, 1], [108, -12]); const revealEdgeBottom = interpolate(reveal, [0, 1], [100, -20]); const content = motionProgress(frame, seconds(0.45, fps), seconds(0.95, fps)); + const bridge = motionProgress(frame, seconds(4.45, fps), seconds(0.75, fps)); const settle = motionProgress( frame, seconds(2.8, fps), @@ -1141,6 +1170,7 @@ function ProblemScene() { }} > +
-
+
- Before Team-po + 문제 제기 · Before Team-po

- 사이드 프로젝트, + 사이드 프로젝트는 +
+ 시작보다
- 시작 전부터 흩어져요 + 완주가 어렵습니다

- 팀원 찾기, 역할 조율, 진행 공유가 서로 다른 곳에 흩어지면 좋은 - 아이디어도 완주까지 가기 어렵습니다. + 팀원 찾기, 역할 조율, 진행 공유가 이어지지 않으면 프로젝트의 흐름이 + 끊깁니다.

+
+ + Team-po는 이 신호를 하나의 흐름으로 연결합니다 +
@@ -1212,6 +1254,70 @@ function ProblemBackground({ frame, fps }: { frame: number; fps: number }) { ); } +function ProblemWarningField({ frame, fps }: { frame: number; fps: number }) { + const warning = motionProgress( + frame, + seconds(1.25, fps), + seconds(1.55, fps), + EASE_IN_OUT, + ); + const sweep = ((frame % seconds(2.7, fps)) / seconds(2.7, fps)) * 1; + const scanX = interpolate(sweep, [0, 1], [-380, 1220]); + const tremor = Math.sin(frame / 5) * 3; + + return ( + <> +
+
+ + + ); +} + function ScatteredIssueBoard({ frame, fps, @@ -1237,6 +1343,12 @@ function ScatteredIssueBoard({ const signalScale = interpolate(signalReveal, [0, 1], [0.88, 1]) * interpolate(signalFocus, [0, 0.52, 1], [1, 1.045, 1.01]); + const problemPressure = motionProgress( + frame, + seconds(1.82, fps), + seconds(1.45, fps), + EASE_IN_OUT, + ); return (
+ {problemConvergencePaths.map((path, index) => ( + + ))} {issueNodes.map((node) => ( - + + ))} + {[0, 1, 2].map((ring) => ( +
))}
+
+ +
0.5 ? "#f59e0b" : "#dbeafe", + boxShadow: alert > 0.5 ? "0 0 18px rgba(245,158,11,0.46)" : "none", transform: `scale(${interpolate(alert, [0, 1], [0.75, 1.15])})`, }} /> From 9207c0ef3267b05c4fa02d7e79fe435f7fbc0bd6 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 18:32:57 +0900 Subject: [PATCH 09/19] feat(pr-video): turn closing summary into flow recap --- .../pr-video/components/team-po-pr-video.tsx | 401 ++++++++++-------- 1 file changed, 226 insertions(+), 175 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 4d1f7be..a9490a7 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -325,27 +325,47 @@ const reportRows = [ const closingFlow = [ { id: "matching", - label: "팀 매칭", - title: "역할과 목표가 맞는 팀 생성", + label: "팀 찾기", + title: "랜덤 매칭", + detail: "역할·목표·속도 신호 정렬", color: "#10b981", + fromX: -260, + fromY: -110, + x: 34, + y: 206, }, { id: "workspace", - label: "운영", - title: "상태와 체크리스트로 같은 화면 보기", + label: "팀 운영", + title: "워크스페이스", + detail: "상태와 체크리스트를 한 화면에", color: "#3b82f6", + fromX: -80, + fromY: -240, + x: 286, + y: 92, }, { id: "report", - label: "리포트", - title: "진척 신호가 다음 액션으로 연결", + label: "진척 확인", + title: "진척 리포트", + detail: "GitHub·태스크 신호를 다음 액션으로", color: "#6366f1", + fromX: 110, + fromY: 260, + x: 538, + y: 206, }, { id: "shipping", label: "완주", - title: "멈추기 전에 출시 루틴 유지", + title: "출시 루틴", + detail: "멈추기 전에 완주 리듬 유지", color: "#f59e0b", + fromX: 300, + fromY: -140, + x: 748, + y: 92, }, ] as const; @@ -3158,7 +3178,7 @@ function ClosingDemoScene() { > -
-

+
+ + Service Recap +
+

팀 찾기부터
- 완주까지 한 흐름으로 + 완주까지 +
한 흐름으로

- 사이드 프로젝트가 시작만 하고 멈추지 않도록 + 앞에서 본 기능들이 하나의 팀 여정으로 이어지고
- 팀의 다음 액션을 계속 앞으로 밀어줍니다. + 다음 액션이 계속 앞으로 움직입니다.

); } -function ClosingDashboardWindow({ +function ClosingRecapFlowWindow({ frame, fps, progress, @@ -3288,170 +3313,181 @@ function ClosingDashboardWindow({ fps: number; progress: number; }) { - const launch = motionProgress( + const line = motionProgress( frame, - seconds(4.2, fps), - seconds(1.2, fps), + seconds(1.18, fps), + seconds(2.15, fps), + EASE_IN_OUT, + ); + const summary = motionProgress( + frame, + seconds(3.52, fps), + seconds(0.78, fps), EASE_IN_OUT, ); + const flash = motionProgress(frame, seconds(4.18, fps), seconds(0.72, fps)); return (
-
-
- - - -
- team-po.app/finish +
+
+
+
+

+ one journey map +

+

+ 앞 장면의 기능들이 +
한 팀의 흐름으로 정렬됩니다 +

+
+
+ 팀 찾기 → 운영 → 진척 → 완주
-
-
-
-

- 프로젝트 완주 준비 완료 -

-

- 팀 생성부터 출시 루틴까지 하나의 워크플로우 -

-
-
- 팀 프로젝트 시작하기 -
-
+
+ -
-
-
-

- 완주 플로우 -

-

- ready -

-
-
- {closingFlow.map((item, index) => ( - - ))} -
-
+ {closingFlow.map((item, index) => ( + + ))} -
-

이번 팀

-

- MVP 런칭 스쿼드 -

-
- {[ - ["98%", "match"], - ["84%", "PR"], - ["72%", "tasks"], - ["D-3", "ship"], - ].map(([value, label], index) => { - const enter = motionProgress( - frame, - seconds(2.1 + index * 0.15, fps), - seconds(0.42, fps), - ); - - return ( -
-

- {value} -

-

- {label} -

-
- ); - })} -
-
-

- next action +

+
+
+

+ team-po summary

-

- 데모 배포 체크 +

+ 네 가지 기능이 하나의 다음 액션으로 연결됩니다

+
+ +
-
- -
-
-

- 다음 7일 루틴 -

-

- auto plan -

-
-
- {["역할 확정", "API 리뷰", "데모 배포", "회고 작성"].map( - (item, index) => { - const enter = motionProgress( - frame, - seconds(3.0 + index * 0.16, fps), - seconds(0.42, fps), - ); - - return ( -
-

- step {index + 1} -

-

- {item} -

-
- ); - }, - )} +
+ {closingFlow.map((item, index) => ( +
+ ))}
- -
+ +
); } -function ClosingFlowCard({ +function ClosingRecapCard({ frame, fps, index, @@ -3464,56 +3500,71 @@ function ClosingFlowCard({ }) { const enter = motionProgress( frame, - seconds(1.25 + index * 0.2, fps), - seconds(0.55, fps), + seconds(0.48 + index * 0.18, fps), + seconds(0.62, fps), + EASE_OUT, ); const active = motionProgress( frame, - seconds(2.65 + index * 0.24, fps), - seconds(0.45, fps), + seconds(1.58 + index * 0.42, fps), + seconds(0.44, fps), + EASE_IN_OUT, ); + const float = + Math.sin(frame / 17 + index) * interpolate(active, [0, 1], [5, 2]); return (
0.5 ? item.color : "#e2e8f0", opacity: enter, - transform: `translate3d(0, ${interpolate(enter, [0, 1], [24, 0])}px, 0) scale(${interpolate(active, [0, 1], [1, 1.025])})`, + transform: `translate3d(${interpolate(enter, [0, 1], [item.fromX, 0])}px, ${ + interpolate(enter, [0, 1], [item.fromY, 0]) + float + }px, 0) scale(${interpolate(enter, [0, 1], [0.78, 1]) * interpolate(active, [0, 0.55, 1], [1, 1.06, 1])})`, }} > -
+
- +

- {item.label} + 0{index + 1}

-

+

{item.label}

+

{item.title}

+

+ {item.detail} +

); } -function ClosingTouchPulse({ frame, fps }: { frame: number; fps: number }) { - const cardTap = motionProgress(frame, seconds(2.9, fps), seconds(0.55, fps)); - const launchTap = motionProgress( - frame, - seconds(4.25, fps), - seconds(0.6, fps), - ); +function ClosingRecapIcon({ id }: { id: (typeof closingFlow)[number]["id"] }) { + if (id === "matching") { + return ; + } - return ( - <> - - - - ); + if (id === "workspace") { + return ; + } + + if (id === "report") { + return ; + } + + return ; } function FinaleLogoScene() { From acf6e49f99604e50fe5c0b4179fe31a1450f8f86 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 19:37:39 +0900 Subject: [PATCH 10/19] fix(pr-video): lower closing recap summary --- src/features/pr-video/components/team-po-pr-video.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index a9490a7..d5bb2c2 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -3363,11 +3363,11 @@ function ClosingRecapFlowWindow({
-
+
+
+
); } -function ClosingBrandPanel({ - frame, - fps, - progress, -}: { - frame: number; - fps: number; - progress: number; -}) { - const po = motionProgress(frame, seconds(0.9, fps), seconds(0.48, fps)); - const underline = motionProgress( - frame, - seconds(1.45, fps), - seconds(0.8, fps), - EASE_IN_OUT, - ); +function KineticRecapBrand({ frame, fps }: { frame: number; fps: number }) { + const brand = motionProgress(frame, seconds(0.22, fps), seconds(0.68, fps)); + const po = motionProgress(frame, seconds(0.66, fps), seconds(0.42, fps)); return (
-
- +
+ Team + - - - - - -
- Team - - -po - -
-
-
- - Service Recap -
-

- 팀 찾기부터 -
- - 완주까지 - + -po -
한 흐름으로 -

-

- 앞에서 본 기능들이 하나의 팀 여정으로 이어지고 -
- 다음 액션이 계속 앞으로 움직입니다. -

+
); } -function ClosingRecapFlowWindow({ - frame, - fps, - progress, -}: { - frame: number; - fps: number; - progress: number; -}) { - const line = motionProgress( +function KineticRecapHeadline({ frame, fps }: { frame: number; fps: number }) { + const label = motionProgress(frame, seconds(1.35, fps), seconds(0.45, fps)); + const lineOne = motionProgress(frame, seconds(1.62, fps), seconds(0.58, fps)); + const lineTwo = motionProgress(frame, seconds(1.95, fps), seconds(0.58, fps)); + const lineThree = motionProgress( + frame, + seconds(2.32, fps), + seconds(0.58, fps), + ); + const lock = motionProgress( frame, - seconds(1.18, fps), - seconds(2.15, fps), + seconds(3.36, fps), + seconds(0.82, fps), EASE_IN_OUT, ); - const summary = motionProgress( + const underline = motionProgress( frame, - seconds(3.52, fps), + seconds(3.58, fps), seconds(0.78, fps), EASE_IN_OUT, ); - const flash = motionProgress(frame, seconds(4.18, fps), seconds(0.72, fps)); return (
-
-
+ + Kinetic Service Recap +
+

+ -
-
-

- one journey map -

-

- 앞 장면의 기능들이 -
한 팀의 흐름으로 정렬됩니다 -

-
-
- 팀 찾기 → 운영 → 진척 → 완주 -
-
- -
- + > + 팀 찾기부터 + + + 완주까지 + + + 한 흐름으로 + + +

+

+ 흩어진 기능 설명이 아니라, 팀의 다음 액션이 앞으로 밀리는 하나의 + 여정입니다. +

+
+ ); +} - {closingFlow.map((item, index) => ( - - ))} +function KineticRecapRibbon({ frame, fps }: { frame: number; fps: number }) { + const draw = motionProgress( + frame, + seconds(0.9, fps), + seconds(2.5, fps), + EASE_IN_OUT, + ); + const surge = motionProgress(frame, seconds(3.1, fps), seconds(1.1, fps)); + const dash = (frame % seconds(2.1, fps)) / seconds(2.1, fps); -
-
-
-

- team-po summary -

-

- 네 가지 기능이 하나의 다음 액션으로 연결됩니다 -

-
-
- -
-
-
- {closingFlow.map((item, index) => ( -
- ))} -
-
-
+ return ( + + ); +} -
+ {closingFlow.map((item, index) => ( + -
-
+ ))} + ); } -function ClosingRecapCard({ +function KineticFeatureToken({ frame, fps, index, @@ -3498,73 +3462,89 @@ function ClosingRecapCard({ index: number; item: (typeof closingFlow)[number]; }) { + const targets = [ + { x: 190, y: 782, fromX: -420, fromY: 150, rotate: -18 }, + { x: 612, y: 850, fromX: -160, fromY: 360, rotate: 12 }, + { x: 1110, y: 736, fromX: 280, fromY: 320, rotate: -10 }, + { x: 1510, y: 602, fromX: 460, fromY: -170, rotate: 16 }, + ] as const; + const target = targets[index] ?? targets[0]; const enter = motionProgress( frame, - seconds(0.48 + index * 0.18, fps), - seconds(0.62, fps), + seconds(0.52 + index * 0.22, fps), + seconds(0.72, fps), EASE_OUT, ); - const active = motionProgress( + const lock = motionProgress( frame, - seconds(1.58 + index * 0.42, fps), - seconds(0.44, fps), + seconds(2.55 + index * 0.18, fps), + seconds(0.58, fps), + EASE_IN_OUT, + ); + const pulse = motionProgress( + frame, + seconds(3.48 + index * 0.08, fps), + seconds(0.72, fps), EASE_IN_OUT, ); const float = - Math.sin(frame / 17 + index) * interpolate(active, [0, 1], [5, 2]); + Math.sin(frame / 13 + index * 1.8) * interpolate(lock, [0, 1], [20, 4]); return (
0.5 ? item.color : "#e2e8f0", + borderColor: item.color, + left: target.x, + top: target.y, opacity: enter, - transform: `translate3d(${interpolate(enter, [0, 1], [item.fromX, 0])}px, ${ - interpolate(enter, [0, 1], [item.fromY, 0]) + float - }px, 0) scale(${interpolate(enter, [0, 1], [0.78, 1]) * interpolate(active, [0, 0.55, 1], [1, 1.06, 1])})`, + transform: `translate3d(${interpolate(enter, [0, 1], [target.fromX, 0])}px, ${ + interpolate(enter, [0, 1], [target.fromY, 0]) + float + }px, 0) rotate(${interpolate(enter, [0, 1], [target.rotate, 0])}deg) scale(${ + interpolate(enter, [0, 1], [0.68, 1]) * + interpolate(pulse, [0, 0.48, 1], [1, 1.08, 1]) + })`, }} > -
-
- -
+
+ +
+

0{index + 1}

+

+ {item.label} +

-

{item.label}

-

- {item.title} -

-

- {item.detail} -

); } -function ClosingRecapIcon({ id }: { id: (typeof closingFlow)[number]["id"] }) { +function KineticFeatureIcon({ + id, +}: { + id: (typeof closingFlow)[number]["id"]; +}) { if (id === "matching") { - return ; + return ; } if (id === "workspace") { - return ; + return ; } if (id === "report") { - return ; + return ; } - return ; + return ; } function FinaleLogoScene() { From 6348bc3a2a3f256d06ece051faab982f35be014f Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 19:50:03 +0900 Subject: [PATCH 12/19] fix(pr-video): replace closing text pulse with sweep --- .../pr-video/components/team-po-pr-video.tsx | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 116cdcd..23e053c 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -3307,12 +3307,7 @@ function KineticRecapHeadline({ frame, fps }: { frame: number; fps: number }) { ); return ( -
+
+ Date: Thu, 11 Jun 2026 19:56:49 +0900 Subject: [PATCH 13/19] feat(pr-video): add headline shine emphasis --- .../pr-video/components/team-po-pr-video.tsx | 100 ++++++++++++------ 1 file changed, 65 insertions(+), 35 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 23e053c..49c3e76 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -3305,6 +3305,25 @@ function KineticRecapHeadline({ frame, fps }: { frame: number; fps: number }) { seconds(0.78, fps), EASE_IN_OUT, ); + const shine = motionProgress( + frame, + seconds(3.18, fps), + seconds(0.86, fps), + EASE_IN_OUT, + ); + const shineStyle: CSSProperties = { + backgroundClip: "text", + backgroundImage: + "linear-gradient(112deg, transparent 0%, transparent 44%, rgba(219,234,254,0.18) 48%, rgba(255,255,255,0.88) 50%, rgba(96,165,250,0.42) 52%, transparent 57%, transparent 100%)", + backgroundPosition: `${interpolate(shine, [0, 1], [-172, 190])}% 50%`, + backgroundRepeat: "no-repeat", + backgroundSize: "340% 100%", + color: "transparent", + filter: `drop-shadow(0 0 ${interpolate(shine, [0, 0.52, 1], [0, 11, 0])}px rgba(96, 165, 250, 0.22))`, + opacity: interpolate(shine, [0, 0.14, 0.78, 1], [0, 0.68, 0.5, 0]), + WebkitBackgroundClip: "text", + WebkitTextFillColor: "transparent", + }; return (
@@ -3318,39 +3337,50 @@ function KineticRecapHeadline({ frame, fps }: { frame: number; fps: number }) { Kinetic Service Recap
-

- - 팀 찾기부터 - - - 완주까지 - - - 한 흐름으로 +
+

- -

+ className="block" + style={{ + opacity: lineOne, + transform: `translate3d(${interpolate(lineOne, [0, 1], [-54, 0])}px, 0, 0)`, + }} + > + 팀 찾기부터 + + + 완주까지 + + + 한 흐름으로 + + +

+ +

Date: Thu, 11 Jun 2026 20:05:34 +0900 Subject: [PATCH 14/19] fix(pr-video): polish copy and workspace progress --- .../pr-video/components/team-po-pr-video.tsx | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 49c3e76..5fcefa3 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -281,7 +281,7 @@ const workspaceTasks = [ }, { id: "release", - title: "릴리즈 체크리스트 생성", + title: "배포 체크리스트", meta: "Team", color: "#f59e0b", column: "shipping", @@ -863,7 +863,7 @@ function WorkspaceCard({ frame, fps }: { frame: number; fps: number }) { frame={frame} fps={fps} index={2} - label="릴리즈 체크리스트 생성" + label="배포 체크리스트" />

@@ -1775,10 +1775,10 @@ function MatchingNarrativePanel({ Solution 01

- 프로필 신호로 + 매칭으로
- 팀을 빠르게 묶어요 + 팀을 바로 시작해요

- 관심사, 역할, 가능한 속도를 한 화면에서 맞춰 보고 + 역할, 목표, 진행 속도를 한 화면에서 맞춰 보고
- 시작 가능한 조합만 선명하게 보여줍니다. + 함께 시작할 팀을 빠르게 찾습니다.

{matchingSignals.map((signal, index) => { @@ -2453,7 +2453,7 @@ function WorkspaceStageRail({ fps: number; progress: number; }) { - const progressWidth = interpolate(progress, [0, 1], [12, 64]); + const progressWidth = interpolate(progress, [0, 1], [12, 96]); return (
@@ -2623,7 +2623,7 @@ function WorkspaceChecklist({ frame, fps }: { frame: number; fps: number }) {

다음 액션

- 릴리즈 체크리스트 생성 + 배포 체크리스트 만들기

@@ -3367,7 +3367,7 @@ function KineticRecapHeadline({ frame, fps }: { frame: number; fps: number }) { 한 흐름으로 @@ -3388,8 +3388,7 @@ function KineticRecapHeadline({ frame, fps }: { frame: number; fps: number }) { transform: `translate3d(0, ${interpolate(lock, [0, 1], [22, 0])}px, 0)`, }} > - 흩어진 기능 설명이 아니라, 팀의 다음 액션이 앞으로 밀리는 하나의 - 여정입니다. + 매칭 후 바로 팀 스페이스에서 작업하고, 진척을 보며 완주까지 이어갑니다.

); From 6bf00cb4e129b0f6a767fa3ae57924aa6b5726c5 Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 20:20:14 +0900 Subject: [PATCH 15/19] feat(pr-video): refine recap flow animation --- .../pr-video/components/team-po-pr-video.tsx | 129 ++++++++++++------ 1 file changed, 84 insertions(+), 45 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 5fcefa3..9aa00f7 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -1760,7 +1760,6 @@ function MatchingNarrativePanel({ seconds(0.7, fps), EASE_IN_OUT, ); - const chips = motionProgress(frame, seconds(1.65, fps), seconds(0.9, fps)); return (
함께 시작할 팀을 빠르게 찾습니다.

-
- {matchingSignals.map((signal, index) => { - const item = Math.max(0, Math.min(1, chips - index * 0.18)); - - return ( -
-
- -

- {signal.label} -

-
-

- {signal.value} -

-
- ); - })} -
); } @@ -3395,6 +3365,8 @@ function KineticRecapHeadline({ frame, fps }: { frame: number; fps: number }) { } function KineticRecapRibbon({ frame, fps }: { frame: number; fps: number }) { + const flowPath = + "M-120 824 C250 640 516 884 786 712 C1048 545 1212 690 1464 542 C1638 440 1776 428 2060 544"; const draw = motionProgress( frame, seconds(0.9, fps), @@ -3407,6 +3379,13 @@ function KineticRecapRibbon({ frame, fps }: { frame: number; fps: number }) { seconds(1.05, fps), EASE_IN_OUT, ); + const comet = motionProgress( + frame, + seconds(4.72, fps), + seconds(2.1, fps), + EASE_IN_OUT, + ); + const cometOpacity = interpolate(comet, [0, 0.06, 0.9, 1], [0, 1, 0.88, 0]); const dash = (frame % seconds(2.1, fps)) / seconds(2.1, fps); return ( @@ -3422,9 +3401,24 @@ function KineticRecapRibbon({ frame, fps }: { frame: number; fps: number }) { + + + + + + + + + - + ); @@ -3528,6 +3540,13 @@ function KineticFeatureToken({ seconds(0.72, fps), EASE_IN_OUT, ); + const ignition = motionProgress( + frame, + seconds(4.82 + index * 0.48, fps), + seconds(0.76, fps), + EASE_OUT, + ); + const ignitionGlow = interpolate(ignition, [0, 0.32, 1], [0, 1, 0]); const float = Math.sin(frame / 13 + index * 1.8) * interpolate(lock, [0, 1], [20, 4]); @@ -3539,21 +3558,41 @@ function KineticFeatureToken({ left: target.x, top: target.y, opacity: enter, + boxShadow: `0 20px 64px rgba(15,23,42,0.14), 0 0 ${interpolate(ignitionGlow, [0, 1], [0, 42])}px ${item.color}55`, transform: `translate3d(${interpolate(enter, [0, 1], [target.fromX, 0])}px, ${ interpolate(enter, [0, 1], [target.fromY, 0]) + float }px, 0) rotate(${interpolate(enter, [0, 1], [target.rotate, 0])}deg) scale(${ interpolate(enter, [0, 1], [0.68, 1]) * - interpolate(pulse, [0, 0.48, 1], [1, 1.08, 1]) + interpolate(pulse, [0, 0.48, 1], [1, 1.08, 1]) * + interpolate(ignition, [0, 0.32, 1], [1, 1.045, 1]) })`, }} > @@ -1877,10 +1896,10 @@ function MatchingOrbitBoard({

- 매칭 조건 + 매칭 요청

- 입력한 프로필 기준 + 역할과 프로젝트 정보

@@ -1920,29 +1939,21 @@ function MatchingOrbitBoard({ ); })}
-
-

- AI 추천 기준 -

-

- 역할 균형과 진행 가능성을 함께 계산 -

-

- 추천 후보 + 매칭 세션

- 이번 주 바로 시작 가능한 프로필 + 팀원 역할과 응답 상태를 확인해요

- - React, Spring, PM + + BACKEND · FRONTEND · DESIGN
@@ -1999,10 +2010,12 @@ function MatchingDemoCard({ seconds(0.45, fps), EASE_IN_OUT, ); + const isAccepted = profile.status === "수락됨"; + const responseWidth = isAccepted ? 100 : 58; return (
0.55 ? profile.color : "#e2e8f0", backgroundColor: selected > 0.55 ? "#f8fffc" : "#ffffff", @@ -2031,35 +2044,34 @@ function MatchingDemoCard({
0.55 ? profile.color : "#e2e8f0", - backgroundColor: selected > 0.55 ? profile.color : "#ffffff", + borderColor: + selected > 0.55 ? `${profile.statusColor}55` : "#e2e8f0", + backgroundColor: + selected > 0.55 ? `${profile.statusColor}12` : "#ffffff", + color: selected > 0.55 ? profile.statusColor : "#94a3b8", }} > - + {profile.status}
-

signal

+

응답 흐름

- {Math.round(profile.score * enter)}% + {isAccepted ? "수락 완료" : "대기 중"}

@@ -2107,10 +2119,6 @@ function MatchingProfileIcon({ return ; } - if (icon === "layers") { - return ; - } - return ; } @@ -2146,18 +2154,18 @@ function RecommendedTeamPanel({

- MVP 런칭 스쿼드 추천 + 매칭 세션이 생성됐어요

- 목표, 속도, 역할 균형이 맞는 조합입니다. + 팀원들이 수락하면 팀 스페이스로 이어집니다.

-
- {["FE", "BE", "PM"].map((role, index) => ( +
+ {matchedRoleSlots.map((role, index) => (
- {role} + {role.label}
))}
@@ -2177,12 +2185,12 @@ function RecommendedTeamPanel({ boxShadow: `0 0 ${interpolate(spark, [0, 1], [0, 28])}px rgba(52,211,153,0.45)`, }} > -

match score

+

응답 상태

- 98% + 2/4

- 바로 팀 스페이스 생성 가능 + 호스트 포함 2명 수락

From 47f6c1225628057f280343eac17357d8ecfae59e Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 20:51:59 +0900 Subject: [PATCH 18/19] fix(pr-video): polish demo copy --- .../pr-video/components/team-po-pr-video.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index cd71da9..1e5a578 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -1856,7 +1856,7 @@ function MatchingOrbitBoard({
- team-po.app/matching + team-po.cloud/matching
@@ -2058,7 +2058,7 @@ function MatchingDemoCard({
-

응답 흐름

+

응답 상태

- team-po.app/team-space + team-po.cloud/team-space
@@ -2841,7 +2841,7 @@ function ReportDemoWindow({
- team-po.app/report + team-po.cloud/report
@@ -3102,10 +3102,10 @@ function ReportInsightPanel({ progress }: { progress: number }) {

- 이번 주 병목은 API 응답 지연 + 이번 주 병목은 API 응답 지연 PR

- 배포 체크리스트 전에 API 이슈를 먼저 닫는 것을 추천합니다. + 배포 체크리스트보다 API 응답 지연 PR을 먼저 마무리해요.

From c0ff39cdd2ad59809eea5dfef173fb9b4ac9cdcc Mon Sep 17 00:00:00 2001 From: hwnagjokim Date: Thu, 11 Jun 2026 21:15:02 +0900 Subject: [PATCH 19/19] fix(pr-video): emphasize completion problem headline --- src/features/pr-video/components/team-po-pr-video.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/pr-video/components/team-po-pr-video.tsx b/src/features/pr-video/components/team-po-pr-video.tsx index 1e5a578..3b2b109 100644 --- a/src/features/pr-video/components/team-po-pr-video.tsx +++ b/src/features/pr-video/components/team-po-pr-video.tsx @@ -1239,7 +1239,7 @@ function ProblemScene() {
시작보다
- 완주가 어렵습니다 + 완주가 어렵습니다

팀원 찾기, 역할 조율, 진행 공유가 이어지지 않으면 프로젝트의 흐름이