diff --git a/bun.lock b/bun.lock
index 872777f..d1ce13e 100644
--- a/bun.lock
+++ b/bun.lock
@@ -7,74 +7,74 @@
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
- "@hookform/resolvers": "^5.1.1",
- "@mdxeditor/editor": "^3.39.1",
- "@prisma/client": "^6.11.1",
- "@radix-ui/react-accordion": "^1.2.11",
- "@radix-ui/react-alert-dialog": "^1.1.14",
- "@radix-ui/react-aspect-ratio": "^1.1.7",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-checkbox": "^1.3.2",
- "@radix-ui/react-collapsible": "^1.1.11",
- "@radix-ui/react-context-menu": "^2.2.15",
- "@radix-ui/react-dialog": "^1.1.14",
- "@radix-ui/react-dropdown-menu": "^2.1.15",
- "@radix-ui/react-hover-card": "^1.1.14",
- "@radix-ui/react-label": "^2.1.7",
- "@radix-ui/react-menubar": "^1.1.15",
- "@radix-ui/react-navigation-menu": "^1.2.13",
- "@radix-ui/react-popover": "^1.1.14",
- "@radix-ui/react-progress": "^1.1.7",
- "@radix-ui/react-radio-group": "^1.3.7",
- "@radix-ui/react-scroll-area": "^1.2.9",
- "@radix-ui/react-select": "^2.2.5",
- "@radix-ui/react-separator": "^1.1.7",
- "@radix-ui/react-slider": "^1.3.5",
- "@radix-ui/react-slot": "^1.2.3",
- "@radix-ui/react-switch": "^1.2.5",
- "@radix-ui/react-tabs": "^1.1.12",
- "@radix-ui/react-toast": "^1.2.14",
- "@radix-ui/react-toggle": "^1.1.9",
- "@radix-ui/react-toggle-group": "^1.1.10",
- "@radix-ui/react-tooltip": "^1.2.7",
+ "@hookform/resolvers": "^5.4.0",
+ "@mdxeditor/editor": "^4.0.1",
+ "@prisma/client": "^7.8.0",
+ "@radix-ui/react-accordion": "^1.2.12",
+ "@radix-ui/react-alert-dialog": "^1.1.15",
+ "@radix-ui/react-aspect-ratio": "^1.1.8",
+ "@radix-ui/react-avatar": "^1.1.11",
+ "@radix-ui/react-checkbox": "^1.3.3",
+ "@radix-ui/react-collapsible": "^1.1.12",
+ "@radix-ui/react-context-menu": "^2.2.16",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@radix-ui/react-hover-card": "^1.1.15",
+ "@radix-ui/react-label": "^2.1.8",
+ "@radix-ui/react-menubar": "^1.1.16",
+ "@radix-ui/react-navigation-menu": "^1.2.14",
+ "@radix-ui/react-popover": "^1.1.15",
+ "@radix-ui/react-progress": "^1.1.8",
+ "@radix-ui/react-radio-group": "^1.3.8",
+ "@radix-ui/react-scroll-area": "^1.2.10",
+ "@radix-ui/react-select": "^2.2.6",
+ "@radix-ui/react-separator": "^1.1.8",
+ "@radix-ui/react-slider": "^1.3.6",
+ "@radix-ui/react-slot": "^1.2.4",
+ "@radix-ui/react-switch": "^1.2.6",
+ "@radix-ui/react-tabs": "^1.1.13",
+ "@radix-ui/react-toast": "^1.2.15",
+ "@radix-ui/react-toggle": "^1.1.10",
+ "@radix-ui/react-toggle-group": "^1.1.11",
+ "@radix-ui/react-tooltip": "^1.2.8",
"@react-three/drei": "^10.7.7",
"@react-three/fiber": "^9.6.1",
- "@reactuses/core": "^6.0.5",
- "@tanstack/react-query": "^5.82.0",
+ "@reactuses/core": "^6.3.2",
+ "@tanstack/react-query": "^5.100.14",
"@tanstack/react-table": "^8.21.3",
"@types/three": "^0.184.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
- "date-fns": "^4.1.0",
+ "date-fns": "^4.4.0",
"embla-carousel-react": "^8.6.0",
"framer-motion": "^12.40.0",
"input-otp": "^1.4.2",
"lottie-web": "^5.13.0",
"lucide-react": "^1.17.0",
- "next": "^16.1.1",
- "next-auth": "^4.24.11",
- "next-intl": "^4.3.4",
+ "next": "^16.2.7",
+ "next-auth": "^4.24.14",
+ "next-intl": "^4.13.0",
"next-themes": "^0.4.6",
- "prisma": "^6.11.1",
- "react": "^19.0.0",
- "react-day-picker": "^9.8.0",
- "react-dom": "^19.0.0",
- "react-hook-form": "^7.60.0",
+ "prisma": "^7.8.0",
+ "react": "^19.2.7",
+ "react-day-picker": "^10.0.1",
+ "react-dom": "^19.2.7",
+ "react-hook-form": "^7.77.0",
"react-markdown": "^10.1.0",
- "react-resizable-panels": "^3.0.3",
- "react-syntax-highlighter": "^15.6.1",
- "recharts": "^2.15.4",
- "sharp": "^0.34.3",
- "sonner": "^2.0.6",
- "tailwind-merge": "^3.3.1",
+ "react-resizable-panels": "^4.11.2",
+ "react-syntax-highlighter": "^16.1.1",
+ "recharts": "^3.8.1",
+ "sharp": "^0.34.5",
+ "sonner": "^2.0.7",
+ "tailwind-merge": "^3.6.0",
"tailwindcss-animate": "^1.0.7",
"three": "^0.184.0",
- "uuid": "^11.1.0",
+ "uuid": "^14.0.0",
"vaul": "^1.1.2",
- "z-ai-web-dev-sdk": "^0.0.16",
- "zod": "^4.0.2",
- "zustand": "^5.0.6",
+ "z-ai-web-dev-sdk": "^0.0.18",
+ "zod": "^4.4.3",
+ "zustand": "^5.0.14",
},
"devDependencies": {
"@playwright/browser-chromium": "^1.60.0",
@@ -82,12 +82,12 @@
"@tailwindcss/postcss": "^4",
"@types/react": "^19",
"@types/react-dom": "^19",
- "bun-types": "^1.3.4",
- "eslint": "^9",
- "eslint-config-next": "^16.1.1",
+ "bun-types": "^1.3.14",
+ "eslint": "^10",
+ "eslint-config-next": "^16.2.7",
"tailwindcss": "^4",
- "tw-animate-css": "^1.3.5",
- "typescript": "^5",
+ "tw-animate-css": "^1.4.0",
+ "typescript": "^6",
},
},
},
@@ -190,12 +190,6 @@
"@codemirror/view": ["@codemirror/view@6.39.11", "", { "dependencies": { "@codemirror/state": "^6.5.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-bWdeR8gWM87l4DB/kYSF9A+dVackzDb/V56Tq7QVrQ7rn86W0rgZFtlL3g3pem6AeGcb9NQNoy3ao4WpW4h5tQ=="],
- "@codesandbox/nodebox": ["@codesandbox/nodebox@0.1.8", "", { "dependencies": { "outvariant": "^1.4.0", "strict-event-emitter": "^0.4.3" } }, "sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg=="],
-
- "@codesandbox/sandpack-client": ["@codesandbox/sandpack-client@2.19.8", "", { "dependencies": { "@codesandbox/nodebox": "0.1.8", "buffer": "^6.0.3", "dequal": "^2.0.2", "mime-db": "^1.52.0", "outvariant": "1.4.0", "static-browser-server": "1.0.3" } }, "sha512-CMV4nr1zgKzVpx4I3FYvGRM5YT0VaQhALMW9vy4wZRhEyWAtJITQIqZzrTGWqB1JvV7V72dVEUCUPLfYz5hgJQ=="],
-
- "@codesandbox/sandpack-react": ["@codesandbox/sandpack-react@2.20.0", "", { "dependencies": { "@codemirror/autocomplete": "^6.4.0", "@codemirror/commands": "^6.1.3", "@codemirror/lang-css": "^6.0.1", "@codemirror/lang-html": "^6.4.0", "@codemirror/lang-javascript": "^6.1.2", "@codemirror/language": "^6.3.2", "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.7.1", "@codesandbox/sandpack-client": "^2.19.8", "@lezer/highlight": "^1.1.3", "@react-hook/intersection-observer": "^3.1.1", "@stitches/core": "^1.2.6", "anser": "^2.1.1", "clean-set": "^1.1.2", "dequal": "^2.0.2", "escape-carriage": "^1.3.1", "lz-string": "^1.4.4", "react-devtools-inline": "4.4.0", "react-is": "^17.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19", "react-dom": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-takd1YpW/PMQ6KPQfvseWLHWklJovGY8QYj8MtWnskGKbjOGJ6uZfyZbcJ6aCFLQMpNyjTqz9AKNbvhCOZ1TUQ=="],
-
"@date-fns/tz": ["@date-fns/tz@1.4.1", "", {}, "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA=="],
"@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="],
@@ -208,6 +202,12 @@
"@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="],
+ "@electric-sql/pglite": ["@electric-sql/pglite@0.4.1", "", {}, "sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q=="],
+
+ "@electric-sql/pglite-socket": ["@electric-sql/pglite-socket@0.1.1", "", { "peerDependencies": { "@electric-sql/pglite": "0.4.1" }, "bin": { "pglite-server": "dist/scripts/server.js" } }, "sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw=="],
+
+ "@electric-sql/pglite-tools": ["@electric-sql/pglite-tools@0.3.1", "", { "peerDependencies": { "@electric-sql/pglite": "0.4.1" } }, "sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA=="],
+
"@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
"@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
@@ -218,19 +218,15 @@
"@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
- "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="],
-
- "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="],
-
- "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="],
+ "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="],
- "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="],
+ "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="],
- "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="],
+ "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="],
- "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
+ "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="],
- "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="],
"@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="],
@@ -242,17 +238,17 @@
"@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="],
- "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.6", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.2", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw=="],
+ "@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.5", "", {}, "sha512-KLi3fan6WnCHmigd9pmEEN8Hid0v4wiFBW576M/d07KMWYecf1CvyMI3n34vCmHT4AoVqG2n702kiHbXjzZX2A=="],
- "@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.7", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ=="],
+ "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@3.5.10", "", { "dependencies": { "@formatjs/icu-skeleton-parser": "2.1.9" } }, "sha512-XeJihYLy1lCe19xfK1KWKG/betBOK2rB0luL8lSkjfvJj0zP+LTJvkC+RKd0jsFI8mWxN71LrarHSrEXE8xxOQ=="],
- "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.4", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/icu-skeleton-parser": "1.8.16", "tslib": "^2.8.0" } }, "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw=="],
+ "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@2.1.9", "", {}, "sha512-rsxswgHMfU1zUgB2byc08fesf83wLGjFnzLCEtuf00mx2doiqc6pYrf67raI37XqdRcGUviQepk2UKGqpng74Q=="],
- "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.16", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "tslib": "^2.8.0" } }, "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ=="],
+ "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.8.9", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.5" } }, "sha512-GmB0F/gYh4Hdl4rLWjgDsgT+x4pB54fkJeRh8kAZ4XFzKeCK8dGs+SBJWXO42QZtOUni+IDWKNuCw6wiL4lTvw=="],
- "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.5.10", "", { "dependencies": { "tslib": "2" } }, "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q=="],
+ "@hono/node-server": ["@hono/node-server@1.19.11", "", { "peerDependencies": { "hono": "^4" } }, "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g=="],
- "@hookform/resolvers": ["@hookform/resolvers@5.2.2", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA=="],
+ "@hookform/resolvers": ["@hookform/resolvers@5.4.0", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-EIsqr/t/qbinPIhGjMdtvutIN1Kk4uwbROE9/UQ93CAVGR7GkA7Y92+fX80OzXi/OB67jVFYwKGO1WzkxmkFZw=="],
"@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
@@ -322,6 +318,8 @@
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+ "@kurkle/color": ["@kurkle/color@0.3.4", "", {}, "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="],
+
"@lexical/clipboard": ["@lexical/clipboard@0.35.0", "", { "dependencies": { "@lexical/html": "0.35.0", "@lexical/list": "0.35.0", "@lexical/selection": "0.35.0", "@lexical/utils": "0.35.0", "lexical": "0.35.0" } }, "sha512-ko7xSIIiayvDiqjNDX6fgH9RlcM6r9vrrvJYTcfGVBor5httx16lhIi0QJZ4+RNPvGtTjyFv4bwRmsixRRwImg=="],
"@lexical/code": ["@lexical/code@0.35.0", "", { "dependencies": { "@lexical/utils": "0.35.0", "lexical": "0.35.0", "prismjs": "^1.30.0" } }, "sha512-ox4DZwETQ9IA7+DS6PN8RJNwSAF7RMjL7YTVODIqFZ5tUFIf+5xoCHbz7Fll0Bvixlp12hVH90xnLwTLRGpkKw=="],
@@ -400,7 +398,7 @@
"@marijn/find-cluster-break": ["@marijn/find-cluster-break@1.0.2", "", {}, "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g=="],
- "@mdxeditor/editor": ["@mdxeditor/editor@3.52.3", "", { "dependencies": { "@codemirror/commands": "^6.2.4", "@codemirror/lang-markdown": "^6.2.3", "@codemirror/language-data": "^6.5.1", "@codemirror/merge": "^6.4.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.23.0", "@codesandbox/sandpack-react": "^2.20.0", "@lexical/clipboard": "^0.35.0", "@lexical/link": "^0.35.0", "@lexical/list": "^0.35.0", "@lexical/markdown": "^0.35.0", "@lexical/plain-text": "^0.35.0", "@lexical/react": "^0.35.0", "@lexical/rich-text": "^0.35.0", "@lexical/selection": "^0.35.0", "@lexical/utils": "^0.35.0", "@mdxeditor/gurx": "^1.2.4", "@radix-ui/colors": "^3.0.0", "@radix-ui/react-dialog": "^1.1.11", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-popover": "^1.1.11", "@radix-ui/react-popper": "^1.2.4", "@radix-ui/react-select": "^2.2.2", "@radix-ui/react-toggle-group": "^1.1.7", "@radix-ui/react-toolbar": "^1.1.7", "@radix-ui/react-tooltip": "^1.2.4", "classnames": "^2.3.2", "cm6-theme-basic-light": "^0.2.0", "codemirror": "^6.0.1", "downshift": "^7.6.0", "js-yaml": "4.1.1", "lexical": "^0.35.0", "mdast-util-directive": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-frontmatter": "^2.0.1", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-highlight-mark": "^1.2.2", "mdast-util-mdx": "^3.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-to-markdown": "^2.1.0", "micromark-extension-directive": "^3.0.0", "micromark-extension-frontmatter": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.1", "micromark-extension-highlight-mark": "^1.2.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs": "^3.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.1", "micromark-util-symbol": "^2.0.0", "react-hook-form": "^7.56.1", "unidiff": "^1.0.2" }, "peerDependencies": { "react": ">= 18 || >= 19", "react-dom": ">= 18 || >= 19" } }, "sha512-hKPsNPx7cjxXPeiir0LjU2ZN5bWn7dWVxV8CaCddLztGc36e921ETNpu1AXo0+K7pxc7eBt/ExSw0WDOOk2Ibw=="],
+ "@mdxeditor/editor": ["@mdxeditor/editor@4.0.1", "", { "dependencies": { "@codemirror/commands": "^6.2.4", "@codemirror/lang-markdown": "^6.2.3", "@codemirror/language-data": "^6.5.1", "@codemirror/merge": "^6.4.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.23.0", "@lexical/clipboard": "^0.35.0", "@lexical/link": "^0.35.0", "@lexical/list": "^0.35.0", "@lexical/markdown": "^0.35.0", "@lexical/plain-text": "^0.35.0", "@lexical/react": "^0.35.0", "@lexical/rich-text": "^0.35.0", "@lexical/selection": "^0.35.0", "@lexical/utils": "^0.35.0", "@mdxeditor/gurx": "^1.2.4", "@radix-ui/colors": "^3.0.0", "@radix-ui/react-dialog": "^1.1.11", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-popover": "^1.1.11", "@radix-ui/react-popper": "^1.2.4", "@radix-ui/react-select": "^2.2.2", "@radix-ui/react-toggle-group": "^1.1.7", "@radix-ui/react-toolbar": "^1.1.7", "@radix-ui/react-tooltip": "^1.2.4", "classnames": "^2.3.2", "cm6-theme-basic-light": "^0.2.0", "codemirror": "^6.0.1", "downshift": "^7.6.0", "js-yaml": "4.1.1", "lexical": "^0.35.0", "mdast-util-directive": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-frontmatter": "^2.0.1", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-highlight-mark": "^1.2.2", "mdast-util-mdx": "^3.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-to-markdown": "^2.1.0", "micromark-extension-directive": "^3.0.0", "micromark-extension-frontmatter": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.1", "micromark-extension-highlight-mark": "^1.2.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs": "^3.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.1", "micromark-util-symbol": "^2.0.0", "react-hook-form": "^7.56.1", "unidiff": "^1.0.2" }, "peerDependencies": { "react": ">= 18 || >= 19", "react-dom": ">= 18 || >= 19" } }, "sha512-5CKZAIqrXLNjR+Vwi0IL6ihlFxIO9mhfWoQt9eGEwAgrVITbQ18MC7gPPYylen+jylSedTCjpk7bdnKz7HYqWQ=="],
"@mdxeditor/gurx": ["@mdxeditor/gurx@1.2.4", "", { "peerDependencies": { "react": ">= 18 || >= 19", "react-dom": ">= 18 || >= 19" } }, "sha512-9ZykIFYhKaXaaSPCs1cuI+FvYDegJjbKwmA4ASE/zY+hJY6EYqvoye4esiO85CjhOw9aoD/izD/CU78/egVqmg=="],
@@ -412,25 +410,25 @@
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
- "@next/env": ["@next/env@16.1.3", "", {}, "sha512-BLP14oBOvZWXgfdJf9ao+VD8O30uE+x7PaV++QtACLX329WcRSJRO5YJ+Bcvu0Q+c/lei41TjSiFf6pXqnpbQA=="],
+ "@next/env": ["@next/env@16.2.7", "", {}, "sha512-tMJizPlj6ZYpBMMdK8S0LJufrP4QTdR6pcv9KQ/bVETPAmg0j1mlHE9G2c38UyGHxoBapgwuj7XjbGJ2RcDFOg=="],
- "@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.1.3", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-MqBh3ltFAy0AZCRFVdjVjjeV7nEszJDaVIpDAnkQcn8U9ib6OEwkSnuK6xdYxMGPhV/Y4IlY6RbDipPOpLfBqQ=="],
+ "@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.2.7", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-VbS+QgMHqvIDMTIqD2xMBKK1otIpdAUKA8VLHFwR9h6OfU/mOm7w/69nQcvdmI8hCk99Wr2AsGLn/PJ/tMHw1w=="],
- "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.1.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CpOD3lmig6VflihVoGxiR/l5Jkjfi4uLaOR4ziriMv0YMDoF6cclI+p5t2nstM8TmaFiY6PCTBgRWB57/+LiBA=="],
+ "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.2.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-vm1EDI/pVaBNNiychmxk3fft+OhQPVD9cIM/tReLZIQ3TfQ4kqI9DwKk00dzuS1ulC7icbrzCFrmRRlk9PfNdw=="],
- "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.1.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-aF4us2JXh0zn3hNxvL1Bx3BOuh8Lcw3p3Xnurlvca/iptrDH1BrpObwkw9WZra7L7/0qB9kjlREq3hN/4x4x+Q=="],
+ "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.2.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-O3IRSv1ZBL1zs0WrIgefTEcTKFVn+ryxBNe54erJ6KsD+2f/Mmt7g2jOYh8PSBdUwPtKQJuCsTMlZ7tIu2AcsQ=="],
- "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-8VRkcpcfBtYvhGgXAF7U3MBx6+G1lACM1XCo1JyaUr4KmAkTNP8Dv2wdMq7BI+jqRBw3zQE7c57+lmp7jCFfKA=="],
+ "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-Re6PZtjBDd0aMU+VcZcC/PrIvj4WhrjDYtMhhCVQamWN4L90EVP0pcEOBQD25prSlw7OzNw5QpHLWMilRLsRNw=="],
- "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-UbFx69E2UP7MhzogJRMFvV9KdEn4sLGPicClwgqnLht2TEi204B71HuVfps3ymGAh0c44QRAF+ZmvZZhLLmhNg=="],
+ "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-qyogG9QtBzWxgJfeGBvOEHI3851gTfCF3wLZ5RDLTBJGAmE9p1qDwKCOdrBrvBzRvYDT+gUDp72pzlSEfAXgNA=="],
- "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SzGTfTjR5e9T+sZh5zXqG/oeRQufExxBF6MssXS7HPeZFE98JDhCRZXpSyCfWrWrYrzmnw/RVhlP2AxQm+wkRQ=="],
+ "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-Vhe4ZDuBpmMogrGi5D4R2Kq4JAQlj6+wvgaFYy31zfES0zPmt6TLA+cuYpM/OLrPZjo2MYQTHVqNUSCR6+fDZQ=="],
- "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-HlrDpj0v+JBIvQex1mXHq93Mht5qQmfyci+ZNwGClnAQldSfxI6h0Vupte1dSR4ueNv4q7qp5kTnmLOBIQnGow=="],
+ "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-srvian89JahFLw1YLBEuhvPJ0DO5lpUeJQMXy4xYo7g628ZlNgXdNkqoxSAv9OYrBfByh6vxISMwW/mRbzCY+g=="],
- "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.1.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3gFCp83/LSduZMSIa+lBREP7+5e7FxpdBoc9QrCdmp+dapmTK9I+SLpY60Z39GDmTXSZA4huGg9WwmYbr6+WRw=="],
+ "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.2.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-GX3wvLpULFuRFJzwHaKfm7QZJ18F4ZSuxlPJ96BoBglCzBmdSjyeBKF+ZhWhvL/ckxNfLnNa7bsObO2ipYpszw=="],
- "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.1.3", "", { "os": "win32", "cpu": "x64" }, "sha512-1SZVfFT8zmMB+Oblrh5OKDvUo5mYQOkX2We6VGzpg7JUVZlqe4DYOFGKYZKTweSx1gbMixyO1jnFT4thU+nNHQ=="],
+ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.2.7", "", { "os": "win32", "cpu": "x64" }, "sha512-J4WlM72NMk076Qsg0jTdK3SNXatlSdnjW7L7oNGLst1tAGjHrJh/FYi+pw9wyIjEtGRKDNzD0zuiY16oWYWVaw=="],
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
@@ -440,8 +438,6 @@
"@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="],
- "@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],
-
"@panva/hkdf": ["@panva/hkdf@1.2.1", "", {}, "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw=="],
"@parcel/watcher": ["@parcel/watcher@2.5.4", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.4", "@parcel/watcher-darwin-arm64": "2.5.4", "@parcel/watcher-darwin-x64": "2.5.4", "@parcel/watcher-freebsd-x64": "2.5.4", "@parcel/watcher-linux-arm-glibc": "2.5.4", "@parcel/watcher-linux-arm-musl": "2.5.4", "@parcel/watcher-linux-arm64-glibc": "2.5.4", "@parcel/watcher-linux-arm64-musl": "2.5.4", "@parcel/watcher-linux-x64-glibc": "2.5.4", "@parcel/watcher-linux-x64-musl": "2.5.4", "@parcel/watcher-win32-arm64": "2.5.4", "@parcel/watcher-win32-ia32": "2.5.4", "@parcel/watcher-win32-x64": "2.5.4" } }, "sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ=="],
@@ -476,19 +472,29 @@
"@playwright/test": ["@playwright/test@1.60.0", "", { "dependencies": { "playwright": "1.60.0" }, "bin": { "playwright": "cli.js" } }, "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag=="],
- "@prisma/client": ["@prisma/client@6.19.2", "", { "peerDependencies": { "prisma": "*", "typescript": ">=5.1.0" }, "optionalPeers": ["prisma", "typescript"] }, "sha512-gR2EMvfK/aTxsuooaDA32D8v+us/8AAet+C3J1cc04SW35FPdZYgLF+iN4NDLUgAaUGTKdAB0CYenu1TAgGdMg=="],
+ "@prisma/client": ["@prisma/client@7.8.0", "", { "dependencies": { "@prisma/client-runtime-utils": "7.8.0" }, "peerDependencies": { "prisma": "*", "typescript": ">=5.4.0" }, "optionalPeers": ["prisma", "typescript"] }, "sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw=="],
+
+ "@prisma/client-runtime-utils": ["@prisma/client-runtime-utils@7.8.0", "", {}, "sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw=="],
+
+ "@prisma/config": ["@prisma/config@7.8.0", "", { "dependencies": { "c12": "3.3.4", "deepmerge-ts": "7.1.5", "effect": "3.20.0", "empathic": "2.0.0" } }, "sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw=="],
+
+ "@prisma/debug": ["@prisma/debug@7.8.0", "", {}, "sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA=="],
+
+ "@prisma/dev": ["@prisma/dev@0.24.3", "", { "dependencies": { "@electric-sql/pglite": "0.4.1", "@electric-sql/pglite-socket": "0.1.1", "@electric-sql/pglite-tools": "0.3.1", "@hono/node-server": "1.19.11", "@prisma/get-platform": "7.2.0", "@prisma/query-plan-executor": "7.2.0", "@prisma/streams-local": "0.1.2", "foreground-child": "3.3.1", "get-port-please": "3.2.0", "hono": "^4.12.8", "http-status-codes": "2.3.0", "pathe": "2.0.3", "proper-lockfile": "4.1.2", "remeda": "2.33.4", "std-env": "3.10.0", "valibot": "1.2.0", "zeptomatch": "2.1.0" } }, "sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg=="],
+
+ "@prisma/engines": ["@prisma/engines@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0", "@prisma/engines-version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", "@prisma/fetch-engine": "7.8.0", "@prisma/get-platform": "7.8.0" } }, "sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw=="],
- "@prisma/config": ["@prisma/config@6.19.2", "", { "dependencies": { "c12": "3.1.0", "deepmerge-ts": "7.1.5", "effect": "3.18.4", "empathic": "2.0.0" } }, "sha512-kadBGDl+aUswv/zZMk9Mx0C8UZs1kjao8H9/JpI4Wh4SHZaM7zkTwiKn/iFLfRg+XtOAo/Z/c6pAYhijKl0nzQ=="],
+ "@prisma/engines-version": ["@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", "", {}, "sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA=="],
- "@prisma/debug": ["@prisma/debug@6.19.2", "", {}, "sha512-lFnEZsLdFLmEVCVNdskLDCL8Uup41GDfU0LUfquw+ercJC8ODTuL0WNKgOKmYxCJVvFwf0OuZBzW99DuWmoH2A=="],
+ "@prisma/fetch-engine": ["@prisma/fetch-engine@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0", "@prisma/engines-version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", "@prisma/get-platform": "7.8.0" } }, "sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ=="],
- "@prisma/engines": ["@prisma/engines@6.19.2", "", { "dependencies": { "@prisma/debug": "6.19.2", "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", "@prisma/fetch-engine": "6.19.2", "@prisma/get-platform": "6.19.2" } }, "sha512-TTkJ8r+uk/uqczX40wb+ODG0E0icVsMgwCTyTHXehaEfb0uo80M9g1aW1tEJrxmFHeOZFXdI2sTA1j1AgcHi4A=="],
+ "@prisma/get-platform": ["@prisma/get-platform@7.2.0", "", { "dependencies": { "@prisma/debug": "7.2.0" } }, "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA=="],
- "@prisma/engines-version": ["@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", "", {}, "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA=="],
+ "@prisma/query-plan-executor": ["@prisma/query-plan-executor@7.2.0", "", {}, "sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ=="],
- "@prisma/fetch-engine": ["@prisma/fetch-engine@6.19.2", "", { "dependencies": { "@prisma/debug": "6.19.2", "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", "@prisma/get-platform": "6.19.2" } }, "sha512-h4Ff4Pho+SR1S8XerMCC12X//oY2bG3Iug/fUnudfcXEUnIeRiBdXHFdGlGOgQ3HqKgosTEhkZMvGM9tWtYC+Q=="],
+ "@prisma/streams-local": ["@prisma/streams-local@0.1.2", "", { "dependencies": { "ajv": "^8.12.0", "better-result": "^2.7.0", "env-paths": "^3.0.0", "proper-lockfile": "^4.1.2" } }, "sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg=="],
- "@prisma/get-platform": ["@prisma/get-platform@6.19.2", "", { "dependencies": { "@prisma/debug": "6.19.2" } }, "sha512-PGLr06JUSTqIvztJtAzIxOwtWKtJm5WwOG6xpsgD37Rc84FpfUBGLKz65YpJBGtkRQGXTYEFie7pYALocC3MtA=="],
+ "@prisma/studio-core": ["@prisma/studio-core@0.27.3", "", { "dependencies": { "@radix-ui/react-toggle": "1.1.10", "chart.js": "4.5.1" }, "peerDependencies": { "@types/react": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw=="],
"@radix-ui/colors": ["@radix-ui/colors@3.0.0", "", {}, "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg=="],
@@ -606,15 +612,13 @@
"@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="],
- "@react-hook/intersection-observer": ["@react-hook/intersection-observer@3.1.2", "", { "dependencies": { "@react-hook/passive-layout-effect": "^1.2.0", "intersection-observer": "^0.10.0" }, "peerDependencies": { "react": ">=16.8" } }, "sha512-mWU3BMkmmzyYMSuhO9wu3eJVP21N8TcgYm9bZnTrMwuM818bEk+0NRM3hP+c/TqA9Ln5C7qE53p1H0QMtzYdvQ=="],
-
- "@react-hook/passive-layout-effect": ["@react-hook/passive-layout-effect@1.2.1", "", { "peerDependencies": { "react": ">=16.8" } }, "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg=="],
-
"@react-three/drei": ["@react-three/drei@10.7.7", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^3.1.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ=="],
"@react-three/fiber": ["@react-three/fiber@9.6.1", "", { "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^2.0.0", "react-use-measure": "^2.1.7", "scheduler": "^0.27.0", "suspend-react": "^0.1.3", "use-sync-external-store": "^1.4.0", "zustand": "^5.0.3" }, "peerDependencies": { "expo": ">=43.0", "expo-asset": ">=8.4", "expo-file-system": ">=11.0", "expo-gl": ">=11.0", "react": ">=19 <19.3", "react-dom": ">=19 <19.3", "react-native": ">=0.78", "three": ">=0.156" }, "optionalPeers": ["expo", "expo-asset", "expo-file-system", "expo-gl", "react-dom", "react-native"] }, "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg=="],
- "@reactuses/core": ["@reactuses/core@6.1.9", "", { "dependencies": { "@microsoft/fetch-event-source": "^2.0.1", "js-cookie": "^3.0.5", "lodash-es": "^4.17.21", "screenfull": "^5.0.0", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { "qrcode": "^1.5", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["qrcode"] }, "sha512-ahXOyJ92RvhYMvgXaKXqrSzIz0H2SUNaFy3zbrcmgfs4H46rOGTsxoy+ObxjXCogp6uZFYaFumSMO0u/xWcQMg=="],
+ "@reactuses/core": ["@reactuses/core@6.3.2", "", { "dependencies": { "@microsoft/fetch-event-source": "^2.0.1", "js-cookie": "^3.0.5", "lodash-es": "^4.17.21", "screenfull": "^5.0.0", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { "qrcode": "^1.5", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["qrcode"] }, "sha512-KTQkPbepgoB1LxtREH9jlAdUqaVoKzlbYGct9oLNM3gnCGo5bWy1zObT9sVRPF04AxKCPqh4deVFYRaS50fQxQ=="],
+
+ "@reduxjs/toolkit": ["@reduxjs/toolkit@2.12.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw=="],
"@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="],
@@ -624,8 +628,6 @@
"@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="],
- "@stitches/core": ["@stitches/core@1.2.8", "", {}, "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg=="],
-
"@swc/core": ["@swc/core@1.15.8", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.8", "@swc/core-darwin-x64": "1.15.8", "@swc/core-linux-arm-gnueabihf": "1.15.8", "@swc/core-linux-arm64-gnu": "1.15.8", "@swc/core-linux-arm64-musl": "1.15.8", "@swc/core-linux-x64-gnu": "1.15.8", "@swc/core-linux-x64-musl": "1.15.8", "@swc/core-win32-arm64-msvc": "1.15.8", "@swc/core-win32-ia32-msvc": "1.15.8", "@swc/core-win32-x64-msvc": "1.15.8" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw=="],
"@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg=="],
@@ -684,9 +686,9 @@
"@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "postcss": "^8.4.41", "tailwindcss": "4.1.18" } }, "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g=="],
- "@tanstack/query-core": ["@tanstack/query-core@5.90.19", "", {}, "sha512-GLW5sjPVIvH491VV1ufddnfldyVB+teCnpPIvweEfkpRx7CfUmUGhoh9cdcUKBh/KwVxk22aNEDxeTsvmyB/WA=="],
+ "@tanstack/query-core": ["@tanstack/query-core@5.100.14", "", {}, "sha512-5X41dGpxgeaHISCRW2oYwcSycZeULZzAunaudXT9ov1KOTj9xwt0CH6hbwqP1/z74ZWF7rYFnDpyYH07XFcZew=="],
- "@tanstack/react-query": ["@tanstack/react-query@5.90.19", "", { "dependencies": { "@tanstack/query-core": "5.90.19" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-qTZRZ4QyTzQc+M0IzrbKHxSeISUmRB3RPGmao5bT+sI6ayxSRhn0FXEnT5Hg3as8SBFcRosrXXRFB+yAcxVxJQ=="],
+ "@tanstack/react-query": ["@tanstack/react-query@5.100.14", "", { "dependencies": { "@tanstack/query-core": "5.100.14" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-oOr6aRdSFEwWhzxEkD/9ZcItM3+LjBSkeVmadWKwUssAHTsqd/7bOjWrX4AbvEkoEhgAxzN0Xk6H/aYzXiYBAw=="],
"@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="],
@@ -718,6 +720,8 @@
"@types/draco3d": ["@types/draco3d@1.4.10", "", {}, "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw=="],
+ "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="],
+
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
"@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
@@ -736,6 +740,8 @@
"@types/offscreencanvas": ["@types/offscreencanvas@2019.7.3", "", {}, "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A=="],
+ "@types/prismjs": ["@types/prismjs@1.26.6", "", {}, "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw=="],
+
"@types/react": ["@types/react@19.2.8", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg=="],
"@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
@@ -748,6 +754,8 @@
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+ "@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="],
+
"@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="],
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.53.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/type-utils": "8.53.0", "@typescript-eslint/utils": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.53.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg=="],
@@ -814,15 +822,11 @@
"@use-gesture/react": ["@use-gesture/react@10.3.1", "", { "dependencies": { "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g=="],
- "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
- "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
-
- "anser": ["anser@2.3.5", "", {}, "sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ=="],
-
- "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+ "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
@@ -852,21 +856,25 @@
"available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
+ "aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="],
+
"axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="],
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
"bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
- "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
- "baseline-browser-mapping": ["baseline-browser-mapping@2.9.15", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg=="],
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.33", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw=="],
+
+ "better-result": ["better-result@2.9.2", "", {}, "sha512-WIFoBPCdnTOdk9inkE1ZRvCZ4P0CpSkAiLlchC65N7n9DcjZ3NhqkBOlafzpOVnO8ixyi37kicmSJ3ENhPZl7Q=="],
"bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="],
- "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
+ "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="],
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
@@ -874,9 +882,9 @@
"buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
- "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="],
+ "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
- "c12": ["c12@3.1.0", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^16.6.1", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.4.2", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.2.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw=="],
+ "c12": ["c12@3.3.4", "", { "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.4", "defu": "^6.1.6", "dotenv": "^17.3.1", "exsolve": "^1.0.8", "giget": "^3.2.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "rc9": "^3.0.1" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA=="],
"call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
@@ -884,16 +892,12 @@
"call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
- "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
-
"camera-controls": ["camera-controls@3.1.2", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA=="],
"caniuse-lite": ["caniuse-lite@1.0.30001764", "", {}, "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g=="],
"ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
- "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
-
"character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
"character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
@@ -902,16 +906,14 @@
"character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="],
- "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+ "chart.js": ["chart.js@4.5.1", "", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="],
- "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="],
+ "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
"classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="],
- "clean-set": ["clean-set@1.1.2", "", {}, "sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug=="],
-
"client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
@@ -922,19 +924,13 @@
"codemirror": ["codemirror@6.0.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/lint": "^6.0.0", "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw=="],
- "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
-
- "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
-
"comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
"compute-scroll-into-view": ["compute-scroll-into-view@2.0.4", "", {}, "sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g=="],
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
- "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="],
-
- "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
+ "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="],
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
@@ -948,8 +944,6 @@
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
- "d": ["d@1.0.2", "", { "dependencies": { "es5-ext": "^0.10.64", "type": "^2.7.2" } }, "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw=="],
-
"d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
"d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
@@ -980,14 +974,10 @@
"data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
- "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="],
-
- "date-fns-jalali": ["date-fns-jalali@4.1.0-0", "", {}, "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg=="],
+ "date-fns": ["date-fns@4.4.0", "", {}, "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
- "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="],
-
"decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="],
"decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="],
@@ -1000,7 +990,9 @@
"define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
- "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
+ "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="],
+
+ "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="],
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
@@ -1018,9 +1010,7 @@
"doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
- "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="],
-
- "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="],
+ "dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="],
"downshift": ["downshift@7.6.2", "", { "dependencies": { "@babel/runtime": "^7.14.8", "compute-scroll-into-view": "^2.0.4", "prop-types": "^15.7.2", "react-is": "^17.0.2", "tslib": "^2.3.0" }, "peerDependencies": { "react": ">=16.12.0" } }, "sha512-iOv+E1Hyt3JDdL9yYcOgW7nZ7GQ2Uz6YbggwXvKUSleetYhU2nXD482Rz6CzvM4lvI1At34BYruKAL4swRGxaA=="],
@@ -1028,7 +1018,7 @@
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
- "effect": ["effect@3.18.4", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA=="],
+ "effect": ["effect@3.20.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw=="],
"electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="],
@@ -1044,6 +1034,8 @@
"enhanced-resolve": ["enhanced-resolve@5.18.4", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="],
+ "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="],
+
"es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="],
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
@@ -1060,21 +1052,15 @@
"es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
- "es5-ext": ["es5-ext@0.10.64", "", { "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", "esniff": "^2.0.1", "next-tick": "^1.1.0" } }, "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg=="],
-
- "es6-iterator": ["es6-iterator@2.0.3", "", { "dependencies": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g=="],
-
- "es6-symbol": ["es6-symbol@3.1.4", "", { "dependencies": { "d": "^1.0.2", "ext": "^1.7.0" } }, "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg=="],
+ "es-toolkit": ["es-toolkit@1.47.0", "", {}, "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw=="],
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
- "escape-carriage": ["escape-carriage@1.3.1", "", {}, "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw=="],
-
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
- "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="],
+ "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="],
- "eslint-config-next": ["eslint-config-next@16.1.3", "", { "dependencies": { "@next/eslint-plugin-next": "16.1.3", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^7.0.0", "globals": "16.4.0", "typescript-eslint": "^8.46.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-q2Z87VSsoJcv+vgR+Dm8NPRf+rErXcRktuBR5y3umo/j5zLjIWH7rqBCh3X804gUGKbOrqbgsLUkqDE35C93Gw=="],
+ "eslint-config-next": ["eslint-config-next@16.2.7", "", { "dependencies": { "@next/eslint-plugin-next": "16.2.7", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^7.0.0", "globals": "16.4.0", "typescript-eslint": "^8.46.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-CQ2aNXkrsjaGA2oJBE1LYnlRdphIAQE9ZQfX9hSv1PNGPyiOMSaVeBfTIO29QxYz+ij/hZudK0cfpCG1HXWstg=="],
"eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="],
@@ -1090,13 +1076,11 @@
"eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="],
- "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
+ "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="],
- "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
+ "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
- "esniff": ["esniff@2.0.1", "", { "dependencies": { "d": "^1.0.1", "es5-ext": "^0.10.62", "event-emitter": "^0.3.5", "type": "^2.7.2" } }, "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg=="],
-
- "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
+ "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="],
"esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
@@ -1110,28 +1094,24 @@
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
- "event-emitter": ["event-emitter@0.3.5", "", { "dependencies": { "d": "1", "es5-ext": "~0.10.14" } }, "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA=="],
-
- "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="],
+ "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
"exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="],
- "ext": ["ext@1.7.0", "", { "dependencies": { "type": "^2.7.2" } }, "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw=="],
-
"extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
"fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="],
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
- "fast-equals": ["fast-equals@5.4.0", "", {}, "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw=="],
-
"fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="],
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
"fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+ "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="],
+
"fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
"fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="],
@@ -1152,6 +1132,8 @@
"for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
+ "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
+
"format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="],
"framer-motion": ["framer-motion@12.40.0", "", { "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg=="],
@@ -1164,6 +1146,8 @@
"functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
+ "generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="],
+
"generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="],
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
@@ -1172,13 +1156,15 @@
"get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
+ "get-port-please": ["get-port-please@3.2.0", "", {}, "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A=="],
+
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
"get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="],
"get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="],
- "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="],
+ "giget": ["giget@3.2.0", "", { "bin": { "giget": "dist/cli.mjs" } }, "sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A=="],
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
@@ -1192,9 +1178,11 @@
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
- "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
+ "grammex": ["grammex@3.1.12", "", {}, "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ=="],
+
+ "graphmatch": ["graphmatch@1.1.1", "", {}, "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg=="],
- "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
"has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="],
@@ -1206,13 +1194,13 @@
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
- "hast-util-parse-selector": ["hast-util-parse-selector@2.2.5", "", {}, "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="],
+ "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
"hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="],
"hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
- "hastscript": ["hastscript@6.0.0", "", { "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="],
+ "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
"hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="],
@@ -1224,8 +1212,16 @@
"hls.js": ["hls.js@1.6.16", "", {}, "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA=="],
+ "hono": ["hono@4.12.23", "", {}, "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA=="],
+
"html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="],
+ "http-status-codes": ["http-status-codes@2.3.0", "", {}, "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA=="],
+
+ "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
+
+ "icu-minify": ["icu-minify@4.13.0", "", { "dependencies": { "@formatjs/icu-messageformat-parser": "^3.4.0" } }, "sha512-SIFMeUHZJjzS5RvIGvybKvWoHjDm9cGVEs2EpJ8PmywOdJLWyblPm7TdPLLoUtkJtwQD7iGhl2WMptZ+N0on+w=="],
+
"ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
@@ -1234,8 +1230,6 @@
"immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="],
- "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
-
"imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
"inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],
@@ -1246,9 +1240,7 @@
"internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
- "intersection-observer": ["intersection-observer@0.10.0", "", {}, "sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ=="],
-
- "intl-messageformat": ["intl-messageformat@10.7.18", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.4", "tslib": "^2.8.0" } }, "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g=="],
+ "intl-messageformat": ["intl-messageformat@11.2.7", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.5", "@formatjs/icu-messageformat-parser": "3.5.10" } }, "sha512-+q6Ktg119nULZEpZ8YTuGOst9MyEzFtjD63FTGBlN1mLz0Z/MOUYDIvnpVKwq17eezIEh+cfJIebfJoCetpiNw=="],
"is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
@@ -1296,6 +1288,8 @@
"is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="],
+ "is-property": ["is-property@1.0.2", "", {}, "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="],
+
"is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
"is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
@@ -1388,11 +1382,9 @@
"locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
- "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
-
"lodash-es": ["lodash-es@4.17.22", "", {}, "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q=="],
- "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+ "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
@@ -1404,9 +1396,9 @@
"lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
- "lucide-react": ["lucide-react@1.17.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w=="],
+ "lru.min": ["lru.min@1.1.4", "", {}, "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA=="],
- "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="],
+ "lucide-react": ["lucide-react@1.17.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w=="],
"maath": ["maath@0.10.8", "", { "peerDependencies": { "@types/three": ">=0.134.0", "three": ">=0.134.0" } }, "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g=="],
@@ -1522,9 +1514,7 @@
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
- "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
-
- "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+ "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
@@ -1536,6 +1526,10 @@
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+ "mysql2": ["mysql2@3.15.3", "", { "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.7.0", "long": "^5.2.1", "lru.min": "^1.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" } }, "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg=="],
+
+ "named-placeholders": ["named-placeholders@1.1.6", "", { "dependencies": { "lru.min": "^1.1.0" } }, "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w=="],
+
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
"napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="],
@@ -1544,26 +1538,20 @@
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
- "next": ["next@16.1.3", "", { "dependencies": { "@next/env": "16.1.3", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.3", "@next/swc-darwin-x64": "16.1.3", "@next/swc-linux-arm64-gnu": "16.1.3", "@next/swc-linux-arm64-musl": "16.1.3", "@next/swc-linux-x64-gnu": "16.1.3", "@next/swc-linux-x64-musl": "16.1.3", "@next/swc-win32-arm64-msvc": "16.1.3", "@next/swc-win32-x64-msvc": "16.1.3", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-gthG3TRD+E3/mA0uDQb9lqBmx1zVosq5kIwxNN6+MRNd085GzD+9VXMPUs+GGZCbZ+GDZdODUq4Pm7CTXK6ipw=="],
+ "next": ["next@16.2.7", "", { "dependencies": { "@next/env": "16.2.7", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.7", "@next/swc-darwin-x64": "16.2.7", "@next/swc-linux-arm64-gnu": "16.2.7", "@next/swc-linux-arm64-musl": "16.2.7", "@next/swc-linux-x64-gnu": "16.2.7", "@next/swc-linux-x64-musl": "16.2.7", "@next/swc-win32-arm64-msvc": "16.2.7", "@next/swc-win32-x64-msvc": "16.2.7", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-eMJxgjRzBaj3olkP4cBamHDXL79A8FC6u1GcsO1D1Tsx8bw/LLXUJCaoajVxtnhD3A1IJqIT8IcRJjgBIPJq4w=="],
- "next-auth": ["next-auth@4.24.13", "", { "dependencies": { "@babel/runtime": "^7.20.13", "@panva/hkdf": "^1.0.2", "cookie": "^0.7.0", "jose": "^4.15.5", "oauth": "^0.9.15", "openid-client": "^5.4.0", "preact": "^10.6.3", "preact-render-to-string": "^5.1.19", "uuid": "^8.3.2" }, "peerDependencies": { "@auth/core": "0.34.3", "next": "^12.2.5 || ^13 || ^14 || ^15 || ^16", "nodemailer": "^7.0.7", "react": "^17.0.2 || ^18 || ^19", "react-dom": "^17.0.2 || ^18 || ^19" }, "optionalPeers": ["@auth/core", "nodemailer"] }, "sha512-sgObCfcfL7BzIK76SS5TnQtc3yo2Oifp/yIpfv6fMfeBOiBJkDWF3A2y9+yqnmJ4JKc2C+nMjSjmgDeTwgN1rQ=="],
+ "next-auth": ["next-auth@4.24.14", "", { "dependencies": { "@babel/runtime": "^7.20.13", "@panva/hkdf": "^1.0.2", "cookie": "^0.7.0", "jose": "^4.15.5", "oauth": "^0.9.15", "openid-client": "^5.4.0", "preact": "^10.6.3", "preact-render-to-string": "^5.1.19", "uuid": "^8.3.2" }, "peerDependencies": { "@auth/core": "0.34.3", "next": "^12.2.5 || ^13 || ^14 || ^15 || ^16", "nodemailer": "^7.0.7", "react": "^17.0.2 || ^18 || ^19", "react-dom": "^17.0.2 || ^18 || ^19" }, "optionalPeers": ["@auth/core", "nodemailer"] }, "sha512-YRz6xFDXKUwiXSMMChbrBEWyFktZ1qZXEgeSHQQ3nsy08B4c/xLk6REeutRsIFwkjY/1+ShHnu07DN3JeJguig=="],
- "next-intl": ["next-intl@4.7.0", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.5.4", "@parcel/watcher": "^2.4.1", "@swc/core": "^1.15.2", "negotiator": "^1.0.0", "next-intl-swc-plugin-extractor": "^4.7.0", "po-parser": "^2.1.1", "use-intl": "^4.7.0" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "typescript": "^5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-gvROzcNr/HM0jTzQlKWQxUNk8jrZ0bREz+bht3wNbv+uzlZ5Kn3J+m+viosub18QJ72S08UJnVK50PXWcUvwpQ=="],
+ "next-intl": ["next-intl@4.13.0", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.8.1", "@parcel/watcher": "^2.4.1", "@swc/core": "^1.15.2", "icu-minify": "^4.13.0", "negotiator": "^1.0.0", "next-intl-swc-plugin-extractor": "^4.13.0", "po-parser": "^2.1.1", "use-intl": "^4.13.0" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-OvNq2v5XLx4EkQOsAhVE9g+6zdb83XHusADCXXtIW4LILYnjEVaeINdr1lkVWKSjzwNUiMSlH5N4K0OQTRiv6A=="],
- "next-intl-swc-plugin-extractor": ["next-intl-swc-plugin-extractor@4.7.0", "", {}, "sha512-iAqflu2FWdQMWhwB0B2z52X7LmEpvnMNJXqVERZQ7bK5p9iqQLu70ur6Ka6NfiXLxfb+AeAkUX5qIciQOg+87A=="],
+ "next-intl-swc-plugin-extractor": ["next-intl-swc-plugin-extractor@4.13.0", "", {}, "sha512-6S/fJI0KXvLCL8nhBo9P8eGaJPzmwJBTCzX0NaUIj0VyU8U89d//T+vjMLdNIXl5MlLaYH7B9MbAjb8Mvu+tqQ=="],
"next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="],
- "next-tick": ["next-tick@1.1.0", "", {}, "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="],
-
"node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
- "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
-
"node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
- "nypm": ["nypm@0.6.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="],
-
"oauth": ["oauth@0.9.15", "", {}, "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA=="],
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
@@ -1592,16 +1580,12 @@
"optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
- "outvariant": ["outvariant@1.4.0", "", {}, "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw=="],
-
"own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
- "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
-
"parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
@@ -1612,7 +1596,7 @@
"pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
- "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="],
+ "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
@@ -1630,6 +1614,8 @@
"postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+ "postgres": ["postgres@3.4.7", "", {}, "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw=="],
+
"potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="],
"preact": ["preact@10.28.2", "", {}, "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA=="],
@@ -1640,7 +1626,7 @@
"pretty-format": ["pretty-format@3.8.0", "", {}, "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="],
- "prisma": ["prisma@6.19.2", "", { "dependencies": { "@prisma/config": "6.19.2", "@prisma/engines": "6.19.2" }, "peerDependencies": { "typescript": ">=5.1.0" }, "optionalPeers": ["typescript"], "bin": { "prisma": "build/index.js" } }, "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg=="],
+ "prisma": ["prisma@7.8.0", "", { "dependencies": { "@prisma/config": "7.8.0", "@prisma/dev": "0.24.3", "@prisma/engines": "7.8.0", "@prisma/studio-core": "0.27.3", "mysql2": "3.15.3", "postgres": "3.4.7" }, "peerDependencies": { "better-sqlite3": ">=9.0.0", "typescript": ">=5.4.0" }, "optionalPeers": ["better-sqlite3", "typescript"], "bin": { "prisma": "build/index.js" } }, "sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw=="],
"prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
@@ -1648,6 +1634,8 @@
"prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
+ "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="],
+
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
@@ -1656,49 +1644,47 @@
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
- "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="],
-
- "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="],
+ "rc9": ["rc9@3.0.1", "", { "dependencies": { "defu": "^6.1.6", "destr": "^2.0.5" } }, "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ=="],
- "react-day-picker": ["react-day-picker@9.13.0", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0", "date-fns-jalali": "^4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-euzj5Hlq+lOHqI53NiuNhCP8HWgsPf/bBAVijR50hNaY1XwjKjShAnIe8jm8RD2W9IJUvihDIZ+KrmqfFzNhFQ=="],
+ "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="],
- "react-devtools-inline": ["react-devtools-inline@4.4.0", "", { "dependencies": { "es6-symbol": "^3" } }, "sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ=="],
+ "react-day-picker": ["react-day-picker@10.0.1", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0" }, "peerDependencies": { "@types/react": ">=16.8.0", "react": ">=16.8.0" }, "optionalPeers": ["@types/react"] }, "sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w=="],
- "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="],
+ "react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="],
"react-error-boundary": ["react-error-boundary@3.1.4", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "react": ">=16.13.1" } }, "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA=="],
- "react-hook-form": ["react-hook-form@7.71.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w=="],
+ "react-hook-form": ["react-hook-form@7.77.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-Sslh9YDYc0GDlWT/lxasnIduNo4v3yyvqRGvmGKUre5AFjDs/HV9/OafHGD8d+sB2yoL4UIL9L8X9i0WlZZebg=="],
"react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
"react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="],
+ "react-redux": ["react-redux@9.3.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g=="],
+
"react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="],
"react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
- "react-resizable-panels": ["react-resizable-panels@3.0.6", "", { "peerDependencies": { "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew=="],
-
- "react-smooth": ["react-smooth@4.0.4", "", { "dependencies": { "fast-equals": "^5.0.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q=="],
+ "react-resizable-panels": ["react-resizable-panels@4.11.2", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-+kfFbDZ8mygc7g0vxOcDzCVGuwiIUOnILqPoUHo6/uP+Mmyx6HzZU+kj1aOPDlktXuobYbr6BtQekvJwHRX4Eg=="],
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
- "react-syntax-highlighter": ["react-syntax-highlighter@15.6.6", "", { "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^3.6.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw=="],
-
- "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="],
+ "react-syntax-highlighter": ["react-syntax-highlighter@16.1.1", "", { "dependencies": { "@babel/runtime": "^7.28.4", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^5.0.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-PjVawBGy80C6YbC5DDZJeUjBmC7skaoEUdvfFQediQHgCL7aKyVHe57SaJGfQsloGDac+gCpTfRdtxzWWKmCXA=="],
"react-use-measure": ["react-use-measure@2.1.7", "", { "peerDependencies": { "react": ">=16.13", "react-dom": ">=16.13" }, "optionalPeers": ["react-dom"] }, "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg=="],
- "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+ "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
+
+ "recharts": ["recharts@3.8.1", "", { "dependencies": { "@reduxjs/toolkit": "^1.9.0 || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg=="],
- "recharts": ["recharts@2.15.4", "", { "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.21", "react-is": "^18.3.1", "react-smooth": "^4.0.4", "recharts-scale": "^0.4.4", "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw=="],
+ "redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="],
- "recharts-scale": ["recharts-scale@0.4.5", "", { "dependencies": { "decimal.js-light": "^2.4.1" } }, "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w=="],
+ "redux-thunk": ["redux-thunk@3.1.0", "", { "peerDependencies": { "redux": "^5.0.0" } }, "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw=="],
"reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
- "refractor": ["refractor@3.6.0", "", { "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", "prismjs": "~1.27.0" } }, "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="],
+ "refractor": ["refractor@5.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/prismjs": "^1.0.0", "hastscript": "^9.0.0", "parse-entities": "^4.0.0" } }, "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw=="],
"regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
@@ -1706,14 +1692,18 @@
"remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="],
+ "remeda": ["remeda@2.33.4", "", {}, "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ=="],
+
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
- "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
+ "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="],
- "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
+ "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
+ "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
+
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
@@ -1726,12 +1716,16 @@
"safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
+
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
"screenfull": ["screenfull@5.2.0", "", {}, "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="],
"semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+ "seq-queue": ["seq-queue@0.0.5", "", {}, "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="],
+
"set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
"set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
@@ -1752,23 +1746,25 @@
"side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
"sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
- "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="],
+ "sqlstring": ["sqlstring@2.3.3", "", {}, "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="],
- "static-browser-server": ["static-browser-server@1.0.3", "", { "dependencies": { "@open-draft/deferred-promise": "^2.1.0", "dotenv": "^16.0.3", "mime-db": "^1.52.0", "outvariant": "^1.3.0" } }, "sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA=="],
+ "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="],
"stats-gl": ["stats-gl@2.4.2", "", { "dependencies": { "@types/three": "*", "three": "^0.170.0" } }, "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ=="],
"stats.js": ["stats.js@0.17.0", "", {}, "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw=="],
- "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="],
+ "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="],
- "strict-event-emitter": ["strict-event-emitter@0.4.6", "", {}, "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg=="],
+ "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="],
"string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="],
@@ -1786,8 +1782,6 @@
"strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
- "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
-
"style-mod": ["style-mod@4.1.3", "", {}, "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ=="],
"style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="],
@@ -1796,15 +1790,13 @@
"styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
- "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
-
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
"suspend-react": ["suspend-react@0.1.3", "", { "peerDependencies": { "react": ">=17.0" } }, "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ=="],
"tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="],
- "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="],
+ "tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="],
"tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="],
@@ -1820,8 +1812,6 @@
"tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
- "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
-
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
@@ -1846,8 +1836,6 @@
"tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
- "type": ["type@2.7.3", "", {}, "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="],
-
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
"typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
@@ -1858,7 +1846,7 @@
"typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="],
- "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
"typescript-eslint": ["typescript-eslint@8.53.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw=="],
@@ -1890,7 +1878,7 @@
"use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
- "use-intl": ["use-intl@4.7.0", "", { "dependencies": { "@formatjs/fast-memoize": "^2.2.0", "@schummar/icu-type-parser": "1.21.5", "intl-messageformat": "^10.5.14" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-jyd8nSErVRRsSlUa+SDobKHo9IiWs5fjcPl9VBUnzUyEQpVM5mwJCgw8eUiylhvBpLQzUGox1KN0XlRivSID9A=="],
+ "use-intl": ["use-intl@4.13.0", "", { "dependencies": { "@formatjs/fast-memoize": "^3.1.0", "@schummar/icu-type-parser": "1.21.5", "icu-minify": "^4.13.0", "intl-messageformat": "^11.1.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-fAFDrWaASxlhXOipcOyb5VDD+YONqj6+8O8EcG/J7RBoOUF3A8YahRWLN+mBxYMrlMQB8N6Voqk5X+YC+HSL0A=="],
"use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
@@ -1898,17 +1886,19 @@
"utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="],
- "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],
+ "uuid": ["uuid@14.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg=="],
"uvu": ["uvu@0.5.6", "", { "dependencies": { "dequal": "^2.0.0", "diff": "^5.0.0", "kleur": "^4.0.3", "sade": "^1.7.3" }, "bin": { "uvu": "bin.js" } }, "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA=="],
+ "valibot": ["valibot@1.2.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg=="],
+
"vaul": ["vaul@1.1.2", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.1" }, "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA=="],
"vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
"vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
- "victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="],
+ "victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="],
"w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="],
@@ -1928,21 +1918,21 @@
"word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
- "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="],
-
"yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
"yjs": ["yjs@13.6.29", "", { "dependencies": { "lib0": "^0.2.99" } }, "sha512-kHqDPdltoXH+X4w1lVmMtddE3Oeqq48nM40FD5ojTd8xYhQpzIDcfE2keMSU5bAgRPJBe225WTUdyUgj1DtbiQ=="],
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
- "z-ai-web-dev-sdk": ["z-ai-web-dev-sdk@0.0.16", "", { "bin": { "z-ai": "dist/cli.js", "z-ai-generate": "dist/cli.js" } }, "sha512-x/q6D+0zIyKk2AvR4OeZGqRvzvngf9d1nT9KxCUxywDyrBj9qvqLqzfoauJKXxbXY7ezFQZDMnODIkVwyz3yyg=="],
+ "z-ai-web-dev-sdk": ["z-ai-web-dev-sdk@0.0.18", "", { "bin": { "z-ai": "dist/cli.js", "z-ai-generate": "dist/cli.js" } }, "sha512-xVoZIEME2F+/Z06orHCgUKzOMuFPhoHuzN4ZFZqcD71g11nzbzq2jKSP53igi3lJFE8ZbMB4WKb4gp6lCGrMXQ=="],
+
+ "zeptomatch": ["zeptomatch@2.1.0", "", { "dependencies": { "grammex": "^3.1.11", "graphmatch": "^1.1.0" } }, "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA=="],
- "zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="],
+ "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
"zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="],
- "zustand": ["zustand@5.0.10", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg=="],
+ "zustand": ["zustand@5.0.14", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="],
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
@@ -1954,13 +1944,15 @@
"@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
- "@codesandbox/sandpack-react/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="],
-
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
- "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
+ "@prisma/engines/@prisma/get-platform": ["@prisma/get-platform@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0" } }, "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw=="],
+
+ "@prisma/fetch-engine/@prisma/get-platform": ["@prisma/get-platform@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0" } }, "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw=="],
- "@formatjs/ecma402-abstract/@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.2", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA=="],
+ "@prisma/get-platform/@prisma/debug": ["@prisma/debug@7.2.0", "", {}, "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw=="],
+
+ "@prisma/streams-local/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
"@radix-ui/react-alert-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
@@ -1994,6 +1986,12 @@
"@radix-ui/react-tooltip/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
+ "@react-three/drei/zustand": ["zustand@5.0.10", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg=="],
+
+ "@react-three/fiber/zustand": ["zustand@5.0.10", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg=="],
+
+ "@reduxjs/toolkit/immer": ["immer@11.1.8", "", {}, "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA=="],
+
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
@@ -2010,6 +2008,10 @@
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+ "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
+
+ "browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.9.15", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg=="],
+
"downshift/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="],
"eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
@@ -2018,26 +2020,28 @@
"eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
+ "eslint-plugin-import/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+
"eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
- "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],
+ "eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
- "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+ "eslint-plugin-react/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
- "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
-
- "hastscript/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
+ "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],
- "hastscript/comma-separated-tokens": ["comma-separated-tokens@1.0.8", "", {}, "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="],
+ "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
- "hastscript/property-information": ["property-information@5.6.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="],
+ "eslint-plugin-react-hooks/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="],
- "hastscript/space-separated-tokens": ["space-separated-tokens@1.1.5", "", {}, "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="],
+ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"lowlight/fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="],
"mdast-util-frontmatter/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+ "micromark-extension-mdxjs/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
"next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
@@ -2046,11 +2050,11 @@
"parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
- "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
+ "pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="],
- "refractor/parse-entities": ["parse-entities@2.0.0", "", { "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" } }, "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="],
+ "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
- "refractor/prismjs": ["prismjs@1.27.0", "", {}, "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="],
+ "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
"stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="],
@@ -2060,22 +2064,22 @@
"@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
- "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+ "@prisma/streams-local/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
- "hastscript/@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
- "refractor/parse-entities/character-entities": ["character-entities@1.2.4", "", {}, "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="],
+ "eslint-plugin-import/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
- "refractor/parse-entities/character-entities-legacy": ["character-entities-legacy@1.1.4", "", {}, "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="],
+ "eslint-plugin-jsx-a11y/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
- "refractor/parse-entities/character-reference-invalid": ["character-reference-invalid@1.1.4", "", {}, "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="],
+ "eslint-plugin-react/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
- "refractor/parse-entities/is-alphanumerical": ["is-alphanumerical@1.0.4", "", { "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="],
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
- "refractor/parse-entities/is-decimal": ["is-decimal@1.0.4", "", {}, "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="],
+ "eslint-plugin-import/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
- "refractor/parse-entities/is-hexadecimal": ["is-hexadecimal@1.0.4", "", {}, "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="],
+ "eslint-plugin-jsx-a11y/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
- "refractor/parse-entities/is-alphanumerical/is-alphabetical": ["is-alphabetical@1.0.4", "", {}, "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="],
+ "eslint-plugin-react/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
}
}
diff --git a/docs/animation/interpolate.md b/docs/animation/interpolate.md
new file mode 100644
index 0000000..771674f
--- /dev/null
+++ b/docs/animation/interpolate.md
@@ -0,0 +1,56 @@
+# interpolate()
+
+The `interpolate()` function maps an input value (usually the current frame) from one range to another. It's the most common way to create animations in MotionForge.
+
+## Basic Usage
+
+```tsx
+import { useCurrentFrame, interpolate } from 'motionforge';
+
+const MyComponent = () => {
+ const frame = useCurrentFrame();
+
+ // Animate opacity from 0 to 1 over frames 0 to 30
+ const opacity = interpolate(frame, [0, 30], [0, 1]);
+
+ return
Hello World
;
+};
+```
+
+## Advanced Options
+
+```tsx
+const value = interpolate(frame, [0, 30, 60], [0, 100, 50], {
+ extrapolateLeft: 'clamp',
+ extrapolateRight: 'wrap',
+ easing: Easing.easeOutCubic,
+ posterize: 10
+});
+```
+
+### Parameters
+
+| Parameter | Type | Description |
+| :--- | :--- | :--- |
+| `input` | `number` | The value to interpolate (usually `frame`). |
+| `inputRange` | `number[]` | Array of input values. Must be increasing. |
+| `outputRange` | `number[]` | Array of output values. Must be same length as `inputRange`. |
+| `options` | `Object` | Optional configuration. |
+
+### Options
+
+| Option | Type | Default | Description |
+| :--- | :--- | :--- | :--- |
+| `extrapolateLeft` | `string` | `'clamp'` | How to handle values below `inputRange[0]`. Options: `'clamp'`, `'extend'`, `'identity'`, `'wrap'`. |
+| `extrapolateRight` | `string` | `'clamp'` | How to handle values above the last `inputRange` element. Options: `'clamp'`, `'extend'`, `'identity'`, `'wrap'`. |
+| `easing` | `Easing \| Easing[]` | `undefined` | Easing function(s) to apply. Can be an array for per-segment easing. |
+| `posterize` | `number` | `undefined` | If set, the input will be quantized to steps of this size (stepped animation). |
+
+---
+
+## Extrapolation Modes
+
+- **`clamp`**: (Default) Clamps the result to the output range.
+- **`extend`**: Continues the linear interpolation beyond the range.
+- **`identity`**: Returns the input value if it's outside the range.
+- **`wrap`**: (New) Cycles the value back into the range (looping animation).
diff --git a/docs/animation/spring.md b/docs/animation/spring.md
new file mode 100644
index 0000000..23d2e46
--- /dev/null
+++ b/docs/animation/spring.md
@@ -0,0 +1,68 @@
+# spring()
+
+The `spring()` function creates physics-based animations that feel natural and organic. Unlike linear interpolation, spring animations have momentum and can overshoot their target.
+
+## Basic Usage
+
+```tsx
+import { useCurrentFrame, useVideoConfig, spring } from 'motionforge';
+
+const MyComponent = () => {
+ const frame = useCurrentFrame();
+ const { fps } = useVideoConfig();
+
+ const scale = spring({
+ frame,
+ fps,
+ from: 0,
+ to: 1,
+ config: {
+ damping: 12,
+ stiffness: 100
+ }
+ });
+
+ return (
+
+ Animated Box
+
+ );
+};
+```
+
+## Parameters
+
+| Parameter | Type | Default | Description |
+| :--- | :--- | :--- | :--- |
+| `frame` | `number` | **Required** | The current frame. |
+| `fps` | `number` | **Required** | Frames per second of the composition. |
+| `from` | `number` | `0` | Starting value. |
+| `to` | `number` | `1` | Target value. |
+| `delay` | `number` | `0` | Frames to wait before starting the animation. |
+| `reverse` | `boolean` | `false` | If true, plays the animation from `to` to `from`. |
+| `durationInFrames`| `number` | `fps * 2` | Approximate duration until the spring settles. |
+| `config` | `Object` | See below | Spring physics configuration. |
+
+### Config Options
+
+| Option | Type | Default | Description |
+| :--- | :--- | :--- | :--- |
+| `stiffness` | `number` | `100` | The spring tension. Higher = faster. |
+| `damping` | `number` | `10` | Friction. Lower = more "bouncy" oscillation. |
+| `mass` | `number` | `1` | Weight of the object. |
+| `overshootClamping`| `boolean`| `false` | If true, prevents the value from going past `to`. |
+
+---
+
+## Reverse Spring (Exit Animations)
+
+Use the `reverse` prop to easily create exit animations using the same spring physics.
+
+```tsx
+const opacity = spring({
+ frame,
+ fps,
+ delay: 200, // Wait until frame 200
+ reverse: true, // Fade out
+});
+```
diff --git a/docs/api-reference/components.md b/docs/api-reference/components.md
new file mode 100644
index 0000000..57a20e3
--- /dev/null
+++ b/docs/api-reference/components.md
@@ -0,0 +1,71 @@
+# API Reference: Components
+
+## ``
+
+A container that fills the entire canvas area. It defaults to `position: absolute` and covers the whole parent.
+
+### Props
+
+| Prop | Type | Default | Description |
+| :--- | :--- | :--- | :--- |
+| `className` | `string` | `undefined` | Tailwind CSS classes. |
+| `style` | `CSSProperties`| `{}` | Inline styles. |
+| `children` | `ReactNode` | `undefined` | Children to render. |
+
+> **Tailwind Compatibility**: MotionForge automatically detects if you use layout-related Tailwind classes (like `w-1/2`, `inset-0`, `grid`) and omits conflicting default inline styles.
+
+---
+
+## ``
+
+Used to manage timing and layering. It only renders its children during the specified frame range.
+
+### Props
+
+| Prop | Type | Default | Description |
+| :--- | :--- | :--- | :--- |
+| `from` | `number` | **Required** | Start frame (inclusive). |
+| `durationInFrames` | `number` | `Infinity` | How many frames to render for. |
+| `premountFor` | `number` | `0` | Render children `N` frames before `from` (invisible) for preloading. |
+| `layout` | `string` | `'absolute-fill'` | Layout mode: `'absolute-fill'` or `'none'`. |
+| `name` | `string` | `undefined` | Debug label. |
+
+---
+
+## ``
+
+Plays a list of sequences one after another.
+
+### Usage
+
+```tsx
+
+
+
+
+
+ {/* Overlaps first scene by 5 frames */}
+
+
+```
+
+### `` Props
+
+| Prop | Type | Default | Description |
+| :--- | :--- | :--- | :--- |
+| `durationInFrames` | `number` | **Required** | Duration of this segment. |
+| `offset` | `number` | `0` | Gap (positive) or overlap (negative) with previous segment. |
+
+---
+
+## ``
+
+Freezes a single frame for a specific duration.
+
+### Props
+
+| Prop | Type | Default | Description |
+| :--- | :--- | :--- | :--- |
+| `frame` | `number` | **Required** | The frame index to freeze at. |
+| `durationInFrames` | `number` | `undefined` | If set, freezes for this many frames then resumes. |
+| `active` | `boolean \| Fn` | `true` | Conditional freeze toggle. |
diff --git a/docs/cli/cli-overview.md b/docs/cli/cli-overview.md
new file mode 100644
index 0000000..3129f6a
--- /dev/null
+++ b/docs/cli/cli-overview.md
@@ -0,0 +1,70 @@
+# CLI Commands
+
+The `@motionforge/cli` package provides tools to render videos and stills from the command line.
+
+## `render`
+
+Render a composition to a video file.
+
+```bash
+motionforge render [options]
+```
+
+### Options
+
+| Option | Default | Description |
+| :--- | :--- | :--- |
+| `-o, --output` | `output.mp4` | Path to save the video. |
+| `--codec` | `h264` | Video codec: `h264`, `h265`, `vp8`, `vp9`, `prores`, `gif`. |
+| `--fps` | `30` | Frame rate. |
+| `--width` | `1920` | Video width. |
+| `--height` | `1080` | Video height. |
+| `--duration` | `300` | Duration in frames. |
+| `--props` | `undefined` | JSON string of input props to inject. |
+| `--concurrency` | `4` | Number of concurrent browser pages for rendering. |
+| `--frame-range` | `undefined` | Range to render, e.g., `0-29`. |
+| `--crf` | `18` | Constant Rate Factor (quality). |
+
+---
+
+## `still`
+
+Render a single frame to an image file.
+
+```bash
+motionforge still [options]
+```
+
+### Options
+
+| Option | Default | Description |
+| :--- | :--- | :--- |
+| `-o, --output` | `output.png` | Path to save the image. |
+| `--frame` | `0` | The frame number to render. |
+| `--props` | `undefined` | JSON string of input props. |
+
+---
+
+## `compositions`
+
+List all compositions registered in the entry file.
+
+```bash
+motionforge compositions
+```
+
+---
+
+## `studio`
+
+Start the MotionForge Studio development environment.
+
+```bash
+motionforge studio [options]
+```
+
+### Options
+
+| Option | Default | Description |
+| :--- | :--- | :--- |
+| `-p, --port` | `3123` | Port to run the studio on. |
diff --git a/docs/core-concepts/compositions.md b/docs/core-concepts/compositions.md
new file mode 100644
index 0000000..e4de5fd
--- /dev/null
+++ b/docs/core-concepts/compositions.md
@@ -0,0 +1,63 @@
+# Compositions
+
+Compositions are the building blocks of MotionForge videos. A composition defines the dimensions, frame rate, duration, and the root component of your video.
+
+## The `` Component
+
+Use the `` component to register a video.
+
+```tsx
+import { Composition } from 'motionforge';
+import { MyVideo } from './MyVideo';
+
+export const Root = () => {
+ return (
+
+ );
+};
+```
+
+### Props
+
+| Prop | Type | Default | Description |
+| :--- | :--- | :--- | :--- |
+| `id` | `string` | **Required** | A unique identifier for the composition. |
+| `component` | `React.ComponentType` | **Required** | The root React component to render. |
+| `durationInFrames` | `number` | **Required** | Total number of frames in the video. |
+| `fps` | `number` | `30` | Frames per second. |
+| `width` | `number` | `1920` | Width of the video in pixels. |
+| `height` | `number` | `1080` | Height of the video in pixels. |
+| `defaultProps` | `Record` | `{}` | Default props passed to the component. |
+| `inputProps` | `Record` | `{}` | Dynamic props that override defaults. |
+| `calculateMetadata` | `Function` | `undefined` | Async function to resolve metadata dynamically. |
+| `schema` | `ZodSchema` | `undefined` | Optional Zod schema for prop validation. |
+
+---
+
+## The `` Component
+
+A convenience component for rendering a single frame (e.g., for thumbnails).
+
+```tsx
+import { Still } from 'motionforge';
+
+
+```
+
+Equivalent to a `Composition` with `durationInFrames={1}` and `fps={1}`.
diff --git a/docs/data-and-async/delay-render.md b/docs/data-and-async/delay-render.md
new file mode 100644
index 0000000..3ebda04
--- /dev/null
+++ b/docs/data-and-async/delay-render.md
@@ -0,0 +1,52 @@
+# delayRender / continueRender
+
+MotionForge provides a synchronization protocol to handle async operations like data fetching or asset loading during the rendering process.
+
+## Why Use It?
+
+The renderer needs to know when a frame is "ready" to be captured. If your component fetches data from an API, the renderer might capture the frame before the data arrives, resulting in a blank or incomplete video.
+
+## Usage
+
+Use `delayRender()` to signal an async operation and `continueRender()` when it's done.
+
+```tsx
+import { useEffect, useState } from 'react';
+import { delayRender, continueRender, AbsoluteFill } from 'motionforge';
+
+export const MyAsyncComponent = () => {
+ const [data, setData] = useState(null);
+
+ useEffect(() => {
+ // 1. Signal that we're starting an async operation
+ const handle = delayRender('Fetching user data');
+
+ fetch('/api/user')
+ .then(res => res.json())
+ .then(json => {
+ setData(json);
+ // 2. Signal that the operation is complete
+ continueRender(handle);
+ })
+ .catch(err => {
+ console.error(err);
+ // 3. Always continue, even on error!
+ continueRender(handle);
+ });
+ }, []);
+
+ if (!data) return null;
+
+ return (
+
+ Hello, {data.name}!
+
+ );
+};
+```
+
+### Important Rules
+
+1. **Always call `continueRender`**: If you forget, the renderer will wait until the safety timeout (30 seconds) before failing.
+2. **Multiple calls**: You can call `delayRender` multiple times. The renderer will wait until **all** handles have been cleared via `continueRender`.
+3. **Outside of React**: These functions are standalone and can be used in utility functions or outside of components.
diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md
new file mode 100644
index 0000000..d8288ac
--- /dev/null
+++ b/docs/getting-started/installation.md
@@ -0,0 +1,58 @@
+# Installation
+
+To get started with MotionForge, you can either bootstrap a new project using our CLI or install the core library into an existing React/Next.js project.
+
+## 🚀 Bootstrap a New Project
+
+The easiest way to start is using `create-motionforge`:
+
+```bash
+npx create-motionforge@latest my-video
+```
+
+This will create a new directory `my-video` with a complete Next.js project structure, including:
+- Pre-configured `Composition.tsx`
+- Tailwind CSS 4 setup
+- MotionForge development server
+- Example animations
+
+## 📦 Manual Installation
+
+If you want to add MotionForge to an existing project:
+
+```bash
+npm install motionforge
+```
+
+### Peer Dependencies
+
+MotionForge requires the following peer dependencies:
+
+```bash
+npm install react react-dom three @react-three/fiber @react-three/drei framer-motion
+```
+
+### TypeScript Setup
+
+Make sure your `tsconfig.json` includes `react-jsx`:
+
+```json
+{
+ "compilerOptions": {
+ "jsx": "react-jsx"
+ }
+}
+```
+
+## 🎥 Production Rendering
+
+For server-side rendering, you'll also need the renderer:
+
+```bash
+npm install @motionforge/renderer
+```
+
+And ensure **FFmpeg** is installed on your system:
+- **macOS**: `brew install ffmpeg`
+- **Ubuntu**: `sudo apt install ffmpeg`
+- **Windows**: Download from [ffmpeg.org](https://ffmpeg.org/download.html)
diff --git a/landing-page.png b/landing-page.png
index e302cc4..1b1c28d 100644
Binary files a/landing-page.png and b/landing-page.png differ
diff --git a/package.json b/package.json
index 12d63f0..8e42346 100755
--- a/package.json
+++ b/package.json
@@ -20,74 +20,74 @@
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
- "@hookform/resolvers": "^5.1.1",
- "@mdxeditor/editor": "^3.39.1",
- "@prisma/client": "^6.11.1",
- "@radix-ui/react-accordion": "^1.2.11",
- "@radix-ui/react-alert-dialog": "^1.1.14",
- "@radix-ui/react-aspect-ratio": "^1.1.7",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-checkbox": "^1.3.2",
- "@radix-ui/react-collapsible": "^1.1.11",
- "@radix-ui/react-context-menu": "^2.2.15",
- "@radix-ui/react-dialog": "^1.1.14",
- "@radix-ui/react-dropdown-menu": "^2.1.15",
- "@radix-ui/react-hover-card": "^1.1.14",
- "@radix-ui/react-label": "^2.1.7",
- "@radix-ui/react-menubar": "^1.1.15",
- "@radix-ui/react-navigation-menu": "^1.2.13",
- "@radix-ui/react-popover": "^1.1.14",
- "@radix-ui/react-progress": "^1.1.7",
- "@radix-ui/react-radio-group": "^1.3.7",
- "@radix-ui/react-scroll-area": "^1.2.9",
- "@radix-ui/react-select": "^2.2.5",
- "@radix-ui/react-separator": "^1.1.7",
- "@radix-ui/react-slider": "^1.3.5",
- "@radix-ui/react-slot": "^1.2.3",
- "@radix-ui/react-switch": "^1.2.5",
- "@radix-ui/react-tabs": "^1.1.12",
- "@radix-ui/react-toast": "^1.2.14",
- "@radix-ui/react-toggle": "^1.1.9",
- "@radix-ui/react-toggle-group": "^1.1.10",
- "@radix-ui/react-tooltip": "^1.2.7",
+ "@hookform/resolvers": "^5.4.0",
+ "@mdxeditor/editor": "^4.0.1",
+ "@prisma/client": "^7.8.0",
+ "@radix-ui/react-accordion": "^1.2.12",
+ "@radix-ui/react-alert-dialog": "^1.1.15",
+ "@radix-ui/react-aspect-ratio": "^1.1.8",
+ "@radix-ui/react-avatar": "^1.1.11",
+ "@radix-ui/react-checkbox": "^1.3.3",
+ "@radix-ui/react-collapsible": "^1.1.12",
+ "@radix-ui/react-context-menu": "^2.2.16",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@radix-ui/react-hover-card": "^1.1.15",
+ "@radix-ui/react-label": "^2.1.8",
+ "@radix-ui/react-menubar": "^1.1.16",
+ "@radix-ui/react-navigation-menu": "^1.2.14",
+ "@radix-ui/react-popover": "^1.1.15",
+ "@radix-ui/react-progress": "^1.1.8",
+ "@radix-ui/react-radio-group": "^1.3.8",
+ "@radix-ui/react-scroll-area": "^1.2.10",
+ "@radix-ui/react-select": "^2.2.6",
+ "@radix-ui/react-separator": "^1.1.8",
+ "@radix-ui/react-slider": "^1.3.6",
+ "@radix-ui/react-slot": "^1.2.4",
+ "@radix-ui/react-switch": "^1.2.6",
+ "@radix-ui/react-tabs": "^1.1.13",
+ "@radix-ui/react-toast": "^1.2.15",
+ "@radix-ui/react-toggle": "^1.1.10",
+ "@radix-ui/react-toggle-group": "^1.1.11",
+ "@radix-ui/react-tooltip": "^1.2.8",
"@react-three/drei": "^10.7.7",
"@react-three/fiber": "^9.6.1",
- "@reactuses/core": "^6.0.5",
- "@tanstack/react-query": "^5.82.0",
+ "@reactuses/core": "^6.3.2",
+ "@tanstack/react-query": "^5.100.14",
"@tanstack/react-table": "^8.21.3",
"@types/three": "^0.184.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
- "date-fns": "^4.1.0",
+ "date-fns": "^4.4.0",
"embla-carousel-react": "^8.6.0",
"framer-motion": "^12.40.0",
"input-otp": "^1.4.2",
"lottie-web": "^5.13.0",
"lucide-react": "^1.17.0",
- "next": "^16.1.1",
- "next-auth": "^4.24.11",
- "next-intl": "^4.3.4",
+ "next": "^16.2.7",
+ "next-auth": "^4.24.14",
+ "next-intl": "^4.13.0",
"next-themes": "^0.4.6",
- "prisma": "^6.11.1",
- "react": "^19.0.0",
- "react-day-picker": "^9.8.0",
- "react-dom": "^19.0.0",
- "react-hook-form": "^7.60.0",
+ "prisma": "^7.8.0",
+ "react": "^19.2.7",
+ "react-day-picker": "^10.0.1",
+ "react-dom": "^19.2.7",
+ "react-hook-form": "^7.77.0",
"react-markdown": "^10.1.0",
- "react-resizable-panels": "^3.0.3",
- "react-syntax-highlighter": "^15.6.1",
- "recharts": "^2.15.4",
- "sharp": "^0.34.3",
- "sonner": "^2.0.6",
- "tailwind-merge": "^3.3.1",
+ "react-resizable-panels": "^4.11.2",
+ "react-syntax-highlighter": "^16.1.1",
+ "recharts": "^3.8.1",
+ "sharp": "^0.34.5",
+ "sonner": "^2.0.7",
+ "tailwind-merge": "^3.6.0",
"tailwindcss-animate": "^1.0.7",
"three": "^0.184.0",
- "uuid": "^11.1.0",
+ "uuid": "^14.0.0",
"vaul": "^1.1.2",
- "z-ai-web-dev-sdk": "^0.0.16",
- "zod": "^4.0.2",
- "zustand": "^5.0.6"
+ "z-ai-web-dev-sdk": "^0.0.18",
+ "zod": "^4.4.3",
+ "zustand": "^5.0.14"
},
"devDependencies": {
"@playwright/browser-chromium": "^1.60.0",
@@ -95,11 +95,11 @@
"@tailwindcss/postcss": "^4",
"@types/react": "^19",
"@types/react-dom": "^19",
- "bun-types": "^1.3.4",
- "eslint": "^9",
- "eslint-config-next": "^16.1.1",
+ "bun-types": "^1.3.14",
+ "eslint": "^10",
+ "eslint-config-next": "^16.2.7",
"tailwindcss": "^4",
- "tw-animate-css": "^1.3.5",
- "typescript": "^5"
+ "tw-animate-css": "^1.4.0",
+ "typescript": "^6"
}
}
diff --git a/packages/create-motionforge/bun.lock b/packages/create-motionforge/bun.lock
index 8ddcdf4..e4afb4a 100644
--- a/packages/create-motionforge/bun.lock
+++ b/packages/create-motionforge/bun.lock
@@ -5,73 +5,75 @@
"name": "create-motionforge",
"dependencies": {
"chalk": "^5.6.2",
- "commander": "^14.0.3",
- "fs-extra": "^11.3.3",
- "inquirer": "^13.2.2",
- "ora": "8.0.1",
+ "commander": "^15.0.0",
+ "fs-extra": "^11.3.5",
+ "inquirer": "^14.0.2",
+ "ora": "9.4.0",
},
},
},
"packages": {
- "@inquirer/ansi": ["@inquirer/ansi@2.0.3", "", {}, "sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw=="],
+ "@inquirer/ansi": ["@inquirer/ansi@2.0.7", "", {}, "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q=="],
- "@inquirer/checkbox": ["@inquirer/checkbox@5.0.4", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.1", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-DrAMU3YBGMUAp6ArwTIp/25CNDtDbxk7UjIrrtM25JVVrlVYlVzHh5HR1BDFu9JMyUoZ4ZanzeaHqNDttf3gVg=="],
+ "@inquirer/checkbox": ["@inquirer/checkbox@5.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw=="],
- "@inquirer/confirm": ["@inquirer/confirm@6.0.4", "", { "dependencies": { "@inquirer/core": "^11.1.1", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-WdaPe7foUnoGYvXzH4jp4wH/3l+dBhZ3uwhKjXjwdrq5tEIFaANxj6zrGHxLdsIA0yKM0kFPVcEalOZXBB5ISA=="],
+ "@inquirer/confirm": ["@inquirer/confirm@6.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ=="],
- "@inquirer/core": ["@inquirer/core@11.1.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^9.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-hV9o15UxX46OyQAtaoMqAOxGR8RVl1aZtDx1jHbCtSJy1tBdTfKxLPKf7utsE4cRy4tcmCQ4+vdV+ca+oNxqNA=="],
+ "@inquirer/core": ["@inquirer/core@11.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA=="],
- "@inquirer/editor": ["@inquirer/editor@5.0.4", "", { "dependencies": { "@inquirer/core": "^11.1.1", "@inquirer/external-editor": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QI3Jfqcv6UO2/VJaEFONH8Im1ll++Xn/AJTBn9Xf+qx2M+H8KZAdQ5sAe2vtYlo+mLW+d7JaMJB4qWtK4BG3pw=="],
+ "@inquirer/editor": ["@inquirer/editor@5.2.2", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/external-editor": "^3.0.3", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg=="],
- "@inquirer/expand": ["@inquirer/expand@5.0.4", "", { "dependencies": { "@inquirer/core": "^11.1.1", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-0I/16YwPPP0Co7a5MsomlZLpch48NzYfToyqYAOWtBmaXSB80RiNQ1J+0xx2eG+Wfxt0nHtpEWSRr6CzNVnOGg=="],
+ "@inquirer/expand": ["@inquirer/expand@5.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g=="],
- "@inquirer/external-editor": ["@inquirer/external-editor@2.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w=="],
+ "@inquirer/external-editor": ["@inquirer/external-editor@3.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA=="],
- "@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="],
+ "@inquirer/figures": ["@inquirer/figures@2.0.7", "", {}, "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw=="],
- "@inquirer/input": ["@inquirer/input@5.0.4", "", { "dependencies": { "@inquirer/core": "^11.1.1", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-4B3s3jvTREDFvXWit92Yc6jF1RJMDy2VpSqKtm4We2oVU65YOh2szY5/G14h4fHlyQdpUmazU5MPCFZPRJ0AOw=="],
+ "@inquirer/input": ["@inquirer/input@5.1.2", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg=="],
- "@inquirer/number": ["@inquirer/number@4.0.4", "", { "dependencies": { "@inquirer/core": "^11.1.1", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-CmMp9LF5HwE+G/xWsC333TlCzYYbXMkcADkKzcawh49fg2a1ryLc7JL1NJYYt1lJ+8f4slikNjJM9TEL/AljYQ=="],
+ "@inquirer/number": ["@inquirer/number@4.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA=="],
- "@inquirer/password": ["@inquirer/password@5.0.4", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.1", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ZCEPyVYvHK4W4p2Gy6sTp9nqsdHQCfiPXIP9LbJVW4yCinnxL/dDDmPaEZVysGrj8vxVReRnpfS2fOeODe9zjg=="],
+ "@inquirer/password": ["@inquirer/password@5.1.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg=="],
- "@inquirer/prompts": ["@inquirer/prompts@8.2.0", "", { "dependencies": { "@inquirer/checkbox": "^5.0.4", "@inquirer/confirm": "^6.0.4", "@inquirer/editor": "^5.0.4", "@inquirer/expand": "^5.0.4", "@inquirer/input": "^5.0.4", "@inquirer/number": "^4.0.4", "@inquirer/password": "^5.0.4", "@inquirer/rawlist": "^5.2.0", "@inquirer/search": "^4.1.0", "@inquirer/select": "^5.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-rqTzOprAj55a27jctS3vhvDDJzYXsr33WXTjODgVOru21NvBo9yIgLIAf7SBdSV0WERVly3dR6TWyp7ZHkvKFA=="],
+ "@inquirer/prompts": ["@inquirer/prompts@8.5.2", "", { "dependencies": { "@inquirer/checkbox": "^5.2.1", "@inquirer/confirm": "^6.1.1", "@inquirer/editor": "^5.2.2", "@inquirer/expand": "^5.1.1", "@inquirer/input": "^5.1.2", "@inquirer/number": "^4.1.1", "@inquirer/password": "^5.1.1", "@inquirer/rawlist": "^5.3.1", "@inquirer/search": "^4.2.1", "@inquirer/select": "^5.2.1" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g=="],
- "@inquirer/rawlist": ["@inquirer/rawlist@5.2.0", "", { "dependencies": { "@inquirer/core": "^11.1.1", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-CciqGoOUMrFo6HxvOtU5uL8fkjCmzyeB6fG7O1vdVAZVSopUBYECOwevDBlqNLyyYmzpm2Gsn/7nLrpruy9RFg=="],
+ "@inquirer/rawlist": ["@inquirer/rawlist@5.3.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og=="],
- "@inquirer/search": ["@inquirer/search@4.1.0", "", { "dependencies": { "@inquirer/core": "^11.1.1", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-EAzemfiP4IFvIuWnrHpgZs9lAhWDA0GM3l9F4t4mTQ22IFtzfrk8xbkMLcAN7gmVML9O/i+Hzu8yOUyAaL6BKA=="],
+ "@inquirer/search": ["@inquirer/search@4.2.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g=="],
- "@inquirer/select": ["@inquirer/select@5.0.4", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.1", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-s8KoGpPYMEQ6WXc0dT9blX2NtIulMdLOO3LA1UKOiv7KFWzlJ6eLkEYTDBIi+JkyKXyn8t/CD6TinxGjyLt57g=="],
+ "@inquirer/select": ["@inquirer/select@5.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw=="],
- "@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="],
+ "@inquirer/type": ["@inquirer/type@4.0.7", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g=="],
"ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
- "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
-
"chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
"chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
- "cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="],
+ "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
- "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],
+ "cli-spinners": ["cli-spinners@3.4.0", "", {}, "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw=="],
"cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
- "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
+ "commander": ["commander@15.0.0", "", {}, "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg=="],
+
+ "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="],
- "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+ "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="],
- "fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="],
+ "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="],
- "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
+ "fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
+
+ "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
"iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
- "inquirer": ["inquirer@13.2.2", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.1", "@inquirer/prompts": "^8.2.0", "@inquirer/type": "^4.0.3", "mute-stream": "^3.0.0", "run-async": "^4.0.6", "rxjs": "^7.8.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-+hlN8I88JE9T3zjWHGnMhryniRDbSgFNJHJTyD2iKO5YNpMRyfghQ6wVoe+gV4ygMM4r4GzlsBxNa1g/UUZixA=="],
+ "inquirer": ["inquirer@14.0.2", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/prompts": "^8.5.2", "@inquirer/type": "^4.0.7", "mute-stream": "^3.0.0", "run-async": "^4.0.6" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-VsSx1JneSNp3ld1veMTLe+UDcUD8Tw2/jjOthhkX3/IX2q+xHhVELifeb/hsb1fBw31pabEPNUf/xUOyb+KZjA=="],
"is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
@@ -79,40 +81,32 @@
"jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
- "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="],
+ "log-symbols": ["log-symbols@7.0.1", "", { "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" } }, "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg=="],
- "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
+ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
"mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="],
- "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
+ "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
- "ora": ["ora@8.0.1", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ=="],
+ "ora": ["ora@9.4.0", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.3.2", "string-width": "^8.1.0" } }, "sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ=="],
- "restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="],
+ "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
"run-async": ["run-async@4.0.6", "", {}, "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ=="],
- "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
-
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
- "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="],
+ "stdin-discarder": ["stdin-discarder@0.3.2", "", {}, "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A=="],
- "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+ "string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="],
"strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
- "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
-
"universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
- "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
-
- "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
-
- "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
}
}
diff --git a/packages/create-motionforge/package.json b/packages/create-motionforge/package.json
index 499afd7..2056622 100644
--- a/packages/create-motionforge/package.json
+++ b/packages/create-motionforge/package.json
@@ -30,10 +30,10 @@
},
"dependencies": {
"chalk": "^5.6.2",
- "commander": "^14.0.3",
- "fs-extra": "^11.3.3",
- "inquirer": "^13.2.2",
- "ora": "8.0.1"
+ "commander": "^15.0.0",
+ "fs-extra": "^11.3.5",
+ "inquirer": "^14.0.2",
+ "ora": "9.4.0"
},
"publishConfig": {
"access": "public",
diff --git a/packages/motionforge-bundler/bun.lock b/packages/motionforge-bundler/bun.lock
new file mode 100644
index 0000000..7b8f2bb
--- /dev/null
+++ b/packages/motionforge-bundler/bun.lock
@@ -0,0 +1,465 @@
+{
+ "lockfileVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "@motionforge/bundler",
+ "dependencies": {
+ "css-loader": "^7.1.4",
+ "esbuild-loader": "^4.4.3",
+ "style-loader": "^4.0.0",
+ "webpack": "^5.107.2",
+ "webpack-dev-middleware": "^8.0.3",
+ "webpack-hot-middleware": "^2.26.1",
+ },
+ "devDependencies": {
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3",
+ },
+ },
+ },
+ "packages": {
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@jsonjoy.com/base64": ["@jsonjoy.com/base64@1.1.2", "", { "peerDependencies": { "tslib": "2" } }, "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA=="],
+
+ "@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw=="],
+
+ "@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@1.0.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g=="],
+
+ "@jsonjoy.com/fs-core": ["@jsonjoy.com/fs-core@4.57.3", "", { "dependencies": { "@jsonjoy.com/fs-node-builtins": "4.57.3", "@jsonjoy.com/fs-node-utils": "4.57.3", "thingies": "^2.5.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-IvO50vkGydDZwS1e9rz/JXEtCCt9XvqxoGI6FlrVIvVm4/HpygMKW4ETtREWtMTsN5CLJ9FR6GuCduoQPZLBiw=="],
+
+ "@jsonjoy.com/fs-fsa": ["@jsonjoy.com/fs-fsa@4.57.3", "", { "dependencies": { "@jsonjoy.com/fs-core": "4.57.3", "@jsonjoy.com/fs-node-builtins": "4.57.3", "@jsonjoy.com/fs-node-utils": "4.57.3", "thingies": "^2.5.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-JlIDGUWPl7Y6zl+/ISnZuh8z2aMr/xoR66D18zlaVAuL192CvlNJEzOlzp27x4P52HRtDnCSOk6f59vTsmp5vw=="],
+
+ "@jsonjoy.com/fs-node": ["@jsonjoy.com/fs-node@4.57.3", "", { "dependencies": { "@jsonjoy.com/fs-core": "4.57.3", "@jsonjoy.com/fs-node-builtins": "4.57.3", "@jsonjoy.com/fs-node-utils": "4.57.3", "@jsonjoy.com/fs-print": "4.57.3", "@jsonjoy.com/fs-snapshot": "4.57.3", "glob-to-regex.js": "^1.0.0", "thingies": "^2.5.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-089gZoKvbeOsT2jeBaVKSz91oFXQWFG7a62sMY6gVMHnoWbyGzTb6OVUP/V7G3wLQLJ555BEsHt8SD1nj1dgaQ=="],
+
+ "@jsonjoy.com/fs-node-builtins": ["@jsonjoy.com/fs-node-builtins@4.57.3", "", { "peerDependencies": { "tslib": "2" } }, "sha512-JAI3PqNuY8BR7ovy4h0bADLrqJLIcUauONNZfyTxUnj3Wf3tpTYe39eJ6z7FzYyA+tdMt33VpiQQUikGr3QOBw=="],
+
+ "@jsonjoy.com/fs-node-to-fsa": ["@jsonjoy.com/fs-node-to-fsa@4.57.3", "", { "dependencies": { "@jsonjoy.com/fs-fsa": "4.57.3", "@jsonjoy.com/fs-node-builtins": "4.57.3", "@jsonjoy.com/fs-node-utils": "4.57.3" }, "peerDependencies": { "tslib": "2" } }, "sha512-uZGxyC0zDmcmW5bfHd4YivAZ54BLlbF9G0K5rBaksI/tZdJSGM7/AC+1TY7yvFu0Wc6gUHR7mFwf6SbQ3J1BTQ=="],
+
+ "@jsonjoy.com/fs-node-utils": ["@jsonjoy.com/fs-node-utils@4.57.3", "", { "dependencies": { "@jsonjoy.com/fs-node-builtins": "4.57.3" }, "peerDependencies": { "tslib": "2" } }, "sha512-quCil8AvfcOxob4pn0drGdcQWpkPVgkt9q1+EjeyXXT40/L3l5lvYrr6hR8LmHu0eg+DNNaUwqjLT6Hr7V4sdQ=="],
+
+ "@jsonjoy.com/fs-print": ["@jsonjoy.com/fs-print@4.57.3", "", { "dependencies": { "@jsonjoy.com/fs-node-utils": "4.57.3", "tree-dump": "^1.1.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-ITwaLZpGIqD9jHndwMvDFZDIvbVzGRsJZDQ5HKln0vyMculu1c1nb7zbEBgY8BVSBZ9S2xO138OWIBGeRsrF3Q=="],
+
+ "@jsonjoy.com/fs-snapshot": ["@jsonjoy.com/fs-snapshot@4.57.3", "", { "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", "@jsonjoy.com/fs-node-utils": "4.57.3", "@jsonjoy.com/json-pack": "^17.65.0", "@jsonjoy.com/util": "^17.65.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-wdNaG2DxCtvj9lKldAnEV3ycYPEpk+p2cP2lHD1qdxkoQGlWUtQverqvG9KZSkm6BHFha4PP6XRZbpARNfHRxA=="],
+
+ "@jsonjoy.com/json-pack": ["@jsonjoy.com/json-pack@1.21.0", "", { "dependencies": { "@jsonjoy.com/base64": "^1.1.2", "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", "thingies": "^2.5.0", "tree-dump": "^1.1.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg=="],
+
+ "@jsonjoy.com/json-pointer": ["@jsonjoy.com/json-pointer@1.0.2", "", { "dependencies": { "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/util": "^1.9.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg=="],
+
+ "@jsonjoy.com/util": ["@jsonjoy.com/util@1.9.0", "", { "dependencies": { "@jsonjoy.com/buffers": "^1.0.0", "@jsonjoy.com/codegen": "^1.0.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.61.0", "", { "os": "android", "cpu": "arm" }, "sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.61.0", "", { "os": "android", "cpu": "arm64" }, "sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.61.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.61.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.61.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.61.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.61.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.61.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.61.0", "", { "os": "none", "cpu": "arm64" }, "sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.61.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.61.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw=="],
+
+ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="],
+
+ "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="],
+
+ "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="],
+
+ "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="],
+
+ "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="],
+
+ "@webassemblyjs/helper-numbers": ["@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" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="],
+
+ "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="],
+
+ "@webassemblyjs/helper-wasm-section": ["@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" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="],
+
+ "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="],
+
+ "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="],
+
+ "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="],
+
+ "@webassemblyjs/wasm-edit": ["@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" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="],
+
+ "@webassemblyjs/wasm-gen": ["@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" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="],
+
+ "@webassemblyjs/wasm-opt": ["@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" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="],
+
+ "@webassemblyjs/wasm-parser": ["@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" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="],
+
+ "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="],
+
+ "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="],
+
+ "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="],
+
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
+
+ "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="],
+
+ "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
+
+ "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="],
+
+ "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="],
+
+ "ansi-html-community": ["ansi-html-community@0.0.8", "", { "bin": { "ansi-html": "bin/ansi-html" } }, "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw=="],
+
+ "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.33", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw=="],
+
+ "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="],
+
+ "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="],
+
+ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
+
+ "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
+
+ "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
+
+ "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="],
+
+ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+ "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="],
+
+ "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
+
+ "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
+
+ "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
+
+ "css-loader": ["css-loader@7.1.4", "", { "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.40", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.6.3" }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "webpack": "^5.27.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw=="],
+
+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
+
+ "electron-to-chromium": ["electron-to-chromium@1.5.364", "", {}, "sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw=="],
+
+ "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="],
+
+ "enhanced-resolve": ["enhanced-resolve@5.22.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww=="],
+
+ "es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="],
+
+ "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
+
+ "esbuild-loader": ["esbuild-loader@4.4.3", "", { "dependencies": { "esbuild": "^0.27.1", "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^3.3.4" }, "peerDependencies": { "webpack": "^4.40.0 || ^5.0.0" } }, "sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg=="],
+
+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
+
+ "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
+ "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
+
+ "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="],
+
+ "glob-to-regex.js": ["glob-to-regex.js@1.2.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ=="],
+
+ "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="],
+
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="],
+
+ "hyperdyperid": ["hyperdyperid@1.2.0", "", {}, "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A=="],
+
+ "icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="],
+
+ "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="],
+
+ "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
+
+ "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
+
+ "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
+
+ "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="],
+
+ "loader-runner": ["loader-runner@4.3.2", "", {}, "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w=="],
+
+ "loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "memfs": ["memfs@4.57.3", "", { "dependencies": { "@jsonjoy.com/fs-core": "4.57.3", "@jsonjoy.com/fs-fsa": "4.57.3", "@jsonjoy.com/fs-node": "4.57.3", "@jsonjoy.com/fs-node-builtins": "4.57.3", "@jsonjoy.com/fs-node-to-fsa": "4.57.3", "@jsonjoy.com/fs-node-utils": "4.57.3", "@jsonjoy.com/fs-print": "4.57.3", "@jsonjoy.com/fs-snapshot": "4.57.3", "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", "thingies": "^2.5.0", "tree-dump": "^1.0.3", "tslib": "^2.0.0" } }, "sha512-dlvqataP1zUOlfj6pv9wgCSC5pRIooNntXgdLfR7FWlcKi1p8fMfJADtHp/+8Dhu5JFvMHNh7L0QVcuaaBKqqA=="],
+
+ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
+
+ "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
+
+ "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
+
+ "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
+
+ "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="],
+
+ "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],
+
+ "node-releases": ["node-releases@2.0.46", "", {}, "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ=="],
+
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
+
+ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
+
+ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
+
+ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
+
+ "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="],
+
+ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
+
+ "postcss-modules-extract-imports": ["postcss-modules-extract-imports@3.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q=="],
+
+ "postcss-modules-local-by-default": ["postcss-modules-local-by-default@4.2.0", "", { "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw=="],
+
+ "postcss-modules-scope": ["postcss-modules-scope@3.2.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA=="],
+
+ "postcss-modules-values": ["postcss-modules-values@4.0.0", "", { "dependencies": { "icss-utils": "^5.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ=="],
+
+ "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
+
+ "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
+
+ "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
+
+ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
+ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
+
+ "rollup": ["rollup@4.61.0", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.61.0", "@rollup/rollup-android-arm64": "4.61.0", "@rollup/rollup-darwin-arm64": "4.61.0", "@rollup/rollup-darwin-x64": "4.61.0", "@rollup/rollup-freebsd-arm64": "4.61.0", "@rollup/rollup-freebsd-x64": "4.61.0", "@rollup/rollup-linux-arm-gnueabihf": "4.61.0", "@rollup/rollup-linux-arm-musleabihf": "4.61.0", "@rollup/rollup-linux-arm64-gnu": "4.61.0", "@rollup/rollup-linux-arm64-musl": "4.61.0", "@rollup/rollup-linux-loong64-gnu": "4.61.0", "@rollup/rollup-linux-loong64-musl": "4.61.0", "@rollup/rollup-linux-ppc64-gnu": "4.61.0", "@rollup/rollup-linux-ppc64-musl": "4.61.0", "@rollup/rollup-linux-riscv64-gnu": "4.61.0", "@rollup/rollup-linux-riscv64-musl": "4.61.0", "@rollup/rollup-linux-s390x-gnu": "4.61.0", "@rollup/rollup-linux-x64-gnu": "4.61.0", "@rollup/rollup-linux-x64-musl": "4.61.0", "@rollup/rollup-openbsd-x64": "4.61.0", "@rollup/rollup-openharmony-arm64": "4.61.0", "@rollup/rollup-win32-arm64-msvc": "4.61.0", "@rollup/rollup-win32-ia32-msvc": "4.61.0", "@rollup/rollup-win32-x64-gnu": "4.61.0", "@rollup/rollup-win32-x64-msvc": "4.61.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g=="],
+
+ "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="],
+
+ "semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="],
+
+ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
+
+ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "style-loader": ["style-loader@4.0.0", "", { "peerDependencies": { "webpack": "^5.27.0" } }, "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA=="],
+
+ "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
+
+ "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
+
+ "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
+
+ "terser": ["terser@5.48.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q=="],
+
+ "terser-webpack-plugin": ["terser-webpack-plugin@5.6.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ=="],
+
+ "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
+
+ "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+
+ "thingies": ["thingies@2.6.0", "", { "peerDependencies": { "tslib": "^2" } }, "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg=="],
+
+ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
+
+ "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
+
+ "tree-dump": ["tree-dump@1.1.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA=="],
+
+ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+
+ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="],
+
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
+
+ "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
+
+ "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="],
+
+ "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
+
+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+ "watchpack": ["watchpack@2.5.1", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg=="],
+
+ "webpack": ["webpack@5.107.2", "", { "dependencies": { "@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.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.22.0", "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "loader-runner": "^4.3.2", "mime-db": "^1.54.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.5.0", "watchpack": "^2.5.1", "webpack-sources": "^3.5.0" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ=="],
+
+ "webpack-dev-middleware": ["webpack-dev-middleware@8.0.3", "", { "dependencies": { "memfs": "^4.56.10", "mime-types": "^3.0.2", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.3.3" }, "peerDependencies": { "webpack": "^5.101.0" }, "optionalPeers": ["webpack"] }, "sha512-zWrde9VZDiRaFuWsjHO40wm9LxxtXEk8DdzFXdU7eU5ZpiANnZZDBbZgN3guxbEoKqUHd9YupBmynyioz42nkA=="],
+
+ "webpack-hot-middleware": ["webpack-hot-middleware@2.26.1", "", { "dependencies": { "ansi-html-community": "0.0.8", "html-entities": "^2.1.0", "strip-ansi": "^6.0.0" } }, "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A=="],
+
+ "webpack-sources": ["webpack-sources@3.5.0", "", {}, "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ=="],
+
+ "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack": ["@jsonjoy.com/json-pack@17.67.0", "", { "dependencies": { "@jsonjoy.com/base64": "17.67.0", "@jsonjoy.com/buffers": "17.67.0", "@jsonjoy.com/codegen": "17.67.0", "@jsonjoy.com/json-pointer": "17.67.0", "@jsonjoy.com/util": "17.67.0", "hyperdyperid": "^1.2.0", "thingies": "^2.5.0", "tree-dump": "^1.1.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w=="],
+
+ "@jsonjoy.com/fs-snapshot/@jsonjoy.com/util": ["@jsonjoy.com/util@17.67.0", "", { "dependencies": { "@jsonjoy.com/buffers": "17.67.0", "@jsonjoy.com/codegen": "17.67.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew=="],
+
+ "@jsonjoy.com/json-pack/@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@1.2.1", "", { "peerDependencies": { "tslib": "2" } }, "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA=="],
+
+ "@jsonjoy.com/util/@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@1.2.1", "", { "peerDependencies": { "tslib": "2" } }, "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA=="],
+
+ "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
+
+ "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack/@jsonjoy.com/base64": ["@jsonjoy.com/base64@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw=="],
+
+ "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack/@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q=="],
+
+ "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack/@jsonjoy.com/json-pointer": ["@jsonjoy.com/json-pointer@17.67.0", "", { "dependencies": { "@jsonjoy.com/util": "17.67.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA=="],
+
+ "@jsonjoy.com/fs-snapshot/@jsonjoy.com/util/@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q=="],
+ }
+}
diff --git a/packages/motionforge-bundler/package.json b/packages/motionforge-bundler/package.json
new file mode 100644
index 0000000..261b844
--- /dev/null
+++ b/packages/motionforge-bundler/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "@motionforge/bundler",
+ "version": "1.0.0",
+ "description": "Project bundler for MotionForge",
+ "type": "module",
+ "scripts": {
+ "build": "tsup",
+ "dev": "tsup --watch"
+ },
+ "dependencies": {
+ "webpack": "^5.107.2",
+ "webpack-dev-middleware": "^8.0.3",
+ "webpack-hot-middleware": "^2.26.1",
+ "esbuild-loader": "^4.4.3",
+ "css-loader": "^7.1.4",
+ "style-loader": "^4.0.0"
+ },
+ "devDependencies": {
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3"
+ },
+ "publishConfig": {
+ "access": "public",
+ "registry": "https://registry.npmjs.org"
+ }
+}
diff --git a/packages/motionforge-bundler/src/bundle.ts b/packages/motionforge-bundler/src/bundle.ts
new file mode 100644
index 0000000..e1ca8f7
--- /dev/null
+++ b/packages/motionforge-bundler/src/bundle.ts
@@ -0,0 +1,43 @@
+import webpack from 'webpack';
+import { webpackConfig } from './webpack-config.js';
+import * as fs from 'fs';
+import * as path from 'path';
+
+export interface BundleOptions {
+ entry: string;
+ outDir: string;
+ dev?: boolean;
+}
+
+export async function bundle(options: BundleOptions): Promise {
+ const config = webpackConfig({
+ entry: options.entry,
+ outDir: options.outDir,
+ dev: options.dev ?? false,
+ });
+
+ const compiler = webpack(config);
+
+ return new Promise((resolve, reject) => {
+ compiler.run((err, stats) => {
+ if (err) {
+ reject(err);
+ return;
+ }
+
+ if (stats?.hasErrors()) {
+ const info = stats.toJson();
+ reject(new Error(info.errors?.[0].message));
+ return;
+ }
+
+ compiler.close((closeErr) => {
+ if (closeErr) {
+ reject(closeErr);
+ } else {
+ resolve();
+ }
+ });
+ });
+ });
+}
diff --git a/packages/motionforge-bundler/src/index.ts b/packages/motionforge-bundler/src/index.ts
new file mode 100644
index 0000000..e2f1983
--- /dev/null
+++ b/packages/motionforge-bundler/src/index.ts
@@ -0,0 +1,2 @@
+export { bundle, type BundleOptions } from './bundle.js';
+export { webpackConfig, type WebpackConfigOptions } from './webpack-config.js';
diff --git a/packages/motionforge-bundler/src/webpack-config.ts b/packages/motionforge-bundler/src/webpack-config.ts
new file mode 100644
index 0000000..cdb6ed5
--- /dev/null
+++ b/packages/motionforge-bundler/src/webpack-config.ts
@@ -0,0 +1,67 @@
+import webpack, { type Configuration } from 'webpack';
+import path from 'path';
+
+export interface WebpackConfigOptions {
+ entry: string;
+ outDir: string;
+ dev: boolean;
+ enableReactRefresh?: boolean;
+}
+
+export function webpackConfig(options: WebpackConfigOptions): Configuration {
+ const isDev = options.dev;
+
+ return {
+ mode: isDev ? 'development' : 'production',
+ entry: isDev ? [
+ 'webpack-hot-middleware/client',
+ options.entry,
+ ] : [options.entry],
+
+ output: {
+ path: options.outDir,
+ filename: 'bundle.js',
+ publicPath: '/',
+ },
+
+ module: {
+ rules: [
+ {
+ test: /\.[jt]sx?$/,
+ exclude: /node_modules/,
+ use: {
+ loader: 'esbuild-loader',
+ options: { jsx: 'automatic', target: 'es2020' },
+ },
+ },
+ {
+ test: /\.css$/,
+ use: ['style-loader', 'css-loader'],
+ },
+ {
+ test: /\.(png|jpe?g|gif|svg|webp)$/,
+ type: 'asset/resource',
+ },
+ ],
+ },
+
+ resolve: {
+ extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
+ },
+
+ plugins: [
+ ...(isDev ? [
+ new webpack.HotModuleReplacementPlugin(),
+ ] : []),
+ new webpack.DefinePlugin({
+ 'process.env.NODE_ENV': JSON.stringify(isDev ? 'development' : 'production'),
+ }),
+ ],
+
+ devtool: isDev ? 'eval-cheap-module-source-map' : 'source-map',
+
+ optimization: {
+ minimize: !isDev,
+ },
+ };
+}
diff --git a/packages/motionforge-bundler/tsup.config.ts b/packages/motionforge-bundler/tsup.config.ts
new file mode 100644
index 0000000..a5e42a2
--- /dev/null
+++ b/packages/motionforge-bundler/tsup.config.ts
@@ -0,0 +1,9 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['esm', 'cjs'],
+ dts: false,
+ clean: true,
+ minify: true,
+});
diff --git a/packages/motionforge-cli/bin/motionforge.js b/packages/motionforge-cli/bin/motionforge.js
new file mode 100644
index 0000000..b663fc2
--- /dev/null
+++ b/packages/motionforge-cli/bin/motionforge.js
@@ -0,0 +1,45 @@
+#!/usr/bin/env node
+import { program } from 'commander';
+import { renderCommand } from '../dist/commands/render.js';
+
+program
+ .name('motionforge')
+ .description('MotionForge CLI — Programmatic video rendering')
+ .version('1.0.0');
+
+program
+ .command('render ')
+ .description('Render a video composition')
+ .option('-o, --output ', 'Output file path', 'output.mp4')
+ .option('--codec ', 'Video codec (h264, h265, vp8, vp9, prores, gif)', 'h264')
+ .option('--fps ', 'Frame rate', '30')
+ .option('--width ', 'Width', '1920')
+ .option('--height ', 'Height', '1080')
+ .option('--duration ', 'Duration in frames', '300')
+ .option('--props ', 'Input props as JSON string')
+ .option('--concurrency ', 'Number of concurrent pages', '4')
+ .option('--frame-range ', 'Frame range (e.g., "0-29")')
+ .option('--crf ', 'CRF quality value')
+ .option('--quality ', 'Quality preset (low, medium, high)', 'medium')
+ .action(async (entry, compositionId, opts) => {
+ await renderCommand({ entry, compositionId, ...opts });
+ });
+
+program
+ .command('studio ')
+ .description('Start MotionForge Studio development environment')
+ .option('-p, --port ', 'Port number', '3123')
+ .action(async (entry, opts) => {
+ const { studioCommand } = await import('../dist/commands/studio.cjs');
+ await studioCommand({ entry, ...opts });
+ });
+
+program
+ .command('compositions ')
+ .description('List available compositions')
+ .action(async (entry) => {
+ const { compositionsCommand } = await import('../dist/commands/compositions.cjs');
+ await compositionsCommand({ entry });
+ });
+
+program.parse();
diff --git a/packages/motionforge-cli/bun.lock b/packages/motionforge-cli/bun.lock
new file mode 100644
index 0000000..c187dd7
--- /dev/null
+++ b/packages/motionforge-cli/bun.lock
@@ -0,0 +1,577 @@
+{
+ "lockfileVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "@motionforge/cli",
+ "dependencies": {
+ "@motionforge/renderer": "../motionforge-renderer",
+ "chalk": "^5.6.2",
+ "commander": "^15.0.0",
+ "fs-extra": "^11.3.5",
+ },
+ "devDependencies": {
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3",
+ },
+ },
+ },
+ "packages": {
+ "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
+
+ "@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@mediapipe/tasks-vision": ["@mediapipe/tasks-vision@0.10.17", "", {}, "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg=="],
+
+ "@monogrid/gainmap-js": ["@monogrid/gainmap-js@3.4.0", "", { "dependencies": { "promise-worker-transferable": "^1.0.4" }, "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg=="],
+
+ "@motionforge/renderer": ["@motionforge/renderer@file:../motionforge-renderer", { "dependencies": { "execa": "^9.0.0", "puppeteer-core": "^24.0.0", "source-map": "^0.8.0-beta.0", "ws": "^8.18.0" }, "devDependencies": { "@types/ws": "^8.5.0", "tsup": "^8.5.1", "typescript": "^6.0.3" }, "peerDependencies": { "motionforge": ">=1.4.0" } }],
+
+ "@puppeteer/browsers": ["@puppeteer/browsers@2.13.2", "", { "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw=="],
+
+ "@react-three/drei": ["@react-three/drei@10.7.7", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^3.1.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ=="],
+
+ "@react-three/fiber": ["@react-three/fiber@9.6.1", "", { "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^2.0.0", "react-use-measure": "^2.1.7", "scheduler": "^0.27.0", "suspend-react": "^0.1.3", "use-sync-external-store": "^1.4.0", "zustand": "^5.0.3" }, "peerDependencies": { "expo": ">=43.0", "expo-asset": ">=8.4", "expo-file-system": ">=11.0", "expo-gl": ">=11.0", "react": ">=19 <19.3", "react-dom": ">=19 <19.3", "react-native": ">=0.78", "three": ">=0.156" }, "optionalPeers": ["expo", "expo-asset", "expo-file-system", "expo-gl", "react-dom", "react-native"] }, "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.61.0", "", { "os": "android", "cpu": "arm" }, "sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.61.0", "", { "os": "android", "cpu": "arm64" }, "sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.61.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.61.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.61.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.61.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.61.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.61.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.61.0", "", { "os": "none", "cpu": "arm64" }, "sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.61.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.61.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw=="],
+
+ "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
+
+ "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
+
+ "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="],
+
+ "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="],
+
+ "@types/draco3d": ["@types/draco3d@1.4.10", "", {}, "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw=="],
+
+ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
+
+ "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="],
+
+ "@types/offscreencanvas": ["@types/offscreencanvas@2019.7.3", "", {}, "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A=="],
+
+ "@types/react": ["@types/react@19.2.15", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q=="],
+
+ "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],
+
+ "@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="],
+
+ "@types/three": ["@types/three@0.184.1", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": ">=0.5.17", "fflate": "~0.8.2", "meshoptimizer": "~1.1.1" } }, "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA=="],
+
+ "@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="],
+
+ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
+
+ "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="],
+
+ "@use-gesture/core": ["@use-gesture/core@10.3.1", "", {}, "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="],
+
+ "@use-gesture/react": ["@use-gesture/react@10.3.1", "", { "dependencies": { "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g=="],
+
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
+
+ "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
+
+ "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+
+ "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="],
+
+ "b4a": ["b4a@1.8.1", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw=="],
+
+ "bare-events": ["bare-events@2.8.3", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw=="],
+
+ "bare-fs": ["bare-fs@4.7.1", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw=="],
+
+ "bare-os": ["bare-os@3.9.1", "", {}, "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ=="],
+
+ "bare-path": ["bare-path@3.0.1", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ=="],
+
+ "bare-stream": ["bare-stream@2.13.1", "", { "dependencies": { "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow=="],
+
+ "bare-url": ["bare-url@2.4.3", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ=="],
+
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "basic-ftp": ["basic-ftp@5.3.1", "", {}, "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw=="],
+
+ "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="],
+
+ "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
+ "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="],
+
+ "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
+
+ "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
+
+ "camera-controls": ["camera-controls@3.1.2", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA=="],
+
+ "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
+
+ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+ "chromium-bidi": ["chromium-bidi@14.0.0", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw=="],
+
+ "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "commander": ["commander@15.0.0", "", {}, "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg=="],
+
+ "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
+
+ "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
+
+ "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+
+ "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="],
+
+ "detect-gpu": ["detect-gpu@5.0.70", "", { "dependencies": { "webgl-constants": "^1.1.1" } }, "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w=="],
+
+ "devtools-protocol": ["devtools-protocol@0.0.1608973", "", {}, "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ=="],
+
+ "draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="],
+
+ "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="],
+
+ "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
+
+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
+
+ "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="],
+
+ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
+
+ "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="],
+
+ "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],
+
+ "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="],
+
+ "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
+
+ "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "fflate": ["fflate@0.6.10", "", {}, "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg=="],
+
+ "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="],
+
+ "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
+
+ "framer-motion": ["framer-motion@12.40.0", "", { "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg=="],
+
+ "fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
+
+ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="],
+
+ "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="],
+
+ "glsl-noise": ["glsl-noise@0.0.0", "", {}, "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w=="],
+
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
+ "hls.js": ["hls.js@1.6.16", "", {}, "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA=="],
+
+ "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
+
+ "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
+
+ "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="],
+
+ "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="],
+
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+
+ "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
+
+ "is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="],
+
+ "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
+
+ "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "its-fine": ["its-fine@2.0.0", "", { "dependencies": { "@types/react-reconciler": "^0.28.9" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng=="],
+
+ "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
+
+ "jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+
+ "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="],
+
+ "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
+
+ "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="],
+
+ "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="],
+
+ "lottie-web": ["lottie-web@5.13.0", "", {}, "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ=="],
+
+ "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
+
+ "maath": ["maath@0.10.8", "", { "peerDependencies": { "@types/three": ">=0.134.0", "three": ">=0.134.0" } }, "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "meshline": ["meshline@3.3.1", "", { "peerDependencies": { "three": ">=0.137" } }, "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ=="],
+
+ "meshoptimizer": ["meshoptimizer@1.1.1", "", {}, "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g=="],
+
+ "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
+
+ "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
+
+ "motion-dom": ["motion-dom@12.40.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg=="],
+
+ "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="],
+
+ "motionforge": ["motionforge@1.4.0", "", { "dependencies": { "lottie-web": "^5.13.0" }, "peerDependencies": { "@react-three/drei": ">=10.0.0", "@react-three/fiber": ">=9.0.0", "framer-motion": ">=12.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0", "three": ">=0.170.0" } }, "sha512-ozKkkNLE5Y8kAaHOk14yY2w3jJCaiWcUSyqWIkbpJWD903KpW+Z8W+GYYayBxpk9nVLI5ZfkBocEoYhWBtOGTA=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
+
+ "netmask": ["netmask@2.1.1", "", {}, "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA=="],
+
+ "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="],
+
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
+
+ "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="],
+
+ "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="],
+
+ "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
+
+ "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
+
+ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
+
+ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
+
+ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
+
+ "potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="],
+
+ "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],
+
+ "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="],
+
+ "promise-worker-transferable": ["promise-worker-transferable@1.0.4", "", { "dependencies": { "is-promise": "^2.1.0", "lie": "^3.0.2" } }, "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw=="],
+
+ "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="],
+
+ "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
+
+ "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="],
+
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "puppeteer-core": ["puppeteer-core@24.43.1", "", { "dependencies": { "@puppeteer/browsers": "2.13.2", "chromium-bidi": "14.0.0", "debug": "^4.4.3", "devtools-protocol": "0.0.1608973", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.1", "ws": "^8.20.0" } }, "sha512-T5ScUMAsmhdNbgDR41AGESYeS6V9MSgetkSnVhhW+gXvzC42VesKCn5ld87gAZDJ6vLHL9GkRvY9WtQWSnwFbw=="],
+
+ "react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="],
+
+ "react-dom": ["react-dom@19.2.6", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.6" } }, "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g=="],
+
+ "react-use-measure": ["react-use-measure@2.1.7", "", { "peerDependencies": { "react": ">=16.13", "react-dom": ">=16.13" }, "optionalPeers": ["react-dom"] }, "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg=="],
+
+ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+ "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
+
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
+ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "rollup": ["rollup@4.61.0", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.61.0", "@rollup/rollup-android-arm64": "4.61.0", "@rollup/rollup-darwin-arm64": "4.61.0", "@rollup/rollup-darwin-x64": "4.61.0", "@rollup/rollup-freebsd-arm64": "4.61.0", "@rollup/rollup-freebsd-x64": "4.61.0", "@rollup/rollup-linux-arm-gnueabihf": "4.61.0", "@rollup/rollup-linux-arm-musleabihf": "4.61.0", "@rollup/rollup-linux-arm64-gnu": "4.61.0", "@rollup/rollup-linux-arm64-musl": "4.61.0", "@rollup/rollup-linux-loong64-gnu": "4.61.0", "@rollup/rollup-linux-loong64-musl": "4.61.0", "@rollup/rollup-linux-ppc64-gnu": "4.61.0", "@rollup/rollup-linux-ppc64-musl": "4.61.0", "@rollup/rollup-linux-riscv64-gnu": "4.61.0", "@rollup/rollup-linux-riscv64-musl": "4.61.0", "@rollup/rollup-linux-s390x-gnu": "4.61.0", "@rollup/rollup-linux-x64-gnu": "4.61.0", "@rollup/rollup-linux-x64-musl": "4.61.0", "@rollup/rollup-openbsd-x64": "4.61.0", "@rollup/rollup-openharmony-arm64": "4.61.0", "@rollup/rollup-win32-arm64-msvc": "4.61.0", "@rollup/rollup-win32-ia32-msvc": "4.61.0", "@rollup/rollup-win32-x64-gnu": "4.61.0", "@rollup/rollup-win32-x64-msvc": "4.61.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g=="],
+
+ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
+
+ "semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
+ "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
+
+ "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="],
+
+ "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="],
+
+ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "stats-gl": ["stats-gl@2.4.2", "", { "dependencies": { "@types/three": "*", "three": "^0.170.0" } }, "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ=="],
+
+ "stats.js": ["stats.js@0.17.0", "", {}, "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw=="],
+
+ "streamx": ["streamx@2.26.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A=="],
+
+ "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="],
+
+ "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
+
+ "suspend-react": ["suspend-react@0.1.3", "", { "peerDependencies": { "react": ">=17.0" } }, "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ=="],
+
+ "tar-fs": ["tar-fs@3.1.2", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw=="],
+
+ "tar-stream": ["tar-stream@3.2.0", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg=="],
+
+ "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="],
+
+ "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="],
+
+ "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
+
+ "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+
+ "three": ["three@0.184.0", "", {}, "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg=="],
+
+ "three-mesh-bvh": ["three-mesh-bvh@0.8.3", "", { "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg=="],
+
+ "three-stdlib": ["three-stdlib@2.36.1", "", { "dependencies": { "@types/draco3d": "^1.4.0", "@types/offscreencanvas": "^2019.6.4", "@types/webxr": "^0.5.2", "draco3d": "^1.4.1", "fflate": "^0.6.9", "potpack": "^1.0.1" }, "peerDependencies": { "three": ">=0.128.0" } }, "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg=="],
+
+ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
+
+ "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
+
+ "tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="],
+
+ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+
+ "troika-three-text": ["troika-three-text@0.52.4", "", { "dependencies": { "bidi-js": "^1.0.2", "troika-three-utils": "^0.52.4", "troika-worker-utils": "^0.52.0", "webgl-sdf-generator": "1.1.1" }, "peerDependencies": { "three": ">=0.125.0" } }, "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg=="],
+
+ "troika-three-utils": ["troika-three-utils@0.52.4", "", { "peerDependencies": { "three": ">=0.125.0" } }, "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A=="],
+
+ "troika-worker-utils": ["troika-worker-utils@0.52.0", "", {}, "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw=="],
+
+ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="],
+
+ "tunnel-rat": ["tunnel-rat@0.1.2", "", { "dependencies": { "zustand": "^4.3.2" } }, "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ=="],
+
+ "typed-query-selector": ["typed-query-selector@2.12.2", "", {}, "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="],
+
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
+
+ "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
+
+ "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="],
+
+ "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
+
+ "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
+
+ "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
+
+ "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="],
+
+ "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.1", "", {}, "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw=="],
+
+ "webgl-constants": ["webgl-constants@1.1.1", "", {}, "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg=="],
+
+ "webgl-sdf-generator": ["webgl-sdf-generator@1.1.1", "", {}, "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="],
+
+ "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="],
+
+ "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
+
+ "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="],
+
+ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
+
+ "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+
+ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
+
+ "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="],
+
+ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
+
+ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+
+ "zustand": ["zustand@5.0.14", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="],
+
+ "@motionforge/renderer/source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="],
+
+ "@types/three/fflate": ["fflate@0.8.3", "", {}, "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA=="],
+
+ "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
+
+ "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
+
+ "stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="],
+
+ "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
+
+ "tunnel-rat/zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["@types/react", "immer", "react"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="],
+ }
+}
diff --git a/packages/motionforge-cli/package.json b/packages/motionforge-cli/package.json
new file mode 100644
index 0000000..86fee76
--- /dev/null
+++ b/packages/motionforge-cli/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "@motionforge/cli",
+ "version": "1.0.0",
+ "description": "Command-line interface for MotionForge",
+ "type": "module",
+ "bin": {
+ "motionforge": "./bin/motionforge.js"
+ },
+ "scripts": {
+ "build": "tsup",
+ "dev": "tsup --watch"
+ },
+ "dependencies": {
+ "@motionforge/renderer": "../motionforge-renderer",
+ "chalk": "^5.6.2",
+ "commander": "^15.0.0",
+ "fs-extra": "^11.3.5"
+ },
+ "devDependencies": {
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3"
+ },
+ "publishConfig": {
+ "access": "public",
+ "registry": "https://registry.npmjs.org"
+ }
+}
diff --git a/packages/motionforge-cli/src/commands/compositions.ts b/packages/motionforge-cli/src/commands/compositions.ts
new file mode 100644
index 0000000..7c95147
--- /dev/null
+++ b/packages/motionforge-cli/src/commands/compositions.ts
@@ -0,0 +1,14 @@
+import { bundle } from '@motionforge/bundler';
+import path from 'path';
+import fs from 'fs';
+
+export async function compositionsCommand(options: {
+ entry: string;
+}) {
+ console.log(`[MotionForge] Finding compositions in "${options.entry}"...`);
+
+ // In a real implementation, we would bundle the entry or use a worker to extract registered compositions.
+ // For this mock/scaffold, we'll just log a placeholder.
+ console.log(`\n Available compositions:`);
+ console.log(` - MyVideo (1920x1080, 30fps, 300 frames)`);
+}
diff --git a/packages/motionforge-cli/src/commands/render.ts b/packages/motionforge-cli/src/commands/render.ts
new file mode 100644
index 0000000..8c1cbaa
--- /dev/null
+++ b/packages/motionforge-cli/src/commands/render.ts
@@ -0,0 +1,57 @@
+import { renderMedia, type RenderMediaOptions, ensureFfmpeg } from '@motionforge/renderer';
+
+export async function renderCommand(options: {
+ entry: string;
+ compositionId: string;
+ output: string;
+ codec: any;
+ fps?: number;
+ width?: number;
+ height?: number;
+ duration?: number;
+ props?: string;
+ concurrency?: number;
+ frameRange?: string;
+ crf?: number;
+ quality?: 'low' | 'medium' | 'high';
+}) {
+ console.log(`[MotionForge] Rendering composition "${options.compositionId}"...`);
+
+ // Ensure FFmpeg is available
+ await ensureFfmpeg();
+
+ // Parse input props
+ const inputProps = options.props ? JSON.parse(options.props) : undefined;
+
+ // Parse frame range
+ const frameRange = options.frameRange
+ ? options.frameRange.split('-').map(Number) as [number, number]
+ : undefined;
+
+ const result = await renderMedia({
+ serveUrl: options.entry,
+ compositionId: options.compositionId,
+ outputLocation: options.output,
+ codec: options.codec,
+ fps: Number(options.fps) || 30,
+ width: Number(options.width) || 1920,
+ height: Number(options.height) || 1080,
+ durationInFrames: Number(options.duration) || 300,
+ inputProps,
+ concurrency: Number(options.concurrency) || 4,
+ frameRange,
+ crf: options.crf ? Number(options.crf) : undefined,
+ quality: options.quality,
+ onProgress: (progress) => {
+ process.stdout.write(`\r Progress: ${(progress * 100).toFixed(1)}%`);
+ },
+ });
+
+ if (result.success) {
+ console.log(`\n ✓ Rendered ${result.frameCount} frames in ${(result.durationMs / 1000).toFixed(1)}s`);
+ console.log(` Output: ${result.outputLocation}`);
+ } else {
+ console.error(`\n ✗ Render failed: ${result.error}`);
+ process.exit(1);
+ }
+}
diff --git a/packages/motionforge-cli/src/commands/still.ts b/packages/motionforge-cli/src/commands/still.ts
new file mode 100644
index 0000000..22d6b70
--- /dev/null
+++ b/packages/motionforge-cli/src/commands/still.ts
@@ -0,0 +1,38 @@
+import { renderMedia, ensureFfmpeg } from '@motionforge/renderer';
+
+export async function stillCommand(options: {
+ entry: string;
+ compositionId: string;
+ output: string;
+ frame?: number;
+ width?: number;
+ height?: number;
+ props?: string;
+}) {
+ console.log(`[MotionForge] Rendering still from "${options.compositionId}" at frame ${options.frame ?? 0}...`);
+
+ await ensureFfmpeg();
+
+ const inputProps = options.props ? JSON.parse(options.props) : undefined;
+
+ const result = await renderMedia({
+ serveUrl: options.entry,
+ compositionId: options.compositionId,
+ outputLocation: options.output,
+ codec: 'gif', // GIF mode in stitch-frames can handle single frame too, or we can just use a simple screenshot
+ fps: 1,
+ width: Number(options.width) || 1920,
+ height: Number(options.height) || 1080,
+ durationInFrames: 1,
+ inputProps,
+ frameRange: [Number(options.frame) || 0, Number(options.frame) || 0],
+ });
+
+ if (result.success) {
+ console.log(`\n ✓ Rendered frame ${options.frame ?? 0}`);
+ console.log(` Output: ${result.outputLocation}`);
+ } else {
+ console.error(`\n ✗ Still render failed: ${result.error}`);
+ process.exit(1);
+ }
+}
diff --git a/packages/motionforge-cli/src/commands/studio.ts b/packages/motionforge-cli/src/commands/studio.ts
new file mode 100644
index 0000000..98e99de
--- /dev/null
+++ b/packages/motionforge-cli/src/commands/studio.ts
@@ -0,0 +1,12 @@
+import path from 'path';
+
+export async function studioCommand(options: {
+ entry: string;
+ port?: number;
+}) {
+ const port = options.port || 3123;
+ console.log(`[MotionForge] Starting Studio for "${options.entry}" on http://localhost:${port}...`);
+
+ // In a real implementation, this would start a dev server with @motionforge/studio.
+ console.log(`\n Studio is running! Press Ctrl+C to stop.`);
+}
diff --git a/packages/motionforge-cli/src/index.ts b/packages/motionforge-cli/src/index.ts
new file mode 100644
index 0000000..7540227
--- /dev/null
+++ b/packages/motionforge-cli/src/index.ts
@@ -0,0 +1,2 @@
+export * from './commands/render.js';
+export * from './commands/still.js';
diff --git a/packages/motionforge-cli/tsup.config.ts b/packages/motionforge-cli/tsup.config.ts
new file mode 100644
index 0000000..c51f809
--- /dev/null
+++ b/packages/motionforge-cli/tsup.config.ts
@@ -0,0 +1,9 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts', 'src/commands/render.ts', 'src/commands/still.ts', 'src/commands/studio.ts', 'src/commands/compositions.ts'],
+ format: ['esm', 'cjs'],
+ dts: false,
+ clean: true,
+ minify: true,
+});
diff --git a/packages/motionforge-renderer/bun.lock b/packages/motionforge-renderer/bun.lock
new file mode 100644
index 0000000..f253b3f
--- /dev/null
+++ b/packages/motionforge-renderer/bun.lock
@@ -0,0 +1,467 @@
+{
+ "lockfileVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "@motionforge/renderer",
+ "dependencies": {
+ "execa": "^9.6.1",
+ "puppeteer-core": "^25.1.0",
+ "source-map": "^0.8.0-beta.0",
+ "ws": "^8.21.0",
+ },
+ "devDependencies": {
+ "@types/ws": "^8.18.1",
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3",
+ },
+ "peerDependencies": {
+ "motionforge": ">=1.4.0",
+ },
+ },
+ },
+ "packages": {
+ "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
+
+ "@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@mediapipe/tasks-vision": ["@mediapipe/tasks-vision@0.10.17", "", {}, "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg=="],
+
+ "@monogrid/gainmap-js": ["@monogrid/gainmap-js@3.4.0", "", { "dependencies": { "promise-worker-transferable": "^1.0.4" }, "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg=="],
+
+ "@puppeteer/browsers": ["@puppeteer/browsers@3.0.4", "", { "dependencies": { "modern-tar": "^0.7.6", "yargs": "^17.7.2" }, "peerDependencies": { "proxy-agent": ">=8.0.1" }, "optionalPeers": ["proxy-agent"], "bin": { "browsers": "lib/main-cli.js" } }, "sha512-HGM8iAmGTf+Y7t0373szVbTmt3d7vPkYL/1bpOkOFO0YUYLgSeuYBCzESklogNPvOBnZ/MRD5f07OkpqH1trtA=="],
+
+ "@react-three/drei": ["@react-three/drei@10.7.7", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^3.1.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ=="],
+
+ "@react-three/fiber": ["@react-three/fiber@9.6.1", "", { "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^2.0.0", "react-use-measure": "^2.1.7", "scheduler": "^0.27.0", "suspend-react": "^0.1.3", "use-sync-external-store": "^1.4.0", "zustand": "^5.0.3" }, "peerDependencies": { "expo": ">=43.0", "expo-asset": ">=8.4", "expo-file-system": ">=11.0", "expo-gl": ">=11.0", "react": ">=19 <19.3", "react-dom": ">=19 <19.3", "react-native": ">=0.78", "three": ">=0.156" }, "optionalPeers": ["expo", "expo-asset", "expo-file-system", "expo-gl", "react-dom", "react-native"] }, "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.61.0", "", { "os": "android", "cpu": "arm" }, "sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.61.0", "", { "os": "android", "cpu": "arm64" }, "sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.61.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.61.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.61.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.61.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.61.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.61.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.61.0", "", { "os": "none", "cpu": "arm64" }, "sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.61.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.61.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw=="],
+
+ "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
+
+ "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
+
+ "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="],
+
+ "@types/draco3d": ["@types/draco3d@1.4.10", "", {}, "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw=="],
+
+ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
+
+ "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="],
+
+ "@types/offscreencanvas": ["@types/offscreencanvas@2019.7.3", "", {}, "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A=="],
+
+ "@types/react": ["@types/react@19.2.15", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q=="],
+
+ "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],
+
+ "@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="],
+
+ "@types/three": ["@types/three@0.184.1", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": ">=0.5.17", "fflate": "~0.8.2", "meshoptimizer": "~1.1.1" } }, "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA=="],
+
+ "@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="],
+
+ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
+
+ "@use-gesture/core": ["@use-gesture/core@10.3.1", "", {}, "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="],
+
+ "@use-gesture/react": ["@use-gesture/react@10.3.1", "", { "dependencies": { "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g=="],
+
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
+
+ "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="],
+
+ "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
+ "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
+
+ "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
+
+ "camera-controls": ["camera-controls@3.1.2", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA=="],
+
+ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+ "chromium-bidi": ["chromium-bidi@16.0.1", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-J63PGu/9PpeCwLIcKYyzWP6yaVL5pxuBc0shlYCYM8BaAkmlwiQboXO1iNbOgSDbVklEyYFfNEcHD8oOAWacUA=="],
+
+ "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
+
+ "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
+
+ "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
+
+ "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "detect-gpu": ["detect-gpu@5.0.70", "", { "dependencies": { "webgl-constants": "^1.1.1" } }, "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w=="],
+
+ "devtools-protocol": ["devtools-protocol@0.0.1624250", "", {}, "sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA=="],
+
+ "draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="],
+
+ "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
+
+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
+
+ "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "fflate": ["fflate@0.6.10", "", {}, "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg=="],
+
+ "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="],
+
+ "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
+
+ "framer-motion": ["framer-motion@12.40.0", "", { "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
+
+ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="],
+
+ "glsl-noise": ["glsl-noise@0.0.0", "", {}, "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w=="],
+
+ "hls.js": ["hls.js@1.6.16", "", {}, "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA=="],
+
+ "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="],
+
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+
+ "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
+
+ "is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="],
+
+ "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
+
+ "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "its-fine": ["its-fine@2.0.0", "", { "dependencies": { "@types/react-reconciler": "^0.28.9" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng=="],
+
+ "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
+
+ "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="],
+
+ "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
+
+ "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="],
+
+ "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="],
+
+ "lottie-web": ["lottie-web@5.13.0", "", {}, "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ=="],
+
+ "maath": ["maath@0.10.8", "", { "peerDependencies": { "@types/three": ">=0.134.0", "three": ">=0.134.0" } }, "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "meshline": ["meshline@3.3.1", "", { "peerDependencies": { "three": ">=0.137" } }, "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ=="],
+
+ "meshoptimizer": ["meshoptimizer@1.1.1", "", {}, "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g=="],
+
+ "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
+
+ "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
+
+ "modern-tar": ["modern-tar@0.7.6", "", {}, "sha512-sweCIVXzx1aIGTCdzcMlSZt1h8k5Tmk08VNAuRk3IU28XamGiOH5ypi11g6De2CH7PhYqSSnGy2A/EFhbWnVKg=="],
+
+ "motion-dom": ["motion-dom@12.40.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg=="],
+
+ "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="],
+
+ "motionforge": ["motionforge@1.4.0", "", { "dependencies": { "lottie-web": "^5.13.0" }, "peerDependencies": { "@react-three/drei": ">=10.0.0", "@react-three/fiber": ">=9.0.0", "framer-motion": ">=12.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0", "three": ">=0.170.0" } }, "sha512-ozKkkNLE5Y8kAaHOk14yY2w3jJCaiWcUSyqWIkbpJWD903KpW+Z8W+GYYayBxpk9nVLI5ZfkBocEoYhWBtOGTA=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
+
+ "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="],
+
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
+
+ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
+
+ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
+
+ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
+
+ "potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="],
+
+ "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],
+
+ "promise-worker-transferable": ["promise-worker-transferable@1.0.4", "", { "dependencies": { "is-promise": "^2.1.0", "lie": "^3.0.2" } }, "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw=="],
+
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "puppeteer-core": ["puppeteer-core@25.1.0", "", { "dependencies": { "@puppeteer/browsers": "3.0.4", "chromium-bidi": "16.0.1", "devtools-protocol": "0.0.1624250", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.2", "ws": "^8.21.0" } }, "sha512-jKzy5y4WG6uNuFbTWgW1D7mqoT9o0nllc/6a1DGF775T1mPmgw3scdFEtEq67yVFikavQmbYq6NLfbTfxHSlqQ=="],
+
+ "react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="],
+
+ "react-dom": ["react-dom@19.2.6", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.6" } }, "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g=="],
+
+ "react-use-measure": ["react-use-measure@2.1.7", "", { "peerDependencies": { "react": ">=16.13", "react-dom": ">=16.13" }, "optionalPeers": ["react-dom"] }, "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg=="],
+
+ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+ "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
+
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
+ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "rollup": ["rollup@4.61.0", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.61.0", "@rollup/rollup-android-arm64": "4.61.0", "@rollup/rollup-darwin-arm64": "4.61.0", "@rollup/rollup-darwin-x64": "4.61.0", "@rollup/rollup-freebsd-arm64": "4.61.0", "@rollup/rollup-freebsd-x64": "4.61.0", "@rollup/rollup-linux-arm-gnueabihf": "4.61.0", "@rollup/rollup-linux-arm-musleabihf": "4.61.0", "@rollup/rollup-linux-arm64-gnu": "4.61.0", "@rollup/rollup-linux-arm64-musl": "4.61.0", "@rollup/rollup-linux-loong64-gnu": "4.61.0", "@rollup/rollup-linux-loong64-musl": "4.61.0", "@rollup/rollup-linux-ppc64-gnu": "4.61.0", "@rollup/rollup-linux-ppc64-musl": "4.61.0", "@rollup/rollup-linux-riscv64-gnu": "4.61.0", "@rollup/rollup-linux-riscv64-musl": "4.61.0", "@rollup/rollup-linux-s390x-gnu": "4.61.0", "@rollup/rollup-linux-x64-gnu": "4.61.0", "@rollup/rollup-linux-x64-musl": "4.61.0", "@rollup/rollup-openbsd-x64": "4.61.0", "@rollup/rollup-openharmony-arm64": "4.61.0", "@rollup/rollup-win32-arm64-msvc": "4.61.0", "@rollup/rollup-win32-ia32-msvc": "4.61.0", "@rollup/rollup-win32-x64-gnu": "4.61.0", "@rollup/rollup-win32-x64-msvc": "4.61.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g=="],
+
+ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
+ "source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="],
+
+ "stats-gl": ["stats-gl@2.4.2", "", { "dependencies": { "@types/three": "*", "three": "^0.170.0" } }, "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ=="],
+
+ "stats.js": ["stats.js@0.17.0", "", {}, "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw=="],
+
+ "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="],
+
+ "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
+
+ "suspend-react": ["suspend-react@0.1.3", "", { "peerDependencies": { "react": ">=17.0" } }, "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ=="],
+
+ "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
+
+ "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+
+ "three": ["three@0.184.0", "", {}, "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg=="],
+
+ "three-mesh-bvh": ["three-mesh-bvh@0.8.3", "", { "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg=="],
+
+ "three-stdlib": ["three-stdlib@2.36.1", "", { "dependencies": { "@types/draco3d": "^1.4.0", "@types/offscreencanvas": "^2019.6.4", "@types/webxr": "^0.5.2", "draco3d": "^1.4.1", "fflate": "^0.6.9", "potpack": "^1.0.1" }, "peerDependencies": { "three": ">=0.128.0" } }, "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg=="],
+
+ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
+
+ "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
+
+ "tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="],
+
+ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+
+ "troika-three-text": ["troika-three-text@0.52.4", "", { "dependencies": { "bidi-js": "^1.0.2", "troika-three-utils": "^0.52.4", "troika-worker-utils": "^0.52.0", "webgl-sdf-generator": "1.1.1" }, "peerDependencies": { "three": ">=0.125.0" } }, "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg=="],
+
+ "troika-three-utils": ["troika-three-utils@0.52.4", "", { "peerDependencies": { "three": ">=0.125.0" } }, "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A=="],
+
+ "troika-worker-utils": ["troika-worker-utils@0.52.0", "", {}, "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw=="],
+
+ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="],
+
+ "tunnel-rat": ["tunnel-rat@0.1.2", "", { "dependencies": { "zustand": "^4.3.2" } }, "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ=="],
+
+ "typed-query-selector": ["typed-query-selector@2.12.2", "", {}, "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="],
+
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
+
+ "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
+
+ "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="],
+
+ "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
+
+ "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
+
+ "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="],
+
+ "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.2", "", {}, "sha512-VSV+fzfChirL3e7jay2yUC7B4HQCGtEWEg/MSSQbK+qWbqeGlRLlXTzPpYr3XGUvbpDHumWZBJxgesg4N7dbtA=="],
+
+ "webgl-constants": ["webgl-constants@1.1.1", "", {}, "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg=="],
+
+ "webgl-sdf-generator": ["webgl-sdf-generator@1.1.1", "", {}, "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="],
+
+ "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="],
+
+ "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="],
+
+ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
+
+ "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+
+ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
+
+ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
+
+ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+
+ "zustand": ["zustand@5.0.14", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="],
+
+ "@types/three/fflate": ["fflate@0.8.3", "", {}, "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA=="],
+
+ "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
+
+ "stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="],
+
+ "tsup/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "tunnel-rat/zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["@types/react", "immer", "react"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="],
+ }
+}
diff --git a/packages/motionforge-renderer/package.json b/packages/motionforge-renderer/package.json
new file mode 100644
index 0000000..0704488
--- /dev/null
+++ b/packages/motionforge-renderer/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "@motionforge/renderer",
+ "version": "1.0.0",
+ "description": "Server-side rendering engine for MotionForge",
+ "type": "module",
+ "main": "./dist/index.cjs",
+ "module": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "import": "./dist/index.js",
+ "require": "./dist/index.cjs"
+ }
+ },
+ "scripts": {
+ "build": "tsup",
+ "dev": "tsup --watch"
+ },
+ "dependencies": {
+ "puppeteer-core": "^25.1.0",
+ "execa": "^9.6.1",
+ "ws": "^8.21.0",
+ "source-map": "^0.8.0-beta.0"
+ },
+ "peerDependencies": {
+ "motionforge": ">=1.4.0"
+ },
+ "devDependencies": {
+ "@types/ws": "^8.18.1",
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3"
+ },
+ "publishConfig": {
+ "access": "public",
+ "registry": "https://registry.npmjs.org"
+ }
+}
diff --git a/packages/motionforge-renderer/src/audio.ts b/packages/motionforge-renderer/src/audio.ts
new file mode 100644
index 0000000..cf222b2
--- /dev/null
+++ b/packages/motionforge-renderer/src/audio.ts
@@ -0,0 +1,141 @@
+import { execa } from 'execa';
+import * as path from 'path';
+import * as fs from 'fs';
+
+export interface AudioAsset {
+ id: string;
+ src: string;
+ startInVideo: number; // Frame where audio starts
+ duration: number; // Number of frames
+ volume: number[]; // Per-frame volume values (0-1)
+ playbackRate: number;
+ trimLeft: number; // Starting position in audio (in frames)
+}
+
+/**
+ * Create an audio track from all assets found during frame rendering.
+ * Returns the path to the final mixed audio file.
+ */
+export async function createAudio(
+ assets: AudioAsset[],
+ fps: number,
+ outputDir: string,
+ targetCodec: 'aac' | 'mp3' | 'flac' | 'wav' = 'aac'
+): Promise {
+ if (assets.length === 0) return null;
+
+ // Step 1: Preprocess each track
+ const processedTracks: string[] = [];
+ for (const asset of assets) {
+ const trackPath = await preprocessAudioTrack(asset, fps, outputDir);
+ processedTracks.push(trackPath);
+ }
+
+ // Step 2: Mix all tracks into a single WAV
+ const mixedPath = path.join(outputDir, 'audio-mixed.wav');
+ await mergeAudioTracks(processedTracks, mixedPath);
+
+ // Step 3: Compress to target codec
+ const outputPath = path.join(outputDir, `audio-final.${getExtension(targetCodec)}`);
+ await compressAudio(mixedPath, outputPath, targetCodec);
+
+ // Cleanup intermediate files
+ for (const track of processedTracks) {
+ if (fs.existsSync(track)) fs.unlinkSync(track);
+ }
+ if (fs.existsSync(mixedPath)) fs.unlinkSync(mixedPath);
+
+ return outputPath;
+}
+
+async function preprocessAudioTrack(
+ asset: AudioAsset,
+ fps: number,
+ outputDir: string
+): Promise {
+ const outputPath = path.join(outputDir, `track-${asset.id}.wav`);
+
+ // Build FFmpeg volume filter with per-frame volume values
+ const volumeKeyframes = downsampleVolumeCurve(asset.volume, fps);
+ const volumeFilter = volumeKeyframes
+ .map(({ time, volume }) => `volume=${volume.toFixed(4)}:t=${time.toFixed(4)}`)
+ .join(',');
+
+ const trimStartSeconds = asset.trimLeft / fps;
+ const durationSeconds = asset.duration / fps;
+
+ const args: string[] = [
+ '-i', asset.src,
+ '-ss', String(trimStartSeconds),
+ '-t', String(durationSeconds),
+ '-af', volumeFilter + (asset.playbackRate !== 1 ? `,atempo=${asset.playbackRate}` : ''),
+ '-ar', '48000',
+ '-ac', '2',
+ outputPath,
+ '-y',
+ ];
+
+ await execa('ffmpeg', args);
+ return outputPath;
+}
+
+function downsampleVolumeCurve(
+ volume: number[],
+ fps: number,
+ threshold: number = 0.01
+): Array<{ time: number; volume: number }> {
+ if (volume.length === 0) return [];
+
+ const keyframes: Array<{ time: number; volume: number }> = [];
+ keyframes.push({ time: 0, volume: volume[0] });
+
+ for (let i = 1; i < volume.length; i++) {
+ if (Math.abs(volume[i] - (volume[i - 1] ?? 0)) > threshold) {
+ keyframes.push({ time: i / fps, volume: volume[i] });
+ }
+ }
+
+ return keyframes;
+}
+
+async function mergeAudioTracks(trackPaths: string[], outputPath: string): Promise {
+ if (trackPaths.length === 1) {
+ fs.copyFileSync(trackPaths[0], outputPath);
+ return;
+ }
+
+ const args: string[] = [];
+ for (const track of trackPaths) {
+ args.push('-i', track);
+ }
+
+ const filterParts = trackPaths.map((_, i) => `[${i}:a]`).join('');
+ args.push('-filter_complex', `${filterParts}amix=inputs=${trackPaths.length}:duration=longest[out]`);
+ args.push('-map', '[out]');
+ args.push('-ar', '48000');
+ args.push('-ac', '2');
+ args.push(outputPath, '-y');
+
+ await execa('ffmpeg', args);
+}
+
+async function compressAudio(
+ inputPath: string,
+ outputPath: string,
+ codec: string
+): Promise {
+ const codecArgs: Record = {
+ aac: ['-c:a', 'aac', '-b:a', '192k'],
+ mp3: ['-c:a', 'libmp3lame', '-b:a', '192k'],
+ flac: ['-c:a', 'flac'],
+ wav: ['-c:a', 'pcm_s16le'],
+ };
+
+ const args = ['-i', inputPath, ...(codecArgs[codec] ?? codecArgs.aac), outputPath, '-y'];
+ await execa('ffmpeg', args);
+}
+
+function getExtension(codec: string): string {
+ const map: Record = { aac: 'm4a', mp3: 'mp3', flac: 'flac', wav: 'wav' };
+ return map[codec] ?? 'm4a';
+}
diff --git a/packages/motionforge-renderer/src/ensure-ffmpeg.ts b/packages/motionforge-renderer/src/ensure-ffmpeg.ts
new file mode 100644
index 0000000..bc88b60
--- /dev/null
+++ b/packages/motionforge-renderer/src/ensure-ffmpeg.ts
@@ -0,0 +1,47 @@
+import { execa } from 'execa';
+import * as path from 'path';
+import * as os from 'os';
+import * as fs from 'fs';
+
+let cachedFfmpegPath: string | null = null;
+
+/**
+ * Ensure FFmpeg is available. Returns the path to the FFmpeg binary.
+ * Checks PATH first, then common install locations.
+ */
+export async function ensureFfmpeg(): Promise {
+ if (cachedFfmpegPath) return cachedFfmpegPath;
+
+ // Try PATH
+ try {
+ await execa('ffmpeg', ['-version'], { reject: true });
+ cachedFfmpegPath = 'ffmpeg';
+ return 'ffmpeg';
+ } catch {
+ // Not in PATH
+ }
+
+ // Check common locations
+ const candidates: string[] = [];
+ if (os.platform() === 'darwin') {
+ candidates.push('/opt/homebrew/bin/ffmpeg', '/usr/local/bin/ffmpeg');
+ } else if (os.platform() === 'linux') {
+ candidates.push('/usr/bin/ffmpeg', '/usr/local/bin/ffmpeg');
+ } else if (os.platform() === 'win32') {
+ candidates.push('C:\\ffmpeg\\bin\\ffmpeg.exe');
+ }
+
+ for (const candidate of candidates) {
+ if (fs.existsSync(candidate)) {
+ cachedFfmpegPath = candidate;
+ return candidate;
+ }
+ }
+
+ throw new Error(
+ 'FFmpeg not found. Install FFmpeg and add it to your PATH.\n' +
+ ' macOS: brew install ffmpeg\n' +
+ ' Ubuntu: sudo apt install ffmpeg\n' +
+ ' Windows: Download from https://ffmpeg.org/download.html'
+ );
+}
diff --git a/packages/motionforge-renderer/src/index.ts b/packages/motionforge-renderer/src/index.ts
new file mode 100644
index 0000000..c676265
--- /dev/null
+++ b/packages/motionforge-renderer/src/index.ts
@@ -0,0 +1,7 @@
+export { renderMedia, type RenderMediaOptions, type RenderMediaResult } from './render-media.js';
+export { Pool } from './pool.js';
+export { ensureBrowser, ensureBrowserPath } from './open-browser.js';
+export { screenshotTask } from './screenshot.js';
+export { stitchFramesToVideo, type StitchOptions } from './stitch-frames.js';
+export { ensureFfmpeg } from './ensure-ffmpeg.js';
+export { createAudio, type AudioAsset } from './audio.js';
diff --git a/packages/motionforge-renderer/src/open-browser.ts b/packages/motionforge-renderer/src/open-browser.ts
new file mode 100644
index 0000000..c128551
--- /dev/null
+++ b/packages/motionforge-renderer/src/open-browser.ts
@@ -0,0 +1,78 @@
+import puppeteer, { type Browser } from 'puppeteer-core';
+import { execa } from 'execa';
+import * as os from 'os';
+import * as path from 'path';
+import * as fs from 'fs';
+
+let cachedBrowserPath: string | null = null;
+
+/**
+ * Ensure a Chrome binary is available and return its path.
+ * Downloads a known-good version if not found.
+ */
+export async function ensureBrowserPath(): Promise {
+ if (cachedBrowserPath) return cachedBrowserPath;
+
+ // Try to find an existing Chrome installation
+ const candidates: string[] = [];
+
+ if (os.platform() === 'darwin') {
+ candidates.push(
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
+ '/Applications/Chromium.app/Contents/MacOS/Chromium'
+ );
+ } else if (os.platform() === 'linux') {
+ candidates.push(
+ '/usr/bin/google-chrome',
+ '/usr/bin/chromium-browser',
+ '/usr/bin/chromium'
+ );
+ } else if (os.platform() === 'win32') {
+ candidates.push(
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
+ );
+ }
+
+ for (const candidate of candidates) {
+ if (fs.existsSync(candidate)) {
+ cachedBrowserPath = candidate;
+ return candidate;
+ }
+ }
+
+ // Fall back to puppeteer's bundled browser download
+ try {
+ const { executablePath } = await import('puppeteer');
+ cachedBrowserPath = executablePath();
+ return cachedBrowserPath;
+ } catch {
+ throw new Error(
+ 'No Chrome/Chromium installation found. Install Chrome or set PUPPETEER_EXECUTABLE_PATH.'
+ );
+ }
+}
+
+/**
+ * Launch a headless Chrome browser with optimized flags for video rendering.
+ */
+export async function ensureBrowser(): Promise {
+ const executablePath = await ensureBrowserPath();
+
+ return puppeteer.launch({
+ headless: true,
+ executablePath,
+ args: [
+ '--no-sandbox',
+ '--disable-setuid-sandbox',
+ '--disable-gpu-shm-usage',
+ '--mute-audio',
+ '--disable-extensions',
+ '--no-zygote',
+ '--disable-dev-shm-usage',
+ '--force-device-scale-factor=1',
+ '--hide-scrollbars',
+ ],
+ userDataDir: path.join(os.tmpdir(), `motionforge-chrome-${Date.now()}`),
+ });
+}
diff --git a/packages/motionforge-renderer/src/pool.ts b/packages/motionforge-renderer/src/pool.ts
new file mode 100644
index 0000000..233ae43
--- /dev/null
+++ b/packages/motionforge-renderer/src/pool.ts
@@ -0,0 +1,34 @@
+import type { Page } from 'puppeteer-core';
+
+/**
+ * Resource pool for concurrent frame rendering.
+ * Manages a fixed set of browser pages and distributes them to render tasks.
+ */
+export class Pool {
+ private resources: Page[];
+ private waiters: Array<{ resolve: (page: Page) => void }> = [];
+
+ constructor(pages: Page[]) {
+ this.resources = [...pages];
+ }
+
+ /** Acquire a page from the pool. Waits if none are available. */
+ async acquire(): Promise {
+ if (this.resources.length > 0) {
+ return this.resources.pop()!;
+ }
+ return new Promise((resolve) => {
+ this.waiters.push({ resolve });
+ });
+ }
+
+ /** Release a page back to the pool. */
+ release(page: Page): void {
+ if (this.waiters.length > 0) {
+ const waiter = this.waiters.shift()!;
+ waiter.resolve(page);
+ } else {
+ this.resources.push(page);
+ }
+ }
+}
diff --git a/packages/motionforge-renderer/src/render-media.ts b/packages/motionforge-renderer/src/render-media.ts
new file mode 100644
index 0000000..39b2113
--- /dev/null
+++ b/packages/motionforge-renderer/src/render-media.ts
@@ -0,0 +1,157 @@
+import puppeteer, { type Browser, type Page } from 'puppeteer-core';
+import { Pool } from './pool.js';
+import { ensureBrowser } from './open-browser.js';
+import { screenshotTask } from './screenshot.js';
+import { stitchFramesToVideo, type StitchOptions } from './stitch-frames.js';
+import * as os from 'os';
+
+export interface RenderMediaOptions {
+ /** Path to the bundled composition entry point (index.html) */
+ serveUrl: string;
+ /** Composition ID to render */
+ compositionId: string;
+ /** Output file path */
+ outputLocation: string;
+ /** Video codec */
+ codec: 'h264' | 'h265' | 'vp8' | 'vp9' | 'prores' | 'gif';
+ /** Frame rate */
+ fps: number;
+ /** Width in pixels */
+ width: number;
+ /** Height in pixels */
+ height: number;
+ /** Total number of frames */
+ durationInFrames: number;
+ /** Input props to inject */
+ inputProps?: Record;
+ /** Number of concurrent browser pages (default: half CPU cores) */
+ concurrency?: number;
+ /** Frame range to render [start, end] */
+ frameRange?: [number, number];
+ /** CRF quality value */
+ crf?: number;
+ /** Pixel format */
+ pixelFormat?: 'yuv420p' | 'yuv422p' | 'rgb24';
+ /** Quality preset */
+ quality?: 'low' | 'medium' | 'high';
+ /** Progress callback */
+ onProgress?: (progress: number) => void;
+ /** Abort signal */
+ signal?: AbortSignal;
+}
+
+export interface RenderMediaResult {
+ success: boolean;
+ outputLocation: string;
+ frameCount: number;
+ durationMs: number;
+ error?: string;
+}
+
+export async function renderMedia(options: RenderMediaOptions): Promise {
+ const startTime = Date.now();
+ const startFrame = options.frameRange?.[0] ?? 0;
+ const endFrame = options.frameRange?.[1] ?? options.durationInFrames - 1;
+ const totalFrames = endFrame - startFrame + 1;
+ const concurrency = options.concurrency ?? Math.max(1, Math.floor(os.cpus().length / 2));
+
+ let browser: Browser | null = null;
+
+ try {
+ // 1. Launch headless Chrome
+ browser = await ensureBrowser();
+
+ // 2. Create page pool
+ const pages: Page[] = [];
+ for (let i = 0; i < concurrency; i++) {
+ const page = await browser.newPage();
+ await page.setViewport({ width: options.width, height: options.height, deviceScaleFactor: 1 });
+ pages.push(page);
+ }
+ const pool = new Pool(pages);
+
+ // 3. Render frames
+ const frameBuffers: Buffer[] = new Array(totalFrames);
+ let renderedCount = 0;
+
+ const renderPromises = [];
+ for (let frame = startFrame; frame <= endFrame; frame++) {
+ renderPromises.push((async () => {
+ const page = await pool.acquire();
+ try {
+ const url = `${options.serveUrl}?composition=${options.compositionId}&frame=${frame}`;
+
+ await page.goto(url, { waitUntil: 'networkidle0', timeout: 30000 });
+
+ // Inject input props
+ if (options.inputProps) {
+ await page.evaluate((props) => {
+ (window as any).__MOTIONFORGE_INPUT_PROPS = props;
+ }, options.inputProps);
+ }
+
+ // Wait for delayRender/continueRender protocol
+ await page.waitForFunction(
+ 'window.__MOTIONFORGE_RENDER_READY !== false',
+ { timeout: 30000 }
+ );
+
+ // Wait for fonts to load
+ await page.evaluate(() => document.fonts.ready);
+
+ // Capture screenshot via CDP
+ const buffer = await screenshotTask(page, options.width, options.height);
+
+ const index = frame - startFrame;
+ frameBuffers[index] = buffer;
+ renderedCount++;
+
+ if (options.onProgress) {
+ options.onProgress(renderedCount / totalFrames);
+ }
+ } finally {
+ pool.release(page);
+ }
+ })());
+ }
+
+ await Promise.all(renderPromises);
+
+ // 4. Stitch frames to video
+ await stitchFramesToVideo({
+ frameBuffers,
+ outputPath: options.outputLocation,
+ fps: options.fps,
+ width: options.width,
+ height: options.height,
+ codec: options.codec,
+ crf: options.crf,
+ pixelFormat: options.pixelFormat,
+ quality: options.quality,
+ });
+
+ // 5. Close pages and browser
+ for (const page of pages) {
+ await page.close();
+ }
+
+ return {
+ success: true,
+ outputLocation: options.outputLocation,
+ frameCount: totalFrames,
+ durationMs: Date.now() - startTime,
+ };
+ } catch (error) {
+ return {
+ success: false,
+ outputLocation: options.outputLocation,
+ frameCount: 0,
+ durationMs: Date.now() - startTime,
+ error: error instanceof Error ? error.message : String(error),
+ };
+ } finally {
+ if (browser) {
+ await browser.close();
+ }
+ }
+}
diff --git a/packages/motionforge-renderer/src/screenshot.ts b/packages/motionforge-renderer/src/screenshot.ts
new file mode 100644
index 0000000..4a1dffa
--- /dev/null
+++ b/packages/motionforge-renderer/src/screenshot.ts
@@ -0,0 +1,30 @@
+import type { Page } from 'puppeteer-core';
+
+/**
+ * Capture a screenshot of the page using Chrome DevTools Protocol.
+ * Uses CDP directly for maximum control and performance.
+ */
+export async function screenshotTask(
+ page: Page,
+ width: number,
+ height: number
+): Promise {
+ const client = await page.createCDPSession();
+
+ // Activate the page target
+ await client.send('Target.activateTarget', {
+ targetId: (page as any)._targetId,
+ });
+
+ // Capture screenshot
+ const result = await client.send('Page.captureScreenshot', {
+ format: 'png',
+ clip: { x: 0, y: 0, width, height, scale: 1 },
+ captureBeyondViewport: true,
+ optimizeForSpeed: true,
+ });
+
+ await client.detach();
+
+ return Buffer.from(result.data, 'base64');
+}
diff --git a/packages/motionforge-renderer/src/stitch-frames.ts b/packages/motionforge-renderer/src/stitch-frames.ts
new file mode 100644
index 0000000..19a3270
--- /dev/null
+++ b/packages/motionforge-renderer/src/stitch-frames.ts
@@ -0,0 +1,135 @@
+import { execa } from 'execa';
+import * as path from 'path';
+import * as fs from 'fs';
+import * as os from 'os';
+
+export interface StitchOptions {
+ /** Array of PNG frame buffers (in order) */
+ frameBuffers?: Buffer[];
+ /** Path pattern for frame images on disk (alternative to frameBuffers) */
+ inputPattern?: string;
+ /** Output file path */
+ outputPath: string;
+ /** Frames per second */
+ fps: number;
+ /** Width in pixels */
+ width: number;
+ /** Height in pixels */
+ height: number;
+ /** Video codec */
+ codec: 'h264' | 'h265' | 'vp8' | 'vp9' | 'prores' | 'gif';
+ /** CRF quality value (default: codec-specific) */
+ crf?: number;
+ /** Pixel format */
+ pixelFormat?: 'yuv420p' | 'yuv422p' | 'rgb24';
+ /** Quality preset */
+ quality?: 'low' | 'medium' | 'high';
+ /** Path to audio file to include */
+ audioPath?: string;
+ /** Progress callback */
+ onProgress?: (progress: number) => void;
+}
+
+/**
+ * Stitch frame images into a video file using FFmpeg.
+ */
+export async function stitchFramesToVideo(options: StitchOptions): Promise {
+ const args: string[] = ['-y'];
+
+ // Input source
+ if (options.frameBuffers) {
+ // Pipe frames directly via stdin (parallel encoding)
+ args.push(
+ '-f', 'image2pipe',
+ '-s', `${options.width}x${options.height}`,
+ '-pix_fmt', 'rgba',
+ '-r', String(options.fps),
+ '-i', 'pipe:0'
+ );
+ } else if (options.inputPattern) {
+ // Read frame images from disk
+ args.push(
+ '-framerate', String(options.fps),
+ '-i', options.inputPattern
+ );
+ } else {
+ throw new Error('Must provide either frameBuffers or inputPattern');
+ }
+
+ // Audio input
+ if (options.audioPath && fs.existsSync(options.audioPath)) {
+ args.push('-i', options.audioPath, '-c:a', 'aac', '-b:a', '192k');
+ }
+
+ // Codec-specific arguments
+ switch (options.codec) {
+ case 'h264':
+ args.push('-c:v', 'libx264');
+ args.push('-crf', String(options.crf ?? 18));
+ args.push('-pix_fmt', options.pixelFormat ?? 'yuv420p');
+ args.push('-preset', options.quality === 'high' ? 'slow' : options.quality === 'low' ? 'ultrafast' : 'medium');
+ args.push('-movflags', 'faststart');
+ break;
+ case 'h265':
+ args.push('-c:v', 'libx265');
+ args.push('-crf', String(options.crf ?? 22));
+ args.push('-pix_fmt', options.pixelFormat ?? 'yuv420p');
+ args.push('-preset', options.quality === 'high' ? 'slow' : options.quality === 'low' ? 'ultrafast' : 'medium');
+ args.push('-movflags', 'faststart');
+ break;
+ case 'vp8':
+ args.push('-c:v', 'libvpx');
+ args.push('-crf', String(options.crf ?? 10));
+ args.push('-b:v', '0');
+ args.push('-pix_fmt', options.pixelFormat ?? 'yuv420p');
+ break;
+ case 'vp9':
+ args.push('-c:v', 'libvpx-vp9');
+ args.push('-crf', String(options.crf ?? 30));
+ args.push('-b:v', '0');
+ args.push('-pix_fmt', options.pixelFormat ?? 'yuv420p');
+ break;
+ case 'prores':
+ args.push('-c:v', 'prores_ks');
+ args.push('-profile:v', '3'); // ProRes 4444
+ args.push('-pix_fmt', options.pixelFormat ?? 'yuv422p');
+ break;
+ case 'gif':
+ args.push(
+ '-filter_complex',
+ `[0:v] fps=${Math.min(options.fps, 15)},split [a][b];[a] palettegen [p];[b][p] paletteuse`
+ );
+ break;
+ }
+
+ // Color space metadata
+ if (options.codec !== 'gif') {
+ args.push('-color_primaries', 'bt709', '-color_trc', 'bt709', '-colorspace', 'bt709');
+ }
+
+ args.push(options.outputPath);
+
+ // Execute FFmpeg
+ if (options.frameBuffers) {
+ // Pipe mode — write frames to stdin
+ const ffmpegProcess = execa('ffmpeg', args, { stdin: 'pipe', reject: false });
+
+ for (const buffer of options.frameBuffers) {
+ ffmpegProcess.stdin!.write(buffer);
+ }
+ ffmpegProcess.stdin!.end();
+
+ const result = await ffmpegProcess;
+ if (result.exitCode !== 0) {
+ throw new Error(`FFmpeg failed (exit ${result.exitCode}): ${result.stderr}`);
+ }
+ } else {
+ // File mode — just execute
+ const result = await execa('ffmpeg', args, { reject: false });
+ if (result.exitCode !== 0) {
+ throw new Error(`FFmpeg failed (exit ${result.exitCode}): ${result.stderr}`);
+ }
+ }
+
+ return options.outputPath;
+}
diff --git a/packages/motionforge-renderer/tsup.config.ts b/packages/motionforge-renderer/tsup.config.ts
new file mode 100644
index 0000000..a5e42a2
--- /dev/null
+++ b/packages/motionforge-renderer/tsup.config.ts
@@ -0,0 +1,9 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['esm', 'cjs'],
+ dts: false,
+ clean: true,
+ minify: true,
+});
diff --git a/packages/motionforge-studio/bun.lock b/packages/motionforge-studio/bun.lock
new file mode 100644
index 0000000..68b724b
--- /dev/null
+++ b/packages/motionforge-studio/bun.lock
@@ -0,0 +1,373 @@
+{
+ "lockfileVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "@motionforge/studio",
+ "dependencies": {
+ "clsx": "^2.1.1",
+ "lucide-react": "^1.17.0",
+ "motionforge": "1.4.0",
+ "tailwind-merge": "^3.6.0",
+ },
+ "devDependencies": {
+ "@types/react": "^19.2.16",
+ "@types/react-dom": "^19.2.3",
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3",
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0",
+ },
+ },
+ },
+ "packages": {
+ "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
+
+ "@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@mediapipe/tasks-vision": ["@mediapipe/tasks-vision@0.10.17", "", {}, "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg=="],
+
+ "@monogrid/gainmap-js": ["@monogrid/gainmap-js@3.4.0", "", { "dependencies": { "promise-worker-transferable": "^1.0.4" }, "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg=="],
+
+ "@react-three/drei": ["@react-three/drei@10.7.7", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^3.1.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ=="],
+
+ "@react-three/fiber": ["@react-three/fiber@9.6.1", "", { "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^2.0.0", "react-use-measure": "^2.1.7", "scheduler": "^0.27.0", "suspend-react": "^0.1.3", "use-sync-external-store": "^1.4.0", "zustand": "^5.0.3" }, "peerDependencies": { "expo": ">=43.0", "expo-asset": ">=8.4", "expo-file-system": ">=11.0", "expo-gl": ">=11.0", "react": ">=19 <19.3", "react-dom": ">=19 <19.3", "react-native": ">=0.78", "three": ">=0.156" }, "optionalPeers": ["expo", "expo-asset", "expo-file-system", "expo-gl", "react-dom", "react-native"] }, "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.61.0", "", { "os": "android", "cpu": "arm" }, "sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.61.0", "", { "os": "android", "cpu": "arm64" }, "sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.61.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.61.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.61.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.61.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.61.0", "", { "os": "linux", "cpu": "arm" }, "sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.61.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.61.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.61.0", "", { "os": "linux", "cpu": "none" }, "sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.61.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.61.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.61.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.61.0", "", { "os": "none", "cpu": "arm64" }, "sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.61.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.61.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.61.0", "", { "os": "win32", "cpu": "x64" }, "sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw=="],
+
+ "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="],
+
+ "@types/draco3d": ["@types/draco3d@1.4.10", "", {}, "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw=="],
+
+ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
+
+ "@types/offscreencanvas": ["@types/offscreencanvas@2019.7.3", "", {}, "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A=="],
+
+ "@types/react": ["@types/react@19.2.16", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w=="],
+
+ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
+
+ "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],
+
+ "@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="],
+
+ "@types/three": ["@types/three@0.184.1", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": ">=0.5.17", "fflate": "~0.8.2", "meshoptimizer": "~1.1.1" } }, "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA=="],
+
+ "@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="],
+
+ "@use-gesture/core": ["@use-gesture/core@10.3.1", "", {}, "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="],
+
+ "@use-gesture/react": ["@use-gesture/react@10.3.1", "", { "dependencies": { "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g=="],
+
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
+
+ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="],
+
+ "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
+ "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
+
+ "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
+
+ "camera-controls": ["camera-controls@3.1.2", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA=="],
+
+ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+ "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
+
+ "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
+
+ "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
+
+ "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "detect-gpu": ["detect-gpu@5.0.70", "", { "dependencies": { "webgl-constants": "^1.1.1" } }, "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w=="],
+
+ "draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="],
+
+ "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "fflate": ["fflate@0.6.10", "", {}, "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg=="],
+
+ "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
+
+ "framer-motion": ["framer-motion@12.40.0", "", { "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "glsl-noise": ["glsl-noise@0.0.0", "", {}, "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w=="],
+
+ "hls.js": ["hls.js@1.6.16", "", {}, "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="],
+
+ "is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "its-fine": ["its-fine@2.0.0", "", { "dependencies": { "@types/react-reconciler": "^0.28.9" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng=="],
+
+ "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
+
+ "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="],
+
+ "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
+
+ "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="],
+
+ "lottie-web": ["lottie-web@5.13.0", "", {}, "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ=="],
+
+ "lucide-react": ["lucide-react@1.17.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w=="],
+
+ "maath": ["maath@0.10.8", "", { "peerDependencies": { "@types/three": ">=0.134.0", "three": ">=0.134.0" } }, "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "meshline": ["meshline@3.3.1", "", { "peerDependencies": { "three": ">=0.137" } }, "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ=="],
+
+ "meshoptimizer": ["meshoptimizer@1.1.1", "", {}, "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g=="],
+
+ "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
+
+ "motion-dom": ["motion-dom@12.40.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg=="],
+
+ "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="],
+
+ "motionforge": ["motionforge@1.4.0", "", { "dependencies": { "lottie-web": "^5.13.0" }, "peerDependencies": { "@react-three/drei": ">=10.0.0", "@react-three/fiber": ">=9.0.0", "framer-motion": ">=12.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0", "three": ">=0.170.0" } }, "sha512-ozKkkNLE5Y8kAaHOk14yY2w3jJCaiWcUSyqWIkbpJWD903KpW+Z8W+GYYayBxpk9nVLI5ZfkBocEoYhWBtOGTA=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
+
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
+
+ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
+
+ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
+
+ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
+
+ "potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="],
+
+ "promise-worker-transferable": ["promise-worker-transferable@1.0.4", "", { "dependencies": { "is-promise": "^2.1.0", "lie": "^3.0.2" } }, "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw=="],
+
+ "react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="],
+
+ "react-dom": ["react-dom@19.2.6", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.6" } }, "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g=="],
+
+ "react-use-measure": ["react-use-measure@2.1.7", "", { "peerDependencies": { "react": ">=16.13", "react-dom": ">=16.13" }, "optionalPeers": ["react-dom"] }, "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg=="],
+
+ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
+ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "rollup": ["rollup@4.61.0", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.61.0", "@rollup/rollup-android-arm64": "4.61.0", "@rollup/rollup-darwin-arm64": "4.61.0", "@rollup/rollup-darwin-x64": "4.61.0", "@rollup/rollup-freebsd-arm64": "4.61.0", "@rollup/rollup-freebsd-x64": "4.61.0", "@rollup/rollup-linux-arm-gnueabihf": "4.61.0", "@rollup/rollup-linux-arm-musleabihf": "4.61.0", "@rollup/rollup-linux-arm64-gnu": "4.61.0", "@rollup/rollup-linux-arm64-musl": "4.61.0", "@rollup/rollup-linux-loong64-gnu": "4.61.0", "@rollup/rollup-linux-loong64-musl": "4.61.0", "@rollup/rollup-linux-ppc64-gnu": "4.61.0", "@rollup/rollup-linux-ppc64-musl": "4.61.0", "@rollup/rollup-linux-riscv64-gnu": "4.61.0", "@rollup/rollup-linux-riscv64-musl": "4.61.0", "@rollup/rollup-linux-s390x-gnu": "4.61.0", "@rollup/rollup-linux-x64-gnu": "4.61.0", "@rollup/rollup-linux-x64-musl": "4.61.0", "@rollup/rollup-openbsd-x64": "4.61.0", "@rollup/rollup-openharmony-arm64": "4.61.0", "@rollup/rollup-win32-arm64-msvc": "4.61.0", "@rollup/rollup-win32-ia32-msvc": "4.61.0", "@rollup/rollup-win32-x64-gnu": "4.61.0", "@rollup/rollup-win32-x64-msvc": "4.61.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g=="],
+
+ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "stats-gl": ["stats-gl@2.4.2", "", { "dependencies": { "@types/three": "*", "three": "^0.170.0" } }, "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ=="],
+
+ "stats.js": ["stats.js@0.17.0", "", {}, "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw=="],
+
+ "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
+
+ "suspend-react": ["suspend-react@0.1.3", "", { "peerDependencies": { "react": ">=17.0" } }, "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ=="],
+
+ "tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="],
+
+ "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
+
+ "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+
+ "three": ["three@0.184.0", "", {}, "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg=="],
+
+ "three-mesh-bvh": ["three-mesh-bvh@0.8.3", "", { "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg=="],
+
+ "three-stdlib": ["three-stdlib@2.36.1", "", { "dependencies": { "@types/draco3d": "^1.4.0", "@types/offscreencanvas": "^2019.6.4", "@types/webxr": "^0.5.2", "draco3d": "^1.4.1", "fflate": "^0.6.9", "potpack": "^1.0.1" }, "peerDependencies": { "three": ">=0.128.0" } }, "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg=="],
+
+ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
+
+ "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
+
+ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+
+ "troika-three-text": ["troika-three-text@0.52.4", "", { "dependencies": { "bidi-js": "^1.0.2", "troika-three-utils": "^0.52.4", "troika-worker-utils": "^0.52.0", "webgl-sdf-generator": "1.1.1" }, "peerDependencies": { "three": ">=0.125.0" } }, "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg=="],
+
+ "troika-three-utils": ["troika-three-utils@0.52.4", "", { "peerDependencies": { "three": ">=0.125.0" } }, "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A=="],
+
+ "troika-worker-utils": ["troika-worker-utils@0.52.0", "", {}, "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw=="],
+
+ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="],
+
+ "tunnel-rat": ["tunnel-rat@0.1.2", "", { "dependencies": { "zustand": "^4.3.2" } }, "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ=="],
+
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
+
+ "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
+
+ "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
+
+ "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="],
+
+ "webgl-constants": ["webgl-constants@1.1.1", "", {}, "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg=="],
+
+ "webgl-sdf-generator": ["webgl-sdf-generator@1.1.1", "", {}, "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "zustand": ["zustand@5.0.14", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="],
+
+ "@types/three/fflate": ["fflate@0.8.3", "", {}, "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA=="],
+
+ "stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="],
+
+ "tunnel-rat/zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["@types/react", "immer", "react"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="],
+ }
+}
diff --git a/packages/motionforge-studio/package.json b/packages/motionforge-studio/package.json
new file mode 100644
index 0000000..45974e0
--- /dev/null
+++ b/packages/motionforge-studio/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@motionforge/studio",
+ "version": "1.0.0",
+ "description": "Developer Studio for MotionForge",
+ "type": "module",
+ "scripts": {
+ "build": "tsup",
+ "dev": "tsup --watch"
+ },
+ "dependencies": {
+ "motionforge": "1.4.0",
+ "lucide-react": "^1.17.0",
+ "clsx": "^2.1.1",
+ "tailwind-merge": "^3.6.0"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
+ },
+ "devDependencies": {
+ "@types/react": "^19.2.16",
+ "@types/react-dom": "^19.2.3",
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3"
+ },
+ "publishConfig": {
+ "access": "public",
+ "registry": "https://registry.npmjs.org"
+ }
+}
diff --git a/packages/motionforge-studio/src/CompositionPicker.tsx b/packages/motionforge-studio/src/CompositionPicker.tsx
new file mode 100644
index 0000000..bf50f1e
--- /dev/null
+++ b/packages/motionforge-studio/src/CompositionPicker.tsx
@@ -0,0 +1,25 @@
+import React from 'react';
+
+export const CompositionPicker: React.FC<{
+ compositions: string[];
+ selectedId: string;
+ onSelect: (id: string) => void;
+}> = ({ compositions, selectedId, onSelect }) => {
+ return (
+
+ {compositions.map(id => (
+
+ ))}
+
+ );
+};
diff --git a/packages/motionforge-studio/src/PropsEditor.tsx b/packages/motionforge-studio/src/PropsEditor.tsx
new file mode 100644
index 0000000..5b23069
--- /dev/null
+++ b/packages/motionforge-studio/src/PropsEditor.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+
+export const PropsEditor: React.FC<{
+ props: Record;
+ onChange: (props: Record) => void;
+}> = ({ props, onChange }) => {
+ const [text, setText] = React.useState(JSON.stringify(props, null, 2));
+ const [error, setError] = React.useState(null);
+
+ const handleChange = (e: React.ChangeEvent) => {
+ const value = e.target.value;
+ setText(value);
+ try {
+ const parsed = JSON.parse(value);
+ onChange(parsed);
+ setError(null);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : 'Invalid JSON');
+ }
+ };
+
+ return (
+
+
+ {error && (
+
+ {error}
+
+ )}
+
+ );
+};
diff --git a/packages/motionforge-studio/src/Studio.tsx b/packages/motionforge-studio/src/Studio.tsx
new file mode 100644
index 0000000..fbdbe12
--- /dev/null
+++ b/packages/motionforge-studio/src/Studio.tsx
@@ -0,0 +1,67 @@
+import React from 'react';
+import { TimelineView, type SequenceTrack } from './TimelineView';
+import { Player } from 'motionforge';
+
+export const Studio: React.FC = () => {
+ return (
+
+
+
+
M
+
MotionForge Studio
+
+
+
+
+
+
+
+ {/* Left Sidebar - Composition Picker */}
+
+
+ {/* Center - Preview */}
+
+
+ {/* Player would go here */}
+
Select a composition to preview
+
+
+ {/* Bottom - Timeline */}
+
+ {}}
+ />
+
+
+
+ {/* Right Sidebar - Props Editor */}
+
+
+
+ );
+};
diff --git a/packages/motionforge-studio/src/TimelineView.tsx b/packages/motionforge-studio/src/TimelineView.tsx
new file mode 100644
index 0000000..67a8c8e
--- /dev/null
+++ b/packages/motionforge-studio/src/TimelineView.tsx
@@ -0,0 +1,99 @@
+import React, { useCallback, useRef, useState } from 'react';
+
+export interface SequenceTrack {
+ id: string;
+ label: string;
+ startFrame: number;
+ durationInFrames: number;
+ color: string;
+ type: 'video' | 'audio' | 'image' | 'container';
+ depth: number;
+ parentId?: string;
+}
+
+interface TimelineViewProps {
+ sequences: SequenceTrack[];
+ currentFrame: number;
+ totalFrames: number;
+ fps: number;
+ onSeek: (frame: number) => void;
+}
+
+export const TimelineView: React.FC = ({
+ sequences,
+ currentFrame,
+ totalFrames,
+ fps,
+ onSeek,
+}) => {
+ const timelineRef = useRef(null);
+ const [zoom, setZoom] = useState(1);
+
+ const formatTime = (frame: number): string => {
+ const seconds = frame / fps;
+ const mins = Math.floor(seconds / 60);
+ const secs = Math.floor(seconds % 60);
+ return `${mins}:${secs.toString().padStart(2, '0')}`;
+ };
+
+ const handleClick = useCallback((e: React.MouseEvent) => {
+ if (!timelineRef.current) return;
+ const rect = timelineRef.current.getBoundingClientRect();
+ const scrollLeft = timelineRef.current.scrollLeft;
+ const x = e.clientX - rect.left + scrollLeft;
+ const timelineWidth = rect.width * zoom;
+ const frame = Math.round((x / timelineWidth) * totalFrames);
+ onSeek(Math.max(0, Math.min(frame, totalFrames - 1)));
+ }, [totalFrames, zoom, onSeek]);
+
+ return (
+
+ {/* Time ruler */}
+
+ {Array.from({ length: Math.ceil(totalFrames / fps) + 1 }, (_, i) => (
+
+ {formatTime(i * fps)}
+
+ ))}
+
+
+ {/* Sequence tracks */}
+
+
+ {sequences.map(seq => (
+
= seq.startFrame && currentFrame < seq.startFrame + seq.durationInFrames ? 1 : 0.5,
+ }}
+ >
+ {seq.label}
+
+ ))}
+
+ {/* Playhead */}
+
+
+
+
+ {/* Click overlay */}
+
+
+ );
+};
diff --git a/packages/motionforge-studio/src/index.ts b/packages/motionforge-studio/src/index.ts
new file mode 100644
index 0000000..8275699
--- /dev/null
+++ b/packages/motionforge-studio/src/index.ts
@@ -0,0 +1,4 @@
+export * from './TimelineView.js';
+export * from './Studio.js';
+export * from './CompositionPicker.js';
+export * from './PropsEditor.js';
diff --git a/packages/motionforge-studio/tsup.config.ts b/packages/motionforge-studio/tsup.config.ts
new file mode 100644
index 0000000..05a15a7
--- /dev/null
+++ b/packages/motionforge-studio/tsup.config.ts
@@ -0,0 +1,10 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['esm', 'cjs'],
+ dts: false,
+ clean: true,
+ minify: true,
+ external: ['react', 'react-dom', 'motionforge'],
+});
diff --git a/packages/motionforge/bun.lock b/packages/motionforge/bun.lock
index 8e224f3..acecd9d 100644
--- a/packages/motionforge/bun.lock
+++ b/packages/motionforge/bun.lock
@@ -7,20 +7,33 @@
"lottie-web": "^5.13.0",
},
"devDependencies": {
- "@types/react": "^19.0.0",
- "@types/react-dom": "^19.0.0",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
- "tsup": "^8.0.0",
- "typescript": "^5.0.0",
+ "@react-three/drei": "^10.7.7",
+ "@react-three/fiber": "^9.6.1",
+ "@types/react": "^19.2.16",
+ "@types/react-dom": "^19.2.3",
+ "@types/three": "^0.184.1",
+ "framer-motion": "^12.40.0",
+ "react": "^19.2.7",
+ "react-dom": "^19.2.7",
+ "three": "^0.184.0",
+ "tsup": "^8.5.1",
+ "typescript": "^6.0.3",
},
"peerDependencies": {
+ "@react-three/drei": ">=10.0.0",
+ "@react-three/fiber": ">=9.0.0",
+ "framer-motion": ">=12.0.0",
"react": ">=18.0.0",
"react-dom": ">=18.0.0",
+ "three": ">=0.170.0",
},
},
},
"packages": {
+ "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
+
+ "@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="],
+
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="],
"@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="],
@@ -81,6 +94,14 @@
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+ "@mediapipe/tasks-vision": ["@mediapipe/tasks-vision@0.10.17", "", {}, "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg=="],
+
+ "@monogrid/gainmap-js": ["@monogrid/gainmap-js@3.4.0", "", { "dependencies": { "promise-worker-transferable": "^1.0.4" }, "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg=="],
+
+ "@react-three/drei": ["@react-three/drei@10.7.7", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^3.1.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ=="],
+
+ "@react-three/fiber": ["@react-three/fiber@9.6.1", "", { "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^2.0.0", "react-use-measure": "^2.1.7", "scheduler": "^0.27.0", "suspend-react": "^0.1.3", "use-sync-external-store": "^1.4.0", "zustand": "^5.0.3" }, "peerDependencies": { "expo": ">=43.0", "expo-asset": ">=8.4", "expo-file-system": ">=11.0", "expo-gl": ">=11.0", "react": ">=19 <19.3", "react-dom": ">=19 <19.3", "react-native": ">=0.78", "three": ">=0.156" }, "optionalPeers": ["expo", "expo-asset", "expo-file-system", "expo-gl", "react-dom", "react-native"] }, "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg=="],
+
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.57.1", "", { "os": "android", "cpu": "arm" }, "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg=="],
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.57.1", "", { "os": "android", "cpu": "arm64" }, "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w=="],
@@ -131,20 +152,46 @@
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA=="],
+ "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="],
+
+ "@types/draco3d": ["@types/draco3d@1.4.10", "", {}, "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw=="],
+
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
- "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
+ "@types/offscreencanvas": ["@types/offscreencanvas@2019.7.3", "", {}, "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A=="],
+
+ "@types/react": ["@types/react@19.2.16", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w=="],
"@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
+ "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],
+
+ "@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="],
+
+ "@types/three": ["@types/three@0.184.1", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": ">=0.5.17", "fflate": "~0.8.2", "meshoptimizer": "~1.1.1" } }, "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA=="],
+
+ "@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="],
+
+ "@use-gesture/core": ["@use-gesture/core@10.3.1", "", {}, "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="],
+
+ "@use-gesture/react": ["@use-gesture/react@10.3.1", "", { "dependencies": { "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g=="],
+
"acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
"any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="],
+
+ "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
"bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
"cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
+ "camera-controls": ["camera-controls@3.1.2", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA=="],
+
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
"commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
@@ -153,20 +200,48 @@
"consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
+ "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+ "detect-gpu": ["detect-gpu@5.0.70", "", { "dependencies": { "webgl-constants": "^1.1.1" } }, "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w=="],
+
+ "draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="],
+
"esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="],
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+ "fflate": ["fflate@0.8.3", "", {}, "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA=="],
+
"fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
+ "framer-motion": ["framer-motion@12.40.0", "", { "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg=="],
+
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+ "glsl-noise": ["glsl-noise@0.0.0", "", {}, "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w=="],
+
+ "hls.js": ["hls.js@1.6.16", "", {}, "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="],
+
+ "is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "its-fine": ["its-fine@2.0.0", "", { "dependencies": { "@types/react-reconciler": "^0.28.9" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng=="],
+
"joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
+ "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="],
+
"lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
@@ -175,16 +250,28 @@
"lottie-web": ["lottie-web@5.13.0", "", {}, "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ=="],
+ "maath": ["maath@0.10.8", "", { "peerDependencies": { "@types/three": ">=0.134.0", "three": ">=0.134.0" } }, "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g=="],
+
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+ "meshline": ["meshline@3.3.1", "", { "peerDependencies": { "three": ">=0.137" } }, "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ=="],
+
+ "meshoptimizer": ["meshoptimizer@1.1.1", "", {}, "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g=="],
+
"mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="],
+ "motion-dom": ["motion-dom@12.40.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg=="],
+
+ "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="],
+
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
"pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
@@ -197,38 +284,90 @@
"postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
+ "potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="],
+
+ "promise-worker-transferable": ["promise-worker-transferable@1.0.4", "", { "dependencies": { "is-promise": "^2.1.0", "lie": "^3.0.2" } }, "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw=="],
+
"react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
"react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="],
+ "react-use-measure": ["react-use-measure@2.1.7", "", { "peerDependencies": { "react": ">=16.13", "react-dom": ">=16.13" }, "optionalPeers": ["react-dom"] }, "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg=="],
+
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
"resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
"rollup": ["rollup@4.57.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.57.1", "@rollup/rollup-android-arm64": "4.57.1", "@rollup/rollup-darwin-arm64": "4.57.1", "@rollup/rollup-darwin-x64": "4.57.1", "@rollup/rollup-freebsd-arm64": "4.57.1", "@rollup/rollup-freebsd-x64": "4.57.1", "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", "@rollup/rollup-linux-arm-musleabihf": "4.57.1", "@rollup/rollup-linux-arm64-gnu": "4.57.1", "@rollup/rollup-linux-arm64-musl": "4.57.1", "@rollup/rollup-linux-loong64-gnu": "4.57.1", "@rollup/rollup-linux-loong64-musl": "4.57.1", "@rollup/rollup-linux-ppc64-gnu": "4.57.1", "@rollup/rollup-linux-ppc64-musl": "4.57.1", "@rollup/rollup-linux-riscv64-gnu": "4.57.1", "@rollup/rollup-linux-riscv64-musl": "4.57.1", "@rollup/rollup-linux-s390x-gnu": "4.57.1", "@rollup/rollup-linux-x64-gnu": "4.57.1", "@rollup/rollup-linux-x64-musl": "4.57.1", "@rollup/rollup-openbsd-x64": "4.57.1", "@rollup/rollup-openharmony-arm64": "4.57.1", "@rollup/rollup-win32-arm64-msvc": "4.57.1", "@rollup/rollup-win32-ia32-msvc": "4.57.1", "@rollup/rollup-win32-x64-gnu": "4.57.1", "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A=="],
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
"source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+ "stats-gl": ["stats-gl@2.4.2", "", { "dependencies": { "@types/three": "*", "three": "^0.170.0" } }, "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ=="],
+
+ "stats.js": ["stats.js@0.17.0", "", {}, "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw=="],
+
"sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
+ "suspend-react": ["suspend-react@0.1.3", "", { "peerDependencies": { "react": ">=17.0" } }, "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ=="],
+
"thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
"thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+ "three": ["three@0.184.0", "", {}, "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg=="],
+
+ "three-mesh-bvh": ["three-mesh-bvh@0.8.3", "", { "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg=="],
+
+ "three-stdlib": ["three-stdlib@2.36.1", "", { "dependencies": { "@types/draco3d": "^1.4.0", "@types/offscreencanvas": "^2019.6.4", "@types/webxr": "^0.5.2", "draco3d": "^1.4.1", "fflate": "^0.6.9", "potpack": "^1.0.1" }, "peerDependencies": { "three": ">=0.128.0" } }, "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg=="],
+
"tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
"tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+ "troika-three-text": ["troika-three-text@0.52.4", "", { "dependencies": { "bidi-js": "^1.0.2", "troika-three-utils": "^0.52.4", "troika-worker-utils": "^0.52.0", "webgl-sdf-generator": "1.1.1" }, "peerDependencies": { "three": ">=0.125.0" } }, "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg=="],
+
+ "troika-three-utils": ["troika-three-utils@0.52.4", "", { "peerDependencies": { "three": ">=0.125.0" } }, "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A=="],
+
+ "troika-worker-utils": ["troika-worker-utils@0.52.0", "", {}, "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw=="],
+
"ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
"tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="],
- "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+ "tunnel-rat": ["tunnel-rat@0.1.2", "", { "dependencies": { "zustand": "^4.3.2" } }, "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ=="],
+
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
"ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
+
+ "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
+
+ "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="],
+
+ "webgl-constants": ["webgl-constants@1.1.1", "", {}, "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg=="],
+
+ "webgl-sdf-generator": ["webgl-sdf-generator@1.1.1", "", {}, "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "zustand": ["zustand@5.0.14", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="],
+
+ "stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="],
+
+ "three-stdlib/fflate": ["fflate@0.6.10", "", {}, "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg=="],
+
+ "tunnel-rat/zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["@types/react", "immer", "react"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="],
}
}
diff --git a/packages/motionforge/dist/chunk-HPDG2U2L.js b/packages/motionforge/dist/chunk-HPDG2U2L.js
deleted file mode 100644
index c648733..0000000
--- a/packages/motionforge/dist/chunk-HPDG2U2L.js
+++ /dev/null
@@ -1,505 +0,0 @@
-// src/renderer/export.ts
-var CanvasRenderer = class {
- constructor(config) {
- this.config = config;
- this.canvas = document.createElement("canvas");
- this.canvas.width = config.width;
- this.canvas.height = config.height;
- const ctx = this.canvas.getContext("2d", {
- alpha: false,
- willReadFrequently: true
- });
- if (!ctx) {
- throw new Error("Failed to get 2D context");
- }
- this.ctx = ctx;
- }
- /**
- * Capture a single frame from a DOM element
- */
- async captureFrame(element) {
- this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
- if (element instanceof HTMLCanvasElement) {
- this.ctx.drawImage(element, 0, 0, this.canvas.width, this.canvas.height);
- } else if (element instanceof HTMLImageElement) {
- this.ctx.drawImage(element, 0, 0, this.canvas.width, this.canvas.height);
- } else {
- try {
- const data = await this.domToDataUrl(element);
- const img = await this.loadImage(data);
- this.ctx.drawImage(img, 0, 0, this.canvas.width, this.canvas.height);
- } catch (e) {
- console.error("Failed to capture frame:", e);
- this.ctx.fillStyle = "#0a0a0a";
- this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
- }
- }
- return this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
- }
- async domToDataUrl(element) {
- const width = this.config.width;
- const height = this.config.height;
- const clone = element.cloneNode(true);
- this.inlineStyles(element, clone);
- const svg = `
-
- `;
- return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
- }
- inlineStyles(source, target) {
- const computed = window.getComputedStyle(source);
- for (const key of Array.from(computed)) {
- target.style.setProperty(key, computed.getPropertyValue(key), computed.getPropertyPriority(key));
- }
- for (let i = 0; i < source.children.length; i++) {
- this.inlineStyles(source.children[i], target.children[i]);
- }
- }
- loadImage(src) {
- return new Promise((resolve, reject) => {
- const img = new Image();
- img.onload = () => resolve(img);
- img.onerror = reject;
- img.src = src;
- });
- }
- /**
- * Convert ImageData to Blob
- */
- async imageDataToBlob(imageData, format = "image/png") {
- this.canvas.width = imageData.width;
- this.canvas.height = imageData.height;
- this.ctx.putImageData(imageData, 0, 0);
- return new Promise((resolve, reject) => {
- this.canvas.toBlob((blob) => {
- if (blob) {
- resolve(blob);
- } else {
- reject(new Error("Failed to convert to blob"));
- }
- }, format);
- });
- }
- /**
- * Convert ImageData to data URL
- */
- imageDataToDataURL(imageData, format = "image/png") {
- this.canvas.width = imageData.width;
- this.canvas.height = imageData.height;
- this.ctx.putImageData(imageData, 0, 0);
- return this.canvas.toDataURL(format);
- }
- /**
- * Get canvas element
- */
- getCanvas() {
- return this.canvas;
- }
- /**
- * Get context
- */
- getContext() {
- return this.ctx;
- }
- /**
- * Dispose renderer
- */
- dispose() {
- this.canvas.remove();
- }
-};
-var WebCodecsEncoder = class {
- constructor(config) {
- this.encoder = null;
- this.chunks = [];
- this.frameCount = 0;
- this.config = config;
- }
- async start(fps, bitrate = 5e6) {
- if (typeof VideoEncoder === "undefined") {
- throw new Error("WebCodecs is not supported in this browser");
- }
- this.chunks = [];
- this.frameCount = 0;
- const init = {
- output: (chunk) => {
- const data = new Uint8Array(chunk.byteLength);
- chunk.copyTo(data);
- this.chunks.push(new Blob([data], { type: "video/webm" }));
- },
- error: (e) => console.error(e)
- };
- this.encoder = new VideoEncoder(init);
- const config = {
- codec: "vp09.00.10.08",
- width: this.config.width,
- height: this.config.height,
- bitrate,
- framerate: fps
- };
- this.encoder.configure(config);
- }
- async addFrame(canvas) {
- if (!this.encoder) return;
- const frame = new VideoFrame(canvas, {
- timestamp: this.frameCount * 1e6 / this.config.fps
- });
- this.encoder.encode(frame, { keyFrame: this.frameCount % 60 === 0 });
- frame.close();
- this.frameCount++;
- }
- async stop() {
- if (!this.encoder) return new Blob();
- await this.encoder.flush();
- this.encoder.close();
- this.encoder = null;
- return new Blob(this.chunks, { type: "video/webm" });
- }
-};
-var WebMEncoder = class {
- constructor(canvas) {
- this.mediaRecorder = null;
- this.chunks = [];
- this.stream = null;
- this.canvas = canvas;
- }
- /**
- * Start recording
- */
- async start(fps, bitrate = 5e6) {
- this.chunks = [];
- this.stream = this.canvas.captureStream(fps);
- const mimeTypes = [
- "video/webm;codecs=vp9",
- "video/webm;codecs=vp8",
- "video/webm"
- ];
- let mimeType = "";
- for (const type of mimeTypes) {
- if (MediaRecorder.isTypeSupported(type)) {
- mimeType = type;
- break;
- }
- }
- if (!mimeType) {
- throw new Error("No supported WebM codec found");
- }
- this.mediaRecorder = new MediaRecorder(this.stream, {
- mimeType,
- videoBitsPerSecond: bitrate
- });
- return new Promise((resolve, reject) => {
- if (!this.mediaRecorder) {
- reject(new Error("Failed to create MediaRecorder"));
- return;
- }
- this.mediaRecorder.ondataavailable = (e) => {
- if (e.data.size > 0) {
- this.chunks.push(e.data);
- }
- };
- this.mediaRecorder.onstart = () => resolve();
- this.mediaRecorder.onerror = (e) => reject(e);
- this.mediaRecorder.start();
- });
- }
- /**
- * Stop recording and get result
- */
- async stop() {
- return new Promise((resolve, reject) => {
- if (!this.mediaRecorder) {
- reject(new Error("MediaRecorder not started"));
- return;
- }
- this.mediaRecorder.onstop = () => {
- const blob = new Blob(this.chunks, { type: "video/webm" });
- resolve(blob);
- };
- this.mediaRecorder.stop();
- if (this.stream) {
- this.stream.getTracks().forEach((track) => track.stop());
- }
- });
- }
- /**
- * Check if recording
- */
- isRecording() {
- return this.mediaRecorder?.state === "recording";
- }
-};
-var FrameSequenceEncoder = class {
- constructor() {
- this.frames = [];
- this.delays = [];
- }
- /**
- * Add a frame
- */
- addFrame(imageData, delay) {
- this.frames.push(imageData);
- this.delays.push(delay);
- }
- /**
- * Get all frames
- */
- getFrames() {
- return this.frames;
- }
- /**
- * Clear frames
- */
- clear() {
- this.frames = [];
- this.delays = [];
- }
- /**
- * Get frame count
- */
- getFrameCount() {
- return this.frames.length;
- }
-};
-var VideoExportManager = class {
- constructor() {
- this.renderer = null;
- this.encoder = null;
- this.isRendering = false;
- this.abortController = null;
- }
- /**
- * Export video by driving frames manually (frame-by-frame)
- * This is much more robust than real-time recording
- */
- async exportVideo(setFrame, element, options) {
- const startTime = Date.now();
- const { config, onProgress, signal } = options;
- const useWebCodecs = typeof VideoEncoder !== "undefined";
- try {
- this.isRendering = true;
- this.abortController = new AbortController();
- const mergedSignal = this.mergeSignals(signal, this.abortController.signal);
- this.renderer = new CanvasRenderer(config);
- const canvas = this.renderer.getCanvas();
- const bitrate = options.rendererConfig?.bitrate ?? 5e6;
- let webCodecsEncoder = null;
- if (useWebCodecs) {
- webCodecsEncoder = new WebCodecsEncoder(config);
- await webCodecsEncoder.start(config.fps, bitrate);
- } else {
- this.encoder = new WebMEncoder(canvas);
- await this.encoder.start(config.fps, bitrate);
- }
- for (let frame = 0; frame < config.durationInFrames; frame++) {
- if (mergedSignal.aborted) throw new Error("Render aborted");
- setFrame(frame);
- await new Promise((resolve) => requestAnimationFrame(resolve));
- await new Promise((resolve) => setTimeout(resolve, 20));
- await this.renderer.captureFrame(element);
- if (useWebCodecs && webCodecsEncoder) {
- await webCodecsEncoder.addFrame(canvas);
- } else {
- await new Promise((resolve) => setTimeout(resolve, 1e3 / config.fps));
- }
- if (onProgress) {
- onProgress(calculateProgress(frame, config.durationInFrames, startTime));
- }
- }
- const blob = useWebCodecs && webCodecsEncoder ? await webCodecsEncoder.stop() : await this.encoder.stop();
- const url = URL.createObjectURL(blob);
- return {
- success: true,
- blob,
- url,
- frameCount: config.durationInFrames,
- duration: Date.now() - startTime
- };
- } catch (error) {
- return {
- success: false,
- frameCount: 0,
- duration: Date.now() - startTime,
- error: error instanceof Error ? error.message : "Unknown error"
- };
- } finally {
- this.isRendering = false;
- this.encoder = null;
- if (this.renderer) {
- this.renderer.dispose();
- this.renderer = null;
- }
- }
- }
- /**
- * Export video from frames (LEGACY/REAL-TIME)
- */
- async exportFromCanvas(canvas, options) {
- const startTime = Date.now();
- const { config, signal } = options;
- try {
- this.isRendering = true;
- this.abortController = new AbortController();
- const mergedSignal = this.mergeSignals(signal, this.abortController.signal);
- this.encoder = new WebMEncoder(canvas);
- const bitrate = options.rendererConfig?.bitrate ?? 5e6;
- await this.encoder.start(config.fps, bitrate);
- const durationMs = config.durationInFrames / config.fps * 1e3;
- await new Promise((resolve, reject) => {
- const timeout = setTimeout(resolve, durationMs + 500);
- const checkAbort = () => {
- if (mergedSignal.aborted) {
- clearTimeout(timeout);
- reject(new Error("Render aborted"));
- } else if (this.isRendering) {
- requestAnimationFrame(checkAbort);
- }
- };
- checkAbort();
- });
- const blob = await this.encoder.stop();
- const url = URL.createObjectURL(blob);
- return {
- success: true,
- blob,
- url,
- frameCount: config.durationInFrames,
- duration: Date.now() - startTime
- };
- } catch (error) {
- return {
- success: false,
- frameCount: 0,
- duration: Date.now() - startTime,
- error: error instanceof Error ? error.message : "Unknown error"
- };
- } finally {
- this.isRendering = false;
- this.encoder = null;
- }
- }
- /**
- * Export frame sequence as images
- */
- async exportFrames(frames, format = "png") {
- const canvasRenderer = new CanvasRenderer({
- width: frames[0]?.width ?? 1920,
- height: frames[0]?.height ?? 1080,
- fps: 30,
- durationInFrames: frames.length
- });
- const blobs = [];
- const mimeType = `image/${format === "jpeg" ? "jpeg" : format}`;
- for (let i = 0; i < frames.length; i++) {
- const blob = await canvasRenderer.imageDataToBlob(frames[i], mimeType);
- blobs.push(blob);
- }
- canvasRenderer.dispose();
- return blobs;
- }
- /**
- * Create downloadable zip of frames
- */
- async createFrameZip(frames, compositionId) {
- if (frames.length === 0) {
- throw new Error("No frames to zip");
- }
- const canvasRenderer = new CanvasRenderer({
- width: frames[0].width,
- height: frames[0].height,
- fps: 30,
- durationInFrames: frames.length
- });
- const blobs = await this.exportFrames(frames, "png");
- canvasRenderer.dispose();
- return blobs[0];
- }
- /**
- * Abort current render
- */
- abort() {
- if (this.abortController) {
- this.abortController.abort();
- }
- this.isRendering = false;
- this.encoder = null;
- }
- /**
- * Check if currently rendering
- */
- getIsRendering() {
- return this.isRendering;
- }
- /**
- * Merge multiple abort signals
- */
- mergeSignals(...signals) {
- const controller = new AbortController();
- for (const signal of signals) {
- if (signal) {
- if (signal.aborted) {
- controller.abort();
- break;
- }
- signal.addEventListener("abort", () => controller.abort());
- }
- }
- return controller.signal;
- }
-};
-function calculateProgress(frame, totalFrames, startTime) {
- const elapsedMs = Date.now() - startTime;
- const percentage = frame / totalFrames * 100;
- const framesPerSecond = frame > 0 ? frame / elapsedMs * 1e3 : 0;
- const estimatedRemainingMs = framesPerSecond > 0 ? (totalFrames - frame) / framesPerSecond * 1e3 : 0;
- return {
- frame,
- totalFrames,
- percentage,
- elapsedMs,
- estimatedRemainingMs,
- framesPerSecond
- };
-}
-function estimateFileSize(config, bitrate = 5e6) {
- const durationSeconds = config.durationInFrames / config.fps;
- return Math.ceil(bitrate * durationSeconds / 8);
-}
-function checkEncodingSupport() {
- const webm = MediaRecorder.isTypeSupported("video/webm");
- const mp4 = MediaRecorder.isTypeSupported("video/mp4");
- const codecs = [];
- const testCodecs = [
- "video/webm;codecs=vp9",
- "video/webm;codecs=vp8",
- "video/mp4;codecs=h264",
- "video/mp4;codecs=avc1"
- ];
- for (const codec of testCodecs) {
- if (MediaRecorder.isTypeSupported(codec)) {
- codecs.push(codec);
- }
- }
- return { webm, mp4, codecs };
-}
-var videoExportManager = new VideoExportManager();
-var export_default = VideoExportManager;
-
-export {
- CanvasRenderer,
- WebCodecsEncoder,
- WebMEncoder,
- FrameSequenceEncoder,
- VideoExportManager,
- calculateProgress,
- estimateFileSize,
- checkEncodingSupport,
- videoExportManager,
- export_default
-};
diff --git a/packages/motionforge/dist/export-XU23RXHF.js b/packages/motionforge/dist/export-XU23RXHF.js
deleted file mode 100644
index b41f9ab..0000000
--- a/packages/motionforge/dist/export-XU23RXHF.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import {
- CanvasRenderer,
- FrameSequenceEncoder,
- VideoExportManager,
- WebCodecsEncoder,
- WebMEncoder,
- calculateProgress,
- checkEncodingSupport,
- estimateFileSize,
- export_default,
- videoExportManager
-} from "./chunk-HPDG2U2L.js";
-export {
- CanvasRenderer,
- FrameSequenceEncoder,
- VideoExportManager,
- WebCodecsEncoder,
- WebMEncoder,
- calculateProgress,
- checkEncodingSupport,
- export_default as default,
- estimateFileSize,
- videoExportManager
-};
diff --git a/packages/motionforge/dist/index.cjs b/packages/motionforge/dist/index.cjs
deleted file mode 100644
index 34b264a..0000000
--- a/packages/motionforge/dist/index.cjs
+++ /dev/null
@@ -1,5218 +0,0 @@
-'use strict';
-
-var React3 = require('react');
-var jsxRuntime = require('react/jsx-runtime');
-
-function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
-
-var React3__default = /*#__PURE__*/_interopDefault(React3);
-
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __esm = (fn, res) => function __init() {
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
-};
-var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
-};
-
-// src/renderer/export.ts
-var export_exports = {};
-__export(export_exports, {
- CanvasRenderer: () => exports.CanvasRenderer,
- FrameSequenceEncoder: () => exports.FrameSequenceEncoder,
- VideoExportManager: () => exports.VideoExportManager,
- WebCodecsEncoder: () => WebCodecsEncoder,
- WebMEncoder: () => exports.WebMEncoder,
- calculateProgress: () => calculateProgress,
- checkEncodingSupport: () => checkEncodingSupport,
- default: () => export_default,
- estimateFileSize: () => estimateFileSize,
- videoExportManager: () => exports.videoExportManager
-});
-function calculateProgress(frame, totalFrames, startTime) {
- const elapsedMs = Date.now() - startTime;
- const percentage = frame / totalFrames * 100;
- const framesPerSecond = frame > 0 ? frame / elapsedMs * 1e3 : 0;
- const estimatedRemainingMs = framesPerSecond > 0 ? (totalFrames - frame) / framesPerSecond * 1e3 : 0;
- return {
- frame,
- totalFrames,
- percentage,
- elapsedMs,
- estimatedRemainingMs,
- framesPerSecond
- };
-}
-function estimateFileSize(config, bitrate = 5e6) {
- const durationSeconds = config.durationInFrames / config.fps;
- return Math.ceil(bitrate * durationSeconds / 8);
-}
-function checkEncodingSupport() {
- const webm = MediaRecorder.isTypeSupported("video/webm");
- const mp4 = MediaRecorder.isTypeSupported("video/mp4");
- const codecs = [];
- const testCodecs = [
- "video/webm;codecs=vp9",
- "video/webm;codecs=vp8",
- "video/mp4;codecs=h264",
- "video/mp4;codecs=avc1"
- ];
- for (const codec of testCodecs) {
- if (MediaRecorder.isTypeSupported(codec)) {
- codecs.push(codec);
- }
- }
- return { webm, mp4, codecs };
-}
-exports.CanvasRenderer = void 0; var WebCodecsEncoder; exports.WebMEncoder = void 0; exports.FrameSequenceEncoder = void 0; exports.VideoExportManager = void 0; exports.videoExportManager = void 0; var export_default;
-var init_export = __esm({
- "src/renderer/export.ts"() {
- exports.CanvasRenderer = class {
- constructor(config) {
- this.config = config;
- this.canvas = document.createElement("canvas");
- this.canvas.width = config.width;
- this.canvas.height = config.height;
- const ctx = this.canvas.getContext("2d", {
- alpha: false,
- willReadFrequently: true
- });
- if (!ctx) {
- throw new Error("Failed to get 2D context");
- }
- this.ctx = ctx;
- }
- /**
- * Capture a single frame from a DOM element
- */
- async captureFrame(element) {
- this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
- if (element instanceof HTMLCanvasElement) {
- this.ctx.drawImage(element, 0, 0, this.canvas.width, this.canvas.height);
- } else if (element instanceof HTMLImageElement) {
- this.ctx.drawImage(element, 0, 0, this.canvas.width, this.canvas.height);
- } else {
- try {
- const data = await this.domToDataUrl(element);
- const img = await this.loadImage(data);
- this.ctx.drawImage(img, 0, 0, this.canvas.width, this.canvas.height);
- } catch (e) {
- console.error("Failed to capture frame:", e);
- this.ctx.fillStyle = "#0a0a0a";
- this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
- }
- }
- return this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
- }
- async domToDataUrl(element) {
- const width = this.config.width;
- const height = this.config.height;
- const clone = element.cloneNode(true);
- this.inlineStyles(element, clone);
- const svg = `
-
- `;
- return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
- }
- inlineStyles(source, target) {
- const computed = window.getComputedStyle(source);
- for (const key of Array.from(computed)) {
- target.style.setProperty(key, computed.getPropertyValue(key), computed.getPropertyPriority(key));
- }
- for (let i = 0; i < source.children.length; i++) {
- this.inlineStyles(source.children[i], target.children[i]);
- }
- }
- loadImage(src) {
- return new Promise((resolve, reject) => {
- const img = new Image();
- img.onload = () => resolve(img);
- img.onerror = reject;
- img.src = src;
- });
- }
- /**
- * Convert ImageData to Blob
- */
- async imageDataToBlob(imageData, format = "image/png") {
- this.canvas.width = imageData.width;
- this.canvas.height = imageData.height;
- this.ctx.putImageData(imageData, 0, 0);
- return new Promise((resolve, reject) => {
- this.canvas.toBlob((blob) => {
- if (blob) {
- resolve(blob);
- } else {
- reject(new Error("Failed to convert to blob"));
- }
- }, format);
- });
- }
- /**
- * Convert ImageData to data URL
- */
- imageDataToDataURL(imageData, format = "image/png") {
- this.canvas.width = imageData.width;
- this.canvas.height = imageData.height;
- this.ctx.putImageData(imageData, 0, 0);
- return this.canvas.toDataURL(format);
- }
- /**
- * Get canvas element
- */
- getCanvas() {
- return this.canvas;
- }
- /**
- * Get context
- */
- getContext() {
- return this.ctx;
- }
- /**
- * Dispose renderer
- */
- dispose() {
- this.canvas.remove();
- }
- };
- WebCodecsEncoder = class {
- constructor(config) {
- this.encoder = null;
- this.chunks = [];
- this.frameCount = 0;
- this.config = config;
- }
- async start(fps, bitrate = 5e6) {
- if (typeof VideoEncoder === "undefined") {
- throw new Error("WebCodecs is not supported in this browser");
- }
- this.chunks = [];
- this.frameCount = 0;
- const init = {
- output: (chunk) => {
- const data = new Uint8Array(chunk.byteLength);
- chunk.copyTo(data);
- this.chunks.push(new Blob([data], { type: "video/webm" }));
- },
- error: (e) => console.error(e)
- };
- this.encoder = new VideoEncoder(init);
- const config = {
- codec: "vp09.00.10.08",
- width: this.config.width,
- height: this.config.height,
- bitrate,
- framerate: fps
- };
- this.encoder.configure(config);
- }
- async addFrame(canvas) {
- if (!this.encoder) return;
- const frame = new VideoFrame(canvas, {
- timestamp: this.frameCount * 1e6 / this.config.fps
- });
- this.encoder.encode(frame, { keyFrame: this.frameCount % 60 === 0 });
- frame.close();
- this.frameCount++;
- }
- async stop() {
- if (!this.encoder) return new Blob();
- await this.encoder.flush();
- this.encoder.close();
- this.encoder = null;
- return new Blob(this.chunks, { type: "video/webm" });
- }
- };
- exports.WebMEncoder = class {
- constructor(canvas) {
- this.mediaRecorder = null;
- this.chunks = [];
- this.stream = null;
- this.canvas = canvas;
- }
- /**
- * Start recording
- */
- async start(fps, bitrate = 5e6) {
- this.chunks = [];
- this.stream = this.canvas.captureStream(fps);
- const mimeTypes = [
- "video/webm;codecs=vp9",
- "video/webm;codecs=vp8",
- "video/webm"
- ];
- let mimeType = "";
- for (const type of mimeTypes) {
- if (MediaRecorder.isTypeSupported(type)) {
- mimeType = type;
- break;
- }
- }
- if (!mimeType) {
- throw new Error("No supported WebM codec found");
- }
- this.mediaRecorder = new MediaRecorder(this.stream, {
- mimeType,
- videoBitsPerSecond: bitrate
- });
- return new Promise((resolve, reject) => {
- if (!this.mediaRecorder) {
- reject(new Error("Failed to create MediaRecorder"));
- return;
- }
- this.mediaRecorder.ondataavailable = (e) => {
- if (e.data.size > 0) {
- this.chunks.push(e.data);
- }
- };
- this.mediaRecorder.onstart = () => resolve();
- this.mediaRecorder.onerror = (e) => reject(e);
- this.mediaRecorder.start();
- });
- }
- /**
- * Stop recording and get result
- */
- async stop() {
- return new Promise((resolve, reject) => {
- if (!this.mediaRecorder) {
- reject(new Error("MediaRecorder not started"));
- return;
- }
- this.mediaRecorder.onstop = () => {
- const blob = new Blob(this.chunks, { type: "video/webm" });
- resolve(blob);
- };
- this.mediaRecorder.stop();
- if (this.stream) {
- this.stream.getTracks().forEach((track) => track.stop());
- }
- });
- }
- /**
- * Check if recording
- */
- isRecording() {
- return this.mediaRecorder?.state === "recording";
- }
- };
- exports.FrameSequenceEncoder = class {
- constructor() {
- this.frames = [];
- this.delays = [];
- }
- /**
- * Add a frame
- */
- addFrame(imageData, delay) {
- this.frames.push(imageData);
- this.delays.push(delay);
- }
- /**
- * Get all frames
- */
- getFrames() {
- return this.frames;
- }
- /**
- * Clear frames
- */
- clear() {
- this.frames = [];
- this.delays = [];
- }
- /**
- * Get frame count
- */
- getFrameCount() {
- return this.frames.length;
- }
- };
- exports.VideoExportManager = class {
- constructor() {
- this.renderer = null;
- this.encoder = null;
- this.isRendering = false;
- this.abortController = null;
- }
- /**
- * Export video by driving frames manually (frame-by-frame)
- * This is much more robust than real-time recording
- */
- async exportVideo(setFrame, element, options) {
- const startTime = Date.now();
- const { config, onProgress, signal } = options;
- const useWebCodecs = typeof VideoEncoder !== "undefined";
- try {
- this.isRendering = true;
- this.abortController = new AbortController();
- const mergedSignal = this.mergeSignals(signal, this.abortController.signal);
- this.renderer = new exports.CanvasRenderer(config);
- const canvas = this.renderer.getCanvas();
- const bitrate = options.rendererConfig?.bitrate ?? 5e6;
- let webCodecsEncoder = null;
- if (useWebCodecs) {
- webCodecsEncoder = new WebCodecsEncoder(config);
- await webCodecsEncoder.start(config.fps, bitrate);
- } else {
- this.encoder = new exports.WebMEncoder(canvas);
- await this.encoder.start(config.fps, bitrate);
- }
- for (let frame = 0; frame < config.durationInFrames; frame++) {
- if (mergedSignal.aborted) throw new Error("Render aborted");
- setFrame(frame);
- await new Promise((resolve) => requestAnimationFrame(resolve));
- await new Promise((resolve) => setTimeout(resolve, 20));
- await this.renderer.captureFrame(element);
- if (useWebCodecs && webCodecsEncoder) {
- await webCodecsEncoder.addFrame(canvas);
- } else {
- await new Promise((resolve) => setTimeout(resolve, 1e3 / config.fps));
- }
- if (onProgress) {
- onProgress(calculateProgress(frame, config.durationInFrames, startTime));
- }
- }
- const blob = useWebCodecs && webCodecsEncoder ? await webCodecsEncoder.stop() : await this.encoder.stop();
- const url = URL.createObjectURL(blob);
- return {
- success: true,
- blob,
- url,
- frameCount: config.durationInFrames,
- duration: Date.now() - startTime
- };
- } catch (error) {
- return {
- success: false,
- frameCount: 0,
- duration: Date.now() - startTime,
- error: error instanceof Error ? error.message : "Unknown error"
- };
- } finally {
- this.isRendering = false;
- this.encoder = null;
- if (this.renderer) {
- this.renderer.dispose();
- this.renderer = null;
- }
- }
- }
- /**
- * Export video from frames (LEGACY/REAL-TIME)
- */
- async exportFromCanvas(canvas, options) {
- const startTime = Date.now();
- const { config, signal } = options;
- try {
- this.isRendering = true;
- this.abortController = new AbortController();
- const mergedSignal = this.mergeSignals(signal, this.abortController.signal);
- this.encoder = new exports.WebMEncoder(canvas);
- const bitrate = options.rendererConfig?.bitrate ?? 5e6;
- await this.encoder.start(config.fps, bitrate);
- const durationMs = config.durationInFrames / config.fps * 1e3;
- await new Promise((resolve, reject) => {
- const timeout = setTimeout(resolve, durationMs + 500);
- const checkAbort = () => {
- if (mergedSignal.aborted) {
- clearTimeout(timeout);
- reject(new Error("Render aborted"));
- } else if (this.isRendering) {
- requestAnimationFrame(checkAbort);
- }
- };
- checkAbort();
- });
- const blob = await this.encoder.stop();
- const url = URL.createObjectURL(blob);
- return {
- success: true,
- blob,
- url,
- frameCount: config.durationInFrames,
- duration: Date.now() - startTime
- };
- } catch (error) {
- return {
- success: false,
- frameCount: 0,
- duration: Date.now() - startTime,
- error: error instanceof Error ? error.message : "Unknown error"
- };
- } finally {
- this.isRendering = false;
- this.encoder = null;
- }
- }
- /**
- * Export frame sequence as images
- */
- async exportFrames(frames, format = "png") {
- const canvasRenderer = new exports.CanvasRenderer({
- width: frames[0]?.width ?? 1920,
- height: frames[0]?.height ?? 1080,
- fps: 30,
- durationInFrames: frames.length
- });
- const blobs = [];
- const mimeType = `image/${format === "jpeg" ? "jpeg" : format}`;
- for (let i = 0; i < frames.length; i++) {
- const blob = await canvasRenderer.imageDataToBlob(frames[i], mimeType);
- blobs.push(blob);
- }
- canvasRenderer.dispose();
- return blobs;
- }
- /**
- * Create downloadable zip of frames
- */
- async createFrameZip(frames, compositionId) {
- if (frames.length === 0) {
- throw new Error("No frames to zip");
- }
- const canvasRenderer = new exports.CanvasRenderer({
- width: frames[0].width,
- height: frames[0].height,
- fps: 30,
- durationInFrames: frames.length
- });
- const blobs = await this.exportFrames(frames, "png");
- canvasRenderer.dispose();
- return blobs[0];
- }
- /**
- * Abort current render
- */
- abort() {
- if (this.abortController) {
- this.abortController.abort();
- }
- this.isRendering = false;
- this.encoder = null;
- }
- /**
- * Check if currently rendering
- */
- getIsRendering() {
- return this.isRendering;
- }
- /**
- * Merge multiple abort signals
- */
- mergeSignals(...signals) {
- const controller = new AbortController();
- for (const signal of signals) {
- if (signal) {
- if (signal.aborted) {
- controller.abort();
- break;
- }
- signal.addEventListener("abort", () => controller.abort());
- }
- }
- return controller.signal;
- }
- };
- exports.videoExportManager = new exports.VideoExportManager();
- export_default = exports.VideoExportManager;
- }
-});
-var FrameContext = React3.createContext(null);
-var useCurrentFrame = () => {
- const context = React3.useContext(FrameContext);
- if (!context) {
- throw new Error("useCurrentFrame must be used within a FrameContext.Provider");
- }
- return context.frame;
-};
-var useVideoConfig = () => {
- const context = React3.useContext(FrameContext);
- if (!context) {
- throw new Error("useVideoConfig must be used within a FrameContext.Provider");
- }
- return {
- fps: context.fps,
- durationInFrames: context.durationInFrames,
- width: context.width,
- height: context.height
- };
-};
-var useTimelineState = () => {
- const context = React3.useContext(FrameContext);
- if (!context) {
- throw new Error("useTimelineState must be used within a FrameContext.Provider");
- }
- return {
- frame: context.frame,
- playing: context.playing,
- playbackRate: context.playbackRate,
- setFrame: context.setFrame,
- setPlaying: context.setPlaying,
- setPlaybackRate: context.setPlaybackRate
- };
-};
-var CompositionManagerContext = React3.createContext(null);
-var PlayerContext = React3.createContext(null);
-var FrameProvider = ({
- fps = 30,
- durationInFrames,
- width,
- height,
- children,
- initialFrame = 0
-}) => {
- const [frame, setFrameState] = React3.useState(initialFrame);
- const [playing, setPlaying] = React3.useState(false);
- const [playbackRate, setPlaybackRate] = React3.useState(1);
- const animationRef = React3.useRef(null);
- const lastTimeRef = React3.useRef(0);
- const frameRef = React3.useRef(initialFrame);
- const setFrame = React3.useCallback((newFrame) => {
- const clampedFrame = Math.max(0, Math.min(newFrame, durationInFrames - 1));
- setFrameState(clampedFrame);
- frameRef.current = clampedFrame;
- }, [durationInFrames]);
- React3.useEffect(() => {
- if (playing) {
- const frameDuration = 1e3 / (fps * playbackRate);
- const animate = (currentTime) => {
- if (currentTime - lastTimeRef.current >= frameDuration) {
- frameRef.current += 1;
- if (frameRef.current >= durationInFrames) {
- frameRef.current = 0;
- setFrameState(0);
- lastTimeRef.current = currentTime;
- } else {
- setFrameState(frameRef.current);
- lastTimeRef.current = currentTime;
- }
- }
- animationRef.current = requestAnimationFrame(animate);
- };
- animationRef.current = requestAnimationFrame(animate);
- return () => {
- if (animationRef.current) {
- cancelAnimationFrame(animationRef.current);
- }
- };
- }
- }, [playing, fps, playbackRate, durationInFrames]);
- const value = {
- frame,
- fps,
- durationInFrames,
- width,
- height,
- playing,
- playbackRate,
- setFrame,
- setPlaying,
- setPlaybackRate
- };
- return /* @__PURE__ */ jsxRuntime.jsx(FrameContext.Provider, { value, children });
-};
-var CompositionManagerProvider = ({ children }) => {
- const [compositions] = React3.useState(() => /* @__PURE__ */ new Map());
- const [currentCompositionId, setCurrentCompositionId] = React3.useState(null);
- const registerComposition = React3.useCallback((composition) => {
- compositions.set(composition.id, composition);
- }, [compositions]);
- const unregisterComposition = React3.useCallback((id) => {
- compositions.delete(id);
- }, [compositions]);
- const setCurrentComposition = React3.useCallback((id) => {
- if (compositions.has(id)) {
- setCurrentCompositionId(id);
- }
- }, [compositions]);
- const currentComposition = currentCompositionId ? compositions.get(currentCompositionId) || null : null;
- return /* @__PURE__ */ jsxRuntime.jsx(
- CompositionManagerContext.Provider,
- {
- value: {
- compositions,
- currentComposition,
- registerComposition,
- unregisterComposition,
- setCurrentComposition
- },
- children
- }
- );
-};
-var PlayerProvider = ({
- durationInFrames,
- fps = 30,
- children
-}) => {
- const [frame, setFrameState] = React3.useState(0);
- const [playing, setPlayingState] = React3.useState(false);
- const [playbackRate, setPlaybackRateState] = React3.useState(1);
- const animationRef = React3.useRef(null);
- const lastTimeRef = React3.useRef(0);
- const frameRef = React3.useRef(0);
- const seek = React3.useCallback((targetFrame) => {
- const clampedFrame = Math.max(0, Math.min(targetFrame, durationInFrames - 1));
- frameRef.current = clampedFrame;
- setFrameState(clampedFrame);
- }, [durationInFrames]);
- const play = React3.useCallback(() => setPlayingState(true), []);
- const pause = React3.useCallback(() => setPlayingState(false), []);
- const toggle = React3.useCallback(() => setPlayingState((p) => !p), []);
- const restart = React3.useCallback(() => {
- frameRef.current = 0;
- setFrameState(0);
- }, []);
- React3.useEffect(() => {
- if (playing) {
- const frameDuration = 1e3 / (fps * playbackRate);
- const animate = (currentTime) => {
- if (currentTime - lastTimeRef.current >= frameDuration) {
- frameRef.current += 1;
- if (frameRef.current >= durationInFrames) {
- frameRef.current = 0;
- setFrameState(0);
- } else {
- setFrameState(frameRef.current);
- }
- lastTimeRef.current = currentTime;
- }
- animationRef.current = requestAnimationFrame(animate);
- };
- lastTimeRef.current = performance.now();
- animationRef.current = requestAnimationFrame(animate);
- return () => {
- if (animationRef.current) {
- cancelAnimationFrame(animationRef.current);
- }
- };
- }
- }, [playing, fps, playbackRate, durationInFrames]);
- return /* @__PURE__ */ jsxRuntime.jsx(
- PlayerContext.Provider,
- {
- value: {
- frame,
- playing,
- playbackRate,
- durationInFrames,
- fps,
- seek,
- play,
- pause,
- toggle,
- restart,
- frameRef
- },
- children
- }
- );
-};
-var CompositionContext = React3.createContext(null);
-var useComposition = () => {
- const context = React3.useContext(CompositionContext);
- if (!context) {
- throw new Error("useComposition must be used within a Composition");
- }
- return context;
-};
-var useVideoConfig2 = () => useVideoConfig();
-var Composition = ({
- id,
- component: Component,
- width = 1920,
- height = 1080,
- fps = 30,
- durationInFrames,
- defaultProps = {}
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- CompositionContext.Provider,
- {
- value: {
- id,
- config: { width, height, fps, durationInFrames }
- },
- children: /* @__PURE__ */ jsxRuntime.jsx(
- FrameProvider,
- {
- fps,
- durationInFrames,
- width,
- height,
- children: /* @__PURE__ */ jsxRuntime.jsx(Component, { ...defaultProps })
- }
- )
- }
- );
-};
-var PlayerComposition = ({
- id,
- component: Component,
- width = 1920,
- height = 1080,
- fps = 30,
- durationInFrames,
- defaultProps = {},
- frame,
- playing = false,
- playbackRate = 1
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- CompositionContext.Provider,
- {
- value: {
- id,
- config: { width, height, fps, durationInFrames }
- },
- children: /* @__PURE__ */ jsxRuntime.jsx(
- StaticFrameProvider,
- {
- fps,
- durationInFrames,
- width,
- height,
- frame,
- playing,
- playbackRate,
- children: /* @__PURE__ */ jsxRuntime.jsx(Component, { ...defaultProps })
- }
- )
- }
- );
-};
-var StaticFrameProvider = ({
- fps,
- durationInFrames,
- width,
- height,
- frame,
- playing,
- playbackRate,
- children
-}) => {
- const value = {
- frame,
- fps,
- durationInFrames,
- width,
- height,
- playing,
- playbackRate,
- setFrame: () => {
- },
- setPlaying: () => {
- },
- setPlaybackRate: () => {
- }
- };
- return /* @__PURE__ */ jsxRuntime.jsx(FrameContext.Provider, { value, children });
-};
-var SequenceContext = React3.createContext({
- relativeFrom: 0,
- isActive: true,
- startFrame: 0,
- endFrame: Infinity
-});
-var useSequence = () => React3.useContext(SequenceContext);
-var Sequence = ({
- from,
- durationInFrames,
- offset = 0,
- name,
- children,
- layout = "absolute-fill"
-}) => {
- const currentFrame = useCurrentFrame();
- const startFrame = from + offset;
- const endFrame = durationInFrames !== void 0 ? startFrame + durationInFrames : Infinity;
- const relativeFrame = currentFrame - startFrame;
- const isActive = currentFrame >= startFrame && currentFrame < endFrame;
- const contextValue = {
- relativeFrom: startFrame,
- durationInFrames,
- isActive,
- startFrame,
- endFrame
- };
- if (!isActive) {
- return null;
- }
- return /* @__PURE__ */ jsxRuntime.jsx(SequenceContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- "data-sequence-name": name,
- "data-sequence-from": startFrame,
- "data-sequence-duration": durationInFrames,
- style: {
- position: layout === "absolute-fill" ? "absolute" : "relative",
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- display: "flex",
- flexDirection: "column"
- },
- children: /* @__PURE__ */ jsxRuntime.jsx(SequenceFrameProvider, { relativeFrame, children })
- }
- ) });
-};
-var SequenceFrameProvider = ({
- relativeFrame,
- children
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(RelativeFrameContext.Provider, { value: relativeFrame, children });
-};
-var RelativeFrameContext = React3.createContext(0);
-var useRelativeCurrentFrame = () => React3.useContext(RelativeFrameContext);
-var Loop = ({
- durationInFrames,
- times = Infinity,
- children,
- name
-}) => {
- const currentFrame = useCurrentFrame();
- const totalFrames = times === Infinity ? durationInFrames : durationInFrames * times;
- const loopedFrame = currentFrame % durationInFrames;
- const currentLoop = Math.floor(currentFrame / durationInFrames);
- if (times !== Infinity && currentFrame >= totalFrames) {
- return null;
- }
- return /* @__PURE__ */ jsxRuntime.jsx(LoopContext.Provider, { value: { loopedFrame, currentLoop, durationInFrames }, children: /* @__PURE__ */ jsxRuntime.jsx(SequenceFrameProvider, { relativeFrame: loopedFrame, children }) });
-};
-var LoopContext = React3.createContext({
- loopedFrame: 0,
- currentLoop: 0,
- durationInFrames: 0
-});
-var Freeze = ({
- frame: freezeFrame,
- durationInFrames,
- children
-}) => {
- const currentFrame = useCurrentFrame();
- const displayFrame = currentFrame < durationInFrames ? freezeFrame : currentFrame - durationInFrames + freezeFrame;
- return /* @__PURE__ */ jsxRuntime.jsx(SequenceFrameProvider, { relativeFrame: displayFrame, children });
-};
-var Retiming = ({
- children,
- playbackRate,
- name
-}) => {
- const currentFrame = useCurrentFrame();
- const rate = typeof playbackRate === "function" ? playbackRate(currentFrame) : playbackRate;
- const retimedFrame = Math.floor(currentFrame * rate);
- return /* @__PURE__ */ jsxRuntime.jsx(SequenceFrameProvider, { relativeFrame: retimedFrame, children });
-};
-var Reverse = ({
- children,
- durationInFrames
-}) => {
- const currentFrame = useCurrentFrame();
- const reversedFrame = durationInFrames - 1 - currentFrame % durationInFrames;
- return /* @__PURE__ */ jsxRuntime.jsx(SequenceFrameProvider, { relativeFrame: reversedFrame, children });
-};
-var Series = ({ children }) => {
- const currentFrame = useCurrentFrame();
- let accumulatedFrames = 0;
- let activeChildIndex = -1;
- let relativeFrame = currentFrame;
- const childArray = React3__default.default.Children.toArray(children);
- for (let i = 0; i < childArray.length; i++) {
- const child = childArray[i];
- if (React3__default.default.isValidElement(child) && child.props.durationInFrames) {
- const childDuration = child.props.durationInFrames;
- if (currentFrame >= accumulatedFrames && currentFrame < accumulatedFrames + childDuration) {
- activeChildIndex = i;
- relativeFrame = currentFrame - accumulatedFrames;
- break;
- }
- accumulatedFrames += childDuration;
- }
- }
- if (activeChildIndex === -1) {
- return null;
- }
- const activeChild = childArray[activeChildIndex];
- return /* @__PURE__ */ jsxRuntime.jsx(SequenceFrameProvider, { relativeFrame, children: activeChild });
-};
-var AbsoluteFill = ({
- children,
- style,
- className
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- className,
- style: {
- position: "absolute",
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- width: "100%",
- height: "100%",
- display: "flex",
- flexDirection: "column",
- ...style
- },
- children
- }
- );
-};
-var Video = ({
- src,
- startFrom = 0,
- endAt,
- volume = 1,
- playbackRate = 1,
- muted = true,
- style,
- pauseOnFrame = true,
- ...props
-}) => {
- const videoRef = React3.useRef(null);
- const currentFrame = useCurrentFrame();
- const { fps } = useVideoConfig();
- const [loaded, setLoaded] = React3.useState(false);
- React3.useEffect(() => {
- if (videoRef.current && loaded) {
- const time = (startFrom + currentFrame) / fps;
- if (Math.abs(videoRef.current.currentTime - time) > 0.05) {
- videoRef.current.currentTime = time;
- }
- }
- }, [currentFrame, fps, startFrom, loaded]);
- React3.useEffect(() => {
- if (videoRef.current) {
- const vol = typeof volume === "function" ? volume(currentFrame) : volume;
- videoRef.current.volume = Math.max(0, Math.min(1, vol));
- }
- }, [currentFrame, volume]);
- React3.useEffect(() => {
- if (videoRef.current) {
- videoRef.current.playbackRate = playbackRate;
- }
- }, [playbackRate]);
- const handleLoadedData = () => {
- setLoaded(true);
- if (props.onLoadedData) {
- props.onLoadedData({});
- }
- };
- return /* @__PURE__ */ jsxRuntime.jsx(
- "video",
- {
- ref: videoRef,
- src,
- muted,
- playsInline: true,
- style: {
- width: "100%",
- height: "100%",
- objectFit: "cover",
- ...style
- },
- onLoadedData: handleLoadedData,
- ...props
- }
- );
-};
-var Audio = ({
- src,
- startFrom = 0,
- endAt,
- volume = 1,
- playbackRate = 1,
- muted = false,
- ...props
-}) => {
- const audioRef = React3.useRef(null);
- const currentFrame = useCurrentFrame();
- const { fps } = useVideoConfig();
- const [loaded, setLoaded] = React3.useState(false);
- React3.useEffect(() => {
- if (audioRef.current && loaded) {
- const time = (startFrom + currentFrame) / fps;
- if (Math.abs(audioRef.current.currentTime - time) > 0.05) {
- audioRef.current.currentTime = time;
- }
- }
- }, [currentFrame, fps, startFrom, loaded]);
- React3.useEffect(() => {
- if (audioRef.current) {
- const vol = typeof volume === "function" ? volume(currentFrame) : volume;
- audioRef.current.volume = Math.max(0, Math.min(1, vol));
- }
- }, [currentFrame, volume]);
- React3.useEffect(() => {
- if (audioRef.current) {
- audioRef.current.playbackRate = playbackRate;
- }
- }, [playbackRate]);
- const handleLoadedData = () => {
- setLoaded(true);
- if (props.onLoadedData) {
- props.onLoadedData({});
- }
- };
- return /* @__PURE__ */ jsxRuntime.jsx(
- "audio",
- {
- ref: audioRef,
- src,
- muted,
- onLoadedData: handleLoadedData,
- ...props
- }
- );
-};
-var Img = ({
- src,
- style,
- startFrom,
- endAt,
- ...props
-}) => {
- const currentFrame = useCurrentFrame();
- if (startFrom !== void 0 && currentFrame < startFrom) {
- return null;
- }
- if (endAt !== void 0 && currentFrame > endAt) {
- return null;
- }
- return /* @__PURE__ */ jsxRuntime.jsx(
- "img",
- {
- src,
- alt: "",
- style: {
- width: "100%",
- height: "100%",
- objectFit: "cover",
- ...style
- },
- ...props
- }
- );
-};
-var staticFile = (path) => {
- return `/static/${path}`;
-};
-var Text = ({
- children,
- style,
- className
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- className,
- style: {
- display: "inline-block",
- ...style
- },
- children
- }
- );
-};
-var SVG = ({
- width = "100%",
- height = "100%",
- viewBox = "0 0 100 100",
- children,
- style
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width,
- height,
- viewBox,
- style: {
- overflow: "visible",
- ...style
- },
- children
- }
- );
-};
-var Rect = ({
- width,
- height,
- x = 0,
- y = 0,
- rx = 0,
- ry = 0,
- fill = "black",
- stroke,
- strokeWidth,
- style
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- "rect",
- {
- x,
- y,
- width,
- height,
- rx,
- ry,
- fill,
- stroke,
- strokeWidth,
- style
- }
- );
-};
-var Circle = ({
- r,
- cx = 0,
- cy = 0,
- fill = "black",
- stroke,
- strokeWidth,
- style
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- "circle",
- {
- cx,
- cy,
- r,
- fill,
- stroke,
- strokeWidth,
- style
- }
- );
-};
-var Path = ({
- d,
- fill = "black",
- stroke,
- strokeWidth,
- style
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- "path",
- {
- d,
- fill,
- stroke,
- strokeWidth,
- style
- }
- );
-};
-var G = ({
- children,
- transform,
- style
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx("g", { transform, style, children });
-};
-
-// src/utils/animation.ts
-var Easing = {
- linear: (t) => t,
- easeInQuad: (t) => t * t,
- easeOutQuad: (t) => t * (2 - t),
- easeInOutQuad: (t) => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t,
- easeInCubic: (t) => t * t * t,
- easeOutCubic: (t) => --t * t * t + 1,
- easeInOutCubic: (t) => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,
- easeInQuart: (t) => t * t * t * t,
- easeOutQuart: (t) => 1 - --t * t * t * t,
- easeInOutQuart: (t) => t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t,
- easeInQuint: (t) => t * t * t * t * t,
- easeOutQuint: (t) => 1 + --t * t * t * t * t,
- easeInOutQuint: (t) => t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t,
- easeInSine: (t) => 1 - Math.cos(t * Math.PI / 2),
- easeOutSine: (t) => Math.sin(t * Math.PI / 2),
- easeInOutSine: (t) => -(Math.cos(Math.PI * t) - 1) / 2,
- easeInExpo: (t) => t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),
- easeOutExpo: (t) => t === 1 ? 1 : 1 - Math.pow(2, -10 * t),
- easeInOutExpo: (t) => {
- if (t === 0) return 0;
- if (t === 1) return 1;
- if (t < 0.5) return Math.pow(2, 20 * t - 10) / 2;
- return (2 - Math.pow(2, -20 * t + 10)) / 2;
- },
- easeInCirc: (t) => 1 - Math.sqrt(1 - t * t),
- easeOutCirc: (t) => Math.sqrt(1 - --t * t),
- easeInOutCirc: (t) => t < 0.5 ? (1 - Math.sqrt(1 - 4 * t * t)) / 2 : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2,
- easeInBack: (t) => {
- const c1 = 1.70158;
- const c3 = c1 + 1;
- return c3 * t * t * t - c1 * t * t;
- },
- easeOutBack: (t) => {
- const c1 = 1.70158;
- const c3 = c1 + 1;
- return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);
- },
- easeInOutBack: (t) => {
- const c1 = 1.70158;
- const c2 = c1 * 1.525;
- return t < 0.5 ? Math.pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2) / 2 : (Math.pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2;
- },
- easeInElastic: (t) => {
- const c4 = 2 * Math.PI / 3;
- return t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c4);
- },
- easeOutElastic: (t) => {
- const c4 = 2 * Math.PI / 3;
- return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1;
- },
- easeInOutElastic: (t) => {
- const c5 = 2 * Math.PI / 4.5;
- if (t === 0) return 0;
- if (t === 1) return 1;
- if (t < 0.5) return -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c5)) / 2;
- return Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c5) / 2 + 1;
- },
- easeInBounce: (t) => 1 - Easing.easeOutBounce(1 - t),
- easeOutBounce: (t) => {
- const n1 = 7.5625;
- const d1 = 2.75;
- if (t < 1 / d1) {
- return n1 * t * t;
- } else if (t < 2 / d1) {
- return n1 * (t -= 1.5 / d1) * t + 0.75;
- } else if (t < 2.5 / d1) {
- return n1 * (t -= 2.25 / d1) * t + 0.9375;
- } else {
- return n1 * (t -= 2.625 / d1) * t + 0.984375;
- }
- },
- easeInOutBounce: (t) => t < 0.5 ? (1 - Easing.easeOutBounce(1 - 2 * t)) / 2 : (1 + Easing.easeOutBounce(2 * t - 1)) / 2,
- // Bezier curve easing
- bezier: (x1, y1, x2, y2) => {
- const epsilon = 1e-6;
- const sampleCurveX = (t) => 3 * x1 * t * (1 - t) * (1 - t) + 3 * x2 * t * t * (1 - t) + t * t * t;
- const sampleCurveY = (t) => 3 * y1 * t * (1 - t) * (1 - t) + 3 * y2 * t * t * (1 - t) + t * t * t;
- const solveCurveX = (x) => {
- let t = x;
- for (let i = 0; i < 8; i++) {
- const xEst = sampleCurveX(t) - x;
- if (Math.abs(xEst) < epsilon) return t;
- const d = 3 * x1 * (1 - t) * (1 - t) + 6 * x2 * t * (1 - t) + 3 * t * t;
- if (Math.abs(d) < epsilon) break;
- t -= xEst / d;
- }
- return t;
- };
- return (t) => sampleCurveY(solveCurveX(t));
- }
-};
-var spring = ({
- frame,
- fps,
- config = {},
- from = 0,
- to = 1,
- durationInFrames,
- durationRestThreshold = 5e-3
-}) => {
- const {
- damping = 10,
- mass = 1,
- stiffness = 100,
- overshootClamping = false
- } = config;
- const omega = Math.sqrt(stiffness / mass);
- const zeta = damping / (2 * Math.sqrt(stiffness * mass));
- const actualDuration = durationInFrames ?? Math.ceil(fps * 2);
- const t = Math.min(frame / actualDuration, 1);
- const time = t * actualDuration / fps;
- let value;
- if (zeta < 1) {
- const omegaD = omega * Math.sqrt(1 - zeta * zeta);
- value = 1 - Math.exp(-zeta * omega * time) * (Math.cos(omegaD * time) + zeta * omega / omegaD * Math.sin(omegaD * time));
- } else if (zeta === 1) {
- value = 1 - (1 + omega * time) * Math.exp(-omega * time);
- } else {
- const r1 = -omega * (zeta - Math.sqrt(zeta * zeta - 1));
- const r2 = -omega * (zeta + Math.sqrt(zeta * zeta - 1));
- const c2 = (1 - r1 / (r1 - r2)) / (r1 - r2);
- const c1 = 1 / (r1 - r2) - c2;
- value = 1 - c1 * Math.exp(r1 * time) - c2 * Math.exp(r2 * time);
- }
- if (overshootClamping) {
- value = Math.max(0, Math.min(1, value));
- }
- return from + (to - from) * value;
-};
-var interpolate = (input, inputRange, outputRange, options = {}) => {
- const {
- extrapolateLeft = "clamp",
- extrapolateRight = "clamp",
- easing
- } = options;
- if (inputRange.length !== outputRange.length) {
- throw new Error("inputRange and outputRange must have the same length");
- }
- if (inputRange.length < 2) {
- throw new Error("inputRange must have at least 2 elements");
- }
- if (input < inputRange[0]) {
- if (extrapolateLeft === "clamp") {
- return outputRange[0];
- } else if (extrapolateLeft === "identity") {
- return input;
- }
- }
- if (input > inputRange[inputRange.length - 1]) {
- if (extrapolateRight === "clamp") {
- return outputRange[outputRange.length - 1];
- } else if (extrapolateRight === "identity") {
- return input;
- }
- }
- let segmentIndex = 0;
- for (let i = 1; i < inputRange.length; i++) {
- if (input <= inputRange[i]) {
- segmentIndex = i - 1;
- break;
- }
- }
- const inputStart = inputRange[segmentIndex];
- const inputEnd = inputRange[segmentIndex + 1];
- const outputStart = outputRange[segmentIndex];
- const outputEnd = outputRange[segmentIndex + 1];
- let progress = (input - inputStart) / (inputEnd - inputStart);
- if (easing) {
- progress = easing(progress);
- }
- return outputStart + progress * (outputEnd - outputStart);
-};
-var interpolateColors = (input, inputRange, outputRange) => {
- const parseColor = (color) => {
- if (color.startsWith("#")) {
- const hex = color.slice(1);
- if (hex.length === 3) {
- return [
- parseInt(hex[0] + hex[0], 16),
- parseInt(hex[1] + hex[1], 16),
- parseInt(hex[2] + hex[2], 16),
- 255
- ];
- }
- return [
- parseInt(hex.slice(0, 2), 16),
- parseInt(hex.slice(2, 4), 16),
- parseInt(hex.slice(4, 6), 16),
- hex.length === 8 ? parseInt(hex.slice(6, 8), 16) : 255
- ];
- }
- if (color.startsWith("rgb")) {
- const match = color.match(/\d+/g);
- if (match) {
- return [
- parseInt(match[0]),
- parseInt(match[1]),
- parseInt(match[2]),
- match[3] ? parseInt(match[3]) : 255
- ];
- }
- }
- return [0, 0, 0, 255];
- };
- const rgbToHex = (r2, g2, b2) => {
- return "#" + [r2, g2, b2].map((x) => {
- const hex = Math.round(x).toString(16);
- return hex.length === 1 ? "0" + hex : hex;
- }).join("");
- };
- let segmentIndex = 0;
- for (let i = 1; i < inputRange.length; i++) {
- if (input <= inputRange[i]) {
- segmentIndex = i - 1;
- break;
- }
- }
- const inputStart = inputRange[segmentIndex];
- const inputEnd = inputRange[segmentIndex + 1];
- const colorStart = parseColor(outputRange[segmentIndex]);
- const colorEnd = parseColor(outputRange[segmentIndex + 1]);
- const progress = (input - inputStart) / (inputEnd - inputStart);
- const r = colorStart[0] + progress * (colorEnd[0] - colorStart[0]);
- const g = colorStart[1] + progress * (colorEnd[1] - colorStart[1]);
- const b = colorStart[2] + progress * (colorEnd[2] - colorStart[2]);
- return rgbToHex(r, g, b);
-};
-var useKeyframes = (keyframes, frame) => {
- if (keyframes.length === 0) return 0;
- if (keyframes.length === 1) return keyframes[0].value;
- const sorted = [...keyframes].sort((a, b) => a.frame - b.frame);
- let prev = sorted[0];
- let next = sorted[sorted.length - 1];
- for (let i = 0; i < sorted.length - 1; i++) {
- if (frame >= sorted[i].frame && frame <= sorted[i + 1].frame) {
- prev = sorted[i];
- next = sorted[i + 1];
- break;
- }
- }
- if (frame <= prev.frame) return prev.value;
- if (frame >= next.frame) return next.value;
- let progress = (frame - prev.frame) / (next.frame - prev.frame);
- if (next.easing) {
- progress = next.easing(progress);
- } else if (prev.easing) {
- progress = prev.easing(progress);
- }
- if (typeof prev.value === "number" && typeof next.value === "number") {
- return prev.value + progress * (next.value - prev.value);
- }
- return progress < 0.5 ? prev.value : next.value;
-};
-var measureSpring = ({
- fps,
- config = {},
- threshold = 5e-3
-}) => {
- const { damping = 10, mass = 1, stiffness = 100 } = config;
- const omega = Math.sqrt(stiffness / mass);
- const zeta = damping / (2 * Math.sqrt(stiffness * mass));
- let time = 0;
- const dt = 1 / fps;
- const maxTime = 10;
- while (time < maxTime) {
- let value;
- if (zeta < 1) {
- const omegaD = omega * Math.sqrt(1 - zeta * zeta);
- value = 1 - Math.exp(-zeta * omega * time) * (Math.cos(omegaD * time) + zeta * omega / omegaD * Math.sin(omegaD * time));
- } else if (zeta === 1) {
- value = 1 - (1 + omega * time) * Math.exp(-omega * time);
- } else {
- const r1 = -omega * (zeta - Math.sqrt(zeta * zeta - 1));
- const r2 = -omega * (zeta + Math.sqrt(zeta * zeta - 1));
- const c2 = (1 - r1 / (r1 - r2)) / (r1 - r2);
- const c1 = 1 / (r1 - r2) - c2;
- value = 1 - c1 * Math.exp(r1 * time) - c2 * Math.exp(r2 * time);
- }
- if (Math.abs(value - 1) < threshold) {
- return Math.ceil(time * fps);
- }
- time += dt;
- }
- return Math.ceil(maxTime * fps);
-};
-var getFramesFromSeconds = (seconds, fps) => {
- return Math.round(seconds * fps);
-};
-var getSecondsFromFrames = (frames, fps) => {
- return frames / fps;
-};
-var range = (start, end, step = 1) => {
- const result = [];
- for (let i = start; i < end; i += step) {
- result.push(i);
- }
- return result;
-};
-var random = (seed, min = 0, max = 1) => {
- const str = typeof seed === "number" ? seed.toString() : seed;
- let hash = 0;
- for (let i = 0; i < str.length; i++) {
- const char = str.charCodeAt(i);
- hash = (hash << 5) - hash + char;
- hash = hash & hash;
- }
- const normalized = Math.abs(hash) % 1e4 / 1e4;
- return min + normalized * (max - min);
-};
-var noise2D = (x, y) => {
- const X = Math.floor(x) & 255;
- const Y = Math.floor(y) & 255;
- x -= Math.floor(x);
- y -= Math.floor(y);
- const u = x * x * (3 - 2 * x);
- const v = y * y * (3 - 2 * y);
- const A = (X + Y * 256) % 256;
- const B = (X + 1 + Y * 256) % 256;
- const C = (X + (Y + 1) * 256) % 256;
- const D = (X + 1 + (Y + 1) * 256) % 256;
- const a = Math.sin(A * 12.9898 + 78.233) * 43758.5453 % 1;
- const b = Math.sin(B * 12.9898 + 78.233) * 43758.5453 % 1;
- const c = Math.sin(C * 12.9898 + 78.233) * 43758.5453 % 1;
- const d = Math.sin(D * 12.9898 + 78.233) * 43758.5453 % 1;
- return a + u * (b - a + v * (d - b - (d - c))) + v * (c - a);
-};
-var Fade = ({
- children,
- durationInFrames = 30,
- startFrame = 0,
- style
-}) => {
- const frame = useCurrentFrame();
- const opacity = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
- );
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { opacity, ...style }, children });
-};
-var Scale = ({
- children,
- from = 0,
- to = 1,
- durationInFrames = 30,
- startFrame = 0,
- easing = Easing.easeOutCubic,
- style
-}) => {
- const frame = useCurrentFrame();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing }
- );
- const scale2 = from + (to - from) * progress;
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { transform: `scale(${scale2})`, ...style }, children });
-};
-var Slide = ({
- children,
- direction,
- distance = 100,
- durationInFrames = 30,
- startFrame = 0,
- easing = Easing.easeOutCubic,
- style
-}) => {
- const frame = useCurrentFrame();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing }
- );
- let transform = "";
- const offset = distance * (1 - progress);
- switch (direction) {
- case "left":
- transform = `translateX(${-offset}px)`;
- break;
- case "right":
- transform = `translateX(${offset}px)`;
- break;
- case "up":
- transform = `translateY(${-offset}px)`;
- break;
- case "down":
- transform = `translateY(${offset}px)`;
- break;
- }
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { transform, ...style }, children });
-};
-var Rotate = ({
- children,
- degrees = 360,
- durationInFrames = 60,
- startFrame = 0,
- easing = Easing.linear,
- style
-}) => {
- const frame = useCurrentFrame();
- const rotation = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, degrees],
- { extrapolateLeft: "clamp", extrapolateRight: "extend", easing }
- );
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { transform: `rotate(${rotation}deg)`, ...style }, children });
-};
-var Typewriter = ({
- text,
- durationInFrames = 60,
- startFrame = 0,
- style,
- cursor = true,
- cursorChar = "|"
-}) => {
- const frame = useCurrentFrame();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, text.length],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
- );
- const displayText = text.slice(0, Math.floor(progress));
- const showCursor = cursor && frame % 30 < 15;
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { style, children: [
- displayText,
- showCursor && cursorChar
- ] });
-};
-var Counter = ({
- from = 0,
- to,
- durationInFrames = 60,
- startFrame = 0,
- easing = Easing.easeOutCubic,
- style,
- format = (v) => Math.round(v).toLocaleString()
-}) => {
- const frame = useCurrentFrame();
- const value = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [from, to],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing }
- );
- return /* @__PURE__ */ jsxRuntime.jsx("span", { style, children: format(value) });
-};
-var ProgressBar = ({
- progress,
- width = 200,
- height = 10,
- backgroundColor = "#333",
- fillColor = "#3b82f6",
- borderRadius = 5,
- style
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- width,
- height,
- backgroundColor,
- borderRadius,
- overflow: "hidden",
- ...style
- },
- children: /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- width: `${progress * 100}%`,
- height: "100%",
- backgroundColor: fillColor,
- transition: "width 0.1s ease"
- }
- }
- )
- }
- );
-};
-var Glitch = ({
- children,
- intensity = 10,
- style
-}) => {
- const frame = useCurrentFrame();
- const shouldGlitch = frame % 10 < 3;
- const offset = shouldGlitch ? Math.random() * intensity : 0;
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative", ...style }, children: [
- /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- position: "absolute",
- top: 0,
- left: offset,
- opacity: shouldGlitch ? 0.8 : 0,
- color: "red",
- mixBlendMode: "screen"
- },
- children
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- position: "absolute",
- top: 0,
- left: -offset,
- opacity: shouldGlitch ? 0.8 : 0,
- color: "cyan",
- mixBlendMode: "screen"
- },
- children
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "relative" }, children })
- ] });
-};
-var Trail = ({
- children,
- trailLength = 5,
- opacityDecay = 0.2,
- style
-}) => {
- const frame = useCurrentFrame();
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative", ...style }, children: [
- Array.from({ length: trailLength }, (_, i) => {
- const trailFrame = frame - i * 2;
- if (trailFrame < 0) return null;
- return /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- position: "absolute",
- top: 0,
- left: 0,
- opacity: 1 - i * opacityDecay,
- pointerEvents: "none"
- },
- children
- },
- i
- );
- }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "relative" }, children })
- ] });
-};
-var ShakeEffect = ({
- children,
- intensity = 5,
- active = true,
- style
-}) => {
- const frame = useCurrentFrame();
- if (!active) {
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style, children });
- }
- const x = Math.sin(frame * 0.8) * intensity;
- const y = Math.cos(frame * 1.2) * intensity;
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { transform: `translate(${x}px, ${y}px)`, ...style }, children });
-};
-var Highlight = ({
- children,
- color = "#ffeb3b",
- progress = 1,
- style
-}) => {
- return /* @__PURE__ */ jsxRuntime.jsx(
- "span",
- {
- style: {
- background: `linear-gradient(90deg, ${color} ${progress * 100}%, transparent ${progress * 100}%)`,
- ...style
- },
- children
- }
- );
-};
-var MaskReveal = ({
- children,
- direction,
- progress,
- style
-}) => {
- let clipPath = "";
- switch (direction) {
- case "left":
- clipPath = `inset(0 ${(1 - progress) * 100}% 0 0)`;
- break;
- case "right":
- clipPath = `inset(0 0 0 ${(1 - progress) * 100}%)`;
- break;
- case "up":
- clipPath = `inset(0 0 ${(1 - progress) * 100}% 0)`;
- break;
- case "down":
- clipPath = `inset(${(1 - progress) * 100}% 0 0 0)`;
- break;
- }
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { clipPath, ...style }, children });
-};
-var NeonGlow = ({
- children,
- color = "#00ff00",
- intensity = 1,
- style
-}) => {
- const frame = useCurrentFrame();
- const pulseIntensity = 0.8 + Math.sin(frame * 0.1) * 0.2;
- return /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- textShadow: `
- 0 0 ${5 * intensity}px ${color},
- 0 0 ${10 * intensity}px ${color},
- 0 0 ${20 * intensity}px ${color},
- 0 0 ${40 * intensity}px ${color}
- `,
- opacity: pulseIntensity,
- ...style
- },
- children
- }
- );
-};
-var Rotate3D = ({
- children,
- rotateX = 0,
- rotateY = 360,
- rotateZ = 0,
- durationInFrames = 60,
- startFrame = 0,
- perspective = 1e3,
- easing = Easing.easeInOutCubic,
- style
-}) => {
- const frame = useCurrentFrame();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing }
- );
- const rx = rotateX * progress;
- const ry = rotateY * progress;
- const rz = rotateZ * progress;
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { perspective, ...style }, children: /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- transform: `rotateX(${rx}deg) rotateY(${ry}deg) rotateZ(${rz}deg)`,
- transformStyle: "preserve-3d"
- },
- children
- }
- ) });
-};
-var Flip3D = ({
- children,
- front,
- back,
- durationInFrames = 60,
- startFrame = 0,
- direction = "horizontal",
- perspective = 1e3,
- style
-}) => {
- const frame = useCurrentFrame();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, 180],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: Easing.easeInOutCubic }
- );
- const rotateAxis = direction === "horizontal" ? "rotateY" : "rotateX";
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { perspective, ...style }, children: /* @__PURE__ */ jsxRuntime.jsxs(
- "div",
- {
- style: {
- position: "relative",
- transformStyle: "preserve-3d",
- transform: `${rotateAxis}(${progress}deg)`,
- width: "100%",
- height: "100%"
- },
- children: [
- /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- position: "absolute",
- width: "100%",
- height: "100%",
- backfaceVisibility: "hidden"
- },
- children: front
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- position: "absolute",
- width: "100%",
- height: "100%",
- backfaceVisibility: "hidden",
- transform: `${rotateAxis}(180deg)`
- },
- children: back
- }
- )
- ]
- }
- ) });
-};
-var Perspective3D = ({
- children,
- rotateX = 20,
- rotateY = 20,
- perspective = 800,
- durationInFrames = 60,
- startFrame = 0,
- style
-}) => {
- const frame = useCurrentFrame();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: Easing.easeOutCubic }
- );
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { perspective, ...style }, children: /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- transform: `rotateX(${rotateX * progress}deg) rotateY(${rotateY * progress}deg)`,
- transformStyle: "preserve-3d"
- },
- children
- }
- ) });
-};
-var Cube3D = ({
- size = 100,
- durationInFrames = 120,
- colors = {
- front: "#10b981",
- back: "#059669",
- left: "#047857",
- right: "#065f46",
- top: "#34d399",
- bottom: "#6ee7b7"
- },
- style
-}) => {
- const frame = useCurrentFrame();
- const rotateY = interpolate(frame, [0, durationInFrames], [0, 360], {
- extrapolateRight: "extend"
- });
- const rotateX = interpolate(frame, [0, durationInFrames], [0, 360], {
- extrapolateRight: "extend"
- });
- const halfSize = size / 2;
- const faceStyle = {
- position: "absolute",
- width: size,
- height: size,
- display: "flex",
- alignItems: "center",
- justifyContent: "center",
- fontSize: size * 0.3,
- fontWeight: "bold",
- color: "white",
- backfaceVisibility: "visible",
- border: "2px solid rgba(255,255,255,0.3)"
- };
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { perspective: 600, ...style }, children: /* @__PURE__ */ jsxRuntime.jsxs(
- "div",
- {
- style: {
- width: size,
- height: size,
- position: "relative",
- transformStyle: "preserve-3d",
- transform: `rotateX(${rotateX}deg) rotateY(${rotateY}deg)`
- },
- children: [
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...faceStyle, backgroundColor: colors.front, transform: `translateZ(${halfSize}px)` }, children: "Front" }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...faceStyle, backgroundColor: colors.back, transform: `rotateY(180deg) translateZ(${halfSize}px)` }, children: "Back" }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...faceStyle, backgroundColor: colors.left, transform: `rotateY(-90deg) translateZ(${halfSize}px)` }, children: "Left" }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...faceStyle, backgroundColor: colors.right, transform: `rotateY(90deg) translateZ(${halfSize}px)` }, children: "Right" }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...faceStyle, backgroundColor: colors.top, transform: `rotateX(90deg) translateZ(${halfSize}px)` }, children: "Top" }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...faceStyle, backgroundColor: colors.bottom, transform: `rotateX(-90deg) translateZ(${halfSize}px)` }, children: "Bottom" })
- ]
- }
- ) });
-};
-var ParticleSystem = ({
- count = 50,
- colors = ["#10b981", "#34d399", "#6ee7b7", "#059669", "#047857"],
- minSize = 3,
- maxSize = 15,
- speed = 2,
- direction = "random",
- fadeOut = true,
- particleShape = "circle",
- style
-}) => {
- const frame = useCurrentFrame();
- const { width, height } = useVideoConfig();
- const particles = React3__default.default.useMemo(() => {
- const seed = (n) => {
- const x = Math.sin(n * 9999) * 1e4;
- return x - Math.floor(x);
- };
- return Array.from({ length: count }, (_, i) => {
- const rand = seed(i);
- const rand2 = seed(i + 1e3);
- const rand3 = seed(i + 2e3);
- const rand4 = seed(i + 3e3);
- const rand5 = seed(i + 4e3);
- let vx = 0;
- let vy = 0;
- switch (direction) {
- case "up":
- vx = (rand2 - 0.5) * speed;
- vy = -rand3 * speed * 2 - speed;
- break;
- case "down":
- vx = (rand2 - 0.5) * speed;
- vy = rand3 * speed * 2 + speed;
- break;
- case "left":
- vx = -rand2 * speed * 2 - speed;
- vy = (rand3 - 0.5) * speed;
- break;
- case "right":
- vx = rand2 * speed * 2 + speed;
- vy = (rand3 - 0.5) * speed;
- break;
- case "explode":
- const angle = rand2 * Math.PI * 2;
- const mag = rand3 * speed * 3 + speed;
- vx = Math.cos(angle) * mag;
- vy = Math.sin(angle) * mag;
- break;
- default:
- vx = (rand2 - 0.5) * speed * 2;
- vy = (rand3 - 0.5) * speed * 2;
- }
- return {
- x: rand * width,
- y: rand2 * height,
- size: minSize + rand3 * (maxSize - minSize),
- speedX: vx,
- speedY: vy,
- color: colors[Math.floor(rand4 * colors.length)],
- opacity: 0.5 + rand5 * 0.5,
- rotation: rand4 * 360,
- rotationSpeed: (rand5 - 0.5) * 10
- };
- });
- }, [count, colors, minSize, maxSize, speed, direction, width, height]);
- const renderParticle = (p, index) => {
- const x = (p.x + p.speedX * frame) % width;
- const y = (p.y + p.speedY * frame) % height;
- const adjustedX = x < 0 ? x + width : x;
- const adjustedY = y < 0 ? y + height : y;
- const opacity = fadeOut ? p.opacity * (1 - Math.abs(frame % 120 - 60) / 60) : p.opacity;
- const rotation = p.rotation + p.rotationSpeed * frame;
- const shapeStyle = {
- position: "absolute",
- left: adjustedX,
- top: adjustedY,
- width: p.size,
- height: p.size,
- backgroundColor: particleShape === "circle" ? p.color : void 0,
- borderRadius: particleShape === "circle" ? "50%" : particleShape === "triangle" ? 0 : 2,
- opacity: Math.max(0.1, Math.min(1, opacity)),
- transform: `translate(-50%, -50%) rotate(${rotation}deg)`,
- boxShadow: `0 0 ${p.size}px ${p.color}`
- };
- if (particleShape === "star") {
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...shapeStyle, backgroundColor: "transparent" }, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", width: p.size, height: p.size, fill: p.color, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" }) }) }, index);
- }
- if (particleShape === "triangle") {
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...shapeStyle, backgroundColor: "transparent" }, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", width: p.size, height: p.size, fill: p.color, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2L2 22h20L12 2z" }) }) }, index);
- }
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: shapeStyle }, index);
- };
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "absolute", inset: 0, overflow: "hidden", ...style }, children: particles.map(renderParticle) });
-};
-var LetterByLetter = ({
- text,
- durationInFrames = 60,
- startFrame = 0,
- delayPerLetter = 2,
- animation = "fade",
- easing = Easing.easeOutCubic,
- style,
- letterStyle
-}) => {
- const frame = useCurrentFrame();
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexWrap: "wrap", ...style }, children: text.split("").map((char, index) => {
- const letterStart = startFrame + index * delayPerLetter;
- const progress = interpolate(
- frame,
- [letterStart, letterStart + durationInFrames / text.length],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing }
- );
- let transform = "";
- let opacity = progress;
- switch (animation) {
- case "scale":
- transform = `scale(${progress})`;
- break;
- case "slide":
- transform = `translateY(${(1 - progress) * 30}px)`;
- break;
- case "rotate":
- transform = `rotate(${(1 - progress) * 90}deg)`;
- break;
- case "bounce":
- const bounce2 = progress < 0.5 ? progress * 2 : 2 - progress * 2;
- transform = `scale(${0.5 + bounce2 * 0.5})`;
- break;
- }
- return /* @__PURE__ */ jsxRuntime.jsx(
- "span",
- {
- style: {
- display: "inline-block",
- opacity,
- transform,
- ...letterStyle
- },
- children: char === " " ? "\xA0" : char
- },
- index
- );
- }) });
-};
-var WordByWord = ({
- text,
- durationInFrames = 60,
- startFrame = 0,
- delayPerWord = 10,
- animation = "fade",
- style,
- wordStyle
-}) => {
- const frame = useCurrentFrame();
- const words = text.split(" ");
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.3em", ...style }, children: words.map((word, index) => {
- const wordStart = startFrame + index * delayPerWord;
- const progress = interpolate(
- frame,
- [wordStart, wordStart + 15],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: Easing.easeOutBack }
- );
- let transform = "";
- switch (animation) {
- case "scale":
- transform = `scale(${progress})`;
- break;
- case "slide":
- transform = `translateY(${(1 - progress) * 20}px)`;
- break;
- case "pop":
- const popScale = 1 + (1 - progress) * 0.3;
- transform = `scale(${progress < 0.5 ? progress * 2 * popScale : popScale - (progress - 0.5) * 2 * (popScale - 1)})`;
- break;
- }
- return /* @__PURE__ */ jsxRuntime.jsx(
- "span",
- {
- style: {
- display: "inline-block",
- opacity: progress,
- transform,
- ...wordStyle
- },
- children: word
- },
- index
- );
- }) });
-};
-var WaveText = ({
- text,
- amplitude = 10,
- frequency = 0.3,
- speed = 0.15,
- style,
- letterStyle
-}) => {
- const frame = useCurrentFrame();
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "center", ...style }, children: text.split("").map((char, index) => {
- const offset = Math.sin(frame * speed + index * frequency) * amplitude;
- return /* @__PURE__ */ jsxRuntime.jsx(
- "span",
- {
- style: {
- display: "inline-block",
- transform: `translateY(${offset}px)`,
- ...letterStyle
- },
- children: char === " " ? "\xA0" : char
- },
- index
- );
- }) });
-};
-var RainbowText = ({
- text,
- speed = 5,
- saturation = 70,
- lightness = 60,
- style,
- letterStyle
-}) => {
- const frame = useCurrentFrame();
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexWrap: "wrap", ...style }, children: text.split("").map((char, index) => {
- const hue = (frame * speed + index * 20) % 360;
- const color = `hsl(${hue}, ${saturation}%, ${lightness}%)`;
- return /* @__PURE__ */ jsxRuntime.jsx(
- "span",
- {
- style: {
- display: "inline-block",
- color,
- ...letterStyle
- },
- children: char === " " ? "\xA0" : char
- },
- index
- );
- }) });
-};
-var GradientText = ({
- text,
- colors = ["#10b981", "#34d399", "#6ee7b7", "#14b8a6", "#10b981"],
- speed = 2,
- angle = 90,
- style
-}) => {
- const frame = useCurrentFrame();
- const offset = frame * speed % 100;
- const gradientStops = colors.map((color, i) => {
- const position = (i * 100 / (colors.length - 1) + offset) % 100;
- return `${color} ${position}%`;
- }).join(", ");
- return /* @__PURE__ */ jsxRuntime.jsx(
- "span",
- {
- style: {
- background: `linear-gradient(${angle}deg, ${gradientStops})`,
- backgroundSize: "200% 200%",
- WebkitBackgroundClip: "text",
- WebkitTextFillColor: "transparent",
- backgroundClip: "text",
- ...style
- },
- children: text
- }
- );
-};
-var Blur = ({
- children,
- from = 20,
- to = 0,
- durationInFrames = 30,
- startFrame = 0,
- style
-}) => {
- const frame = useCurrentFrame();
- const blur2 = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [from, to],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
- );
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { filter: `blur(${blur2}px)`, ...style }, children });
-};
-var Bounce = ({
- children,
- height = 50,
- durationInFrames = 60,
- startFrame = 0,
- times = 3,
- damping = 0.7,
- style
-}) => {
- const frame = useCurrentFrame();
- const { fps } = useVideoConfig();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + durationInFrames],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
- );
- const bounceCount = times;
- const t = progress * bounceCount * Math.PI;
- const amplitude = height * Math.pow(damping, progress * bounceCount);
- const y = Math.abs(Math.sin(t)) * amplitude * (1 - progress);
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { transform: `translateY(${-y}px)`, ...style }, children });
-};
-var Pulse = ({
- children,
- minScale = 0.95,
- maxScale = 1.05,
- speed = 0.1,
- style
-}) => {
- const frame = useCurrentFrame();
- const scale2 = minScale + (maxScale - minScale) * (0.5 + Math.sin(frame * speed) * 0.5);
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { transform: `scale(${scale2})`, ...style }, children });
-};
-var Swing = ({
- children,
- angle = 30,
- speed = 0.15,
- damping = 0.995,
- durationInFrames = 120,
- style
-}) => {
- const frame = useCurrentFrame();
- const dampFactor = Math.pow(damping, frame);
- const rotation = Math.sin(frame * speed) * angle * dampFactor;
- return /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- transform: `rotate(${rotation}deg)`,
- transformOrigin: "top center",
- ...style
- },
- children
- }
- );
-};
-var Confetti = ({
- count = 100,
- colors = ["#10b981", "#f59e0b", "#ef4444", "#3b82f6", "#8b5cf6", "#ec4899"],
- style
-}) => {
- const frame = useCurrentFrame();
- const { width, height } = useVideoConfig();
- const confettiPieces = React3__default.default.useMemo(() => {
- const seed = (n) => {
- const x = Math.sin(n * 9999) * 1e4;
- return x - Math.floor(x);
- };
- return Array.from({ length: count }, (_, i) => ({
- x: seed(i) * width,
- startY: -50 - seed(i + 100) * 200,
- speed: 2 + seed(i + 200) * 4,
- rotation: seed(i + 300) * 360,
- rotationSpeed: (seed(i + 400) - 0.5) * 20,
- size: 8 + seed(i + 500) * 8,
- color: colors[Math.floor(seed(i + 600) * colors.length)],
- wobble: seed(i + 700) * Math.PI * 2,
- wobbleSpeed: 0.02 + seed(i + 800) * 0.05
- }));
- }, [count, colors, width]);
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "absolute", inset: 0, overflow: "hidden", ...style }, children: confettiPieces.map((piece, i) => {
- const y = piece.startY + piece.speed * frame;
- const x = piece.x + Math.sin(frame * piece.wobbleSpeed + piece.wobble) * 30;
- const rotation = piece.rotation + piece.rotationSpeed * frame;
- if (y > height + 50) return null;
- return /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- position: "absolute",
- left: x,
- top: y,
- width: piece.size,
- height: piece.size * 0.6,
- backgroundColor: piece.color,
- transform: `rotate(${rotation}deg)`,
- borderRadius: 2
- }
- },
- i
- );
- }) });
-};
-
-// src/utils/transitions.ts
-var fade = (progress) => {
- return progress;
-};
-var slide = (progress, direction = "right") => {
- const eased = progress;
- const offset = (1 - eased) * 100;
- switch (direction) {
- case "left":
- return { x: -offset, y: 0 };
- case "right":
- return { x: offset, y: 0 };
- case "up":
- return { x: 0, y: -offset };
- case "down":
- return { x: 0, y: offset };
- }
-};
-var scale = (progress, from = 0, to = 1) => {
- return from + (to - from) * progress;
-};
-var rotate = (progress, degrees = 360) => {
- return degrees * progress;
-};
-var zoom = (progress) => {
- return {
- scale: 0.5 + progress * 0.5,
- opacity: progress
- };
-};
-var wipe = (progress, direction = "right") => {
- const pct = progress * 100;
- switch (direction) {
- case "left":
- return { clipPath: `inset(0 ${100 - pct}% 0 0)` };
- case "right":
- return { clipPath: `inset(0 0 0 ${100 - pct}%)` };
- case "up":
- return { clipPath: `inset(0 0 ${100 - pct}% 0)` };
- case "down":
- return { clipPath: `inset(${100 - pct}% 0 0 0)` };
- }
-};
-var blur = (progress, maxBlur = 20) => {
- return {
- filter: `blur(${maxBlur * (1 - progress)}px)`,
- opacity: progress
- };
-};
-var glitch = (frame, intensity = 10) => {
- const offset = Math.sin(frame * 0.5) * intensity;
- return {
- transform: `translate(${offset}px, ${offset * 0.5}px)`
- };
-};
-var shake = (frame, intensity = 5) => {
- const x = Math.sin(frame * 0.8) * intensity;
- const y = Math.cos(frame * 1.2) * intensity;
- return {
- transform: `translate(${x}px, ${y}px)`
- };
-};
-var pulse = (frame, minScale = 0.95, maxScale = 1.05) => {
- const scale2 = minScale + (Math.sin(frame * 0.1) + 1) / 2 * (maxScale - minScale);
- return {
- transform: `scale(${scale2})`
- };
-};
-var bounce = (progress) => {
- const c4 = 2 * Math.PI / 3;
- return progress === 0 ? 0 : progress === 1 ? 1 : Math.pow(2, -10 * progress) * Math.sin((progress * 10 - 0.75) * c4) + 1;
-};
-var flash = (progress, flashAt = 0.5) => {
- const flashProgress = progress < flashAt ? progress / flashAt : (1 - progress) / (1 - flashAt);
- return {
- opacity: progress < flashAt ? 1 - flashProgress * 0.5 : 1,
- backgroundColor: progress < flashAt ? `rgba(255,255,255,${flashProgress * 0.3})` : "transparent"
- };
-};
-var slideWithFade = (progress, direction = "right") => {
- const { x, y } = slide(progress, direction);
- return {
- transform: `translate(${x}%, ${y}%)`,
- opacity: progress
- };
-};
-var flip = (progress, direction = "horizontal") => {
- const rotateValue = (1 - progress) * 90;
- const opacity = progress < 0.5 ? 1 - progress : progress;
- return {
- transform: direction === "horizontal" ? `rotateY(${rotateValue}deg)` : `rotateX(${rotateValue}deg)`,
- opacity
- };
-};
-var combine = (progress, ...transitions2) => {
- return transitions2.reduce((acc, transition) => ({
- ...acc,
- ...transition(progress)
- }), {});
-};
-var transitions = {
- fade: {
- enter: (p) => ({ opacity: fade(p) }),
- exit: (p) => ({ opacity: fade(1 - p) })
- },
- slideRight: {
- enter: (p) => ({ transform: `translateX(${100 - p * 100}%)` }),
- exit: (p) => ({ transform: `translateX(${p * -100}%)` })
- },
- slideLeft: {
- enter: (p) => ({ transform: `translateX(${ -100 + p * 100}%)` }),
- exit: (p) => ({ transform: `translateX(${p * 100}%)` })
- },
- slideUp: {
- enter: (p) => ({ transform: `translateY(${100 - p * 100}%)` }),
- exit: (p) => ({ transform: `translateY(${p * -100}%)` })
- },
- slideDown: {
- enter: (p) => ({ transform: `translateY(${ -100 + p * 100}%)` }),
- exit: (p) => ({ transform: `translateY(${p * 100}%)` })
- },
- scale: {
- enter: (p) => ({ transform: `scale(${scale(p, 0, 1)})` }),
- exit: (p) => ({ transform: `scale(${scale(1 - p, 1, 0)})` })
- },
- zoom: {
- enter: (p) => {
- const { scale: s, opacity } = zoom(p);
- return { transform: `scale(${s})`, opacity };
- },
- exit: (p) => {
- const { scale: s, opacity } = zoom(1 - p);
- return { transform: `scale(${s})`, opacity };
- }
- },
- flipX: {
- enter: (p) => flip(p, "vertical"),
- exit: (p) => flip(1 - p, "vertical")
- },
- flipY: {
- enter: (p) => flip(p, "horizontal"),
- exit: (p) => flip(1 - p, "horizontal")
- }
-};
-
-// src/hooks/animation.ts
-var useSpring = (options = {}) => {
- const currentFrame = useCurrentFrame();
- const { fps: videoFps } = useVideoConfig();
- const {
- fps = videoFps,
- frame = currentFrame,
- config = {},
- from = 0,
- to = 1,
- durationInFrames
- } = options;
- return spring({
- frame,
- fps,
- config,
- from,
- to,
- durationInFrames
- });
-};
-var useInterpolate = (inputRange, outputRange, options) => {
- const frame = useCurrentFrame();
- return interpolate(frame, inputRange, outputRange, options);
-};
-var useCycle = (items, frame, durationPerItem) => {
- const index = Math.floor(frame / durationPerItem) % items.length;
- return items[index];
-};
-var useDurationInFrames = (seconds) => {
- const { fps } = useVideoConfig();
- return Math.round(seconds * fps);
-};
-var useDelay = (delayInFrames) => {
- const frame = useCurrentFrame();
- return frame >= delayInFrames;
-};
-var useProgress = () => {
- const frame = useCurrentFrame();
- const { durationInFrames } = useVideoConfig();
- return frame / (durationInFrames - 1);
-};
-var useLoop = (loopDuration) => {
- const frame = useCurrentFrame();
- return frame % loopDuration;
-};
-var useTimeline = () => {
- const frame = useCurrentFrame();
- const { durationInFrames, fps } = useVideoConfig();
- return {
- frame,
- durationInFrames,
- fps,
- progress: frame / (durationInFrames - 1),
- timeInSeconds: frame / fps,
- durationInSeconds: durationInFrames / fps,
- remainingFrames: durationInFrames - frame - 1,
- remainingTimeInSeconds: (durationInFrames - frame - 1) / fps
- };
-};
-var useWindowedFrame = (startFrame, endFrame) => {
- const frame = useCurrentFrame();
- const isInWindow = frame >= startFrame && frame < endFrame;
- const relativeFrame = frame - startFrame;
- return { isInWindow, relativeFrame: isInWindow ? relativeFrame : 0 };
-};
-var useAnimation = (startFrame, endFrame) => {
- const frame = useCurrentFrame();
- const isAnimating = frame >= startFrame && frame < endFrame;
- const isComplete = frame >= endFrame;
- const progress = isAnimating ? (frame - startFrame) / (endFrame - startFrame) : isComplete ? 1 : 0;
- return {
- isAnimating,
- isComplete,
- progress,
- direction: frame < startFrame ? "forward" : frame >= endFrame ? "none" : "forward"
- };
-};
-var useKeyframeState = (keyframes) => {
- const frame = useCurrentFrame();
- const sorted = [...keyframes].sort((a, b) => a.frame - b.frame);
- let prev = sorted[0];
- let next = sorted[sorted.length - 1];
- for (let i = 0; i < sorted.length - 1; i++) {
- if (frame >= sorted[i].frame && frame <= sorted[i + 1].frame) {
- prev = sorted[i];
- next = sorted[i + 1];
- break;
- }
- }
- const progress = frame <= prev.frame ? 0 : frame >= next.frame ? 1 : (frame - prev.frame) / (next.frame - prev.frame);
- return {
- current: prev.value + progress * (next.value - prev.value),
- previous: prev !== sorted[0] ? prev.value : null,
- next: next !== sorted[sorted.length - 1] ? next.value : null,
- progress
- };
-};
-var useTransform = (options) => {
- const frame = useCurrentFrame();
- const transforms = [];
- if (options.translateX) {
- transforms.push(`translateX(${options.translateX(frame)}px)`);
- }
- if (options.translateY) {
- transforms.push(`translateY(${options.translateY(frame)}px)`);
- }
- if (options.scale) {
- transforms.push(`scale(${options.scale(frame)})`);
- }
- if (options.rotate) {
- transforms.push(`rotate(${options.rotate(frame)}deg)`);
- }
- const style = {};
- if (transforms.length > 0) {
- style.transform = transforms.join(" ");
- }
- if (options.opacity) {
- style.opacity = options.opacity(frame);
- }
- return style;
-};
-var useFade = (fadeInDuration, fadeOutDuration, options) => {
- const frame = useCurrentFrame();
- const { durationInFrames } = useVideoConfig();
- const startFrame = options?.startFrame ?? 0;
- const endFrame = options?.endFrame ?? durationInFrames;
- if (frame < startFrame + fadeInDuration) {
- return interpolate(
- frame,
- [startFrame, startFrame + fadeInDuration],
- [0, 1],
- { extrapolateRight: "clamp" }
- );
- }
- if (frame > endFrame - fadeOutDuration) {
- return interpolate(
- frame,
- [endFrame - fadeOutDuration, endFrame],
- [1, 0],
- { extrapolateLeft: "clamp" }
- );
- }
- return 1;
-};
-var useSlide = (direction, distance, duration, startFrame = 0) => {
- const frame = useCurrentFrame();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + duration],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
- );
- const easedProgress = Easing.easeOutCubic(progress);
- let transform = "";
- const offset = distance * (1 - easedProgress);
- switch (direction) {
- case "left":
- transform = `translateX(${-offset}px)`;
- break;
- case "right":
- transform = `translateX(${offset}px)`;
- break;
- case "up":
- transform = `translateY(${-offset}px)`;
- break;
- case "down":
- transform = `translateY(${offset}px)`;
- break;
- }
- return { transform };
-};
-var useShake = (intensity, duration, startFrame = 0) => {
- const frame = useCurrentFrame();
- const progress = interpolate(
- frame,
- [startFrame, startFrame + duration],
- [0, 1],
- { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
- );
- const currentIntensity = intensity * (1 - progress);
- const shakeX = Math.sin(frame * 0.5) * currentIntensity;
- const shakeY = Math.cos(frame * 0.7) * currentIntensity;
- return { transform: `translate(${shakeX}px, ${shakeY}px)` };
-};
-var usePulse = (minScale, maxScale, frequency) => {
- const frame = useCurrentFrame();
- const { fps } = useVideoConfig();
- const progress = (Math.sin(frame / fps * frequency * Math.PI * 2) + 1) / 2;
- const scale2 = interpolate(progress, [0, 1], [minScale, maxScale]);
- return { transform: `scale(${scale2})` };
-};
-
-// src/renderer/cache.ts
-var FrameCache = class {
- constructor(options = {}) {
- this.cache = /* @__PURE__ */ new Map();
- this.stats = { hits: 0, misses: 0 };
- this.maxSize = options.maxSize ?? 100 * 1024 * 1024;
- this.maxAge = options.maxAge ?? 5 * 60 * 1e3;
- }
- /**
- * Generate cache key for a frame
- */
- static createKey(compositionId, frame, width, height) {
- return `${compositionId}:${frame}:${width}x${height}`;
- }
- /**
- * Get a cached frame
- */
- get(key) {
- const entry = this.cache.get(key);
- if (!entry) {
- this.stats.misses++;
- return null;
- }
- if (Date.now() - entry.timestamp > this.maxAge) {
- this.cache.delete(key);
- this.stats.misses++;
- return null;
- }
- entry.accessCount++;
- this.cache.delete(key);
- this.cache.set(key, entry);
- this.stats.hits++;
- return entry.data;
- }
- /**
- * Set a cached frame
- */
- set(key, data, size) {
- const entrySize = size ?? this.estimateSize(data);
- this.evictIfNeeded(entrySize);
- this.cache.set(key, {
- data,
- timestamp: Date.now(),
- accessCount: 1,
- size: entrySize
- });
- }
- /**
- * Check if key exists and is valid
- */
- has(key) {
- const entry = this.cache.get(key);
- if (!entry) return false;
- if (Date.now() - entry.timestamp > this.maxAge) {
- this.cache.delete(key);
- return false;
- }
- return true;
- }
- /**
- * Delete a cached frame
- */
- delete(key) {
- return this.cache.delete(key);
- }
- /**
- * Clear all cached frames
- */
- clear() {
- this.cache.clear();
- this.stats = { hits: 0, misses: 0 };
- }
- /**
- * Get cache statistics
- */
- getStats() {
- let totalSize = 0;
- for (const entry of this.cache.values()) {
- totalSize += entry.size;
- }
- const totalRequests = this.stats.hits + this.stats.misses;
- return {
- hits: this.stats.hits,
- misses: this.stats.misses,
- size: totalSize,
- entries: this.cache.size,
- hitRate: totalRequests > 0 ? this.stats.hits / totalRequests : 0
- };
- }
- /**
- * Get current cache size in bytes
- */
- getSize() {
- let size = 0;
- for (const entry of this.cache.values()) {
- size += entry.size;
- }
- return size;
- }
- /**
- * Evict entries until we have enough space
- */
- evictIfNeeded(neededSize) {
- while (this.getSize() + neededSize > this.maxSize && this.cache.size > 0) {
- const firstKey = this.cache.keys().next().value;
- if (firstKey) {
- this.cache.delete(firstKey);
- } else {
- break;
- }
- }
- }
- /**
- * Estimate size of data
- */
- estimateSize(data) {
- if (data instanceof ImageData) {
- return data.data.length;
- }
- if (typeof data === "string") {
- return data.length * 2;
- }
- if (data instanceof ArrayBuffer) {
- return data.byteLength;
- }
- return 1024;
- }
-};
-var frameCache = new FrameCache({
- maxSize: 200 * 1024 * 1024,
- // 200MB
- maxAge: 10 * 60 * 1e3
- // 10 minutes
-});
-var MemoCache = class _MemoCache {
- constructor() {
- this.cache = /* @__PURE__ */ new Map();
- }
- static getInstance() {
- if (!_MemoCache.instance) {
- _MemoCache.instance = new _MemoCache();
- }
- return _MemoCache.instance;
- }
- /**
- * Get or compute a memoized value
- */
- getOrCompute(key, compute, deps = []) {
- const cached = this.cache.get(key);
- if (cached && this.depsEqual(cached.deps, deps)) {
- return cached.value;
- }
- const value = compute();
- this.cache.set(key, { value, deps });
- return value;
- }
- /**
- * Check if dependencies are equal
- */
- depsEqual(a, b) {
- if (a.length !== b.length) return false;
- return a.every((val, i) => Object.is(val, b[i]));
- }
- /**
- * Clear all memoized values
- */
- clear() {
- this.cache.clear();
- }
-};
-function createDebouncedCache(fn, delay) {
- let timeoutId = null;
- let lastArgs = [];
- return ((...args) => {
- lastArgs = args;
- if (timeoutId) {
- clearTimeout(timeoutId);
- }
- timeoutId = setTimeout(() => {
- fn(...lastArgs);
- timeoutId = null;
- }, delay);
- });
-}
-function createThrottledCache(fn, limit) {
- let inThrottle = false;
- return ((...args) => {
- if (!inThrottle) {
- fn(...args);
- inThrottle = true;
- setTimeout(() => {
- inThrottle = false;
- }, limit);
- }
- });
-}
-
-// src/hooks/performance.ts
-function useMemoizedFrame(compute, deps = []) {
- const frame = useCurrentFrame();
- const memoCache = React3.useMemo(() => MemoCache.getInstance(), []);
- const key = React3.useMemo(() => `frame:${frame}:${JSON.stringify(deps)}`, [frame, deps]);
- return React3.useMemo(() => {
- return memoCache.getOrCompute(key, compute, [frame, ...deps]);
- }, [key, compute, memoCache, frame, deps]);
-}
-function useAnimationValue(compute, _frameDeps) {
- const frame = useCurrentFrame();
- return React3.useMemo(() => compute(frame), [frame, compute]);
-}
-function useCachedFrame(compositionId, renderer) {
- const frame = useCurrentFrame();
- const { width, height } = useVideoConfig();
- return React3.useMemo(() => {
- return renderer(frame);
- }, [compositionId, frame, width, height, renderer]);
-}
-function useThrottledFrame(_throttleMs) {
- return useCurrentFrame();
-}
-function useBatchFrameProcessor(processor, _batchSize) {
- return React3.useCallback((items) => {
- return processor(items);
- }, [processor]);
-}
-function useFrameRange(startFrame, endFrame) {
- return React3.useMemo(() => {
- const frames = [];
- for (let i = startFrame; i <= endFrame; i++) {
- frames.push(i);
- }
- return frames;
- }, [startFrame, endFrame]);
-}
-function usePrecomputeFrames(compute, lookahead = 10) {
- const frame = useCurrentFrame();
- const { durationInFrames } = useVideoConfig();
- return React3.useMemo(() => {
- const cache = /* @__PURE__ */ new Map();
- for (let i = frame; i < Math.min(frame + lookahead, durationInFrames); i++) {
- cache.set(i, compute(i));
- }
- return cache;
- }, [frame, lookahead, durationInFrames, compute]);
-}
-function useOptimizedSpring(config, from = 0, to = 1) {
- const frame = useCurrentFrame();
- const { fps } = useVideoConfig();
- return React3.useMemo(() => {
- return spring({ frame, fps, config, from, to });
- }, [frame, fps, config, from, to]);
-}
-function useOptimizedInterpolate(inputRange, outputRange, options) {
- return React3.useCallback((frame) => {
- return interpolate(frame, inputRange, outputRange, options);
- }, [inputRange, outputRange, options]);
-}
-function usePerformanceMonitor() {
- return React3.useMemo(() => ({
- fps: 60,
- frameTime: 16.67,
- renderTime: 0
- }), []);
-}
-function useRenderPriority() {
- return React3.useMemo(() => "high", []);
-}
-
-// src/renderer/index.ts
-init_export();
-var generateFrames = async (component, config, options) => {
- const frames = [];
- const startFrame = options?.startFrame ?? 0;
- const endFrame = options?.endFrame ?? config.durationInFrames;
- for (let frame = startFrame; frame < endFrame; frame++) {
- if (options?.onProgress) {
- options.onProgress(frame - startFrame, endFrame - startFrame);
- }
- frames.push(`frame-${frame}`);
- }
- return frames;
-};
-var renderVideo = async (options) => {
- const startTime = Date.now();
- try {
- const frames = await generateFrames(
- () => null,
- options.config,
- {
- onProgress: (frame, total) => {
- if (options.onProgress) {
- options.onProgress(frame / total);
- }
- }
- }
- );
- const duration = Date.now() - startTime;
- return {
- success: true,
- frameCount: frames.length,
- duration,
- outputUrl: `${options.outputDir}/output.mp4`
- };
- } catch (error) {
- return {
- success: false,
- frameCount: 0,
- duration: Date.now() - startTime,
- error: error instanceof Error ? error.message : "Unknown error"
- };
- }
-};
-var buildFFmpegCommand = (inputPattern, outputPath, config, rendererConfig) => {
- const args = [];
- args.push("-framerate", config.fps.toString());
- args.push("-i", inputPattern);
- switch (rendererConfig.format) {
- case "mp4":
- args.push("-c:v", rendererConfig.codec === "h265" ? "libx265" : "libx264");
- if (rendererConfig.crf) {
- args.push("-crf", rendererConfig.crf.toString());
- }
- args.push("-pix_fmt", rendererConfig.pixelFormat ?? "yuv420p");
- break;
- case "webm":
- args.push("-c:v", rendererConfig.codec === "vp9" ? "libvpx-vp9" : "libvpx");
- args.push("-crf", (rendererConfig.crf ?? 30).toString());
- args.push("-b:v", "0");
- break;
- case "gif":
- args.push("-filter_complex", `[0:v] fps=${Math.min(config.fps, 15)},split [a][b];[a] palettegen [p];[b][p] paletteuse`);
- break;
- }
- switch (rendererConfig.quality) {
- case "low":
- args.push("-preset", "ultrafast");
- break;
- case "medium":
- args.push("-preset", "medium");
- break;
- case "high":
- args.push("-preset", "slow");
- break;
- }
- args.push("-y", outputPath);
- return args;
-};
-var frameToDataURL = (canvas) => {
- return canvas.toDataURL("image/png");
-};
-var calculateVideoSize = (width, height, fps, durationInSeconds, bitrate = 5e6) => {
- return Math.ceil(bitrate * durationInSeconds / 8);
-};
-var estimateRenderTime = (durationInFrames, complexity = "medium") => {
- const baseTimePerFrame = {
- low: 10,
- medium: 50,
- high: 200
- };
- return durationInFrames * baseTimePerFrame[complexity];
-};
-var validateRenderConfig = (config) => {
- const errors = [];
- if (config.width < 1 || config.width > 8192) {
- errors.push("Width must be between 1 and 8192 pixels");
- }
- if (config.height < 1 || config.height > 8192) {
- errors.push("Height must be between 1 and 8192 pixels");
- }
- if (config.fps < 1 || config.fps > 120) {
- errors.push("FPS must be between 1 and 120");
- }
- if (config.durationInFrames < 1) {
- errors.push("Duration must be at least 1 frame");
- }
- return errors;
-};
-var RenderJobManager = class {
- constructor() {
- this.jobs = /* @__PURE__ */ new Map();
- }
- createJob(id, config) {
- this.jobs.set(id, {
- id,
- config,
- status: "pending",
- progress: 0,
- startTime: null,
- endTime: null
- });
- }
- startJob(id) {
- const job = this.jobs.get(id);
- if (job) {
- job.status = "processing";
- job.startTime = Date.now();
- }
- }
- updateProgress(id, progress) {
- const job = this.jobs.get(id);
- if (job) {
- job.progress = progress;
- }
- }
- completeJob(id, outputUrl) {
- const job = this.jobs.get(id);
- if (job) {
- job.status = "completed";
- job.progress = 100;
- job.endTime = Date.now();
- job.outputUrl = outputUrl;
- }
- }
- failJob(id, error) {
- const job = this.jobs.get(id);
- if (job) {
- job.status = "failed";
- job.error = error;
- job.endTime = Date.now();
- }
- }
- getJob(id) {
- return this.jobs.get(id);
- }
- getActiveJobs() {
- return Array.from(this.jobs.values()).filter(
- (job) => job.status === "processing"
- );
- }
-};
-var renderJobManager = new RenderJobManager();
-async function renderCompositionToVideo(setFrame, element, config, options) {
- const { VideoExportManager: VideoExportManager2 } = await Promise.resolve().then(() => (init_export(), export_exports));
- const manager = new VideoExportManager2();
- const result = await manager.exportVideo(setFrame, element, {
- config,
- onProgress: options?.onProgress ? (p) => options.onProgress(p.percentage) : void 0
- });
- if (result.success && result.blob) {
- options?.onComplete?.(result.blob);
- return result.blob;
- }
- return null;
-}
-function downloadVideo(blob, filename = "video.webm") {
- const url = URL.createObjectURL(blob);
- const a = document.createElement("a");
- a.href = url;
- a.download = filename;
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- URL.revokeObjectURL(url);
-}
-function downloadFrame(imageData, filename = "frame.png") {
- const canvas = document.createElement("canvas");
- canvas.width = imageData.width;
- canvas.height = imageData.height;
- const ctx = canvas.getContext("2d");
- if (ctx) {
- ctx.putImageData(imageData, 0, 0);
- canvas.toBlob((blob) => {
- if (blob) {
- downloadVideo(blob, filename);
- }
- }, "image/png");
- }
-}
-var PlayIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx(
- "path",
- {
- d: "M8 5.14v14l11-7-11-7z",
- fill: color
- }
- )
- }
-);
-var PauseIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsxs(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: [
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "4", width: "4", height: "16", fill: color }),
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "14", y: "4", width: "4", height: "16", fill: color })
- ]
- }
-);
-var StopIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "6", width: "12", height: "12", fill: color })
- }
-);
-var SkipBackIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 6h2v12H6V6zm3.5 6l8.5 6V6l-8.5 6z", fill: color })
- }
-);
-var SkipForwardIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 18l8.5-6L6 6v12zm8.5 0V6h2v12h-2z", fill: color })
- }
-);
-var RewindIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z", fill: color })
- }
-);
-var FastForwardIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z", fill: color })
- }
-);
-var ReplayIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx(
- "path",
- {
- d: "M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z",
- fill: color
- }
- )
- }
-);
-var ShuffleIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.59 9.17L5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41l-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z", fill: color })
- }
-);
-var RepeatIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z", fill: color })
- }
-);
-var VolumeHighIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z", fill: color })
- }
-);
-var VolumeMediumIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 9v6h4l5 5V4L9 9H5zm11.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z", fill: color })
- }
-);
-var VolumeLowIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z", fill: color })
- }
-);
-var VolumeMuteIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z", fill: color })
- }
-);
-var ArrowLeftIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z", fill: color })
- }
-);
-var ArrowRightIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z", fill: color })
- }
-);
-var ArrowUpIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z", fill: color })
- }
-);
-var ArrowDownIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z", fill: color })
- }
-);
-var ChevronLeftIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12l4.58-4.59z", fill: color })
- }
-);
-var ChevronRightIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z", fill: color })
- }
-);
-var ChevronUpIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14l-6-6z", fill: color })
- }
-);
-var ChevronDownIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z", fill: color })
- }
-);
-var CheckIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z", fill: color })
- }
-);
-var CloseIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z", fill: color })
- }
-);
-var PlusIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z", fill: color })
- }
-);
-var MinusIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 13H5v-2h14v2z", fill: color })
- }
-);
-var EditIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z", fill: color })
- }
-);
-var DeleteIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z", fill: color })
- }
-);
-var SaveIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z", fill: color })
- }
-);
-var CopyIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z", fill: color })
- }
-);
-var DownloadIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z", fill: color })
- }
-);
-var UploadIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 16h6v-6h4l-7-7-7 7h4v6zm-4 2h14v2H5v-2z", fill: color })
- }
-);
-var RefreshIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z", fill: color })
- }
-);
-var CameraIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 15.2c1.77 0 3.2-1.43 3.2-3.2s-1.43-3.2-3.2-3.2-3.2 1.43-3.2 3.2 1.43 3.2 3.2 3.2zM9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z", fill: color })
- }
-);
-var VideoIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z", fill: color })
- }
-);
-var ImageIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z", fill: color })
- }
-);
-var MusicIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z", fill: color })
- }
-);
-var MicIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.91-3c-.49 0-.9.36-.98.85C16.52 14.2 14.47 16 12 16s-4.52-1.8-4.93-4.15c-.08-.49-.49-.85-.98-.85-.61 0-1.09.54-1 1.14.49 3 2.89 5.35 5.91 5.78V20c0 .55.45 1 1 1s1-.45 1-1v-2.08c3.02-.43 5.42-2.78 5.91-5.78.1-.6-.39-1.14-1-1.14z", fill: color })
- }
-);
-var StarIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27z", fill: color })
- }
-);
-var StarOutlineIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z", fill: color })
- }
-);
-var HeartIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z", fill: color })
- }
-);
-var HeartOutlineIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z", fill: color })
- }
-);
-var ThumbUpIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2z", fill: color })
- }
-);
-var ThumbDownIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M23 3h-4v12h4V3zm-2 10h-2V5h2v8zM15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2z", fill: color })
- }
-);
-var ShareIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92-1.31-2.92-2.92-2.92z", fill: color })
- }
-);
-var CommentIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18zM18 14H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z", fill: color })
- }
-);
-var SettingsIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19.14 12.94c.04-.31.06-.63.06-.94 0-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z", fill: color })
- }
-);
-var FullscreenIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z", fill: color })
- }
-);
-var FullscreenExitIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z", fill: color })
- }
-);
-var SearchIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z", fill: color })
- }
-);
-var InfoIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z", fill: color })
- }
-);
-var WarningIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z", fill: color })
- }
-);
-var ErrorIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z", fill: color })
- }
-);
-var SuccessIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z", fill: color })
- }
-);
-var QuestionIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z", fill: color })
- }
-);
-var ClockIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67V7z", fill: color })
- }
-);
-var TimerIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.03-6.61l1.42-1.42c-.43-.51-.9-.99-1.41-1.41l-1.42 1.42C16.07 4.74 14.12 4 12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9 9-4.03 9-9c0-2.12-.74-4.07-1.97-5.61zM12 20c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z", fill: color })
- }
-);
-var CalendarIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2zm-8 4H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z", fill: color })
- }
-);
-var FolderIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z", fill: color })
- }
-);
-var FileIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 2c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6H6zm7 7V3.5L18.5 9H13z", fill: color })
- }
-);
-var FilmIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4z", fill: color })
- }
-);
-var SparkleIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2L9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2z", fill: color })
- }
-);
-var MagicWandIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 5.6L10 7 8.6 4.5 10 2 7.5 3.4 5 2l1.4 2.5L5 7zM19.5 15.4L17 14l1.4 2.5L17 19l2.5-1.4L22 19l-1.4-2.5L22 14zM22 2l-2.5 1.4L17 2l1.4 2.5L17 7l2.5-1.4L22 7l-1.4-2.5zM14.37 7.29L12.56 5.5 2 16.06V18.88L5.12 22h2.82l10.55-10.56zM5.91 17.09L5 16.17l8.06-8.06.91.91-8.06 8.07z", fill: color })
- }
-);
-var LightningIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 2v11h3v9l7-12h-4l4-8z", fill: color })
- }
-);
-var LayersIcon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- xmlns: "http://www.w3.org/2000/svg",
- className,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M11.99 18.54l-7.37-5.73L3 14.07l9 7 9-7-1.63-1.27-7.38 5.74zM12 16l7.36-5.73L21 9l-9-7-9 7 1.63 1.27L12 16z", fill: color })
- }
-);
-var Loader2Icon = ({
- size = 24,
- color = "currentColor",
- className,
- style
-}) => /* @__PURE__ */ jsxRuntime.jsx(
- "svg",
- {
- width: size,
- height: size,
- viewBox: "0 0 24 24",
- fill: "none",
- stroke: color,
- strokeWidth: "2",
- strokeLinecap: "round",
- strokeLinejoin: "round",
- xmlns: "http://www.w3.org/2000/svg",
- className: `animate-spin ${className || ""}`,
- style,
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
- }
-);
-var Icons = {
- // Playback
- Play: PlayIcon,
- Pause: PauseIcon,
- Stop: StopIcon,
- SkipBack: SkipBackIcon,
- SkipForward: SkipForwardIcon,
- Rewind: RewindIcon,
- FastForward: FastForwardIcon,
- Replay: ReplayIcon,
- Shuffle: ShuffleIcon,
- Repeat: RepeatIcon,
- // Volume
- VolumeHigh: VolumeHighIcon,
- VolumeMedium: VolumeMediumIcon,
- VolumeLow: VolumeLowIcon,
- VolumeMute: VolumeMuteIcon,
- // Navigation
- ArrowLeft: ArrowLeftIcon,
- ArrowRight: ArrowRightIcon,
- ArrowUp: ArrowUpIcon,
- ArrowDown: ArrowDownIcon,
- ChevronLeft: ChevronLeftIcon,
- ChevronRight: ChevronRightIcon,
- ChevronUp: ChevronUpIcon,
- ChevronDown: ChevronDownIcon,
- // Actions
- Check: CheckIcon,
- Close: CloseIcon,
- Plus: PlusIcon,
- Minus: MinusIcon,
- Edit: EditIcon,
- Delete: DeleteIcon,
- Save: SaveIcon,
- Copy: CopyIcon,
- Download: DownloadIcon,
- Upload: UploadIcon,
- Refresh: RefreshIcon,
- // Media
- Camera: CameraIcon,
- Video: VideoIcon,
- Image: ImageIcon,
- Music: MusicIcon,
- Mic: MicIcon,
- // Social
- Star: StarIcon,
- StarOutline: StarOutlineIcon,
- Heart: HeartIcon,
- HeartOutline: HeartOutlineIcon,
- ThumbUp: ThumbUpIcon,
- ThumbDown: ThumbDownIcon,
- Share: ShareIcon,
- Comment: CommentIcon,
- // UI
- Settings: SettingsIcon,
- Fullscreen: FullscreenIcon,
- FullscreenExit: FullscreenExitIcon,
- Search: SearchIcon,
- Info: InfoIcon,
- Warning: WarningIcon,
- Error: ErrorIcon,
- Success: SuccessIcon,
- Question: QuestionIcon,
- // Time
- Clock: ClockIcon,
- Timer: TimerIcon,
- Calendar: CalendarIcon,
- // Files
- Folder: FolderIcon,
- File: FileIcon,
- Film: FilmIcon,
- // Animation
- Sparkle: SparkleIcon,
- MagicWand: MagicWandIcon,
- Lightning: LightningIcon,
- Layers: LayersIcon,
- Loader2: Loader2Icon
-};
-var icons_default = Icons;
-var Timeline = ({ durationInFrames, frame, onSeek, marks = [], fps }) => {
- const timelineRef = React3.useRef(null);
- const [isDragging, setIsDragging] = React3.useState(false);
- const handleClick = React3.useCallback((e) => {
- if (!timelineRef.current) return;
- const rect = timelineRef.current.getBoundingClientRect();
- const x = e.clientX - rect.left;
- const percentage = x / rect.width;
- onSeek(Math.floor(percentage * durationInFrames));
- }, [durationInFrames, onSeek]);
- const handleMouseDown = React3.useCallback((e) => {
- setIsDragging(true);
- handleClick(e);
- }, [handleClick]);
- React3.useEffect(() => {
- const handleMouseMove = (e) => {
- if (!isDragging || !timelineRef.current) return;
- const rect = timelineRef.current.getBoundingClientRect();
- const x = e.clientX - rect.left;
- const percentage = Math.max(0, Math.min(1, x / rect.width));
- onSeek(Math.floor(percentage * durationInFrames));
- };
- const handleMouseUp = () => {
- setIsDragging(false);
- };
- if (isDragging) {
- window.addEventListener("mousemove", handleMouseMove);
- window.addEventListener("mouseup", handleMouseUp);
- }
- return () => {
- window.removeEventListener("mousemove", handleMouseMove);
- window.removeEventListener("mouseup", handleMouseUp);
- };
- }, [isDragging, durationInFrames, onSeek]);
- const progress = frame / (durationInFrames - 1) * 100;
- const timeInSeconds = frame / fps;
- const durationInSeconds = durationInFrames / fps;
- const formatTime = (seconds) => {
- const mins = Math.floor(seconds / 60);
- const secs = Math.floor(seconds % 60);
- const ms = Math.floor(seconds % 1 * 100);
- return `${mins.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}.${ms.toString().padStart(2, "0")}`;
- };
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", children: [
- /* @__PURE__ */ jsxRuntime.jsxs(
- "div",
- {
- ref: timelineRef,
- className: "relative h-2 bg-emerald-950 rounded-full cursor-pointer group border border-emerald-900/50",
- onMouseDown: handleMouseDown,
- children: [
- /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- className: "absolute h-full bg-gradient-to-r from-emerald-500 to-teal-500 rounded-full transition-all duration-75",
- style: { width: `${progress}%` }
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- className: "absolute top-1/2 -translate-y-1/2 w-4 h-4 bg-gradient-to-br from-emerald-400 to-teal-400 rounded-full shadow-lg shadow-emerald-500/50 cursor-grab opacity-0 group-hover:opacity-100 transition-opacity border-2 border-white",
- style: { left: `calc(${progress}% - 8px)` }
- }
- ),
- marks.map((mark, i) => /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- className: "absolute top-0 w-0.5 h-full bg-emerald-400",
- style: { left: `${mark / durationInFrames * 100}%` }
- },
- i
- ))
- ]
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between mt-2 text-xs text-emerald-500 font-mono", children: [
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatTime(timeInSeconds) }),
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatTime(durationInSeconds) })
- ] })
- ] });
-};
-var Controls = ({
- playing,
- onPlayPause,
- onRestart,
- onStepBack,
- onStepForward,
- playbackRate,
- onPlaybackRateChange,
- frame,
- totalFrames,
- onExport,
- isExporting
-}) => {
- const [showSpeedMenu, setShowSpeedMenu] = React3.useState(false);
- const speeds = [0.25, 0.5, 1, 1.5, 2];
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2", children: [
- /* @__PURE__ */ jsxRuntime.jsx(
- "button",
- {
- onClick: onRestart,
- className: "p-2 text-emerald-400 hover:text-emerald-300 hover:bg-emerald-950 rounded-lg transition-all duration-200 hover:scale-110",
- title: "Restart",
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z", clipRule: "evenodd" }) })
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx(
- "button",
- {
- onClick: onStepBack,
- className: "p-2 text-emerald-400 hover:text-emerald-300 hover:bg-emerald-950 rounded-lg transition-all duration-200 hover:scale-110",
- title: "Previous frame (\u2190)",
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z" }) })
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx(
- "button",
- {
- onClick: onPlayPause,
- className: "p-4 bg-gradient-to-r from-emerald-500 to-teal-500 hover:from-emerald-400 hover:to-teal-400 text-white rounded-full transition-all duration-200 hover:scale-110 shadow-lg shadow-emerald-500/30",
- title: playing ? "Pause (Space)" : "Play (Space)",
- children: playing ? /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-6 h-6", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z", clipRule: "evenodd" }) }) : /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-6 h-6", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z", clipRule: "evenodd" }) })
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx(
- "button",
- {
- onClick: onStepForward,
- className: "p-2 text-emerald-400 hover:text-emerald-300 hover:bg-emerald-950 rounded-lg transition-all duration-200 hover:scale-110",
- title: "Next frame (\u2192)",
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-8.707l-3-3a1 1 0 00-1.414 1.414L10.586 9H7a1 1 0 100 2h3.586l-1.293 1.293a1 1 0 101.414 1.414l3-3a1 1 0 000-1.414z" }) })
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
- /* @__PURE__ */ jsxRuntime.jsxs(
- "button",
- {
- onClick: () => setShowSpeedMenu(!showSpeedMenu),
- className: "px-3 py-2 text-sm text-emerald-400 hover:text-emerald-300 hover:bg-emerald-950 rounded-lg transition-all duration-200 min-w-[55px] font-mono border border-emerald-900/50",
- title: "Playback speed",
- children: [
- playbackRate,
- "x"
- ]
- }
- ),
- showSpeedMenu && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-full left-0 mb-2 bg-[#0a0a0a] rounded-lg shadow-xl border border-emerald-900/50 py-1 min-w-[65px] overflow-hidden", children: speeds.map((speed) => /* @__PURE__ */ jsxRuntime.jsxs(
- "button",
- {
- onClick: () => {
- onPlaybackRateChange(speed);
- setShowSpeedMenu(false);
- },
- className: `w-full px-3 py-2 text-sm text-left transition-colors ${playbackRate === speed ? "text-emerald-400 bg-emerald-950/50" : "text-emerald-500 hover:text-emerald-300 hover:bg-emerald-950/30"}`,
- children: [
- speed,
- "x"
- ]
- },
- speed
- )) })
- ] }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-2 px-3 py-1 bg-emerald-950/50 rounded-lg border border-emerald-900/50", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-emerald-400 font-mono", children: [
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-emerald-300", children: frame + 1 }),
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-emerald-600 mx-1", children: "/" }),
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-emerald-500", children: totalFrames })
- ] }) }),
- /* @__PURE__ */ jsxRuntime.jsx(
- "button",
- {
- onClick: onExport,
- disabled: isExporting,
- className: `ml-auto flex items-center gap-2 px-4 py-2 bg-emerald-600 hover:bg-emerald-500 disabled:bg-emerald-900/50 text-white rounded-lg transition-all duration-200 shadow-lg shadow-emerald-500/20 font-medium ${isExporting ? "cursor-not-allowed" : "hover:scale-105 active:scale-95"}`,
- title: "Export Video",
- children: isExporting ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
- /* @__PURE__ */ jsxRuntime.jsx(Loader2Icon, { size: 18 }),
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Exporting..." })
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
- /* @__PURE__ */ jsxRuntime.jsx(DownloadIcon, { size: 18 }),
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Export" })
- ] })
- }
- )
- ] });
-};
-var Canvas = ({
- canvasRef,
- component: Component,
- width,
- height,
- frame,
- fps,
- durationInFrames,
- playing,
- playbackRate,
- defaultProps = {}
-}) => {
- const scale2 = Math.min(1, 800 / width);
- return /* @__PURE__ */ jsxRuntime.jsxs(
- "div",
- {
- ref: canvasRef,
- className: "relative rounded-xl overflow-hidden shadow-2xl shadow-emerald-900/30 border border-emerald-900/30",
- style: {
- width: width * scale2,
- height: height * scale2,
- backgroundColor: "#0a0a0a"
- },
- children: [
- /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- className: "absolute -inset-px rounded-xl",
- style: {
- background: "linear-gradient(135deg, rgba(16, 185, 129, 0.2), transparent, rgba(20, 184, 166, 0.2))",
- zIndex: -1
- }
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- style: {
- position: "absolute",
- top: 0,
- left: 0,
- width,
- height,
- transform: `scale(${scale2})`,
- transformOrigin: "top left"
- },
- children: /* @__PURE__ */ jsxRuntime.jsx(
- FrameContext.Provider,
- {
- value: {
- frame,
- fps,
- durationInFrames,
- width,
- height,
- playing,
- playbackRate,
- setFrame: () => {
- },
- setPlaying: () => {
- },
- setPlaybackRate: () => {
- }
- },
- children: /* @__PURE__ */ jsxRuntime.jsx(Component, { ...defaultProps })
- }
- )
- }
- )
- ]
- }
- );
-};
-var Player = ({
- component,
- durationInFrames,
- fps = 30,
- width = 1920,
- height = 1080,
- defaultProps = {},
- controls = true,
- loop = true,
- autoPlay = false,
- style,
- className
-}) => {
- const [frame, setFrame] = React3.useState(0);
- const [playing, setPlaying] = React3.useState(autoPlay);
- const [playbackRate, setPlaybackRate] = React3.useState(1);
- const [isExporting, setIsExporting] = React3.useState(false);
- const [exportProgress, setExportProgress] = React3.useState(0);
- const animationRef = React3.useRef(null);
- const lastTimeRef = React3.useRef(0);
- const canvasRef = React3.useRef(null);
- React3.useEffect(() => {
- if (playing) {
- const frameDuration = 1e3 / (fps * playbackRate);
- const animate = (currentTime) => {
- if (currentTime - lastTimeRef.current >= frameDuration) {
- setFrame((prevFrame) => {
- const nextFrame = prevFrame + 1;
- if (nextFrame >= durationInFrames) {
- if (loop) {
- return 0;
- }
- setPlaying(false);
- return prevFrame;
- }
- return nextFrame;
- });
- lastTimeRef.current = currentTime;
- }
- animationRef.current = requestAnimationFrame(animate);
- };
- lastTimeRef.current = performance.now();
- animationRef.current = requestAnimationFrame(animate);
- return () => {
- if (animationRef.current) {
- cancelAnimationFrame(animationRef.current);
- }
- };
- }
- }, [playing, fps, playbackRate, durationInFrames, loop]);
- React3.useEffect(() => {
- const handleKeyDown = (e) => {
- switch (e.key) {
- case " ":
- e.preventDefault();
- setPlaying((p) => !p);
- break;
- case "ArrowLeft":
- e.preventDefault();
- setFrame((f) => Math.max(0, f - 1));
- break;
- case "ArrowRight":
- e.preventDefault();
- setFrame((f) => Math.min(durationInFrames - 1, f + 1));
- break;
- case "Home":
- setFrame(0);
- break;
- case "End":
- setFrame(durationInFrames - 1);
- break;
- case "j":
- case "J":
- setFrame((f) => Math.max(0, f - 10));
- break;
- case "l":
- case "L":
- setFrame((f) => Math.min(durationInFrames - 1, f + 10));
- break;
- case "k":
- case "K":
- setPlaying((p) => !p);
- break;
- }
- };
- window.addEventListener("keydown", handleKeyDown);
- return () => window.removeEventListener("keydown", handleKeyDown);
- }, [durationInFrames]);
- const handleSeek = React3.useCallback((targetFrame) => {
- setFrame(Math.max(0, Math.min(targetFrame, durationInFrames - 1)));
- }, [durationInFrames]);
- const handlePlayPause = React3.useCallback(() => {
- setPlaying((p) => !p);
- }, []);
- const handleRestart = React3.useCallback(() => {
- setFrame(0);
- setPlaying(true);
- }, []);
- const handleStepBack = React3.useCallback(() => {
- setFrame((f) => Math.max(0, f - 1));
- }, []);
- const handleStepForward = React3.useCallback(() => {
- setFrame((f) => Math.min(durationInFrames - 1, f + 1));
- }, [durationInFrames]);
- const handleExport = async () => {
- if (isExporting || !canvasRef.current) return;
- setIsExporting(true);
- setExportProgress(0);
- setPlaying(false);
- try {
- const elementToCapture = canvasRef.current.querySelector("div");
- const blob = await renderCompositionToVideo(
- (f) => setFrame(f),
- elementToCapture,
- { width, height, fps, durationInFrames },
- {
- onProgress: (progress) => setExportProgress(progress)
- }
- );
- if (blob) {
- downloadVideo(blob, `motionforge-export-${Date.now()}.webm`);
- }
- } catch (error) {
- console.error("Export failed:", error);
- alert("Export failed. Check console for details.");
- } finally {
- setIsExporting(false);
- setExportProgress(0);
- }
- };
- return /* @__PURE__ */ jsxRuntime.jsxs(
- "div",
- {
- className: `flex flex-col bg-[#0a0a0a] rounded-2xl p-5 border border-emerald-900/30 ${className || ""}`,
- style,
- children: [
- isExporting && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed inset-0 z-[100] bg-black/80 backdrop-blur-md flex items-center justify-center p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-[#0f0f0f] border border-emerald-900/50 rounded-2xl p-8 max-w-md w-full shadow-2xl", children: [
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-6", children: [
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-10 h-10 rounded-lg bg-emerald-500/20 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(VideoIcon, { size: 24, className: "text-emerald-500" }) }),
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-bold text-emerald-400", children: "Exporting Video" }),
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-emerald-700", children: "High Quality Render" })
- ] })
- ] }),
- /* @__PURE__ */ jsxRuntime.jsx(Loader2Icon, { size: 24, className: "text-emerald-500" })
- ] }),
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-emerald-950 rounded-full overflow-hidden border border-emerald-900/30", children: /* @__PURE__ */ jsxRuntime.jsx(
- "div",
- {
- className: "h-full bg-gradient-to-r from-emerald-500 to-teal-500 transition-all duration-300",
- style: { width: `${exportProgress}%` }
- }
- ) }),
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between text-sm font-mono", children: [
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-emerald-500", children: "Progress" }),
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-emerald-400", children: [
- Math.round(exportProgress),
- "%"
- ] })
- ] }),
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "pt-4 border-t border-emerald-900/20 grid grid-cols-2 gap-4", children: [
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-emerald-950/20 p-3 rounded-xl border border-emerald-900/10 text-center", children: [
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-emerald-700 uppercase mb-1", children: "Resolution" }),
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm text-emerald-400", children: [
- width,
- "x",
- height
- ] })
- ] }),
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-emerald-950/20 p-3 rounded-xl border border-emerald-900/10 text-center", children: [
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-emerald-700 uppercase mb-1", children: "Frames" }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-emerald-400", children: durationInFrames })
- ] })
- ] }),
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-center text-emerald-800 italic pt-2", children: "Please keep this tab active for faster rendering." })
- ] })
- ] }) }),
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center mb-5", children: /* @__PURE__ */ jsxRuntime.jsx(
- Canvas,
- {
- canvasRef,
- component,
- width,
- height,
- frame,
- fps,
- durationInFrames,
- playing,
- playbackRate,
- defaultProps
- }
- ) }),
- controls && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
- /* @__PURE__ */ jsxRuntime.jsx(
- Controls,
- {
- playing,
- onPlayPause: handlePlayPause,
- onRestart: handleRestart,
- onStepBack: handleStepBack,
- onStepForward: handleStepForward,
- playbackRate,
- onPlaybackRateChange: setPlaybackRate,
- frame,
- totalFrames: durationInFrames,
- onExport: handleExport,
- isExporting
- }
- ),
- /* @__PURE__ */ jsxRuntime.jsx(
- Timeline,
- {
- durationInFrames,
- frame,
- onSeek: handleSeek,
- fps
- }
- )
- ] })
- ]
- }
- );
-};
-/**
- * MotionForge - A React-based framework for creating videos programmatically
- *
- * Build stunning videos with React components, spring animations,
- * and frame-perfect control. Perfect for data visualization,
- * marketing videos, and automated video generation.
- *
- * @package MotionForge
- * @version 1.2.0
- * @license MIT
- */
-
-exports.AbsoluteFill = AbsoluteFill;
-exports.ArrowDownIcon = ArrowDownIcon;
-exports.ArrowLeftIcon = ArrowLeftIcon;
-exports.ArrowRightIcon = ArrowRightIcon;
-exports.ArrowUpIcon = ArrowUpIcon;
-exports.Audio = Audio;
-exports.Blur = Blur;
-exports.Bounce = Bounce;
-exports.CalendarIcon = CalendarIcon;
-exports.CameraIcon = CameraIcon;
-exports.CheckIcon = CheckIcon;
-exports.ChevronDownIcon = ChevronDownIcon;
-exports.ChevronLeftIcon = ChevronLeftIcon;
-exports.ChevronRightIcon = ChevronRightIcon;
-exports.ChevronUpIcon = ChevronUpIcon;
-exports.Circle = Circle;
-exports.ClockIcon = ClockIcon;
-exports.CloseIcon = CloseIcon;
-exports.CommentIcon = CommentIcon;
-exports.Composition = Composition;
-exports.CompositionManagerProvider = CompositionManagerProvider;
-exports.Confetti = Confetti;
-exports.CopyIcon = CopyIcon;
-exports.Counter = Counter;
-exports.Cube3D = Cube3D;
-exports.DeleteIcon = DeleteIcon;
-exports.Div = AbsoluteFill;
-exports.DownloadIcon = DownloadIcon;
-exports.Easing = Easing;
-exports.EditIcon = EditIcon;
-exports.ErrorIcon = ErrorIcon;
-exports.Fade = Fade;
-exports.FastForwardIcon = FastForwardIcon;
-exports.FileIcon = FileIcon;
-exports.FilmIcon = FilmIcon;
-exports.Flip3D = Flip3D;
-exports.FolderIcon = FolderIcon;
-exports.FrameCache = FrameCache;
-exports.FrameProvider = FrameProvider;
-exports.Freeze = Freeze;
-exports.FullscreenExitIcon = FullscreenExitIcon;
-exports.FullscreenIcon = FullscreenIcon;
-exports.G = G;
-exports.Glitch = Glitch;
-exports.GradientText = GradientText;
-exports.HeartIcon = HeartIcon;
-exports.HeartOutlineIcon = HeartOutlineIcon;
-exports.Highlight = Highlight;
-exports.Icons = icons_default;
-exports.ImageIcon = ImageIcon;
-exports.Img = Img;
-exports.InfoIcon = InfoIcon;
-exports.LayersIcon = LayersIcon;
-exports.LetterByLetter = LetterByLetter;
-exports.LightningIcon = LightningIcon;
-exports.Loader2Icon = Loader2Icon;
-exports.Loop = Loop;
-exports.MagicWandIcon = MagicWandIcon;
-exports.MaskReveal = MaskReveal;
-exports.MemoCache = MemoCache;
-exports.MicIcon = MicIcon;
-exports.MinusIcon = MinusIcon;
-exports.MusicIcon = MusicIcon;
-exports.NeonGlow = NeonGlow;
-exports.ParticleSystem = ParticleSystem;
-exports.Path = Path;
-exports.PauseIcon = PauseIcon;
-exports.Perspective3D = Perspective3D;
-exports.PlayIcon = PlayIcon;
-exports.Player = Player;
-exports.PlayerComposition = PlayerComposition;
-exports.PlayerProvider = PlayerProvider;
-exports.PlusIcon = PlusIcon;
-exports.ProgressBar = ProgressBar;
-exports.Pulse = Pulse;
-exports.QuestionIcon = QuestionIcon;
-exports.RainbowText = RainbowText;
-exports.Rect = Rect;
-exports.RefreshIcon = RefreshIcon;
-exports.RenderJobManager = RenderJobManager;
-exports.RepeatIcon = RepeatIcon;
-exports.ReplayIcon = ReplayIcon;
-exports.Retiming = Retiming;
-exports.Reverse = Reverse;
-exports.RewindIcon = RewindIcon;
-exports.Rotate = Rotate;
-exports.Rotate3D = Rotate3D;
-exports.SVG = SVG;
-exports.SaveIcon = SaveIcon;
-exports.Scale = Scale;
-exports.SearchIcon = SearchIcon;
-exports.Sequence = Sequence;
-exports.Series = Series;
-exports.SettingsIcon = SettingsIcon;
-exports.ShakeEffect = ShakeEffect;
-exports.ShareIcon = ShareIcon;
-exports.ShuffleIcon = ShuffleIcon;
-exports.SkipBackIcon = SkipBackIcon;
-exports.SkipForwardIcon = SkipForwardIcon;
-exports.Slide = Slide;
-exports.SparkleIcon = SparkleIcon;
-exports.StarIcon = StarIcon;
-exports.StarOutlineIcon = StarOutlineIcon;
-exports.StopIcon = StopIcon;
-exports.SuccessIcon = SuccessIcon;
-exports.Swing = Swing;
-exports.Text = Text;
-exports.ThumbDownIcon = ThumbDownIcon;
-exports.ThumbUpIcon = ThumbUpIcon;
-exports.TimerIcon = TimerIcon;
-exports.Trail = Trail;
-exports.Typewriter = Typewriter;
-exports.UploadIcon = UploadIcon;
-exports.Video = Video;
-exports.VideoIcon = VideoIcon;
-exports.VolumeHighIcon = VolumeHighIcon;
-exports.VolumeLowIcon = VolumeLowIcon;
-exports.VolumeMediumIcon = VolumeMediumIcon;
-exports.VolumeMuteIcon = VolumeMuteIcon;
-exports.WarningIcon = WarningIcon;
-exports.WaveText = WaveText;
-exports.WordByWord = WordByWord;
-exports.blur = blur;
-exports.bounce = bounce;
-exports.buildFFmpegCommand = buildFFmpegCommand;
-exports.calculateProgress = calculateProgress;
-exports.calculateVideoSize = calculateVideoSize;
-exports.checkEncodingSupport = checkEncodingSupport;
-exports.combine = combine;
-exports.createDebouncedCache = createDebouncedCache;
-exports.createThrottledCache = createThrottledCache;
-exports.downloadFrame = downloadFrame;
-exports.downloadVideo = downloadVideo;
-exports.easing = Easing;
-exports.estimateFileSize = estimateFileSize;
-exports.estimateRenderTime = estimateRenderTime;
-exports.fade = fade;
-exports.flash = flash;
-exports.flip = flip;
-exports.frameCache = frameCache;
-exports.frameToDataURL = frameToDataURL;
-exports.generateFrames = generateFrames;
-exports.getFramesFromSeconds = getFramesFromSeconds;
-exports.getSecondsFromFrames = getSecondsFromFrames;
-exports.glitch = glitch;
-exports.interpolate = interpolate;
-exports.interpolateColors = interpolateColors;
-exports.measureSpring = measureSpring;
-exports.noise2D = noise2D;
-exports.pulseTransition = pulse;
-exports.random = random;
-exports.range = range;
-exports.renderCompositionToVideo = renderCompositionToVideo;
-exports.renderJobManager = renderJobManager;
-exports.renderVideo = renderVideo;
-exports.rotateTransition = rotate;
-exports.scaleTransition = scale;
-exports.shakeTransition = shake;
-exports.slide = slide;
-exports.slideWithFade = slideWithFade;
-exports.spring = spring;
-exports.staticFile = staticFile;
-exports.transitions = transitions;
-exports.useAnimation = useAnimation;
-exports.useAnimationValue = useAnimationValue;
-exports.useBatchFrameProcessor = useBatchFrameProcessor;
-exports.useCachedFrame = useCachedFrame;
-exports.useComposition = useComposition;
-exports.useConfig = useVideoConfig2;
-exports.useCurrentFrame = useCurrentFrame;
-exports.useCycle = useCycle;
-exports.useDelay = useDelay;
-exports.useDurationInFrames = useDurationInFrames;
-exports.useFade = useFade;
-exports.useFrameRange = useFrameRange;
-exports.useInterpolate = useInterpolate;
-exports.useKeyframeState = useKeyframeState;
-exports.useKeyframes = useKeyframes;
-exports.useLoop = useLoop;
-exports.useMemoizedFrame = useMemoizedFrame;
-exports.useOptimizedInterpolate = useOptimizedInterpolate;
-exports.useOptimizedSpring = useOptimizedSpring;
-exports.usePerformanceMonitor = usePerformanceMonitor;
-exports.usePrecomputeFrames = usePrecomputeFrames;
-exports.useProgress = useProgress;
-exports.usePulse = usePulse;
-exports.useRelativeCurrentFrame = useRelativeCurrentFrame;
-exports.useRenderPriority = useRenderPriority;
-exports.useSequence = useSequence;
-exports.useShake = useShake;
-exports.useSlide = useSlide;
-exports.useSpring = useSpring;
-exports.useThrottledFrame = useThrottledFrame;
-exports.useTimeline = useTimeline;
-exports.useTimelineState = useTimelineState;
-exports.useTransform = useTransform;
-exports.useVideoConfig = useVideoConfig;
-exports.useWindowedFrame = useWindowedFrame;
-exports.validateRenderConfig = validateRenderConfig;
-exports.wipe = wipe;
-exports.zoom = zoom;
-//# sourceMappingURL=index.cjs.map
-//# sourceMappingURL=index.cjs.map
\ No newline at end of file
diff --git a/packages/motionforge/dist/index.cjs.map b/packages/motionforge/dist/index.cjs.map
deleted file mode 100644
index 66e2e78..0000000
--- a/packages/motionforge/dist/index.cjs.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/renderer/export.ts","../src/core/context.tsx","../src/components/Composition.tsx","../src/components/Sequence.tsx","../src/components/Media.tsx","../src/utils/animation.ts","../src/components/Effects.tsx","../src/utils/transitions.ts","../src/hooks/animation.ts","../src/renderer/cache.ts","../src/hooks/performance.ts","../src/renderer/index.ts","../src/icons/index.tsx","../src/player/Player.tsx"],"names":["CanvasRenderer","FrameSequenceEncoder","VideoExportManager","WebMEncoder","videoExportManager","createContext","useContext","useState","useRef","useCallback","useEffect","jsx","useVideoConfig","React","r","g","b","scale","jsxs","bounce","blur","transitions","useMemo","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["// Video Export System - Real video rendering with canvas capture\n\nimport { VideoConfig, VideoRendererConfig } from '../core/types';\n\n/**\n * Render progress information\n */\nexport interface RenderProgress {\n frame: number;\n totalFrames: number;\n percentage: number;\n elapsedMs: number;\n estimatedRemainingMs: number;\n framesPerSecond: number;\n}\n\n/**\n * Render options\n */\nexport interface ExportOptions {\n compositionId: string;\n config: VideoConfig;\n rendererConfig?: Partial;\n onProgress?: (progress: RenderProgress) => void;\n onFrame?: (frameNumber: number, imageData: ImageData) => void;\n signal?: AbortSignal;\n}\n\n/**\n * Render result\n */\nexport interface ExportResult {\n success: boolean;\n blob?: Blob;\n url?: string;\n frameCount: number;\n duration: number;\n error?: string;\n}\n\n/**\n * Canvas renderer for frame capture\n */\nexport class CanvasRenderer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private config: VideoConfig;\n\n constructor(config: VideoConfig) {\n this.config = config;\n this.canvas = document.createElement('canvas');\n this.canvas.width = config.width;\n this.canvas.height = config.height;\n \n const ctx = this.canvas.getContext('2d', {\n alpha: false,\n willReadFrequently: true,\n });\n \n if (!ctx) {\n throw new Error('Failed to get 2D context');\n }\n \n this.ctx = ctx;\n }\n\n /**\n * Capture a single frame from a DOM element\n */\n async captureFrame(element: HTMLElement): Promise {\n // Clear canvas\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n if (element instanceof HTMLCanvasElement) {\n this.ctx.drawImage(element, 0, 0, this.canvas.width, this.canvas.height);\n } else if (element instanceof HTMLImageElement) {\n this.ctx.drawImage(element, 0, 0, this.canvas.width, this.canvas.height);\n } else {\n // SVG foreignObject approach for DOM elements\n try {\n const data = await this.domToDataUrl(element);\n const img = await this.loadImage(data);\n this.ctx.drawImage(img, 0, 0, this.canvas.width, this.canvas.height);\n } catch (e) {\n console.error('Failed to capture frame:', e);\n // Fallback: fill with background color\n this.ctx.fillStyle = '#0a0a0a';\n this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n }\n }\n\n return this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);\n }\n\n private async domToDataUrl(element: HTMLElement): Promise {\n const width = this.config.width;\n const height = this.config.height;\n\n // Clone element to avoid side effects\n const clone = element.cloneNode(true) as HTMLElement;\n \n // Inline styles (basic version)\n this.inlineStyles(element, clone);\n\n const svg = `\n \n `;\n\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n }\n\n private inlineStyles(source: HTMLElement, target: HTMLElement) {\n const computed = window.getComputedStyle(source);\n for (const key of Array.from(computed)) {\n target.style.setProperty(key, computed.getPropertyValue(key), computed.getPropertyPriority(key));\n }\n \n // Recursively inline children\n for (let i = 0; i < source.children.length; i++) {\n this.inlineStyles(source.children[i] as HTMLElement, target.children[i] as HTMLElement);\n }\n }\n\n private loadImage(src: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = src;\n });\n }\n\n /**\n * Convert ImageData to Blob\n */\n async imageDataToBlob(imageData: ImageData, format: string = 'image/png'): Promise {\n this.canvas.width = imageData.width;\n this.canvas.height = imageData.height;\n this.ctx.putImageData(imageData, 0, 0);\n \n return new Promise((resolve, reject) => {\n this.canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error('Failed to convert to blob'));\n }\n }, format);\n });\n }\n\n /**\n * Convert ImageData to data URL\n */\n imageDataToDataURL(imageData: ImageData, format: string = 'image/png'): string {\n this.canvas.width = imageData.width;\n this.canvas.height = imageData.height;\n this.ctx.putImageData(imageData, 0, 0);\n return this.canvas.toDataURL(format);\n }\n\n /**\n * Get canvas element\n */\n getCanvas(): HTMLCanvasElement {\n return this.canvas;\n }\n\n /**\n * Get context\n */\n getContext(): CanvasRenderingContext2D {\n return this.ctx;\n }\n\n /**\n * Dispose renderer\n */\n dispose(): void {\n this.canvas.remove();\n }\n}\n\n/**\n * WebCodecs Video Encoder for high-performance encoding\n */\nexport class WebCodecsEncoder {\n private encoder: any | null = null;\n private chunks: Blob[] = [];\n private config: VideoConfig;\n private frameCount = 0;\n\n constructor(config: VideoConfig) {\n this.config = config;\n }\n\n async start(fps: number, bitrate: number = 5000000): Promise {\n if (typeof VideoEncoder === 'undefined') {\n throw new Error('WebCodecs is not supported in this browser');\n }\n\n this.chunks = [];\n this.frameCount = 0;\n\n const init = {\n output: (chunk: any) => {\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n this.chunks.push(new Blob([data], { type: 'video/webm' }));\n },\n error: (e: any) => console.error(e),\n };\n\n this.encoder = new VideoEncoder(init);\n \n const config = {\n codec: 'vp09.00.10.08',\n width: this.config.width,\n height: this.config.height,\n bitrate: bitrate,\n framerate: fps,\n };\n\n this.encoder.configure(config);\n }\n\n async addFrame(canvas: HTMLCanvasElement): Promise {\n if (!this.encoder) return;\n\n const frame = new VideoFrame(canvas, {\n timestamp: (this.frameCount * 1000000) / this.config.fps,\n });\n\n this.encoder.encode(frame, { keyFrame: this.frameCount % 60 === 0 });\n frame.close();\n this.frameCount++;\n }\n\n async stop(): Promise {\n if (!this.encoder) return new Blob();\n\n await this.encoder.flush();\n this.encoder.close();\n this.encoder = null;\n\n // Note: This creates a simple concatenation of chunks, which might not be a valid WebM\n // without a proper muxer. In a production app, we would use a library like webm-muxer.\n // However, for this scaffold, we'll keep it simple or use MediaRecorder as primary.\n return new Blob(this.chunks, { type: 'video/webm' });\n }\n}\n\n/**\n * WebM Video Encoder using MediaRecorder\n */\nexport class WebMEncoder {\n private mediaRecorder: MediaRecorder | null = null;\n private chunks: Blob[] = [];\n private canvas: HTMLCanvasElement;\n private stream: MediaStream | null = null;\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas = canvas;\n }\n\n /**\n * Start recording\n */\n async start(fps: number, bitrate: number = 5000000): Promise {\n this.chunks = [];\n \n this.stream = this.canvas.captureStream(fps);\n \n const mimeTypes = [\n 'video/webm;codecs=vp9',\n 'video/webm;codecs=vp8',\n 'video/webm',\n ];\n \n let mimeType = '';\n for (const type of mimeTypes) {\n if (MediaRecorder.isTypeSupported(type)) {\n mimeType = type;\n break;\n }\n }\n \n if (!mimeType) {\n throw new Error('No supported WebM codec found');\n }\n \n this.mediaRecorder = new MediaRecorder(this.stream, {\n mimeType,\n videoBitsPerSecond: bitrate,\n });\n \n return new Promise((resolve, reject) => {\n if (!this.mediaRecorder) {\n reject(new Error('Failed to create MediaRecorder'));\n return;\n }\n \n this.mediaRecorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n this.chunks.push(e.data);\n }\n };\n \n this.mediaRecorder.onstart = () => resolve();\n this.mediaRecorder.onerror = (e) => reject(e);\n \n this.mediaRecorder.start();\n });\n }\n\n /**\n * Stop recording and get result\n */\n async stop(): Promise {\n return new Promise((resolve, reject) => {\n if (!this.mediaRecorder) {\n reject(new Error('MediaRecorder not started'));\n return;\n }\n \n this.mediaRecorder.onstop = () => {\n const blob = new Blob(this.chunks, { type: 'video/webm' });\n resolve(blob);\n };\n \n this.mediaRecorder.stop();\n \n if (this.stream) {\n this.stream.getTracks().forEach(track => track.stop());\n }\n });\n }\n\n /**\n * Check if recording\n */\n isRecording(): boolean {\n return this.mediaRecorder?.state === 'recording';\n }\n}\n\n/**\n * Frame sequence encoder for GIF/WebP\n */\nexport class FrameSequenceEncoder {\n private frames: ImageData[] = [];\n private delays: number[] = [];\n\n /**\n * Add a frame\n */\n addFrame(imageData: ImageData, delay: number): void {\n this.frames.push(imageData);\n this.delays.push(delay);\n }\n\n /**\n * Get all frames\n */\n getFrames(): ImageData[] {\n return this.frames;\n }\n\n /**\n * Clear frames\n */\n clear(): void {\n this.frames = [];\n this.delays = [];\n }\n\n /**\n * Get frame count\n */\n getFrameCount(): number {\n return this.frames.length;\n }\n}\n\n/**\n * Video Export Manager - Main export functionality\n */\nexport class VideoExportManager {\n private renderer: CanvasRenderer | null = null;\n private encoder: WebMEncoder | null = null;\n private isRendering = false;\n private abortController: AbortController | null = null;\n\n /**\n * Export video by driving frames manually (frame-by-frame)\n * This is much more robust than real-time recording\n */\n async exportVideo(\n setFrame: (frame: number) => void,\n element: HTMLElement,\n options: Omit\n ): Promise {\n const startTime = Date.now();\n const { config, onProgress, signal } = options;\n const useWebCodecs = typeof VideoEncoder !== 'undefined';\n\n try {\n this.isRendering = true;\n this.abortController = new AbortController();\n const mergedSignal = this.mergeSignals(signal, this.abortController.signal);\n\n this.renderer = new CanvasRenderer(config);\n const canvas = this.renderer.getCanvas();\n const bitrate = options.rendererConfig?.bitrate ?? 5000000;\n \n let webCodecsEncoder: WebCodecsEncoder | null = null;\n\n if (useWebCodecs) {\n webCodecsEncoder = new WebCodecsEncoder(config);\n await webCodecsEncoder.start(config.fps, bitrate);\n } else {\n this.encoder = new WebMEncoder(canvas);\n await this.encoder.start(config.fps, bitrate);\n }\n\n for (let frame = 0; frame < config.durationInFrames; frame++) {\n if (mergedSignal.aborted) throw new Error('Render aborted');\n\n // 1. Set frame\n setFrame(frame);\n\n // 2. Wait for React render and any effects\n await new Promise(resolve => requestAnimationFrame(resolve));\n await new Promise(resolve => setTimeout(resolve, 20));\n\n // 3. Capture frame\n await this.renderer.captureFrame(element);\n\n // 4. Encode frame\n if (useWebCodecs && webCodecsEncoder) {\n await webCodecsEncoder.addFrame(canvas);\n } else {\n // MediaRecorder needs a bit of time to capture the canvas change\n await new Promise(resolve => setTimeout(resolve, 1000 / config.fps));\n }\n\n if (onProgress) {\n onProgress(calculateProgress(frame, config.durationInFrames, startTime));\n }\n }\n\n const blob = useWebCodecs && webCodecsEncoder \n ? await webCodecsEncoder.stop() \n : await this.encoder!.stop();\n const url = URL.createObjectURL(blob);\n\n return {\n success: true,\n blob,\n url,\n frameCount: config.durationInFrames,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n frameCount: 0,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n } finally {\n this.isRendering = false;\n this.encoder = null;\n if (this.renderer) {\n this.renderer.dispose();\n this.renderer = null;\n }\n }\n }\n\n /**\n * Export video from frames (LEGACY/REAL-TIME)\n */\n async exportFromCanvas(\n canvas: HTMLCanvasElement,\n options: Omit\n ): Promise {\n const startTime = Date.now();\n const { config, signal } = options;\n\n try {\n this.isRendering = true;\n this.abortController = new AbortController();\n \n const mergedSignal = this.mergeSignals(signal, this.abortController.signal);\n\n // Create encoder\n this.encoder = new WebMEncoder(canvas);\n const bitrate = options.rendererConfig?.bitrate ?? 5000000;\n \n await this.encoder.start(config.fps, bitrate);\n\n // Wait for duration\n const durationMs = (config.durationInFrames / config.fps) * 1000;\n \n await new Promise((resolve, reject) => {\n const timeout = setTimeout(resolve, durationMs + 500);\n \n const checkAbort = () => {\n if (mergedSignal.aborted) {\n clearTimeout(timeout);\n reject(new Error('Render aborted'));\n } else if (this.isRendering) {\n requestAnimationFrame(checkAbort);\n }\n };\n checkAbort();\n });\n\n const blob = await this.encoder.stop();\n const url = URL.createObjectURL(blob);\n\n return {\n success: true,\n blob,\n url,\n frameCount: config.durationInFrames,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n frameCount: 0,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n } finally {\n this.isRendering = false;\n this.encoder = null;\n }\n }\n\n /**\n * Export frame sequence as images\n */\n async exportFrames(\n frames: ImageData[],\n format: 'png' | 'jpeg' | 'webp' = 'png'\n ): Promise {\n const canvasRenderer = new CanvasRenderer({ \n width: frames[0]?.width ?? 1920, \n height: frames[0]?.height ?? 1080, \n fps: 30, \n durationInFrames: frames.length \n });\n\n const blobs: Blob[] = [];\n const mimeType = `image/${format === 'jpeg' ? 'jpeg' : format}`;\n\n for (let i = 0; i < frames.length; i++) {\n const blob = await canvasRenderer.imageDataToBlob(frames[i], mimeType);\n blobs.push(blob);\n }\n\n canvasRenderer.dispose();\n return blobs;\n }\n\n /**\n * Create downloadable zip of frames\n */\n async createFrameZip(frames: ImageData[], compositionId: string): Promise {\n // This would require JSZip or similar library\n // For now, return first frame as placeholder\n if (frames.length === 0) {\n throw new Error('No frames to zip');\n }\n \n const canvasRenderer = new CanvasRenderer({\n width: frames[0].width,\n height: frames[0].height,\n fps: 30,\n durationInFrames: frames.length,\n });\n\n const blobs = await this.exportFrames(frames, 'png');\n canvasRenderer.dispose();\n\n // Return concatenated blobs as a simple archive\n // In production, use JSZip\n return blobs[0];\n }\n\n /**\n * Abort current render\n */\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n this.isRendering = false;\n this.encoder = null;\n }\n\n /**\n * Check if currently rendering\n */\n getIsRendering(): boolean {\n return this.isRendering;\n }\n\n /**\n * Merge multiple abort signals\n */\n private mergeSignals(...signals: (AbortSignal | undefined)[]): AbortSignal {\n const controller = new AbortController();\n \n for (const signal of signals) {\n if (signal) {\n if (signal.aborted) {\n controller.abort();\n break;\n }\n signal.addEventListener('abort', () => controller.abort());\n }\n }\n \n return controller.signal;\n }\n}\n\n/**\n * Calculate render progress\n */\nexport function calculateProgress(\n frame: number,\n totalFrames: number,\n startTime: number\n): RenderProgress {\n const elapsedMs = Date.now() - startTime;\n const percentage = (frame / totalFrames) * 100;\n const framesPerSecond = frame > 0 ? (frame / elapsedMs) * 1000 : 0;\n const estimatedRemainingMs = framesPerSecond > 0 \n ? ((totalFrames - frame) / framesPerSecond) * 1000 \n : 0;\n\n return {\n frame,\n totalFrames,\n percentage,\n elapsedMs,\n estimatedRemainingMs,\n framesPerSecond,\n };\n}\n\n/**\n * Estimate video file size\n */\nexport function estimateFileSize(\n config: VideoConfig,\n bitrate: number = 5000000\n): number {\n const durationSeconds = config.durationInFrames / config.fps;\n return Math.ceil((bitrate * durationSeconds) / 8);\n}\n\n/**\n * Check browser support for video encoding\n */\nexport function checkEncodingSupport(): {\n webm: boolean;\n mp4: boolean;\n codecs: string[];\n} {\n const webm = MediaRecorder.isTypeSupported('video/webm');\n const mp4 = MediaRecorder.isTypeSupported('video/mp4');\n \n const codecs: string[] = [];\n const testCodecs = [\n 'video/webm;codecs=vp9',\n 'video/webm;codecs=vp8',\n 'video/mp4;codecs=h264',\n 'video/mp4;codecs=avc1',\n ];\n \n for (const codec of testCodecs) {\n if (MediaRecorder.isTypeSupported(codec)) {\n codecs.push(codec);\n }\n }\n \n return { webm, mp4, codecs };\n}\n\n// Singleton export manager\nexport const videoExportManager = new VideoExportManager();\n\nexport default VideoExportManager;\n","'use client';\n\nimport React, { createContext, useContext, useState, useCallback, useRef, useEffect } from 'react';\nimport { FrameContextValue, CompositionProps, TimelineState } from './types';\n\n// Frame Context - provides current frame information to all children\nconst FrameContext = createContext(null);\n\nexport const useCurrentFrame = (): number => {\n const context = useContext(FrameContext);\n if (!context) {\n throw new Error('useCurrentFrame must be used within a FrameContext.Provider');\n }\n return context.frame;\n};\n\nexport const useVideoConfig = () => {\n const context = useContext(FrameContext);\n if (!context) {\n throw new Error('useVideoConfig must be used within a FrameContext.Provider');\n }\n return {\n fps: context.fps,\n durationInFrames: context.durationInFrames,\n width: context.width,\n height: context.height,\n };\n};\n\nexport const useTimelineState = () => {\n const context = useContext(FrameContext);\n if (!context) {\n throw new Error('useTimelineState must be used within a FrameContext.Provider');\n }\n return {\n frame: context.frame,\n playing: context.playing,\n playbackRate: context.playbackRate,\n setFrame: context.setFrame,\n setPlaying: context.setPlaying,\n setPlaybackRate: context.setPlaybackRate,\n };\n};\n\n// Composition Manager Context\ninterface CompositionManagerContextValue {\n compositions: Map;\n currentComposition: CompositionProps | null;\n registerComposition: (composition: CompositionProps) => void;\n unregisterComposition: (id: string) => void;\n setCurrentComposition: (id: string) => void;\n}\n\nconst CompositionManagerContext = createContext(null);\n\nexport const useCompositionManager = () => {\n const context = useContext(CompositionManagerContext);\n if (!context) {\n throw new Error('useCompositionManager must be used within CompositionManagerProvider');\n }\n return context;\n};\n\n// Player Context for timeline playback control\ninterface PlayerContextValue extends TimelineState {\n durationInFrames: number;\n fps: number;\n seek: (frame: number) => void;\n play: () => void;\n pause: () => void;\n toggle: () => void;\n restart: () => void;\n frameRef: React.MutableRefObject;\n}\n\nconst PlayerContext = createContext(null);\n\nexport const usePlayer = () => {\n const context = useContext(PlayerContext);\n if (!context) {\n throw new Error('usePlayer must be used within a PlayerProvider');\n }\n return context;\n};\n\n// Frame Provider Component\ninterface FrameProviderProps {\n fps?: number;\n durationInFrames: number;\n width: number;\n height: number;\n children: React.ReactNode;\n initialFrame?: number;\n}\n\nexport const FrameProvider: React.FC = ({\n fps = 30,\n durationInFrames,\n width,\n height,\n children,\n initialFrame = 0,\n}) => {\n const [frame, setFrameState] = useState(initialFrame);\n const [playing, setPlaying] = useState(false);\n const [playbackRate, setPlaybackRate] = useState(1);\n const animationRef = useRef(null);\n const lastTimeRef = useRef(0);\n const frameRef = useRef(initialFrame);\n\n const setFrame = useCallback((newFrame: number) => {\n const clampedFrame = Math.max(0, Math.min(newFrame, durationInFrames - 1));\n setFrameState(clampedFrame);\n frameRef.current = clampedFrame;\n }, [durationInFrames]);\n\n useEffect(() => {\n if (playing) {\n const frameDuration = 1000 / (fps * playbackRate);\n \n const animate = (currentTime: number) => {\n if (currentTime - lastTimeRef.current >= frameDuration) {\n frameRef.current += 1;\n \n if (frameRef.current >= durationInFrames) {\n frameRef.current = 0;\n setFrameState(0);\n lastTimeRef.current = currentTime;\n } else {\n setFrameState(frameRef.current);\n lastTimeRef.current = currentTime;\n }\n }\n \n animationRef.current = requestAnimationFrame(animate);\n };\n \n animationRef.current = requestAnimationFrame(animate);\n \n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n };\n }\n }, [playing, fps, playbackRate, durationInFrames]);\n\n const value: FrameContextValue = {\n frame,\n fps,\n durationInFrames,\n width,\n height,\n playing,\n playbackRate,\n setFrame,\n setPlaying,\n setPlaybackRate,\n };\n\n return (\n \n {children}\n \n );\n};\n\n// Composition Manager Provider\ninterface CompositionManagerProviderProps {\n children: React.ReactNode;\n}\n\nexport const CompositionManagerProvider: React.FC = ({ children }) => {\n const [compositions] = useState(() => new Map());\n const [currentCompositionId, setCurrentCompositionId] = useState(null);\n\n const registerComposition = useCallback((composition: CompositionProps) => {\n compositions.set(composition.id, composition);\n }, [compositions]);\n\n const unregisterComposition = useCallback((id: string) => {\n compositions.delete(id);\n }, [compositions]);\n\n const setCurrentComposition = useCallback((id: string) => {\n if (compositions.has(id)) {\n setCurrentCompositionId(id);\n }\n }, [compositions]);\n\n const currentComposition = currentCompositionId ? compositions.get(currentCompositionId) || null : null;\n\n return (\n \n {children}\n \n );\n};\n\n// Player Provider\ninterface PlayerProviderProps {\n durationInFrames: number;\n fps?: number;\n children: React.ReactNode;\n}\n\nexport const PlayerProvider: React.FC = ({\n durationInFrames,\n fps = 30,\n children,\n}) => {\n const [frame, setFrameState] = useState(0);\n const [playing, setPlayingState] = useState(false);\n const [playbackRate, setPlaybackRateState] = useState(1);\n const animationRef = useRef(null);\n const lastTimeRef = useRef(0);\n const frameRef = useRef(0);\n\n const seek = useCallback((targetFrame: number) => {\n const clampedFrame = Math.max(0, Math.min(targetFrame, durationInFrames - 1));\n frameRef.current = clampedFrame;\n setFrameState(clampedFrame);\n }, [durationInFrames]);\n\n const play = useCallback(() => setPlayingState(true), []);\n const pause = useCallback(() => setPlayingState(false), []);\n const toggle = useCallback(() => setPlayingState(p => !p), []);\n const restart = useCallback(() => {\n frameRef.current = 0;\n setFrameState(0);\n }, []);\n\n useEffect(() => {\n if (playing) {\n const frameDuration = 1000 / (fps * playbackRate);\n \n const animate = (currentTime: number) => {\n if (currentTime - lastTimeRef.current >= frameDuration) {\n frameRef.current += 1;\n \n if (frameRef.current >= durationInFrames) {\n frameRef.current = 0;\n setFrameState(0);\n } else {\n setFrameState(frameRef.current);\n }\n lastTimeRef.current = currentTime;\n }\n \n animationRef.current = requestAnimationFrame(animate);\n };\n \n lastTimeRef.current = performance.now();\n animationRef.current = requestAnimationFrame(animate);\n \n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n };\n }\n }, [playing, fps, playbackRate, durationInFrames]);\n\n return (\n \n {children}\n \n );\n};\n\nexport { FrameContext, CompositionManagerContext, PlayerContext };\n","'use client';\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport { CompositionProps as CompositionType, VideoConfig } from '../core/types';\nimport { FrameProvider, FrameContext, useVideoConfig as useVideoConfigContext } from '../core/context';\n\n// Composition Context\nconst CompositionContext = createContext<{\n id: string;\n config: VideoConfig;\n} | null>(null);\n\nexport const useComposition = () => {\n const context = useContext(CompositionContext);\n if (!context) {\n throw new Error('useComposition must be used within a Composition');\n }\n return context;\n};\n\n// Re-export useVideoConfig for convenience\nexport const useVideoConfig = () => useVideoConfigContext();\n\ninterface CompositionProps {\n id: string;\n component: React.ComponentType>;\n width?: number;\n height?: number;\n fps?: number;\n durationInFrames: number;\n defaultProps?: Record;\n children?: ReactNode;\n}\n\n// Composition wrapper (for registration)\nexport const Composition: React.FC = ({\n id,\n component: Component,\n width = 1920,\n height = 1080,\n fps = 30,\n durationInFrames,\n defaultProps = {},\n}) => {\n return (\n \n \n \n \n \n );\n};\n\n// Player Composition - for preview with controlled frame\ninterface PlayerCompositionProps {\n id: string;\n component: React.ComponentType>;\n width?: number;\n height?: number;\n fps?: number;\n durationInFrames: number;\n defaultProps?: Record;\n frame: number;\n playing?: boolean;\n playbackRate?: number;\n}\n\nexport const PlayerComposition: React.FC = ({\n id,\n component: Component,\n width = 1920,\n height = 1080,\n fps = 30,\n durationInFrames,\n defaultProps = {},\n frame,\n playing = false,\n playbackRate = 1,\n}) => {\n return (\n \n \n \n \n \n );\n};\n\n// Static Frame Provider - for controlled frame playback\ninterface StaticFrameProviderProps {\n fps: number;\n durationInFrames: number;\n width: number;\n height: number;\n frame: number;\n playing: boolean;\n playbackRate: number;\n children: ReactNode;\n}\n\nconst StaticFrameProvider: React.FC = ({\n fps,\n durationInFrames,\n width,\n height,\n frame,\n playing,\n playbackRate,\n children,\n}) => {\n const value = {\n frame,\n fps,\n durationInFrames,\n width,\n height,\n playing,\n playbackRate,\n setFrame: () => {},\n setPlaying: () => {},\n setPlaybackRate: () => {},\n };\n\n return (\n \n {children}\n \n );\n};\n\n// Export types\nexport type { CompositionProps };\n","'use client';\n\nimport React, { ReactNode, createContext, useContext, useState, useEffect } from 'react';\nimport { useCurrentFrame } from '../core/context';\n\n// Sequence Context\ninterface SequenceContextValue {\n relativeFrom: number;\n durationInFrames?: number;\n isActive: boolean;\n startFrame: number;\n endFrame: number;\n}\n\nconst SequenceContext = createContext({\n relativeFrom: 0,\n isActive: true,\n startFrame: 0,\n endFrame: Infinity,\n});\n\nexport const useSequence = () => useContext(SequenceContext);\n\ninterface SequenceProps {\n from: number;\n durationInFrames?: number;\n offset?: number;\n name?: string;\n children: ReactNode;\n showInTimeline?: boolean;\n layout?: 'absolute-fill' | 'none';\n}\n\n// Sequence Component - renders children only during specified frame range\nexport const Sequence: React.FC = ({\n from,\n durationInFrames,\n offset = 0,\n name,\n children,\n layout = 'absolute-fill',\n}) => {\n const currentFrame = useCurrentFrame();\n const startFrame = from + offset;\n const endFrame = durationInFrames !== undefined ? startFrame + durationInFrames : Infinity;\n \n // Calculate relative frame\n const relativeFrame = currentFrame - startFrame;\n \n // Check if sequence is active\n const isActive = currentFrame >= startFrame && currentFrame < endFrame;\n \n const contextValue: SequenceContextValue = {\n relativeFrom: startFrame,\n durationInFrames,\n isActive,\n startFrame,\n endFrame,\n };\n\n // Don't render children if not active (optimization)\n if (!isActive) {\n return null;\n }\n\n return (\n \n \n \n {children}\n \n
\n \n );\n};\n\n// Frame provider for sequences that shifts frame numbers\ninterface SequenceFrameProviderProps {\n relativeFrame: number;\n children: ReactNode;\n}\n\nconst SequenceFrameProvider: React.FC = ({\n relativeFrame,\n children,\n}) => {\n // This would need to integrate with the main frame context\n // For now, we pass the relative frame through context\n return (\n \n {children}\n \n );\n};\n\n// Relative Frame Context\nconst RelativeFrameContext = createContext(0);\n\nexport const useRelativeCurrentFrame = () => useContext(RelativeFrameContext);\n\n// Loop Component - loops a sequence for specified number of times\ninterface LoopProps {\n durationInFrames: number;\n times?: number;\n children: ReactNode;\n name?: string;\n}\n\nexport const Loop: React.FC = ({\n durationInFrames,\n times = Infinity,\n children,\n name,\n}) => {\n const currentFrame = useCurrentFrame();\n \n // Calculate looped frame\n const totalFrames = times === Infinity ? durationInFrames : durationInFrames * times;\n const loopedFrame = currentFrame % durationInFrames;\n const currentLoop = Math.floor(currentFrame / durationInFrames);\n \n // Check if within total duration\n if (times !== Infinity && currentFrame >= totalFrames) {\n return null;\n }\n\n return (\n \n \n {children}\n \n \n );\n};\n\n// Loop Context\nconst LoopContext = createContext<{\n loopedFrame: number;\n currentLoop: number;\n durationInFrames: number;\n}>({\n loopedFrame: 0,\n currentLoop: 0,\n durationInFrames: 0,\n});\n\nexport const useLoop = () => useContext(LoopContext);\n\n// Freeze Component - freezes a frame for specified duration\ninterface FreezeProps {\n frame: number;\n durationInFrames: number;\n children: ReactNode;\n name?: string;\n}\n\nexport const Freeze: React.FC = ({\n frame: freezeFrame,\n durationInFrames,\n children,\n}) => {\n const currentFrame = useCurrentFrame();\n \n // Calculate which frame to show\n const displayFrame = currentFrame < durationInFrames ? freezeFrame : currentFrame - durationInFrames + freezeFrame;\n\n return (\n \n {children}\n \n );\n};\n\n// Retiming Component - changes playback speed\ninterface RetimingProps {\n children: ReactNode;\n playbackRate: number | ((frame: number) => number);\n name?: string;\n}\n\nexport const Retiming: React.FC = ({\n children,\n playbackRate,\n name,\n}) => {\n const currentFrame = useCurrentFrame();\n \n // Calculate retimed frame\n const rate = typeof playbackRate === 'function' ? playbackRate(currentFrame) : playbackRate;\n const retimedFrame = Math.floor(currentFrame * rate);\n\n return (\n \n {children}\n \n );\n};\n\n// Reverse Component - plays frames in reverse\ninterface ReverseProps {\n children: ReactNode;\n durationInFrames: number;\n}\n\nexport const Reverse: React.FC = ({\n children,\n durationInFrames,\n}) => {\n const currentFrame = useCurrentFrame();\n const reversedFrame = durationInFrames - 1 - (currentFrame % durationInFrames);\n\n return (\n \n {children}\n \n );\n};\n\n// Series Component - plays sequences in series\ninterface SeriesProps {\n children: ReactNode;\n}\n\nexport const Series: React.FC = ({ children }) => {\n const currentFrame = useCurrentFrame();\n \n // Calculate cumulative frames for each child\n let accumulatedFrames = 0;\n let activeChildIndex = -1;\n let relativeFrame = currentFrame;\n\n const childArray = React.Children.toArray(children);\n \n for (let i = 0; i < childArray.length; i++) {\n const child = childArray[i];\n if (React.isValidElement<{ durationInFrames?: number }>(child) && child.props.durationInFrames) {\n const childDuration = child.props.durationInFrames;\n \n if (currentFrame >= accumulatedFrames && currentFrame < accumulatedFrames + childDuration) {\n activeChildIndex = i;\n relativeFrame = currentFrame - accumulatedFrames;\n break;\n }\n \n accumulatedFrames += childDuration;\n }\n }\n\n if (activeChildIndex === -1) {\n return null;\n }\n\n const activeChild = childArray[activeChildIndex];\n \n return (\n \n {activeChild}\n \n );\n};\n\nexport { SequenceContext };\n","'use client';\n\nimport React, { useRef, useEffect, useState, VideoHTMLAttributes, AudioHTMLAttributes, ImgHTMLAttributes } from 'react';\nimport { useCurrentFrame, useVideoConfig } from '../core/context';\nimport { interpolate } from '../utils/animation';\n\n// Absolute Fill - Container component\ninterface AbsoluteFillProps {\n children: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const AbsoluteFill: React.FC = ({\n children,\n style,\n className,\n}) => {\n return (\n \n {children}\n
\n );\n};\n\n// Video Component\ninterface VideoProps extends Omit, 'src'> {\n src: string;\n startFrom?: number;\n endAt?: number;\n volume?: number | ((frame: number) => number);\n playbackRate?: number;\n muted?: boolean;\n style?: React.CSSProperties;\n pauseOnFrame?: boolean;\n}\n\nexport const Video: React.FC = ({\n src,\n startFrom = 0,\n endAt,\n volume = 1,\n playbackRate = 1,\n muted = true,\n style,\n pauseOnFrame = true,\n ...props\n}) => {\n const videoRef = useRef(null);\n const currentFrame = useCurrentFrame();\n const { fps } = useVideoConfig();\n const [loaded, setLoaded] = useState(false);\n\n // Calculate video time based on frame\n useEffect(() => {\n if (videoRef.current && loaded) {\n const time = (startFrom + currentFrame) / fps;\n if (Math.abs(videoRef.current.currentTime - time) > 0.05) {\n videoRef.current.currentTime = time;\n }\n }\n }, [currentFrame, fps, startFrom, loaded]);\n\n // Handle volume\n useEffect(() => {\n if (videoRef.current) {\n const vol = typeof volume === 'function' ? volume(currentFrame) : volume;\n videoRef.current.volume = Math.max(0, Math.min(1, vol));\n }\n }, [currentFrame, volume]);\n\n // Handle playback rate\n useEffect(() => {\n if (videoRef.current) {\n videoRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate]);\n\n const handleLoadedData = () => {\n setLoaded(true);\n if (props.onLoadedData) {\n props.onLoadedData({} as React.SyntheticEvent);\n }\n };\n\n return (\n \n );\n};\n\n// Audio Component\ninterface AudioProps extends Omit, 'src'> {\n src: string;\n startFrom?: number;\n endAt?: number;\n volume?: number | ((frame: number) => number);\n playbackRate?: number;\n muted?: boolean;\n}\n\nexport const Audio: React.FC = ({\n src,\n startFrom = 0,\n endAt,\n volume = 1,\n playbackRate = 1,\n muted = false,\n ...props\n}) => {\n const audioRef = useRef(null);\n const currentFrame = useCurrentFrame();\n const { fps } = useVideoConfig();\n const [loaded, setLoaded] = useState(false);\n\n // Calculate audio time based on frame\n useEffect(() => {\n if (audioRef.current && loaded) {\n const time = (startFrom + currentFrame) / fps;\n if (Math.abs(audioRef.current.currentTime - time) > 0.05) {\n audioRef.current.currentTime = time;\n }\n }\n }, [currentFrame, fps, startFrom, loaded]);\n\n // Handle volume\n useEffect(() => {\n if (audioRef.current) {\n const vol = typeof volume === 'function' ? volume(currentFrame) : volume;\n audioRef.current.volume = Math.max(0, Math.min(1, vol));\n }\n }, [currentFrame, volume]);\n\n // Handle playback rate\n useEffect(() => {\n if (audioRef.current) {\n audioRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate]);\n\n const handleLoadedData = () => {\n setLoaded(true);\n if (props.onLoadedData) {\n props.onLoadedData({} as React.SyntheticEvent);\n }\n };\n\n return (\n \n );\n};\n\n// Image Component\ninterface ImgProps extends Omit, 'src'> {\n src: string;\n style?: React.CSSProperties;\n startFrom?: number;\n endAt?: number;\n}\n\nexport const Img: React.FC = ({\n src,\n style,\n startFrom,\n endAt,\n ...props\n}) => {\n const currentFrame = useCurrentFrame();\n \n // Check if should render based on frame range\n if (startFrom !== undefined && currentFrame < startFrom) {\n return null;\n }\n if (endAt !== undefined && currentFrame > endAt) {\n return null;\n }\n\n return (\n
\n );\n};\n\n// StaticFile component - for local static assets\ninterface StaticFileProps {\n src: string;\n style?: React.CSSProperties;\n}\n\nexport const staticFile = (path: string): string => {\n // In a real implementation, this would resolve to a static file path\n return `/static/${path}`;\n};\n\n// Text Component\ninterface TextProps {\n children: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const Text: React.FC = ({\n children,\n style,\n className,\n}) => {\n return (\n \n {children}\n
\n );\n};\n\n// SVG Components\ninterface SVGProps {\n width?: number | string;\n height?: number | string;\n viewBox?: string;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport const SVG: React.FC = ({\n width = '100%',\n height = '100%',\n viewBox = '0 0 100 100',\n children,\n style,\n}) => {\n return (\n \n );\n};\n\n// Rect Component\ninterface RectProps {\n width: number | string;\n height: number | string;\n x?: number;\n y?: number;\n rx?: number;\n ry?: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n style?: React.CSSProperties;\n}\n\nexport const Rect: React.FC = ({\n width,\n height,\n x = 0,\n y = 0,\n rx = 0,\n ry = 0,\n fill = 'black',\n stroke,\n strokeWidth,\n style,\n}) => {\n return (\n \n );\n};\n\n// Circle Component\ninterface CircleProps {\n r: number;\n cx?: number;\n cy?: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n style?: React.CSSProperties;\n}\n\nexport const Circle: React.FC = ({\n r,\n cx = 0,\n cy = 0,\n fill = 'black',\n stroke,\n strokeWidth,\n style,\n}) => {\n return (\n \n );\n};\n\n// Path Component\ninterface PathProps {\n d: string;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n style?: React.CSSProperties;\n}\n\nexport const Path: React.FC = ({\n d,\n fill = 'black',\n stroke,\n strokeWidth,\n style,\n}) => {\n return (\n \n );\n};\n\n// G (Group) Component\ninterface GroupProps {\n children: React.ReactNode;\n transform?: string;\n style?: React.CSSProperties;\n}\n\nexport const G: React.FC = ({\n children,\n transform,\n style,\n}) => {\n return (\n \n {children}\n \n );\n};\n\nexport { AbsoluteFill as Div };\n","// Animation utilities for Remotion-like framework\n\nimport { SpringConfig, InterpolateOptions, EasingFunction, Keyframe } from '../core/types';\n\n// Easing functions\nexport const Easing = {\n linear: (t: number): number => t,\n \n easeInQuad: (t: number): number => t * t,\n easeOutQuad: (t: number): number => t * (2 - t),\n easeInOutQuad: (t: number): number => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n \n easeInCubic: (t: number): number => t * t * t,\n easeOutCubic: (t: number): number => (--t) * t * t + 1,\n easeInOutCubic: (t: number): number => \n t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n \n easeInQuart: (t: number): number => t * t * t * t,\n easeOutQuart: (t: number): number => 1 - (--t) * t * t * t,\n easeInOutQuart: (t: number): number => \n t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t,\n \n easeInQuint: (t: number): number => t * t * t * t * t,\n easeOutQuint: (t: number): number => 1 + (--t) * t * t * t * t,\n easeInOutQuint: (t: number): number => \n t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t,\n \n easeInSine: (t: number): number => 1 - Math.cos((t * Math.PI) / 2),\n easeOutSine: (t: number): number => Math.sin((t * Math.PI) / 2),\n easeInOutSine: (t: number): number => -(Math.cos(Math.PI * t) - 1) / 2,\n \n easeInExpo: (t: number): number => (t === 0 ? 0 : Math.pow(2, 10 * (t - 1))),\n easeOutExpo: (t: number): number => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n easeInOutExpo: (t: number): number => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n if (t < 0.5) return Math.pow(2, 20 * t - 10) / 2;\n return (2 - Math.pow(2, -20 * t + 10)) / 2;\n },\n \n easeInCirc: (t: number): number => 1 - Math.sqrt(1 - t * t),\n easeOutCirc: (t: number): number => Math.sqrt(1 - (--t) * t),\n easeInOutCirc: (t: number): number => \n t < 0.5\n ? (1 - Math.sqrt(1 - 4 * t * t)) / 2\n : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2,\n \n easeInBack: (t: number): number => {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n return c3 * t * t * t - c1 * t * t;\n },\n easeOutBack: (t: number): number => {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n },\n easeInOutBack: (t: number): number => {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n return t < 0.5\n ? (Math.pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2\n : (Math.pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2;\n },\n \n easeInElastic: (t: number): number => {\n const c4 = (2 * Math.PI) / 3;\n return t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c4);\n },\n easeOutElastic: (t: number): number => {\n const c4 = (2 * Math.PI) / 3;\n return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic: (t: number): number => {\n const c5 = (2 * Math.PI) / 4.5;\n if (t === 0) return 0;\n if (t === 1) return 1;\n if (t < 0.5) return -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c5)) / 2;\n return (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c5)) / 2 + 1;\n },\n \n easeInBounce: (t: number): number => 1 - Easing.easeOutBounce(1 - t),\n easeOutBounce: (t: number): number => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n },\n easeInOutBounce: (t: number): number => \n t < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * t)) / 2\n : (1 + Easing.easeOutBounce(2 * t - 1)) / 2,\n \n // Bezier curve easing\n bezier: (x1: number, y1: number, x2: number, y2: number): EasingFunction => {\n const epsilon = 1e-6;\n \n const sampleCurveX = (t: number): number => \n 3 * x1 * t * (1 - t) * (1 - t) + 3 * x2 * t * t * (1 - t) + t * t * t;\n \n const sampleCurveY = (t: number): number =>\n 3 * y1 * t * (1 - t) * (1 - t) + 3 * y2 * t * t * (1 - t) + t * t * t;\n \n const solveCurveX = (x: number): number => {\n let t = x;\n for (let i = 0; i < 8; i++) {\n const xEst = sampleCurveX(t) - x;\n if (Math.abs(xEst) < epsilon) return t;\n const d = (3 * x1 * (1 - t) * (1 - t) + 6 * x2 * t * (1 - t) + 3 * t * t);\n if (Math.abs(d) < epsilon) break;\n t -= xEst / d;\n }\n return t;\n };\n \n return (t: number): number => sampleCurveY(solveCurveX(t));\n },\n};\n\n// Spring animation\nexport const spring = ({\n frame,\n fps,\n config = {},\n from = 0,\n to = 1,\n durationInFrames,\n durationRestThreshold = 0.005,\n}: SpringConfig): number => {\n const {\n damping = 10,\n mass = 1,\n stiffness = 100,\n overshootClamping = false,\n } = config;\n\n // Calculate natural frequency and damping ratio\n const omega = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n \n // Calculate duration if not provided\n const actualDuration = durationInFrames ?? Math.ceil(fps * 2);\n \n // Normalize time\n const t = Math.min(frame / actualDuration, 1);\n const time = t * actualDuration / fps;\n \n let value: number;\n \n if (zeta < 1) {\n // Underdamped\n const omegaD = omega * Math.sqrt(1 - zeta * zeta);\n value = 1 - Math.exp(-zeta * omega * time) * (\n Math.cos(omegaD * time) + (zeta * omega / omegaD) * Math.sin(omegaD * time)\n );\n } else if (zeta === 1) {\n // Critically damped\n value = 1 - (1 + omega * time) * Math.exp(-omega * time);\n } else {\n // Overdamped\n const r1 = -omega * (zeta - Math.sqrt(zeta * zeta - 1));\n const r2 = -omega * (zeta + Math.sqrt(zeta * zeta - 1));\n const c2 = (1 - r1 / (r1 - r2)) / (r1 - r2);\n const c1 = 1 / (r1 - r2) - c2;\n value = 1 - c1 * Math.exp(r1 * time) - c2 * Math.exp(r2 * time);\n }\n \n // Clamp overshoot if needed\n if (overshootClamping) {\n value = Math.max(0, Math.min(1, value));\n }\n \n return from + (to - from) * value;\n};\n\n// Interpolate function\nexport const interpolate = (\n input: number,\n inputRange: number[],\n outputRange: number[],\n options: InterpolateOptions = {}\n): number => {\n const {\n extrapolateLeft = 'clamp',\n extrapolateRight = 'clamp',\n easing,\n } = options;\n\n if (inputRange.length !== outputRange.length) {\n throw new Error('inputRange and outputRange must have the same length');\n }\n\n if (inputRange.length < 2) {\n throw new Error('inputRange must have at least 2 elements');\n }\n\n // Check if input is outside the range\n if (input < inputRange[0]) {\n if (extrapolateLeft === 'clamp') {\n return outputRange[0];\n } else if (extrapolateLeft === 'identity') {\n return input;\n }\n // extend - continue the linear extrapolation\n }\n\n if (input > inputRange[inputRange.length - 1]) {\n if (extrapolateRight === 'clamp') {\n return outputRange[outputRange.length - 1];\n } else if (extrapolateRight === 'identity') {\n return input;\n }\n // extend - continue the linear extrapolation\n }\n\n // Find the segment\n let segmentIndex = 0;\n for (let i = 1; i < inputRange.length; i++) {\n if (input <= inputRange[i]) {\n segmentIndex = i - 1;\n break;\n }\n }\n\n const inputStart = inputRange[segmentIndex];\n const inputEnd = inputRange[segmentIndex + 1];\n const outputStart = outputRange[segmentIndex];\n const outputEnd = outputRange[segmentIndex + 1];\n\n // Calculate progress\n let progress = (input - inputStart) / (inputEnd - inputStart);\n \n // Apply easing\n if (easing) {\n progress = easing(progress);\n }\n\n return outputStart + progress * (outputEnd - outputStart);\n};\n\n// Interpolate colors\nexport const interpolateColors = (\n input: number,\n inputRange: number[],\n outputRange: string[]\n): string => {\n // Parse color to RGB\n const parseColor = (color: string): [number, number, number, number] => {\n if (color.startsWith('#')) {\n const hex = color.slice(1);\n if (hex.length === 3) {\n return [\n parseInt(hex[0] + hex[0], 16),\n parseInt(hex[1] + hex[1], 16),\n parseInt(hex[2] + hex[2], 16),\n 255,\n ];\n }\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n hex.length === 8 ? parseInt(hex.slice(6, 8), 16) : 255,\n ];\n }\n if (color.startsWith('rgb')) {\n const match = color.match(/\\d+/g);\n if (match) {\n return [\n parseInt(match[0]),\n parseInt(match[1]),\n parseInt(match[2]),\n match[3] ? parseInt(match[3]) : 255,\n ];\n }\n }\n return [0, 0, 0, 255];\n };\n\n const rgbToHex = (r: number, g: number, b: number): string => {\n return '#' + [r, g, b].map(x => {\n const hex = Math.round(x).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n };\n\n // Find segment\n let segmentIndex = 0;\n for (let i = 1; i < inputRange.length; i++) {\n if (input <= inputRange[i]) {\n segmentIndex = i - 1;\n break;\n }\n }\n\n const inputStart = inputRange[segmentIndex];\n const inputEnd = inputRange[segmentIndex + 1];\n const colorStart = parseColor(outputRange[segmentIndex]);\n const colorEnd = parseColor(outputRange[segmentIndex + 1]);\n\n const progress = (input - inputStart) / (inputEnd - inputStart);\n\n const r = colorStart[0] + progress * (colorEnd[0] - colorStart[0]);\n const g = colorStart[1] + progress * (colorEnd[1] - colorStart[1]);\n const b = colorStart[2] + progress * (colorEnd[2] - colorStart[2]);\n\n return rgbToHex(r, g, b);\n};\n\n// Keyframe animation\nexport const useKeyframes = (\n keyframes: Keyframe[],\n frame: number\n): number | string => {\n if (keyframes.length === 0) return 0;\n if (keyframes.length === 1) return keyframes[0].value;\n\n // Sort keyframes by frame\n const sorted = [...keyframes].sort((a, b) => a.frame - b.frame);\n\n // Find surrounding keyframes\n let prev = sorted[0];\n let next = sorted[sorted.length - 1];\n\n for (let i = 0; i < sorted.length - 1; i++) {\n if (frame >= sorted[i].frame && frame <= sorted[i + 1].frame) {\n prev = sorted[i];\n next = sorted[i + 1];\n break;\n }\n }\n\n if (frame <= prev.frame) return prev.value;\n if (frame >= next.frame) return next.value;\n\n // Calculate progress\n let progress = (frame - prev.frame) / (next.frame - prev.frame);\n\n // Apply easing\n if (next.easing) {\n progress = next.easing(progress);\n } else if (prev.easing) {\n progress = prev.easing(progress);\n }\n\n // Interpolate values\n if (typeof prev.value === 'number' && typeof next.value === 'number') {\n return prev.value + progress * (next.value - prev.value);\n }\n\n // For strings, just return the previous or next based on progress\n return progress < 0.5 ? prev.value : next.value;\n};\n\n// Measure spring duration\nexport const measureSpring = ({\n fps,\n config = {},\n threshold = 0.005,\n}: {\n fps: number;\n config?: SpringConfig['config'];\n threshold?: number;\n}): number => {\n const { damping = 10, mass = 1, stiffness = 100 } = config;\n const omega = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n \n // Estimate time to settle\n let time = 0;\n const dt = 1 / fps;\n const maxTime = 10; // 10 seconds max\n \n while (time < maxTime) {\n let value: number;\n \n if (zeta < 1) {\n const omegaD = omega * Math.sqrt(1 - zeta * zeta);\n value = 1 - Math.exp(-zeta * omega * time) * (\n Math.cos(omegaD * time) + (zeta * omega / omegaD) * Math.sin(omegaD * time)\n );\n } else if (zeta === 1) {\n value = 1 - (1 + omega * time) * Math.exp(-omega * time);\n } else {\n const r1 = -omega * (zeta - Math.sqrt(zeta * zeta - 1));\n const r2 = -omega * (zeta + Math.sqrt(zeta * zeta - 1));\n const c2 = (1 - r1 / (r1 - r2)) / (r1 - r2);\n const c1 = 1 / (r1 - r2) - c2;\n value = 1 - c1 * Math.exp(r1 * time) - c2 * Math.exp(r2 * time);\n }\n \n if (Math.abs(value - 1) < threshold) {\n return Math.ceil(time * fps);\n }\n \n time += dt;\n }\n \n return Math.ceil(maxTime * fps);\n};\n\n// Calculate frames from seconds\nexport const getFramesFromSeconds = (seconds: number, fps: number): number => {\n return Math.round(seconds * fps);\n};\n\n// Calculate seconds from frames\nexport const getSecondsFromFrames = (frames: number, fps: number): number => {\n return frames / fps;\n};\n\n// Range utility\nexport const range = (start: number, end: number, step: number = 1): number[] => {\n const result: number[] = [];\n for (let i = start; i < end; i += step) {\n result.push(i);\n }\n return result;\n};\n\n// Random with seed (for reproducibility)\nexport const random = (seed: string | number, min: number = 0, max: number = 1): number => {\n const str = typeof seed === 'number' ? seed.toString() : seed;\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n const normalized = (Math.abs(hash) % 10000) / 10000;\n return min + normalized * (max - min);\n};\n\n// Noise function (simple implementation)\nexport const noise2D = (x: number, y: number): number => {\n const X = Math.floor(x) & 255;\n const Y = Math.floor(y) & 255;\n \n x -= Math.floor(x);\n y -= Math.floor(y);\n \n const u = x * x * (3 - 2 * x);\n const v = y * y * (3 - 2 * y);\n \n const A = (X + Y * 256) % 256;\n const B = (X + 1 + Y * 256) % 256;\n const C = (X + (Y + 1) * 256) % 256;\n const D = (X + 1 + (Y + 1) * 256) % 256;\n \n const a = Math.sin(A * 12.9898 + 78.233) * 43758.5453 % 1;\n const b = Math.sin(B * 12.9898 + 78.233) * 43758.5453 % 1;\n const c = Math.sin(C * 12.9898 + 78.233) * 43758.5453 % 1;\n const d = Math.sin(D * 12.9898 + 78.233) * 43758.5453 % 1;\n \n return a + u * (b - a + v * (d - b - (d - c))) + v * (c - a);\n};\n\nexport { Easing as easing };\n","'use client';\n\nimport React from 'react';\nimport { useCurrentFrame, useVideoConfig } from '../core/context';\nimport { interpolate, Easing } from '../utils/animation';\n\n// Fade component\ninterface FadeProps {\n children: React.ReactNode;\n durationInFrames?: number;\n startFrame?: number;\n style?: React.CSSProperties;\n}\n\nexport const Fade: React.FC = ({\n children,\n durationInFrames = 30,\n startFrame = 0,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const opacity = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }\n );\n\n return (\n \n {children}\n
\n );\n};\n\n// Scale component\ninterface ScaleProps {\n children: React.ReactNode;\n from?: number;\n to?: number;\n durationInFrames?: number;\n startFrame?: number;\n easing?: (t: number) => number;\n style?: React.CSSProperties;\n}\n\nexport const Scale: React.FC = ({\n children,\n from = 0,\n to = 1,\n durationInFrames = 30,\n startFrame = 0,\n easing = Easing.easeOutCubic,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const progress = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing }\n );\n\n const scale = from + (to - from) * progress;\n\n return (\n \n {children}\n
\n );\n};\n\n// Slide component\ninterface SlideProps {\n children: React.ReactNode;\n direction: 'left' | 'right' | 'up' | 'down';\n distance?: number;\n durationInFrames?: number;\n startFrame?: number;\n easing?: (t: number) => number;\n style?: React.CSSProperties;\n}\n\nexport const Slide: React.FC = ({\n children,\n direction,\n distance = 100,\n durationInFrames = 30,\n startFrame = 0,\n easing = Easing.easeOutCubic,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const progress = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing }\n );\n\n let transform = '';\n const offset = distance * (1 - progress);\n\n switch (direction) {\n case 'left':\n transform = `translateX(${-offset}px)`;\n break;\n case 'right':\n transform = `translateX(${offset}px)`;\n break;\n case 'up':\n transform = `translateY(${-offset}px)`;\n break;\n case 'down':\n transform = `translateY(${offset}px)`;\n break;\n }\n\n return (\n \n {children}\n
\n );\n};\n\n// Rotate component\ninterface RotateProps {\n children: React.ReactNode;\n degrees?: number;\n durationInFrames?: number;\n startFrame?: number;\n easing?: (t: number) => number;\n style?: React.CSSProperties;\n}\n\nexport const Rotate: React.FC = ({\n children,\n degrees = 360,\n durationInFrames = 60,\n startFrame = 0,\n easing = Easing.linear,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const rotation = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, degrees],\n { extrapolateLeft: 'clamp', extrapolateRight: 'extend', easing }\n );\n\n return (\n \n {children}\n
\n );\n};\n\n// Typewriter component\ninterface TypewriterProps {\n text: string;\n durationInFrames?: number;\n startFrame?: number;\n style?: React.CSSProperties;\n cursor?: boolean;\n cursorChar?: string;\n}\n\nexport const Typewriter: React.FC = ({\n text,\n durationInFrames = 60,\n startFrame = 0,\n style,\n cursor = true,\n cursorChar = '|',\n}) => {\n const frame = useCurrentFrame();\n\n const progress = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, text.length],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }\n );\n\n const displayText = text.slice(0, Math.floor(progress));\n const showCursor = cursor && (frame % 30 < 15);\n\n return (\n \n {displayText}\n {showCursor && cursorChar}\n \n );\n};\n\n// Counter component\ninterface CounterProps {\n from?: number;\n to: number;\n durationInFrames?: number;\n startFrame?: number;\n easing?: (t: number) => number;\n style?: React.CSSProperties;\n format?: (value: number) => string;\n}\n\nexport const Counter: React.FC = ({\n from = 0,\n to,\n durationInFrames = 60,\n startFrame = 0,\n easing = Easing.easeOutCubic,\n style,\n format = (v) => Math.round(v).toLocaleString(),\n}) => {\n const frame = useCurrentFrame();\n\n const value = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [from, to],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing }\n );\n\n return (\n \n {format(value)}\n \n );\n};\n\n// Progress Bar component\ninterface ProgressBarProps {\n progress: number;\n width?: number;\n height?: number;\n backgroundColor?: string;\n fillColor?: string;\n borderRadius?: number;\n style?: React.CSSProperties;\n}\n\nexport const ProgressBar: React.FC = ({\n progress,\n width = 200,\n height = 10,\n backgroundColor = '#333',\n fillColor = '#3b82f6',\n borderRadius = 5,\n style,\n}) => {\n return (\n \n );\n};\n\n// Glitch effect component\ninterface GlitchProps {\n children: React.ReactNode;\n intensity?: number;\n style?: React.CSSProperties;\n}\n\nexport const Glitch: React.FC = ({\n children,\n intensity = 10,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const shouldGlitch = frame % 10 < 3;\n const offset = shouldGlitch ? Math.random() * intensity : 0;\n const colorOffset = shouldGlitch ? Math.random() * 2 - 1 : 0;\n\n return (\n \n {/* Red channel */}\n
\n {children}\n
\n {/* Cyan channel */}\n
\n {children}\n
\n {/* Main content */}\n
\n {children}\n
\n
\n );\n};\n\n// Trail effect component\ninterface TrailProps {\n children: React.ReactNode;\n trailLength?: number;\n opacityDecay?: number;\n style?: React.CSSProperties;\n}\n\nexport const Trail: React.FC = ({\n children,\n trailLength = 5,\n opacityDecay = 0.2,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n return (\n \n {Array.from({ length: trailLength }, (_, i) => {\n const trailFrame = frame - i * 2;\n if (trailFrame < 0) return null;\n\n return (\n
\n {children}\n
\n );\n })}\n
\n {children}\n
\n
\n );\n};\n\n// Shake effect wrapper\ninterface ShakeEffectProps {\n children: React.ReactNode;\n intensity?: number;\n active?: boolean;\n style?: React.CSSProperties;\n}\n\nexport const ShakeEffect: React.FC = ({\n children,\n intensity = 5,\n active = true,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n if (!active) {\n return {children}
;\n }\n\n const x = Math.sin(frame * 0.8) * intensity;\n const y = Math.cos(frame * 1.2) * intensity;\n\n return (\n \n {children}\n
\n );\n};\n\n// Highlight effect\ninterface HighlightProps {\n children: React.ReactNode;\n color?: string;\n progress?: number;\n style?: React.CSSProperties;\n}\n\nexport const Highlight: React.FC = ({\n children,\n color = '#ffeb3b',\n progress = 1,\n style,\n}) => {\n return (\n \n {children}\n \n );\n};\n\n// Mask reveal component\ninterface MaskRevealProps {\n children: React.ReactNode;\n direction: 'left' | 'right' | 'up' | 'down';\n progress: number;\n style?: React.CSSProperties;\n}\n\nexport const MaskReveal: React.FC = ({\n children,\n direction,\n progress,\n style,\n}) => {\n let clipPath = '';\n\n switch (direction) {\n case 'left':\n clipPath = `inset(0 ${(1 - progress) * 100}% 0 0)`;\n break;\n case 'right':\n clipPath = `inset(0 0 0 ${(1 - progress) * 100}%)`;\n break;\n case 'up':\n clipPath = `inset(0 0 ${(1 - progress) * 100}% 0)`;\n break;\n case 'down':\n clipPath = `inset(${(1 - progress) * 100}% 0 0 0)`;\n break;\n }\n\n return (\n \n {children}\n
\n );\n};\n\n// Neon glow effect\ninterface NeonGlowProps {\n children: React.ReactNode;\n color?: string;\n intensity?: number;\n style?: React.CSSProperties;\n}\n\nexport const NeonGlow: React.FC = ({\n children,\n color = '#00ff00',\n intensity = 1,\n style,\n}) => {\n const frame = useCurrentFrame();\n const pulseIntensity = 0.8 + Math.sin(frame * 0.1) * 0.2;\n\n return (\n \n {children}\n
\n );\n};\n\n// ============================================\n// 3D TRANSFORM EFFECTS\n// ============================================\n\n// Rotate3D - Full 3D rotation effect\ninterface Rotate3DProps {\n children: React.ReactNode;\n rotateX?: number;\n rotateY?: number;\n rotateZ?: number;\n durationInFrames?: number;\n startFrame?: number;\n perspective?: number;\n easing?: (t: number) => number;\n style?: React.CSSProperties;\n}\n\nexport const Rotate3D: React.FC = ({\n children,\n rotateX = 0,\n rotateY = 360,\n rotateZ = 0,\n durationInFrames = 60,\n startFrame = 0,\n perspective = 1000,\n easing = Easing.easeInOutCubic,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const progress = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing }\n );\n\n const rx = rotateX * progress;\n const ry = rotateY * progress;\n const rz = rotateZ * progress;\n\n return (\n \n );\n};\n\n// Flip3D - 3D flip card effect\ninterface Flip3DProps {\n children: React.ReactNode;\n front: React.ReactNode;\n back: React.ReactNode;\n durationInFrames?: number;\n startFrame?: number;\n direction?: 'horizontal' | 'vertical';\n perspective?: number;\n style?: React.CSSProperties;\n}\n\nexport const Flip3D: React.FC = ({\n children,\n front,\n back,\n durationInFrames = 60,\n startFrame = 0,\n direction = 'horizontal',\n perspective = 1000,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const progress = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, 180],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.easeInOutCubic }\n );\n\n const rotateAxis = direction === 'horizontal' ? 'rotateY' : 'rotateX';\n\n return (\n \n
\n
\n {front}\n
\n
\n {back}\n
\n
\n
\n );\n};\n\n// Perspective3D - 3D perspective container\ninterface Perspective3DProps {\n children: React.ReactNode;\n rotateX?: number;\n rotateY?: number;\n perspective?: number;\n durationInFrames?: number;\n startFrame?: number;\n style?: React.CSSProperties;\n}\n\nexport const Perspective3D: React.FC = ({\n children,\n rotateX = 20,\n rotateY = 20,\n perspective = 800,\n durationInFrames = 60,\n startFrame = 0,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const progress = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.easeOutCubic }\n );\n\n return (\n \n );\n};\n\n// Cube3D - 3D rotating cube\ninterface Cube3DProps {\n size?: number;\n durationInFrames?: number;\n colors?: {\n front?: string;\n back?: string;\n left?: string;\n right?: string;\n top?: string;\n bottom?: string;\n };\n style?: React.CSSProperties;\n}\n\nexport const Cube3D: React.FC = ({\n size = 100,\n durationInFrames = 120,\n colors = {\n front: '#10b981',\n back: '#059669',\n left: '#047857',\n right: '#065f46',\n top: '#34d399',\n bottom: '#6ee7b7',\n },\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const rotateY = interpolate(frame, [0, durationInFrames], [0, 360], {\n extrapolateRight: 'extend',\n });\n const rotateX = interpolate(frame, [0, durationInFrames], [0, 360], {\n extrapolateRight: 'extend',\n });\n\n const halfSize = size / 2;\n\n const faceStyle: React.CSSProperties = {\n position: 'absolute',\n width: size,\n height: size,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: size * 0.3,\n fontWeight: 'bold',\n color: 'white',\n backfaceVisibility: 'visible',\n border: '2px solid rgba(255,255,255,0.3)',\n };\n\n return (\n \n
\n
Front
\n
Back
\n
Left
\n
Right
\n
Top
\n
Bottom
\n
\n
\n );\n};\n\n// ============================================\n// PARTICLE SYSTEM EFFECT\n// ============================================\n\ninterface ParticleConfig {\n x: number;\n y: number;\n size: number;\n speedX: number;\n speedY: number;\n color: string;\n opacity: number;\n rotation: number;\n rotationSpeed: number;\n}\n\ninterface ParticleSystemProps {\n count?: number;\n colors?: string[];\n minSize?: number;\n maxSize?: number;\n speed?: number;\n direction?: 'random' | 'up' | 'down' | 'left' | 'right' | 'explode';\n fadeOut?: boolean;\n style?: React.CSSProperties;\n particleShape?: 'circle' | 'square' | 'star' | 'triangle';\n}\n\nexport const ParticleSystem: React.FC = ({\n count = 50,\n colors = ['#10b981', '#34d399', '#6ee7b7', '#059669', '#047857'],\n minSize = 3,\n maxSize = 15,\n speed = 2,\n direction = 'random',\n fadeOut = true,\n particleShape = 'circle',\n style,\n}) => {\n const frame = useCurrentFrame();\n const { width, height } = useVideoConfig();\n\n // Generate deterministic particles based on index\n const particles: ParticleConfig[] = React.useMemo(() => {\n const seed = (n: number) => {\n const x = Math.sin(n * 9999) * 10000;\n return x - Math.floor(x);\n };\n\n return Array.from({ length: count }, (_, i) => {\n const rand = seed(i);\n const rand2 = seed(i + 1000);\n const rand3 = seed(i + 2000);\n const rand4 = seed(i + 3000);\n const rand5 = seed(i + 4000);\n\n let vx = 0;\n let vy = 0;\n\n switch (direction) {\n case 'up':\n vx = (rand2 - 0.5) * speed;\n vy = -rand3 * speed * 2 - speed;\n break;\n case 'down':\n vx = (rand2 - 0.5) * speed;\n vy = rand3 * speed * 2 + speed;\n break;\n case 'left':\n vx = -rand2 * speed * 2 - speed;\n vy = (rand3 - 0.5) * speed;\n break;\n case 'right':\n vx = rand2 * speed * 2 + speed;\n vy = (rand3 - 0.5) * speed;\n break;\n case 'explode':\n const angle = rand2 * Math.PI * 2;\n const mag = rand3 * speed * 3 + speed;\n vx = Math.cos(angle) * mag;\n vy = Math.sin(angle) * mag;\n break;\n default: // random\n vx = (rand2 - 0.5) * speed * 2;\n vy = (rand3 - 0.5) * speed * 2;\n }\n\n return {\n x: rand * width,\n y: rand2 * height,\n size: minSize + rand3 * (maxSize - minSize),\n speedX: vx,\n speedY: vy,\n color: colors[Math.floor(rand4 * colors.length)],\n opacity: 0.5 + rand5 * 0.5,\n rotation: rand4 * 360,\n rotationSpeed: (rand5 - 0.5) * 10,\n };\n });\n }, [count, colors, minSize, maxSize, speed, direction, width, height]);\n\n const renderParticle = (p: ParticleConfig, index: number) => {\n const x = (p.x + p.speedX * frame) % width;\n const y = (p.y + p.speedY * frame) % height;\n const adjustedX = x < 0 ? x + width : x;\n const adjustedY = y < 0 ? y + height : y;\n\n const opacity = fadeOut\n ? p.opacity * (1 - Math.abs(frame % 120 - 60) / 60)\n : p.opacity;\n\n const rotation = p.rotation + p.rotationSpeed * frame;\n\n const shapeStyle: React.CSSProperties = {\n position: 'absolute',\n left: adjustedX,\n top: adjustedY,\n width: p.size,\n height: p.size,\n backgroundColor: particleShape === 'circle' ? p.color : undefined,\n borderRadius: particleShape === 'circle' ? '50%' : particleShape === 'triangle' ? 0 : 2,\n opacity: Math.max(0.1, Math.min(1, opacity)),\n transform: `translate(-50%, -50%) rotate(${rotation}deg)`,\n boxShadow: `0 0 ${p.size}px ${p.color}`,\n };\n\n if (particleShape === 'star') {\n return (\n \n );\n }\n\n if (particleShape === 'triangle') {\n return (\n \n );\n }\n\n return ;\n };\n\n return (\n \n {particles.map(renderParticle)}\n
\n );\n};\n\n// ============================================\n// TEXT ANIMATION EFFECTS\n// ============================================\n\n// LetterByLetter - Animate text letter by letter\ninterface LetterByLetterProps {\n text: string;\n durationInFrames?: number;\n startFrame?: number;\n delayPerLetter?: number;\n animation?: 'fade' | 'scale' | 'slide' | 'rotate' | 'bounce';\n easing?: (t: number) => number;\n style?: React.CSSProperties;\n letterStyle?: React.CSSProperties;\n}\n\nexport const LetterByLetter: React.FC = ({\n text,\n durationInFrames = 60,\n startFrame = 0,\n delayPerLetter = 2,\n animation = 'fade',\n easing = Easing.easeOutCubic,\n style,\n letterStyle,\n}) => {\n const frame = useCurrentFrame();\n\n return (\n \n {text.split('').map((char, index) => {\n const letterStart = startFrame + index * delayPerLetter;\n const progress = interpolate(\n frame,\n [letterStart, letterStart + durationInFrames / text.length],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing }\n );\n\n let transform = '';\n let opacity = progress;\n\n switch (animation) {\n case 'scale':\n transform = `scale(${progress})`;\n break;\n case 'slide':\n transform = `translateY(${(1 - progress) * 30}px)`;\n break;\n case 'rotate':\n transform = `rotate(${(1 - progress) * 90}deg)`;\n break;\n case 'bounce':\n const bounce = progress < 0.5 ? progress * 2 : 2 - progress * 2;\n transform = `scale(${0.5 + bounce * 0.5})`;\n break;\n }\n\n return (\n \n {char === ' ' ? '\\u00A0' : char}\n \n );\n })}\n
\n );\n};\n\n// WordByWord - Animate text word by word\ninterface WordByWordProps {\n text: string;\n durationInFrames?: number;\n startFrame?: number;\n delayPerWord?: number;\n animation?: 'fade' | 'scale' | 'slide' | 'pop';\n style?: React.CSSProperties;\n wordStyle?: React.CSSProperties;\n}\n\nexport const WordByWord: React.FC = ({\n text,\n durationInFrames = 60,\n startFrame = 0,\n delayPerWord = 10,\n animation = 'fade',\n style,\n wordStyle,\n}) => {\n const frame = useCurrentFrame();\n const words = text.split(' ');\n\n return (\n \n {words.map((word, index) => {\n const wordStart = startFrame + index * delayPerWord;\n const progress = interpolate(\n frame,\n [wordStart, wordStart + 15],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.easeOutBack }\n );\n\n let transform = '';\n\n switch (animation) {\n case 'scale':\n transform = `scale(${progress})`;\n break;\n case 'slide':\n transform = `translateY(${(1 - progress) * 20}px)`;\n break;\n case 'pop':\n const popScale = 1 + (1 - progress) * 0.3;\n transform = `scale(${progress < 0.5 ? progress * 2 * popScale : popScale - (progress - 0.5) * 2 * (popScale - 1)})`;\n break;\n }\n\n return (\n \n {word}\n \n );\n })}\n
\n );\n};\n\n// WaveText - Wave animation on text\ninterface WaveTextProps {\n text: string;\n amplitude?: number;\n frequency?: number;\n speed?: number;\n style?: React.CSSProperties;\n letterStyle?: React.CSSProperties;\n}\n\nexport const WaveText: React.FC = ({\n text,\n amplitude = 10,\n frequency = 0.3,\n speed = 0.15,\n style,\n letterStyle,\n}) => {\n const frame = useCurrentFrame();\n\n return (\n \n {text.split('').map((char, index) => {\n const offset = Math.sin(frame * speed + index * frequency) * amplitude;\n\n return (\n \n {char === ' ' ? '\\u00A0' : char}\n \n );\n })}\n
\n );\n};\n\n// RainbowText - Rainbow color cycling text\ninterface RainbowTextProps {\n text: string;\n speed?: number;\n saturation?: number;\n lightness?: number;\n style?: React.CSSProperties;\n letterStyle?: React.CSSProperties;\n}\n\nexport const RainbowText: React.FC = ({\n text,\n speed = 5,\n saturation = 70,\n lightness = 60,\n style,\n letterStyle,\n}) => {\n const frame = useCurrentFrame();\n\n return (\n \n {text.split('').map((char, index) => {\n const hue = (frame * speed + index * 20) % 360;\n const color = `hsl(${hue}, ${saturation}%, ${lightness}%)`;\n\n return (\n \n {char === ' ' ? '\\u00A0' : char}\n \n );\n })}\n
\n );\n};\n\n// GradientText - Animated gradient text\ninterface GradientTextProps {\n text: string;\n colors?: string[];\n speed?: number;\n angle?: number;\n style?: React.CSSProperties;\n}\n\nexport const GradientText: React.FC = ({\n text,\n colors = ['#10b981', '#34d399', '#6ee7b7', '#14b8a6', '#10b981'],\n speed = 2,\n angle = 90,\n style,\n}) => {\n const frame = useCurrentFrame();\n const offset = (frame * speed) % 100;\n\n const gradientStops = colors\n .map((color, i) => {\n const position = (i * 100 / (colors.length - 1) + offset) % 100;\n return `${color} ${position}%`;\n })\n .join(', ');\n\n return (\n \n {text}\n \n );\n};\n\n// Blur - Blur effect animation\ninterface BlurProps {\n children: React.ReactNode;\n from?: number;\n to?: number;\n durationInFrames?: number;\n startFrame?: number;\n style?: React.CSSProperties;\n}\n\nexport const Blur: React.FC = ({\n children,\n from = 20,\n to = 0,\n durationInFrames = 30,\n startFrame = 0,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const blur = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [from, to],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }\n );\n\n return (\n \n {children}\n
\n );\n};\n\n// Bounce - Bounce animation effect\ninterface BounceProps {\n children: React.ReactNode;\n height?: number;\n durationInFrames?: number;\n startFrame?: number;\n times?: number;\n damping?: number;\n style?: React.CSSProperties;\n}\n\nexport const Bounce: React.FC = ({\n children,\n height = 50,\n durationInFrames = 60,\n startFrame = 0,\n times = 3,\n damping = 0.7,\n style,\n}) => {\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n\n const progress = interpolate(\n frame,\n [startFrame, startFrame + durationInFrames],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }\n );\n\n // Bounce formula with damping\n const bounceCount = times;\n const t = progress * bounceCount * Math.PI;\n const amplitude = height * Math.pow(damping, progress * bounceCount);\n const y = Math.abs(Math.sin(t)) * amplitude * (1 - progress);\n\n return (\n \n {children}\n
\n );\n};\n\n// Pulse - Pulse/scale breathing effect\ninterface PulseProps {\n children: React.ReactNode;\n minScale?: number;\n maxScale?: number;\n speed?: number;\n style?: React.CSSProperties;\n}\n\nexport const Pulse: React.FC = ({\n children,\n minScale = 0.95,\n maxScale = 1.05,\n speed = 0.1,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const scale = minScale + (maxScale - minScale) * (0.5 + Math.sin(frame * speed) * 0.5);\n\n return (\n \n {children}\n
\n );\n};\n\n// Swing - Swing/pendulum effect\ninterface SwingProps {\n children: React.ReactNode;\n angle?: number;\n speed?: number;\n damping?: number;\n durationInFrames?: number;\n style?: React.CSSProperties;\n}\n\nexport const Swing: React.FC = ({\n children,\n angle = 30,\n speed = 0.15,\n damping = 0.995,\n durationInFrames = 120,\n style,\n}) => {\n const frame = useCurrentFrame();\n\n const dampFactor = Math.pow(damping, frame);\n const rotation = Math.sin(frame * speed) * angle * dampFactor;\n\n return (\n \n {children}\n
\n );\n};\n\n// Confetti - Falling confetti particles\ninterface ConfettiProps {\n count?: number;\n colors?: string[];\n style?: React.CSSProperties;\n}\n\nexport const Confetti: React.FC = ({\n count = 100,\n colors = ['#10b981', '#f59e0b', '#ef4444', '#3b82f6', '#8b5cf6', '#ec4899'],\n style,\n}) => {\n const frame = useCurrentFrame();\n const { width, height } = useVideoConfig();\n\n const confettiPieces = React.useMemo(() => {\n const seed = (n: number) => {\n const x = Math.sin(n * 9999) * 10000;\n return x - Math.floor(x);\n };\n\n return Array.from({ length: count }, (_, i) => ({\n x: seed(i) * width,\n startY: -50 - seed(i + 100) * 200,\n speed: 2 + seed(i + 200) * 4,\n rotation: seed(i + 300) * 360,\n rotationSpeed: (seed(i + 400) - 0.5) * 20,\n size: 8 + seed(i + 500) * 8,\n color: colors[Math.floor(seed(i + 600) * colors.length)],\n wobble: seed(i + 700) * Math.PI * 2,\n wobbleSpeed: 0.02 + seed(i + 800) * 0.05,\n }));\n }, [count, colors, width]);\n\n return (\n \n {confettiPieces.map((piece, i) => {\n const y = piece.startY + piece.speed * frame;\n const x = piece.x + Math.sin(frame * piece.wobbleSpeed + piece.wobble) * 30;\n const rotation = piece.rotation + piece.rotationSpeed * frame;\n\n if (y > height + 50) return null;\n\n return (\n
\n );\n })}\n
\n );\n};\n","// Transition effects for Remotion-like framework\n\nimport { EasingFunction } from '../core/types';\nimport { Easing } from './animation';\n\nexport interface TransitionConfig {\n durationInFrames: number;\n easing?: EasingFunction;\n startFrame?: number;\n}\n\n// Fade transition\nexport const fade = (progress: number): number => {\n return progress;\n};\n\n// Slide transition\nexport const slide = (\n progress: number,\n direction: 'left' | 'right' | 'up' | 'down' = 'right'\n): { x: number; y: number } => {\n const eased = progress;\n const offset = (1 - eased) * 100;\n\n switch (direction) {\n case 'left':\n return { x: -offset, y: 0 };\n case 'right':\n return { x: offset, y: 0 };\n case 'up':\n return { x: 0, y: -offset };\n case 'down':\n return { x: 0, y: offset };\n }\n};\n\n// Scale transition\nexport const scale = (progress: number, from: number = 0, to: number = 1): number => {\n return from + (to - from) * progress;\n};\n\n// Rotate transition\nexport const rotate = (progress: number, degrees: number = 360): number => {\n return degrees * progress;\n};\n\n// Zoom transition (scale + fade)\nexport const zoom = (progress: number): { scale: number; opacity: number } => {\n return {\n scale: 0.5 + progress * 0.5,\n opacity: progress,\n };\n};\n\n// Wipe transition\nexport const wipe = (\n progress: number,\n direction: 'left' | 'right' | 'up' | 'down' = 'right'\n): { clipPath: string } => {\n const pct = progress * 100;\n\n switch (direction) {\n case 'left':\n return { clipPath: `inset(0 ${100 - pct}% 0 0)` };\n case 'right':\n return { clipPath: `inset(0 0 0 ${100 - pct}%)` };\n case 'up':\n return { clipPath: `inset(0 0 ${100 - pct}% 0)` };\n case 'down':\n return { clipPath: `inset(${100 - pct}% 0 0 0)` };\n }\n};\n\n// Blur transition\nexport const blur = (progress: number, maxBlur: number = 20): { filter: string; opacity: number } => {\n return {\n filter: `blur(${maxBlur * (1 - progress)}px)`,\n opacity: progress,\n };\n};\n\n// Glitch effect\nexport const glitch = (frame: number, intensity: number = 10): { transform: string } => {\n const offset = Math.sin(frame * 0.5) * intensity;\n return {\n transform: `translate(${offset}px, ${offset * 0.5}px)`,\n };\n};\n\n// Shake effect\nexport const shake = (frame: number, intensity: number = 5): { transform: string } => {\n const x = Math.sin(frame * 0.8) * intensity;\n const y = Math.cos(frame * 1.2) * intensity;\n return {\n transform: `translate(${x}px, ${y}px)`,\n };\n};\n\n// Pulse effect\nexport const pulse = (frame: number, minScale: number = 0.95, maxScale: number = 1.05): { transform: string } => {\n const scale = minScale + (Math.sin(frame * 0.1) + 1) / 2 * (maxScale - minScale);\n return {\n transform: `scale(${scale})`,\n };\n};\n\n// Bounce effect\nexport const bounce = (progress: number): number => {\n // Elastic bounce easing\n const c4 = (2 * Math.PI) / 3;\n return progress === 0\n ? 0\n : progress === 1\n ? 1\n : Math.pow(2, -10 * progress) * Math.sin((progress * 10 - 0.75) * c4) + 1;\n};\n\n// Flash effect\nexport const flash = (\n progress: number,\n flashAt: number = 0.5\n): { opacity: number; backgroundColor: string } => {\n const flashProgress = progress < flashAt\n ? progress / flashAt\n : (1 - progress) / (1 - flashAt);\n\n return {\n opacity: progress < flashAt ? 1 - flashProgress * 0.5 : 1,\n backgroundColor: progress < flashAt ? `rgba(255,255,255,${flashProgress * 0.3})` : 'transparent',\n };\n};\n\n// Slide with fade\nexport const slideWithFade = (\n progress: number,\n direction: 'left' | 'right' | 'up' | 'down' = 'right'\n): { transform: string; opacity: number } => {\n const { x, y } = slide(progress, direction);\n return {\n transform: `translate(${x}%, ${y}%)`,\n opacity: progress,\n };\n};\n\n// Flip transition\nexport const flip = (\n progress: number,\n direction: 'horizontal' | 'vertical' = 'horizontal'\n): { transform: string; opacity: number } => {\n const rotateValue = (1 - progress) * 90;\n const opacity = progress < 0.5 ? 1 - progress : progress;\n\n return {\n transform: direction === 'horizontal'\n ? `rotateY(${rotateValue}deg)`\n : `rotateX(${rotateValue}deg)`,\n opacity,\n };\n};\n\n// Combine multiple transitions\nexport const combine = (\n progress: number,\n ...transitions: ((p: number) => Record)[]\n): Record => {\n return transitions.reduce((acc, transition) => ({\n ...acc,\n ...transition(progress),\n }), {});\n};\n\n// Preset transitions\nexport const transitions = {\n fade: {\n enter: (p: number) => ({ opacity: fade(p) }),\n exit: (p: number) => ({ opacity: fade(1 - p) }),\n },\n slideRight: {\n enter: (p: number) => ({ transform: `translateX(${100 - p * 100}%)` }),\n exit: (p: number) => ({ transform: `translateX(${p * -100}%)` }),\n },\n slideLeft: {\n enter: (p: number) => ({ transform: `translateX(${-100 + p * 100}%)` }),\n exit: (p: number) => ({ transform: `translateX(${p * 100}%)` }),\n },\n slideUp: {\n enter: (p: number) => ({ transform: `translateY(${100 - p * 100}%)` }),\n exit: (p: number) => ({ transform: `translateY(${p * -100}%)` }),\n },\n slideDown: {\n enter: (p: number) => ({ transform: `translateY(${-100 + p * 100}%)` }),\n exit: (p: number) => ({ transform: `translateY(${p * 100}%)` }),\n },\n scale: {\n enter: (p: number) => ({ transform: `scale(${scale(p, 0, 1)})` }),\n exit: (p: number) => ({ transform: `scale(${scale(1 - p, 1, 0)})` }),\n },\n zoom: {\n enter: (p: number) => {\n const { scale: s, opacity } = zoom(p);\n return { transform: `scale(${s})`, opacity };\n },\n exit: (p: number) => {\n const { scale: s, opacity } = zoom(1 - p);\n return { transform: `scale(${s})`, opacity };\n },\n },\n flipX: {\n enter: (p: number) => flip(p, 'vertical'),\n exit: (p: number) => flip(1 - p, 'vertical'),\n },\n flipY: {\n enter: (p: number) => flip(p, 'horizontal'),\n exit: (p: number) => flip(1 - p, 'horizontal'),\n },\n};\n\nexport type TransitionName = keyof typeof transitions;\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useCurrentFrame, useVideoConfig } from '../core/context';\nimport { spring, interpolate, Easing, measureSpring } from '../utils/animation';\n\n// Re-export animation utilities\nexport { spring, interpolate, Easing, measureSpring };\n\n// Use Spring Hook\ninterface UseSpringOptions {\n fps?: number;\n frame?: number;\n config?: {\n damping?: number;\n mass?: number;\n stiffness?: number;\n overshootClamping?: boolean;\n };\n from?: number;\n to?: number;\n durationInFrames?: number;\n}\n\nexport const useSpring = (options: UseSpringOptions = {}) => {\n const currentFrame = useCurrentFrame();\n const { fps: videoFps } = useVideoConfig();\n \n const {\n fps = videoFps,\n frame = currentFrame,\n config = {},\n from = 0,\n to = 1,\n durationInFrames,\n } = options;\n \n return spring({\n frame,\n fps,\n config,\n from,\n to,\n durationInFrames,\n });\n};\n\n// Use Interpolate Hook\nexport const useInterpolate = (\n inputRange: number[],\n outputRange: number[],\n options?: {\n extrapolateLeft?: 'clamp' | 'extend' | 'identity';\n extrapolateRight?: 'clamp' | 'extend' | 'identity';\n easing?: (t: number) => number;\n }\n) => {\n const frame = useCurrentFrame();\n return interpolate(frame, inputRange, outputRange, options);\n};\n\n// Use Cycle Hook - cycles through an array of values\nexport const useCycle = (items: T[], frame: number, durationPerItem: number): T => {\n const index = Math.floor(frame / durationPerItem) % items.length;\n return items[index];\n};\n\n// Use Duration Helper\nexport const useDurationInFrames = (seconds: number): number => {\n const { fps } = useVideoConfig();\n return Math.round(seconds * fps);\n};\n\n// Use Delay - delays animation start\nexport const useDelay = (delayInFrames: number): boolean => {\n const frame = useCurrentFrame();\n return frame >= delayInFrames;\n};\n\n// Use Progress - returns 0-1 progress through video\nexport const useProgress = (): number => {\n const frame = useCurrentFrame();\n const { durationInFrames } = useVideoConfig();\n return frame / (durationInFrames - 1);\n};\n\n// Use Loop - loops animation\nexport const useLoop = (loopDuration: number): number => {\n const frame = useCurrentFrame();\n return frame % loopDuration;\n};\n\n// Use Timeline - get timeline info\nexport const useTimeline = () => {\n const frame = useCurrentFrame();\n const { durationInFrames, fps } = useVideoConfig();\n \n return {\n frame,\n durationInFrames,\n fps,\n progress: frame / (durationInFrames - 1),\n timeInSeconds: frame / fps,\n durationInSeconds: durationInFrames / fps,\n remainingFrames: durationInFrames - frame - 1,\n remainingTimeInSeconds: (durationInFrames - frame - 1) / fps,\n };\n};\n\n// Use Windowed Frame - only renders when frame is in window\nexport const useWindowedFrame = (\n startFrame: number,\n endFrame: number\n): { isInWindow: boolean; relativeFrame: number } => {\n const frame = useCurrentFrame();\n const isInWindow = frame >= startFrame && frame < endFrame;\n const relativeFrame = frame - startFrame;\n \n return { isInWindow, relativeFrame: isInWindow ? relativeFrame : 0 };\n};\n\n// Use Animation - tracks animation state\ninterface AnimationState {\n isAnimating: boolean;\n isComplete: boolean;\n progress: number;\n direction: 'forward' | 'backward' | 'none';\n}\n\nexport const useAnimation = (\n startFrame: number,\n endFrame: number\n): AnimationState => {\n const frame = useCurrentFrame();\n const isAnimating = frame >= startFrame && frame < endFrame;\n const isComplete = frame >= endFrame;\n const progress = isAnimating \n ? (frame - startFrame) / (endFrame - startFrame)\n : isComplete ? 1 : 0;\n \n return {\n isAnimating,\n isComplete,\n progress,\n direction: frame < startFrame ? 'forward' : frame >= endFrame ? 'none' : 'forward',\n };\n};\n\n// Use Keyframe State - manages keyframe-based animations\ninterface KeyframeState {\n current: T;\n previous: T | null;\n next: T | null;\n progress: number;\n}\n\nexport const useKeyframeState = (\n keyframes: { frame: number; value: T }[]\n): KeyframeState => {\n const frame = useCurrentFrame();\n \n const sorted = [...keyframes].sort((a, b) => a.frame - b.frame);\n \n let prev = sorted[0];\n let next = sorted[sorted.length - 1];\n \n for (let i = 0; i < sorted.length - 1; i++) {\n if (frame >= sorted[i].frame && frame <= sorted[i + 1].frame) {\n prev = sorted[i];\n next = sorted[i + 1];\n break;\n }\n }\n \n const progress = frame <= prev.frame ? 0 : frame >= next.frame ? 1 : \n (frame - prev.frame) / (next.frame - prev.frame);\n \n return {\n current: prev.value + progress * (next.value - prev.value) as T,\n previous: prev !== sorted[0] ? prev.value : null,\n next: next !== sorted[sorted.length - 1] ? next.value : null,\n progress,\n };\n};\n\n// Use Transform - apply transforms based on frame\ninterface TransformOptions {\n translateX?: (frame: number) => number;\n translateY?: (frame: number) => number;\n scale?: (frame: number) => number;\n rotate?: (frame: number) => number;\n opacity?: (frame: number) => number;\n}\n\nexport const useTransform = (options: TransformOptions): React.CSSProperties => {\n const frame = useCurrentFrame();\n \n const transforms: string[] = [];\n \n if (options.translateX) {\n transforms.push(`translateX(${options.translateX(frame)}px)`);\n }\n if (options.translateY) {\n transforms.push(`translateY(${options.translateY(frame)}px)`);\n }\n if (options.scale) {\n transforms.push(`scale(${options.scale(frame)})`);\n }\n if (options.rotate) {\n transforms.push(`rotate(${options.rotate(frame)}deg)`);\n }\n \n const style: React.CSSProperties = {};\n \n if (transforms.length > 0) {\n style.transform = transforms.join(' ');\n }\n if (options.opacity) {\n style.opacity = options.opacity(frame);\n }\n \n return style;\n};\n\n// Use Fade - simple fade in/out\nexport const useFade = (\n fadeInDuration: number,\n fadeOutDuration: number,\n options?: { startFrame?: number; endFrame?: number }\n): number => {\n const frame = useCurrentFrame();\n const { durationInFrames } = useVideoConfig();\n \n const startFrame = options?.startFrame ?? 0;\n const endFrame = options?.endFrame ?? durationInFrames;\n \n // Fade in\n if (frame < startFrame + fadeInDuration) {\n return interpolate(\n frame,\n [startFrame, startFrame + fadeInDuration],\n [0, 1],\n { extrapolateRight: 'clamp' }\n );\n }\n \n // Fade out\n if (frame > endFrame - fadeOutDuration) {\n return interpolate(\n frame,\n [endFrame - fadeOutDuration, endFrame],\n [1, 0],\n { extrapolateLeft: 'clamp' }\n );\n }\n \n return 1;\n};\n\n// Use Slide - simple slide animation\nexport const useSlide = (\n direction: 'left' | 'right' | 'up' | 'down',\n distance: number,\n duration: number,\n startFrame: number = 0\n): { transform: string } => {\n const frame = useCurrentFrame();\n \n const progress = interpolate(\n frame,\n [startFrame, startFrame + duration],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }\n );\n \n const easedProgress = Easing.easeOutCubic(progress);\n \n let transform = '';\n const offset = distance * (1 - easedProgress);\n \n switch (direction) {\n case 'left':\n transform = `translateX(${-offset}px)`;\n break;\n case 'right':\n transform = `translateX(${offset}px)`;\n break;\n case 'up':\n transform = `translateY(${-offset}px)`;\n break;\n case 'down':\n transform = `translateY(${offset}px)`;\n break;\n }\n \n return { transform };\n};\n\n// Use Shake - shake animation\nexport const useShake = (\n intensity: number,\n duration: number,\n startFrame: number = 0\n): { transform: string } => {\n const frame = useCurrentFrame();\n \n const progress = interpolate(\n frame,\n [startFrame, startFrame + duration],\n [0, 1],\n { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }\n );\n \n const currentIntensity = intensity * (1 - progress);\n const shakeX = Math.sin(frame * 0.5) * currentIntensity;\n const shakeY = Math.cos(frame * 0.7) * currentIntensity;\n \n return { transform: `translate(${shakeX}px, ${shakeY}px)` };\n};\n\n// Use Pulse - pulsing animation\nexport const usePulse = (\n minScale: number,\n maxScale: number,\n frequency: number\n): { transform: string } => {\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n \n const progress = (Math.sin((frame / fps) * frequency * Math.PI * 2) + 1) / 2;\n const scale = interpolate(progress, [0, 1], [minScale, maxScale]);\n \n return { transform: `scale(${scale})` };\n};\n","// Frame Cache System - LRU cache for rendered frames\n\n/**\n * Frame Cache Entry\n */\ninterface CacheEntry {\n data: T;\n timestamp: number;\n accessCount: number;\n size: number;\n}\n\n/**\n * Cache Statistics\n */\nexport interface CacheStats {\n hits: number;\n misses: number;\n size: number;\n entries: number;\n hitRate: number;\n}\n\n/**\n * LRU Cache with TTL support for frame caching\n */\nexport class FrameCache {\n private cache: Map> = new Map();\n private maxSize: number;\n private maxAge: number;\n private stats = { hits: 0, misses: 0 };\n\n constructor(options: { maxSize?: number; maxAge?: number } = {}) {\n this.maxSize = options.maxSize ?? 100 * 1024 * 1024; // 100MB default\n this.maxAge = options.maxAge ?? 5 * 60 * 1000; // 5 minutes default\n }\n\n /**\n * Generate cache key for a frame\n */\n static createKey(\n compositionId: string,\n frame: number,\n width: number,\n height: number\n ): string {\n return `${compositionId}:${frame}:${width}x${height}`;\n }\n\n /**\n * Get a cached frame\n */\n get(key: string): T | null {\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.stats.misses++;\n return null;\n }\n\n // Check if entry has expired\n if (Date.now() - entry.timestamp > this.maxAge) {\n this.cache.delete(key);\n this.stats.misses++;\n return null;\n }\n\n // Update access count and move to end (LRU)\n entry.accessCount++;\n this.cache.delete(key);\n this.cache.set(key, entry);\n this.stats.hits++;\n\n return entry.data;\n }\n\n /**\n * Set a cached frame\n */\n set(key: string, data: T, size?: number): void {\n // Estimate size if not provided\n const entrySize = size ?? this.estimateSize(data);\n\n // Evict entries if we would exceed max size\n this.evictIfNeeded(entrySize);\n\n this.cache.set(key, {\n data,\n timestamp: Date.now(),\n accessCount: 1,\n size: entrySize,\n });\n }\n\n /**\n * Check if key exists and is valid\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n if (Date.now() - entry.timestamp > this.maxAge) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete a cached frame\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached frames\n */\n clear(): void {\n this.cache.clear();\n this.stats = { hits: 0, misses: 0 };\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n let totalSize = 0;\n for (const entry of this.cache.values()) {\n totalSize += entry.size;\n }\n\n const totalRequests = this.stats.hits + this.stats.misses;\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n size: totalSize,\n entries: this.cache.size,\n hitRate: totalRequests > 0 ? this.stats.hits / totalRequests : 0,\n };\n }\n\n /**\n * Get current cache size in bytes\n */\n getSize(): number {\n let size = 0;\n for (const entry of this.cache.values()) {\n size += entry.size;\n }\n return size;\n }\n\n /**\n * Evict entries until we have enough space\n */\n private evictIfNeeded(neededSize: number): void {\n while (this.getSize() + neededSize > this.maxSize && this.cache.size > 0) {\n // Remove oldest entry (first in Map)\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n } else {\n break;\n }\n }\n }\n\n /**\n * Estimate size of data\n */\n private estimateSize(data: T): number {\n if (data instanceof ImageData) {\n return data.data.length;\n }\n if (typeof data === 'string') {\n return data.length * 2; // UTF-16\n }\n if (data instanceof ArrayBuffer) {\n return data.byteLength;\n }\n // Default estimate\n return 1024;\n }\n}\n\n/**\n * Singleton frame cache instance\n */\nexport const frameCache = new FrameCache({\n maxSize: 200 * 1024 * 1024, // 200MB\n maxAge: 10 * 60 * 1000, // 10 minutes\n});\n\n/**\n * Memoization cache for computed values\n */\nexport class MemoCache {\n private static instance: MemoCache;\n private cache: Map = new Map();\n\n static getInstance(): MemoCache {\n if (!MemoCache.instance) {\n MemoCache.instance = new MemoCache();\n }\n return MemoCache.instance;\n }\n\n /**\n * Get or compute a memoized value\n */\n getOrCompute(key: string, compute: () => T, deps: unknown[] = []): T {\n const cached = this.cache.get(key);\n\n if (cached && this.depsEqual(cached.deps, deps)) {\n return cached.value as T;\n }\n\n const value = compute();\n this.cache.set(key, { value, deps });\n return value;\n }\n\n /**\n * Check if dependencies are equal\n */\n private depsEqual(a: unknown[], b: unknown[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((val, i) => Object.is(val, b[i]));\n }\n\n /**\n * Clear all memoized values\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\n/**\n * Debounced function cache\n */\nexport function createDebouncedCache unknown>(\n fn: T,\n delay: number\n): T {\n let timeoutId: ReturnType | null = null;\n let lastArgs: unknown[] = [];\n\n return ((...args: unknown[]) => {\n lastArgs = args;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...lastArgs);\n timeoutId = null;\n }, delay);\n }) as T;\n}\n\n/**\n * Throttled function cache\n */\nexport function createThrottledCache unknown>(\n fn: T,\n limit: number\n): T {\n let inThrottle = false;\n\n return ((...args: unknown[]) => {\n if (!inThrottle) {\n fn(...args);\n inThrottle = true;\n setTimeout(() => {\n inThrottle = false;\n }, limit);\n }\n }) as T;\n}\n\nexport default FrameCache;\n","// Optimized Hooks for Frame Rendering and Memoization\n// These hooks are designed to work within React's strict rules\n\nimport { useMemo, useCallback } from 'react';\nimport { useCurrentFrame, useVideoConfig } from '../core/context';\nimport { MemoCache } from '../renderer/cache';\nimport { spring, interpolate } from '../utils/animation';\n\n/**\n * Memoized frame value hook\n * Caches computed values based on frame and dependencies\n */\nexport function useMemoizedFrame(\n compute: () => T,\n deps: unknown[] = []\n): T {\n const frame = useCurrentFrame();\n const memoCache = useMemo(() => MemoCache.getInstance(), []);\n \n const key = useMemo(() => `frame:${frame}:${JSON.stringify(deps)}`, [frame, deps]);\n \n return useMemo(() => {\n return memoCache.getOrCompute(key, compute, [frame, ...deps]);\n }, [key, compute, memoCache, frame, deps]);\n}\n\n/**\n * Memoized animation value hook\n * Only recomputes when frame changes\n */\nexport function useAnimationValue(\n compute: (frame: number) => T,\n _frameDeps?: number[]\n): T {\n const frame = useCurrentFrame();\n \n // Simply recompute each frame - React's useMemo will handle deduplication\n return useMemo(() => compute(frame), [frame, compute]);\n}\n\n/**\n * Cached frame hook - simplified version\n */\nexport function useCachedFrame(\n compositionId: string,\n renderer: (frame: number) => T\n): T {\n const frame = useCurrentFrame();\n const { width, height } = useVideoConfig();\n \n return useMemo(() => {\n return renderer(frame);\n }, [compositionId, frame, width, height, renderer]);\n}\n\n/**\n * Throttled frame update hook - returns frame directly\n * Throttling is handled by the player\n */\nexport function useThrottledFrame(_throttleMs?: number): number {\n return useCurrentFrame();\n}\n\n/**\n * Batch frame processing hook - simplified\n */\nexport function useBatchFrameProcessor(\n processor: (items: T[]) => R[],\n _batchSize?: number\n): (items: T[]) => R[] {\n return useCallback((items: T[]) => {\n return processor(items);\n }, [processor]);\n}\n\n/**\n * Frame range hook for efficient range queries\n */\nexport function useFrameRange(\n startFrame: number,\n endFrame: number\n): number[] {\n return useMemo(() => {\n const frames: number[] = [];\n for (let i = startFrame; i <= endFrame; i++) {\n frames.push(i);\n }\n return frames;\n }, [startFrame, endFrame]);\n}\n\n/**\n * Pre-compute frames hook - returns pre-computed values\n */\nexport function usePrecomputeFrames(\n compute: (frame: number) => T,\n lookahead: number = 10\n): Map {\n const frame = useCurrentFrame();\n const { durationInFrames } = useVideoConfig();\n \n return useMemo(() => {\n const cache = new Map();\n for (let i = frame; i < Math.min(frame + lookahead, durationInFrames); i++) {\n cache.set(i, compute(i));\n }\n return cache;\n }, [frame, lookahead, durationInFrames, compute]);\n}\n\n/**\n * Optimized spring hook with caching\n */\nexport function useOptimizedSpring(\n config: { damping?: number; stiffness?: number; mass?: number },\n from: number = 0,\n to: number = 1\n): number {\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n \n return useMemo(() => {\n return spring({ frame, fps, config, from, to });\n }, [frame, fps, config, from, to]);\n}\n\n/**\n * Optimized interpolate hook with caching\n */\nexport function useOptimizedInterpolate(\n inputRange: number[],\n outputRange: number[],\n options?: { easing?: (t: number) => number; extrapolateLeft?: 'clamp' | 'extend' | 'identity'; extrapolateRight?: 'clamp' | 'extend' | 'identity' }\n): (frame: number) => number {\n return useCallback((frame: number) => {\n return interpolate(frame, inputRange, outputRange, options);\n }, [inputRange, outputRange, options]);\n}\n\n/**\n * Performance monitoring hook\n * Returns static metrics - actual monitoring should use external tools\n */\nexport function usePerformanceMonitor(): {\n fps: number;\n frameTime: number;\n renderTime: number;\n} {\n // Return default values - real monitoring requires external setup\n return useMemo(() => ({\n fps: 60,\n frameTime: 16.67,\n renderTime: 0,\n }), []);\n}\n\n/**\n * Render priority hook\n * Returns render priority based on configuration\n */\nexport function useRenderPriority(): 'high' | 'medium' | 'low' {\n return useMemo(() => 'high', []);\n}\n\n// Default export for module\nconst performanceHooks = {\n useMemoizedFrame,\n useAnimationValue,\n useCachedFrame,\n useThrottledFrame,\n useBatchFrameProcessor,\n useFrameRange,\n usePrecomputeFrames,\n useOptimizedSpring,\n useOptimizedInterpolate,\n usePerformanceMonitor,\n useRenderPriority,\n};\n\nexport default performanceHooks;\n","// Video Renderer - Complete rendering system with caching and optimization\n\n// Core types\nexport type { VideoConfig, VideoRendererConfig } from '../core/types';\n\n// Cache system\nexport {\n FrameCache,\n MemoCache,\n frameCache,\n createDebouncedCache,\n createThrottledCache,\n} from './cache';\nexport type { CacheStats } from './cache';\n\n// Export system\nexport {\n CanvasRenderer,\n WebMEncoder,\n WebCodecsEncoder,\n FrameSequenceEncoder,\n VideoExportManager,\n videoExportManager,\n calculateProgress,\n estimateFileSize,\n checkEncodingSupport,\n} from './export';\nexport type {\n RenderProgress,\n ExportOptions,\n ExportResult,\n} from './export';\n\n// Original utilities\nimport { VideoConfig, VideoRendererConfig } from '../core/types';\n\nexport interface RenderOptions {\n compositionId: string;\n config: VideoConfig;\n outputDir: string;\n onProgress?: (progress: number) => void;\n onFrame?: (frame: number, imageData: string) => void;\n}\n\nexport interface RenderResult {\n success: boolean;\n outputUrl?: string;\n frameCount: number;\n duration: number;\n error?: string;\n}\n\n// Generate frames for video\nexport const generateFrames = async (\n component: React.ComponentType>,\n config: VideoConfig,\n options?: {\n startFrame?: number;\n endFrame?: number;\n onProgress?: (frame: number, total: number) => void;\n }\n): Promise => {\n const frames: string[] = [];\n const startFrame = options?.startFrame ?? 0;\n const endFrame = options?.endFrame ?? config.durationInFrames;\n \n for (let frame = startFrame; frame < endFrame; frame++) {\n if (options?.onProgress) {\n options.onProgress(frame - startFrame, endFrame - startFrame);\n }\n frames.push(`frame-${frame}`);\n }\n \n return frames;\n};\n\n// Render video configuration\nexport const renderVideo = async (\n options: RenderOptions & VideoRendererConfig\n): Promise => {\n const startTime = Date.now();\n \n try {\n const frames = await generateFrames(\n () => null,\n options.config,\n {\n onProgress: (frame, total) => {\n if (options.onProgress) {\n options.onProgress(frame / total);\n }\n },\n }\n );\n \n const duration = Date.now() - startTime;\n \n return {\n success: true,\n frameCount: frames.length,\n duration,\n outputUrl: `${options.outputDir}/output.mp4`,\n };\n } catch (error) {\n return {\n success: false,\n frameCount: 0,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n};\n\n// FFmpeg command builder\nexport const buildFFmpegCommand = (\n inputPattern: string,\n outputPath: string,\n config: VideoConfig,\n rendererConfig: VideoRendererConfig\n): string[] => {\n const args: string[] = [];\n \n args.push('-framerate', config.fps.toString());\n args.push('-i', inputPattern);\n \n switch (rendererConfig.format) {\n case 'mp4':\n args.push('-c:v', rendererConfig.codec === 'h265' ? 'libx265' : 'libx264');\n if (rendererConfig.crf) {\n args.push('-crf', rendererConfig.crf.toString());\n }\n args.push('-pix_fmt', rendererConfig.pixelFormat ?? 'yuv420p');\n break;\n case 'webm':\n args.push('-c:v', rendererConfig.codec === 'vp9' ? 'libvpx-vp9' : 'libvpx');\n args.push('-crf', (rendererConfig.crf ?? 30).toString());\n args.push('-b:v', '0');\n break;\n case 'gif':\n args.push('-filter_complex', `[0:v] fps=${Math.min(config.fps, 15)},split [a][b];[a] palettegen [p];[b][p] paletteuse`);\n break;\n }\n \n switch (rendererConfig.quality) {\n case 'low':\n args.push('-preset', 'ultrafast');\n break;\n case 'medium':\n args.push('-preset', 'medium');\n break;\n case 'high':\n args.push('-preset', 'slow');\n break;\n }\n \n args.push('-y', outputPath);\n \n return args;\n};\n\n// Frame to image data URL\nexport const frameToDataURL = (canvas: HTMLCanvasElement): string => {\n return canvas.toDataURL('image/png');\n};\n\n// Calculate video size\nexport const calculateVideoSize = (\n width: number,\n height: number,\n fps: number,\n durationInSeconds: number,\n bitrate: number = 5000000\n): number => {\n return Math.ceil((bitrate * durationInSeconds) / 8);\n};\n\n// Estimate render time\nexport const estimateRenderTime = (\n durationInFrames: number,\n complexity: 'low' | 'medium' | 'high' = 'medium'\n): number => {\n const baseTimePerFrame = {\n low: 10,\n medium: 50,\n high: 200,\n };\n \n return durationInFrames * baseTimePerFrame[complexity];\n};\n\n// Validate render config\nexport const validateRenderConfig = (config: VideoConfig): string[] => {\n const errors: string[] = [];\n \n if (config.width < 1 || config.width > 8192) {\n errors.push('Width must be between 1 and 8192 pixels');\n }\n \n if (config.height < 1 || config.height > 8192) {\n errors.push('Height must be between 1 and 8192 pixels');\n }\n \n if (config.fps < 1 || config.fps > 120) {\n errors.push('FPS must be between 1 and 120');\n }\n \n if (config.durationInFrames < 1) {\n errors.push('Duration must be at least 1 frame');\n }\n \n return errors;\n};\n\n// Render job manager\nexport class RenderJobManager {\n private jobs: Map = new Map();\n \n createJob(id: string, config: VideoConfig): void {\n this.jobs.set(id, {\n id,\n config,\n status: 'pending',\n progress: 0,\n startTime: null,\n endTime: null,\n });\n }\n \n startJob(id: string): void {\n const job = this.jobs.get(id);\n if (job) {\n job.status = 'processing';\n job.startTime = Date.now();\n }\n }\n \n updateProgress(id: string, progress: number): void {\n const job = this.jobs.get(id);\n if (job) {\n job.progress = progress;\n }\n }\n \n completeJob(id: string, outputUrl: string): void {\n const job = this.jobs.get(id);\n if (job) {\n job.status = 'completed';\n job.progress = 100;\n job.endTime = Date.now();\n job.outputUrl = outputUrl;\n }\n }\n \n failJob(id: string, error: string): void {\n const job = this.jobs.get(id);\n if (job) {\n job.status = 'failed';\n job.error = error;\n job.endTime = Date.now();\n }\n }\n \n getJob(id: string): RenderJobState | undefined {\n return this.jobs.get(id);\n }\n \n getActiveJobs(): RenderJobState[] {\n return Array.from(this.jobs.values()).filter(\n (job) => job.status === 'processing'\n );\n }\n}\n\ninterface RenderJobState {\n id: string;\n config: VideoConfig;\n status: 'pending' | 'processing' | 'completed' | 'failed';\n progress: number;\n startTime: number | null;\n endTime: number | null;\n outputUrl?: string;\n error?: string;\n}\n\n// Export singleton manager\nexport const renderJobManager = new RenderJobManager();\n\n// High-level API for rendering\nexport async function renderCompositionToVideo(\n setFrame: (frame: number) => void,\n element: HTMLElement,\n config: VideoConfig,\n options?: {\n onProgress?: (progress: number) => void;\n onComplete?: (blob: Blob) => void;\n }\n): Promise {\n const { VideoExportManager } = await import('./export');\n const manager = new VideoExportManager();\n \n const result = await manager.exportVideo(setFrame, element, {\n config,\n onProgress: options?.onProgress \n ? (p) => options.onProgress!(p.percentage)\n : undefined,\n });\n \n if (result.success && result.blob) {\n options?.onComplete?.(result.blob);\n return result.blob;\n }\n \n return null;\n}\n\n// Download video helper\nexport function downloadVideo(blob: Blob, filename: string = 'video.webm'): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n// Download frame as image\nexport function downloadFrame(imageData: ImageData, filename: string = 'frame.png'): void {\n const canvas = document.createElement('canvas');\n canvas.width = imageData.width;\n canvas.height = imageData.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.putImageData(imageData, 0, 0);\n canvas.toBlob((blob) => {\n if (blob) {\n downloadVideo(blob, filename);\n }\n }, 'image/png');\n }\n}\n","/**\n * MotionForge Icon Library\n * \n * A comprehensive collection of SVG icons for video creation.\n * Use these icons instead of emojis for professional results.\n * \n * Usage:\n * import { PlayIcon, PauseIcon } from 'motionforge/icons';\n * \n */\n\nimport React from 'react';\n\n// Base icon props\ninterface IconProps {\n size?: number;\n color?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ============================================================\n// Playback Control Icons\n// ============================================================\n\nexport const PlayIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const PauseIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const StopIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const SkipBackIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const SkipForwardIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const RewindIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const FastForwardIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ReplayIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ShuffleIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const RepeatIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// Volume Icons\n// ============================================================\n\nexport const VolumeHighIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const VolumeMediumIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const VolumeLowIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const VolumeMuteIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// Navigation Icons\n// ============================================================\n\nexport const ArrowLeftIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ArrowRightIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ArrowUpIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ArrowDownIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ChevronLeftIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ChevronRightIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ChevronUpIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ChevronDownIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// Action Icons\n// ============================================================\n\nexport const CheckIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const CloseIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const PlusIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const MinusIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const EditIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const DeleteIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const SaveIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const CopyIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const DownloadIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const UploadIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const RefreshIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// Media Icons\n// ============================================================\n\nexport const CameraIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const VideoIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ImageIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const MusicIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const MicIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// Social & Rating Icons\n// ============================================================\n\nexport const StarIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const StarOutlineIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const HeartIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const HeartOutlineIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ThumbUpIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ThumbDownIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ShareIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const CommentIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// UI Icons\n// ============================================================\n\nexport const SettingsIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const FullscreenIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const FullscreenExitIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const SearchIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const InfoIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const WarningIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const ErrorIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const SuccessIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const QuestionIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// Time Icons\n// ============================================================\n\nexport const ClockIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const TimerIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const CalendarIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// File & Folder Icons\n// ============================================================\n\nexport const FolderIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const FileIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const FilmIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// Animation Icons\n// ============================================================\n\nexport const SparkleIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const MagicWandIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const LightningIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const LayersIcon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\nexport const Loader2Icon: React.FC = ({ \n size = 24, \n color = 'currentColor',\n className,\n style \n}) => (\n \n);\n\n// ============================================================\n// Export all icons\n// ============================================================\n\nexport const Icons = {\n // Playback\n Play: PlayIcon,\n Pause: PauseIcon,\n Stop: StopIcon,\n SkipBack: SkipBackIcon,\n SkipForward: SkipForwardIcon,\n Rewind: RewindIcon,\n FastForward: FastForwardIcon,\n Replay: ReplayIcon,\n Shuffle: ShuffleIcon,\n Repeat: RepeatIcon,\n \n // Volume\n VolumeHigh: VolumeHighIcon,\n VolumeMedium: VolumeMediumIcon,\n VolumeLow: VolumeLowIcon,\n VolumeMute: VolumeMuteIcon,\n \n // Navigation\n ArrowLeft: ArrowLeftIcon,\n ArrowRight: ArrowRightIcon,\n ArrowUp: ArrowUpIcon,\n ArrowDown: ArrowDownIcon,\n ChevronLeft: ChevronLeftIcon,\n ChevronRight: ChevronRightIcon,\n ChevronUp: ChevronUpIcon,\n ChevronDown: ChevronDownIcon,\n \n // Actions\n Check: CheckIcon,\n Close: CloseIcon,\n Plus: PlusIcon,\n Minus: MinusIcon,\n Edit: EditIcon,\n Delete: DeleteIcon,\n Save: SaveIcon,\n Copy: CopyIcon,\n Download: DownloadIcon,\n Upload: UploadIcon,\n Refresh: RefreshIcon,\n \n // Media\n Camera: CameraIcon,\n Video: VideoIcon,\n Image: ImageIcon,\n Music: MusicIcon,\n Mic: MicIcon,\n \n // Social\n Star: StarIcon,\n StarOutline: StarOutlineIcon,\n Heart: HeartIcon,\n HeartOutline: HeartOutlineIcon,\n ThumbUp: ThumbUpIcon,\n ThumbDown: ThumbDownIcon,\n Share: ShareIcon,\n Comment: CommentIcon,\n \n // UI\n Settings: SettingsIcon,\n Fullscreen: FullscreenIcon,\n FullscreenExit: FullscreenExitIcon,\n Search: SearchIcon,\n Info: InfoIcon,\n Warning: WarningIcon,\n Error: ErrorIcon,\n Success: SuccessIcon,\n Question: QuestionIcon,\n \n // Time\n Clock: ClockIcon,\n Timer: TimerIcon,\n Calendar: CalendarIcon,\n \n // Files\n Folder: FolderIcon,\n File: FileIcon,\n Film: FilmIcon,\n \n // Animation\n Sparkle: SparkleIcon,\n MagicWand: MagicWandIcon,\n Lightning: LightningIcon,\n Layers: LayersIcon,\n Loader2: Loader2Icon,\n};\n\nexport default Icons;\n","'use client';\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { CompositionProps } from '../core/types';\nimport { renderCompositionToVideo, downloadVideo, RenderProgress } from '../renderer';\nimport { DownloadIcon, VideoIcon, ClockIcon, Loader2Icon } from '../icons';\n\n// Player Context\nimport { PlayerProvider, usePlayer, FrameContext } from '../core/context';\n\n// Timeline component\nconst Timeline: React.FC<{\n durationInFrames: number;\n frame: number;\n onSeek: (frame: number) => void;\n marks?: number[];\n fps: number;\n}> = ({ durationInFrames, frame, onSeek, marks = [], fps }) => {\n const timelineRef = useRef(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (!timelineRef.current) return;\n const rect = timelineRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percentage = x / rect.width;\n onSeek(Math.floor(percentage * durationInFrames));\n }, [durationInFrames, onSeek]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n setIsDragging(true);\n handleClick(e as React.MouseEvent);\n }, [handleClick]);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging || !timelineRef.current) return;\n const rect = timelineRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percentage = Math.max(0, Math.min(1, x / rect.width));\n onSeek(Math.floor(percentage * durationInFrames));\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n };\n\n if (isDragging) {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, durationInFrames, onSeek]);\n\n const progress = (frame / (durationInFrames - 1)) * 100;\n const timeInSeconds = frame / fps;\n const durationInSeconds = durationInFrames / fps;\n\n const formatTime = (seconds: number): string => {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n const ms = Math.floor((seconds % 1) * 100);\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}.${ms.toString().padStart(2, '0')}`;\n };\n\n return (\n \n
\n {/* Progress bar */}\n
\n\n {/* Playhead */}\n
\n\n {/* Markers */}\n {marks.map((mark, i) => (\n
\n ))}\n
\n\n {/* Time display */}\n
\n {formatTime(timeInSeconds)}\n {formatTime(durationInSeconds)}\n
\n
\n );\n};\n\n// Controls component\nconst Controls: React.FC<{\n playing: boolean;\n onPlayPause: () => void;\n onRestart: () => void;\n onStepBack: () => void;\n onStepForward: () => void;\n playbackRate: number;\n onPlaybackRateChange: (rate: number) => void;\n frame: number;\n totalFrames: number;\n onExport: () => void;\n isExporting: boolean;\n}> = ({\n playing,\n onPlayPause,\n onRestart,\n onStepBack,\n onStepForward,\n playbackRate,\n onPlaybackRateChange,\n frame,\n totalFrames,\n onExport,\n isExporting,\n}) => {\n const [showSpeedMenu, setShowSpeedMenu] = useState(false);\n const speeds = [0.25, 0.5, 1, 1.5, 2];\n\n return (\n \n {/* Restart button */}\n
\n\n {/* Step back button */}\n
\n\n {/* Play/Pause button */}\n
\n\n {/* Step forward button */}\n
\n\n {/* Speed selector */}\n
\n
\n\n {showSpeedMenu && (\n
\n {speeds.map((speed) => (\n \n ))}\n
\n )}\n
\n\n {/* Frame counter */}\n
\n \n {frame + 1}\n /\n {totalFrames}\n \n
\n\n {/* Export button */}\n
\n
\n );\n};\n\n// Canvas component - renders the video composition\nconst Canvas: React.FC<{\n canvasRef?: React.RefObject;\n component: React.ComponentType>;\n width: number;\n height: number;\n frame: number;\n fps: number;\n durationInFrames: number;\n playing: boolean;\n playbackRate: number;\n defaultProps?: Record;\n}> = ({\n canvasRef,\n component: Component,\n width,\n height,\n frame,\n fps,\n durationInFrames,\n playing,\n playbackRate,\n defaultProps = {},\n}) => {\n const scale = Math.min(1, 800 / width);\n\n return (\n \n {/* Canvas border glow effect */}\n
\n\n
\n {},\n setPlaying: () => {},\n setPlaybackRate: () => {},\n }}\n >\n \n \n
\n
\n );\n};\n\n// Main Player component\nexport interface PlayerProps {\n component: React.ComponentType>;\n durationInFrames: number;\n fps?: number;\n width?: number;\n height?: number;\n defaultProps?: Record;\n controls?: boolean;\n loop?: boolean;\n autoPlay?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const Player: React.FC = ({\n component,\n durationInFrames,\n fps = 30,\n width = 1920,\n height = 1080,\n defaultProps = {},\n controls = true,\n loop = true,\n autoPlay = false,\n style,\n className,\n}) => {\n const [frame, setFrame] = useState(0);\n const [playing, setPlaying] = useState(autoPlay);\n const [playbackRate, setPlaybackRate] = useState(1);\n const [isExporting, setIsExporting] = useState(false);\n const [exportProgress, setExportProgress] = useState(0);\n \n const animationRef = useRef(null);\n const lastTimeRef = useRef(0);\n const canvasRef = useRef(null);\n\n // Animation loop\n useEffect(() => {\n if (playing) {\n const frameDuration = 1000 / (fps * playbackRate);\n\n const animate = (currentTime: number) => {\n if (currentTime - lastTimeRef.current >= frameDuration) {\n setFrame((prevFrame) => {\n const nextFrame = prevFrame + 1;\n if (nextFrame >= durationInFrames) {\n if (loop) {\n return 0;\n }\n setPlaying(false);\n return prevFrame;\n }\n return nextFrame;\n });\n lastTimeRef.current = currentTime;\n }\n\n animationRef.current = requestAnimationFrame(animate);\n };\n\n lastTimeRef.current = performance.now();\n animationRef.current = requestAnimationFrame(animate);\n\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n };\n }\n }, [playing, fps, playbackRate, durationInFrames, loop]);\n\n // Keyboard controls\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case ' ':\n e.preventDefault();\n setPlaying((p) => !p);\n break;\n case 'ArrowLeft':\n e.preventDefault();\n setFrame((f) => Math.max(0, f - 1));\n break;\n case 'ArrowRight':\n e.preventDefault();\n setFrame((f) => Math.min(durationInFrames - 1, f + 1));\n break;\n case 'Home':\n setFrame(0);\n break;\n case 'End':\n setFrame(durationInFrames - 1);\n break;\n case 'j':\n case 'J':\n setFrame((f) => Math.max(0, f - 10));\n break;\n case 'l':\n case 'L':\n setFrame((f) => Math.min(durationInFrames - 1, f + 10));\n break;\n case 'k':\n case 'K':\n setPlaying((p) => !p);\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [durationInFrames]);\n\n const handleSeek = useCallback((targetFrame: number) => {\n setFrame(Math.max(0, Math.min(targetFrame, durationInFrames - 1)));\n }, [durationInFrames]);\n\n const handlePlayPause = useCallback(() => {\n setPlaying((p) => !p);\n }, []);\n\n const handleRestart = useCallback(() => {\n setFrame(0);\n setPlaying(true);\n }, []);\n\n const handleStepBack = useCallback(() => {\n setFrame((f) => Math.max(0, f - 1));\n }, []);\n\n const handleStepForward = useCallback(() => {\n setFrame((f) => Math.min(durationInFrames - 1, f + 1));\n }, [durationInFrames]);\n\n const handleExport = async () => {\n if (isExporting || !canvasRef.current) return;\n \n setIsExporting(true);\n setExportProgress(0);\n setPlaying(false);\n\n try {\n // The canvas element we want to capture is the inner div that has the scale transform\n const elementToCapture = canvasRef.current.querySelector('div') as HTMLElement;\n \n const blob = await renderCompositionToVideo(\n (f) => setFrame(f),\n elementToCapture,\n { width, height, fps, durationInFrames },\n {\n onProgress: (progress) => setExportProgress(progress),\n }\n );\n\n if (blob) {\n downloadVideo(blob, `motionforge-export-${Date.now()}.webm`);\n }\n } catch (error) {\n console.error('Export failed:', error);\n alert('Export failed. Check console for details.');\n } finally {\n setIsExporting(false);\n setExportProgress(0);\n }\n };\n\n return (\n \n {/* Export Progress Overlay */}\n {isExporting && (\n
\n
\n
\n
\n
\n