entangle-ui 0.7.0 → 0.8.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 +180 -0
- package/dist/esm/assets/src/components/controls/ColorPicker/{ColorPicker.css.ts.vanilla-Do5nbdgO.css → ColorPicker.css.ts.vanilla-D7ccNVQx.css} +14 -0
- package/dist/esm/assets/src/components/controls/Select/{Select.css.ts.vanilla-D4C059Ua.css → Select.css.ts.vanilla-oZnFUorL.css} +11 -0
- package/dist/esm/assets/src/components/controls/Slider/{Slider.css.ts.vanilla-C5SJ_7A1.css → Slider.css.ts.vanilla-Cqm3fQ0S.css} +14 -0
- package/dist/esm/assets/src/components/controls/TreeView/{TreeNode.css.ts.vanilla-D3ylUhuW.css → TreeNode.css.ts.vanilla-B_f8pUb8.css} +5 -0
- package/dist/esm/assets/src/components/controls/VectorInput/{VectorInput.css.ts.vanilla-BJma3iQ4.css → VectorInput.css.ts.vanilla-BpoiuhDA.css} +9 -0
- package/dist/esm/assets/src/components/editor/ChatPanel/{ChatPanel.css.ts.vanilla-BI5569ZO.css → ChatPanel.css.ts.vanilla-CLn8idfz.css} +117 -133
- package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertySection.css.ts.vanilla-DJBtY_xk.css → PropertySection.css.ts.vanilla-DK12opZc.css} +5 -0
- package/dist/esm/assets/src/components/editor/TransformControl/TransformControl.css.ts.vanilla-H-iW-T0s.css +82 -0
- package/dist/esm/assets/src/components/feedback/Alert/Alert.css.ts.vanilla-CRAI-xHx.css +84 -0
- package/dist/esm/assets/src/components/feedback/Dialog/{Dialog.css.ts.vanilla-BrXTOHwS.css → Dialog.css.ts.vanilla-BxBFePLG.css} +8 -0
- package/dist/esm/assets/src/components/feedback/ProgressBar/ProgressBar.css.ts.vanilla-4WLVf1hx.css +152 -0
- package/dist/esm/assets/src/components/feedback/Skeleton/Skeleton.css.ts.vanilla-Dk2_SSsC.css +39 -0
- package/dist/esm/assets/src/components/feedback/Toast/{ToastItem.css.ts.vanilla-D6UuPKAj.css → ToastItem.css.ts.vanilla-DUeXqiaH.css} +9 -0
- package/dist/esm/assets/src/components/form/{InputWrapper.css.ts.vanilla-Bl7u62PI.css → InputWrapper.css.ts.vanilla-CLpKbEjq.css} +5 -0
- package/dist/esm/assets/src/components/layout/Accordion/{Accordion.css.ts.vanilla-Ck5Yew0e.css → Accordion.css.ts.vanilla-CJQum8px.css} +8 -0
- package/dist/esm/assets/src/components/navigation/Breadcrumbs/Breadcrumbs.css.ts.vanilla-DZ4jm_bw.css +128 -0
- package/dist/esm/assets/src/components/navigation/SegmentedControl/SegmentedControl.css.ts.vanilla-BHOnDD2B.css +197 -0
- package/dist/esm/assets/src/components/navigation/Tabs/{Tabs.css.ts.vanilla-D7RGpDPC.css → Tabs.css.ts.vanilla-CQucokdg.css} +14 -0
- package/dist/esm/assets/src/components/primitives/Avatar/Avatar.css.ts.vanilla-jG5hUudL.css +149 -0
- package/dist/esm/assets/src/components/primitives/Button/{Button.css.ts.vanilla-CT592JL7.css → Button.css.ts.vanilla-DXJcIb94.css} +9 -0
- package/dist/esm/assets/src/components/primitives/Checkbox/{Checkbox.css.ts.vanilla-dvrGPiPs.css → Checkbox.css.ts.vanilla-DNa-Gqto.css} +5 -0
- package/dist/esm/assets/src/components/primitives/Collapsible/{Collapsible.css.ts.vanilla-C1rYV-JT.css → Collapsible.css.ts.vanilla-Dz4Vy-ob.css} +8 -0
- package/dist/esm/assets/src/components/primitives/IconButton/{IconButton.css.ts.vanilla-C-xAQoR3.css → IconButton.css.ts.vanilla-CPkPZJRU.css} +9 -0
- package/dist/esm/assets/src/components/primitives/Kbd/Kbd.css.ts.vanilla-Co2-Rxgv.css +60 -0
- package/dist/esm/assets/src/components/primitives/Link/Link.css.ts.vanilla-q-bqHUOF.css +82 -0
- package/dist/esm/assets/src/components/primitives/Popover/{Popover.css.ts.vanilla-DW6aAr57.css → Popover.css.ts.vanilla-KCfDIs4G.css} +5 -0
- package/dist/esm/assets/src/components/primitives/Radio/Radio.css.ts.vanilla-CPjdD-ZM.css +127 -0
- package/dist/esm/assets/src/components/primitives/Switch/{Switch.css.ts.vanilla-CxqwUToB.css → Switch.css.ts.vanilla-CDSt-M5W.css} +5 -0
- package/dist/esm/assets/src/components/primitives/TextArea/{TextArea.css.ts.vanilla-DTOMjGkp.css → TextArea.css.ts.vanilla-M9l1t4HR.css} +5 -0
- package/dist/esm/assets/src/components/primitives/VisuallyHidden/VisuallyHidden.css.ts.vanilla-DBulVh4Q.css +36 -0
- package/dist/esm/assets/src/theme/lightTheme.css.ts.vanilla-OaRI_wIc.css +99 -0
- package/dist/esm/assets/src/utils/{animations.css.ts.vanilla-DOVlpljP.css → animations.css.ts.vanilla-CRLFsBSV.css} +22 -8
- package/dist/esm/components/Icons/AddIcon.js +30 -0
- package/dist/esm/components/Icons/AddIcon.js.map +1 -0
- package/dist/esm/components/Icons/AiChatIcon.js +31 -0
- package/dist/esm/components/Icons/AiChatIcon.js.map +1 -0
- package/dist/esm/components/Icons/AiSparklesIcon.js +31 -0
- package/dist/esm/components/Icons/AiSparklesIcon.js.map +1 -0
- package/dist/esm/components/Icons/ArrowDownIcon.js +30 -0
- package/dist/esm/components/Icons/ArrowDownIcon.js.map +1 -0
- package/dist/esm/components/Icons/ArrowLeftIcon.js +30 -0
- package/dist/esm/components/Icons/ArrowLeftIcon.js.map +1 -0
- package/dist/esm/components/Icons/ArrowRightIcon.js +30 -0
- package/dist/esm/components/Icons/ArrowRightIcon.js.map +1 -0
- package/dist/esm/components/Icons/ArrowUpIcon.js +30 -0
- package/dist/esm/components/Icons/ArrowUpIcon.js.map +1 -0
- package/dist/esm/components/Icons/BookmarkIcon.js +30 -0
- package/dist/esm/components/Icons/BookmarkIcon.js.map +1 -0
- package/dist/esm/components/Icons/CalendarIcon.js +30 -0
- package/dist/esm/components/Icons/CalendarIcon.js.map +1 -0
- package/dist/esm/components/Icons/ClockIcon.js +30 -0
- package/dist/esm/components/Icons/ClockIcon.js.map +1 -0
- package/dist/esm/components/Icons/CodeIcon.js +30 -0
- package/dist/esm/components/Icons/CodeIcon.js.map +1 -0
- package/dist/esm/components/Icons/CopyIcon.js +30 -0
- package/dist/esm/components/Icons/CopyIcon.js.map +1 -0
- package/dist/esm/components/Icons/CutIcon.js +30 -0
- package/dist/esm/components/Icons/CutIcon.js.map +1 -0
- package/dist/esm/components/Icons/DownloadIcon.js +30 -0
- package/dist/esm/components/Icons/DownloadIcon.js.map +1 -0
- package/dist/esm/components/Icons/EditIcon.js +30 -0
- package/dist/esm/components/Icons/EditIcon.js.map +1 -0
- package/dist/esm/components/Icons/ErrorIcon.js +30 -0
- package/dist/esm/components/Icons/ErrorIcon.js.map +1 -0
- package/dist/esm/components/Icons/EyeIcon.js +30 -0
- package/dist/esm/components/Icons/EyeIcon.js.map +1 -0
- package/dist/esm/components/Icons/FilterIcon.js +30 -0
- package/dist/esm/components/Icons/FilterIcon.js.map +1 -0
- package/dist/esm/components/Icons/FolderIcon.js +30 -0
- package/dist/esm/components/Icons/FolderIcon.js.map +1 -0
- package/dist/esm/components/Icons/FullscreenIcon.js +30 -0
- package/dist/esm/components/Icons/FullscreenIcon.js.map +1 -0
- package/dist/esm/components/Icons/GridIcon.js +30 -0
- package/dist/esm/components/Icons/GridIcon.js.map +1 -0
- package/dist/esm/components/Icons/HeartIcon.js +30 -0
- package/dist/esm/components/Icons/HeartIcon.js.map +1 -0
- package/dist/esm/components/Icons/HelpIcon.js +30 -0
- package/dist/esm/components/Icons/HelpIcon.js.map +1 -0
- package/dist/esm/components/Icons/HomeIcon.js +30 -0
- package/dist/esm/components/Icons/HomeIcon.js.map +1 -0
- package/dist/esm/components/Icons/InfoIcon.js +30 -0
- package/dist/esm/components/Icons/InfoIcon.js.map +1 -0
- package/dist/esm/components/Icons/LinkIcon.js +30 -0
- package/dist/esm/components/Icons/LinkIcon.js.map +1 -0
- package/dist/esm/components/Icons/ListIcon.js +30 -0
- package/dist/esm/components/Icons/ListIcon.js.map +1 -0
- package/dist/esm/components/Icons/LockIcon.js +30 -0
- package/dist/esm/components/Icons/LockIcon.js.map +1 -0
- package/dist/esm/components/Icons/MaximizeIcon.js +30 -0
- package/dist/esm/components/Icons/MaximizeIcon.js.map +1 -0
- package/dist/esm/components/Icons/MenuIcon.js +30 -0
- package/dist/esm/components/Icons/MenuIcon.js.map +1 -0
- package/dist/esm/components/Icons/MinimizeIcon.js +30 -0
- package/dist/esm/components/Icons/MinimizeIcon.js.map +1 -0
- package/dist/esm/components/Icons/PasteIcon.js +30 -0
- package/dist/esm/components/Icons/PasteIcon.js.map +1 -0
- package/dist/esm/components/Icons/PlayIcon.js +30 -0
- package/dist/esm/components/Icons/PlayIcon.js.map +1 -0
- package/dist/esm/components/Icons/RedoIcon.js +30 -0
- package/dist/esm/components/Icons/RedoIcon.js.map +1 -0
- package/dist/esm/components/Icons/RefreshIcon.js +30 -0
- package/dist/esm/components/Icons/RefreshIcon.js.map +1 -0
- package/dist/esm/components/Icons/RobotIcon.js +30 -0
- package/dist/esm/components/Icons/RobotIcon.js.map +1 -0
- package/dist/esm/components/Icons/SaveIcon.js +30 -0
- package/dist/esm/components/Icons/SaveIcon.js.map +1 -0
- package/dist/esm/components/Icons/SearchIcon.js +30 -0
- package/dist/esm/components/Icons/SearchIcon.js.map +1 -0
- package/dist/esm/components/Icons/SettingsIcon.js +30 -0
- package/dist/esm/components/Icons/SettingsIcon.js.map +1 -0
- package/dist/esm/components/Icons/SortIcon.js +30 -0
- package/dist/esm/components/Icons/SortIcon.js.map +1 -0
- package/dist/esm/components/Icons/StarIcon.js +30 -0
- package/dist/esm/components/Icons/StarIcon.js.map +1 -0
- package/dist/esm/components/Icons/SuccessIcon.js +30 -0
- package/dist/esm/components/Icons/SuccessIcon.js.map +1 -0
- package/dist/esm/components/Icons/TagIcon.js +30 -0
- package/dist/esm/components/Icons/TagIcon.js.map +1 -0
- package/dist/esm/components/Icons/TrashIcon.js +30 -0
- package/dist/esm/components/Icons/TrashIcon.js.map +1 -0
- package/dist/esm/components/Icons/UndoIcon.js +30 -0
- package/dist/esm/components/Icons/UndoIcon.js.map +1 -0
- package/dist/esm/components/Icons/UnlockIcon.js +30 -0
- package/dist/esm/components/Icons/UnlockIcon.js.map +1 -0
- package/dist/esm/components/Icons/UploadIcon.js +30 -0
- package/dist/esm/components/Icons/UploadIcon.js.map +1 -0
- package/dist/esm/components/Icons/UserIcon.js +30 -0
- package/dist/esm/components/Icons/UserIcon.js.map +1 -0
- package/dist/esm/components/Icons/WarningIcon.js +30 -0
- package/dist/esm/components/Icons/WarningIcon.js.map +1 -0
- package/dist/esm/components/Icons/ZoomInIcon.js +30 -0
- package/dist/esm/components/Icons/ZoomInIcon.js.map +1 -0
- package/dist/esm/components/Icons/ZoomOutIcon.js +30 -0
- package/dist/esm/components/Icons/ZoomOutIcon.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/ColorPicker.css.js +1 -1
- package/dist/esm/components/controls/NumberInput/useNumberInput.js +2 -1
- package/dist/esm/components/controls/NumberInput/useNumberInput.js.map +1 -1
- package/dist/esm/components/controls/Select/Select.css.js +1 -1
- package/dist/esm/components/controls/Slider/Slider.css.js +1 -1
- package/dist/esm/components/controls/TreeView/TreeNode.css.js +1 -1
- package/dist/esm/components/controls/VectorInput/VectorInput.css.js +1 -1
- package/dist/esm/components/controls/VectorInput/VectorInput.js +1 -0
- package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMessage.js +4 -12
- package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMessageList.js +4 -10
- package/dist/esm/components/editor/ChatPanel/ChatMessageList.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js +72 -74
- package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/useChatScroll.js +22 -28
- package/dist/esm/components/editor/ChatPanel/useChatScroll.js.map +1 -1
- package/dist/esm/components/editor/PropertyInspector/PropertySection.css.js +1 -1
- package/dist/esm/components/editor/TransformControl/TransformControl.css.js +11 -0
- package/dist/esm/components/editor/TransformControl/TransformControl.css.js.map +1 -0
- package/dist/esm/components/editor/TransformControl/TransformControl.js +158 -0
- package/dist/esm/components/editor/TransformControl/TransformControl.js.map +1 -0
- package/dist/esm/components/feedback/Alert/Alert.css.js +16 -0
- package/dist/esm/components/feedback/Alert/Alert.css.js.map +1 -0
- package/dist/esm/components/feedback/Alert/Alert.js +90 -0
- package/dist/esm/components/feedback/Alert/Alert.js.map +1 -0
- package/dist/esm/components/feedback/Alert/AlertActions.js +30 -0
- package/dist/esm/components/feedback/Alert/AlertActions.js.map +1 -0
- package/dist/esm/components/feedback/Alert/AlertDescription.js +28 -0
- package/dist/esm/components/feedback/Alert/AlertDescription.js.map +1 -0
- package/dist/esm/components/feedback/Alert/AlertTitle.js +28 -0
- package/dist/esm/components/feedback/Alert/AlertTitle.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/Dialog.css.js +1 -1
- package/dist/esm/components/feedback/Dialog/Dialog.js +4 -12
- package/dist/esm/components/feedback/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/feedback/Dialog/useDialogAnimation.js +10 -3
- package/dist/esm/components/feedback/Dialog/useDialogAnimation.js.map +1 -1
- package/dist/esm/components/feedback/ProgressBar/CircularProgress.js +113 -0
- package/dist/esm/components/feedback/ProgressBar/CircularProgress.js.map +1 -0
- package/dist/esm/components/feedback/ProgressBar/ProgressBar.css.js +22 -0
- package/dist/esm/components/feedback/ProgressBar/ProgressBar.css.js.map +1 -0
- package/dist/esm/components/feedback/ProgressBar/ProgressBar.js +80 -0
- package/dist/esm/components/feedback/ProgressBar/ProgressBar.js.map +1 -0
- package/dist/esm/components/feedback/Skeleton/Skeleton.css.js +13 -0
- package/dist/esm/components/feedback/Skeleton/Skeleton.css.js.map +1 -0
- package/dist/esm/components/feedback/Skeleton/Skeleton.js +78 -0
- package/dist/esm/components/feedback/Skeleton/Skeleton.js.map +1 -0
- package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js +58 -0
- package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js.map +1 -0
- package/dist/esm/components/feedback/Spinner/Spinner.css.js +1 -1
- package/dist/esm/components/feedback/Toast/ToastItem.css.js +1 -1
- package/dist/esm/components/form/InputWrapper.css.js +1 -1
- package/dist/esm/components/layout/Accordion/Accordion.css.js +1 -1
- package/dist/esm/components/layout/ScrollArea/ScrollArea.js +17 -20
- package/dist/esm/components/layout/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/esm/components/layout/SplitPane/SplitPane.js +2 -10
- package/dist/esm/components/layout/SplitPane/SplitPane.js.map +1 -1
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js +49 -0
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -0
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js +89 -0
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js.map +1 -0
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbSeparator.js +22 -0
- package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbSeparator.js.map +1 -0
- package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.css.js +16 -0
- package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.css.js.map +1 -0
- package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js +152 -0
- package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -0
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.css.js +15 -0
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.css.js.map +1 -0
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js +240 -0
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js.map +1 -0
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js +83 -0
- package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js.map +1 -0
- package/dist/esm/components/navigation/Tabs/Tab.js +0 -1
- package/dist/esm/components/navigation/Tabs/Tab.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/Tabs.css.js +1 -1
- package/dist/esm/components/primitives/Avatar/Avatar.css.js +16 -0
- package/dist/esm/components/primitives/Avatar/Avatar.css.js.map +1 -0
- package/dist/esm/components/primitives/Avatar/Avatar.js +138 -0
- package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -0
- package/dist/esm/components/primitives/Avatar/AvatarGroup.js +81 -0
- package/dist/esm/components/primitives/Avatar/AvatarGroup.js.map +1 -0
- package/dist/esm/components/primitives/Button/Button.css.js +1 -1
- package/dist/esm/components/primitives/Checkbox/Checkbox.css.js +1 -1
- package/dist/esm/components/primitives/Checkbox/Checkbox.js +9 -1
- package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
- package/dist/esm/components/primitives/Collapsible/Collapsible.css.js +1 -1
- package/dist/esm/components/primitives/IconButton/IconButton.css.js +1 -1
- package/dist/esm/components/primitives/Kbd/Kbd.css.js +9 -0
- package/dist/esm/components/primitives/Kbd/Kbd.css.js.map +1 -0
- package/dist/esm/components/primitives/Kbd/Kbd.js +46 -0
- package/dist/esm/components/primitives/Kbd/Kbd.js.map +1 -0
- package/dist/esm/components/primitives/Link/Link.css.js +11 -0
- package/dist/esm/components/primitives/Link/Link.css.js.map +1 -0
- package/dist/esm/components/primitives/Link/Link.js +160 -0
- package/dist/esm/components/primitives/Link/Link.js.map +1 -0
- package/dist/esm/components/primitives/Popover/Popover.css.js +1 -1
- package/dist/esm/components/primitives/Radio/Radio.css.js +18 -0
- package/dist/esm/components/primitives/Radio/Radio.css.js.map +1 -0
- package/dist/esm/components/primitives/Radio/Radio.js +109 -0
- package/dist/esm/components/primitives/Radio/Radio.js.map +1 -0
- package/dist/esm/components/primitives/Radio/RadioGroup.js +82 -0
- package/dist/esm/components/primitives/Radio/RadioGroup.js.map +1 -0
- package/dist/esm/components/primitives/Switch/Switch.css.js +1 -1
- package/dist/esm/components/primitives/TextArea/TextArea.css.js +1 -1
- package/dist/esm/components/primitives/Tooltip/Tooltip.js +7 -2
- package/dist/esm/components/primitives/Tooltip/Tooltip.js.map +1 -1
- package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.css.js +7 -0
- package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.css.js.map +1 -0
- package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.js +38 -0
- package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.js.map +1 -0
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js +2 -10
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js.map +1 -1
- package/dist/esm/context/KeyboardContext.js +1 -0
- package/dist/esm/context/KeyboardContext.js.map +1 -1
- package/dist/esm/hooks/useClickOutside/useClickOutside.js +60 -0
- package/dist/esm/hooks/useClickOutside/useClickOutside.js.map +1 -0
- package/dist/esm/hooks/useClipboard/useClipboard.js +147 -0
- package/dist/esm/hooks/useClipboard/useClipboard.js.map +1 -0
- package/dist/esm/hooks/useControlledState/useControlledState.js +75 -0
- package/dist/esm/hooks/useControlledState/useControlledState.js.map +1 -0
- package/dist/esm/hooks/useDisclosure/useDisclosure.js +49 -0
- package/dist/esm/hooks/useDisclosure/useDisclosure.js.map +1 -0
- package/dist/esm/{components/feedback/Dialog → hooks/useFocusTrap}/useFocusTrap.js +7 -7
- package/dist/esm/hooks/useFocusTrap/useFocusTrap.js.map +1 -0
- package/dist/esm/hooks/useHotkey/useHotkey.js +203 -0
- package/dist/esm/hooks/useHotkey/useHotkey.js.map +1 -0
- package/dist/esm/hooks/useKeyboard/useKeyboard.js +56 -0
- package/dist/esm/hooks/useKeyboard/useKeyboard.js.map +1 -0
- package/dist/esm/hooks/useKeyboard/utils.js +56 -0
- package/dist/esm/hooks/useKeyboard/utils.js.map +1 -0
- package/dist/esm/hooks/useMergedRef/useMergedRef.js +39 -0
- package/dist/esm/hooks/useMergedRef/useMergedRef.js.map +1 -0
- package/dist/esm/hooks/useResizeObserver/useResizeObserver.js +75 -0
- package/dist/esm/hooks/useResizeObserver/useResizeObserver.js.map +1 -0
- package/dist/esm/hooks/useTheme/useTheme.js +198 -0
- package/dist/esm/hooks/useTheme/useTheme.js.map +1 -0
- package/dist/esm/index.js +40 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/theme/createLightTheme.js +29 -0
- package/dist/esm/theme/createLightTheme.js.map +1 -0
- package/dist/esm/theme/darkThemeValues.js +155 -0
- package/dist/esm/theme/darkThemeValues.js.map +1 -0
- package/dist/esm/theme/index.js +10 -0
- package/dist/esm/theme/index.js.map +1 -0
- package/dist/esm/theme/lightTheme.css.js +6 -0
- package/dist/esm/theme/lightTheme.css.js.map +1 -0
- package/dist/esm/theme/lightThemeValues.js +164 -0
- package/dist/esm/theme/lightThemeValues.js.map +1 -0
- package/dist/esm/theme/themeContractData.js +161 -0
- package/dist/esm/theme/themeContractData.js.map +1 -0
- package/dist/esm/theme-values.js +4 -0
- package/dist/esm/theme-values.js.map +1 -0
- package/dist/esm/utils/animations.css.js +8 -6
- package/dist/esm/utils/animations.css.js.map +1 -1
- package/dist/esm/utils/devWarn.js +36 -0
- package/dist/esm/utils/devWarn.js.map +1 -0
- package/dist/esm/utils/platform.js +91 -0
- package/dist/esm/utils/platform.js.map +1 -0
- package/dist/tokens/tokens.dark.css +98 -0
- package/dist/tokens/tokens.json +851 -0
- package/dist/tokens/tokens.light.css +98 -0
- package/dist/types/components/editor/TransformControl/TransformControl.d.ts +34 -0
- package/dist/types/components/editor/TransformControl/TransformControl.types.d.ts +153 -0
- package/dist/types/components/feedback/Alert/Alert.d.ts +340 -0
- package/dist/types/components/feedback/Alert/Alert.types.d.ts +82 -0
- package/dist/types/components/feedback/Alert/AlertActions.d.ts +306 -0
- package/dist/types/components/feedback/Alert/AlertDescription.d.ts +303 -0
- package/dist/types/components/feedback/Alert/AlertTitle.d.ts +303 -0
- package/dist/types/components/feedback/ProgressBar/CircularProgress.d.ts +313 -0
- package/dist/types/components/feedback/ProgressBar/ProgressBar.d.ts +315 -0
- package/dist/types/components/feedback/ProgressBar/ProgressBar.types.d.ts +132 -0
- package/dist/types/components/feedback/Skeleton/Skeleton.d.ts +312 -0
- package/dist/types/components/feedback/Skeleton/Skeleton.types.d.ts +82 -0
- package/dist/types/components/feedback/Skeleton/SkeletonGroup.d.ts +313 -0
- package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEllipsis.d.ts +297 -0
- package/dist/types/components/navigation/Breadcrumbs/BreadcrumbItem.d.ts +304 -0
- package/dist/types/components/navigation/Breadcrumbs/BreadcrumbSeparator.d.ts +296 -0
- package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.d.ts +311 -0
- package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts +89 -0
- package/dist/types/components/navigation/SegmentedControl/SegmentedControl.d.ts +24 -0
- package/dist/types/components/navigation/SegmentedControl/SegmentedControl.types.d.ts +85 -0
- package/dist/types/components/navigation/SegmentedControl/SegmentedControlItem.d.ts +12 -0
- package/dist/types/components/primitives/Avatar/Avatar.d.ts +317 -0
- package/dist/types/components/primitives/Avatar/Avatar.types.d.ts +139 -0
- package/dist/types/components/primitives/Avatar/AvatarGroup.d.ts +316 -0
- package/dist/types/components/primitives/Button/Button.d.ts +1 -1
- package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
- package/dist/types/components/primitives/Kbd/Kbd.d.ts +307 -0
- package/dist/types/components/primitives/Kbd/Kbd.types.d.ts +49 -0
- package/dist/types/components/primitives/Link/Link.d.ts +20 -0
- package/dist/types/components/primitives/Link/Link.types.d.ts +123 -0
- package/dist/types/components/primitives/Radio/Radio.d.ts +319 -0
- package/dist/types/components/primitives/Radio/Radio.types.d.ts +155 -0
- package/dist/types/components/primitives/Radio/RadioGroup.d.ts +320 -0
- package/dist/types/components/primitives/VisuallyHidden/VisuallyHidden.d.ts +316 -0
- package/dist/types/components/primitives/VisuallyHidden/VisuallyHidden.types.d.ts +29 -0
- package/dist/types/hooks/useClickOutside/useClickOutside.d.ts +37 -0
- package/dist/types/hooks/useClipboard/useClipboard.d.ts +24 -0
- package/dist/types/hooks/useClipboard/useClipboard.types.d.ts +22 -0
- package/dist/types/hooks/useControlledState/useControlledState.d.ts +38 -0
- package/dist/types/hooks/useDisclosure/useDisclosure.d.ts +25 -0
- package/dist/types/hooks/useDisclosure/useDisclosure.types.d.ts +22 -0
- package/dist/types/hooks/useFocusTrap/useFocusTrap.d.ts +30 -0
- package/dist/types/hooks/useHotkey/useHotkey.d.ts +23 -0
- package/dist/types/hooks/useHotkey/useHotkey.types.d.ts +36 -0
- package/dist/types/hooks/useKeyboard/types.d.ts +14 -0
- package/dist/types/hooks/useKeyboard/useKeyboard.d.ts +36 -0
- package/dist/types/hooks/useKeyboard/utils.d.ts +6 -0
- package/dist/types/hooks/useMergedRef/useMergedRef.d.ts +22 -0
- package/dist/types/hooks/useResizeObserver/useResizeObserver.d.ts +35 -0
- package/dist/types/hooks/useTheme/useTheme.d.ts +48 -0
- package/dist/types/hooks/useTheme/useTheme.types.d.ts +60 -0
- package/dist/types/index.d.ts +56 -3
- package/dist/types/theme/contract.css.d.ts +125 -121
- package/dist/types/theme/createCustomTheme.d.ts +1 -1
- package/dist/types/theme/createLightTheme.d.ts +24 -0
- package/dist/types/theme/{darkTheme.css.d.ts → darkThemeValues.d.ts} +6 -2
- package/dist/types/theme/globalScrollbars.css.d.ts +15 -0
- package/dist/types/theme/index.d.ts +9 -0
- package/dist/types/theme/lightTheme.css.d.ts +17 -0
- package/dist/types/theme/lightThemeValues.d.ts +168 -0
- package/dist/types/theme/themeContractData.d.ts +160 -0
- package/dist/types/theme-values.d.ts +10 -0
- package/dist/types/utils/animations.css.d.ts +3 -1
- package/dist/types/utils/platform.d.ts +16 -0
- package/package.json +13 -4
- package/dist/esm/components/feedback/Dialog/useFocusTrap.js.map +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BaseComponent } from '../../../types/common.js';
|
|
3
|
+
import { Prettify } from '../../../types/utilities.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* HTML element types that VisuallyHidden can render as.
|
|
7
|
+
*
|
|
8
|
+
* Most cases use `span` (default). Use `div` when wrapping block content,
|
|
9
|
+
* `label` for form labels, `p` for prose.
|
|
10
|
+
*/
|
|
11
|
+
type VisuallyHiddenElement = 'span' | 'div' | 'label' | 'p';
|
|
12
|
+
interface VisuallyHiddenBaseProps extends BaseComponent<HTMLSpanElement> {
|
|
13
|
+
/**
|
|
14
|
+
* HTML element to render as.
|
|
15
|
+
* @default "span"
|
|
16
|
+
*/
|
|
17
|
+
as?: VisuallyHiddenElement;
|
|
18
|
+
/**
|
|
19
|
+
* When true, the element becomes visible when it (or any descendant)
|
|
20
|
+
* receives focus. Used for skip-to-content links.
|
|
21
|
+
* @default false
|
|
22
|
+
*/
|
|
23
|
+
focusable?: boolean;
|
|
24
|
+
/** Content rendered inside the hidden region. */
|
|
25
|
+
children: React.ReactNode;
|
|
26
|
+
}
|
|
27
|
+
type VisuallyHiddenProps = Prettify<VisuallyHiddenBaseProps>;
|
|
28
|
+
|
|
29
|
+
export type { VisuallyHiddenBaseProps, VisuallyHiddenElement, VisuallyHiddenProps };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
|
|
3
|
+
interface UseClickOutsideOptions {
|
|
4
|
+
/**
|
|
5
|
+
* When false, the listener is not attached. Useful for toggling without
|
|
6
|
+
* unmount.
|
|
7
|
+
* @default true
|
|
8
|
+
*/
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Mouse / pointer event to listen for.
|
|
12
|
+
* @default 'mousedown'
|
|
13
|
+
*/
|
|
14
|
+
event?: 'mousedown' | 'click' | 'pointerdown';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Fire a callback when a click occurs outside the referenced element(s).
|
|
18
|
+
*
|
|
19
|
+
* Accepts either a single ref or an array of refs. The handler fires only
|
|
20
|
+
* when the click lands outside ALL provided refs — useful for popover +
|
|
21
|
+
* trigger pairs where clicking either should be considered "inside".
|
|
22
|
+
*
|
|
23
|
+
* Defaults to `mousedown` so the handler runs before `click`. SSR-safe;
|
|
24
|
+
* cleans up on unmount and when `enabled` flips to `false`.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* const ref = useRef<HTMLDivElement>(null);
|
|
29
|
+
* useClickOutside(ref, () => setOpen(false), { enabled: isOpen });
|
|
30
|
+
*
|
|
31
|
+
* return <div ref={ref}>...</div>;
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
declare function useClickOutside<T extends HTMLElement = HTMLElement>(ref: RefObject<T | null> | Array<RefObject<HTMLElement | null>>, handler: (event: MouseEvent) => void, options?: UseClickOutsideOptions): void;
|
|
35
|
+
|
|
36
|
+
export { useClickOutside };
|
|
37
|
+
export type { UseClickOutsideOptions };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { UseClipboardOptions, UseClipboardReturn } from './useClipboard.types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Copy text to the clipboard with a built-in timeout-driven feedback state.
|
|
5
|
+
*
|
|
6
|
+
* Uses `navigator.clipboard.writeText` when available; falls back to
|
|
7
|
+
* `document.execCommand('copy')` only when the modern API is missing.
|
|
8
|
+
* In SSR or restricted contexts where neither path is available, `copy`
|
|
9
|
+
* resolves to `false` and `status` flips to `'error'` without throwing.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* const { copy, copied } = useClipboard({ timeout: 1500 });
|
|
14
|
+
*
|
|
15
|
+
* return (
|
|
16
|
+
* <Button onClick={() => copy('Hello!')}>
|
|
17
|
+
* {copied ? 'Copied!' : 'Copy'}
|
|
18
|
+
* </Button>
|
|
19
|
+
* );
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare function useClipboard(options?: UseClipboardOptions): UseClipboardReturn;
|
|
23
|
+
|
|
24
|
+
export { useClipboard };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
type ClipboardStatus = 'idle' | 'copied' | 'error';
|
|
2
|
+
interface UseClipboardOptions {
|
|
3
|
+
/**
|
|
4
|
+
* How long the `copied` state stays before resetting to `idle`, in ms.
|
|
5
|
+
* @default 2000
|
|
6
|
+
*/
|
|
7
|
+
timeout?: number;
|
|
8
|
+
}
|
|
9
|
+
interface UseClipboardReturn {
|
|
10
|
+
/** Current state — flips to 'copied' for `timeout` ms after a successful copy. */
|
|
11
|
+
status: ClipboardStatus;
|
|
12
|
+
/** Convenience boolean — `status === 'copied'`. */
|
|
13
|
+
copied: boolean;
|
|
14
|
+
/** Last error from a failed copy attempt, if any. */
|
|
15
|
+
error: Error | null;
|
|
16
|
+
/** Copy text to clipboard. Returns the resolved success boolean. */
|
|
17
|
+
copy: (text: string) => Promise<boolean>;
|
|
18
|
+
/** Manually reset status to 'idle'. */
|
|
19
|
+
reset: () => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type { ClipboardStatus, UseClipboardOptions, UseClipboardReturn };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface UseControlledStateOptions<T> {
|
|
2
|
+
/** Controlled value — when defined, drives the returned value. */
|
|
3
|
+
value?: T;
|
|
4
|
+
/** Default value used when the hook is uncontrolled. */
|
|
5
|
+
defaultValue?: T;
|
|
6
|
+
/** Called when the consumer requests a change in either mode. */
|
|
7
|
+
onChange?: (value: T) => void;
|
|
8
|
+
/** Fallback used when both `value` and `defaultValue` are undefined. */
|
|
9
|
+
fallback: T;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Manage a value that may be either controlled (via prop) or uncontrolled
|
|
13
|
+
* (managed internally with a default).
|
|
14
|
+
*
|
|
15
|
+
* Returns a `[value, setValue]` tuple just like `useState`. When
|
|
16
|
+
* `options.value` is defined the state is read from there and `setValue`
|
|
17
|
+
* becomes a pure side-effect callback that calls `onChange` only — internal
|
|
18
|
+
* state is never mutated. When `options.value` is undefined the hook owns the
|
|
19
|
+
* state and `setValue` updates it as well as calls `onChange`.
|
|
20
|
+
*
|
|
21
|
+
* Switching between controlled and uncontrolled within a component's lifetime
|
|
22
|
+
* is a known pitfall (matches React's own warning for `<input value/defaultValue>`).
|
|
23
|
+
* The hook emits a development-only warning when this happens.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const [value, setValue] = useControlledState({
|
|
28
|
+
* value: props.value,
|
|
29
|
+
* defaultValue: props.defaultValue,
|
|
30
|
+
* onChange: props.onChange,
|
|
31
|
+
* fallback: '',
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
declare function useControlledState<T>(options: UseControlledStateOptions<T>): [T, (next: T | ((prev: T) => T)) => void];
|
|
36
|
+
|
|
37
|
+
export { useControlledState };
|
|
38
|
+
export type { UseControlledStateOptions };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { UseDisclosureOptions, UseDisclosureReturn } from './useDisclosure.types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Manage an open/closed state with stable `open`, `close`, `toggle` callbacks.
|
|
5
|
+
*
|
|
6
|
+
* Supports both controlled (driven by an `open` prop) and uncontrolled
|
|
7
|
+
* (managed internally with `defaultOpen`) modes. Built on top of
|
|
8
|
+
* `useControlledState` so the same controlled / uncontrolled rules apply —
|
|
9
|
+
* including the development warning when switching modes mid-life.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* const { isOpen, open, close, toggle } = useDisclosure();
|
|
14
|
+
*
|
|
15
|
+
* return (
|
|
16
|
+
* <>
|
|
17
|
+
* <Button onClick={open}>Open</Button>
|
|
18
|
+
* <Dialog open={isOpen} onClose={close}>...</Dialog>
|
|
19
|
+
* </>
|
|
20
|
+
* );
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function useDisclosure(options?: UseDisclosureOptions): UseDisclosureReturn;
|
|
24
|
+
|
|
25
|
+
export { useDisclosure };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface UseDisclosureOptions {
|
|
2
|
+
/** Initial state for uncontrolled mode. @default false */
|
|
3
|
+
defaultOpen?: boolean;
|
|
4
|
+
/** Controlled value — when defined, drives the returned state. */
|
|
5
|
+
open?: boolean;
|
|
6
|
+
/** Called when state changes (from either controlled or uncontrolled paths). */
|
|
7
|
+
onOpenChange?: (open: boolean) => void;
|
|
8
|
+
}
|
|
9
|
+
interface UseDisclosureReturn {
|
|
10
|
+
/** Current open state. */
|
|
11
|
+
isOpen: boolean;
|
|
12
|
+
/** Set open to `true`. */
|
|
13
|
+
open: () => void;
|
|
14
|
+
/** Set open to `false`. */
|
|
15
|
+
close: () => void;
|
|
16
|
+
/** Flip current open state. */
|
|
17
|
+
toggle: () => void;
|
|
18
|
+
/** Set open to an explicit value. */
|
|
19
|
+
setOpen: (next: boolean) => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type { UseDisclosureOptions, UseDisclosureReturn };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { RefObject, KeyboardEvent } from 'react';
|
|
2
|
+
|
|
3
|
+
interface UseFocusTrapOptions {
|
|
4
|
+
/** Ref to the container element whose focusable descendants are trapped. */
|
|
5
|
+
containerRef: RefObject<HTMLElement | null>;
|
|
6
|
+
/**
|
|
7
|
+
* When false, the trap is bypassed (Tab works normally). Useful for toggling
|
|
8
|
+
* trap state without unmounting.
|
|
9
|
+
* @default true
|
|
10
|
+
*/
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Trap focus within a container element. Tab and Shift+Tab cycle through the
|
|
15
|
+
* focusable descendants without escaping the container.
|
|
16
|
+
*
|
|
17
|
+
* Returns a keyboard event handler to attach to the container's `onKeyDown`.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const ref = useRef<HTMLDivElement>(null);
|
|
22
|
+
* const handleKeyDown = useFocusTrap({ containerRef: ref, enabled: isOpen });
|
|
23
|
+
*
|
|
24
|
+
* return <div ref={ref} onKeyDown={handleKeyDown}>...</div>;
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare function useFocusTrap({ containerRef, enabled, }: UseFocusTrapOptions): (event: KeyboardEvent) => void;
|
|
28
|
+
|
|
29
|
+
export { useFocusTrap };
|
|
30
|
+
export type { UseFocusTrapOptions };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { UseHotkeyOptions } from './useHotkey.types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Bind a single keyboard combo to a callback.
|
|
5
|
+
*
|
|
6
|
+
* Combos use the same `+`-separated string format as `MenuBar`'s `shortcut`
|
|
7
|
+
* prop: `"Ctrl+S"`, `"Cmd+Shift+P"`, `"Escape"`. Modifiers: `Ctrl`, `Cmd`
|
|
8
|
+
* (= Meta), `Alt` / `Option`, `Shift`. `Cmd` automatically maps to `Ctrl` on
|
|
9
|
+
* non-Mac platforms via `getPlatform()`.
|
|
10
|
+
*
|
|
11
|
+
* The handler reference is stable — passing a fresh inline function on every
|
|
12
|
+
* render is safe and does not re-subscribe the underlying listener.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* useHotkey('Ctrl+S', e => save(), { preventDefault: true });
|
|
17
|
+
* useHotkey('Escape', () => setOpen(false));
|
|
18
|
+
* useHotkey('Cmd+K', () => openCommandPalette()); // Cmd on Mac, Ctrl elsewhere
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare function useHotkey(combo: string, handler: (event: KeyboardEvent) => void, options?: UseHotkeyOptions): void;
|
|
22
|
+
|
|
23
|
+
export { useHotkey };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
|
|
3
|
+
type HotkeyTarget = EventTarget | RefObject<EventTarget | null> | null;
|
|
4
|
+
interface UseHotkeyOptions {
|
|
5
|
+
/**
|
|
6
|
+
* When false, the binding is not active.
|
|
7
|
+
* @default true
|
|
8
|
+
*/
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Whether to fire when focus is inside an editable element
|
|
12
|
+
* (`<input>`, `<textarea>`, `[contenteditable]`).
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
enableInInputs?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Call `event.preventDefault()` before invoking the handler.
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
preventDefault?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Call `event.stopPropagation()` after the handler runs.
|
|
23
|
+
* @default false
|
|
24
|
+
*/
|
|
25
|
+
stopPropagation?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Override the target element. Accepts either an `EventTarget` directly
|
|
28
|
+
* (e.g. `document`, an `HTMLElement`) or a `RefObject` whose `.current`
|
|
29
|
+
* resolves to one. The latter form re-attaches the listener once the ref
|
|
30
|
+
* mounts, so passing `ref` directly works without waiting a render. Defaults
|
|
31
|
+
* to `window`.
|
|
32
|
+
*/
|
|
33
|
+
target?: HotkeyTarget;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type { HotkeyTarget, UseHotkeyOptions };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LiteralUnion } from '../../types/utilities.js';
|
|
2
|
+
|
|
3
|
+
type ModifierKeys = 'control' | 'shift' | 'alt' | 'meta';
|
|
4
|
+
type KeyCode = string;
|
|
5
|
+
type KeyboardModifierKeysState = {
|
|
6
|
+
[key in ModifierKeys]: boolean;
|
|
7
|
+
};
|
|
8
|
+
type KeyboardState = {
|
|
9
|
+
pressedKeys: KeyCode[];
|
|
10
|
+
modifiers: KeyboardModifierKeysState;
|
|
11
|
+
};
|
|
12
|
+
type AllKeys = LiteralUnion<ModifierKeys, string>;
|
|
13
|
+
|
|
14
|
+
export type { AllKeys, KeyCode, KeyboardModifierKeysState, KeyboardState, ModifierKeys };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { KeyboardState } from './types.js';
|
|
2
|
+
export { AllKeys, ModifierKeys } from './types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook for tracking keyboard state including modifier keys and pressed keys.
|
|
6
|
+
*
|
|
7
|
+
* Useful for components that need to respond to keyboard modifiers like
|
|
8
|
+
* Ctrl+drag for snapping, Shift+drag for precision, etc.
|
|
9
|
+
* @returns Current keyboard state
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* // Track all keys and modifiers
|
|
14
|
+
* const keyboard = useKeyboard();
|
|
15
|
+
*
|
|
16
|
+
* const handleMouseMove = (e: MouseEvent) => {
|
|
17
|
+
* if (keyboard.ctrl) {
|
|
18
|
+
* // Snap to grid
|
|
19
|
+
* } else if (keyboard.shift) {
|
|
20
|
+
* // Precision mode
|
|
21
|
+
* }
|
|
22
|
+
* };
|
|
23
|
+
*
|
|
24
|
+
* // Track only specific keys
|
|
25
|
+
* const keyboard = useKeyboard({
|
|
26
|
+
* trackAllKeys: false,
|
|
27
|
+
* trackedKeys: ['Space', 'Enter', 'Escape']
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Check if specific key is pressed
|
|
31
|
+
* const isSpacePressed = keyboard.pressedKeys.includes('Space');
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
declare const useKeyboard: () => KeyboardState;
|
|
35
|
+
|
|
36
|
+
export { KeyboardState, useKeyboard };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Ref, RefCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Merge multiple refs into a single callback ref. Each provided ref (object
|
|
5
|
+
* ref, callback ref, or `null`/`undefined`) receives the node when the merged
|
|
6
|
+
* ref fires.
|
|
7
|
+
*
|
|
8
|
+
* Useful when a component needs to keep an internal ref to a DOM node while
|
|
9
|
+
* also forwarding the same node through an externally supplied `ref` prop
|
|
10
|
+
* (ref-as-prop in React 19).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* const internalRef = useRef<HTMLDivElement>(null);
|
|
15
|
+
* const mergedRef = useMergedRef(internalRef, props.ref);
|
|
16
|
+
*
|
|
17
|
+
* return <div ref={mergedRef} />;
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
declare function useMergedRef<T>(...refs: Array<Ref<T> | undefined | null>): RefCallback<T>;
|
|
21
|
+
|
|
22
|
+
export { useMergedRef };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
|
|
3
|
+
interface UseResizeObserverOptions {
|
|
4
|
+
/**
|
|
5
|
+
* When false, the observer is not attached. Toggling this from `false` to
|
|
6
|
+
* `true` (re-)attaches the observer; toggling back disconnects it.
|
|
7
|
+
* @default true
|
|
8
|
+
*/
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Observe size changes on an element. SSR-safe; cleans up on unmount.
|
|
13
|
+
*
|
|
14
|
+
* The callback is wrapped in a ref so consumers do not have to memoize it —
|
|
15
|
+
* the underlying observer never re-subscribes when the callback identity
|
|
16
|
+
* changes.
|
|
17
|
+
*
|
|
18
|
+
* The hook re-checks `ref.current` on every render so it picks up nodes that
|
|
19
|
+
* mount later (e.g. through conditional rendering). When the observed node
|
|
20
|
+
* has not changed the only cost is a single identity comparison.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* const ref = useRef<HTMLDivElement>(null);
|
|
25
|
+
* useResizeObserver(ref, entry => {
|
|
26
|
+
* console.log(entry.contentRect.width);
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* return <div ref={ref} />;
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare function useResizeObserver<T extends HTMLElement>(ref: RefObject<T | null>, callback: (entry: ResizeObserverEntry) => void, options?: UseResizeObserverOptions): void;
|
|
33
|
+
|
|
34
|
+
export { useResizeObserver };
|
|
35
|
+
export type { UseResizeObserverOptions };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { UseThemeReturn } from './useTheme.types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Read the current theme at runtime.
|
|
5
|
+
*
|
|
6
|
+
* Returns the resolved CSS variable snapshot from `:root`, the detected
|
|
7
|
+
* theme variant, and helpers for reading individual tokens by path.
|
|
8
|
+
* Components should prefer compile-time tokens via Vanilla Extract
|
|
9
|
+
* (`vars.*` from `@/theme`) — reach for `useTheme` only when a runtime
|
|
10
|
+
* read is genuinely required (canvas drawing, third-party libraries that
|
|
11
|
+
* take colors as plain strings).
|
|
12
|
+
*
|
|
13
|
+
* **Scope:** the hook always reads from `:root` — both the variant and
|
|
14
|
+
* the resolved values come from `document.documentElement`. A light- or
|
|
15
|
+
* custom-themed subtree wrapped in `VanillaThemeProvider` will **not** be
|
|
16
|
+
* reflected here; for that, components inside the subtree should style
|
|
17
|
+
* via Vanilla Extract `vars.*` (which the browser resolves correctly per
|
|
18
|
+
* scope) rather than runtime reads.
|
|
19
|
+
*
|
|
20
|
+
* **SSR:** returns the dark-theme defaults as a fallback. The hook
|
|
21
|
+
* re-evaluates against the live DOM on mount via `useLayoutEffect`, so
|
|
22
|
+
* the second render contains the real values before the browser paints.
|
|
23
|
+
*
|
|
24
|
+
* **Reactivity:** v0.8 reads once on mount. Toggling the root theme at
|
|
25
|
+
* runtime is not reflected — remount the consuming subtree to pick up
|
|
26
|
+
* the new theme. A `MutationObserver`-based subscription may be added
|
|
27
|
+
* in a later release if consumer demand emerges.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* const { values, variant, getVar, getToken } = useTheme();
|
|
32
|
+
*
|
|
33
|
+
* // Canvas drawing with theme-aware colors
|
|
34
|
+
* ctx.strokeStyle = values.colors.accent.primary;
|
|
35
|
+
*
|
|
36
|
+
* // Conditional logic
|
|
37
|
+
* if (variant === 'dark') loadDarkAssets();
|
|
38
|
+
*
|
|
39
|
+
* // Inline styles that follow theme changes automatically
|
|
40
|
+
* <div style={{ color: getVar('colors.text.primary') }} />
|
|
41
|
+
*
|
|
42
|
+
* // One-off token resolution
|
|
43
|
+
* const accent = getToken('colors.accent.primary');
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
declare function useTheme(): UseThemeReturn;
|
|
47
|
+
|
|
48
|
+
export { useTheme };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ThemeValues } from '../../theme/createCustomTheme.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Same shape as `ThemeValues` but with each leaf widened to `string`.
|
|
5
|
+
*
|
|
6
|
+
* `darkThemeValues` is declared `as const`, which makes its leaf types
|
|
7
|
+
* literal (e.g. `'#007acc'`). At runtime the hook reads arbitrary CSS
|
|
8
|
+
* custom-property strings from the DOM — those values are not constrained
|
|
9
|
+
* to the dark-theme literals, so the return type widens to plain strings
|
|
10
|
+
* to stay sound for light, custom, or computed values.
|
|
11
|
+
*/
|
|
12
|
+
type ResolvedThemeValues = WidenLeaves<ThemeValues>;
|
|
13
|
+
type WidenLeaves<T> = T extends string ? string : T extends number ? number : {
|
|
14
|
+
-readonly [K in keyof T]: WidenLeaves<T[K]>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Detected theme variant.
|
|
18
|
+
*
|
|
19
|
+
* Detection is **root-only**: the hook reports `'light'` only when the
|
|
20
|
+
* `lightThemeClass` produced by `createLightTheme()` is applied to
|
|
21
|
+
* `document.documentElement` — the same element the hook reads CSS
|
|
22
|
+
* variable values from. A light-themed subtree wrapped in
|
|
23
|
+
* `VanillaThemeProvider` does **not** flip this variant, because the
|
|
24
|
+
* resolved values would still come from the root.
|
|
25
|
+
*
|
|
26
|
+
* - `'dark'` — the default; no `lightThemeClass` on `:root`.
|
|
27
|
+
* - `'light'` — `lightThemeClass` is on `:root`.
|
|
28
|
+
* - `'custom'` — reserved. v0.8 does not auto-detect themes produced by
|
|
29
|
+
* `createCustomTheme(selector, overrides)`; the union member exists so
|
|
30
|
+
* future releases can add detection without a breaking type change.
|
|
31
|
+
*/
|
|
32
|
+
type ThemeVariant = 'dark' | 'light' | 'custom';
|
|
33
|
+
interface UseThemeReturn {
|
|
34
|
+
/** Current root-theme variant. See `ThemeVariant` for detection rules. */
|
|
35
|
+
variant: ThemeVariant;
|
|
36
|
+
/** Resolved theme values — CSS variable values read from `:root`. */
|
|
37
|
+
values: ResolvedThemeValues;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve a single token to its current CSS-var value, e.g. `'#007acc'`.
|
|
40
|
+
*
|
|
41
|
+
* Falls back to the dark-theme default when the underlying CSS variable
|
|
42
|
+
* is unset or when no DOM is available (SSR). Returns an empty string
|
|
43
|
+
* only for paths that don't resolve to a leaf in the theme contract.
|
|
44
|
+
* Repeated calls for the same path are cached for the life of the hook
|
|
45
|
+
* instance.
|
|
46
|
+
*/
|
|
47
|
+
getToken: (path: string) => string;
|
|
48
|
+
/**
|
|
49
|
+
* Get the `var(--etui-...)` reference for a token, e.g.
|
|
50
|
+
* `'var(--etui-color-accent-primary)'`. Useful for inline styles that
|
|
51
|
+
* must follow theme changes automatically.
|
|
52
|
+
*
|
|
53
|
+
* SSR-safe — the returned string is constructed from the contract and
|
|
54
|
+
* works identically in browser and server rendering. Returns an empty
|
|
55
|
+
* string only for paths that don't resolve to a leaf in the contract.
|
|
56
|
+
*/
|
|
57
|
+
getVar: (path: string) => string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type { ResolvedThemeValues, ThemeVariant, UseThemeReturn };
|