entangle-ui 0.6.3 → 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 +219 -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-DPIGnZ4A.css → ChatPanel.css.ts.vanilla-CLn8idfz.css} +180 -116
- 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/EmptyState/EmptyState.css.ts.vanilla-B_TWsTOW.css +58 -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/Spinner/Spinner.css.ts.vanilla-DEUewqdK.css +80 -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/layout/Divider/Divider.css.ts.vanilla-CPvd_RW9.css +72 -0
- package/dist/esm/assets/src/components/layout/ListItem/ListItem.css.ts.vanilla-BwAZrX2f.css +68 -0
- package/dist/esm/assets/src/components/layout/PageHeader/PageHeader.css.ts.vanilla-DdbyyWAN.css +70 -0
- package/dist/esm/assets/src/components/layout/SplitPane/{SplitPane.css.ts.vanilla-BFxdvwyI.css → SplitPane.css.ts.vanilla-BGFZ7zDa.css} +5 -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/Badge/Badge.css.ts.vanilla-DxCUcxYW.css +95 -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/Code/Code.css.ts.vanilla-mayBqLDM.css +19 -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-M9l1t4HR.css +90 -0
- package/dist/esm/assets/src/components/primitives/VisuallyHidden/VisuallyHidden.css.ts.vanilla-DBulVh4Q.css +36 -0
- package/dist/esm/assets/src/theme/{darkTheme.css.ts.vanilla-DCe89yCJ.css → darkTheme.css.ts.vanilla-ab1WD4dr.css} +3 -0
- package/dist/esm/assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css +21 -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-CRLFsBSV.css +72 -0
- 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/ChatInput.js +18 -7
- package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js +268 -0
- package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js.map +1 -0
- package/dist/esm/components/editor/ChatPanel/ChatMessage.js +17 -13
- package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatMessageList.js +23 -15
- package/dist/esm/components/editor/ChatPanel/ChatMessageList.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js +73 -63
- package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/ChatPanel.js +15 -3
- package/dist/esm/components/editor/ChatPanel/ChatPanel.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/useChatInput.js +3 -3
- package/dist/esm/components/editor/ChatPanel/useChatInput.js.map +1 -1
- package/dist/esm/components/editor/ChatPanel/useChatScroll.js +53 -2
- 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/EmptyState/EmptyState.css.js +13 -0
- package/dist/esm/components/feedback/EmptyState/EmptyState.css.js.map +1 -0
- package/dist/esm/components/feedback/EmptyState/EmptyState.js +43 -0
- package/dist/esm/components/feedback/EmptyState/EmptyState.js.map +1 -0
- 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 +16 -0
- package/dist/esm/components/feedback/Spinner/Spinner.css.js.map +1 -0
- package/dist/esm/components/feedback/Spinner/Spinner.js +50 -0
- package/dist/esm/components/feedback/Spinner/Spinner.js.map +1 -0
- 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/Divider/Divider.css.js +9 -0
- package/dist/esm/components/layout/Divider/Divider.css.js.map +1 -0
- package/dist/esm/components/layout/Divider/Divider.js +51 -0
- package/dist/esm/components/layout/Divider/Divider.js.map +1 -0
- package/dist/esm/components/layout/ListItem/ListItem.css.js +10 -0
- package/dist/esm/components/layout/ListItem/ListItem.css.js.map +1 -0
- package/dist/esm/components/layout/ListItem/ListItem.js +45 -0
- package/dist/esm/components/layout/ListItem/ListItem.js.map +1 -0
- package/dist/esm/components/layout/PageHeader/PageHeader.css.js +13 -0
- package/dist/esm/components/layout/PageHeader/PageHeader.css.js.map +1 -0
- package/dist/esm/components/layout/PageHeader/PageHeader.js +29 -0
- package/dist/esm/components/layout/PageHeader/PageHeader.js.map +1 -0
- 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.css.js +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/TabPanel.js +6 -3
- package/dist/esm/components/navigation/Tabs/TabPanel.js.map +1 -1
- package/dist/esm/components/navigation/Tabs/Tabs.css.js +1 -1
- package/dist/esm/components/navigation/Tabs/Tabs.js +3 -1
- package/dist/esm/components/navigation/Tabs/Tabs.js.map +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/Badge/Badge.css.js +12 -0
- package/dist/esm/components/primitives/Badge/Badge.css.js.map +1 -0
- package/dist/esm/components/primitives/Badge/Badge.js +67 -0
- package/dist/esm/components/primitives/Badge/Badge.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/Code/Code.css.js +7 -0
- package/dist/esm/components/primitives/Code/Code.css.js.map +1 -0
- package/dist/esm/components/primitives/Code/Code.js +24 -0
- package/dist/esm/components/primitives/Code/Code.js.map +1 -0
- 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 +10 -0
- package/dist/esm/components/primitives/TextArea/TextArea.css.js.map +1 -0
- package/dist/esm/components/primitives/TextArea/TextArea.js +97 -0
- package/dist/esm/components/primitives/TextArea/TextArea.js.map +1 -0
- 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 +50 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/theme/ThemeProvider.js +17 -3
- package/dist/esm/theme/ThemeProvider.js.map +1 -1
- package/dist/esm/theme/contract.css.js +1 -1
- package/dist/esm/theme/createLightTheme.js +29 -0
- package/dist/esm/theme/createLightTheme.js.map +1 -0
- package/dist/esm/theme/darkTheme.css.js +2 -2
- package/dist/esm/theme/darkThemeValues.js +155 -0
- package/dist/esm/theme/darkThemeValues.js.map +1 -0
- package/dist/esm/theme/globalScrollbars.css.js +6 -0
- package/dist/esm/theme/globalScrollbars.css.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 +15 -0
- package/dist/esm/utils/animations.css.js.map +1 -0
- 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/ChatPanel/ChatMarkdownRenderer.d.ts +323 -0
- package/dist/types/components/editor/ChatPanel/ChatMarkdownRenderer.types.d.ts +46 -0
- package/dist/types/components/editor/ChatPanel/ChatMessage.d.ts +1 -0
- package/dist/types/components/editor/ChatPanel/ChatMessageList.d.ts +2 -1
- package/dist/types/components/editor/ChatPanel/ChatPanel.d.ts +1 -0
- package/dist/types/components/editor/ChatPanel/ChatPanel.types.d.ts +82 -1
- 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/EmptyState/EmptyState.d.ts +313 -0
- package/dist/types/components/feedback/EmptyState/EmptyState.types.d.ts +31 -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/feedback/Spinner/Spinner.d.ts +306 -0
- package/dist/types/components/feedback/Spinner/Spinner.types.d.ts +41 -0
- package/dist/types/components/layout/Divider/Divider.d.ts +307 -0
- package/dist/types/components/layout/Divider/Divider.types.d.ts +50 -0
- package/dist/types/components/layout/ListItem/ListItem.d.ts +312 -0
- package/dist/types/components/layout/ListItem/ListItem.types.d.ts +35 -0
- package/dist/types/components/layout/PageHeader/PageHeader.d.ts +311 -0
- package/dist/types/components/layout/PageHeader/PageHeader.types.d.ts +30 -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/navigation/Tabs/Tabs.types.d.ts +10 -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/Badge/Badge.d.ts +310 -0
- package/dist/types/components/primitives/Badge/Badge.types.d.ts +67 -0
- package/dist/types/components/primitives/Button/Button.d.ts +2 -2
- package/dist/types/components/primitives/Code/Code.d.ts +301 -0
- package/dist/types/components/primitives/Code/Code.types.d.ts +17 -0
- package/dist/types/components/primitives/IconButton/IconButton.d.ts +2 -2
- 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/TextArea/TextArea.d.ts +26 -0
- package/dist/types/components/primitives/TextArea/TextArea.types.d.ts +76 -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 +75 -3
- package/dist/types/theme/ThemeProvider.d.ts +14 -2
- package/dist/types/theme/contract.css.d.ts +125 -118
- 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} +9 -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 +20 -0
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyboardContext.js","sources":["../../../../src/context/KeyboardContext.tsx"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"KeyboardContext.js","sources":["../../../../src/context/KeyboardContext.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAQA;AAiBO;AACL;;AAEE;;AAIF;AACF;;"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useRef, useEffect } from 'react';
|
|
3
|
+
|
|
4
|
+
function isOutside(target, refs) {
|
|
5
|
+
if (!(target instanceof Node))
|
|
6
|
+
return true;
|
|
7
|
+
for (const ref of refs) {
|
|
8
|
+
const node = ref.current;
|
|
9
|
+
if (node && (node === target || node.contains(target))) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Fire a callback when a click occurs outside the referenced element(s).
|
|
17
|
+
*
|
|
18
|
+
* Accepts either a single ref or an array of refs. The handler fires only
|
|
19
|
+
* when the click lands outside ALL provided refs — useful for popover +
|
|
20
|
+
* trigger pairs where clicking either should be considered "inside".
|
|
21
|
+
*
|
|
22
|
+
* Defaults to `mousedown` so the handler runs before `click`. SSR-safe;
|
|
23
|
+
* cleans up on unmount and when `enabled` flips to `false`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* const ref = useRef<HTMLDivElement>(null);
|
|
28
|
+
* useClickOutside(ref, () => setOpen(false), { enabled: isOpen });
|
|
29
|
+
*
|
|
30
|
+
* return <div ref={ref}>...</div>;
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function useClickOutside(ref, handler, options = {}) {
|
|
34
|
+
const { enabled = true, event = 'mousedown' } = options;
|
|
35
|
+
const handlerRef = useRef(handler);
|
|
36
|
+
const refsRef = useRef([]);
|
|
37
|
+
// Latest handler — invoked from the listener without re-subscribing.
|
|
38
|
+
handlerRef.current = handler;
|
|
39
|
+
// Latest ref(s) — refreshed every render so consumers may pass inline
|
|
40
|
+
// arrays without forcing a re-subscribe of the document listener.
|
|
41
|
+
refsRef.current = Array.isArray(ref) ? ref : [ref];
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (!enabled)
|
|
44
|
+
return;
|
|
45
|
+
if (typeof document === 'undefined')
|
|
46
|
+
return;
|
|
47
|
+
const listener = (e) => {
|
|
48
|
+
if (isOutside(e.target, refsRef.current)) {
|
|
49
|
+
handlerRef.current(e);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
document.addEventListener(event, listener);
|
|
53
|
+
return () => {
|
|
54
|
+
document.removeEventListener(event, listener);
|
|
55
|
+
};
|
|
56
|
+
}, [enabled, event]);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { useClickOutside };
|
|
60
|
+
//# sourceMappingURL=useClickOutside.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClickOutside.js","sources":["../../../../../src/hooks/useClickOutside/useClickOutside.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAoBA;AACE;AAA+B;AAE/B;AACE;AACA;AACE;;;AAGJ;AACF;AAEA;;;;;;;;;;;;;;;;;AAiBG;AACG;;AAOJ;AACA;;AAGA;;;AAGA;;AAGE;;;;AAGA;;AAEI;;AAEJ;AAEA;AACA;AACE;AACF;AACF;AACF;;"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_TIMEOUT = 2000;
|
|
5
|
+
async function writeViaClipboardApi(text) {
|
|
6
|
+
if (typeof navigator === 'undefined' ||
|
|
7
|
+
typeof navigator.clipboard === 'undefined' ||
|
|
8
|
+
typeof navigator.clipboard.writeText !== 'function') {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
await navigator.clipboard.writeText(text);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
function writeViaExecCommand(text) {
|
|
15
|
+
if (typeof document === 'undefined')
|
|
16
|
+
return false;
|
|
17
|
+
const textarea = document.createElement('textarea');
|
|
18
|
+
textarea.value = text;
|
|
19
|
+
textarea.setAttribute('readonly', '');
|
|
20
|
+
textarea.style.position = 'absolute';
|
|
21
|
+
textarea.style.left = '-9999px';
|
|
22
|
+
textarea.style.top = '0';
|
|
23
|
+
document.body.appendChild(textarea);
|
|
24
|
+
textarea.select();
|
|
25
|
+
let succeeded = false;
|
|
26
|
+
try {
|
|
27
|
+
succeeded = document.execCommand('copy');
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
succeeded = false;
|
|
31
|
+
}
|
|
32
|
+
document.body.removeChild(textarea);
|
|
33
|
+
return succeeded;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Copy text to the clipboard with a built-in timeout-driven feedback state.
|
|
37
|
+
*
|
|
38
|
+
* Uses `navigator.clipboard.writeText` when available; falls back to
|
|
39
|
+
* `document.execCommand('copy')` only when the modern API is missing.
|
|
40
|
+
* In SSR or restricted contexts where neither path is available, `copy`
|
|
41
|
+
* resolves to `false` and `status` flips to `'error'` without throwing.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```tsx
|
|
45
|
+
* const { copy, copied } = useClipboard({ timeout: 1500 });
|
|
46
|
+
*
|
|
47
|
+
* return (
|
|
48
|
+
* <Button onClick={() => copy('Hello!')}>
|
|
49
|
+
* {copied ? 'Copied!' : 'Copy'}
|
|
50
|
+
* </Button>
|
|
51
|
+
* );
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
function useClipboard(options = {}) {
|
|
55
|
+
const { timeout = DEFAULT_TIMEOUT } = options;
|
|
56
|
+
const [status, setStatus] = useState('idle');
|
|
57
|
+
const [error, setError] = useState(null);
|
|
58
|
+
const timerRef = useRef(null);
|
|
59
|
+
const timeoutRef = useRef(timeout);
|
|
60
|
+
// Bumped on every `copy()` call. The async path captures its own value
|
|
61
|
+
// and short-circuits on resolution if a newer call has started — that
|
|
62
|
+
// prevents an older, slower `writeText` from overwriting the state of a
|
|
63
|
+
// newer copy or from arming a stale timer.
|
|
64
|
+
const requestSeqRef = useRef(0);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
timeoutRef.current = timeout;
|
|
67
|
+
}, [timeout]);
|
|
68
|
+
const clearTimer = useCallback(() => {
|
|
69
|
+
if (timerRef.current !== null) {
|
|
70
|
+
clearTimeout(timerRef.current);
|
|
71
|
+
timerRef.current = null;
|
|
72
|
+
}
|
|
73
|
+
}, []);
|
|
74
|
+
const reset = useCallback(() => {
|
|
75
|
+
clearTimer();
|
|
76
|
+
// Invalidate any in-flight copy so a late resolution does not flip
|
|
77
|
+
// the status back from idle/error.
|
|
78
|
+
requestSeqRef.current += 1;
|
|
79
|
+
setStatus('idle');
|
|
80
|
+
setError(null);
|
|
81
|
+
}, [clearTimer]);
|
|
82
|
+
const copy = useCallback(async (text) => {
|
|
83
|
+
clearTimer();
|
|
84
|
+
requestSeqRef.current += 1;
|
|
85
|
+
const requestId = requestSeqRef.current;
|
|
86
|
+
let succeeded = false;
|
|
87
|
+
let copyError = null;
|
|
88
|
+
try {
|
|
89
|
+
succeeded = await writeViaClipboardApi(text);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
copyError = err instanceof Error ? err : new Error(String(err));
|
|
93
|
+
}
|
|
94
|
+
if (!succeeded && copyError === null) {
|
|
95
|
+
try {
|
|
96
|
+
succeeded = writeViaExecCommand(text);
|
|
97
|
+
if (!succeeded) {
|
|
98
|
+
copyError = new Error('Copy command was rejected by the browser.');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
copyError = err instanceof Error ? err : new Error(String(err));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// A newer call (or `reset`) has started — drop this result on the
|
|
106
|
+
// floor so it does not race the active state.
|
|
107
|
+
if (requestId !== requestSeqRef.current) {
|
|
108
|
+
return succeeded;
|
|
109
|
+
}
|
|
110
|
+
if (succeeded) {
|
|
111
|
+
setError(null);
|
|
112
|
+
setStatus('copied');
|
|
113
|
+
timerRef.current = setTimeout(() => {
|
|
114
|
+
timerRef.current = null;
|
|
115
|
+
// Guard the timer too: another copy may have started during the
|
|
116
|
+
// window and bumped the sequence. We still clear the timer ref,
|
|
117
|
+
// but only flip back to idle if the timer belonged to the
|
|
118
|
+
// current request.
|
|
119
|
+
if (requestId === requestSeqRef.current) {
|
|
120
|
+
setStatus('idle');
|
|
121
|
+
}
|
|
122
|
+
}, timeoutRef.current);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
setError(copyError ?? new Error('Clipboard API is not available.'));
|
|
126
|
+
setStatus('error');
|
|
127
|
+
return false;
|
|
128
|
+
}, [clearTimer]);
|
|
129
|
+
useEffect(() => {
|
|
130
|
+
return () => {
|
|
131
|
+
if (timerRef.current !== null) {
|
|
132
|
+
clearTimeout(timerRef.current);
|
|
133
|
+
timerRef.current = null;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
}, []);
|
|
137
|
+
return {
|
|
138
|
+
status,
|
|
139
|
+
copied: status === 'copied',
|
|
140
|
+
error,
|
|
141
|
+
copy,
|
|
142
|
+
reset,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export { useClipboard };
|
|
147
|
+
//# sourceMappingURL=useClipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClipboard.js","sources":["../../../../../src/hooks/useClipboard/useClipboard.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AASA;AAEA;;AAGI;;AAGA;;;AAGF;AACF;AAEA;;AACuC;;AAGrC;AACA;AACA;AACA;AACA;AACA;;;AAIA;AACE;;AACA;;;AAGF;AACA;AACF;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACG;AAGJ;;;AAKA;AACA;;;;;AAKA;;AAGE;AACF;AAEA;AACE;AACE;AACA;;;AAIJ;AACE;;;AAGA;;;AAGF;;AAII;AAEA;AACA;;;AAKA;AACE;;;AAEA;;AAGF;AACE;AACE;;AAEE;;;;AAGF;;;;;AAMJ;AACE;;;;;AAMA;AACE;;;;;AAKA;;;AAGF;AACA;;;;AAKF;AACF;;AAKA;AACE;AACE;AACA;;AAEJ;;;;;;;;;AAUJ;;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
3
|
+
import { devWarn } from '../../utils/devWarn.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Manage a value that may be either controlled (via prop) or uncontrolled
|
|
7
|
+
* (managed internally with a default).
|
|
8
|
+
*
|
|
9
|
+
* Returns a `[value, setValue]` tuple just like `useState`. When
|
|
10
|
+
* `options.value` is defined the state is read from there and `setValue`
|
|
11
|
+
* becomes a pure side-effect callback that calls `onChange` only — internal
|
|
12
|
+
* state is never mutated. When `options.value` is undefined the hook owns the
|
|
13
|
+
* state and `setValue` updates it as well as calls `onChange`.
|
|
14
|
+
*
|
|
15
|
+
* Switching between controlled and uncontrolled within a component's lifetime
|
|
16
|
+
* is a known pitfall (matches React's own warning for `<input value/defaultValue>`).
|
|
17
|
+
* The hook emits a development-only warning when this happens.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const [value, setValue] = useControlledState({
|
|
22
|
+
* value: props.value,
|
|
23
|
+
* defaultValue: props.defaultValue,
|
|
24
|
+
* onChange: props.onChange,
|
|
25
|
+
* fallback: '',
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function useControlledState(options) {
|
|
30
|
+
const { value, defaultValue, onChange, fallback } = options;
|
|
31
|
+
const isControlled = value !== undefined;
|
|
32
|
+
// Only `undefined` means "no defaultValue given" — `null` is a legal value
|
|
33
|
+
// for generic T (e.g. `string | null`) and must not be replaced by fallback.
|
|
34
|
+
const [internalValue, setInternalValue] = useState(
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
36
|
+
defaultValue !== undefined ? defaultValue : fallback);
|
|
37
|
+
// Stable refs to avoid stale closures and unnecessary identity changes.
|
|
38
|
+
const onChangeRef = useRef(onChange);
|
|
39
|
+
const internalValueRef = useRef(internalValue);
|
|
40
|
+
const isControlledRef = useRef(isControlled);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
onChangeRef.current = onChange;
|
|
43
|
+
}, [onChange]);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
internalValueRef.current = internalValue;
|
|
46
|
+
}, [internalValue]);
|
|
47
|
+
// Dev-only warning when controlled <-> uncontrolled flips after mount.
|
|
48
|
+
// Mirrors React's behavior for <input value/defaultValue>.
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
const wasControlled = isControlledRef.current;
|
|
51
|
+
if (wasControlled !== isControlled) {
|
|
52
|
+
devWarn(`[useControlledState] Component is changing from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}. ` +
|
|
53
|
+
'Components should not switch between controlled and uncontrolled ' +
|
|
54
|
+
'(or vice versa) during their lifetime. Decide between using a ' +
|
|
55
|
+
'controlled or uncontrolled mode for the lifetime of the component.');
|
|
56
|
+
isControlledRef.current = isControlled;
|
|
57
|
+
}
|
|
58
|
+
}, [isControlled]);
|
|
59
|
+
const setValue = useCallback((next) => {
|
|
60
|
+
const prev = isControlledRef.current
|
|
61
|
+
? value
|
|
62
|
+
: internalValueRef.current;
|
|
63
|
+
const resolved = typeof next === 'function' ? next(prev) : next;
|
|
64
|
+
if (!isControlledRef.current) {
|
|
65
|
+
setInternalValue(resolved);
|
|
66
|
+
internalValueRef.current = resolved;
|
|
67
|
+
}
|
|
68
|
+
onChangeRef.current?.(resolved);
|
|
69
|
+
}, [value]);
|
|
70
|
+
const currentValue = isControlled ? value : internalValue;
|
|
71
|
+
return [currentValue, setValue];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { useControlledState };
|
|
75
|
+
//# sourceMappingURL=useControlledState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useControlledState.js","sources":["../../../../../src/hooks/useControlledState/useControlledState.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAgBA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACG;;AAKJ;;;AAIA;;;;AAMA;AACA;AACA;;AAGE;AACF;;AAGE;AACF;;;;AAKE;AACA;;;;AAOM;AAEJ;;AAEJ;AAEA;AAEI;AACE;AACA;AACF;AAGA;;AAEE;;AAEF;AACF;;AAKF;AACF;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useMemo } from 'react';
|
|
3
|
+
import { useControlledState } from '../useControlledState/useControlledState.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Manage an open/closed state with stable `open`, `close`, `toggle` callbacks.
|
|
7
|
+
*
|
|
8
|
+
* Supports both controlled (driven by an `open` prop) and uncontrolled
|
|
9
|
+
* (managed internally with `defaultOpen`) modes. Built on top of
|
|
10
|
+
* `useControlledState` so the same controlled / uncontrolled rules apply —
|
|
11
|
+
* including the development warning when switching modes mid-life.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const { isOpen, open, close, toggle } = useDisclosure();
|
|
16
|
+
*
|
|
17
|
+
* return (
|
|
18
|
+
* <>
|
|
19
|
+
* <Button onClick={open}>Open</Button>
|
|
20
|
+
* <Dialog open={isOpen} onClose={close}>...</Dialog>
|
|
21
|
+
* </>
|
|
22
|
+
* );
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function useDisclosure(options = {}) {
|
|
26
|
+
const { defaultOpen, open: controlledOpen, onOpenChange } = options;
|
|
27
|
+
const [isOpen, setOpenState] = useControlledState({
|
|
28
|
+
value: controlledOpen,
|
|
29
|
+
defaultValue: defaultOpen,
|
|
30
|
+
onChange: onOpenChange,
|
|
31
|
+
fallback: false,
|
|
32
|
+
});
|
|
33
|
+
const setOpen = useCallback((next) => {
|
|
34
|
+
setOpenState(next);
|
|
35
|
+
}, [setOpenState]);
|
|
36
|
+
const open = useCallback(() => {
|
|
37
|
+
setOpenState(true);
|
|
38
|
+
}, [setOpenState]);
|
|
39
|
+
const close = useCallback(() => {
|
|
40
|
+
setOpenState(false);
|
|
41
|
+
}, [setOpenState]);
|
|
42
|
+
const toggle = useCallback(() => {
|
|
43
|
+
setOpenState(prev => !prev);
|
|
44
|
+
}, [setOpenState]);
|
|
45
|
+
return useMemo(() => ({ isOpen, open, close, toggle, setOpen }), [isOpen, open, close, toggle, setOpen]);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { useDisclosure };
|
|
49
|
+
//# sourceMappingURL=useDisclosure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDisclosure.js","sources":["../../../../../src/hooks/useDisclosure/useDisclosure.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AASA;;;;;;;;;;;;;;;;;;;AAmBG;AACG;;AAKJ;AACE;AACA;AACA;AACA;AACD;AAED;;AAGE;AAIF;;AAEA;AAEA;;AAEA;AAEA;;AAEA;AAEA;AAIF;;"}
|
|
@@ -10,17 +10,17 @@ const FOCUSABLE_SELECTOR = [
|
|
|
10
10
|
'[tabindex]:not([tabindex="-1"])',
|
|
11
11
|
].join(', ');
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Trap focus within a container element. Tab and Shift+Tab cycle through the
|
|
14
|
+
* focusable descendants without escaping the container.
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
* wrapping focus from last to first element and vice versa.
|
|
17
|
-
*
|
|
18
|
-
* @returns onKeyDown handler to attach to the container element
|
|
16
|
+
* Returns a keyboard event handler to attach to the container's `onKeyDown`.
|
|
19
17
|
*
|
|
20
18
|
* @example
|
|
21
19
|
* ```tsx
|
|
22
|
-
* const
|
|
23
|
-
*
|
|
20
|
+
* const ref = useRef<HTMLDivElement>(null);
|
|
21
|
+
* const handleKeyDown = useFocusTrap({ containerRef: ref, enabled: isOpen });
|
|
22
|
+
*
|
|
23
|
+
* return <div ref={ref} onKeyDown={handleKeyDown}>...</div>;
|
|
24
24
|
* ```
|
|
25
25
|
*/
|
|
26
26
|
function useFocusTrap({ containerRef, enabled = true, }) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusTrap.js","sources":["../../../../../src/hooks/useFocusTrap/useFocusTrap.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIA;;;;;;;AAOC;AAaD;;;;;;;;;;;;;AAaG;AACG;AAIJ;AAEI;;AAEA;AACA;;AAEA;AAIA;;;;AAKA;;AAKA;AACE;;;;;;AAKA;;;;;AAKJ;AAGJ;;"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useRef, useMemo, useEffect } from 'react';
|
|
3
|
+
import { parseShortcut, getPlatform } from '../../utils/platform.js';
|
|
4
|
+
|
|
5
|
+
function isRefObject(value) {
|
|
6
|
+
return (typeof value === 'object' &&
|
|
7
|
+
value !== null &&
|
|
8
|
+
'current' in value);
|
|
9
|
+
}
|
|
10
|
+
function resolveTarget(target) {
|
|
11
|
+
if (target === undefined) {
|
|
12
|
+
return typeof window === 'undefined' ? null : window;
|
|
13
|
+
}
|
|
14
|
+
if (target === null)
|
|
15
|
+
return null;
|
|
16
|
+
if (isRefObject(target))
|
|
17
|
+
return target.current;
|
|
18
|
+
return target;
|
|
19
|
+
}
|
|
20
|
+
const MODIFIERS = new Set(['ctrl', 'cmd', 'meta', 'alt', 'option', 'shift']);
|
|
21
|
+
const KEY_ALIASES = {
|
|
22
|
+
esc: 'escape',
|
|
23
|
+
return: 'enter',
|
|
24
|
+
space: ' ',
|
|
25
|
+
spacebar: ' ',
|
|
26
|
+
up: 'arrowup',
|
|
27
|
+
down: 'arrowdown',
|
|
28
|
+
left: 'arrowleft',
|
|
29
|
+
right: 'arrowright',
|
|
30
|
+
plus: '+',
|
|
31
|
+
};
|
|
32
|
+
function normalizeKey(key) {
|
|
33
|
+
const lower = key.toLowerCase();
|
|
34
|
+
return KEY_ALIASES[lower] ?? lower;
|
|
35
|
+
}
|
|
36
|
+
function parseCombo(combo) {
|
|
37
|
+
const parts = parseShortcut(combo);
|
|
38
|
+
if (parts.length === 0)
|
|
39
|
+
return null;
|
|
40
|
+
const platform = getPlatform();
|
|
41
|
+
const isMac = platform === 'mac';
|
|
42
|
+
let ctrl = false;
|
|
43
|
+
let meta = false;
|
|
44
|
+
let alt = false;
|
|
45
|
+
let shift = false;
|
|
46
|
+
let key = null;
|
|
47
|
+
for (const raw of parts) {
|
|
48
|
+
const lower = raw.toLowerCase();
|
|
49
|
+
if (MODIFIERS.has(lower)) {
|
|
50
|
+
switch (lower) {
|
|
51
|
+
case 'ctrl':
|
|
52
|
+
ctrl = true;
|
|
53
|
+
break;
|
|
54
|
+
case 'cmd':
|
|
55
|
+
// Cmd auto-maps to Ctrl on non-Mac.
|
|
56
|
+
if (isMac) {
|
|
57
|
+
meta = true;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
ctrl = true;
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
case 'meta':
|
|
64
|
+
meta = true;
|
|
65
|
+
break;
|
|
66
|
+
case 'alt':
|
|
67
|
+
case 'option':
|
|
68
|
+
alt = true;
|
|
69
|
+
break;
|
|
70
|
+
case 'shift':
|
|
71
|
+
shift = true;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
key = normalizeKey(raw);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (key === null)
|
|
80
|
+
return null;
|
|
81
|
+
return { ctrl, meta, alt, shift, key };
|
|
82
|
+
}
|
|
83
|
+
function isEditableTarget(target) {
|
|
84
|
+
if (!(target instanceof HTMLElement))
|
|
85
|
+
return false;
|
|
86
|
+
if (target.isContentEditable)
|
|
87
|
+
return true;
|
|
88
|
+
const tag = target.tagName;
|
|
89
|
+
if (tag === 'INPUT') {
|
|
90
|
+
const type = target.type.toLowerCase();
|
|
91
|
+
// Buttons and similar non-text inputs should not block hotkeys.
|
|
92
|
+
const nonEditable = new Set([
|
|
93
|
+
'button',
|
|
94
|
+
'submit',
|
|
95
|
+
'reset',
|
|
96
|
+
'checkbox',
|
|
97
|
+
'radio',
|
|
98
|
+
'file',
|
|
99
|
+
'image',
|
|
100
|
+
'range',
|
|
101
|
+
'color',
|
|
102
|
+
]);
|
|
103
|
+
return !nonEditable.has(type);
|
|
104
|
+
}
|
|
105
|
+
return tag === 'TEXTAREA' || tag === 'SELECT';
|
|
106
|
+
}
|
|
107
|
+
function matches(parsed, event) {
|
|
108
|
+
if (event.ctrlKey !== parsed.ctrl)
|
|
109
|
+
return false;
|
|
110
|
+
if (event.metaKey !== parsed.meta)
|
|
111
|
+
return false;
|
|
112
|
+
if (event.altKey !== parsed.alt)
|
|
113
|
+
return false;
|
|
114
|
+
if (event.shiftKey !== parsed.shift)
|
|
115
|
+
return false;
|
|
116
|
+
const eventKey = event.key.toLowerCase();
|
|
117
|
+
return eventKey === parsed.key;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Bind a single keyboard combo to a callback.
|
|
121
|
+
*
|
|
122
|
+
* Combos use the same `+`-separated string format as `MenuBar`'s `shortcut`
|
|
123
|
+
* prop: `"Ctrl+S"`, `"Cmd+Shift+P"`, `"Escape"`. Modifiers: `Ctrl`, `Cmd`
|
|
124
|
+
* (= Meta), `Alt` / `Option`, `Shift`. `Cmd` automatically maps to `Ctrl` on
|
|
125
|
+
* non-Mac platforms via `getPlatform()`.
|
|
126
|
+
*
|
|
127
|
+
* The handler reference is stable — passing a fresh inline function on every
|
|
128
|
+
* render is safe and does not re-subscribe the underlying listener.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```tsx
|
|
132
|
+
* useHotkey('Ctrl+S', e => save(), { preventDefault: true });
|
|
133
|
+
* useHotkey('Escape', () => setOpen(false));
|
|
134
|
+
* useHotkey('Cmd+K', () => openCommandPalette()); // Cmd on Mac, Ctrl elsewhere
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
function useHotkey(combo, handler, options = {}) {
|
|
138
|
+
const { enabled = true, enableInInputs = false, preventDefault = true, stopPropagation = false, target, } = options;
|
|
139
|
+
const handlerRef = useRef(handler);
|
|
140
|
+
handlerRef.current = handler;
|
|
141
|
+
const optionsRef = useRef({
|
|
142
|
+
enabled,
|
|
143
|
+
enableInInputs,
|
|
144
|
+
preventDefault,
|
|
145
|
+
stopPropagation,
|
|
146
|
+
});
|
|
147
|
+
optionsRef.current = {
|
|
148
|
+
enabled,
|
|
149
|
+
enableInInputs,
|
|
150
|
+
preventDefault,
|
|
151
|
+
stopPropagation,
|
|
152
|
+
};
|
|
153
|
+
const parsed = useMemo(() => parseCombo(combo), [combo]);
|
|
154
|
+
const parsedRef = useRef(parsed);
|
|
155
|
+
parsedRef.current = parsed;
|
|
156
|
+
const attachedTargetRef = useRef(null);
|
|
157
|
+
const listenerRef = useRef(null);
|
|
158
|
+
// Runs every render so a ref whose `.current` becomes available after the
|
|
159
|
+
// first render (conditional rendering, lazy children) is picked up. The
|
|
160
|
+
// identity check on the resolved target keeps re-attaches limited to the
|
|
161
|
+
// moments the underlying element actually changes.
|
|
162
|
+
useEffect(() => {
|
|
163
|
+
const desired = enabled && parsed !== null ? resolveTarget(target) : null;
|
|
164
|
+
if (desired === attachedTargetRef.current)
|
|
165
|
+
return;
|
|
166
|
+
if (attachedTargetRef.current && listenerRef.current) {
|
|
167
|
+
attachedTargetRef.current.removeEventListener('keydown', listenerRef.current);
|
|
168
|
+
}
|
|
169
|
+
attachedTargetRef.current = desired;
|
|
170
|
+
if (desired === null) {
|
|
171
|
+
listenerRef.current = null;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const listener = (event) => {
|
|
175
|
+
const ke = event;
|
|
176
|
+
const opts = optionsRef.current;
|
|
177
|
+
const p = parsedRef.current;
|
|
178
|
+
if (p === null || !opts.enabled)
|
|
179
|
+
return;
|
|
180
|
+
if (!matches(p, ke))
|
|
181
|
+
return;
|
|
182
|
+
if (!opts.enableInInputs && isEditableTarget(ke.target))
|
|
183
|
+
return;
|
|
184
|
+
if (opts.preventDefault)
|
|
185
|
+
ke.preventDefault();
|
|
186
|
+
handlerRef.current(ke);
|
|
187
|
+
if (opts.stopPropagation)
|
|
188
|
+
ke.stopPropagation();
|
|
189
|
+
};
|
|
190
|
+
listenerRef.current = listener;
|
|
191
|
+
desired.addEventListener('keydown', listener);
|
|
192
|
+
});
|
|
193
|
+
useEffect(() => () => {
|
|
194
|
+
if (attachedTargetRef.current && listenerRef.current) {
|
|
195
|
+
attachedTargetRef.current.removeEventListener('keydown', listenerRef.current);
|
|
196
|
+
}
|
|
197
|
+
attachedTargetRef.current = null;
|
|
198
|
+
listenerRef.current = null;
|
|
199
|
+
}, []);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export { useHotkey };
|
|
203
|
+
//# sourceMappingURL=useHotkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHotkey.js","sources":["../../../../../src/hooks/useHotkey/useHotkey.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAMA;AACE;AAEE;;AAGJ;AAEA;AACE;AACE;;;AAEmB;;;AAErB;AACF;AAWA;AAEA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGF;AACE;AACA;AACF;AAEA;AACE;AACA;AAAwB;AAExB;AACA;;;;;;AAQA;AACE;AACA;;AAEI;;;AAGA;;;;;;;;;AAQA;;;AAGA;AACA;;;AAGA;;;;;;AAKF;;;;AAIc;;AAEpB;AAEA;AACE;AAAsC;;AACR;AAC9B;AACA;;;AAGE;;;;;;;;;;AAUC;AACD;;AAEF;AACF;AAEA;AACE;AAAmC;AACnC;AAAmC;AACnC;AAAiC;AACjC;AAAqC;;AAGrC;AACF;AAEA;;;;;;;;;;;;;;;;;AAiBG;AACG;;AAaJ;AACA;;;;;;AAOC;;;;;;;AAQD;AACA;AACA;AAEA;AACA;;;;;;AAOE;AACA;;;;;AAQA;AACA;AACE;;;AAIF;;AAEE;AACA;AACA;;AACA;;;;;;AAIA;;;AAEF;AACA;AACA;AACF;AAEA;;;;AAQI;AACA;;AAIN;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useCallback, useEffect, useMemo } from 'react';
|
|
3
|
+
import { updateState, mapInnerStateToState } from './utils.js';
|
|
4
|
+
export { isKeyPressed, isModifierKey } from './utils.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hook for tracking keyboard state including modifier keys and pressed keys.
|
|
8
|
+
*
|
|
9
|
+
* Useful for components that need to respond to keyboard modifiers like
|
|
10
|
+
* Ctrl+drag for snapping, Shift+drag for precision, etc.
|
|
11
|
+
* @returns Current keyboard state
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* // Track all keys and modifiers
|
|
16
|
+
* const keyboard = useKeyboard();
|
|
17
|
+
*
|
|
18
|
+
* const handleMouseMove = (e: MouseEvent) => {
|
|
19
|
+
* if (keyboard.ctrl) {
|
|
20
|
+
* // Snap to grid
|
|
21
|
+
* } else if (keyboard.shift) {
|
|
22
|
+
* // Precision mode
|
|
23
|
+
* }
|
|
24
|
+
* };
|
|
25
|
+
*
|
|
26
|
+
* // Track only specific keys
|
|
27
|
+
* const keyboard = useKeyboard({
|
|
28
|
+
* trackAllKeys: false,
|
|
29
|
+
* trackedKeys: ['Space', 'Enter', 'Escape']
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // Check if specific key is pressed
|
|
33
|
+
* const isSpacePressed = keyboard.pressedKeys.includes('Space');
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
const useKeyboard = () => {
|
|
37
|
+
const [keyboardState, setKeyboardState] = useState(new Set());
|
|
38
|
+
const handleKeyDown = useCallback((event) => {
|
|
39
|
+
setKeyboardState(prevState => updateState(prevState, event));
|
|
40
|
+
}, []);
|
|
41
|
+
const handleKeyUp = useCallback((event) => {
|
|
42
|
+
setKeyboardState(prevState => updateState(prevState, event));
|
|
43
|
+
}, []);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
46
|
+
window.addEventListener('keyup', handleKeyUp);
|
|
47
|
+
return () => {
|
|
48
|
+
window.removeEventListener('keydown', handleKeyDown);
|
|
49
|
+
window.removeEventListener('keyup', handleKeyUp);
|
|
50
|
+
};
|
|
51
|
+
}, [handleKeyDown, handleKeyUp]);
|
|
52
|
+
return useMemo(() => mapInnerStateToState(keyboardState), [keyboardState]);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { useKeyboard };
|
|
56
|
+
//# sourceMappingURL=useKeyboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboard.js","sources":["../../../../../src/hooks/useKeyboard/useKeyboard.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;AACI;AACL;AAIA;AACE;;AAGF;AACE;;;AAIA;AACA;AAEA;AACE;AACA;AACF;AACF;AAEA;AACF;;"}
|