@twick/studio 0.14.6 → 0.14.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -6
- package/dist/components/panel/audio-panel.d.ts +1 -1
- package/dist/components/panel/image-panel.d.ts +1 -1
- package/dist/components/panel/video-panel.d.ts +1 -1
- package/dist/components/shared/index.d.ts +1 -0
- package/dist/components/shared/url-input.d.ts +6 -0
- package/dist/index.js +173 -62
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +173 -62
- package/dist/index.mjs.map +1 -1
- package/dist/studio.css +16 -0
- package/dist/types/media-panel.d.ts +11 -6
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/check.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/circle.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/clapperboard.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/download.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/file.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/image.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/infinity.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/loader-circle.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/message-square.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/music.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/pause.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/play.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/save.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/settings.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/sparkles.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/square.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash-2.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/type.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/upload.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/video.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/volume-2.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/wand-sparkles.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/zap.js","../src/components/toolbar.tsx","../src/components/header.tsx","../src/hooks/use-studio-manager.tsx","../src/components/panel/subtitles-panel.tsx","../src/components/shared/file-input.tsx","../src/components/shared/media-manager.ts","../src/context/media-context.tsx","../src/hooks/use-media-panel.ts","../src/components/shared/search-input.tsx","../src/hooks/use-audio-preview.ts","../src/components/panel/audio-panel.tsx","../src/components/container/audio-panel-container.tsx","../src/components/panel/image-panel.tsx","../src/components/container/image-panel-container.tsx","../src/hooks/use-video-preview.ts","../src/components/panel/video-panel.tsx","../src/components/container/video-panel-container.tsx","../src/components/panel/text-panel.tsx","../src/hooks/use-text-panel.ts","../src/components/container/text-panel-container.tsx","../src/components/panel/icon-panel.tsx","../src/hooks/use-icon-panel.ts","../src/components/container/icon-panel-container.tsx","../src/components/panel/rect-panel.tsx","../src/hooks/use-rect-panel.ts","../src/components/container/rect-panel-container.tsx","../src/components/panel/circle-panel.tsx","../src/hooks/use-circle-panel.ts","../src/components/container/circle-panel-container.tsx","../src/components/container/element-panel-container.tsx","../src/components/props-toolbar.tsx","../src/components/properties/element-props.tsx","../src/components/properties/text-effects.tsx","../src/components/properties/animation.tsx","../src/components/properties/playback-props.tsx","../src/components/container/properties-panel-container.tsx","../../media-utils/dist/index.mjs","../src/hooks/use-studio-operation.ts","../src/components/twick-studio.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]];\nconst Circle = createLucideIcon(\"circle\", __iconNode);\n\nexport { __iconNode, Circle as default };\n//# sourceMappingURL=circle.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n { d: \"M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3Z\", key: \"1tn4o7\" }\n ],\n [\"path\", { d: \"m6.2 5.3 3.1 3.9\", key: \"iuk76l\" }],\n [\"path\", { d: \"m12.4 3.4 3.1 4\", key: \"6hsd6n\" }],\n [\"path\", { d: \"M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z\", key: \"ltgou9\" }]\n];\nconst Clapperboard = createLucideIcon(\"clapperboard\", __iconNode);\n\nexport { __iconNode, Clapperboard as default };\n//# sourceMappingURL=clapperboard.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M6 16c5 0 7-8 12-8a4 4 0 0 1 0 8c-5 0-7-8-12-8a4 4 0 1 0 0 8\", key: \"18ogeb\" }]\n];\nconst Infinity = createLucideIcon(\"infinity\", __iconNode);\n\nexport { __iconNode, Infinity as default };\n//# sourceMappingURL=infinity.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\", key: \"1lielz\" }]\n];\nconst MessageSquare = createLucideIcon(\"message-square\", __iconNode);\n\nexport { __iconNode, MessageSquare as default };\n//# sourceMappingURL=message-square.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M9 18V5l12-2v13\", key: \"1jmyc2\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"circle\", { cx: \"18\", cy: \"16\", r: \"3\", key: \"1hluhg\" }]\n];\nconst Music = createLucideIcon(\"music\", __iconNode);\n\nexport { __iconNode, Music as default };\n//# sourceMappingURL=music.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"zuxfzm\" }],\n [\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"1okwgv\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"polygon\", { points: \"6 3 20 12 6 21 6 3\", key: \"1oa8hb\" }]];\nconst Play = createLucideIcon(\"play\", __iconNode);\n\nexport { __iconNode, Play as default };\n//# sourceMappingURL=play.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n];\nconst Save = createLucideIcon(\"save\", __iconNode);\n\nexport { __iconNode, Save as default };\n//# sourceMappingURL=save.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\",\n key: \"1qme2f\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n];\nconst Settings = createLucideIcon(\"settings\", __iconNode);\n\nexport { __iconNode, Settings as default };\n//# sourceMappingURL=settings.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\",\n key: \"4pj2yx\"\n }\n ],\n [\"path\", { d: \"M20 3v4\", key: \"1olli1\" }],\n [\"path\", { d: \"M22 5h-4\", key: \"1gvqau\" }],\n [\"path\", { d: \"M4 17v2\", key: \"vumght\" }],\n [\"path\", { d: \"M5 18H3\", key: \"zchphs\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }]\n];\nconst Square = createLucideIcon(\"square\", __iconNode);\n\nexport { __iconNode, Square as default };\n//# sourceMappingURL=square.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 4v16\", key: \"1654pz\" }],\n [\"path\", { d: \"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\", key: \"e0r10z\" }],\n [\"path\", { d: \"M9 20h6\", key: \"s66wpe\" }]\n];\nconst Type = createLucideIcon(\"type\", __iconNode);\n\nexport { __iconNode, Type as default };\n//# sourceMappingURL=type.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\",\n key: \"ftymec\"\n }\n ],\n [\"rect\", { x: \"2\", y: \"6\", width: \"14\", height: \"12\", rx: \"2\", key: \"158x01\" }]\n];\nconst Video = createLucideIcon(\"video\", __iconNode);\n\nexport { __iconNode, Video as default };\n//# sourceMappingURL=video.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\n key: \"uqj9uw\"\n }\n ],\n [\"path\", { d: \"M16 9a5 5 0 0 1 0 6\", key: \"1q6k2b\" }],\n [\"path\", { d: \"M19.364 18.364a9 9 0 0 0 0-12.728\", key: \"ijwkga\" }]\n];\nconst Volume2 = createLucideIcon(\"volume-2\", __iconNode);\n\nexport { __iconNode, Volume2 as default };\n//# sourceMappingURL=volume-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72\",\n key: \"ul74o6\"\n }\n ],\n [\"path\", { d: \"m14 7 3 3\", key: \"1r5n42\" }],\n [\"path\", { d: \"M5 6v4\", key: \"ilb8ba\" }],\n [\"path\", { d: \"M19 14v4\", key: \"blhpug\" }],\n [\"path\", { d: \"M10 2v2\", key: \"7u0qdc\" }],\n [\"path\", { d: \"M7 8H3\", key: \"zfb6yr\" }],\n [\"path\", { d: \"M21 16h-4\", key: \"1cnmox\" }],\n [\"path\", { d: \"M11 3H9\", key: \"1obp7u\" }]\n];\nconst WandSparkles = createLucideIcon(\"wand-sparkles\", __iconNode);\n\nexport { __iconNode, WandSparkles as default };\n//# sourceMappingURL=wand-sparkles.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n];\nconst Zap = createLucideIcon(\"zap\", __iconNode);\n\nexport { __iconNode, Zap as default };\n//# sourceMappingURL=zap.js.map\n","/**\n * Toolbar Component\n * \n * A vertical toolbar that provides quick access to different editing tools\n * and media types. Displays icons with labels and optional keyboard shortcuts.\n * \n * @component\n * @param {Object} props\n * @param {string} props.selectedTool - Currently selected tool ID\n * @param {(tool: string) => void} props.setSelectedTool - Callback to update selected tool\n * \n * @example\n * ```tsx\n * <Toolbar\n * selectedTool=\"text\"\n * setSelectedTool={(tool) => console.log(`Selected ${tool}`)}\n * />\n * ```\n */\n\nimport { \n Type, \n Upload, \n Video,\n Image, \n Music,\n Circle,\n Infinity, \n MessageSquare,\n Plus,\n Square,\n} from 'lucide-react'\nimport type { ToolCategory } from '../types'\n\nconst toolCategories: ToolCategory[] = [\n { id: 'video', name: 'Video', icon: 'Video', description: 'Video' },\n { id: 'image', name: 'Image', icon: 'Image', description: 'Image' },\n { id: 'audio', name: 'Audio', icon: 'Audio', description: 'Audio' },\n { id: 'text', name: 'Text', icon: 'Type', description: 'Add text elements', shortcut: 'T' },\n { id: 'icon', name: 'Icons', icon: 'Icon', description: 'Icon Element', shortcut: 'I' },\n { id: 'circle', name: 'Circle', icon: 'Circle', description: 'Circle Element', shortcut: 'C' },\n { id: 'rect', name: 'Rect', icon: 'Rect', description: 'Rect Element' },\n // { id: 'subtitle', name: 'Subtitles', icon: 'MessageSquare', description: 'Manage subtitles', shortcut: 'S' },\n]\n\nconst getIcon = (iconName: string) => {\n switch (iconName) {\n case 'Plus': return Plus\n case 'Type': return Type\n case 'Icon': return Infinity\n case 'Upload': return Upload\n case 'Square': return Square\n case 'Image': return Image\n case 'Video': return Video\n case 'Audio': return Music\n case 'Circle': return Circle\n case 'Rect': return Square\n case 'MessageSquare': return MessageSquare\n default: return Plus\n }\n}\n\nexport function Toolbar({ selectedTool, setSelectedTool }: { selectedTool: string, setSelectedTool: (tool: string) => void }) {\n\n const handleToolSelect = (toolId: string) => {\n setSelectedTool(toolId)\n }\n\n return (\n <div className=\"sidebar\">\n {/* Main Tools */}\n {toolCategories.map((tool) => {\n const Icon = getIcon(tool.icon)\n const isSelected = selectedTool === tool.id\n \n return (\n <div\n key={tool.id}\n onClick={() => handleToolSelect(tool.id)}\n className={`toolbar-btn ${isSelected ? 'active' : ''}`}\n title={`${tool.name}${tool.shortcut ? ` (${tool.shortcut})` : ''}`}\n >\n <Icon className=\"icon-sm\" />\n <span className=\"toolbar-label\">\n {tool.name}\n </span>\n </div>\n )\n })}\n </div>\n )\n}\n","/**\n * StudioHeader Component\n *\n * The top header bar of the studio interface. Contains the studio logo,\n * orientation controls, and action divs for saving and exporting.\n *\n * @component\n * @param {Object} props\n * @param {(resolution: Size) => void} props.setVideoResolution - Callback to update canvas resolution\n *\n * @example\n * ```tsx\n * <StudioHeader\n * setVideoResolution={(size) => console.log(`New size: ${size.width}x${size.height}`)}\n * />\n * ```\n */\n\nimport type { Size } from \"@twick/timeline\";\nimport { Save, Download, Clapperboard, File } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\n\ninterface StudioHeaderProps {\n setVideoResolution: (resolution: Size) => void;\n onLoadProject: () => void;\n onSaveProject: () => void;\n onExportVideo: () => void;\n}\nexport const StudioHeader = ({\n setVideoResolution,\n onLoadProject,\n onSaveProject,\n onExportVideo,\n}: StudioHeaderProps) => {\n const [orientation, setOrientation] = useState<\"horizontal\" | \"vertical\">(\n \"vertical\"\n );\n\n useEffect(() => {\n const orientation = localStorage.getItem(\"orientation\");\n if (orientation) {\n setOrientation(orientation as \"horizontal\" | \"vertical\");\n }\n }, []);\n\n useEffect(() => {\n if (orientation === \"horizontal\") {\n localStorage.setItem(\"orientation\", \"horizontal\");\n setVideoResolution({ width: 1280, height: 720 });\n } else {\n localStorage.setItem(\"orientation\", \"vertical\");\n setVideoResolution({ width: 720, height: 1280 });\n }\n }, [orientation]);\n\n return (\n <header className=\"header\">\n <div className=\"flex-container\">\n <div className=\"flex-container\">\n <Clapperboard className=\"icon-lg accent-purple\" />\n <h1 className=\"text-gradient\">\n Twick Studio\n </h1>\n </div>\n </div>\n <div className=\"flex-container\">\n <button\n className=\"btn-ghost\"\n title=\"Load Project\"\n onClick={onLoadProject}\n >\n <File className=\"icon-sm\" />\n Load Project\n </button>\n <button\n className=\"btn-ghost\"\n title=\"Save Draft\"\n onClick={onSaveProject}\n >\n <Save className=\"icon-sm\" />\n Save Draft\n </button>\n <button\n className=\"btn-primary\"\n title=\"Export\"\n onClick={onExportVideo}\n >\n <Download className=\"icon-sm\" />\n Export\n </button>\n </div>\n </header>\n );\n};\n\nexport default StudioHeader;\n","/**\n * useStudioManager Hook\n * \n * A custom hook that manages the studio's state and operations.\n * Handles tool selection, element management, and timeline interactions.\n * \n * @returns {Object} Studio manager methods and state\n * @property {string} selectedTool - Currently selected tool ID\n * @property {(tool: string) => void} setSelectedTool - Update selected tool\n * @property {TrackElement | null} selectedElement - Currently selected timeline element\n * @property {(element: TrackElement) => void} addElement - Add element to timeline\n * @property {(element: TrackElement) => void} updateElement - Update existing element\n * \n * @example\n * ```tsx\n * const {\n * selectedTool,\n * setSelectedTool,\n * selectedElement,\n * addElement,\n * updateElement\n * } = useStudioManager();\n * ```\n */\n\nimport { Track, TrackElement, useTimelineContext } from \"@twick/timeline\";\nimport { useEffect, useRef, useState } from \"react\";\n\nexport const useStudioManager = () => {\n const [selectedProp, setSelectedProp] = useState(\"element-props\");\n\n const { editor, selectedItem, setSelectedItem } = useTimelineContext();\n\n const selectedElement = selectedItem instanceof TrackElement ? selectedItem : null;\n\n const [ selectedTool, setSelectedTool ] = useState<string>(\"none\");\n\n const isToolChanged = useRef(false);\n\n const addElement = (element: TrackElement) => {\n if (selectedItem instanceof Track) {\n editor.addElementToTrack(selectedItem, element);\n } else {\n const newTrack = editor.addTrack(\"Track\");\n editor.addElementToTrack(newTrack, element);\n }\n };\n\n const updateElement = (element: TrackElement) => {\n const updatedElement =editor.updateElement(element);\n editor.refresh();\n setSelectedItem(updatedElement)\n };\n\n // const addSubtitlesToTimeline = (elements: TrackElement[]) => {\n // if (selectedItem instanceof Track && selectedItem.getType() == \"caption\") {\n // elements.forEach((element) => {\n // editor.addElementToTrack(selectedItem, element);\n // });\n // } else {\n // const newTrack = editor.addTrack(\"Track\", \"caption\");\n // elements.forEach((element) => {\n // editor.addElementToTrack(newTrack, element);\n // });\n // }\n // };\n\n useEffect(() => {\n if (selectedItem instanceof TrackElement) {\n setSelectedTool(selectedItem.getType());\n isToolChanged.current = true;\n } else if(selectedItem instanceof Track) {\n // do-nothing\n } else {\n if(isToolChanged.current) {\n setSelectedTool(\"none\");\n } else {\n setSelectedTool(\"video\");\n }\n }\n }, [selectedItem]);\n\n\n return {\n selectedProp, \n setSelectedProp,\n selectedTool, \n setSelectedTool,\n selectedElement,\n addElement,\n updateElement\n };\n};\n\n","/**\n * SubtitlesPanel Component\n * \n * A panel for managing video subtitles in the studio. Provides functionality\n * for creating, editing, and managing subtitle entries with timing and text.\n * Supports both manual entry and automatic generation (TODO).\n * \n * @component\n * @example\n * ```tsx\n * <SubtitlesPanel />\n * ```\n * \n * Features:\n * - Add/delete subtitle entries\n * - Set start/end times\n * - Edit subtitle text\n * - Automatic subtitle generation (planned)\n * - Save subtitles to timeline\n * \n * Each subtitle entry includes:\n * - Start time (in seconds)\n * - End time (in seconds)\n * - Subtitle text\n * - Delete and save actions\n */\n\nimport { useState } from \"react\";\nimport { Trash2, Check } from \"lucide-react\";\n\ninterface SubtitleEntry {\n id: string;\n start: number;\n end: number;\n text: string;\n}\n\nexport function SubtitlesPanel() {\n const [subtitles, setSubtitles] = useState<SubtitleEntry[]>([]);\n\n const handleGenerate = () => {\n // TODO: Generate subtitles automatically\n console.log(\"Generating subtitles...\");\n };\n\n const handleAdd = () => {\n const newId = (subtitles.length + 1).toString();\n const lastEnd = subtitles.length > 0 ? subtitles[subtitles.length - 1].end : 0;\n const newSubtitle: SubtitleEntry = {\n id: newId,\n start: lastEnd,\n end: lastEnd + 1,\n text: \"\"\n };\n setSubtitles([...subtitles, newSubtitle]);\n };\n\n const handleDelete = (id: string) => {\n setSubtitles(subtitles.filter(sub => sub.id !== id));\n };\n\n const handleSave = (id: string) => {\n // TODO: Save subtitle to timeline or database\n console.log(\"Saving subtitle:\", id);\n };\n\n const handleUpdateSubtitle = (id: string, field: keyof SubtitleEntry, value: string | number) => {\n setSubtitles(subtitles.map(sub => \n sub.id === id ? { ...sub, [field]: value } : sub\n ));\n };\n\n return (\n <div className=\"panel-container\">\n <h3 className=\"panel-title\">Subtitles</h3>\n\n {/* Top Bar - Action Buttons */}\n <div className=\"panel-section\">\n <div className=\"flex-container\">\n <button\n onClick={handleGenerate}\n className=\"btn-primary\"\n >\n Generate\n </button>\n <button\n onClick={handleAdd}\n className=\"btn-primary\"\n >\n Add\n </button>\n </div>\n </div>\n\n {/* Subtitle Entries */}\n {subtitles.map((subtitle) => (\n <div\n key={subtitle.id}\n className=\"panel-section\"\n >\n {/* Time Inputs */}\n <div className=\"flex-container\">\n <div>\n <label className=\"label-small\">Start</label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"0.1\"\n value={subtitle.start}\n onChange={(e) => handleUpdateSubtitle(subtitle.id, 'start', Number(e.target.value))}\n className=\"input-dark\"\n />\n </div>\n <div>\n <label className=\"label-small\">End</label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"0.1\"\n value={subtitle.end}\n onChange={(e) => handleUpdateSubtitle(subtitle.id, 'end', Number(e.target.value))}\n className=\"input-dark\"\n />\n </div>\n </div>\n\n {/* Subtitle Text Input */}\n <div>\n <label className=\"label-dark\">Subtitle Text</label>\n <input\n type=\"text\"\n placeholder=\"Enter subtitle text\"\n value={subtitle.text}\n onChange={(e) => handleUpdateSubtitle(subtitle.id, 'text', e.target.value)}\n className=\"input-dark\"\n />\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex-container justify-between\">\n <button\n onClick={() => handleDelete(subtitle.id)}\n className=\"btn-danger\"\n title=\"Delete subtitle\"\n >\n <Trash2 className=\"icon-sm\" />\n </button>\n <button\n onClick={() => handleSave(subtitle.id)}\n className=\"btn-primary\"\n title=\"Save subtitle\"\n >\n <Check className=\"icon-sm\" />\n </button>\n </div>\n </div>\n ))}\n\n {/* Empty State */}\n {subtitles.length === 0 && (\n <div className=\"panel-section\">\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <p className=\"empty-state-text\">No subtitles yet</p>\n <p className=\"empty-state-subtext\">Click \"Add\" to create your first subtitle</p>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { Upload } from \"lucide-react\";\n\nconst FileInput = ({\n acceptFileTypes,\n onFileLoad,\n buttonText,\n id,\n className,\n icon,\n}: {\n acceptFileTypes: string[];\n onFileLoad: (content: any) => void;\n buttonText: string;\n id: string;\n className?: string;\n icon?: React.ReactNode;\n}) => {\n const onFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n try {\n onFileLoad({\n content:\n file.type === \"application/json\"\n ? event.target?.result\n : undefined,\n type: file.type,\n name: file.name,\n file: file,\n blobUrl: URL.createObjectURL(file),\n });\n } catch (error) {\n console.error(\"Error parsing file:\", error);\n }\n };\n console.log(\"file\", file);\n\n if (file.type === \"application/json\") {\n reader.readAsText(file);\n } else {\n reader.readAsDataURL(file);\n }\n }\n };\n\n return (\n <div className=\"file-input-container\">\n <input\n type=\"file\"\n accept={acceptFileTypes.join(\",\")}\n className=\"file-input-hidden\"\n id={id}\n onChange={onFileChange}\n />\n <label\n htmlFor={id}\n className={className || \"btn-primary file-input-label\"}\n >\n {icon || <Upload className=\"icon-sm\" />}\n {buttonText ?? \"Upload\"}\n </label>\n </div>\n );\n};\n\nexport default FileInput;\n","import { BrowserMediaManager } from \"@twick/video-editor\";\n\nclass MediaManagerSingleton {\n private static instance: BrowserMediaManager | null = null;\n\n private constructor() {}\n\n public static getInstance(): BrowserMediaManager {\n if (!MediaManagerSingleton.instance) {\n MediaManagerSingleton.instance = new BrowserMediaManager();\n }\n return MediaManagerSingleton.instance;\n }\n}\n\n// Export a function to get the singleton instance\nexport const getMediaManager = () => MediaManagerSingleton.getInstance(); ","import { createContext, useContext, useEffect, useState, ReactNode } from \"react\";\nimport type { MediaItem } from \"@twick/video-editor\";\nimport { getMediaManager } from \"../components/shared\";\n\ntype MediaType = \"video\" | \"audio\" | \"image\";\n\ninterface MediaState {\n items: MediaItem[];\n searchQuery: string;\n isLoading: boolean;\n}\n\ninterface MediaContextType {\n videoState: MediaState;\n audioState: MediaState;\n imageState: MediaState;\n setSearchQuery: (type: MediaType, query: string) => void;\n addItem: (type: MediaType, item: MediaItem) => void;\n}\n\nconst initialMediaState: MediaState = {\n items: [],\n searchQuery: \"\",\n isLoading: false,\n};\n\nconst MediaContext = createContext<MediaContextType | null>(null);\n\nexport function MediaProvider({ children }: { children: ReactNode }) {\n const [videoState, setVideoState] = useState<MediaState>(initialMediaState);\n const [audioState, setAudioState] = useState<MediaState>(initialMediaState);\n const [imageState, setImageState] = useState<MediaState>(initialMediaState);\n const mediaManager = getMediaManager();\n\n const getStateAndSetter = (type: MediaType): [MediaState, (state: MediaState) => void] => {\n switch (type) {\n case \"video\":\n return [videoState, setVideoState];\n case \"audio\":\n return [audioState, setAudioState];\n case \"image\":\n return [imageState, setImageState];\n }\n };\n\n const loadItems = async (type: MediaType, query: string) => {\n const [state, setState] = getStateAndSetter(type);\n \n setState({ ...state, isLoading: true });\n try {\n const results = await mediaManager.search({\n query,\n type,\n });\n setState({\n items: results,\n searchQuery: query,\n isLoading: false,\n });\n } catch (error) {\n console.error(`Error loading ${type} items:`, error);\n setState({\n ...state,\n isLoading: false,\n });\n }\n };\n\n // Load initial data for each type\n useEffect(() => {\n loadItems(\"video\", \"\");\n loadItems(\"audio\", \"\");\n loadItems(\"image\", \"\");\n }, []);\n\n const setSearchQuery = (type: MediaType, query: string) => {\n const [state, setState] = getStateAndSetter(type);\n setState({ ...state, searchQuery: query });\n loadItems(type, query);\n };\n\n const addItem = (type: MediaType, newItem: MediaItem) => {\n const [state, setState] = getStateAndSetter(type);\n setState({\n ...state,\n items: [...state.items, newItem],\n });\n };\n\n return (\n <MediaContext.Provider\n value={{\n videoState,\n audioState,\n imageState,\n setSearchQuery,\n addItem,\n }}\n >\n {children}\n </MediaContext.Provider>\n );\n}\n\nexport function useMedia(type: MediaType) {\n const context = useContext(MediaContext);\n if (!context) {\n throw new Error(\"useMedia must be used within a MediaProvider\");\n }\n\n const state = context[`${type}State`];\n return {\n items: state.items,\n searchQuery: state.searchQuery,\n isLoading: state.isLoading,\n setSearchQuery: (query: string) => context.setSearchQuery(type, query),\n addItem: (item: MediaItem) => context.addItem(type, item),\n };\n}\n","import {\n TrackElement,\n VideoElement,\n AudioElement,\n ImageElement,\n Size,\n} from \"@twick/timeline\";\nimport type { MediaItem } from \"@twick/video-editor\";\nimport { getMediaManager } from \"../components/shared\";\nimport { useMedia } from \"../context/media-context\";\n\nexport interface MediaPanelState {\n items: MediaItem[];\n searchQuery: string;\n isLoading: boolean;\n acceptFileTypes: string[];\n}\n\nexport interface MediaPanelActions {\n setSearchQuery: (query: string) => void;\n handleSelection: (item: MediaItem, forceAdd?: boolean) => void;\n handleFileUpload: (fileData: { file: File; blobUrl: string }) => void;\n}\n\nexport type MediaType = \"video\" | \"audio\" | \"image\";\n\nconst mediaConfigs = {\n video: {\n acceptFileTypes: [\"video/*\"] as string[],\n createElement: (url: string, parentSize: Size) =>\n new VideoElement(url, parentSize),\n updateElement: async (element: TrackElement, url: string) => {\n if (element instanceof VideoElement) {\n element.setSrc(url);\n await element.updateVideoMeta();\n }\n },\n },\n audio: {\n acceptFileTypes: [\"audio/*\"] as string[],\n createElement: (url: string, _parentSize: Size) => new AudioElement(url),\n updateElement: async (element: TrackElement, url: string) => {\n if (element instanceof AudioElement) {\n element.setSrc(url);\n await element.updateAudioMeta();\n }\n },\n },\n image: {\n acceptFileTypes: [\"image/*\"] as string[],\n createElement: (url: string, parentSize: Size) =>\n new ImageElement(url, parentSize),\n updateElement: async (element: TrackElement, url: string) => {\n if (element instanceof ImageElement) {\n element.setSrc(url);\n await element.updateImageMeta();\n }\n },\n },\n};\n\nexport const useMediaPanel = (\n type: MediaType,\n {\n selectedElement,\n addElement,\n updateElement,\n }: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n },\n videoResolution: Size\n): MediaPanelState & MediaPanelActions => {\n const { items, searchQuery, setSearchQuery, addItem, isLoading } =\n useMedia(type);\n const mediaManager = getMediaManager();\n\n const handleSelection = async (item: MediaItem, forceAdd?: boolean) => {\n const config = mediaConfigs[type];\n if (forceAdd) {\n const element = config.createElement(item.url, videoResolution);\n addElement(element);\n } else {\n if (selectedElement) {\n await config.updateElement(selectedElement, item.url);\n updateElement(selectedElement);\n } else {\n const element = config.createElement(item.url, videoResolution);\n addElement(element);\n }\n }\n };\n\n const handleFileUpload = async (fileData: {\n file: File;\n blobUrl: string;\n }) => {\n const arrayBuffer = await fileData.file.arrayBuffer();\n const newItem = await mediaManager.addItem({\n name: fileData.file.name,\n url: fileData.blobUrl,\n type,\n arrayBuffer,\n metadata: {\n name: fileData.file.name,\n size: fileData.file.size,\n type: fileData.file.type,\n },\n });\n addItem(newItem);\n };\n\n const config = mediaConfigs[type];\n return {\n items,\n searchQuery,\n setSearchQuery,\n handleSelection,\n handleFileUpload,\n isLoading,\n acceptFileTypes: config.acceptFileTypes,\n };\n};\n","import { Search } from \"lucide-react\";\n\nconst SearchInput = ({\n searchQuery,\n setSearchQuery,\n}: {\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n}) => {\n return (\n <div className=\"search-container\">\n <input\n type=\"text\"\n placeholder=\"Search media...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"input search-input w-full\"\n />\n <Search className=\"search-icon\" />\n </div>\n );\n};\n\nexport default SearchInput;\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { MediaItem } from '@twick/video-editor';\n\nexport interface AudioPreviewState {\n playingAudio: string | null; // ID of currently playing audio\n audioElement: HTMLAudioElement | null;\n}\n\nexport interface AudioPreviewActions {\n togglePlayPause: (item: MediaItem) => void;\n stopPlayback: () => void;\n}\n\nexport const useAudioPreview = (): AudioPreviewState & AudioPreviewActions => {\n const [playingAudio, setPlayingAudio] = useState<string | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n\n // Cleanup audio element on unmount\n useEffect(() => {\n return () => {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current = null;\n }\n };\n }, []);\n\n const stopPlayback = useCallback(() => {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current = null;\n }\n setPlayingAudio(null);\n }, []);\n\n const togglePlayPause = useCallback((item: MediaItem) => {\n // If we're already playing this audio, stop it\n if (playingAudio === item.id) {\n stopPlayback();\n return;\n }\n\n // Stop any currently playing audio\n stopPlayback();\n\n // Start playing the new audio\n const audio = new Audio(item.url);\n audio.addEventListener('ended', stopPlayback);\n audio.play();\n audioRef.current = audio;\n setPlayingAudio(item.id);\n }, [playingAudio, stopPlayback]);\n\n return {\n playingAudio,\n audioElement: audioRef.current,\n togglePlayPause,\n stopPlayback,\n };\n};\n","/**\n * AudioPanel Component\n * \n * A panel for managing audio elements in the studio. Provides functionality\n * for searching, uploading, previewing, and adding audio files to the timeline.\n * \n * @component\n * @param {Object} props\n * @param {MediaItem[]} props.items - List of audio items to display\n * @param {string} props.searchQuery - Current search query\n * @param {string | null} props.playingAudio - ID of currently playing audio, if any\n * @param {(query: string) => void} props.onSearchChange - Handle search query changes\n * @param {(item: MediaItem) => void} props.onItemSelect - Handle audio item selection\n * @param {(item: MediaItem) => void} props.onPlayPause - Toggle audio preview playback\n * @param {(data: { file: File; blobUrl: string }) => void} props.onFileUpload - Handle file uploads\n * \n * @example\n * ```tsx\n * <AudioPanel\n * items={audioItems}\n * searchQuery=\"\"\n * playingAudio={null}\n * onSearchChange={setSearchQuery}\n * onItemSelect={handleSelect}\n * onPlayPause={togglePlayback}\n * onFileUpload={handleUpload}\n * />\n * ```\n */\n\nimport { Wand2, Plus, Volume2, Play, Pause, Upload } from \"lucide-react\";\nimport SearchInput from \"../shared/search-input\";\nimport FileInput from \"../shared/file-input\";\nimport type { AudioPanelProps } from \"../../types/media-panel\";\nimport { useAudioPreview } from \"../../hooks/use-audio-preview\";\n\n\nexport const AudioPanel = ({\n items,\n searchQuery,\n onSearchChange,\n onItemSelect,\n onFileUpload,\n acceptFileTypes,\n}: AudioPanelProps) => {\n const { playingAudio, togglePlayPause } = useAudioPreview();\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Audio Library</div>\n\n {/* Search */}\n <div className=\"flex panel-section\">\n <SearchInput\n searchQuery={searchQuery}\n setSearchQuery={onSearchChange}\n />\n </div>\n\n {/* Upload */}\n <div className=\"flex panel-section\">\n <FileInput\n id=\"audio-upload\"\n acceptFileTypes={acceptFileTypes}\n onFileLoad={onFileUpload}\n buttonText=\"Import media\"\n className=\"btn-primary w-full\"\n icon={<Upload className=\"icon-sm\" />}\n />\n </div>\n\n {/* Audio List */}\n <div className=\"media-content\">\n <div className=\"media-list\">\n {(items || []).map((item) => (\n <div\n key={item.id}\n onDoubleClick={() => onItemSelect(item)}\n className=\"media-list-item\"\n >\n {/* Audio Info */}\n <div className=\"media-list-content\">\n {/* Play/Pause button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n togglePlayPause(item);\n }}\n className=\"media-action-btn\"\n >\n {playingAudio === item.id ? (\n <Pause className=\"icon-sm\" />\n ) : (\n <Play className=\"icon-sm\" />\n )}\n </button>\n\n {/* Audio Icon */}\n <div className={`media-list-icon ${playingAudio === item.id ? 'active' : ''}`}>\n <Volume2 className=\"icon-sm\" />\n </div>\n\n {/* Audio Title */}\n <div className=\"media-list-title\">\n {item.metadata?.title || item.metadata?.name}\n </div>\n\n {/* Quick Add button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onItemSelect(item, true);\n }}\n className=\"media-action-btn\"\n >\n <Plus className=\"icon-sm\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {/* Empty state */}\n {items.length === 0 && (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Wand2 className=\"empty-state-icon\" />\n <p className=\"empty-state-text\">No audio files found</p>\n {searchQuery && (\n <p className=\"empty-state-subtext\">Try adjusting your search</p>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};","import { useMediaPanel } from \"../../hooks/use-media-panel\";\nimport { AudioPanel } from \"../panel/audio-panel\";\nimport type { PanelProps } from \"../../types\";\n\nexport const AudioPanelContainer = (props: PanelProps) => {\n const {\n items,\n searchQuery,\n setSearchQuery,\n handleSelection,\n handleFileUpload,\n isLoading,\n acceptFileTypes,\n } = useMediaPanel(\"audio\", {\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n },\n props.videoResolution);\n\n return (\n <AudioPanel\n items={items}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onItemSelect={handleSelection}\n onFileUpload={handleFileUpload}\n isLoading={isLoading}\n acceptFileTypes={acceptFileTypes}\n />\n );\n};\n","/**\n * ImagePanel Component\n *\n * A panel for managing image elements in the studio. Provides functionality\n * for searching, uploading, previewing, and adding image files to the timeline.\n * Features a grid layout with image thumbnails and hover actions.\n *\n * @component\n * @param {Object} props\n * @param {MediaItem[]} props.items - List of image items to display\n * @param {string} props.searchQuery - Current search query\n * @param {(query: string) => void} props.setSearchQuery - Handle search query changes\n * @param {(item: MediaItem) => void} props.handleSelection - Handle image item selection\n * @param {(data: { file: File; blobUrl: string }) => void} props.handleFileUpload - Handle file uploads\n *\n * @example\n * ```tsx\n * <ImagePanel\n * items={imageItems}\n * searchQuery=\"\"\n * setSearchQuery={setSearchQuery}\n * handleSelection={handleSelect}\n * handleFileUpload={handleUpload}\n * />\n * ```\n */\n\nimport { Wand2, Plus, Upload } from \"lucide-react\";\nimport type { MediaItem } from \"@twick/video-editor\";\nimport type { ImagePanelProps } from \"../../types/media-panel\";\nimport FileInput from \"../shared/file-input\";\nimport SearchInput from \"../shared/search-input\";\n\nexport function ImagePanel({\n items,\n searchQuery,\n onSearchChange,\n onItemSelect,\n onFileUpload,\n acceptFileTypes,\n}: ImagePanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Image Library</div>\n\n {/* Search */}\n <div className=\"flex panel-section\">\n <SearchInput\n searchQuery={searchQuery}\n setSearchQuery={onSearchChange}\n />\n </div>\n {/* Upload */}\n <div className=\"flex panel-section\">\n <FileInput\n id=\"image-upload\"\n acceptFileTypes={acceptFileTypes}\n onFileLoad={onFileUpload}\n buttonText=\"Import media\"\n className=\"btn-primary w-full\"\n icon={<Upload className=\"icon-sm\" />}\n />\n </div>\n\n {/* Media Grid */}\n <div className=\"media-content\">\n <div className=\"media-grid\">\n {(items || []).map((item: MediaItem) => (\n <div\n key={item.id}\n onDoubleClick={() => onItemSelect(item)}\n className=\"media-item\"\n >\n <img src={item.url} alt=\"\" className=\"media-item-content\" />\n\n {/* Quick Actions */}\n <div className=\"media-actions\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onItemSelect(item, true);\n }}\n className=\"media-action-btn\"\n >\n <Plus className=\"icon-sm\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {/* Empty state */}\n {items.length === 0 && (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Wand2 className=\"empty-state-icon\" />\n <p className=\"empty-state-text\">No images found</p>\n {searchQuery && (\n <p className=\"empty-state-subtext\">Try adjusting your search</p>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { PanelProps } from \"../../types\";\nimport { ImagePanel } from \"../panel/image-panel\";\nimport { useMediaPanel } from \"../../hooks/use-media-panel\";\n\nexport function ImagePanelContainer(props: PanelProps) {\n const {\n items,\n searchQuery,\n setSearchQuery,\n handleSelection,\n handleFileUpload,\n isLoading,\n acceptFileTypes,\n } = useMediaPanel(\"image\", {\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n },\n props.videoResolution);\n\n return (\n <ImagePanel\n items={items}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onItemSelect={handleSelection}\n onFileUpload={handleFileUpload}\n isLoading={isLoading}\n acceptFileTypes={acceptFileTypes}\n />\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { MediaItem } from '@twick/video-editor';\n\nexport interface VideoPreviewState {\n playingVideo: string | null; // ID of currently playing video\n videoElement: HTMLVideoElement | null;\n}\n\nexport interface VideoPreviewActions {\n togglePlayPause: (item: MediaItem, videoElement: HTMLVideoElement) => void;\n stopPlayback: () => void;\n}\n\nexport const useVideoPreview = (): VideoPreviewState & VideoPreviewActions => {\n const [playingVideo, setPlayingVideo] = useState<string | null>(null);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n // Cleanup video element on unmount\n useEffect(() => {\n return () => {\n if (videoRef.current) {\n videoRef.current.pause();\n videoRef.current = null;\n }\n };\n }, []);\n\n const stopPlayback = useCallback(() => {\n if (videoRef.current) {\n videoRef.current.pause();\n videoRef.current = null;\n }\n setPlayingVideo(null);\n }, []);\n\n const togglePlayPause = useCallback((item: MediaItem, videoElement: HTMLVideoElement) => {\n // If we're already playing this video, pause it\n if (playingVideo === item.id) {\n videoElement.pause();\n stopPlayback();\n return;\n }\n\n // Stop any currently playing video\n stopPlayback();\n\n // Start playing the new video\n videoElement.currentTime = 0; // Reset to start\n videoElement.play();\n videoRef.current = videoElement;\n setPlayingVideo(item.id);\n\n // Add ended event listener\n videoElement.addEventListener('ended', stopPlayback, { once: true });\n }, [playingVideo, stopPlayback]);\n\n return {\n playingVideo,\n videoElement: videoRef.current,\n togglePlayPause,\n stopPlayback,\n };\n};","/**\n * VideoPanel Component\n * \n * A panel for managing video elements in the studio. Provides functionality\n * for searching, uploading, previewing, and adding video files to the timeline.\n * Features a grid layout with video thumbnails and hover actions.\n * \n * @component\n * @param {Object} props\n * @param {MediaItem[]} props.items - List of video items to display\n * @param {string} props.searchQuery - Current search query\n * @param {(query: string) => void} props.setSearchQuery - Handle search query changes\n * @param {(item: MediaItem) => void} props.handleSelection - Handle video item selection\n * @param {(data: { file: File; blobUrl: string }) => void} props.handleFileUpload - Handle file uploads\n * \n * @example\n * ```tsx\n * <VideoPanel\n * items={videoItems}\n * searchQuery=\"\"\n * setSearchQuery={setSearchQuery}\n * handleSelection={handleSelect}\n * handleFileUpload={handleUpload}\n * />\n * ```\n */\n\nimport { Wand2, Plus, Play, Pause, Upload } from \"lucide-react\";\nimport type { MediaItem } from \"@twick/video-editor\";\nimport type { VideoPanelProps } from \"../../types/media-panel\";\nimport { useVideoPreview } from \"../../hooks/use-video-preview\";\nimport FileInput from \"../shared/file-input\";\nimport SearchInput from \"../shared/search-input\";\n\n\nexport function VideoPanel({\n items,\n searchQuery,\n onSearchChange,\n onItemSelect,\n onFileUpload,\n acceptFileTypes,\n}: VideoPanelProps) {\n const { playingVideo, togglePlayPause } = useVideoPreview();\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Video Library</div>\n\n {/* Search */}\n <div className=\"flex panel-section\">\n <SearchInput\n searchQuery={searchQuery}\n setSearchQuery={onSearchChange}\n />\n </div>\n\n {/* Import Button */}\n <div className=\"flex panel-section\">\n <FileInput\n id=\"video-upload\"\n acceptFileTypes={acceptFileTypes}\n onFileLoad={onFileUpload}\n buttonText=\"Import media\"\n className=\"btn-primary w-full\"\n icon={<Upload className=\"icon-sm\" />}\n />\n </div>\n\n {/* Media Grid */}\n <div className=\"media-content\">\n <div className=\"media-grid\">\n {(items || []).map((item: MediaItem) => (\n <div\n key={item.id}\n onDoubleClick={() => onItemSelect(item)}\n className=\"media-item\"\n >\n <video\n src={item.url}\n poster={item.thumbnail}\n className=\"media-item-content\"\n ref={(el) => {\n if (el) {\n el.addEventListener('ended', () => {\n el.currentTime = 0;\n }, { once: true });\n }\n }}\n />\n\n {/* Duration */}\n <div className=\"media-duration\">\n 0:13\n </div>\n\n {/* Quick Actions */}\n <div className=\"media-actions\">\n {/* Play/Pause button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n const videoEl = e.currentTarget.parentElement?.parentElement?.querySelector('video');\n if (videoEl) {\n togglePlayPause(item, videoEl);\n }\n }}\n className=\"media-action-btn\"\n >\n {playingVideo === item.id ? (\n <Pause className=\"icon-sm\" />\n ) : (\n <Play className=\"icon-sm\" />\n )}\n </button>\n\n {/* Add button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onItemSelect(item, true);\n }}\n className=\"media-action-btn\"\n >\n <Plus className=\"icon-sm\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {/* Empty state */}\n {items.length === 0 && (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Wand2 className=\"empty-state-icon\" />\n <p className=\"empty-state-text\">No videos found</p>\n {searchQuery && (\n <p className=\"empty-state-subtext\">\n Try adjusting your search\n </p>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}","import type { PanelProps } from \"../../types\";\nimport { VideoPanel } from \"../panel/video-panel\";\nimport { useMediaPanel } from \"../../hooks/use-media-panel\";\n\nexport function VideoPanelContainer(props: PanelProps) {\n const {\n items,\n searchQuery,\n setSearchQuery,\n handleSelection,\n handleFileUpload,\n isLoading,\n acceptFileTypes,\n } = useMediaPanel(\"video\", {\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n },\n props.videoResolution);\n\n return (\n <VideoPanel\n items={items}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onItemSelect={handleSelection}\n onFileUpload={handleFileUpload}\n isLoading={isLoading}\n acceptFileTypes={acceptFileTypes}\n />\n );\n}\n","/**\n * TextPanel Component\n * \n * A panel for creating and editing text elements in the studio. Provides comprehensive\n * text styling options including font selection, size, colors, stroke, and shadow effects.\n * \n * @component\n * @param {Object} props\n * @param {string} props.textContent - Text content to display\n * @param {number} props.fontSize - Font size in pixels\n * @param {string} props.selectedFont - Selected font family\n * @param {boolean} props.isBold - Whether text is bold\n * @param {boolean} props.isItalic - Whether text is italic\n * @param {string} props.textColor - Text color in hex format\n * @param {string} props.strokeColor - Stroke color in hex format\n * @param {boolean} props.applyShadow - Whether to apply shadow effect\n * @param {string} props.shadowColor - Shadow color in hex format\n * @param {number} props.strokeWidth - Width of text stroke\n * @param {string[]} props.fonts - Available font options\n * @param {(text: string) => void} props.setTextContent - Update text content\n * @param {(size: number) => void} props.setFontSize - Update font size\n * @param {(font: string) => void} props.setSelectedFont - Update selected font\n * @param {(bold: boolean) => void} props.setIsBold - Toggle bold style\n * @param {(italic: boolean) => void} props.setIsItalic - Toggle italic style\n * @param {(color: string) => void} props.setTextColor - Update text color\n * @param {(color: string) => void} props.setStrokeColor - Update stroke color\n * @param {(apply: boolean) => void} props.setApplyShadow - Toggle shadow effect\n * @param {(color: string) => void} props.setShadowColor - Update shadow color\n * @param {(width: number) => void} props.setStrokeWidth - Update stroke width\n * @param {() => void} props.handleApplyChanges - Apply text element changes\n * \n * @example\n * ```tsx\n * <TextPanel\n * textContent=\"Sample Text\"\n * fontSize={48}\n * selectedFont=\"Arial\"\n * isBold={false}\n * isItalic={false}\n * textColor=\"#000000\"\n * strokeColor=\"#ffffff\"\n * applyShadow={false}\n * shadowColor=\"#000000\"\n * strokeWidth={0}\n * fonts={[\"Arial\", \"Times New Roman\"]}\n * setTextContent={setText}\n * setFontSize={setSize}\n * // ... other handlers\n * />\n * ```\n */\n\nimport type { TextPanelState, TextPanelActions } from \"../../hooks/use-text-panel\";\n\nexport type TextPanelProps = TextPanelState & TextPanelActions;\n\nexport function TextPanel({\n textContent,\n fontSize,\n selectedFont,\n isBold,\n isItalic,\n textColor,\n strokeColor,\n applyShadow,\n shadowColor,\n strokeWidth,\n fonts,\n operation,\n setTextContent,\n setFontSize,\n setSelectedFont,\n setIsBold,\n setIsItalic,\n setTextColor,\n setStrokeColor,\n setApplyShadow,\n setShadowColor,\n setStrokeWidth,\n handleApplyChanges,\n}: TextPanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Text</div>\n {/* Text Content */}\n <div className=\"flex panel-section\">\n <input\n type=\"text\"\n value={textContent}\n placeholder=\"Sample\"\n onChange={(e) => setTextContent(e.target.value)}\n className=\"input-dark\"\n />\n </div>\n\n {/* Font Size */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Font Size</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"8\"\n max=\"120\"\n value={fontSize}\n onChange={(e) => setFontSize(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{fontSize}px</span>\n </div>\n </div>\n\n {/* Font */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Font</label>\n <div className=\"font-controls\">\n <select\n value={selectedFont}\n onChange={(e) => setSelectedFont(e.target.value)}\n className=\"select-dark\"\n >\n {fonts.map((font) => (\n <option key={font} value={font}>\n {font}\n </option>\n ))}\n </select>\n <button\n onClick={() => setIsBold(!isBold)}\n className={`btn-icon ${isBold ? 'btn-icon-active' : ''}`}\n >\n B\n </button>\n <button\n onClick={() => setIsItalic(!isItalic)}\n className={`btn-icon ${isItalic ? 'btn-icon-active' : ''}`}\n >\n I\n </button>\n </div>\n </div>\n\n {/* Colors */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Colors</label>\n <div className=\"color-section\">\n {/* Text Color */}\n <div className=\"color-control\">\n <label className=\"label-small\">Text Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={textColor}\n onChange={(e) => setTextColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={textColor}\n onChange={(e) => setTextColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Stroke Color */}\n <div className=\"color-control\">\n <label className=\"label-small\">Stroke Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Apply Shadow */}\n <div className=\"checkbox-control\">\n <label className=\"checkbox-label\">\n <input\n type=\"checkbox\"\n checked={applyShadow}\n onChange={(e) => setApplyShadow(e.target.checked)}\n className=\"checkbox-purple\"\n />\n Apply Shadow\n </label>\n </div>\n\n {/* Shadow Color - Only shown when shadow is enabled */}\n {applyShadow && (\n <div className=\"color-control\">\n <label className=\"label-small\">Shadow Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={shadowColor}\n onChange={(e) => setShadowColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={shadowColor}\n onChange={(e) => setShadowColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Stroke Width */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Stroke Width</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"2\"\n step={0.1}\n value={strokeWidth}\n onChange={(e) => setStrokeWidth(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{strokeWidth}</span>\n </div>\n </div>\n\n {/* Operation button */}\n <div className=\"flex panel-section\">\n <button onClick={handleApplyChanges} className=\"btn-primary w-full\">\n {operation}\n </button>\n </div>\n </div>\n );\n}","import { useEffect, useState } from \"react\";\nimport { TextElement, TrackElement, type TextAlign } from \"@twick/timeline\";\nimport { AVAILABLE_TEXT_FONTS } from \"@twick/video-editor\";\n\nexport const DEFAULT_TEXT_PROPS = {\n text: \"Sample\",\n fontSize: 48,\n fontFamily: \"Poppins\",\n fontWeight: 400,\n fontStyle: \"normal\",\n textColor: \"#ffffff\",\n strokeColor: \"#4d4d4d\",\n strokeWidth: 0,\n applyShadow: false,\n shadowColor: \"#000000\",\n textAlign: \"center\" as TextAlign,\n shadowOffset: [0, 0],\n shadowBlur: 2,\n shadowOpacity: 1.0,\n};\n\nexport interface TextPanelState {\n textContent: string;\n fontSize: number;\n selectedFont: string;\n isBold: boolean;\n isItalic: boolean;\n textColor: string;\n strokeColor: string;\n applyShadow: boolean;\n shadowColor: string;\n strokeWidth: number;\n fonts: string[];\n operation: string;\n}\n\nexport interface TextPanelActions {\n setTextContent: (text: string) => void;\n setFontSize: (size: number) => void;\n setSelectedFont: (font: string) => void;\n setIsBold: (bold: boolean) => void;\n setIsItalic: (italic: boolean) => void;\n setTextColor: (color: string) => void;\n setStrokeColor: (color: string) => void;\n setApplyShadow: (shadow: boolean) => void;\n setShadowColor: (color: string) => void;\n setStrokeWidth: (width: number) => void;\n handleApplyChanges: () => void;\n}\n\nexport const useTextPanel = ({\n selectedElement,\n addElement,\n updateElement,\n}: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}): TextPanelState & TextPanelActions => {\n const [textContent, setTextContent] = useState(DEFAULT_TEXT_PROPS.text);\n const [fontSize, setFontSize] = useState(DEFAULT_TEXT_PROPS.fontSize);\n const [selectedFont, setSelectedFont] = useState(DEFAULT_TEXT_PROPS.fontFamily);\n const [isBold, setIsBold] = useState(DEFAULT_TEXT_PROPS.fontWeight === 700);\n const [isItalic, setIsItalic] = useState(DEFAULT_TEXT_PROPS.fontStyle === \"italic\");\n const [textColor, setTextColor] = useState(DEFAULT_TEXT_PROPS.textColor);\n const [strokeColor, setStrokeColor] = useState(DEFAULT_TEXT_PROPS.strokeColor);\n const [applyShadow, setApplyShadow] = useState(DEFAULT_TEXT_PROPS.applyShadow);\n const [shadowColor, setShadowColor] = useState(DEFAULT_TEXT_PROPS.shadowColor);\n const [strokeWidth, setStrokeWidth] = useState(DEFAULT_TEXT_PROPS.strokeWidth);\n\n const fonts = Object.values(AVAILABLE_TEXT_FONTS);\n\n const handleApplyChanges = async () => {\n let textElement;\n if (selectedElement instanceof TextElement) {\n textElement = selectedElement;\n textElement.setText(textContent);\n textElement.setFontSize(fontSize);\n textElement.setFontFamily(selectedFont);\n textElement.setFontWeight(isBold ? 700 : 400);\n textElement.setFontStyle(isItalic ? \"italic\" : \"normal\");\n textElement.setFill(textColor);\n textElement.setStrokeColor(strokeColor);\n textElement.setLineWidth(strokeWidth);\n textElement.setTextAlign(DEFAULT_TEXT_PROPS.textAlign);\n if (applyShadow) {\n textElement.setProps({\n ...textElement.getProps(),\n shadowColor,\n shadowOffset: DEFAULT_TEXT_PROPS.shadowOffset,\n shadowBlur: DEFAULT_TEXT_PROPS.shadowBlur,\n shadowOpacity: DEFAULT_TEXT_PROPS.shadowOpacity,\n });\n } else {\n textElement.setProps({\n ...textElement.getProps(),\n shadowColor: undefined,\n shadowOffset: undefined,\n shadowBlur: undefined,\n shadowOpacity: undefined,\n });\n }\n updateElement(textElement);\n } else {\n textElement = new TextElement(textContent)\n .setFontSize(fontSize)\n .setFontFamily(selectedFont)\n .setFontWeight(isBold ? 700 : 400)\n .setFontStyle(isItalic ? \"italic\" : \"normal\")\n .setFill(textColor)\n .setStrokeColor(strokeColor)\n .setLineWidth(strokeWidth)\n .setTextAlign(\"center\");\n\n if (applyShadow) {\n textElement.setProps({\n ...textElement.getProps(),\n shadowColor,\n shadowOffset: DEFAULT_TEXT_PROPS.shadowOffset,\n shadowBlur: DEFAULT_TEXT_PROPS.shadowBlur,\n shadowOpacity: DEFAULT_TEXT_PROPS.shadowOpacity,\n });\n }\n await addElement(textElement);\n }\n };\n\n useEffect(() => {\n if (selectedElement instanceof TextElement) {\n setTextContent(selectedElement.getText());\n const textProps = selectedElement.getProps();\n setSelectedFont(textProps.fontFamily ?? DEFAULT_TEXT_PROPS.fontFamily);\n setFontSize(textProps.fontSize ?? DEFAULT_TEXT_PROPS.fontSize);\n setIsBold(textProps.fontWeight === 700);\n setIsItalic(textProps.fontStyle === \"italic\");\n setTextColor(textProps.fill ?? DEFAULT_TEXT_PROPS.textColor);\n setStrokeColor(textProps.stroke ?? DEFAULT_TEXT_PROPS.strokeColor);\n setStrokeWidth(textProps.lineWidth ?? DEFAULT_TEXT_PROPS.strokeWidth);\n const hasShadow = textProps.shadowColor !== undefined;\n setApplyShadow(hasShadow);\n if (hasShadow) {\n setShadowColor(textProps.shadowColor ?? DEFAULT_TEXT_PROPS.shadowColor);\n }\n } else {\n setTextContent(DEFAULT_TEXT_PROPS.text);\n setFontSize(DEFAULT_TEXT_PROPS.fontSize);\n setSelectedFont(DEFAULT_TEXT_PROPS.fontFamily);\n setIsBold(DEFAULT_TEXT_PROPS.fontWeight === 700);\n setIsItalic(DEFAULT_TEXT_PROPS.fontStyle === \"italic\");\n setTextColor(DEFAULT_TEXT_PROPS.textColor);\n setStrokeColor(DEFAULT_TEXT_PROPS.strokeColor);\n setStrokeWidth(DEFAULT_TEXT_PROPS.strokeWidth);\n setApplyShadow(DEFAULT_TEXT_PROPS.applyShadow);\n setShadowColor(DEFAULT_TEXT_PROPS.shadowColor);\n }\n }, [selectedElement]);\n\n return {\n textContent,\n fontSize,\n selectedFont,\n isBold,\n isItalic,\n textColor,\n strokeColor,\n applyShadow,\n shadowColor,\n strokeWidth,\n fonts,\n operation: selectedElement instanceof TextElement ? \"Apply Changes\": \"Add Text\",\n setTextContent,\n setFontSize,\n setSelectedFont,\n setIsBold,\n setIsItalic,\n setTextColor,\n setStrokeColor,\n setApplyShadow,\n setShadowColor,\n setStrokeWidth,\n handleApplyChanges,\n };\n};\n","import { TrackElement } from \"@twick/timeline\";\nimport { TextPanel } from \"../panel/text-panel\";\nimport { useTextPanel } from \"../../hooks/use-text-panel\";\n\ninterface TextPanelContainerProps {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}\n\nexport function TextPanelContainer(props: TextPanelContainerProps) {\n const textPanelProps = useTextPanel(props);\n return <TextPanel {...textPanelProps} />;\n}\n","/**\n * IconPanel Component\n *\n * A panel for browsing, searching, and adding icons to the studio timeline.\n * Features a searchable grid of SVG icons with preview, add, and download actions.\n * Supports infinite scrolling with \"Load More\" functionality.\n *\n * @component\n * @param {Object} props\n * @param {Icon[]} props.icons - List of icons to display\n * @param {boolean} props.loading - Loading state indicator\n * @param {boolean} props.hasMore - Whether more icons can be loaded\n * @param {number} props.totalIcons - Total number of available icons\n * @param {string} props.searchQuery - Current search query\n * @param {(query: string) => void} props.handleSearch - Handle search query changes\n * @param {(icon: Icon) => void} props.handleSelection - Handle icon selection\n * @param {(icon: Icon) => void} props.handleDownloadIcon - Handle icon download\n * @param {() => void} props.handleLoadMore - Load more icons\n *\n * @example\n * ```tsx\n * <IconPanel\n * icons={icons}\n * loading={false}\n * hasMore={true}\n * totalIcons={1000}\n * searchQuery=\"\"\n * handleSearch={setSearchQuery}\n * handleSelection={addIconToTimeline}\n * handleDownloadIcon={downloadSvg}\n * handleLoadMore={loadNextPage}\n * />\n * ```\n */\n\nimport { Loader2, Download, Plus } from \"lucide-react\";\nimport type {\n IconPanelState,\n IconPanelActions,\n Icon,\n} from \"../../hooks/use-icon-panel\";\nimport SearchInput from \"../shared/search-input\";\n\nexport type IconPanelProps = IconPanelState & IconPanelActions;\n\nexport function IconPanel({\n icons,\n loading,\n totalIcons,\n searchQuery,\n handleSearch,\n handleSelection,\n handleDownloadIcon,\n handleLoadMore,\n}: IconPanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Icon Library</div>\n\n {/* Search */}\n <div className=\"flex panel-section\">\n <SearchInput searchQuery={searchQuery} setSearchQuery={handleSearch} />\n </div>\n\n {/* Icons Grid */}\n <div className=\"media-content\">\n {/* Results Count */}\n {totalIcons > 0 && (\n <div className=\"media-count\">\n Showing {icons.length} of {totalIcons} icons\n </div>\n )}\n\n {/* Loading State */}\n {loading && icons.length === 0 ? (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Loader2 className=\"empty-state-icon animate-spin\" />\n <p className=\"empty-state-text\">Loading icons...</p>\n </div>\n </div>\n ) : (\n <div className=\"icon-grid\">\n {(icons || []).map((icon: Icon, index: number) => (\n <div key={index} className=\"icon-item\">\n <div\n onClick={() => handleSelection(icon)}\n className=\"icon-content\"\n dangerouslySetInnerHTML={{ __html: icon.svg }}\n />\n\n {/* Quick Actions */}\n <div className=\"icon-actions\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleSelection(icon);\n }}\n className=\"icon-action-btn\"\n title=\"Add to timeline\"\n >\n <Plus className=\"icon-sm\" />\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDownloadIcon(icon);\n }}\n className=\"icon-action-btn\"\n title=\"Download SVG\"\n >\n <Download className=\"icon-sm\" />\n </button>\n </div>\n\n {/* Icon name */}\n <div className=\"icon-name\">{icon.name}</div>\n </div>\n ))}\n </div>\n )}\n\n {/* Empty State */}\n {!loading && icons.length === 0 && searchQuery && (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <p className=\"empty-state-text\">No icons found</p>\n <p className=\"empty-state-subtext\">Try a different search term</p>\n </div>\n </div>\n )}\n\n {!loading && totalIcons && icons.length < totalIcons && (\n <div className=\"flex panel-section\">\n <button\n onClick={handleLoadMore}\n disabled={loading}\n className=\"btn-primary\"\n >\n Load More Icons\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect } from \"react\";\nimport { IconElement, TrackElement } from \"@twick/timeline\";\n\nexport interface Icon {\n name: string;\n svg: string;\n}\n\nexport interface IconPanelState {\n icons: Icon[];\n loading: boolean;\n hasMore: boolean;\n totalIcons: number;\n searchQuery: string;\n}\n\nexport interface IconPanelActions {\n handleSearch: (query: string) => void;\n handleSelection: (icon: Icon) => void;\n handleDownloadIcon: (icon: Icon) => void;\n handleLoadMore: () => void;\n}\n\nconst ICONS_PER_PAGE = 20;\n\nexport const useIconPanel = ({\n selectedElement,\n addElement,\n updateElement,\n}: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}): IconPanelState & IconPanelActions => {\n const [icons, setIcons] = useState<Icon[]>([]);\n const [loading, setLoading] = useState(false);\n const [page, setPage] = useState(1);\n const [hasMore, setHasMore] = useState(true);\n const [totalIcons, setTotalIcons] = useState(0);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const currentQuery = useRef(\"\");\n\n const fetchIcons = async (query: string, reset = false) => {\n try {\n setLoading(true);\n const newPage = reset ? 1 : page;\n const start = (newPage - 1) * ICONS_PER_PAGE;\n const url = `https://api.iconify.design/search?query=${query}&limit=${ICONS_PER_PAGE}&offset=${start}`;\n\n const response = await fetch(url);\n const data = await response.json();\n\n const iconData = data.icons || [];\n const total = data.total || 0;\n setTotalIcons(total);\n\n const formattedIcons = await Promise.all(\n iconData.map(async (icon: any) => {\n const svgUrl = `https://api.iconify.design/${icon}.svg`;\n\n try {\n const svgResponse = await fetch(svgUrl);\n const svg = await svgResponse.text();\n return { name: icon, svg };\n } catch (e) {\n console.error(`Error fetching SVG for ${icon}:`, e);\n return null;\n }\n })\n );\n\n const validIcons = formattedIcons.filter((icon) => icon !== null) as Icon[];\n\n if (reset) {\n setIcons(validIcons);\n } else {\n setIcons([...icons, ...validIcons]);\n }\n\n setHasMore(start + validIcons.length < total);\n if (!reset) {\n setPage(newPage + 1);\n } else {\n setPage(2);\n }\n } catch (error) {\n console.error(\"Error fetching icons:\", error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchIcons(\"media\", true);\n }, []);\n\n const handleSearch = (query: string) => {\n currentQuery.current = query;\n setSearchQuery(query);\n fetchIcons(query, true);\n };\n\n const handleSelection = (icon: Icon) => {\n const svgBlob = new Blob([icon.svg], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(svgBlob);\n\n let iconElement;\n if (selectedElement instanceof IconElement) {\n iconElement = selectedElement;\n iconElement.setSrc(url);\n iconElement.setName(icon.name);\n updateElement?.(iconElement);\n } else {\n iconElement = new IconElement(url, {\n width: 100,\n height: 100,\n });\n iconElement.setName(icon.name);\n addElement?.(iconElement);\n }\n\n URL.revokeObjectURL(url);\n };\n\n const handleDownloadIcon = (icon: Icon) => {\n const blob = new Blob([icon.svg], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${icon.name}.svg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n const handleLoadMore = () => {\n fetchIcons(currentQuery.current, false);\n };\n\n return {\n icons,\n loading,\n hasMore,\n totalIcons,\n searchQuery,\n handleSearch,\n handleSelection,\n handleDownloadIcon,\n handleLoadMore,\n };\n};\n","import type { PanelProps } from \"../../types\";\nimport { IconPanel } from \"../panel/icon-panel\";\nimport { useIconPanel } from \"../../hooks/use-icon-panel\";\n\nexport function IconPanelContainer(props: PanelProps) {\n const iconPanelProps = useIconPanel({\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n });\n return <IconPanel {...iconPanelProps} />;\n}","/**\n * RectPanel Component\n * \n * A panel for creating and editing rectangle shapes in the studio. Provides controls\n * for adjusting corner radius, fill color, opacity, stroke color, and line width.\n * \n * @component\n * @param {Object} props\n * @param {number} props.cornerRadius - Corner radius in pixels\n * @param {string} props.fillColor - Fill color in hex format\n * @param {number} props.opacity - Opacity percentage (0-100)\n * @param {string} props.strokeColor - Stroke color in hex format\n * @param {number} props.lineWidth - Stroke width in pixels\n * @param {(radius: number) => void} props.setCornerRadius - Update corner radius\n * @param {(color: string) => void} props.setFillColor - Update fill color\n * @param {(opacity: number) => void} props.setOpacity - Update opacity\n * @param {(color: string) => void} props.setStrokeColor - Update stroke color\n * @param {(width: number) => void} props.setLineWidth - Update line width\n * @param {() => void} props.handleApplyChanges - Apply rectangle element changes\n * \n * @example\n * ```tsx\n * <RectPanel\n * cornerRadius={10}\n * fillColor=\"#ff0000\"\n * opacity={100}\n * strokeColor=\"#000000\"\n * lineWidth={2}\n * setCornerRadius={setRadius}\n * setFillColor={setFill}\n * setOpacity={setOpacity}\n * setStrokeColor={setStroke}\n * setLineWidth={setWidth}\n * handleApplyChanges={applyChanges}\n * />\n * ```\n */\n\nimport type { RectPanelState, RectPanelActions } from \"../../hooks/use-rect-panel\";\n\nexport type RectPanelProps = RectPanelState & RectPanelActions;\n\nexport function RectPanel({\n cornerRadius,\n fillColor,\n opacity,\n strokeColor,\n lineWidth,\n operation,\n setCornerRadius,\n setFillColor,\n setOpacity,\n setStrokeColor,\n setLineWidth,\n handleApplyChanges,\n}: RectPanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Rectangle</div>\n {/* Corner Radius */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Corner Radius</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={cornerRadius}\n onChange={(e) => setCornerRadius(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{cornerRadius}px</span>\n </div>\n </div>\n\n {/* Fill Color */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Fill Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={fillColor}\n onChange={(e) => setFillColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={fillColor}\n onChange={(e) => setFillColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Opacity */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Opacity</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={opacity}\n onChange={(e) => setOpacity(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{opacity}%</span>\n </div>\n </div>\n\n {/* Stroke Color */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Stroke Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Line Width */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Line Width</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"20\"\n value={lineWidth}\n onChange={(e) => setLineWidth(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{lineWidth}px</span>\n </div>\n </div>\n\n {/* Operation button */}\n <div className=\"flex panel-section\">\n <button\n onClick={handleApplyChanges}\n className=\"btn-primary w-full\"\n >\n {operation}\n </button>\n </div>\n </div>\n );\n}","import { useEffect, useState } from \"react\";\nimport { RectElement, TrackElement } from \"@twick/timeline\";\n\nexport const DEFAULT_RECT_PROPS = {\n cornerRadius: 0,\n fillColor: \"#3b82f6\",\n opacity: 100,\n strokeColor: \"#000000\",\n lineWidth: 0,\n};\n\nexport interface RectPanelState {\n cornerRadius: number;\n fillColor: string;\n opacity: number;\n strokeColor: string;\n lineWidth: number;\n operation: string;\n}\n\nexport interface RectPanelActions {\n setCornerRadius: (radius: number) => void;\n setFillColor: (color: string) => void;\n setOpacity: (opacity: number) => void;\n setStrokeColor: (color: string) => void;\n setLineWidth: (width: number) => void;\n handleApplyChanges: () => void;\n}\n\nexport const useRectPanel = ({\n selectedElement,\n addElement,\n updateElement,\n}: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}): RectPanelState & RectPanelActions => {\n const [cornerRadius, setCornerRadius] = useState(DEFAULT_RECT_PROPS.cornerRadius);\n const [fillColor, setFillColor] = useState(DEFAULT_RECT_PROPS.fillColor);\n const [opacity, setOpacity] = useState(DEFAULT_RECT_PROPS.opacity);\n const [strokeColor, setStrokeColor] = useState(DEFAULT_RECT_PROPS.strokeColor);\n const [lineWidth, setLineWidth] = useState(DEFAULT_RECT_PROPS.lineWidth);\n\n const handleApplyChanges = () => {\n let rectElement;\n if (selectedElement instanceof RectElement) {\n rectElement = selectedElement;\n rectElement.setCornerRadius(cornerRadius);\n rectElement.setOpacity(opacity);\n rectElement.setStrokeColor(strokeColor);\n rectElement.setLineWidth(lineWidth);\n updateElement?.(rectElement);\n } else {\n rectElement = new RectElement(fillColor, { width: 200, height: 200 })\n .setCornerRadius(cornerRadius)\n .setOpacity(opacity)\n .setStrokeColor(strokeColor)\n .setLineWidth(lineWidth);\n addElement?.(rectElement);\n }\n };\n\n useEffect(() => {\n if (selectedElement instanceof RectElement) {\n setCornerRadius(selectedElement.getCornerRadius() ?? DEFAULT_RECT_PROPS.cornerRadius);\n setFillColor(selectedElement.getFill() ?? DEFAULT_RECT_PROPS.fillColor);\n setOpacity(selectedElement.getOpacity() ?? DEFAULT_RECT_PROPS.opacity);\n setStrokeColor(selectedElement.getStrokeColor() ?? DEFAULT_RECT_PROPS.strokeColor);\n setLineWidth(selectedElement.getLineWidth() ?? DEFAULT_RECT_PROPS.lineWidth);\n }\n }, [selectedElement]);\n\n return {\n cornerRadius,\n fillColor,\n opacity,\n strokeColor,\n lineWidth,\n operation: selectedElement instanceof RectElement ? \"Apply Changes\": \"Add Rectangle\",\n setCornerRadius,\n setFillColor,\n setOpacity,\n setStrokeColor,\n setLineWidth,\n handleApplyChanges,\n };\n};\n","import type { PanelProps } from \"../../types\";\nimport { RectPanel } from \"../panel/rect-panel\";\nimport { useRectPanel } from \"../../hooks/use-rect-panel\";\n\nexport function RectPanelContainer(props: PanelProps) {\n const rectPanelProps = useRectPanel({\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n });\n return <RectPanel {...rectPanelProps} />;\n}\n","/**\n * CirclePanel Component\n *\n * A panel for creating and editing circle shapes in the studio. Provides controls\n * for adjusting radius, fill color, opacity, stroke color, and line width.\n *\n * @component\n * @param {Object} props\n * @param {number} props.radius - Circle radius in pixels\n * @param {string} props.fillColor - Fill color in hex format\n * @param {number} props.opacity - Opacity percentage (0-100)\n * @param {string} props.strokeColor - Stroke color in hex format\n * @param {number} props.lineWidth - Stroke width in pixels\n * @param {(radius: number) => void} props.setRadius - Update circle radius\n * @param {(color: string) => void} props.setFillColor - Update fill color\n * @param {(opacity: number) => void} props.setOpacity - Update opacity\n * @param {(color: string) => void} props.setStrokeColor - Update stroke color\n * @param {(width: number) => void} props.setLineWidth - Update line width\n * @param {() => void} props.handleApplyChanges - Apply circle element changes\n *\n * @example\n * ```tsx\n * <CirclePanel\n * radius={50}\n * fillColor=\"#ff0000\"\n * opacity={100}\n * strokeColor=\"#000000\"\n * lineWidth={2}\n * setRadius={setRadius}\n * setFillColor={setFill}\n * setOpacity={setOpacity}\n * setStrokeColor={setStroke}\n * setLineWidth={setWidth}\n * handleApplyChanges={applyChanges}\n * />\n * ```\n */\n\nimport type {\n CirclePanelState,\n CirclePanelActions,\n} from \"../../hooks/use-circle-panel\";\n\nexport type CirclePanelProps = CirclePanelState & CirclePanelActions;\n\nexport function CirclePanel({\n radius,\n fillColor,\n opacity,\n strokeColor,\n lineWidth,\n operation,\n setRadius,\n setFillColor,\n setOpacity,\n setStrokeColor,\n setLineWidth,\n handleApplyChanges,\n}: CirclePanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Circle</div>\n {/* Radius */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Radius</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"10\"\n max=\"300\"\n value={radius}\n onChange={(e) => setRadius(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{radius}px</span>\n </div>\n </div>\n\n {/* Fill Color */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Fill Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={fillColor}\n onChange={(e) => setFillColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={fillColor}\n onChange={(e) => setFillColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Opacity */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Opacity</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={opacity}\n onChange={(e) => setOpacity(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{opacity}%</span>\n </div>\n </div>\n\n {/* Stroke Color */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Stroke Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Line Width */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Line Width</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"20\"\n value={lineWidth}\n onChange={(e) => setLineWidth(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{lineWidth}px</span>\n </div>\n </div>\n\n {/* Operation button */}\n <div className=\"flex panel-section\">\n <button onClick={handleApplyChanges} className=\"btn-primary w-full\">\n {operation}\n </button>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { CircleElement, TrackElement } from \"@twick/timeline\";\n\nexport const DEFAULT_CIRCLE_PROPS = {\n radius: 50,\n fillColor: \"#3b82f6\",\n opacity: 100,\n strokeColor: \"#000000\",\n lineWidth: 0,\n};\n\nexport interface CirclePanelState {\n radius: number;\n fillColor: string;\n opacity: number;\n strokeColor: string;\n lineWidth: number;\n operation: string;\n}\n\nexport interface CirclePanelActions {\n setRadius: (radius: number) => void;\n setFillColor: (color: string) => void;\n setOpacity: (opacity: number) => void;\n setStrokeColor: (color: string) => void;\n setLineWidth: (width: number) => void;\n handleApplyChanges: () => void;\n}\n\nexport const useCirclePanel = ({\n selectedElement,\n addElement,\n updateElement,\n}: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}): CirclePanelState & CirclePanelActions => {\n const [radius, setRadius] = useState(DEFAULT_CIRCLE_PROPS.radius);\n const [fillColor, setFillColor] = useState(DEFAULT_CIRCLE_PROPS.fillColor);\n const [opacity, setOpacity] = useState(DEFAULT_CIRCLE_PROPS.opacity);\n const [strokeColor, setStrokeColor] = useState(DEFAULT_CIRCLE_PROPS.strokeColor);\n const [lineWidth, setLineWidth] = useState(DEFAULT_CIRCLE_PROPS.lineWidth);\n\n const handleApplyChanges = () => {\n let circleElement;\n if (selectedElement instanceof CircleElement) {\n circleElement = selectedElement;\n circleElement.setRadius(radius);\n circleElement.setFill(fillColor);\n circleElement.setOpacity(opacity);\n circleElement.setStrokeColor(strokeColor);\n circleElement.setLineWidth(lineWidth);\n updateElement?.(circleElement);\n } else {\n circleElement = new CircleElement(fillColor, radius)\n .setOpacity(opacity)\n .setStrokeColor(strokeColor)\n .setLineWidth(lineWidth);\n addElement?.(circleElement);\n }\n };\n\n useEffect(() => {\n if (selectedElement instanceof CircleElement) {\n setRadius(selectedElement.getRadius() ?? DEFAULT_CIRCLE_PROPS.radius);\n setFillColor(selectedElement.getFill() ?? DEFAULT_CIRCLE_PROPS.fillColor);\n setOpacity(selectedElement.getOpacity() ?? DEFAULT_CIRCLE_PROPS.opacity);\n setStrokeColor(selectedElement.getStrokeColor() ?? DEFAULT_CIRCLE_PROPS.strokeColor);\n setLineWidth(selectedElement.getLineWidth() ?? DEFAULT_CIRCLE_PROPS.lineWidth);\n }\n }, [selectedElement]);\n\n return {\n radius,\n fillColor,\n opacity,\n strokeColor,\n lineWidth,\n operation: selectedElement instanceof CircleElement ? \"Apply Changes\": \"Add Circle\",\n setRadius,\n setFillColor,\n setOpacity,\n setStrokeColor,\n setLineWidth,\n handleApplyChanges,\n };\n};\n","import type { PanelProps } from \"../../types\";\nimport { CirclePanel } from \"../panel/circle-panel\";\nimport { useCirclePanel } from \"../../hooks/use-circle-panel\";\n\nexport function CirclePanelContainer(props: PanelProps) {\n const circlePanelProps = useCirclePanel({\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n });\n return <CirclePanel {...circlePanelProps} />;\n}","import { SubtitlesPanel } from \"../panel/subtitles-panel\";\nimport { Size, TrackElement } from \"@twick/timeline\";\nimport { AudioPanelContainer } from \"./audio-panel-container\";\nimport { ImagePanelContainer } from \"./image-panel-container\";\nimport { VideoPanelContainer } from \"./video-panel-container\";\nimport { TextPanelContainer } from \"./text-panel-container\";\nimport { IconPanelContainer } from \"./icon-panel-container\";\nimport { RectPanelContainer } from \"./rect-panel-container\";\nimport { CirclePanelContainer } from \"./circle-panel-container\";\nimport { Wand2 } from \"lucide-react\";\n\ninterface ElementPanelContainerProps {\n selectedTool: string;\n selectedElement: TrackElement | null;\n videoResolution: Size;\n setSelectedTool: (tool: string) => void;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}\n\nconst ElementPanelContainer = ({\n selectedTool,\n setSelectedTool,\n videoResolution,\n selectedElement,\n addElement,\n updateElement,\n}: ElementPanelContainerProps): JSX.Element => {\n const addNewElement = async (element: TrackElement) => {\n await addElement(element);\n if (![\"image\", \"video\", \"audio\"].includes(selectedTool)) {\n setSelectedTool(\"none\");\n }\n };\n\n // Render appropriate library based on selected tool\n const renderLibrary = () => {\n switch (selectedTool) {\n case \"image\":\n return (\n <ImagePanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"audio\":\n return (\n <AudioPanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"video\":\n return (\n <VideoPanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"text\":\n return (\n <TextPanelContainer\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"icon\":\n return (\n <IconPanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"rect\":\n return (\n <RectPanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"circle\":\n return (\n <CirclePanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"subtitle\":\n return <SubtitlesPanel />;\n default:\n return (\n <div className=\"panel-container\">\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Wand2 className=\"empty-state-icon\" />\n <p className=\"empty-state-text\">Select a Tool to Begin</p>\n </div>\n </div>\n </div>\n );\n }\n };\n\n return renderLibrary();\n};\n\nexport default ElementPanelContainer;\n","/**\n * PropsToolbar Component\n *\n * A vertical toolbar that provides quick access to different property sections\n * for the selected element. Displays icons for each section.\n *\n * @component\n * @param {Object} props\n * @param {TrackElement} props.selectedElement - The currently selected element to display properties for\n * @param {string} props.selectedProp - The currently selected property to display\n * @param {Function} props.setSelectedProp - The function to set the currently selected property\n *\n * @example\n * ```tsx\n * <PropsToolbar\n * selectedElement={someElement}\n * selectedProp={someProp}\n * setSelectedProp={someFunction}\n * />\n * ```\n */\n\nimport {\n Type,\n Image,\n Music,\n Infinity,\n Zap,\n MessageSquare,\n Plus,\n Settings,\n SparklesIcon,\n} from \"lucide-react\";\nimport type { ToolCategory } from \"../types\";\nimport {\n AudioElement,\n CaptionElement,\n CircleElement,\n IconElement,\n ImageElement,\n RectElement,\n TextElement,\n TrackElement,\n VideoElement,\n} from \"@twick/timeline\";\nimport { useEffect, useMemo } from \"react\";\n\nconst propsCategories: Map<string, ToolCategory> = new Map([\n [\n \"element-props\",\n {\n id: \"element-props\",\n name: \"Properties\",\n icon: \"Settings\",\n description: \"Element Properties\",\n },\n ],\n [\n \"animations\",\n {\n id: \"animations\",\n name: \"Animations\",\n icon: \"Zap\",\n description: \"Animations\",\n },\n ],\n [\n \"text-effects\",\n {\n id: \"text-effects\",\n name: \"Text Effects\",\n icon: \"SparklesIcon\",\n description: \"Text Effects\",\n },\n ],\n [\n \"color-effects\",\n {\n id: \"color-effects\",\n name: \"Color Effects\",\n icon: \"Image\",\n description: \"Color Effects\",\n },\n ],\n [\n \"playback-props\",\n {\n id: \"playback-props\",\n name: \"Playback Props\",\n icon: \"Music\",\n description: \"Playback Properties\",\n },\n ],\n [\n \"subtitle-style\",\n {\n id: \"subtitle-style\",\n name: \"Subtitle Style\",\n icon: \"MessageSquare\",\n description: \"Subtitle Style\",\n },\n ],\n]);\n\nconst getIcon = (iconName: string) => {\n switch (iconName) {\n case \"Type\":\n return Type;\n case \"Infinity\":\n return Infinity;\n case \"Image\":\n return Image;\n case \"Music\":\n return Music;\n case \"MessageSquare\":\n return MessageSquare;\n case \"Settings\":\n return Settings;\n case \"SparklesIcon\":\n return SparklesIcon;\n case \"Zap\":\n return Zap;\n default:\n return Plus;\n }\n};\n\nexport function PropsToolbar({\n selectedElement,\n selectedProp,\n setSelectedProp,\n}: {\n selectedElement: TrackElement | null;\n selectedProp: string;\n setSelectedProp: (prop: string) => void;\n}) {\n const availableSections = useMemo(() => {\n const sections: ToolCategory[] = [];\n if (selectedElement instanceof TextElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n sections.push(propsCategories.get(\"text-effects\")!);\n } else if (selectedElement instanceof ImageElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n sections.push(propsCategories.get(\"color-effects\")!);\n } else if (selectedElement instanceof VideoElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n sections.push(propsCategories.get(\"color-effects\")!);\n sections.push(propsCategories.get(\"playback-props\")!);\n } else if (selectedElement instanceof AudioElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"playback-props\")!);\n } else if (selectedElement instanceof CircleElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n } else if (selectedElement instanceof RectElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n } else if (selectedElement instanceof IconElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n } else if (selectedElement instanceof CaptionElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n sections.push(propsCategories.get(\"subtitle-style\")!);\n }\n return sections;\n }, [selectedElement]);\n\n useEffect(() => {\n if (availableSections?.length) {\n if (\n availableSections.map((section) => section.id).indexOf(selectedProp) ===\n -1\n ) {\n setSelectedProp(availableSections[0].id);\n }\n }\n }, [availableSections]);\n \n return (\n <div className=\"sidebar\">\n {/* Main Tools */}\n {availableSections.map((tool) => {\n const Icon = getIcon(tool.icon);\n const isSelected = selectedProp === tool.id;\n return (\n <div\n key={tool.id}\n onClick={() => setSelectedProp(tool.id)}\n className={`toolbar-btn ${isSelected ? \"active\" : \"\"}`}\n title={`${tool.name}${tool.shortcut ? ` (${tool.shortcut})` : \"\"}`}\n >\n <Icon className=\"icon-sm\" />\n <span className=\"props-toolbar-label\">{tool.name}</span>\n </div>\n );\n })}\n </div>\n );\n}\n","import type { PropertiesPanelProps } from \"../../types\";\n\nexport function ElementProps({ selectedElement, updateElement }: PropertiesPanelProps) {\n const elementProps = selectedElement?.getProps() || {};\n const {x, y, opacity, rotation} = elementProps;\n\n const handleUpdateElement = (props: Record<string, any>) => {\n if(selectedElement) {\n updateElement?.(selectedElement?.setProps({...elementProps,...props}));\n }\n }\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">All Properties</div>\n <div className=\"panel-section\">\n <label className=\"label-dark\">Position</label>\n <div className=\"flex-container\">\n <div>\n <label className=\"label-small\">X</label>\n <input\n type=\"number\"\n value={x ?? 0}\n onChange={(e) => handleUpdateElement({ x: Number(e.target.value)})}\n className=\"input-dark\"\n />\n </div>\n <div>\n <label className=\"label-small\">Y</label>\n <input\n type=\"number\"\n value={y ?? 0}\n onChange={(e) => handleUpdateElement({ y: Number(e.target.value)})}\n className=\"input-dark\"\n />\n </div>\n </div>\n </div>\n\n {/* Opacity */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Opacity</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={(opacity ?? 1) * 100}\n onChange={(e) => handleUpdateElement({ opacity: Number(e.target.value) / 100})}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{Math.round((opacity ?? 1) * 100)}%</span>\n </div>\n </div>\n\n {/* Rotation */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Rotation</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"360\"\n value={rotation ?? 0}\n onChange={(e) => handleUpdateElement({ rotation: Number(e.target.value)})}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{rotation ?? 0}°</span>\n </div>\n </div>\n </div>\n );\n}\n","import { TEXT_EFFECTS } from \"@twick/video-editor\";\nimport { ElementTextEffect, TextElement } from \"@twick/timeline\";\nimport type { PropertiesPanelProps } from \"../../types\";\n\nexport function TextEffects({\n selectedElement,\n updateElement,\n}: PropertiesPanelProps) {\n if (!(selectedElement instanceof TextElement)) return null;\n\n const currentEffect = selectedElement.getTextEffect();\n\n const handleUpdateEffect = (props: {\n name?: string;\n delay?: number;\n duration?: number;\n bufferTime?: number;\n }) => {\n if (!selectedElement || !(selectedElement instanceof TextElement)) return;\n\n let effect = currentEffect;\n\n // If name is provided and empty, remove effect\n if (props.name === \"\") {\n selectedElement.setTextEffect(undefined);\n updateElement?.(selectedElement);\n return;\n }\n\n // Create new effect if none exists or name is changing\n if (!effect || (props.name && props.name !== effect.getName())) {\n effect = new ElementTextEffect(\n props.name || currentEffect?.getName() || TEXT_EFFECTS[0].name\n );\n // Set default values for new effect\n effect.setDelay(0);\n effect.setDuration(1);\n effect.setBufferTime(0.1);\n }\n\n // Update effect properties\n if (props.delay !== undefined) effect.setDelay(props.delay);\n if (props.duration !== undefined) effect.setDuration(props.duration);\n if (props.bufferTime !== undefined) effect.setBufferTime(props.bufferTime);\n\n // Update element with new/modified effect\n selectedElement.setTextEffect(effect);\n updateElement?.(selectedElement);\n };\n\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Text Effects</div>\n {/* Text Effect Selection */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Text Effect Type</label>\n <select\n value={currentEffect?.getName() || \"\"}\n onChange={(e) => handleUpdateEffect({ name: e.target.value })}\n className=\"select-dark w-full\"\n >\n <option value=\"\">No Effect</option>\n {TEXT_EFFECTS.map((effect) => (\n <option key={effect.name} value={effect.name}>\n {effect.name.charAt(0).toUpperCase() + effect.name.slice(1)}\n </option>\n ))}\n </select>\n </div>\n\n {/* Text Effect Options */}\n {currentEffect && (\n <>\n {/* Delay */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Delay (seconds)</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"5\"\n step=\"0.1\"\n value={currentEffect.getDelay() ?? 0}\n onChange={(e) =>\n handleUpdateEffect({ delay: Number(e.target.value) })\n }\n className=\"input-dark\"\n />\n </div>\n\n {/* Duration */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Duration (seconds)</label>\n <input\n type=\"number\"\n min=\"0.1\"\n max=\"10\"\n step=\"0.1\"\n value={currentEffect.getDuration() ?? 1}\n onChange={(e) =>\n handleUpdateEffect({ duration: Number(e.target.value) })\n }\n className=\"input-dark\"\n />\n </div>\n\n {/* Buffer Time */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Buffer Time (seconds)</label>\n <input\n type=\"number\"\n min=\"0.05\"\n max=\"1\"\n step=\"0.05\"\n value={currentEffect.getBufferTime() ?? 0.1}\n onChange={(e) =>\n handleUpdateEffect({ bufferTime: Number(e.target.value) })\n }\n className=\"input-dark\"\n />\n </div>\n </>\n )}\n </div>\n );\n}\n","import { ANIMATIONS } from \"@twick/video-editor\";\nimport { ElementAnimation, TrackElement } from \"@twick/timeline\";\nimport type { PropertiesPanelProps } from \"../../types\";\n\nexport function Animation({\n selectedElement,\n updateElement,\n}: PropertiesPanelProps) {\n if (!(selectedElement instanceof TrackElement)) return null;\n\n const currentAnimation = selectedElement?.getAnimation();\n\n const handleUpdateAnimation = (props: {\n name?: string;\n interval?: number;\n duration?: number;\n intensity?: number;\n animate?: \"enter\" | \"exit\" | \"both\";\n mode?: \"in\" | \"out\";\n direction?: \"up\" | \"down\" | \"left\" | \"right\" | \"center\";\n }) => {\n if (!selectedElement) return;\n\n let animation = currentAnimation;\n\n // If name is provided and empty, remove animation\n if (props.name === \"\") {\n selectedElement.setAnimation(undefined);\n updateElement?.(selectedElement);\n return;\n }\n\n // Find animation definition\n const animationDef = ANIMATIONS.find(\n (a) => a.name === (props.name || currentAnimation?.getName())\n );\n if (!animationDef) return;\n\n // Create new animation if none exists or name is changing\n if (!animation || (props.name && props.name !== animation.getName())) {\n animation = new ElementAnimation(\n props.name || currentAnimation?.getName() || ANIMATIONS[0].name\n );\n // Set default values for new animation\n animation.setInterval(animationDef.interval || 1);\n animation.setDuration(animationDef.duration || 1);\n animation.setIntensity(animationDef.intensity || 1);\n animation.setAnimate(animationDef.animate || \"enter\");\n if (animationDef.mode) animation.setMode(animationDef.mode);\n if (animationDef.direction)\n animation.setDirection(animationDef.direction);\n }\n\n // Update animation properties with validation\n if (props.interval !== undefined) {\n const [min, max] = animationDef.options?.interval || [0.1, 5];\n animation.setInterval(Math.min(Math.max(props.interval, min), max));\n }\n if (props.duration !== undefined) {\n const [min, max] = animationDef.options?.duration || [0.1, 5];\n animation.setDuration(Math.min(Math.max(props.duration, min), max));\n }\n if (props.intensity !== undefined) {\n const [min, max] = animationDef.options?.intensity || [0.1, 2];\n animation.setIntensity(Math.min(Math.max(props.intensity, min), max));\n }\n if (\n props.animate &&\n animationDef.options?.animate?.includes(props.animate)\n ) {\n animation.setAnimate(props.animate);\n }\n if (props.mode && animationDef.options?.mode?.includes(props.mode)) {\n animation.setMode(props.mode);\n }\n if (\n props.direction &&\n animationDef.options?.direction?.includes(props.direction)\n ) {\n animation.setDirection(props.direction);\n }\n\n // Update element with new/modified animation\n selectedElement.setAnimation(animation);\n updateElement?.(selectedElement);\n };\n\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Animations</div>\n {/* Animation Selection */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Type</label>\n <select\n value={currentAnimation?.getName() || \"\"}\n onChange={(e) => handleUpdateAnimation({ name: e.target.value })}\n className=\"select-dark w-full\"\n >\n <option value=\"\">No Animation</option>\n {ANIMATIONS.map((animation) => (\n <option key={animation.name} value={animation.name}>\n {animation.name.charAt(0).toUpperCase() + animation.name.slice(1)}\n </option>\n ))}\n </select>\n </div>\n\n {/* Animation Options */}\n {currentAnimation && (\n <>\n {/* Get current animation definition */}\n {(() => {\n const animationDef = ANIMATIONS.find(\n (a) => a.name === currentAnimation.getName()\n );\n if (!animationDef || !animationDef.options) return null;\n\n return (\n <>\n {/* Animate */}\n {animationDef.options?.animate && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">When to Animate</label>\n <select\n value={currentAnimation.getAnimate()}\n onChange={(e) =>\n handleUpdateAnimation({\n animate: e.target.value as\n | \"enter\"\n | \"exit\"\n | \"both\",\n })\n }\n className=\"select-dark w-full\"\n >\n {animationDef.options?.animate.map((option) => (\n <option key={option} value={option}>\n {option.charAt(0).toUpperCase() + option.slice(1)}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Direction */}\n {animationDef.options?.direction && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Direction</label>\n <select\n value={currentAnimation.getDirection()}\n onChange={(e) =>\n handleUpdateAnimation({\n direction: e.target.value as\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | \"center\",\n })\n }\n className=\"select-dark w-full\"\n >\n {animationDef.options?.direction.map((option) => (\n <option key={option} value={option}>\n {option.charAt(0).toUpperCase() + option.slice(1)}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Mode */}\n {animationDef.options?.mode && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Mode</label>\n <select\n value={currentAnimation.getMode()}\n onChange={(e) =>\n handleUpdateAnimation({\n mode: e.target.value as \"in\" | \"out\",\n })\n }\n className=\"select-dark w-full\"\n >\n {animationDef.options?.mode.map((option) => (\n <option key={option} value={option}>\n {option.charAt(0).toUpperCase() + option.slice(1)}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Duration */}\n {animationDef.options?.duration && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Duration (seconds)</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min={animationDef.options?.duration[0]}\n max={animationDef.options?.duration[1]}\n step=\"0.1\"\n value={currentAnimation.getDuration()}\n onChange={(e) =>\n handleUpdateAnimation({\n duration: Number(e.target.value),\n })\n }\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{currentAnimation.getDuration()}</span>\n </div>\n </div>\n )}\n\n {/* Interval */}\n {animationDef.options?.interval && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Interval (seconds)</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min={animationDef.options?.interval[0]}\n max={animationDef.options?.interval[1]}\n step=\"0.1\"\n value={currentAnimation.getInterval()}\n onChange={(e) =>\n handleUpdateAnimation({\n interval: Number(e.target.value),\n })\n }\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{currentAnimation.getInterval()}</span>\n </div>\n </div>\n )}\n\n {/* Intensity */}\n {animationDef.options?.intensity && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Intensity</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min={animationDef.options?.intensity[0]}\n max={animationDef.options?.intensity[1]}\n step=\"0.1\"\n value={currentAnimation.getIntensity()}\n onChange={(e) =>\n handleUpdateAnimation({\n intensity: Number(e.target.value),\n })\n }\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{currentAnimation.getIntensity()}</span>\n </div>\n </div>\n )}\n </>\n );\n })()}\n </>\n )}\n </div>\n );\n}\n","import type { PropertiesPanelProps } from \"../../types\";\nexport function PlaybackPropsPanel({\n selectedElement,\n updateElement,\n}: PropertiesPanelProps) {\n const elementProps = selectedElement?.getProps() || {};\n const { volume } = elementProps;\n\n const handleUpdateElement = (props: Record<string, any>) => {\n if (selectedElement) {\n updateElement?.(selectedElement?.setProps({ ...elementProps, ...props }));\n }\n };\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Playback Properties</div>\n {/* Volume */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Volume</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"3\"\n step={0.1}\n value={volume ?? 0}\n onChange={(e) =>\n handleUpdateElement({ volume: Number(e.target.value) })\n }\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{volume ?? 0}</span>\n </div>\n </div>\n </div>\n );\n}\n","import { ElementProps } from \"../properties/element-props\";\nimport { TextEffects } from \"../properties/text-effects\";\nimport { Animation } from \"../properties/animation\";\nimport { type TrackElement } from \"@twick/timeline\";\nimport { PlaybackPropsPanel } from \"../properties/playback-props\";\n\ninterface PropertiesPanelContainerProps {\n selectedProp: string;\n selectedElement: TrackElement | null;\n updateElement: (element: TrackElement) => void;\n}\n\nexport function PropertiesPanelContainer({\n selectedProp,\n selectedElement,\n updateElement,\n}: PropertiesPanelContainerProps) {\n if (!selectedElement) {\n return (\n <div className=\"panel-container\">\n <div className=\"properties-header\">\n <h3 className=\"properties-title\">Select Element to see properties</h3>\n </div>\n </div>\n );\n }\n return (\n <>\n {/* Element Properties */}\n {selectedProp === \"element-props\" && (\n <ElementProps\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n )}\n\n {/* Playback Properties */}\n {selectedProp === \"playback-props\" && (\n <PlaybackPropsPanel\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n )}\n\n {/* Text Effects */}\n {selectedProp === \"text-effects\" && (\n <TextEffects\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n )}\n\n {/* Animations */}\n {selectedProp === \"animations\" && (\n <Animation\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n )}\n </>\n );\n}\n","const imageDimensionsCache = {};\nconst videoMetaCache = {};\nconst audioDurationCache = {};\n\nconst getAudioDuration = (audioSrc) => {\n if (audioDurationCache[audioSrc]) {\n return Promise.resolve(audioDurationCache[audioSrc]);\n }\n return new Promise((resolve, reject) => {\n const audio = document.createElement(\"audio\");\n audio.preload = \"metadata\";\n const isSafeUrl = /^(https?:|blob:|data:audio\\/)/i.test(audioSrc);\n if (!isSafeUrl) {\n throw new Error(\"Unsafe audio source URL\");\n }\n audio.src = audioSrc;\n audio.onloadedmetadata = () => {\n const duration = audio.duration;\n audioDurationCache[audioSrc] = duration;\n resolve(duration);\n };\n audio.onerror = () => {\n reject(new Error(\"Failed to load audio metadata\"));\n };\n });\n};\n\nconst concurrencyLimit = 5;\nlet activeCount = 0;\nconst queue = [];\nfunction runNext() {\n if (queue.length === 0 || activeCount >= concurrencyLimit) return;\n const next = queue.shift();\n if (next) {\n activeCount++;\n next();\n }\n}\nfunction limit(fn) {\n return new Promise((resolve, reject) => {\n const task = () => {\n fn().then(resolve).catch(reject).finally(() => {\n activeCount--;\n runNext();\n });\n };\n if (activeCount < concurrencyLimit) {\n activeCount++;\n task();\n } else {\n queue.push(task);\n }\n });\n}\n\nconst loadImageDimensions = (url) => {\n return new Promise((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"getImageDimensions() is only available in the browser.\"));\n return;\n }\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = url;\n });\n};\nconst getImageDimensions = (url) => {\n if (imageDimensionsCache[url]) {\n return Promise.resolve(imageDimensionsCache[url]);\n }\n return limit(() => loadImageDimensions(url)).then((dimensions) => {\n imageDimensionsCache[url] = dimensions;\n return dimensions;\n });\n};\n\nconst getVideoMeta = (videoSrc) => {\n if (videoMetaCache[videoSrc]) {\n return Promise.resolve(videoMetaCache[videoSrc]);\n }\n return new Promise((resolve, reject) => {\n const video = document.createElement(\"video\");\n video.preload = \"metadata\";\n const isSafeUrl = /^(https?:|blob:|data:video\\/)/i.test(videoSrc);\n if (!isSafeUrl) {\n reject(new Error(\"Unsafe video source URL\"));\n return;\n }\n video.src = videoSrc;\n video.onloadedmetadata = () => {\n const meta = {\n width: video.videoWidth,\n height: video.videoHeight,\n duration: video.duration\n };\n videoMetaCache[videoSrc] = meta;\n resolve(meta);\n };\n video.onerror = () => reject(new Error(\"Failed to load video metadata\"));\n });\n};\n\nconst getThumbnail = async (videoUrl, seekTime = 0.1, playbackRate = 1) => {\n return new Promise((resolve, reject) => {\n const video = document.createElement(\"video\");\n video.crossOrigin = \"anonymous\";\n video.muted = true;\n video.playsInline = true;\n video.autoplay = false;\n video.preload = \"auto\";\n video.playbackRate = playbackRate;\n video.style.position = \"absolute\";\n video.style.left = \"-9999px\";\n video.style.top = \"-9999px\";\n video.style.width = \"1px\";\n video.style.height = \"1px\";\n video.style.opacity = \"0\";\n video.style.pointerEvents = \"none\";\n video.style.zIndex = \"-1\";\n let timeoutId;\n const cleanup = () => {\n if (video.parentNode) video.remove();\n if (timeoutId) clearTimeout(timeoutId);\n };\n const handleError = () => {\n cleanup();\n reject(new Error(`Failed to load video: ${video.error?.message || \"Unknown error\"}`));\n };\n const handleSeeked = () => {\n try {\n video.pause();\n const canvas = document.createElement(\"canvas\");\n const width = video.videoWidth || 640;\n const height = video.videoHeight || 360;\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n cleanup();\n reject(new Error(\"Failed to get canvas context\"));\n return;\n }\n ctx.drawImage(video, 0, 0, width, height);\n try {\n const dataUrl = canvas.toDataURL(\"image/jpeg\", 0.8);\n cleanup();\n resolve(dataUrl);\n } catch {\n canvas.toBlob((blob) => {\n if (!blob) {\n cleanup();\n reject(new Error(\"Failed to create Blob\"));\n return;\n }\n const blobUrl = URL.createObjectURL(blob);\n cleanup();\n resolve(blobUrl);\n }, \"image/jpeg\", 0.8);\n }\n } catch (err) {\n cleanup();\n reject(new Error(`Error creating thumbnail: ${err}`));\n }\n };\n video.addEventListener(\"error\", handleError, { once: true });\n video.addEventListener(\"seeked\", handleSeeked, { once: true });\n video.addEventListener(\"loadedmetadata\", () => {\n const playPromise = video.play();\n if (playPromise !== void 0) {\n playPromise.then(() => {\n video.currentTime = seekTime;\n }).catch(() => {\n video.currentTime = seekTime;\n });\n } else {\n video.currentTime = seekTime;\n }\n }, { once: true });\n timeoutId = window.setTimeout(() => {\n cleanup();\n reject(new Error(\"Video loading timed out\"));\n }, 15e3);\n video.src = videoUrl;\n document.body.appendChild(video);\n });\n};\n\nconst extractAudio = async ({\n src,\n playbackRate = 1,\n start = 0,\n end\n}) => {\n if (!src) throw new Error(\"src is required\");\n if (playbackRate <= 0) throw new Error(\"playbackRate must be > 0\");\n const isSafeUrl = /^(https?:|blob:|data:)/i.test(src);\n if (!isSafeUrl) throw new Error(\"Unsafe media source URL\");\n const audioBuffer = await fetchAndDecodeAudio(src);\n const clampedStart = Math.max(0, start || 0);\n const fullDuration = audioBuffer.duration;\n const clampedEnd = Math.min(\n typeof end === \"number\" ? end : fullDuration,\n fullDuration\n );\n if (clampedEnd <= clampedStart)\n throw new Error(\"Invalid range: end must be greater than start\");\n const renderedBuffer = await renderAudioSegment(\n audioBuffer,\n clampedStart,\n clampedEnd,\n playbackRate\n );\n const mp3Blob = await audioBufferToMp3(renderedBuffer);\n return URL.createObjectURL(mp3Blob);\n};\nconst stitchAudio = async (segments, totalDuration) => {\n if (!segments || segments.length === 0) {\n throw new Error(\"At least one audio segment is required\");\n }\n const duration = totalDuration || Math.max(...segments.map((s) => s.e));\n const renderedBuffer = await createAudioTimeline(segments, duration);\n const mp3Blob = await audioBufferToMp3(renderedBuffer);\n return URL.createObjectURL(mp3Blob);\n};\nconst fetchAndDecodeAudio = async (src) => {\n const response = await fetch(src);\n if (!response.ok) throw new Error(`Failed to fetch source: ${response.status}`);\n const arrayBuffer = await response.arrayBuffer();\n return decodeAudioData(arrayBuffer);\n};\nconst decodeAudioData = async (arrayBuffer) => {\n const AudioContextCtor = window.AudioContext || window.webkitAudioContext;\n if (!AudioContextCtor) throw new Error(\"Web Audio API not supported\");\n const audioContext = new AudioContextCtor();\n try {\n return await new Promise((resolve, reject) => {\n audioContext.decodeAudioData(\n arrayBuffer.slice(0),\n (buf) => resolve(buf),\n (err) => reject(err || new Error(\"Failed to decode audio\"))\n );\n });\n } finally {\n audioContext.close();\n }\n};\nconst renderAudioSegment = async (audioBuffer, start, end, playbackRate) => {\n const OfflineAudioContextCtor = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n if (!OfflineAudioContextCtor) throw new Error(\"OfflineAudioContext not supported\");\n const sampleRate = audioBuffer.sampleRate;\n const numChannels = audioBuffer.numberOfChannels;\n const sourceDuration = end - start;\n const renderedFrames = Math.max(\n 1,\n Math.ceil(sourceDuration / playbackRate * sampleRate)\n );\n const offline = new OfflineAudioContextCtor(numChannels, renderedFrames, sampleRate);\n const sourceNode = offline.createBufferSource();\n sourceNode.buffer = audioBuffer;\n sourceNode.playbackRate.value = playbackRate;\n sourceNode.connect(offline.destination);\n sourceNode.start(0, start, sourceDuration);\n return await offline.startRendering();\n};\nconst createAudioTimeline = async (segments, duration) => {\n const OfflineAudioContextCtor = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n if (!OfflineAudioContextCtor) throw new Error(\"OfflineAudioContext not supported\");\n const sampleRate = 44100;\n const totalFrames = Math.ceil(duration * sampleRate);\n const offline = new OfflineAudioContextCtor(2, totalFrames, sampleRate);\n for (const segment of segments) {\n if (segment.s >= segment.e) {\n console.warn(`Invalid segment: start (${segment.s}) >= end (${segment.e})`);\n continue;\n }\n const volume = segment.volume ?? 1;\n if (volume <= 0) {\n console.warn(`Skipping muted segment: ${segment.src}`);\n continue;\n }\n try {\n const audioBuffer = await fetchAndDecodeAudio(segment.src);\n const segmentDuration = segment.e - segment.s;\n const sourceDuration = Math.min(segmentDuration, audioBuffer.duration);\n const source = offline.createBufferSource();\n source.buffer = audioBuffer;\n if (volume !== 1) {\n const gainNode = offline.createGain();\n gainNode.gain.value = volume;\n source.connect(gainNode);\n gainNode.connect(offline.destination);\n } else {\n source.connect(offline.destination);\n }\n source.start(segment.s, 0, sourceDuration);\n } catch (error) {\n console.warn(`Failed to process segment: ${segment.src}`, error);\n }\n }\n return await offline.startRendering();\n};\nconst audioBufferToMp3 = async (buffer) => {\n try {\n const wavArrayBuffer = audioBufferToWavArrayBuffer(buffer);\n const pcmBuffer = await decodeAudioData(wavArrayBuffer);\n return await encodePcmToMp3(pcmBuffer);\n } catch (error) {\n return audioBufferToWavBlob(buffer);\n }\n};\nconst audioBufferToWavArrayBuffer = (buffer) => {\n const numChannels = buffer.numberOfChannels;\n const sampleRate = buffer.sampleRate;\n const numFrames = buffer.length;\n const interleaved = interleave(buffer, numChannels, numFrames);\n const bytesPerSample = 2;\n const blockAlign = numChannels * bytesPerSample;\n const byteRate = sampleRate * blockAlign;\n const dataSize = interleaved.length * bytesPerSample;\n const bufferSize = 44 + dataSize;\n const arrayBuffer = new ArrayBuffer(bufferSize);\n const view = new DataView(arrayBuffer);\n writeString(view, 0, \"RIFF\");\n view.setUint32(4, 36 + dataSize, true);\n writeString(view, 8, \"WAVE\");\n writeString(view, 12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, numChannels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, 16, true);\n writeString(view, 36, \"data\");\n view.setUint32(40, dataSize, true);\n floatTo16BitPCM(view, 44, interleaved);\n return arrayBuffer;\n};\nconst encodePcmToMp3 = async (buffer) => {\n const lamejs = await import('./index-CXhwwSX-.js').then(n => n.i);\n const channels = buffer.numberOfChannels >= 2 ? 2 : 1;\n const targetSampleRate = 22050;\n const downsampledBuffer = downsampleAudioBuffer(buffer, targetSampleRate);\n const kbps = 48;\n const mp3encoder = new lamejs.default.Mp3Encoder(channels, targetSampleRate, kbps);\n const samplesPerFrame = 1152;\n const leftFloat = downsampledBuffer.getChannelData(0);\n const left = floatTo16(leftFloat);\n let right;\n if (channels === 2) {\n const rightFloat = downsampledBuffer.getChannelData(1);\n right = floatTo16(rightFloat);\n }\n const mp3Chunks = [];\n for (let i = 0; i < left.length; i += samplesPerFrame) {\n const leftChunk = left.subarray(i, Math.min(i + samplesPerFrame, left.length));\n let mp3buf;\n if (channels === 2 && right) {\n const rightChunk = right.subarray(i, Math.min(i + samplesPerFrame, right.length));\n mp3buf = mp3encoder.encodeBuffer(leftChunk, rightChunk);\n } else {\n mp3buf = mp3encoder.encodeBuffer(leftChunk);\n }\n if (mp3buf.length > 0) mp3Chunks.push(mp3buf);\n }\n const end = mp3encoder.flush();\n if (end.length > 0) mp3Chunks.push(end);\n return new Blob(mp3Chunks, { type: \"audio/mpeg\" });\n};\nconst audioBufferToWavBlob = (buffer) => {\n const arrayBuffer = audioBufferToWavArrayBuffer(buffer);\n return new Blob([arrayBuffer], { type: \"audio/wav\" });\n};\nconst downsampleAudioBuffer = (buffer, targetSampleRate) => {\n if (buffer.sampleRate === targetSampleRate) {\n return buffer;\n }\n const ratio = buffer.sampleRate / targetSampleRate;\n const newLength = Math.round(buffer.length / ratio);\n const newBuffer = new AudioContext().createBuffer(\n buffer.numberOfChannels,\n newLength,\n targetSampleRate\n );\n for (let channel = 0; channel < buffer.numberOfChannels; channel++) {\n const oldData = buffer.getChannelData(channel);\n const newData = newBuffer.getChannelData(channel);\n for (let i = 0; i < newLength; i++) {\n const oldIndex = Math.floor(i * ratio);\n newData[i] = oldData[oldIndex];\n }\n }\n return newBuffer;\n};\nconst interleave = (buffer, numChannels, numFrames) => {\n if (numChannels === 1) {\n return buffer.getChannelData(0).slice(0, numFrames);\n }\n const result = new Float32Array(numFrames * numChannels);\n const channelData = [];\n for (let ch = 0; ch < numChannels; ch++) {\n channelData[ch] = buffer.getChannelData(ch);\n }\n let writeIndex = 0;\n for (let i = 0; i < numFrames; i++) {\n for (let ch = 0; ch < numChannels; ch++) {\n result[writeIndex++] = channelData[ch][i];\n }\n }\n return result;\n};\nconst floatTo16BitPCM = (view, offset, input) => {\n let pos = offset;\n for (let i = 0; i < input.length; i++, pos += 2) {\n let s = Math.max(-1, Math.min(1, input[i]));\n view.setInt16(pos, s < 0 ? s * 32768 : s * 32767, true);\n }\n};\nconst floatTo16 = (input) => {\n const output = new Int16Array(input.length);\n for (let i = 0; i < input.length; i++) {\n const s = Math.max(-1, Math.min(1, input[i]));\n output[i] = s < 0 ? s * 32768 : s * 32767;\n }\n return output;\n};\nconst writeString = (view, offset, str) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n};\n\nconst getScaledDimensions = (width, height, maxWidth, maxHeight) => {\n if (width <= maxWidth && height <= maxHeight) {\n return {\n width: width % 2 === 0 ? width : width - 1,\n height: height % 2 === 0 ? height : height - 1\n };\n }\n const widthRatio = maxWidth / width;\n const heightRatio = maxHeight / height;\n const scale = Math.min(widthRatio, heightRatio);\n let scaledWidth = Math.round(width * scale);\n let scaledHeight = Math.round(height * scale);\n if (scaledWidth % 2 !== 0) {\n scaledWidth -= 1;\n }\n if (scaledHeight % 2 !== 0) {\n scaledHeight -= 1;\n }\n return {\n width: Math.min(scaledWidth, maxWidth),\n height: Math.min(scaledHeight, maxHeight)\n };\n};\nconst getObjectFitSize = (objectFit, elementSize, containerSize) => {\n const elementAspectRatio = elementSize.width / elementSize.height;\n const containerAspectRatio = containerSize.width / containerSize.height;\n switch (objectFit) {\n case \"contain\":\n if (elementAspectRatio > containerAspectRatio) {\n return {\n width: containerSize.width,\n height: containerSize.width / elementAspectRatio\n };\n } else {\n return {\n width: containerSize.height * elementAspectRatio,\n height: containerSize.height\n };\n }\n case \"cover\":\n if (elementAspectRatio > containerAspectRatio) {\n return {\n width: containerSize.height * elementAspectRatio,\n height: containerSize.height\n };\n } else {\n return {\n width: containerSize.width,\n height: containerSize.width / elementAspectRatio\n };\n }\n case \"fill\":\n return {\n width: containerSize.width,\n height: containerSize.height\n };\n default:\n return {\n width: elementSize.width,\n height: elementSize.height\n };\n }\n};\n\nconst blobUrlToFile = async (blobUrl, fileName) => {\n const response = await fetch(blobUrl);\n const blob = await response.blob();\n return new File([blob], fileName, { type: blob.type });\n};\nconst loadFile = (accept) => {\n return new Promise((resolve, reject) => {\n try {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = accept;\n input.style.display = \"none\";\n document.body.appendChild(input);\n const cleanup = () => {\n input.value = \"\";\n document.body.removeChild(input);\n };\n input.onchange = () => {\n const file = input.files && input.files[0];\n cleanup();\n if (!file) {\n reject(new Error(\"No file selected\"));\n return;\n }\n resolve(file);\n };\n input.click();\n } catch (error) {\n reject(error);\n }\n });\n};\nconst saveAsFile = (content, type, name) => {\n const blob = typeof content === \"string\" ? new Blob([content], { type }) : content;\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = name;\n a.click();\n URL.revokeObjectURL(url);\n};\nconst downloadFile = async (url, filename) => {\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n const downloadUrl = window.URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = downloadUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(downloadUrl);\n } catch (error) {\n console.error(\"Error downloading file:\", error);\n throw error;\n }\n};\n\nconst detectMediaTypeFromUrl = async (url) => {\n try {\n const response = await fetch(url, { method: \"HEAD\" });\n const contentType = response.headers.get(\"Content-Type\");\n if (!contentType) return null;\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"video/\")) return \"video\";\n if (contentType.startsWith(\"audio/\")) return \"audio\";\n return null;\n } catch (error) {\n console.error(\"Fetch failed:\", error);\n return null;\n }\n};\n\nexport { blobUrlToFile, detectMediaTypeFromUrl, downloadFile, extractAudio, getAudioDuration, getImageDimensions, getObjectFitSize, getScaledDimensions, getThumbnail, getVideoMeta, limit, loadFile, saveAsFile, stitchAudio };\n//# sourceMappingURL=index.mjs.map\n","import { ProjectJSON, useTimelineContext } from \"@twick/timeline\";\nimport { StudioConfig } from \"../types\";\nimport { loadFile, saveAsFile } from \"@twick/media-utils\";\nimport { useState } from \"react\";\n\nconst useStudioOperation = (studioConfig?: StudioConfig) => {\n const { editor, present } = useTimelineContext();\n const [projectName, setProjectName] = useState(\"\");\n const onLoadProject = async () => {\n let project: ProjectJSON;\n if (studioConfig?.loadProject) {\n project = await studioConfig.loadProject();\n } else {\n const file = await loadFile(\"application/json\");\n const text = await file.text();\n setProjectName(file.name);\n project = JSON.parse(text);\n }\n console.log(\"Editor\", editor);\n editor.loadProject(project);\n };\n\n const onSaveProject = async () => {\n let fileName;\n if (projectName) {\n fileName = projectName;\n } else {\n fileName = prompt(\"Enter the name of the project\") || \"untitled-project\";\n fileName = fileName + \".json\";\n setProjectName(fileName);\n }\n if (studioConfig?.saveProject && present) {\n await studioConfig.saveProject(present, fileName);\n } else {\n const file = await saveAsFile(\n JSON.stringify(present),\n \"application/json\",\n fileName\n );\n if (file) {\n console.log(\"File saved\", file);\n }\n }\n };\n\n const onExportVideo = async () => {\n if (studioConfig?.exportVideo && present) {\n await studioConfig.exportVideo(present, {\n outFile: \"output.mp4\",\n fps: 30,\n resolution: {\n width: studioConfig.videoProps?.width,\n height: studioConfig.videoProps?.height,\n },\n });\n } else {\n alert(\"Export video not supported in demo mode\");\n }\n };\n\n return { onLoadProject, onSaveProject, onExportVideo };\n};\n\nexport default useStudioOperation;\n","/**\n * TwickStudio Component\n *\n * The main studio component that provides a complete video editing interface.\n * Integrates all major components including canvas, toolbar, media library,\n * and properties panel into a cohesive editing environment.\n *\n * @component\n * @example\n * ```tsx\n * <TimelineProvider initialData={initialData} videoResolution={resolution}>\n * <TwickStudio />\n * </TimelineProvider>\n * ```\n */\n\nimport { Toolbar } from \"./toolbar\";\nimport StudioHeader from \"./header\";\nimport { useStudioManager } from \"../hooks/use-studio-manager\";\nimport ElementPanelContainer from \"./container/element-panel-container\";\nimport { useTimelineContext } from \"@twick/timeline\";\nimport { MediaProvider } from \"../context/media-context\";\nimport { PropsToolbar } from \"./props-toolbar\";\nimport { PropertiesPanelContainer } from \"./container/properties-panel-container\";\nimport VideoEditor from \"@twick/video-editor\";\nimport { useMemo } from \"react\";\nimport { StudioConfig } from \"../types\";\nimport useStudioOperation from \"../hooks/use-studio-operation\";\n\nexport function TwickStudio({ studioConfig }: { studioConfig?: StudioConfig }) {\n const {\n selectedTool,\n setSelectedTool,\n selectedProp,\n setSelectedProp,\n selectedElement,\n addElement,\n updateElement,\n } = useStudioManager();\n const { videoResolution, setVideoResolution } = useTimelineContext();\n const { onLoadProject, onSaveProject, onExportVideo } =\n useStudioOperation(studioConfig);\n\n const twickStudiConfig: StudioConfig = useMemo(\n () => ({\n canvasMode: true,\n ...(studioConfig || {}),\n videoProps: {\n ...(studioConfig?.videoProps || {}),\n width: videoResolution.width,\n height: videoResolution.height,\n },\n }),\n [videoResolution, studioConfig]\n );\n\n return (\n <MediaProvider>\n <div className=\"studio-container\">\n {/* Header */}\n <StudioHeader\n setVideoResolution={setVideoResolution}\n onLoadProject={onLoadProject}\n onSaveProject={onSaveProject}\n onExportVideo={onExportVideo}\n />\n {/* Main Content */}\n <div className=\"studio-content\">\n {/* Left Toolbar */}\n <Toolbar\n selectedTool={selectedTool}\n setSelectedTool={setSelectedTool}\n />\n\n {/* Left Panel */}\n <ElementPanelContainer\n videoResolution={videoResolution}\n selectedTool={selectedTool}\n setSelectedTool={setSelectedTool}\n selectedElement={selectedElement}\n addElement={addElement}\n updateElement={updateElement}\n />\n\n {/* Center - Canvas and Transport */}\n <main className=\"main-container\">\n <div className=\"canvas-wrapper\">\n <div\n className=\"canvas-container\"\n style={{\n maxWidth: twickStudiConfig.playerProps?.maxWidth ?? 960,\n }}\n >\n <VideoEditor editorConfig={twickStudiConfig} />\n </div>\n </div>\n </main>\n\n {/* Left Panel */}\n <PropertiesPanelContainer\n selectedProp={selectedProp}\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n\n {/* Right Toolbar */}\n <PropsToolbar\n selectedElement={selectedElement}\n selectedProp={selectedProp}\n setSelectedProp={setSelectedProp}\n />\n </div>\n </div>\n </MediaProvider>\n );\n}\n"],"names":["forwardRef","createElement","__iconNode","getIcon","Icon","jsxs","jsx","useState","useEffect","orientation","useTimelineContext","TrackElement","useRef","Track","_a","BrowserMediaManager","createContext","useContext","VideoElement","AudioElement","ImageElement","config","useCallback","Wand2","AVAILABLE_TEXT_FONTS","TextElement","Loader2","IconElement","RectElement","CircleElement","SparklesIcon","useMemo","CaptionElement","ElementTextEffect","TEXT_EFFECTS","Fragment","ANIMATIONS","ElementAnimation"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/check.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/circle.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/clapperboard.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/download.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/file.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/image.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/infinity.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/loader-circle.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/message-square.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/music.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/pause.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/play.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/save.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/settings.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/sparkles.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/square.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash-2.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/type.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/upload.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/video.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/volume-2.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/wand-sparkles.js","../../../node_modules/.pnpm/lucide-react@0.511.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/zap.js","../src/components/toolbar.tsx","../src/components/header.tsx","../src/hooks/use-studio-manager.tsx","../src/components/panel/subtitles-panel.tsx","../src/components/shared/file-input.tsx","../src/components/shared/media-manager.ts","../src/components/shared/url-input.tsx","../src/context/media-context.tsx","../src/hooks/use-media-panel.ts","../src/hooks/use-audio-preview.ts","../src/components/panel/audio-panel.tsx","../src/components/container/audio-panel-container.tsx","../src/components/panel/image-panel.tsx","../src/components/container/image-panel-container.tsx","../src/hooks/use-video-preview.ts","../src/components/panel/video-panel.tsx","../src/components/container/video-panel-container.tsx","../src/components/panel/text-panel.tsx","../src/hooks/use-text-panel.ts","../src/components/container/text-panel-container.tsx","../src/components/shared/search-input.tsx","../src/components/panel/icon-panel.tsx","../src/hooks/use-icon-panel.ts","../src/components/container/icon-panel-container.tsx","../src/components/panel/rect-panel.tsx","../src/hooks/use-rect-panel.ts","../src/components/container/rect-panel-container.tsx","../src/components/panel/circle-panel.tsx","../src/hooks/use-circle-panel.ts","../src/components/container/circle-panel-container.tsx","../src/components/container/element-panel-container.tsx","../src/components/props-toolbar.tsx","../src/components/properties/element-props.tsx","../src/components/properties/text-effects.tsx","../src/components/properties/animation.tsx","../src/components/properties/playback-props.tsx","../src/components/container/properties-panel-container.tsx","../../media-utils/dist/index.mjs","../src/hooks/use-studio-operation.ts","../src/components/twick-studio.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]];\nconst Circle = createLucideIcon(\"circle\", __iconNode);\n\nexport { __iconNode, Circle as default };\n//# sourceMappingURL=circle.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n { d: \"M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3Z\", key: \"1tn4o7\" }\n ],\n [\"path\", { d: \"m6.2 5.3 3.1 3.9\", key: \"iuk76l\" }],\n [\"path\", { d: \"m12.4 3.4 3.1 4\", key: \"6hsd6n\" }],\n [\"path\", { d: \"M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z\", key: \"ltgou9\" }]\n];\nconst Clapperboard = createLucideIcon(\"clapperboard\", __iconNode);\n\nexport { __iconNode, Clapperboard as default };\n//# sourceMappingURL=clapperboard.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M6 16c5 0 7-8 12-8a4 4 0 0 1 0 8c-5 0-7-8-12-8a4 4 0 1 0 0 8\", key: \"18ogeb\" }]\n];\nconst Infinity = createLucideIcon(\"infinity\", __iconNode);\n\nexport { __iconNode, Infinity as default };\n//# sourceMappingURL=infinity.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\", key: \"1lielz\" }]\n];\nconst MessageSquare = createLucideIcon(\"message-square\", __iconNode);\n\nexport { __iconNode, MessageSquare as default };\n//# sourceMappingURL=message-square.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M9 18V5l12-2v13\", key: \"1jmyc2\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"circle\", { cx: \"18\", cy: \"16\", r: \"3\", key: \"1hluhg\" }]\n];\nconst Music = createLucideIcon(\"music\", __iconNode);\n\nexport { __iconNode, Music as default };\n//# sourceMappingURL=music.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"zuxfzm\" }],\n [\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"1okwgv\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"polygon\", { points: \"6 3 20 12 6 21 6 3\", key: \"1oa8hb\" }]];\nconst Play = createLucideIcon(\"play\", __iconNode);\n\nexport { __iconNode, Play as default };\n//# sourceMappingURL=play.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n];\nconst Save = createLucideIcon(\"save\", __iconNode);\n\nexport { __iconNode, Save as default };\n//# sourceMappingURL=save.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\",\n key: \"1qme2f\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n];\nconst Settings = createLucideIcon(\"settings\", __iconNode);\n\nexport { __iconNode, Settings as default };\n//# sourceMappingURL=settings.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\",\n key: \"4pj2yx\"\n }\n ],\n [\"path\", { d: \"M20 3v4\", key: \"1olli1\" }],\n [\"path\", { d: \"M22 5h-4\", key: \"1gvqau\" }],\n [\"path\", { d: \"M4 17v2\", key: \"vumght\" }],\n [\"path\", { d: \"M5 18H3\", key: \"zchphs\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }]\n];\nconst Square = createLucideIcon(\"square\", __iconNode);\n\nexport { __iconNode, Square as default };\n//# sourceMappingURL=square.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 4v16\", key: \"1654pz\" }],\n [\"path\", { d: \"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\", key: \"e0r10z\" }],\n [\"path\", { d: \"M9 20h6\", key: \"s66wpe\" }]\n];\nconst Type = createLucideIcon(\"type\", __iconNode);\n\nexport { __iconNode, Type as default };\n//# sourceMappingURL=type.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\",\n key: \"ftymec\"\n }\n ],\n [\"rect\", { x: \"2\", y: \"6\", width: \"14\", height: \"12\", rx: \"2\", key: \"158x01\" }]\n];\nconst Video = createLucideIcon(\"video\", __iconNode);\n\nexport { __iconNode, Video as default };\n//# sourceMappingURL=video.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\n key: \"uqj9uw\"\n }\n ],\n [\"path\", { d: \"M16 9a5 5 0 0 1 0 6\", key: \"1q6k2b\" }],\n [\"path\", { d: \"M19.364 18.364a9 9 0 0 0 0-12.728\", key: \"ijwkga\" }]\n];\nconst Volume2 = createLucideIcon(\"volume-2\", __iconNode);\n\nexport { __iconNode, Volume2 as default };\n//# sourceMappingURL=volume-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72\",\n key: \"ul74o6\"\n }\n ],\n [\"path\", { d: \"m14 7 3 3\", key: \"1r5n42\" }],\n [\"path\", { d: \"M5 6v4\", key: \"ilb8ba\" }],\n [\"path\", { d: \"M19 14v4\", key: \"blhpug\" }],\n [\"path\", { d: \"M10 2v2\", key: \"7u0qdc\" }],\n [\"path\", { d: \"M7 8H3\", key: \"zfb6yr\" }],\n [\"path\", { d: \"M21 16h-4\", key: \"1cnmox\" }],\n [\"path\", { d: \"M11 3H9\", key: \"1obp7u\" }]\n];\nconst WandSparkles = createLucideIcon(\"wand-sparkles\", __iconNode);\n\nexport { __iconNode, WandSparkles as default };\n//# sourceMappingURL=wand-sparkles.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n];\nconst Zap = createLucideIcon(\"zap\", __iconNode);\n\nexport { __iconNode, Zap as default };\n//# sourceMappingURL=zap.js.map\n","/**\n * Toolbar Component\n * \n * A vertical toolbar that provides quick access to different editing tools\n * and media types. Displays icons with labels and optional keyboard shortcuts.\n * \n * @component\n * @param {Object} props\n * @param {string} props.selectedTool - Currently selected tool ID\n * @param {(tool: string) => void} props.setSelectedTool - Callback to update selected tool\n * \n * @example\n * ```tsx\n * <Toolbar\n * selectedTool=\"text\"\n * setSelectedTool={(tool) => console.log(`Selected ${tool}`)}\n * />\n * ```\n */\n\nimport { \n Type, \n Upload, \n Video,\n Image, \n Music,\n Circle,\n Infinity, \n MessageSquare,\n Plus,\n Square,\n} from 'lucide-react'\nimport type { ToolCategory } from '../types'\n\nconst toolCategories: ToolCategory[] = [\n { id: 'video', name: 'Video', icon: 'Video', description: 'Video' },\n { id: 'image', name: 'Image', icon: 'Image', description: 'Image' },\n { id: 'audio', name: 'Audio', icon: 'Audio', description: 'Audio' },\n { id: 'text', name: 'Text', icon: 'Type', description: 'Add text elements', shortcut: 'T' },\n { id: 'icon', name: 'Icons', icon: 'Icon', description: 'Icon Element', shortcut: 'I' },\n { id: 'circle', name: 'Circle', icon: 'Circle', description: 'Circle Element', shortcut: 'C' },\n { id: 'rect', name: 'Rect', icon: 'Rect', description: 'Rect Element' },\n // { id: 'subtitle', name: 'Subtitles', icon: 'MessageSquare', description: 'Manage subtitles', shortcut: 'S' },\n]\n\nconst getIcon = (iconName: string) => {\n switch (iconName) {\n case 'Plus': return Plus\n case 'Type': return Type\n case 'Icon': return Infinity\n case 'Upload': return Upload\n case 'Square': return Square\n case 'Image': return Image\n case 'Video': return Video\n case 'Audio': return Music\n case 'Circle': return Circle\n case 'Rect': return Square\n case 'MessageSquare': return MessageSquare\n default: return Plus\n }\n}\n\nexport function Toolbar({ selectedTool, setSelectedTool }: { selectedTool: string, setSelectedTool: (tool: string) => void }) {\n\n const handleToolSelect = (toolId: string) => {\n setSelectedTool(toolId)\n }\n\n return (\n <div className=\"sidebar\">\n {/* Main Tools */}\n {toolCategories.map((tool) => {\n const Icon = getIcon(tool.icon)\n const isSelected = selectedTool === tool.id\n \n return (\n <div\n key={tool.id}\n onClick={() => handleToolSelect(tool.id)}\n className={`toolbar-btn ${isSelected ? 'active' : ''}`}\n title={`${tool.name}${tool.shortcut ? ` (${tool.shortcut})` : ''}`}\n >\n <Icon className=\"icon-sm\" />\n <span className=\"toolbar-label\">\n {tool.name}\n </span>\n </div>\n )\n })}\n </div>\n )\n}\n","/**\n * StudioHeader Component\n *\n * The top header bar of the studio interface. Contains the studio logo,\n * orientation controls, and action divs for saving and exporting.\n *\n * @component\n * @param {Object} props\n * @param {(resolution: Size) => void} props.setVideoResolution - Callback to update canvas resolution\n *\n * @example\n * ```tsx\n * <StudioHeader\n * setVideoResolution={(size) => console.log(`New size: ${size.width}x${size.height}`)}\n * />\n * ```\n */\n\nimport type { Size } from \"@twick/timeline\";\nimport { Save, Download, Clapperboard, File } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\n\ninterface StudioHeaderProps {\n setVideoResolution: (resolution: Size) => void;\n onLoadProject: () => void;\n onSaveProject: () => void;\n onExportVideo: () => void;\n}\nexport const StudioHeader = ({\n setVideoResolution,\n onLoadProject,\n onSaveProject,\n onExportVideo,\n}: StudioHeaderProps) => {\n const [orientation, setOrientation] = useState<\"horizontal\" | \"vertical\">(\n \"vertical\"\n );\n\n useEffect(() => {\n const orientation = localStorage.getItem(\"orientation\");\n if (orientation) {\n setOrientation(orientation as \"horizontal\" | \"vertical\");\n }\n }, []);\n\n useEffect(() => {\n if (orientation === \"horizontal\") {\n localStorage.setItem(\"orientation\", \"horizontal\");\n setVideoResolution({ width: 1280, height: 720 });\n } else {\n localStorage.setItem(\"orientation\", \"vertical\");\n setVideoResolution({ width: 720, height: 1280 });\n }\n }, [orientation]);\n\n return (\n <header className=\"header\">\n <div className=\"flex-container\">\n <div className=\"flex-container\">\n <Clapperboard className=\"icon-lg accent-purple\" />\n <h1 className=\"text-gradient\">\n Twick Studio\n </h1>\n </div>\n </div>\n <div className=\"flex-container\">\n <button\n className=\"btn-ghost\"\n title=\"Load Project\"\n onClick={onLoadProject}\n >\n <File className=\"icon-sm\" />\n Load Project\n </button>\n <button\n className=\"btn-ghost\"\n title=\"Save Draft\"\n onClick={onSaveProject}\n >\n <Save className=\"icon-sm\" />\n Save Draft\n </button>\n <button\n className=\"btn-primary\"\n title=\"Export\"\n onClick={onExportVideo}\n >\n <Download className=\"icon-sm\" />\n Export\n </button>\n </div>\n </header>\n );\n};\n\nexport default StudioHeader;\n","/**\n * useStudioManager Hook\n * \n * A custom hook that manages the studio's state and operations.\n * Handles tool selection, element management, and timeline interactions.\n * \n * @returns {Object} Studio manager methods and state\n * @property {string} selectedTool - Currently selected tool ID\n * @property {(tool: string) => void} setSelectedTool - Update selected tool\n * @property {TrackElement | null} selectedElement - Currently selected timeline element\n * @property {(element: TrackElement) => void} addElement - Add element to timeline\n * @property {(element: TrackElement) => void} updateElement - Update existing element\n * \n * @example\n * ```tsx\n * const {\n * selectedTool,\n * setSelectedTool,\n * selectedElement,\n * addElement,\n * updateElement\n * } = useStudioManager();\n * ```\n */\n\nimport { Track, TrackElement, useTimelineContext } from \"@twick/timeline\";\nimport { useEffect, useRef, useState } from \"react\";\n\nexport const useStudioManager = () => {\n const [selectedProp, setSelectedProp] = useState(\"element-props\");\n\n const { editor, selectedItem, setSelectedItem } = useTimelineContext();\n\n const selectedElement = selectedItem instanceof TrackElement ? selectedItem : null;\n\n const [ selectedTool, setSelectedTool ] = useState<string>(\"none\");\n\n const isToolChanged = useRef(false);\n\n const addElement = (element: TrackElement) => {\n if (selectedItem instanceof Track) {\n editor.addElementToTrack(selectedItem, element);\n } else {\n const newTrack = editor.addTrack(\"Track\");\n editor.addElementToTrack(newTrack, element);\n }\n };\n\n const updateElement = (element: TrackElement) => {\n const updatedElement =editor.updateElement(element);\n editor.refresh();\n setSelectedItem(updatedElement)\n };\n\n // const addSubtitlesToTimeline = (elements: TrackElement[]) => {\n // if (selectedItem instanceof Track && selectedItem.getType() == \"caption\") {\n // elements.forEach((element) => {\n // editor.addElementToTrack(selectedItem, element);\n // });\n // } else {\n // const newTrack = editor.addTrack(\"Track\", \"caption\");\n // elements.forEach((element) => {\n // editor.addElementToTrack(newTrack, element);\n // });\n // }\n // };\n\n useEffect(() => {\n if (selectedItem instanceof TrackElement) {\n setSelectedTool(selectedItem.getType());\n isToolChanged.current = true;\n } else if(selectedItem instanceof Track) {\n // do-nothing\n } else {\n if(isToolChanged.current) {\n setSelectedTool(\"none\");\n } else {\n setSelectedTool(\"video\");\n }\n }\n }, [selectedItem]);\n\n\n return {\n selectedProp, \n setSelectedProp,\n selectedTool, \n setSelectedTool,\n selectedElement,\n addElement,\n updateElement\n };\n};\n\n","/**\n * SubtitlesPanel Component\n * \n * A panel for managing video subtitles in the studio. Provides functionality\n * for creating, editing, and managing subtitle entries with timing and text.\n * Supports both manual entry and automatic generation (TODO).\n * \n * @component\n * @example\n * ```tsx\n * <SubtitlesPanel />\n * ```\n * \n * Features:\n * - Add/delete subtitle entries\n * - Set start/end times\n * - Edit subtitle text\n * - Automatic subtitle generation (planned)\n * - Save subtitles to timeline\n * \n * Each subtitle entry includes:\n * - Start time (in seconds)\n * - End time (in seconds)\n * - Subtitle text\n * - Delete and save actions\n */\n\nimport { useState } from \"react\";\nimport { Trash2, Check } from \"lucide-react\";\n\ninterface SubtitleEntry {\n id: string;\n start: number;\n end: number;\n text: string;\n}\n\nexport function SubtitlesPanel() {\n const [subtitles, setSubtitles] = useState<SubtitleEntry[]>([]);\n\n const handleGenerate = () => {\n // TODO: Generate subtitles automatically\n console.log(\"Generating subtitles...\");\n };\n\n const handleAdd = () => {\n const newId = (subtitles.length + 1).toString();\n const lastEnd = subtitles.length > 0 ? subtitles[subtitles.length - 1].end : 0;\n const newSubtitle: SubtitleEntry = {\n id: newId,\n start: lastEnd,\n end: lastEnd + 1,\n text: \"\"\n };\n setSubtitles([...subtitles, newSubtitle]);\n };\n\n const handleDelete = (id: string) => {\n setSubtitles(subtitles.filter(sub => sub.id !== id));\n };\n\n const handleSave = (id: string) => {\n // TODO: Save subtitle to timeline or database\n console.log(\"Saving subtitle:\", id);\n };\n\n const handleUpdateSubtitle = (id: string, field: keyof SubtitleEntry, value: string | number) => {\n setSubtitles(subtitles.map(sub => \n sub.id === id ? { ...sub, [field]: value } : sub\n ));\n };\n\n return (\n <div className=\"panel-container\">\n <h3 className=\"panel-title\">Subtitles</h3>\n\n {/* Top Bar - Action Buttons */}\n <div className=\"panel-section\">\n <div className=\"flex-container\">\n <button\n onClick={handleGenerate}\n className=\"btn-primary\"\n >\n Generate\n </button>\n <button\n onClick={handleAdd}\n className=\"btn-primary\"\n >\n Add\n </button>\n </div>\n </div>\n\n {/* Subtitle Entries */}\n {subtitles.map((subtitle) => (\n <div\n key={subtitle.id}\n className=\"panel-section\"\n >\n {/* Time Inputs */}\n <div className=\"flex-container\">\n <div>\n <label className=\"label-small\">Start</label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"0.1\"\n value={subtitle.start}\n onChange={(e) => handleUpdateSubtitle(subtitle.id, 'start', Number(e.target.value))}\n className=\"input-dark\"\n />\n </div>\n <div>\n <label className=\"label-small\">End</label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"0.1\"\n value={subtitle.end}\n onChange={(e) => handleUpdateSubtitle(subtitle.id, 'end', Number(e.target.value))}\n className=\"input-dark\"\n />\n </div>\n </div>\n\n {/* Subtitle Text Input */}\n <div>\n <label className=\"label-dark\">Subtitle Text</label>\n <input\n type=\"text\"\n placeholder=\"Enter subtitle text\"\n value={subtitle.text}\n onChange={(e) => handleUpdateSubtitle(subtitle.id, 'text', e.target.value)}\n className=\"input-dark\"\n />\n </div>\n\n {/* Action Buttons */}\n <div className=\"flex-container justify-between\">\n <button\n onClick={() => handleDelete(subtitle.id)}\n className=\"btn-danger\"\n title=\"Delete subtitle\"\n >\n <Trash2 className=\"icon-sm\" />\n </button>\n <button\n onClick={() => handleSave(subtitle.id)}\n className=\"btn-primary\"\n title=\"Save subtitle\"\n >\n <Check className=\"icon-sm\" />\n </button>\n </div>\n </div>\n ))}\n\n {/* Empty State */}\n {subtitles.length === 0 && (\n <div className=\"panel-section\">\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <p className=\"empty-state-text\">No subtitles yet</p>\n <p className=\"empty-state-subtext\">Click \"Add\" to create your first subtitle</p>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { Upload } from \"lucide-react\";\n\nconst FileInput = ({\n acceptFileTypes,\n onFileLoad,\n buttonText,\n id,\n className,\n icon,\n}: {\n acceptFileTypes: string[];\n onFileLoad: (content: any) => void;\n buttonText: string;\n id: string;\n className?: string;\n icon?: React.ReactNode;\n}) => {\n const onFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n try {\n onFileLoad({\n content:\n file.type === \"application/json\"\n ? event.target?.result\n : undefined,\n type: file.type,\n name: file.name,\n file: file,\n blobUrl: URL.createObjectURL(file),\n });\n } catch (error) {\n console.error(\"Error parsing file:\", error);\n }\n };\n console.log(\"file\", file);\n\n if (file.type === \"application/json\") {\n reader.readAsText(file);\n } else {\n reader.readAsDataURL(file);\n }\n }\n };\n\n return (\n <div className=\"file-input-container\">\n <input\n type=\"file\"\n accept={acceptFileTypes.join(\",\")}\n className=\"file-input-hidden\"\n id={id}\n onChange={onFileChange}\n />\n <label\n htmlFor={id}\n className={className || \"btn-primary file-input-label\"}\n >\n {icon || <Upload className=\"icon-sm\" />}\n {buttonText ?? \"Upload\"}\n </label>\n </div>\n );\n};\n\nexport default FileInput;\n","import { BrowserMediaManager } from \"@twick/video-editor\";\n\nclass MediaManagerSingleton {\n private static instance: BrowserMediaManager | null = null;\n\n private constructor() {}\n\n public static getInstance(): BrowserMediaManager {\n if (!MediaManagerSingleton.instance) {\n MediaManagerSingleton.instance = new BrowserMediaManager();\n }\n return MediaManagerSingleton.instance;\n }\n}\n\n// Export a function to get the singleton instance\nexport const getMediaManager = () => MediaManagerSingleton.getInstance(); ","import { useState } from \"react\";\nimport { Plus } from \"lucide-react\";\n\ntype MediaType = \"video\" | \"audio\" | \"image\";\n\nconst EXTENSIONS: Record<MediaType, string[]> = {\n video: [\"mp4\", \"webm\", \"ogg\", \"mov\", \"mkv\", \"m3u8\"],\n audio: [\"mp3\", \"wav\", \"ogg\", \"m4a\", \"aac\", \"flac\"],\n image: [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\"],\n};\n\nfunction isValidUrl(url: string) {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction matchesType(url: string, type: MediaType) {\n const pathname = (() => {\n try {\n return new URL(url).pathname.toLowerCase();\n } catch {\n return url.toLowerCase();\n }\n })();\n const ext = pathname.split(\".\").pop() || \"\";\n return EXTENSIONS[type].includes(ext);\n}\n\n// (name extraction removed; naming handled by caller if needed)\n\nexport default function UrlInput({\n type,\n onSubmit,\n}: {\n type: MediaType;\n onSubmit: (url: string) => void;\n}) {\n const [url, setUrl] = useState(\"\");\n const [error, setError] = useState<string>(\"\");\n\n const tryAdd = async () => {\n const trimmed = url.trim();\n if (!trimmed) return;\n\n if (!isValidUrl(trimmed)) {\n setError(\"Enter a valid URL\");\n return;\n }\n\n if (!matchesType(trimmed, type)) {\n setError(`URL must be a ${type} (${EXTENSIONS[type].join(\", \")})`);\n return;\n }\n\n setError(\"\");\n\n onSubmit(trimmed);\n setUrl(\"\");\n };\n\n const onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void tryAdd();\n }\n };\n\n return (\n <div>\n <div className=\"flex-container\">\n <input\n type=\"url\"\n placeholder={`Paste ${type} URL...`}\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={onKeyDown}\n className=\"input w-full\"\n />\n <button\n className=\"btn-ghost\"\n onClick={() => void tryAdd()}\n aria-label={`Add ${type} by URL`}\n >\n <Plus size={16} />\n </button>\n </div>\n {error ? <span className=\"text-error\">{error}</span> : null}\n </div>\n );\n}\n","import { createContext, useContext, useEffect, useState, ReactNode } from \"react\";\nimport type { MediaItem } from \"@twick/video-editor\";\nimport { getMediaManager } from \"../components/shared\";\n\ntype MediaType = \"video\" | \"audio\" | \"image\";\n\ninterface MediaState {\n items: MediaItem[];\n searchQuery: string;\n isLoading: boolean;\n}\n\ninterface MediaContextType {\n videoState: MediaState;\n audioState: MediaState;\n imageState: MediaState;\n setSearchQuery: (type: MediaType, query: string) => void;\n addItem: (type: MediaType, item: MediaItem) => void;\n}\n\nconst initialMediaState: MediaState = {\n items: [],\n searchQuery: \"\",\n isLoading: false,\n};\n\nconst MediaContext = createContext<MediaContextType | null>(null);\n\nexport function MediaProvider({ children }: { children: ReactNode }) {\n const [videoState, setVideoState] = useState<MediaState>(initialMediaState);\n const [audioState, setAudioState] = useState<MediaState>(initialMediaState);\n const [imageState, setImageState] = useState<MediaState>(initialMediaState);\n const mediaManager = getMediaManager();\n\n const getStateAndSetter = (type: MediaType): [MediaState, (state: MediaState) => void] => {\n switch (type) {\n case \"video\":\n return [videoState, setVideoState];\n case \"audio\":\n return [audioState, setAudioState];\n case \"image\":\n return [imageState, setImageState];\n }\n };\n\n const loadItems = async (type: MediaType, query: string) => {\n const [state, setState] = getStateAndSetter(type);\n \n setState({ ...state, isLoading: true });\n try {\n const results = await mediaManager.search({\n query,\n type,\n });\n setState({\n items: results,\n searchQuery: query,\n isLoading: false,\n });\n } catch (error) {\n console.error(`Error loading ${type} items:`, error);\n setState({\n ...state,\n isLoading: false,\n });\n }\n };\n\n // Load initial data for each type\n useEffect(() => {\n loadItems(\"video\", \"\");\n loadItems(\"audio\", \"\");\n loadItems(\"image\", \"\");\n }, []);\n\n const setSearchQuery = (type: MediaType, query: string) => {\n const [state, setState] = getStateAndSetter(type);\n setState({ ...state, searchQuery: query });\n loadItems(type, query);\n };\n\n const addItem = (type: MediaType, newItem: MediaItem) => {\n const [state, setState] = getStateAndSetter(type);\n setState({\n ...state,\n items: [...state.items, newItem],\n });\n };\n\n return (\n <MediaContext.Provider\n value={{\n videoState,\n audioState,\n imageState,\n setSearchQuery,\n addItem,\n }}\n >\n {children}\n </MediaContext.Provider>\n );\n}\n\nexport function useMedia(type: MediaType) {\n const context = useContext(MediaContext);\n if (!context) {\n throw new Error(\"useMedia must be used within a MediaProvider\");\n }\n\n const state = context[`${type}State`];\n return {\n items: state.items,\n searchQuery: state.searchQuery,\n isLoading: state.isLoading,\n setSearchQuery: (query: string) => context.setSearchQuery(type, query),\n addItem: (item: MediaItem) => context.addItem(type, item),\n };\n}\n","import {\n TrackElement,\n VideoElement,\n AudioElement,\n ImageElement,\n Size,\n} from \"@twick/timeline\";\nimport type { MediaItem } from \"@twick/video-editor\";\nimport { getMediaManager } from \"../components/shared\";\nimport { useMedia } from \"../context/media-context\";\n\nexport interface MediaPanelState {\n items: MediaItem[];\n searchQuery: string;\n isLoading: boolean;\n acceptFileTypes: string[];\n}\n\nexport interface MediaPanelActions {\n setSearchQuery: (query: string) => void;\n handleSelection: (item: MediaItem, forceAdd?: boolean) => void;\n handleFileUpload: (fileData: { file: File; blobUrl: string }) => void;\n}\n\nexport type MediaType = \"video\" | \"audio\" | \"image\";\n\nconst mediaConfigs = {\n video: {\n acceptFileTypes: [\"video/*\"] as string[],\n createElement: (url: string, parentSize: Size) =>\n new VideoElement(url, parentSize),\n updateElement: async (element: TrackElement, url: string) => {\n if (element instanceof VideoElement) {\n element.setSrc(url);\n await element.updateVideoMeta();\n }\n },\n },\n audio: {\n acceptFileTypes: [\"audio/*\"] as string[],\n createElement: (url: string, _parentSize: Size) => new AudioElement(url),\n updateElement: async (element: TrackElement, url: string) => {\n if (element instanceof AudioElement) {\n element.setSrc(url);\n await element.updateAudioMeta();\n }\n },\n },\n image: {\n acceptFileTypes: [\"image/*\"] as string[],\n createElement: (url: string, parentSize: Size) =>\n new ImageElement(url, parentSize),\n updateElement: async (element: TrackElement, url: string) => {\n if (element instanceof ImageElement) {\n element.setSrc(url);\n await element.updateImageMeta();\n }\n },\n },\n};\n\nexport const useMediaPanel = (\n type: MediaType,\n {\n selectedElement,\n addElement,\n updateElement,\n }: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n },\n videoResolution: Size\n): MediaPanelState & MediaPanelActions => {\n const { items, searchQuery, setSearchQuery, addItem, isLoading } =\n useMedia(type);\n const mediaManager = getMediaManager();\n\n const handleSelection = async (item: MediaItem, forceAdd?: boolean) => {\n const config = mediaConfigs[type];\n if (forceAdd) {\n const element = config.createElement(item.url, videoResolution);\n addElement(element);\n } else {\n if (selectedElement) {\n await config.updateElement(selectedElement, item.url);\n updateElement(selectedElement);\n } else {\n const element = config.createElement(item.url, videoResolution);\n addElement(element);\n }\n }\n };\n\n const handleFileUpload = async (fileData: {\n file: File;\n blobUrl: string;\n }) => {\n const arrayBuffer = await fileData.file.arrayBuffer();\n const newItem = await mediaManager.addItem({\n name: fileData.file.name,\n url: fileData.blobUrl,\n type,\n arrayBuffer,\n metadata: {\n name: fileData.file.name,\n size: fileData.file.size,\n type: fileData.file.type,\n },\n });\n addItem(newItem);\n };\n\n const config = mediaConfigs[type];\n return {\n items,\n searchQuery,\n setSearchQuery,\n handleSelection,\n handleFileUpload,\n isLoading,\n acceptFileTypes: config.acceptFileTypes,\n };\n};\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { MediaItem } from '@twick/video-editor';\n\nexport interface AudioPreviewState {\n playingAudio: string | null; // ID of currently playing audio\n audioElement: HTMLAudioElement | null;\n}\n\nexport interface AudioPreviewActions {\n togglePlayPause: (item: MediaItem) => void;\n stopPlayback: () => void;\n}\n\nexport const useAudioPreview = (): AudioPreviewState & AudioPreviewActions => {\n const [playingAudio, setPlayingAudio] = useState<string | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n\n // Cleanup audio element on unmount\n useEffect(() => {\n return () => {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current = null;\n }\n };\n }, []);\n\n const stopPlayback = useCallback(() => {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current = null;\n }\n setPlayingAudio(null);\n }, []);\n\n const togglePlayPause = useCallback((item: MediaItem) => {\n // If we're already playing this audio, stop it\n if (playingAudio === item.id) {\n stopPlayback();\n return;\n }\n\n // Stop any currently playing audio\n stopPlayback();\n\n // Start playing the new audio\n const audio = new Audio(item.url);\n audio.addEventListener('ended', stopPlayback);\n audio.play();\n audioRef.current = audio;\n setPlayingAudio(item.id);\n }, [playingAudio, stopPlayback]);\n\n return {\n playingAudio,\n audioElement: audioRef.current,\n togglePlayPause,\n stopPlayback,\n };\n};\n","/**\n * AudioPanel Component\n * \n * A panel for managing audio elements in the studio. Provides functionality\n * for searching, uploading, previewing, and adding audio files to the timeline.\n * \n * @component\n * @param {Object} props\n * @param {MediaItem[]} props.items - List of audio items to display\n * @param {string} props.searchQuery - Current search query\n * @param {string | null} props.playingAudio - ID of currently playing audio, if any\n * @param {(query: string) => void} props.onSearchChange - Handle search query changes\n * @param {(item: MediaItem) => void} props.onItemSelect - Handle audio item selection\n * @param {(item: MediaItem) => void} props.onPlayPause - Toggle audio preview playback\n * @param {(data: { file: File; blobUrl: string }) => void} props.onFileUpload - Handle file uploads\n * \n * @example\n * ```tsx\n * <AudioPanel\n * items={audioItems}\n * searchQuery=\"\"\n * playingAudio={null}\n * onSearchChange={setSearchQuery}\n * onItemSelect={handleSelect}\n * onPlayPause={togglePlayback}\n * onFileUpload={handleUpload}\n * />\n * ```\n */\n\nimport { Wand2, Plus, Volume2, Play, Pause, Upload } from \"lucide-react\";\nimport UrlInput from \"../shared/url-input\";\nimport FileInput from \"../shared/file-input\";\nimport type { AudioPanelProps } from \"../../types/media-panel\";\nimport { useAudioPreview } from \"../../hooks/use-audio-preview\";\n\n\nexport const AudioPanel = ({\n items,\n onItemSelect,\n onFileUpload,\n acceptFileTypes,\n onUrlAdd,\n}: AudioPanelProps) => {\n const { playingAudio, togglePlayPause } = useAudioPreview();\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Audio Library</div>\n\n {/* Add by URL */}\n <div className=\"panel-section\">\n <UrlInput type=\"audio\" onSubmit={onUrlAdd} />\n </div>\n\n {/* Upload */}\n <div className=\"flex panel-section\">\n <FileInput\n id=\"audio-upload\"\n acceptFileTypes={acceptFileTypes}\n onFileLoad={onFileUpload}\n buttonText=\"Import media\"\n className=\"btn-primary w-full\"\n icon={<Upload className=\"icon-sm\" />}\n />\n </div>\n\n {/* Audio List */}\n <div className=\"media-content\">\n <div className=\"media-list\">\n {(items || []).map((item) => (\n <div\n key={item.id}\n onDoubleClick={() => onItemSelect(item)}\n className=\"media-list-item\"\n >\n {/* Audio Info */}\n <div className=\"media-list-content\">\n {/* Play/Pause button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n togglePlayPause(item);\n }}\n className=\"media-action-btn\"\n >\n {playingAudio === item.id ? (\n <Pause className=\"icon-sm\" />\n ) : (\n <Play className=\"icon-sm\" />\n )}\n </button>\n\n {/* Audio Icon */}\n <div className={`media-list-icon ${playingAudio === item.id ? 'active' : ''}`}>\n <Volume2 className=\"icon-sm\" />\n </div>\n\n {/* Audio Title */}\n <div className=\"media-list-title\">\n {item.metadata?.title || item.metadata?.name}\n </div>\n\n {/* Quick Add button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onItemSelect(item, true);\n }}\n className=\"media-action-btn\"\n >\n <Plus className=\"icon-sm\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {/* Empty state */}\n {items.length === 0 && (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Wand2 className=\"empty-state-icon\" />\n <p className=\"empty-state-text\">No audio files found</p>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};","import { useMediaPanel } from \"../../hooks/use-media-panel\";\nimport { AudioPanel } from \"../panel/audio-panel\";\nimport type { PanelProps } from \"../../types\";\nimport { useMedia } from \"../../context/media-context\";\nimport { getMediaManager } from \"../shared\";\n\nexport const AudioPanelContainer = (props: PanelProps) => {\n const { addItem } = useMedia(\"audio\");\n const mediaManager = getMediaManager();\n const {\n items,\n searchQuery,\n setSearchQuery,\n handleSelection,\n handleFileUpload,\n isLoading,\n acceptFileTypes,\n } = useMediaPanel(\"audio\", {\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n },\n props.videoResolution);\n\n const onUrlAdd = async (url: string) => {\n const nameFromUrl = (() => {\n try {\n const u = new URL(url);\n const parts = u.pathname.split(\"/\").filter(Boolean);\n return decodeURIComponent(parts[parts.length - 1] || url);\n } catch {\n return url;\n }\n })();\n\n const newItem = await mediaManager.addItem({\n name: nameFromUrl,\n url,\n type: \"audio\",\n metadata: { source: \"url\" },\n });\n addItem(newItem);\n };\n\n return (\n <AudioPanel\n items={items}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onItemSelect={handleSelection}\n onFileUpload={handleFileUpload}\n isLoading={isLoading}\n acceptFileTypes={acceptFileTypes}\n onUrlAdd={onUrlAdd}\n />\n );\n};\n","/**\n * ImagePanel Component\n *\n * A panel for managing image elements in the studio. Provides functionality\n * for searching, uploading, previewing, and adding image files to the timeline.\n * Features a grid layout with image thumbnails and hover actions.\n *\n * @component\n * @param {Object} props\n * @param {MediaItem[]} props.items - List of image items to display\n * @param {string} props.searchQuery - Current search query\n * @param {(query: string) => void} props.setSearchQuery - Handle search query changes\n * @param {(item: MediaItem) => void} props.handleSelection - Handle image item selection\n * @param {(data: { file: File; blobUrl: string }) => void} props.handleFileUpload - Handle file uploads\n *\n * @example\n * ```tsx\n * <ImagePanel\n * items={imageItems}\n * searchQuery=\"\"\n * setSearchQuery={setSearchQuery}\n * handleSelection={handleSelect}\n * handleFileUpload={handleUpload}\n * />\n * ```\n */\n\nimport { Wand2, Plus, Upload } from \"lucide-react\";\nimport type { MediaItem } from \"@twick/video-editor\";\nimport type { ImagePanelProps } from \"../../types/media-panel\";\nimport FileInput from \"../shared/file-input\";\nimport UrlInput from \"../shared/url-input\";\n\nexport function ImagePanel({\n items,\n onItemSelect,\n onFileUpload,\n acceptFileTypes,\n onUrlAdd,\n}: ImagePanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Image Library</div>\n\n {/* Add by URL */}\n <div className=\"panel-section\">\n <UrlInput type=\"image\" onSubmit={onUrlAdd} />\n </div>\n {/* Upload */}\n <div className=\"flex panel-section\">\n <FileInput\n id=\"image-upload\"\n acceptFileTypes={acceptFileTypes}\n onFileLoad={onFileUpload}\n buttonText=\"Import media\"\n className=\"btn-primary w-full\"\n icon={<Upload className=\"icon-sm\" />}\n />\n </div>\n\n {/* Media Grid */}\n <div className=\"media-content\">\n <div className=\"media-grid\">\n {(items || []).map((item: MediaItem) => (\n <div\n key={item.id}\n onDoubleClick={() => onItemSelect(item)}\n className=\"media-item\"\n >\n <img src={item.url} alt=\"\" className=\"media-item-content\" />\n\n {/* Quick Actions */}\n <div className=\"media-actions\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onItemSelect(item, true);\n }}\n className=\"media-action-btn\"\n >\n <Plus className=\"icon-sm\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {/* Empty state */}\n {items.length === 0 && (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Wand2 className=\"empty-state-icon\" />\n <p className=\"empty-state-text\">No images found</p>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { PanelProps } from \"../../types\";\nimport { ImagePanel } from \"../panel/image-panel\";\nimport { useMediaPanel } from \"../../hooks/use-media-panel\";\nimport { useMedia } from \"../../context/media-context\";\nimport { getMediaManager } from \"../shared\";\n\nexport function ImagePanelContainer(props: PanelProps) {\n const { addItem } = useMedia(\"image\");\n const mediaManager = getMediaManager();\n const {\n items,\n searchQuery,\n setSearchQuery,\n handleSelection,\n handleFileUpload,\n isLoading,\n acceptFileTypes,\n } = useMediaPanel(\"image\", {\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n },\n props.videoResolution);\n\n const onUrlAdd = async (url: string) => {\n const nameFromUrl = (() => {\n try {\n const u = new URL(url);\n const parts = u.pathname.split(\"/\").filter(Boolean);\n return decodeURIComponent(parts[parts.length - 1] || url);\n } catch {\n return url;\n }\n })();\n\n const newItem = await mediaManager.addItem({\n name: nameFromUrl,\n url,\n type: \"image\",\n metadata: { source: \"url\" },\n });\n addItem(newItem);\n };\n\n return (\n <ImagePanel\n items={items}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onItemSelect={handleSelection}\n onFileUpload={handleFileUpload}\n isLoading={isLoading}\n acceptFileTypes={acceptFileTypes}\n onUrlAdd={onUrlAdd}\n />\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { MediaItem } from '@twick/video-editor';\n\nexport interface VideoPreviewState {\n playingVideo: string | null; // ID of currently playing video\n videoElement: HTMLVideoElement | null;\n}\n\nexport interface VideoPreviewActions {\n togglePlayPause: (item: MediaItem, videoElement: HTMLVideoElement) => void;\n stopPlayback: () => void;\n}\n\nexport const useVideoPreview = (): VideoPreviewState & VideoPreviewActions => {\n const [playingVideo, setPlayingVideo] = useState<string | null>(null);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n // Cleanup video element on unmount\n useEffect(() => {\n return () => {\n if (videoRef.current) {\n videoRef.current.pause();\n videoRef.current = null;\n }\n };\n }, []);\n\n const stopPlayback = useCallback(() => {\n if (videoRef.current) {\n videoRef.current.pause();\n videoRef.current = null;\n }\n setPlayingVideo(null);\n }, []);\n\n const togglePlayPause = useCallback((item: MediaItem, videoElement: HTMLVideoElement) => {\n // If we're already playing this video, pause it\n if (playingVideo === item.id) {\n videoElement.pause();\n stopPlayback();\n return;\n }\n\n // Stop any currently playing video\n stopPlayback();\n\n // Start playing the new video\n videoElement.currentTime = 0; // Reset to start\n videoElement.play();\n videoRef.current = videoElement;\n setPlayingVideo(item.id);\n\n // Add ended event listener\n videoElement.addEventListener('ended', stopPlayback, { once: true });\n }, [playingVideo, stopPlayback]);\n\n return {\n playingVideo,\n videoElement: videoRef.current,\n togglePlayPause,\n stopPlayback,\n };\n};","/**\n * VideoPanel Component\n * \n * A panel for managing video elements in the studio. Provides functionality\n * for searching, uploading, previewing, and adding video files to the timeline.\n * Features a grid layout with video thumbnails and hover actions.\n * \n * @component\n * @param {Object} props\n * @param {MediaItem[]} props.items - List of video items to display\n * @param {string} props.searchQuery - Current search query\n * @param {(query: string) => void} props.setSearchQuery - Handle search query changes\n * @param {(item: MediaItem) => void} props.handleSelection - Handle video item selection\n * @param {(data: { file: File; blobUrl: string }) => void} props.handleFileUpload - Handle file uploads\n * \n * @example\n * ```tsx\n * <VideoPanel\n * items={videoItems}\n * searchQuery=\"\"\n * setSearchQuery={setSearchQuery}\n * handleSelection={handleSelect}\n * handleFileUpload={handleUpload}\n * />\n * ```\n */\n\nimport { Wand2, Plus, Play, Pause, Upload } from \"lucide-react\";\nimport type { MediaItem } from \"@twick/video-editor\";\nimport type { VideoPanelProps } from \"../../types/media-panel\";\nimport { useVideoPreview } from \"../../hooks/use-video-preview\";\nimport FileInput from \"../shared/file-input\";\nimport UrlInput from \"../shared/url-input\";\n\n\nexport function VideoPanel({\n items,\n onItemSelect,\n onFileUpload,\n acceptFileTypes,\n onUrlAdd,\n}: VideoPanelProps) {\n const { playingVideo, togglePlayPause } = useVideoPreview();\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Video Library</div>\n\n {/* Add by URL */}\n <div className=\"flex panel-section\">\n <UrlInput type=\"video\" onSubmit={onUrlAdd} />\n </div>\n\n {/* Import Button */}\n <div className=\"flex panel-section\">\n <FileInput\n id=\"video-upload\"\n acceptFileTypes={acceptFileTypes}\n onFileLoad={onFileUpload}\n buttonText=\"Import media\"\n className=\"btn-primary w-full\"\n icon={<Upload className=\"icon-sm\" />}\n />\n </div>\n\n {/* Media Grid */}\n <div className=\"media-content\">\n <div className=\"media-grid\">\n {(items || []).map((item: MediaItem) => (\n <div\n key={item.id}\n onDoubleClick={() => onItemSelect(item)}\n className=\"media-item\"\n >\n <video\n src={item.url}\n poster={item.thumbnail}\n className=\"media-item-content\"\n ref={(el) => {\n if (el) {\n el.addEventListener('ended', () => {\n el.currentTime = 0;\n }, { once: true });\n }\n }}\n />\n\n {/* Duration */}\n {/* <div className=\"media-duration\">\n 0:13\n </div> */}\n\n {/* Quick Actions */}\n <div className=\"media-actions\">\n {/* Play/Pause button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n const videoEl = e.currentTarget.parentElement?.parentElement?.querySelector('video');\n if (videoEl) {\n togglePlayPause(item, videoEl);\n }\n }}\n className=\"media-action-btn\"\n >\n {playingVideo === item.id ? (\n <Pause className=\"icon-sm\" />\n ) : (\n <Play className=\"icon-sm\" />\n )}\n </button>\n\n {/* Add button */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onItemSelect(item, true);\n }}\n className=\"media-action-btn\"\n >\n <Plus className=\"icon-sm\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {/* Empty state */}\n {items.length === 0 && (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Wand2 className=\"empty-state-icon\" />\n <p className=\"empty-state-text\">No videos found</p>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}","import type { PanelProps } from \"../../types\";\nimport { VideoPanel } from \"../panel/video-panel\";\nimport { useMediaPanel } from \"../../hooks/use-media-panel\";\nimport { useMedia } from \"../../context/media-context\";\nimport { getMediaManager } from \"../shared\";\n\nexport function VideoPanelContainer(props: PanelProps) {\n const { addItem } = useMedia(\"video\");\n const mediaManager = getMediaManager();\n const {\n items,\n handleSelection,\n handleFileUpload,\n isLoading,\n acceptFileTypes,\n } = useMediaPanel(\"video\", {\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n },\n props.videoResolution);\n\n const onUrlAdd = async (url: string) => {\n const nameFromUrl = (() => {\n try {\n const u = new URL(url);\n const parts = u.pathname.split(\"/\").filter(Boolean);\n return decodeURIComponent(parts[parts.length - 1] || url);\n } catch {\n return url;\n }\n })();\n\n const newItem = await mediaManager.addItem({\n name: nameFromUrl,\n url,\n type: \"video\",\n metadata: { source: \"url\" },\n });\n addItem(newItem);\n };\n\n return (\n <VideoPanel\n items={items}\n onItemSelect={handleSelection}\n onFileUpload={handleFileUpload}\n isLoading={isLoading}\n acceptFileTypes={acceptFileTypes}\n onUrlAdd={onUrlAdd}\n />\n );\n}\n","/**\n * TextPanel Component\n * \n * A panel for creating and editing text elements in the studio. Provides comprehensive\n * text styling options including font selection, size, colors, stroke, and shadow effects.\n * \n * @component\n * @param {Object} props\n * @param {string} props.textContent - Text content to display\n * @param {number} props.fontSize - Font size in pixels\n * @param {string} props.selectedFont - Selected font family\n * @param {boolean} props.isBold - Whether text is bold\n * @param {boolean} props.isItalic - Whether text is italic\n * @param {string} props.textColor - Text color in hex format\n * @param {string} props.strokeColor - Stroke color in hex format\n * @param {boolean} props.applyShadow - Whether to apply shadow effect\n * @param {string} props.shadowColor - Shadow color in hex format\n * @param {number} props.strokeWidth - Width of text stroke\n * @param {string[]} props.fonts - Available font options\n * @param {(text: string) => void} props.setTextContent - Update text content\n * @param {(size: number) => void} props.setFontSize - Update font size\n * @param {(font: string) => void} props.setSelectedFont - Update selected font\n * @param {(bold: boolean) => void} props.setIsBold - Toggle bold style\n * @param {(italic: boolean) => void} props.setIsItalic - Toggle italic style\n * @param {(color: string) => void} props.setTextColor - Update text color\n * @param {(color: string) => void} props.setStrokeColor - Update stroke color\n * @param {(apply: boolean) => void} props.setApplyShadow - Toggle shadow effect\n * @param {(color: string) => void} props.setShadowColor - Update shadow color\n * @param {(width: number) => void} props.setStrokeWidth - Update stroke width\n * @param {() => void} props.handleApplyChanges - Apply text element changes\n * \n * @example\n * ```tsx\n * <TextPanel\n * textContent=\"Sample Text\"\n * fontSize={48}\n * selectedFont=\"Arial\"\n * isBold={false}\n * isItalic={false}\n * textColor=\"#000000\"\n * strokeColor=\"#ffffff\"\n * applyShadow={false}\n * shadowColor=\"#000000\"\n * strokeWidth={0}\n * fonts={[\"Arial\", \"Times New Roman\"]}\n * setTextContent={setText}\n * setFontSize={setSize}\n * // ... other handlers\n * />\n * ```\n */\n\nimport type { TextPanelState, TextPanelActions } from \"../../hooks/use-text-panel\";\n\nexport type TextPanelProps = TextPanelState & TextPanelActions;\n\nexport function TextPanel({\n textContent,\n fontSize,\n selectedFont,\n isBold,\n isItalic,\n textColor,\n strokeColor,\n applyShadow,\n shadowColor,\n strokeWidth,\n fonts,\n operation,\n setTextContent,\n setFontSize,\n setSelectedFont,\n setIsBold,\n setIsItalic,\n setTextColor,\n setStrokeColor,\n setApplyShadow,\n setShadowColor,\n setStrokeWidth,\n handleApplyChanges,\n}: TextPanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Text</div>\n {/* Text Content */}\n <div className=\"flex panel-section\">\n <input\n type=\"text\"\n value={textContent}\n placeholder=\"Sample\"\n onChange={(e) => setTextContent(e.target.value)}\n className=\"input-dark\"\n />\n </div>\n\n {/* Font Size */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Font Size</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"8\"\n max=\"120\"\n value={fontSize}\n onChange={(e) => setFontSize(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{fontSize}px</span>\n </div>\n </div>\n\n {/* Font */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Font</label>\n <div className=\"font-controls\">\n <select\n value={selectedFont}\n onChange={(e) => setSelectedFont(e.target.value)}\n className=\"select-dark\"\n >\n {fonts.map((font) => (\n <option key={font} value={font}>\n {font}\n </option>\n ))}\n </select>\n <button\n onClick={() => setIsBold(!isBold)}\n className={`btn-icon ${isBold ? 'btn-icon-active' : ''}`}\n >\n B\n </button>\n <button\n onClick={() => setIsItalic(!isItalic)}\n className={`btn-icon ${isItalic ? 'btn-icon-active' : ''}`}\n >\n I\n </button>\n </div>\n </div>\n\n {/* Colors */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Colors</label>\n <div className=\"color-section\">\n {/* Text Color */}\n <div className=\"color-control\">\n <label className=\"label-small\">Text Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={textColor}\n onChange={(e) => setTextColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={textColor}\n onChange={(e) => setTextColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Stroke Color */}\n <div className=\"color-control\">\n <label className=\"label-small\">Stroke Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Apply Shadow */}\n <div className=\"checkbox-control\">\n <label className=\"checkbox-label\">\n <input\n type=\"checkbox\"\n checked={applyShadow}\n onChange={(e) => setApplyShadow(e.target.checked)}\n className=\"checkbox-purple\"\n />\n Apply Shadow\n </label>\n </div>\n\n {/* Shadow Color - Only shown when shadow is enabled */}\n {applyShadow && (\n <div className=\"color-control\">\n <label className=\"label-small\">Shadow Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={shadowColor}\n onChange={(e) => setShadowColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={shadowColor}\n onChange={(e) => setShadowColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Stroke Width */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Stroke Width</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"2\"\n step={0.1}\n value={strokeWidth}\n onChange={(e) => setStrokeWidth(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{strokeWidth}</span>\n </div>\n </div>\n\n {/* Operation button */}\n <div className=\"flex panel-section\">\n <button onClick={handleApplyChanges} className=\"btn-primary w-full\">\n {operation}\n </button>\n </div>\n </div>\n );\n}","import { useEffect, useState } from \"react\";\nimport { TextElement, TrackElement, type TextAlign } from \"@twick/timeline\";\nimport { AVAILABLE_TEXT_FONTS } from \"@twick/video-editor\";\n\nexport const DEFAULT_TEXT_PROPS = {\n text: \"Sample\",\n fontSize: 48,\n fontFamily: \"Poppins\",\n fontWeight: 400,\n fontStyle: \"normal\",\n textColor: \"#ffffff\",\n strokeColor: \"#4d4d4d\",\n strokeWidth: 0,\n applyShadow: false,\n shadowColor: \"#000000\",\n textAlign: \"center\" as TextAlign,\n shadowOffset: [0, 0],\n shadowBlur: 2,\n shadowOpacity: 1.0,\n};\n\nexport interface TextPanelState {\n textContent: string;\n fontSize: number;\n selectedFont: string;\n isBold: boolean;\n isItalic: boolean;\n textColor: string;\n strokeColor: string;\n applyShadow: boolean;\n shadowColor: string;\n strokeWidth: number;\n fonts: string[];\n operation: string;\n}\n\nexport interface TextPanelActions {\n setTextContent: (text: string) => void;\n setFontSize: (size: number) => void;\n setSelectedFont: (font: string) => void;\n setIsBold: (bold: boolean) => void;\n setIsItalic: (italic: boolean) => void;\n setTextColor: (color: string) => void;\n setStrokeColor: (color: string) => void;\n setApplyShadow: (shadow: boolean) => void;\n setShadowColor: (color: string) => void;\n setStrokeWidth: (width: number) => void;\n handleApplyChanges: () => void;\n}\n\nexport const useTextPanel = ({\n selectedElement,\n addElement,\n updateElement,\n}: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}): TextPanelState & TextPanelActions => {\n const [textContent, setTextContent] = useState(DEFAULT_TEXT_PROPS.text);\n const [fontSize, setFontSize] = useState(DEFAULT_TEXT_PROPS.fontSize);\n const [selectedFont, setSelectedFont] = useState(DEFAULT_TEXT_PROPS.fontFamily);\n const [isBold, setIsBold] = useState(DEFAULT_TEXT_PROPS.fontWeight === 700);\n const [isItalic, setIsItalic] = useState(DEFAULT_TEXT_PROPS.fontStyle === \"italic\");\n const [textColor, setTextColor] = useState(DEFAULT_TEXT_PROPS.textColor);\n const [strokeColor, setStrokeColor] = useState(DEFAULT_TEXT_PROPS.strokeColor);\n const [applyShadow, setApplyShadow] = useState(DEFAULT_TEXT_PROPS.applyShadow);\n const [shadowColor, setShadowColor] = useState(DEFAULT_TEXT_PROPS.shadowColor);\n const [strokeWidth, setStrokeWidth] = useState(DEFAULT_TEXT_PROPS.strokeWidth);\n\n const fonts = Object.values(AVAILABLE_TEXT_FONTS);\n\n const handleApplyChanges = async () => {\n let textElement;\n if (selectedElement instanceof TextElement) {\n textElement = selectedElement;\n textElement.setText(textContent);\n textElement.setFontSize(fontSize);\n textElement.setFontFamily(selectedFont);\n textElement.setFontWeight(isBold ? 700 : 400);\n textElement.setFontStyle(isItalic ? \"italic\" : \"normal\");\n textElement.setFill(textColor);\n textElement.setStrokeColor(strokeColor);\n textElement.setLineWidth(strokeWidth);\n textElement.setTextAlign(DEFAULT_TEXT_PROPS.textAlign);\n if (applyShadow) {\n textElement.setProps({\n ...textElement.getProps(),\n shadowColor,\n shadowOffset: DEFAULT_TEXT_PROPS.shadowOffset,\n shadowBlur: DEFAULT_TEXT_PROPS.shadowBlur,\n shadowOpacity: DEFAULT_TEXT_PROPS.shadowOpacity,\n });\n } else {\n textElement.setProps({\n ...textElement.getProps(),\n shadowColor: undefined,\n shadowOffset: undefined,\n shadowBlur: undefined,\n shadowOpacity: undefined,\n });\n }\n updateElement(textElement);\n } else {\n textElement = new TextElement(textContent)\n .setFontSize(fontSize)\n .setFontFamily(selectedFont)\n .setFontWeight(isBold ? 700 : 400)\n .setFontStyle(isItalic ? \"italic\" : \"normal\")\n .setFill(textColor)\n .setStrokeColor(strokeColor)\n .setLineWidth(strokeWidth)\n .setTextAlign(\"center\");\n\n if (applyShadow) {\n textElement.setProps({\n ...textElement.getProps(),\n shadowColor,\n shadowOffset: DEFAULT_TEXT_PROPS.shadowOffset,\n shadowBlur: DEFAULT_TEXT_PROPS.shadowBlur,\n shadowOpacity: DEFAULT_TEXT_PROPS.shadowOpacity,\n });\n }\n await addElement(textElement);\n }\n };\n\n useEffect(() => {\n if (selectedElement instanceof TextElement) {\n setTextContent(selectedElement.getText());\n const textProps = selectedElement.getProps();\n setSelectedFont(textProps.fontFamily ?? DEFAULT_TEXT_PROPS.fontFamily);\n setFontSize(textProps.fontSize ?? DEFAULT_TEXT_PROPS.fontSize);\n setIsBold(textProps.fontWeight === 700);\n setIsItalic(textProps.fontStyle === \"italic\");\n setTextColor(textProps.fill ?? DEFAULT_TEXT_PROPS.textColor);\n setStrokeColor(textProps.stroke ?? DEFAULT_TEXT_PROPS.strokeColor);\n setStrokeWidth(textProps.lineWidth ?? DEFAULT_TEXT_PROPS.strokeWidth);\n const hasShadow = textProps.shadowColor !== undefined;\n setApplyShadow(hasShadow);\n if (hasShadow) {\n setShadowColor(textProps.shadowColor ?? DEFAULT_TEXT_PROPS.shadowColor);\n }\n } else {\n setTextContent(DEFAULT_TEXT_PROPS.text);\n setFontSize(DEFAULT_TEXT_PROPS.fontSize);\n setSelectedFont(DEFAULT_TEXT_PROPS.fontFamily);\n setIsBold(DEFAULT_TEXT_PROPS.fontWeight === 700);\n setIsItalic(DEFAULT_TEXT_PROPS.fontStyle === \"italic\");\n setTextColor(DEFAULT_TEXT_PROPS.textColor);\n setStrokeColor(DEFAULT_TEXT_PROPS.strokeColor);\n setStrokeWidth(DEFAULT_TEXT_PROPS.strokeWidth);\n setApplyShadow(DEFAULT_TEXT_PROPS.applyShadow);\n setShadowColor(DEFAULT_TEXT_PROPS.shadowColor);\n }\n }, [selectedElement]);\n\n return {\n textContent,\n fontSize,\n selectedFont,\n isBold,\n isItalic,\n textColor,\n strokeColor,\n applyShadow,\n shadowColor,\n strokeWidth,\n fonts,\n operation: selectedElement instanceof TextElement ? \"Apply Changes\": \"Add Text\",\n setTextContent,\n setFontSize,\n setSelectedFont,\n setIsBold,\n setIsItalic,\n setTextColor,\n setStrokeColor,\n setApplyShadow,\n setShadowColor,\n setStrokeWidth,\n handleApplyChanges,\n };\n};\n","import { TrackElement } from \"@twick/timeline\";\nimport { TextPanel } from \"../panel/text-panel\";\nimport { useTextPanel } from \"../../hooks/use-text-panel\";\n\ninterface TextPanelContainerProps {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}\n\nexport function TextPanelContainer(props: TextPanelContainerProps) {\n const textPanelProps = useTextPanel(props);\n return <TextPanel {...textPanelProps} />;\n}\n","import { Search } from \"lucide-react\";\n\nconst SearchInput = ({\n searchQuery,\n setSearchQuery,\n}: {\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n}) => {\n return (\n <div className=\"search-container\">\n <input\n type=\"text\"\n placeholder=\"Search media...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"input search-input w-full\"\n />\n <Search className=\"search-icon\" />\n </div>\n );\n};\n\nexport default SearchInput;\n","/**\n * IconPanel Component\n *\n * A panel for browsing, searching, and adding icons to the studio timeline.\n * Features a searchable grid of SVG icons with preview, add, and download actions.\n * Supports infinite scrolling with \"Load More\" functionality.\n *\n * @component\n * @param {Object} props\n * @param {Icon[]} props.icons - List of icons to display\n * @param {boolean} props.loading - Loading state indicator\n * @param {boolean} props.hasMore - Whether more icons can be loaded\n * @param {number} props.totalIcons - Total number of available icons\n * @param {string} props.searchQuery - Current search query\n * @param {(query: string) => void} props.handleSearch - Handle search query changes\n * @param {(icon: Icon) => void} props.handleSelection - Handle icon selection\n * @param {(icon: Icon) => void} props.handleDownloadIcon - Handle icon download\n * @param {() => void} props.handleLoadMore - Load more icons\n *\n * @example\n * ```tsx\n * <IconPanel\n * icons={icons}\n * loading={false}\n * hasMore={true}\n * totalIcons={1000}\n * searchQuery=\"\"\n * handleSearch={setSearchQuery}\n * handleSelection={addIconToTimeline}\n * handleDownloadIcon={downloadSvg}\n * handleLoadMore={loadNextPage}\n * />\n * ```\n */\n\nimport { Loader2, Download, Plus } from \"lucide-react\";\nimport type {\n IconPanelState,\n IconPanelActions,\n Icon,\n} from \"../../hooks/use-icon-panel\";\nimport SearchInput from \"../shared/search-input\";\n\nexport type IconPanelProps = IconPanelState & IconPanelActions;\n\nexport function IconPanel({\n icons,\n loading,\n totalIcons,\n searchQuery,\n handleSearch,\n handleSelection,\n handleDownloadIcon,\n handleLoadMore,\n}: IconPanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Icon Library</div>\n\n {/* Search */}\n <div className=\"flex panel-section\">\n <SearchInput searchQuery={searchQuery} setSearchQuery={handleSearch} />\n </div>\n\n {/* Icons Grid */}\n <div className=\"media-content\">\n {/* Results Count */}\n {totalIcons > 0 && (\n <div className=\"media-count\">\n Showing {icons.length} of {totalIcons} icons\n </div>\n )}\n\n {/* Loading State */}\n {loading && icons.length === 0 ? (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Loader2 className=\"empty-state-icon animate-spin\" />\n <p className=\"empty-state-text\">Loading icons...</p>\n </div>\n </div>\n ) : (\n <div className=\"icon-grid\">\n {(icons || []).map((icon: Icon, index: number) => (\n <div key={index} className=\"icon-item\">\n <div\n onClick={() => handleSelection(icon)}\n className=\"icon-content\"\n dangerouslySetInnerHTML={{ __html: icon.svg }}\n />\n\n {/* Quick Actions */}\n <div className=\"icon-actions\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleSelection(icon);\n }}\n className=\"icon-action-btn\"\n title=\"Add to timeline\"\n >\n <Plus className=\"icon-sm\" />\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDownloadIcon(icon);\n }}\n className=\"icon-action-btn\"\n title=\"Download SVG\"\n >\n <Download className=\"icon-sm\" />\n </button>\n </div>\n\n {/* Icon name */}\n <div className=\"icon-name\">{icon.name}</div>\n </div>\n ))}\n </div>\n )}\n\n {/* Empty State */}\n {!loading && icons.length === 0 && searchQuery && (\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <p className=\"empty-state-text\">No icons found</p>\n <p className=\"empty-state-subtext\">Try a different search term</p>\n </div>\n </div>\n )}\n\n {!loading && totalIcons && icons.length < totalIcons && (\n <div className=\"flex panel-section\">\n <button\n onClick={handleLoadMore}\n disabled={loading}\n className=\"btn-primary\"\n >\n Load More Icons\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect } from \"react\";\nimport { IconElement, TrackElement } from \"@twick/timeline\";\n\nexport interface Icon {\n name: string;\n svg: string;\n}\n\nexport interface IconPanelState {\n icons: Icon[];\n loading: boolean;\n hasMore: boolean;\n totalIcons: number;\n searchQuery: string;\n}\n\nexport interface IconPanelActions {\n handleSearch: (query: string) => void;\n handleSelection: (icon: Icon) => void;\n handleDownloadIcon: (icon: Icon) => void;\n handleLoadMore: () => void;\n}\n\nconst ICONS_PER_PAGE = 20;\n\nexport const useIconPanel = ({\n selectedElement,\n addElement,\n updateElement,\n}: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}): IconPanelState & IconPanelActions => {\n const [icons, setIcons] = useState<Icon[]>([]);\n const [loading, setLoading] = useState(false);\n const [page, setPage] = useState(1);\n const [hasMore, setHasMore] = useState(true);\n const [totalIcons, setTotalIcons] = useState(0);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const currentQuery = useRef(\"\");\n\n const fetchIcons = async (query: string, reset = false) => {\n try {\n setLoading(true);\n const newPage = reset ? 1 : page;\n const start = (newPage - 1) * ICONS_PER_PAGE;\n const url = `https://api.iconify.design/search?query=${query}&limit=${ICONS_PER_PAGE}&offset=${start}`;\n\n const response = await fetch(url);\n const data = await response.json();\n\n const iconData = data.icons || [];\n const total = data.total || 0;\n setTotalIcons(total);\n\n const formattedIcons = await Promise.all(\n iconData.map(async (icon: any) => {\n const svgUrl = `https://api.iconify.design/${icon}.svg`;\n\n try {\n const svgResponse = await fetch(svgUrl);\n const svg = await svgResponse.text();\n return { name: icon, svg };\n } catch (e) {\n console.error(`Error fetching SVG for ${icon}:`, e);\n return null;\n }\n })\n );\n\n const validIcons = formattedIcons.filter((icon) => icon !== null) as Icon[];\n\n if (reset) {\n setIcons(validIcons);\n } else {\n setIcons([...icons, ...validIcons]);\n }\n\n setHasMore(start + validIcons.length < total);\n if (!reset) {\n setPage(newPage + 1);\n } else {\n setPage(2);\n }\n } catch (error) {\n console.error(\"Error fetching icons:\", error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchIcons(\"media\", true);\n }, []);\n\n const handleSearch = (query: string) => {\n currentQuery.current = query;\n setSearchQuery(query);\n fetchIcons(query, true);\n };\n\n const handleSelection = (icon: Icon) => {\n const svgBlob = new Blob([icon.svg], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(svgBlob);\n\n let iconElement;\n if (selectedElement instanceof IconElement) {\n iconElement = selectedElement;\n iconElement.setSrc(url);\n iconElement.setName(icon.name);\n updateElement?.(iconElement);\n } else {\n iconElement = new IconElement(url, {\n width: 100,\n height: 100,\n });\n iconElement.setName(icon.name);\n addElement?.(iconElement);\n }\n\n URL.revokeObjectURL(url);\n };\n\n const handleDownloadIcon = (icon: Icon) => {\n const blob = new Blob([icon.svg], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${icon.name}.svg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n const handleLoadMore = () => {\n fetchIcons(currentQuery.current, false);\n };\n\n return {\n icons,\n loading,\n hasMore,\n totalIcons,\n searchQuery,\n handleSearch,\n handleSelection,\n handleDownloadIcon,\n handleLoadMore,\n };\n};\n","import type { PanelProps } from \"../../types\";\nimport { IconPanel } from \"../panel/icon-panel\";\nimport { useIconPanel } from \"../../hooks/use-icon-panel\";\n\nexport function IconPanelContainer(props: PanelProps) {\n const iconPanelProps = useIconPanel({\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n });\n return <IconPanel {...iconPanelProps} />;\n}","/**\n * RectPanel Component\n * \n * A panel for creating and editing rectangle shapes in the studio. Provides controls\n * for adjusting corner radius, fill color, opacity, stroke color, and line width.\n * \n * @component\n * @param {Object} props\n * @param {number} props.cornerRadius - Corner radius in pixels\n * @param {string} props.fillColor - Fill color in hex format\n * @param {number} props.opacity - Opacity percentage (0-100)\n * @param {string} props.strokeColor - Stroke color in hex format\n * @param {number} props.lineWidth - Stroke width in pixels\n * @param {(radius: number) => void} props.setCornerRadius - Update corner radius\n * @param {(color: string) => void} props.setFillColor - Update fill color\n * @param {(opacity: number) => void} props.setOpacity - Update opacity\n * @param {(color: string) => void} props.setStrokeColor - Update stroke color\n * @param {(width: number) => void} props.setLineWidth - Update line width\n * @param {() => void} props.handleApplyChanges - Apply rectangle element changes\n * \n * @example\n * ```tsx\n * <RectPanel\n * cornerRadius={10}\n * fillColor=\"#ff0000\"\n * opacity={100}\n * strokeColor=\"#000000\"\n * lineWidth={2}\n * setCornerRadius={setRadius}\n * setFillColor={setFill}\n * setOpacity={setOpacity}\n * setStrokeColor={setStroke}\n * setLineWidth={setWidth}\n * handleApplyChanges={applyChanges}\n * />\n * ```\n */\n\nimport type { RectPanelState, RectPanelActions } from \"../../hooks/use-rect-panel\";\n\nexport type RectPanelProps = RectPanelState & RectPanelActions;\n\nexport function RectPanel({\n cornerRadius,\n fillColor,\n opacity,\n strokeColor,\n lineWidth,\n operation,\n setCornerRadius,\n setFillColor,\n setOpacity,\n setStrokeColor,\n setLineWidth,\n handleApplyChanges,\n}: RectPanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Rectangle</div>\n {/* Corner Radius */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Corner Radius</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={cornerRadius}\n onChange={(e) => setCornerRadius(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{cornerRadius}px</span>\n </div>\n </div>\n\n {/* Fill Color */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Fill Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={fillColor}\n onChange={(e) => setFillColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={fillColor}\n onChange={(e) => setFillColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Opacity */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Opacity</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={opacity}\n onChange={(e) => setOpacity(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{opacity}%</span>\n </div>\n </div>\n\n {/* Stroke Color */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Stroke Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Line Width */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Line Width</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"20\"\n value={lineWidth}\n onChange={(e) => setLineWidth(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{lineWidth}px</span>\n </div>\n </div>\n\n {/* Operation button */}\n <div className=\"flex panel-section\">\n <button\n onClick={handleApplyChanges}\n className=\"btn-primary w-full\"\n >\n {operation}\n </button>\n </div>\n </div>\n );\n}","import { useEffect, useState } from \"react\";\nimport { RectElement, TrackElement } from \"@twick/timeline\";\n\nexport const DEFAULT_RECT_PROPS = {\n cornerRadius: 0,\n fillColor: \"#3b82f6\",\n opacity: 100,\n strokeColor: \"#000000\",\n lineWidth: 0,\n};\n\nexport interface RectPanelState {\n cornerRadius: number;\n fillColor: string;\n opacity: number;\n strokeColor: string;\n lineWidth: number;\n operation: string;\n}\n\nexport interface RectPanelActions {\n setCornerRadius: (radius: number) => void;\n setFillColor: (color: string) => void;\n setOpacity: (opacity: number) => void;\n setStrokeColor: (color: string) => void;\n setLineWidth: (width: number) => void;\n handleApplyChanges: () => void;\n}\n\nexport const useRectPanel = ({\n selectedElement,\n addElement,\n updateElement,\n}: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}): RectPanelState & RectPanelActions => {\n const [cornerRadius, setCornerRadius] = useState(DEFAULT_RECT_PROPS.cornerRadius);\n const [fillColor, setFillColor] = useState(DEFAULT_RECT_PROPS.fillColor);\n const [opacity, setOpacity] = useState(DEFAULT_RECT_PROPS.opacity);\n const [strokeColor, setStrokeColor] = useState(DEFAULT_RECT_PROPS.strokeColor);\n const [lineWidth, setLineWidth] = useState(DEFAULT_RECT_PROPS.lineWidth);\n\n const handleApplyChanges = () => {\n let rectElement;\n if (selectedElement instanceof RectElement) {\n rectElement = selectedElement;\n rectElement.setCornerRadius(cornerRadius);\n rectElement.setOpacity(opacity);\n rectElement.setStrokeColor(strokeColor);\n rectElement.setLineWidth(lineWidth);\n updateElement?.(rectElement);\n } else {\n rectElement = new RectElement(fillColor, { width: 200, height: 200 })\n .setCornerRadius(cornerRadius)\n .setOpacity(opacity)\n .setStrokeColor(strokeColor)\n .setLineWidth(lineWidth);\n addElement?.(rectElement);\n }\n };\n\n useEffect(() => {\n if (selectedElement instanceof RectElement) {\n setCornerRadius(selectedElement.getCornerRadius() ?? DEFAULT_RECT_PROPS.cornerRadius);\n setFillColor(selectedElement.getFill() ?? DEFAULT_RECT_PROPS.fillColor);\n setOpacity(selectedElement.getOpacity() ?? DEFAULT_RECT_PROPS.opacity);\n setStrokeColor(selectedElement.getStrokeColor() ?? DEFAULT_RECT_PROPS.strokeColor);\n setLineWidth(selectedElement.getLineWidth() ?? DEFAULT_RECT_PROPS.lineWidth);\n }\n }, [selectedElement]);\n\n return {\n cornerRadius,\n fillColor,\n opacity,\n strokeColor,\n lineWidth,\n operation: selectedElement instanceof RectElement ? \"Apply Changes\": \"Add Rectangle\",\n setCornerRadius,\n setFillColor,\n setOpacity,\n setStrokeColor,\n setLineWidth,\n handleApplyChanges,\n };\n};\n","import type { PanelProps } from \"../../types\";\nimport { RectPanel } from \"../panel/rect-panel\";\nimport { useRectPanel } from \"../../hooks/use-rect-panel\";\n\nexport function RectPanelContainer(props: PanelProps) {\n const rectPanelProps = useRectPanel({\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n });\n return <RectPanel {...rectPanelProps} />;\n}\n","/**\n * CirclePanel Component\n *\n * A panel for creating and editing circle shapes in the studio. Provides controls\n * for adjusting radius, fill color, opacity, stroke color, and line width.\n *\n * @component\n * @param {Object} props\n * @param {number} props.radius - Circle radius in pixels\n * @param {string} props.fillColor - Fill color in hex format\n * @param {number} props.opacity - Opacity percentage (0-100)\n * @param {string} props.strokeColor - Stroke color in hex format\n * @param {number} props.lineWidth - Stroke width in pixels\n * @param {(radius: number) => void} props.setRadius - Update circle radius\n * @param {(color: string) => void} props.setFillColor - Update fill color\n * @param {(opacity: number) => void} props.setOpacity - Update opacity\n * @param {(color: string) => void} props.setStrokeColor - Update stroke color\n * @param {(width: number) => void} props.setLineWidth - Update line width\n * @param {() => void} props.handleApplyChanges - Apply circle element changes\n *\n * @example\n * ```tsx\n * <CirclePanel\n * radius={50}\n * fillColor=\"#ff0000\"\n * opacity={100}\n * strokeColor=\"#000000\"\n * lineWidth={2}\n * setRadius={setRadius}\n * setFillColor={setFill}\n * setOpacity={setOpacity}\n * setStrokeColor={setStroke}\n * setLineWidth={setWidth}\n * handleApplyChanges={applyChanges}\n * />\n * ```\n */\n\nimport type {\n CirclePanelState,\n CirclePanelActions,\n} from \"../../hooks/use-circle-panel\";\n\nexport type CirclePanelProps = CirclePanelState & CirclePanelActions;\n\nexport function CirclePanel({\n radius,\n fillColor,\n opacity,\n strokeColor,\n lineWidth,\n operation,\n setRadius,\n setFillColor,\n setOpacity,\n setStrokeColor,\n setLineWidth,\n handleApplyChanges,\n}: CirclePanelProps) {\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Circle</div>\n {/* Radius */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Radius</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"10\"\n max=\"300\"\n value={radius}\n onChange={(e) => setRadius(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{radius}px</span>\n </div>\n </div>\n\n {/* Fill Color */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Fill Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={fillColor}\n onChange={(e) => setFillColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={fillColor}\n onChange={(e) => setFillColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Opacity */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Opacity</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={opacity}\n onChange={(e) => setOpacity(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{opacity}%</span>\n </div>\n </div>\n\n {/* Stroke Color */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Stroke Color</label>\n <div className=\"color-inputs\">\n <input\n type=\"color\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-picker\"\n />\n <input\n type=\"text\"\n value={strokeColor}\n onChange={(e) => setStrokeColor(e.target.value)}\n className=\"color-text\"\n />\n </div>\n </div>\n\n {/* Line Width */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Line Width</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"20\"\n value={lineWidth}\n onChange={(e) => setLineWidth(Number(e.target.value))}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{lineWidth}px</span>\n </div>\n </div>\n\n {/* Operation button */}\n <div className=\"flex panel-section\">\n <button onClick={handleApplyChanges} className=\"btn-primary w-full\">\n {operation}\n </button>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { CircleElement, TrackElement } from \"@twick/timeline\";\n\nexport const DEFAULT_CIRCLE_PROPS = {\n radius: 50,\n fillColor: \"#3b82f6\",\n opacity: 100,\n strokeColor: \"#000000\",\n lineWidth: 0,\n};\n\nexport interface CirclePanelState {\n radius: number;\n fillColor: string;\n opacity: number;\n strokeColor: string;\n lineWidth: number;\n operation: string;\n}\n\nexport interface CirclePanelActions {\n setRadius: (radius: number) => void;\n setFillColor: (color: string) => void;\n setOpacity: (opacity: number) => void;\n setStrokeColor: (color: string) => void;\n setLineWidth: (width: number) => void;\n handleApplyChanges: () => void;\n}\n\nexport const useCirclePanel = ({\n selectedElement,\n addElement,\n updateElement,\n}: {\n selectedElement: TrackElement | null;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}): CirclePanelState & CirclePanelActions => {\n const [radius, setRadius] = useState(DEFAULT_CIRCLE_PROPS.radius);\n const [fillColor, setFillColor] = useState(DEFAULT_CIRCLE_PROPS.fillColor);\n const [opacity, setOpacity] = useState(DEFAULT_CIRCLE_PROPS.opacity);\n const [strokeColor, setStrokeColor] = useState(DEFAULT_CIRCLE_PROPS.strokeColor);\n const [lineWidth, setLineWidth] = useState(DEFAULT_CIRCLE_PROPS.lineWidth);\n\n const handleApplyChanges = () => {\n let circleElement;\n if (selectedElement instanceof CircleElement) {\n circleElement = selectedElement;\n circleElement.setRadius(radius);\n circleElement.setFill(fillColor);\n circleElement.setOpacity(opacity);\n circleElement.setStrokeColor(strokeColor);\n circleElement.setLineWidth(lineWidth);\n updateElement?.(circleElement);\n } else {\n circleElement = new CircleElement(fillColor, radius)\n .setOpacity(opacity)\n .setStrokeColor(strokeColor)\n .setLineWidth(lineWidth);\n addElement?.(circleElement);\n }\n };\n\n useEffect(() => {\n if (selectedElement instanceof CircleElement) {\n setRadius(selectedElement.getRadius() ?? DEFAULT_CIRCLE_PROPS.radius);\n setFillColor(selectedElement.getFill() ?? DEFAULT_CIRCLE_PROPS.fillColor);\n setOpacity(selectedElement.getOpacity() ?? DEFAULT_CIRCLE_PROPS.opacity);\n setStrokeColor(selectedElement.getStrokeColor() ?? DEFAULT_CIRCLE_PROPS.strokeColor);\n setLineWidth(selectedElement.getLineWidth() ?? DEFAULT_CIRCLE_PROPS.lineWidth);\n }\n }, [selectedElement]);\n\n return {\n radius,\n fillColor,\n opacity,\n strokeColor,\n lineWidth,\n operation: selectedElement instanceof CircleElement ? \"Apply Changes\": \"Add Circle\",\n setRadius,\n setFillColor,\n setOpacity,\n setStrokeColor,\n setLineWidth,\n handleApplyChanges,\n };\n};\n","import type { PanelProps } from \"../../types\";\nimport { CirclePanel } from \"../panel/circle-panel\";\nimport { useCirclePanel } from \"../../hooks/use-circle-panel\";\n\nexport function CirclePanelContainer(props: PanelProps) {\n const circlePanelProps = useCirclePanel({\n selectedElement: props.selectedElement ?? null,\n addElement: props.addElement!,\n updateElement: props.updateElement!,\n });\n return <CirclePanel {...circlePanelProps} />;\n}","import { SubtitlesPanel } from \"../panel/subtitles-panel\";\nimport { Size, TrackElement } from \"@twick/timeline\";\nimport { AudioPanelContainer } from \"./audio-panel-container\";\nimport { ImagePanelContainer } from \"./image-panel-container\";\nimport { VideoPanelContainer } from \"./video-panel-container\";\nimport { TextPanelContainer } from \"./text-panel-container\";\nimport { IconPanelContainer } from \"./icon-panel-container\";\nimport { RectPanelContainer } from \"./rect-panel-container\";\nimport { CirclePanelContainer } from \"./circle-panel-container\";\nimport { Wand2 } from \"lucide-react\";\n\ninterface ElementPanelContainerProps {\n selectedTool: string;\n selectedElement: TrackElement | null;\n videoResolution: Size;\n setSelectedTool: (tool: string) => void;\n addElement: (element: TrackElement) => void;\n updateElement: (element: TrackElement) => void;\n}\n\nconst ElementPanelContainer = ({\n selectedTool,\n setSelectedTool,\n videoResolution,\n selectedElement,\n addElement,\n updateElement,\n}: ElementPanelContainerProps): JSX.Element => {\n const addNewElement = async (element: TrackElement) => {\n await addElement(element);\n if (![\"image\", \"video\", \"audio\"].includes(selectedTool)) {\n setSelectedTool(\"none\");\n }\n };\n\n // Render appropriate library based on selected tool\n const renderLibrary = () => {\n switch (selectedTool) {\n case \"image\":\n return (\n <ImagePanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"audio\":\n return (\n <AudioPanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"video\":\n return (\n <VideoPanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"text\":\n return (\n <TextPanelContainer\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"icon\":\n return (\n <IconPanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"rect\":\n return (\n <RectPanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"circle\":\n return (\n <CirclePanelContainer\n videoResolution={videoResolution}\n selectedElement={selectedElement}\n addElement={addNewElement}\n updateElement={updateElement}\n />\n );\n case \"subtitle\":\n return <SubtitlesPanel />;\n default:\n return (\n <div className=\"panel-container\">\n <div className=\"empty-state\">\n <div className=\"empty-state-content\">\n <Wand2 className=\"empty-state-icon\" />\n <p className=\"empty-state-text\">Select a Tool to Begin</p>\n </div>\n </div>\n </div>\n );\n }\n };\n\n return renderLibrary();\n};\n\nexport default ElementPanelContainer;\n","/**\n * PropsToolbar Component\n *\n * A vertical toolbar that provides quick access to different property sections\n * for the selected element. Displays icons for each section.\n *\n * @component\n * @param {Object} props\n * @param {TrackElement} props.selectedElement - The currently selected element to display properties for\n * @param {string} props.selectedProp - The currently selected property to display\n * @param {Function} props.setSelectedProp - The function to set the currently selected property\n *\n * @example\n * ```tsx\n * <PropsToolbar\n * selectedElement={someElement}\n * selectedProp={someProp}\n * setSelectedProp={someFunction}\n * />\n * ```\n */\n\nimport {\n Type,\n Image,\n Music,\n Infinity,\n Zap,\n MessageSquare,\n Plus,\n Settings,\n SparklesIcon,\n} from \"lucide-react\";\nimport type { ToolCategory } from \"../types\";\nimport {\n AudioElement,\n CaptionElement,\n CircleElement,\n IconElement,\n ImageElement,\n RectElement,\n TextElement,\n TrackElement,\n VideoElement,\n} from \"@twick/timeline\";\nimport { useEffect, useMemo } from \"react\";\n\nconst propsCategories: Map<string, ToolCategory> = new Map([\n [\n \"element-props\",\n {\n id: \"element-props\",\n name: \"Properties\",\n icon: \"Settings\",\n description: \"Element Properties\",\n },\n ],\n [\n \"animations\",\n {\n id: \"animations\",\n name: \"Animations\",\n icon: \"Zap\",\n description: \"Animations\",\n },\n ],\n [\n \"text-effects\",\n {\n id: \"text-effects\",\n name: \"Text Effects\",\n icon: \"SparklesIcon\",\n description: \"Text Effects\",\n },\n ],\n [\n \"color-effects\",\n {\n id: \"color-effects\",\n name: \"Color Effects\",\n icon: \"Image\",\n description: \"Color Effects\",\n },\n ],\n [\n \"playback-props\",\n {\n id: \"playback-props\",\n name: \"Playback Props\",\n icon: \"Music\",\n description: \"Playback Properties\",\n },\n ],\n [\n \"subtitle-style\",\n {\n id: \"subtitle-style\",\n name: \"Subtitle Style\",\n icon: \"MessageSquare\",\n description: \"Subtitle Style\",\n },\n ],\n]);\n\nconst getIcon = (iconName: string) => {\n switch (iconName) {\n case \"Type\":\n return Type;\n case \"Infinity\":\n return Infinity;\n case \"Image\":\n return Image;\n case \"Music\":\n return Music;\n case \"MessageSquare\":\n return MessageSquare;\n case \"Settings\":\n return Settings;\n case \"SparklesIcon\":\n return SparklesIcon;\n case \"Zap\":\n return Zap;\n default:\n return Plus;\n }\n};\n\nexport function PropsToolbar({\n selectedElement,\n selectedProp,\n setSelectedProp,\n}: {\n selectedElement: TrackElement | null;\n selectedProp: string;\n setSelectedProp: (prop: string) => void;\n}) {\n const availableSections = useMemo(() => {\n const sections: ToolCategory[] = [];\n if (selectedElement instanceof TextElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n sections.push(propsCategories.get(\"text-effects\")!);\n } else if (selectedElement instanceof ImageElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n sections.push(propsCategories.get(\"color-effects\")!);\n } else if (selectedElement instanceof VideoElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n sections.push(propsCategories.get(\"color-effects\")!);\n sections.push(propsCategories.get(\"playback-props\")!);\n } else if (selectedElement instanceof AudioElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"playback-props\")!);\n } else if (selectedElement instanceof CircleElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n } else if (selectedElement instanceof RectElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n } else if (selectedElement instanceof IconElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n } else if (selectedElement instanceof CaptionElement) {\n sections.push(propsCategories.get(\"element-props\")!);\n sections.push(propsCategories.get(\"animations\")!);\n sections.push(propsCategories.get(\"subtitle-style\")!);\n }\n return sections;\n }, [selectedElement]);\n\n useEffect(() => {\n if (availableSections?.length) {\n if (\n availableSections.map((section) => section.id).indexOf(selectedProp) ===\n -1\n ) {\n setSelectedProp(availableSections[0].id);\n }\n }\n }, [availableSections]);\n \n return (\n <div className=\"sidebar\">\n {/* Main Tools */}\n {availableSections.map((tool) => {\n const Icon = getIcon(tool.icon);\n const isSelected = selectedProp === tool.id;\n return (\n <div\n key={tool.id}\n onClick={() => setSelectedProp(tool.id)}\n className={`toolbar-btn ${isSelected ? \"active\" : \"\"}`}\n title={`${tool.name}${tool.shortcut ? ` (${tool.shortcut})` : \"\"}`}\n >\n <Icon className=\"icon-sm\" />\n <span className=\"props-toolbar-label\">{tool.name}</span>\n </div>\n );\n })}\n </div>\n );\n}\n","import type { PropertiesPanelProps } from \"../../types\";\n\nexport function ElementProps({ selectedElement, updateElement }: PropertiesPanelProps) {\n const elementProps = selectedElement?.getProps() || {};\n const {x, y, opacity, rotation} = elementProps;\n\n const handleUpdateElement = (props: Record<string, any>) => {\n if(selectedElement) {\n updateElement?.(selectedElement?.setProps({...elementProps,...props}));\n }\n }\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">All Properties</div>\n <div className=\"panel-section\">\n <label className=\"label-dark\">Position</label>\n <div className=\"flex-container\">\n <div>\n <label className=\"label-small\">X</label>\n <input\n type=\"number\"\n value={x ?? 0}\n onChange={(e) => handleUpdateElement({ x: Number(e.target.value)})}\n className=\"input-dark\"\n />\n </div>\n <div>\n <label className=\"label-small\">Y</label>\n <input\n type=\"number\"\n value={y ?? 0}\n onChange={(e) => handleUpdateElement({ y: Number(e.target.value)})}\n className=\"input-dark\"\n />\n </div>\n </div>\n </div>\n\n {/* Opacity */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Opacity</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={(opacity ?? 1) * 100}\n onChange={(e) => handleUpdateElement({ opacity: Number(e.target.value) / 100})}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{Math.round((opacity ?? 1) * 100)}%</span>\n </div>\n </div>\n\n {/* Rotation */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Rotation</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"360\"\n value={rotation ?? 0}\n onChange={(e) => handleUpdateElement({ rotation: Number(e.target.value)})}\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{rotation ?? 0}°</span>\n </div>\n </div>\n </div>\n );\n}\n","import { TEXT_EFFECTS } from \"@twick/video-editor\";\nimport { ElementTextEffect, TextElement } from \"@twick/timeline\";\nimport type { PropertiesPanelProps } from \"../../types\";\n\nexport function TextEffects({\n selectedElement,\n updateElement,\n}: PropertiesPanelProps) {\n if (!(selectedElement instanceof TextElement)) return null;\n\n const currentEffect = selectedElement.getTextEffect();\n\n const handleUpdateEffect = (props: {\n name?: string;\n delay?: number;\n duration?: number;\n bufferTime?: number;\n }) => {\n if (!selectedElement || !(selectedElement instanceof TextElement)) return;\n\n let effect = currentEffect;\n\n // If name is provided and empty, remove effect\n if (props.name === \"\") {\n selectedElement.setTextEffect(undefined);\n updateElement?.(selectedElement);\n return;\n }\n\n // Create new effect if none exists or name is changing\n if (!effect || (props.name && props.name !== effect.getName())) {\n effect = new ElementTextEffect(\n props.name || currentEffect?.getName() || TEXT_EFFECTS[0].name\n );\n // Set default values for new effect\n effect.setDelay(0);\n effect.setDuration(1);\n effect.setBufferTime(0.1);\n }\n\n // Update effect properties\n if (props.delay !== undefined) effect.setDelay(props.delay);\n if (props.duration !== undefined) effect.setDuration(props.duration);\n if (props.bufferTime !== undefined) effect.setBufferTime(props.bufferTime);\n\n // Update element with new/modified effect\n selectedElement.setTextEffect(effect);\n updateElement?.(selectedElement);\n };\n\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Text Effects</div>\n {/* Text Effect Selection */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Text Effect Type</label>\n <select\n value={currentEffect?.getName() || \"\"}\n onChange={(e) => handleUpdateEffect({ name: e.target.value })}\n className=\"select-dark w-full\"\n >\n <option value=\"\">No Effect</option>\n {TEXT_EFFECTS.map((effect) => (\n <option key={effect.name} value={effect.name}>\n {effect.name.charAt(0).toUpperCase() + effect.name.slice(1)}\n </option>\n ))}\n </select>\n </div>\n\n {/* Text Effect Options */}\n {currentEffect && (\n <>\n {/* Delay */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Delay (seconds)</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"5\"\n step=\"0.1\"\n value={currentEffect.getDelay() ?? 0}\n onChange={(e) =>\n handleUpdateEffect({ delay: Number(e.target.value) })\n }\n className=\"input-dark\"\n />\n </div>\n\n {/* Duration */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Duration (seconds)</label>\n <input\n type=\"number\"\n min=\"0.1\"\n max=\"10\"\n step=\"0.1\"\n value={currentEffect.getDuration() ?? 1}\n onChange={(e) =>\n handleUpdateEffect({ duration: Number(e.target.value) })\n }\n className=\"input-dark\"\n />\n </div>\n\n {/* Buffer Time */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Buffer Time (seconds)</label>\n <input\n type=\"number\"\n min=\"0.05\"\n max=\"1\"\n step=\"0.05\"\n value={currentEffect.getBufferTime() ?? 0.1}\n onChange={(e) =>\n handleUpdateEffect({ bufferTime: Number(e.target.value) })\n }\n className=\"input-dark\"\n />\n </div>\n </>\n )}\n </div>\n );\n}\n","import { ANIMATIONS } from \"@twick/video-editor\";\nimport { ElementAnimation, TrackElement } from \"@twick/timeline\";\nimport type { PropertiesPanelProps } from \"../../types\";\n\nexport function Animation({\n selectedElement,\n updateElement,\n}: PropertiesPanelProps) {\n if (!(selectedElement instanceof TrackElement)) return null;\n\n const currentAnimation = selectedElement?.getAnimation();\n\n const handleUpdateAnimation = (props: {\n name?: string;\n interval?: number;\n duration?: number;\n intensity?: number;\n animate?: \"enter\" | \"exit\" | \"both\";\n mode?: \"in\" | \"out\";\n direction?: \"up\" | \"down\" | \"left\" | \"right\" | \"center\";\n }) => {\n if (!selectedElement) return;\n\n let animation = currentAnimation;\n\n // If name is provided and empty, remove animation\n if (props.name === \"\") {\n selectedElement.setAnimation(undefined);\n updateElement?.(selectedElement);\n return;\n }\n\n // Find animation definition\n const animationDef = ANIMATIONS.find(\n (a) => a.name === (props.name || currentAnimation?.getName())\n );\n if (!animationDef) return;\n\n // Create new animation if none exists or name is changing\n if (!animation || (props.name && props.name !== animation.getName())) {\n animation = new ElementAnimation(\n props.name || currentAnimation?.getName() || ANIMATIONS[0].name\n );\n // Set default values for new animation\n animation.setInterval(animationDef.interval || 1);\n animation.setDuration(animationDef.duration || 1);\n animation.setIntensity(animationDef.intensity || 1);\n animation.setAnimate(animationDef.animate || \"enter\");\n if (animationDef.mode) animation.setMode(animationDef.mode);\n if (animationDef.direction)\n animation.setDirection(animationDef.direction);\n }\n\n // Update animation properties with validation\n if (props.interval !== undefined) {\n const [min, max] = animationDef.options?.interval || [0.1, 5];\n animation.setInterval(Math.min(Math.max(props.interval, min), max));\n }\n if (props.duration !== undefined) {\n const [min, max] = animationDef.options?.duration || [0.1, 5];\n animation.setDuration(Math.min(Math.max(props.duration, min), max));\n }\n if (props.intensity !== undefined) {\n const [min, max] = animationDef.options?.intensity || [0.1, 2];\n animation.setIntensity(Math.min(Math.max(props.intensity, min), max));\n }\n if (\n props.animate &&\n animationDef.options?.animate?.includes(props.animate)\n ) {\n animation.setAnimate(props.animate);\n }\n if (props.mode && animationDef.options?.mode?.includes(props.mode)) {\n animation.setMode(props.mode);\n }\n if (\n props.direction &&\n animationDef.options?.direction?.includes(props.direction)\n ) {\n animation.setDirection(props.direction);\n }\n\n // Update element with new/modified animation\n selectedElement.setAnimation(animation);\n updateElement?.(selectedElement);\n };\n\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Animations</div>\n {/* Animation Selection */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Type</label>\n <select\n value={currentAnimation?.getName() || \"\"}\n onChange={(e) => handleUpdateAnimation({ name: e.target.value })}\n className=\"select-dark w-full\"\n >\n <option value=\"\">No Animation</option>\n {ANIMATIONS.map((animation) => (\n <option key={animation.name} value={animation.name}>\n {animation.name.charAt(0).toUpperCase() + animation.name.slice(1)}\n </option>\n ))}\n </select>\n </div>\n\n {/* Animation Options */}\n {currentAnimation && (\n <>\n {/* Get current animation definition */}\n {(() => {\n const animationDef = ANIMATIONS.find(\n (a) => a.name === currentAnimation.getName()\n );\n if (!animationDef || !animationDef.options) return null;\n\n return (\n <>\n {/* Animate */}\n {animationDef.options?.animate && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">When to Animate</label>\n <select\n value={currentAnimation.getAnimate()}\n onChange={(e) =>\n handleUpdateAnimation({\n animate: e.target.value as\n | \"enter\"\n | \"exit\"\n | \"both\",\n })\n }\n className=\"select-dark w-full\"\n >\n {animationDef.options?.animate.map((option) => (\n <option key={option} value={option}>\n {option.charAt(0).toUpperCase() + option.slice(1)}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Direction */}\n {animationDef.options?.direction && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Direction</label>\n <select\n value={currentAnimation.getDirection()}\n onChange={(e) =>\n handleUpdateAnimation({\n direction: e.target.value as\n | \"up\"\n | \"down\"\n | \"left\"\n | \"right\"\n | \"center\",\n })\n }\n className=\"select-dark w-full\"\n >\n {animationDef.options?.direction.map((option) => (\n <option key={option} value={option}>\n {option.charAt(0).toUpperCase() + option.slice(1)}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Mode */}\n {animationDef.options?.mode && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Mode</label>\n <select\n value={currentAnimation.getMode()}\n onChange={(e) =>\n handleUpdateAnimation({\n mode: e.target.value as \"in\" | \"out\",\n })\n }\n className=\"select-dark w-full\"\n >\n {animationDef.options?.mode.map((option) => (\n <option key={option} value={option}>\n {option.charAt(0).toUpperCase() + option.slice(1)}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Duration */}\n {animationDef.options?.duration && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Duration (seconds)</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min={animationDef.options?.duration[0]}\n max={animationDef.options?.duration[1]}\n step=\"0.1\"\n value={currentAnimation.getDuration()}\n onChange={(e) =>\n handleUpdateAnimation({\n duration: Number(e.target.value),\n })\n }\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{currentAnimation.getDuration()}</span>\n </div>\n </div>\n )}\n\n {/* Interval */}\n {animationDef.options?.interval && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Interval (seconds)</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min={animationDef.options?.interval[0]}\n max={animationDef.options?.interval[1]}\n step=\"0.1\"\n value={currentAnimation.getInterval()}\n onChange={(e) =>\n handleUpdateAnimation({\n interval: Number(e.target.value),\n })\n }\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{currentAnimation.getInterval()}</span>\n </div>\n </div>\n )}\n\n {/* Intensity */}\n {animationDef.options?.intensity && (\n <div className=\"panel-section\">\n <label className=\"label-dark\">Intensity</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min={animationDef.options?.intensity[0]}\n max={animationDef.options?.intensity[1]}\n step=\"0.1\"\n value={currentAnimation.getIntensity()}\n onChange={(e) =>\n handleUpdateAnimation({\n intensity: Number(e.target.value),\n })\n }\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{currentAnimation.getIntensity()}</span>\n </div>\n </div>\n )}\n </>\n );\n })()}\n </>\n )}\n </div>\n );\n}\n","import type { PropertiesPanelProps } from \"../../types\";\nexport function PlaybackPropsPanel({\n selectedElement,\n updateElement,\n}: PropertiesPanelProps) {\n const elementProps = selectedElement?.getProps() || {};\n const { volume } = elementProps;\n\n const handleUpdateElement = (props: Record<string, any>) => {\n if (selectedElement) {\n updateElement?.(selectedElement?.setProps({ ...elementProps, ...props }));\n }\n };\n return (\n <div className=\"panel-container\">\n <div className=\"panel-title\">Playback Properties</div>\n {/* Volume */}\n <div className=\"panel-section\">\n <label className=\"label-dark\">Volume</label>\n <div className=\"slider-container\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"3\"\n step={0.1}\n value={volume ?? 0}\n onChange={(e) =>\n handleUpdateElement({ volume: Number(e.target.value) })\n }\n className=\"slider-purple\"\n />\n <span className=\"slider-value\">{volume ?? 0}</span>\n </div>\n </div>\n </div>\n );\n}\n","import { ElementProps } from \"../properties/element-props\";\nimport { TextEffects } from \"../properties/text-effects\";\nimport { Animation } from \"../properties/animation\";\nimport { type TrackElement } from \"@twick/timeline\";\nimport { PlaybackPropsPanel } from \"../properties/playback-props\";\n\ninterface PropertiesPanelContainerProps {\n selectedProp: string;\n selectedElement: TrackElement | null;\n updateElement: (element: TrackElement) => void;\n}\n\nexport function PropertiesPanelContainer({\n selectedProp,\n selectedElement,\n updateElement,\n}: PropertiesPanelContainerProps) {\n if (!selectedElement) {\n return (\n <div className=\"panel-container\">\n <div className=\"properties-header\">\n <h3 className=\"properties-title\">Select Element to see properties</h3>\n </div>\n </div>\n );\n }\n return (\n <>\n {/* Element Properties */}\n {selectedProp === \"element-props\" && (\n <ElementProps\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n )}\n\n {/* Playback Properties */}\n {selectedProp === \"playback-props\" && (\n <PlaybackPropsPanel\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n )}\n\n {/* Text Effects */}\n {selectedProp === \"text-effects\" && (\n <TextEffects\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n )}\n\n {/* Animations */}\n {selectedProp === \"animations\" && (\n <Animation\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n )}\n </>\n );\n}\n","const imageDimensionsCache = {};\nconst videoMetaCache = {};\nconst audioDurationCache = {};\n\nconst getAudioDuration = (audioSrc) => {\n if (audioDurationCache[audioSrc]) {\n return Promise.resolve(audioDurationCache[audioSrc]);\n }\n return new Promise((resolve, reject) => {\n const audio = document.createElement(\"audio\");\n audio.preload = \"metadata\";\n const isSafeUrl = /^(https?:|blob:|data:audio\\/)/i.test(audioSrc);\n if (!isSafeUrl) {\n throw new Error(\"Unsafe audio source URL\");\n }\n audio.src = audioSrc;\n audio.onloadedmetadata = () => {\n const duration = audio.duration;\n audioDurationCache[audioSrc] = duration;\n resolve(duration);\n };\n audio.onerror = () => {\n reject(new Error(\"Failed to load audio metadata\"));\n };\n });\n};\n\nconst concurrencyLimit = 5;\nlet activeCount = 0;\nconst queue = [];\nfunction runNext() {\n if (queue.length === 0 || activeCount >= concurrencyLimit) return;\n const next = queue.shift();\n if (next) {\n activeCount++;\n next();\n }\n}\nfunction limit(fn) {\n return new Promise((resolve, reject) => {\n const task = () => {\n fn().then(resolve).catch(reject).finally(() => {\n activeCount--;\n runNext();\n });\n };\n if (activeCount < concurrencyLimit) {\n activeCount++;\n task();\n } else {\n queue.push(task);\n }\n });\n}\n\nconst loadImageDimensions = (url) => {\n return new Promise((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"getImageDimensions() is only available in the browser.\"));\n return;\n }\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = url;\n });\n};\nconst getImageDimensions = (url) => {\n if (imageDimensionsCache[url]) {\n return Promise.resolve(imageDimensionsCache[url]);\n }\n return limit(() => loadImageDimensions(url)).then((dimensions) => {\n imageDimensionsCache[url] = dimensions;\n return dimensions;\n });\n};\n\nconst getVideoMeta = (videoSrc) => {\n if (videoMetaCache[videoSrc]) {\n return Promise.resolve(videoMetaCache[videoSrc]);\n }\n return new Promise((resolve, reject) => {\n const video = document.createElement(\"video\");\n video.preload = \"metadata\";\n const isSafeUrl = /^(https?:|blob:|data:video\\/)/i.test(videoSrc);\n if (!isSafeUrl) {\n reject(new Error(\"Unsafe video source URL\"));\n return;\n }\n video.src = videoSrc;\n video.onloadedmetadata = () => {\n const meta = {\n width: video.videoWidth,\n height: video.videoHeight,\n duration: video.duration\n };\n videoMetaCache[videoSrc] = meta;\n resolve(meta);\n };\n video.onerror = () => reject(new Error(\"Failed to load video metadata\"));\n });\n};\n\nconst getThumbnail = async (videoUrl, seekTime = 0.1, playbackRate = 1) => {\n return new Promise((resolve, reject) => {\n const video = document.createElement(\"video\");\n video.crossOrigin = \"anonymous\";\n video.muted = true;\n video.playsInline = true;\n video.autoplay = false;\n video.preload = \"auto\";\n video.playbackRate = playbackRate;\n video.style.position = \"absolute\";\n video.style.left = \"-9999px\";\n video.style.top = \"-9999px\";\n video.style.width = \"1px\";\n video.style.height = \"1px\";\n video.style.opacity = \"0\";\n video.style.pointerEvents = \"none\";\n video.style.zIndex = \"-1\";\n let timeoutId;\n const cleanup = () => {\n if (video.parentNode) video.remove();\n if (timeoutId) clearTimeout(timeoutId);\n };\n const handleError = () => {\n cleanup();\n reject(new Error(`Failed to load video: ${video.error?.message || \"Unknown error\"}`));\n };\n const handleSeeked = () => {\n try {\n video.pause();\n const canvas = document.createElement(\"canvas\");\n const width = video.videoWidth || 640;\n const height = video.videoHeight || 360;\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n cleanup();\n reject(new Error(\"Failed to get canvas context\"));\n return;\n }\n ctx.drawImage(video, 0, 0, width, height);\n try {\n const dataUrl = canvas.toDataURL(\"image/jpeg\", 0.8);\n cleanup();\n resolve(dataUrl);\n } catch {\n canvas.toBlob((blob) => {\n if (!blob) {\n cleanup();\n reject(new Error(\"Failed to create Blob\"));\n return;\n }\n const blobUrl = URL.createObjectURL(blob);\n cleanup();\n resolve(blobUrl);\n }, \"image/jpeg\", 0.8);\n }\n } catch (err) {\n cleanup();\n reject(new Error(`Error creating thumbnail: ${err}`));\n }\n };\n video.addEventListener(\"error\", handleError, { once: true });\n video.addEventListener(\"seeked\", handleSeeked, { once: true });\n video.addEventListener(\"loadedmetadata\", () => {\n const playPromise = video.play();\n if (playPromise !== void 0) {\n playPromise.then(() => {\n video.currentTime = seekTime;\n }).catch(() => {\n video.currentTime = seekTime;\n });\n } else {\n video.currentTime = seekTime;\n }\n }, { once: true });\n timeoutId = window.setTimeout(() => {\n cleanup();\n reject(new Error(\"Video loading timed out\"));\n }, 15e3);\n video.src = videoUrl;\n document.body.appendChild(video);\n });\n};\n\nconst extractAudio = async ({\n src,\n playbackRate = 1,\n start = 0,\n end\n}) => {\n if (!src) throw new Error(\"src is required\");\n if (playbackRate <= 0) throw new Error(\"playbackRate must be > 0\");\n const isSafeUrl = /^(https?:|blob:|data:)/i.test(src);\n if (!isSafeUrl) throw new Error(\"Unsafe media source URL\");\n const audioBuffer = await fetchAndDecodeAudio(src);\n const clampedStart = Math.max(0, start || 0);\n const fullDuration = audioBuffer.duration;\n const clampedEnd = Math.min(\n typeof end === \"number\" ? end : fullDuration,\n fullDuration\n );\n if (clampedEnd <= clampedStart)\n throw new Error(\"Invalid range: end must be greater than start\");\n const renderedBuffer = await renderAudioSegment(\n audioBuffer,\n clampedStart,\n clampedEnd,\n playbackRate\n );\n const mp3Blob = await audioBufferToMp3(renderedBuffer);\n return URL.createObjectURL(mp3Blob);\n};\nconst stitchAudio = async (segments, totalDuration) => {\n if (!segments || segments.length === 0) {\n throw new Error(\"At least one audio segment is required\");\n }\n const duration = totalDuration || Math.max(...segments.map((s) => s.e));\n const renderedBuffer = await createAudioTimeline(segments, duration);\n const mp3Blob = await audioBufferToMp3(renderedBuffer);\n return URL.createObjectURL(mp3Blob);\n};\nconst fetchAndDecodeAudio = async (src) => {\n const response = await fetch(src);\n if (!response.ok) throw new Error(`Failed to fetch source: ${response.status}`);\n const arrayBuffer = await response.arrayBuffer();\n return decodeAudioData(arrayBuffer);\n};\nconst decodeAudioData = async (arrayBuffer) => {\n const AudioContextCtor = window.AudioContext || window.webkitAudioContext;\n if (!AudioContextCtor) throw new Error(\"Web Audio API not supported\");\n const audioContext = new AudioContextCtor();\n try {\n return await new Promise((resolve, reject) => {\n audioContext.decodeAudioData(\n arrayBuffer.slice(0),\n (buf) => resolve(buf),\n (err) => reject(err || new Error(\"Failed to decode audio\"))\n );\n });\n } finally {\n audioContext.close();\n }\n};\nconst renderAudioSegment = async (audioBuffer, start, end, playbackRate) => {\n const OfflineAudioContextCtor = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n if (!OfflineAudioContextCtor) throw new Error(\"OfflineAudioContext not supported\");\n const sampleRate = audioBuffer.sampleRate;\n const numChannels = audioBuffer.numberOfChannels;\n const sourceDuration = end - start;\n const renderedFrames = Math.max(\n 1,\n Math.ceil(sourceDuration / playbackRate * sampleRate)\n );\n const offline = new OfflineAudioContextCtor(numChannels, renderedFrames, sampleRate);\n const sourceNode = offline.createBufferSource();\n sourceNode.buffer = audioBuffer;\n sourceNode.playbackRate.value = playbackRate;\n sourceNode.connect(offline.destination);\n sourceNode.start(0, start, sourceDuration);\n return await offline.startRendering();\n};\nconst createAudioTimeline = async (segments, duration) => {\n const OfflineAudioContextCtor = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n if (!OfflineAudioContextCtor) throw new Error(\"OfflineAudioContext not supported\");\n const sampleRate = 44100;\n const totalFrames = Math.ceil(duration * sampleRate);\n const offline = new OfflineAudioContextCtor(2, totalFrames, sampleRate);\n for (const segment of segments) {\n if (segment.s >= segment.e) {\n console.warn(`Invalid segment: start (${segment.s}) >= end (${segment.e})`);\n continue;\n }\n const volume = segment.volume ?? 1;\n if (volume <= 0) {\n console.warn(`Skipping muted segment: ${segment.src}`);\n continue;\n }\n try {\n const audioBuffer = await fetchAndDecodeAudio(segment.src);\n const segmentDuration = segment.e - segment.s;\n const sourceDuration = Math.min(segmentDuration, audioBuffer.duration);\n const source = offline.createBufferSource();\n source.buffer = audioBuffer;\n if (volume !== 1) {\n const gainNode = offline.createGain();\n gainNode.gain.value = volume;\n source.connect(gainNode);\n gainNode.connect(offline.destination);\n } else {\n source.connect(offline.destination);\n }\n source.start(segment.s, 0, sourceDuration);\n } catch (error) {\n console.warn(`Failed to process segment: ${segment.src}`, error);\n }\n }\n return await offline.startRendering();\n};\nconst audioBufferToMp3 = async (buffer) => {\n try {\n const wavArrayBuffer = audioBufferToWavArrayBuffer(buffer);\n const pcmBuffer = await decodeAudioData(wavArrayBuffer);\n return await encodePcmToMp3(pcmBuffer);\n } catch (error) {\n return audioBufferToWavBlob(buffer);\n }\n};\nconst audioBufferToWavArrayBuffer = (buffer) => {\n const numChannels = buffer.numberOfChannels;\n const sampleRate = buffer.sampleRate;\n const numFrames = buffer.length;\n const interleaved = interleave(buffer, numChannels, numFrames);\n const bytesPerSample = 2;\n const blockAlign = numChannels * bytesPerSample;\n const byteRate = sampleRate * blockAlign;\n const dataSize = interleaved.length * bytesPerSample;\n const bufferSize = 44 + dataSize;\n const arrayBuffer = new ArrayBuffer(bufferSize);\n const view = new DataView(arrayBuffer);\n writeString(view, 0, \"RIFF\");\n view.setUint32(4, 36 + dataSize, true);\n writeString(view, 8, \"WAVE\");\n writeString(view, 12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, numChannels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, 16, true);\n writeString(view, 36, \"data\");\n view.setUint32(40, dataSize, true);\n floatTo16BitPCM(view, 44, interleaved);\n return arrayBuffer;\n};\nconst encodePcmToMp3 = async (buffer) => {\n const lamejs = await import('./index-CXhwwSX-.js').then(n => n.i);\n const channels = buffer.numberOfChannels >= 2 ? 2 : 1;\n const targetSampleRate = 22050;\n const downsampledBuffer = downsampleAudioBuffer(buffer, targetSampleRate);\n const kbps = 48;\n const mp3encoder = new lamejs.default.Mp3Encoder(channels, targetSampleRate, kbps);\n const samplesPerFrame = 1152;\n const leftFloat = downsampledBuffer.getChannelData(0);\n const left = floatTo16(leftFloat);\n let right;\n if (channels === 2) {\n const rightFloat = downsampledBuffer.getChannelData(1);\n right = floatTo16(rightFloat);\n }\n const mp3Chunks = [];\n for (let i = 0; i < left.length; i += samplesPerFrame) {\n const leftChunk = left.subarray(i, Math.min(i + samplesPerFrame, left.length));\n let mp3buf;\n if (channels === 2 && right) {\n const rightChunk = right.subarray(i, Math.min(i + samplesPerFrame, right.length));\n mp3buf = mp3encoder.encodeBuffer(leftChunk, rightChunk);\n } else {\n mp3buf = mp3encoder.encodeBuffer(leftChunk);\n }\n if (mp3buf.length > 0) mp3Chunks.push(mp3buf);\n }\n const end = mp3encoder.flush();\n if (end.length > 0) mp3Chunks.push(end);\n return new Blob(mp3Chunks, { type: \"audio/mpeg\" });\n};\nconst audioBufferToWavBlob = (buffer) => {\n const arrayBuffer = audioBufferToWavArrayBuffer(buffer);\n return new Blob([arrayBuffer], { type: \"audio/wav\" });\n};\nconst downsampleAudioBuffer = (buffer, targetSampleRate) => {\n if (buffer.sampleRate === targetSampleRate) {\n return buffer;\n }\n const ratio = buffer.sampleRate / targetSampleRate;\n const newLength = Math.round(buffer.length / ratio);\n const newBuffer = new AudioContext().createBuffer(\n buffer.numberOfChannels,\n newLength,\n targetSampleRate\n );\n for (let channel = 0; channel < buffer.numberOfChannels; channel++) {\n const oldData = buffer.getChannelData(channel);\n const newData = newBuffer.getChannelData(channel);\n for (let i = 0; i < newLength; i++) {\n const oldIndex = Math.floor(i * ratio);\n newData[i] = oldData[oldIndex];\n }\n }\n return newBuffer;\n};\nconst interleave = (buffer, numChannels, numFrames) => {\n if (numChannels === 1) {\n return buffer.getChannelData(0).slice(0, numFrames);\n }\n const result = new Float32Array(numFrames * numChannels);\n const channelData = [];\n for (let ch = 0; ch < numChannels; ch++) {\n channelData[ch] = buffer.getChannelData(ch);\n }\n let writeIndex = 0;\n for (let i = 0; i < numFrames; i++) {\n for (let ch = 0; ch < numChannels; ch++) {\n result[writeIndex++] = channelData[ch][i];\n }\n }\n return result;\n};\nconst floatTo16BitPCM = (view, offset, input) => {\n let pos = offset;\n for (let i = 0; i < input.length; i++, pos += 2) {\n let s = Math.max(-1, Math.min(1, input[i]));\n view.setInt16(pos, s < 0 ? s * 32768 : s * 32767, true);\n }\n};\nconst floatTo16 = (input) => {\n const output = new Int16Array(input.length);\n for (let i = 0; i < input.length; i++) {\n const s = Math.max(-1, Math.min(1, input[i]));\n output[i] = s < 0 ? s * 32768 : s * 32767;\n }\n return output;\n};\nconst writeString = (view, offset, str) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n};\n\nconst getScaledDimensions = (width, height, maxWidth, maxHeight) => {\n if (width <= maxWidth && height <= maxHeight) {\n return {\n width: width % 2 === 0 ? width : width - 1,\n height: height % 2 === 0 ? height : height - 1\n };\n }\n const widthRatio = maxWidth / width;\n const heightRatio = maxHeight / height;\n const scale = Math.min(widthRatio, heightRatio);\n let scaledWidth = Math.round(width * scale);\n let scaledHeight = Math.round(height * scale);\n if (scaledWidth % 2 !== 0) {\n scaledWidth -= 1;\n }\n if (scaledHeight % 2 !== 0) {\n scaledHeight -= 1;\n }\n return {\n width: Math.min(scaledWidth, maxWidth),\n height: Math.min(scaledHeight, maxHeight)\n };\n};\nconst getObjectFitSize = (objectFit, elementSize, containerSize) => {\n const elementAspectRatio = elementSize.width / elementSize.height;\n const containerAspectRatio = containerSize.width / containerSize.height;\n switch (objectFit) {\n case \"contain\":\n if (elementAspectRatio > containerAspectRatio) {\n return {\n width: containerSize.width,\n height: containerSize.width / elementAspectRatio\n };\n } else {\n return {\n width: containerSize.height * elementAspectRatio,\n height: containerSize.height\n };\n }\n case \"cover\":\n if (elementAspectRatio > containerAspectRatio) {\n return {\n width: containerSize.height * elementAspectRatio,\n height: containerSize.height\n };\n } else {\n return {\n width: containerSize.width,\n height: containerSize.width / elementAspectRatio\n };\n }\n case \"fill\":\n return {\n width: containerSize.width,\n height: containerSize.height\n };\n default:\n return {\n width: elementSize.width,\n height: elementSize.height\n };\n }\n};\n\nconst blobUrlToFile = async (blobUrl, fileName) => {\n const response = await fetch(blobUrl);\n const blob = await response.blob();\n return new File([blob], fileName, { type: blob.type });\n};\nconst loadFile = (accept) => {\n return new Promise((resolve, reject) => {\n try {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = accept;\n input.style.display = \"none\";\n document.body.appendChild(input);\n const cleanup = () => {\n input.value = \"\";\n document.body.removeChild(input);\n };\n input.onchange = () => {\n const file = input.files && input.files[0];\n cleanup();\n if (!file) {\n reject(new Error(\"No file selected\"));\n return;\n }\n resolve(file);\n };\n input.click();\n } catch (error) {\n reject(error);\n }\n });\n};\nconst saveAsFile = (content, type, name) => {\n const blob = typeof content === \"string\" ? new Blob([content], { type }) : content;\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = name;\n a.click();\n URL.revokeObjectURL(url);\n};\nconst downloadFile = async (url, filename) => {\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n const downloadUrl = window.URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = downloadUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(downloadUrl);\n } catch (error) {\n console.error(\"Error downloading file:\", error);\n throw error;\n }\n};\n\nconst detectMediaTypeFromUrl = async (url) => {\n try {\n const response = await fetch(url, { method: \"HEAD\" });\n const contentType = response.headers.get(\"Content-Type\");\n if (!contentType) return null;\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"video/\")) return \"video\";\n if (contentType.startsWith(\"audio/\")) return \"audio\";\n return null;\n } catch (error) {\n console.error(\"Fetch failed:\", error);\n return null;\n }\n};\n\nexport { blobUrlToFile, detectMediaTypeFromUrl, downloadFile, extractAudio, getAudioDuration, getImageDimensions, getObjectFitSize, getScaledDimensions, getThumbnail, getVideoMeta, limit, loadFile, saveAsFile, stitchAudio };\n//# sourceMappingURL=index.mjs.map\n","import { ProjectJSON, useTimelineContext } from \"@twick/timeline\";\nimport { StudioConfig } from \"../types\";\nimport { loadFile, saveAsFile } from \"@twick/media-utils\";\nimport { useState } from \"react\";\n\nconst useStudioOperation = (studioConfig?: StudioConfig) => {\n const { editor, present } = useTimelineContext();\n const [projectName, setProjectName] = useState(\"\");\n const onLoadProject = async () => {\n let project: ProjectJSON;\n if (studioConfig?.loadProject) {\n project = await studioConfig.loadProject();\n } else {\n const file = await loadFile(\"application/json\");\n const text = await file.text();\n setProjectName(file.name);\n project = JSON.parse(text);\n }\n console.log(\"Editor\", editor);\n editor.loadProject(project);\n };\n\n const onSaveProject = async () => {\n let fileName;\n if (projectName) {\n fileName = projectName;\n } else {\n fileName = prompt(\"Enter the name of the project\") || \"untitled-project\";\n fileName = fileName + \".json\";\n setProjectName(fileName);\n }\n if (studioConfig?.saveProject && present) {\n await studioConfig.saveProject(present, fileName);\n } else {\n const file = await saveAsFile(\n JSON.stringify(present),\n \"application/json\",\n fileName\n );\n if (file) {\n console.log(\"File saved\", file);\n }\n }\n };\n\n const onExportVideo = async () => {\n if (studioConfig?.exportVideo && present) {\n await studioConfig.exportVideo(present, {\n outFile: \"output.mp4\",\n fps: 30,\n resolution: {\n width: studioConfig.videoProps?.width,\n height: studioConfig.videoProps?.height,\n },\n });\n } else {\n alert(\"Export video not supported in demo mode\");\n }\n };\n\n return { onLoadProject, onSaveProject, onExportVideo };\n};\n\nexport default useStudioOperation;\n","/**\n * TwickStudio Component\n *\n * The main studio component that provides a complete video editing interface.\n * Integrates all major components including canvas, toolbar, media library,\n * and properties panel into a cohesive editing environment.\n *\n * @component\n * @example\n * ```tsx\n * <TimelineProvider initialData={initialData} videoResolution={resolution}>\n * <TwickStudio />\n * </TimelineProvider>\n * ```\n */\n\nimport { Toolbar } from \"./toolbar\";\nimport StudioHeader from \"./header\";\nimport { useStudioManager } from \"../hooks/use-studio-manager\";\nimport ElementPanelContainer from \"./container/element-panel-container\";\nimport { useTimelineContext } from \"@twick/timeline\";\nimport { MediaProvider } from \"../context/media-context\";\nimport { PropsToolbar } from \"./props-toolbar\";\nimport { PropertiesPanelContainer } from \"./container/properties-panel-container\";\nimport VideoEditor from \"@twick/video-editor\";\nimport { useMemo } from \"react\";\nimport { StudioConfig } from \"../types\";\nimport useStudioOperation from \"../hooks/use-studio-operation\";\n\nexport function TwickStudio({ studioConfig }: { studioConfig?: StudioConfig }) {\n const {\n selectedTool,\n setSelectedTool,\n selectedProp,\n setSelectedProp,\n selectedElement,\n addElement,\n updateElement,\n } = useStudioManager();\n const { videoResolution, setVideoResolution } = useTimelineContext();\n const { onLoadProject, onSaveProject, onExportVideo } =\n useStudioOperation(studioConfig);\n\n const twickStudiConfig: StudioConfig = useMemo(\n () => ({\n canvasMode: true,\n ...(studioConfig || {}),\n videoProps: {\n ...(studioConfig?.videoProps || {}),\n width: videoResolution.width,\n height: videoResolution.height,\n },\n }),\n [videoResolution, studioConfig]\n );\n\n return (\n <MediaProvider>\n <div className=\"studio-container\">\n {/* Header */}\n <StudioHeader\n setVideoResolution={setVideoResolution}\n onLoadProject={onLoadProject}\n onSaveProject={onSaveProject}\n onExportVideo={onExportVideo}\n />\n {/* Main Content */}\n <div className=\"studio-content\">\n {/* Left Toolbar */}\n <Toolbar\n selectedTool={selectedTool}\n setSelectedTool={setSelectedTool}\n />\n\n {/* Left Panel */}\n <ElementPanelContainer\n videoResolution={videoResolution}\n selectedTool={selectedTool}\n setSelectedTool={setSelectedTool}\n selectedElement={selectedElement}\n addElement={addElement}\n updateElement={updateElement}\n />\n\n {/* Center - Canvas and Transport */}\n <main className=\"main-container\">\n <div className=\"canvas-wrapper\">\n <div\n className=\"canvas-container\"\n style={{\n maxWidth: twickStudiConfig.playerProps?.maxWidth ?? 960,\n }}\n >\n <VideoEditor editorConfig={twickStudiConfig} />\n </div>\n </div>\n </main>\n\n {/* Left Panel */}\n <PropertiesPanelContainer\n selectedProp={selectedProp}\n selectedElement={selectedElement}\n updateElement={updateElement}\n />\n\n {/* Right Toolbar */}\n <PropsToolbar\n selectedElement={selectedElement}\n selectedProp={selectedProp}\n setSelectedProp={setSelectedProp}\n />\n </div>\n </div>\n </MediaProvider>\n );\n}\n"],"names":["forwardRef","createElement","__iconNode","getIcon","Icon","jsxs","jsx","useState","useEffect","orientation","useTimelineContext","TrackElement","useRef","Track","_a","BrowserMediaManager","createContext","useContext","VideoElement","AudioElement","ImageElement","config","useCallback","Wand2","AVAILABLE_TEXT_FONTS","TextElement","Loader2","IconElement","RectElement","CircleElement","SparklesIcon","useMemo","CaptionElement","ElementTextEffect","TEXT_EFFECTS","Fragment","ANIMATIONS","ElementAnimation"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]}
|