entangle-ui 0.9.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 +766 -0
- package/README.md +8 -6
- package/dist/esm/assets/src/components/controls/FileTree/FileTree.css.ts.vanilla-YmktPvnr.css +48 -0
- 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/controls/TreeView/{TreeNode.css.ts.vanilla-B_f8pUb8.css → TreeNode.css.ts.vanilla-DXPJRWZZ.css} +31 -24
- package/dist/esm/assets/src/components/editor/AssetBrowser/AssetBrowser.css.ts.vanilla-B2S4cEiY.css +262 -0
- package/dist/esm/assets/src/components/editor/Minimap/Minimap.css.ts.vanilla--rNdWQwy.css +133 -0
- package/dist/esm/assets/src/components/editor/NodeGraph/NodeGraph.css.ts.vanilla-ClF4YZvl.css +401 -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/assets/src/components/editor/Timeline/Timeline.css.ts.vanilla-DDX6Zalo.css +203 -0
- package/dist/esm/assets/src/components/feedback/LogView/LogView.css.ts.vanilla-nB5ENOpw.css +312 -0
- package/dist/esm/assets/src/components/navigation/Menu/Menu.css.ts.vanilla-B5iVe5S2.css +88 -0
- package/dist/esm/assets/src/components/navigation/PathBar/PathBar.css.ts.vanilla-BIEzQQOf.css +10 -0
- package/dist/esm/assets/src/components/primitives/viewport/Viewport.css.ts.vanilla-CkFBJ7Vo.css +65 -0
- package/dist/esm/assets/src/components/shell/FloatingPanel/{FloatingPanel.css.ts.vanilla-1rIAXEFp.css → FloatingPanel.css.ts.vanilla-CRaeYJ2b.css} +20 -13
- package/dist/esm/assets/src/theme/{darkTheme.css.ts.vanilla-ab1WD4dr.css → darkTheme.css.ts.vanilla-BHZ3ecRn.css} +3 -3
- package/dist/esm/assets/src/theme/{lightTheme.css.ts.vanilla-OaRI_wIc.css → lightTheme.css.ts.vanilla-Ct6f9Iym.css} +3 -3
- 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 +2 -2
- 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 +31 -0
- package/dist/esm/components/Icons/ImageIcon.js.map +1 -0
- 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 +2 -2
- 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 +3 -3
- package/dist/esm/components/controls/CartesianPicker/CartesianPicker.js.map +1 -1
- package/dist/esm/components/controls/CartesianPicker/useCartesianInteraction.js +7 -5
- 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 +2 -2
- package/dist/esm/components/controls/ColorPicker/ColorArea.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorInputs.js +16 -2
- package/dist/esm/components/controls/ColorPicker/ColorInputs.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorPalette.js +3 -1
- package/dist/esm/components/controls/ColorPicker/ColorPalette.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorPicker.js +6 -6
- package/dist/esm/components/controls/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/esm/components/controls/ColorPicker/ColorPresets.js +3 -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 +46 -23
- package/dist/esm/components/controls/Combobox/Combobox.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/CurveCanvas.js +11 -4
- package/dist/esm/components/controls/CurveEditor/CurveCanvas.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/CurveEditor.js +4 -4
- package/dist/esm/components/controls/CurveEditor/CurveEditor.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/CurveToolbar.js +7 -5
- 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 +13 -15
- package/dist/esm/components/controls/CurveEditor/curveUtils.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/useCurveInteraction.js +72 -50
- package/dist/esm/components/controls/CurveEditor/useCurveInteraction.js.map +1 -1
- package/dist/esm/components/controls/CurveEditor/useCurveRenderer.js +11 -3
- package/dist/esm/components/controls/CurveEditor/useCurveRenderer.js.map +1 -1
- package/dist/esm/components/controls/FileTree/FileTree.css.js +9 -0
- package/dist/esm/components/controls/FileTree/FileTree.css.js.map +1 -0
- package/dist/esm/components/controls/FileTree/FileTree.js +252 -0
- package/dist/esm/components/controls/FileTree/FileTree.js.map +1 -0
- package/dist/esm/components/controls/FileTree/fileTreeIcons.js +129 -0
- package/dist/esm/components/controls/FileTree/fileTreeIcons.js.map +1 -0
- package/dist/esm/components/controls/FileTree/fileTreeLabels.js +8 -0
- package/dist/esm/components/controls/FileTree/fileTreeLabels.js.map +1 -0
- package/dist/esm/components/controls/FileTree/useFileTreeDrop.js +115 -0
- package/dist/esm/components/controls/FileTree/useFileTreeDrop.js.map +1 -0
- package/dist/esm/components/controls/FileUploader/FileUploader.js +3 -6
- package/dist/esm/components/controls/FileUploader/FileUploader.js.map +1 -1
- package/dist/esm/components/controls/MultiSelect/MultiSelect.js +46 -15
- package/dist/esm/components/controls/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/esm/components/controls/NumberInput/NumberInput.js +11 -4
- package/dist/esm/components/controls/NumberInput/NumberInput.js.map +1 -1
- package/dist/esm/components/controls/NumberInput/useNumberInput.js +6 -2
- 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 +44 -16
- package/dist/esm/components/controls/Select/Select.js.map +1 -1
- package/dist/esm/components/controls/Slider/Slider.js +6 -8
- package/dist/esm/components/controls/Slider/Slider.js.map +1 -1
- package/dist/esm/components/controls/TagInput/TagInput.js +4 -2
- package/dist/esm/components/controls/TagInput/TagInput.js.map +1 -1
- package/dist/esm/components/controls/TreeView/TreeNode.css.js +9 -8
- package/dist/esm/components/controls/TreeView/TreeNode.css.js.map +1 -1
- package/dist/esm/components/controls/TreeView/TreeNode.js +42 -7
- package/dist/esm/components/controls/TreeView/TreeNode.js.map +1 -1
- package/dist/esm/components/controls/TreeView/TreeView.js +18 -6
- package/dist/esm/components/controls/TreeView/TreeView.js.map +1 -1
- package/dist/esm/components/controls/TreeView/useTreeState.js +2 -6
- package/dist/esm/components/controls/TreeView/useTreeState.js.map +1 -1
- package/dist/esm/components/controls/VectorInput/VectorInput.js +13 -4
- package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
- package/dist/esm/components/data/DataTable/DataTable.js +25 -8
- package/dist/esm/components/data/DataTable/DataTable.js.map +1 -1
- package/dist/esm/components/editor/AssetBrowser/AssetBrowser.css.js +46 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowser.css.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowser.js +254 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowser.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserAnnouncementLive.js +17 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserAnnouncementLive.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserBreadcrumbs.js +25 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserBreadcrumbs.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContent.js +140 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContent.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContext.js +81 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContext.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContextMenu.js +123 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserContextMenu.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserDefaultMenus.js +136 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserDefaultMenus.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserGrid.js +137 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserGrid.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserGridItem.js +226 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserGridItem.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserList.js +189 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserList.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserRenameField.js +63 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserRenameField.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserSidebar.js +19 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserSidebar.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserStatusBar.js +24 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserStatusBar.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserStore.js +176 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserStore.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserSurface.js +120 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserSurface.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserToolbar.js +134 -0
- package/dist/esm/components/editor/AssetBrowser/AssetBrowserToolbar.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserFilter.js +90 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserFilter.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserFormat.js +32 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserFormat.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserGeometry.js +70 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserGeometry.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserKeyboard.js +62 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserKeyboard.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserLabels.js +52 -0
- package/dist/esm/components/editor/AssetBrowser/assetBrowserLabels.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/slots.js +18 -0
- package/dist/esm/components/editor/AssetBrowser/slots.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserAnnouncement.js +19 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserAnnouncement.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserHandle.js +70 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserHandle.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserViewState.js +108 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetBrowserViewState.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetDnd.js +192 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetDnd.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetGridKeyboardNav.js +91 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetGridKeyboardNav.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetGridVirtualizer.js +91 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetGridVirtualizer.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetMarqueeGesture.js +128 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetMarqueeGesture.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetMutationKeyboard.js +72 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetMutationKeyboard.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetMutations.js +141 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetMutations.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetNavigation.js +113 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetNavigation.js.map +1 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetSelectionController.js +174 -0
- package/dist/esm/components/editor/AssetBrowser/useAssetSelectionController.js.map +1 -0
- package/dist/esm/components/editor/ChatPanel/ChatActionBar.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatAttachment.js +8 -2
- 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 +20 -4
- package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatContextChip.js +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatContextChip.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatEmptyState.js +3 -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 +10 -3
- 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 +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMessage.js +10 -3
- package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMessageList.js +5 -3
- 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 +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 +7 -4
- package/dist/esm/components/editor/ChatPanel/useChatMessages.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/useChatScroll.js +6 -1
- package/dist/esm/components/editor/ChatPanel/useChatScroll.js.map +1 -1
- package/dist/esm/components/editor/Minimap/Minimap.css.js +18 -0
- package/dist/esm/components/editor/Minimap/Minimap.css.js.map +1 -0
- package/dist/esm/components/editor/Minimap/Minimap.js +257 -0
- package/dist/esm/components/editor/Minimap/Minimap.js.map +1 -0
- package/dist/esm/components/editor/Minimap/Minimap.types.js +11 -0
- package/dist/esm/components/editor/Minimap/Minimap.types.js.map +1 -0
- package/dist/esm/components/editor/Minimap/MinimapContext.js +48 -0
- package/dist/esm/components/editor/Minimap/MinimapContext.js.map +1 -0
- package/dist/esm/components/editor/Minimap/MinimapCorner.js +16 -0
- package/dist/esm/components/editor/Minimap/MinimapCorner.js.map +1 -0
- package/dist/esm/components/editor/Minimap/MinimapFooter.js +16 -0
- package/dist/esm/components/editor/Minimap/MinimapFooter.js.map +1 -0
- package/dist/esm/components/editor/Minimap/MinimapStore.js +166 -0
- package/dist/esm/components/editor/Minimap/MinimapStore.js.map +1 -0
- package/dist/esm/components/editor/Minimap/MinimapTitle.js +16 -0
- package/dist/esm/components/editor/Minimap/MinimapTitle.js.map +1 -0
- package/dist/esm/components/editor/Minimap/ViewportMinimap.js +69 -0
- package/dist/esm/components/editor/Minimap/ViewportMinimap.js.map +1 -0
- package/dist/esm/components/editor/Minimap/computeBoundsFromItems.js +65 -0
- package/dist/esm/components/editor/Minimap/computeBoundsFromItems.js.map +1 -0
- package/dist/esm/components/editor/Minimap/index.js +15 -0
- package/dist/esm/components/editor/Minimap/index.js.map +1 -0
- package/dist/esm/components/editor/Minimap/minimapCoords.js +105 -0
- package/dist/esm/components/editor/Minimap/minimapCoords.js.map +1 -0
- package/dist/esm/components/editor/Minimap/minimapDrawing.js +93 -0
- package/dist/esm/components/editor/Minimap/minimapDrawing.js.map +1 -0
- package/dist/esm/components/editor/Minimap/minimapHitTest.js +59 -0
- package/dist/esm/components/editor/Minimap/minimapHitTest.js.map +1 -0
- package/dist/esm/components/editor/Minimap/useMinimapGestures.js +299 -0
- package/dist/esm/components/editor/Minimap/useMinimapGestures.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraph.css.js +36 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraph.css.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraph.js +627 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraph.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraph.types.js +10 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraph.types.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphContext.js +54 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphContext.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphEdgeLabels.js +137 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphEdgeLabels.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphGroup.js +211 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphGroup.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphMinimap.js +122 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphMinimap.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNode.js +170 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNode.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeContext.js +21 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeContext.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeParts.js +56 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeParts.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSection.js +59 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSection.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSectionContext.js +17 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSectionContext.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphPin.js +35 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphPin.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphPort.js +191 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphPort.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphPortVisual.js +46 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphPortVisual.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphSlots.js +50 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphSlots.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphSpawnPalette.js +70 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphSpawnPalette.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphStore.js +543 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphStore.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphToolbar.js +100 -0
- package/dist/esm/components/editor/NodeGraph/NodeGraphToolbar.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/createTypeMatchValidator.js +37 -0
- package/dist/esm/components/editor/NodeGraph/createTypeMatchValidator.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/nodeGraphActions.js +53 -0
- package/dist/esm/components/editor/NodeGraph/nodeGraphActions.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/nodeGraphDrawing.js +461 -0
- package/dist/esm/components/editor/NodeGraph/nodeGraphDrawing.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/nodeGraphIds.js +31 -0
- package/dist/esm/components/editor/NodeGraph/nodeGraphIds.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/nodeGraphMath.js +350 -0
- package/dist/esm/components/editor/NodeGraph/nodeGraphMath.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/sortSlots.js +69 -0
- package/dist/esm/components/editor/NodeGraph/sortSlots.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/useDragGesture.js +63 -0
- package/dist/esm/components/editor/NodeGraph/useDragGesture.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraph.js +207 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraph.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphConnection.js +334 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphConnection.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphEdgeInteraction.js +137 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphEdgeInteraction.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphGroupDrag.js +392 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphGroupDrag.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphKeyboard.js +164 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphKeyboard.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphNodeDrag.js +234 -0
- package/dist/esm/components/editor/NodeGraph/useNodeGraphNodeDrag.js.map +1 -0
- package/dist/esm/components/editor/NodeGraph/useStoreSlice.js +49 -0
- package/dist/esm/components/editor/NodeGraph/useStoreSlice.js.map +1 -0
- package/dist/esm/components/editor/PropertyInspector/PropertyGroup.js +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 +12 -7
- 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 +21 -5
- 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 +32 -11
- 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.css.js +23 -0
- package/dist/esm/components/editor/Timeline/Timeline.css.js.map +1 -0
- package/dist/esm/components/editor/Timeline/Timeline.js +450 -0
- package/dist/esm/components/editor/Timeline/Timeline.js.map +1 -0
- package/dist/esm/components/editor/Timeline/Timeline.types.js +10 -0
- package/dist/esm/components/editor/Timeline/Timeline.types.js.map +1 -0
- package/dist/esm/components/editor/Timeline/TimelineContext.js +69 -0
- package/dist/esm/components/editor/Timeline/TimelineContext.js.map +1 -0
- package/dist/esm/components/editor/Timeline/TimelineFooter.js +16 -0
- package/dist/esm/components/editor/Timeline/TimelineFooter.js.map +1 -0
- package/dist/esm/components/editor/Timeline/TimelineMinimap.js +280 -0
- package/dist/esm/components/editor/Timeline/TimelineMinimap.js.map +1 -0
- package/dist/esm/components/editor/Timeline/TimelineStore.js +289 -0
- package/dist/esm/components/editor/Timeline/TimelineStore.js.map +1 -0
- package/dist/esm/components/editor/Timeline/TimelineToolbar.js +15 -0
- package/dist/esm/components/editor/Timeline/TimelineToolbar.js.map +1 -0
- package/dist/esm/components/editor/Timeline/TimelineTrackHeaders.js +142 -0
- package/dist/esm/components/editor/Timeline/TimelineTrackHeaders.js.map +1 -0
- package/dist/esm/components/editor/Timeline/TimelineTrackScale.js +18 -0
- package/dist/esm/components/editor/Timeline/TimelineTrackScale.js.map +1 -0
- package/dist/esm/components/editor/Timeline/index.js +18 -0
- package/dist/esm/components/editor/Timeline/index.js.map +1 -0
- package/dist/esm/components/editor/Timeline/timelineCoords.js +118 -0
- package/dist/esm/components/editor/Timeline/timelineCoords.js.map +1 -0
- package/dist/esm/components/editor/Timeline/timelineDrawing.js +390 -0
- package/dist/esm/components/editor/Timeline/timelineDrawing.js.map +1 -0
- package/dist/esm/components/editor/Timeline/timelineEdits.js +323 -0
- package/dist/esm/components/editor/Timeline/timelineEdits.js.map +1 -0
- package/dist/esm/components/editor/Timeline/timelineHitTest.js +153 -0
- package/dist/esm/components/editor/Timeline/timelineHitTest.js.map +1 -0
- package/dist/esm/components/editor/Timeline/timelineLayout.js +39 -0
- package/dist/esm/components/editor/Timeline/timelineLayout.js.map +1 -0
- package/dist/esm/components/editor/Timeline/timelineSelection.js +0 -0
- package/dist/esm/components/editor/Timeline/timelineSelection.js.map +1 -0
- package/dist/esm/components/editor/Timeline/useTimelineDraw.js +156 -0
- package/dist/esm/components/editor/Timeline/useTimelineDraw.js.map +1 -0
- package/dist/esm/components/editor/Timeline/useTimelineGestures.js +587 -0
- package/dist/esm/components/editor/Timeline/useTimelineGestures.js.map +1 -0
- package/dist/esm/components/editor/Timeline/useTimelinePlayback.js +85 -0
- package/dist/esm/components/editor/Timeline/useTimelinePlayback.js.map +1 -0
- package/dist/esm/components/editor/TransformControl/TransformControl.js +4 -4
- package/dist/esm/components/editor/TransformControl/TransformControl.js.map +1 -1
- package/dist/esm/components/editor/ViewportGizmo/ViewportGizmo.js +8 -4
- package/dist/esm/components/editor/ViewportGizmo/ViewportGizmo.js.map +1 -1
- package/dist/esm/components/editor/ViewportGizmo/gizmoMath.js +6 -2
- package/dist/esm/components/editor/ViewportGizmo/gizmoMath.js.map +1 -1
- package/dist/esm/components/editor/ViewportGizmo/useGizmoInteraction.js +8 -6
- package/dist/esm/components/editor/ViewportGizmo/useGizmoInteraction.js.map +1 -1
- package/dist/esm/components/editor/ViewportGizmo/useGizmoRenderer.js +1 -2
- package/dist/esm/components/editor/ViewportGizmo/useGizmoRenderer.js.map +1 -1
- package/dist/esm/components/feedback/Alert/Alert.js +8 -8
- 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 +32 -22
- 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 +3 -1
- package/dist/esm/components/feedback/CommandPalette/useRecentItems.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/Dialog.js +6 -3
- 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 +1 -1
- package/dist/esm/components/feedback/Dialog/DialogHeader.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/useDialogAnimation.js +10 -2
- package/dist/esm/components/feedback/Dialog/useDialogAnimation.js.map +1 -1
- package/dist/esm/components/feedback/Drawer/Drawer.js +4 -1
- package/dist/esm/components/feedback/Drawer/Drawer.js.map +1 -1
- package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js +4 -0
- package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js.map +1 -1
- package/dist/esm/components/feedback/EmptyState/EmptyState.js +1 -1
- package/dist/esm/components/feedback/EmptyState/EmptyState.js.map +1 -1
- package/dist/esm/components/feedback/LogView/LogView.css.js +35 -0
- package/dist/esm/components/feedback/LogView/LogView.css.js.map +1 -0
- package/dist/esm/components/feedback/LogView/LogView.js +297 -0
- package/dist/esm/components/feedback/LogView/LogView.js.map +1 -0
- package/dist/esm/components/feedback/LogView/LogViewBody.js +205 -0
- package/dist/esm/components/feedback/LogView/LogViewBody.js.map +1 -0
- package/dist/esm/components/feedback/LogView/LogViewContext.js +31 -0
- package/dist/esm/components/feedback/LogView/LogViewContext.js.map +1 -0
- package/dist/esm/components/feedback/LogView/LogViewParts.js +73 -0
- package/dist/esm/components/feedback/LogView/LogViewParts.js.map +1 -0
- package/dist/esm/components/feedback/LogView/LogViewStore.js +240 -0
- package/dist/esm/components/feedback/LogView/LogViewStore.js.map +1 -0
- package/dist/esm/components/feedback/LogView/logViewLabels.js +25 -0
- package/dist/esm/components/feedback/LogView/logViewLabels.js.map +1 -0
- package/dist/esm/components/feedback/LogView/logViewLevels.js +74 -0
- package/dist/esm/components/feedback/LogView/logViewLevels.js.map +1 -0
- package/dist/esm/components/feedback/LogView/logViewUtils.js +128 -0
- package/dist/esm/components/feedback/LogView/logViewUtils.js.map +1 -0
- package/dist/esm/components/feedback/LogView/useFollowTail.js +95 -0
- package/dist/esm/components/feedback/LogView/useFollowTail.js.map +1 -0
- package/dist/esm/components/feedback/LogView/useLogSelection.js +113 -0
- package/dist/esm/components/feedback/LogView/useLogSelection.js.map +1 -0
- package/dist/esm/components/feedback/ProgressBar/CircularProgress.js +1 -1
- package/dist/esm/components/feedback/ProgressBar/CircularProgress.js.map +1 -1
- package/dist/esm/components/feedback/ProgressBar/ProgressBar.js +1 -1
- package/dist/esm/components/feedback/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/esm/components/feedback/Skeleton/Skeleton.js +1 -1
- package/dist/esm/components/feedback/Skeleton/Skeleton.js.map +1 -1
- package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js +1 -1
- package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js.map +1 -1
- package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js +1 -1
- package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js.map +1 -1
- package/dist/esm/components/feedback/Spinner/Spinner.js +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 +1 -1
- package/dist/esm/components/feedback/Toast/ToastContainer.js.map +1 -1
- package/dist/esm/components/feedback/Toast/ToastItem.js +7 -3
- 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 +1 -1
- package/dist/esm/components/layout/Accordion/Accordion.js.map +1 -1
- package/dist/esm/components/layout/Accordion/AccordionContent.js +1 -1
- package/dist/esm/components/layout/Accordion/AccordionContent.js.map +1 -1
- package/dist/esm/components/layout/Accordion/AccordionItem.js +1 -1
- package/dist/esm/components/layout/Accordion/AccordionItem.js.map +1 -1
- package/dist/esm/components/layout/Accordion/AccordionTrigger.js +7 -2
- package/dist/esm/components/layout/Accordion/AccordionTrigger.js.map +1 -1
- package/dist/esm/components/layout/Card/Card.js +2 -2
- 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 +1 -1
- package/dist/esm/components/layout/Flex/Flex.js.map +1 -1
- package/dist/esm/components/layout/Grid/Grid.js +1 -1
- package/dist/esm/components/layout/Grid/Grid.js.map +1 -1
- package/dist/esm/components/layout/ListItem/ListItem.js +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 +3 -3
- package/dist/esm/components/layout/PanelSurface/PanelSurface.js.map +1 -1
- package/dist/esm/components/layout/ScrollArea/ScrollArea.js +91 -23
- 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 +29 -16
- 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 +1 -1
- package/dist/esm/components/layout/Stack/Stack.js.map +1 -1
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js +4 -0
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -1
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js +6 -2
- 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 +13 -2
- package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/esm/components/navigation/ContextMenu/ContextMenu.js +45 -39
- package/dist/esm/components/navigation/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/esm/components/navigation/Menu/Menu.css.js +9 -12
- package/dist/esm/components/navigation/Menu/Menu.css.js.map +1 -1
- package/dist/esm/components/navigation/Menu/Menu.js +97 -63
- package/dist/esm/components/navigation/Menu/Menu.js.map +1 -1
- package/dist/esm/components/navigation/Menu/MenuGapContext.js +19 -0
- package/dist/esm/components/navigation/Menu/MenuGapContext.js.map +1 -0
- 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.css.js +6 -0
- package/dist/esm/components/navigation/PathBar/PathBar.css.js.map +1 -0
- package/dist/esm/components/navigation/PathBar/PathBar.js +184 -0
- package/dist/esm/components/navigation/PathBar/PathBar.js.map +1 -0
- package/dist/esm/components/navigation/PathBar/PathBarSiblingMenu.js +151 -0
- package/dist/esm/components/navigation/PathBar/PathBarSiblingMenu.js.map +1 -0
- package/dist/esm/components/navigation/PathBar/pathUtils.js +118 -0
- package/dist/esm/components/navigation/PathBar/pathUtils.js.map +1 -0
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js +16 -6
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js +1 -1
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/Tab.js +10 -3
- package/dist/esm/components/navigation/Tabs/Tab.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/TabList.js +5 -2
- package/dist/esm/components/navigation/Tabs/TabList.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/TabPanel.js +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 +11 -4
- package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/primitives/Avatar/AvatarGroup.js +2 -2
- package/dist/esm/components/primitives/Avatar/AvatarGroup.js.map +1 -1
- package/dist/esm/components/primitives/Badge/Badge.js +10 -3
- 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 +6 -4
- package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
- package/dist/esm/components/primitives/Checkbox/CheckboxGroup.js +2 -2
- 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 +2 -2
- package/dist/esm/components/primitives/Collapsible/Collapsible.js.map +1 -1
- package/dist/esm/components/primitives/HoverCard/HoverCard.js +5 -3
- package/dist/esm/components/primitives/HoverCard/HoverCard.js.map +1 -1
- package/dist/esm/components/primitives/Icon/Icon.js +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 +1 -1
- package/dist/esm/components/primitives/Input/Input.js.map +1 -1
- package/dist/esm/components/primitives/Kbd/Kbd.js +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 +1 -1
- package/dist/esm/components/primitives/Popover/Popover.js.map +1 -1
- package/dist/esm/components/primitives/Popover/PopoverClose.js +1 -1
- package/dist/esm/components/primitives/Popover/PopoverClose.js.map +1 -1
- package/dist/esm/components/primitives/Popover/PopoverContent.js +6 -4
- 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 +3 -3
- package/dist/esm/components/primitives/Radio/Radio.js.map +1 -1
- package/dist/esm/components/primitives/Radio/RadioGroup.js +2 -2
- package/dist/esm/components/primitives/Radio/RadioGroup.js.map +1 -1
- package/dist/esm/components/primitives/Switch/Switch.js +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 +3 -4
- package/dist/esm/components/primitives/TextArea/TextArea.js.map +1 -1
- package/dist/esm/components/primitives/Tooltip/Arrow.js +1 -1
- package/dist/esm/components/primitives/Tooltip/Arrow.js.map +1 -1
- package/dist/esm/components/primitives/Tooltip/Tooltip.js +9 -7
- package/dist/esm/components/primitives/Tooltip/Tooltip.js.map +1 -1
- package/dist/esm/components/primitives/Tooltip/utils.js +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 +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 +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 +8 -2
- package/dist/esm/components/primitives/canvas/useCanvasRenderer.js.map +1 -1
- package/dist/esm/components/primitives/viewport/Viewport.css.js +12 -0
- package/dist/esm/components/primitives/viewport/Viewport.css.js.map +1 -0
- package/dist/esm/components/primitives/viewport/Viewport.js +189 -0
- package/dist/esm/components/primitives/viewport/Viewport.js.map +1 -0
- package/dist/esm/components/primitives/viewport/ViewportContext.js +47 -0
- package/dist/esm/components/primitives/viewport/ViewportContext.js.map +1 -0
- package/dist/esm/components/primitives/viewport/ViewportLayer.js +113 -0
- package/dist/esm/components/primitives/viewport/ViewportLayer.js.map +1 -0
- package/dist/esm/components/primitives/viewport/ViewportOverlay.js +47 -0
- package/dist/esm/components/primitives/viewport/ViewportOverlay.js.map +1 -0
- package/dist/esm/components/primitives/viewport/ViewportStore.js +210 -0
- package/dist/esm/components/primitives/viewport/ViewportStore.js.map +1 -0
- package/dist/esm/components/primitives/viewport/ViewportWorld.js +38 -0
- package/dist/esm/components/primitives/viewport/ViewportWorld.js.map +1 -0
- package/dist/esm/components/primitives/viewport/useViewportGestures.js +333 -0
- package/dist/esm/components/primitives/viewport/useViewportGestures.js.map +1 -0
- package/dist/esm/components/primitives/viewport/viewportCoords.js +37 -0
- package/dist/esm/components/primitives/viewport/viewportCoords.js.map +1 -0
- package/dist/esm/components/primitives/viewport/viewportMath.js +77 -0
- package/dist/esm/components/primitives/viewport/viewportMath.js.map +1 -0
- package/dist/esm/components/shell/AppShell/AppShell.js +1 -1
- package/dist/esm/components/shell/AppShell/AppShell.js.map +1 -1
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.css.js +11 -10
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.css.js.map +1 -1
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js +60 -24
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js.map +1 -1
- package/dist/esm/components/shell/MenuBar/MenuBar.js +23 -16
- 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 +4 -3
- 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 +1 -1
- package/dist/esm/hooks/useBreakpoint/useBreakpoint.js.map +1 -1
- package/dist/esm/hooks/useClickOutside/useClickOutside.js +9 -9
- package/dist/esm/hooks/useClickOutside/useClickOutside.js.map +1 -1
- package/dist/esm/hooks/useClipboard/useClipboard.js +4 -0
- 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 +11 -6
- package/dist/esm/hooks/useDebounced/useDebouncedCallback.js.map +1 -1
- package/dist/esm/hooks/useDebounced/useDebouncedValue.js +16 -4
- 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 +49 -0
- package/dist/esm/hooks/useEventCallback/useEventCallback.js.map +1 -0
- package/dist/esm/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
- package/dist/esm/hooks/useHotkey/useHotkey.js +7 -12
- package/dist/esm/hooks/useHotkey/useHotkey.js.map +1 -1
- package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js +2 -0
- package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -1
- package/dist/esm/hooks/useIsMounted/useIsMounted.js +43 -0
- package/dist/esm/hooks/useIsMounted/useIsMounted.js.map +1 -0
- 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 +31 -0
- package/dist/esm/hooks/useLatest/useLatest.js.map +1 -0
- package/dist/esm/hooks/useListboxNav/useListboxNav.js +29 -13
- package/dist/esm/hooks/useListboxNav/useListboxNav.js.map +1 -1
- package/dist/esm/hooks/useMediaQuery/useMediaQuery.js +7 -1
- package/dist/esm/hooks/useMediaQuery/useMediaQuery.js.map +1 -1
- package/dist/esm/hooks/useMergedRef/useMergedRef.js +6 -1
- package/dist/esm/hooks/useMergedRef/useMergedRef.js.map +1 -1
- package/dist/esm/hooks/useNavigationHistory/useNavigationHistory.js +146 -0
- package/dist/esm/hooks/useNavigationHistory/useNavigationHistory.js.map +1 -0
- package/dist/esm/hooks/useResizeObserver/useResizeObserver.js +6 -8
- package/dist/esm/hooks/useResizeObserver/useResizeObserver.js.map +1 -1
- package/dist/esm/hooks/useTheme/useTheme.js +6 -3
- package/dist/esm/hooks/useTheme/useTheme.js.map +1 -1
- package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js +9 -4
- package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js.map +1 -1
- package/dist/esm/index.js +63 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/tslib/tslib.es6.js +37 -0
- package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -0
- package/dist/esm/styles.js +3 -0
- package/dist/esm/styles.js.map +1 -0
- package/dist/esm/theme/ThemeProvider.js +6 -4
- 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/contract.css.js +1 -1
- package/dist/esm/theme/createCustomTheme.js +2 -2
- package/dist/esm/theme/createCustomTheme.js.map +1 -1
- package/dist/esm/theme/createLightTheme.js.map +1 -1
- package/dist/esm/theme/darkTheme.css.js +2 -2
- package/dist/esm/theme/darkThemeValues.js +1 -1
- package/dist/esm/theme/darkThemeValues.js.map +1 -1
- package/dist/esm/theme/lightTheme.css.js +1 -1
- package/dist/esm/theme/lightThemeValues.js +1 -1
- package/dist/esm/theme/lightThemeValues.js.map +1 -1
- package/dist/esm/theme/themeContractData.js +4 -4
- package/dist/esm/theme/themeContractData.js.map +1 -1
- package/dist/esm/utils/cx.js.map +1 -1
- package/dist/esm/utils/devWarn.js +1 -1
- package/dist/esm/utils/devWarn.js.map +1 -1
- package/dist/esm/utils/mathExpression.js +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/AddIcon.d.ts +1 -1
- package/dist/types/components/Icons/AiChatIcon.d.ts +1 -1
- package/dist/types/components/Icons/AiSparklesIcon.d.ts +1 -1
- package/dist/types/components/Icons/ArchiveIcon.d.ts +1 -1
- package/dist/types/components/Icons/ArrowDownIcon.d.ts +1 -1
- package/dist/types/components/Icons/ArrowLeftIcon.d.ts +1 -1
- package/dist/types/components/Icons/ArrowRightIcon.d.ts +1 -1
- package/dist/types/components/Icons/ArrowUpIcon.d.ts +1 -1
- package/dist/types/components/Icons/BookmarkIcon.d.ts +1 -1
- package/dist/types/components/Icons/BugIcon.d.ts +1 -1
- package/dist/types/components/Icons/BuildingIcon.d.ts +1 -1
- package/dist/types/components/Icons/CalendarIcon.d.ts +1 -1
- package/dist/types/components/Icons/CameraIcon.d.ts +34 -0
- package/dist/types/components/Icons/CheckIcon.d.ts +1 -1
- package/dist/types/components/Icons/ChevronDownIcon.d.ts +1 -1
- package/dist/types/components/Icons/ChevronLeftIcon.d.ts +1 -1
- package/dist/types/components/Icons/ChevronRightIcon.d.ts +1 -1
- package/dist/types/components/Icons/ChevronUpIcon.d.ts +1 -1
- package/dist/types/components/Icons/CircleIcon.d.ts +1 -1
- package/dist/types/components/Icons/ClockIcon.d.ts +1 -1
- package/dist/types/components/Icons/CloseIcon.d.ts +1 -1
- package/dist/types/components/Icons/CloudUploadIcon.d.ts +1 -1
- package/dist/types/components/Icons/CodeIcon.d.ts +1 -1
- package/dist/types/components/Icons/CopyIcon.d.ts +1 -1
- package/dist/types/components/Icons/CubeIcon.d.ts +34 -0
- package/dist/types/components/Icons/CutIcon.d.ts +1 -1
- package/dist/types/components/Icons/DotsHorizontalIcon.d.ts +1 -1
- package/dist/types/components/Icons/DotsVerticalIcon.d.ts +1 -1
- package/dist/types/components/Icons/DownloadIcon.d.ts +1 -1
- package/dist/types/components/Icons/EditIcon.d.ts +1 -1
- package/dist/types/components/Icons/ErrorIcon.d.ts +1 -1
- package/dist/types/components/Icons/ExternalLinkIcon.d.ts +1 -1
- package/dist/types/components/Icons/EyeDropperIcon.d.ts +1 -1
- package/dist/types/components/Icons/EyeIcon.d.ts +1 -1
- package/dist/types/components/Icons/FileTextIcon.d.ts +1 -1
- package/dist/types/components/Icons/FilterIcon.d.ts +1 -1
- package/dist/types/components/Icons/FirstIcon.d.ts +1 -1
- package/dist/types/components/Icons/FolderCogIcon.d.ts +1 -1
- package/dist/types/components/Icons/FolderIcon.d.ts +1 -1
- package/dist/types/components/Icons/FolderOpenIcon.d.ts +1 -1
- package/dist/types/components/Icons/FullscreenIcon.d.ts +1 -1
- package/dist/types/components/Icons/GitBranchIcon.d.ts +1 -1
- package/dist/types/components/Icons/GridIcon.d.ts +1 -1
- package/dist/types/components/Icons/HeartIcon.d.ts +1 -1
- package/dist/types/components/Icons/HelpIcon.d.ts +1 -1
- package/dist/types/components/Icons/HomeIcon.d.ts +1 -1
- package/dist/types/components/Icons/ImageIcon.d.ts +34 -0
- package/dist/types/components/Icons/InfoIcon.d.ts +1 -1
- package/dist/types/components/Icons/LastIcon.d.ts +1 -1
- package/dist/types/components/Icons/LinkIcon.d.ts +1 -1
- package/dist/types/components/Icons/ListIcon.d.ts +1 -1
- package/dist/types/components/Icons/LockIcon.d.ts +1 -1
- package/dist/types/components/Icons/MaximizeIcon.d.ts +1 -1
- package/dist/types/components/Icons/MenuIcon.d.ts +1 -1
- package/dist/types/components/Icons/MinimizeIcon.d.ts +1 -1
- package/dist/types/components/Icons/MinusIcon.d.ts +1 -1
- package/dist/types/components/Icons/OrbitIcon.d.ts +34 -0
- package/dist/types/components/Icons/PasteIcon.d.ts +1 -1
- package/dist/types/components/Icons/PauseIcon.d.ts +1 -1
- package/dist/types/components/Icons/PinIcon.d.ts +1 -1
- package/dist/types/components/Icons/PlayIcon.d.ts +1 -1
- package/dist/types/components/Icons/RedoIcon.d.ts +1 -1
- package/dist/types/components/Icons/RefreshIcon.d.ts +1 -1
- package/dist/types/components/Icons/RobotIcon.d.ts +1 -1
- package/dist/types/components/Icons/RotateIcon.d.ts +35 -0
- package/dist/types/components/Icons/SaveIcon.d.ts +1 -1
- package/dist/types/components/Icons/SearchIcon.d.ts +1 -1
- package/dist/types/components/Icons/SendIcon.d.ts +1 -1
- package/dist/types/components/Icons/SettingsIcon.d.ts +1 -1
- package/dist/types/components/Icons/SortIcon.d.ts +1 -1
- package/dist/types/components/Icons/SpinIcon.d.ts +35 -0
- package/dist/types/components/Icons/StarIcon.d.ts +1 -1
- package/dist/types/components/Icons/StopIcon.d.ts +1 -1
- package/dist/types/components/Icons/SuccessIcon.d.ts +1 -1
- package/dist/types/components/Icons/TagIcon.d.ts +1 -1
- package/dist/types/components/Icons/TangentAlignedIcon.d.ts +1 -1
- package/dist/types/components/Icons/TangentAutoIcon.d.ts +1 -1
- package/dist/types/components/Icons/TangentFreeIcon.d.ts +1 -1
- package/dist/types/components/Icons/TangentLinearIcon.d.ts +1 -1
- package/dist/types/components/Icons/TangentMirroredIcon.d.ts +1 -1
- package/dist/types/components/Icons/TangentStepIcon.d.ts +1 -1
- package/dist/types/components/Icons/TerminalIcon.d.ts +1 -1
- package/dist/types/components/Icons/TrashIcon.d.ts +1 -1
- package/dist/types/components/Icons/UndoIcon.d.ts +1 -1
- package/dist/types/components/Icons/UnlinkIcon.d.ts +1 -1
- package/dist/types/components/Icons/UnlockIcon.d.ts +1 -1
- package/dist/types/components/Icons/UploadIcon.d.ts +1 -1
- package/dist/types/components/Icons/UserIcon.d.ts +1 -1
- package/dist/types/components/Icons/UsersIcon.d.ts +1 -1
- package/dist/types/components/Icons/WarningIcon.d.ts +1 -1
- package/dist/types/components/Icons/ZoomFitIcon.d.ts +35 -0
- package/dist/types/components/Icons/ZoomInIcon.d.ts +1 -1
- package/dist/types/components/Icons/ZoomOutIcon.d.ts +1 -1
- package/dist/types/components/controls/CartesianPicker/CartesianPicker.types.d.ts +3 -3
- package/dist/types/components/controls/ColorPicker/ColorPicker.types.d.ts +2 -2
- package/dist/types/components/controls/ColorPicker/EyeDropper.d.ts +1 -1
- package/dist/types/components/controls/Combobox/Combobox.types.d.ts +1 -1
- package/dist/types/components/controls/CurveEditor/CurveEditor.types.d.ts +8 -58
- package/dist/types/components/controls/CurveEditor/curveUtils.d.ts +2 -1
- package/dist/types/components/controls/FileTree/FileTree.d.ts +34 -0
- package/dist/types/components/controls/FileTree/FileTree.types.d.ts +133 -0
- package/dist/types/components/controls/FileTree/fileTreeIcons.d.ts +29 -0
- package/dist/types/components/controls/FileTree/fileTreeLabels.d.ts +19 -0
- package/dist/types/components/controls/FileUploader/FileUploader.types.d.ts +2 -2
- package/dist/types/components/controls/MultiSelect/MultiSelect.types.d.ts +1 -1
- package/dist/types/components/controls/NumberInput/NumberInput.d.ts +2 -2
- package/dist/types/components/controls/Select/Select.d.ts +1 -1
- package/dist/types/components/controls/Select/Select.types.d.ts +45 -11
- package/dist/types/components/controls/Slider/Slider.d.ts +1 -1
- package/dist/types/components/controls/TagInput/TagInput.types.d.ts +2 -2
- package/dist/types/components/controls/TreeView/TreeView.d.ts +1 -1
- package/dist/types/components/controls/TreeView/TreeView.types.d.ts +24 -2
- package/dist/types/components/controls/VectorInput/VectorInput.types.d.ts +1 -1
- package/dist/types/components/data/DataTable/DataTable.types.d.ts +2 -2
- package/dist/types/components/editor/AssetBrowser/AssetBrowser.d.ts +13 -0
- package/dist/types/components/editor/AssetBrowser/AssetBrowser.types.d.ts +241 -0
- package/dist/types/components/editor/AssetBrowser/assetBrowserLabels.d.ts +70 -0
- package/dist/types/components/editor/ChatPanel/ChatMarkdownRenderer.types.d.ts +1 -1
- package/dist/types/components/editor/ChatPanel/ChatPanel.types.d.ts +2 -2
- package/dist/types/components/editor/Minimap/Minimap.d.ts +26 -0
- package/dist/types/components/editor/Minimap/Minimap.types.d.ts +249 -0
- package/dist/types/components/editor/Minimap/MinimapContext.d.ts +27 -0
- package/dist/types/components/editor/Minimap/MinimapCorner.d.ts +8 -0
- package/dist/types/components/editor/Minimap/MinimapFooter.d.ts +8 -0
- package/dist/types/components/editor/Minimap/MinimapStore.d.ts +17 -0
- package/dist/types/components/editor/Minimap/MinimapTitle.d.ts +8 -0
- package/dist/types/components/editor/Minimap/ViewportMinimap.d.ts +52 -0
- package/dist/types/components/editor/Minimap/computeBoundsFromItems.d.ts +13 -0
- package/dist/types/components/editor/Minimap/index.d.ts +13 -0
- package/dist/types/components/editor/NodeGraph/NodeGraph.d.ts +63 -0
- package/dist/types/components/editor/NodeGraph/NodeGraph.types.d.ts +568 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphContext.d.ts +30 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphNodeParts.d.ts +86 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphNodeSection.d.ts +47 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphPin.d.ts +57 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphPort.d.ts +30 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphPortVisual.d.ts +46 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphSlots.d.ts +16 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphStore.d.ts +256 -0
- package/dist/types/components/editor/NodeGraph/NodeGraphToolbar.d.ts +54 -0
- package/dist/types/components/editor/NodeGraph/createTypeMatchValidator.d.ts +43 -0
- package/dist/types/components/editor/NodeGraph/nodeGraphActions.d.ts +39 -0
- package/dist/types/components/editor/NodeGraph/nodeGraphIds.d.ts +16 -0
- package/dist/types/components/editor/NodeGraph/useNodeGraph.d.ts +103 -0
- package/dist/types/components/editor/PropertyInspector/PropertyInspector.types.d.ts +51 -5
- package/dist/types/components/editor/Timeline/Timeline.d.ts +18 -0
- package/dist/types/components/editor/Timeline/Timeline.types.d.ts +348 -0
- package/dist/types/components/editor/Timeline/TimelineContext.d.ts +51 -0
- package/dist/types/components/editor/Timeline/TimelineFooter.d.ts +8 -0
- package/dist/types/components/editor/Timeline/TimelineMinimap.d.ts +21 -0
- package/dist/types/components/editor/Timeline/TimelineStore.d.ts +41 -0
- package/dist/types/components/editor/Timeline/TimelineToolbar.d.ts +8 -0
- package/dist/types/components/editor/Timeline/TimelineTrackScale.d.ts +8 -0
- package/dist/types/components/editor/Timeline/index.d.ts +15 -0
- package/dist/types/components/editor/Timeline/timelineCoords.d.ts +7 -0
- package/dist/types/components/editor/Timeline/timelineEdits.d.ts +18 -0
- package/dist/types/components/editor/TransformControl/TransformControl.types.d.ts +2 -2
- package/dist/types/components/editor/ViewportGizmo/ViewportGizmo.types.d.ts +1 -1
- package/dist/types/components/feedback/Alert/Alert.d.ts +2 -2
- package/dist/types/components/feedback/Alert/Alert.types.d.ts +5 -5
- package/dist/types/components/feedback/CommandPalette/CommandPalette.types.d.ts +1 -3
- package/dist/types/components/feedback/Dialog/Dialog.types.d.ts +2 -2
- package/dist/types/components/feedback/Drawer/Drawer.types.d.ts +1 -1
- package/dist/types/components/feedback/EmptyState/EmptyState.types.d.ts +2 -2
- package/dist/types/components/feedback/LogView/LogView.d.ts +58 -0
- package/dist/types/components/feedback/LogView/LogView.types.d.ts +333 -0
- package/dist/types/components/feedback/LogView/LogViewBody.d.ts +15 -0
- package/dist/types/components/feedback/LogView/LogViewContext.d.ts +9 -0
- package/dist/types/components/feedback/LogView/LogViewParts.d.ts +35 -0
- package/dist/types/components/feedback/LogView/LogViewStore.d.ts +4 -0
- package/dist/types/components/feedback/LogView/logViewLabels.d.ts +9 -0
- package/dist/types/components/feedback/LogView/logViewUtils.d.ts +41 -0
- package/dist/types/components/feedback/ProgressBar/ProgressBar.types.d.ts +3 -3
- package/dist/types/components/feedback/Skeleton/Skeleton.types.d.ts +4 -4
- package/dist/types/components/feedback/Stat/Stat.types.d.ts +2 -2
- package/dist/types/components/feedback/Toast/Toast.types.d.ts +1 -1
- package/dist/types/components/form/FormHelperText.d.ts +2 -2
- package/dist/types/components/form/FormLabel.d.ts +1 -1
- package/dist/types/components/form/InputWrapper.d.ts +2 -2
- package/dist/types/components/layout/Accordion/Accordion.types.d.ts +2 -2
- package/dist/types/components/layout/Card/Card.types.d.ts +6 -6
- package/dist/types/components/layout/Divider/Divider.types.d.ts +2 -2
- package/dist/types/components/layout/Flex/Flex.d.ts +1 -1
- package/dist/types/components/layout/Grid/Grid.d.ts +1 -1
- package/dist/types/components/layout/ListItem/ListItem.types.d.ts +2 -2
- package/dist/types/components/layout/PageHeader/PageHeader.types.d.ts +1 -1
- package/dist/types/components/layout/PanelSurface/PanelSurface.types.d.ts +6 -6
- package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +2 -2
- package/dist/types/components/layout/Stack/Stack.d.ts +1 -1
- package/dist/types/components/navigation/Breadcrumbs/BreadcrumbItem.d.ts +1 -0
- package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts +7 -0
- package/dist/types/components/navigation/ContextMenu/ContextMenu.d.ts +18 -3
- package/dist/types/components/navigation/ContextMenu/ContextMenu.types.d.ts +55 -63
- package/dist/types/components/navigation/Menu/Menu.d.ts +38 -35
- package/dist/types/components/navigation/Menu/Menu.types.d.ts +190 -71
- package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +1 -1
- package/dist/types/components/navigation/PathBar/PathBar.d.ts +31 -0
- package/dist/types/components/navigation/PathBar/PathBar.types.d.ts +79 -0
- package/dist/types/components/navigation/SegmentedControl/SegmentedControl.types.d.ts +3 -3
- package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +2 -2
- package/dist/types/components/primitives/Avatar/Avatar.types.d.ts +2 -2
- package/dist/types/components/primitives/Badge/Badge.types.d.ts +1 -1
- package/dist/types/components/primitives/Button/Button.d.ts +2 -2
- package/dist/types/components/primitives/Checkbox/Checkbox.types.d.ts +2 -2
- package/dist/types/components/primitives/Code/Code.types.d.ts +1 -1
- package/dist/types/components/primitives/Collapsible/Collapsible.types.d.ts +2 -2
- package/dist/types/components/primitives/HoverCard/HoverCard.types.d.ts +3 -3
- package/dist/types/components/primitives/Icon/Icon.d.ts +2 -2
- package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
- package/dist/types/components/primitives/Input/Input.d.ts +1 -1
- package/dist/types/components/primitives/Kbd/Kbd.types.d.ts +1 -1
- package/dist/types/components/primitives/Link/Link.types.d.ts +1 -1
- package/dist/types/components/primitives/Popover/Popover.types.d.ts +2 -2
- package/dist/types/components/primitives/Radio/Radio.types.d.ts +3 -3
- package/dist/types/components/primitives/Switch/Switch.d.ts +1 -1
- package/dist/types/components/primitives/TextArea/TextArea.types.d.ts +1 -1
- package/dist/types/components/primitives/Tooltip/Tooltip.d.ts +1 -1
- package/dist/types/components/primitives/VisuallyHidden/VisuallyHidden.types.d.ts +1 -1
- package/dist/types/components/primitives/canvas/canvas.types.d.ts +16 -1
- package/dist/types/components/primitives/viewport/Viewport.d.ts +38 -0
- package/dist/types/components/primitives/viewport/Viewport.types.d.ts +257 -0
- package/dist/types/components/primitives/viewport/ViewportContext.d.ts +23 -0
- package/dist/types/components/primitives/viewport/ViewportLayer.d.ts +26 -0
- package/dist/types/components/primitives/viewport/ViewportOverlay.d.ts +27 -0
- package/dist/types/components/primitives/viewport/ViewportWorld.d.ts +25 -0
- package/dist/types/components/primitives/viewport/viewportCoords.d.ts +25 -0
- package/dist/types/components/primitives/viewport/viewportMath.d.ts +35 -0
- package/dist/types/components/shell/AppShell/AppShell.types.d.ts +2 -2
- package/dist/types/components/shell/FloatingPanel/FloatingPanel.types.d.ts +2 -2
- package/dist/types/components/shell/MenuBar/MenuBar.types.d.ts +5 -5
- package/dist/types/components/shell/StatusBar/StatusBar.types.d.ts +3 -3
- package/dist/types/components/shell/Toolbar/Toolbar.types.d.ts +5 -5
- package/dist/types/hooks/useDebounced/useDebouncedValue.d.ts +13 -4
- package/dist/types/hooks/useEventCallback/useEventCallback.d.ts +32 -0
- package/dist/types/hooks/useIsMounted/useIsMounted.d.ts +28 -0
- package/dist/types/hooks/useKeyboard/types.d.ts +1 -1
- package/dist/types/hooks/useLatest/useLatest.d.ts +23 -0
- package/dist/types/hooks/useResizeObserver/useResizeObserver.d.ts +3 -3
- package/dist/types/index.d.ts +71 -6
- package/dist/types/theme/ThemeProvider.d.ts +5 -3
- package/dist/types/theme/contract.css.d.ts +1 -1
- package/dist/types/theme/createCustomTheme.d.ts +1 -1
- package/dist/types/theme/darkThemeValues.d.ts +1 -1
- package/dist/types/theme/lightThemeValues.d.ts +1 -1
- package/dist/types/theme/themeContractData.d.ts +4 -4
- package/dist/types/theme-values.d.ts +1 -1
- package/dist/types/types/keyframe.d.ts +64 -0
- package/package.json +34 -18
- 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/assets/src/components/navigation/Menu/Menu.css.ts.vanilla-DD0c5D10.css +0 -67
- package/dist/esm/components/navigation/ContextMenu/useContextMenuTarget.js +0 -53
- package/dist/esm/components/navigation/ContextMenu/useContextMenuTarget.js.map +0 -1
- package/dist/esm/components/navigation/Menu/Menu.helpers.js +0 -53
- package/dist/esm/components/navigation/Menu/Menu.helpers.js.map +0 -1
- package/dist/esm/components/navigation/Menu/useMenu.js +0 -88
- package/dist/esm/components/navigation/Menu/useMenu.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
- package/dist/types/components/navigation/ContextMenu/useContextMenuTarget.d.ts +0 -5
- package/dist/types/components/navigation/Menu/useMenu.d.ts +0 -16
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
-
import { useRef, useState, useCallback, useMemo, useId, useEffect, createContext, useContext } from 'react';
|
|
4
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
5
|
-
import {
|
|
6
|
-
import { useMergedRef } from '../../../hooks/useMergedRef/useMergedRef.js';
|
|
7
|
-
import { ScrollArea } from '../../layout/ScrollArea/ScrollArea.js';
|
|
8
|
-
import { CloseIcon } from '../../Icons/CloseIcon.js';
|
|
9
|
-
import { ChevronUpIcon } from '../../Icons/ChevronUpIcon.js';
|
|
4
|
+
import { useRef, useState, useCallback, useMemo, useId, useEffect, createContext, useContext } from 'react';
|
|
10
5
|
import { ChevronDownIcon } from '../../Icons/ChevronDownIcon.js';
|
|
11
|
-
import {
|
|
6
|
+
import { ChevronUpIcon } from '../../Icons/ChevronUpIcon.js';
|
|
7
|
+
import { CloseIcon } from '../../Icons/CloseIcon.js';
|
|
8
|
+
import { ScrollArea } from '../../layout/ScrollArea/ScrollArea.js';
|
|
9
|
+
import { useLatest } from '../../../hooks/useLatest/useLatest.js';
|
|
10
|
+
import { useMergedRef } from '../../../hooks/useMergedRef/useMergedRef.js';
|
|
11
|
+
import { cx } from '../../../utils/cx.js';
|
|
12
|
+
import { managerRoot, panelZIndexVar, panelHeightVar, panelWidthVar, posYVar, posXVar, header, title, headerActions, headerButton, collapsibleHidden, collapsibleVisible, resizeHandle, panel } from './FloatingPanel.css.js';
|
|
12
13
|
|
|
13
14
|
// --- FloatingManager Context ---
|
|
14
15
|
const FloatingManagerContext =
|
|
@@ -38,8 +39,13 @@ const FloatingManager = ({ baseZIndex = 100, children, }) => {
|
|
|
38
39
|
const index = stackRef.current.indexOf(id);
|
|
39
40
|
return baseZIndex + (index >= 0 ? index : 0);
|
|
40
41
|
}, [baseZIndex]);
|
|
41
|
-
const contextValue = useMemo(() => ({ bringToFront, getZIndex, register, unregister }),
|
|
42
|
-
|
|
42
|
+
const contextValue = useMemo(() => ({ bringToFront, getZIndex, register, unregister }),
|
|
43
|
+
// `revision` is bumped whenever the panel stack changes; it intentionally
|
|
44
|
+
// busts this memo so consumers re-render and re-read z-indices from the
|
|
45
|
+
// (otherwise stable) getZIndex, even though it is not read in the factory.
|
|
46
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
47
|
+
[revision, bringToFront, getZIndex, register, unregister]);
|
|
48
|
+
return (jsx(FloatingManagerContext.Provider, { value: contextValue, children: jsx("div", { className: managerRoot, children: children }) }));
|
|
43
49
|
};
|
|
44
50
|
FloatingManager.displayName = 'FloatingManager';
|
|
45
51
|
// --- FloatingPanel Component ---
|
|
@@ -72,35 +78,65 @@ const FloatingPanel = ({ title: panelTitle, position: controlledPosition, defaul
|
|
|
72
78
|
setInternalCollapsed(next);
|
|
73
79
|
onCollapsedChange?.(next);
|
|
74
80
|
}, [isCollapsed, controlledCollapsed, onCollapsedChange]);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
const handleCollapseKeyDown = useCallback((e) => {
|
|
82
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
83
|
+
e.preventDefault();
|
|
84
|
+
toggleCollapse();
|
|
85
|
+
}
|
|
86
|
+
}, [toggleCollapse]);
|
|
87
|
+
const handleCloseKeyDown = useCallback((e) => {
|
|
88
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
89
|
+
e.preventDefault();
|
|
90
|
+
onClose?.();
|
|
91
|
+
}
|
|
92
|
+
}, [onClose]);
|
|
93
|
+
// FloatingManager registration -- use stable id, run once. Latest manager via
|
|
94
|
+
// useLatest so the register/unregister effect and handlers read it without
|
|
95
|
+
// writing a ref during render.
|
|
96
|
+
const managerRef = useLatest(manager);
|
|
78
97
|
useEffect(() => {
|
|
79
98
|
managerRef.current?.register(id);
|
|
99
|
+
// Reading the latest manager from the ref at cleanup is intentional.
|
|
100
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
80
101
|
return () => managerRef.current?.unregister(id);
|
|
102
|
+
// Register/unregister exactly once per id. managerRef is a stable useLatest
|
|
103
|
+
// ref read at both register and unregister time; the manager is read via
|
|
104
|
+
// the ref because the manager context value changes on every panel
|
|
105
|
+
// registration and must not re-trigger this effect.
|
|
106
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
81
107
|
}, [id]);
|
|
82
108
|
const handleBringToFront = useCallback(() => {
|
|
83
109
|
managerRef.current?.bringToFront(id);
|
|
84
|
-
}, [id]);
|
|
110
|
+
}, [id, managerRef]);
|
|
85
111
|
const zIndex = manager?.getZIndex(id) ?? 100;
|
|
86
112
|
// --- Drag ---
|
|
87
113
|
const panelRef = useRef(null);
|
|
88
114
|
const setPanelRef = useMergedRef(panelRef, externalRef);
|
|
89
|
-
const dragOffsetRef = useRef({ x: 0, y: 0 });
|
|
90
115
|
const handleDragStart = useCallback((e) => {
|
|
91
116
|
e.preventDefault();
|
|
92
117
|
const target = e.currentTarget;
|
|
93
118
|
target.setPointerCapture(e.pointerId);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
};
|
|
119
|
+
// Track the pointer delta from the drag start, so positioning is
|
|
120
|
+
// independent of the coordinate space the panel lives in.
|
|
121
|
+
const startPointer = { x: e.clientX, y: e.clientY };
|
|
122
|
+
const startPos = { x: pos.x, y: pos.y };
|
|
123
|
+
const bounds = panelRef.current?.offsetParent?.getBoundingClientRect();
|
|
124
|
+
const panelRect = panelRef.current?.getBoundingClientRect();
|
|
98
125
|
const handleDragMove = (me) => {
|
|
99
|
-
const newX = me.clientX -
|
|
100
|
-
const newY = me.clientY -
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
126
|
+
const newX = startPos.x + (me.clientX - startPointer.x);
|
|
127
|
+
const newY = startPos.y + (me.clientY - startPointer.y);
|
|
128
|
+
// Clamp within the positioned container when one is available,
|
|
129
|
+
// keeping a small margin of the panel on-screen.
|
|
130
|
+
const maxX = bounds
|
|
131
|
+
? Math.max(0, bounds.width - (panelRect?.width ?? 50))
|
|
132
|
+
: Number.POSITIVE_INFINITY;
|
|
133
|
+
const maxY = bounds
|
|
134
|
+
? Math.max(0, bounds.height - 30)
|
|
135
|
+
: Number.POSITIVE_INFINITY;
|
|
136
|
+
setPos({
|
|
137
|
+
x: Math.max(0, Math.min(newX, maxX)),
|
|
138
|
+
y: Math.max(0, Math.min(newY, maxY)),
|
|
139
|
+
});
|
|
104
140
|
};
|
|
105
141
|
const handleDragEnd = () => {
|
|
106
142
|
target.removeEventListener('pointermove', handleDragMove);
|
|
@@ -143,7 +179,7 @@ const FloatingPanel = ({ title: panelTitle, position: controlledPosition, defaul
|
|
|
143
179
|
return (jsxs("div", { ref: setPanelRef, className: cx(panel, className), "data-testid": testId, role: "dialog", "aria-modal": "false", "aria-label": panelTitle, tabIndex: -1, onPointerDown: handleBringToFront, style: {
|
|
144
180
|
...style,
|
|
145
181
|
...inlineVars,
|
|
146
|
-
}, ...rest, children: [jsxs("div", { className: header, onPointerDown: handleDragStart, "data-testid": "panel-header", children: [jsx("span", { className: title, children: panelTitle }), jsxs("div", { className: headerActions, children: [jsx("span", { className: headerButton, role: "button", tabIndex: 0, onClick: toggleCollapse, "aria-label": isCollapsed ? 'Expand panel' : 'Collapse panel', children: isCollapsed ? (jsx(ChevronDownIcon, { size: "sm", color: "secondary", decorative: true })) : (jsx(ChevronUpIcon, { size: "sm", color: "secondary", decorative: true })) }), closable && onClose && (jsx("span", { className: headerButton, role: "button", tabIndex: 0, onClick: onClose, "aria-label": "Close panel", children: jsx(CloseIcon, { size: "sm", color: "secondary", decorative: true }) }))] })] }), jsx("div", { className: isCollapsed ? collapsibleHidden : collapsibleVisible, children: jsx(ScrollArea, { direction: "both", scrollbarVisibility: "auto", scrollbarWidth: 5, autoFill: true, children: children }) }), resizable && !isCollapsed && (jsx("div", { className: resizeHandle, onPointerDown: handleResizeStart, "data-testid": "resize-handle" }))] }));
|
|
182
|
+
}, ...rest, children: [jsxs("div", { className: header, onPointerDown: handleDragStart, "data-testid": "panel-header", children: [jsx("span", { className: title, children: panelTitle }), jsxs("div", { className: headerActions, children: [jsx("span", { className: headerButton, role: "button", tabIndex: 0, onClick: toggleCollapse, onKeyDown: handleCollapseKeyDown, "aria-label": isCollapsed ? 'Expand panel' : 'Collapse panel', children: isCollapsed ? (jsx(ChevronDownIcon, { size: "sm", color: "secondary", decorative: true })) : (jsx(ChevronUpIcon, { size: "sm", color: "secondary", decorative: true })) }), closable && onClose && (jsx("span", { className: headerButton, role: "button", tabIndex: 0, onClick: onClose, onKeyDown: handleCloseKeyDown, "aria-label": "Close panel", children: jsx(CloseIcon, { size: "sm", color: "secondary", decorative: true }) }))] })] }), jsx("div", { className: isCollapsed ? collapsibleHidden : collapsibleVisible, children: jsx(ScrollArea, { direction: "both", scrollbarVisibility: "auto", scrollbarWidth: 5, autoFill: true, children: children }) }), resizable && !isCollapsed && (jsx("div", { className: resizeHandle, onPointerDown: handleResizeStart, "data-testid": "resize-handle" }))] }));
|
|
147
183
|
};
|
|
148
184
|
FloatingPanel.displayName = 'FloatingPanel';
|
|
149
185
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingPanel.js","sources":["../../../../../../src/components/shell/FloatingPanel/FloatingPanel.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;AA0CA;AAEA;AACE;AAEF;AAEO;AAIL;;AAGA;;;;;;AAOA;AACE;;;AAIF;AACE;;AACoC;;;;AAKtC;;AAGI;AACF;AAIF;AAKA;AAKF;AAEA;AAEA;;AA6BE;AACA;AACA;;;AAKA;AACA;AAEI;;AACA;AACF;;;AAOF;AACA;AAEI;;AACA;AACF;;;AAMF;AACA;AACE;;;AAEA;;;AAIF;AACA;;AAGE;;AAEF;AAEA;AACE;AACF;;;AAKA;;AAEA;AAEA;;AAGI;AACA;;AAGE;AACA;;AAGF;;;;;;AAMA;;AAGE;AACA;AACF;AAEA;AACA;AACF;;AAKF;;;AAII;AACA;AAEA;AACA;AACA;AACA;AAEA;AACE;AACA;AACA;AACA;;AAEF;;AAGE;AACA;AACF;AAEA;AACA;AACF;;AAKA;AACA;AACA;AACA;AACA;AACD;AAED;AAWM;AACA;;AAwDR;AAEA;;"}
|
|
1
|
+
{"version":3,"file":"FloatingPanel.js","sources":["src/components/shell/FloatingPanel/FloatingPanel.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useRef,\n useEffect,\n useId,\n useMemo,\n} from 'react';\n\nimport { ChevronDownIcon } from '@/components/Icons/ChevronDownIcon';\nimport { ChevronUpIcon } from '@/components/Icons/ChevronUpIcon';\nimport { CloseIcon } from '@/components/Icons/CloseIcon';\nimport { ScrollArea } from '@/components/layout/ScrollArea';\nimport { useLatest } from '@/hooks/useLatest';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { cx } from '@/utils/cx';\n\nimport {\n posXVar,\n posYVar,\n panelWidthVar,\n panelHeightVar,\n panelZIndexVar,\n managerRoot,\n panel,\n header,\n title,\n headerActions,\n headerButton,\n collapsibleVisible,\n collapsibleHidden,\n resizeHandle,\n} from './FloatingPanel.css';\n\nimport type {\n FloatingPanelProps,\n FloatingManagerProps,\n FloatingManagerContextValue,\n Position,\n FloatingPanelSize,\n} from './FloatingPanel.types';\n\n// --- FloatingManager Context ---\n\nconst FloatingManagerContext =\n /*#__PURE__*/ createContext<FloatingManagerContextValue | null>(null);\n\nconst useFloatingManager = () => useContext(FloatingManagerContext);\n\nexport const FloatingManager: React.FC<FloatingManagerProps> = ({\n baseZIndex = 100,\n children,\n}) => {\n const stackRef = useRef<string[]>([]);\n const [revision, setRevision] = useState(0);\n\n const register = useCallback((id: string) => {\n if (!stackRef.current.includes(id)) {\n stackRef.current = [...stackRef.current, id];\n setRevision(c => c + 1);\n }\n }, []);\n\n const unregister = useCallback((id: string) => {\n stackRef.current = stackRef.current.filter(s => s !== id);\n setRevision(c => c + 1);\n }, []);\n\n const bringToFront = useCallback((id: string) => {\n const stack = stackRef.current;\n if (stack[stack.length - 1] === id) return; // already on top\n stackRef.current = [...stack.filter(s => s !== id), id];\n setRevision(c => c + 1);\n }, []);\n\n const getZIndex = useCallback(\n (id: string) => {\n const index = stackRef.current.indexOf(id);\n return baseZIndex + (index >= 0 ? index : 0);\n },\n [baseZIndex]\n );\n\n const contextValue = useMemo<FloatingManagerContextValue>(\n () => ({ bringToFront, getZIndex, register, unregister }),\n // `revision` is bumped whenever the panel stack changes; it intentionally\n // busts this memo so consumers re-render and re-read z-indices from the\n // (otherwise stable) getZIndex, even though it is not read in the factory.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [revision, bringToFront, getZIndex, register, unregister]\n );\n\n return (\n <FloatingManagerContext.Provider value={contextValue}>\n <div className={managerRoot}>{children}</div>\n </FloatingManagerContext.Provider>\n );\n};\n\nFloatingManager.displayName = 'FloatingManager';\n\n// --- FloatingPanel Component ---\n\nexport const FloatingPanel: React.FC<FloatingPanelProps> = ({\n title: panelTitle,\n position: controlledPosition,\n defaultPosition = { x: 100, y: 100 },\n onPositionChange,\n size: controlledSize,\n defaultSize = { width: 280, height: 200 },\n onSizeChange,\n minWidth = 150,\n minHeight = 100,\n maxWidth = Infinity,\n maxHeight = Infinity,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n onClose,\n closable = true,\n resizable = true,\n children,\n\n className,\n panelId,\n style,\n testId,\n ref: externalRef,\n ...rest\n}) => {\n const generatedId = useId();\n const id = panelId ?? generatedId;\n const manager = useFloatingManager();\n\n // Position state\n const [internalPosition, setInternalPosition] =\n useState<Position>(defaultPosition);\n const pos = controlledPosition ?? internalPosition;\n const setPos = useCallback(\n (p: Position) => {\n if (!controlledPosition) setInternalPosition(p);\n onPositionChange?.(p);\n },\n [controlledPosition, onPositionChange]\n );\n\n // Size state\n const [internalSize, setInternalSize] =\n useState<FloatingPanelSize>(defaultSize);\n const currentSize = controlledSize ?? internalSize;\n const setSize = useCallback(\n (s: FloatingPanelSize) => {\n if (!controlledSize) setInternalSize(s);\n onSizeChange?.(s);\n },\n [controlledSize, onSizeChange]\n );\n\n // Collapsed state\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const isCollapsed = controlledCollapsed ?? internalCollapsed;\n const toggleCollapse = useCallback(() => {\n const next = !isCollapsed;\n if (controlledCollapsed === undefined) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n }, [isCollapsed, controlledCollapsed, onCollapsedChange]);\n\n const handleCollapseKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggleCollapse();\n }\n },\n [toggleCollapse]\n );\n\n const handleCloseKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClose?.();\n }\n },\n [onClose]\n );\n\n // FloatingManager registration -- use stable id, run once. Latest manager via\n // useLatest so the register/unregister effect and handlers read it without\n // writing a ref during render.\n const managerRef = useLatest(manager);\n\n useEffect(() => {\n managerRef.current?.register(id);\n // Reading the latest manager from the ref at cleanup is intentional.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return () => managerRef.current?.unregister(id);\n // Register/unregister exactly once per id. managerRef is a stable useLatest\n // ref read at both register and unregister time; the manager is read via\n // the ref because the manager context value changes on every panel\n // registration and must not re-trigger this effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n const handleBringToFront = useCallback(() => {\n managerRef.current?.bringToFront(id);\n }, [id, managerRef]);\n\n const zIndex = manager?.getZIndex(id) ?? 100;\n\n // --- Drag ---\n const panelRef = useRef<HTMLDivElement>(null);\n const setPanelRef = useMergedRef<HTMLDivElement>(panelRef, externalRef);\n\n const handleDragStart = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n const target = e.currentTarget as HTMLElement;\n target.setPointerCapture(e.pointerId);\n\n // Track the pointer delta from the drag start, so positioning is\n // independent of the coordinate space the panel lives in.\n const startPointer = { x: e.clientX, y: e.clientY };\n const startPos = { x: pos.x, y: pos.y };\n const bounds = panelRef.current?.offsetParent?.getBoundingClientRect();\n const panelRect = panelRef.current?.getBoundingClientRect();\n\n const handleDragMove = (me: PointerEvent) => {\n const newX = startPos.x + (me.clientX - startPointer.x);\n const newY = startPos.y + (me.clientY - startPointer.y);\n // Clamp within the positioned container when one is available,\n // keeping a small margin of the panel on-screen.\n const maxX = bounds\n ? Math.max(0, bounds.width - (panelRect?.width ?? 50))\n : Number.POSITIVE_INFINITY;\n const maxY = bounds\n ? Math.max(0, bounds.height - 30)\n : Number.POSITIVE_INFINITY;\n setPos({\n x: Math.max(0, Math.min(newX, maxX)),\n y: Math.max(0, Math.min(newY, maxY)),\n });\n };\n\n const handleDragEnd = () => {\n target.removeEventListener('pointermove', handleDragMove);\n target.removeEventListener('pointerup', handleDragEnd);\n };\n\n target.addEventListener('pointermove', handleDragMove);\n target.addEventListener('pointerup', handleDragEnd);\n },\n [pos, setPos]\n );\n\n // --- Resize (bottom-right corner only) ---\n const handleResizeStart = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const target = e.currentTarget as HTMLElement;\n target.setPointerCapture(e.pointerId);\n\n const startX = e.clientX;\n const startY = e.clientY;\n const startW = currentSize.width;\n const startH = currentSize.height;\n\n const handleResizeMove = (me: PointerEvent) => {\n const dx = me.clientX - startX;\n const dy = me.clientY - startY;\n const newW = Math.min(maxWidth, Math.max(minWidth, startW + dx));\n const newH = Math.min(maxHeight, Math.max(minHeight, startH + dy));\n setSize({ width: newW, height: newH });\n };\n\n const handleResizeEnd = () => {\n target.removeEventListener('pointermove', handleResizeMove);\n target.removeEventListener('pointerup', handleResizeEnd);\n };\n\n target.addEventListener('pointermove', handleResizeMove);\n target.addEventListener('pointerup', handleResizeEnd);\n },\n [currentSize, minWidth, minHeight, maxWidth, maxHeight, setSize]\n );\n\n const inlineVars = assignInlineVars({\n [posXVar]: `${pos.x}px`,\n [posYVar]: `${pos.y}px`,\n [panelWidthVar]: `${currentSize.width}px`,\n [panelHeightVar]: isCollapsed ? 'auto' : `${currentSize.height}px`,\n [panelZIndexVar]: String(zIndex),\n });\n\n return (\n <div\n ref={setPanelRef}\n className={cx(panel, className)}\n data-testid={testId}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={panelTitle}\n tabIndex={-1}\n onPointerDown={handleBringToFront}\n style={{\n ...style,\n ...inlineVars,\n }}\n {...rest}\n >\n <div\n className={header}\n onPointerDown={handleDragStart}\n data-testid=\"panel-header\"\n >\n <span className={title}>{panelTitle}</span>\n <div className={headerActions}>\n <span\n className={headerButton}\n role=\"button\"\n tabIndex={0}\n onClick={toggleCollapse}\n onKeyDown={handleCollapseKeyDown}\n aria-label={isCollapsed ? 'Expand panel' : 'Collapse panel'}\n >\n {isCollapsed ? (\n <ChevronDownIcon size=\"sm\" color=\"secondary\" decorative />\n ) : (\n <ChevronUpIcon size=\"sm\" color=\"secondary\" decorative />\n )}\n </span>\n {closable && onClose && (\n <span\n className={headerButton}\n role=\"button\"\n tabIndex={0}\n onClick={onClose}\n onKeyDown={handleCloseKeyDown}\n aria-label=\"Close panel\"\n >\n <CloseIcon size=\"sm\" color=\"secondary\" decorative />\n </span>\n )}\n </div>\n </div>\n <div className={isCollapsed ? collapsibleHidden : collapsibleVisible}>\n <ScrollArea\n direction=\"both\"\n scrollbarVisibility=\"auto\"\n scrollbarWidth={5}\n autoFill\n >\n {children}\n </ScrollArea>\n </div>\n {resizable && !isCollapsed && (\n <div\n className={resizeHandle}\n onPointerDown={handleResizeStart}\n data-testid=\"resize-handle\"\n />\n )}\n </div>\n );\n};\n\nFloatingPanel.displayName = 'FloatingPanel';\n"],"names":[],"mappings":";;;;;;;;;;;;;AA+CA;AAEA;AACE;AAEF;AAEO;AAIL;;AAGA;;;;;;AAOA;AACE;;;AAIF;AACE;;AACoC;;;;AAKtC;;AAGI;AACF;AAIF;;;;;;AASA;AAKF;AAEA;AAEA;;AA6BE;AACA;AACA;;;AAKA;AACA;AAEI;;AACA;AACF;;;AAOF;AACA;AAEI;;AACA;AACF;;;AAMF;AACA;AACE;;;AAEA;;AAGF;AAEI;;AAEE;;AAEJ;AAIF;AAEI;;;;AAIF;;;;AAOF;;AAGE;;;;;;;;;AASF;AAEA;AACE;AACF;;;AAKA;;AAGA;;AAGI;AACA;;;AAIA;AACA;;;AAIA;AACE;AACA;;;;AAIE;AACA;;AAEA;AACA;AACF;AACE;AACA;AACD;AACH;;AAGE;AACA;AACF;AAEA;AACA;AACF;;AAKF;;;AAII;AACA;AAEA;AACA;AACA;AACA;AAEA;AACE;AACA;AACA;AACA;;AAEF;;AAGE;AACA;AACF;AAEA;AACA;AACF;;AAKA;AACA;AACA;AACA;AACA;AACD;AAED;AAWM;AACA;;AA0DR;AAEA;;"}
|
|
@@ -34,6 +34,7 @@ const MenuBarItem = ({ onClick, shortcut: shortcutText, disabled = false, icon,
|
|
|
34
34
|
};
|
|
35
35
|
MenuBarItem.displayName = 'MenuBar.Item';
|
|
36
36
|
const MenuBarSub = ({ label, children, disabled = false, className, style, testId, ref, ...rest }) => {
|
|
37
|
+
const { menuOffset } = useMenuBar();
|
|
37
38
|
const [open, setOpen] = useState(false);
|
|
38
39
|
const closeTimer = useRef(null);
|
|
39
40
|
const handleEnter = useCallback(() => {
|
|
@@ -45,7 +46,9 @@ const MenuBarSub = ({ label, children, disabled = false, className, style, testI
|
|
|
45
46
|
setOpen(true);
|
|
46
47
|
}, [disabled]);
|
|
47
48
|
const handleLeave = useCallback(() => {
|
|
48
|
-
closeTimer.current = setTimeout(() =>
|
|
49
|
+
closeTimer.current = setTimeout(() => {
|
|
50
|
+
setOpen(false);
|
|
51
|
+
}, SUBMENU_CLOSE_DELAY);
|
|
49
52
|
}, []);
|
|
50
53
|
useEffect(() => {
|
|
51
54
|
return () => {
|
|
@@ -53,7 +56,7 @@ const MenuBarSub = ({ label, children, disabled = false, className, style, testI
|
|
|
53
56
|
clearTimeout(closeTimer.current);
|
|
54
57
|
};
|
|
55
58
|
}, []);
|
|
56
|
-
return (jsxs("div", { ref: ref, className: cx(subContainer, className), style: style, "data-testid": testId, onMouseEnter: handleEnter, onMouseLeave: handleLeave, ...rest, children: [jsxs("button", { className: subTrigger, role: "menuitem", "aria-haspopup": "true", "aria-expanded": open, disabled: disabled, type: "button", tabIndex: -1, children: [jsx("span", { children: label }), jsx(ChevronRight, {})] }), open && (jsx("div", { className: subDropdown, role: "menu", children: children }))] }));
|
|
59
|
+
return (jsxs("div", { ref: ref, className: cx(subContainer, className), style: style, "data-testid": testId, onMouseEnter: handleEnter, onMouseLeave: handleLeave, ...rest, children: [jsxs("button", { className: subTrigger, role: "menuitem", "aria-haspopup": "true", "aria-expanded": open, disabled: disabled, type: "button", tabIndex: -1, children: [jsx("span", { children: label }), jsx(ChevronRight, {})] }), open && (jsx("div", { className: subDropdown, role: "menu", style: { left: `calc(100% + ${menuOffset}px)` }, children: children }))] }));
|
|
57
60
|
};
|
|
58
61
|
MenuBarSub.displayName = 'MenuBar.Sub';
|
|
59
62
|
const MenuBarSeparator = ({ className, style, testId, ref, ...rest }) => {
|
|
@@ -69,7 +72,9 @@ const MenuBarMenu = ({ label, children, disabled = false, className, style, test
|
|
|
69
72
|
const isOpen = openMenuId === menuId;
|
|
70
73
|
useEffect(() => {
|
|
71
74
|
registerMenu(menuId);
|
|
72
|
-
return () =>
|
|
75
|
+
return () => {
|
|
76
|
+
unregisterMenu(menuId);
|
|
77
|
+
};
|
|
73
78
|
}, [menuId, registerMenu, unregisterMenu]);
|
|
74
79
|
const handleClick = useCallback(() => {
|
|
75
80
|
if (disabled)
|
|
@@ -129,17 +134,23 @@ const MenuBarMenu = ({ label, children, disabled = false, className, style, test
|
|
|
129
134
|
}
|
|
130
135
|
};
|
|
131
136
|
document.addEventListener('mousedown', handleOutsideClick);
|
|
132
|
-
return () =>
|
|
137
|
+
return () => {
|
|
138
|
+
document.removeEventListener('mousedown', handleOutsideClick);
|
|
139
|
+
};
|
|
133
140
|
}, [isOpen, setOpenMenuId]);
|
|
134
|
-
return (jsxs("div", { ref: ref, className: cx(menuContainer, className), style: style, "data-testid": testId, ...rest, children: [jsx("button", { ref: triggerRef, className: trigger({ active: isOpen }), onClick: handleClick, onMouseEnter: handleMouseEnter, onKeyDown: handleKeyDown, disabled: disabled, type: "button", role: "menuitem", "aria-haspopup": "true", "aria-expanded": isOpen, tabIndex: -1, children: label }), isOpen && (jsx("div", { ref: dropdownRef, className: dropdown, role: "menu", "aria-label": label,
|
|
141
|
+
return (jsxs("div", { ref: ref, className: cx(menuContainer, className), style: style, "data-testid": testId, ...rest, children: [jsx("button", { ref: triggerRef, className: trigger({ active: isOpen }), onClick: handleClick, onMouseEnter: handleMouseEnter, onKeyDown: handleKeyDown, disabled: disabled, type: "button", role: "menuitem", "aria-haspopup": "true", "aria-expanded": isOpen, tabIndex: -1, children: label }), isOpen && (jsx("div", { ref: dropdownRef, className: dropdown, role: "menu", "aria-label": label,
|
|
142
|
+
// Focusable programmatically so the open menu can receive focus and
|
|
143
|
+
// handle arrow-key navigation across its items.
|
|
144
|
+
tabIndex: -1, onKeyDown: handleDropdownKeyDown, style: { top: `calc(100% + ${menuOffset}px)` }, children: children }))] }));
|
|
135
145
|
};
|
|
136
146
|
MenuBarMenu.displayName = 'MenuBar.Menu';
|
|
137
147
|
// --- Root Component ---
|
|
138
148
|
const MenuBarRoot = ({ size = 'md', menuOffset = 2, children, className, style, testId, ref: externalRef, ...rest }) => {
|
|
139
149
|
const [openMenuId, setOpenMenuId] = useState(null);
|
|
140
|
-
|
|
150
|
+
// Registered child menu ids, kept in state so the context value stays
|
|
151
|
+
// reactive (previously a ref + forceUpdate, which read the ref during render).
|
|
152
|
+
const [menuIds, setMenuIds] = useState([]);
|
|
141
153
|
const safeMenuOffset = Math.max(0, menuOffset);
|
|
142
|
-
const [, forceUpdate] = useState(0);
|
|
143
154
|
const barRef = useRef(null);
|
|
144
155
|
const setBarRef = useMemo(() => (node) => {
|
|
145
156
|
barRef.current = node;
|
|
@@ -147,19 +158,14 @@ const MenuBarRoot = ({ size = 'md', menuOffset = 2, children, className, style,
|
|
|
147
158
|
externalRef(node);
|
|
148
159
|
}
|
|
149
160
|
else if (externalRef && typeof externalRef === 'object') {
|
|
150
|
-
externalRef.current =
|
|
151
|
-
node;
|
|
161
|
+
externalRef.current = node;
|
|
152
162
|
}
|
|
153
163
|
}, [externalRef]);
|
|
154
164
|
const registerMenu = useCallback((id) => {
|
|
155
|
-
|
|
156
|
-
menuIdsRef.current = [...menuIdsRef.current, id];
|
|
157
|
-
forceUpdate(c => c + 1);
|
|
158
|
-
}
|
|
165
|
+
setMenuIds(prev => (prev.includes(id) ? prev : [...prev, id]));
|
|
159
166
|
}, []);
|
|
160
167
|
const unregisterMenu = useCallback((id) => {
|
|
161
|
-
|
|
162
|
-
forceUpdate(c => c + 1);
|
|
168
|
+
setMenuIds(prev => prev.filter(m => m !== id));
|
|
163
169
|
}, []);
|
|
164
170
|
const handleBarKeyDown = useCallback((e) => {
|
|
165
171
|
if (!barRef.current)
|
|
@@ -191,7 +197,7 @@ const MenuBarRoot = ({ size = 'md', menuOffset = 2, children, className, style,
|
|
|
191
197
|
setOpenMenuId,
|
|
192
198
|
registerMenu,
|
|
193
199
|
unregisterMenu,
|
|
194
|
-
menuIds
|
|
200
|
+
menuIds,
|
|
195
201
|
}), [
|
|
196
202
|
size,
|
|
197
203
|
safeMenuOffset,
|
|
@@ -199,6 +205,7 @@ const MenuBarRoot = ({ size = 'md', menuOffset = 2, children, className, style,
|
|
|
199
205
|
setOpenMenuId,
|
|
200
206
|
registerMenu,
|
|
201
207
|
unregisterMenu,
|
|
208
|
+
menuIds,
|
|
202
209
|
]);
|
|
203
210
|
return (jsx(MenuBarContext.Provider, { value: contextValue, children: jsx("div", { ref: setBarRef, className: cx(menuBarRoot({ size }), className), style: style, "data-testid": testId, role: "menubar", onKeyDown: handleBarKeyDown, tabIndex: 0, ...rest, children: children }) }));
|
|
204
211
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuBar.js","sources":["../../../../../../src/components/shell/MenuBar/MenuBar.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAmCA;AAEA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AAED;AAEA;AAEA;AAEA;AAGM;AACA;AACD;AAML;AAEA;AAaE;AAEA;;AAEI;;;AAGJ;AAEA;AAkBF;AAEA;AAEA;;AAYE;AAEA;AACE;AACE;AACA;;AAEF;;AACF;AAEA;AACE;;;AAIA;;AAC0B;AAC1B;;AAGF;AA6BF;AAEA;AAEA;AAOE;AAUF;AAEA;AAEA;AAEA;AAWE;AACA;AAOA;AACA;AACA;;;AAIE;;AAGF;AACE;;;;AAIF;;;;;;AAOA;AAEI;;;;;;;;;AAWA;;;AAGE;;AAEJ;AAIF;AAEI;;AAOA;;AAEE;AACA;;AACK;;;AAIL;;AACK;;;AAGL;;AAEJ;;;AAMA;;AAEA;AACE;;;;;AAOF;AAEA;;AAEF;;AAuCF;AAEA;AAEA;AAEA;;AAYE;;;AAGA;;AAGI;AACA;;;AAEO;AACJ;AACC;;AAEN;AAIF;;;;;;AAOA;AACE;;;AAIF;;;AAII;;AASA;;AAEE;AACA;;AAEA;AACE;;;AAEG;;;AAIL;AACA;AACE;;;AAGN;AAIF;;AAGI;;;;;;AAMD;;;;;;;AAQA;;AAmBL;AAEA;AAEA;AAEO;AACL;AACA;AACA;AACA;AACD;;"}
|
|
1
|
+
{"version":3,"file":"MenuBar.js","sources":["src/components/shell/MenuBar/MenuBar.tsx"],"sourcesContent":["'use client';\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useRef,\n useEffect,\n useId,\n KeyboardEvent,\n useMemo,\n} from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport {\n menuBarRoot,\n menuContainer,\n trigger,\n dropdown,\n menuItem,\n shortcut,\n separator,\n subTrigger,\n subDropdown,\n subContainer,\n} from './MenuBar.css';\n\nimport type {\n MenuBarProps,\n MenuBarMenuProps,\n MenuBarItemProps,\n MenuBarSubProps,\n MenuBarSeparatorProps,\n MenuBarContextValue,\n} from './MenuBar.types';\n\n// --- Context ---\n\nconst MenuBarContext = /*#__PURE__*/ createContext<MenuBarContextValue>({\n size: 'md',\n menuOffset: 2,\n openMenuId: null,\n setOpenMenuId: () => {},\n registerMenu: () => {},\n unregisterMenu: () => {},\n menuIds: [],\n});\n\nconst useMenuBar = () => useContext(MenuBarContext);\n\nconst SUBMENU_CLOSE_DELAY = 150;\n\nconst MENU_ITEM_SELECTOR = '[role=\"menuitem\"]:not(:disabled)';\n\nconst ChevronRight = () => (\n <span\n style={{\n fontSize: '8px',\n lineHeight: 1,\n }}\n >\n ▶\n </span>\n);\n\n// --- Sub-components ---\n\nconst MenuBarItem: React.FC<MenuBarItemProps> = ({\n onClick,\n shortcut: shortcutText,\n disabled = false,\n icon,\n children,\n\n className,\n style,\n testId,\n ref,\n ...rest\n}) => {\n const { setOpenMenuId } = useMenuBar();\n\n const handleClick = useCallback(() => {\n if (onClick) {\n onClick();\n setOpenMenuId(null);\n }\n }, [onClick, setOpenMenuId]);\n\n return (\n <button\n role=\"menuitem\"\n onClick={handleClick}\n disabled={disabled}\n className={cx(menuItem, className)}\n style={style}\n data-testid={testId}\n ref={ref}\n type=\"button\"\n tabIndex={-1}\n {...rest}\n >\n {icon && <span>{icon}</span>}\n <span>{children}</span>\n {shortcutText && <span className={shortcut}>{shortcutText}</span>}\n </button>\n );\n};\n\nMenuBarItem.displayName = 'MenuBar.Item';\n\nconst MenuBarSub: React.FC<MenuBarSubProps> = ({\n label,\n children,\n disabled = false,\n\n className,\n style,\n testId,\n ref,\n ...rest\n}) => {\n const { menuOffset } = useMenuBar();\n const [open, setOpen] = useState(false);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleEnter = useCallback(() => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n if (!disabled) setOpen(true);\n }, [disabled]);\n\n const handleLeave = useCallback(() => {\n closeTimer.current = setTimeout(() => {\n setOpen(false);\n }, SUBMENU_CLOSE_DELAY);\n }, []);\n\n useEffect(() => {\n return () => {\n if (closeTimer.current) clearTimeout(closeTimer.current);\n };\n }, []);\n\n return (\n <div\n ref={ref}\n className={cx(subContainer, className)}\n style={style}\n data-testid={testId}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n {...rest}\n >\n <button\n className={subTrigger}\n role=\"menuitem\"\n aria-haspopup=\"true\"\n aria-expanded={open}\n disabled={disabled}\n type=\"button\"\n tabIndex={-1}\n >\n <span>{label}</span>\n <ChevronRight />\n </button>\n {open && (\n <div\n className={subDropdown}\n role=\"menu\"\n style={{ left: `calc(100% + ${menuOffset}px)` }}\n >\n {children}\n </div>\n )}\n </div>\n );\n};\n\nMenuBarSub.displayName = 'MenuBar.Sub';\n\nconst MenuBarSeparator: React.FC<MenuBarSeparatorProps> = ({\n className,\n style,\n testId,\n ref,\n ...rest\n}) => {\n return (\n <div\n role=\"separator\"\n className={cx(separator, className)}\n style={style}\n data-testid={testId}\n ref={ref}\n {...rest}\n />\n );\n};\n\nMenuBarSeparator.displayName = 'MenuBar.Separator';\n\n// --- MenuBarMenu (top-level dropdown trigger) ---\n\nconst MenuBarMenu: React.FC<MenuBarMenuProps> = ({\n label,\n children,\n disabled = false,\n\n className,\n style,\n testId,\n ref,\n ...rest\n}) => {\n const menuId = useId();\n const {\n openMenuId,\n setOpenMenuId,\n registerMenu,\n unregisterMenu,\n menuOffset,\n } = useMenuBar();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const isOpen = openMenuId === menuId;\n\n useEffect(() => {\n registerMenu(menuId);\n return () => {\n unregisterMenu(menuId);\n };\n }, [menuId, registerMenu, unregisterMenu]);\n\n const handleClick = useCallback(() => {\n if (disabled) return;\n setOpenMenuId(isOpen ? null : menuId);\n }, [disabled, isOpen, menuId, setOpenMenuId]);\n\n const handleMouseEnter = useCallback(() => {\n // Open on hover only when another menu is already open\n if (openMenuId !== null && openMenuId !== menuId && !disabled) {\n setOpenMenuId(menuId);\n }\n }, [openMenuId, menuId, disabled, setOpenMenuId]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpenMenuId(menuId);\n // Focus first item in dropdown after open\n setTimeout(() => {\n const firstItem = dropdownRef.current?.querySelector(\n MENU_ITEM_SELECTOR\n ) as HTMLElement | null;\n firstItem?.focus();\n }, 0);\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n setOpenMenuId(null);\n triggerRef.current?.focus();\n }\n },\n [menuId, setOpenMenuId]\n );\n\n const handleDropdownKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n const items = Array.from(\n dropdownRef.current?.querySelectorAll<HTMLElement>(\n MENU_ITEM_SELECTOR\n ) ?? []\n );\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n const next = currentIndex + 1 < items.length ? currentIndex + 1 : 0;\n items[next]?.focus();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n const prev =\n currentIndex - 1 >= 0 ? currentIndex - 1 : items.length - 1;\n items[prev]?.focus();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setOpenMenuId(null);\n triggerRef.current?.focus();\n }\n },\n [setOpenMenuId]\n );\n\n // Close dropdown when clicking outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleOutsideClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n !triggerRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n setOpenMenuId(null);\n }\n };\n\n document.addEventListener('mousedown', handleOutsideClick);\n return () => {\n document.removeEventListener('mousedown', handleOutsideClick);\n };\n }, [isOpen, setOpenMenuId]);\n\n return (\n <div\n ref={ref}\n className={cx(menuContainer, className)}\n style={style}\n data-testid={testId}\n {...rest}\n >\n <button\n ref={triggerRef}\n className={trigger({ active: isOpen })}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n tabIndex={-1}\n >\n {label}\n </button>\n {isOpen && (\n <div\n ref={dropdownRef}\n className={dropdown}\n role=\"menu\"\n aria-label={label}\n // Focusable programmatically so the open menu can receive focus and\n // handle arrow-key navigation across its items.\n tabIndex={-1}\n onKeyDown={handleDropdownKeyDown}\n style={{ top: `calc(100% + ${menuOffset}px)` }}\n >\n {children}\n </div>\n )}\n </div>\n );\n};\n\nMenuBarMenu.displayName = 'MenuBar.Menu';\n\n// --- Root Component ---\n\nconst MenuBarRoot: React.FC<MenuBarProps> = ({\n size = 'md',\n menuOffset = 2,\n children,\n\n className,\n style,\n testId,\n ref: externalRef,\n ...rest\n}) => {\n const [openMenuId, setOpenMenuId] = useState<string | null>(null);\n // Registered child menu ids, kept in state so the context value stays\n // reactive (previously a ref + forceUpdate, which read the ref during render).\n const [menuIds, setMenuIds] = useState<string[]>([]);\n const safeMenuOffset = Math.max(0, menuOffset);\n const barRef = useRef<HTMLDivElement>(null);\n const setBarRef = useMemo(\n () => (node: HTMLDivElement | null) => {\n barRef.current = node;\n if (typeof externalRef === 'function') {\n externalRef(node);\n } else if (externalRef && typeof externalRef === 'object') {\n externalRef.current = node;\n }\n },\n [externalRef]\n );\n\n const registerMenu = useCallback((id: string) => {\n setMenuIds(prev => (prev.includes(id) ? prev : [...prev, id]));\n }, []);\n\n const unregisterMenu = useCallback((id: string) => {\n setMenuIds(prev => prev.filter(m => m !== id));\n }, []);\n\n const handleBarKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (!barRef.current) return;\n\n const triggers = Array.from(\n barRef.current.querySelectorAll<HTMLElement>(\n ':scope > div > [role=\"menuitem\"]'\n )\n );\n const currentIndex = triggers.indexOf(\n document.activeElement as HTMLElement\n );\n\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n const next = currentIndex + 1 < triggers.length ? currentIndex + 1 : 0;\n triggers[next]?.focus();\n // If menu is open, switch to next menu\n if (openMenuId !== null) {\n triggers[next]?.click();\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n const prev =\n currentIndex - 1 >= 0 ? currentIndex - 1 : triggers.length - 1;\n triggers[prev]?.focus();\n if (openMenuId !== null) {\n triggers[prev]?.click();\n }\n }\n },\n [openMenuId]\n );\n\n const contextValue = useMemo(\n () => ({\n size,\n menuOffset: safeMenuOffset,\n openMenuId,\n setOpenMenuId,\n registerMenu,\n unregisterMenu,\n menuIds,\n }),\n [\n size,\n safeMenuOffset,\n openMenuId,\n setOpenMenuId,\n registerMenu,\n unregisterMenu,\n menuIds,\n ]\n );\n\n return (\n <MenuBarContext.Provider value={contextValue}>\n <div\n ref={setBarRef}\n className={cx(menuBarRoot({ size }), className)}\n style={style}\n data-testid={testId}\n role=\"menubar\"\n onKeyDown={handleBarKeyDown}\n tabIndex={0}\n {...rest}\n >\n {children}\n </div>\n </MenuBarContext.Provider>\n );\n};\n\nMenuBarRoot.displayName = 'MenuBar';\n\n// --- Compound Component ---\n\nexport const MenuBar = /*#__PURE__*/ Object.assign(MenuBarRoot, {\n Menu: MenuBarMenu,\n Item: MenuBarItem,\n Sub: MenuBarSub,\n Separator: MenuBarSeparator,\n});\n"],"names":[],"mappings":";;;;;;AAsCA;AAEA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AAED;AAEA;AAEA;AAEA;AAGM;AACA;AACD;AAML;AAEA;AAaE;AAEA;;AAEI;;;AAGJ;AAEA;AAkBF;AAEA;AAEA;AAWE;;AAEA;AAEA;AACE;AACE;AACA;;AAEF;;AACF;AAEA;AACE;;;;;AAMA;;AAC0B;AAC1B;;;AAoCJ;AAEA;AAEA;AAOE;AAUF;AAEA;AAEA;AAEA;AAWE;AACA;AAOA;AACA;AACA;;;AAIE;;AAEA;;AAGF;AACE;;;;AAIF;;;;;;AAOA;AAEI;;;;;;;;;AAWA;;;AAGE;;AAEJ;AAIF;AAEI;;AAOA;;AAEE;AACA;;AACK;;;AAIL;;AACK;;;AAGL;;AAEJ;;;AAMA;;AAEA;AACE;;;;;AAOF;AAEA;AACA;AACE;AACF;AACF;AAEA;;;;AAwCF;AAEA;AAEA;AAEA;;;;;;AAgBE;;AAGI;AACA;;;AAEO;AACL;;AAEJ;AAIF;;;AAIA;AACE;;AAGF;;;AAII;;AASA;;AAEE;AACA;;AAEA;AACE;;;AAEG;;;AAIL;AACA;AACE;;;AAGN;AAIF;;AAGI;;;;;;AAMD;;;;;;;;AASA;;AAmBL;AAEA;AAEA;AAEO;AACL;AACA;AACA;AACA;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.js","sources":["
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sources":["src/components/shell/StatusBar/StatusBar.tsx"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport {\n statusBarRoot,\n statusBarSection,\n itemButton,\n itemSpan,\n badge,\n} from './StatusBar.css';\n\nimport type {\n StatusBarProps,\n StatusBarSectionProps,\n StatusBarItemProps,\n StatusBarContextValue,\n} from './StatusBar.types';\n\nconst StatusBarContext = /*#__PURE__*/ createContext<StatusBarContextValue>({\n size: 'sm',\n});\n\nconst useStatusBar = () => useContext(StatusBarContext);\n\n// --- Sub-components ---\n\nconst StatusBarSection = /*#__PURE__*/ React.memo<StatusBarSectionProps>(\n ({\n side = 'left',\n children,\n\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n return (\n <div\n ref={ref}\n className={cx(statusBarSection({ side }), className)}\n style={style}\n data-testid={testId}\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nStatusBarSection.displayName = 'StatusBar.Section';\n\nconst StatusBarItem = /*#__PURE__*/ React.memo<StatusBarItemProps>(\n ({\n onClick,\n icon,\n children,\n title,\n badge: badgeProp,\n disabled = false,\n\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n useStatusBar();\n\n const content = (\n <>\n {icon}\n {children && <span>{children}</span>}\n {badgeProp !== undefined && badgeProp !== false && (\n <span className={badge({ dot: badgeProp === true })}>\n {typeof badgeProp === 'number' ? badgeProp : null}\n </span>\n )}\n </>\n );\n\n if (onClick) {\n return (\n <button\n onClick={onClick}\n title={title}\n disabled={disabled}\n className={cx(itemButton, className)}\n style={style}\n data-testid={testId}\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n {...rest}\n >\n {content}\n </button>\n );\n }\n\n return (\n <span\n title={title}\n className={cx(itemSpan, className)}\n style={style}\n data-testid={testId}\n ref={ref}\n {...rest}\n >\n {content}\n </span>\n );\n }\n);\n\nStatusBarItem.displayName = 'StatusBar.Item';\n\n// --- Root Component ---\n\nconst StatusBarRoot: React.FC<StatusBarProps> = ({\n size = 'sm',\n variant = 'default',\n children,\n\n className,\n style,\n testId,\n ref,\n ...rest\n}) => {\n const contextValue = useMemo(() => ({ size }), [size]);\n\n return (\n <StatusBarContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cx(statusBarRoot({ variant, size }), className)}\n style={style}\n data-testid={testId}\n role=\"status\"\n aria-live=\"polite\"\n {...rest}\n >\n {children}\n </div>\n </StatusBarContext.Provider>\n );\n};\n\nStatusBarRoot.displayName = 'StatusBar';\n\n// --- Compound Component ---\n\nexport const StatusBar = /*#__PURE__*/ Object.assign(StatusBarRoot, {\n Section: StatusBarSection,\n Item: StatusBarItem,\n});\n"],"names":[],"mappings":";;;;;;AAqBA;AACE;AACD;AAED;AAEA;AAEA;AAWI;AAWF;AAGF;AAEA;AAeI;;;AAeE;;AAiBF;AAYF;AAGF;AAEA;AAEA;AAWE;;AAiBF;AAEA;AAEA;AAEO;AACL;AACA;AACD;;"}
|
|
@@ -22,7 +22,9 @@ const ToolbarButton = /*#__PURE__*/ React.memo(({ onClick, icon, children, toolt
|
|
|
22
22
|
ToolbarButton.displayName = 'Toolbar.Button';
|
|
23
23
|
const ToolbarToggle = /*#__PURE__*/ React.memo(({ pressed, onPressedChange, icon, children, tooltip, disabled = false, className, style, testId, ref, ...rest }) => {
|
|
24
24
|
const { size } = useToolbar();
|
|
25
|
-
return (jsxs("button", { onClick: () =>
|
|
25
|
+
return (jsxs("button", { onClick: () => {
|
|
26
|
+
onPressedChange(!pressed);
|
|
27
|
+
}, disabled: disabled, className: cx(toolbarButton({ size, variant: 'default', active: pressed }), className), style: style, "data-testid": testId, ref: ref, title: tooltip, type: "button", tabIndex: -1, "aria-pressed": pressed, ...rest, children: [icon, !icon && children] }));
|
|
26
28
|
});
|
|
27
29
|
ToolbarToggle.displayName = 'Toolbar.Toggle';
|
|
28
30
|
const ToolbarGroupComp = /*#__PURE__*/ React.memo(({ children, className, style, testId, ref, ...rest }) => {
|
|
@@ -48,8 +50,7 @@ const ToolbarRoot = ({ orientation = 'horizontal', size = 'md', children, classN
|
|
|
48
50
|
externalRef(node);
|
|
49
51
|
}
|
|
50
52
|
else if (externalRef && typeof externalRef === 'object') {
|
|
51
|
-
externalRef.current =
|
|
52
|
-
node;
|
|
53
|
+
externalRef.current = node;
|
|
53
54
|
}
|
|
54
55
|
}, [externalRef]);
|
|
55
56
|
const handleKeyDown = useCallback((e) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","sources":["
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sources":["src/components/shell/Toolbar/Toolbar.tsx"],"sourcesContent":["'use client';\n\nimport React, {\n createContext,\n useContext,\n useRef,\n useCallback,\n useMemo,\n KeyboardEvent,\n} from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport {\n toolbarRoot,\n toolbarButton,\n toolbarGroup,\n toolbarSeparator,\n toolbarSpacer,\n} from './Toolbar.css';\n\nimport type {\n ToolbarProps,\n ToolbarButtonProps,\n ToolbarToggleProps,\n ToolbarGroupProps,\n ToolbarSeparatorProps,\n ToolbarSpacerProps,\n ToolbarContextValue,\n} from './Toolbar.types';\n\nconst ToolbarContext = /*#__PURE__*/ createContext<ToolbarContextValue>({\n orientation: 'horizontal',\n size: 'md',\n});\n\nconst useToolbar = () => useContext(ToolbarContext);\n\n// --- Roving tabindex helper ---\n\nconst FOCUSABLE_ITEM_SELECTOR =\n 'button:not(:disabled), [role=\"button\"]:not([aria-disabled=\"true\"])';\n\nfunction focusableItems(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_ITEM_SELECTOR)\n );\n}\n\n// --- Sub-components ---\n\nconst ToolbarButton = /*#__PURE__*/ React.memo<ToolbarButtonProps>(\n ({\n onClick,\n icon,\n children,\n tooltip,\n variant = 'default',\n disabled = false,\n\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n const { size } = useToolbar();\n\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={cx(\n toolbarButton({ size, variant, active: false }),\n className\n )}\n style={style}\n data-testid={testId}\n ref={ref}\n title={tooltip}\n type=\"button\"\n tabIndex={-1}\n {...rest}\n >\n {icon}\n {!icon && children}\n </button>\n );\n }\n);\n\nToolbarButton.displayName = 'Toolbar.Button';\n\nconst ToolbarToggle = /*#__PURE__*/ React.memo<ToolbarToggleProps>(\n ({\n pressed,\n onPressedChange,\n icon,\n children,\n tooltip,\n disabled = false,\n\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n const { size } = useToolbar();\n\n return (\n <button\n onClick={() => {\n onPressedChange(!pressed);\n }}\n disabled={disabled}\n className={cx(\n toolbarButton({ size, variant: 'default', active: pressed }),\n className\n )}\n style={style}\n data-testid={testId}\n ref={ref}\n title={tooltip}\n type=\"button\"\n tabIndex={-1}\n aria-pressed={pressed}\n {...rest}\n >\n {icon}\n {!icon && children}\n </button>\n );\n }\n);\n\nToolbarToggle.displayName = 'Toolbar.Toggle';\n\nconst ToolbarGroupComp = /*#__PURE__*/ React.memo<ToolbarGroupProps>(\n ({ children, className, style, testId, ref, ...rest }) => {\n const { orientation } = useToolbar();\n\n return (\n <div\n className={cx(toolbarGroup({ orientation }), className)}\n style={style}\n data-testid={testId}\n ref={ref}\n role=\"group\"\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nToolbarGroupComp.displayName = 'Toolbar.Group';\n\nconst ToolbarSeparatorComp = /*#__PURE__*/ React.memo<ToolbarSeparatorProps>(\n ({ className, style, testId, ref, ...rest }) => {\n const { orientation } = useToolbar();\n return (\n <div\n className={cx(toolbarSeparator({ orientation }), className)}\n style={style}\n data-testid={testId}\n ref={ref}\n role=\"separator\"\n aria-orientation={\n orientation === 'horizontal' ? 'vertical' : 'horizontal'\n }\n {...rest}\n />\n );\n }\n);\n\nToolbarSeparatorComp.displayName = 'Toolbar.Separator';\n\nconst ToolbarSpacerComp = /*#__PURE__*/ React.memo<ToolbarSpacerProps>(\n ({ className, style, testId, ref, ...rest }) => {\n return (\n <div\n className={cx(toolbarSpacer, className)}\n style={style}\n data-testid={testId}\n ref={ref}\n {...rest}\n />\n );\n }\n);\n\nToolbarSpacerComp.displayName = 'Toolbar.Spacer';\n\n// --- Root Component ---\n\nconst ToolbarRoot: React.FC<ToolbarProps> = ({\n orientation = 'horizontal',\n size = 'md',\n children,\n\n className,\n style,\n testId,\n ref: externalRef,\n ...rest\n}) => {\n const internalRef = useRef<HTMLDivElement>(null);\n\n const setToolbarRef = useMemo(\n () => (node: HTMLDivElement | null) => {\n internalRef.current = node;\n if (typeof externalRef === 'function') {\n externalRef(node);\n } else if (externalRef && typeof externalRef === 'object') {\n externalRef.current = node;\n }\n },\n [externalRef]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n const container = internalRef.current;\n if (!container) return;\n\n const items = focusableItems(container);\n if (items.length === 0) return;\n\n const current = document.activeElement as HTMLElement;\n const currentIndex = items.indexOf(current);\n\n const nextKey = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n const prevKey = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';\n\n if (e.key === nextKey) {\n e.preventDefault();\n const next = currentIndex + 1 < items.length ? currentIndex + 1 : 0;\n items[next]?.focus();\n } else if (e.key === prevKey) {\n e.preventDefault();\n const prev =\n currentIndex - 1 >= 0 ? currentIndex - 1 : items.length - 1;\n items[prev]?.focus();\n } else if (e.key === 'Home') {\n e.preventDefault();\n items[0]?.focus();\n } else if (e.key === 'End') {\n e.preventDefault();\n items[items.length - 1]?.focus();\n }\n },\n [orientation]\n );\n\n const handleFocus = useCallback(() => {\n const container = internalRef.current;\n if (!container) return;\n\n // If focus lands on the toolbar container itself, move to first button\n if (document.activeElement === container) {\n const items = focusableItems(container);\n items[0]?.focus();\n }\n }, []);\n\n const toolbarContextValue = useMemo(\n () => ({ orientation, size }),\n [orientation, size]\n );\n\n return (\n <ToolbarContext.Provider value={toolbarContextValue}>\n <div\n ref={setToolbarRef}\n className={cx(toolbarRoot({ orientation }), className)}\n style={style}\n data-testid={testId}\n role=\"toolbar\"\n aria-orientation={orientation}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n {...rest}\n >\n {children}\n </div>\n </ToolbarContext.Provider>\n );\n};\n\nToolbarRoot.displayName = 'Toolbar';\n\n// --- Compound Component ---\n\nexport const Toolbar = /*#__PURE__*/ Object.assign(ToolbarRoot, {\n Button: ToolbarButton,\n Toggle: ToolbarToggle,\n Group: ToolbarGroupComp,\n Separator: ToolbarSeparatorComp,\n Spacer: ToolbarSpacerComp,\n});\n"],"names":[],"mappings":";;;;;;AA+BA;AACE;AACA;AACD;AAED;AAEA;AAEA;AAGA;;AAIA;AAEA;AAEA;AAeI;AAEA;AAoBF;AAGF;AAEA;AAeI;AAEA;AAGM;AACF;AAmBN;AAGF;AAEA;AAEI;AAEA;AAYF;AAGF;AAEA;AAEI;;AAcF;AAGF;AAEA;;AAWE;AAGF;AAEA;AAEA;AAWE;;AAII;AACA;;;AAEO;AACL;;AAEJ;AAIF;AAEI;AACA;;AAEA;AACA;;AAEA;;AAGA;AACA;AAEA;;AAEE;AACA;;AACK;;;AAIL;;AACK;;AAEL;;AACK;;;;AAIT;AAIF;AACE;AACA;;;AAGA;AACE;AACA;;;;;AA2BN;AAEA;AAEA;AAEO;AACL;AACA;AACA;AACA;AACA;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyboardContext.js","sources":["
|
|
1
|
+
{"version":3,"file":"KeyboardContext.js","sources":["src/context/KeyboardContext.tsx"],"sourcesContent":["'use client';\n\nimport React, {\n createContext,\n useContext,\n memo,\n useEffect,\n useCallback,\n} from 'react';\n\nimport { useKeyboard, isKeyPressed } from '@/hooks/useKeyboard';\n\nimport type { KeyboardState, AllKeys } from '@/hooks/useKeyboard';\n\nconst NEUTRAL_KEYBOARD_STATE: KeyboardState = {\n pressedKeys: [],\n modifiers: { control: false, shift: false, alt: false, meta: false },\n};\n\nconst KeyboardContext = /*#__PURE__*/ createContext<KeyboardState>(\n NEUTRAL_KEYBOARD_STATE\n);\n\nexport interface KeyboardContextProviderProps {\n children: React.ReactNode;\n}\n\nexport const KeyboardContextProvider = /*#__PURE__*/ memo(\n ({ children }: KeyboardContextProviderProps) => {\n const keyboardState = useKeyboard();\n return (\n <KeyboardContext.Provider value={keyboardState}>\n {children}\n </KeyboardContext.Provider>\n );\n }\n);\n\nexport const useKeyboardContext = (): KeyboardState =>\n useContext(KeyboardContext);\n\ntype KeyboardEffectMode = 'keydown' | 'keyup';\n\ntype KeyboardEffect = {\n key: AllKeys;\n actions: {\n [mode in KeyboardEffectMode]?: () => void;\n };\n};\n\nexport function useEffectsOnKeyboard(actions: KeyboardEffect[]): void {\n const keyboard = useKeyboardContext();\n\n const handleKeyDown = useCallback(() => {\n actions.forEach(action => {\n if (isKeyPressed(keyboard, action.key) && action.actions.keydown) {\n action.actions.keydown();\n }\n });\n }, [keyboard, actions]);\n\n const handleKeyUp = useCallback(() => {\n actions.forEach(action => {\n if (isKeyPressed(keyboard, action.key) && action.actions.keyup) {\n action.actions.keyup();\n }\n });\n }, [keyboard, actions]);\n\n useEffect(() => {\n handleKeyDown();\n handleKeyUp();\n }, [handleKeyDown, handleKeyUp]);\n}\n"],"names":[],"mappings":";;;;;;AAcA;AACE;AACA;;AAGF;AAQO;AAEH;AACA;AAKF;AAGK;AAYD;AACJ;AAEA;AACE;AACE;AACE;;AAEJ;AACF;AAEA;AACE;AACE;AACE;;AAEJ;AACF;;AAGE;AACA;AACF;AACF;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
|
-
import { breakpoints, BREAKPOINT_ORDER } from '../../theme/breakpoints.js';
|
|
4
3
|
import { useMediaQuery } from '../useMediaQuery/useMediaQuery.js';
|
|
4
|
+
import { breakpoints, BREAKPOINT_ORDER } from '../../theme/breakpoints.js';
|
|
5
5
|
|
|
6
6
|
const SM_QUERY = `(min-width: ${breakpoints.sm}px)`;
|
|
7
7
|
const MD_QUERY = `(min-width: ${breakpoints.md}px)`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBreakpoint.js","sources":["
|
|
1
|
+
{"version":3,"file":"useBreakpoint.js","sources":["src/hooks/useBreakpoint/useBreakpoint.ts"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\n\nimport { useMediaQuery } from '@/hooks/useMediaQuery';\nimport { BREAKPOINT_ORDER, breakpoints } from '@/theme/breakpoints';\n\nimport type { UseBreakpointReturn } from './useBreakpoint.types';\nimport type { Breakpoint } from '@/theme/breakpoints';\n\nconst SM_QUERY = `(min-width: ${breakpoints.sm}px)`;\nconst MD_QUERY = `(min-width: ${breakpoints.md}px)`;\nconst LG_QUERY = `(min-width: ${breakpoints.lg}px)`;\nconst XL_QUERY = `(min-width: ${breakpoints.xl}px)`;\n\nfunction resolveCurrent(map: Omit<UseBreakpointReturn, 'current'>): Breakpoint {\n for (let i = BREAKPOINT_ORDER.length - 1; i >= 0; i -= 1) {\n const name = BREAKPOINT_ORDER[i];\n if (name && map[name]) return name;\n }\n return 'xs';\n}\n\n/**\n * Reactive named-breakpoint matcher.\n *\n * Returns booleans for each named breakpoint plus the largest matching\n * `current`. Built on top of `useMediaQuery`. Breakpoint values come from\n * `@/theme/breakpoints` and match the values used by `Stack` and other\n * responsive layout components.\n *\n * @example\n * ```tsx\n * const { md, current } = useBreakpoint();\n * return md ? <Sidebar /> : <BottomSheet />;\n * ```\n */\nexport function useBreakpoint(): UseBreakpointReturn {\n const sm = useMediaQuery(SM_QUERY);\n const md = useMediaQuery(MD_QUERY);\n const lg = useMediaQuery(LG_QUERY);\n const xl = useMediaQuery(XL_QUERY);\n\n return useMemo(() => {\n const map = { xs: true, sm, md, lg, xl };\n return { ...map, current: resolveCurrent(map) };\n }, [sm, md, lg, xl]);\n}\n"],"names":[],"mappings":";;;;;AAUA;AACA;AACA;AACA;AAEA;AACE;AACE;AACA;AAAuB;;AAEzB;AACF;AAEA;;;;;;;;;;;;;AAaG;;AAED;AACA;AACA;AACA;;AAGE;;;AAGJ;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { useLatest } from '../useLatest/useLatest.js';
|
|
3
4
|
|
|
4
5
|
function isOutside(target, refs) {
|
|
5
6
|
if (!(target instanceof Node))
|
|
@@ -32,13 +33,11 @@ function isOutside(target, refs) {
|
|
|
32
33
|
*/
|
|
33
34
|
function useClickOutside(ref, handler, options = {}) {
|
|
34
35
|
const { enabled = true, event = 'mousedown' } = options;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
//
|
|
38
|
-
handlerRef
|
|
39
|
-
|
|
40
|
-
// arrays without forcing a re-subscribe of the document listener.
|
|
41
|
-
refsRef.current = Array.isArray(ref) ? ref : [ref];
|
|
36
|
+
// Latest handler / ref(s), refreshed after each commit so the document
|
|
37
|
+
// listener reads live values without re-subscribing and consumers may pass
|
|
38
|
+
// inline arrays.
|
|
39
|
+
const handlerRef = useLatest(handler);
|
|
40
|
+
const refsRef = useLatest(Array.isArray(ref) ? ref : [ref]);
|
|
42
41
|
useEffect(() => {
|
|
43
42
|
if (!enabled)
|
|
44
43
|
return;
|
|
@@ -53,7 +52,8 @@ function useClickOutside(ref, handler, options = {}) {
|
|
|
53
52
|
return () => {
|
|
54
53
|
document.removeEventListener(event, listener);
|
|
55
54
|
};
|
|
56
|
-
|
|
55
|
+
// handlerRef/refsRef are stable useLatest refs; listed to satisfy the rule.
|
|
56
|
+
}, [enabled, event, handlerRef, refsRef]);
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
export { useClickOutside };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useClickOutside.js","sources":["
|
|
1
|
+
{"version":3,"file":"useClickOutside.js","sources":["src/hooks/useClickOutside/useClickOutside.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\n\nimport { useLatest } from '@/hooks/useLatest';\n\nimport type { RefObject } from 'react';\n\nexport interface UseClickOutsideOptions {\n /**\n * When false, the listener is not attached. Useful for toggling without\n * unmount.\n * @default true\n */\n enabled?: boolean;\n /**\n * Mouse / pointer event to listen for.\n * @default 'mousedown'\n */\n event?: 'mousedown' | 'click' | 'pointerdown';\n}\n\ntype AnyHTMLRef = RefObject<HTMLElement | null>;\n\nfunction isOutside(target: EventTarget | null, refs: AnyHTMLRef[]): boolean {\n if (!(target instanceof Node)) return true;\n\n for (const ref of refs) {\n const node = ref.current;\n if (node && (node === target || node.contains(target))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Fire a callback when a click occurs outside the referenced element(s).\n *\n * Accepts either a single ref or an array of refs. The handler fires only\n * when the click lands outside ALL provided refs — useful for popover +\n * trigger pairs where clicking either should be considered \"inside\".\n *\n * Defaults to `mousedown` so the handler runs before `click`. SSR-safe;\n * cleans up on unmount and when `enabled` flips to `false`.\n *\n * @example\n * ```tsx\n * const ref = useRef<HTMLDivElement>(null);\n * useClickOutside(ref, () => setOpen(false), { enabled: isOpen });\n *\n * return <div ref={ref}>...</div>;\n * ```\n */\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n ref: RefObject<T | null> | Array<RefObject<HTMLElement | null>>,\n handler: (event: MouseEvent) => void,\n options: UseClickOutsideOptions = {}\n): void {\n const { enabled = true, event = 'mousedown' } = options;\n\n // Latest handler / ref(s), refreshed after each commit so the document\n // listener reads live values without re-subscribing and consumers may pass\n // inline arrays.\n const handlerRef = useLatest(handler);\n const refsRef = useLatest<AnyHTMLRef[]>(Array.isArray(ref) ? ref : [ref]);\n\n useEffect(() => {\n if (!enabled) return;\n if (typeof document === 'undefined') return;\n\n const listener = (e: MouseEvent) => {\n if (isOutside(e.target, refsRef.current)) {\n handlerRef.current(e);\n }\n };\n\n document.addEventListener(event, listener);\n return () => {\n document.removeEventListener(event, listener);\n };\n // handlerRef/refsRef are stable useLatest refs; listed to satisfy the rule.\n }, [enabled, event, handlerRef, refsRef]);\n}\n"],"names":[],"mappings":";;;;AAwBA;AACE;AAA+B;AAE/B;AACE;AACA;AACE;;;AAGJ;AACF;AAEA;;;;;;;;;;;;;;;;;AAiBG;AACG;;;;;AAUJ;;;AAIE;;;;AAGA;;AAEI;;AAEJ;AAEA;AACA;AACE;AACF;;;AAGJ;;"}
|
|
@@ -24,6 +24,10 @@ function writeViaExecCommand(text) {
|
|
|
24
24
|
textarea.select();
|
|
25
25
|
let succeeded = false;
|
|
26
26
|
try {
|
|
27
|
+
// Legacy fallback used only when navigator.clipboard.writeText is
|
|
28
|
+
// unavailable (the modern primary path). execCommand has no modern
|
|
29
|
+
// synchronous equivalent for this fallback scenario.
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
27
31
|
succeeded = document.execCommand('copy');
|
|
28
32
|
}
|
|
29
33
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useClipboard.js","sources":["
|
|
1
|
+
{"version":3,"file":"useClipboard.js","sources":["src/hooks/useClipboard/useClipboard.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type {\n ClipboardStatus,\n UseClipboardOptions,\n UseClipboardReturn,\n} from './useClipboard.types';\n\nconst DEFAULT_TIMEOUT = 2000;\n\nasync function writeViaClipboardApi(text: string): Promise<boolean> {\n if (\n typeof navigator === 'undefined' ||\n typeof navigator.clipboard === 'undefined' ||\n typeof navigator.clipboard.writeText !== 'function'\n ) {\n return false;\n }\n await navigator.clipboard.writeText(text);\n return true;\n}\n\nfunction writeViaExecCommand(text: string): boolean {\n if (typeof document === 'undefined') return false;\n\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'absolute';\n textarea.style.left = '-9999px';\n textarea.style.top = '0';\n document.body.appendChild(textarea);\n textarea.select();\n\n let succeeded = false;\n try {\n // Legacy fallback used only when navigator.clipboard.writeText is\n // unavailable (the modern primary path). execCommand has no modern\n // synchronous equivalent for this fallback scenario.\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n succeeded = document.execCommand('copy');\n } catch {\n succeeded = false;\n }\n document.body.removeChild(textarea);\n return succeeded;\n}\n\n/**\n * Copy text to the clipboard with a built-in timeout-driven feedback state.\n *\n * Uses `navigator.clipboard.writeText` when available; falls back to\n * `document.execCommand('copy')` only when the modern API is missing.\n * In SSR or restricted contexts where neither path is available, `copy`\n * resolves to `false` and `status` flips to `'error'` without throwing.\n *\n * @example\n * ```tsx\n * const { copy, copied } = useClipboard({ timeout: 1500 });\n *\n * return (\n * <Button onClick={() => copy('Hello!')}>\n * {copied ? 'Copied!' : 'Copy'}\n * </Button>\n * );\n * ```\n */\nexport function useClipboard(\n options: UseClipboardOptions = {}\n): UseClipboardReturn {\n const { timeout = DEFAULT_TIMEOUT } = options;\n\n const [status, setStatus] = useState<ClipboardStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const timeoutRef = useRef(timeout);\n // Bumped on every `copy()` call. The async path captures its own value\n // and short-circuits on resolution if a newer call has started — that\n // prevents an older, slower `writeText` from overwriting the state of a\n // newer copy or from arming a stale timer.\n const requestSeqRef = useRef(0);\n\n useEffect(() => {\n timeoutRef.current = timeout;\n }, [timeout]);\n\n const clearTimer = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const reset = useCallback(() => {\n clearTimer();\n // Invalidate any in-flight copy so a late resolution does not flip\n // the status back from idle/error.\n requestSeqRef.current += 1;\n setStatus('idle');\n setError(null);\n }, [clearTimer]);\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n clearTimer();\n\n requestSeqRef.current += 1;\n const requestId = requestSeqRef.current;\n\n let succeeded = false;\n let copyError: Error | null = null;\n\n try {\n succeeded = await writeViaClipboardApi(text);\n } catch (err) {\n copyError = err instanceof Error ? err : new Error(String(err));\n }\n\n if (!succeeded && copyError === null) {\n try {\n succeeded = writeViaExecCommand(text);\n if (!succeeded) {\n copyError = new Error('Copy command was rejected by the browser.');\n }\n } catch (err) {\n copyError = err instanceof Error ? err : new Error(String(err));\n }\n }\n\n // A newer call (or `reset`) has started — drop this result on the\n // floor so it does not race the active state.\n if (requestId !== requestSeqRef.current) {\n return succeeded;\n }\n\n if (succeeded) {\n setError(null);\n setStatus('copied');\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n // Guard the timer too: another copy may have started during the\n // window and bumped the sequence. We still clear the timer ref,\n // but only flip back to idle if the timer belonged to the\n // current request.\n if (requestId === requestSeqRef.current) {\n setStatus('idle');\n }\n }, timeoutRef.current);\n return true;\n }\n\n setError(copyError ?? new Error('Clipboard API is not available.'));\n setStatus('error');\n return false;\n },\n [clearTimer]\n );\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n }, []);\n\n return {\n status,\n copied: status === 'copied',\n error,\n copy,\n reset,\n };\n}\n"],"names":[],"mappings":";;;AAUA;AAEA;;AAGI;;AAGA;;;AAGF;AACF;AAEA;;AACuC;;AAGrC;AACA;AACA;AACA;AACA;AACA;;;AAIA;;;;;AAKE;;AACA;;;AAGF;AACA;AACF;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACG;AAGJ;;;AAKA;AACA;;;;;AAKA;;AAGE;AACF;AAEA;AACE;AACE;AACA;;;AAIJ;AACE;;;AAGA;;;AAGF;;AAII;AAEA;AACA;;;AAKA;AACE;;;AAEA;;AAGF;AACE;AACE;;AAEE;;;;AAGF;;;;;AAMJ;AACE;;;;;AAMA;AACE;;;;;AAKA;;;AAGF;AACA;;;;AAKF;AACF;;AAKA;AACE;AACE;AACA;;AAEJ;;;;;;;;;AAUJ;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useControlledState.js","sources":["
|
|
1
|
+
{"version":3,"file":"useControlledState.js","sources":["src/hooks/useControlledState/useControlledState.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { devWarn } from '@/utils/devWarn';\n\nexport interface UseControlledStateOptions<T> {\n /** Controlled value — when defined, drives the returned value. */\n value?: T;\n /** Default value used when the hook is uncontrolled. */\n defaultValue?: T;\n /** Called when the consumer requests a change in either mode. */\n onChange?: (value: T) => void;\n /** Fallback used when both `value` and `defaultValue` are undefined. */\n fallback: T;\n}\n\n/**\n * Manage a value that may be either controlled (via prop) or uncontrolled\n * (managed internally with a default).\n *\n * Returns a `[value, setValue]` tuple just like `useState`. When\n * `options.value` is defined the state is read from there and `setValue`\n * becomes a pure side-effect callback that calls `onChange` only — internal\n * state is never mutated. When `options.value` is undefined the hook owns the\n * state and `setValue` updates it as well as calls `onChange`.\n *\n * Switching between controlled and uncontrolled within a component's lifetime\n * is a known pitfall (matches React's own warning for `<input value/defaultValue>`).\n * The hook emits a development-only warning when this happens.\n *\n * @example\n * ```ts\n * const [value, setValue] = useControlledState({\n * value: props.value,\n * defaultValue: props.defaultValue,\n * onChange: props.onChange,\n * fallback: '',\n * });\n * ```\n */\nexport function useControlledState<T>(\n options: UseControlledStateOptions<T>\n): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange, fallback } = options;\n\n const isControlled = value !== undefined;\n\n // Only `undefined` means \"no defaultValue given\" — `null` is a legal value\n // for generic T (e.g. `string | null`) and must not be replaced by fallback.\n const [internalValue, setInternalValue] = useState<T>(\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n defaultValue !== undefined ? defaultValue : fallback\n );\n\n // Stable refs to avoid stale closures and unnecessary identity changes.\n const onChangeRef = useRef(onChange);\n const internalValueRef = useRef(internalValue);\n const isControlledRef = useRef(isControlled);\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n internalValueRef.current = internalValue;\n }, [internalValue]);\n\n // Dev-only warning when controlled <-> uncontrolled flips after mount.\n // Mirrors React's behavior for <input value/defaultValue>.\n useEffect(() => {\n const wasControlled = isControlledRef.current;\n if (wasControlled !== isControlled) {\n devWarn(\n `[useControlledState] Component is changing from ${\n wasControlled ? 'controlled' : 'uncontrolled'\n } to ${isControlled ? 'controlled' : 'uncontrolled'}. ` +\n 'Components should not switch between controlled and uncontrolled ' +\n '(or vice versa) during their lifetime. Decide between using a ' +\n 'controlled or uncontrolled mode for the lifetime of the component.'\n );\n isControlledRef.current = isControlled;\n }\n }, [isControlled]);\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const prev = isControlledRef.current\n ? (value as T)\n : internalValueRef.current;\n const resolved =\n typeof next === 'function' ? (next as (p: T) => T)(prev) : next;\n\n if (!isControlledRef.current) {\n setInternalValue(resolved);\n internalValueRef.current = resolved;\n }\n onChangeRef.current?.(resolved);\n },\n [value]\n );\n\n const currentValue = isControlled ? (value as T) : internalValue;\n return [currentValue, setValue];\n}\n"],"names":[],"mappings":";;;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACG;;AAKJ;;;AAIA;;;;AAMA;AACA;AACA;;AAGE;AACF;;AAGE;AACF;;;;AAKE;AACA;;;;AAOM;AAEJ;;AAEJ;AAEA;AAEI;AACE;AACA;AACF;AAGA;;AAEE;;AAEF;AACF;;AAKF;AACF;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useRef, useCallback, useMemo, useEffect } from 'react';
|
|
3
|
+
import { useEventCallback } from '../useEventCallback/useEventCallback.js';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Wrap a function so rapid calls collapse into one. By default the call
|
|
@@ -20,8 +21,9 @@ import { useRef, useCallback, useMemo, useEffect } from 'react';
|
|
|
20
21
|
*/
|
|
21
22
|
function useDebouncedCallback(fn, delay, options = {}) {
|
|
22
23
|
const { leading = false, maxWait } = options;
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
// Stable wrapper that always invokes the current callback, refreshed via
|
|
25
|
+
// useInsertionEffect so the debounced wrapper never goes stale.
|
|
26
|
+
const stableFn = useEventCallback(fn);
|
|
25
27
|
const timerRef = useRef(null);
|
|
26
28
|
const maxTimerRef = useRef(null);
|
|
27
29
|
const lastArgsRef = useRef(null);
|
|
@@ -42,11 +44,14 @@ function useDebouncedCallback(fn, delay, options = {}) {
|
|
|
42
44
|
lastInvokeRef.current = Date.now();
|
|
43
45
|
clearTimers();
|
|
44
46
|
if (args)
|
|
45
|
-
|
|
46
|
-
}, [clearTimers]);
|
|
47
|
+
stableFn(...args);
|
|
48
|
+
}, [clearTimers, stableFn]);
|
|
47
49
|
const debounced = useMemo(() => {
|
|
48
50
|
const wrapper = (...args) => {
|
|
49
51
|
lastArgsRef.current = args;
|
|
52
|
+
// Date.now() runs only when the wrapper is invoked from an event/timer,
|
|
53
|
+
// never during render, so it is not a render-purity concern here.
|
|
54
|
+
// eslint-disable-next-line react-hooks/purity
|
|
50
55
|
const now = Date.now();
|
|
51
56
|
const isLeadingCall = leading && timerRef.current === null && maxTimerRef.current === null;
|
|
52
57
|
if (isLeadingCall) {
|
|
@@ -55,7 +60,7 @@ function useDebouncedCallback(fn, delay, options = {}) {
|
|
|
55
60
|
// pick them up.
|
|
56
61
|
lastArgsRef.current = null;
|
|
57
62
|
lastInvokeRef.current = now;
|
|
58
|
-
|
|
63
|
+
stableFn(...args);
|
|
59
64
|
}
|
|
60
65
|
if (timerRef.current !== null)
|
|
61
66
|
clearTimeout(timerRef.current);
|
|
@@ -87,7 +92,7 @@ function useDebouncedCallback(fn, delay, options = {}) {
|
|
|
87
92
|
clearTimers();
|
|
88
93
|
};
|
|
89
94
|
return wrapper;
|
|
90
|
-
}, [delay, leading, maxWait, invoke, clearTimers]);
|
|
95
|
+
}, [delay, leading, maxWait, invoke, clearTimers, stableFn]);
|
|
91
96
|
// Cleanup on unmount.
|
|
92
97
|
useEffect(() => clearTimers, [clearTimers]);
|
|
93
98
|
return debounced;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebouncedCallback.js","sources":["
|
|
1
|
+
{"version":3,"file":"useDebouncedCallback.js","sources":["src/hooks/useDebounced/useDebouncedCallback.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { useEventCallback } from '@/hooks/useEventCallback';\n\nimport type {\n DebouncedCallback,\n UseDebouncedCallbackOptions,\n} from './useDebounced.types';\n\n/**\n * Wrap a function so rapid calls collapse into one. By default the call\n * fires on the trailing edge — pass `leading: true` to also fire\n * immediately. `maxWait` forces a call even when calls keep coming.\n *\n * The wrapper identity is stable; passing fresh inline functions across\n * renders is safe and does not reset pending timers.\n *\n * @example\n * ```tsx\n * const onResize = useDebouncedCallback(measure, 150);\n * useEffect(() => {\n * window.addEventListener('resize', onResize);\n * return () => window.removeEventListener('resize', onResize);\n * }, [onResize]);\n * ```\n */\nexport function useDebouncedCallback<Args extends unknown[]>(\n fn: (...args: Args) => void,\n delay: number,\n options: UseDebouncedCallbackOptions = {}\n): DebouncedCallback<Args> {\n const { leading = false, maxWait } = options;\n\n // Stable wrapper that always invokes the current callback, refreshed via\n // useInsertionEffect so the debounced wrapper never goes stale.\n const stableFn = useEventCallback(fn);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const maxTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastArgsRef = useRef<Args | null>(null);\n const lastInvokeRef = useRef<number>(0);\n\n const clearTimers = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (maxTimerRef.current !== null) {\n clearTimeout(maxTimerRef.current);\n maxTimerRef.current = null;\n }\n }, []);\n\n const invoke = useCallback(() => {\n const args = lastArgsRef.current;\n lastArgsRef.current = null;\n lastInvokeRef.current = Date.now();\n clearTimers();\n if (args) stableFn(...args);\n }, [clearTimers, stableFn]);\n\n const debounced = useMemo<DebouncedCallback<Args>>(() => {\n const wrapper = (...args: Args): void => {\n lastArgsRef.current = args;\n // Date.now() runs only when the wrapper is invoked from an event/timer,\n // never during render, so it is not a render-purity concern here.\n // eslint-disable-next-line react-hooks/purity\n const now = Date.now();\n const isLeadingCall =\n leading && timerRef.current === null && maxTimerRef.current === null;\n\n if (isLeadingCall) {\n // Fire immediately, then suppress trailing for `delay` ms unless\n // additional calls happen — in that case the trailing handler will\n // pick them up.\n lastArgsRef.current = null;\n lastInvokeRef.current = now;\n stableFn(...args);\n }\n\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n if (lastArgsRef.current !== null) invoke();\n else if (maxTimerRef.current !== null) {\n clearTimeout(maxTimerRef.current);\n maxTimerRef.current = null;\n }\n }, delay);\n\n if (maxWait !== undefined && maxTimerRef.current === null) {\n maxTimerRef.current = setTimeout(() => {\n maxTimerRef.current = null;\n if (lastArgsRef.current !== null) invoke();\n }, maxWait);\n }\n };\n\n wrapper.cancel = () => {\n lastArgsRef.current = null;\n clearTimers();\n };\n wrapper.flush = () => {\n if (lastArgsRef.current !== null) invoke();\n else clearTimers();\n };\n\n return wrapper;\n }, [delay, leading, maxWait, invoke, clearTimers, stableFn]);\n\n // Cleanup on unmount.\n useEffect(() => clearTimers, [clearTimers]);\n\n return debounced;\n}\n"],"names":[],"mappings":";;;;AAWA;;;;;;;;;;;;;;;;AAgBG;AACG;;;;AASJ;AAEA;AACA;AACA;AACA;AAEA;AACE;AACE;AACA;;AAEF;AACE;AACA;;;AAIJ;AACE;AACA;AACA;AACA;AACA;AAAU;AACZ;AAEA;AACE;AACE;;;;AAIA;AACA;;;;;AAOE;AACA;AACA;;AAGF;AAA+B;AAC/B;AACE;AACA;AAAkC;AAC7B;AACH;AACA;;;;AAKF;AACE;AACA;AAAkC;;;AAGxC;AAEA;AACE;AACA;AACF;AACA;AACE;AAAkC;;AAC7B;AACP;AAEA;AACF;;;AAKA;AACF;;"}
|
|
@@ -5,19 +5,31 @@ import { useState, useEffect } from 'react';
|
|
|
5
5
|
* Returns a copy of `value` that updates only after `delay` ms have elapsed
|
|
6
6
|
* without further changes (trailing-edge debounce).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* @deprecated Prefer React's `useDeferredValue` for the common case — keeping
|
|
9
|
+
* an input responsive while an expensive derivation (filtering, search) lags
|
|
10
|
+
* behind it. It needs no fixed delay, integrates with concurrent rendering,
|
|
11
|
+
* and gives better interactivity on large lists. Reach for `useDebouncedCallback`
|
|
12
|
+
* when you need to debounce a *side effect* (a network request, an analytics
|
|
13
|
+
* ping) rather than a rendered value. This hook stays exported for now but
|
|
14
|
+
* will not see further work.
|
|
9
15
|
*
|
|
10
16
|
* @example
|
|
11
17
|
* ```tsx
|
|
12
|
-
*
|
|
13
|
-
* const
|
|
14
|
-
*
|
|
18
|
+
* // Preferred: defer the value that drives the expensive derivation.
|
|
19
|
+
* const deferredQuery = useDeferredValue(query);
|
|
20
|
+
* const results = useMemo(
|
|
21
|
+
* () => filter(items, deferredQuery),
|
|
22
|
+
* [items, deferredQuery]
|
|
23
|
+
* );
|
|
15
24
|
* ```
|
|
16
25
|
*/
|
|
17
26
|
function useDebouncedValue(value, delay) {
|
|
18
27
|
const [debounced, setDebounced] = useState(value);
|
|
19
28
|
useEffect(() => {
|
|
20
29
|
if (delay <= 0) {
|
|
30
|
+
// Synchronous passthrough when debouncing is disabled; this hook's whole
|
|
31
|
+
// purpose is to mirror an external value into state.
|
|
32
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
21
33
|
setDebounced(value);
|
|
22
34
|
return;
|
|
23
35
|
}
|