@microfox/remotion 1.0.2 → 1.2.0

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/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/registry/componentRegistry.ts","../src/core/context/CompositionContext.tsx","../src/components/base/ComponentRenderer.tsx","../src/core/utils/timing.ts","../src/core/utils/hierarchyUtils.ts","../src/components/base/EffectWrapper.tsx","../src/components/frames/Frame.tsx","../src/components/frames/SceneFrame.tsx","../src/components/layouts/BaseLayout.tsx","../src/components/layouts/index.ts","../src/components/atoms/ShapeAtom.tsx","../src/components/atoms/ImageAtom.tsx","../src/components/atoms/TextAtom.tsx","../src/hooks/useFontLoader.ts","../src/utils/fontUtils.ts","../src/components/atoms/VideoAtom.tsx","../src/components/atoms/AudioAtom.tsx","../src/components/atoms/TextAtomWithFonts.tsx","../src/components/atoms/index.ts","../src/components/effects/BlurEffect.tsx","../src/components/effects/Loop.tsx","../src/components/effects/Pan.tsx","../src/components/effects/Zoom.tsx","../src/components/effects/index.ts","../src/hooks/useComponentRegistry.ts","../src/hooks/useBoundaryCalculation.ts","../src/hooks/buildTransitionHook.ts","../src/core/types/transition.types.ts","../src/utils/contextUtils.ts","../src/utils/boundaryUtils.ts","../src/templates/rings/NextjsLogo.tsx","../src/templates/rings/RippleOutLayout.tsx","../src/templates/rings/Rings.tsx","../src/templates/rings/TextFade.tsx","../src/templates/rings/index.ts","../src/templates/waveform/components/WaveformCircle.tsx","../src/templates/waveform/Waveform.tsx","../src/templates/waveform/hooks/useWaveformData.ts","../src/templates/waveform/components/WaveformHistogram.tsx","../src/templates/waveform/components/WaveformHistogramRanged.tsx","../src/templates/waveform/components/WaveformLine.tsx","../src/templates/waveform/utils.ts","../src/templates/waveform/index.ts","../src/components/Composition.tsx","../src/core/context/timing.ts"],"sourcesContent":["// Core exports\nexport * from './core';\n\n// Component exports\nexport * from './components';\n\n// Hook exports\nexport * from './hooks';\n\n// Utility exports\nexport * from './utils';\n\n// Template exports\nexport * from './templates';\n\n// Main composition component\nexport {\n Composition,\n type InputCompositionProps,\n CompositionLayout,\n calculateCompositionLayoutMetadata,\n} from './components/Composition';\n","import {\n ComponentRegistry,\n RegistryEntry,\n PackageRegistry,\n ComponentConfig,\n} from '../types';\n\nclass ComponentRegistryManager {\n private registry: ComponentRegistry = {};\n private packageRegistry: PackageRegistry = {};\n\n registerComponent(\n name: string,\n component: React.ComponentType<any>,\n type: 'frame' | 'layout' | 'atom',\n config: ComponentConfig = { displayName: '' },\n packageName?: string\n ): void {\n this.registry[name] = { component, config };\n\n if (packageName) {\n if (!this.packageRegistry[packageName]) {\n this.packageRegistry[packageName] = {};\n }\n this.packageRegistry[packageName][name] = { component, config };\n }\n }\n\n registerEffect(\n name: string,\n component: React.ComponentType<any>,\n config: ComponentConfig = { displayName: '' },\n packageName?: string\n ): void {\n // Effects are registered as layout components since they use the same rendering logic\n this.registerComponent(\n name?.includes('effect-') ? name : `effect-${name}`,\n component,\n 'layout',\n config,\n packageName\n );\n }\n\n getComponent(name: string): React.ComponentType<any> | undefined {\n return this.registry[name]?.component;\n }\n\n getComponentConfig(name: string): ComponentConfig | undefined {\n return this.registry[name]?.config;\n }\n\n getComponentWithConfig(\n name: string\n ):\n | { component: React.ComponentType<any>; config: ComponentConfig }\n | undefined {\n return this.registry[name];\n }\n\n registerPackage(\n packageName: string,\n components: Record<\n string,\n { component: React.ComponentType<any>; config: ComponentConfig }\n >\n ): void {\n this.packageRegistry[packageName] = components;\n\n // Register each component with package prefix\n Object.entries(components).forEach(([name, { component, config }]) => {\n this.registry[`${packageName}:${name}`] = { component, config };\n });\n }\n\n getPackageComponents(\n packageName: string\n ):\n | Record<\n string,\n { component: React.ComponentType<any>; config: ComponentConfig }\n >\n | undefined {\n return this.packageRegistry[packageName];\n }\n\n getAllComponents(): ComponentRegistry {\n return { ...this.registry };\n }\n\n clear(): void {\n this.registry = {};\n this.packageRegistry = {};\n }\n}\n\nexport const componentRegistry = new ComponentRegistryManager();\n\n// Convenience functions\nexport const registerComponent = (\n name: string,\n component: React.ComponentType<any>,\n type: 'frame' | 'layout' | 'atom',\n config: ComponentConfig = { displayName: '' },\n packageName?: string\n) => {\n componentRegistry.registerComponent(\n name,\n component,\n type,\n config,\n packageName\n );\n};\n\nexport const registerEffect = (\n name: string,\n component: React.ComponentType<any>,\n config: ComponentConfig = { displayName: '' },\n packageName?: string\n) => {\n componentRegistry.registerEffect(name, component, config, packageName);\n};\n\nexport const registerPackage = (\n packageName: string,\n components: Record<\n string,\n { component: React.ComponentType<any>; config: ComponentConfig }\n >\n) => {\n componentRegistry.registerPackage(packageName, components);\n};\n\nexport const getComponent = (name: string) =>\n componentRegistry.getComponent(name);\n\nexport const getComponentConfig = (name: string) =>\n componentRegistry.getComponentConfig(name);\n\nexport const getComponentWithConfig = (name: string) =>\n componentRegistry.getComponentWithConfig(name);\n","import React, { createContext, useContext } from 'react';\nimport { RenderableComponentData } from '../types';\n\ninterface CompositionContextValue {\n root?: RenderableComponentData[];\n duration: number;\n}\n\nconst CompositionContext = createContext<CompositionContextValue | null>(null);\n\ninterface CompositionProviderProps {\n children: React.ReactNode;\n value: CompositionContextValue;\n}\n\nexport const CompositionProvider: React.FC<CompositionProviderProps> = ({ children, value }) => {\n return (\n <CompositionContext.Provider value={value}>\n {children}\n </CompositionContext.Provider>\n );\n};\n\nexport const useComposition = (): CompositionContextValue => {\n const context = useContext(CompositionContext);\n if (!context) {\n throw new Error('useComposition must be used within a CompositionProvider');\n }\n return context;\n}; ","import React, { createContext, useContext } from 'react';\nimport { Sequence, Series, useVideoConfig } from 'remotion';\nimport { useComposition } from '../../core/context';\nimport { getComponent, getComponentConfig } from '../../core/registry';\nimport { BaseRenderableData, CalculatedBoundaries, CalculatedTiming, InternalRenderableContext, RenderableContext } from '../../core/types';\nimport { calculateHierarchy, calculateTimingWithInheritance } from '../../core/utils/hierarchyUtils';\nimport { EffectWrapper } from './EffectWrapper';\n\n// Create a context for passing down calculated values\nconst RenderContext = createContext<RenderableContext | null>(null);\n\nexport const useRenderContext = () => {\n const context = useContext(RenderContext);\n if (!context) {\n throw new Error('useRenderContext must be used within a ComponentRenderer');\n }\n return context;\n};\n\n\nexport const ComponentRenderer: React.FC<BaseRenderableData> = ({\n id,\n componentId,\n type,\n data,\n childrenData,\n context,\n effects\n}) => {\n const videoConfig = useVideoConfig();\n const { root } = useComposition();\n\n // Establish a default root context if we are at the top of the tree\n const defaultContext: RenderableContext = {\n boundaries: {\n left: 0,\n top: 0,\n width: videoConfig.width,\n height: videoConfig.height,\n zIndex: 0,\n },\n timing: {\n startInFrames: 0,\n durationInFrames: videoConfig.durationInFrames,\n },\n hierarchy: {\n depth: 0,\n parentIds: [],\n },\n };\n\n if (!context) {\n context = {\n };\n }\n\n\n // Calculate new hierarchy based on position in root data\n const newHierarchy = calculateHierarchy(root, id, context ?? defaultContext);\n\n\n // Calculate timing with inheritance from parent\n const componentData = {\n id,\n componentId,\n type,\n data,\n childrenData,\n context,\n effects\n };\n let newTiming: CalculatedTiming = calculateTimingWithInheritance(componentData, root, videoConfig);\n\n\n const newContext: InternalRenderableContext = {\n ...context,\n boundaries: (context?.boundaries) as CalculatedBoundaries,\n hierarchy: newHierarchy,\n timing: newTiming\n };\n\n const ComponentClass = getComponent(componentId);\n\n if (type === 'scene') {\n return (\n <RenderContext.Provider value={newContext}>\n <Series>\n {childrenData?.map((child) => {\n // reverse should happen here, not based on toot layout actually\n const childTiming = calculateTimingWithInheritance(child, root, videoConfig);\n return (\n <Series.Sequence\n key={child.id}\n name={child.componentId + \" - \" + child.id}\n offset={childTiming.startInFrames ?? 0}\n durationInFrames={childTiming.durationInFrames ?? 0}>\n {child.effects && child.effects.length > 0 ? (\n <EffectWrapper effects={child.effects} context={newContext}>\n <ComponentRenderer key={child.id} {...child} />\n </EffectWrapper>\n ) : (\n <ComponentRenderer key={child.id} {...child} />\n )}\n </Series.Sequence>\n )\n })}\n </Series>\n </RenderContext.Provider>\n );\n }\n\n\n if (!ComponentClass) {\n console.warn(`Component type ${id} not found in registry`);\n return null;\n }\n const props = {\n id, componentId, data, context: context\n };\n\n if (type === 'layout') {\n\n const config = getComponentConfig(componentId);\n\n const isInnerSequence = config?.isInnerSequence;\n\n if (isInnerSequence) {\n return (\n <RenderContext.Provider value={newContext}>\n <ComponentClass {...props}>\n {effects && effects.length > 0 ? (\n <EffectWrapper effects={effects} context={newContext}>\n {childrenData?.map((child) => (\n <ComponentRenderer key={child.id} {...child} />\n ))}\n </EffectWrapper>\n ) : (\n childrenData?.map((child) => (\n <ComponentRenderer key={child.id} {...child} />\n ))\n )}\n </ComponentClass>\n </RenderContext.Provider>\n );\n }\n\n return (\n <RenderContext.Provider value={newContext}>\n <Sequence layout='none' name={componentId + \" - \" + id} from={newTiming.startInFrames} durationInFrames={newTiming.durationInFrames}>\n <ComponentClass {...props}>\n {effects && effects.length > 0 ? (\n <EffectWrapper effects={effects} context={newContext}>\n {childrenData?.map((child) => (\n <ComponentRenderer key={child.id} {...child} />\n ))}\n </EffectWrapper>\n ) : (\n childrenData?.map((child) => (\n <ComponentRenderer key={child.id} {...child} />\n ))\n )}\n </ComponentClass>\n </Sequence>\n </RenderContext.Provider>\n );\n }\n\n if (type === 'atom') {\n\n if (newTiming.durationInFrames && newTiming.durationInFrames > 0) {\n return (\n <RenderContext.Provider value={newContext}>\n <Sequence layout='none' name={componentId + \" - \" + id} from={newTiming.startInFrames} durationInFrames={newTiming.durationInFrames}>\n {effects && effects.length > 0 ? (\n <EffectWrapper effects={effects} context={newContext}>\n <ComponentClass {...props} />\n </EffectWrapper>\n ) : (\n <ComponentClass {...props} />\n )}\n </Sequence>\n </RenderContext.Provider>\n );\n }\n\n return (\n <RenderContext.Provider value={newContext}>\n {effects && effects.length > 0 ? (\n <EffectWrapper effects={effects} context={newContext}>\n <ComponentClass {...props} />\n </EffectWrapper>\n ) : (\n <ComponentClass {...props} />\n )}\n </RenderContext.Provider>\n );\n }\n}; ","import { VideoConfig } from 'remotion';\nimport { CalculatedTiming, ComponentType, RenderableContext } from '../types';\n\nexport const calculateTiming = (\n type: ComponentType,\n context: RenderableContext,\n videoConfig: VideoConfig\n) => {\n let newTiming: CalculatedTiming;\n if (type !== 'atom' && context?.timing) {\n const { start = 0, duration = 0 } = context.timing;\n newTiming = {\n startInFrames: Math.round(\n context.timing?.startInFrames\n ? context.timing.startInFrames\n : type === 'scene'\n ? start * videoConfig.fps\n : start * videoConfig.fps\n ),\n durationInFrames: Math.round(\n context.timing?.durationInFrames\n ? context.timing.durationInFrames\n : type === 'scene'\n ? duration * videoConfig.fps\n : duration * videoConfig.fps\n ),\n duration: duration,\n start: start,\n };\n } else {\n newTiming = {\n startInFrames: context.timing?.startInFrames\n ? context.timing.startInFrames\n : context.timing?.start\n ? Math.round(videoConfig.fps * (context.timing.start || 0))\n : 0,\n durationInFrames: Math.round(\n context.timing?.durationInFrames\n ? context.timing.durationInFrames\n : context.timing?.duration\n ? Math.round(videoConfig.fps * (context.timing.duration || 0))\n : 0\n ),\n duration: context.timing?.duration,\n start: context.timing?.start,\n };\n }\n return newTiming;\n};\n","import { VideoConfig } from 'remotion';\nimport {\n RenderableComponentData,\n Hierarchy,\n CalculatedTiming,\n RenderableContext,\n} from '../types';\nimport { calculateTiming } from './timing';\n\n/**\n * Finds a component in the root data by its ID\n */\nexport const findComponentById = (\n root: RenderableComponentData[] | undefined,\n targetId: string\n): RenderableComponentData | null => {\n if (!root) return null;\n\n const search = (\n components: RenderableComponentData[]\n ): RenderableComponentData | null => {\n for (const component of components) {\n if (component.id === targetId) {\n return component;\n }\n\n if (component.childrenData && component.childrenData.length > 0) {\n const found = search(component.childrenData);\n if (found) return found;\n }\n }\n return null;\n };\n\n return search(root);\n};\n\n/**\n * Finds the parent component of a given component\n */\nexport const findParentComponent = (\n root: RenderableComponentData[] | undefined,\n targetId: string\n): RenderableComponentData | null => {\n if (!root) return null;\n\n const search = (\n components: RenderableComponentData[],\n parent: RenderableComponentData | null\n ): RenderableComponentData | null => {\n for (const component of components) {\n if (component.childrenData && component.childrenData.length > 0) {\n // Check if any child is the target\n const hasTargetChild = component.childrenData.some(\n (child) => child.id === targetId\n );\n if (hasTargetChild) {\n return component;\n }\n\n // Recursively search in children\n const found = search(component.childrenData, component);\n if (found) return found;\n }\n }\n return null;\n };\n\n return search(root, null);\n};\n\n/**\n * Calculates the hierarchy for a component based on its position in the root data\n */\nexport const calculateHierarchy = (\n root: RenderableComponentData[] | undefined,\n componentId: string,\n currentContext?: RenderableContext\n): Hierarchy => {\n if (!root) {\n return {\n depth: (currentContext?.hierarchy?.depth || 0) + 1,\n parentIds: [...(currentContext?.hierarchy?.parentIds || []), componentId],\n };\n }\n\n const parentIds: string[] = [];\n let depth = 0;\n\n const traverse = (\n components: RenderableComponentData[],\n currentDepth: number\n ): boolean => {\n for (const component of components) {\n if (component.id === componentId) {\n depth = currentDepth;\n return true;\n }\n\n if (component.childrenData && component.childrenData.length > 0) {\n parentIds.push(component.id);\n const found = traverse(component.childrenData, currentDepth + 1);\n if (found) return true;\n parentIds.pop(); // Remove if not found in this branch\n }\n }\n return false;\n };\n\n traverse(root, 0);\n\n return {\n depth,\n parentIds: [...parentIds],\n };\n};\n\n/**\n * Calculates timing for a component, inheriting from parent if duration is not provided\n */\nexport const calculateTimingWithInheritance = (\n component: RenderableComponentData,\n root: RenderableComponentData[] | undefined,\n videoConfig: VideoConfig\n): CalculatedTiming => {\n const currentContext = component.context || {};\n // First, calculate basic timing\n const baseTiming = calculateTiming(\n component.type,\n currentContext,\n videoConfig\n );\n\n // If duration is not provided, try to inherit from parent recursively\n if (!baseTiming.durationInFrames || baseTiming.durationInFrames <= 0) {\n const findParentWithTiming = (\n targetId: string\n ): CalculatedTiming | null => {\n const parent = findParentComponent(root, targetId);\n if (!parent) return null;\n\n const parentContext = parent.context || {};\n const parentTiming = calculateTiming(\n parent.type,\n parentContext,\n videoConfig\n );\n\n if (parentTiming.durationInFrames && parentTiming.durationInFrames > 0) {\n return parentTiming;\n }\n\n // Recursively search for parent's parent with timing\n return findParentWithTiming(parent.id);\n };\n\n const inheritedTiming = findParentWithTiming(component.id);\n if (inheritedTiming) {\n return {\n ...baseTiming,\n durationInFrames: inheritedTiming.durationInFrames\n ? inheritedTiming.durationInFrames\n : inheritedTiming.duration\n ? inheritedTiming.duration * videoConfig.fps\n : 0,\n duration: inheritedTiming.duration,\n };\n }\n }\n\n return baseTiming;\n};\n","import React, { ComponentType } from 'react';\nimport { getComponent } from '../../core/registry';\nimport { BaseEffect, InternalRenderableContext } from '../../core/types';\n\ninterface EffectWrapperProps {\n effects?: BaseEffect[];\n children: React.ReactNode;\n context: InternalRenderableContext;\n}\n\nexport const EffectWrapper: ComponentType<EffectWrapperProps> = ({\n effects,\n children,\n context\n}) => {\n if (!effects || effects.length === 0) {\n return children;\n }\n\n // Apply effects in order (first effect wraps the children, subsequent effects wrap the previous result)\n let wrappedContent = children;\n\n effects.forEach((effect, index) => {\n const effectId = typeof effect === 'string' ? `effect-${effect}` : `effect-${effect.componentId}`;\n const EffectComponent = getComponent(effectId);\n\n if (!EffectComponent) {\n console.warn(`Effect component ${effectId} not found in registry`);\n return;\n }\n\n const effectData = typeof effect === 'string' ? {} : (effect.data || {});\n const effectContext = typeof effect === 'string' ? context : (effect.context || context);\n\n const effectProps = {\n id: typeof effect === 'string' ? `effect-${index}` : effect.id,\n componentId: effectId,\n type: 'layout' as const, // Effects use the same rendering logic as layout\n data: effectData,\n context: effectContext,\n children: wrappedContent\n };\n\n wrappedContent = <EffectComponent {...effectProps} />;\n });\n\n return <>{wrappedContent}</>;\n}; ","import React from 'react';\nimport { AbsoluteFill } from 'remotion';\nimport { BaseRenderableProps } from '../../core/types';\n\ninterface FrameProps extends BaseRenderableProps {\n data?: {\n style?: React.CSSProperties;\n };\n}\n\nexport const Frame = ({ children, data }: FrameProps) => {\n // @ts-ignore\n return <AbsoluteFill style={data?.style}>{children as any}</AbsoluteFill>\n}; ","import React, { ReactNode } from 'react';\nimport { AbsoluteFill } from 'remotion';\nimport { BaseRenderableProps } from '../../core/types';\n\ninterface SceneFrameProps extends BaseRenderableProps {\n children?: ReactNode;\n}\n\nexport const SceneFrame: React.FC<SceneFrameProps> = ({ children }) => {\n // @ts-ignore\n return <AbsoluteFill>{children as any}</AbsoluteFill>\n}; ","import React, { Children, ComponentType, ReactNode } from 'react';\nimport { AbsoluteFill } from 'remotion';\nimport { BaseRenderableProps, ComponentConfig } from '../../core/types';\n\ninterface BaseLayoutProps extends BaseRenderableProps {\n children?: ReactNode;\n}\n\nexport const Layout: ComponentType<BaseLayoutProps> = ({ id, children, data, context }) => {\n const { containerProps, childrenProps } = data || {\n containerProps: {},\n childrenProps: [],\n };\n const childrenArray = Children.toArray(children);\n\n return (\n // @ts-ignore\n <AbsoluteFill\n {...containerProps} style={{\n ...context?.boundaries,\n ...containerProps.style,\n }}>\n {childrenArray.map((child, index) => (\n <div\n key={index}\n {...(index < childrenProps.length && childrenProps[index])}\n >\n {child}\n </div>\n ))}\n </AbsoluteFill>\n );\n};\n\nexport const config: ComponentConfig = {\n displayName: 'BaseLayout',\n type: 'layout',\n isInnerSequence: false,\n}","import { registerComponent } from '../../core/registry/componentRegistry';\nimport { Layout as BaseLayout, config as BaseLayoutConfig } from './BaseLayout';\n\nexport { Layout as BaseLayout, config as BaseLayoutConfig } from './BaseLayout';\n\n// Register layout components\nregisterComponent(\n BaseLayoutConfig.displayName,\n BaseLayout,\n 'layout',\n BaseLayoutConfig\n);\n","import React from 'react';\nimport { Easing, interpolate, useCurrentFrame } from 'remotion';\nimport { BaseRenderableProps, ComponentConfig } from '../../core/types';\n\ntype Shape = 'circle' | 'rectangle' | 'star' | 'triangle';\n\ninterface ShapeAtomProps extends BaseRenderableProps {\n data: {\n shape: Shape;\n color: string;\n rotation?: {\n duration: number; // in frames\n };\n style?: React.CSSProperties;\n };\n}\n\nexport const Atom: React.FC<ShapeAtomProps> = ({ data }) => {\n const frame = useCurrentFrame();\n const { shape, color, rotation, style } = data;\n\n const rotationStyle: React.CSSProperties = rotation\n ? {\n transform: `rotate(${interpolate(\n frame % rotation.duration,\n [0, rotation.duration],\n [0, 360],\n {\n extrapolateLeft: 'clamp',\n extrapolateRight: 'clamp',\n easing: Easing.linear,\n }\n )}deg)`,\n }\n : {};\n\n const baseStyle: React.CSSProperties = {\n width: '100%',\n height: '100%',\n ...style,\n ...rotationStyle,\n };\n\n switch (shape) {\n case 'circle':\n return <div style={{ ...baseStyle, backgroundColor: color, borderRadius: '50%' }} />;\n case 'rectangle':\n return <div style={{ ...baseStyle, backgroundColor: color }} />;\n default:\n return null;\n }\n};\n\nexport const config: ComponentConfig = {\n displayName: 'ShapeAtom',\n type: 'atom',\n isInnerSequence: false,\n};","import React, { useMemo } from 'react';\nimport { Img, staticFile } from 'remotion';\nimport { BaseRenderableProps } from '../../core/types';\nimport { ComponentConfig } from '../../core/types';\n\ninterface ImageAtomProps extends BaseRenderableProps {\n data: {\n src: string;\n style?: React.CSSProperties;\n className?: string;\n };\n}\n\nexport const Atom: React.FC<ImageAtomProps> = ({ data }) => {\n\n const source = useMemo(() => {\n if (data.src.startsWith('http')) {\n return data.src;\n }\n return staticFile(data.src);\n }, [data.src]);\n\n // @ts-ignore\n return <Img className={data.className} src={source} style={data.style} crossOrigin='anonymous' />;\n};\n\n// Static config for ImageAtom\nexport const config: ComponentConfig = {\n displayName: 'ImageAtom',\n type: 'atom',\n isInnerSequence: false,\n}; ","import React, { useEffect, useState } from 'react';\nimport { BaseRenderableProps } from '../../core/types';\nimport { ComponentConfig } from '../../core/types';\nimport { useFont } from '../../hooks/useFontLoader';\n\n// Simplified font loading approach - similar to Remotion Google Fonts:\n// const { fontFamily } = useFont('Inter', { weights: ['400', '700'] });\n// \n// The fontFamily value is now directly usable in CSS:\n// style={{ fontFamily }}\n\ninterface TextAtomData {\n text: string;\n style?: React.CSSProperties;\n className?: string;\n font?: {\n family: string;\n weights?: string[];\n subsets?: string[];\n display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n preload?: boolean;\n };\n fallbackFonts?: string[];\n}\n\ninterface TextAtomProps extends BaseRenderableProps {\n data: TextAtomData;\n}\n\nexport const Atom: React.FC<TextAtomProps> = ({ data }) => {\n const [isFontLoading, setIsFontLoading] = useState(false);\n\n // Font loading logic - now returns fontFamily CSS value directly\n const { isLoaded, error, isReady, fontFamily } = useFont(\n data.font?.family || 'Inter',\n {\n weights: data.font?.weights || ['400'],\n subsets: data.font?.subsets || ['latin'],\n display: data.font?.display || 'swap',\n preload: data.font?.preload !== false,\n }\n );\n\n useEffect(() => {\n if (data.font?.family) {\n setIsFontLoading(true);\n if (isReady || isLoaded) {\n setIsFontLoading(false);\n }\n }\n }, [data.font, isReady, isLoaded]);\n\n // Enhanced style with font loading support\n const enhancedStyle: React.CSSProperties = {\n fontFamily,\n opacity: isFontLoading ? 0.8 : 1, // Slight opacity during loading\n transition: 'opacity 0.2s ease-in-out',\n ...data.style,\n };\n\n // Show loading state or error handling\n if (error) {\n console.warn(`Font loading error for ${data.font?.family}:`, error);\n }\n\n return (\n <div\n style={enhancedStyle}\n className={data.className}\n data-font-loading={isFontLoading}\n data-font-loaded={isReady || isLoaded}\n >\n {data.text}\n </div>\n );\n};\n\n// Static config for TextAtom\nexport const config: ComponentConfig = {\n displayName: 'TextAtom',\n type: 'atom',\n isInnerSequence: false,\n}; ","import { useState, useEffect, useCallback } from 'react';\nimport {\n loadGoogleFont,\n loadMultipleFonts as loadMultipleFontsUtil,\n isFontLoaded,\n getLoadedFontFamily,\n FontLoadingOptions,\n} from '../utils/fontUtils';\n\nexport interface UseFontLoaderOptions {\n preload?: boolean;\n onLoad?: (fontFamily: string, cssValue: string) => void;\n onError?: (fontFamily: string, error: Error) => void;\n}\n\nexport interface FontLoaderState {\n loadedFonts: Map<string, string>; // fontFamily -> CSS value\n loadingFonts: Set<string>;\n errorFonts: Map<string, Error>;\n}\n\n/**\n * Hook for managing dynamic font loading in Remotion components\n */\nexport const useFontLoader = (options: UseFontLoaderOptions = {}) => {\n const [state, setState] = useState<FontLoaderState>({\n loadedFonts: new Map(),\n loadingFonts: new Set(),\n errorFonts: new Map(),\n });\n\n const loadFont = useCallback(\n async (\n fontFamily: string,\n fontOptions: FontLoadingOptions = {}\n ): Promise<string> => {\n const fontKey = `${fontFamily}-${JSON.stringify(fontOptions)}`;\n\n if (\n state.loadedFonts.has(fontKey) ||\n state.loadingFonts.has(fontFamily)\n ) {\n return state.loadedFonts.get(fontKey) || `\"${fontFamily}\", sans-serif`;\n }\n\n setState((prev) => ({\n ...prev,\n loadingFonts: new Set(prev.loadingFonts).add(fontFamily),\n }));\n\n try {\n const cssValue = await loadGoogleFont(fontFamily, fontOptions);\n\n if (cssValue !== null) {\n setState((prev) => ({\n ...prev,\n loadedFonts: new Map(prev.loadedFonts).set(fontKey, cssValue),\n loadingFonts: new Set(\n [...prev.loadingFonts].filter((f) => f !== fontFamily)\n ),\n }));\n\n options.onLoad?.(fontFamily, cssValue);\n return cssValue;\n } else {\n throw new Error(\n `Font Package @remotion/google-fonts/${fontFamily} not found`\n );\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n\n setState((prev) => ({\n ...prev,\n errorFonts: new Map(prev.errorFonts).set(fontFamily, errorObj),\n loadingFonts: new Set(\n [...prev.loadingFonts].filter((f) => f !== fontFamily)\n ),\n }));\n\n options.onError?.(fontFamily, errorObj);\n\n // Return fallback\n const fallbackValue = `\"${fontFamily}\", sans-serif`;\n return fallbackValue;\n }\n },\n [state.loadedFonts, state.loadingFonts, options]\n );\n\n const loadMultipleFonts = useCallback(\n async (\n fonts: Array<{ family: string; options?: FontLoadingOptions }>\n ): Promise<Map<string, string>> => {\n const fontsToLoad = fonts.filter(({ family, options = {} }) => {\n const fontKey = `${family}-${JSON.stringify(options)}`;\n return (\n !state.loadedFonts.has(fontKey) && !state.loadingFonts.has(family)\n );\n });\n\n if (fontsToLoad.length === 0) {\n return state.loadedFonts;\n }\n\n // Add all fonts to loading state\n setState((prev) => ({\n ...prev,\n loadingFonts: new Set([\n ...prev.loadingFonts,\n ...fontsToLoad.map((f) => f.family),\n ]),\n }));\n\n try {\n const fontMap = await loadMultipleFontsUtil(fontsToLoad);\n\n // Update state with new fonts using proper keys\n const newFontsMap = new Map<string, string>();\n fontsToLoad.forEach(({ family, options = {} }) => {\n const fontKey = `${family}-${JSON.stringify(options)}`;\n const cssValue = fontMap.get(family);\n if (cssValue) {\n newFontsMap.set(fontKey, cssValue);\n }\n });\n\n setState((prev) => ({\n ...prev,\n loadedFonts: new Map([...prev.loadedFonts, ...newFontsMap]),\n loadingFonts: new Set(\n [...prev.loadingFonts].filter(\n (f) => !fontsToLoad.some((ftl) => ftl.family === f)\n )\n ),\n }));\n\n fontsToLoad.forEach(({ family }) => {\n const cssValue = fontMap.get(family);\n if (cssValue) {\n options.onLoad?.(family, cssValue);\n }\n });\n\n return fontMap;\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n\n setState((prev) => ({\n ...prev,\n errorFonts: new Map(prev.errorFonts).set('multiple', errorObj),\n loadingFonts: new Set(\n [...prev.loadingFonts].filter(\n (f) => !fontsToLoad.some((ftl) => ftl.family === f)\n )\n ),\n }));\n\n options.onError?.('multiple', errorObj);\n\n // Return current loaded fonts\n return state.loadedFonts;\n }\n },\n [state.loadedFonts, state.loadingFonts, options]\n );\n\n const isFontReady = useCallback(\n (fontFamily: string, options: FontLoadingOptions = {}): boolean => {\n const fontKey = `${fontFamily}-${JSON.stringify(options)}`;\n return state.loadedFonts.has(fontKey);\n },\n [state.loadedFonts]\n );\n\n const areFontsReady = useCallback(\n (\n fontFamilies: Array<{ family: string; options?: FontLoadingOptions }>\n ): boolean => {\n return fontFamilies.every(({ family, options = {} }) => {\n const fontKey = `${family}-${JSON.stringify(options)}`;\n return state.loadedFonts.has(fontKey);\n });\n },\n [state.loadedFonts]\n );\n\n const getFontFamily = useCallback(\n (\n fontFamily: string,\n options: FontLoadingOptions = {}\n ): string | undefined => {\n const fontKey = `${fontFamily}-${JSON.stringify(options)}`;\n return state.loadedFonts.get(fontKey);\n },\n [state.loadedFonts]\n );\n\n const getFontError = useCallback(\n (fontFamily: string): Error | undefined => {\n return state.errorFonts.get(fontFamily);\n },\n [state.errorFonts]\n );\n\n const clearErrors = useCallback((): void => {\n setState((prev) => ({\n ...prev,\n errorFonts: new Map(),\n }));\n }, []);\n\n return {\n // State\n loadedFonts: state.loadedFonts,\n loadingFonts: state.loadingFonts,\n errorFonts: state.errorFonts,\n\n // Actions\n loadFont,\n loadMultipleFonts,\n isFontReady,\n areFontsReady,\n getFontFamily,\n getFontError,\n clearErrors,\n };\n};\n\n/**\n * Hook for loading a single font with automatic loading\n */\nexport const useFont = (\n fontFamily: string,\n options: FontLoadingOptions & UseFontLoaderOptions = {}\n) => {\n const { loadFont, isFontReady, getFontFamily, getFontError, ...rest } =\n useFontLoader(options);\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Initialize fontFamilyValue from cache if available, otherwise use fallback\n const initialFontFamily =\n getFontFamily(fontFamily, options) || `\"${fontFamily}\", sans-serif`;\n const [fontFamilyValue, setFontFamilyValue] =\n useState<string>(initialFontFamily);\n\n useEffect(() => {\n const loadFontAsync = async () => {\n try {\n const cssValue = await loadFont(fontFamily, options);\n setFontFamilyValue(cssValue);\n setIsLoaded(true);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoaded(false);\n }\n };\n\n if (!isFontReady(fontFamily, options)) {\n loadFontAsync();\n } else {\n const cachedValue = getFontFamily(fontFamily, options);\n if (cachedValue) {\n setFontFamilyValue(cachedValue);\n }\n setIsLoaded(true);\n }\n }, [fontFamily, loadFont, isFontReady, getFontFamily, options]);\n\n return {\n isLoaded,\n error,\n isReady: isFontReady(fontFamily, options),\n fontFamily: fontFamilyValue,\n ...rest,\n };\n};\n","// Dynamic font loading utilities for Remotion\n// Note: This utility provides a framework for font loading\n// Specific font loading should be done using @remotion/google-fonts/{FontName}\n//\n// IMPORTANT: Make sure the font you're trying to load is available in @remotion/google-fonts\n// Font names are automatically normalized (spaces to hyphens, lowercase)\n// For example: \"WaterBrush\" becomes \"waterbrush\", \"Open Sans\" becomes \"open-sans\"\n// Use isFontAvailable() to check if a font is supported before loading\n\nimport { getAvailableFonts } from '@remotion/google-fonts';\n\nconst availableFonts = getAvailableFonts();\n\nexport interface FontConfig {\n family: string;\n weights?: string[];\n subsets?: string[];\n display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n preload?: boolean;\n}\n\nexport interface FontLoadingOptions {\n subsets?: string[];\n weights?: string[];\n display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n preload?: boolean;\n}\n\n// Key map for loaded fonts - stores fontFamily CSS values directly\nconst loadedFonts = new Map<string, string>();\n\n/**\n * Load a Google Font dynamically using dynamic imports\n * @param fontFamily - The font family name (e.g., 'Inter', 'Roboto')\n * @param options - Font loading options\n * @returns Promise that resolves with the fontFamily CSS value\n */\nexport const loadGoogleFont = async (\n fontFamily: string,\n options: FontLoadingOptions = {}\n): Promise<string> => {\n // Validate input\n if (!fontFamily || typeof fontFamily !== 'string' || fontFamily === '') {\n console.warn('Invalid fontFamily provided:', fontFamily);\n return 'sans-serif';\n }\n\n const fontKey = `${fontFamily}-${JSON.stringify(options)}`;\n\n // Return cached fontFamily if already loaded\n if (loadedFonts.has(fontKey)) {\n return loadedFonts.get(fontKey)!;\n }\n\n try {\n // Normalize font family name for import path\n // Convert spaces to hyphens and ensure proper casing\n\n console.log('availableFonts', availableFonts);\n // Dynamic import of the specific font package\n const thisFont = availableFonts.find(\n (font) => font.importName === fontFamily\n );\n\n console.log('thisFont', thisFont);\n\n if (thisFont?.load) {\n const fontPackage = await thisFont.load();\n\n const allFontStuff = fontPackage.loadFont('normal', {\n subsets: options.subsets || ['latin'],\n weights: options.weights || ['400'],\n });\n\n console.log('loadedFontFamily', allFontStuff.fontFamily);\n\n await allFontStuff.waitUntilDone();\n\n // Store the fontFamily CSS value in the map\n loadedFonts.set(fontKey, allFontStuff.fontFamily);\n return allFontStuff.fontFamily;\n } else {\n throw new Error(\n `Font Package @remotion/google-fonts/${fontFamily} does not have loadFont method`\n );\n }\n } catch (error) {\n console.warn(`Failed to load font ${fontFamily}:`, error);\n\n // Try alternative import paths for common font naming variations\n try {\n const alternativeNames = [\n fontFamily.toLowerCase().replace(/\\s+/g, ''),\n fontFamily.toLowerCase().replace(/\\s+/g, '-'),\n fontFamily.toLowerCase().replace(/\\s+/g, '_'),\n ];\n\n for (const altName of alternativeNames) {\n if (altName === fontFamily.toLowerCase().replace(/\\s+/g, '-')) {\n continue; // Already tried this\n }\n\n try {\n const altFontPackage = await import(\n `@remotion/google-fonts/${altName}`\n );\n if (altFontPackage.loadFont) {\n const { fontFamily: loadedFontFamily } =\n await altFontPackage.loadFont('normal', {\n subsets: options.subsets || ['latin'],\n weights: options.weights || ['400'],\n display: options.display || 'swap',\n preload: options.preload !== false,\n });\n\n loadedFonts.set(fontKey, loadedFontFamily);\n return loadedFontFamily;\n }\n } catch (altError) {\n // Continue to next alternative\n continue;\n }\n }\n } catch (altError) {\n // All alternatives failed, continue to fallback\n }\n\n // Fallback to system fonts\n const fallbackFontFamily = `\"${fontFamily}\"`;\n loadedFonts.set(fontKey, fallbackFontFamily);\n return fallbackFontFamily;\n }\n};\n\n/**\n * Load multiple fonts in parallel\n * @param fonts - Array of font configurations\n * @returns Promise that resolves with a map of font family names to CSS values\n */\nexport const loadMultipleFonts = async (\n fonts: Array<{ family: string; options?: FontLoadingOptions }>\n): Promise<Map<string, string>> => {\n const loadPromises = fonts.map(async ({ family, options }) => {\n const fontFamily = await loadGoogleFont(family, options);\n return { family, fontFamily };\n });\n\n const results = await Promise.all(loadPromises);\n const fontMap = new Map<string, string>();\n\n results.forEach(({ family, fontFamily }) => {\n fontMap.set(family, fontFamily);\n });\n\n return fontMap;\n};\n\n/**\n * Get font family CSS value from cache\n * @param fontFamily - The font family name\n * @param options - Font loading options\n * @returns CSS font-family value or undefined if not loaded\n */\nexport const getLoadedFontFamily = (\n fontFamily: string,\n options: FontLoadingOptions = {}\n): string | undefined => {\n const fontKey = `${fontFamily}-${JSON.stringify(options)}`;\n return loadedFonts.get(fontKey);\n};\n\n/**\n * Preload common fonts for better performance\n */\nexport const preloadCommonFonts = async (): Promise<Map<string, string>> => {\n const commonFonts = [\n { family: 'Inter', options: { weights: ['400', '500', '600', '700'] } },\n { family: 'Roboto', options: { weights: ['400', '500', '700'] } },\n { family: 'Open Sans', options: { weights: ['400', '600', '700'] } },\n { family: 'Lato', options: { weights: ['400', '700'] } },\n ];\n\n return await loadMultipleFonts(commonFonts);\n};\n\n/**\n * Check if a font is already loaded\n * @param fontFamily - The font family name\n * @param options - Font loading options\n * @returns boolean indicating if font is loaded\n */\nexport const isFontLoaded = (\n fontFamily: string,\n options: FontLoadingOptions = {}\n): boolean => {\n const fontKey = `${fontFamily}-${JSON.stringify(options)}`;\n return loadedFonts.has(fontKey);\n};\n\n/**\n * Clear font cache (useful for testing or memory management)\n */\nexport const clearFontCache = (): void => {\n loadedFonts.clear();\n};\n\n/**\n * Get all loaded fonts\n * @returns Map of loaded fonts\n */\nexport const getLoadedFonts = (): Map<string, string> => {\n return new Map(loadedFonts);\n};\n\n/**\n * Check if a font is available in @remotion/google-fonts\n * @param fontFamily - The font family name to check\n * @returns Promise that resolves to boolean indicating if font is available\n */\nexport const isFontAvailable = async (fontFamily: string): Promise<boolean> => {\n if (!fontFamily || typeof fontFamily !== 'string') {\n return false;\n }\n\n try {\n const normalizedFontName = fontFamily\n .trim()\n .replace(/\\s+/g, '-')\n .toLowerCase();\n\n const fontPackage = await import(\n `@remotion/google-fonts/${normalizedFontName}`\n );\n return !!fontPackage.loadFont;\n } catch (error) {\n return false;\n }\n};\n\n/**\n * Get normalized font name for import\n * @param fontFamily - The font family name\n * @returns Normalized font name suitable for import\n */\nexport const getNormalizedFontName = (fontFamily: string): string => {\n if (!fontFamily || typeof fontFamily !== 'string') {\n return '';\n }\n\n return fontFamily.trim().replace(/\\s+/g, '-').toLowerCase();\n};\n","import React, { useMemo } from 'react';\nimport { staticFile, Video, useCurrentFrame, useVideoConfig } from 'remotion';\nimport { BaseRenderableProps, ComponentConfig } from '../../core/types';\nimport { z } from 'zod';\n\n// ============================================================================\n// TYPES & SCHEMAS\n// ============================================================================\n\n\nexport const VideoAtomDataProps = z.object({\n src: z.string(), // Video source URL\n style: z.record(z.string(), z.any()).optional(), // CSS styles object\n className: z.string().optional(), // CSS class names\n startFrom: z.number().optional(), // Start playback from this time (seconds)\n endAt: z.number().optional(), // End playback at this time (seconds)\n playbackRate: z.number().optional(), // Playback speed multiplier\n volume: z.number().optional(), // Volume level (0-1)\n muted: z.boolean().optional(), // Mute video audio\n loop: z.boolean().optional(), // Whether to loop the video\n fit: z.enum(['contain', 'cover', 'fill', 'none', 'scale-down']).optional(), // Object fit style\n});\nexport type VideoAtomDataProps = z.infer<typeof VideoAtomDataProps>;\n\n// ============================================================================\n// PROPS & COMPONENT\n// ============================================================================\n\n/**\n * Props interface for the VideoAtom component\n * Extends base renderable props with video-specific data\n */\ninterface VideoAtomProps extends BaseRenderableProps {\n data: VideoAtomDataProps;\n}\n\n/**\n * VideoAtom Component\n * \n * A Remotion component that renders video with advanced control features:\n * - Time-based trimming (start/end points)\n * - Playback rate and volume control\n * - Flexible styling and object fit options\n * - Loop functionality\n * \n * @param data - Video configuration object containing all playback and styling settings\n * @returns Remotion Video component with applied configurations\n */\nexport const Atom: React.FC<VideoAtomProps> = ({ data }) => {\n const { fps } = useVideoConfig();\n const frame = useCurrentFrame();\n\n // Calculate video source with proper handling for local vs remote files\n const source = useMemo(() => {\n if (data.src.startsWith('http')) {\n return data.src;\n }\n return staticFile(data.src);\n }, [data.src]);\n\n // Calculate trim values in frames\n const trimBefore = useMemo(() => {\n return data.startFrom ? data.startFrom * fps : undefined;\n }, [data.startFrom, fps]);\n\n const trimAfter = useMemo(() => {\n return data.endAt ? data.endAt * fps : undefined;\n }, [data.endAt, fps]);\n\n // Combine styles with object fit if specified\n const combinedStyle = useMemo(() => {\n const baseStyle = data.style || {};\n const objectFit = data.fit ? { objectFit: data.fit } : {};\n return { ...baseStyle, ...objectFit };\n }, [data.style, data.fit]);\n\n return (\n <Video\n className={data.className}\n src={source}\n style={combinedStyle}\n trimBefore={trimBefore}\n trimAfter={trimAfter}\n playbackRate={data.playbackRate}\n volume={data.volume}\n muted={data.muted}\n loop={data.loop}\n />\n );\n};\n\n// ============================================================================\n// STATIC HELPERS\n// ============================================================================\n\n/**\n * Static helper functions for video data manipulation\n * Provides utility functions for working with VideoAtomDataProps outside of React components\n */\nexport const VideoDataHelper = {\n /**\n * Determines if a video should be trimmed at a given timestamp\n * \n * @param data - Video configuration data\n * @param options - Options object containing timestamp and fps\n * @param options.timestamp - Time in seconds to check trim status (default: 0)\n * @param options.fps - Frames per second for frame calculation (default: 30)\n * @returns boolean indicating if video should be trimmed at the given timestamp\n */\n isTrimmed: (data: VideoAtomDataProps, options: {\n timestamp?: number;\n fps?: number;\n }) => {\n const { timestamp = 0, fps = 30 } = options;\n\n if (!data.startFrom || !data.endAt) return false;\n\n const currentTime = timestamp;\n const startTime = data.startFrom || 0;\n const endTime = data.endAt;\n\n if (endTime) {\n return currentTime < startTime || currentTime > endTime;\n }\n\n return currentTime < startTime;\n },\n\n /**\n * Calculates the effective duration of a video after trimming\n * \n * @param data - Video configuration data\n * @param originalDuration - Original video duration in seconds\n * @returns Effective duration in seconds after applying trim settings\n */\n getEffectiveDuration: (data: VideoAtomDataProps, originalDuration: number) => {\n if (!data.startFrom || !data.endAt) return originalDuration;\n\n const startTime = data.startFrom || 0;\n const endTime = data.endAt || originalDuration;\n\n return Math.max(0, endTime - startTime);\n },\n\n /**\n * Validates video source URL format\n * \n * @param src - Video source URL\n * @returns boolean indicating if the source URL is valid\n */\n isValidSource: (src: string) => {\n if (!src) return false;\n\n // Check for HTTP/HTTPS URLs\n if (src.startsWith('http://') || src.startsWith('https://')) {\n return true;\n }\n\n // Check for local file paths (basic validation)\n const validExtensions = ['.mp4', '.webm', '.mov', '.avi', '.mkv'];\n return validExtensions.some(ext => src.toLowerCase().includes(ext));\n }\n};\n\nexport const config: ComponentConfig = {\n displayName: 'VideoAtom',\n type: 'atom',\n isInnerSequence: false,\n};","import React, { useMemo } from 'react';\nimport { Audio, staticFile, useCurrentFrame, useVideoConfig } from 'remotion';\nimport { BaseRenderableProps, ComponentConfig } from '../../core/types';\nimport { z } from 'zod';\n\n// ============================================================================\n// TYPES & SCHEMAS\n// ============================================================================\n\nexport const AudioAtomMutedRangeProps = z.object({\n type: z.literal('range'),\n values: z.array(z.object({\n start: z.number(), // Start time in seconds\n end: z.number(), // End time in seconds\n })),\n});\nexport type AudioAtomMutedRangeProps = z.infer<typeof AudioAtomMutedRangeProps>;\n\nexport const AudioAtomMutedFullProps = z.object({\n type: z.literal('full'),\n value: z.boolean(), // true = muted, false = unmuted\n});\nexport type AudioAtomMutedFullProps = z.infer<typeof AudioAtomMutedFullProps>;\n\nexport const AudioAtomDataProps = z.object({\n src: z.string(), // Audio source URL\n startFrom: z.number().optional(), // Start playback from this time (seconds)\n endAt: z.number().optional(), // End playback at this time (seconds)\n volume: z.number().optional(), // Volume level (0-1)\n playbackRate: z.number().optional(), // Playback speed multiplier\n muted: z.union([AudioAtomMutedFullProps, AudioAtomMutedRangeProps]).optional(), // Mute configuration\n});\nexport type AudioAtomDataProps = z.infer<typeof AudioAtomDataProps>;\n\n\n\n// ============================================================================\n// PROPS & COMPONENT\n// ============================================================================\n\n/**\n * Props interface for the AudioAtom component\n * Extends base renderable props with audio-specific data\n */\ninterface AudioAtomProps extends BaseRenderableProps {\n data: AudioAtomDataProps;\n}\n\n/**\n * AudioAtom Component\n * \n * A Remotion component that renders audio with advanced control features:\n * - Time-based trimming (start/end points)\n * - Volume and playback rate control\n * - Flexible muting (full track or specific time ranges)\n * \n * @param data - Audio configuration object containing all playback settings\n * @returns Remotion Audio component with applied configurations\n */\nexport const Atom: React.FC<AudioAtomProps> = ({ data }) => {\n const { fps } = useVideoConfig();\n const { muted } = data;\n const frame = useCurrentFrame();\n\n // Calculate if audio should be muted based on current frame and mute configuration\n const isMuted = useMemo(() => {\n if (muted?.type === 'full') {\n return muted.value;\n }\n if (muted?.type === 'range') {\n return muted?.values.some(value =>\n frame >= value.start * fps && frame <= value.end * fps\n );\n }\n return false;\n }, [muted, frame, fps]);\n\n const source = useMemo(() => {\n if (data.src.startsWith('http')) {\n return data.src;\n }\n return staticFile(data.src);\n }, [data.src]);\n\n return (\n // @ts-ignore\n <Audio\n src={source}\n trimBefore={data.startFrom ? data.startFrom * fps : undefined}\n trimAfter={data.endAt ? data.endAt * fps : undefined}\n volume={data.volume}\n playbackRate={data.playbackRate}\n muted={isMuted}\n />\n );\n};\n\n// ============================================================================\n// STATIC HELPERS\n// ============================================================================\n\n/**\n * Static helper functions for audio data manipulation\n * Provides utility functions for working with AudioAtomDataProps outside of React components\n */\nexport const AudioDatahelper = {\n /**\n * Determines if audio should be muted at a given timestamp\n * \n * @param data - Audio configuration data\n * @param options - Options object containing timestamp and fps\n * @param options.timestamp - Time in seconds to check mute status (default: 0)\n * @param options.fps - Frames per second for frame calculation (default: 30)\n * @returns boolean indicating if audio should be muted at the given timestamp\n */\n isMuted: (data: AudioAtomDataProps, options: {\n timestamp?: number;\n fps?: number;\n }) => {\n const { timestamp = 0, fps = 30 } = options;\n const frame = timestamp * fps;\n\n // Check full mute configuration\n if (data.muted?.type === 'full') {\n return data.muted.value;\n }\n\n // Check range mute configuration\n if (data.muted?.type === 'range') {\n return data.muted.values.some(value => {\n const startFrame = value.start * fps;\n const endFrame = value.end * fps;\n if (frame) {\n return frame >= startFrame && frame <= endFrame;\n }\n });\n }\n\n // Default: not muted\n return false;\n }\n}\n\nexport const config: ComponentConfig = {\n displayName: 'AudioAtom',\n type: 'atom',\n isInnerSequence: false,\n}","import React, { useEffect, useState } from 'react';\nimport { BaseRenderableProps } from '../../core/types';\nimport { ComponentConfig } from '../../core/types';\nimport { useFont } from '../../hooks/useFontLoader';\n\n// Simplified font loading approach - similar to Remotion Google Fonts:\n// const { fontFamily } = useFont('Inter', { weights: ['400', '700'] });\n// \n// The fontFamily value is now directly usable in CSS:\n// style={{ fontFamily }}\n\ninterface FontConfig {\n family: string;\n weights?: string[];\n subsets?: string[];\n display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n preload?: boolean;\n}\n\nexport interface TextAtomDataWithFonts {\n text: string;\n style?: React.CSSProperties;\n className?: string;\n font?: FontConfig;\n fallbackFonts?: string[];\n loadingState?: {\n showLoadingIndicator?: boolean;\n loadingText?: string;\n loadingStyle?: React.CSSProperties;\n };\n errorState?: {\n showErrorIndicator?: boolean;\n errorText?: string;\n errorStyle?: React.CSSProperties;\n };\n}\n\ninterface TextAtomProps extends BaseRenderableProps {\n data: TextAtomDataWithFonts;\n}\n\n/**\n * Enhanced TextAtom with comprehensive dynamic font loading capabilities\n * \n * Features:\n * - Dynamic Google Font loading with simplified API\n * - Loading states with visual indicators\n * - Error handling with fallbacks\n * - Multiple font weights and subsets support\n * - Font preloading for performance\n * - Graceful degradation to system fonts\n */\nexport const Atom: React.FC<TextAtomProps> = ({ data }) => {\n const [isFontLoading, setIsFontLoading] = useState(false);\n\n // Font loading logic - now returns fontFamily CSS value directly\n const { isLoaded, error, isReady, fontFamily } = useFont(\n data.font?.family || 'Inter',\n {\n weights: data.font?.weights || ['400'],\n subsets: data.font?.subsets || ['latin'],\n display: data.font?.display || 'swap',\n preload: data.font?.preload !== false,\n onLoad: (family, cssValue) => {\n console.log(`Font ${family} loaded successfully with CSS value: ${cssValue}`);\n setIsFontLoading(false);\n },\n onError: (family, error) => {\n console.warn(`Font ${family} failed to load:`, error);\n setIsFontLoading(false);\n },\n }\n );\n\n // Update loading state when font status changes\n useEffect(() => {\n if (data.font?.family) {\n if (isReady || isLoaded) {\n setIsFontLoading(false);\n } else if (!isReady && !isLoaded && !error) {\n setIsFontLoading(true);\n }\n }\n }, [data.font, isReady, isLoaded, error]);\n\n // Enhanced style with font loading support\n const enhancedStyle: React.CSSProperties = {\n fontFamily,\n opacity: isFontLoading ? 0.8 : 1,\n transition: 'opacity 0.3s ease-in-out, font-family 0.2s ease-in-out',\n ...data.style,\n };\n\n // Loading state\n if (isFontLoading && data.loadingState?.showLoadingIndicator) {\n return (\n <div style={enhancedStyle} className={data.className}>\n <span style={data.loadingState.loadingStyle}>\n {data.loadingState.loadingText || 'Loading...'}\n </span>\n </div>\n );\n }\n\n // Error state\n if (error && data.errorState?.showErrorIndicator) {\n return (\n <div style={enhancedStyle} className={data.className}>\n <span style={data.errorState.errorStyle}>\n {data.errorState.errorText || data.text}\n </span>\n </div>\n );\n }\n\n return (\n <div\n style={enhancedStyle}\n className={data.className}\n data-font-loading={isFontLoading}\n data-font-loaded={isReady || isLoaded}\n data-font-error={!!error}\n data-font-family={data.font?.family || 'system'}\n >\n {data.text}\n </div>\n );\n};\n\n// Static config for TextAtom\nexport const config: ComponentConfig = {\n displayName: 'TextAtomWithFonts',\n type: 'atom',\n isInnerSequence: false,\n};","// Export all atom components\nexport { Atom as ShapeAtom, config as ShapeAtomConfig } from './ShapeAtom';\nexport { Atom as ImageAtom, config as ImageAtomConfig } from './ImageAtom';\nexport { Atom as TextAtom, config as TextAtomConfig } from './TextAtom';\nexport { Atom as VideoAtom, config as VideoAtomConfig } from './VideoAtom';\nexport { Atom as AudioAtom, config as AudioAtomConfig } from './AudioAtom';\nexport {\n Atom as TextAtomWithFonts,\n config as TextAtomWithFontsConfig,\n type TextAtomDataWithFonts,\n} from './TextAtomWithFonts';\n\n// Import registerComponent function\nimport { registerComponent } from '../../core/registry';\n\n// Import components for registration\nimport { Atom as ShapeAtom, config as ShapeAtomConfig } from './ShapeAtom';\nimport { Atom as ImageAtom, config as ImageAtomConfig } from './ImageAtom';\nimport { Atom as TextAtom, config as TextAtomConfig } from './TextAtom';\nimport { Atom as VideoAtom, config as VideoAtomConfig } from './VideoAtom';\nimport { Atom as AudioAtom, config as AudioAtomConfig } from './AudioAtom';\nimport {\n Atom as TextAtomWithFonts,\n config as TextAtomWithFontsConfig,\n} from './TextAtomWithFonts';\n\n// Register all atom components using their displayName as the ID\nregisterComponent(\n ShapeAtomConfig.displayName,\n ShapeAtom,\n 'atom',\n ShapeAtomConfig\n);\nregisterComponent(\n ImageAtomConfig.displayName,\n ImageAtom,\n 'atom',\n ImageAtomConfig\n);\nregisterComponent(TextAtomConfig.displayName, TextAtom, 'atom', TextAtomConfig);\nregisterComponent(\n VideoAtomConfig.displayName,\n VideoAtom,\n 'atom',\n VideoAtomConfig\n);\nregisterComponent(\n AudioAtomConfig.displayName,\n AudioAtom,\n 'atom',\n AudioAtomConfig\n);\nregisterComponent(\n TextAtomWithFontsConfig.displayName,\n TextAtomWithFonts,\n 'atom',\n TextAtomWithFontsConfig\n);\n","import React from 'react';\nimport { BaseRenderableProps } from '../../core/types';\n\ninterface BlurEffectData {\n blur?: number;\n children?: React.ReactNode;\n}\n\nexport const BlurEffect: React.FC<BaseRenderableProps> = ({\n data,\n children\n}) => {\n const blurAmount = (data as BlurEffectData)?.blur || 5;\n\n return (\n <div style={{\n filter: `blur(${blurAmount}px)`,\n width: '100%',\n height: '100%'\n }}>\n {children}\n </div>\n );\n};\n\nexport const config = {\n displayName: 'blur',\n description: 'Applies a blur effect to its children',\n category: 'effects',\n props: {\n blur: {\n type: 'number',\n description: 'Blur amount in pixels',\n default: 5\n }\n }\n}; ","import React, { ReactNode } from 'react';\nimport { Loop } from 'remotion';\nimport { BaseRenderableProps, ComponentConfig } from '../../core/types';\n\ninterface LoopEffectData {\n durationInFrames?: number;\n times?: number;\n layout?: 'absolute-fill' | 'none';\n}\n\nexport const LoopEffect: React.FC<BaseRenderableProps> = ({\n data,\n children,\n context\n}) => {\n const { timing } = context ?? {};\n const loopData = data as LoopEffectData;\n const durationInFrames = loopData?.durationInFrames || timing?.durationInFrames || 50;\n const times = loopData?.times ?? Infinity;\n const layout = loopData?.layout || 'absolute-fill';\n\n return (\n // @ts-ignore\n <Loop\n durationInFrames={durationInFrames}\n times={times}\n layout={layout}\n >\n <>\n {children}\n </>\n </Loop>\n );\n};\n\nexport const config: ComponentConfig = {\n displayName: 'loop',\n type: 'layout',\n isInnerSequence: false,\n props: {\n durationInFrames: {\n type: 'number',\n description: 'How many frames one iteration of the loop should be long',\n default: 50\n },\n times: {\n type: 'number',\n description: 'How many times to loop the content (defaults to Infinity)',\n default: undefined\n },\n layout: {\n type: 'string',\n description: 'Either \"absolute-fill\" (default) or \"none\"',\n default: 'absolute-fill'\n }\n }\n};\n","import React, { useMemo } from 'react';\nimport { useCurrentFrame, useVideoConfig, interpolate, spring, Easing } from 'remotion';\nimport { BaseRenderableProps, ComponentConfig } from '../../core/types';\n\nexport interface PanEffectData {\n effectTiming?: 'start' | 'end';\n panDuration?: number | string; // seconds or percentage\n panStart?: number; // seconds\n panEnd?: number; // seconds\n panStartDelay?: number | string; // seconds or percentage\n panEndDelay?: number | string; // seconds or percentage\n panDirection?: 'left' | 'right' | 'up' | 'down' | 'diagonal' | 'custom';\n panDistance?: number | [number, number][]; // single number or array of [progress, distance] pairs\n loopTimes?: number; // number of times to loop the animation\n panStartPosition?: [number, number] | string; // [x, y] or position string\n panEndPosition?: [number, number] | string; // [x, y] or position string\n animationType?: 'linear' | 'spring' | 'ease-in' | 'ease-out' | 'ease-in-out';\n}\n\nconst parseDuration = (duration: number | string | undefined, contextDuration: number, fps: number): number => {\n if (!duration) return contextDuration;\n\n if (typeof duration === 'number') {\n return duration * fps;\n }\n\n if (typeof duration === 'string' && duration.endsWith('%')) {\n const percentage = parseFloat(duration.replace('%', '')) / 100;\n return Math.floor(contextDuration * percentage);\n }\n\n return contextDuration;\n};\n\nconst parseDelay = (delay: number | string | undefined, contextDuration: number, fps: number): number => {\n if (!delay) return 0;\n\n if (typeof delay === 'number') {\n return delay * fps;\n }\n\n if (typeof delay === 'string' && delay.endsWith('%')) {\n const percentage = parseFloat(delay) / 100;\n return Math.floor(contextDuration * percentage);\n }\n\n return 0;\n};\n\nconst getPanDistance = (progress: number, panDistance: number | [number, number][]): number => {\n if (typeof panDistance === 'number') {\n return panDistance;\n }\n\n if (Array.isArray(panDistance)) {\n // Handle array of [progress, distance] pairs\n if (panDistance.length === 0) return 0;\n if (panDistance.length === 1) return panDistance[0][1];\n\n // Find the appropriate distance based on progress\n for (let i = 0; i < panDistance.length - 1; i++) {\n const [currentProgress, currentDistance] = panDistance[i];\n const [nextProgress, nextDistance] = panDistance[i + 1];\n\n if (progress >= currentProgress && progress <= nextProgress) {\n const localProgress = (progress - currentProgress) / (nextProgress - currentProgress);\n return interpolate(localProgress, [0, 1], [currentDistance, nextDistance]);\n }\n }\n\n // If progress is beyond the last pair, use the last distance\n return panDistance[panDistance.length - 1][1];\n }\n\n return 0;\n};\n\nconst getPosition = (position: [number, number] | string | undefined): [number, number] => {\n if (!position) return [0.5, 0.5]; // center\n\n if (Array.isArray(position)) {\n return position;\n }\n\n // Handle string positions\n const positions: Record<string, [number, number]> = {\n 'top-left': [0, 0],\n 'top': [0.5, 0],\n 'top-right': [1, 0],\n 'left': [0, 0.5],\n 'center': [0.5, 0.5],\n 'right': [1, 0.5],\n 'bottom-left': [0, 1],\n 'bottom': [0.5, 1],\n 'bottom-right': [1, 1]\n };\n\n return positions[position] || [0.5, 0.5];\n};\n\nconst getEasingFunction = (animationType: string) => {\n switch (animationType) {\n case 'linear':\n return Easing.linear;\n case 'ease-in':\n return Easing.in(Easing.ease);\n case 'ease-out':\n return Easing.out(Easing.ease);\n case 'ease-in-out':\n return Easing.inOut(Easing.ease);\n default:\n return Easing.linear;\n }\n};\n\nconst getPanVector = (direction: string, distance: number): [number, number] => {\n switch (direction) {\n case 'left':\n return [-distance, 0];\n case 'right':\n return [distance, 0];\n case 'up':\n return [0, -distance];\n case 'down':\n return [0, distance];\n case 'diagonal':\n return [distance * 0.707, distance * 0.707]; // 45-degree diagonal\n default:\n return [0, 0];\n }\n};\n\nexport const PanEffect: React.FC<BaseRenderableProps> = ({\n data,\n children,\n context\n}) => {\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n const panData = data as PanEffectData;\n\n const { timing } = context ?? {};\n const contextDuration = timing?.durationInFrames || 50;\n\n // Parse timing parameters\n const effectTiming = panData?.effectTiming || 'start';\n const panDuration = parseDuration(panData?.panDuration, contextDuration, fps);\n const panStartDelay = parseDelay(panData?.panStartDelay, contextDuration, fps);\n const panEndDelay = parseDelay(panData?.panEndDelay, contextDuration, fps);\n\n // Animation parameters\n const panDirection = panData?.panDirection || 'right';\n let panDistance = panData?.panDistance || 100;\n const loopTimes = panData?.loopTimes || 0;\n const panStartPosition = getPosition(panData?.panStartPosition);\n const panEndPosition = getPosition(panData?.panEndPosition);\n const animationType = panData?.animationType || 'linear';\n\n // Handle loops by creating array-based panDistance\n if (loopTimes > 0 && typeof panDistance === 'number') {\n // Create a smooth loop pattern\n const loopedPanDistance: [number, number][] = [];\n for (let i = 0; i < loopTimes; i++) {\n const loopProgress = i / loopTimes;\n const nextLoopProgress = (i + 1) / loopTimes;\n\n // Create a pan back-and-forth pattern for each loop\n loopedPanDistance.push([loopProgress, 0]); // Start of loop\n loopedPanDistance.push([loopProgress + (nextLoopProgress - loopProgress) * 0.5, panDistance]); // Half way (back to start)\n loopedPanDistance.push([nextLoopProgress, 0]); // End of loop (back to start)\n }\n panDistance = loopedPanDistance;\n }\n\n // Calculate animation progress using Remotion's spring function\n let progress: number;\n\n if (animationType === 'spring') {\n progress = spring({\n frame,\n fps,\n config: {\n stiffness: 100,\n damping: 10,\n mass: 1,\n },\n durationInFrames: panDuration,\n delay: effectTiming === 'start' ? panStartDelay : (contextDuration - panEndDelay - panDuration),\n });\n } else {\n // For non-spring animations, calculate progress manually\n let animationFrame: number;\n\n if (effectTiming === 'start') {\n animationFrame = frame - panStartDelay;\n } else {\n // end timing\n animationFrame = frame - (contextDuration - panEndDelay - panDuration);\n }\n\n const easing = getEasingFunction(animationType);\n progress = interpolate(\n animationFrame,\n [0, panDuration],\n [0, 1],\n {\n easing,\n extrapolateLeft: 'clamp',\n extrapolateRight: 'clamp',\n }\n );\n }\n\n // Calculate pan offset\n let panOffset: [number, number];\n\n if (panDirection === 'custom') {\n // Custom pan using start and end positions\n const [startX, startY] = panStartPosition;\n const [endX, endY] = panEndPosition;\n const offsetX = (endX - startX) * 100; // Convert to percentage\n const offsetY = (endY - startY) * 100;\n\n panOffset = [\n interpolate(progress, [0, 1], [0, offsetX]),\n interpolate(progress, [0, 1], [0, offsetY])\n ];\n } else {\n // Direction-based pan\n const distance = getPanDistance(progress, panDistance);\n const [vectorX, vectorY] = getPanVector(panDirection, distance);\n\n panOffset = [vectorX, vectorY];\n }\n\n const style: React.CSSProperties = useMemo(() => {\n return {\n width: '100%',\n height: '100%',\n transform: `translate(${panOffset[0]}px, ${panOffset[1]}px)`,\n };\n }, [panOffset]);\n\n return (\n <div style={style}>\n {children}\n </div>\n );\n};\n\nexport const config: ComponentConfig = {\n displayName: 'pan',\n type: 'layout',\n isInnerSequence: false,\n props: {\n effectTiming: {\n type: 'string',\n description: 'When the pan effect should occur: \"start\" or \"end\"',\n default: 'start'\n },\n panDuration: {\n type: 'string',\n description: 'Duration of the pan animation in seconds or percentage (e.g., \"2\" or \"50%\")',\n default: undefined\n },\n panStart: {\n type: 'number',\n description: 'Start time of pan in seconds',\n default: 0\n },\n panEnd: {\n type: 'number',\n description: 'End time of pan in seconds',\n default: undefined\n },\n panStartDelay: {\n type: 'string',\n description: 'Delay before pan starts in seconds or percentage',\n default: 0\n },\n panEndDelay: {\n type: 'string',\n description: 'Delay before video ends in seconds or percentage',\n default: 0\n },\n panDirection: {\n type: 'string',\n description: 'Direction of pan: \"left\", \"right\", \"up\", \"down\", \"diagonal\", or \"custom\"',\n default: 'right'\n },\n panDistance: {\n type: 'string',\n description: 'Pan distance in pixels or array of [progress, distance] pairs',\n default: 100\n },\n panStartPosition: {\n type: 'string',\n description: 'Starting position: [x, y] coordinates or position string (top-left, center, etc.)',\n default: 'center'\n },\n panEndPosition: {\n type: 'string',\n description: 'Ending position: [x, y] coordinates or position string (top-left, center, etc.)',\n default: 'center'\n },\n animationType: {\n type: 'string',\n description: 'Animation curve: \"linear\", \"spring\", \"ease-in\", \"ease-out\", \"ease-in-out\"',\n default: 'linear'\n }\n }\n};\n","import React, { useMemo } from 'react';\nimport { useCurrentFrame, useVideoConfig, interpolate, spring, Easing } from 'remotion';\nimport { BaseRenderableProps, ComponentConfig } from '../../core/types';\n\nexport interface ZoomEffectData {\n effectTiming?: 'start' | 'end';\n zoomDuration?: number | string; // seconds or percentage\n zoomStart?: number; // seconds\n zoomEnd?: number; // seconds\n zoomStartDelay?: number | string; // seconds or percentage\n zoomEndDelay?: number | string; // seconds or percentage\n zoomDirection?: 'in' | 'out';\n zoomDepth?: number | [number, number][]; // single number or array of [progress, scale] pairs\n loopTimes?: number; // number of times to loop the animation\n zoomPosition?: [number, number] | string; // [x, y] or position string\n animationType?: 'linear' | 'spring' | 'ease-in' | 'ease-out' | 'ease-in-out';\n}\n\nconst parseDuration = (duration: number | string | undefined, contextDuration: number, fps: number): number => {\n if (!duration) return contextDuration;\n\n if (typeof duration === 'number') {\n return duration * fps;\n }\n\n if (typeof duration === 'string' && duration.endsWith('%')) {\n const percentage = parseFloat(duration.replace('%', '')) / 100;\n return Math.floor(contextDuration * percentage);\n }\n\n return contextDuration;\n};\n\nconst parseDelay = (delay: number | string | undefined, contextDuration: number, fps: number): number => {\n if (!delay) return 0;\n\n if (typeof delay === 'number') {\n return delay * fps;\n }\n\n if (typeof delay === 'string' && delay.endsWith('%')) {\n const percentage = parseFloat(delay) / 100;\n return Math.floor(contextDuration * percentage);\n }\n\n return 0;\n};\n\nconst getZoomScale = (progress: number, zoomDepth: number | [number, number][]): number => {\n if (typeof zoomDepth === 'number') {\n return zoomDepth;\n }\n\n if (Array.isArray(zoomDepth)) {\n // Handle array of [progress, scale] pairs\n if (zoomDepth.length === 0) return 1;\n if (zoomDepth.length === 1) return zoomDepth[0][1];\n\n // Find the appropriate scale based on progress\n for (let i = 0; i < zoomDepth.length - 1; i++) {\n const [currentProgress, currentScale] = zoomDepth[i];\n const [nextProgress, nextScale] = zoomDepth[i + 1];\n\n if (progress >= currentProgress && progress <= nextProgress) {\n const localProgress = (progress - currentProgress) / (nextProgress - currentProgress);\n return interpolate(localProgress, [0, 1], [currentScale, nextScale]);\n }\n }\n\n // If progress is beyond the last pair, use the last scale\n return zoomDepth[zoomDepth.length - 1][1];\n }\n\n return 1;\n};\n\nconst getZoomPosition = (position: [number, number] | string | undefined): [number, number] => {\n if (!position) return [0.5, 0.5]; // center\n\n if (Array.isArray(position)) {\n return position;\n }\n\n // Handle string positions\n const positions: Record<string, [number, number]> = {\n 'top-left': [0, 0],\n 'top': [0.5, 0],\n 'top-right': [1, 0],\n 'left': [0, 0.5],\n 'center': [0.5, 0.5],\n 'right': [1, 0.5],\n 'bottom-left': [0, 1],\n 'bottom': [0.5, 1],\n 'bottom-right': [1, 1]\n };\n\n return positions[position] || [0.5, 0.5];\n};\n\nconst getEasingFunction = (animationType: string) => {\n switch (animationType) {\n case 'linear':\n return Easing.linear;\n case 'ease-in':\n return Easing.in(Easing.ease);\n case 'ease-out':\n return Easing.out(Easing.ease);\n case 'ease-in-out':\n return Easing.inOut(Easing.ease);\n default:\n return Easing.linear;\n }\n};\n\nexport const ZoomEffect: React.FC<BaseRenderableProps> = ({\n data,\n children,\n context\n}) => {\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n const zoomData = data as ZoomEffectData;\n\n const { timing } = context ?? {};\n const contextDuration = timing?.durationInFrames || 50;\n\n console.log(contextDuration);\n\n // Parse timing parameters\n const effectTiming = zoomData?.effectTiming || 'start';\n const zoomDuration = parseDuration(zoomData?.zoomDuration, contextDuration, fps);\n const zoomStartDelay = parseDelay(zoomData?.zoomStartDelay, contextDuration, fps);\n const zoomEndDelay = parseDelay(zoomData?.zoomEndDelay, contextDuration, fps);\n\n // Animation parameters\n const zoomDirection = zoomData?.zoomDirection || 'in';\n let zoomDepth = zoomData?.zoomDepth || 1.5;\n const loopTimes = zoomData?.loopTimes || 0;\n\n if (loopTimes > 1 && Array.isArray(zoomDepth)) {\n // For array zoomDepth, create loops by adjusting the x values\n const loopedZoomDepth: [number, number][] = [];\n for (let i = 0; i < loopTimes; i++) {\n const loopProgress = i / loopTimes;\n const nextLoopProgress = (i + 1) / loopTimes;\n\n zoomDepth.forEach(([x, y]) => {\n // Map the original x value to the current loop's progress range\n const mappedX = loopProgress + (x * (nextLoopProgress - loopProgress));\n loopedZoomDepth.push([mappedX, y]);\n });\n }\n zoomDepth = loopedZoomDepth;\n }\n else if (loopTimes > 0 && typeof zoomDepth === 'number') {\n // For number zoomDepth, create a smooth loop pattern\n const loopedZoomDepth: [number, number][] = [];\n for (let i = 0; i < loopTimes; i++) {\n const loopProgress = i / loopTimes;\n const nextLoopProgress = (i + 1) / loopTimes;\n\n // Create a zoom in/out pattern for each loop\n loopedZoomDepth.push([loopProgress, 1]); // Start of loop\n loopedZoomDepth.push([loopProgress + (nextLoopProgress - loopProgress) * 0.5, zoomDepth]); // Middle of loop (peak zoom)\n loopedZoomDepth.push([nextLoopProgress, 1]); // End of loop\n }\n zoomDepth = loopedZoomDepth;\n }\n\n const zoomPosition = getZoomPosition(zoomData?.zoomPosition);\n const animationType = zoomData?.animationType || 'linear';\n\n // Calculate animation progress using Remotion's spring function\n let progress: number;\n\n if (animationType === 'spring') {\n progress = spring({\n frame,\n fps,\n config: {\n stiffness: 100,\n damping: 10,\n mass: 1,\n },\n durationInFrames: zoomDuration,\n delay: effectTiming === 'start' ? zoomStartDelay : (contextDuration - zoomEndDelay - zoomDuration),\n });\n } else {\n // For non-spring animations, calculate progress manually\n let animationFrame: number;\n\n if (effectTiming === 'start') {\n animationFrame = frame - zoomStartDelay;\n } else {\n // end timing\n animationFrame = frame - (contextDuration - zoomEndDelay - zoomDuration);\n }\n\n const easing = getEasingFunction(animationType);\n progress = interpolate(\n animationFrame,\n [0, zoomDuration],\n [0, 1],\n {\n easing,\n extrapolateLeft: 'clamp',\n extrapolateRight: 'clamp',\n }\n );\n }\n\n // Calculate scale based on zoomDepth type\n let scale: number;\n\n if (typeof zoomDepth === 'number') {\n // Simple number case - interpolate between 1 and zoomDepth\n const baseScale = zoomDirection === 'in' ? 1 : zoomDepth;\n const targetScale = zoomDirection === 'in' ? zoomDepth : 1;\n scale = interpolate(progress, [0, 1], [baseScale, targetScale]);\n } else if (Array.isArray(zoomDepth)) {\n // Array case - get the scale directly from the array based on current progress\n // When using arrays, the zoom direction is already encoded in the array values\n scale = getZoomScale(progress, zoomDepth);\n } else {\n // Fallback\n const baseScale = zoomDirection === 'in' ? 1 : 1.5;\n const targetScale = zoomDirection === 'in' ? 1.5 : 1;\n scale = interpolate(progress, [0, 1], [baseScale, targetScale]);\n }\n\n // Calculate transform origin\n const [originX, originY] = zoomPosition;\n const transformOrigin = `${originX * 100}% ${originY * 100}%`;\n\n const style: React.CSSProperties = useMemo(() => {\n return {\n width: '100%',\n height: '100%',\n transform: `scale(${scale})`,\n transformOrigin,\n };\n }, [scale, transformOrigin]);\n\n return (\n <div style={style}>\n {children}\n </div>\n );\n};\n\nexport const config: ComponentConfig = {\n displayName: 'zoom',\n type: 'layout',\n isInnerSequence: false,\n props: {\n effectTiming: {\n type: 'string',\n description: 'When the zoom effect should occur: \"start\" or \"end\"',\n default: 'start'\n },\n zoomDuration: {\n type: 'string',\n description: 'Duration of the zoom animation in seconds or percentage (e.g., \"2\" or \"50%\")',\n default: undefined\n },\n zoomStart: {\n type: 'number',\n description: 'Start time of zoom in seconds',\n default: 0\n },\n zoomEnd: {\n type: 'number',\n description: 'End time of zoom in seconds',\n default: undefined\n },\n zoomStartDelay: {\n type: 'string',\n description: 'Delay before zoom starts in seconds or percentage',\n default: 0\n },\n zoomEndDelay: {\n type: 'string',\n description: 'Delay before video ends in seconds or percentage',\n default: 0\n },\n zoomDirection: {\n type: 'string',\n description: 'Direction of zoom: \"in\" or \"out\"',\n default: 'in'\n },\n zoomDepth: {\n type: 'string',\n description: 'Zoom scale factor or array of [progress, scale] pairs',\n default: 1.5\n },\n zoomPosition: {\n type: 'string',\n description: 'Zoom anchor point: [x, y] coordinates or position string (top-left, center, etc.)',\n default: 'center'\n },\n animationType: {\n type: 'string',\n description: 'Animation curve: \"linear\", \"spring\", \"ease-in\", \"ease-out\", \"ease-in-out\"',\n default: 'linear'\n }\n }\n};\n","// Import registerEffect function\nimport { registerEffect } from '../../core/registry';\n\n// Import effect components for registration\nimport { BlurEffect, config as BlurEffectConfig } from './BlurEffect';\nimport { LoopEffect, config as LoopEffectConfig } from './Loop';\nimport { PanEffect, config as PanEffectConfig } from './Pan';\nimport { ZoomEffect, config as ZoomEffectConfig } from './Zoom';\n\n// Register all effect components\nregisterEffect(BlurEffectConfig.displayName, BlurEffect, BlurEffectConfig);\nregisterEffect(LoopEffectConfig.displayName, LoopEffect, LoopEffectConfig);\nregisterEffect(PanEffectConfig.displayName, PanEffect, PanEffectConfig);\nregisterEffect(ZoomEffectConfig.displayName, ZoomEffect, ZoomEffectConfig);\n\n// Export effect components\nexport { BlurEffect, config as BlurEffectConfig } from './BlurEffect';\nexport { LoopEffect, config as LoopEffectConfig } from './Loop';\nexport {\n PanEffect,\n config as PanEffectConfig,\n type PanEffectData,\n} from './Pan';\nexport {\n ZoomEffect,\n config as ZoomEffectConfig,\n type ZoomEffectData,\n} from './Zoom';\n","import { useMemo } from 'react';\nimport { componentRegistry } from '../core/registry';\n\nexport const useComponentRegistry = () => {\n return useMemo(() => {\n return {\n registerComponent:\n componentRegistry.registerComponent.bind(componentRegistry),\n registerPackage:\n componentRegistry.registerPackage.bind(componentRegistry),\n getComponent: componentRegistry.getComponent.bind(componentRegistry),\n getAllComponents:\n componentRegistry.getAllComponents.bind(componentRegistry),\n };\n }, []);\n};\n","import { useMemo } from 'react';\nimport { BoundaryConstraints, LayoutConstraints } from '../core/types';\n\ninterface UseBoundaryCalculationProps {\n parentBoundaries: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n constraints: BoundaryConstraints;\n layout?: LayoutConstraints;\n}\n\nexport const useBoundaryCalculation = ({\n parentBoundaries,\n constraints,\n layout,\n}: UseBoundaryCalculationProps) => {\n return useMemo(() => {\n const { x, y, width, height } = parentBoundaries;\n\n // Calculate boundaries based on constraints\n const calculatedX = typeof constraints.x === 'number' ? constraints.x : x;\n const calculatedY = typeof constraints.y === 'number' ? constraints.y : y;\n const calculatedWidth =\n typeof constraints.width === 'number' ? constraints.width : width;\n const calculatedHeight =\n typeof constraints.height === 'number' ? constraints.height : height;\n\n return {\n x: calculatedX,\n y: calculatedY,\n width: calculatedWidth,\n height: calculatedHeight,\n zIndex: constraints.zIndex || 0,\n };\n }, [parentBoundaries, constraints, layout]);\n};\n","import { z } from 'zod';\nimport { useContext } from 'react';\nimport { LayoutContext } from '../core/types/transition.types';\n\nexport function buildLayoutHook<T extends z.ZodSchema>(\n schema: T,\n defaultValue: z.infer<T>\n) {\n return () => {\n const context = useContext(LayoutContext);\n\n if (!context) {\n // Return default values when not in a transition context\n return defaultValue;\n }\n\n try {\n // Validate the context data against the schema\n const validatedData = schema.parse(context);\n return validatedData;\n } catch (error) {\n // If validation fails, return default values\n console.warn('Transition data validation failed, using defaults:', error);\n return defaultValue;\n }\n };\n}\n","import React, { createContext, useContext } from 'react';\nimport {\n BaseRenderableProps,\n RenderableComponentData,\n} from './renderable.types';\n\nexport interface LayoutData {\n [key: string]: any;\n}\n\nexport const LayoutContext = createContext<LayoutData | null>(null);\n\nexport const useLayout = () => {\n const context = useContext(LayoutContext);\n if (!context) {\n throw new Error('useLayout must be used within a LayoutProvider');\n }\n return context;\n};\n\nexport interface LayoutProps extends BaseRenderableProps {\n children: React.ReactNode | React.ReactNode[];\n}\n","import {\n CalculatedBoundaries,\n CalculatedTiming,\n RenderableContext,\n} from '../core/types';\n\nexport const createRootContext = (\n width: number,\n height: number,\n duration: number,\n fps: number\n): RenderableContext => {\n return {\n boundaries: {\n left: 0,\n top: 0,\n width,\n height,\n zIndex: 0,\n },\n timing: {\n startInFrames: 0,\n durationInFrames: duration,\n },\n hierarchy: {\n depth: 0,\n parentIds: [],\n },\n };\n};\n\nexport const mergeContexts = (\n parent: RenderableContext,\n child: Partial<RenderableContext>\n): RenderableContext => {\n return {\n boundaries: {\n ...parent.boundaries,\n ...child.boundaries,\n } as CalculatedBoundaries,\n timing: { ...parent.timing, ...child.timing } as CalculatedTiming,\n hierarchy: {\n depth: (parent.hierarchy?.depth || 0) + 1,\n parentIds: [...(parent.hierarchy?.parentIds || []), 'root'] as string[],\n },\n };\n};\n","export const calculateGridPosition = (\n index: number,\n columns: number,\n cellWidth: number,\n cellHeight: number,\n spacing: number\n) => {\n const row = Math.floor(index / columns);\n const col = index % columns;\n\n return {\n x: col * (cellWidth + spacing),\n y: row * (cellHeight + spacing),\n width: cellWidth,\n height: cellHeight,\n };\n};\n\nexport const calculateCircularPosition = (\n index: number,\n total: number,\n radius: number,\n centerX: number,\n centerY: number\n) => {\n const angle = (index / total) * 2 * Math.PI;\n\n return {\n x: centerX + radius * Math.cos(angle),\n y: centerY + radius * Math.sin(angle),\n };\n};\n","import { evolvePath } from \"@remotion/paths\";\nimport React, { useMemo } from \"react\";\nimport { interpolate, spring, useCurrentFrame, useVideoConfig } from \"remotion\";\nimport { useRippleOutLayout } from \"./RippleOutLayout\";\nimport { ComponentConfig } from \"../../core/types\";\n\nconst mask: React.CSSProperties = {\n maskType: \"alpha\",\n};\n\nconst nStroke =\n \"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z\";\n\nexport const NextjsLogo: React.FC = () => {\n const { logoOut } = useRippleOutLayout();\n const outProgress = logoOut;\n const { fps } = useVideoConfig();\n const frame = useCurrentFrame();\n\n const evolve1 = spring({\n fps,\n frame,\n config: {\n damping: 200,\n },\n });\n const evolve2 = spring({\n fps,\n frame: frame - 15,\n config: {\n damping: 200,\n },\n });\n const evolve3 = spring({\n fps,\n frame: frame - 30,\n config: {\n damping: 200,\n mass: 3,\n },\n durationInFrames: 30,\n });\n\n const style: React.CSSProperties = useMemo(() => {\n return {\n height: 140,\n borderRadius: 70,\n scale: String(1 - outProgress),\n };\n }, [outProgress]);\n\n const firstPath = `M 60.0568 54 v 71.97`;\n const secondPath = `M 63.47956 56.17496 L 144.7535 161.1825`;\n const thirdPath = `M 121 54 L 121 126`;\n\n const evolution1 = evolvePath(evolve1, firstPath);\n const evolution2 = evolvePath(evolve2, secondPath);\n const evolution3 = evolvePath(\n interpolate(evolve3, [0, 1], [0, 0.7]),\n thirdPath,\n );\n\n return (\n <svg style={style} fill=\"none\" viewBox=\"0 0 180 180\">\n <mask height=\"180\" id=\"mask\" style={mask} width=\"180\" x=\"0\" y=\"0\">\n <circle cx=\"90\" cy=\"90\" fill=\"black\" r=\"90\"></circle>\n </mask>\n <mask id=\"n-mask\" style={mask}>\n <path d={nStroke} fill=\"black\"></path>\n </mask>\n <g mask=\"url(#mask)\">\n <circle cx=\"90\" cy=\"90\" fill=\"black\" r=\"90\"></circle>\n <g stroke=\"url(#gradient0)\" mask=\"url(#n-mask)\">\n <path\n strokeWidth=\"12.1136\"\n d={firstPath}\n strokeDasharray={evolution1.strokeDasharray}\n strokeDashoffset={evolution1.strokeDashoffset}\n ></path>\n <path\n strokeWidth={12.1136}\n d={secondPath}\n strokeDasharray={evolution2.strokeDasharray}\n strokeDashoffset={evolution2.strokeDashoffset}\n ></path>\n </g>\n <path\n stroke=\"url(#gradient1)\"\n d={thirdPath}\n strokeDasharray={evolution3.strokeDasharray}\n strokeDashoffset={evolution3.strokeDashoffset}\n strokeWidth=\"12\"\n ></path>\n </g>\n <defs>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"gradient0\"\n x1=\"109\"\n x2=\"144.5\"\n y1=\"116.5\"\n y2=\"160.5\"\n >\n <stop stopColor=\"white\"></stop>\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0\"></stop>\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"gradient1\"\n x1=\"121\"\n x2=\"120.799\"\n y1=\"54\"\n y2=\"106.875\"\n >\n <stop stopColor=\"white\"></stop>\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0\"></stop>\n </linearGradient>\n </defs>\n </svg>\n );\n};\n\nexport const nextjsLogoConfig: ComponentConfig = {\n displayName: 'NextjsLogo',\n type: 'atom',\n isInnerSequence: false,\n};","import React from 'react';\nimport { spring, useCurrentFrame, useVideoConfig, Sequence, AbsoluteFill, Series } from 'remotion';\nimport { z } from 'zod';\nimport { LayoutProps, LayoutContext } from '../../core/types/transition.types';\nimport { buildLayoutHook } from '../../hooks/buildTransitionHook';\nimport { loadFont, fontFamily } from \"@remotion/google-fonts/Inter\";\nimport { useRenderContext } from '../../components/base/ComponentRenderer';\nimport { ComponentConfig } from '../../core/types';\n\nloadFont(\"normal\", {\n subsets: [\"latin\"],\n weights: [\"400\", \"700\"],\n});\n\n// Define the Zod schema for this transition's data\nconst RippleOutTransitionSchema = z.object({\n progress: z.number().min(0).max(1),\n logoOut: z.number().min(0).max(1),\n});\n\n// Define default values\nconst defaultRippleOutData = {\n progress: 0,\n logoOut: 0,\n};\n\n// Create the typed transition hook\nexport const useRippleOutLayout = buildLayoutHook(\n RippleOutTransitionSchema,\n defaultRippleOutData\n);\n\n// Export the type for use in other components\nexport type RippleOutTransitionData = z.infer<typeof RippleOutTransitionSchema>;\n\nconst container: React.CSSProperties = {\n backgroundColor: \"white\",\n};\n\nconst logo: React.CSSProperties = {\n justifyContent: \"center\",\n alignItems: \"center\",\n};\n\nexport const RippleOutLayout: React.FC<LayoutProps> = ({ data, context, children }) => {\n const {\n transitionStart,\n transitionDuration\n } = data || { transitionStart: 2, transitionDuration: 1 };\n\n const frame = useCurrentFrame();\n const { fps } = useVideoConfig();\n const { hierarchy } = useRenderContext();\n\n const transitionStartFrame = transitionStart * fps;\n const transitionDurationFrames = transitionDuration * fps;\n\n const logoOut = spring({\n fps,\n frame,\n config: {\n damping: 200,\n },\n durationInFrames: transitionDurationFrames,\n delay: transitionStartFrame,\n });\n\n const transitionData = {\n progress: logoOut,\n logoOut,\n };\n\n const childrenArray = React.Children.toArray(children).filter(child =>\n React.isValidElement(child)\n );\n const [from, to] = childrenArray;\n\n\n return (\n <LayoutContext.Provider value={transitionData}>\n {/* @ts-ignore */}\n <AbsoluteFill style={{\n ...container,\n ...context?.boundaries,\n }}>\n {/* @ts-ignore */}\n <Sequence name={(from as any).props.componentId + \" - \" + (from as any).props.id} from={0} durationInFrames={transitionStartFrame + transitionDurationFrames}>\n {from as any}\n </Sequence>\n {/* @ts-ignore */}\n <Sequence name={(to as any).props.componentId + \" - \" + (to as any).props.id} from={transitionStartFrame + transitionDurationFrames / 2}>\n {to as any}\n </Sequence>\n </AbsoluteFill>\n </LayoutContext.Provider>\n );\n};\n\nexport const rippleOutLayoutConfig: ComponentConfig = {\n displayName: 'RippleOutLayout',\n type: 'layout',\n isInnerSequence: true,\n};","import React from \"react\";\nimport { AbsoluteFill, interpolateColors, useVideoConfig } from \"remotion\";\nimport { ComponentConfig, RenderableContext, RenderableData } from \"../../core\";\nimport { useRippleOutLayout } from \"./RippleOutLayout\";\n\nconst RadialGradient: React.FC<{\n radius: number;\n color: string;\n}> = ({ radius, color }) => {\n const height = radius * 2;\n const width = radius * 2;\n\n return (\n // @ts-ignore\n <AbsoluteFill\n style={{\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n height,\n width,\n borderRadius: \"50%\",\n backgroundColor: color,\n position: \"absolute\",\n boxShadow: \"0 0 100px rgba(0, 0, 0, 0.05)\",\n }}\n ></div>\n </AbsoluteFill>\n );\n};\n\nexport const Rings: React.FC<{\n context?: RenderableContext;\n data?: RenderableData;\n}> = ({ context, data }) => {\n const { logoOut } = useRippleOutLayout();\n const outProgress = logoOut;\n const scale = 1 / (1 - outProgress);\n const { height } = useVideoConfig();\n\n return (\n // @ts-ignore\n <AbsoluteFill\n style={{\n transform: `scale(${scale})`,\n ...context?.boundaries,\n }}\n >\n {new Array(5)\n .fill(true)\n .map((_, i) => {\n return (\n <RadialGradient\n key={i}\n radius={height * 0.3 * i}\n color={interpolateColors(i, [0, 4], [\"#fff\", \"#fff\"])}\n />\n );\n })\n .reverse()}\n </AbsoluteFill>\n );\n};\n\nexport const ringsConfig: ComponentConfig = {\n displayName: 'Rings',\n type: 'atom',\n isInnerSequence: false,\n};","import React, { useMemo } from \"react\";\nimport {\n AbsoluteFill,\n interpolate,\n spring,\n useCurrentFrame,\n useVideoConfig,\n} from \"remotion\";\nimport { BaseRenderableProps, ComponentConfig } from \"../../core\";\n\nconst outer: React.CSSProperties = {};\n\ninterface LayoutProps extends BaseRenderableProps {\n children?: React.ReactNode;\n}\n\nexport const TextFade = (props: LayoutProps) => {\n\n const { children, context, data } = props;\n const { animation } = data || {\n animation: {\n duration: 1,\n }\n };\n const { fps } = useVideoConfig();\n const frame = useCurrentFrame();\n\n\n const progress = spring({\n fps,\n frame,\n config: {\n damping: 200,\n },\n\n durationInFrames: animation.duration * fps,\n });\n\n const rightStop = interpolate(progress, [0, 1], [200, 0]);\n\n const leftStop = Math.max(0, rightStop - 60);\n\n const maskImage = `linear-gradient(-45deg, transparent ${leftStop}%, black ${rightStop}%)`;\n\n const container: React.CSSProperties = useMemo(() => {\n return {\n width: '100%',\n height: '100%',\n justifyContent: \"center\",\n alignItems: \"center\",\n };\n }, []);\n\n const content: React.CSSProperties = useMemo(() => {\n return {\n ...context?.boundaries,\n maskImage,\n WebkitMaskImage: maskImage,\n justifyContent: \"center\",\n alignItems: \"center\",\n display: \"flex\",\n };\n }, [maskImage]);\n\n return (\n // @ts-ignore\n <AbsoluteFill style={container}>\n <div style={content}>{children}</div>\n </AbsoluteFill>\n );\n};\n\nexport const textFadeConfig: ComponentConfig = {\n displayName: 'TextFade',\n type: 'layout',\n isInnerSequence: false,\n};","import { registerComponent } from '../../core';\nimport { NextjsLogo, nextjsLogoConfig } from './NextjsLogo';\nimport { Rings, ringsConfig } from './Rings';\nimport { RippleOutLayout, rippleOutLayoutConfig } from './RippleOutLayout';\nimport { TextFade, textFadeConfig } from './TextFade';\n\nexport * from './NextjsLogo';\nexport * from './Rings';\nexport * from './RippleOutLayout';\nexport * from './TextFade';\n\nregisterComponent(\n nextjsLogoConfig.displayName,\n NextjsLogo,\n 'atom',\n nextjsLogoConfig\n);\nregisterComponent(\n textFadeConfig.displayName,\n TextFade,\n 'layout',\n textFadeConfig\n);\nregisterComponent(ringsConfig.displayName, Rings, 'atom', ringsConfig);\nregisterComponent(\n rippleOutLayoutConfig.displayName,\n RippleOutLayout,\n 'layout',\n rippleOutLayoutConfig\n);\n","import React, { useMemo } from 'react';\nimport { Waveform, useWaveformContext } from '../Waveform';\nimport { BaseRenderableData } from '../../..';\n\n// Circular waveform specific props\nexport interface WaveformCircleDataProps {\n config: any; // Extends base WaveformConfig\n className?: string;\n style?: React.CSSProperties;\n\n // Circle-specific styling\n strokeColor?: string;\n strokeWidth?: number;\n fill?: string;\n opacity?: number;\n\n // Circle geometry\n radius?: number; // Radius as percentage of container\n centerX?: number; // Center X as percentage\n centerY?: number; // Center Y as percentage\n startAngle?: number; // Start angle in degrees\n endAngle?: number; // End angle in degrees\n\n // Animation\n amplitude?: number;\n rotationSpeed?: number; // Degrees per frame\n\n // Gradient\n gradientStartColor?: string;\n gradientEndColor?: string;\n}\n\nexport interface WaveformCircleProps extends BaseRenderableData {\n data: WaveformCircleDataProps;\n}\n\n// Circular waveform component\nexport const WaveformCircle: React.FC<WaveformCircleProps> = ({ data }) => {\n const {\n config,\n className = '',\n style = {},\n strokeColor = '#FF6B6B',\n strokeWidth = 3,\n fill = 'none',\n opacity = 1,\n radius = 80,\n centerX = 50,\n centerY = 50,\n startAngle = 0,\n endAngle = 360,\n amplitude = 1,\n rotationSpeed = 0,\n gradientStartColor,\n gradientEndColor,\n } = data;\n return (\n <Waveform config={config} className={className} style={style}>\n <WaveformCircleContent\n strokeColor={strokeColor}\n strokeWidth={strokeWidth}\n fill={fill}\n opacity={opacity}\n radius={radius}\n centerX={centerX}\n centerY={centerY}\n startAngle={startAngle}\n endAngle={endAngle}\n amplitude={amplitude}\n rotationSpeed={rotationSpeed}\n gradientStartColor={gradientStartColor}\n gradientEndColor={gradientEndColor}\n />\n </Waveform>\n );\n};\n\n// Internal content component\nconst WaveformCircleContent: React.FC<Omit<WaveformCircleDataProps, 'config' | 'className' | 'style'>> = ({\n strokeColor,\n strokeWidth,\n fill,\n opacity,\n radius,\n centerX,\n centerY,\n startAngle,\n endAngle,\n amplitude,\n rotationSpeed,\n gradientStartColor,\n gradientEndColor,\n}) => {\n const { waveformData, width, height, frame } = useWaveformContext();\n\n // Calculate circle parameters\n const circleRadius = (Math.min(width, height) * (radius || 80)) / 100;\n const circleCenterX = (width * (centerX || 50)) / 100;\n const circleCenterY = (height * (centerY || 50)) / 100;\n\n // Calculate rotation\n const rotation = (frame * (rotationSpeed || 0)) % 360;\n\n // Create circular path\n const circularPath = useMemo(() => {\n if (!waveformData) return '';\n\n const totalAngle = (endAngle || 360) - (startAngle || 0);\n const angleStep = totalAngle / waveformData.length;\n\n let path = '';\n\n waveformData.forEach((value, index) => {\n const angle = ((startAngle || 0) + index * angleStep + rotation) * (Math.PI / 180);\n const waveRadius = circleRadius + (value * (amplitude || 1) * circleRadius * 0.3);\n\n const x = circleCenterX + waveRadius * Math.cos(angle);\n const y = circleCenterY + waveRadius * Math.sin(angle);\n\n if (index === 0) {\n path += `M ${x} ${y}`;\n } else {\n path += ` L ${x} ${y}`;\n }\n });\n\n // Close the path if it's a full circle\n if (Math.abs((endAngle || 360) - (startAngle || 0)) >= 360) {\n path += ' Z';\n }\n\n return path;\n }, [waveformData, circleRadius, circleCenterX, circleCenterY, startAngle, endAngle, rotation, amplitude]);\n\n if (!waveformData) {\n return (\n <div className=\"flex items-center justify-center w-full h-full text-gray-500\">\n Loading circular waveform...\n </div>\n );\n }\n\n // Create gradient definition\n const gradientId = 'circle-waveform-gradient';\n const hasGradient = gradientStartColor && gradientEndColor;\n\n return (\n <svg\n width={width}\n height={height}\n className=\"absolute inset-0\"\n style={{ pointerEvents: 'none' }}\n >\n {/* Gradient definition */}\n {hasGradient && (\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor={gradientStartColor} />\n <stop offset=\"100%\" stopColor={gradientEndColor} />\n </linearGradient>\n </defs>\n )}\n\n {/* Circular waveform path */}\n <path\n d={circularPath}\n stroke={hasGradient ? `url(#${gradientId})` : strokeColor}\n strokeWidth={strokeWidth}\n fill={fill}\n opacity={opacity}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}; ","import React, { createContext, useContext, ReactNode } from 'react';\nimport { useCurrentFrame, useVideoConfig } from 'remotion';\nimport { useAudioData, visualizeAudioWaveform } from '@remotion/media-utils';\nimport { useWaveformData } from './hooks/useWaveformData';\n\n// Waveform configuration interface\nexport interface WaveformConfig {\n // Audio source\n audioSrc: string;\n useFrequencyData?: boolean;\n\n // Waveform analysis parameters\n numberOfSamples?: number; // Must be power of 2 (32, 64, 128, etc.)\n windowInSeconds?: number; // Time window for analysis\n dataOffsetInSeconds?: number; // Audio offset\n normalize?: boolean; // Normalize wave data\n\n // Styling\n height?: number;\n width?: number;\n color?: string;\n strokeWidth?: number;\n backgroundColor?: string;\n\n // Animation\n amplitude?: number; // Amplitude multiplier\n smoothing?: boolean; // Enable smoothing\n posterize?: number; // Posterize effect (round frame to multiple)\n}\n\n// Waveform context interface\nexport interface WaveformContextType {\n waveformData: number[] | null;\n frequencyData: number[] | null;\n amplitudes: number[] | null;\n audioData: any;\n frame: number;\n fps: number;\n config: WaveformConfig;\n width: number;\n height: number;\n bass: number | null;\n mid: number | null;\n treble: number | null;\n bassValues?: number[] | null;\n midValues?: number[] | null;\n trebleValues?: number[] | null;\n}\n\n// Create context\nconst WaveformContext = createContext<WaveformContextType | null>(null);\n\n// Hook to use waveform context\nexport const useWaveformContext = () => {\n const context = useContext(WaveformContext);\n if (!context) {\n throw new Error('useWaveformContext must be used within a Waveform component');\n }\n return context;\n};\n\n// Waveform component props\nexport interface WaveformProps {\n config: WaveformConfig;\n children?: ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// Base Waveform component\nexport const Waveform: React.FC<WaveformProps> = ({\n config,\n children,\n className = '',\n style = {},\n}) => {\n const frame = useCurrentFrame();\n const { width: videoWidth, height: videoHeight, fps } = useVideoConfig();\n\n // Use custom hook to get waveform data\n const { waveformData, frequencyData, amplitudes, audioData, bass, mid, treble, bassValues, midValues, trebleValues } = useWaveformData({\n audioSrc: config.audioSrc,\n numberOfSamples: config.numberOfSamples || 128,\n windowInSeconds: config.windowInSeconds || 1 / fps,\n dataOffsetInSeconds: config.dataOffsetInSeconds || 0,\n normalize: config.normalize || false,\n frame,\n fps,\n posterize: config.posterize,\n includeFrequencyData: config.useFrequencyData || false,\n });\n\n // Calculate dimensions\n const width = config.width || videoWidth;\n const height = config.height || videoHeight;\n\n // Create context value\n const contextValue: WaveformContextType = {\n waveformData,\n frequencyData,\n amplitudes,\n audioData,\n frame,\n fps,\n config,\n width,\n height,\n bass,\n mid,\n treble,\n bassValues,\n midValues,\n trebleValues,\n };\n\n return (\n <WaveformContext.Provider value={contextValue}>\n <div\n className={`relative ${className}`}\n style={{\n width,\n height,\n position: 'relative',\n backgroundColor: config.backgroundColor || 'transparent',\n ...style,\n }}\n >\n {children}\n </div>\n </WaveformContext.Provider>\n );\n};\n\n// Export default\nexport default Waveform;\n","import { useMemo } from 'react';\nimport {\n useAudioData,\n visualizeAudioWaveform,\n visualizeAudio,\n} from '@remotion/media-utils';\nimport { staticFile } from 'remotion';\n\n// Hook configuration interface\nexport interface UseWaveformDataConfig {\n audioSrc: string;\n numberOfSamples: number;\n windowInSeconds: number;\n dataOffsetInSeconds?: number;\n normalize?: boolean;\n frame: number;\n fps: number;\n posterize?: number;\n // Frequency analysis options\n includeFrequencyData?: boolean;\n minDb?: number;\n maxDb?: number;\n}\n\n// Hook return interface\nexport interface UseWaveformDataReturn {\n waveformData: number[] | null;\n frequencyData: number[] | null;\n amplitudes: number[] | null;\n audioData: any;\n isLoading: boolean;\n error: string | null;\n bass: number | null;\n bassValues?: number[] | null;\n mid: number | null;\n midValues?: number[] | null;\n treble: number | null;\n trebleValues?: number[] | null;\n}\n\n// Validate that numberOfSamples is a power of 2\nconst isValidPowerOfTwo = (num: number): boolean => {\n return num > 0 && (num & (num - 1)) === 0;\n};\n\n// Get the closest power of 2\nconst getClosestPowerOfTwo = (num: number): number => {\n if (num <= 0) return 32;\n\n let power = 1;\n while (power < num) {\n power *= 2;\n }\n\n // Return the closest power of 2\n const lower = power / 2;\n const upper = power;\n\n return Math.abs(num - lower) < Math.abs(num - upper) ? lower : upper;\n};\n\nexport const useWaveformData = (\n config: UseWaveformDataConfig\n): UseWaveformDataReturn => {\n const {\n audioSrc,\n numberOfSamples,\n windowInSeconds,\n dataOffsetInSeconds = 0,\n normalize = false,\n frame,\n fps,\n posterize,\n includeFrequencyData = false,\n minDb = -100,\n maxDb = -30,\n } = config;\n\n // Validate and adjust numberOfSamples\n const validatedNumberOfSamples = useMemo(() => {\n if (!isValidPowerOfTwo(numberOfSamples)) {\n console.warn(\n `numberOfSamples must be a power of 2. Adjusting ${numberOfSamples} to ${getClosestPowerOfTwo(numberOfSamples)}`\n );\n return getClosestPowerOfTwo(numberOfSamples);\n }\n return numberOfSamples;\n }, [numberOfSamples]);\n\n const source = useMemo(() => {\n if (audioSrc.startsWith('http')) {\n return audioSrc;\n }\n return staticFile(audioSrc);\n }, [audioSrc]);\n\n // Get audio data\n const audioData = useAudioData(source);\n\n // Calculate adjusted frame for posterize effect\n const adjustedFrame = useMemo(() => {\n if (posterize && posterize > 1) {\n return Math.round(frame / posterize) * posterize;\n }\n return frame;\n }, [frame, posterize]);\n\n // Generate waveform data\n const waveformData = useMemo(() => {\n if (!audioData) return null;\n\n try {\n const waveform = visualizeAudioWaveform({\n fps,\n frame: adjustedFrame,\n audioData,\n numberOfSamples: validatedNumberOfSamples,\n windowInSeconds,\n dataOffsetInSeconds,\n normalize,\n });\n\n return waveform;\n } catch (error) {\n console.error('Error generating waveform:', error);\n return null;\n }\n }, [\n audioData,\n adjustedFrame,\n fps,\n validatedNumberOfSamples,\n windowInSeconds,\n dataOffsetInSeconds,\n normalize,\n ]);\n\n // Generate frequency data and amplitudes\n const {\n frequencyData,\n amplitudes,\n bass,\n mid,\n treble,\n bassValues,\n midValues,\n trebleValues,\n } = useMemo(() => {\n if (!audioData || !includeFrequencyData) {\n //console.log('No audio data or frequency data requested');\n return {\n frequencyData: null,\n amplitudes: null,\n bass: null,\n mid: null,\n treble: null,\n bassValues: null,\n midValues: null,\n trebleValues: null,\n };\n }\n\n try {\n const frequencyData = visualizeAudio({\n fps,\n frame: adjustedFrame,\n audioData,\n numberOfSamples: validatedNumberOfSamples,\n });\n\n // Calculate frequency bands\n const { sampleRate } = audioData;\n const bassValues: number[] = [];\n const midValues: number[] = [];\n const trebleValues: number[] = [];\n\n for (let i = 0; i < frequencyData.length; i++) {\n const freq = (i * sampleRate) / (2 * frequencyData.length);\n const value = frequencyData[i];\n\n if (freq >= 0 && freq < 250) {\n bassValues.push(value * 2.5);\n } else if (freq >= 250 && freq < 4000) {\n midValues.push(value * 3);\n midValues.push(value * 4.5);\n midValues.push(value * 5);\n } else if (freq >= 4000 && freq < sampleRate / 2) {\n trebleValues.push(value * 30);\n }\n }\n\n // Averaging the frequency values within each band simplifies the data to a single,\n // representative number. This is useful for creating smoother and more stable visualizations\n // that react to the overall energy of a frequency range, rather than noisy, rapid fluctuations.\n const getAverage = (arr: number[]) =>\n arr.length > 0 ? arr.reduce((a, b) => a + b, 0) / arr.length : 0;\n\n const bass = getAverage(bassValues);\n const mid = getAverage(midValues);\n const treble = getAverage(trebleValues);\n\n // Convert frequency data to decibel-scaled amplitudes\n const amplitudes = frequencyData.map((value) => {\n // Convert to decibels (will be in the range `-Infinity` to `0`)\n const db = 20 * Math.log10(value);\n\n // Scale to fit between min and max\n const scaled = (db - minDb) / (maxDb - minDb);\n\n // Clamp to valid range [0, 1]\n return Math.max(0, Math.min(1, scaled));\n });\n\n return {\n frequencyData,\n amplitudes,\n bass,\n mid,\n treble,\n bassValues,\n midValues,\n trebleValues: trebleValues.reverse(),\n };\n } catch (error) {\n console.error('Error generating frequency data:', error);\n return {\n frequencyData: null,\n amplitudes: null,\n bass: null,\n mid: null,\n treble: null,\n };\n }\n }, [\n audioData,\n includeFrequencyData,\n adjustedFrame,\n fps,\n validatedNumberOfSamples,\n windowInSeconds,\n dataOffsetInSeconds,\n minDb,\n maxDb,\n ]);\n\n // Determine loading and error states\n const isLoading = !audioData;\n const error =\n audioData === null && !isLoading ? 'Failed to load audio data' : null;\n\n return {\n waveformData,\n frequencyData,\n amplitudes,\n audioData,\n isLoading,\n error,\n bass,\n bassValues,\n mid,\n midValues,\n treble,\n trebleValues,\n };\n};\n","import React from 'react';\nimport { Waveform, useWaveformContext } from '../Waveform';\nimport { BaseRenderableData } from '../../..';\n\n// Histogram waveform specific props\nexport interface WaveformHistogramDataProps {\n config: any; // Extends base WaveformConfig\n className?: string;\n style?: React.CSSProperties;\n\n // Histogram-specific styling\n barColor?: string;\n barWidth?: number;\n barSpacing?: number;\n barBorderRadius?: number;\n opacity?: number;\n\n // Layout\n multiplier?: number;\n horizontalSymmetry?: boolean; // Mirror left-right\n verticalMirror?: boolean; // Mirror up-down\n waveDirection?: 'right-to-left' | 'left-to-right';\n histogramStyle?: 'centered' | 'full-width';\n\n // Animation\n amplitude?: number;\n\n\n // Gradient\n gradientStartColor?: string;\n gradientEndColor?: string;\n gradientDirection?: 'vertical' | 'horizontal';\n gradientStyle?: 'mirrored' | 'normal';\n}\n\nexport interface WaveformHistogramProps extends BaseRenderableData {\n data: WaveformHistogramDataProps;\n}\n\n// Histogram waveform component\nexport const WaveformHistogram: React.FC<WaveformHistogramProps> = ({ data }) => {\n const {\n config,\n className = '',\n style = {},\n barColor = '#FF6B6B',\n barWidth = 4,\n barSpacing = 2,\n barBorderRadius = 2,\n opacity = 1,\n horizontalSymmetry = true,\n verticalMirror = false,\n histogramStyle = 'centered',\n amplitude = 1,\n multiplier = 1,\n gradientStartColor,\n gradientEndColor,\n gradientDirection = 'vertical',\n gradientStyle = 'normal',\n waveDirection = 'right-to-left',\n } = data;\n return (\n <Waveform config={config} className={className} style={style}>\n <WaveformHistogramContent\n barColor={barColor}\n barWidth={barWidth}\n barSpacing={barSpacing}\n barBorderRadius={barBorderRadius}\n opacity={opacity}\n horizontalSymmetry={horizontalSymmetry}\n verticalMirror={verticalMirror}\n histogramStyle={histogramStyle}\n amplitude={amplitude}\n gradientStartColor={gradientStartColor}\n gradientEndColor={gradientEndColor}\n gradientDirection={gradientDirection}\n multiplier={multiplier}\n gradientStyle={gradientStyle}\n waveDirection={waveDirection}\n />\n </Waveform>\n );\n};\n\n// Internal content component\nconst WaveformHistogramContent: React.FC<Omit<WaveformHistogramDataProps, 'config' | 'className' | 'style'>> = ({\n barColor,\n barWidth,\n barSpacing,\n barBorderRadius,\n opacity,\n horizontalSymmetry,\n verticalMirror,\n histogramStyle,\n amplitude,\n gradientStartColor,\n gradientEndColor,\n gradientDirection,\n multiplier,\n gradientStyle,\n waveDirection,\n}) => {\n const { waveformData, frequencyData, amplitudes, width, height } = useWaveformContext();\n\n // Use amplitudes if available, otherwise fall back to waveformData\n const dataToUse = amplitudes || waveformData;\n\n if (!dataToUse) {\n return (\n <div className=\"flex items-center justify-center w-full h-full text-gray-500\">\n Loading histogram...\n </div>\n );\n }\n\n let directedData = waveDirection === 'left-to-right' ? dataToUse.slice(1).reverse() : dataToUse;\n\n // Prepare frequencies for display\n const frequencies = horizontalSymmetry\n ? [...directedData, ...directedData.slice(1).reverse()]\n : Array(multiplier).fill(directedData).flat();\n\n\n // Render bars component\n const Bars = ({ growUpwards }: { growUpwards: boolean }) => {\n // Create gradient style\n const styleGradientProp = gradientStartColor && gradientEndColor\n ? {\n background: `linear-gradient(${gradientDirection === 'horizontal' ?\n gradientStyle === 'mirrored' ? 'to right' : growUpwards ? 'to right' : 'to left' :\n gradientStyle === 'normal' ? growUpwards ? 'to top' : 'to bottom' : 'to bottom'\n }, ${gradientStartColor}, ${gradientEndColor})`,\n }\n : { backgroundColor: barColor };\n\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'row',\n alignItems: growUpwards ? 'flex-end' : 'flex-start',\n height: '100%',\n width: '100%',\n ...(histogramStyle === 'centered' && {\n justifyContent: 'center',\n gap: `${barSpacing}px`,\n }),\n ...(histogramStyle === 'full-width' && {\n gap: `${barSpacing}px`,\n justifyContent: 'space-between',\n }),\n opacity: gradientStyle === 'mirrored' && !growUpwards ? 0.25 : 1,\n };\n\n return (\n <div style={containerStyle}>\n {frequencies.map((value, index) => (\n <div\n key={index}\n style={{\n ...(histogramStyle === 'full-width'\n ? { width: `${barWidth}px` }\n : { width: `${barWidth}px` }),\n ...styleGradientProp,\n height: `${Math.min(\n height / 2,\n Math.abs(value) * (height / 2) * (amplitude || 1)\n )}px`,\n borderRadius: growUpwards ? `${barBorderRadius}px ${barBorderRadius}px 0 0` : `0 0 ${barBorderRadius}px ${barBorderRadius}px`,\n opacity,\n }}\n />\n ))}\n </div>\n );\n };\n\n // Render based on mirroring options\n if (verticalMirror) {\n // Top half (upward bars)\n const topHalfStyle: React.CSSProperties = {\n position: 'absolute',\n bottom: `calc(100% - ${height / 2}px)`,\n height: `${height / 2}px`,\n width: '100%',\n left: 0,\n };\n\n // Bottom half (downward bars)\n const bottomHalfStyle: React.CSSProperties = {\n position: 'absolute',\n top: `${height / 2}px`,\n height: `${height / 2}px`,\n width: '100%',\n left: 0,\n };\n\n return (\n <>\n <div style={topHalfStyle}>\n <Bars growUpwards={true} />\n </div>\n <div style={bottomHalfStyle}>\n <Bars growUpwards={false} />\n </div>\n </>\n );\n }\n\n // Default: Non-mirrored histogram\n const containerStyle: React.CSSProperties = {\n width: '100%',\n position: 'absolute',\n top: `${height / 2 - (height / 4)}px`,\n height: `${height / 2}px`,\n left: 0,\n };\n\n return (\n <div style={containerStyle}>\n <Bars growUpwards={true} />\n </div>\n );\n}; ","import React from 'react';\nimport { Waveform, useWaveformContext } from '../Waveform';\nimport { BaseRenderableData } from '../../..';\n\n// Histogram waveform specific props\nexport interface WaveformHistogramRangedDataProps {\n config: any; // Extends base WaveformConfig\n className?: string;\n style?: React.CSSProperties;\n\n // Histogram-specific styling\n barColor?: string;\n barWidth?: number;\n barSpacing?: number;\n barBorderRadius?: number;\n opacity?: number;\n\n // Layout\n horizontalSymmetry?: boolean; // Mirror left-right\n verticalMirror?: boolean; // Mirror up-down\n histogramStyle?: 'centered' | 'full-width';\n waveDirection?: 'right-to-left' | 'left-to-right';\n\n // Animation\n amplitude?: number;\n\n // Frequency range visualization\n showFrequencyRanges?: boolean; // Show bass/mid/treble sections\n rangeDividerColor?: string; // Color for range dividers\n rangeLabels?: boolean; // Show frequency range labels\n\n // Ranged histogram colors (kept for backward compatibility)\n bassBarColor?: string;\n midBarColor?: string;\n trebleBarColor?: string;\n\n // Gradient\n gradientStartColor?: string;\n gradientEndColor?: string;\n gradientDirection?: 'vertical' | 'horizontal';\n gradientStyle?: 'mirrored' | 'normal';\n}\n\nexport interface WaveformHistogramRangedProps extends BaseRenderableData {\n data: WaveformHistogramRangedDataProps;\n}\n\n// Histogram waveform component\nexport const WaveformHistogramRanged: React.FC<WaveformHistogramRangedProps> = ({ data }) => {\n const {\n config,\n className = '',\n style = {},\n barColor = '#FF6B6B',\n barWidth = 4,\n barSpacing = 2,\n barBorderRadius = 2,\n opacity = 1,\n verticalMirror = false,\n histogramStyle = 'centered',\n amplitude = 1,\n showFrequencyRanges = true,\n rangeDividerColor = '#666',\n rangeLabels = false,\n bassBarColor = '#5DADE2',\n midBarColor = '#58D68D',\n trebleBarColor = '#F5B041',\n gradientStartColor,\n gradientEndColor,\n gradientDirection = 'vertical',\n gradientStyle = 'normal',\n horizontalSymmetry = false,\n waveDirection = 'right-to-left',\n } = data;\n return (\n <Waveform config={config} className={className} style={style}>\n <WaveformHistogramRangedContent\n barColor={barColor}\n barWidth={barWidth}\n barSpacing={barSpacing}\n barBorderRadius={barBorderRadius}\n opacity={opacity}\n verticalMirror={verticalMirror}\n histogramStyle={histogramStyle}\n amplitude={amplitude}\n showFrequencyRanges={showFrequencyRanges}\n rangeDividerColor={rangeDividerColor}\n rangeLabels={rangeLabels}\n bassBarColor={bassBarColor}\n midBarColor={midBarColor}\n trebleBarColor={trebleBarColor}\n gradientStartColor={gradientStartColor}\n gradientEndColor={gradientEndColor}\n gradientDirection={gradientDirection}\n gradientStyle={gradientStyle}\n horizontalSymmetry={horizontalSymmetry}\n waveDirection={waveDirection}\n />\n </Waveform>\n );\n};\n\n// Internal content component\nconst WaveformHistogramRangedContent: React.FC<Omit<WaveformHistogramRangedDataProps, 'config' | 'className' | 'style'>> = ({\n barColor,\n barWidth,\n barSpacing,\n barBorderRadius,\n opacity,\n verticalMirror,\n histogramStyle,\n amplitude,\n showFrequencyRanges,\n rangeDividerColor,\n rangeLabels,\n bassBarColor,\n midBarColor,\n trebleBarColor,\n gradientStartColor,\n gradientEndColor,\n gradientDirection,\n gradientStyle,\n horizontalSymmetry,\n waveDirection,\n}) => {\n const { amplitudes, bassValues, midValues, trebleValues, height } = useWaveformContext();\n\n if (!amplitudes || !bassValues || !midValues || !trebleValues) {\n return (\n <div className=\"flex items-center justify-center w-full h-full text-gray-500\">\n Loading frequency data...\n </div>\n );\n }\n\n // Define frequency ranges\n\n // Group frequencies by range\n const bassFrequencies = bassValues;\n const midFrequencies = midValues;\n const trebleFrequencies = trebleValues;\n\n\n // Create unified waveform data\n const allFrequencies = waveDirection === 'right-to-left' ? [bassFrequencies, midFrequencies, trebleFrequencies].flat() : [trebleFrequencies, midFrequencies, bassFrequencies].flat();\n\n\n // Prepare frequencies for display\n const unifiedWaveform = horizontalSymmetry\n ? [...allFrequencies.slice(1).reverse(), ...allFrequencies]\n : allFrequencies;\n\n\n // Render bars component\n const Bars = ({ growUpwards }: { growUpwards: boolean }) => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'row',\n alignItems: growUpwards ? 'flex-end' : 'flex-start',\n height: '100%',\n width: '100%',\n ...(histogramStyle === 'centered' && {\n justifyContent: 'center',\n gap: `${barSpacing}px`,\n }),\n ...(histogramStyle === 'full-width' && {\n gap: `${barSpacing}px`,\n justifyContent: 'space-between',\n }),\n opacity: gradientStyle === 'mirrored' && !growUpwards ? 0.25 : 1,\n };\n\n return (\n <div style={containerStyle}>\n {unifiedWaveform.map((value, index) => {\n const rangeName = index === 0 ? 'Bass' : index === 1 ? 'Mid' : 'Treble';\n\n // Create gradient style\n const styleGradientProp = gradientStartColor && gradientEndColor\n ? {\n background: `linear-gradient(${gradientDirection === 'horizontal' ?\n gradientStyle === 'mirrored' ? 'to right' : growUpwards ? 'to right' : 'to left' :\n gradientStyle === 'normal' ? growUpwards ? 'to top' : 'to bottom' : 'to bottom'\n }, ${gradientStartColor}, ${gradientEndColor})`,\n }\n : { backgroundColor: barColor };\n\n return (\n <div\n key={index}\n style={{\n width: `${(barWidth || 4)}px`, // Wider bars for the three ranges\n ...styleGradientProp,\n height: `${Math.min(\n height / 2,\n Math.abs(value) * (height / 2) * (amplitude || 1)\n )}px`,\n borderRadius: growUpwards ? `${barBorderRadius}px ${barBorderRadius}px 0 0` : `0 0 ${barBorderRadius}px ${barBorderRadius}px`,\n opacity,\n position: 'relative',\n }}\n title={`${rangeName}: ${(value * 100).toFixed(1)}%`}\n >\n {rangeLabels && (\n <div style={{\n position: 'absolute',\n bottom: growUpwards ? '-20px' : 'auto',\n top: growUpwards ? 'auto' : '-20px',\n left: '50%',\n transform: 'translateX(-50%)',\n fontSize: '10px',\n color: rangeDividerColor,\n whiteSpace: 'nowrap',\n }}>\n {rangeName}\n </div>\n )}\n </div>\n )\n })}\n </div>\n );\n };\n\n // Render based on mirroring options\n if (verticalMirror) {\n // Top half (upward bars)\n const topHalfStyle: React.CSSProperties = {\n position: 'absolute',\n bottom: `calc(100% - ${height / 2}px)`,\n height: `${height / 2}px`,\n width: '100%',\n left: 0,\n };\n\n // Bottom half (downward bars)\n const bottomHalfStyle: React.CSSProperties = {\n position: 'absolute',\n top: `${height / 2}px`,\n height: `${height / 2}px`,\n width: '100%',\n left: 0,\n };\n\n return (\n <>\n <div style={topHalfStyle}>\n <Bars growUpwards={true} />\n </div>\n <div style={bottomHalfStyle}>\n <Bars growUpwards={false} />\n </div>\n </>\n );\n }\n\n // Default: Non-mirrored histogram\n const containerStyle: React.CSSProperties = {\n width: '100%',\n position: 'absolute',\n top: `${height / 2 - (height / 4)}px`,\n height: `${height / 2}px`,\n left: 0,\n };\n\n return (\n <div style={containerStyle}>\n <Bars growUpwards={true} />\n </div>\n );\n}; ","import React, { useMemo } from 'react';\nimport { createSmoothSvgPath } from '@remotion/media-utils';\nimport { useCurrentFrame, useVideoConfig } from 'remotion';\nimport { Waveform, WaveformConfig, useWaveformContext } from '../Waveform';\nimport { BaseRenderableData } from '../../..';\n\n// Line waveform specific props\nexport interface WaveformLineDataProps {\n config: WaveformConfig & {\n useFrequencyData?: boolean; // Enable frequency data for better beat detection\n };\n className?: string;\n style?: React.CSSProperties;\n\n // Line-specific styling\n strokeColor?: string;\n strokeWidth?: number;\n strokeLinecap?: 'butt' | 'round' | 'square';\n strokeLinejoin?: 'miter' | 'round' | 'bevel';\n fill?: string;\n opacity?: number;\n\n // Animation\n centerLine?: boolean; // Show center line\n centerLineColor?: string;\n centerLineWidth?: number;\n\n // Beat synchronization\n beatSync?: boolean; // Enable beat synchronization\n bpm?: number; // Beats per minute for manual beat detection\n beatThreshold?: number; // Threshold for beat detection (0-1)\n beatAmplitudeMultiplier?: number; // Amplitude multiplier on beats\n beatAnimationDuration?: number; // Duration of beat animation in frames\n smoothAnimation?: boolean; // Enable smooth animation to reduce vibration\n\n // Wave spacing and layout\n waveSpacing?: number; // Spacing between wave segments (0-1)\n waveSegments?: number; // Number of wave segments to display\n waveOffset?: number; // Offset for wave positioning\n waveDirection?: 'horizontal' | 'vertical'; // Wave direction\n\n // Advanced animation\n amplitudeCurve?: 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'bounce';\n animationSpeed?: number; // Animation speed multiplier\n pulseOnBeat?: boolean; // Enable pulsing effect on beats\n pulseColor?: string; // Color for pulse effect\n pulseScale?: number; // Scale factor for pulse effect\n}\n\nexport interface WaveformLineProps extends BaseRenderableData {\n data: WaveformLineDataProps;\n}\n\n// Beat detection utility using frequency data\nconst detectBeat = (\n frequencyData: number[] | null,\n amplitudes: number[] | null,\n threshold: number = 0.7,\n bpm?: number,\n frame: number = 0,\n fps: number = 30\n): boolean => {\n if (!frequencyData || !amplitudes || frequencyData.length === 0) return false;\n\n // Manual beat detection based on BPM\n if (bpm) {\n const beatInterval = (60 / bpm) * fps; // Convert BPM to frames\n const beatFrame = Math.round(frame / beatInterval) * beatInterval;\n return Math.abs(frame - beatFrame) < 2; // 2 frame tolerance\n }\n\n // Frequency-based beat detection\n // Focus on bass frequencies (typically 60-250 Hz) for beat detection\n const bassFrequencies = amplitudes.slice(0, Math.floor(amplitudes.length * 0.15)); // First 15% are usually bass\n const midFrequencies = amplitudes.slice(Math.floor(amplitudes.length * 0.15), Math.floor(amplitudes.length * 0.4)); // 15-40% are mid\n\n // Calculate RMS energy in bass and mid frequencies\n const bassEnergy = Math.sqrt(bassFrequencies.reduce((sum, val) => sum + val * val, 0) / bassFrequencies.length);\n const midEnergy = Math.sqrt(midFrequencies.reduce((sum, val) => sum + val * val, 0) / midFrequencies.length);\n\n // Calculate peak detection for sudden changes\n const bassPeak = Math.max(...bassFrequencies);\n const midPeak = Math.max(...midFrequencies);\n\n // Combined energy with bass emphasis and peak detection\n const totalEnergy = (bassEnergy * 0.6) + (midEnergy * 0.2) + (bassPeak * 0.15) + (midPeak * 0.05);\n\n // Normalize energy to 0-1 range\n const normalizedEnergy = Math.min(totalEnergy, 1);\n\n return normalizedEnergy > threshold;\n};\n\n// Easing functions for amplitude curves\nconst easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - (1 - t) * (1 - t),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t;\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n }\n};\n\n// Line waveform component\nexport const WaveformLine: React.FC<WaveformLineProps> = ({ data }) => {\n const {\n config,\n className = '',\n style = {},\n strokeColor = '#FF6B6B',\n strokeWidth = 3,\n strokeLinecap = 'round',\n strokeLinejoin = 'round',\n fill = 'none',\n opacity = 1,\n centerLine = false,\n centerLineColor = '#666',\n centerLineWidth = 1,\n beatSync = false,\n bpm,\n beatThreshold = 0.7,\n beatAmplitudeMultiplier = 1.2,\n beatAnimationDuration = 30,\n smoothAnimation = true,\n waveSpacing = 0.1,\n waveSegments = 1,\n waveOffset = 0,\n waveDirection = 'horizontal',\n amplitudeCurve = 'ease-out',\n animationSpeed = 0.5,\n pulseOnBeat = false,\n pulseColor = '#FFD700',\n pulseScale = 1.2,\n } = data;\n\n return (\n <Waveform config={config} className={className} style={style}>\n <WaveformLineContent\n strokeColor={strokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap={strokeLinecap}\n strokeLinejoin={strokeLinejoin}\n fill={fill}\n opacity={opacity}\n centerLine={centerLine}\n centerLineColor={centerLineColor}\n centerLineWidth={centerLineWidth}\n beatSync={beatSync}\n bpm={bpm}\n beatThreshold={beatThreshold}\n beatAmplitudeMultiplier={beatAmplitudeMultiplier}\n beatAnimationDuration={beatAnimationDuration}\n smoothAnimation={smoothAnimation}\n waveSpacing={waveSpacing}\n waveSegments={waveSegments}\n waveOffset={waveOffset}\n waveDirection={waveDirection}\n amplitudeCurve={amplitudeCurve}\n animationSpeed={animationSpeed}\n pulseOnBeat={pulseOnBeat}\n pulseColor={pulseColor}\n pulseScale={pulseScale}\n />\n </Waveform>\n );\n};\n\n// Internal content component\nconst WaveformLineContent: React.FC<Omit<WaveformLineDataProps, 'config' | 'className' | 'style'>> = ({\n strokeColor,\n strokeWidth,\n strokeLinecap,\n strokeLinejoin,\n fill,\n opacity,\n centerLine,\n centerLineColor,\n centerLineWidth,\n beatSync,\n bpm,\n beatThreshold,\n beatAmplitudeMultiplier,\n beatAnimationDuration,\n smoothAnimation,\n waveSpacing,\n waveSegments,\n waveOffset,\n waveDirection,\n amplitudeCurve,\n animationSpeed,\n pulseOnBeat,\n pulseColor,\n pulseScale,\n}) => {\n const { waveformData, frequencyData, amplitudes, width, height, config, frame, fps } = useWaveformContext();\n const currentFrame = useCurrentFrame();\n const videoConfig = useVideoConfig();\n\n // Beat detection\n const isBeat = useMemo(() => {\n if (!beatSync || !frequencyData || !amplitudes) return false;\n return detectBeat(frequencyData, amplitudes, beatThreshold, bpm, currentFrame, fps);\n }, [beatSync, frequencyData, amplitudes, beatThreshold, bpm, currentFrame, fps]);\n\n // Beat animation progress with smoothing\n const beatProgress = useMemo(() => {\n if (!isBeat || !beatAnimationDuration) return 0;\n const beatStartFrame = Math.floor(currentFrame / beatAnimationDuration) * beatAnimationDuration;\n const progress = (currentFrame - beatStartFrame) / beatAnimationDuration;\n const clampedProgress = Math.max(0, Math.min(1, progress));\n\n // Apply smoothing to reduce vibration\n if (smoothAnimation) {\n // Use a smoother easing function to reduce sudden changes\n return 1 - Math.pow(1 - clampedProgress, 3); // Cubic ease-out\n }\n\n return clampedProgress;\n }, [isBeat, currentFrame, beatAnimationDuration, smoothAnimation]);\n\n // Calculate beat amplitude multiplier\n const currentBeatMultiplier = useMemo(() => {\n if (!beatSync || !isBeat || !beatAmplitudeMultiplier || !amplitudeCurve) return 1;\n const easing = easingFunctions[amplitudeCurve];\n const easedProgress = easing(beatProgress);\n return 1 + (beatAmplitudeMultiplier - 1) * (1 - easedProgress);\n }, [beatSync, isBeat, beatProgress, beatAmplitudeMultiplier, amplitudeCurve]);\n\n // Calculate smooth animation factor to reduce vibration\n const smoothFactor = useMemo(() => {\n if (!beatSync) {\n // When beat sync is disabled, use very smooth animation\n return 0.3; // Reduce animation intensity by 70%\n }\n return smoothAnimation ? 0.7 : 1; // Use smoothing factor when enabled\n }, [beatSync, smoothAnimation]);\n\n // Create SVG paths for the waveform segments\n const waveformPaths = useMemo(() => {\n if (!waveformData) return [];\n\n const paths = [];\n const segments = waveSegments || 1;\n const spacing = waveSpacing || 0.1;\n const offset = waveOffset || 0;\n const speed = animationSpeed || 1;\n const segmentWidth = width / segments;\n const segmentSpacing = segmentWidth * spacing;\n\n for (let i = 0; i < segments; i++) {\n const segmentStart = i * segmentWidth;\n const segmentEnd = (i + 1) * segmentWidth;\n const segmentDataWidth = segmentEnd - segmentStart;\n\n // Create points for this segment\n const points = waveformData.map((y, index) => {\n const progress = index / (waveformData.length - 1);\n const x = segmentStart + progress * segmentDataWidth + offset;\n\n // Apply beat synchronization and animation with smoothing\n let animatedAmplitude = y * (config.amplitude || 1) * currentBeatMultiplier * speed;\n\n // Apply smoothing to reduce vibration\n const baseAmplitude = y * (config.amplitude || 1) * speed;\n const beatAmplitude = animatedAmplitude - baseAmplitude;\n animatedAmplitude = baseAmplitude + (beatAmplitude * smoothFactor);\n\n const yPos = waveDirection === 'horizontal'\n ? (animatedAmplitude * height) / 2 + height / 2\n : (animatedAmplitude * width) / 2 + width / 2;\n\n return waveDirection === 'horizontal'\n ? { x, y: yPos }\n : { x: yPos, y: x };\n });\n\n const path = createSmoothSvgPath({ points });\n paths.push({ path, segmentIndex: i });\n }\n\n return paths;\n }, [waveformData, width, height, config.amplitude, currentBeatMultiplier, animationSpeed, waveSegments, waveSpacing, waveOffset, waveDirection, smoothFactor]);\n\n if (!waveformData) {\n return (\n <div className=\"flex items-center justify-center w-full h-full text-gray-500\">\n Loading waveform...\n </div>\n );\n }\n\n return (\n <svg\n width={width}\n height={height}\n className=\"absolute inset-0\"\n style={{ pointerEvents: 'none' }}\n >\n {/* Center line */}\n {centerLine && (\n <line\n x1={waveDirection === 'horizontal' ? 0 : width / 2}\n y1={waveDirection === 'horizontal' ? height / 2 : 0}\n x2={waveDirection === 'horizontal' ? width : width / 2}\n y2={waveDirection === 'horizontal' ? height / 2 : height}\n stroke={centerLineColor}\n strokeWidth={centerLineWidth}\n opacity={0.3}\n />\n )}\n\n {/* Waveform paths */}\n {waveformPaths.map(({ path, segmentIndex }) => (\n <g key={segmentIndex}>\n {/* Pulse effect on beat */}\n {pulseOnBeat && isBeat && (\n <path\n d={path}\n stroke={pulseColor}\n strokeWidth={(strokeWidth || 3) * (pulseScale || 1.2)}\n strokeLinecap={strokeLinecap}\n strokeLinejoin={strokeLinejoin}\n fill=\"none\"\n opacity={(opacity || 1) * (1 - beatProgress)}\n />\n )}\n\n {/* Main waveform path */}\n <path\n d={path}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap={strokeLinecap}\n strokeLinejoin={strokeLinejoin}\n fill={fill}\n opacity={opacity}\n />\n </g>\n ))}\n </svg>\n );\n}; ","import { WaveformLineDataProps } from './components/WaveformLine';\n\nexport const WaveformPresets = {\n stopgapLine: (props: WaveformLineDataProps) => {\n return {\n componentId: 'WaveformLine',\n type: 'atom',\n data: {\n strokeColor: '#58C4DC',\n strokeWidth: 8,\n strokeLinecap: 'round',\n opacity: 1,\n amplitudeCurve: 'ease-in-out',\n animationSpeed: 0.15,\n smoothAnimation: true,\n ...props,\n config: {\n numberOfSamples: 64, // Increased for better frequency resolution\n windowInSeconds: 1 / 30,\n amplitude: 4,\n height: 300,\n width: 1920 * 3,\n posterize: 4,\n ...props.config,\n },\n },\n };\n },\n};\n","import { registerComponent } from '../../core';\nimport { WaveformCircle } from './components/WaveformCircle';\nimport { WaveformHistogram } from './components/WaveformHistogram';\nimport { WaveformHistogramRanged } from './components/WaveformHistogramRanged';\nimport { WaveformLine } from './components/WaveformLine';\n\n// Main Waveform component and types\nexport { Waveform, useWaveformContext } from './Waveform';\nexport type {\n WaveformConfig,\n WaveformContextType,\n WaveformProps,\n} from './Waveform';\n\n// Hook\nexport { useWaveformData } from './hooks/useWaveformData';\nexport type {\n UseWaveformDataConfig,\n UseWaveformDataReturn,\n} from './hooks/useWaveformData';\n\n// Waveform style components\nexport { WaveformLine } from './components/WaveformLine';\nexport type {\n WaveformLineProps,\n WaveformLineDataProps,\n} from './components/WaveformLine';\n\nexport { WaveformHistogram } from './components/WaveformHistogram';\nexport type {\n WaveformHistogramProps,\n WaveformHistogramDataProps,\n} from './components/WaveformHistogram';\n\nexport { WaveformHistogramRanged } from './components/WaveformHistogramRanged';\nexport type {\n WaveformHistogramRangedProps,\n WaveformHistogramRangedDataProps,\n} from './components/WaveformHistogramRanged';\n\nexport { WaveformCircle } from './components/WaveformCircle';\nexport type {\n WaveformCircleProps,\n WaveformCircleDataProps,\n} from './components/WaveformCircle';\n\n// Default export\nexport { Waveform as default } from './Waveform';\n\nregisterComponent('WaveformLine', WaveformLine, 'atom', {\n displayName: 'WaveformLine',\n});\n\nregisterComponent('WaveformHistogram', WaveformHistogram, 'atom', {\n displayName: 'WaveformHistogram',\n});\n\nregisterComponent('WaveformHistogramRanged', WaveformHistogramRanged, 'atom', {\n displayName: 'WaveformHistogramRanged',\n});\n\nregisterComponent('WaveformCircle', WaveformCircle, 'atom', {\n displayName: 'WaveformCircle',\n});\n\nexport { WaveformPresets } from './utils';\n","import React from 'react';\nimport { AbsoluteFill, Composition as RemotionComposition, useVideoConfig, useCurrentFrame, CalculateMetadataFunction } from 'remotion';\nimport { BaseRenderableData, RenderableComponentData } from '../core/types';\nimport { ComponentRenderer } from './base/ComponentRenderer';\nimport { CompositionProvider } from '../core/context/CompositionContext';\nimport { Input, ALL_FORMATS, UrlSource, BlobSource, FilePathSource } from 'mediabunny';\nimport { calculateDuration, findMatchingComponents, setDurationsInContext } from '../core/context/timing';\nimport { parseMedia } from '@remotion/media-parser';\nimport { nodeReader } from '@remotion/media-parser/node';\n\n\ninterface CompositionProps extends BaseRenderableData {\n id: string;\n style?: React.CSSProperties;\n config: {\n width: number;\n height: number;\n fps: number;\n duration: number;\n fitDurationTo?: string | string[];\n }\n}\n\n\nexport type InputCompositionProps = {\n childrenData?: RenderableComponentData[],\n style?: React.CSSProperties,\n config?: {\n width?: number;\n height?: number;\n fps?: number;\n duration?: number;\n fitDurationTo?: string;\n }\n}\n\n\nexport const CompositionLayout = ({ childrenData, style, config }: InputCompositionProps) => {\n\n return (\n <CompositionProvider\n value={{\n root: childrenData,\n duration: config.duration,\n }}\n >\n <AbsoluteFill style={style}>\n {childrenData?.map((component) => (\n <ComponentRenderer\n key={component.id}\n {...component}\n />\n ))}\n </AbsoluteFill>\n </CompositionProvider>\n );\n};\n\nexport const calculateCompositionLayoutMetadata: CalculateMetadataFunction<InputCompositionProps> = async ({ props, defaultProps, abortSignal, isRendering }) => {\n\n let calculatedDuration: number | undefined = undefined;\n if (props.config?.fitDurationTo?.length > 0) {\n calculatedDuration = await calculateDuration(props.childrenData, {\n fitDurationTo: props.config.fitDurationTo,\n });\n }\n\n const duration = calculatedDuration ?? props.config.duration ?? defaultProps.config.duration;\n const fps = props.config.fps ?? defaultProps.config.fps;\n const durationInFrames = Math.round(duration * fps);\n\n const updatedProps = await setDurationsInContext(props);\n\n return {\n // Change the metadata\n durationInFrames: durationInFrames,\n // or transform some props\n props: updatedProps,\n // // or add per-composition default codec\n // defaultCodec: 'h264',\n // // or add per-composition default video image format\n // defaultVideoImageFormat: 'png',\n // // or add per-composition default pixel format\n // defaultPixelFormat: 'yuv420p',\n width: props.config?.width || defaultProps.config.width,\n height: props.config?.height || defaultProps.config.height,\n fps,\n duration,\n };\n};\n\nexport const Composition = ({\n id,\n childrenData,\n config,\n style\n}: CompositionProps) => {\n\n\n\n return <RemotionComposition\n id={id}\n component={CompositionLayout}\n durationInFrames={Math.round(config.duration * config.fps)}\n fps={config.fps}\n defaultProps={{ childrenData, style, config: config }}\n calculateMetadata={calculateCompositionLayoutMetadata}\n />\n}\n","import { ALL_FORMATS, Input, UrlSource } from 'mediabunny';\nimport { RenderableComponentData } from '../types';\nimport { InputCompositionProps } from '../../components/Composition';\n\nexport const findMatchingComponents = (\n childrenData: RenderableComponentData[],\n targetIds: string[]\n): RenderableComponentData[] => {\n const matches: RenderableComponentData[] = [];\n\n const searchRecursively = (components: RenderableComponentData[]) => {\n for (const component of components) {\n // Check if this component's ID matches any target ID\n if (targetIds.includes(component.id)) {\n matches.push(component);\n }\n\n // Recursively search in childrenData if it exists\n if (component.childrenData && component.childrenData.length > 0) {\n searchRecursively(component.childrenData);\n }\n }\n };\n\n searchRecursively(childrenData);\n return matches;\n};\n\nexport const calculateDuration = async (\n childrenData: RenderableComponentData[],\n config: {\n fitDurationTo: string[] | string;\n }\n): Promise<number | undefined> => {\n // Helper function to recursively find all matching component IDs\n\n let calculatedDuration: number | undefined = undefined;\n // Convert fitDurationTo to array if it's a string\n const targetIds = Array.isArray(config.fitDurationTo)\n ? config.fitDurationTo\n : [config.fitDurationTo];\n\n // Find all matching components\n const matchingComponents = findMatchingComponents(\n childrenData || [],\n targetIds\n );\n\n // Now you can use matchingComponents to calculate the duration\n // For example, you might want to find the maximum duration among matching components\n // or sum their durations, etc.\n\n if (matchingComponents.length === 1) {\n if (\n matchingComponents[0].type === 'atom' &&\n (matchingComponents[0].componentId === 'AudioAtom' ||\n matchingComponents[0].componentId === 'VideoAtom')\n ) {\n const src = matchingComponents[0].data.src;\n if (src.startsWith('http')) {\n const audioInput = new Input({\n formats: ALL_FORMATS,\n source: new UrlSource(src),\n });\n calculatedDuration = await audioInput.computeDuration();\n } else {\n // if (matchingComponents[0].componentId === \"VideoAtom\") {\n // const { slowDurationInSeconds, dimensions } = await parseMedia({\n // src: src,\n // fields: {\n // slowDurationInSeconds: true,\n // dimensions: true,\n // },\n // });\n // }\n // const audioInput = new Input({\n // formats: ALL_FORMATS,\n // source: new FilePathSource(\"/Users/subhakartikkireddy/Desktop/CODE/THEMOONDEVS/microfox-ai/mediamake/apps/mediamake/public/\" + src),\n // });\n // calculatedDuration = await audioInput.computeDuration();\n }\n }\n }\n return calculatedDuration;\n};\n\nexport const setDurationsInContext = async (root: InputCompositionProps) => {\n const iterateRecursively = async (\n components: RenderableComponentData[]\n ): Promise<RenderableComponentData[]> => {\n const updatedComponents: RenderableComponentData[] = [];\n\n for (const component of components) {\n let updatedComponent = { ...component };\n\n // Check if this component's ID matches any target ID\n if (component.context?.timing?.fitDurationTo?.length > 0) {\n const duration = await calculateDuration(component.childrenData, {\n fitDurationTo: component.context?.timing?.fitDurationTo,\n });\n\n // Create a new context object with updated timing\n updatedComponent = {\n ...component,\n context: {\n ...component.context,\n timing: {\n ...component.context.timing,\n duration: duration,\n },\n },\n };\n }\n\n // Recursively process childrenData if it exists\n if (component.childrenData && component.childrenData.length > 0) {\n updatedComponent.childrenData = await iterateRecursively(\n component.childrenData\n );\n }\n\n updatedComponents.push(updatedComponent);\n }\n\n return updatedComponents;\n };\n\n const updatedChildrenData = await iterateRecursively(root.childrenData);\n\n return {\n ...root,\n childrenData: updatedChildrenData,\n };\n};\n"],"mappings":"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","names":["Atom","config","config","React","import_react","import_react","React","React","config","import_react","import_remotion","React","import_react","import_remotion","React","import_react","import_remotion","React","import_react","import_remotion","React","config","import_react","import_remotion","Atom","React","config","import_react","import_react","fontFamily","loadFont","fontFamily","loadMultipleFonts","options","Atom","fontFamily","React","config","import_react","import_remotion","Atom","React","config","import_react","import_remotion","import_zod","Atom","React","config","import_react","Atom","fontFamily","error","React","config","config","Atom","import_react","React","config","import_react","import_remotion","React","config","import_react","import_remotion","React","config","import_react","import_remotion","parseDuration","parseDelay","getEasingFunction","React","config","config","import_react","import_react","import_react","import_react","import_react","import_remotion","import_react","import_remotion","import_zod","React","React","import_react","import_remotion","React","import_react","import_remotion","container","React","import_react","import_react","import_remotion","import_react","import_remotion","config","error","frequencyData","bassValues","midValues","trebleValues","bass","mid","treble","amplitudes","config","React","config","React","import_react","config","React","containerStyle","import_react","config","React","containerStyle","import_react","import_media_utils","import_remotion","config","React","import_react","import_remotion","config","config","React","RemotionComposition"]}