entangle-ui 0.10.0 → 0.11.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/CHANGELOG.md +72 -0
- package/README.md +7 -5
- package/dist/esm/assets/src/components/controls/Select/{Select.css.ts.vanilla-oZnFUorL.css → Select.css.ts.vanilla-Cpu2BvWL.css} +3 -0
- package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertyPanel.css.ts.vanilla-RYv_XgOu.css → PropertyPanel.css.ts.vanilla-Dpr_k5I3.css} +4 -1
- package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertyRow.css.ts.vanilla-C3YZnnHb.css → PropertyRow.css.ts.vanilla-pq1Uhd2a.css} +15 -8
- package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertySection.css.ts.vanilla-DK12opZc.css → PropertySection.css.ts.vanilla-6MWWAqyd.css} +50 -32
- package/dist/esm/components/Icons/AddIcon.js.map +1 -1
- package/dist/esm/components/Icons/AiChatIcon.js.map +1 -1
- package/dist/esm/components/Icons/AiSparklesIcon.js.map +1 -1
- package/dist/esm/components/Icons/ArchiveIcon.js.map +1 -1
- package/dist/esm/components/Icons/ArrowDownIcon.js.map +1 -1
- package/dist/esm/components/Icons/ArrowLeftIcon.js.map +1 -1
- package/dist/esm/components/Icons/ArrowRightIcon.js.map +1 -1
- package/dist/esm/components/Icons/ArrowUpIcon.js.map +1 -1
- package/dist/esm/components/Icons/BookmarkIcon.js.map +1 -1
- package/dist/esm/components/Icons/BugIcon.js.map +1 -1
- package/dist/esm/components/Icons/BuildingIcon.js.map +1 -1
- package/dist/esm/components/Icons/CalendarIcon.js.map +1 -1
- package/dist/esm/components/Icons/CameraIcon.js +31 -0
- package/dist/esm/components/Icons/CameraIcon.js.map +1 -0
- package/dist/esm/components/Icons/CheckIcon.js.map +1 -1
- package/dist/esm/components/Icons/ChevronDownIcon.js.map +1 -1
- package/dist/esm/components/Icons/ChevronLeftIcon.js.map +1 -1
- package/dist/esm/components/Icons/ChevronRightIcon.js.map +1 -1
- package/dist/esm/components/Icons/ChevronUpIcon.js.map +1 -1
- package/dist/esm/components/Icons/CircleIcon.js.map +1 -1
- package/dist/esm/components/Icons/ClockIcon.js.map +1 -1
- package/dist/esm/components/Icons/CloseIcon.js.map +1 -1
- package/dist/esm/components/Icons/CloudUploadIcon.js.map +1 -1
- package/dist/esm/components/Icons/CodeIcon.js.map +1 -1
- package/dist/esm/components/Icons/CopyIcon.js.map +1 -1
- package/dist/esm/components/Icons/CubeIcon.js +31 -0
- package/dist/esm/components/Icons/CubeIcon.js.map +1 -0
- package/dist/esm/components/Icons/CutIcon.js.map +1 -1
- package/dist/esm/components/Icons/DotsHorizontalIcon.js.map +1 -1
- package/dist/esm/components/Icons/DotsVerticalIcon.js.map +1 -1
- package/dist/esm/components/Icons/DownloadIcon.js.map +1 -1
- package/dist/esm/components/Icons/EditIcon.js.map +1 -1
- package/dist/esm/components/Icons/ErrorIcon.js.map +1 -1
- package/dist/esm/components/Icons/ExternalLinkIcon.js.map +1 -1
- package/dist/esm/components/Icons/EyeDropperIcon.js.map +1 -1
- package/dist/esm/components/Icons/EyeIcon.js.map +1 -1
- package/dist/esm/components/Icons/FileTextIcon.js.map +1 -1
- package/dist/esm/components/Icons/FilterIcon.js.map +1 -1
- package/dist/esm/components/Icons/FirstIcon.js.map +1 -1
- package/dist/esm/components/Icons/FolderCogIcon.js.map +1 -1
- package/dist/esm/components/Icons/FolderIcon.js.map +1 -1
- package/dist/esm/components/Icons/FolderOpenIcon.js.map +1 -1
- package/dist/esm/components/Icons/FullscreenIcon.js.map +1 -1
- package/dist/esm/components/Icons/GitBranchIcon.js.map +1 -1
- package/dist/esm/components/Icons/GridIcon.js.map +1 -1
- package/dist/esm/components/Icons/HeartIcon.js.map +1 -1
- package/dist/esm/components/Icons/HelpIcon.js.map +1 -1
- package/dist/esm/components/Icons/HomeIcon.js.map +1 -1
- package/dist/esm/components/Icons/ImageIcon.js.map +1 -1
- package/dist/esm/components/Icons/InfoIcon.js.map +1 -1
- package/dist/esm/components/Icons/LastIcon.js.map +1 -1
- package/dist/esm/components/Icons/LinkIcon.js.map +1 -1
- package/dist/esm/components/Icons/ListIcon.js.map +1 -1
- package/dist/esm/components/Icons/LockIcon.js.map +1 -1
- package/dist/esm/components/Icons/MaximizeIcon.js.map +1 -1
- package/dist/esm/components/Icons/MenuIcon.js.map +1 -1
- package/dist/esm/components/Icons/MinimizeIcon.js.map +1 -1
- package/dist/esm/components/Icons/MinusIcon.js.map +1 -1
- package/dist/esm/components/Icons/OrbitIcon.js +31 -0
- package/dist/esm/components/Icons/OrbitIcon.js.map +1 -0
- package/dist/esm/components/Icons/PasteIcon.js.map +1 -1
- package/dist/esm/components/Icons/PauseIcon.js.map +1 -1
- package/dist/esm/components/Icons/PinIcon.js.map +1 -1
- package/dist/esm/components/Icons/PlayIcon.js.map +1 -1
- package/dist/esm/components/Icons/RedoIcon.js.map +1 -1
- package/dist/esm/components/Icons/RefreshIcon.js.map +1 -1
- package/dist/esm/components/Icons/RobotIcon.js.map +1 -1
- package/dist/esm/components/Icons/RotateIcon.js +32 -0
- package/dist/esm/components/Icons/RotateIcon.js.map +1 -0
- package/dist/esm/components/Icons/SaveIcon.js.map +1 -1
- package/dist/esm/components/Icons/SearchIcon.js.map +1 -1
- package/dist/esm/components/Icons/SendIcon.js.map +1 -1
- package/dist/esm/components/Icons/SettingsIcon.js.map +1 -1
- package/dist/esm/components/Icons/SortIcon.js.map +1 -1
- package/dist/esm/components/Icons/SpinIcon.js +32 -0
- package/dist/esm/components/Icons/SpinIcon.js.map +1 -0
- package/dist/esm/components/Icons/StarIcon.js.map +1 -1
- package/dist/esm/components/Icons/StopIcon.js.map +1 -1
- package/dist/esm/components/Icons/SuccessIcon.js.map +1 -1
- package/dist/esm/components/Icons/TagIcon.js.map +1 -1
- package/dist/esm/components/Icons/TangentAlignedIcon.js.map +1 -1
- package/dist/esm/components/Icons/TangentAutoIcon.js.map +1 -1
- package/dist/esm/components/Icons/TangentFreeIcon.js.map +1 -1
- package/dist/esm/components/Icons/TangentLinearIcon.js.map +1 -1
- package/dist/esm/components/Icons/TangentMirroredIcon.js.map +1 -1
- package/dist/esm/components/Icons/TangentStepIcon.js.map +1 -1
- package/dist/esm/components/Icons/TerminalIcon.js.map +1 -1
- package/dist/esm/components/Icons/TrashIcon.js.map +1 -1
- package/dist/esm/components/Icons/UndoIcon.js.map +1 -1
- package/dist/esm/components/Icons/UnlinkIcon.js.map +1 -1
- package/dist/esm/components/Icons/UnlockIcon.js.map +1 -1
- package/dist/esm/components/Icons/UploadIcon.js.map +1 -1
- package/dist/esm/components/Icons/UserIcon.js.map +1 -1
- package/dist/esm/components/Icons/UsersIcon.js.map +1 -1
- package/dist/esm/components/Icons/WarningIcon.js.map +1 -1
- package/dist/esm/components/Icons/ZoomFitIcon.js +32 -0
- package/dist/esm/components/Icons/ZoomFitIcon.js.map +1 -0
- package/dist/esm/components/Icons/ZoomInIcon.js.map +1 -1
- package/dist/esm/components/Icons/ZoomOutIcon.js.map +1 -1
- package/dist/esm/components/controls/CartesianPicker/CartesianPicker.js.map +1 -1
- package/dist/esm/components/controls/CartesianPicker/useCartesianInteraction.js.map +1 -1
- package/dist/esm/components/controls/CartesianPicker/useCartesianRenderer.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/AlphaSlider.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorArea.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorInputs.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorPalette.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorPresets.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorSwatch.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/EyeDropper.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/HueSlider.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/colorUtils.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/palettes/material.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/palettes/professional.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/palettes/tailwind.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/useColor.js.map +1 -1
- package/dist/esm/components/controls/Combobox/Combobox.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/CurveCanvas.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/CurveEditor.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/CurveToolbar.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/curvePresets.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/curveUtils.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/useCurveInteraction.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/useCurveRenderer.js.map +1 -1
- package/dist/esm/components/controls/FileTree/FileTree.js +7 -1
- package/dist/esm/components/controls/FileTree/FileTree.js.map +1 -1
- package/dist/esm/components/controls/FileTree/fileTreeIcons.js.map +1 -1
- package/dist/esm/components/controls/FileTree/fileTreeLabels.js.map +1 -1
- package/dist/esm/components/controls/FileTree/useFileTreeDrop.js +1 -1
- package/dist/esm/components/controls/FileTree/useFileTreeDrop.js.map +1 -1
- package/dist/esm/components/controls/FileUploader/FileUploader.js.map +1 -1
- package/dist/esm/components/controls/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/esm/components/controls/NumberInput/NumberInput.js.map +1 -1
- package/dist/esm/components/controls/NumberInput/useNumberInput.js.map +1 -1
- package/dist/esm/components/controls/Select/Select.css.js +1 -1
- package/dist/esm/components/controls/Select/Select.js +15 -7
- package/dist/esm/components/controls/Select/Select.js.map +1 -1
- package/dist/esm/components/controls/Slider/Slider.js.map +1 -1
- package/dist/esm/components/controls/TagInput/TagInput.js.map +1 -1
- package/dist/esm/components/controls/TreeView/TreeNode.js +6 -0
- package/dist/esm/components/controls/TreeView/TreeNode.js.map +1 -1
- package/dist/esm/components/controls/TreeView/TreeView.js.map +1 -1
- package/dist/esm/components/controls/TreeView/useTreeState.js.map +1 -1
- package/dist/esm/components/controls/VectorInput/VectorInput.js +6 -0
- package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
- package/dist/esm/components/data/DataTable/DataTable.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowser.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserAnnouncementLive.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserBreadcrumbs.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContent.js +6 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContent.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContext.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContextMenu.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserDefaultMenus.js +6 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserDefaultMenus.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserGrid.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserGrid.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserGridItem.js +6 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserGridItem.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserList.js +6 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserList.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserRenameField.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserSidebar.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserStatusBar.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserStore.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserSurface.js +6 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserSurface.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserToolbar.js +6 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserToolbar.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/assetBrowserFilter.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/assetBrowserFormat.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/assetBrowserGeometry.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/assetBrowserKeyboard.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/assetBrowserLabels.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/slots.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserAnnouncement.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserHandle.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserHandle.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserViewState.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserViewState.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetDnd.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetDnd.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetGridKeyboardNav.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetGridVirtualizer.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetGridVirtualizer.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetMarqueeGesture.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetMarqueeGesture.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetMutationKeyboard.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetMutationKeyboard.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetMutations.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetMutations.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetNavigation.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetNavigation.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetSelectionController.js +1 -1
- package/dist/esm/components/editor/AssetBrowser/useAssetSelectionController.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatActionBar.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatAttachment.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatBubble.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js +6 -0
- package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatContextChip.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatEmptyState.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatIcons.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatInput.js +6 -0
- package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatInputToolbar.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMessage.js +6 -0
- package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMessageList.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatPanel.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatToolCall.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatTypingIndicator.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/useChatInput.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/useChatMessages.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/useChatScroll.js.map +1 -1
- package/dist/esm/components/editor/Minimap/Minimap.js +1 -1
- package/dist/esm/components/editor/Minimap/Minimap.js.map +1 -1
- package/dist/esm/components/editor/Minimap/Minimap.types.js.map +1 -1
- package/dist/esm/components/editor/Minimap/MinimapContext.js.map +1 -1
- package/dist/esm/components/editor/Minimap/MinimapCorner.js.map +1 -1
- package/dist/esm/components/editor/Minimap/MinimapFooter.js.map +1 -1
- package/dist/esm/components/editor/Minimap/MinimapStore.js.map +1 -1
- package/dist/esm/components/editor/Minimap/MinimapTitle.js.map +1 -1
- package/dist/esm/components/editor/Minimap/ViewportMinimap.js +1 -1
- package/dist/esm/components/editor/Minimap/ViewportMinimap.js.map +1 -1
- package/dist/esm/components/editor/Minimap/computeBoundsFromItems.js.map +1 -1
- package/dist/esm/components/editor/Minimap/index.js.map +1 -1
- package/dist/esm/components/editor/Minimap/minimapCoords.js.map +1 -1
- package/dist/esm/components/editor/Minimap/minimapDrawing.js.map +1 -1
- package/dist/esm/components/editor/Minimap/minimapHitTest.js.map +1 -1
- package/dist/esm/components/editor/Minimap/useMinimapGestures.js +1 -1
- package/dist/esm/components/editor/Minimap/useMinimapGestures.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraph.js +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraph.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraph.types.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphContext.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphEdgeLabels.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphGroup.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphMinimap.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphNode.js +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphNode.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeContext.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeParts.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSection.js +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSection.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSectionContext.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphPin.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphPort.js +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphPort.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphPortVisual.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphSlots.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphSpawnPalette.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphStore.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/NodeGraphToolbar.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/createTypeMatchValidator.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/nodeGraphActions.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/nodeGraphDrawing.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/nodeGraphIds.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/nodeGraphMath.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/sortSlots.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/useDragGesture.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraph.js +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraph.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphConnection.js +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphConnection.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphEdgeInteraction.js +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphEdgeInteraction.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphGroupDrag.js +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphGroupDrag.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphKeyboard.js +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphKeyboard.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphNodeDrag.js +1 -1
- package/dist/esm/components/editor/NodeGraph/useNodeGraphNodeDrag.js.map +1 -1
- package/dist/esm/components/editor/NodeGraph/useStoreSlice.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/PropertyGroup.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/PropertyPanel.css.js +4 -3
- package/dist/esm/components/editor/PropertyInspector/PropertyPanel.css.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/PropertyPanel.js +5 -4
- package/dist/esm/components/editor/PropertyInspector/PropertyPanel.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/PropertyRow.css.js +7 -6
- package/dist/esm/components/editor/PropertyInspector/PropertyRow.css.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/PropertyRow.js +18 -3
- package/dist/esm/components/editor/PropertyInspector/PropertyRow.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/PropertySection.css.js +11 -10
- package/dist/esm/components/editor/PropertyInspector/PropertySection.css.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/PropertySection.js +29 -21
- package/dist/esm/components/editor/PropertyInspector/PropertySection.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/usePropertyUndo.js.map +1 -1
- package/dist/esm/components/editor/Timeline/Timeline.js +1 -1
- package/dist/esm/components/editor/Timeline/Timeline.js.map +1 -1
- package/dist/esm/components/editor/Timeline/Timeline.types.js.map +1 -1
- package/dist/esm/components/editor/Timeline/TimelineContext.js.map +1 -1
- package/dist/esm/components/editor/Timeline/TimelineFooter.js.map +1 -1
- package/dist/esm/components/editor/Timeline/TimelineMinimap.js +1 -1
- package/dist/esm/components/editor/Timeline/TimelineMinimap.js.map +1 -1
- package/dist/esm/components/editor/Timeline/TimelineStore.js.map +1 -1
- package/dist/esm/components/editor/Timeline/TimelineToolbar.js.map +1 -1
- package/dist/esm/components/editor/Timeline/TimelineTrackHeaders.js +1 -1
- package/dist/esm/components/editor/Timeline/TimelineTrackHeaders.js.map +1 -1
- package/dist/esm/components/editor/Timeline/TimelineTrackScale.js.map +1 -1
- package/dist/esm/components/editor/Timeline/index.js.map +1 -1
- package/dist/esm/components/editor/Timeline/timelineCoords.js.map +1 -1
- package/dist/esm/components/editor/Timeline/timelineDrawing.js.map +1 -1
- package/dist/esm/components/editor/Timeline/timelineEdits.js.map +1 -1
- package/dist/esm/components/editor/Timeline/timelineHitTest.js.map +1 -1
- package/dist/esm/components/editor/Timeline/timelineLayout.js.map +1 -1
- package/dist/esm/components/editor/Timeline/timelineSelection.js.map +1 -1
- package/dist/esm/components/editor/Timeline/useTimelineDraw.js +1 -1
- package/dist/esm/components/editor/Timeline/useTimelineDraw.js.map +1 -1
- package/dist/esm/components/editor/Timeline/useTimelineGestures.js +1 -1
- package/dist/esm/components/editor/Timeline/useTimelineGestures.js.map +1 -1
- package/dist/esm/components/editor/Timeline/useTimelinePlayback.js.map +1 -1
- package/dist/esm/components/editor/TransformControl/TransformControl.js.map +1 -1
- package/dist/esm/components/editor/ViewportGizmo/ViewportGizmo.js.map +1 -1
- package/dist/esm/components/editor/ViewportGizmo/gizmoMath.js.map +1 -1
- package/dist/esm/components/editor/ViewportGizmo/useGizmoInteraction.js.map +1 -1
- package/dist/esm/components/editor/ViewportGizmo/useGizmoRenderer.js.map +1 -1
- package/dist/esm/components/feedback/Alert/Alert.js.map +1 -1
- package/dist/esm/components/feedback/Alert/AlertActions.js.map +1 -1
- package/dist/esm/components/feedback/Alert/AlertDescription.js.map +1 -1
- package/dist/esm/components/feedback/Alert/AlertTitle.js.map +1 -1
- package/dist/esm/components/feedback/CommandPalette/CommandPalette.js.map +1 -1
- package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js.map +1 -1
- package/dist/esm/components/feedback/CommandPalette/useRecentItems.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/DialogBody.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/DialogClose.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/DialogFooter.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/DialogHeader.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/useDialogAnimation.js.map +1 -1
- package/dist/esm/components/feedback/Drawer/Drawer.js.map +1 -1
- package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js.map +1 -1
- package/dist/esm/components/feedback/EmptyState/EmptyState.js.map +1 -1
- package/dist/esm/components/feedback/LogView/LogView.js.map +1 -1
- package/dist/esm/components/feedback/LogView/LogViewBody.js.map +1 -1
- package/dist/esm/components/feedback/LogView/LogViewContext.js.map +1 -1
- package/dist/esm/components/feedback/LogView/LogViewParts.js.map +1 -1
- package/dist/esm/components/feedback/LogView/LogViewStore.js.map +1 -1
- package/dist/esm/components/feedback/LogView/logViewLabels.js.map +1 -1
- package/dist/esm/components/feedback/LogView/logViewLevels.js.map +1 -1
- package/dist/esm/components/feedback/LogView/logViewUtils.js.map +1 -1
- package/dist/esm/components/feedback/LogView/useFollowTail.js.map +1 -1
- package/dist/esm/components/feedback/LogView/useLogSelection.js.map +1 -1
- package/dist/esm/components/feedback/ProgressBar/CircularProgress.js.map +1 -1
- package/dist/esm/components/feedback/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/esm/components/feedback/Skeleton/Skeleton.js.map +1 -1
- package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js.map +1 -1
- package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js.map +1 -1
- package/dist/esm/components/feedback/Spinner/Spinner.js.map +1 -1
- package/dist/esm/components/feedback/Stat/Stat.js.map +1 -1
- package/dist/esm/components/feedback/Toast/ToastContainer.js.map +1 -1
- package/dist/esm/components/feedback/Toast/ToastItem.js.map +1 -1
- package/dist/esm/components/feedback/Toast/ToastProvider.js.map +1 -1
- package/dist/esm/components/feedback/Toast/useToast.js.map +1 -1
- package/dist/esm/components/form/FormHelperText.js.map +1 -1
- package/dist/esm/components/form/FormLabel.js.map +1 -1
- package/dist/esm/components/form/InputWrapper.js.map +1 -1
- package/dist/esm/components/layout/Accordion/Accordion.js.map +1 -1
- package/dist/esm/components/layout/Accordion/AccordionContent.js.map +1 -1
- package/dist/esm/components/layout/Accordion/AccordionItem.js.map +1 -1
- package/dist/esm/components/layout/Accordion/AccordionTrigger.js.map +1 -1
- package/dist/esm/components/layout/Card/Card.js.map +1 -1
- package/dist/esm/components/layout/Divider/Divider.js.map +1 -1
- package/dist/esm/components/layout/Flex/Flex.js.map +1 -1
- package/dist/esm/components/layout/Grid/Grid.js.map +1 -1
- package/dist/esm/components/layout/ListItem/ListItem.js.map +1 -1
- package/dist/esm/components/layout/PageHeader/PageHeader.js.map +1 -1
- package/dist/esm/components/layout/PanelSurface/PanelSurface.js.map +1 -1
- package/dist/esm/components/layout/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/esm/components/layout/Spacer/Spacer.js.map +1 -1
- package/dist/esm/components/layout/SplitPane/SplitPane.js.map +1 -1
- package/dist/esm/components/layout/SplitPane/SplitPanePanel.js.map +1 -1
- package/dist/esm/components/layout/Stack/Stack.js.map +1 -1
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -1
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js.map +1 -1
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbSeparator.js.map +1 -1
- package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js +6 -0
- package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/esm/components/navigation/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/esm/components/navigation/Menu/Menu.js.map +1 -1
- package/dist/esm/components/navigation/Menu/MenuGapContext.js.map +1 -1
- package/dist/esm/components/navigation/Pagination/Pagination.js.map +1 -1
- package/dist/esm/components/navigation/Pagination/usePagination.js.map +1 -1
- package/dist/esm/components/navigation/PathBar/PathBar.js +7 -1
- package/dist/esm/components/navigation/PathBar/PathBar.js.map +1 -1
- package/dist/esm/components/navigation/PathBar/PathBarSiblingMenu.js +6 -0
- package/dist/esm/components/navigation/PathBar/PathBarSiblingMenu.js.map +1 -1
- package/dist/esm/components/navigation/PathBar/pathUtils.js.map +1 -1
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/Tab.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/TabList.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/TabPanel.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/Tabs.js.map +1 -1
- package/dist/esm/components/primitives/Avatar/Avatar.js +6 -0
- package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/primitives/Avatar/AvatarGroup.js.map +1 -1
- package/dist/esm/components/primitives/Badge/Badge.js +6 -0
- package/dist/esm/components/primitives/Badge/Badge.js.map +1 -1
- package/dist/esm/components/primitives/Button/Button.js.map +1 -1
- package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
- package/dist/esm/components/primitives/Checkbox/CheckboxGroup.js.map +1 -1
- package/dist/esm/components/primitives/Code/Code.js.map +1 -1
- package/dist/esm/components/primitives/Collapsible/Collapsible.js.map +1 -1
- package/dist/esm/components/primitives/HoverCard/HoverCard.js.map +1 -1
- package/dist/esm/components/primitives/Icon/Icon.js.map +1 -1
- package/dist/esm/components/primitives/IconButton/IconButton.js.map +1 -1
- package/dist/esm/components/primitives/Input/Input.js.map +1 -1
- package/dist/esm/components/primitives/Kbd/Kbd.js.map +1 -1
- package/dist/esm/components/primitives/Link/Link.js.map +1 -1
- package/dist/esm/components/primitives/Paper/Paper.js.map +1 -1
- package/dist/esm/components/primitives/Popover/Popover.js.map +1 -1
- package/dist/esm/components/primitives/Popover/PopoverClose.js.map +1 -1
- package/dist/esm/components/primitives/Popover/PopoverContent.js.map +1 -1
- package/dist/esm/components/primitives/Popover/PopoverTrigger.js.map +1 -1
- package/dist/esm/components/primitives/Radio/Radio.js.map +1 -1
- package/dist/esm/components/primitives/Radio/RadioGroup.js.map +1 -1
- package/dist/esm/components/primitives/Switch/Switch.js.map +1 -1
- package/dist/esm/components/primitives/Text/Text.js.map +1 -1
- package/dist/esm/components/primitives/TextArea/TextArea.js.map +1 -1
- package/dist/esm/components/primitives/Tooltip/Arrow.js.map +1 -1
- package/dist/esm/components/primitives/Tooltip/Tooltip.js.map +1 -1
- package/dist/esm/components/primitives/Tooltip/utils.js.map +1 -1
- package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.js.map +1 -1
- package/dist/esm/components/primitives/canvas/CanvasContainer.js.map +1 -1
- package/dist/esm/components/primitives/canvas/canvasCoords.js.map +1 -1
- package/dist/esm/components/primitives/canvas/canvasDrawing.js.map +1 -1
- package/dist/esm/components/primitives/canvas/canvasTheme.js.map +1 -1
- package/dist/esm/components/primitives/canvas/useCanvasRenderer.js.map +1 -1
- package/dist/esm/components/primitives/viewport/Viewport.js +1 -1
- package/dist/esm/components/primitives/viewport/Viewport.js.map +1 -1
- package/dist/esm/components/primitives/viewport/ViewportContext.js.map +1 -1
- package/dist/esm/components/primitives/viewport/ViewportLayer.js +1 -1
- package/dist/esm/components/primitives/viewport/ViewportLayer.js.map +1 -1
- package/dist/esm/components/primitives/viewport/ViewportOverlay.js.map +1 -1
- package/dist/esm/components/primitives/viewport/ViewportStore.js.map +1 -1
- package/dist/esm/components/primitives/viewport/ViewportWorld.js.map +1 -1
- package/dist/esm/components/primitives/viewport/useViewportGestures.js +1 -1
- package/dist/esm/components/primitives/viewport/useViewportGestures.js.map +1 -1
- package/dist/esm/components/primitives/viewport/viewportCoords.js.map +1 -1
- package/dist/esm/components/primitives/viewport/viewportMath.js.map +1 -1
- package/dist/esm/components/shell/AppShell/AppShell.js.map +1 -1
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js.map +1 -1
- package/dist/esm/components/shell/MenuBar/MenuBar.js.map +1 -1
- package/dist/esm/components/shell/StatusBar/StatusBar.js.map +1 -1
- package/dist/esm/components/shell/Toolbar/Toolbar.js.map +1 -1
- package/dist/esm/context/KeyboardContext.js.map +1 -1
- package/dist/esm/hooks/useBreakpoint/useBreakpoint.js.map +1 -1
- package/dist/esm/hooks/useClickOutside/useClickOutside.js.map +1 -1
- package/dist/esm/hooks/useClipboard/useClipboard.js.map +1 -1
- package/dist/esm/hooks/useControlledState/useControlledState.js.map +1 -1
- package/dist/esm/hooks/useDebounced/useDebouncedCallback.js.map +1 -1
- package/dist/esm/hooks/useDebounced/useDebouncedValue.js.map +1 -1
- package/dist/esm/hooks/useDisclosure/useDisclosure.js.map +1 -1
- package/dist/esm/hooks/useEventCallback/useEventCallback.js.map +1 -1
- package/dist/esm/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
- package/dist/esm/hooks/useHotkey/useHotkey.js.map +1 -1
- package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -1
- package/dist/esm/hooks/useIsMounted/useIsMounted.js.map +1 -1
- package/dist/esm/hooks/useKeyboard/useKeyboard.js.map +1 -1
- package/dist/esm/hooks/useKeyboard/utils.js.map +1 -1
- package/dist/esm/hooks/useLatest/useLatest.js.map +1 -1
- package/dist/esm/hooks/useListboxNav/useListboxNav.js.map +1 -1
- package/dist/esm/hooks/useMediaQuery/useMediaQuery.js.map +1 -1
- package/dist/esm/hooks/useMergedRef/useMergedRef.js.map +1 -1
- package/dist/esm/hooks/useNavigationHistory/useNavigationHistory.js.map +1 -1
- package/dist/esm/hooks/useResizeObserver/useResizeObserver.js.map +1 -1
- package/dist/esm/hooks/useTheme/useTheme.js +1 -1
- package/dist/esm/hooks/useTheme/useTheme.js.map +1 -1
- package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
- package/dist/esm/styles.js +3 -0
- package/dist/esm/styles.js.map +1 -0
- package/dist/esm/theme/ThemeProvider.js +5 -3
- package/dist/esm/theme/ThemeProvider.js.map +1 -1
- package/dist/esm/theme/VanillaThemeProvider.js.map +1 -1
- package/dist/esm/theme/breakpoints.js.map +1 -1
- package/dist/esm/theme/createCustomTheme.js +1 -1
- package/dist/esm/theme/createCustomTheme.js.map +1 -1
- package/dist/esm/theme/createLightTheme.js.map +1 -1
- package/dist/esm/theme/darkThemeValues.js.map +1 -1
- package/dist/esm/theme/lightThemeValues.js.map +1 -1
- package/dist/esm/theme/themeContractData.js.map +1 -1
- package/dist/esm/utils/cx.js.map +1 -1
- package/dist/esm/utils/devWarn.js.map +1 -1
- package/dist/esm/utils/mathExpression.js.map +1 -1
- package/dist/esm/utils/mathUtils.js.map +1 -1
- package/dist/esm/utils/objects.js.map +1 -1
- package/dist/esm/utils/platform.js.map +1 -1
- package/dist/tokens/tokens.dark.css +1 -1
- package/dist/tokens/tokens.json +1 -1
- package/dist/tokens/tokens.light.css +1 -1
- package/dist/types/components/Icons/CameraIcon.d.ts +34 -0
- package/dist/types/components/Icons/CubeIcon.d.ts +34 -0
- package/dist/types/components/Icons/OrbitIcon.d.ts +34 -0
- package/dist/types/components/Icons/RotateIcon.d.ts +35 -0
- package/dist/types/components/Icons/SpinIcon.d.ts +35 -0
- package/dist/types/components/Icons/ZoomFitIcon.d.ts +35 -0
- package/dist/types/components/controls/Select/Select.d.ts +1 -1
- package/dist/types/components/controls/Select/Select.types.d.ts +43 -9
- package/dist/types/components/editor/PropertyInspector/PropertyInspector.types.d.ts +49 -3
- package/dist/types/components/primitives/Button/Button.d.ts +1 -1
- package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/theme/ThemeProvider.d.ts +5 -3
- package/package.json +6 -2
- package/dist/esm/_virtual/_commonjsHelpers.js +0 -6
- package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
- package/dist/esm/_virtual/cjs.js +0 -4
- package/dist/esm/_virtual/cjs.js.map +0 -1
- package/dist/esm/_virtual/cssesc.js +0 -8
- package/dist/esm/_virtual/cssesc.js.map +0 -1
- package/dist/esm/_virtual/picocolors.js +0 -8
- package/dist/esm/_virtual/picocolors.js.map +0 -1
- package/dist/esm/_virtual/picocolors2.js +0 -4
- package/dist/esm/_virtual/picocolors2.js.map +0 -1
- package/dist/esm/node_modules/@emotion/hash/dist/emotion-hash.esm.js +0 -56
- package/dist/esm/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +0 -1
- package/dist/esm/node_modules/@vanilla-extract/css/adapter/dist/vanilla-extract-css-adapter.esm.js +0 -46
- package/dist/esm/node_modules/@vanilla-extract/css/adapter/dist/vanilla-extract-css-adapter.esm.js.map +0 -1
- package/dist/esm/node_modules/@vanilla-extract/css/dist/taggedTemplateLiteral-10998315.esm.js +0 -13
- package/dist/esm/node_modules/@vanilla-extract/css/dist/taggedTemplateLiteral-10998315.esm.js.map +0 -1
- package/dist/esm/node_modules/@vanilla-extract/css/dist/transformCss-fd0786e1.esm.js +0 -962
- package/dist/esm/node_modules/@vanilla-extract/css/dist/transformCss-fd0786e1.esm.js.map +0 -1
- package/dist/esm/node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js +0 -309
- package/dist/esm/node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js.map +0 -1
- package/dist/esm/node_modules/@vanilla-extract/css/fileScope/dist/vanilla-extract-css-fileScope.esm.js +0 -18
- package/dist/esm/node_modules/@vanilla-extract/css/fileScope/dist/vanilla-extract-css-fileScope.esm.js.map +0 -1
- package/dist/esm/node_modules/@vanilla-extract/css/injectStyles/dist/vanilla-extract-css-injectStyles.esm.js +0 -23
- package/dist/esm/node_modules/@vanilla-extract/css/injectStyles/dist/vanilla-extract-css-injectStyles.esm.js.map +0 -1
- package/dist/esm/node_modules/@vanilla-extract/css/node_modules/lru-cache/dist/esm/index.js +0 -1543
- package/dist/esm/node_modules/@vanilla-extract/css/node_modules/lru-cache/dist/esm/index.js.map +0 -1
- package/dist/esm/node_modules/@vanilla-extract/private/dist/vanilla-extract-private.esm.js +0 -38
- package/dist/esm/node_modules/@vanilla-extract/private/dist/vanilla-extract-private.esm.js.map +0 -1
- package/dist/esm/node_modules/css-what/lib/es/parse.js +0 -424
- package/dist/esm/node_modules/css-what/lib/es/parse.js.map +0 -1
- package/dist/esm/node_modules/css-what/lib/es/types.js +0 -29
- package/dist/esm/node_modules/css-what/lib/es/types.js.map +0 -1
- package/dist/esm/node_modules/cssesc/cssesc.js +0 -120
- package/dist/esm/node_modules/cssesc/cssesc.js.map +0 -1
- package/dist/esm/node_modules/dedent/dist/dedent.js +0 -100
- package/dist/esm/node_modules/dedent/dist/dedent.js.map +0 -1
- package/dist/esm/node_modules/deep-object-diff/mjs/diff.js +0 -40
- package/dist/esm/node_modules/deep-object-diff/mjs/diff.js.map +0 -1
- package/dist/esm/node_modules/deep-object-diff/mjs/utils.js +0 -9
- package/dist/esm/node_modules/deep-object-diff/mjs/utils.js.map +0 -1
- package/dist/esm/node_modules/deepmerge/dist/cjs.js +0 -143
- package/dist/esm/node_modules/deepmerge/dist/cjs.js.map +0 -1
- package/dist/esm/node_modules/media-query-parser/dist/media-query-parser.esm.js +0 -1386
- package/dist/esm/node_modules/media-query-parser/dist/media-query-parser.esm.js.map +0 -1
- package/dist/esm/node_modules/modern-ahocorasick/dist/index.js +0 -102
- package/dist/esm/node_modules/modern-ahocorasick/dist/index.js.map +0 -1
- package/dist/esm/node_modules/picocolors/picocolors.js +0 -87
- package/dist/esm/node_modules/picocolors/picocolors.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Timeline.js","sources":["../../../../../../src/components/editor/Timeline/Timeline.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA;AACA;AAWA;;;AAGA;AAEA;AACE;AACE;AACA;AACA;AACA;AACA;;;;AAIE;AACE;;;;AAIJ;AACA;AAKA;AACE;;;AAGF;;;AASO;;;AASA;AACL;;;AAEA;;AAEJ;AACA;AACF;AAEA;;;;;;;;AAQG;AACI;AACL;AA4DA;AACA;AACA;AAEA;;;;AAUA;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;;;AAQD;AAGA;AACA;;;AAGI;AACF;;;;AAUI;;;AAGA;AACD;;;;;;;AAQF;;AAKH;AACA;AACA;AACA;AAIA;;;AAOI;;;;;;;AAOA;AACD;AACH;;;;;;;;;;AAUC;;AAGC;;;AAIA;AACF;;AAIA;AAIA;AAEI;AACF;;;;AAMF;AACA;AAEI;;AAEA;;;AAOJ;;;AAMA;;AAEA;AACA;AACE;AACA;;;;AAIA;AACA;AACA;AACD;;;;;;;;AASC;;AACA;AAOA;;AACF;;;;;;;;AAQC;;;;;AAOD;AACA;AACA;AAEI;AACF;AAGF;AAEI;AACF;AAGF;;;AAIE;AAGF;AAEI;;;;AAQJ;AAEI;AAKF;;AAMF;AACA;AAEI;;AAKA;AACA;;AAKJ;AAEI;AACA;;;;AASJ;AACA;AACA;AACE;AACA;;;;;AAIA;AACA;;AAEE;;;AAEA;;AACA;AAAgB;AAChB;AAAgB;;AAElB;;AACA;AACA;;AAGF;AAEI;AACF;;;;AAOE;AACA;;AAEA;AACA;AACA;AACD;AACH;;;;;;;AAOC;AAED;;AAIA;;AAEE;AAGF;;;;AAMA;;;;;;AAUA;;;AAIA;AAEI;AACF;;AAMF;AACE;;AAEA;;;AAGA;AACA;;;;;;;;;;;;;;;AAeA;AACA;;;;;;;;AAQA;AACA;;;;;AAKD;;;;;;;AAQC;AACA;AACA;AACA;AACA;AACE;AACA;AACF;AACF;;AAIA;;;AAIA;;;AAGE;;;;AAIA;;;;;;;AAOA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACD;;;;;;;;AAcD;AAmCc;AACA;AACE;AACA;AACE;;AAEE;;;AAOV;;AAsBE;;;AAOd;AAEA;;"}
|
|
1
|
+
{"version":3,"file":"Timeline.js","sources":["src/components/editor/Timeline/Timeline.tsx"],"sourcesContent":["'use client';\n\nimport React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\n\nimport { useControlledState, useLatest, useResizeObserver } from '@/hooks';\nimport { cx } from '@/utils/cx';\n\nimport {\n timelineShellStyle,\n timelineBodyStyle,\n timelineCanvasStyle,\n timelineOverlayLayerStyle,\n timelineMainRowStyle,\n timelineToolbarStyle,\n timelineFooterStyle,\n ariaLiveRegionStyle,\n} from './Timeline.css';\nimport { TIMELINE_SLOT } from './Timeline.types';\nimport { TimelineStoreContext } from './TimelineContext';\nimport {\n clamp,\n nextFollowView,\n resolveLoop,\n snapFrame,\n} from './timelineCoords';\nimport { computeRows } from './timelineLayout';\nimport { TimelineStore } from './TimelineStore';\nimport { TimelineTrackHeaders } from './TimelineTrackHeaders';\nimport { useTimelineDraw } from './useTimelineDraw';\nimport { useTimelineGestures } from './useTimelineGestures';\nimport { useTimelinePlayback } from './useTimelinePlayback';\n\nimport type {\n TimelineGroup,\n TimelineLoop,\n TimelineMinimapProps,\n TimelineMode,\n TimelineProps,\n TimelineSelection,\n TimelineSlotKind,\n TimelineSlotMarker,\n TimelineTrack,\n TimelineTrackScaleProps,\n TimelineView,\n} from './Timeline.types';\nimport type { ViewportSize } from '@/components/primitives/viewport';\n\nconst RULER_HEIGHT = 22;\nconst LOOP_STRIP_HEIGHT = 12;\n\ninterface CategorizedSlots {\n toolbar: React.ReactNode;\n footer: React.ReactNode;\n minimap: React.ReactElement | null;\n /** Deprecated: prefer the `trackScale` prop on `<Timeline>`. */\n trackScale: TimelineTrackScaleProps | null;\n overlay: React.ReactNode[];\n}\n\nfunction getSlotKind(el: React.ReactElement): TimelineSlotKind | null {\n const marker = (el.type as Partial<TimelineSlotMarker>)[TIMELINE_SLOT];\n return marker ?? null;\n}\n\nfunction categorizeChildren(children: React.ReactNode): CategorizedSlots {\n const slots: CategorizedSlots = {\n toolbar: null,\n footer: null,\n minimap: null,\n trackScale: null,\n overlay: [],\n };\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child)) {\n if (child !== null && child !== undefined && child !== false) {\n slots.overlay.push(child);\n }\n return;\n }\n const kind = getSlotKind(child);\n const props = child.props as {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n };\n if (kind === 'track-scale') {\n slots.trackScale = child.props as TimelineTrackScaleProps;\n return;\n }\n if (kind === 'toolbar') {\n slots.toolbar = (\n <div\n className={cx(timelineToolbarStyle, props.className)}\n style={props.style}\n >\n {props.children}\n </div>\n );\n } else if (kind === 'footer') {\n slots.footer = (\n <div\n className={cx(timelineFooterStyle, props.className)}\n style={props.style}\n >\n {props.children}\n </div>\n );\n } else if (kind === 'minimap') {\n slots.minimap = child;\n } else {\n slots.overlay.push(child);\n }\n });\n return slots;\n}\n\n/**\n * Horizontal multi-track animation timeline / dope sheet. Tracks hold\n * keyframes (the shared `CurveKeyframe` model) along a frame-based time axis;\n * a playhead scrubs across all tracks. Canvas-rendered keyframes with DOM\n * chrome, store-driven via `useSyncExternalStore`.\n *\n * Children read live state via `useTimelineContext()` / `useTimelineGeometry()`\n * / `useTimelinePlayhead()` / `useTimelineSelection()`.\n */\nexport const Timeline = (props: TimelineProps): React.ReactElement => {\n const {\n tracks,\n onTracksChange,\n onTracksChangeComplete,\n startFrame = 0,\n endFrame,\n fps = 30,\n frame,\n defaultFrame,\n onFrameChange,\n onFrameChangeComplete,\n view,\n defaultView,\n onViewChange,\n minFramesVisible = 1,\n maxFramesVisible,\n selection,\n defaultSelection,\n onSelectionChange,\n editable = true,\n allowAddKeyframe = true,\n allowDeleteKeyframe = true,\n snap = true,\n mode,\n defaultMode,\n onModeChange,\n playing,\n defaultPlaying,\n onPlayingChange,\n loop,\n defaultLoop,\n onLoopChange,\n followMode = 'smooth',\n loopStrip = false,\n loopHandles = 'edges',\n groups,\n onGroupsChange,\n trackHeight = 28,\n expandedTrackHeight = 96,\n groupHeaderHeight = 22,\n showRuler = true,\n showPlayhead = true,\n trackHeaderWidth = 160,\n responsive = true,\n height,\n playheadColor,\n backgroundColor,\n trackScale: trackScaleProp,\n renderOverlay,\n renderTrackHeader,\n formatTime,\n ariaLabel = 'Timeline',\n className,\n style,\n testId,\n id,\n children,\n ref,\n } = props;\n\n const bodyRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const headerColumnRef = useRef<HTMLDivElement>(null);\n\n const [size, setSize] = useState<ViewportSize>({ width: 0, height: 0 });\n const [scrollTop, setScrollTop] = useState(0);\n\n const fullView = useMemo<TimelineView>(\n () => ({ startFrame, endFrame }),\n [startFrame, endFrame]\n );\n\n // ── Controlled / uncontrolled state ──\n\n const [frameState, setFrame] = useControlledState<number>({\n value: frame,\n defaultValue: defaultFrame,\n onChange: onFrameChange,\n fallback: startFrame,\n });\n const [viewState, setView] = useControlledState<TimelineView>({\n value: view,\n defaultValue: defaultView,\n onChange: onViewChange,\n fallback: fullView,\n });\n const [selectionState, setSelection] = useControlledState<TimelineSelection>({\n value: selection,\n defaultValue: defaultSelection,\n onChange: onSelectionChange,\n fallback: [],\n });\n const [modeState] = useControlledState<TimelineMode>({\n value: mode,\n defaultValue: defaultMode,\n onChange: onModeChange,\n fallback: 'dope-sheet',\n });\n const [playingState, setPlaying] = useControlledState<boolean>({\n value: playing,\n defaultValue: defaultPlaying,\n onChange: onPlayingChange,\n fallback: false,\n });\n const [loopState, setLoop] = useControlledState<TimelineLoop>({\n value: loop,\n defaultValue: defaultLoop,\n onChange: onLoopChange,\n fallback: false,\n });\n const loopRegion = useMemo(\n () => resolveLoop(loopState, startFrame, endFrame),\n [loopState, startFrame, endFrame]\n );\n\n // ── Groups (controlled or uncontrolled) ──\n\n const [internalGroups, setInternalGroups] = useState<\n ReadonlyArray<TimelineGroup>\n >(groups ?? []);\n const groupsState = groups ?? internalGroups;\n const setGroups = useCallback(\n (next: TimelineGroup[]): void => {\n if (groups === undefined) setInternalGroups(next);\n onGroupsChange?.(next);\n },\n [groups, onGroupsChange]\n );\n\n // ── Row layout (variable heights: expanded lanes + group headers) ──\n\n const layout = useMemo(\n () =>\n computeRows(tracks, {\n trackHeight,\n expandedHeight: expandedTrackHeight,\n groupHeaderHeight,\n globalGraph: modeState === 'graph',\n groups: groupsState,\n }),\n [\n tracks,\n trackHeight,\n expandedTrackHeight,\n groupHeaderHeight,\n modeState,\n groupsState,\n ]\n );\n\n // ── Store ──\n\n const store = useMemo(() => new TimelineStore(), []);\n const drag = useSyncExternalStore(store.subscribeDrag, store.getDrag);\n const hover = useSyncExternalStore(store.subscribeHover, store.getHover);\n const hoverPlayhead = useSyncExternalStore(\n store.subscribeHoverPlayhead,\n store.getHoverPlayhead\n );\n const hoverLoop = useSyncExternalStore(\n store.subscribeHoverLoop,\n store.getHoverLoop\n );\n\n useLayoutEffect(() => {\n store.setGeometry({\n view: viewState,\n size,\n trackHeight,\n scrollTop,\n startFrame,\n endFrame,\n fps,\n mode: modeState,\n });\n }, [\n store,\n viewState,\n size,\n trackHeight,\n scrollTop,\n startFrame,\n endFrame,\n fps,\n modeState,\n ]);\n\n useLayoutEffect(() => {\n store.setPlayhead({ frame: frameState, playing: playingState });\n }, [store, frameState, playingState]);\n\n useLayoutEffect(() => {\n store.setSelection(selectionState);\n }, [store, selectionState]);\n\n // ── Seek helpers (snap + clamp) ──\n\n const applyFrame = useCallback(\n (f: number): number => clamp(snapFrame(f, snap), startFrame, endFrame),\n [snap, startFrame, endFrame]\n );\n const seekLive = useCallback(\n (f: number): void => {\n setFrame(applyFrame(f));\n },\n [setFrame, applyFrame]\n );\n // Consumer callbacks live behind refs so the handlers that fire them keep a\n // stable identity even when the parent passes a fresh inline function every\n // render (component-patterns.md rules #3 / #11).\n const onFrameCompleteRef = useLatest(onFrameChangeComplete);\n const seekCommit = useCallback(\n (f: number): void => {\n const v = applyFrame(f);\n setFrame(v);\n onFrameCompleteRef.current?.(v);\n },\n [setFrame, applyFrame, onFrameCompleteRef]\n );\n\n // ── Playback (optional built-in rAF loop) ──\n\n const setFrameRaw = useCallback(\n (f: number): void => {\n setFrame(clamp(f, startFrame, endFrame));\n },\n [setFrame, startFrame, endFrame]\n );\n const handlePlaybackEnd = useCallback((): void => {\n setPlaying(false);\n }, [setPlaying]);\n useTimelinePlayback({\n playing: playingState,\n frame: frameState,\n fps,\n startFrame,\n endFrame,\n loop: loopState,\n onAdvance: setFrameRaw,\n onEnd: handlePlaybackEnd,\n });\n\n // ── Follow-playhead during playback ──\n // `smooth` keeps the playhead centred in the view — the view slides\n // continuously once the playhead reaches the centre (one frame per tick,\n // so visually smooth). `paged` waits until the playhead leaves the view\n // and then jumps forward by a full span (After Effects vs Premiere style).\n // `off` leaves the view alone.\n useLayoutEffect(() => {\n if (!playingState) return;\n const next = nextFollowView(\n followMode,\n viewState,\n frameState,\n startFrame,\n endFrame\n );\n if (next) setView(next);\n }, [\n playingState,\n followMode,\n frameState,\n viewState,\n setView,\n startFrame,\n endFrame,\n ]);\n\n // ── Track-edit helpers ──\n\n // Track-change callbacks behind refs (same rationale as `seekCommit`): the\n // gesture hook + header handlers stay stable while the parent may pass fresh\n // inline `onTracksChange` / `onTracksChangeComplete` each render.\n const onTracksChangeRef = useLatest(onTracksChange);\n const onTracksChangeCompleteRef = useLatest(onTracksChangeComplete);\n const setTracksLive = useCallback(\n (t: TimelineTrack[]): void => {\n onTracksChangeRef.current?.(t);\n },\n [onTracksChangeRef]\n );\n const commitTracks = useCallback(\n (t: TimelineTrack[]): void => {\n onTracksChangeCompleteRef.current?.(t);\n },\n [onTracksChangeCompleteRef]\n );\n const handleReorderTracks = useCallback(\n (next: TimelineTrack[]): void => {\n setTracksLive(next);\n commitTracks(next);\n },\n [setTracksLive, commitTracks]\n );\n const handleToggleTrackExpanded = useCallback(\n (trackId: string): void => {\n const next = tracks.map(t =>\n t.id === trackId ? { ...t, expanded: !t.expanded } : t\n );\n setTracksLive(next);\n commitTracks(next);\n },\n [tracks, setTracksLive, commitTracks]\n );\n const handleToggleGroupCollapsed = useCallback(\n (groupId: string): void => {\n setGroups(\n groupsState.map(g =>\n g.id === groupId ? { ...g, collapsed: !g.collapsed } : g\n )\n );\n },\n [groupsState, setGroups]\n );\n\n // ── View helpers + imperative handle ──\n\n const rangeSpan = Math.max(1, endFrame - startFrame);\n const clampView = useCallback(\n (v: TimelineView): TimelineView => {\n const maxSpan = maxFramesVisible ?? rangeSpan;\n const span = Math.min(\n maxSpan,\n Math.max(minFramesVisible, v.endFrame - v.startFrame)\n );\n const center = (v.startFrame + v.endFrame) / 2;\n return { startFrame: center - span / 2, endFrame: center + span / 2 };\n },\n [minFramesVisible, maxFramesVisible, rangeSpan]\n );\n\n const requestZoomToFit = useCallback(\n (paddingFrames?: number): void => {\n const p = paddingFrames ?? 0;\n setView(\n clampView({ startFrame: startFrame - p, endFrame: endFrame + p })\n );\n },\n [setView, clampView, startFrame, endFrame]\n );\n\n // Live reads for the imperative `zoomToSelection`, kept in refs so the\n // callback (wired into the store handle below) has a stable identity.\n const selectionRef = useLatest(selectionState);\n const tracksRef = useLatest(tracks);\n const requestZoomToSelection = useCallback((): void => {\n const sel = selectionRef.current;\n if (sel.length === 0) return;\n // O(|selection|) walk: index tracks once, look up the keyframe per ref.\n const tracksById = new Map(tracksRef.current.map(t => [t.id, t]));\n let min = Infinity;\n let max = -Infinity;\n for (const ref of sel) {\n const track = tracksById.get(ref.trackId);\n if (!track) continue;\n const kf = track.keyframes.find(k => k.id === ref.keyframeId);\n if (!kf) continue;\n if (kf.x < min) min = kf.x;\n if (kf.x > max) max = kf.x;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return;\n const pad = Math.max(1, (max - min) * 0.1);\n setView(clampView({ startFrame: min - pad, endFrame: max + pad }));\n }, [selectionRef, tracksRef, setView, clampView]);\n\n const requestSetView = useCallback(\n (v: TimelineView): void => {\n setView(clampView(v));\n },\n [setView, clampView]\n );\n\n useLayoutEffect(() => {\n store.configureHandle({\n focus: () => bodyRef.current?.focus(),\n getElement: () => bodyRef.current,\n seek: seekCommit,\n setPlaying,\n setView: requestSetView,\n zoomToFit: requestZoomToFit,\n zoomToSelection: requestZoomToSelection,\n });\n }, [\n store,\n seekCommit,\n setPlaying,\n requestSetView,\n requestZoomToFit,\n requestZoomToSelection,\n ]);\n\n useImperativeHandle(ref, () => store.handle, [store]);\n\n // ── Responsive sizing ──\n\n useResizeObserver(bodyRef, entry => {\n const { width, height: h } = entry.contentRect;\n setSize(prev =>\n prev.width === width && prev.height === h ? prev : { width, height: h }\n );\n });\n\n // ── Vertical scroll ──\n\n const rulerHeight = showRuler ? RULER_HEIGHT : 0;\n const loopStripHeight = loopStrip ? LOOP_STRIP_HEIGHT : 0;\n const chromeHeight = rulerHeight + loopStripHeight;\n const maxScrollTop = Math.max(\n 0,\n layout.contentHeight - (size.height - chromeHeight)\n );\n\n // Clamp the scroll offset when the scrollable area shrinks (content removed\n // or viewport grown). Adjusting state during render is React's documented\n // alternative to a layout effect here — it avoids an extra commit, and the\n // guard makes it self-terminating.\n if (scrollTop > maxScrollTop) {\n setScrollTop(maxScrollTop);\n }\n\n const scrollBy = useCallback(\n (deltaPixels: number): void => {\n setScrollTop(s => clamp(s + deltaPixels, 0, maxScrollTop));\n },\n [maxScrollTop]\n );\n\n // ── Gestures ──\n\n const { handlers, onWheel } = useTimelineGestures({\n containerRef: bodyRef,\n store,\n view: viewState,\n size,\n tracks,\n selection: selectionState,\n frame: frameState,\n startFrame,\n endFrame,\n trackHeight,\n scrollTop,\n rulerHeight,\n loopStripHeight,\n loopHandles,\n snap,\n editable,\n allowAddKeyframe,\n allowDeleteKeyframe,\n showPlayhead,\n rows: layout.rows,\n trackTops: layout.trackTops,\n expandedHeight: expandedTrackHeight,\n groups: groupsState,\n minFramesVisible,\n maxFramesVisible,\n loopRegion,\n maxScrollTop,\n seekLive,\n seekCommit,\n setSelection,\n setTracks: setTracksLive,\n commitTracks: commitTracks,\n setView,\n setLoop,\n scrollBy,\n setGroups,\n });\n\n // Native non-passive wheel listener (React onWheel is passive). Attach to\n // both the track body and the left header column so vertical scrolling works\n // when the cursor is over the track names too. `onWheel` is a stable\n // `useCallback` (it reads live state through a ref), so this effect attaches\n // once and never re-subscribes.\n useEffect(() => {\n const body = bodyRef.current;\n const header = headerColumnRef.current;\n body?.addEventListener('wheel', onWheel, { passive: false });\n header?.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n body?.removeEventListener('wheel', onWheel);\n header?.removeEventListener('wheel', onWheel);\n };\n }, [onWheel]);\n\n // ── Slots + draw ──\n\n const slots = useMemo(() => categorizeChildren(children), [children]);\n // Prop wins; the deprecated `<Timeline.TrackScale />` slot still works.\n const trackScale = trackScaleProp ?? slots.trackScale ?? undefined;\n\n useTimelineDraw({\n canvasRef,\n size,\n view: viewState,\n startFrame,\n endFrame,\n fps,\n frame: frameState,\n rows: layout.rows,\n scrollTop,\n rulerHeight,\n loopStripHeight,\n loopHandles,\n showPlayhead,\n selection: selectionState,\n hover,\n hoverPlayhead,\n marquee: drag.marquee,\n loopRegion,\n loopHover: drag.kind === 'none' ? hoverLoop : null,\n ...(backgroundColor !== undefined ? { backgroundColor } : {}),\n ...(playheadColor !== undefined ? { playheadColor } : {}),\n ...(trackScale ? { trackScale } : {}),\n ...(renderOverlay ? { renderOverlay } : {}),\n ...(formatTime ? { formatTime } : {}),\n });\n\n // ── Layout ──\n\n // Announce the playhead on discrete moves (keyboard / click), but stay quiet\n // during continuous scrub drags and playback so AT isn't flooded.\n const liveMessage =\n drag.kind === 'none' && !playingState\n ? `Playhead at frame ${Math.round(frameState)}`\n : '';\n\n const shellHeight =\n height !== undefined ? `${height}px` : responsive ? '100%' : '240px';\n\n return (\n <TimelineStoreContext.Provider value={store}>\n <div\n className={cx(timelineShellStyle, className)}\n data-testid={testId}\n id={id}\n style={{ height: shellHeight, ...style }}\n >\n {slots.toolbar}\n <div className={timelineMainRowStyle}>\n <TimelineTrackHeaders\n ref={headerColumnRef}\n rows={layout.rows}\n contentHeight={layout.contentHeight}\n tracks={tracks}\n rulerHeight={chromeHeight}\n scrollTop={scrollTop}\n width={trackHeaderWidth}\n selection={selectionState}\n editable={editable}\n renderTrackHeader={renderTrackHeader}\n onReorderTracks={handleReorderTracks}\n onToggleGroupCollapsed={handleToggleGroupCollapsed}\n onToggleTrackExpanded={handleToggleTrackExpanded}\n />\n {/* The timeline body is a labelled group that doubles as an\n interactive canvas surface (focusable, with pointer + key\n handlers driving the gesture model). */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n <div\n ref={bodyRef}\n className={timelineBodyStyle}\n data-dragging={drag.kind !== 'none' || undefined}\n data-hover-target={\n drag.kind !== 'none'\n ? undefined\n : hoverPlayhead\n ? 'playhead'\n : hoverLoop === 'start' || hoverLoop === 'end'\n ? 'loop-edge'\n : hoverLoop === 'body'\n ? 'loop-body'\n : undefined\n }\n role=\"group\"\n aria-label={ariaLabel}\n aria-roledescription=\"Timeline\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- focusable interactive canvas surface\n tabIndex={0}\n onPointerDown={handlers.onPointerDown}\n onPointerMove={handlers.onPointerMove}\n onPointerUp={handlers.onPointerUp}\n onPointerCancel={handlers.onPointerCancel}\n onPointerLeave={handlers.onPointerLeave}\n onDoubleClick={handlers.onDoubleClick}\n onKeyDown={handlers.onKeyDown}\n >\n <canvas ref={canvasRef} className={timelineCanvasStyle} />\n <div className={timelineOverlayLayerStyle}>{slots.overlay}</div>\n <div\n className={ariaLiveRegionStyle}\n aria-live=\"polite\"\n role=\"status\"\n >\n {liveMessage}\n </div>\n </div>\n </div>\n {slots.minimap\n ? React.cloneElement(slots.minimap, {\n setView: requestSetView,\n } as Partial<TimelineMinimapProps>)\n : null}\n {slots.footer}\n </div>\n </TimelineStoreContext.Provider>\n );\n};\n\nTimeline.displayName = 'Timeline';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA;AACA;AAWA;;;AAGA;AAEA;AACE;AACE;AACA;AACA;AACA;AACA;;;;AAIE;AACE;;;;AAIJ;AACA;AAKA;AACE;;;AAGF;;;AASO;;;AASA;AACL;;;AAEA;;AAEJ;AACA;AACF;AAEA;;;;;;;;AAQG;AACI;AACL;AA4DA;AACA;AACA;AAEA;;;;AAUA;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;;;AAQD;AAGA;AACA;;;AAGI;AACF;;;;AAUI;;;AAGA;AACD;;;;;;;AAQF;;AAKH;AACA;AACA;AACA;AAIA;;;AAOI;;;;;;;AAOA;AACD;AACH;;;;;;;;;;AAUC;;AAGC;;;AAIA;AACF;;AAIA;AAIA;AAEI;AACF;;;;AAMF;AACA;AAEI;;AAEA;;;AAOJ;;;AAMA;;AAEA;AACA;AACE;AACA;;;;AAIA;AACA;AACA;AACD;;;;;;;;AASC;;AACA;AAOA;;AACF;;;;;;;;AAQC;;;;;AAOD;AACA;AACA;AAEI;AACF;AAGF;AAEI;AACF;AAGF;;;AAIE;AAGF;AAEI;;;;AAQJ;AAEI;AAKF;;AAMF;AACA;AAEI;;AAKA;AACA;;AAKJ;AAEI;AACA;;;;AASJ;AACA;AACA;AACE;AACA;;;;;AAIA;AACA;;AAEE;;;AAEA;;AACA;AAAgB;AAChB;AAAgB;;AAElB;;AACA;AACA;;AAGF;AAEI;AACF;;;;AAOE;AACA;;AAEA;AACA;AACA;AACD;AACH;;;;;;;AAOC;AAED;;AAIA;;AAEE;AAGF;;;;AAMA;;;;;;AAUA;;;AAIA;AAEI;AACF;;AAMF;AACE;;AAEA;;;AAGA;AACA;;;;;;;;;;;;;;;AAeA;AACA;;;;;;;;AAQA;AACA;;;;;AAKD;;;;;;;AAQC;AACA;AACA;AACA;AACA;AACE;AACA;AACF;AACF;;AAIA;;;AAIA;;;AAGE;;;;AAIA;;;;;;;AAOA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACD;;;;;;;;AAcD;AAmCc;AACA;AACE;AACA;AACE;;AAEE;;;AAOV;;AAsBE;;;AAOd;AAEA;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Timeline.types.js","sources":["../../../../../../src/components/editor/Timeline/Timeline.types.ts"],"sourcesContent":[null],"names":[],"mappings":"AAyGA;AAEA;;;;AAIG;AACI,MAAM,aAAa,GAAkB,MAAM,CAAC,GAAG,CAAC,oBAAoB;;;;"}
|
|
1
|
+
{"version":3,"file":"Timeline.types.js","sources":["src/components/editor/Timeline/Timeline.types.ts"],"sourcesContent":["import type { ViewportSize } from '@/components/primitives/viewport';\nimport type { BaseComponent } from '@/types/common';\nimport type { CurveData, CurveKeyframe } from '@/types/keyframe';\nimport type { Prettify } from '@/types/utilities';\nimport type React from 'react';\n\n// ─── Core model ───\n\n/** Dope sheet (keyframe timing) or graph editor (value curves). */\nexport type TimelineMode = 'dope-sheet' | 'graph';\n\n/** Pre/post-infinity behaviour, reused from the shared curve model. */\nexport type TimelineInfinity = {\n pre?: CurveData['preInfinity'];\n post?: CurveData['postInfinity'];\n};\n\n/**\n * One animated property. Keyframes use the shared `CurveKeyframe` model\n * (`x` = frame, `y` = value); graph mode assembles a `CurveData` per track\n * from `{ keyframes, domainX: [startFrame, endFrame], domainY: valueRange }`.\n */\nexport interface TimelineTrack {\n id: string;\n /** Display label in the header column. */\n label?: string;\n /** Keyframe / lane accent color (theme accent fallback). */\n color?: string;\n /** Keyframes — `x` is a frame, `y` is the value at that frame. */\n keyframes: CurveKeyframe[];\n /** Value range (graph-mode domainY). Auto-fit from keyframes when omitted. */\n valueRange?: [number, number];\n /** Pre/post-infinity behaviour for graph mode. */\n infinity?: TimelineInfinity;\n /** Visible but not editable. */\n locked?: boolean;\n /** Collapsed / not drawn. */\n hidden?: boolean;\n /** Expand this track into a graph (curve) lane regardless of the global mode. */\n expanded?: boolean;\n /** Group this track belongs to (matches a `TimelineGroup.id`). */\n groupId?: string;\n /** Row-height override (CSS px). */\n height?: number;\n}\n\n/** A collapsible group of tracks (matched by `TimelineTrack.groupId`). */\nexport interface TimelineGroup {\n id: string;\n label?: string;\n color?: string;\n collapsed?: boolean;\n}\n\n/** A reference to one keyframe on one track. */\nexport interface TimelineKeyframeRef {\n trackId: string;\n keyframeId: string;\n}\n\n/** Current keyframe selection, flat across tracks. */\nexport type TimelineSelection = ReadonlyArray<TimelineKeyframeRef>;\n\n/** The visible frame window (zoom/pan over time). */\nexport interface TimelineView {\n startFrame: number;\n endFrame: number;\n}\n\n/** A loop sub-range, or `true` for the whole timeline range. */\nexport type TimelineLoop = boolean | { startFrame: number; endFrame: number };\n\n// ─── Render info ───\n\n/**\n * Helpers + current state passed to `renderOverlay`. Exposes the same\n * frame ↔ pixel math the built-in drawing uses, so consumer drawing stays\n * aligned with everything else.\n */\nexport interface TimelineDrawInfo {\n /** Track-area size in CSS pixels (canvas already DPR-scaled). */\n size: ViewportSize;\n /** Visible frame window. */\n view: TimelineView;\n /** Global frame range. */\n startFrame: number;\n endFrame: number;\n /** Frames per second. */\n fps: number;\n /** Current playhead frame. */\n frame: number;\n /** Map a frame to a track-area CSS-pixel X. */\n frameToX: (frame: number) => number;\n /** Inverse of `frameToX`. */\n xToFrame: (x: number) => number;\n}\n\n/** State passed to the `renderTrackHeader` render prop. */\nexport interface TimelineTrackHeaderInfo {\n /** Row index of the track. */\n index: number;\n /** Whether any of this track's keyframes are currently selected. */\n hasSelection: boolean;\n}\n\n// ─── Slot markers ───\n\n/**\n * Symbol attached to `Timeline.Toolbar` / `.Footer` so the parent\n * `<Timeline>` can identify slot children without relying on `displayName`\n * (clobbered by `React.memo` / Vanilla Extract recipes).\n */\nexport const TIMELINE_SLOT: unique symbol = Symbol.for('etui.timeline.slot');\n\nexport type TimelineSlotKind = 'toolbar' | 'footer' | 'minimap' | 'track-scale';\n\nexport interface TimelineSlotMarker {\n [TIMELINE_SLOT]: TimelineSlotKind;\n}\n\n// ─── Imperative handle ───\n\n/**\n * Imperative handle exposed via `ref` on `<Timeline>`. Stable for the\n * lifetime of the component.\n */\nexport interface TimelineHandle {\n /** Focus the timeline body so keyboard navigation starts working. */\n focus(): void;\n /** Access the underlying body DOM element. */\n getElement(): HTMLDivElement | null;\n /** Move the playhead to a frame (snapped + clamped). */\n seek(frame: number): void;\n /** Start playback. */\n play(): void;\n /** Pause playback. */\n pause(): void;\n /** Toggle playback. */\n toggle(): void;\n /** Current playhead frame. */\n getFrame(): number;\n /** Fit the view to the whole frame range, with optional padding (frames). */\n zoomToFit(paddingFrames?: number): void;\n /** Fit the view to the current selection. No-op when nothing is selected. */\n zoomToSelection(): void;\n /** Current visible frame window. */\n getView(): TimelineView;\n /** Set the visible frame window (clamped to bounds + minFramesVisible). */\n setView(view: TimelineView): void;\n /** Map a frame to a track-area CSS-pixel X. */\n frameToX(frame: number): number;\n /** Inverse of `frameToX`. */\n xToFrame(x: number): number;\n}\n\n// ─── Props ───\n\nexport interface TimelineBaseProps extends Omit<\n BaseComponent,\n 'onChange' | 'ref'\n> {\n /** Tracks rendered top-to-bottom. */\n tracks: ReadonlyArray<TimelineTrack>;\n /** Fires continuously during keyframe drag. */\n onTracksChange?: (tracks: TimelineTrack[]) => void;\n /** Fires once on commit (drag end, add, delete) — use for undo integration. */\n onTracksChangeComplete?: (tracks: TimelineTrack[]) => void;\n\n /** First frame of the global range. @default 0 */\n startFrame?: number;\n /** Last frame of the global range (the duration). */\n endFrame: number;\n /** Frames per second — drives timecode display + the snap grid. @default 30 */\n fps?: number;\n\n /** Playhead frame (controlled). */\n frame?: number;\n /** Initial playhead frame (uncontrolled). @default startFrame */\n defaultFrame?: number;\n /** Fires continuously while scrubbing. */\n onFrameChange?: (frame: number) => void;\n /** Fires once on scrub end. */\n onFrameChangeComplete?: (frame: number) => void;\n\n /** Visible frame window (controlled). */\n view?: TimelineView;\n /** Initial visible frame window (uncontrolled). @default whole range */\n defaultView?: TimelineView;\n /** Fires when the view zooms/pans. */\n onViewChange?: (view: TimelineView) => void;\n /** Minimum frames visible (max zoom-in). @default 1 */\n minFramesVisible?: number;\n /** Maximum frames visible (max zoom-out). @default range span */\n maxFramesVisible?: number;\n\n /** Keyframe selection (controlled). */\n selection?: TimelineSelection;\n /** Initial selection (uncontrolled). @default [] */\n defaultSelection?: TimelineSelection;\n /** Fires when the selection changes. */\n onSelectionChange?: (selection: TimelineSelection) => void;\n\n /** Master editing switch. @default true */\n editable?: boolean;\n /** Allow double-click to add keyframes. @default true */\n allowAddKeyframe?: boolean;\n /** Allow Delete/Backspace to remove keyframes. @default true */\n allowDeleteKeyframe?: boolean;\n /** Snap-to-frame: `true` = 1 frame, number = N-frame grid, `false` = off. @default true */\n snap?: boolean | number;\n\n /** Editor mode (controlled). */\n mode?: TimelineMode;\n /** Initial mode (uncontrolled). @default 'dope-sheet' */\n defaultMode?: TimelineMode;\n /** Fires when the mode toggles. */\n onModeChange?: (mode: TimelineMode) => void;\n\n /** Playback running (controlled). */\n playing?: boolean;\n /** Initial playback state (uncontrolled). @default false */\n defaultPlaying?: boolean;\n /** Fires when playback starts/stops. */\n onPlayingChange?: (playing: boolean) => void;\n /** Loop the whole range (`true`) or a sub-range (controlled). @default false */\n loop?: TimelineLoop;\n /** Initial loop (uncontrolled). */\n defaultLoop?: TimelineLoop;\n /** Fires when the loop region is dragged on the ruler. */\n onLoopChange?: (loop: TimelineLoop) => void;\n /**\n * How the view tracks the playhead during playback.\n * - `'smooth'` — keep the playhead centred in the view; the view slides\n * continuously once the playhead reaches the centre.\n * - `'paged'` — leave the view still until the playhead leaves it, then\n * jump forward by one full view span.\n * - `'off'` — never auto-scroll; user manages the view.\n * @default 'smooth'\n */\n followMode?: 'smooth' | 'paged' | 'off';\n\n /**\n * Adds a thin dedicated **loop strip** directly under the time ruler. A\n * plain drag on the strip creates / re-draws the loop region (no Alt\n * needed); the strip also makes loop edges easier to grab. The main ruler\n * keeps its scrub behaviour. @default false\n */\n loopStrip?: boolean;\n\n /**\n * Visual style for the loop region's edge markers.\n * - `'edges'` — full-height vertical bars on each loop edge (default).\n * - `'brackets'` — `[ ]` bracket markers in the chrome (ruler / loop\n * strip) with serifs at the top and bottom, no full-height bars. Bigger\n * pick targets, less visual noise across the track area.\n * @default 'edges'\n */\n loopHandles?: 'edges' | 'brackets';\n\n /** Track groups (collapsible). Tracks join a group via `groupId`. */\n groups?: ReadonlyArray<TimelineGroup>;\n /** Fires when a group is collapsed / expanded via its header. */\n onGroupsChange?: (groups: TimelineGroup[]) => void;\n\n /** Default row height in CSS px. @default 28 */\n trackHeight?: number;\n /** Row height for a graph-expanded track in CSS px. @default 96 */\n expandedTrackHeight?: number;\n /** Group header row height in CSS px. @default 22 */\n groupHeaderHeight?: number;\n /** Show the time ruler. @default true */\n showRuler?: boolean;\n /** Show the playhead. @default true */\n showPlayhead?: boolean;\n /** Width of the left track-header column in CSS px. @default 160 */\n trackHeaderWidth?: number;\n /** Fill the parent container (ResizeObserver). @default true */\n responsive?: boolean;\n /** Fixed height in CSS px (ignored when `responsive`). */\n height?: number;\n\n /** Playhead line color. Defaults to theme accent. */\n playheadColor?: string;\n /** Background color. Defaults to theme `--etui-color-bg-secondary`. */\n backgroundColor?: string;\n\n /**\n * Per-track value scale on graph / expanded-track lanes (axis line + min/max\n * labels, optional midpoint + gridlines). Omit to hide the scale entirely.\n */\n trackScale?: TimelineTrackScaleProps;\n\n /** Custom canvas pass, drawn after built-in content, before the playhead. */\n renderOverlay?: (\n ctx: CanvasRenderingContext2D,\n info: TimelineDrawInfo\n ) => void;\n /** Custom track-header renderer. Falls back to a built-in header. */\n renderTrackHeader?: (\n track: TimelineTrack,\n info: TimelineTrackHeaderInfo\n ) => React.ReactNode;\n /** Ruler label formatter. Defaults to `HH:MM:SS:FF` timecode. */\n formatTime?: (frame: number, fps: number) => string;\n\n /** @default 'Timeline' */\n ariaLabel?: string;\n\n /**\n * Slot children: `<Timeline.Toolbar>`, `<Timeline.Footer>`. Unrecognised\n * children render as a free-form overlay layer.\n */\n children?: React.ReactNode;\n\n /** Imperative handle. */\n ref?: React.Ref<TimelineHandle>;\n}\n\nexport type TimelineProps = Prettify<TimelineBaseProps>;\n\n// ─── Subcomponent props ───\n\nexport interface TimelineToolbarProps {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport interface TimelineFooterProps {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport interface TimelineTrackScaleProps {\n /**\n * Which side of the lane the scale axis is drawn on.\n * @default 'start'\n */\n position?: 'start' | 'end';\n /**\n * Custom value formatter. Receives the raw value and returns the label.\n * @default `(v) => Number(v.toFixed(2)).toString()`\n */\n format?: (value: number) => string;\n /**\n * Draw a tick + label at the midpoint of the range too. @default false\n */\n showMidpoint?: boolean;\n /**\n * Draw thin horizontal gridlines across the whole lane width at each tick\n * (`min` / `max`, plus midpoint when `showMidpoint` is on). @default false\n */\n gridlines?: boolean;\n /**\n * Lanes shorter than this (CSS px) skip the scale, so the labels never\n * overlap into an unreadable blob on a short / collapsed graph lane.\n * @default 48\n */\n minLaneHeight?: number;\n /**\n * Override the axis / label color. Defaults to the muted text colour.\n */\n color?: string;\n}\n\nexport interface TimelineMinimapProps {\n /**\n * Tracks to summarize as keyframe markers in the minimap.\n * Pass the same array you pass to `<Timeline tracks={...} />`.\n */\n tracks: ReadonlyArray<TimelineTrack>;\n /** Strip height in CSS px. @default 40 */\n height?: number;\n /** Override the keyframe marker color. */\n markerColor?: string;\n /** Override the viewport rectangle color. */\n viewportColor?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Context value ───\n\n/**\n * Live state available to children of a `<Timeline>` via\n * `useTimelineContext()`. Prefer the per-slice hooks for perf-conscious\n * consumers — each subscribes to a single slice.\n */\nexport interface TimelineContextValue {\n view: TimelineView;\n size: ViewportSize;\n startFrame: number;\n endFrame: number;\n fps: number;\n frame: number;\n playing: boolean;\n mode: TimelineMode;\n selection: TimelineSelection;\n frameToX: (frame: number) => number;\n xToFrame: (x: number) => number;\n}\n"],"names":[],"mappings":"AAyGA;AAEA;;;;AAIG;AACI,MAAM,aAAa,GAAkB,MAAM,CAAC,GAAG,CAAC,oBAAoB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineContext.js","sources":["
|
|
1
|
+
{"version":3,"file":"TimelineContext.js","sources":["src/components/editor/Timeline/TimelineContext.ts"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useSyncExternalStore,\n} from 'react';\n\nimport { selectedTangentMode, setSelectedTangentMode } from './timelineEdits';\n\nimport type {\n TimelineContextValue,\n TimelineSelection,\n TimelineTrack,\n} from './Timeline.types';\nimport type {\n TimelineGeometryState,\n TimelinePlayheadState,\n TimelineStore,\n} from './TimelineStore';\nimport type { TangentMode } from '@/types/keyframe';\n\nexport const TimelineStoreContext = createContext<TimelineStore | null>(null);\n\nfunction useTimelineStoreInternal(): TimelineStore {\n const store = useContext(TimelineStoreContext);\n if (!store) {\n throw new Error(\n 'useTimeline* hooks must be called inside a <Timeline> component'\n );\n }\n return store;\n}\n\n/**\n * Subscribe to **all** Timeline state. Convenient catch-all but re-renders on\n * every store mutation. For perf-sensitive consumers, prefer the slice hooks\n * (`useTimelineGeometry`, `useTimelinePlayhead`, `useTimelineSelection`).\n */\nexport function useTimelineContext(): TimelineContextValue {\n const store = useTimelineStoreInternal();\n return useSyncExternalStore(store.subscribe, store.getSnapshot);\n}\n\n/** Subscribe to the geometry slice (view / sizes / range / mode). */\nexport function useTimelineGeometry(): TimelineGeometryState {\n const store = useTimelineStoreInternal();\n return useSyncExternalStore(store.subscribeGeometry, store.getGeometry);\n}\n\n/** Subscribe to the playhead slice (frame / playing). */\nexport function useTimelinePlayhead(): TimelinePlayheadState {\n const store = useTimelineStoreInternal();\n return useSyncExternalStore(store.subscribePlayhead, store.getPlayhead);\n}\n\n/** Subscribe to the selection slice. */\nexport function useTimelineSelection(): TimelineSelection {\n const store = useTimelineStoreInternal();\n return useSyncExternalStore(store.subscribeSelection, store.getSelection);\n}\n\nexport interface TimelineSelectedTangentMode {\n /**\n * The tangent mode shared by all selected keyframes; `'mixed'` if they\n * disagree; `null` when nothing applicable is selected.\n */\n current: TangentMode | 'mixed' | null;\n /** Apply a tangent mode to every selected keyframe. */\n set: (mode: TangentMode) => void;\n}\n\n/**\n * Convenience hook for building a tangent-mode toggle UI (the six modes:\n * `auto` / `linear` / `step` / `aligned` / `mirrored` / `free`). Reads the\n * current selection from the Timeline store, exposes the unified mode (or\n * `'mixed'`), and applies a chosen mode to every selected keyframe via the\n * caller's `onTracksChange`.\n *\n * @example\n * ```tsx\n * function TangentBar({ tracks, onTracksChange }) {\n * const t = useTimelineSelectedTangentMode(tracks, onTracksChange);\n * if (t.current === null) return null;\n * return (\n * <>\n * <button onClick={() => t.set('auto')} aria-pressed={t.current === 'auto'}>auto</button>\n * <button onClick={() => t.set('aligned')} aria-pressed={t.current === 'aligned'}>aligned</button>\n * …\n * </>\n * );\n * }\n * ```\n */\nexport function useTimelineSelectedTangentMode(\n tracks: ReadonlyArray<TimelineTrack>,\n onTracksChange: (next: TimelineTrack[]) => void\n): TimelineSelectedTangentMode {\n const selection = useTimelineSelection();\n const current = useMemo(\n () => selectedTangentMode(tracks, selection),\n [tracks, selection]\n );\n const set = useCallback(\n (mode: TangentMode): void => {\n onTracksChange(setSelectedTangentMode(tracks, selection, mode));\n },\n [tracks, selection, onTracksChange]\n );\n return { current, set };\n}\n"],"names":[],"mappings":";;;;;AA0BA;AACE;;AAEE;;AAIF;AACF;AAEA;;;;AAIG;;AAED;;AAEF;AAEA;;AAEE;;AAEF;AAEA;;AAEE;;AAEF;AAEA;;AAEE;;AAEF;AAYA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACG;AAIJ;;AAKA;;;AAMA;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineFooter.js","sources":["
|
|
1
|
+
{"version":3,"file":"TimelineFooter.js","sources":["src/components/editor/Timeline/TimelineFooter.tsx"],"sourcesContent":["import { TIMELINE_SLOT } from './Timeline.types';\n\nimport type { TimelineFooterProps } from './Timeline.types';\n\n/**\n * Footer strip rendered below the timeline body (status bar — selected\n * keyframe info, current frame / timecode). Picked out of `<Timeline>`\n * children by the `TIMELINE_SLOT` symbol — its position in the child tree\n * does not affect placement.\n */\nconst TimelineFooterImpl: (props: TimelineFooterProps) => null = () => null;\n\nexport const TimelineFooter = Object.assign(TimelineFooterImpl, {\n displayName: 'Timeline.Footer',\n [TIMELINE_SLOT]: 'footer' as const,\n});\n"],"names":[],"mappings":";;AAIA;;;;;AAKG;AACH,MAAM,kBAAkB,GAAyC,MAAM,IAAI;MAE9D,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE;AAC9D,IAAA,WAAW,EAAE,iBAAiB;IAC9B,CAAC,aAAa,GAAG,QAAiB;AACnC,CAAA;;;;"}
|
|
@@ -7,7 +7,7 @@ import { useResizeObserver } from '../../../hooks/useResizeObserver/useResizeObs
|
|
|
7
7
|
import '../../../hooks/useBreakpoint/useBreakpoint.js';
|
|
8
8
|
import { vars } from '../../../theme/contract.css.js';
|
|
9
9
|
import './../../../assets/src/theme/lightTheme.css.ts.vanilla-Ct6f9Iym.css';
|
|
10
|
-
import '
|
|
10
|
+
import '@vanilla-extract/css';
|
|
11
11
|
import './../../../assets/src/theme/darkTheme.css.ts.vanilla-BHZ3ecRn.css';
|
|
12
12
|
import './../../../assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css';
|
|
13
13
|
import '../../../hooks/useNavigationHistory/useNavigationHistory.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineMinimap.js","sources":["../../../../../../src/components/editor/Timeline/TimelineMinimap.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AA4BA;;;;;;AAMG;AACH;AACE;;;AAYA;AACA;AACA;AACA;;AAGA;;AAIA;AAEA;;;;;;;AAYA;AAEA;AACE;AACA;AACE;AACA;;;AAEA;;;;AAIA;AAEA;AACA;AACA;AACE;AACA;;AAEF;AAEA;AACA;AACA;AAEA;;AAIA;;;AAIA;AACA;AACA;;;AAEE;;AAEE;;;AAGJ;;AAGA;;;AAIA;AACA;;AAEA;AACA;AACA;;;;AAKA;;AAEA;AACA;;;;AAMA;AACA;;AAEA;AACA;;;AAIA;;AAEF;AACF;;;;AAIE;;;AAGA;;;;AAID;;AAGC;AACA;AACE;AACF;AACF;;;AAMA;AAMA;AACA;AAEI;;AACA;AAKA;AACF;AAIF;AAEI;;;AAEF;AAIF;AAMA;AAEI;;AACA;AACA;;AACA;;AAEA;;AAEA;;;;;;;;AAQI;AACA;;;;;;;AAOA;AACA;;;;AAIJ;;;;AAKI;AACA;;;;;;AAKA;AACA;;AAEF;;AAEJ;;;;;;;AAQC;AAGH;AAEI;AACA;;AACA;AACA;;AACA;;AAEA;AACA;AACE;AACE;;AAEF;AACE;;;AAGA;AAKA;AACE;AACA;AACD;;;;AAID;AAKA;AACE;AACA;AACD;;;;AAIP;;;;;AAME;AACA;;;AAGD;AAGH;AACE;AACA;;AACA;;AAEE;;AAEF;;;;;;AAMA;;AAIE;AACF;AACA;AACA;AACE;AACF;AACF;;AAOA;AAkBF;;AAGE;;AAED;;"}
|
|
1
|
+
{"version":3,"file":"TimelineMinimap.js","sources":["src/components/editor/Timeline/TimelineMinimap.tsx"],"sourcesContent":["'use client';\n\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { resolveVarValue } from '@/components/primitives/canvas/canvasTheme';\nimport { useResizeObserver } from '@/hooks';\nimport { vars } from '@/theme/contract.css';\nimport { cx } from '@/utils/cx';\n\nimport { timelineMinimapStyle } from './Timeline.css';\nimport { TIMELINE_SLOT } from './Timeline.types';\nimport { useTimelineGeometry, useTimelinePlayhead } from './TimelineContext';\nimport { clamp } from './timelineCoords';\n\nimport type { TimelineMinimapProps, TimelineView } from './Timeline.types';\n\ninterface InternalProps extends TimelineMinimapProps {\n /** Wired by the Timeline parent via the slot mechanism. */\n setView?: (view: TimelineView) => void;\n}\n\n/**\n * Compact overview strip showing the full frame range, the current viewport\n * rectangle (draggable), the playhead, and small dots for every keyframe.\n * Picked out of `<Timeline>` children by the `TIMELINE_SLOT` symbol — its\n * position in the child tree does not affect placement (always rendered below\n * the track area).\n */\nfunction TimelineMinimapImpl(props: InternalProps): React.ReactElement {\n const {\n tracks,\n height = 40,\n markerColor,\n viewportColor,\n className,\n style,\n setView,\n } = props;\n\n // Subscribe only to the slices the minimap actually reads — selection,\n // hover, drag and mode changes do not invalidate this strip.\n const geometry = useTimelineGeometry();\n const playhead = useTimelinePlayhead();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState(0);\n\n useResizeObserver(containerRef, entry => {\n setWidth(w =>\n w === entry.contentRect.width ? w : entry.contentRect.width\n );\n });\n\n const range = Math.max(1, geometry.endFrame - geometry.startFrame);\n const pxToFrame = useCallback(\n (px: number): number =>\n geometry.startFrame + (clamp(px, 0, width) / Math.max(1, width)) * range,\n [geometry.startFrame, range, width]\n );\n\n // ── Render ──\n // Canonical canvas template (component-patterns.md rule #7): the whole draw\n // body lives inside `scheduleDraw`, closing over its reactive inputs and\n // listing them in deps. Theme colors are resolved per-frame (never cached in\n // state). The layout effect just depends on `scheduleDraw`.\n const rafRef = useRef<number>(0);\n\n const scheduleDraw = useCallback((): void => {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const renderCtx = canvas.getContext('2d');\n if (!renderCtx) return;\n\n const w = Math.max(1, width);\n const h = Math.max(1, height);\n const dpr =\n typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n const targetW = Math.max(1, Math.round(w * dpr));\n const targetH = Math.max(1, Math.round(h * dpr));\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW;\n canvas.height = targetH;\n }\n renderCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\n const bg = resolveVarValue(canvas, vars.colors.background.inset);\n const border = resolveVarValue(canvas, vars.colors.border.default);\n const marker =\n markerColor ?? resolveVarValue(canvas, vars.colors.accent.secondary);\n const accent =\n viewportColor ?? resolveVarValue(canvas, vars.colors.accent.primary);\n\n renderCtx.clearRect(0, 0, w, h);\n renderCtx.fillStyle = bg;\n renderCtx.fillRect(0, 0, w, h);\n\n // Keyframe markers (small vertical ticks)\n renderCtx.fillStyle = marker;\n renderCtx.globalAlpha = 0.6;\n for (const track of tracks) {\n if (track.hidden) continue;\n for (const kf of track.keyframes) {\n const x = Math.round(((kf.x - geometry.startFrame) / range) * w);\n renderCtx.fillRect(x, h * 0.25, 1, h * 0.5);\n }\n }\n renderCtx.globalAlpha = 1;\n\n // Viewport rectangle\n const vx = ((geometry.view.startFrame - geometry.startFrame) / range) * w;\n const vw =\n ((geometry.view.endFrame - geometry.view.startFrame) / range) * w;\n renderCtx.save();\n renderCtx.fillStyle = accent;\n renderCtx.globalAlpha = 0.16;\n renderCtx.fillRect(vx, 0, vw, h);\n renderCtx.globalAlpha = 1;\n renderCtx.strokeStyle = accent;\n renderCtx.lineWidth = 1;\n renderCtx.strokeRect(vx + 0.5, 0.5, Math.max(0, vw - 1), h - 1);\n\n // Edge \"grippers\" — small filled bars centred vertically on each edge\n // hint that the viewport rectangle is resizable (zoom).\n const gripH = Math.max(6, h * 0.4);\n const gripY = (h - gripH) / 2;\n renderCtx.fillRect(vx - 1, gripY, 2, gripH);\n renderCtx.fillRect(vx + vw - 1, gripY, 2, gripH);\n renderCtx.restore();\n\n // Playhead\n const px =\n Math.round(((playhead.frame - geometry.startFrame) / range) * w) + 0.5;\n renderCtx.strokeStyle = accent;\n renderCtx.lineWidth = 1;\n renderCtx.beginPath();\n renderCtx.moveTo(px, 0);\n renderCtx.lineTo(px, h);\n renderCtx.stroke();\n\n // Top + bottom borders\n renderCtx.fillStyle = border;\n renderCtx.fillRect(0, 0, w, 1);\n });\n }, [\n width,\n height,\n range,\n geometry.startFrame,\n geometry.view.startFrame,\n geometry.view.endFrame,\n playhead.frame,\n tracks,\n markerColor,\n viewportColor,\n ]);\n\n useLayoutEffect(() => {\n scheduleDraw();\n return () => {\n cancelAnimationFrame(rafRef.current);\n };\n }, [scheduleDraw]);\n\n // ── Interactions: drag viewport, resize edges, click outside to center ──\n\n const EDGE_PICK_PX = 6;\n\n const dragRef = useRef<{\n pointerId: number;\n mode: 'move' | 'jump' | 'resize-start' | 'resize-end';\n grabOffset: number;\n } | null>(null);\n\n const span = geometry.view.endFrame - geometry.view.startFrame;\n const setViewSpan = useCallback(\n (start: number): void => {\n if (!setView) return;\n const clamped = clamp(\n start,\n geometry.startFrame,\n geometry.endFrame - span\n );\n setView({ startFrame: clamped, endFrame: clamped + span });\n },\n [setView, geometry.startFrame, geometry.endFrame, span]\n );\n\n const setViewRaw = useCallback(\n (next: TimelineView): void => {\n if (!setView) return;\n setView(next);\n },\n [setView]\n );\n\n const frameToPx = useCallback(\n (frame: number): number =>\n ((frame - geometry.startFrame) / range) * Math.max(1, width),\n [geometry.startFrame, range, width]\n );\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>): void => {\n if (e.button !== 0) return;\n const container = containerRef.current;\n if (!container) return;\n const rect = container.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const frame = pxToFrame(x);\n e.preventDefault();\n container.setPointerCapture(e.pointerId);\n const startPx = frameToPx(geometry.view.startFrame);\n const endPx = frameToPx(geometry.view.endFrame);\n // Edge-resize takes priority: lets the user zoom by dragging the\n // viewport rect's left or right edge.\n if (Math.abs(x - startPx) <= EDGE_PICK_PX) {\n dragRef.current = {\n pointerId: e.pointerId,\n mode: 'resize-start',\n grabOffset: 0,\n };\n return;\n }\n if (Math.abs(x - endPx) <= EDGE_PICK_PX) {\n dragRef.current = {\n pointerId: e.pointerId,\n mode: 'resize-end',\n grabOffset: 0,\n };\n return;\n }\n const inside =\n frame >= geometry.view.startFrame && frame <= geometry.view.endFrame;\n if (inside) {\n dragRef.current = {\n pointerId: e.pointerId,\n mode: 'move',\n grabOffset: frame - geometry.view.startFrame,\n };\n } else {\n dragRef.current = {\n pointerId: e.pointerId,\n mode: 'jump',\n grabOffset: 0,\n };\n setViewSpan(frame - span / 2);\n }\n },\n [\n pxToFrame,\n frameToPx,\n geometry.view.startFrame,\n geometry.view.endFrame,\n setViewSpan,\n span,\n ]\n );\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>): void => {\n const drag = dragRef.current;\n if (drag?.pointerId !== e.pointerId) return;\n const container = containerRef.current;\n if (!container) return;\n const rect = container.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const frame = pxToFrame(x);\n switch (drag.mode) {\n case 'move':\n setViewSpan(frame - drag.grabOffset);\n break;\n case 'jump':\n setViewSpan(frame - span / 2);\n break;\n case 'resize-start': {\n const newStart = clamp(\n frame,\n geometry.startFrame,\n geometry.view.endFrame - 1\n );\n setViewRaw({\n startFrame: newStart,\n endFrame: geometry.view.endFrame,\n });\n break;\n }\n case 'resize-end': {\n const newEnd = clamp(\n frame,\n geometry.view.startFrame + 1,\n geometry.endFrame\n );\n setViewRaw({\n startFrame: geometry.view.startFrame,\n endFrame: newEnd,\n });\n break;\n }\n }\n },\n [\n pxToFrame,\n setViewSpan,\n setViewRaw,\n span,\n geometry.startFrame,\n geometry.endFrame,\n geometry.view.startFrame,\n geometry.view.endFrame,\n ]\n );\n\n const endDrag = useCallback((e: React.PointerEvent<HTMLDivElement>): void => {\n const drag = dragRef.current;\n if (drag?.pointerId !== e.pointerId) return;\n const container = containerRef.current;\n if (container?.hasPointerCapture(e.pointerId)) {\n container.releasePointerCapture(e.pointerId);\n }\n dragRef.current = null;\n }, []);\n\n // Redraw when DPR changes\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia(\n `(resolution: ${window.devicePixelRatio}dppx)`\n );\n const handler = (): void => {\n scheduleDraw();\n };\n mq.addEventListener('change', handler);\n return () => {\n mq.removeEventListener('change', handler);\n };\n }, [scheduleDraw]);\n\n const wrapperStyle = useMemo<React.CSSProperties>(\n () => ({ height, ...style }),\n [height, style]\n );\n\n return (\n <div\n ref={containerRef}\n className={cx(timelineMinimapStyle, className)}\n style={wrapperStyle}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n role=\"region\"\n aria-label=\"Timeline overview\"\n >\n <canvas\n ref={canvasRef}\n style={{ width: '100%', height: '100%', display: 'block' }}\n />\n </div>\n );\n}\n\nexport const TimelineMinimap = Object.assign(TimelineMinimapImpl, {\n displayName: 'Timeline.Minimap',\n [TIMELINE_SLOT]: 'minimap' as const,\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AA4BA;;;;;;AAMG;AACH;AACE;;;AAYA;AACA;AACA;AACA;;AAGA;;AAIA;AAEA;;;;;;;AAYA;AAEA;AACE;AACA;AACE;AACA;;;AAEA;;;;AAIA;AAEA;AACA;AACA;AACE;AACA;;AAEF;AAEA;AACA;AACA;AAEA;;AAIA;;;AAIA;AACA;AACA;;;AAEE;;AAEE;;;AAGJ;;AAGA;;;AAIA;AACA;;AAEA;AACA;AACA;;;;AAKA;;AAEA;AACA;;;;AAMA;AACA;;AAEA;AACA;;;AAIA;;AAEF;AACF;;;;AAIE;;;AAGA;;;;AAID;;AAGC;AACA;AACE;AACF;AACF;;;AAMA;AAMA;AACA;AAEI;;AACA;AAKA;AACF;AAIF;AAEI;;;AAEF;AAIF;AAMA;AAEI;;AACA;AACA;;AACA;;AAEA;;AAEA;;;;;;;;AAQI;AACA;;;;;;;AAOA;AACA;;;;AAIJ;;;;AAKI;AACA;;;;;;AAKA;AACA;;AAEF;;AAEJ;;;;;;;AAQC;AAGH;AAEI;AACA;;AACA;AACA;;AACA;;AAEA;AACA;AACE;AACE;;AAEF;AACE;;;AAGA;AAKA;AACE;AACA;AACD;;;;AAID;AAKA;AACE;AACA;AACD;;;;AAIP;;;;;AAME;AACA;;;AAGD;AAGH;AACE;AACA;;AACA;;AAEE;;AAEF;;;;;;AAMA;;AAIE;AACF;AACA;AACA;AACE;AACF;AACF;;AAOA;AAkBF;;AAGE;;AAED;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineStore.js","sources":["../../../../../../src/components/editor/Timeline/TimelineStore.ts"],"sourcesContent":[null],"names":["frameToXFn","xToFrameFn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TimelineStore.js","sources":["src/components/editor/Timeline/TimelineStore.ts"],"sourcesContent":["import {\n frameToX as frameToXFn,\n xToFrame as xToFrameFn,\n} from './timelineCoords';\nimport { selectionKey } from './timelineSelection';\n\nimport type {\n TimelineContextValue,\n TimelineHandle,\n TimelineKeyframeRef,\n TimelineMode,\n TimelineSelection,\n TimelineView,\n} from './Timeline.types';\nimport type { ViewportSize } from '@/components/primitives/viewport';\n\nconst ZERO_SIZE: ViewportSize = { width: 0, height: 0 };\nconst DEFAULT_VIEW: TimelineView = { startFrame: 0, endFrame: 1 };\n\n/** Snapshot of the geometry slice — everything needed to position content. */\nexport interface TimelineGeometryState {\n /** Visible frame window. */\n view: TimelineView;\n /** Track-area size in CSS px (excludes the header column). */\n size: ViewportSize;\n /** Uniform row height in CSS px. */\n trackHeight: number;\n /** Vertical scroll offset of the track stack. */\n scrollTop: number;\n /** Global frame range. */\n startFrame: number;\n endFrame: number;\n /** Frames per second. */\n fps: number;\n /** Editor mode. */\n mode: TimelineMode;\n}\n\n/** Snapshot of the playhead slice. */\nexport interface TimelinePlayheadState {\n frame: number;\n playing: boolean;\n}\n\n/** The active pointer gesture. */\nexport type TimelineDragKind = 'none' | 'scrub' | 'move' | 'marquee' | 'pan';\n\n/** Which part of the loop region the pointer is hovering (for highlight + cursor). */\nexport type TimelineLoopHover = 'start' | 'end' | 'body' | null;\n\n/** Snapshot of the drag slice — active gesture + optional marquee rectangle. */\nexport interface TimelineDragState {\n kind: TimelineDragKind;\n /** Marquee rectangle in track-area CSS px (box-select), or null. */\n marquee: { x: number; y: number; width: number; height: number } | null;\n}\n\n/**\n * Callbacks the component wires (via `configureHandle`) so the imperative\n * handle and gestures can request state changes. The component owns the\n * controlled/uncontrolled props and fires the public `on*` callbacks.\n */\nexport interface TimelineRequestHandlers {\n focus: () => void;\n getElement: () => HTMLDivElement | null;\n seek: (frame: number) => void;\n setPlaying: (playing: boolean) => void;\n setView: (view: TimelineView) => void;\n zoomToFit: (paddingFrames?: number) => void;\n zoomToSelection: () => void;\n}\n\n/**\n * Single source of truth for Timeline runtime state — geometry, playhead,\n * selection. Designed for `useSyncExternalStore`: each slice has its own\n * subscribe/get pair so subscribers re-render only when their slice changes.\n * Controlled props are mirrored into the store by the component before paint.\n */\nexport class TimelineStore {\n private geometry: TimelineGeometryState = {\n view: DEFAULT_VIEW,\n size: ZERO_SIZE,\n trackHeight: 28,\n scrollTop: 0,\n startFrame: 0,\n endFrame: 1,\n fps: 30,\n mode: 'dope-sheet',\n };\n private playhead: TimelinePlayheadState = { frame: 0, playing: false };\n private selection: TimelineSelection = [];\n private selectionKeys = new Set<string>();\n private drag: TimelineDragState = { kind: 'none', marquee: null };\n private hover: TimelineKeyframeRef | null = null;\n private hoverPlayhead = false;\n private hoverLoop: TimelineLoopHover = null;\n private snapshot: TimelineContextValue = this.computeSnapshot();\n\n private allListeners = new Set<() => void>();\n private geometryListeners = new Set<() => void>();\n private playheadListeners = new Set<() => void>();\n private selectionListeners = new Set<() => void>();\n private dragListeners = new Set<() => void>();\n private hoverListeners = new Set<() => void>();\n private hoverPlayheadListeners = new Set<() => void>();\n private hoverLoopListeners = new Set<() => void>();\n\n // ── Public read API (arrow functions so they can be passed as callbacks) ──\n\n getSnapshot = (): TimelineContextValue => this.snapshot;\n getGeometry = (): TimelineGeometryState => this.geometry;\n getPlayhead = (): TimelinePlayheadState => this.playhead;\n getSelection = (): TimelineSelection => this.selection;\n getDrag = (): TimelineDragState => this.drag;\n getHover = (): TimelineKeyframeRef | null => this.hover;\n getHoverPlayhead = (): boolean => this.hoverPlayhead;\n getHoverLoop = (): TimelineLoopHover => this.hoverLoop;\n isSelected = (ref: TimelineKeyframeRef): boolean =>\n this.selectionKeys.has(selectionKey(ref));\n isHovered = (ref: TimelineKeyframeRef): boolean =>\n this.hover !== null &&\n this.hover.trackId === ref.trackId &&\n this.hover.keyframeId === ref.keyframeId;\n\n // ── Subscriptions ──\n\n subscribe = (cb: () => void): (() => void) => {\n this.allListeners.add(cb);\n return () => {\n this.allListeners.delete(cb);\n };\n };\n\n subscribeGeometry = (cb: () => void): (() => void) => {\n this.geometryListeners.add(cb);\n return () => {\n this.geometryListeners.delete(cb);\n };\n };\n\n subscribePlayhead = (cb: () => void): (() => void) => {\n this.playheadListeners.add(cb);\n return () => {\n this.playheadListeners.delete(cb);\n };\n };\n\n subscribeSelection = (cb: () => void): (() => void) => {\n this.selectionListeners.add(cb);\n return () => {\n this.selectionListeners.delete(cb);\n };\n };\n\n subscribeDrag = (cb: () => void): (() => void) => {\n this.dragListeners.add(cb);\n return () => {\n this.dragListeners.delete(cb);\n };\n };\n\n subscribeHover = (cb: () => void): (() => void) => {\n this.hoverListeners.add(cb);\n return () => {\n this.hoverListeners.delete(cb);\n };\n };\n\n subscribeHoverPlayhead = (cb: () => void): (() => void) => {\n this.hoverPlayheadListeners.add(cb);\n return () => {\n this.hoverPlayheadListeners.delete(cb);\n };\n };\n\n subscribeHoverLoop = (cb: () => void): (() => void) => {\n this.hoverLoopListeners.add(cb);\n return () => {\n this.hoverLoopListeners.delete(cb);\n };\n };\n\n // ── Mutators ──\n\n setGeometry(partial: Partial<TimelineGeometryState>): void {\n const next: TimelineGeometryState = {\n view: partial.view ?? this.geometry.view,\n size: partial.size ?? this.geometry.size,\n trackHeight: partial.trackHeight ?? this.geometry.trackHeight,\n scrollTop: partial.scrollTop ?? this.geometry.scrollTop,\n startFrame: partial.startFrame ?? this.geometry.startFrame,\n endFrame: partial.endFrame ?? this.geometry.endFrame,\n fps: partial.fps ?? this.geometry.fps,\n mode: partial.mode ?? this.geometry.mode,\n };\n if (geometryEqual(next, this.geometry)) return;\n this.geometry = next;\n this.snapshot = this.computeSnapshot();\n this.geometryListeners.forEach(cb => {\n cb();\n });\n this.allListeners.forEach(cb => {\n cb();\n });\n }\n\n setPlayhead(partial: Partial<TimelinePlayheadState>): void {\n const next: TimelinePlayheadState = {\n frame: partial.frame ?? this.playhead.frame,\n playing: partial.playing ?? this.playhead.playing,\n };\n if (\n next.frame === this.playhead.frame &&\n next.playing === this.playhead.playing\n ) {\n return;\n }\n this.playhead = next;\n this.snapshot = this.computeSnapshot();\n this.playheadListeners.forEach(cb => {\n cb();\n });\n this.allListeners.forEach(cb => {\n cb();\n });\n }\n\n setSelection(next: TimelineSelection): void {\n const nextKeys = new Set(next.map(selectionKey));\n if (setsEqual(nextKeys, this.selectionKeys)) return;\n this.selection = next;\n this.selectionKeys = nextKeys;\n this.snapshot = this.computeSnapshot();\n this.selectionListeners.forEach(cb => {\n cb();\n });\n this.allListeners.forEach(cb => {\n cb();\n });\n }\n\n setDrag(next: TimelineDragState): void {\n if (\n next.kind === this.drag.kind &&\n marqueeEqual(next.marquee, this.drag.marquee)\n ) {\n return;\n }\n this.drag = next;\n this.dragListeners.forEach(cb => {\n cb();\n });\n }\n\n setHover(next: TimelineKeyframeRef | null): void {\n if (\n (next === null && this.hover === null) ||\n (next !== null &&\n this.hover !== null &&\n next.trackId === this.hover.trackId &&\n next.keyframeId === this.hover.keyframeId)\n ) {\n return;\n }\n this.hover = next;\n this.hoverListeners.forEach(cb => {\n cb();\n });\n }\n\n setHoverPlayhead(next: boolean): void {\n if (next === this.hoverPlayhead) return;\n this.hoverPlayhead = next;\n this.hoverPlayheadListeners.forEach(cb => {\n cb();\n });\n }\n\n setHoverLoop(next: TimelineLoopHover): void {\n if (next === this.hoverLoop) return;\n this.hoverLoop = next;\n this.hoverLoopListeners.forEach(cb => {\n cb();\n });\n }\n\n // ── Imperative handle ──\n\n /**\n * Stable handle whose methods proxy to the current store state and to the\n * request handlers wired by the component. Stable for the store's lifetime.\n */\n readonly handle: TimelineHandle = {\n focus: (): void => {\n this.handlers?.focus();\n },\n getElement: (): HTMLDivElement | null =>\n this.handlers?.getElement() ?? null,\n seek: (frame: number): void => {\n this.handlers?.seek(frame);\n },\n play: (): void => {\n this.handlers?.setPlaying(true);\n },\n pause: (): void => {\n this.handlers?.setPlaying(false);\n },\n toggle: (): void => {\n this.handlers?.setPlaying(!this.playhead.playing);\n },\n getFrame: (): number => this.playhead.frame,\n zoomToFit: (paddingFrames?: number): void => {\n this.handlers?.zoomToFit(paddingFrames);\n },\n zoomToSelection: (): void => {\n this.handlers?.zoomToSelection();\n },\n getView: (): TimelineView => this.geometry.view,\n setView: (view: TimelineView): void => {\n this.handlers?.setView(view);\n },\n frameToX: (frame: number): number =>\n frameToXFn(frame, this.geometry.view, this.geometry.size.width),\n xToFrame: (x: number): number =>\n xToFrameFn(x, this.geometry.view, this.geometry.size.width),\n };\n\n /** Wired up by `Timeline.tsx` so the handle/gestures can request changes. */\n configureHandle(handlers: TimelineRequestHandlers): void {\n this.handlers = handlers;\n }\n\n private handlers: TimelineRequestHandlers | null = null;\n\n private computeSnapshot(): TimelineContextValue {\n const { view, size, startFrame, endFrame, fps, mode } = this.geometry;\n return {\n view,\n size,\n startFrame,\n endFrame,\n fps,\n mode,\n frame: this.playhead.frame,\n playing: this.playhead.playing,\n selection: this.selection,\n frameToX: (f: number): number => frameToXFn(f, view, size.width),\n xToFrame: (x: number): number => xToFrameFn(x, view, size.width),\n };\n }\n}\n\nfunction viewEqual(a: TimelineView, b: TimelineView): boolean {\n return a.startFrame === b.startFrame && a.endFrame === b.endFrame;\n}\n\nfunction sizeEqual(a: ViewportSize, b: ViewportSize): boolean {\n return a.width === b.width && a.height === b.height;\n}\n\nfunction geometryEqual(\n a: TimelineGeometryState,\n b: TimelineGeometryState\n): boolean {\n return (\n viewEqual(a.view, b.view) &&\n sizeEqual(a.size, b.size) &&\n a.trackHeight === b.trackHeight &&\n a.scrollTop === b.scrollTop &&\n a.startFrame === b.startFrame &&\n a.endFrame === b.endFrame &&\n a.fps === b.fps &&\n a.mode === b.mode\n );\n}\n\nfunction setsEqual(a: Set<string>, b: Set<string>): boolean {\n if (a.size !== b.size) return false;\n for (const key of a) {\n if (!b.has(key)) return false;\n }\n return true;\n}\n\nfunction marqueeEqual(\n a: TimelineDragState['marquee'],\n b: TimelineDragState['marquee']\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return (\n a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n );\n}\n"],"names":["frameToXFn","xToFrameFn"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineToolbar.js","sources":["
|
|
1
|
+
{"version":3,"file":"TimelineToolbar.js","sources":["src/components/editor/Timeline/TimelineToolbar.tsx"],"sourcesContent":["import { TIMELINE_SLOT } from './Timeline.types';\n\nimport type { TimelineToolbarProps } from './Timeline.types';\n\n/**\n * Toolbar strip rendered above the timeline body (transport, mode toggle,\n * zoom controls). Picked out of `<Timeline>` children by the `TIMELINE_SLOT`\n * symbol — its position in the child tree does not affect placement.\n */\nconst TimelineToolbarImpl: (props: TimelineToolbarProps) => null = () => null;\n\nexport const TimelineToolbar = Object.assign(TimelineToolbarImpl, {\n displayName: 'Timeline.Toolbar',\n [TIMELINE_SLOT]: 'toolbar' as const,\n});\n"],"names":[],"mappings":";;AAIA;;;;AAIG;AACH,MAAM,mBAAmB,GAA0C,MAAM,IAAI;MAEhE,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE;AAChE,IAAA,WAAW,EAAE,kBAAkB;IAC/B,CAAC,aAAa,GAAG,SAAkB;AACpC,CAAA;;;;"}
|
|
@@ -5,7 +5,7 @@ import '../../../utils/devWarn.js';
|
|
|
5
5
|
import { useMergedRef } from '../../../hooks/useMergedRef/useMergedRef.js';
|
|
6
6
|
import '../../../hooks/useBreakpoint/useBreakpoint.js';
|
|
7
7
|
import './../../../assets/src/theme/lightTheme.css.ts.vanilla-Ct6f9Iym.css';
|
|
8
|
-
import '
|
|
8
|
+
import '@vanilla-extract/css';
|
|
9
9
|
import './../../../assets/src/theme/darkTheme.css.ts.vanilla-BHZ3ecRn.css';
|
|
10
10
|
import './../../../assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css';
|
|
11
11
|
import '../../../hooks/useNavigationHistory/useNavigationHistory.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineTrackHeaders.js","sources":["../../../../../../src/components/editor/Timeline/TimelineTrackHeaders.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;AA0BA;AA2BA;AACA;;AAMA;AAEA;;;;;;;;AAQG;AACG;AAeJ;;;AAIA;AACE;;AAC6B;AAC7B;AACF;;AAMA;AACE;;AAEA;AACF;;;;AAMA;;;AAII;AACA;AACE;AACA;AAA0C;;;;;AAS5C;;AACA;AACA;;AACA;AACA;;AAEF;AAIF;AAEI;;AAEF;AAIF;AAEI;;AAEE;;;AAGA;AACE;AACA;;AAEE;;;AAEA;AACA;AACE;AACA;;AAEJ;;;;AAIF;AACF;;;AAOF;AACE;;;AAqBM;AACA;AACA;AACD;AAGC;;AAEE;AASM;AACF;AAEE;;AAEE;;AAEJ;;AAqBN;;AAEA;AACA;;;AAOM;AACD;;AAQO;;;;;AASL;;AASG;;AAGE;AACF;AAqBZ;AAWV;;"}
|
|
1
|
+
{"version":3,"file":"TimelineTrackHeaders.js","sources":["src/components/editor/Timeline/TimelineTrackHeaders.tsx"],"sourcesContent":["'use client';\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { useMergedRef } from '@/hooks';\n\nimport {\n timelineHeaderColumnStyle,\n timelineHeaderSpacerStyle,\n timelineHeaderRowsViewportStyle,\n timelineHeaderRowStyle,\n timelineHeaderGroupRowStyle,\n timelineHeaderToggleStyle,\n timelineHeaderSwatchStyle,\n timelineHeaderLabelStyle,\n timelineHeaderDropIndicatorStyle,\n} from './Timeline.css';\nimport { reorderTracksByDrop } from './timelineEdits';\n\nimport type {\n TimelineSelection,\n TimelineTrack,\n TimelineTrackHeaderInfo,\n} from './Timeline.types';\nimport type { TimelineRow, TimelineTrackRow } from './timelineLayout';\n\nconst GROUP_INDENT = 14;\n\ninterface TimelineTrackHeadersProps {\n rows: ReadonlyArray<TimelineRow>;\n contentHeight: number;\n tracks: ReadonlyArray<TimelineTrack>;\n rulerHeight: number;\n scrollTop: number;\n width: number;\n selection: TimelineSelection;\n editable: boolean;\n renderTrackHeader?:\n | ((track: TimelineTrack, info: TimelineTrackHeaderInfo) => React.ReactNode)\n | undefined;\n onReorderTracks?: ((tracks: TimelineTrack[]) => void) | undefined;\n onToggleGroupCollapsed: (groupId: string) => void;\n onToggleTrackExpanded: (trackId: string) => void;\n /** Forwarded ref to the column root, so the parent can attach extra DOM\n * handlers (e.g. a native non-passive wheel listener for row scrolling). */\n ref?: React.Ref<HTMLDivElement>;\n}\n\ninterface DragState {\n id: string;\n dropIndex: number;\n}\n\n/** A crisp disclosure triangle (right-pointing; rotates to point down). */\nfunction Caret(): React.ReactElement {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" aria-hidden=\"true\">\n <path d=\"M2 1 L6 4 L2 7 Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n/**\n * The left track-header column. Renders a spacer aligned with the ruler band,\n * then the layout rows: group headers (with a collapse caret) and one row per\n * visible track (built-in label + color swatch + expand-to-graph caret by\n * default, or `renderTrackHeader`). Rows are absolutely positioned from the\n * shared layout so they stay aligned with the canvas lanes (variable heights,\n * expanded graph lanes). With the built-in header, track rows can be dragged to\n * reorder (a drop indicator marks the target gap).\n */\nexport function TimelineTrackHeaders({\n rows,\n contentHeight,\n tracks,\n rulerHeight,\n scrollTop,\n width,\n selection,\n editable,\n renderTrackHeader,\n onReorderTracks,\n onToggleGroupCollapsed,\n onToggleTrackExpanded,\n ref,\n}: TimelineTrackHeadersProps): React.ReactElement {\n const columnRef = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRef<HTMLDivElement>(columnRef, ref);\n const [drag, setDrag] = useState<DragState | null>(null);\n\n const selectedTrackIds = useMemo(() => {\n const set = new Set<string>();\n for (const ref of selection) set.add(ref.trackId);\n return set;\n }, [selection]);\n\n const trackRows = useMemo(\n () => rows.filter((r): r is TimelineTrackRow => r.kind === 'track'),\n [rows]\n );\n const trackIndexById = useMemo(() => {\n const m = new Map<string, number>();\n trackRows.forEach((r, i) => m.set(r.track.id, i));\n return m;\n }, [trackRows]);\n\n // Reorder-drag is only wired for the built-in header, so custom headers keep\n // full control of their own pointer interactions.\n const reorderable = editable && !!onReorderTracks && !renderTrackHeader;\n\n const dropIndexAt = useCallback(\n (clientY: number): number => {\n const rect = columnRef.current?.getBoundingClientRect();\n const top = (rect?.top ?? 0) + rulerHeight;\n const contentY = clientY - top + scrollTop;\n for (let i = 0; i < trackRows.length; i += 1) {\n const r = trackRows[i];\n if (r && contentY < r.top + r.height / 2) return i;\n }\n return trackRows.length;\n },\n [rulerHeight, scrollTop, trackRows]\n );\n\n const handleRowPointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>, trackId: string): void => {\n if (!reorderable || e.button !== 0) return;\n const column = columnRef.current;\n if (!column) return;\n column.setPointerCapture(e.pointerId);\n const index = trackRows.findIndex(r => r.track.id === trackId);\n setDrag({ id: trackId, dropIndex: index < 0 ? 0 : index });\n },\n [reorderable, trackRows]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>): void => {\n const y = e.clientY;\n setDrag(d => (d ? { ...d, dropIndex: dropIndexAt(y) } : d));\n },\n [dropIndexAt]\n );\n\n const endDrag = useCallback(\n (e: React.PointerEvent<HTMLDivElement>): void => {\n const column = columnRef.current;\n if (column?.hasPointerCapture(e.pointerId)) {\n column.releasePointerCapture(e.pointerId);\n }\n setDrag(current => {\n if (current && onReorderTracks) {\n const visible = tracks.filter(t => !t.hidden);\n let visibleIndex: number;\n if (current.dropIndex >= trackRows.length) {\n visibleIndex = visible.length;\n } else {\n const targetId = trackRows[current.dropIndex]?.track.id;\n visibleIndex = targetId\n ? visible.findIndex(t => t.id === targetId)\n : visible.length;\n }\n const next = reorderTracksByDrop(tracks, current.id, visibleIndex);\n if (next.some((t, i) => t.id !== tracks[i]?.id))\n onReorderTracks(next);\n }\n return null;\n });\n },\n [tracks, trackRows, onReorderTracks]\n );\n\n const dropTop =\n drag &&\n (drag.dropIndex < trackRows.length\n ? (trackRows[drag.dropIndex]?.top ?? contentHeight)\n : contentHeight);\n\n return (\n <div\n ref={mergedRef}\n className={timelineHeaderColumnStyle}\n style={{ width }}\n onPointerMove={handlePointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n >\n {rulerHeight > 0 && (\n <div\n className={timelineHeaderSpacerStyle}\n style={{ height: rulerHeight }}\n />\n )}\n <div className={timelineHeaderRowsViewportStyle}>\n <div\n style={{\n position: 'absolute',\n inset: 0,\n transform: `translateY(${-scrollTop}px)`,\n }}\n >\n {rows.map(row => {\n if (row.kind === 'group') {\n const collapsed = row.group.collapsed ?? false;\n return (\n <div\n key={`group:${row.group.id}`}\n role=\"button\"\n tabIndex={0}\n aria-expanded={!collapsed}\n className={timelineHeaderGroupRowStyle}\n style={{ top: row.top, height: row.height }}\n onClick={() => {\n onToggleGroupCollapsed(row.group.id);\n }}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onToggleGroupCollapsed(row.group.id);\n }\n }}\n >\n <span\n className={timelineHeaderToggleStyle}\n data-open={!collapsed || undefined}\n >\n <Caret />\n </span>\n {row.group.color && (\n <span\n className={timelineHeaderSwatchStyle}\n style={{ background: row.group.color }}\n />\n )}\n <span className={timelineHeaderLabelStyle}>\n {row.group.label ?? row.group.id}\n </span>\n </div>\n );\n }\n\n const track = row.track;\n const hasSelection = selectedTrackIds.has(track.id);\n const grouped = track.groupId !== undefined;\n return (\n <div\n key={track.id}\n className={timelineHeaderRowStyle}\n style={{\n top: row.top,\n height: row.height,\n ...(grouped ? { paddingInlineStart: GROUP_INDENT } : {}),\n }}\n data-draggable={reorderable || undefined}\n data-dragging={drag?.id === track.id || undefined}\n data-locked={track.locked ? true : undefined}\n data-selected={hasSelection || undefined}\n onPointerDown={\n reorderable\n ? e => {\n handleRowPointerDown(e, track.id);\n }\n : undefined\n }\n >\n {renderTrackHeader ? (\n renderTrackHeader(track, {\n index: trackIndexById.get(track.id) ?? 0,\n hasSelection,\n })\n ) : (\n <>\n <button\n type=\"button\"\n className={timelineHeaderToggleStyle}\n data-open={track.expanded ? true : undefined}\n onPointerDown={e => {\n e.stopPropagation();\n }}\n onClick={e => {\n e.stopPropagation();\n onToggleTrackExpanded(track.id);\n }}\n aria-label={\n track.expanded ? 'Collapse track' : 'Expand track'\n }\n aria-expanded={track.expanded ?? false}\n >\n <Caret />\n </button>\n <span\n className={timelineHeaderSwatchStyle}\n style={\n track.color ? { background: track.color } : undefined\n }\n />\n <span className={timelineHeaderLabelStyle}>\n {track.label ?? track.id}\n </span>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n {drag && dropTop !== null && (\n <div\n className={timelineHeaderDropIndicatorStyle}\n style={{ top: rulerHeight + dropTop - scrollTop }}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA0BA;AA2BA;AACA;;AAMA;AAEA;;;;;;;;AAQG;AACG;AAeJ;;;AAIA;AACE;;AAC6B;AAC7B;AACF;;AAMA;AACE;;AAEA;AACF;;;;AAMA;;;AAII;AACA;AACE;AACA;AAA0C;;;;;AAS5C;;AACA;AACA;;AACA;AACA;;AAEF;AAIF;AAEI;;AAEF;AAIF;AAEI;;AAEE;;;AAGA;AACE;AACA;;AAEE;;;AAEA;AACA;AACE;AACA;;AAEJ;;;;AAIF;AACF;;;AAOF;AACE;;;AAqBM;AACA;AACA;AACD;AAGC;;AAEE;AASM;AACF;AAEE;;AAEE;;AAEJ;;AAqBN;;AAEA;AACA;;;AAOM;AACD;;AAQO;;;;;AASL;;AASG;;AAGE;AACF;AAqBZ;AAWV;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineTrackScale.js","sources":["
|
|
1
|
+
{"version":3,"file":"TimelineTrackScale.js","sources":["src/components/editor/Timeline/TimelineTrackScale.tsx"],"sourcesContent":["import { TIMELINE_SLOT } from './Timeline.types';\n\nimport type { TimelineTrackScaleProps } from './Timeline.types';\n\n/**\n * Renders a tiny min / max value scale on every graph / expanded-track lane.\n * Picked out of `<Timeline>` children by the `TIMELINE_SLOT` symbol — its\n * position in the child tree does not affect placement (always drawn inside\n * the canvas, at the start or end of each lane).\n *\n * Pure marker — the actual drawing happens inside `drawTimeline`.\n */\nconst TimelineTrackScaleImpl: (props: TimelineTrackScaleProps) => null = () =>\n null;\n\nexport const TimelineTrackScale = Object.assign(TimelineTrackScaleImpl, {\n displayName: 'Timeline.TrackScale',\n [TIMELINE_SLOT]: 'track-scale' as const,\n});\n"],"names":[],"mappings":";;AAIA;;;;;;;AAOG;AACH,MAAM,sBAAsB,GAA6C,MACvE,IAAI;MAEO,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE;AACtE,IAAA,WAAW,EAAE,qBAAqB;IAClC,CAAC,aAAa,GAAG,aAAsB;AACxC,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sources":["src/components/editor/Timeline/index.ts"],"sourcesContent":["import { Timeline as TimelineBase } from './Timeline';\nimport { TimelineFooter } from './TimelineFooter';\nimport { TimelineMinimap } from './TimelineMinimap';\nimport { TimelineToolbar } from './TimelineToolbar';\nimport { TimelineTrackScale } from './TimelineTrackScale';\n\ntype TimelineCompound = typeof TimelineBase & {\n Toolbar: typeof TimelineToolbar;\n Footer: typeof TimelineFooter;\n Minimap: typeof TimelineMinimap;\n TrackScale: typeof TimelineTrackScale;\n};\n\nconst TimelineWithSlots = TimelineBase as TimelineCompound;\nTimelineWithSlots.Toolbar = TimelineToolbar;\nTimelineWithSlots.Footer = TimelineFooter;\nTimelineWithSlots.Minimap = TimelineMinimap;\nTimelineWithSlots.TrackScale = TimelineTrackScale;\n\nexport const Timeline = TimelineWithSlots;\nexport { TimelineToolbar, TimelineFooter, TimelineMinimap, TimelineTrackScale };\nexport {\n useTimelineContext,\n useTimelineGeometry,\n useTimelinePlayhead,\n useTimelineSelection,\n useTimelineSelectedTangentMode,\n} from './TimelineContext';\nexport type { TimelineSelectedTangentMode } from './TimelineContext';\nexport { selectedTangentMode, setSelectedTangentMode } from './timelineEdits';\nexport { framesToTimecode } from './timelineCoords';\nexport { TIMELINE_SLOT } from './Timeline.types';\n\nexport type {\n TimelineProps,\n TimelineTrack,\n TimelineKeyframeRef,\n TimelineSelection,\n TimelineView,\n TimelineMode,\n TimelineLoop,\n TimelineGroup,\n TimelineInfinity,\n TimelineHandle,\n TimelineDrawInfo,\n TimelineTrackHeaderInfo,\n TimelineContextValue,\n TimelineToolbarProps,\n TimelineFooterProps,\n TimelineMinimapProps,\n TimelineTrackScaleProps,\n TimelineSlotKind,\n TimelineSlotMarker,\n} from './Timeline.types';\nexport type {\n TimelineGeometryState,\n TimelinePlayheadState,\n TimelineDragState,\n TimelineDragKind,\n} from './TimelineStore';\n"],"names":["TimelineBase"],"mappings":";;;;;;;;;AAaA,MAAM,iBAAiB,GAAGA,UAAgC;AAC1D,iBAAiB,CAAC,OAAO,GAAG,eAAe;AAC3C,iBAAiB,CAAC,MAAM,GAAG,cAAc;AACzC,iBAAiB,CAAC,OAAO,GAAG,eAAe;AAC3C,iBAAiB,CAAC,UAAU,GAAG,kBAAkB;AAE1C,MAAM,QAAQ,GAAG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timelineCoords.js","sources":["
|
|
1
|
+
{"version":3,"file":"timelineCoords.js","sources":["src/components/editor/Timeline/timelineCoords.ts"],"sourcesContent":["import { clamp } from '@/utils/mathUtils';\n\nimport type { TimelineLoop, TimelineView } from './Timeline.types';\n\n// Re-exported so the Timeline modules keep importing their coord math from a\n// single place (`./timelineCoords`) while sharing the one `clamp` impl.\nexport { clamp };\n\n/** Resolve a loop prop to a concrete `{ startFrame, endFrame }` region, or null. */\nexport function resolveLoop(\n loop: TimelineLoop | undefined,\n startFrame: number,\n endFrame: number\n): { startFrame: number; endFrame: number } | null {\n if (loop === true) return { startFrame, endFrame };\n if (loop && typeof loop === 'object') return loop;\n return null;\n}\n\n/** Visible frame span of a view window. Guards against a zero/negative span. */\nfunction viewSpan(view: TimelineView): number {\n return Math.max(1e-6, view.endFrame - view.startFrame);\n}\n\n/** Map a frame to a CSS-pixel X within the track area `[0, width]`. */\nexport function frameToX(\n frame: number,\n view: TimelineView,\n width: number\n): number {\n return ((frame - view.startFrame) / viewSpan(view)) * width;\n}\n\n/** Inverse of `frameToX`: a CSS-pixel X to a frame. */\nexport function xToFrame(x: number, view: TimelineView, width: number): number {\n if (width <= 0) return view.startFrame;\n return view.startFrame + (x / width) * viewSpan(view);\n}\n\n/** Snap a frame to the nearest increment. `true` = 1 frame, `false` = no snap. */\nexport function snapFrame(frame: number, snap: boolean | number): number {\n if (snap === false) return frame;\n const step = snap === true ? 1 : Math.max(1e-6, snap);\n return Math.round(frame / step) * step;\n}\n\n/**\n * Format a frame number as `HH:MM:SS:FF` timecode at the given fps.\n * Negative frames clamp to zero; fps is rounded to whole frames-per-second.\n */\nexport function framesToTimecode(frame: number, fps: number): string {\n const safeFps = fps > 0 ? Math.round(fps) : 30;\n const total = Math.max(0, Math.floor(frame));\n const ff = total % safeFps;\n const totalSeconds = Math.floor(total / safeFps);\n const ss = totalSeconds % 60;\n const mm = Math.floor(totalSeconds / 60) % 60;\n const hh = Math.floor(totalSeconds / 3600);\n const pad = (n: number): string => n.toString().padStart(2, '0');\n return `${pad(hh)}:${pad(mm)}:${pad(ss)}:${pad(ff)}`;\n}\n\n// ─── Graph-mode value axis ───\n\n/** Vertical inset (CSS px) inside a graph row so curves don't touch the edges. */\nexport function valueInset(rowHeight: number): number {\n return Math.min(8, rowHeight * 0.2);\n}\n\n/** Map a value to a CSS-pixel Y inside a graph-mode row (higher value → higher up). */\nexport function valueToY(\n value: number,\n range: readonly [number, number],\n rowTop: number,\n rowHeight: number\n): number {\n const span = Math.max(1e-6, range[1] - range[0]);\n const inset = valueInset(rowHeight);\n const usable = Math.max(1e-6, rowHeight - inset * 2);\n const t = (value - range[0]) / span;\n return rowTop + inset + (1 - t) * usable;\n}\n\n/** Inverse of `valueToY`: a CSS-pixel Y inside a row to a value. */\nexport function yToValue(\n y: number,\n range: readonly [number, number],\n rowTop: number,\n rowHeight: number\n): number {\n const span = range[1] - range[0];\n const inset = valueInset(rowHeight);\n const usable = Math.max(1e-6, rowHeight - inset * 2);\n const t = 1 - (y - rowTop - inset) / usable;\n return range[0] + t * span;\n}\n\n/** Auto-fit a value range to a set of keyframes, with 10% padding. */\nexport function autoValueRange(\n keyframes: ReadonlyArray<{ y: number }>\n): [number, number] {\n if (keyframes.length === 0) return [0, 1];\n let lo = Infinity;\n let hi = -Infinity;\n for (const k of keyframes) {\n if (k.y < lo) lo = k.y;\n if (k.y > hi) hi = k.y;\n }\n if (lo === hi) return [lo - 1, hi + 1];\n const pad = (hi - lo) * 0.1;\n return [lo - pad, hi + pad];\n}\n\n/**\n * Compute the next view that should follow the playhead during playback,\n * or `null` when no change is needed.\n *\n * - `'smooth'` — the view's `startFrame` is `frame - span/2`, clamped to\n * `[startFrame, endFrame - span]`. Called every frame tick → continuous\n * tracking with the playhead pinned to the centre.\n * - `'paged'` — return a new view only when the playhead has left the\n * current view; the new view starts at the playhead, clamped to bounds.\n * - `'off'` — always returns `null`.\n */\nexport function nextFollowView(\n mode: 'smooth' | 'paged' | 'off',\n view: TimelineView,\n frame: number,\n startFrame: number,\n endFrame: number\n): TimelineView | null {\n if (mode === 'off') return null;\n const span = view.endFrame - view.startFrame;\n if (span <= 0) return null;\n const maxStart = endFrame - span;\n let nextStart: number;\n if (mode === 'paged') {\n if (frame >= view.startFrame && frame <= view.endFrame) return null;\n nextStart = clamp(frame, startFrame, maxStart);\n } else {\n nextStart = clamp(frame - span / 2, startFrame, maxStart);\n }\n if (nextStart === view.startFrame) return null;\n return { startFrame: nextStart, endFrame: nextStart + span };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timelineDrawing.js","sources":["../../../../../../src/components/editor/Timeline/timelineDrawing.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timelineDrawing.js","sources":["src/components/editor/Timeline/timelineDrawing.ts"],"sourcesContent":["import { evaluateCurve } from '@/components/controls/CurveEditor';\n\nimport { frameToX, valueInset, valueToY, xToFrame } from './timelineCoords';\n\nimport type {\n TimelineDrawInfo,\n TimelineTrack,\n TimelineView,\n} from './Timeline.types';\nimport type { TimelineRow } from './timelineLayout';\nimport type { ViewportSize } from '@/components/primitives/viewport';\nimport type { CurveData } from '@/types/keyframe';\n\nexport interface TimelineDrawColors {\n background: string;\n gridLine: string;\n rulerText: string;\n rowSeparator: string;\n keyframe: string;\n keyframeSelected: string;\n keyframeStroke: string;\n playhead: string;\n groupHeader: string;\n}\n\nexport interface TimelineDrawInput {\n ctx: CanvasRenderingContext2D;\n /** Track-area size in CSS pixels (caller has already DPR-scaled the ctx). */\n size: ViewportSize;\n view: TimelineView;\n startFrame: number;\n endFrame: number;\n fps: number;\n frame: number;\n /** Pre-computed rows (group headers + track lanes), in draw order. */\n rows: ReadonlyArray<TimelineRow>;\n scrollTop: number;\n /** Height of the top ruler band in CSS px (0 when hidden). */\n rulerHeight: number;\n /** Height of the dedicated loop strip directly below the ruler (0 = off). */\n loopStripHeight?: number;\n /** Visual style for the loop region edges. @default 'edges' */\n loopHandles?: 'edges' | 'brackets';\n showPlayhead: boolean;\n colors: TimelineDrawColors;\n /** Canvas font string for ruler labels, e.g. `10px Inter, sans-serif`. */\n font: string;\n formatTime: (frame: number, fps: number) => string;\n isSelected: (trackId: string, keyframeId: string) => boolean;\n /** Whether a given keyframe is hovered (pointer-over, no active drag). */\n isHovered?: (trackId: string, keyframeId: string) => boolean;\n /** Whether the playhead is currently pointer-hovered (renders a glow). */\n playheadHovered?: boolean;\n /**\n * When provided, draws an axis line + tick labels at the start (or end) of\n * each graph / expanded lane. Used by the `<Timeline.TrackScale />` slot.\n */\n trackScale?: {\n position: 'start' | 'end';\n format: (value: number) => string;\n showMidpoint: boolean;\n gridlines: boolean;\n color?: string;\n /** Lanes shorter than this (CSS px) skip the scale to avoid label overlap. */\n minLaneHeight: number;\n };\n renderOverlay?: (\n ctx: CanvasRenderingContext2D,\n info: TimelineDrawInfo\n ) => void;\n /** Active marquee rectangle (box-select) in track-area px, or null. */\n marquee?: { x: number; y: number; width: number; height: number } | null;\n /** Resolved loop region highlighted on the ruler + track area, or null. */\n loopRegion?: { startFrame: number; endFrame: number } | null;\n /** Which loop part is hovered (brightens that edge / body), or null. */\n loopHover?: 'start' | 'end' | 'body' | null;\n}\n\nconst KEYFRAME_RADIUS = 4;\nconst MIN_LABEL_PX = 72;\n\n/** Smallest \"nice\" step (1/2/5 × 10ⁿ, ≥ 1) at least as large as `value`. */\nfunction niceFrameStep(value: number): number {\n if (value <= 1) return 1;\n const exp = Math.floor(Math.log10(value));\n const base = Math.pow(10, exp);\n // `f` is in [1, 10] by construction; pick the next multiple in {1,2,5,10}.\n const f = value / base;\n const m = f <= 1 ? 1 : f <= 2 ? 2 : f <= 5 ? 5 : 10;\n return m * base;\n}\n\nfunction diamondPath(\n ctx: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n r: number\n): void {\n ctx.beginPath();\n ctx.moveTo(cx, cy - r);\n ctx.lineTo(cx + r, cy);\n ctx.lineTo(cx, cy + r);\n ctx.lineTo(cx - r, cy);\n ctx.closePath();\n}\n\n/** Graph-mode lane: the track's value curve + keyframe points (+ tangents when selected). */\nfunction drawGraphLane(\n input: TimelineDrawInput,\n track: TimelineTrack,\n top: number,\n rowH: number,\n accent: string,\n range: readonly [number, number]\n): void {\n const { ctx, size, view, startFrame, endFrame, colors, isSelected } = input;\n const isHovered = input.isHovered ?? ((): boolean => false);\n\n // ── Track scale (axis line + min/max [+ midpoint] labels, optional gridlines)\n // Skipped on short lanes (e.g. a collapsed graph-mode track) so the labels\n // never overlap into an unreadable blob.\n if (input.trackScale && rowH >= input.trackScale.minLaneHeight) {\n const { position, format, showMidpoint, gridlines } = input.trackScale;\n const scaleColor = input.trackScale.color ?? colors.rulerText;\n const isStart = position === 'start';\n const inset = valueInset(rowH);\n const axisX = isStart ? 6 : size.width - 6;\n const lineX = Math.round(axisX) + 0.5;\n const yTop = top + inset;\n const yBot = top + rowH - inset;\n const yMid = (yTop + yBot) / 2;\n const midValue = (range[0] + range[1]) / 2;\n const ticks: Array<{\n y: number;\n value: number;\n baseline: CanvasTextBaseline;\n }> = [\n { y: yTop, value: range[1], baseline: 'top' },\n { y: yBot, value: range[0], baseline: 'bottom' },\n ];\n if (showMidpoint) {\n ticks.push({ y: yMid, value: midValue, baseline: 'middle' });\n }\n\n ctx.save();\n ctx.strokeStyle = scaleColor;\n ctx.fillStyle = scaleColor;\n ctx.font = input.font;\n ctx.lineWidth = 1;\n\n // Gridlines first so the axis + curve draw on top.\n if (gridlines) {\n ctx.save();\n ctx.globalAlpha = 0.18;\n ctx.setLineDash([2, 3]);\n ctx.beginPath();\n for (const tick of ticks) {\n const y = Math.round(tick.y) + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(size.width, y);\n }\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n }\n\n // Axis line.\n ctx.globalAlpha = 0.7;\n ctx.beginPath();\n ctx.moveTo(lineX, yTop);\n ctx.lineTo(lineX, yBot);\n ctx.stroke();\n\n // Ticks + labels.\n const tickLen = 3;\n const tickInside = isStart ? lineX + tickLen : lineX - tickLen;\n const labelX = isStart ? lineX + tickLen + 3 : lineX - tickLen - 3;\n ctx.textAlign = isStart ? 'left' : 'right';\n for (const tick of ticks) {\n const y = Math.round(tick.y) + 0.5;\n ctx.beginPath();\n ctx.moveTo(lineX, y);\n ctx.lineTo(tickInside, y);\n ctx.stroke();\n ctx.textBaseline = tick.baseline;\n ctx.fillText(format(tick.value), labelX, tick.y);\n }\n ctx.restore();\n }\n const curve: CurveData = {\n keyframes: track.keyframes,\n domainX: [startFrame, endFrame],\n domainY: [range[0], range[1]],\n ...(track.infinity?.pre ? { preInfinity: track.infinity.pre } : {}),\n ...(track.infinity?.post ? { postInfinity: track.infinity.post } : {}),\n };\n const toX = (f: number): number => frameToX(f, view, size.width);\n\n if (track.keyframes.length > 0) {\n ctx.strokeStyle = accent;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n const samples = Math.max(2, Math.ceil(size.width / 3));\n // Visual safety net: clamp every sampled curve value to the track's\n // range so the line cannot escape the lane even if the data was loaded\n // with control points outside the range (the canonical guarantee comes\n // from clamping handles in `setKeyframeTangent`, but we still clip here\n // so legacy / unconstrained data renders cleanly).\n const lo = range[0];\n const hi = range[1];\n for (let s = 0; s <= samples; s += 1) {\n const px = (s / samples) * size.width;\n const raw = evaluateCurve(curve, xToFrame(px, view, size.width));\n const value = raw < lo ? lo : raw > hi ? hi : raw;\n const py = valueToY(value, range, top, rowH);\n if (s === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n }\n ctx.stroke();\n }\n\n // ── Tangent handles on the selected keyframe (CurveEditor-parity styling)\n for (const kf of track.keyframes) {\n if (kf.id === undefined || !isSelected(track.id, kf.id)) continue;\n if (kf.tangentMode === 'linear' || kf.tangentMode === 'step') continue;\n const x = toX(kf.x);\n if (x < -KEYFRAME_RADIUS * 4 || x > size.width + KEYFRAME_RADIUS * 4)\n continue;\n const y = valueToY(kf.y, range, top, rowH);\n const isAuto = kf.tangentMode === 'auto';\n const lineAlpha = isAuto ? 0.4 : 0.7;\n const dotRadius = isAuto ? 3 : 4;\n\n const drawHandle = (hx: number, hy: number): void => {\n ctx.save();\n ctx.globalAlpha = lineAlpha;\n ctx.strokeStyle = colors.rulerText;\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(hx, hy);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.globalAlpha = 1;\n ctx.fillStyle = colors.rulerText;\n ctx.beginPath();\n ctx.arc(hx, hy, dotRadius, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n };\n\n drawHandle(\n toX(kf.x + kf.handleIn.x),\n valueToY(kf.y + kf.handleIn.y, range, top, rowH)\n );\n drawHandle(\n toX(kf.x + kf.handleOut.x),\n valueToY(kf.y + kf.handleOut.y, range, top, rowH)\n );\n }\n\n // ── Keyframe points (sized by selected / hovered state)\n for (const kf of track.keyframes) {\n const x = toX(kf.x);\n if (x < -KEYFRAME_RADIUS * 2 || x > size.width + KEYFRAME_RADIUS * 2)\n continue;\n const y = valueToY(kf.y, range, top, rowH);\n const selected = kf.id !== undefined && isSelected(track.id, kf.id);\n const hovered = kf.id !== undefined && isHovered(track.id, kf.id);\n const radius = hovered\n ? KEYFRAME_RADIUS + 2\n : selected\n ? KEYFRAME_RADIUS + 1\n : KEYFRAME_RADIUS - 0.5;\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.fillStyle = selected ? colors.keyframeSelected : accent;\n ctx.fill();\n ctx.lineWidth = selected ? 1.5 : 1;\n ctx.strokeStyle = colors.keyframeStroke;\n ctx.stroke();\n }\n}\n\n/**\n * Render a full dope-sheet frame: background → gridlines → ruler → track rows\n * → keyframes → caller `renderOverlay` → playhead. The caller is responsible\n * for DPR scaling on `ctx` before invoking.\n */\nexport function drawTimeline(input: TimelineDrawInput): void {\n const {\n ctx,\n size,\n view,\n startFrame,\n endFrame,\n fps,\n frame,\n rows,\n scrollTop,\n rulerHeight,\n showPlayhead,\n loopStripHeight = 0,\n loopHandles = 'edges',\n colors,\n font,\n formatTime,\n isSelected,\n renderOverlay,\n marquee,\n loopRegion,\n loopHover,\n } = input;\n\n const toX = (f: number): number => frameToX(f, view, size.width);\n\n ctx.clearRect(0, 0, size.width, size.height);\n ctx.fillStyle = colors.background;\n ctx.fillRect(0, 0, size.width, size.height);\n\n // ── Gridlines + ruler ticks ──\n const span = Math.max(1e-6, view.endFrame - view.startFrame);\n const framesPerPixel = span / Math.max(1, size.width);\n const step = niceFrameStep(framesPerPixel * MIN_LABEL_PX);\n const firstTick = Math.ceil(view.startFrame / step) * step;\n\n const chromeHeight = rulerHeight + loopStripHeight;\n\n ctx.lineWidth = 1;\n ctx.strokeStyle = colors.gridLine;\n ctx.beginPath();\n for (let f = firstTick; f <= view.endFrame; f += step) {\n const x = Math.round(toX(f)) + 0.5;\n ctx.moveTo(x, chromeHeight);\n ctx.lineTo(x, size.height);\n }\n ctx.stroke();\n\n if (rulerHeight > 0) {\n ctx.fillStyle = colors.rulerText;\n ctx.font = font;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'left';\n for (let f = firstTick; f <= view.endFrame; f += step) {\n const x = Math.round(toX(f));\n ctx.fillStyle = colors.gridLine;\n ctx.fillRect(x, rulerHeight - 5, 1, 5);\n ctx.fillStyle = colors.rulerText;\n ctx.fillText(formatTime(f, fps), x + 3, rulerHeight / 2);\n }\n ctx.fillStyle = colors.rowSeparator;\n ctx.fillRect(0, rulerHeight - 1, size.width, 1);\n }\n\n // ── Loop strip background (when enabled) ──\n if (loopStripHeight > 0) {\n ctx.save();\n ctx.fillStyle = colors.gridLine;\n ctx.globalAlpha = 0.35;\n ctx.fillRect(0, rulerHeight, size.width, loopStripHeight);\n ctx.globalAlpha = 1;\n ctx.fillStyle = colors.rowSeparator;\n ctx.fillRect(0, chromeHeight - 1, size.width, 1);\n ctx.restore();\n }\n\n // ── Loop region ──\n if (loopRegion) {\n const lx = toX(loopRegion.startFrame);\n const rx = toX(loopRegion.endFrame);\n ctx.save();\n ctx.fillStyle = colors.keyframeSelected;\n // Body fill (brighter when the body is hovered, hinting it's draggable).\n ctx.globalAlpha = loopHover === 'body' ? 0.12 : 0.06;\n ctx.fillRect(\n lx,\n chromeHeight,\n rx - lx,\n Math.max(0, size.height - chromeHeight)\n );\n if (rulerHeight > 0) {\n ctx.globalAlpha = loopHover === 'body' ? 0.3 : 0.22;\n ctx.fillRect(lx, 0, rx - lx, rulerHeight);\n }\n if (loopStripHeight > 0) {\n ctx.globalAlpha = loopHover === 'body' ? 0.45 : 0.32;\n ctx.fillRect(lx, rulerHeight, rx - lx, loopStripHeight);\n }\n // Edges — `edges` style draws full-height bars; `brackets` style draws\n // `[ ]` markers in the chrome with serifs at top and bottom, no\n // full-height bars.\n ctx.globalAlpha = 1;\n const startW = loopHover === 'start' ? 4 : 2;\n const endW = loopHover === 'end' ? 4 : 2;\n if (loopHover === 'start' || loopHover === 'end') {\n ctx.shadowColor = colors.keyframeSelected;\n ctx.shadowBlur = 6;\n }\n if (loopHandles === 'brackets') {\n const serif = 8;\n const serifH = 2;\n // start `[`\n ctx.fillRect(lx, 0, startW, chromeHeight);\n ctx.fillRect(lx, 0, serif, serifH);\n ctx.fillRect(lx, chromeHeight - serifH, serif, serifH);\n // end `]`\n ctx.fillRect(rx - endW, 0, endW, chromeHeight);\n ctx.fillRect(rx - serif, 0, serif, serifH);\n ctx.fillRect(rx - serif, chromeHeight - serifH, serif, serifH);\n } else {\n ctx.fillRect(lx, 0, startW, size.height);\n ctx.fillRect(rx - endW, 0, endW, size.height);\n }\n ctx.restore();\n }\n\n // ── Track rows + keyframes (clipped to the area below the chrome) ──\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n 0,\n chromeHeight,\n size.width,\n Math.max(0, size.height - chromeHeight)\n );\n ctx.clip();\n\n for (const row of rows) {\n const top = chromeHeight + row.top - scrollTop;\n // Virtualize: skip rows scrolled out of the track area.\n if (top + row.height < chromeHeight || top > size.height) continue;\n\n if (row.kind === 'group') {\n ctx.fillStyle = colors.groupHeader;\n ctx.fillRect(0, top, size.width, row.height);\n ctx.fillStyle = colors.rowSeparator;\n ctx.fillRect(0, top + row.height - 1, size.width, 1);\n continue;\n }\n\n const track = row.track;\n const rowH = row.height;\n ctx.fillStyle = colors.rowSeparator;\n ctx.fillRect(0, top + rowH - 1, size.width, 1);\n\n const accent = track.color ?? colors.keyframe;\n if (row.graph) {\n drawGraphLane(input, track, top, rowH, accent, row.range);\n continue;\n }\n\n const centerY = top + rowH / 2;\n const hoveredAt = input.isHovered ?? ((): boolean => false);\n for (const kf of track.keyframes) {\n const x = toX(kf.x);\n if (x < -KEYFRAME_RADIUS * 2 || x > size.width + KEYFRAME_RADIUS * 2)\n continue;\n const selected = kf.id !== undefined && isSelected(track.id, kf.id);\n const hovered = kf.id !== undefined && hoveredAt(track.id, kf.id);\n const radius = hovered\n ? KEYFRAME_RADIUS + 2\n : selected\n ? KEYFRAME_RADIUS + 1\n : KEYFRAME_RADIUS;\n diamondPath(ctx, x, centerY, radius);\n ctx.fillStyle = selected ? colors.keyframeSelected : accent;\n ctx.fill();\n ctx.lineWidth = selected ? 1.5 : 1;\n ctx.strokeStyle = colors.keyframeStroke;\n ctx.stroke();\n }\n }\n\n if (renderOverlay) {\n const info: TimelineDrawInfo = {\n size,\n view,\n startFrame,\n endFrame,\n fps,\n frame,\n frameToX: toX,\n xToFrame: (x: number): number => xToFrame(x, view, size.width),\n };\n ctx.save();\n renderOverlay(ctx, info);\n ctx.restore();\n }\n\n ctx.restore();\n\n // ── Playhead ──\n if (showPlayhead) {\n const x = Math.round(toX(frame)) + 0.5;\n const hovered = input.playheadHovered === true;\n ctx.save();\n if (hovered) {\n ctx.shadowColor = colors.playhead;\n ctx.shadowBlur = 6;\n }\n ctx.strokeStyle = colors.playhead;\n ctx.lineWidth = hovered ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, size.height);\n ctx.stroke();\n ctx.restore();\n\n // Top handle (downward triangle in the ruler band) — bigger on hover so\n // the user can clearly see the grabbable head.\n const baseHead = Math.max(4, Math.min(7, rulerHeight - 2)) || 6;\n const head = hovered ? baseHead + 2 : baseHead;\n ctx.save();\n if (hovered) {\n ctx.shadowColor = colors.playhead;\n ctx.shadowBlur = 6;\n }\n ctx.fillStyle = colors.playhead;\n ctx.beginPath();\n ctx.moveTo(x - head, 0);\n ctx.lineTo(x + head, 0);\n ctx.lineTo(x, head);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n }\n\n // ── Marquee (box-select) ──\n if (marquee && (marquee.width > 0 || marquee.height > 0)) {\n ctx.save();\n ctx.globalAlpha = 0.12;\n ctx.fillStyle = colors.keyframeSelected;\n ctx.fillRect(marquee.x, marquee.y, marquee.width, marquee.height);\n ctx.globalAlpha = 1;\n ctx.strokeStyle = colors.keyframeSelected;\n ctx.lineWidth = 1;\n ctx.strokeRect(\n marquee.x + 0.5,\n marquee.y + 0.5,\n Math.max(0, marquee.width - 1),\n Math.max(0, marquee.height - 1)\n );\n ctx.restore();\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timelineEdits.js","sources":["../../../../../../src/components/editor/Timeline/timelineEdits.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timelineEdits.js","sources":["src/components/editor/Timeline/timelineEdits.ts"],"sourcesContent":["import { evaluateCurve } from '@/components/controls/CurveEditor';\n\nimport {\n autoValueRange,\n clamp,\n snapFrame,\n valueInset,\n yToValue,\n} from './timelineCoords';\nimport { selectionKey, selectionKeySet } from './timelineSelection';\n\nimport type {\n TimelineKeyframeRef,\n TimelineSelection,\n TimelineTrack,\n} from './Timeline.types';\nimport type { TrackGeometry } from './timelineLayout';\nimport type { CurveKeyframe, TangentMode } from '@/types/keyframe';\n\nlet idCounter = 0;\n\n/** Generate a stable, unique keyframe id. */\nexport function generateKeyframeId(): string {\n idCounter += 1;\n return `kf_${Date.now().toString(36)}_${idCounter}`;\n}\n\n/** Build a keyframe at `(frame, value)` with flat tangents. */\nexport function makeKeyframe(frame: number, value = 0): CurveKeyframe {\n return {\n id: generateKeyframeId(),\n x: frame,\n y: value,\n handleIn: { x: 0, y: 0 },\n handleOut: { x: 0, y: 0 },\n tangentMode: 'auto',\n };\n}\n\n/**\n * Pick the value (y) for a new keyframe inserted at a pointer position.\n * In a graph / expanded row, the click's pixel-y is converted back to a value\n * on the track's value axis (clamped to `valueRange`), so the new keyframe\n * lands exactly under the cursor. In a dope-sheet row (no visible y axis) the\n * new keyframe sits **on the existing curve** at the clicked frame so it\n * doesn't disturb the shape; with no existing keyframes it falls back to the\n * midpoint of the range.\n */\nexport function valueAtPointer(args: {\n pointerY: number;\n frame: number;\n track: TimelineTrack;\n geometry: TrackGeometry | undefined;\n rulerHeight: number;\n scrollTop: number;\n}): number {\n const { pointerY, frame, track, geometry, rulerHeight, scrollTop } = args;\n const range = geometry?.range ?? autoValueRange(track.keyframes);\n if (geometry?.graph) {\n const screenTop = rulerHeight + geometry.top - scrollTop;\n return clamp(\n yToValue(pointerY, range, screenTop, geometry.height),\n range[0],\n range[1]\n );\n }\n if (track.keyframes.length > 0) {\n return evaluateCurve(\n {\n keyframes: track.keyframes,\n domainX: [0, 1],\n domainY: [range[0], range[1]],\n },\n frame\n );\n }\n return (range[0] + range[1]) / 2;\n}\n\n/**\n * Move the selected keyframes by `deltaFrames` from the supplied (original)\n * track positions, snapping + clamping each to `[min, max]`. Pass the tracks\n * captured at drag-start so repeated calls don't accumulate drift.\n */\nexport function moveSelectedKeyframes(\n tracks: ReadonlyArray<TimelineTrack>,\n selection: TimelineSelection,\n deltaFrames: number,\n snap: boolean | number,\n min: number,\n max: number\n): TimelineTrack[] {\n const keys = selectionKeySet(selection);\n return tracks.map(track => {\n if (track.locked) return track;\n let changed = false;\n const keyframes = track.keyframes.map(kf => {\n if (\n kf.id === undefined ||\n !keys.has(selectionKey({ trackId: track.id, keyframeId: kf.id }))\n )\n return kf;\n changed = true;\n return { ...kf, x: clamp(snapFrame(kf.x + deltaFrames, snap), min, max) };\n });\n // `changed` is mutated inside the map callback above; TS narrows it to the\n // `false` literal because it can't track that mutation across the closure.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!changed) return track;\n keyframes.sort((a, b) => a.x - b.x);\n return { ...track, keyframes };\n });\n}\n\n/**\n * Graph-mode move: shifts selected keyframes by `deltaFrames` (x, snapped +\n * clamped) and by a pixel delta on the value axis, converted per track using\n * its row height + value range. Pass drag-start tracks so the range mapping\n * stays stable across the drag.\n */\nexport function moveSelectedKeyframesGraph(\n tracks: ReadonlyArray<TimelineTrack>,\n selection: TimelineSelection,\n deltaFrames: number,\n deltaYPixels: number,\n trackHeight: number,\n expandedHeight: number,\n snap: boolean | number,\n min: number,\n max: number\n): TimelineTrack[] {\n const keys = selectionKeySet(selection);\n return tracks.map(track => {\n if (track.locked) return track;\n const keyMatches = track.keyframes.some(\n kf =>\n kf.id !== undefined &&\n keys.has(selectionKey({ trackId: track.id, keyframeId: kf.id }))\n );\n if (!keyMatches) return track;\n const rowH =\n track.height ?? (track.expanded ? expandedHeight : trackHeight);\n const range = track.valueRange ?? autoValueRange(track.keyframes);\n const inset = valueInset(rowH);\n const usable = Math.max(1e-6, rowH - inset * 2);\n const valueDelta = -(deltaYPixels / usable) * (range[1] - range[0]);\n const keyframes = track.keyframes.map(kf => {\n if (\n kf.id === undefined ||\n !keys.has(selectionKey({ trackId: track.id, keyframeId: kf.id }))\n )\n return kf;\n return {\n ...kf,\n x: clamp(snapFrame(kf.x + deltaFrames, snap), min, max),\n y: clamp(kf.y + valueDelta, range[0], range[1]),\n };\n });\n keyframes.sort((a, b) => a.x - b.x);\n return { ...track, keyframes };\n });\n}\n\n/** Remove the selected keyframes from their tracks. */\nexport function removeSelectedKeyframes(\n tracks: ReadonlyArray<TimelineTrack>,\n selection: TimelineSelection\n): TimelineTrack[] {\n const keys = selectionKeySet(selection);\n return tracks.map(track => {\n const keyframes = track.keyframes.filter(\n kf =>\n kf.id === undefined ||\n !keys.has(selectionKey({ trackId: track.id, keyframeId: kf.id }))\n );\n return keyframes.length === track.keyframes.length\n ? track\n : { ...track, keyframes };\n });\n}\n\n/** Insert a keyframe into a track, keeping the track's keyframes sorted by x. */\nexport function addKeyframe(\n tracks: ReadonlyArray<TimelineTrack>,\n trackId: string,\n keyframe: CurveKeyframe\n): TimelineTrack[] {\n return tracks.map(track => {\n if (track.id !== trackId) return track;\n const keyframes = [...track.keyframes, keyframe].sort((a, b) => a.x - b.x);\n return { ...track, keyframes };\n });\n}\n\n/**\n * Apply a dragged tangent handle offset (domain units) to one keyframe,\n * honoring its tangent mode. `auto` / `linear` / `step` are promoted to\n * `aligned` on first drag; `aligned` keeps the opposite handle collinear at\n * its current length; `mirrored` makes it the exact opposite; `free` moves\n * only the dragged handle.\n */\nfunction applyTangent(\n kf: CurveKeyframe,\n which: 'in' | 'out',\n offset: { x: number; y: number }\n): CurveKeyframe {\n const mode =\n kf.tangentMode === 'auto' ||\n kf.tangentMode === 'linear' ||\n kf.tangentMode === 'step'\n ? 'aligned'\n : kf.tangentMode;\n\n let handleIn = which === 'in' ? offset : kf.handleIn;\n let handleOut = which === 'out' ? offset : kf.handleOut;\n\n if (mode === 'aligned' || mode === 'mirrored') {\n const draggedLen = Math.hypot(offset.x, offset.y);\n const other = which === 'in' ? kf.handleOut : kf.handleIn;\n const otherLen =\n mode === 'mirrored' ? draggedLen : Math.hypot(other.x, other.y);\n if (draggedLen > 1e-6) {\n const opposite = {\n x: (-offset.x / draggedLen) * otherLen,\n y: (-offset.y / draggedLen) * otherLen,\n };\n if (which === 'in') handleOut = opposite;\n else handleIn = opposite;\n }\n }\n\n return { ...kf, handleIn, handleOut, tangentMode: mode };\n}\n\n/**\n * Set the tangent mode on every selected keyframe. The mode interpretation\n * (how handles are read during draw / drag) happens elsewhere — this writes\n * the `tangentMode` field and leaves handle values alone, so flipping back\n * preserves them.\n */\nexport function setSelectedTangentMode(\n tracks: ReadonlyArray<TimelineTrack>,\n selection: TimelineSelection,\n mode: TangentMode\n): TimelineTrack[] {\n const keys = selectionKeySet(selection);\n return tracks.map(track => {\n if (track.locked) return track;\n let changed = false;\n const keyframes = track.keyframes.map(kf => {\n if (\n kf.id === undefined ||\n !keys.has(selectionKey({ trackId: track.id, keyframeId: kf.id }))\n )\n return kf;\n if (kf.tangentMode === mode) return kf;\n changed = true;\n return { ...kf, tangentMode: mode };\n });\n // `changed` is mutated inside the map callback; TS can't track that across\n // the closure and narrows it to the `false` literal.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return changed ? { ...track, keyframes } : track;\n });\n}\n\n/**\n * The tangent mode that's currently in effect for the selection — or\n * `'mixed'` when selected keyframes disagree, or `null` when nothing\n * applicable is selected. Lets a UI render the right toggle state.\n */\nexport function selectedTangentMode(\n tracks: ReadonlyArray<TimelineTrack>,\n selection: TimelineSelection\n): TangentMode | 'mixed' | null {\n if (selection.length === 0) return null;\n const byId = new Map(tracks.map(t => [t.id, t]));\n let mode: TangentMode | null = null;\n for (const ref of selection) {\n const t = byId.get(ref.trackId);\n if (!t) continue;\n const kf = t.keyframes.find(k => k.id === ref.keyframeId);\n if (!kf) continue;\n if (mode === null) mode = kf.tangentMode;\n else if (mode !== kf.tangentMode) return 'mixed';\n }\n return mode;\n}\n\n/** Set one keyframe's in/out tangent handle to a new offset (domain units). */\nexport function setKeyframeTangent(\n tracks: ReadonlyArray<TimelineTrack>,\n ref: TimelineKeyframeRef,\n which: 'in' | 'out',\n offset: { x: number; y: number }\n): TimelineTrack[] {\n return tracks.map(track => {\n if (track.id !== ref.trackId || track.locked) return track;\n let changed = false;\n const keyframes = track.keyframes.map(kf => {\n if (kf.id !== ref.keyframeId) return kf;\n changed = true;\n return applyTangent(kf, which, offset);\n });\n // `changed` is mutated inside the map callback; TS can't track that across\n // the closure and narrows it to the `false` literal.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return changed ? { ...track, keyframes } : track;\n });\n}\n\n/** Clipboard payload — selected keyframes captured relative to the earliest. */\nexport interface TimelineClipboard {\n entries: ReadonlyArray<{\n trackId: string;\n dx: number;\n keyframe: CurveKeyframe;\n }>;\n}\n\n/** Capture the selected keyframes into a clipboard payload (relative offsets). */\nexport function copySelectedKeyframes(\n tracks: ReadonlyArray<TimelineTrack>,\n selection: TimelineSelection\n): TimelineClipboard {\n const keys = selectionKeySet(selection);\n const picked: { trackId: string; keyframe: CurveKeyframe }[] = [];\n for (const track of tracks) {\n for (const kf of track.keyframes) {\n if (\n kf.id !== undefined &&\n keys.has(selectionKey({ trackId: track.id, keyframeId: kf.id }))\n ) {\n picked.push({ trackId: track.id, keyframe: kf });\n }\n }\n }\n if (picked.length === 0) return { entries: [] };\n // Avoid `Math.min(...spread)` — stack overflows at large selections.\n let base = Infinity;\n for (const p of picked) if (p.keyframe.x < base) base = p.keyframe.x;\n return {\n entries: picked.map(p => ({\n trackId: p.trackId,\n dx: p.keyframe.x - base,\n keyframe: p.keyframe,\n })),\n };\n}\n\n/**\n * Paste a clipboard payload at `atFrame`, preserving relative offsets and\n * assigning fresh ids. Skips locked / missing tracks. Returns the new tracks\n * plus refs to the pasted keyframes (for selecting them).\n */\nexport function pasteKeyframes(\n tracks: ReadonlyArray<TimelineTrack>,\n clipboard: TimelineClipboard,\n atFrame: number\n): { tracks: TimelineTrack[]; refs: TimelineKeyframeRef[] } {\n const validTracks = new Set(tracks.filter(t => !t.locked).map(t => t.id));\n const additions = new Map<string, CurveKeyframe[]>();\n const refs: TimelineKeyframeRef[] = [];\n for (const entry of clipboard.entries) {\n if (!validTracks.has(entry.trackId)) continue;\n const keyframe: CurveKeyframe = {\n ...entry.keyframe,\n id: generateKeyframeId(),\n x: atFrame + entry.dx,\n };\n refs.push({ trackId: entry.trackId, keyframeId: keyframe.id as string });\n const list = additions.get(entry.trackId) ?? [];\n list.push(keyframe);\n additions.set(entry.trackId, list);\n }\n const next = tracks.map(track => {\n const adds = additions.get(track.id);\n if (!adds) return track;\n const keyframes = [...track.keyframes, ...adds].sort((a, b) => a.x - b.x);\n return { ...track, keyframes };\n });\n return { tracks: next, refs };\n}\n\n/** Move a track from one full-array index to another. */\nexport function moveTrack(\n tracks: ReadonlyArray<TimelineTrack>,\n fromIndex: number,\n toIndex: number\n): TimelineTrack[] {\n const next = tracks.slice();\n const [moved] = next.splice(fromIndex, 1);\n if (!moved) return next;\n next.splice(Math.max(0, Math.min(next.length, toIndex)), 0, moved);\n return next;\n}\n\n/**\n * Reorder from a header drag: move the dragged track to a gap among the\n * visible rows (`dropVisibleIndex` in `[0, visibleCount]`). Maps visible gaps\n * back to full-array indices and corrects for forward moves.\n */\nexport function reorderTracksByDrop(\n tracks: ReadonlyArray<TimelineTrack>,\n draggingId: string,\n dropVisibleIndex: number\n): TimelineTrack[] {\n const fromFull = tracks.findIndex(t => t.id === draggingId);\n if (fromFull < 0) return tracks.slice();\n const visible = tracks.filter(t => !t.hidden);\n let gapFull: number;\n if (dropVisibleIndex >= visible.length) {\n gapFull = tracks.length;\n } else {\n const target = visible[dropVisibleIndex];\n gapFull = target\n ? tracks.findIndex(t => t.id === target.id)\n : tracks.length;\n }\n const toIndex = fromFull < gapFull ? gapFull - 1 : gapFull;\n return moveTrack(tracks, fromFull, toIndex);\n}\n"],"names":[],"mappings":"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"}
|