summaryrefslogtreecommitdiff
path: root/.cursor/rules/codebase-index.mdc
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-03-25 16:16:42 +0100
committerMaze Winther <mazewinther@gmail.com>2026-03-29 15:46:35 +0200
commit2c0fd4f86b011bbc8c0d86c61f96ade3ea249508 (patch)
tree660cbe303457d212d4c1d5398b02ed64945b7099 /.cursor/rules/codebase-index.mdc
parent5e2b829f8a682a619cd0de6681ddd9f542235ebf (diff)
downloadopencut-2c0fd4f86b011bbc8c0d86c61f96ade3ea249508.tar.gz
untrack .cursor/
Diffstat (limited to '.cursor/rules/codebase-index.mdc')
-rw-r--r--.cursor/rules/codebase-index.mdc2515
1 files changed, 0 insertions, 2515 deletions
diff --git a/.cursor/rules/codebase-index.mdc b/.cursor/rules/codebase-index.mdc
deleted file mode 100644
index 547d0566..00000000
--- a/.cursor/rules/codebase-index.mdc
+++ /dev/null
@@ -1,2515 +0,0 @@
----
-alwaysApply: false
----
-
-# video-editor-oss Codebase Index
-
-**This file provides an index of exported functions, types, interfaces, classes, and constants in your codebase.**
-
-Updated in real-time by Twiggy. Use this to discover existing utilities and avoid duplicating code.
-
-## How to Use
-
-When implementing new features:
-
-1. Check if similar functionality already exists
-2. Reuse existing types and utilities
-3. Understand the API surface of your codebase
-
-```typescript
-## apps/web/src/constants
-
-editor-constants.ts
- export const PANEL_CONFIG
-
-export-constants.ts
- export const DEFAULT_EXPORT_OPTIONS
- export const EXPORT_MIME_TYPES
-
-font-constants.ts
- export const DEFAULT_FONT
- export const SYSTEM_FONTS
-
-language-constants.ts
- export const LANGUAGES
-
-project-constants.ts
- export const DEFAULT_CANVAS_PRESETS: TCanvasSize[]
- export const FPS_PRESETS
- export const BLUR_INTENSITY_PRESETS: { label: string; value: number }[]
- export const DEFAULT_CANVAS_SIZE: TCanvasSize
- export const DEFAULT_FPS
- export const DEFAULT_BLUR_INTENSITY
- export const DEFAULT_COLOR
-
-site-constants.ts
- export const SITE_URL
- export const SITE_INFO
- export type ExternalTool = {
- name: string;
- description: string;
- url: string;
- icon: React.ElementType;
- }
- export const EXTERNAL_TOOLS: ExternalTool[]
- export const DEFAULT_LOGO_URL
- export const SOCIAL_LINKS
- export type Sponsor = {
- name: string;
- url: string;
- logo: string;
- description: string;
- }
- export const SPONSORS: Sponsor[]
-
-sticker-constants.ts
- export const STICKER_CATEGORIES
-
-text-constants.ts
- export const MIN_FONT_SIZE
- export const MAX_FONT_SIZE
- export const FONT_SIZE_SCALE_REFERENCE
- export const DEFAULT_LETTER_SPACING
- export const DEFAULT_LINE_HEIGHT
- export const DEFAULT_TEXT_ELEMENT: Omit<TextElement, "id">
-
-timeline-constants.tsx
- export const DEFAULT_TRANSFORM: Transform
- export const DEFAULT_OPACITY
- export const DEFAULT_BLEND_MODE: BlendMode
- export const DEFAULT_BOOKMARK_COLOR
- export const TRACK_COLORS: Record<TrackType, { background: string }>
- export const TRACK_HEIGHTS: Record<TrackType, number>
- export const TRACK_GAP
- export const DRAG_THRESHOLD_PX
- export const TIMELINE_CONSTANTS
- export const DEFAULT_TIMELINE_VIEW_STATE: TTimelineViewState
- export const TRACK_ICONS: Record<TrackType, React.ReactNode>
-
-transcription-constants.ts
- export const TRANSCRIPTION_LANGUAGES
- export const TRANSCRIPTION_MODELS: TranscriptionModel[]
- export const DEFAULT_TRANSCRIPTION_MODEL: TranscriptionModelId
- export const DEFAULT_CHUNK_LENGTH_SECONDS
- export const DEFAULT_STRIDE_SECONDS
- export const DEFAULT_WORDS_PER_CAPTION
- export const MIN_CAPTION_DURATION_SECONDS
-
-## apps/web/src/core
-
-index.ts
- export class EditorCore {
- instance: EditorCore | null
- command: CommandManager
- playback: PlaybackManager
- timeline: TimelineManager
- scenes: ScenesManager
- project: ProjectManager
- media: MediaManager
- renderer: RendererManager
- save: SaveManager
- audio: AudioManager
- selection: SelectionManager
- static getInstance(): EditorCore
- static reset(): void
- }
-
-## apps/web/src/hooks
-
-use-container-size.ts
- export function useContainerSize({
- containerRef,
- }: {
- containerRef: React.RefObject<HTMLElement | null>;
- })
-
-use-editor.ts
- export function useEditor(): EditorCore
-
-use-file-upload.ts
- export function useFileUpload({
- accept,
- multiple,
- onFilesSelected,
- }: UseFileUploadOptions = {})
-
-use-focus-lock.ts
- export function useFocusLock({
- isActive,
- onDismiss,
- cursor = "default",
- allowSelector,
- }: {
- isActive: boolean;
- onDismiss: () => void;
- cursor?: FocusLockCursor;
- allowSelector?: string;
- })
-
-use-fullscreen.ts
- export function useFullscreen({
- containerRef,
- }: {
- containerRef: React.RefObject<HTMLElement | null>;
- })
-
-use-infinite-scroll.ts
- export function useInfiniteScroll({
- onLoadMore,
- hasMore,
- isLoading,
- threshold = 200,
- enabled = true,
- }: UseInfiniteScrollOptions)
-
-use-keybindings.ts
- export function useKeybindingsListener()
- export function useKeybindingDisabler()
-
-use-keyboard-shortcuts-help.ts
- export interface KeyboardShortcut {
- id: string
- keys: string[]
- description: string
- category: string
- action: TAction
- icon?: React.ReactNode
- }
- export function useKeyboardShortcutsHelp()
-
-use-mobile.ts
- export function useIsMobile()
-
-use-paste-media.ts
- export function usePasteMedia()
-
-use-preview-interaction.ts
- export function usePreviewInteraction({
- canvasRef,
- }: {
- canvasRef: React.RefObject<HTMLCanvasElement | null>;
- })
-
-use-raf-loop.ts
- export function useRafLoop(callback: ({ time }: { time: number }) => void)
-
-use-reveal-item.ts
- export function useRevealItem(
- highlightId: string | null,
- onClearHighlight: () => void,
- highlightDuration = 1000,
- )
-
-use-shift-key.ts
- export function useShiftKey(): RefObject<boolean>
-
-use-sound-search.ts
- export function useSoundSearch({
- query,
- commercialOnly,
- }: {
- query: string;
- commercialOnly: boolean;
- })
-
-use-transform-handles.ts
- export function useTransformHandles({
-
- canvasRef,
-
- }: {
-
- canvasRef: React.RefObject<HTMLCanvasElement | null>;
-
- })
-
-## apps/web/src/hooks/actions
-
-use-action-handler.ts
- export function useActionHandler(
- action: A,
- handler: TActionFunc<A>,
- isActive: TActionHandlerOptions,
- )
-
-use-editor-actions.ts
- export function useEditorActions()
-
-## apps/web/src/hooks/storage
-
-use-local-storage.ts
- export function useLocalStorage({
- key,
- defaultValue,
- }: {
- key: string;
- defaultValue: T;
- }): [
- T,
- ({ value }: { value: T | ((previousValue: T) => T) }) => void,
- boolean,
- ]
-
-## apps/web/src/hooks/timeline
-
-use-bookmark-drag.ts
- export interface BookmarkDragState {
- isDragging: boolean
- bookmarkTime: number | null
- currentTime: number
- }
- export function useBookmarkDrag({
-
- zoomLevel,
-
- scrollRef,
-
- snappingEnabled,
-
- onSnapPointChange,
-
- }: UseBookmarkDragProps)
-
-use-edge-auto-scroll.ts
- export function useEdgeAutoScroll({
- isActive,
- getMouseClientX,
- rulerScrollRef,
- tracksScrollRef,
- contentWidth,
- edgeThreshold = 100,
- maxScrollSpeed = 15,
- }: UseEdgeAutoScrollParams): void
-
-use-scroll-position.ts
- export function useScrollPosition({
- scrollRef,
- }: {
- scrollRef: React.RefObject<HTMLElement | null>;
- }): UseScrollPositionReturn
-
-use-scroll-sync.ts
- export function useScrollSync({
- tracksScrollRef,
- rulerScrollRef,
- trackLabelsScrollRef,
- bookmarksScrollRef,
- }: UseScrollSyncProps)
-
-use-selection-box.ts
- export function useSelectionBox({
- containerRef,
- onSelectionComplete,
- isEnabled = true,
- tracksScrollRef,
- zoomLevel,
- }: UseSelectionBoxProps)
-
-use-snap-indicator-position.ts
- export function useSnapIndicatorPosition({
- snapPoint,
- zoomLevel,
- tracks,
- timelineRef,
- trackLabelsRef,
- tracksScrollRef,
- }: UseSnapIndicatorPositionParams): SnapIndicatorPosition
-
-use-timeline-drag-drop.ts
- export function useTimelineDragDrop({
- containerRef,
- headerRef,
- zoomLevel,
- }: UseTimelineDragDropProps)
-
-use-timeline-playhead.ts
- export function useTimelinePlayhead({
- zoomLevel,
- rulerRef,
- rulerScrollRef,
- tracksScrollRef,
- playheadRef,
- }: UseTimelinePlayheadProps)
-
-use-timeline-seek.ts
- export function useTimelineSeek({
- playheadRef,
- trackLabelsRef,
- rulerScrollRef,
- tracksScrollRef,
- zoomLevel,
- duration,
- isSelecting,
- clearSelectedElements,
- seek,
- }: UseTimelineSeekProps)
-
-use-timeline-snapping.ts
- export interface SnapPoint {
- time: number
- type: "element-start" | "element-end" | "playhead" | "bookmark"
- elementId?: string
- trackId?: string
- }
- export interface SnapResult {
- snappedTime: number
- snapPoint: SnapPoint | null
- snapDistance: number
- }
- export interface UseTimelineSnappingOptions {
- snapThreshold?: number
- enableElementSnapping?: boolean
- enablePlayheadSnapping?: boolean
- enableBookmarkSnapping?: boolean
- }
- export function useTimelineSnapping({
- snapThreshold = 10,
- enableElementSnapping = true,
- enablePlayheadSnapping = true,
- enableBookmarkSnapping = true,
- }: UseTimelineSnappingOptions = {})
-
-use-timeline-zoom.ts
- export function useTimelineZoom({
- containerRef,
- minZoom = TIMELINE_CONSTANTS.ZOOM_MIN,
- initialZoom,
- initialScrollLeft,
- initialPlayheadTime,
- tracksScrollRef,
- rulerScrollRef,
- }: UseTimelineZoomProps): UseTimelineZoomReturn
-
-## apps/web/src/hooks/timeline/element
-
-use-element-interaction.ts
- export function useElementInteraction({
- zoomLevel,
- timelineRef,
- tracksContainerRef,
- tracksScrollRef,
- headerRef,
- snappingEnabled,
- onSnapPointChange,
- }: UseElementInteractionProps)
-
-use-element-resize.ts
- export interface ResizeState {
- elementId: string
- side: "left" | "right"
- startX: number
- initialTrimStart: number
- initialTrimEnd: number
- initialStartTime: number
- initialDuration: number
- }
- export function useTimelineElementResize({
- element,
- track,
- zoomLevel,
- onSnapPointChange,
- onResizeStateChange,
- }: UseTimelineElementResizeProps)
-
-use-element-selection.ts
- export function useElementSelection()
-
-## apps/web/src/lib
-
-drag-data.ts
- export function setDragData({
- dataTransfer,
- dragData,
- }: {
- dataTransfer: DataTransfer;
- dragData: TimelineDragData;
- }): void
- export function getDragData({
- dataTransfer,
- }: {
- dataTransfer: DataTransfer;
- }): TimelineDragData | null
- export function hasDragData({
- dataTransfer,
- }: {
- dataTransfer: DataTransfer;
- }): boolean
- export function clearDragData(): void
-
-export.ts
- export function getExportMimeType({
- format,
- }: {
- format: ExportFormat;
- }): string
- export function getExportFileExtension({
- format,
- }: {
- format: ExportFormat;
- }): string
-
-iconify-api.ts
- export const ICONIFY_HOSTS
- export interface IconSet {
- prefix: string
- name: string
- total: number
- author?: {
- name: string;
- url?: string;
- }
- license?: {
- title: string;
- spdx?: string;
- url?: string;
- }
- samples?: string[]
- category?: string
- palette?: boolean
- }
- export interface IconSearchResult {
- icons: string[]
- total: number
- limit: number
- start: number
- collections: Record<string, IconSet>
- }
- export interface CollectionInfo {
- prefix: string
- total: number
- title?: string
- uncategorized?: string[]
- categories?: Record<string, string[]>
- hidden?: string[]
- aliases?: Record<string, string>
- }
- export function getCollections(
- category?: string,
- ): Promise<Record<string, IconSet>>
- export function getCollection(
- prefix: string,
- ): Promise<CollectionInfo | null>
- export function searchIcons(
- query: string,
- limit: number = 64,
- prefixes?: string[],
- category?: string,
- ): Promise<IconSearchResult>
- export function buildIconSvgUrl(
- host: string,
- iconName: string,
- params?: {
- color?: string;
- width?: number;
- height?: number;
- flip?: "horizontal" | "vertical" | "horizontal,vertical";
- rotate?: number | string;
- },
- ): string
- export function getIconSvgUrl(
- iconName: string,
- params?: Parameters<typeof buildIconSvgUrl>[2],
- ): string
- export function downloadSvgAsText(
- iconName: string,
- params?: Parameters<typeof getIconSvgUrl>[1],
- ): Promise<string>
- export function svgToFile(svgText: string, fileName: string): File
- export const POPULAR_COLLECTIONS
- export function getCategoriesFromCollections(
- collections: Record<string, IconSet>,
- ): string[]
-
-rate-limit.ts
- export const baseRateLimit
- export function checkRateLimit({ request }: { request: Request })
-
-scenes.ts
- export function getMainScene({ scenes }: { scenes: TScene[] }): TScene | null
- export function ensureMainScene({ scenes }: { scenes: TScene[] }): TScene[]
- export function buildDefaultScene({
- name,
- isMain,
- }: {
- name: string;
- isMain: boolean;
- }): TScene
- export function canDeleteScene({ scene }: { scene: TScene }): {
- canDelete: boolean;
- reason?: string;
- }
- export function getFallbackSceneAfterDelete({
- scenes,
- deletedSceneId,
- currentSceneId,
- }: {
- scenes: TScene[];
- deletedSceneId: string;
- currentSceneId: string | null;
- }): TScene | null
- export function findCurrentScene({
- scenes,
- currentSceneId,
- }: {
- scenes: TScene[];
- currentSceneId: string;
- }): TScene | null
- export function getProjectDurationFromScenes({
- scenes,
- }: {
- scenes: TScene[];
- }): number
- export function updateSceneInArray({
- scenes,
- sceneId,
- updates,
- }: {
- scenes: TScene[];
- sceneId: string;
- updates: Partial<TScene>;
- }): TScene[]
-
-time.ts
- export function roundToFrame({
- time,
- fps,
- }: {
- time: number;
- fps: number;
- }): number
- export function formatTimeCode({
- timeInSeconds,
- format = "HH:MM:SS:CS",
- fps,
- }: {
- timeInSeconds: number;
- format?: TTimeCode;
- fps?: number;
- }): string
- export function parseTimeCode({
- timeCode,
- format = "HH:MM:SS:CS",
- fps,
- }: {
- timeCode: string;
- format?: TTimeCode;
- fps: number;
- }): number | null
- export function guessTimeCodeFormat({
- timeCode,
- }: {
- timeCode: string;
- }): TTimeCode | null
- export function timeToFrame({
- time,
- fps,
- }: {
- time: number;
- fps: number;
- }): number
- export function frameToTime({
- frame,
- fps,
- }: {
- frame: number;
- fps: number;
- }): number
- export function snapTimeToFrame({
- time,
- fps,
- }: {
- time: number;
- fps: number;
- }): number
- export function getSnappedSeekTime({
- rawTime,
- duration,
- fps,
- }: {
- rawTime: number;
- duration: number;
- fps: number;
- }): number
- export function getLastFrameTime({
- duration,
- fps,
- }: {
- duration: number;
- fps: number;
- }): number
-
-## apps/web/src/lib/actions
-
-definitions.ts
- export type TActionCategory = | "playback"
- | "navigation"
- | "editing"
- | "selection"
- | "history"
- | "timeline"
- | "controls"
- export interface TActionDefinition {
- description: string
- category: TActionCategory
- defaultShortcuts?: ShortcutKey[]
- args?: Record<string, unknown>
- }
- export const ACTIONS
- export type TAction = keyof typeof ACTIONS
- export function getActionDefinition(action: TAction): TActionDefinition
- export function getDefaultShortcuts(): Record<ShortcutKey, TAction>
-
-registry.ts
- export function bindAction(
- action: A,
- handler: TActionFunc<A>,
- )
- export function unbindAction(
- action: A,
- handler: TActionFunc<A>,
- )
- export const invokeAction = (
- action: A,
- args?: TArgOfAction<A>,
- trigger?: TInvocationTrigger,
- ) => ...
-
-types.ts
- export type TActionArgsMap = {
- "seek-forward": { seconds: number } | undefined;
- "seek-backward": { seconds: number } | undef...
- export type TActionWithArgs = keyof TActionArgsMap
- export type TActionWithOptionalArgs = | TActionWithNoArgs
- | TKeysWithValueUndefined<TActionArgsMap>
- export type TActionWithNoArgs = Exclude<TAction, TActionWithArgs>
- export type TArgOfAction<A extends TAction> = A extends TActionWithArgs
- ? TActionArgsMap[A]
- : undefined
- export type TActionFunc<A extends TAction> = A extends TActionWithArgs
- ? (arg: TArgOfAction<A>, trigger?: TInvocationTrigger) => void
- : (_?:...
- export type TInvocationTrigger = "keypress" | "mouseclick"
- export type TBoundActionList = {
- [A in TAction]?: Array<TActionFunc<A>>;
- }
- export type TActionHandlerOptions = | MutableRefObject<boolean>
- | boolean
- | undefined
-
-## apps/web/src/lib/auth
-
-server.ts
- export const auth
- export type Auth = typeof auth
-
-## apps/web/src/lib/blog
-
-query.ts
- export function getPosts()
- export function getTags()
- export function getSinglePost({ slug }: { slug: string })
- export function getCategories()
- export function getAuthors()
- export function processHtmlContent({
- html,
- }: {
- html: string;
- }): Promise<string>
-
-## apps/web/src/lib/db
-
-index.ts
- export const db
-
-schema.ts
- export const users
- export const sessions
- export const accounts
- export const verifications
-
-## apps/web/src/lib/fonts
-
-google-fonts.ts
- export function getCachedFontAtlas(): FontAtlas | null
- export function clearFontAtlasCache(): void
- export function prefetchFontAtlas(): Promise<FontAtlas | null>
- export function loadFullFont({
- family,
- weights = [400, 700],
- }: {
- family: string;
- weights?: number[];
- }): Promise<void>
- export function loadFonts({
- families,
- }: {
- families: string[];
- }): Promise<void>
-
-## apps/web/src/lib/gradients
-
-canvas.ts
- export function drawCssBackground({
- ctx,
- width,
- height,
- css,
- }: {
- ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;
- width: number;
- height: number;
- css: string;
- }): void
-
-parser.ts
- export type GradientOrientation = LinearOrientation | Array<RadialOrientation>
- export type Color = | { type: "hex"; value: string }
- | { type: "literal"; value: string }
- | { type: "rgb"; value: A...
- export type ColorStop = Color & { length?: Distance }
- export type GradientAst = {
- type: GradientType;
- orientation: GradientOrientation | undefined;
- colorStops: Array<ColorSto...
- export const parseGradient = ({
- code,
- }: {
- code: string;
- }): Array<GradientAst> => ...
- export const GradientParser
-
-## apps/web/src/lib/media
-
-audio.ts
- export type CollectedAudioElement = Omit<
- AudioElement,
- "type" | "mediaId" | "volume" | "id" | "name" | "sourceType" | "sourceUrl"
- ...
- export function createAudioContext(): AudioContext
- export interface DecodedAudio {
- samples: Float32Array
- sampleRate: number
- }
- export function decodeAudioToFloat32({
- audioBlob,
- }: {
- audioBlob: Blob;
- }): Promise<DecodedAudio>
- export function collectAudioElements({
- tracks,
- mediaAssets,
- audioContext,
- }: {
- tracks: TimelineTrack[];
- mediaAssets: MediaAsset[];
- audioContext: AudioContext;
- }): Promise<CollectedAudioElement[]>
- export interface AudioClipSource {
- id: string
- sourceKey: string
- file: File
- startTime: number
- duration: number
- trimStart: number
- trimEnd: number
- muted: boolean
- }
- export function collectAudioMixSources({
- tracks,
- mediaAssets,
- }: {
- tracks: TimelineTrack[];
- mediaAssets: MediaAsset[];
- }): Promise<AudioMixSource[]>
- export function collectAudioClips({
- tracks,
- mediaAssets,
- }: {
- tracks: TimelineTrack[];
- mediaAssets: MediaAsset[];
- }): Promise<AudioClipSource[]>
- export function createTimelineAudioBuffer({
- tracks,
- mediaAssets,
- duration,
- sampleRate = 44100,
- audioContext,
- }: {
- tracks: TimelineTrack[];
- mediaAssets: MediaAsset[];
- duration: number;
- sampleRate?: number;
- audioContext?: AudioContext;
- }): Promise<AudioBuffer | null>
-
-media-utils.ts
- export const SUPPORTS_AUDIO: readonly MediaType[]
- export function mediaSupportsAudio({
- media,
- }: {
- media: MediaAsset | null | undefined;
- }): boolean
- export const getMediaTypeFromFile = ({
- file,
- }: {
- file: File;
- }): MediaType | null => ...
-
-mediabunny.ts
- export function getVideoInfo({
- videoFile,
- }: {
- videoFile: File;
- }): Promise<{
- duration: number;
- width: number;
- height: number;
- fps: number;
- }>
- export const extractTimelineAudio = ({
- tracks,
- mediaAssets,
- totalDuration,
- onProgress,
- }: {
- tracks: TimelineTrack[];
- mediaAssets: MediaAsset[];
- totalDuration: number;
- onProgress?: (progress: number) => void;
- }): Promise<Blob> => ...
-
-processing.ts
- export interface ProcessedMediaAsset extends Omit<MediaAsset, "id">
- export function generateThumbnail({
- videoFile,
- timeInSeconds,
- }: {
- videoFile: File;
- timeInSeconds: number;
- }): Promise<string>
- export function generateImageThumbnail({
- imageFile,
- }: {
- imageFile: File;
- }): Promise<string>
- export function processMediaAssets({
- files,
- onProgress,
- }: {
- files: FileList | File[];
- onProgress?: ({ progress }: { progress: number }) => void;
- }): Promise<ProcessedMediaAsset[]>
-
-## apps/web/src/lib/preview
-
-element-bounds.ts
- export interface ElementBounds {
- cx: number
- cy: number
- width: number
- height: number
- rotation: number
- }
- export interface ElementWithBounds {
- trackId: string
- elementId: string
- element: TimelineElement
- bounds: ElementBounds
- }
- export function getElementBounds({
- element,
- canvasSize,
- mediaAsset,
- }: {
- element: TimelineElement;
- canvasSize: { width: number; height: number };
- mediaAsset?: MediaAsset | null;
- }): ElementBounds | null
- export function getVisibleElementsWithBounds({
- tracks,
- currentTime,
- canvasSize,
- mediaAssets,
- }: {
- tracks: TimelineTrack[];
- currentTime: number;
- canvasSize: { width: number; height: number };
- mediaAssets: MediaAsset[];
- }): ElementWithBounds[]
-
-hit-test.ts
- export function hitTest({
-
- canvasX,
-
- canvasY,
-
- elementsWithBounds,
-
- }: {
-
- canvasX: number;
-
- canvasY: number;
-
- elementsWithBounds: ElementWithBounds[];
-
- }): ElementWithBounds | null
-
-preview-coords.ts
- export function screenToCanvas({
-
- clientX,
-
- clientY,
-
- canvas,
-
- }: {
-
- clientX: number;
-
- clientY: number;
-
- canvas: HTMLCanvasElement;
-
- }): { x: number; y: number }
- export function canvasToOverlay({
-
- canvasX,
-
- canvasY,
-
- canvasRect,
-
- containerRect,
-
- canvasSize,
-
- }: {
-
- canvasX: number;
-
- canvasY: number;
-
- canvasRect: DOMRect;
-
- containerRect: DOMRect;
-
- canvasSize: { width: number; height: number };
-
- }): { x: number; y: number }
- export function positionToOverlay({
-
- positionX,
-
- positionY,
-
- canvasRect,
-
- containerRect,
-
- canvasSize,
-
- }: {
-
- positionX: number;
-
- positionY: number;
-
- canvasRect: DOMRect;
-
- containerRect: DOMRect;
-
- canvasSize: { width: number; height: number };
-
- }): { x: number; y: number }
- export function getDisplayScale({
-
- canvasRect,
-
- canvasSize,
-
- }: {
-
- canvasRect: DOMRect;
-
- canvasSize: { width: number; height: number };
-
- }): { x: number; y: number }
-
-preview-snap.ts
- export interface SnapLine {
- type: "horizontal" | "vertical"
- position: number
- }
- export const MIN_SCALE
- export interface SnapResult {
- snappedPosition: { x: number; y: number }
- activeLines: SnapLine[]
- }
- export function snapPosition({
-
- proposedPosition,
-
- canvasSize,
-
- elementSize,
-
- }: {
-
- proposedPosition: { x: number; y: number };
-
- canvasSize: { width: number; height: number };
-
- elementSize: { width: number; height: number };
-
- }): SnapResult
- export interface ScaleSnapResult {
- snappedScale: number
- activeLines: SnapLine[]
- }
- export function snapScale({
-
- proposedScale,
-
- position,
-
- baseWidth,
-
- baseHeight,
-
- canvasSize,
-
- }: {
-
- proposedScale: number;
-
- position: { x: number; y: number };
-
- baseWidth: number;
-
- baseHeight: number;
-
- canvasSize: { width: number; height: number };
-
- }): ScaleSnapResult
- export interface RotationSnapResult {
- snappedRotation: number
- isSnapped: boolean
- }
- export function snapRotation({
-
- proposedRotation,
-
- }: {
-
- proposedRotation: number;
-
- }): RotationSnapResult
-
-## apps/web/src/lib/stickers
-
-index.ts
- export function searchStickers({
- query,
- category,
- limit = DEFAULT_SEARCH_LIMIT,
- }: {
- query: string;
- category: StickerCategory;
- limit?: number;
- }): Promise<StickerSearchResult>
- export function browseStickers({
- category,
- page = 1,
- limit = DEFAULT_SEARCH_LIMIT,
- }: {
- category: StickerCategory;
- page?: number;
- limit?: number;
- }): Promise<StickerSearchResult>
-
-registry.ts
- export function registerProvider({
- provider,
- }: {
- provider: StickerProvider;
- }): void
- export function hasProvider({ providerId }: { providerId: string }): boolean
- export function getProvider({
- providerId,
- }: {
- providerId: string;
- }): StickerProvider
- export function getAllProviders(): StickerProvider[]
-
-resolver.ts
- export function resolveStickerId({
- stickerId,
- options,
- }: {
- stickerId: string;
- options?: StickerResolveOptions;
- }): string
-
-sticker-id.ts
- export function parseStickerId({ stickerId }: { stickerId: string }): {
- providerId: string;
- providerValue: string;
- }
- export function buildStickerId({
- providerId,
- providerValue,
- }: {
- providerId: string;
- providerValue: string;
- }): string
-
-## apps/web/src/lib/stickers/providers
-
-emoji.ts
- export const emojiProvider: StickerProvider
-
-flags.ts
- export const flagsProvider: StickerProvider
-
-icons.ts
- export const iconsProvider: StickerProvider
-
-index.ts
- export function registerDefaultStickerProviders({
- providersToRegister = defaultProviders,
- }: {
- providersToRegister?: StickerProvider[];
- } = {}): void
-
-shapes.ts
- export const shapesProvider: StickerProvider
-
-## apps/web/src/lib/timeline
-
-bookmarks.ts
- export const BOOKMARK_TIME_EPSILON
- export function findBookmarkIndex({
- bookmarks,
- frameTime,
- }: {
- bookmarks: Bookmark[];
- frameTime: number;
- }): number
- export function isBookmarkAtTime({
- bookmarks,
- frameTime,
- }: {
- bookmarks: Bookmark[];
- frameTime: number;
- }): boolean
- export function toggleBookmarkInArray({
- bookmarks,
- frameTime,
- }: {
- bookmarks: Bookmark[];
- frameTime: number;
- }): Bookmark[]
- export function removeBookmarkFromArray({
- bookmarks,
- frameTime,
- }: {
- bookmarks: Bookmark[];
- frameTime: number;
- }): Bookmark[]
- export function updateBookmarkInArray({
- bookmarks,
- frameTime,
- updates,
- }: {
- bookmarks: Bookmark[];
- frameTime: number;
- updates: Partial<Omit<Bookmark, "time">>;
- }): Bookmark[]
- export function moveBookmarkInArray({
- bookmarks,
- fromTime,
- toTime,
- }: {
- bookmarks: Bookmark[];
- fromTime: number;
- toTime: number;
- }): Bookmark[]
- export function getFrameTime({
- time,
- fps,
- }: {
- time: number;
- fps: number;
- }): number
- export function getBookmarkAtTime({
- bookmarks,
- frameTime,
- }: {
- bookmarks: Bookmark[];
- frameTime: number;
- }): Bookmark | null
- export function getBookmarksActiveAtTime({
- bookmarks,
- time,
- }: {
- bookmarks: Bookmark[];
- time: number;
- }): Bookmark[]
-
-drag-utils.ts
- export function getMouseTimeFromClientX({
-
- clientX,
-
- containerRect,
-
- zoomLevel,
-
- scrollLeft,
-
- }: {
-
- clientX: number;
-
- containerRect: DOMRect;
-
- zoomLevel: number;
-
- scrollLeft: number;
-
- }): number
-
-drop-utils.ts
- export function computeDropTarget({
- elementType,
- mouseX,
- mouseY,
- tracks,
- playheadTime,
- isExternalDrop,
- elementDuration,
- pixelsPerSecond,
- zoomLevel,
- verticalDragDirection,
- startTimeOverride,
- excludeElementId,
- }: ComputeDropTargetParams): DropTarget
- export function getDropLineY({
- dropTarget,
- tracks,
- }: {
- dropTarget: DropTarget;
- tracks: TimelineTrack[];
- }): number
-
-element-utils.ts
- export function canElementHaveAudio(
- element: TimelineElement,
- )
- export function isVisualElement(
- element: TimelineElement,
- )
- export function canElementBeHidden(
- element: TimelineElement,
- )
- export function hasMediaId(
- element: TimelineElement,
- )
- export function requiresMediaId({
- element,
- }: {
- element: CreateTimelineElement;
- }): boolean
- export function checkElementOverlaps({
- elements,
- }: {
- elements: TimelineElement[];
- }): boolean
- export function resolveElementOverlaps({
- elements,
- }: {
- elements: TimelineElement[];
- }): TimelineElement[]
- export function wouldElementOverlap({
- elements,
- startTime,
- endTime,
- excludeElementId,
- }: {
- elements: TimelineElement[];
- startTime: number;
- endTime: number;
- excludeElementId?: string;
- }): boolean
- export function buildTextElement({
- raw,
- startTime,
- }: {
- raw: Partial<Omit<TextElement, "type" | "id">>;
- startTime: number;
- }): CreateTimelineElement
- export function buildStickerElement({
- stickerId,
- name,
- startTime,
- }: {
- stickerId: string;
- name?: string;
- startTime: number;
- }): CreateStickerElement
- export function buildVideoElement({
- mediaId,
- name,
- duration,
- startTime,
- }: {
- mediaId: string;
- name: string;
- duration: number;
- startTime: number;
- }): CreateVideoElement
- export function buildImageElement({
- mediaId,
- name,
- duration,
- startTime,
- }: {
- mediaId: string;
- name: string;
- duration: number;
- startTime: number;
- }): CreateImageElement
- export function buildUploadAudioElement({
- mediaId,
- name,
- duration,
- startTime,
- buffer,
- }: {
- mediaId: string;
- name: string;
- duration: number;
- startTime: number;
- buffer?: AudioBuffer;
- }): CreateUploadAudioElement
- export function buildElementFromMedia({
- mediaId,
- mediaType,
- name,
- duration,
- startTime,
- buffer,
- }: {
- mediaId: string;
- mediaType: MediaType;
- name: string;
- duration: number;
- startTime: number;
- buffer?: AudioBuffer;
- }): CreateTimelineElement
- export function buildLibraryAudioElement({
- sourceUrl,
- name,
- duration,
- startTime,
- buffer,
- }: {
- sourceUrl: string;
- name: string;
- duration: number;
- startTime: number;
- buffer?: AudioBuffer;
- }): CreateLibraryAudioElement
- export function getElementsAtTime({
- tracks,
- time,
- }: {
- tracks: TimelineTrack[];
- time: number;
- }): { trackId: string; elementId: string }[]
- export function collectFontFamilies({
- tracks,
- }: {
- tracks: TimelineTrack[];
- }): string[]
-
-index.ts
- export function calculateTotalDuration({
- tracks,
- }: {
- tracks: TimelineTrack[];
- }): number
-
-ruler-utils.ts
- export interface RulerConfig {
- labelIntervalSeconds: number
- tickIntervalSeconds: number
- }
- export function getRulerConfig({
- zoomLevel,
- fps,
- }: {
- zoomLevel: number;
- fps: number;
- }): RulerConfig
- export function shouldShowLabel({
- time,
- labelIntervalSeconds,
- }: {
- time: number;
- labelIntervalSeconds: number;
- }): boolean
- export function formatRulerLabel({
- timeInSeconds,
- fps,
- }: {
- timeInSeconds: number;
- fps: number;
- }): string
-
-track-utils.ts
- export function canTracktHaveAudio(
- track: TimelineTrack,
- )
- export function canTrackBeHidden(
- track: TimelineTrack,
- )
- export function getTrackColor({ type }: { type: TrackType })
- export function getTrackClasses({ type }: { type: TrackType })
- export function getTrackHeight({ type }: { type: TrackType }): number
- export function getCumulativeHeightBefore({
- tracks,
- trackIndex,
- }: {
- tracks: Array<{ type: TrackType }>;
- trackIndex: number;
- }): number
- export function getTotalTracksHeight({
- tracks,
- }: {
- tracks: Array<{ type: TrackType }>;
- }): number
- export function buildEmptyTrack({
- id,
- type,
- name,
- }: {
- id: string;
- type: TrackType;
- name?: string;
- }): TimelineTrack
- export function getDefaultInsertIndexForTrack({
- tracks,
- trackType,
- }: {
- tracks: TimelineTrack[];
- trackType: TrackType;
- }): number
- export function getHighestInsertIndexForTrack({
- tracks,
- trackType,
- }: {
- tracks: TimelineTrack[];
- trackType: TrackType;
- }): number
- export function isMainTrack(track: TimelineTrack)
- export function getMainTrack({
- tracks,
- }: {
- tracks: TimelineTrack[];
- }): TimelineTrack | null
- export function ensureMainTrack({
- tracks,
- }: {
- tracks: TimelineTrack[];
- }): TimelineTrack[]
- export function canElementGoOnTrack({
- elementType,
- trackType,
- }: {
- elementType: ElementType;
- trackType: TrackType;
- }): boolean
- export function validateElementTrackCompatibility({
- element,
- track,
- }: {
- element: { type: ElementType };
- track: { type: TrackType };
- }): { isValid: boolean; errorMessage?: string }
- export function getEarliestMainTrackElement({
- tracks,
- excludeElementId,
- }: {
- tracks: TimelineTrack[];
- excludeElementId?: string;
- }): TimelineElement | null
- export function enforceMainTrackStart({
- tracks,
- targetTrackId,
- requestedStartTime,
- excludeElementId,
- }: {
- tracks: TimelineTrack[];
- targetTrackId: string;
- requestedStartTime: number;
- excludeElementId?: string;
- }): number
-
-zoom-utils.ts
- export function getTimelineZoomMin({
- duration,
- containerWidth,
- }: {
- duration: number;
- containerWidth: number | null | undefined;
- }): number
- export function getTimelinePaddingPx({
- containerWidth,
- zoomLevel,
- minZoom,
- }: {
- containerWidth: number;
- zoomLevel: number;
- minZoom: number;
- }): number
- export function getZoomPercent({
- zoomLevel,
- minZoom,
- }: {
- zoomLevel: number;
- minZoom: number;
- }): number
- export function sliderToZoom({
- sliderPosition,
- minZoom,
- maxZoom = TIMELINE_CONSTANTS.ZOOM_MAX,
- }: {
- sliderPosition: number;
- minZoom: number;
- maxZoom?: number;
- }): number
- export function zoomToSlider({
- zoomLevel,
- minZoom,
- maxZoom = TIMELINE_CONSTANTS.ZOOM_MAX,
- }: {
- zoomLevel: number;
- minZoom: number;
- maxZoom?: number;
- }): number
-
-## apps/web/src/lib/transcription
-
-caption.ts
- export function buildCaptionChunks({
- segments,
- wordsPerChunk = DEFAULT_WORDS_PER_CAPTION,
- minDuration = MIN_CAPTION_DURATION_SECONDS,
- }: {
- segments: TranscriptionSegment[];
- wordsPerChunk?: number;
- minDuration?: number;
- }): CaptionChunk[]
-
-## apps/web/src/services/renderer
-
-canvas-renderer.ts
- export type CanvasRendererParams = {
- width: number;
- height: number;
- fps: number;
- }
- export class CanvasRenderer {
- canvas: OffscreenCanvas | HTMLCanvasElement
- context: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D
- width: number
- height: number
- fps: number
- constructor({ width, height, fps }: CanvasRendererParams)
- setSize({ width, height }: { width: number; height: number })
- async render({ node, time }: { node: BaseNode; time: number })
- async renderToCanvas({
- node,
- time,
- targetCanvas,
- }: {
- node: BaseNode;
- time: number;
- targetCanvas: HTMLCanvasElement;
- })
- }
-
-scene-builder.ts
- export type BuildSceneParams = {
- canvasSize: TCanvasSize;
- tracks: TimelineTrack[];
- mediaAssets: MediaAsset[];
- duration: numb...
- export function buildScene(params: BuildSceneParams)
-
-scene-exporter.ts
- export type ExportFormat = "mp4" | "webm"
- export type ExportQuality = "low" | "medium" | "high" | "very_high"
- export type SceneExporterEvents = {
- progress: [progress: number];
- complete: [buffer: ArrayBuffer];
- error: [error: Error];
- cance...
- export class SceneExporter extends EventEmitter<SceneExporterEvents> {
- renderer: CanvasRenderer
- format: ExportFormat
- quality: ExportQuality
- shouldIncludeAudio: boolean
- audioBuffer: AudioBuffer
- isCancelled
- constructor({
- width,
- height,
- fps,
- format,
- quality,
- shouldIncludeAudio,
- audioBuffer,
- }: ExportParams)
- cancel(): void
- async export({
- rootNode,
- }: {
- rootNode: RootNode;
- }): Promise<ArrayBuffer | null>
- }
-
-## apps/web/src/services/storage
-
-indexeddb-adapter.ts
- export class IndexedDBAdapter implements StorageAdapter<T> {
- dbName: string
- storeName: string
- version: number
- constructor(dbName: string, storeName: string, version = 1)
- async get(key: string): Promise<T | null>
- async set(key: string, value: T): Promise<void>
- async remove(key: string): Promise<void>
- async list(): Promise<string[]>
- async getAll(): Promise<T[]>
- async clear(): Promise<void>
- }
- export function deleteDatabase({
- dbName,
- }: {
- dbName: string;
- }): Promise<void>
-
-opfs-adapter.ts
- export class OPFSAdapter implements StorageAdapter<File> {
- directoryName: string
- constructor(directoryName = "media")
- async get(key: string): Promise<File | null>
- async set(key: string, file: File): Promise<void>
- async remove(key: string): Promise<void>
- async list(): Promise<string[]>
- async clear(): Promise<void>
- static isSupported(): boolean
- }
-
-service.ts
- export const storageService
-
-types.ts
- export interface StorageAdapter<T> {
- get(key: string): Promise<T | null>
- set(key: string, value: T): Promise<void>
- remove(key: string): Promise<void>
- list(): Promise<string[]>
- clear(): Promise<void>
- }
- export interface MediaAssetData {
- id: string
- name: string
- type: MediaType
- size: number
- lastModified: number
- width?: number
- height?: number
- duration?: number
- fps?: number
- ephemeral?: boolean
- thumbnailUrl?: string
- }
- export type SerializedScene = Omit<TScene, "createdAt" | "updatedAt"> & {
- createdAt: string;
- updatedAt: string;
- }
- export type SerializedProjectMetadata = Omit<
- TProjectMetadata,
- "createdAt" | "updatedAt"
- > & {
- createdAt: string;
- updatedAt: string;
- }
- export type SerializedProject = Omit<TProject, "metadata" | "scenes"> & {
- metadata: SerializedProjectMetadata;
- scenes: Serializ...
- export interface StorageConfig {
- projectsDb: string
- mediaDb: string
- savedSoundsDb: string
- version: number
- }
-
-## apps/web/src/services/transcription
-
-service.ts
- export const transcriptionService
-
-worker.ts
- export type WorkerMessage = | { type: "init"; modelId: string }
- | { type: "transcribe"; audio: Float32Array; language: strin...
- export type WorkerResponse = | { type: "init-progress"; progress: number }
- | { type: "init-complete" }
- | { type: "init-error...
-
-## apps/web/src/services/video-cache
-
-service.ts
- export class VideoCache {
- sinks
- initPromises
- async getFrameAt({
- mediaId,
- file,
- time,
- }: {
- mediaId: string;
- file: File;
- time: number;
- }): Promise<WrappedCanvas | null>
- clearVideo({ mediaId }: { mediaId: string }): void
- clearAll(): void
- getStats()
- }
- export const videoCache
-
-## apps/web/src/stores
-
-assets-panel-store.tsx
- export const TAB_KEYS
- export type Tab = (typeof TAB_KEYS)[number]
- export const tabs
- export const useAssetsPanelStore
-
-editor-store.ts
- export const useEditorStore
-
-keybindings-store.ts
- export const defaultKeybindings: KeybindingConfig
- export interface KeybindingConflict {
- key: ShortcutKey
- existingAction: TActionWithOptionalArgs
- newAction: TActionWithOptionalArgs
- }
- export const useKeybindingsStore
-
-panel-store.ts
- export interface PanelSizes {
- tools: number
- preview: number
- properties: number
- mainContent: number
- timeline: number
- }
- export type PanelId = keyof PanelSizes
- export const usePanelStore
-
-preview-store.ts
- export const usePreviewStore
-
-sounds-store.ts
- export const useSoundsStore
-
-stickers-store.ts
- export const useStickersStore
-
-timeline-store.ts
- export const useTimelineStore
-
-## apps/web/src/types
-
-assets.ts
- export type MediaType = "image" | "video" | "audio"
- export interface MediaAsset extends Omit<MediaAssetData, "size" | "lastModified"> {
- file: File
- url?: string
- }
-
-blog.ts
- export type Post = {
- id: string;
- slug: string;
- title: string;
- content: string;
- description: string;
- coverImage...
- export type Pagination = {
- limit: number;
- currpage: number;
- nextPage: number | null;
- prevPage: number | null;
- totalIt...
- export type MarblePostList = {
- posts: Post[];
- pagination: Pagination;
- }
- export type MarblePost = {
- post: Post;
- }
- export type Tag = {
- id: string;
- name: string;
- slug: string;
- }
- export type MarbleTag = {
- tag: Tag;
- }
- export type MarbleTagList = {
- tags: Tag[];
- pagination: Pagination;
- }
- export type Category = {
- id: string;
- name: string;
- slug: string;
- }
- export type MarbleCategory = {
- category: Category;
- }
- export type MarbleCategoryList = {
- categories: Category[];
- pagination: Pagination;
- }
- export type Author = {
- id: string;
- name: string;
- image: string;
- }
- export type MarbleAuthor = {
- author: Author;
- }
- export type MarbleAuthorList = {
- authors: Author[];
- pagination: Pagination;
- }
-
-drag.ts
- export interface MediaDragData extends BaseDragData {
- type: "media"
- mediaType: "image" | "video" | "audio"
- }
- export interface TextDragData extends BaseDragData {
- type: "text"
- content: string
- }
- export interface StickerDragData extends BaseDragData {
- type: "sticker"
- stickerId: string
- }
- export type TimelineDragData = MediaDragData | TextDragData | StickerDragData
-
-editor.ts
- export type TPlatformLayout = "tiktok"
-
-export.ts
- export const EXPORT_QUALITY_VALUES
- export const EXPORT_FORMAT_VALUES
- export type ExportFormat = (typeof EXPORT_FORMAT_VALUES)[number]
- export type ExportQuality = (typeof EXPORT_QUALITY_VALUES)[number]
- export interface ExportOptions {
- format: ExportFormat
- quality: ExportQuality
- fps?: number
- includeAudio?: boolean
- onProgress?: ({ progress }: { progress: number }) => void
- onCancel?: () => boolean
- }
- export interface ExportResult {
- success: boolean
- buffer?: ArrayBuffer
- error?: string
- cancelled?: boolean
- }
-
-fonts.ts
- export interface FontOption {
- value: string
- label: string
- category: "system" | "google" | "custom"
- weights?: number[]
- hasClassName?: boolean
- }
- export interface GoogleFontMeta {
- family: string
- category: string
- }
- export interface FontAtlasEntry {
- x: number
- y: number
- w: number
- ch: number
- s: string[]
- }
- export interface FontAtlas {
- fonts: Record<string, FontAtlasEntry>
- }
-
-keybinding.ts
- export type ModifierKeys = | "ctrl"
- | "alt"
- | "shift"
- | "ctrl+shift"
- | "alt+shift"
- | "ctrl+alt"
- | "ctrl+alt+shift"
- export type Key = | "a"
- | "b"
- | "c"
- | "d"
- | "e"
- | "f"
- | "g"
- | "h"
- | "i"
- | "j"
- | "k"
- | "l"
- | "m"
- | "n"
- ...
- export type ModifierBasedShortcutKey = `${ModifierKeys}+${Key}`
- export type SingleCharacterShortcutKey = `${Key}`
- export type ShortcutKey = ModifierBasedShortcutKey | SingleCharacterShortcutKey
- export type KeybindingConfig = {
- [key in ShortcutKey]?: TActionWithOptionalArgs;
- }
-
-language.ts
- export type Language = (typeof LANGUAGES)[number]
- export type LanguageCode = Language["code"]
-
-project.ts
- export type TBackground = | {
- type: "color";
- color: string;
- }
- | {
- type: "blur";
- blurIntensity: number;
- }
- export interface TCanvasSize {
- width: number
- height: number
- }
- export interface TProjectMetadata {
- id: string
- name: string
- thumbnail?: string
- duration: number
- createdAt: Date
- updatedAt: Date
- }
- export interface TProjectSettings {
- fps: number
- canvasSize: TCanvasSize
- originalCanvasSize?: TCanvasSize | null
- background: TBackground
- }
- export interface TTimelineViewState {
- zoomLevel: number
- scrollLeft: number
- playheadTime: number
- }
- export interface TProject {
- metadata: TProjectMetadata
- scenes: TScene[]
- currentSceneId: string
- settings: TProjectSettings
- version: number
- timelineViewState?: TTimelineViewState
- }
- export type TProjectSortKey = "createdAt" | "updatedAt" | "name" | "duration"
- export type TSortOrder = "asc" | "desc"
- export type TProjectSortOption = `${TProjectSortKey}-${TSortOrder}`
-
-rendering.ts
- export type BlendMode = | "normal"
-
- | "darken"
-
- | "multiply"
-
- | "color-burn"
-
- | "lighten"
-
- | "screen"
-
- | "plus-ligh...
-
-sounds.ts
- export interface SoundEffect {
- id: number
- name: string
- description: string
- url: string
- previewUrl?: string
- downloadUrl?: string
- duration: number
- filesize: number
- type: string
- channels: number
- bitrate: number
- bitdepth: number
- samplerate: number
- username: string
- tags: string[]
- license: string
- created: string
- downloads: number
- rating: number
- ratingCount: number
- }
- export interface SavedSound {
- id: number
- name: string
- username: string
- previewUrl?: string
- downloadUrl?: string
- duration: number
- tags: string[]
- license: string
- savedAt: string
- }
- export interface SavedSoundsData {
- sounds: SavedSound[]
- lastModified: string
- }
-
-stickers.ts
- export type StickerCategory = keyof typeof STICKER_CATEGORIES
- export interface StickerItem {
- id: string
- provider: string
- name: string
- previewUrl: string
- metadata: Record<string, unknown>
- }
- export interface StickerSearchResult {
- items: StickerItem[]
- total: number
- hasMore: boolean
- }
- export interface StickerProviderSearchOptions {
- limit?: number
- }
- export interface StickerProviderBrowseOptions {
- page?: number
- limit?: number
- }
- export interface StickerResolveOptions {
- width?: number
- height?: number
- }
- export interface StickerProvider {
- id: string
- search({
- query,
- options,
- }: {
- query: string;
- options?: StickerProviderSearchOptions;
- }): Promise<StickerSearchResult>
- browse({
- options,
- }: {
- options?: StickerProviderBrowseOptions;
- }): Promise<StickerSearchResult>
- resolveUrl({
- stickerId,
- options,
- }: {
- stickerId: string;
- options?: StickerResolveOptions;
- }): string
- }
-
-time.ts
- export type TTimeCode = "MM:SS" | "HH:MM:SS" | "HH:MM:SS:CS" | "HH:MM:SS:FF"
-
-timeline.ts
- export interface Bookmark {
- time: number
- note?: string
- color?: string
- duration?: number
- }
- export interface TScene {
- id: string
- name: string
- isMain: boolean
- tracks: TimelineTrack[]
- bookmarks: Bookmark[]
- createdAt: Date
- updatedAt: Date
- }
- export type TrackType = "video" | "text" | "audio" | "sticker"
- export interface VideoTrack extends BaseTrack {
- type: "video"
- elements: (VideoElement | ImageElement)[]
- isMain: boolean
- muted: boolean
- hidden: boolean
- }
- export interface TextTrack extends BaseTrack {
- type: "text"
- elements: TextElement[]
- hidden: boolean
- }
- export interface AudioTrack extends BaseTrack {
- type: "audio"
- elements: AudioElement[]
- muted: boolean
- }
- export interface StickerTrack extends BaseTrack {
- type: "sticker"
- elements: StickerElement[]
- hidden: boolean
- }
- export type TimelineTrack = VideoTrack | TextTrack | AudioTrack | StickerTrack
- export interface Transform {
- scale: number
- position: {
- x: number;
- y: number;
- }
- rotate: number
- }
- export interface UploadAudioElement extends BaseAudioElement {
- sourceType: "upload"
- mediaId: string
- }
- export interface LibraryAudioElement extends BaseAudioElement {
- sourceType: "library"
- sourceUrl: string
- }
- export type AudioElement = UploadAudioElement | LibraryAudioElement
- export interface VideoElement extends BaseTimelineElement {
- type: "video"
- mediaId: string
- muted?: boolean
- hidden?: boolean
- transform: Transform
- opacity: number
- blendMode?: BlendMode
- }
- export interface ImageElement extends BaseTimelineElement {
- type: "image"
- mediaId: string
- hidden?: boolean
- transform: Transform
- opacity: number
- blendMode?: BlendMode
- }
- export interface TextElement extends BaseTimelineElement {
- type: "text"
- content: string
- fontSize: number
- fontFamily: string
- color: string
- backgroundColor: string
- textAlign: "left" | "center" | "right"
- fontWeight: "normal" | "bold"
- fontStyle: "normal" | "italic"
- textDecoration: "none" | "underline" | "line-through"
- letterSpacing?: number
- lineHeight?: number
- hidden?: boolean
- transform: Transform
- opacity: number
- blendMode?: BlendMode
- }
- export interface StickerElement extends BaseTimelineElement {
- type: "sticker"
- stickerId: string
- hidden?: boolean
- transform: Transform
- opacity: number
- blendMode?: BlendMode
- }
- export type TimelineElement = | AudioElement
- | VideoElement
- | ImageElement
- | TextElement
- | StickerElement
- export type ElementType = TimelineElement["type"]
- export type CreateUploadAudioElement = Omit<UploadAudioElement, "id">
- export type CreateLibraryAudioElement = Omit<LibraryAudioElement, "id">
- export type CreateAudioElement = | CreateUploadAudioElement
- | CreateLibraryAudioElement
- export type CreateVideoElement = Omit<VideoElement, "id">
- export type CreateImageElement = Omit<ImageElement, "id">
- export type CreateTextElement = Omit<TextElement, "id">
- export type CreateStickerElement = Omit<StickerElement, "id">
- export type CreateTimelineElement = | CreateAudioElement
- | CreateVideoElement
- | CreateImageElement
- | CreateTextElement
- | CreateSt...
- export interface ElementDragState {
- isDragging: boolean
- elementId: string | null
- trackId: string | null
- startMouseX: number
- startMouseY: number
- startElementTime: number
- clickOffsetTime: number
- currentTime: number
- currentMouseY: number
- }
- export interface DropTarget {
- trackIndex: number
- isNewTrack: boolean
- insertPosition: "above" | "below" | null
- xPosition: number
- }
- export interface ComputeDropTargetParams {
- elementType: ElementType
- mouseX: number
- mouseY: number
- tracks: TimelineTrack[]
- playheadTime: number
- isExternalDrop: boolean
- elementDuration: number
- pixelsPerSecond: number
- zoomLevel: number
- verticalDragDirection?: "up" | "down" | null
- startTimeOverride?: number
- excludeElementId?: string
- }
- export interface ClipboardItem {
- trackId: string
- trackType: TrackType
- element: CreateTimelineElement
- }
-
-transcription.ts
- export type TranscriptionLanguage = LanguageCode | "auto"
- export interface TranscriptionSegment {
- text: string
- start: number
- end: number
- }
- export interface TranscriptionResult {
- text: string
- segments: TranscriptionSegment[]
- language: string
- }
- export type TranscriptionStatus = | "idle"
- | "loading-model"
- | "transcribing"
- | "complete"
- | "error"
- export interface TranscriptionProgress {
- status: TranscriptionStatus
- progress: number
- message?: string
- }
- export type TranscriptionModelId = | "whisper-tiny"
- | "whisper-small"
- | "whisper-medium"
- | "whisper-large-v3-turbo"
- export interface TranscriptionModel {
- id: TranscriptionModelId
- name: string
- huggingFaceId: string
- description: string
- }
- export interface CaptionChunk {
- text: string
- startTime: number
- duration: number
- }
-
-## apps/web/src/utils
-
-browser.ts
- export function isTypableDOMElement({
- element,
- }: {
- element: HTMLElement;
- }): boolean
-
-color.ts
- export type ColorFormat = "hex" | "rgb" | "hsl" | "hsv"
- export function hexToHsv({ hex }: { hex: string }): [number, number, number]
- export function hsvToHex({
-
- h,
-
- s,
-
- v,
-
- }: { h: number; s: number; v: number }): string
- export function parseHexAlpha({ hex }: { hex: string }): {
-
- rgb: string;
-
- alpha: number;
-
- }
- export function appendAlpha({
-
- rgbHex,
-
- alpha,
-
- }: { rgbHex: string; alpha: number }): string
- export function extractColorFromText({
-
- text,
-
- }: { text: string }): string | null
- export function formatColorValue({
-
- hex,
-
- format,
-
- }: {
-
- hex: string;
-
- format: ColorFormat;
-
- }): string
- export function parseColorInput({
-
- input,
-
- format,
-
- }: {
-
- input: string;
-
- format: ColorFormat;
-
- }): string | null
-
-date.ts
- export function formatDate({ date }: { date: Date }): string
-
-geometry.ts
- export function dimensionToAspectRatio({
- width,
- height,
- }: {
- width: number;
- height: number;
- }): string
-
-id.ts
- export function generateUUID(): string
-
-math.ts
- export function clamp({
- value,
- min,
- max,
- }: {
- value: number;
- min: number;
- max: number;
- }): number
- export function evaluateMathExpression({
- input,
- }: {
- input: string;
- }): number | null
-
-platform.ts
- export function getPlatformSpecialKey(): string
- export function getPlatformAlternateKey(): string
- export function isAppleDevice(): boolean
-
-string.ts
- export function capitalizeFirstLetter({ string }: { string: string })
- export function uppercase({ string }: { string: string })
-
-ui.ts
- export function cn(...inputs: ClassValue[]): string
-
-## packages/ui/src/icons
-
-brand.tsx
- export function OcVercelIcon({ className }: { className?: string })
- export function OcMarbleIcon({
- className = "",
- size = 32,
- }: {
- className?: string;
- size?: number;
- })
- export function OcDataBuddyIcon({
- className = "",
- size = 32,
- }: {
- className?: string;
- size?: number;
- })
-
-ui.tsx
- export function OcVideoIcon({
- className = "",
- size = 32,
- }: {
- className?: string;
- size?: number;
- })
- export function OcCheckerboardIcon({
- className = "",
- size = 32,
- }: {
- className?: string;
- size?: number;
- })
- export function OcFontWeightIcon({
- className = "",
- size = 32,
- }: {
- className?: string;
- size?: number;
- })
- export function OcSlidersVerticalIcon({
- className = "",
- size = 32,
- }: {
- className?: string;
- size?: number;
- })
- export function OcSocialIcon({
- className = "",
- size = 32,
- }: {
- className?: string;
- size?: number;
- })
-
-```
-
----
-
-_Generated and maintained by [Twiggy](https://github.com/twiggy-tools/Twiggy)_