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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logViewUtils.js","sources":["src/components/feedback/LogView/logViewUtils.ts"],"sourcesContent":["import type { LogEntry, ResolvedLogEntry } from './LogView.types';\n\n/** A run of text, flagged as a search match or not. */\nexport interface HighlightSegment {\n text: string;\n match: boolean;\n}\n\n/**\n * Split `text` into alternating non-match / match segments for `query`.\n *\n * Pure and allocation-light: an empty (or whitespace-only) query returns a\n * single non-match segment so callers can render uniformly. Matching is\n * case-insensitive unless `caseSensitive` is set. All occurrences are marked.\n *\n * @example\n * getHighlightSegments('abcABC', 'bc')\n * // → [{text:'a',match:false},{text:'bc',match:true},\n * // {text:'A',match:false},{text:'BC',match:true}]\n */\nexport function getHighlightSegments(\n text: string,\n query: string,\n caseSensitive = false\n): HighlightSegment[] {\n const needle = query.trim();\n if (needle === '' || text === '') {\n return [{ text, match: false }];\n }\n\n const haystack = caseSensitive ? text : text.toLowerCase();\n const term = caseSensitive ? needle : needle.toLowerCase();\n\n const segments: HighlightSegment[] = [];\n let cursor = 0;\n let found = haystack.indexOf(term, cursor);\n\n if (found === -1) {\n return [{ text, match: false }];\n }\n\n while (found !== -1) {\n if (found > cursor) {\n segments.push({ text: text.slice(cursor, found), match: false });\n }\n segments.push({\n text: text.slice(found, found + term.length),\n match: true,\n });\n cursor = found + term.length;\n found = haystack.indexOf(term, cursor);\n }\n\n if (cursor < text.length) {\n segments.push({ text: text.slice(cursor), match: false });\n }\n\n return segments;\n}\n\n/** Pad a number to two digits. */\nfunction pad2(value: number): string {\n return value < 10 ? `0${value}` : String(value);\n}\n\n/** Pad a number to three digits. */\nfunction pad3(value: number): string {\n if (value < 10) return `00${value}`;\n if (value < 100) return `0${value}`;\n return String(value);\n}\n\n/**\n * Default timestamp formatter: `HH:mm:ss.SSS` in local time. Accepts epoch\n * milliseconds or a `Date`.\n */\nexport function defaultFormatTimestamp(timestamp: number | Date): string {\n const date = timestamp instanceof Date ? timestamp : new Date(timestamp);\n if (Number.isNaN(date.getTime())) return '';\n return `${pad2(date.getHours())}:${pad2(date.getMinutes())}:${pad2(\n date.getSeconds()\n )}.${pad3(date.getMilliseconds())}`;\n}\n\n/**\n * True when the entry matches the search query. Searches the message and the\n * optional source tag. An empty query always matches.\n */\nexport function entryMatchesQuery(\n entry: Pick<LogEntry, 'message' | 'source'>,\n query: string,\n caseSensitive = false\n): boolean {\n const needle = query.trim();\n if (needle === '') return true;\n const term = caseSensitive ? needle : needle.toLowerCase();\n const message = caseSensitive ? entry.message : entry.message.toLowerCase();\n if (message.includes(term)) return true;\n if (entry.source != null) {\n const source = caseSensitive ? entry.source : entry.source.toLowerCase();\n if (source.includes(term)) return true;\n }\n return false;\n}\n\n/**\n * Render one resolved entry to a plain-text line for copy/export. Includes the\n * timestamp and source when present, mirroring what the row shows.\n */\nexport function entryToText(\n entry: ResolvedLogEntry,\n options: {\n showTimestamps?: boolean;\n formatTimestamp?: (timestamp: number | Date) => string;\n } = {}\n): string {\n const { showTimestamps = false, formatTimestamp = defaultFormatTimestamp } =\n options;\n const parts: string[] = [];\n if (showTimestamps && entry.timestamp != null) {\n const formatted = formatTimestamp(entry.timestamp);\n if (formatted !== '') parts.push(formatted);\n }\n parts.push(`[${String(entry.level).toUpperCase()}]`);\n if (entry.source != null && entry.source !== '') {\n parts.push(`(${entry.source})`);\n }\n parts.push(entry.message);\n return parts.join(' ');\n}\n\n/**\n * Filter resolved entries by visible levels and a text query.\n *\n * Level rule: an entry is hidden only when its level is a *known* filter level\n * (has a chip) and that level is not active. Entries with an unknown level (no\n * chip) are always visible — toggling chips never hides them.\n */\nexport function filterEntries(\n entries: readonly ResolvedLogEntry[],\n options: {\n query: string;\n caseSensitive?: boolean;\n knownLevels: ReadonlySet<string>;\n activeLevels: ReadonlySet<string>;\n }\n): ResolvedLogEntry[] {\n const { query, caseSensitive = false, knownLevels, activeLevels } = options;\n const hasQuery = query.trim() !== '';\n return entries.filter(entry => {\n if (knownLevels.has(entry.level) && !activeLevels.has(entry.level)) {\n return false;\n }\n if (hasQuery && !entryMatchesQuery(entry, query, caseSensitive)) {\n return false;\n }\n return true;\n });\n}\n\n/** Join resolved entries into a copy/export blob. */\nexport function entriesToText(\n entries: readonly ResolvedLogEntry[],\n options?: {\n showTimestamps?: boolean;\n formatTimestamp?: (timestamp: number | Date) => string;\n }\n): string {\n return entries.map(entry => entryToText(entry, options)).join('\\n');\n}\n"],"names":[],"mappings":"AAQA;;;;;;;;;;;AAWG;AACG,SAAU,oBAAoB,CAClC,IAAY,EACZ,KAAa,EACb,aAAa,GAAG,KAAK,EAAA;AAErB,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE;IAC3B,IAAI,MAAM,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE;QAChC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACjC;AAEA,IAAA,MAAM,QAAQ,GAAG,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC1D,IAAA,MAAM,IAAI,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;IAE1D,MAAM,QAAQ,GAAuB,EAAE;IACvC,IAAI,MAAM,GAAG,CAAC;IACd,IAAI,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AAE1C,IAAA,IAAI,KAAK,KAAK,EAAE,EAAE;QAChB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACjC;AAEA,IAAA,OAAO,KAAK,KAAK,EAAE,EAAE;AACnB,QAAA,IAAI,KAAK,GAAG,MAAM,EAAE;YAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAClE;QACA,QAAQ,CAAC,IAAI,CAAC;AACZ,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;AAC5C,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA,CAAC;AACF,QAAA,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM;QAC5B,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;IACxC;AAEA,IAAA,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,QAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC3D;AAEA,IAAA,OAAO,QAAQ;AACjB;AAEA;AACA,SAAS,IAAI,CAAC,KAAa,EAAA;AACzB,IAAA,OAAO,KAAK,GAAG,EAAE,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,GAAG,MAAM,CAAC,KAAK,CAAC;AACjD;AAEA;AACA,SAAS,IAAI,CAAC,KAAa,EAAA;IACzB,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE;IACnC,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;AACnC,IAAA,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB;AAEA;;;AAGG;AACG,SAAU,sBAAsB,CAAC,SAAwB,EAAA;AAC7D,IAAA,MAAM,IAAI,GAAG,SAAS,YAAY,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;IACxE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAAE,QAAA,OAAO,EAAE;AAC3C,IAAA,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAChE,IAAI,CAAC,UAAU,EAAE,CAClB,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE;AACrC;AAEA;;;AAGG;AACG,SAAU,iBAAiB,CAC/B,KAA2C,EAC3C,KAAa,EACb,aAAa,GAAG,KAAK,EAAA;AAErB,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE;IAC3B,IAAI,MAAM,KAAK,EAAE;AAAE,QAAA,OAAO,IAAI;AAC9B,IAAA,MAAM,IAAI,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;AAC1D,IAAA,MAAM,OAAO,GAAG,aAAa,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE;AAC3E,IAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;AACvC,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE;AACxB,QAAA,MAAM,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;AACxE,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI;IACxC;AACA,IAAA,OAAO,KAAK;AACd;AAEA;;;AAGG;SACa,WAAW,CACzB,KAAuB,EACvB,UAGI,EAAE,EAAA;IAEN,MAAM,EAAE,cAAc,GAAG,KAAK,EAAE,eAAe,GAAG,sBAAsB,EAAE,GACxE,OAAO;IACT,MAAM,KAAK,GAAa,EAAE;IAC1B,IAAI,cAAc,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE;QAC7C,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC;QAClD,IAAI,SAAS,KAAK,EAAE;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7C;AACA,IAAA,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG,CAAC;AACpD,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE;QAC/C,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;IACjC;AACA,IAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACzB,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB;AAEA;;;;;;AAMG;AACG,SAAU,aAAa,CAC3B,OAAoC,EACpC,OAKC,EAAA;AAED,IAAA,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO;IAC3E,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;AACpC,IAAA,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,IAAG;AAC5B,QAAA,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AAClE,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,QAAQ,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE;AAC/D,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC;AACJ;AAEA;AACM,SAAU,aAAa,CAC3B,OAAoC,EACpC,OAGC,EAAA;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACrE;;;;"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useRef, useState, useCallback, useLayoutEffect, useEffect } from 'react';
|
|
3
|
+
import { useLatest } from '../../../hooks/useLatest/useLatest.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Follow-tail behavior for a scrollable log body.
|
|
7
|
+
*
|
|
8
|
+
* - While `follow` is on, the viewport snaps to the bottom whenever the entry
|
|
9
|
+
* count changes (a genuine scroll-position sync → `useLayoutEffect`).
|
|
10
|
+
* - A manual scroll **up** detaches (`setFollow(false)`); scrolling back to the
|
|
11
|
+
* bottom re-attaches. "At bottom" is read from live scroll metrics, never
|
|
12
|
+
* from mirrored state, so it can't drift.
|
|
13
|
+
* - Programmatic snaps are flagged so they don't read as a manual scroll.
|
|
14
|
+
*
|
|
15
|
+
* This logic is intentionally colocated with LogView (single consumer); promote
|
|
16
|
+
* it to `src/hooks/` only if a second component needs it.
|
|
17
|
+
*/
|
|
18
|
+
function useFollowTail({ scrollRef, follow, setFollow, entryCount, threshold = 8, }) {
|
|
19
|
+
const followRef = useLatest(follow);
|
|
20
|
+
const setFollowRef = useLatest(setFollow);
|
|
21
|
+
const entryCountRef = useLatest(entryCount);
|
|
22
|
+
const isAutoScrollingRef = useRef(false);
|
|
23
|
+
const resetRafRef = useRef(0);
|
|
24
|
+
// Entry count captured at the moment of detach; `null` until the user
|
|
25
|
+
// actually scrolls away (so a consumer starting with follow=false doesn't
|
|
26
|
+
// miscount every existing line as "new"). The badge shows entryCount - this.
|
|
27
|
+
const [detachedAtCount, setDetachedAtCount] = useState(null);
|
|
28
|
+
const performScrollToBottom = useCallback(() => {
|
|
29
|
+
const el = scrollRef.current;
|
|
30
|
+
if (!el)
|
|
31
|
+
return;
|
|
32
|
+
isAutoScrollingRef.current = true;
|
|
33
|
+
el.scrollTop = el.scrollHeight;
|
|
34
|
+
if (typeof requestAnimationFrame === 'function') {
|
|
35
|
+
cancelAnimationFrame(resetRafRef.current);
|
|
36
|
+
resetRafRef.current = requestAnimationFrame(() => {
|
|
37
|
+
isAutoScrollingRef.current = false;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
isAutoScrollingRef.current = false;
|
|
42
|
+
}
|
|
43
|
+
}, [scrollRef]);
|
|
44
|
+
// Snap to bottom on mount and whenever the entry count changes while attached.
|
|
45
|
+
useLayoutEffect(() => {
|
|
46
|
+
if (!follow)
|
|
47
|
+
return;
|
|
48
|
+
performScrollToBottom();
|
|
49
|
+
}, [follow, entryCount, performScrollToBottom]);
|
|
50
|
+
// Detach on manual scroll-up; re-attach on scroll-to-bottom. Listener attaches
|
|
51
|
+
// once and reads live values through refs.
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const el = scrollRef.current;
|
|
54
|
+
if (!el)
|
|
55
|
+
return;
|
|
56
|
+
const handleScroll = () => {
|
|
57
|
+
if (isAutoScrollingRef.current)
|
|
58
|
+
return;
|
|
59
|
+
const atBottom = el.scrollHeight - el.clientHeight - el.scrollTop <= threshold;
|
|
60
|
+
if (atBottom) {
|
|
61
|
+
if (!followRef.current) {
|
|
62
|
+
setDetachedAtCount(null);
|
|
63
|
+
setFollowRef.current(true);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (followRef.current) {
|
|
67
|
+
setDetachedAtCount(entryCountRef.current);
|
|
68
|
+
setFollowRef.current(false);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
el.addEventListener('scroll', handleScroll, { passive: true });
|
|
72
|
+
return () => {
|
|
73
|
+
el.removeEventListener('scroll', handleScroll);
|
|
74
|
+
};
|
|
75
|
+
}, [scrollRef, threshold, followRef, setFollowRef, entryCountRef]);
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
return () => {
|
|
78
|
+
if (typeof cancelAnimationFrame === 'function') {
|
|
79
|
+
cancelAnimationFrame(resetRafRef.current);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}, []);
|
|
83
|
+
const scrollToBottom = useCallback(() => {
|
|
84
|
+
performScrollToBottom();
|
|
85
|
+
setDetachedAtCount(null);
|
|
86
|
+
setFollowRef.current(true);
|
|
87
|
+
}, [performScrollToBottom, setFollowRef]);
|
|
88
|
+
const newSinceDetach = follow || detachedAtCount === null
|
|
89
|
+
? 0
|
|
90
|
+
: Math.max(0, entryCount - detachedAtCount);
|
|
91
|
+
return { scrollToBottom, isDetached: !follow, newSinceDetach };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export { useFollowTail };
|
|
95
|
+
//# sourceMappingURL=useFollowTail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFollowTail.js","sources":["src/components/feedback/LogView/useFollowTail.ts"],"sourcesContent":["'use client';\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { useLatest } from '@/hooks/useLatest';\n\nimport type { RefObject } from 'react';\n\nexport interface UseFollowTailOptions {\n /** The scroll viewport element. */\n scrollRef: RefObject<HTMLElement | null>;\n /** Whether to stick to the bottom as new entries arrive. */\n follow: boolean;\n /** Attach/detach follow. */\n setFollow: (follow: boolean) => void;\n /** Current number of (visible) entries — drives snap-on-append and the new-line badge. */\n entryCount: number;\n /** Distance from the bottom (px) still considered \"at bottom\". @default 8 */\n threshold?: number;\n}\n\nexport interface UseFollowTailResult {\n /** Scroll to the latest line and re-attach follow. */\n scrollToBottom: () => void;\n /** True when the user has scrolled up and detached from the tail. */\n isDetached: boolean;\n /** Entries appended since the user detached (0 while following). */\n newSinceDetach: number;\n}\n\n/**\n * Follow-tail behavior for a scrollable log body.\n *\n * - While `follow` is on, the viewport snaps to the bottom whenever the entry\n * count changes (a genuine scroll-position sync → `useLayoutEffect`).\n * - A manual scroll **up** detaches (`setFollow(false)`); scrolling back to the\n * bottom re-attaches. \"At bottom\" is read from live scroll metrics, never\n * from mirrored state, so it can't drift.\n * - Programmatic snaps are flagged so they don't read as a manual scroll.\n *\n * This logic is intentionally colocated with LogView (single consumer); promote\n * it to `src/hooks/` only if a second component needs it.\n */\nexport function useFollowTail({\n scrollRef,\n follow,\n setFollow,\n entryCount,\n threshold = 8,\n}: UseFollowTailOptions): UseFollowTailResult {\n const followRef = useLatest(follow);\n const setFollowRef = useLatest(setFollow);\n const entryCountRef = useLatest(entryCount);\n\n const isAutoScrollingRef = useRef(false);\n const resetRafRef = useRef(0);\n\n // Entry count captured at the moment of detach; `null` until the user\n // actually scrolls away (so a consumer starting with follow=false doesn't\n // miscount every existing line as \"new\"). The badge shows entryCount - this.\n const [detachedAtCount, setDetachedAtCount] = useState<number | null>(null);\n\n const performScrollToBottom = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n isAutoScrollingRef.current = true;\n el.scrollTop = el.scrollHeight;\n if (typeof requestAnimationFrame === 'function') {\n cancelAnimationFrame(resetRafRef.current);\n resetRafRef.current = requestAnimationFrame(() => {\n isAutoScrollingRef.current = false;\n });\n } else {\n isAutoScrollingRef.current = false;\n }\n }, [scrollRef]);\n\n // Snap to bottom on mount and whenever the entry count changes while attached.\n useLayoutEffect(() => {\n if (!follow) return;\n performScrollToBottom();\n }, [follow, entryCount, performScrollToBottom]);\n\n // Detach on manual scroll-up; re-attach on scroll-to-bottom. Listener attaches\n // once and reads live values through refs.\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n\n const handleScroll = (): void => {\n if (isAutoScrollingRef.current) return;\n const atBottom =\n el.scrollHeight - el.clientHeight - el.scrollTop <= threshold;\n if (atBottom) {\n if (!followRef.current) {\n setDetachedAtCount(null);\n setFollowRef.current(true);\n }\n } else if (followRef.current) {\n setDetachedAtCount(entryCountRef.current);\n setFollowRef.current(false);\n }\n };\n\n el.addEventListener('scroll', handleScroll, { passive: true });\n return () => {\n el.removeEventListener('scroll', handleScroll);\n };\n }, [scrollRef, threshold, followRef, setFollowRef, entryCountRef]);\n\n useEffect(() => {\n return () => {\n if (typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(resetRafRef.current);\n }\n };\n }, []);\n\n const scrollToBottom = useCallback(() => {\n performScrollToBottom();\n setDetachedAtCount(null);\n setFollowRef.current(true);\n }, [performScrollToBottom, setFollowRef]);\n\n const newSinceDetach =\n follow || detachedAtCount === null\n ? 0\n : Math.max(0, entryCount - detachedAtCount);\n\n return { scrollToBottom, isDetached: !follow, newSinceDetach };\n}\n"],"names":[],"mappings":";;;;AAoCA;;;;;;;;;;;;AAYG;AACG;AAOJ;AACA;AACA;AAEA;AACA;;;;;AAOA;AACE;AACA;;AACA;AACA;AACA;AACE;AACA;AACE;AACF;;;AAEA;;AAEJ;;;AAIE;;AACA;;;;;AAMA;AACA;;;;;AAIE;;AAGE;;AAEE;;;AAEG;AACL;AACA;;AAEJ;AAEA;AACA;AACE;AACF;AACF;;AAGE;AACE;AACE;;AAEJ;;AAGF;AACE;;AAEA;AACF;AAEA;AAEI;;;AAIN;;"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useRef, useCallback } from 'react';
|
|
3
|
+
import { useLatest } from '../../../hooks/useLatest/useLatest.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Row selection + keyboard behavior for the LogView body.
|
|
7
|
+
*
|
|
8
|
+
* - Click selects (single), Cmd/Ctrl+click toggles, Shift+click extends a range
|
|
9
|
+
* from the anchor (multiple).
|
|
10
|
+
* - Enter/Space activate the focused row; Cmd/Ctrl+C copies the selection (when
|
|
11
|
+
* present and no text is selected); Cmd/Ctrl+A selects all visible; Escape
|
|
12
|
+
* clears.
|
|
13
|
+
* - A drag-to-select-text gesture is never treated as a row click.
|
|
14
|
+
*
|
|
15
|
+
* Consumer values are read through `useLatest` so the returned handlers stay
|
|
16
|
+
* identity-stable (they never have to be memoized by the caller). Colocated
|
|
17
|
+
* with LogView (single consumer); promote to `src/hooks/` only if a second
|
|
18
|
+
* component needs it.
|
|
19
|
+
*/
|
|
20
|
+
function useLogSelection({ selectionMode, selectedIds, setSelectedIds, filtered, onEntryClick, isTextSelected, onCopyShortcut, }) {
|
|
21
|
+
const anchorRef = useRef(null);
|
|
22
|
+
const filteredRef = useLatest(filtered);
|
|
23
|
+
const selectedIdsRef = useLatest(selectedIds);
|
|
24
|
+
const onEntryClickRef = useLatest(onEntryClick);
|
|
25
|
+
const isTextSelectedRef = useLatest(isTextSelected);
|
|
26
|
+
const onCopyShortcutRef = useLatest(onCopyShortcut);
|
|
27
|
+
const handleRowClick = useCallback((entry, index, event) => {
|
|
28
|
+
// Don't treat a drag-to-select-text gesture as a row click.
|
|
29
|
+
if (isTextSelectedRef.current())
|
|
30
|
+
return;
|
|
31
|
+
onEntryClickRef.current?.(entry, index);
|
|
32
|
+
if (selectionMode === false)
|
|
33
|
+
return;
|
|
34
|
+
const { id } = entry;
|
|
35
|
+
if (selectionMode === 'single') {
|
|
36
|
+
anchorRef.current = index;
|
|
37
|
+
setSelectedIds(new Set([id]));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (event.shiftKey && anchorRef.current !== null) {
|
|
41
|
+
const list = filteredRef.current;
|
|
42
|
+
const from = Math.min(anchorRef.current, index);
|
|
43
|
+
const to = Math.max(anchorRef.current, index);
|
|
44
|
+
const range = new Set();
|
|
45
|
+
for (let i = from; i <= to; i += 1) {
|
|
46
|
+
const rangeEntry = list[i];
|
|
47
|
+
if (rangeEntry)
|
|
48
|
+
range.add(rangeEntry.id);
|
|
49
|
+
}
|
|
50
|
+
setSelectedIds(range);
|
|
51
|
+
}
|
|
52
|
+
else if (event.metaKey || event.ctrlKey) {
|
|
53
|
+
const next = new Set(selectedIdsRef.current);
|
|
54
|
+
if (next.has(id))
|
|
55
|
+
next.delete(id);
|
|
56
|
+
else
|
|
57
|
+
next.add(id);
|
|
58
|
+
anchorRef.current = index;
|
|
59
|
+
setSelectedIds(next);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
anchorRef.current = index;
|
|
63
|
+
setSelectedIds(new Set([id]));
|
|
64
|
+
}
|
|
65
|
+
}, [
|
|
66
|
+
selectionMode,
|
|
67
|
+
setSelectedIds,
|
|
68
|
+
filteredRef,
|
|
69
|
+
selectedIdsRef,
|
|
70
|
+
onEntryClickRef,
|
|
71
|
+
isTextSelectedRef,
|
|
72
|
+
]);
|
|
73
|
+
const handleRowKeyDown = useCallback((entry, index, event) => {
|
|
74
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
handleRowClick(entry, index, event);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const meta = event.metaKey || event.ctrlKey;
|
|
80
|
+
if (meta && (event.key === 'c' || event.key === 'C')) {
|
|
81
|
+
// Let the browser copy an active text selection instead.
|
|
82
|
+
if (isTextSelectedRef.current() || selectedIdsRef.current.size === 0) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
event.preventDefault();
|
|
86
|
+
onCopyShortcutRef.current();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (selectionMode === false)
|
|
90
|
+
return;
|
|
91
|
+
if (meta && (event.key === 'a' || event.key === 'A')) {
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
setSelectedIds(new Set(filteredRef.current.map(item => item.id)));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (event.key === 'Escape' && selectedIdsRef.current.size > 0) {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
setSelectedIds(new Set());
|
|
99
|
+
}
|
|
100
|
+
}, [
|
|
101
|
+
handleRowClick,
|
|
102
|
+
selectionMode,
|
|
103
|
+
setSelectedIds,
|
|
104
|
+
filteredRef,
|
|
105
|
+
selectedIdsRef,
|
|
106
|
+
isTextSelectedRef,
|
|
107
|
+
onCopyShortcutRef,
|
|
108
|
+
]);
|
|
109
|
+
return { handleRowClick, handleRowKeyDown };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export { useLogSelection };
|
|
113
|
+
//# sourceMappingURL=useLogSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLogSelection.js","sources":["src/components/feedback/LogView/useLogSelection.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useRef } from 'react';\n\nimport { useLatest } from '@/hooks/useLatest';\n\nimport type { LogViewSelectionMode, ResolvedLogEntry } from './LogView.types';\nimport type React from 'react';\n\nexport interface UseLogSelectionOptions {\n /** Active selection mode. */\n selectionMode: LogViewSelectionMode;\n /** Currently-selected entry ids. */\n selectedIds: ReadonlySet<string>;\n /** Replace the selection. */\n setSelectedIds: (ids: ReadonlySet<string>) => void;\n /** The currently-filtered entries (for range selection and select-all). */\n filtered: readonly ResolvedLogEntry[];\n /** Fired on row activation regardless of selection mode. */\n onEntryClick: ((entry: ResolvedLogEntry, index: number) => void) | undefined;\n /** True when the user has an active text selection inside the log body. */\n isTextSelected: () => boolean;\n /** Invoked on Cmd/Ctrl+C while a row selection exists. */\n onCopyShortcut: () => void;\n}\n\nexport interface UseLogSelectionResult {\n /** Click handler for a row (also reused for Enter/Space activation). */\n handleRowClick: (\n entry: ResolvedLogEntry,\n index: number,\n event: React.MouseEvent | React.KeyboardEvent\n ) => void;\n /** Keydown handler for a row: activation, copy, select-all, clear. */\n handleRowKeyDown: (\n entry: ResolvedLogEntry,\n index: number,\n event: React.KeyboardEvent<HTMLDivElement>\n ) => void;\n}\n\n/**\n * Row selection + keyboard behavior for the LogView body.\n *\n * - Click selects (single), Cmd/Ctrl+click toggles, Shift+click extends a range\n * from the anchor (multiple).\n * - Enter/Space activate the focused row; Cmd/Ctrl+C copies the selection (when\n * present and no text is selected); Cmd/Ctrl+A selects all visible; Escape\n * clears.\n * - A drag-to-select-text gesture is never treated as a row click.\n *\n * Consumer values are read through `useLatest` so the returned handlers stay\n * identity-stable (they never have to be memoized by the caller). Colocated\n * with LogView (single consumer); promote to `src/hooks/` only if a second\n * component needs it.\n */\nexport function useLogSelection({\n selectionMode,\n selectedIds,\n setSelectedIds,\n filtered,\n onEntryClick,\n isTextSelected,\n onCopyShortcut,\n}: UseLogSelectionOptions): UseLogSelectionResult {\n const anchorRef = useRef<number | null>(null);\n const filteredRef = useLatest(filtered);\n const selectedIdsRef = useLatest(selectedIds);\n const onEntryClickRef = useLatest(onEntryClick);\n const isTextSelectedRef = useLatest(isTextSelected);\n const onCopyShortcutRef = useLatest(onCopyShortcut);\n\n const handleRowClick = useCallback(\n (\n entry: ResolvedLogEntry,\n index: number,\n event: React.MouseEvent | React.KeyboardEvent\n ) => {\n // Don't treat a drag-to-select-text gesture as a row click.\n if (isTextSelectedRef.current()) return;\n onEntryClickRef.current?.(entry, index);\n if (selectionMode === false) return;\n\n const { id } = entry;\n if (selectionMode === 'single') {\n anchorRef.current = index;\n setSelectedIds(new Set([id]));\n return;\n }\n\n if (event.shiftKey && anchorRef.current !== null) {\n const list = filteredRef.current;\n const from = Math.min(anchorRef.current, index);\n const to = Math.max(anchorRef.current, index);\n const range = new Set<string>();\n for (let i = from; i <= to; i += 1) {\n const rangeEntry = list[i];\n if (rangeEntry) range.add(rangeEntry.id);\n }\n setSelectedIds(range);\n } else if (event.metaKey || event.ctrlKey) {\n const next = new Set(selectedIdsRef.current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n anchorRef.current = index;\n setSelectedIds(next);\n } else {\n anchorRef.current = index;\n setSelectedIds(new Set([id]));\n }\n },\n [\n selectionMode,\n setSelectedIds,\n filteredRef,\n selectedIdsRef,\n onEntryClickRef,\n isTextSelectedRef,\n ]\n );\n\n const handleRowKeyDown = useCallback(\n (\n entry: ResolvedLogEntry,\n index: number,\n event: React.KeyboardEvent<HTMLDivElement>\n ) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleRowClick(entry, index, event);\n return;\n }\n const meta = event.metaKey || event.ctrlKey;\n if (meta && (event.key === 'c' || event.key === 'C')) {\n // Let the browser copy an active text selection instead.\n if (isTextSelectedRef.current() || selectedIdsRef.current.size === 0) {\n return;\n }\n event.preventDefault();\n onCopyShortcutRef.current();\n return;\n }\n if (selectionMode === false) return;\n if (meta && (event.key === 'a' || event.key === 'A')) {\n event.preventDefault();\n setSelectedIds(new Set(filteredRef.current.map(item => item.id)));\n return;\n }\n if (event.key === 'Escape' && selectedIdsRef.current.size > 0) {\n event.preventDefault();\n setSelectedIds(new Set());\n }\n },\n [\n handleRowClick,\n selectionMode,\n setSelectedIds,\n filteredRef,\n selectedIdsRef,\n isTextSelectedRef,\n onCopyShortcutRef,\n ]\n );\n\n return { handleRowClick, handleRowKeyDown };\n}\n"],"names":[],"mappings":";;;;AAyCA;;;;;;;;;;;;;;AAcG;;AAUD;AACA;AACA;AACA;AACA;AACA;;;;;;;;AAaI;AACA;AACE;;;;;AAMA;AACA;AACA;AACA;AACA;AACE;AACA;AAAgB;;;;;;AAKlB;AAAkB;;AACb;AACL;;;;AAGA;;;AAGJ;;;;;;;AAQC;;AASC;;AAEE;;;;AAIF;;AAEE;;;;;;;;;AAQF;;;;;AAKA;;AAEE;;AAEJ;;;;;;;;AASC;AAGH;AACF;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import React from 'react';
|
|
4
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
4
|
+
import React from 'react';
|
|
5
5
|
import { vars } from '../../../theme/contract.css.js';
|
|
6
6
|
import { cx } from '../../../utils/cx.js';
|
|
7
7
|
import { progressColorVar, circularSvgStyle, circularTrackCircleStyle, circularIndeterminateStyle, circularFillCircleStyle, circularLabelStyle, circularRootStyle } from './ProgressBar.css.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CircularProgress.js","sources":["
|
|
1
|
+
{"version":3,"file":"CircularProgress.js","sources":["src/components/feedback/ProgressBar/CircularProgress.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { vars } from '@/theme/contract.css';\nimport { cx } from '@/utils/cx';\n\nimport {\n circularFillCircleStyle,\n circularIndeterminateStyle,\n circularLabelStyle,\n circularRootStyle,\n circularSvgStyle,\n circularTrackCircleStyle,\n progressColorVar,\n} from './ProgressBar.css';\n\nimport type {\n CircularProgressProps,\n CircularProgressSize,\n ProgressBarColor,\n} from './ProgressBar.types';\n\nconst SIZE_MAP: Record<CircularProgressSize, number> = {\n xs: 16,\n sm: 20,\n md: 24,\n lg: 32,\n xl: 48,\n};\n\nconst DEFAULT_THICKNESS: Record<CircularProgressSize, number> = {\n xs: 1.5,\n sm: 2,\n md: 2,\n lg: 2.5,\n xl: 3,\n};\n\nconst LABEL_FONT_SIZE: Record<CircularProgressSize, string> = {\n xs: vars.typography.fontSize.xxs,\n sm: vars.typography.fontSize.xxs,\n md: vars.typography.fontSize.xs,\n lg: vars.typography.fontSize.xs,\n xl: vars.typography.fontSize.sm,\n};\n\nconst NAMED_COLOR_MAP: Record<string, string> = {\n primary: vars.colors.accent.primary,\n success: vars.colors.accent.success,\n warning: vars.colors.accent.warning,\n error: vars.colors.accent.error,\n};\n\nfunction resolveColor(color: ProgressBarColor): string {\n return NAMED_COLOR_MAP[color] ?? color;\n}\n\nfunction clampValue(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, max));\n}\n\nfunction toPercent(clamped: number, min: number, max: number): number {\n if (max === min) return 0;\n return ((clamped - min) / (max - min)) * 100;\n}\n\nfunction deriveValueText(\n ariaValueText: string | undefined,\n label: React.ReactNode\n): string | undefined {\n if (ariaValueText !== undefined) return ariaValueText;\n if (typeof label === 'string') return label;\n if (typeof label === 'number') return String(label);\n return undefined;\n}\n\n/**\n * Circular progress indicator.\n *\n * Determinate when `value` is provided; indeterminate (rotating arc) when\n * `value` is `undefined`. Renders an SVG with two stacked circles — track\n * and fill — using `stroke-dasharray` to draw the progress arc. Honors\n * `prefers-reduced-motion`.\n *\n * @example\n * ```tsx\n * <CircularProgress value={75} />\n * <CircularProgress size=\"xl\" value={42} showLabel />\n * <CircularProgress /> // indeterminate\n * ```\n */\nexport const CircularProgress = /*#__PURE__*/ React.memo<CircularProgressProps>(\n ({\n value,\n min = 0,\n max = 100,\n size = 'md',\n thickness,\n color = 'primary',\n showLabel = false,\n label,\n ariaLabel,\n ariaValueText,\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n const indeterminate = value === undefined;\n const clampedValue = indeterminate ? 0 : clampValue(value, min, max);\n const percent = toPercent(clampedValue, min, max);\n const resolvedColor = resolveColor(color);\n const diameter = SIZE_MAP[size];\n const stroke = thickness ?? DEFAULT_THICKNESS[size];\n const radius = (diameter - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n const dashOffset = indeterminate\n ? circumference * 0.75\n : circumference * (1 - percent / 100);\n\n const inlineVars = assignInlineVars({\n [progressColorVar]: resolvedColor,\n });\n\n const percentText = `${Math.round(percent)}%`;\n const labelContent = label ?? (indeterminate ? null : percentText);\n const showLabelText = showLabel && labelContent !== null;\n\n const ariaProps: React.AriaAttributes = {\n 'aria-valuemin': min,\n 'aria-valuemax': max,\n 'aria-label': ariaLabel ?? (indeterminate ? 'Loading' : undefined),\n };\n if (!indeterminate) {\n ariaProps['aria-valuenow'] = clampedValue;\n const valueText = deriveValueText(ariaValueText, label);\n if (valueText !== undefined) {\n ariaProps['aria-valuetext'] = valueText;\n }\n }\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n className={cx(circularRootStyle, className)}\n style={{\n ...inlineVars,\n width: diameter,\n height: diameter,\n ...style,\n }}\n data-testid={testId}\n data-indeterminate={indeterminate ? 'true' : undefined}\n {...ariaProps}\n {...rest}\n >\n <svg\n className={circularSvgStyle}\n width={diameter}\n height={diameter}\n viewBox={`0 0 ${diameter} ${diameter}`}\n aria-hidden\n >\n <circle\n className={circularTrackCircleStyle}\n cx={diameter / 2}\n cy={diameter / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n />\n <circle\n className={cx(\n circularFillCircleStyle,\n indeterminate && circularIndeterminateStyle\n )}\n cx={diameter / 2}\n cy={diameter / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n transform={\n indeterminate\n ? undefined\n : `rotate(-90 ${diameter / 2} ${diameter / 2})`\n }\n />\n </svg>\n {showLabelText ? (\n <span\n className={circularLabelStyle}\n style={{ fontSize: LABEL_FONT_SIZE[size] }}\n >\n {labelContent}\n </span>\n ) : null}\n </div>\n );\n }\n);\n\nCircularProgress.displayName = 'CircularProgress';\n"],"names":[],"mappings":";;;;;;;;AAwBA;AACE;AACA;AACA;AACA;AACA;;AAGF;AACE;AACA;AACA;AACA;AACA;;AAGF;AACE;AACA;AACA;AACA;AACA;;AAGF;AACE;AACA;AACA;AACA;;AAGF;AACE;AACF;AAEA;AACE;AACF;AAEA;;AACmB;AACjB;AACF;AAEA;;AAImC;;AACF;;AACA;AAC/B;AACF;AAEA;;;;;;;;;;;;;;AAcG;AACI;AAkBH;AACA;;AAEA;AACA;;;;;;;;;AAUC;;AAGD;AACA;AAEA;AACE;AACA;AACA;;;AAGA;;AAEA;AACE;;;;AAUE;AACA;AACA;AACA;;AAqCM;AACA;AAcd;AAGF;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import React from 'react';
|
|
4
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
4
|
+
import React from 'react';
|
|
5
5
|
import { vars } from '../../../theme/contract.css.js';
|
|
6
6
|
import { cx } from '../../../utils/cx.js';
|
|
7
7
|
import { progressFillWidthVar, progressColorVar, progressFillStripedAnimatedStyle, progressFillStripedStyle, progressFillBaseStyle, progressIndeterminateStyle, progressOverlayLabelStyle, progressTrackRecipe, progressInlineLabelStyle, progressRootStyle } from './ProgressBar.css.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.js","sources":["
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sources":["src/components/feedback/ProgressBar/ProgressBar.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { vars } from '@/theme/contract.css';\nimport { cx } from '@/utils/cx';\n\nimport {\n progressColorVar,\n progressFillBaseStyle,\n progressFillStripedAnimatedStyle,\n progressFillStripedStyle,\n progressFillWidthVar,\n progressIndeterminateStyle,\n progressInlineLabelStyle,\n progressOverlayLabelStyle,\n progressRootStyle,\n progressTrackRecipe,\n} from './ProgressBar.css';\n\nimport type { ProgressBarColor, ProgressBarProps } from './ProgressBar.types';\n\nconst NAMED_COLOR_MAP: Record<string, string> = {\n primary: vars.colors.accent.primary,\n success: vars.colors.accent.success,\n warning: vars.colors.accent.warning,\n error: vars.colors.accent.error,\n};\n\nfunction resolveColor(color: ProgressBarColor): string {\n return NAMED_COLOR_MAP[color] ?? color;\n}\n\nfunction clampValue(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, max));\n}\n\nfunction toPercent(clamped: number, min: number, max: number): number {\n if (max === min) return 0;\n return ((clamped - min) / (max - min)) * 100;\n}\n\nfunction deriveValueText(\n ariaValueText: string | undefined,\n label: React.ReactNode\n): string | undefined {\n if (ariaValueText !== undefined) return ariaValueText;\n if (typeof label === 'string') return label;\n if (typeof label === 'number') return String(label);\n return undefined;\n}\n\n/**\n * Linear progress indicator.\n *\n * Determinate when `value` is provided; indeterminate (animated sliding bar)\n * when `value` is `undefined`. Supports inline / overlay / custom labels,\n * striped texture (optionally animated), and arbitrary CSS colors. Honors\n * `prefers-reduced-motion`.\n *\n * @example\n * ```tsx\n * <ProgressBar value={60} />\n * <ProgressBar value={50} showLabel=\"inline\" />\n * <ProgressBar size=\"lg\" value={75} striped animated />\n * <ProgressBar /> // indeterminate\n * ```\n */\nexport const ProgressBar = /*#__PURE__*/ React.memo<ProgressBarProps>(\n ({\n value,\n min = 0,\n max = 100,\n size = 'md',\n color = 'primary',\n showLabel = false,\n label,\n striped = false,\n animated = false,\n ariaLabel,\n ariaValueText,\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n const indeterminate = value === undefined;\n const clampedValue = indeterminate ? 0 : clampValue(value, min, max);\n const percent = toPercent(clampedValue, min, max);\n const resolvedColor = resolveColor(color);\n\n const inlineVars = assignInlineVars({\n [progressColorVar]: resolvedColor,\n [progressFillWidthVar]: `${percent}%`,\n });\n\n const fillClassName = cx(\n progressFillBaseStyle,\n striped && progressFillStripedStyle,\n striped && animated && progressFillStripedAnimatedStyle\n );\n\n const percentText = `${Math.round(percent)}%`;\n const labelContent = label ?? (indeterminate ? null : percentText);\n\n const ariaProps: React.AriaAttributes = {\n 'aria-valuemin': min,\n 'aria-valuemax': max,\n 'aria-label': ariaLabel ?? (indeterminate ? 'Loading' : undefined),\n };\n if (!indeterminate) {\n ariaProps['aria-valuenow'] = clampedValue;\n const valueText = deriveValueText(ariaValueText, label);\n if (valueText !== undefined) {\n ariaProps['aria-valuetext'] = valueText;\n }\n }\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n className={cx(progressRootStyle, className)}\n style={{ ...inlineVars, ...style }}\n data-testid={testId}\n data-indeterminate={indeterminate ? 'true' : undefined}\n {...ariaProps}\n {...rest}\n >\n <div className={progressTrackRecipe({ size })}>\n {indeterminate ? (\n <div className={progressIndeterminateStyle} aria-hidden />\n ) : (\n <div className={fillClassName} aria-hidden />\n )}\n {showLabel === 'overlay' && labelContent !== null ? (\n <span className={progressOverlayLabelStyle}>{labelContent}</span>\n ) : null}\n </div>\n {showLabel === 'inline' && labelContent !== null ? (\n <span className={progressInlineLabelStyle}>{labelContent}</span>\n ) : null}\n </div>\n );\n }\n);\n\nProgressBar.displayName = 'ProgressBar';\n"],"names":[],"mappings":";;;;;;;;AAuBA;AACE;AACA;AACA;AACA;;AAGF;AACE;AACF;AAEA;AACE;AACF;AAEA;;AACmB;AACjB;AACF;AAEA;;AAImC;;AACF;;AACA;AAC/B;AACF;AAEA;;;;;;;;;;;;;;;AAeG;AACI;AAmBH;AACA;;AAEA;;;AAIE;AACD;AAED;;AAOA;AAEA;AACE;AACA;AACA;;;AAGA;;AAEA;AACE;;;AAIJ;AA0BF;AAGF;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import React from 'react';
|
|
4
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
4
|
+
import React from 'react';
|
|
5
5
|
import { vars } from '../../../theme/contract.css.js';
|
|
6
6
|
import { cx } from '../../../utils/cx.js';
|
|
7
7
|
import { devWarn } from '../../../utils/devWarn.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Skeleton.js","sources":["
|
|
1
|
+
{"version":3,"file":"Skeleton.js","sources":["src/components/feedback/Skeleton/Skeleton.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { vars } from '@/theme/contract.css';\nimport { cx } from '@/utils/cx';\nimport { devWarn } from '@/utils/devWarn';\n\nimport {\n skeletonHeightVar,\n skeletonRadiusVar,\n skeletonRecipe,\n skeletonWidthVar,\n} from './Skeleton.css';\n\nimport type { SkeletonProps, SkeletonShape } from './Skeleton.types';\n\nconst LINE_DEFAULT_HEIGHT = '12px';\n\nconst SHAPE_RADIUS_FALLBACK: Record<SkeletonShape, string> = {\n rect: vars.borderRadius.sm,\n line: vars.borderRadius.lg,\n circle: '50%',\n};\n\nfunction resolveDimension(\n value: number | string | undefined\n): string | undefined {\n if (value === undefined) return undefined;\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nfunction resolveDefaults(\n shape: SkeletonShape,\n width: number | string | undefined,\n height: number | string | undefined,\n borderRadius: number | string | undefined\n): { width: string; height: string; radius: string } {\n const resolvedWidth = resolveDimension(width) ?? '100%';\n\n let resolvedHeight = resolveDimension(height);\n if (resolvedHeight === undefined) {\n if (shape === 'line') {\n resolvedHeight = LINE_DEFAULT_HEIGHT;\n } else if (shape === 'circle') {\n resolvedHeight = resolvedWidth;\n } else {\n resolvedHeight = '100%';\n }\n }\n\n const resolvedRadius =\n resolveDimension(borderRadius) ?? SHAPE_RADIUS_FALLBACK[shape];\n\n return {\n width: resolvedWidth,\n height: resolvedHeight,\n radius: resolvedRadius,\n };\n}\n\n/**\n * Loading-placeholder block.\n *\n * Renders a rectangle, circle, or line shape with a configurable animation\n * (`pulse`, `wave`, `none`). Use it while waiting for real content to load.\n *\n * Skeletons are decorative — they set `aria-hidden=\"true\"` and `aria-busy=\"true\"`\n * but do not announce themselves. The surrounding region should announce\n * the loading state (e.g. via `Spinner` or `EmptyState loading`).\n *\n * @example\n * ```tsx\n * <Skeleton width={120} height={16} />\n * <Skeleton shape=\"circle\" width={32} />\n * <Skeleton shape=\"line\" width=\"60%\" />\n * <Skeleton animation=\"wave\" height={80} />\n * ```\n */\nexport const Skeleton = /*#__PURE__*/ React.memo<SkeletonProps>(\n ({\n shape = 'rect',\n width,\n height,\n borderRadius,\n animation = 'pulse',\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n if (\n shape === 'circle' &&\n width !== undefined &&\n height !== undefined &&\n width !== height\n ) {\n devWarn(\n '[Skeleton] shape=\"circle\" expects equal width and height; received width=%o, height=%o.',\n width,\n height\n );\n }\n\n const {\n width: w,\n height: h,\n radius,\n } = resolveDefaults(shape, width, height, borderRadius);\n\n const inlineVars = assignInlineVars({\n [skeletonWidthVar]: w,\n [skeletonHeightVar]: h,\n [skeletonRadiusVar]: radius,\n });\n\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n aria-busy=\"true\"\n className={cx(skeletonRecipe({ shape, animation }), className)}\n style={{ ...inlineVars, ...style }}\n data-testid={testId}\n data-shape={shape}\n data-animation={animation}\n {...rest}\n />\n );\n }\n);\n\nSkeleton.displayName = 'Skeleton';\n"],"names":[],"mappings":";;;;;;;;;AAkBA;AAEA;AACE;AACA;AACA;;AAGF;;AAG2B;AACzB;AACF;AAEA;;AAQE;AACA;AACE;;;AAEO;;;;;;;;;AAWP;AACA;AACA;;AAEJ;AAEA;;;;;;;;;;;;;;;;;AAiBG;AACI;;AAeD;AACA;;AAGA;;;;;;;AAiBD;;AAeH;AAGF;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import React from 'react';
|
|
4
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
4
|
+
import React from 'react';
|
|
5
5
|
import { vars } from '../../../theme/contract.css.js';
|
|
6
6
|
import { cx } from '../../../utils/cx.js';
|
|
7
7
|
import { Skeleton } from './Skeleton.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkeletonGroup.js","sources":["
|
|
1
|
+
{"version":3,"file":"SkeletonGroup.js","sources":["src/components/feedback/Skeleton/SkeletonGroup.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { vars } from '@/theme/contract.css';\nimport { cx } from '@/utils/cx';\n\nimport { Skeleton } from './Skeleton';\nimport { skeletonGroupGapVar, skeletonGroupRecipe } from './Skeleton.css';\n\nimport type { SkeletonGroupProps } from './Skeleton.types';\n\nconst SPACING_SCALE: readonly string[] = [\n '0',\n vars.spacing.xs,\n vars.spacing.sm,\n vars.spacing.md,\n vars.spacing.lg,\n vars.spacing.xl,\n vars.spacing.xxl,\n vars.spacing.xxxl,\n];\n\nfunction resolveSpacing(value: number | string): string {\n if (typeof value === 'string') return value;\n const clamped = Math.max(0, Math.min(SPACING_SCALE.length - 1, value));\n const index = Math.floor(clamped);\n return SPACING_SCALE[index] ?? vars.spacing.sm;\n}\n\n/**\n * Lays out one or more `Skeleton` items consistently — handy for \"show\n * five skeleton rows then real data\" patterns.\n *\n * Pass `count` to auto-generate that many skeletons (using `itemProps` to\n * configure them), or pass `children` to lay out custom skeleton shapes\n * yourself. `direction` and `spacing` control the flex container.\n *\n * @example\n * ```tsx\n * // Five lines stacked vertically\n * <SkeletonGroup count={5} itemProps={{ shape: 'line' }} />\n *\n * // Custom composition\n * <SkeletonGroup direction=\"row\" spacing={3}>\n * <Skeleton shape=\"circle\" width={32} />\n * <Skeleton shape=\"line\" width={120} />\n * </SkeletonGroup>\n * ```\n */\nexport const SkeletonGroup = /*#__PURE__*/ React.memo<SkeletonGroupProps>(\n ({\n count,\n spacing = 2,\n direction = 'column',\n itemProps,\n children,\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n const inlineVars = assignInlineVars({\n [skeletonGroupGapVar]: resolveSpacing(spacing),\n });\n\n const content =\n children ??\n Array.from({ length: count ?? 0 }, (_, i) => (\n <Skeleton key={i} {...itemProps} />\n ));\n\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n aria-busy=\"true\"\n className={cx(skeletonGroupRecipe({ direction }), className)}\n style={{ ...inlineVars, ...style }}\n data-testid={testId}\n {...rest}\n >\n {content}\n </div>\n );\n }\n);\n\nSkeletonGroup.displayName = 'SkeletonGroup';\n"],"names":[],"mappings":";;;;;;;;;AAaA;;;;;;;;;;AAWA;;AACiC;;;;AAIjC;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;AACI;;AAcD;AACD;;AAIC;AAIF;AAaF;AAGF;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
-
import React from 'react';
|
|
4
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
4
|
+
import React from 'react';
|
|
5
5
|
import { cx } from '../../../utils/cx.js';
|
|
6
6
|
import { Skeleton } from './Skeleton.js';
|
|
7
7
|
import { chatLayoutStyle, chatBubbleStyle, chatRowEndStyle, chatRowStyle, gridLayoutStyle, layoutColumnsVar, tableLayoutStyle, tableHeaderCellStyle, listLayoutStyle, listRowStyle, listRowBodyStyle, cardLayoutStyle, cardBodyStyle } from './SkeletonLayout.css.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkeletonLayout.js","sources":["
|
|
1
|
+
{"version":3,"file":"SkeletonLayout.js","sources":["src/components/feedback/Skeleton/SkeletonLayout.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport { Skeleton } from './Skeleton';\nimport {\n cardBodyStyle,\n cardLayoutStyle,\n chatBubbleStyle,\n chatLayoutStyle,\n chatRowEndStyle,\n chatRowStyle,\n gridLayoutStyle,\n layoutColumnsVar,\n listLayoutStyle,\n listRowBodyStyle,\n listRowStyle,\n tableHeaderCellStyle,\n tableLayoutStyle,\n} from './SkeletonLayout.css';\n\nimport type {\n SkeletonAnimation,\n SkeletonLayoutProps,\n SkeletonLayoutVariant,\n} from './Skeleton.types';\n\nconst DEFAULT_COUNT: Record<SkeletonLayoutVariant, number> = {\n card: 1,\n list: 5,\n table: 5,\n grid: 12,\n chat: 4,\n};\n\nconst DEFAULT_ANIMATION: Record<SkeletonLayoutVariant, SkeletonAnimation> = {\n card: 'pulse',\n list: 'pulse',\n table: 'pulse',\n grid: 'none',\n chat: 'pulse',\n};\n\nconst DEFAULT_COLUMNS = 4;\n\nfunction renderCard(animation: SkeletonAnimation): React.ReactNode {\n return (\n <div className={cardLayoutStyle}>\n <Skeleton shape=\"circle\" width={40} animation={animation} />\n <div className={cardBodyStyle}>\n <Skeleton shape=\"line\" width=\"70%\" animation={animation} />\n <Skeleton shape=\"line\" width=\"100%\" animation={animation} />\n <Skeleton shape=\"line\" width=\"50%\" animation={animation} />\n <Skeleton width=\"100%\" height={80} animation={animation} />\n </div>\n </div>\n );\n}\n\nfunction renderList(\n count: number,\n animation: SkeletonAnimation\n): React.ReactNode {\n return (\n <div className={listLayoutStyle}>\n {Array.from({ length: count }, (_, i) => (\n <div key={i} className={listRowStyle}>\n <Skeleton shape=\"circle\" width={32} animation={animation} />\n <div className={listRowBodyStyle}>\n <Skeleton shape=\"line\" width=\"60%\" animation={animation} />\n <Skeleton shape=\"line\" width=\"90%\" animation={animation} />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction renderTable(\n rows: number,\n columns: number,\n animation: SkeletonAnimation\n): React.ReactNode {\n const totalCells = (rows + 1) * columns;\n return (\n <div\n className={tableLayoutStyle}\n style={assignInlineVars({ [layoutColumnsVar]: String(columns) })}\n >\n {Array.from({ length: totalCells }, (_, i) => {\n const isHeader = i < columns;\n return (\n <div key={i} className={isHeader ? tableHeaderCellStyle : undefined}>\n <Skeleton\n shape=\"line\"\n width={isHeader ? '50%' : '80%'}\n animation={animation}\n />\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction renderGrid(\n count: number,\n columns: number,\n animation: SkeletonAnimation\n): React.ReactNode {\n return (\n <div\n className={gridLayoutStyle}\n style={assignInlineVars({ [layoutColumnsVar]: String(columns) })}\n >\n {Array.from({ length: count }, (_, i) => (\n <Skeleton key={i} width=\"100%\" height={80} animation={animation} />\n ))}\n </div>\n );\n}\n\nconst CHAT_BUBBLE_WIDTHS = ['85%', '60%', '95%', '70%', '50%', '80%'] as const;\n\nfunction renderChat(\n count: number,\n animation: SkeletonAnimation\n): React.ReactNode {\n return (\n <div className={chatLayoutStyle}>\n {Array.from({ length: count }, (_, i) => {\n const isOutgoing = i % 2 === 1;\n const bubbleWidth = CHAT_BUBBLE_WIDTHS[i % CHAT_BUBBLE_WIDTHS.length];\n return (\n <div\n key={i}\n className={cx(chatRowStyle, isOutgoing && chatRowEndStyle)}\n >\n <Skeleton shape=\"circle\" width={28} animation={animation} />\n <div className={chatBubbleStyle}>\n <Skeleton\n shape=\"line\"\n width={bubbleWidth}\n animation={animation}\n />\n {i % 3 === 0 ? (\n <Skeleton shape=\"line\" width=\"40%\" animation={animation} />\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Pre-built skeleton layouts for common loading patterns — card, list, table,\n * grid, and chat. Drop one in when the surrounding UI shape is known and you\n * want the placeholder structure to mirror it without composing every block\n * by hand.\n *\n * Each variant uses the base `Skeleton` primitive underneath, so animation\n * and reduced-motion behavior match the rest of the library. Use `count` to\n * scale the number of rows/cells, `columns` for `grid` and `table`, and\n * `animation` to opt out of motion for dense surfaces.\n *\n * @example\n * ```tsx\n * <SkeletonLayout variant=\"card\" />\n * <SkeletonLayout variant=\"list\" count={8} />\n * <SkeletonLayout variant=\"table\" columns={5} count={6} />\n * <SkeletonLayout variant=\"grid\" columns={3} count={9} />\n * <SkeletonLayout variant=\"chat\" count={6} />\n * ```\n */\nexport const SkeletonLayout = /*#__PURE__*/ React.memo<SkeletonLayoutProps>(\n ({\n variant,\n count,\n columns = DEFAULT_COLUMNS,\n animation,\n width = '100%',\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n const resolvedCount = count ?? DEFAULT_COUNT[variant];\n const resolvedAnimation = animation ?? DEFAULT_ANIMATION[variant];\n const resolvedWidth = typeof width === 'number' ? `${width}px` : width;\n\n let content: React.ReactNode;\n switch (variant) {\n case 'card':\n content = renderCard(resolvedAnimation);\n break;\n case 'list':\n content = renderList(resolvedCount, resolvedAnimation);\n break;\n case 'table':\n content = renderTable(resolvedCount, columns, resolvedAnimation);\n break;\n case 'grid':\n content = renderGrid(resolvedCount, columns, resolvedAnimation);\n break;\n case 'chat':\n content = renderChat(resolvedCount, resolvedAnimation);\n break;\n }\n\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n aria-busy=\"true\"\n className={cx(className)}\n style={{ width: resolvedWidth, ...style }}\n data-testid={testId}\n data-variant={variant}\n {...rest}\n >\n {content}\n </div>\n );\n }\n);\n\nSkeletonLayout.displayName = 'SkeletonLayout';\n"],"names":[],"mappings":";;;;;;;;AA8BA;AACE;AACA;AACA;AACA;AACA;;AAGF;AACE;AACA;AACA;AACA;AACA;;AAGF;AAEA;;AAYA;AAEA;AAIE;AAaF;AAEA;;AAME;AAMM;AACA;;AAYR;AAEA;AAKE;AAUF;AAEA;AAEA;;AAOQ;;AAEA;;AAqBR;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;AACI;;;AAeH;AAEA;;AAEE;AACE;;AAEF;AACE;;AAEF;;;AAGA;;;AAGA;AACE;;;AAIJ;AAcF;AAGF;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
-
import React from 'react';
|
|
4
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
4
|
+
import React from 'react';
|
|
5
5
|
import { vars } from '../../../theme/contract.css.js';
|
|
6
6
|
import { cx } from '../../../utils/cx.js';
|
|
7
7
|
import { spinnerSizeVar, spinnerColorVar, spinnerRingStyle, spinnerPulseStyle, spinnerDotsSizerStyle, spinnerDotRecipe, spinnerLabelStyle, visuallyHiddenStyle, spinnerRootStyle } from './Spinner.css.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Spinner.js","sources":["
|
|
1
|
+
{"version":3,"file":"Spinner.js","sources":["src/components/feedback/Spinner/Spinner.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { vars } from '@/theme/contract.css';\nimport { cx } from '@/utils/cx';\n\nimport {\n spinnerColorVar,\n spinnerDotRecipe,\n spinnerDotsSizerStyle,\n spinnerLabelStyle,\n spinnerPulseStyle,\n spinnerRingStyle,\n spinnerRootStyle,\n spinnerSizeVar,\n visuallyHiddenStyle,\n} from './Spinner.css';\n\nimport type { SpinnerColor, SpinnerProps, SpinnerSize } from './Spinner.types';\n\nconst SIZE_MAP: Record<SpinnerSize, string> = {\n xs: '12px',\n sm: '14px',\n md: '16px',\n lg: '20px',\n};\n\nconst NAMED_COLOR_MAP: Record<string, string> = {\n primary: vars.colors.text.primary,\n secondary: vars.colors.text.secondary,\n muted: vars.colors.text.muted,\n accent: vars.colors.accent.primary,\n};\n\nfunction resolveColor(color: SpinnerColor): string {\n return NAMED_COLOR_MAP[color] ?? color;\n}\n\n/**\n * Loading / activity indicator.\n *\n * Announces itself via `role=\"status\"` and `aria-label`; honors\n * `prefers-reduced-motion` by halting animation and dimming the indicator.\n *\n * @example\n * ```tsx\n * <Spinner />\n * <Spinner variant=\"dots\" size=\"lg\" />\n * <Spinner showLabel label=\"Fetching results...\" />\n * ```\n */\nexport const Spinner = /*#__PURE__*/ React.memo<SpinnerProps>(\n ({\n size = 'md',\n variant = 'ring',\n color = 'accent',\n label = 'Loading...',\n showLabel = false,\n className,\n style,\n testId,\n ref,\n ...rest\n }) => {\n const resolvedColor = resolveColor(color);\n const resolvedSize = SIZE_MAP[size];\n\n const inlineVars = assignInlineVars({\n [spinnerColorVar]: resolvedColor,\n [spinnerSizeVar]: resolvedSize,\n });\n\n const indicator =\n variant === 'ring' ? (\n <span className={spinnerRingStyle} aria-hidden />\n ) : variant === 'pulse' ? (\n <span className={spinnerPulseStyle} aria-hidden />\n ) : (\n <span className={spinnerDotsSizerStyle} aria-hidden>\n <span className={spinnerDotRecipe({ delay: '0' })} />\n <span className={spinnerDotRecipe({ delay: '1' })} />\n <span className={spinnerDotRecipe({ delay: '2' })} />\n </span>\n );\n\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n className={cx(spinnerRootStyle, className)}\n style={{ ...inlineVars, ...style }}\n data-testid={testId}\n {...rest}\n >\n {indicator}\n {showLabel ? (\n <span className={spinnerLabelStyle}>{label}</span>\n ) : (\n <span className={visuallyHiddenStyle}>{label}</span>\n )}\n </span>\n );\n }\n);\n\nSpinner.displayName = 'Spinner';\n"],"names":[],"mappings":";;;;;;;;AAsBA;AACE;AACA;AACA;AACA;;AAGF;AACE;AACA;AACA;AACA;;AAGF;AACE;AACF;AAEA;;;;;;;;;;;;AAYG;;AAcC;AACA;;;;AAKC;AAED;AAaA;AAmBF;AAGF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stat.js","sources":["
|
|
1
|
+
{"version":3,"file":"Stat.js","sources":["src/components/feedback/Stat/Stat.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { vars } from '@/theme/contract.css';\nimport { cx } from '@/utils/cx';\n\nimport {\n statContentStyle,\n statDeltaColorVar,\n statDeltaIconStyle,\n statDeltaStyle,\n statHelperStyle,\n statIconStyle,\n statLabelStyle,\n statRoot,\n statValueRecipe,\n} from './Stat.css';\n\nimport type {\n StatDelta,\n StatDeltaDirection,\n StatDeltaSemantics,\n StatProps,\n} from './Stat.types';\n\nconst ARROW_PATHS: Record<StatDeltaDirection, string> = {\n up: 'M6 2 L10 7 L7 7 L7 10 L5 10 L5 7 L2 7 Z',\n down: 'M6 10 L2 5 L5 5 L5 2 L7 2 L7 5 L10 5 Z',\n neutral: 'M2 6 L10 6 L10 7 L2 7 Z',\n};\n\nfunction deltaColor(\n direction: StatDeltaDirection,\n semantics: StatDeltaSemantics\n): string {\n if (semantics === 'neutral' || direction === 'neutral') {\n return vars.colors.text.muted;\n }\n const isUpGood = semantics === 'positive';\n const upColor = isUpGood\n ? vars.colors.accent.success\n : vars.colors.accent.error;\n const downColor = isUpGood\n ? vars.colors.accent.error\n : vars.colors.accent.success;\n return direction === 'up' ? upColor : downColor;\n}\n\nfunction DeltaIcon({ direction }: { direction: StatDeltaDirection }) {\n return (\n <svg\n className={statDeltaIconStyle}\n viewBox=\"0 0 12 12\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d={ARROW_PATHS[direction]} fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction DeltaDisplay({ delta }: { delta: StatDelta }) {\n const semantics = delta.semantics ?? 'positive';\n const color = deltaColor(delta.direction, semantics);\n return (\n <span\n className={statDeltaStyle}\n style={assignInlineVars({ [statDeltaColorVar]: color })}\n >\n <DeltaIcon direction={delta.direction} />\n {delta.value}\n </span>\n );\n}\n\n/**\n * KPI / metric display: label + value + optional trend delta.\n *\n * Use `delta.semantics` to indicate whether \"up\" is good. Errors and\n * latency, for example, want `semantics: \"negative\"` so an upward\n * direction shows red.\n *\n * @example\n * ```tsx\n * <Stat\n * label=\"MRR\"\n * value=\"$12,400\"\n * delta={{ value: '+8.2%', direction: 'up' }}\n * helper=\"vs. last month\"\n * />\n * ```\n */\nexport const Stat: React.FC<StatProps> = ({\n label,\n value,\n delta,\n helper,\n icon,\n size = 'md',\n className,\n style,\n testId,\n ref,\n ...rest\n}) => (\n <div\n ref={ref}\n className={cx(statRoot({ size }), className)}\n style={style}\n data-testid={testId}\n {...rest}\n >\n {icon && <div className={statIconStyle}>{icon}</div>}\n <div className={statContentStyle}>\n <p className={statLabelStyle}>{label}</p>\n <p className={statValueRecipe({ size })}>{value}</p>\n {delta && <DeltaDisplay delta={delta} />}\n {helper && <p className={statHelperStyle}>{helper}</p>}\n </div>\n </div>\n);\n\nStat.displayName = 'Stat';\n"],"names":[],"mappings":";;;;;;;AA2BA;AACE;AACA;AACA;;AAGF;;AAKI;;AAEF;;AAEE;;;AAGA;;;AAGJ;AAEA;AACE;AAUF;AAEA;AACE;;AAEA;AASF;AAEA;;;;;;;;;;;;;;;;AAgBG;AACI;AA8BP;;"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
4
4
|
import { cx } from '../../../utils/cx.js';
|
|
5
|
-
import { ToastItem } from './ToastItem.js';
|
|
6
5
|
import { zIndexVar, gapVar, containerReverse, containerNormal, container } from './ToastContainer.css.js';
|
|
6
|
+
import { ToastItem } from './ToastItem.js';
|
|
7
7
|
|
|
8
8
|
// --- Position style map ---
|
|
9
9
|
const POSITION_STYLES = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToastContainer.js","sources":["
|
|
1
|
+
{"version":3,"file":"ToastContainer.js","sources":["src/components/feedback/Toast/ToastContainer.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport {\n gapVar,\n zIndexVar,\n container,\n containerReverse,\n containerNormal,\n} from './ToastContainer.css';\nimport { ToastItem } from './ToastItem';\n\nimport type { ToastInternalData, ToastPosition } from './Toast.types';\n\n// --- Position style map ---\n\nconst POSITION_STYLES: Record<ToastPosition, React.CSSProperties> = {\n 'top-right': { top: 16, right: 16 },\n 'top-left': { top: 16, left: 16 },\n 'top-center': { top: 16, left: '50%', transform: 'translateX(-50%)' },\n 'bottom-right': { bottom: 16, right: 16 },\n 'bottom-left': { bottom: 16, left: 16 },\n 'bottom-center': { bottom: 16, left: '50%', transform: 'translateX(-50%)' },\n};\n\n// --- Props ---\n\ninterface ToastContainerProps {\n toasts: ToastInternalData[];\n position: ToastPosition;\n gap: number;\n zIndex: number;\n onDismiss: (id: string) => void;\n}\n\n/**\n * ToastContainer positions toast items at the specified screen edge.\n * Bottom positions use column-reverse so the newest toast appears at the bottom.\n */\nexport const ToastContainer: React.FC<ToastContainerProps> = ({\n toasts,\n position,\n gap,\n zIndex,\n onDismiss,\n}) => {\n const isBottom = position.startsWith('bottom');\n const positionStyle = POSITION_STYLES[position];\n\n const inlineVars = assignInlineVars({\n [gapVar]: `${gap}px`,\n [zIndexVar]: String(zIndex),\n });\n\n return (\n <div\n className={cx(container, isBottom ? containerReverse : containerNormal)}\n style={{\n ...positionStyle,\n ...inlineVars,\n }}\n aria-label=\"Notifications\"\n role=\"region\"\n >\n {toasts.map(toast => (\n <ToastItem key={toast.id} toast={toast} onDismiss={onDismiss} />\n ))}\n </div>\n );\n};\n\nToastContainer.displayName = 'ToastContainer';\n"],"names":[],"mappings":";;;;;;;AAkBA;AAEA;;;AAGE;;;AAGA;;AAaF;;;AAGG;AACI;;AAQL;;AAGE;AACA;AACD;;AAMK;AACA;AACD;AASP;AAEA;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
-
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
4
3
|
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
4
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
5
5
|
import { CloseIcon } from '../../Icons/CloseIcon.js';
|
|
6
6
|
import { ErrorIcon } from '../../Icons/ErrorIcon.js';
|
|
7
7
|
import { InfoIcon } from '../../Icons/InfoIcon.js';
|
|
@@ -35,7 +35,9 @@ const ToastItem = ({ toast: toastData, onDismiss, }) => {
|
|
|
35
35
|
const [paused, setPaused] = useState(false);
|
|
36
36
|
const timerRef = useRef(null);
|
|
37
37
|
const remainingRef = useRef(duration);
|
|
38
|
-
|
|
38
|
+
// Seeded on mount by startTimer(); 0 is a safe placeholder and avoids calling
|
|
39
|
+
// the impure Date.now() during render.
|
|
40
|
+
const startRef = useRef(0);
|
|
39
41
|
const isAlert = severity === 'warning' || severity === 'error';
|
|
40
42
|
const role = isAlert ? 'alert' : 'status';
|
|
41
43
|
const ariaLive = isAlert ? 'assertive' : 'polite';
|
|
@@ -71,7 +73,9 @@ const ToastItem = ({ toast: toastData, onDismiss, }) => {
|
|
|
71
73
|
startTimer();
|
|
72
74
|
return clearTimer;
|
|
73
75
|
}, [startTimer, clearTimer]);
|
|
74
|
-
return (jsxs("div", { className: toast({ severity }), role: role, "aria-live": ariaLive, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, "data-testid": `toast-${id}`, children: [jsxs("div", { className: content, children: [jsx("div", { className: iconWrapper, children: icon ?? jsx(SeverityIcon, { severity: severity }) }), jsxs("div", { className: textContent, children: [title && jsx("div", { className: titleStyle, children: title }), jsx("div", { className: message, children: msg }), action && (jsx("button", { className: actionButton({ severity }), onClick: action.onClick, type: "button", children: action.label }))] }), closable && (jsx("button", { className: closeButton, onClick: () =>
|
|
76
|
+
return (jsxs("div", { className: toast({ severity }), role: role, "aria-live": ariaLive, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, "data-testid": `toast-${id}`, children: [jsxs("div", { className: content, children: [jsx("div", { className: iconWrapper, children: icon ?? jsx(SeverityIcon, { severity: severity }) }), jsxs("div", { className: textContent, children: [title && jsx("div", { className: titleStyle, children: title }), jsx("div", { className: message, children: msg }), action && (jsx("button", { className: actionButton({ severity }), onClick: action.onClick, type: "button", children: action.label }))] }), closable && (jsx("button", { className: closeButton, onClick: () => {
|
|
77
|
+
onDismiss(id);
|
|
78
|
+
}, "aria-label": "Dismiss notification", type: "button", children: jsx(CloseIcon, { size: "sm", decorative: true }) }))] }), showProgress && duration > 0 && (jsx("div", { className: progressBar({ severity, paused }), style: assignInlineVars({
|
|
75
79
|
[progressDurationVar]: `${duration}ms`,
|
|
76
80
|
}), "data-testid": `toast-progress-${id}` }))] }));
|
|
77
81
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToastItem.js","sources":["
|
|
1
|
+
{"version":3,"file":"ToastItem.js","sources":["src/components/feedback/Toast/ToastItem.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React, { useEffect, useRef, useState, useCallback } from 'react';\n\nimport { CloseIcon } from '@/components/Icons/CloseIcon';\nimport { ErrorIcon } from '@/components/Icons/ErrorIcon';\nimport { InfoIcon } from '@/components/Icons/InfoIcon';\nimport { SuccessIcon } from '@/components/Icons/SuccessIcon';\nimport { WarningIcon } from '@/components/Icons/WarningIcon';\n\nimport {\n progressDurationVar,\n toast,\n content,\n iconWrapper,\n textContent,\n titleStyle,\n message,\n closeButton,\n actionButton,\n progressBar,\n} from './ToastItem.css';\n\nimport type { ToastInternalData, ToastSeverity } from './Toast.types';\n\n// --- Severity icons ---\n\nconst SeverityIcon: React.FC<{ severity: ToastSeverity }> = ({ severity }) => {\n switch (severity) {\n case 'info':\n return <InfoIcon size=\"md\" color=\"currentColor\" decorative />;\n case 'success':\n return <SuccessIcon size=\"md\" color=\"currentColor\" decorative />;\n case 'warning':\n return <WarningIcon size=\"md\" color=\"currentColor\" decorative />;\n case 'error':\n return <ErrorIcon size=\"md\" color=\"currentColor\" decorative />;\n }\n};\n\n// --- ToastItem component ---\n\ninterface ToastItemProps {\n toast: ToastInternalData;\n onDismiss: (id: string) => void;\n}\n\n/**\n * Individual toast notification with severity indicator, auto-dismiss,\n * optional progress bar, and action button support.\n *\n * - info/success: role=\"status\", aria-live=\"polite\"\n * - warning/error: role=\"alert\", aria-live=\"assertive\"\n * - Auto-dismiss pauses on hover\n */\nexport const ToastItem: React.FC<ToastItemProps> = ({\n toast: toastData,\n onDismiss,\n}) => {\n const {\n id,\n title,\n message: msg,\n severity,\n duration,\n closable,\n showProgress,\n icon,\n action,\n } = toastData;\n\n const [paused, setPaused] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const remainingRef = useRef(duration);\n // Seeded on mount by startTimer(); 0 is a safe placeholder and avoids calling\n // the impure Date.now() during render.\n const startRef = useRef(0);\n\n const isAlert = severity === 'warning' || severity === 'error';\n const role = isAlert ? 'alert' : 'status';\n const ariaLive = isAlert ? 'assertive' : 'polite';\n\n const clearTimer = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const startTimer = useCallback(() => {\n if (duration <= 0) return;\n clearTimer();\n startRef.current = Date.now();\n timerRef.current = setTimeout(() => {\n onDismiss(id);\n }, remainingRef.current);\n }, [duration, clearTimer, onDismiss, id]);\n\n const handleMouseEnter = useCallback(() => {\n if (duration <= 0) return;\n setPaused(true);\n clearTimer();\n remainingRef.current -= Date.now() - startRef.current;\n }, [duration, clearTimer]);\n\n const handleMouseLeave = useCallback(() => {\n if (duration <= 0) return;\n setPaused(false);\n startTimer();\n }, [duration, startTimer]);\n\n useEffect(() => {\n startTimer();\n return clearTimer;\n }, [startTimer, clearTimer]);\n\n return (\n <div\n className={toast({ severity })}\n role={role}\n aria-live={ariaLive}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-testid={`toast-${id}`}\n >\n <div className={content}>\n <div className={iconWrapper}>\n {icon ?? <SeverityIcon severity={severity} />}\n </div>\n <div className={textContent}>\n {title && <div className={titleStyle}>{title}</div>}\n <div className={message}>{msg}</div>\n {action && (\n <button\n className={actionButton({ severity })}\n onClick={action.onClick}\n type=\"button\"\n >\n {action.label}\n </button>\n )}\n </div>\n {closable && (\n <button\n className={closeButton}\n onClick={() => {\n onDismiss(id);\n }}\n aria-label=\"Dismiss notification\"\n type=\"button\"\n >\n <CloseIcon size=\"sm\" decorative />\n </button>\n )}\n </div>\n {showProgress && duration > 0 && (\n <div\n className={progressBar({ severity, paused })}\n style={assignInlineVars({\n [progressDurationVar]: `${duration}ms`,\n })}\n data-testid={`toast-progress-${id}`}\n />\n )}\n </div>\n );\n};\n\nToastItem.displayName = 'ToastItem';\n"],"names":[],"mappings":";;;;;;;;;;;AA0BA;AAEA;;AAEI;AACE;AACF;AACE;AACF;AACE;AACF;AACE;;AAEN;AASA;;;;;;;AAOG;AACI;;;AAiBL;AACA;;;AAGA;;;;AAMA;AACE;AACE;AACA;;;AAIJ;;;AAEE;AACA;AACA;;AAEA;;AAGF;;;;AAGE;;AAEF;AAEA;;;;AAGE;AACF;;AAGE;AACA;AACF;;;AAiCU;AAYA;;AAOZ;AAEA;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToastProvider.js","sources":["
|
|
1
|
+
{"version":3,"file":"ToastProvider.js","sources":["src/components/feedback/Toast/ToastProvider.tsx"],"sourcesContent":["'use client';\n\nimport React, { createContext, useReducer, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { ToastContainer } from './ToastContainer';\n\nimport type { ToastProviderProps, ToastInternalData } from './Toast.types';\n\n// --- Toast Actions ---\n\ntype ToastAction =\n | { type: 'ADD_TOAST'; toast: ToastInternalData }\n | { type: 'DISMISS_TOAST'; id: string }\n | { type: 'DISMISS_ALL' };\n\n// --- Toast Context ---\n\nexport interface ToastContextValue {\n dispatch: React.Dispatch<ToastAction>;\n defaultDuration: number;\n}\n\nexport const ToastContext =\n /*#__PURE__*/ createContext<ToastContextValue | null>(null);\n\n// --- Reducer ---\n\nfunction toastReducer(\n state: ToastInternalData[],\n action: ToastAction\n): ToastInternalData[] {\n switch (action.type) {\n case 'ADD_TOAST':\n return [...state, action.toast];\n case 'DISMISS_TOAST':\n return state.filter(t => t.id !== action.id);\n case 'DISMISS_ALL':\n return [];\n default:\n return state;\n }\n}\n\n/**\n * ToastProvider manages toast notification state and renders them via portal.\n *\n * Wrap your application (or a section of it) with this provider, then use\n * the `useToast()` hook to trigger notifications from any child component.\n *\n * @example\n * ```tsx\n * <ToastProvider position=\"bottom-right\" maxVisible={5}>\n * <App />\n * </ToastProvider>\n * ```\n */\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\n children,\n position = 'bottom-right',\n maxVisible = 5,\n defaultDuration = 5000,\n gap = 8,\n zIndex = 1200,\n}) => {\n const [toasts, dispatch] = useReducer(toastReducer, []);\n\n const contextValue = useMemo<ToastContextValue>(\n () => ({ dispatch, defaultDuration }),\n [dispatch, defaultDuration]\n );\n\n const visibleToasts = toasts.slice(-maxVisible);\n\n const handleDismiss = (id: string) => {\n dispatch({ type: 'DISMISS_TOAST', id });\n };\n\n return (\n <ToastContext.Provider value={contextValue}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(\n <ToastContainer\n toasts={visibleToasts}\n position={position}\n gap={gap}\n zIndex={zIndex}\n onDismiss={handleDismiss}\n />,\n document.body\n )}\n </ToastContext.Provider>\n );\n};\n\nToastProvider.displayName = 'ToastProvider';\n"],"names":[],"mappings":";;;;;;;AAwBE;AAEF;AAEA;AAIE;AACE;;AAEA;AACE;AACF;AACE;AACF;AACE;;AAEN;AAEA;;;;;;;;;;;;AAYG;AACI;AAQL;;;AASA;;AAEA;AAEA;AAIM;AAYR;AAEA;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToast.js","sources":["
|
|
1
|
+
{"version":3,"file":"useToast.js","sources":["src/components/feedback/Toast/useToast.ts"],"sourcesContent":["'use client';\n\nimport { useContext, useCallback, useRef } from 'react';\n\nimport { ToastContext } from './ToastProvider';\n\nimport type {\n ToastData,\n ToastInternalData,\n UseToastReturn,\n} from './Toast.types';\n\n/**\n * Hook to trigger toast notifications from any component\n * inside a `<ToastProvider>`.\n *\n * @throws Error if used outside of a `<ToastProvider>`\n *\n * @example\n * ```tsx\n * const { toast, success, error, dismiss } = useToast();\n *\n * success('File saved successfully');\n * error('Failed to export', { title: 'Export Error' });\n *\n * const id = toast({ message: 'Custom toast', severity: 'info' });\n * dismiss(id);\n * ```\n */\nexport function useToast(): UseToastReturn {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n\n const { dispatch, defaultDuration } = context;\n const counterRef = useRef(0);\n\n const generateId = useCallback(() => {\n counterRef.current += 1;\n return `toast-${Date.now()}-${counterRef.current}`;\n }, []);\n\n const toast = useCallback(\n (data: ToastData): string => {\n const id = data.id ?? generateId();\n const internalData: ToastInternalData = {\n ...data,\n id,\n severity: data.severity ?? 'info',\n duration: data.duration ?? defaultDuration,\n closable: data.closable ?? true,\n showProgress: data.showProgress ?? false,\n createdAt: Date.now(),\n };\n dispatch({ type: 'ADD_TOAST', toast: internalData });\n return id;\n },\n [dispatch, defaultDuration, generateId]\n );\n\n const info = useCallback(\n (message: string, options?: Partial<ToastData>): string =>\n toast({ message, severity: 'info', ...options }),\n [toast]\n );\n\n const success = useCallback(\n (message: string, options?: Partial<ToastData>): string =>\n toast({ message, severity: 'success', ...options }),\n [toast]\n );\n\n const warning = useCallback(\n (message: string, options?: Partial<ToastData>): string =>\n toast({ message, severity: 'warning', ...options }),\n [toast]\n );\n\n const error = useCallback(\n (message: string, options?: Partial<ToastData>): string =>\n toast({ message, severity: 'error', ...options }),\n [toast]\n );\n\n const dismiss = useCallback(\n (id: string) => {\n dispatch({ type: 'DISMISS_TOAST', id });\n },\n [dispatch]\n );\n\n const dismissAll = useCallback(() => {\n dispatch({ type: 'DISMISS_ALL' });\n }, [dispatch]);\n\n return { toast, info, success, warning, error, dismiss, dismissAll };\n}\n"],"names":[],"mappings":";;;;AAYA;;;;;;;;;;;;;;;;AAgBG;;AAED;;AAEE;;AAGF;AACA;AAEA;AACE;;;AAIF;;AAGI;AACE;;AAEA;AACA;AACA;AACA;AACA;;;AAGF;;AAKJ;AAMA;AAMA;AAMA;AAMA;;AAGE;AAIF;AACE;AACF;AAEA;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormHelperText.js","sources":["
|
|
1
|
+
{"version":3,"file":"FormHelperText.js","sources":["src/components/form/FormHelperText.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { Prettify } from '@/types/utilities';\nimport { cx } from '@/utils/cx';\n\nimport { formHelperTextRecipe } from './FormHelperText.css';\n\nimport type { BaseComponent } from '@/types/common';\n\nexport interface FormHelperTextBaseProps extends BaseComponent {\n /**\n * Helper text content\n */\n children: React.ReactNode;\n\n /**\n * Whether to display in error state\n * @default false\n */\n error?: boolean;\n}\n\nexport type FormHelperTextProps = Prettify<FormHelperTextBaseProps>;\n\n/**\n * A standardized helper text component for use with form controls.\n *\n * Provides consistent styling for helper text and error messages\n * across different form components.\n *\n * @example\n * ```tsx\n * <Input label=\"Email\" />\n * <FormHelperText>We'll never share your email with anyone else.</FormHelperText>\n *\n * <Input label=\"Username\" error={!!usernameError} />\n * <FormHelperText error>{usernameError}</FormHelperText>\n * ```\n */\nexport const FormHelperText = /*#__PURE__*/ React.memo<FormHelperTextProps>(\n ({ children, error = false, className, style, ref, ...rest }) => {\n return (\n <div\n ref={ref}\n className={cx(formHelperTextRecipe({ error }), className)}\n style={style}\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nFormHelperText.displayName = 'FormHelperText';\n"],"names":[],"mappings":";;;;;;AA0BA;;;;;;;;;;;;;;AAcG;AACI;AAEH;AAUF;AAGF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormLabel.js","sources":["
|
|
1
|
+
{"version":3,"file":"FormLabel.js","sources":["src/components/form/FormLabel.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { Prettify } from '@/types/utilities';\nimport { cx } from '@/utils/cx';\n\nimport { formLabelRecipe, requiredIndicatorStyle } from './FormLabel.css';\n\nimport type { BaseComponent } from '@/types/common';\n\nexport interface FormLabelBaseProps extends BaseComponent<HTMLLabelElement> {\n /**\n * Label content\n */\n children: React.ReactNode;\n\n /**\n * HTML for attribute to associate label with form control\n */\n htmlFor?: string;\n\n /**\n * Whether the associated form control is disabled\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Whether the associated form control is required\n * @default false\n */\n required?: boolean;\n}\n\nexport type FormLabelProps = Prettify<FormLabelBaseProps>;\n\n/**\n * A standardized form label component for use with form controls.\n *\n * Provides consistent styling and behavior for labels across different\n * form components, with support for required indicators and disabled states.\n *\n * @example\n * ```tsx\n * <FormLabel htmlFor=\"name-input\" required>\n * Full Name\n * </FormLabel>\n * <Input id=\"name-input\" />\n * ```\n */\nexport const FormLabel = /*#__PURE__*/ React.memo<FormLabelProps>(\n ({\n children,\n htmlFor,\n disabled = false,\n required = false,\n className,\n style,\n ref,\n ...rest\n }) => {\n return (\n <label\n ref={ref}\n htmlFor={htmlFor}\n className={cx(formLabelRecipe({ disabled }), className)}\n style={style}\n {...rest}\n >\n {children}\n {required && <span className={requiredIndicatorStyle}> *</span>}\n </label>\n );\n }\n);\n\nFormLabel.displayName = 'FormLabel';\n"],"names":[],"mappings":";;;;;;AAqCA;;;;;;;;;;;;;AAaG;AACI;AAWH;AAYF;AAGF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputWrapper.js","sources":["
|
|
1
|
+
{"version":3,"file":"InputWrapper.js","sources":["src/components/form/InputWrapper.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { Prettify } from '@/types/utilities';\nimport { cx } from '@/utils/cx';\n\nimport { inputWrapperRecipe } from './InputWrapper.css';\n\nimport type { BaseComponent, Size } from '@/types/common';\n\nexport interface InputWrapperBaseProps extends BaseComponent {\n /**\n * Input wrapper content\n */\n children: React.ReactNode;\n\n /**\n * Input size using standard library sizing\n * - `sm`: 20px height, compact for toolbars\n * - `md`: 24px height, standard for forms\n * - `lg`: 32px height, prominent inputs\n * @default \"md\"\n */\n size?: Size;\n\n /**\n * Whether the input has an error state\n * @default false\n */\n error?: boolean;\n\n /**\n * Whether the input is disabled\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Whether the input is focused\n * @default false\n */\n focused?: boolean;\n}\n\nexport type InputWrapperProps = Prettify<InputWrapperBaseProps>;\n\n/**\n * A standardized wrapper component for form inputs.\n *\n * Provides consistent styling and behavior for input containers\n * across different form components, with support for different sizes,\n * states (error, disabled, focused), and consistent border styling.\n *\n * @example\n * ```tsx\n * <InputWrapper\n * size=\"md\"\n * error={!!inputError}\n * disabled={isDisabled}\n * focused={isFocused}\n * >\n * <input type=\"text\" />\n * </InputWrapper>\n * ```\n */\nexport const InputWrapper = /*#__PURE__*/ React.memo<InputWrapperProps>(\n ({\n children,\n size = 'md',\n error = false,\n disabled = false,\n focused = false,\n className,\n style,\n ref,\n ...rest\n }) => {\n return (\n <div\n ref={ref}\n className={cx(\n inputWrapperRecipe({ size, error, disabled, focused }),\n className\n )}\n style={style}\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nInputWrapper.displayName = 'InputWrapper';\n"],"names":[],"mappings":";;;;;;AA+CA;;;;;;;;;;;;;;;;;;AAkBG;AACI;AAYH;AAaF;AAGF;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
3
4
|
import { useId, useState, useCallback, createContext, useContext } from 'react';
|
|
4
5
|
import { cx } from '../../../utils/cx.js';
|
|
5
|
-
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
|
6
6
|
import { accordionGapVar, accordionRoot } from './Accordion.css.js';
|
|
7
7
|
|
|
8
8
|
// --- Contexts ---
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.js","sources":["
|
|
1
|
+
{"version":3,"file":"Accordion.js","sources":["src/components/layout/Accordion/Accordion.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React, {\n createContext,\n useCallback,\n useContext,\n useId,\n useState,\n} from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport { accordionRoot, accordionGapVar } from './Accordion.css';\n\nimport type {\n AccordionContextValue,\n AccordionItemContextValue,\n AccordionProps,\n} from './Accordion.types';\n\n// --- Contexts ---\n\nconst AccordionContext =\n /*#__PURE__*/ createContext<AccordionContextValue | null>(null);\nconst AccordionItemContext =\n /*#__PURE__*/ createContext<AccordionItemContextValue | null>(null);\n\nexport function useAccordionContext(): AccordionContextValue {\n const ctx = useContext(AccordionContext);\n if (!ctx) {\n throw new Error(\n 'Accordion compound components must be used within <Accordion>'\n );\n }\n return ctx;\n}\n\nexport function useAccordionItemContext(): AccordionItemContextValue {\n const ctx = useContext(AccordionItemContext);\n if (!ctx) {\n throw new Error(\n 'AccordionTrigger/AccordionContent must be used within <AccordionItem>'\n );\n }\n return ctx;\n}\n\nexport { AccordionContext, AccordionItemContext };\n\n// --- Helpers ---\n\nfunction normalizeValue(value: string | string[] | undefined): string[] {\n if (value === undefined) return [];\n if (Array.isArray(value)) return value;\n return [value];\n}\n\n// --- Component ---\n\n/**\n * Accordion component for collapsible sections in property inspectors\n * and settings panels.\n *\n * Compound component pattern: use with AccordionItem, AccordionTrigger,\n * and AccordionContent.\n *\n * @example\n * ```tsx\n * <Accordion defaultValue=\"transform\">\n * <AccordionItem value=\"transform\">\n * <AccordionTrigger>Transform</AccordionTrigger>\n * <AccordionContent>Position, rotation, scale fields...</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * ```\n */\nexport const Accordion: React.FC<AccordionProps> = ({\n value: valueProp,\n defaultValue,\n multiple = false,\n collapsible = false,\n variant = 'default',\n size = 'md',\n gap = 0,\n width = '100%',\n children,\n onChange,\n className,\n style,\n testId,\n ref,\n ...rest\n}) => {\n const autoId = useId();\n\n const [internalValue, setInternalValue] = useState<string[]>(\n normalizeValue(defaultValue)\n );\n const isControlled = valueProp !== undefined;\n const expandedItems = isControlled\n ? normalizeValue(valueProp)\n : internalValue;\n\n const toggleItem = useCallback(\n (itemValue: string) => {\n const isExpanded = expandedItems.includes(itemValue);\n\n let nextExpanded: string[];\n\n if (multiple) {\n nextExpanded = isExpanded\n ? expandedItems.filter(v => v !== itemValue)\n : [...expandedItems, itemValue];\n } else {\n if (isExpanded) {\n nextExpanded = collapsible ? [] : expandedItems;\n } else {\n nextExpanded = [itemValue];\n }\n }\n\n if (!isControlled) {\n setInternalValue(nextExpanded);\n }\n\n if (multiple) {\n onChange?.(nextExpanded);\n } else {\n onChange?.(nextExpanded[0] ?? '');\n }\n },\n [expandedItems, multiple, collapsible, isControlled, onChange]\n );\n\n const contextValue: AccordionContextValue = {\n expandedItems,\n toggleItem,\n variant,\n size,\n accordionId: autoId,\n };\n\n const mergedStyle: React.CSSProperties = {\n ...assignInlineVars({\n [accordionGapVar]: `${gap}px`,\n }),\n width: typeof width === 'number' ? `${width}px` : width,\n ...style,\n };\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cx(accordionRoot, className)}\n style={mergedStyle}\n data-testid={testId}\n {...rest}\n >\n {children}\n </div>\n </AccordionContext.Provider>\n );\n};\n\nAccordion.displayName = 'Accordion';\n"],"names":[],"mappings":";;;;;;;AAqBA;AAEA;AACE;AACF;AACE;;AAGA;;AAEE;;AAIF;AACF;;AAGE;;AAEE;;AAIF;AACF;AAIA;AAEA;;AAC2B;AACzB;AAA0B;;AAE5B;AAEA;AAEA;;;;;;;;;;;;;;;;AAgBG;AACI;AAiBL;AAEA;AAGA;;AAEE;;AAGF;;AAII;;AAGE;AACE;AACA;;;;;;;AAKA;;;;;;;AASF;;;;;AAIJ;AAIF;;;;;AAKE;;AAGF;AACE;AACE;;AAEF;AACA;;AAGF;AAaF;AAEA;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from 'react/jsx-runtime';
|
|
3
|
-
import { useAccordionContext, useAccordionItemContext } from './Accordion.js';
|
|
4
3
|
import { cx } from '../../../utils/cx.js';
|
|
4
|
+
import { useAccordionContext, useAccordionItemContext } from './Accordion.js';
|
|
5
5
|
import { contentInner, contentBody, contentWrapperExpanded, contentWrapperCollapsed, contentWrapper } from './Accordion.css.js';
|
|
6
6
|
|
|
7
7
|
// --- Component ---
|