@usefragments/ui 1.6.0 → 1.7.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/README.md +4 -4
- package/dist/assets/fragments-wordmark.cjs +2 -2
- package/dist/assets/fragments-wordmark.d.ts.map +1 -1
- package/dist/assets/fragments-wordmark.js +2 -2
- package/dist/assets/ui.css +4720 -4159
- package/dist/chart.cjs +24 -6
- package/dist/chart.js +24 -6
- package/dist/codeblock.cjs +55 -29
- package/dist/codeblock.js +55 -29
- package/dist/colorpicker.cjs +3 -1
- package/dist/colorpicker.js +3 -1
- package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
- package/dist/components/Accordion/Accordion.module.scss.js +8 -8
- package/dist/components/Alert/Alert.module.scss.cjs +15 -12
- package/dist/components/Alert/Alert.module.scss.js +15 -12
- package/dist/components/Alert/index.cjs +7 -1
- package/dist/components/Alert/index.d.ts +12 -6
- package/dist/components/Alert/index.d.ts.map +1 -1
- package/dist/components/Alert/index.js +7 -1
- package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
- package/dist/components/AppShell/AppShell.module.scss.js +14 -14
- package/dist/components/Avatar/Avatar.module.scss.cjs +14 -14
- package/dist/components/Avatar/Avatar.module.scss.js +14 -14
- package/dist/components/Badge/Badge.module.scss.cjs +19 -19
- package/dist/components/Badge/Badge.module.scss.js +19 -19
- package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
- package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
- package/dist/components/Box/Box.module.scss.cjs +152 -152
- package/dist/components/Box/Box.module.scss.js +152 -152
- package/dist/components/Box/index.cjs +64 -75
- package/dist/components/Box/index.d.ts +16 -16
- package/dist/components/Box/index.d.ts.map +1 -1
- package/dist/components/Box/index.js +64 -75
- package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +8 -8
- package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +8 -8
- package/dist/components/Button/Button.module.scss.cjs +14 -14
- package/dist/components/Button/Button.module.scss.js +14 -14
- package/dist/components/Card/Card.module.scss.cjs +29 -17
- package/dist/components/Card/Card.module.scss.js +30 -18
- package/dist/components/Card/index.cjs +8 -0
- package/dist/components/Card/index.d.ts +12 -2
- package/dist/components/Card/index.d.ts.map +1 -1
- package/dist/components/Card/index.js +8 -0
- package/dist/components/Chart/Chart.module.scss.cjs +15 -15
- package/dist/components/Chart/Chart.module.scss.js +15 -15
- package/dist/components/Chart/index.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.scss.cjs +9 -9
- package/dist/components/Checkbox/Checkbox.module.scss.js +9 -9
- package/dist/components/Checkbox/index.cjs +2 -2
- package/dist/components/Checkbox/index.d.ts.map +1 -1
- package/dist/components/Checkbox/index.js +2 -2
- package/dist/components/Chip/Chip.module.scss.cjs +15 -15
- package/dist/components/Chip/Chip.module.scss.js +15 -15
- package/dist/components/Chip/index.cjs +2 -1
- package/dist/components/Chip/index.d.ts.map +1 -1
- package/dist/components/Chip/index.js +2 -1
- package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +26 -23
- package/dist/components/CodeBlock/CodeBlock.module.scss.js +26 -23
- package/dist/components/CodeBlock/css-variables-theme.cjs +98 -0
- package/dist/components/CodeBlock/css-variables-theme.d.ts +27 -0
- package/dist/components/CodeBlock/css-variables-theme.d.ts.map +1 -0
- package/dist/components/CodeBlock/css-variables-theme.js +98 -0
- package/dist/components/CodeBlock/index.d.ts +17 -3
- package/dist/components/CodeBlock/index.d.ts.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.scss.cjs +9 -9
- package/dist/components/Collapsible/Collapsible.module.scss.js +9 -9
- package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
- package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
- package/dist/components/ColorPicker/index.d.ts.map +1 -1
- package/dist/components/Combobox/Combobox.module.scss.cjs +21 -21
- package/dist/components/Combobox/Combobox.module.scss.js +21 -21
- package/dist/components/Combobox/index.cjs +17 -1
- package/dist/components/Combobox/index.d.ts.map +1 -1
- package/dist/components/Combobox/index.js +17 -1
- package/dist/components/Command/Command.module.scss.cjs +11 -11
- package/dist/components/Command/Command.module.scss.js +11 -11
- package/dist/components/Command/index.cjs +26 -15
- package/dist/components/Command/index.d.ts +2 -2
- package/dist/components/Command/index.d.ts.map +1 -1
- package/dist/components/Command/index.js +26 -15
- package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
- package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
- package/dist/components/DataTable/DataTable.icons.cjs +6 -33
- package/dist/components/DataTable/DataTable.icons.d.ts.map +1 -1
- package/dist/components/DataTable/DataTable.icons.js +6 -33
- package/dist/components/DataTable/DataTable.module.scss.cjs +27 -27
- package/dist/components/DataTable/DataTable.module.scss.js +27 -27
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.module.scss.cjs +33 -33
- package/dist/components/DatePicker/DatePicker.module.scss.js +33 -33
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
- package/dist/components/Dialog/Dialog.module.scss.js +14 -14
- package/dist/components/Dialog/index.cjs +11 -14
- package/dist/components/Dialog/index.d.ts +7 -7
- package/dist/components/Dialog/index.d.ts.map +1 -1
- package/dist/components/Dialog/index.js +11 -14
- package/dist/components/Drawer/Drawer.module.scss.cjs +29 -29
- package/dist/components/Drawer/Drawer.module.scss.js +29 -29
- package/dist/components/Editor/Editor.module.scss.cjs +17 -17
- package/dist/components/Editor/Editor.module.scss.js +17 -17
- package/dist/components/Editor/index.d.ts +10 -10
- package/dist/components/Editor/index.d.ts.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.scss.cjs +11 -8
- package/dist/components/EmptyState/EmptyState.module.scss.js +11 -8
- package/dist/components/EmptyState/index.cjs +8 -6
- package/dist/components/EmptyState/index.d.ts +9 -4
- package/dist/components/EmptyState/index.d.ts.map +1 -1
- package/dist/components/EmptyState/index.js +8 -6
- package/dist/components/Field/Field.module.scss.cjs +5 -5
- package/dist/components/Field/Field.module.scss.js +5 -5
- package/dist/components/Field/index.cjs +9 -1
- package/dist/components/Field/index.d.ts.map +1 -1
- package/dist/components/Field/index.js +9 -1
- package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
- package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
- package/dist/components/Grid/index.cjs +1 -1
- package/dist/components/Grid/index.js +1 -1
- package/dist/components/Header/Header.module.scss.cjs +33 -33
- package/dist/components/Header/Header.module.scss.js +33 -33
- package/dist/components/Header/index.cjs +17 -38
- package/dist/components/Header/index.d.ts +15 -11
- package/dist/components/Header/index.d.ts.map +1 -1
- package/dist/components/Header/index.js +17 -38
- package/dist/components/Icon/Icon.module.scss.cjs +15 -15
- package/dist/components/Icon/Icon.module.scss.js +15 -15
- package/dist/components/IconButton/IconButton.module.scss.cjs +8 -8
- package/dist/components/IconButton/IconButton.module.scss.js +8 -8
- package/dist/components/IconButton/index.cjs +2 -1
- package/dist/components/IconButton/index.d.ts.map +1 -1
- package/dist/components/IconButton/index.js +2 -1
- package/dist/components/Image/Image.module.scss.cjs +27 -27
- package/dist/components/Image/Image.module.scss.js +27 -27
- package/dist/components/Input/Input.module.scss.cjs +17 -17
- package/dist/components/Input/Input.module.scss.js +17 -17
- package/dist/components/Link/Link.module.scss.cjs +14 -10
- package/dist/components/Link/Link.module.scss.js +14 -10
- package/dist/components/Link/index.d.ts +1 -1
- package/dist/components/Link/index.d.ts.map +1 -1
- package/dist/components/List/List.module.scss.cjs +19 -19
- package/dist/components/List/List.module.scss.js +19 -19
- package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
- package/dist/components/Listbox/Listbox.module.scss.js +8 -8
- package/dist/components/Loading/Loading.module.scss.cjs +34 -34
- package/dist/components/Loading/Loading.module.scss.js +34 -34
- package/dist/components/Loading/index.cjs +1 -1
- package/dist/components/Loading/index.js +1 -1
- package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
- package/dist/components/Markdown/Markdown.module.scss.js +1 -1
- package/dist/components/Markdown/index.d.ts +2 -2
- package/dist/components/Markdown/index.d.ts.map +1 -1
- package/dist/components/Menu/Menu.module.scss.cjs +14 -14
- package/dist/components/Menu/Menu.module.scss.js +14 -14
- package/dist/components/Message/Message.module.scss.cjs +18 -18
- package/dist/components/Message/Message.module.scss.js +18 -18
- package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +34 -31
- package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +34 -31
- package/dist/components/NavigationMenu/index.cjs +32 -15
- package/dist/components/NavigationMenu/index.d.ts +12 -6
- package/dist/components/NavigationMenu/index.d.ts.map +1 -1
- package/dist/components/NavigationMenu/index.js +32 -15
- package/dist/components/Pagination/Pagination.module.scss.cjs +10 -10
- package/dist/components/Pagination/Pagination.module.scss.js +10 -10
- package/dist/components/Popover/Popover.module.scss.cjs +10 -10
- package/dist/components/Popover/Popover.module.scss.js +10 -10
- package/dist/components/Progress/Progress.module.scss.cjs +25 -25
- package/dist/components/Progress/Progress.module.scss.js +25 -25
- package/dist/components/Prompt/Prompt.module.scss.cjs +28 -28
- package/dist/components/Prompt/Prompt.module.scss.js +28 -28
- package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +15 -15
- package/dist/components/RadioGroup/RadioGroup.module.scss.js +15 -15
- package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +5 -5
- package/dist/components/ScrollArea/ScrollArea.module.scss.js +5 -5
- package/dist/components/ScrollArea/index.d.ts +4 -4
- package/dist/components/ScrollArea/index.d.ts.map +1 -1
- package/dist/components/ScrollArea/scroll-state.d.ts +5 -5
- package/dist/components/Select/Select.module.scss.cjs +21 -21
- package/dist/components/Select/Select.module.scss.js +21 -21
- package/dist/components/Separator/Separator.module.scss.cjs +11 -11
- package/dist/components/Separator/Separator.module.scss.js +11 -11
- package/dist/components/Sidebar/Sidebar.module.scss.cjs +43 -43
- package/dist/components/Sidebar/Sidebar.module.scss.js +43 -43
- package/dist/components/Sidebar/index.cjs +12 -35
- package/dist/components/Sidebar/index.d.ts +19 -19
- package/dist/components/Sidebar/index.d.ts.map +1 -1
- package/dist/components/Sidebar/index.js +12 -35
- package/dist/components/Skeleton/Skeleton.module.scss.cjs +50 -46
- package/dist/components/Skeleton/Skeleton.module.scss.js +50 -46
- package/dist/components/Slider/Slider.module.scss.cjs +12 -12
- package/dist/components/Slider/Slider.module.scss.js +12 -12
- package/dist/components/Stack/Stack.module.scss.cjs +25 -25
- package/dist/components/Stack/Stack.module.scss.js +25 -25
- package/dist/components/Stack/index.cjs +1 -1
- package/dist/components/Stack/index.js +1 -1
- package/dist/components/Switch/Switch.module.scss.cjs +9 -9
- package/dist/components/Switch/Switch.module.scss.js +9 -9
- package/dist/components/Table/Table.module.scss.cjs +19 -19
- package/dist/components/Table/Table.module.scss.js +19 -19
- package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +15 -15
- package/dist/components/TableOfContents/TableOfContents.module.scss.js +15 -15
- package/dist/components/TableOfContents/index.cjs +13 -9
- package/dist/components/TableOfContents/index.d.ts +5 -3
- package/dist/components/TableOfContents/index.d.ts.map +1 -1
- package/dist/components/TableOfContents/index.js +13 -9
- package/dist/components/Tabs/Tabs.module.scss.cjs +12 -12
- package/dist/components/Tabs/Tabs.module.scss.js +12 -12
- package/dist/components/Tabs/index.cjs +26 -6
- package/dist/components/Tabs/index.d.ts.map +1 -1
- package/dist/components/Tabs/index.js +26 -6
- package/dist/components/Text/Text.module.scss.cjs +87 -75
- package/dist/components/Text/Text.module.scss.js +87 -75
- package/dist/components/Text/index.cjs +49 -41
- package/dist/components/Text/index.d.ts +12 -11
- package/dist/components/Text/index.d.ts.map +1 -1
- package/dist/components/Text/index.js +49 -41
- package/dist/components/Textarea/Textarea.module.scss.cjs +24 -24
- package/dist/components/Textarea/Textarea.module.scss.js +24 -24
- package/dist/components/Theme/index.cjs +2 -1
- package/dist/components/Theme/index.d.ts.map +1 -1
- package/dist/components/Theme/index.js +2 -1
- package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +9 -6
- package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +9 -6
- package/dist/components/ThemeToggle/index.cjs +31 -6
- package/dist/components/ThemeToggle/index.d.ts +7 -2
- package/dist/components/ThemeToggle/index.d.ts.map +1 -1
- package/dist/components/ThemeToggle/index.js +32 -7
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +13 -13
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +13 -13
- package/dist/components/Toast/Toast.module.scss.cjs +20 -20
- package/dist/components/Toast/Toast.module.scss.js +20 -20
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
- package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
- package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
- package/dist/components/Tooltip/index.cjs +24 -40
- package/dist/components/Tooltip/index.d.ts +4 -4
- package/dist/components/Tooltip/index.d.ts.map +1 -1
- package/dist/components/Tooltip/index.js +24 -40
- package/dist/components/VisuallyHidden/index.d.ts +2 -2
- package/dist/data-table.cjs +2 -1
- package/dist/data-table.js +2 -1
- package/dist/datepicker.cjs +3 -2
- package/dist/datepicker.js +3 -2
- package/dist/editor.cjs +68 -28
- package/dist/editor.js +68 -28
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/markdown.cjs +21 -29
- package/dist/markdown.js +21 -29
- package/dist/measurements/generated.cjs +9 -1
- package/dist/measurements/generated.d.ts +7 -0
- package/dist/measurements/generated.d.ts.map +1 -1
- package/dist/measurements/generated.js +9 -1
- package/dist/utils/a11y.cjs +5 -2
- package/dist/utils/a11y.d.ts +5 -5
- package/dist/utils/a11y.d.ts.map +1 -1
- package/dist/utils/a11y.js +5 -2
- package/dist/utils/canonical-stamp.cjs +2 -8
- package/dist/utils/canonical-stamp.d.ts.map +1 -1
- package/dist/utils/canonical-stamp.js +1 -7
- package/dist/utils/css-warning.cjs +1 -1
- package/dist/utils/css-warning.js +1 -1
- package/dist/utils/env.cjs +17 -0
- package/dist/utils/env.d.ts +3 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +17 -0
- package/dist/utils/keyboard-shortcuts.cjs +3 -10
- package/dist/utils/keyboard-shortcuts.d.ts +4 -4
- package/dist/utils/keyboard-shortcuts.d.ts.map +1 -1
- package/dist/utils/keyboard-shortcuts.js +3 -10
- package/dist/utils/seed-derivation.cjs +10 -6
- package/dist/utils/seed-derivation.d.ts.map +1 -1
- package/dist/utils/seed-derivation.js +10 -6
- package/fragments.json +1 -1
- package/package.json +6 -4
- package/src/assets/fragments-logo.tsx +2 -2
- package/src/assets/fragments-wordmark.tsx +4 -2
- package/src/components/Accordion/Accordion.contract.json +24 -48
- package/src/components/Alert/Alert.contract.json +37 -53
- package/src/components/Alert/Alert.module.scss +24 -0
- package/src/components/Alert/index.tsx +55 -29
- package/src/components/AppShell/AppShell.contract.json +34 -51
- package/src/components/AppShell/AppShell.module.scss +53 -40
- package/src/components/Avatar/Avatar.contract.json +31 -48
- package/src/components/Avatar/Avatar.module.scss +4 -1
- package/src/components/Badge/Badge.contract.json +37 -42
- package/src/components/Badge/Badge.module.scss +9 -2
- package/src/components/BentoGrid/BentoGrid.contract.json +21 -45
- package/src/components/Box/Box.contract.json +40 -148
- package/src/components/Box/index.tsx +92 -99
- package/src/components/Breadcrumbs/Breadcrumbs.contract.json +21 -34
- package/src/components/Breadcrumbs/Breadcrumbs.module.scss +12 -7
- package/src/components/Button/Button.module.scss +8 -7
- package/src/components/ButtonGroup/ButtonGroup.contract.json +32 -47
- package/src/components/Card/Card.module.scss +82 -1
- package/src/components/Card/index.tsx +21 -2
- package/src/components/Chart/Chart.contract.json +21 -29
- package/src/components/Chart/index.tsx +36 -6
- package/src/components/Checkbox/Checkbox.contract.json +24 -24
- package/src/components/Checkbox/Checkbox.module.scss +32 -23
- package/src/components/Checkbox/index.tsx +4 -2
- package/src/components/Chip/Chip.contract.json +33 -40
- package/src/components/Chip/Chip.module.scss +2 -2
- package/src/components/Chip/index.tsx +2 -1
- package/src/components/CodeBlock/CodeBlock.contract.json +46 -76
- package/src/components/CodeBlock/CodeBlock.module.scss +40 -15
- package/src/components/CodeBlock/css-variables-theme.ts +102 -0
- package/src/components/CodeBlock/index.tsx +91 -35
- package/src/components/Collapsible/Collapsible.contract.json +21 -36
- package/src/components/ColorPicker/ColorPicker.contract.json +29 -48
- package/src/components/ColorPicker/ColorPicker.module.scss +15 -12
- package/src/components/ColorPicker/index.tsx +5 -1
- package/src/components/Combobox/Combobox.contract.json +36 -37
- package/src/components/Combobox/Combobox.module.scss +1 -1
- package/src/components/Combobox/index.tsx +31 -5
- package/src/components/Command/Command.contract.json +21 -43
- package/src/components/Command/index.tsx +58 -47
- package/src/components/ConversationList/ConversationList.contract.json +27 -32
- package/src/components/DataTable/DataTable.icons.tsx +4 -21
- package/src/components/DataTable/DataTable.module.scss +12 -8
- package/src/components/DataTable/index.tsx +8 -7
- package/src/components/DatePicker/DatePicker.contract.json +27 -28
- package/src/components/DatePicker/DatePicker.module.scss +12 -5
- package/src/components/DatePicker/index.tsx +5 -2
- package/src/components/Dialog/Dialog.module.scss +3 -3
- package/src/components/Dialog/index.tsx +47 -37
- package/src/components/Drawer/Drawer.contract.json +22 -36
- package/src/components/Editor/Editor.contract.json +31 -48
- package/src/components/Editor/Editor.module.scss +36 -14
- package/src/components/Editor/index.tsx +240 -179
- package/src/components/EmptyState/EmptyState.contract.json +31 -43
- package/src/components/EmptyState/EmptyState.module.scss +8 -0
- package/src/components/EmptyState/index.tsx +48 -23
- package/src/components/Field/Field.contract.json +28 -46
- package/src/components/Field/index.tsx +5 -1
- package/src/components/Fieldset/Fieldset.contract.json +21 -38
- package/src/components/Fieldset/Fieldset.module.scss +10 -3
- package/src/components/Form/Form.contract.json +20 -20
- package/src/components/Grid/Grid.contract.json +28 -64
- package/src/components/Grid/index.tsx +10 -10
- package/src/components/Header/Header.contract.json +31 -67
- package/src/components/Header/Header.module.scss +36 -21
- package/src/components/Header/index.tsx +134 -122
- package/src/components/Icon/Icon.contract.json +22 -62
- package/src/components/IconButton/IconButton.contract.json +34 -18
- package/src/components/IconButton/IconButton.module.scss +6 -7
- package/src/components/IconButton/index.tsx +2 -1
- package/src/components/Image/Image.contract.json +23 -56
- package/src/components/Input/Input.contract.json +26 -32
- package/src/components/Input/Input.module.scss +3 -2
- package/src/components/Link/Link.contract.json +32 -52
- package/src/components/Link/Link.module.scss +23 -6
- package/src/components/Link/index.tsx +1 -1
- package/src/components/List/List.contract.json +23 -52
- package/src/components/List/List.module.scss +1 -1
- package/src/components/Listbox/Listbox.contract.json +21 -37
- package/src/components/Loading/Loading.contract.json +37 -61
- package/src/components/Loading/Loading.module.scss +10 -7
- package/src/components/Loading/index.tsx +2 -2
- package/src/components/Main/Main.contract.json +17 -9
- package/src/components/Markdown/Markdown.contract.json +22 -43
- package/src/components/Markdown/Markdown.module.scss +43 -5
- package/src/components/Markdown/index.tsx +48 -49
- package/src/components/Menu/Menu.contract.json +25 -41
- package/src/components/Menu/Menu.module.scss +23 -8
- package/src/components/Message/Message.contract.json +29 -52
- package/src/components/Message/Message.module.scss +12 -5
- package/src/components/NavigationMenu/NavigationMenu.contract.json +36 -45
- package/src/components/NavigationMenu/NavigationMenu.module.scss +64 -19
- package/src/components/NavigationMenu/index.tsx +105 -81
- package/src/components/Pagination/Pagination.contract.json +22 -40
- package/src/components/Pagination/Pagination.module.scss +2 -2
- package/src/components/Popover/Popover.contract.json +24 -46
- package/src/components/Popover/Popover.module.scss +6 -5
- package/src/components/Progress/Progress.contract.json +32 -28
- package/src/components/Progress/Progress.module.scss +3 -2
- package/src/components/Prompt/Prompt.contract.json +31 -47
- package/src/components/Prompt/Prompt.module.scss +13 -5
- package/src/components/RadioGroup/RadioGroup.contract.json +23 -24
- package/src/components/RadioGroup/RadioGroup.module.scss +13 -14
- package/src/components/ScrollArea/ScrollArea.contract.json +18 -19
- package/src/components/ScrollArea/ScrollArea.module.scss +15 -15
- package/src/components/ScrollArea/index.tsx +16 -16
- package/src/components/ScrollArea/scroll-state.ts +24 -24
- package/src/components/Select/Select.module.scss +2 -2
- package/src/components/Separator/Separator.contract.json +24 -48
- package/src/components/Sidebar/Sidebar.contract.json +35 -67
- package/src/components/Sidebar/Sidebar.module.scss +22 -13
- package/src/components/Sidebar/index.tsx +164 -164
- package/src/components/Skeleton/Skeleton.contract.json +28 -54
- package/src/components/Skeleton/Skeleton.module.scss +27 -10
- package/src/components/Slider/Slider.contract.json +27 -39
- package/src/components/Slider/Slider.module.scss +3 -3
- package/src/components/Stack/Stack.contract.json +29 -56
- package/src/components/Stack/Stack.module.scss +13 -12
- package/src/components/Stack/index.tsx +3 -3
- package/src/components/Switch/Switch.contract.json +33 -46
- package/src/components/Switch/Switch.module.scss +64 -26
- package/src/components/Table/Table.contract.json +28 -46
- package/src/components/Table/Table.module.scss +15 -3
- package/src/components/TableOfContents/TableOfContents.contract.json +34 -21
- package/src/components/TableOfContents/TableOfContents.module.scss +15 -5
- package/src/components/TableOfContents/index.tsx +26 -9
- package/src/components/Tabs/Tabs.contract.json +24 -45
- package/src/components/Tabs/Tabs.module.scss +1 -1
- package/src/components/Tabs/index.tsx +15 -3
- package/src/components/Text/Text.contract.json +30 -72
- package/src/components/Text/Text.module.scss +21 -4
- package/src/components/Text/index.tsx +113 -75
- package/src/components/Textarea/Textarea.contract.json +25 -43
- package/src/components/Textarea/Textarea.module.scss +2 -4
- package/src/components/Theme/Theme.contract.json +32 -51
- package/src/components/Theme/index.tsx +2 -1
- package/src/components/ThemeToggle/ThemeToggle.module.scss +23 -7
- package/src/components/ThemeToggle/index.tsx +43 -7
- package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +23 -40
- package/src/components/Toast/Toast.contract.json +30 -40
- package/src/components/Toast/Toast.module.scss +1 -1
- package/src/components/ToggleGroup/ToggleGroup.contract.json +29 -30
- package/src/components/ToggleGroup/ToggleGroup.module.scss +38 -5
- package/src/components/Tooltip/Tooltip.contract.json +31 -52
- package/src/components/Tooltip/index.tsx +19 -24
- package/src/components/VisuallyHidden/VisuallyHidden.contract.json +22 -44
- package/src/components/VisuallyHidden/index.tsx +5 -5
- package/src/index.ts +2 -2
- package/src/measurements/generated.ts +9 -2
- package/src/measurements/measurements.json +7 -0
- package/src/recipes/_boolean-range.scss +3 -11
- package/src/recipes/_field.scss +5 -1
- package/src/recipes/_layout.scss +14 -7
- package/src/recipes/_popup.scss +12 -2
- package/src/recipes/_prose.scss +13 -5
- package/src/recipes/_table-chrome.scss +16 -2
- package/src/scss.d.ts +1 -1
- package/src/styles/globals.scss +20 -19
- package/src/tokens/_computed.scss +5 -16
- package/src/tokens/_derive.scss +112 -210
- package/src/tokens/_measurements.catalog.generated.css +6 -1
- package/src/tokens/_measurements.generated.scss +14 -1
- package/src/tokens/_mixins.scss +7 -8
- package/src/tokens/_palettes.scss +39 -167
- package/src/tokens/_seeds.scss +20 -20
- package/src/tokens/_variables.scss +183 -38
- package/src/utils/a11y.tsx +69 -69
- package/src/utils/aria.ts +3 -3
- package/src/utils/canonical-stamp.ts +2 -12
- package/src/utils/css-warning.ts +7 -7
- package/src/utils/env.ts +25 -0
- package/src/utils/keyboard-shortcuts.ts +131 -126
- package/src/utils/seed-derivation.ts +10 -6
- package/src/components/Button/Button.contract.json +0 -218
- package/src/components/Card/Card.contract.json +0 -175
- package/src/components/DataTable/DataTable.contract.json +0 -302
- package/src/components/Dialog/Dialog.contract.json +0 -159
- package/src/components/Select/Select.contract.json +0 -259
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isProductionBuild } from "./env";
|
|
2
|
+
|
|
1
3
|
export type FragmentsCanonicalStampProps = {
|
|
2
4
|
"data-fc-canonical"?: string;
|
|
3
5
|
"data-fc-slot"?: string;
|
|
@@ -33,15 +35,3 @@ export function fragmentsCanonicalStampProps(
|
|
|
33
35
|
"data-fc-contract": `source:@usefragments/ui#${component}`,
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
|
-
|
|
37
|
-
function isProductionBuild(): boolean {
|
|
38
|
-
try {
|
|
39
|
-
// Bundlers statically replace this member expression, so production builds
|
|
40
|
-
// collapse to `"production" === "production"` and the stamp drops out. When
|
|
41
|
-
// `process` is genuinely absent (unbundled browser), the reference throws
|
|
42
|
-
// and we treat it as non-production (emit).
|
|
43
|
-
return process.env.NODE_ENV === "production";
|
|
44
|
-
} catch {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
package/src/utils/css-warning.ts
CHANGED
|
@@ -5,24 +5,24 @@
|
|
|
5
5
|
let hasChecked = false;
|
|
6
6
|
|
|
7
7
|
export function checkCssLoaded(): void {
|
|
8
|
-
if (hasChecked || typeof window ===
|
|
8
|
+
if (hasChecked || typeof window === "undefined") return;
|
|
9
9
|
hasChecked = true;
|
|
10
10
|
|
|
11
11
|
// Defer check to after styles have loaded
|
|
12
12
|
requestAnimationFrame(() => {
|
|
13
13
|
const root = document.documentElement;
|
|
14
|
-
const value = getComputedStyle(root).getPropertyValue(
|
|
14
|
+
const value = getComputedStyle(root).getPropertyValue("--fui-text-primary").trim();
|
|
15
15
|
|
|
16
16
|
if (!value) {
|
|
17
17
|
console.warn(
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
"[Fragments UI] Component styles not loaded. Components will render unstyled.\n\n" +
|
|
19
|
+
"Add this import to your app entry point (e.g., main.tsx, layout.tsx):\n\n" +
|
|
20
20
|
" import '@usefragments/ui/styles';\n\n" +
|
|
21
|
-
|
|
21
|
+
"Next.js users also need:\n\n" +
|
|
22
22
|
" // next.config.ts\n" +
|
|
23
23
|
" transpilePackages: ['@usefragments/ui']\n\n" +
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
"Or run: npx @usefragments/cli setup\n\n" +
|
|
25
|
+
"Docs: https://usefragments.com/components/install"
|
|
26
26
|
);
|
|
27
27
|
}
|
|
28
28
|
});
|
package/src/utils/env.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build-mode guards for dev-only warnings.
|
|
3
|
+
*
|
|
4
|
+
* Bundlers replace the `process.env.NODE_ENV` member expression statically, so production
|
|
5
|
+
* builds fold these to constants and the guarded code drops out. The local declaration keeps
|
|
6
|
+
* source-registry installs compiling in apps without Node types; when `process` is genuinely
|
|
7
|
+
* absent at runtime (unbundled browser), the reference throws and we treat it as development.
|
|
8
|
+
*/
|
|
9
|
+
declare const process: { env: { NODE_ENV?: string } };
|
|
10
|
+
|
|
11
|
+
function nodeEnv(): string | undefined {
|
|
12
|
+
try {
|
|
13
|
+
return process.env.NODE_ENV;
|
|
14
|
+
} catch {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function isProductionBuild(): boolean {
|
|
20
|
+
return nodeEnv() === "production";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function isDevelopmentBuild(): boolean {
|
|
24
|
+
return nodeEnv() === "development";
|
|
25
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
3
|
// ============================================
|
|
4
4
|
// Keyboard Shortcuts Registry
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// configureShortcuts({ SIDEBAR_TOGGLE: null }) // disable
|
|
21
21
|
//
|
|
22
22
|
|
|
23
|
-
import { useEffect, useRef, type RefObject } from
|
|
23
|
+
import { useEffect, useRef, type RefObject } from "react";
|
|
24
24
|
|
|
25
25
|
// ============================================
|
|
26
26
|
// Types
|
|
@@ -46,7 +46,7 @@ export interface KeyboardShortcut {
|
|
|
46
46
|
* - 'global': Listens on document (e.g., sidebar toggle)
|
|
47
47
|
* - 'component': Only active when component is focused/mounted
|
|
48
48
|
*/
|
|
49
|
-
scope:
|
|
49
|
+
scope: "global" | "component";
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
// ============================================
|
|
@@ -56,176 +56,176 @@ export interface KeyboardShortcut {
|
|
|
56
56
|
export const KEYBOARD_SHORTCUTS = {
|
|
57
57
|
// ----- Sidebar -----
|
|
58
58
|
SIDEBAR_TOGGLE: {
|
|
59
|
-
key:
|
|
59
|
+
key: "b",
|
|
60
60
|
meta: true,
|
|
61
|
-
label:
|
|
62
|
-
component:
|
|
63
|
-
description:
|
|
64
|
-
scope:
|
|
61
|
+
label: "Ctrl+B",
|
|
62
|
+
component: "Sidebar",
|
|
63
|
+
description: "Toggle sidebar collapse/expand",
|
|
64
|
+
scope: "global",
|
|
65
65
|
},
|
|
66
66
|
SIDEBAR_CLOSE_MOBILE: {
|
|
67
|
-
key:
|
|
68
|
-
label:
|
|
69
|
-
component:
|
|
70
|
-
description:
|
|
71
|
-
scope:
|
|
67
|
+
key: "Escape",
|
|
68
|
+
label: "Escape",
|
|
69
|
+
component: "Sidebar",
|
|
70
|
+
description: "Close mobile sidebar drawer",
|
|
71
|
+
scope: "global",
|
|
72
72
|
},
|
|
73
73
|
|
|
74
74
|
// ----- Editor (TipTap handles these natively, metadata for display) -----
|
|
75
75
|
EDITOR_BOLD: {
|
|
76
|
-
key:
|
|
76
|
+
key: "b",
|
|
77
77
|
meta: true,
|
|
78
|
-
label:
|
|
79
|
-
component:
|
|
80
|
-
description:
|
|
81
|
-
scope:
|
|
78
|
+
label: "Ctrl+B",
|
|
79
|
+
component: "Editor",
|
|
80
|
+
description: "Toggle bold formatting",
|
|
81
|
+
scope: "component",
|
|
82
82
|
},
|
|
83
83
|
EDITOR_ITALIC: {
|
|
84
|
-
key:
|
|
84
|
+
key: "i",
|
|
85
85
|
meta: true,
|
|
86
|
-
label:
|
|
87
|
-
component:
|
|
88
|
-
description:
|
|
89
|
-
scope:
|
|
86
|
+
label: "Ctrl+I",
|
|
87
|
+
component: "Editor",
|
|
88
|
+
description: "Toggle italic formatting",
|
|
89
|
+
scope: "component",
|
|
90
90
|
},
|
|
91
91
|
EDITOR_STRIKETHROUGH: {
|
|
92
|
-
key:
|
|
92
|
+
key: "s",
|
|
93
93
|
meta: true,
|
|
94
94
|
shift: true,
|
|
95
|
-
label:
|
|
96
|
-
component:
|
|
97
|
-
description:
|
|
98
|
-
scope:
|
|
95
|
+
label: "Ctrl+Shift+S",
|
|
96
|
+
component: "Editor",
|
|
97
|
+
description: "Toggle strikethrough formatting",
|
|
98
|
+
scope: "component",
|
|
99
99
|
},
|
|
100
100
|
EDITOR_LINK: {
|
|
101
|
-
key:
|
|
101
|
+
key: "k",
|
|
102
102
|
meta: true,
|
|
103
|
-
label:
|
|
104
|
-
component:
|
|
105
|
-
description:
|
|
106
|
-
scope:
|
|
103
|
+
label: "Ctrl+K",
|
|
104
|
+
component: "Editor",
|
|
105
|
+
description: "Insert or edit link",
|
|
106
|
+
scope: "component",
|
|
107
107
|
},
|
|
108
108
|
EDITOR_CODE: {
|
|
109
|
-
key:
|
|
109
|
+
key: "e",
|
|
110
110
|
meta: true,
|
|
111
|
-
label:
|
|
112
|
-
component:
|
|
113
|
-
description:
|
|
114
|
-
scope:
|
|
111
|
+
label: "Ctrl+E",
|
|
112
|
+
component: "Editor",
|
|
113
|
+
description: "Toggle inline code",
|
|
114
|
+
scope: "component",
|
|
115
115
|
},
|
|
116
116
|
EDITOR_BULLET_LIST: {
|
|
117
|
-
key:
|
|
117
|
+
key: "8",
|
|
118
118
|
meta: true,
|
|
119
119
|
shift: true,
|
|
120
|
-
label:
|
|
121
|
-
component:
|
|
122
|
-
description:
|
|
123
|
-
scope:
|
|
120
|
+
label: "Ctrl+Shift+8",
|
|
121
|
+
component: "Editor",
|
|
122
|
+
description: "Toggle bullet list",
|
|
123
|
+
scope: "component",
|
|
124
124
|
},
|
|
125
125
|
EDITOR_ORDERED_LIST: {
|
|
126
|
-
key:
|
|
126
|
+
key: "7",
|
|
127
127
|
meta: true,
|
|
128
128
|
shift: true,
|
|
129
|
-
label:
|
|
130
|
-
component:
|
|
131
|
-
description:
|
|
132
|
-
scope:
|
|
129
|
+
label: "Ctrl+Shift+7",
|
|
130
|
+
component: "Editor",
|
|
131
|
+
description: "Toggle ordered list",
|
|
132
|
+
scope: "component",
|
|
133
133
|
},
|
|
134
134
|
EDITOR_HEADING1: {
|
|
135
|
-
key:
|
|
135
|
+
key: "1",
|
|
136
136
|
meta: true,
|
|
137
137
|
alt: true,
|
|
138
|
-
label:
|
|
139
|
-
component:
|
|
140
|
-
description:
|
|
141
|
-
scope:
|
|
138
|
+
label: "Ctrl+Alt+1",
|
|
139
|
+
component: "Editor",
|
|
140
|
+
description: "Toggle heading level 1",
|
|
141
|
+
scope: "component",
|
|
142
142
|
},
|
|
143
143
|
EDITOR_HEADING2: {
|
|
144
|
-
key:
|
|
144
|
+
key: "2",
|
|
145
145
|
meta: true,
|
|
146
146
|
alt: true,
|
|
147
|
-
label:
|
|
148
|
-
component:
|
|
149
|
-
description:
|
|
150
|
-
scope:
|
|
147
|
+
label: "Ctrl+Alt+2",
|
|
148
|
+
component: "Editor",
|
|
149
|
+
description: "Toggle heading level 2",
|
|
150
|
+
scope: "component",
|
|
151
151
|
},
|
|
152
152
|
EDITOR_HEADING3: {
|
|
153
|
-
key:
|
|
153
|
+
key: "3",
|
|
154
154
|
meta: true,
|
|
155
155
|
alt: true,
|
|
156
|
-
label:
|
|
157
|
-
component:
|
|
158
|
-
description:
|
|
159
|
-
scope:
|
|
156
|
+
label: "Ctrl+Alt+3",
|
|
157
|
+
component: "Editor",
|
|
158
|
+
description: "Toggle heading level 3",
|
|
159
|
+
scope: "component",
|
|
160
160
|
},
|
|
161
161
|
EDITOR_BLOCKQUOTE: {
|
|
162
|
-
key:
|
|
162
|
+
key: "b",
|
|
163
163
|
meta: true,
|
|
164
164
|
shift: true,
|
|
165
|
-
label:
|
|
166
|
-
component:
|
|
167
|
-
description:
|
|
168
|
-
scope:
|
|
165
|
+
label: "Ctrl+Shift+B",
|
|
166
|
+
component: "Editor",
|
|
167
|
+
description: "Toggle blockquote",
|
|
168
|
+
scope: "component",
|
|
169
169
|
},
|
|
170
170
|
EDITOR_UNDO: {
|
|
171
|
-
key:
|
|
171
|
+
key: "z",
|
|
172
172
|
meta: true,
|
|
173
|
-
label:
|
|
174
|
-
component:
|
|
175
|
-
description:
|
|
176
|
-
scope:
|
|
173
|
+
label: "Ctrl+Z",
|
|
174
|
+
component: "Editor",
|
|
175
|
+
description: "Undo last action",
|
|
176
|
+
scope: "component",
|
|
177
177
|
},
|
|
178
178
|
EDITOR_REDO: {
|
|
179
|
-
key:
|
|
179
|
+
key: "z",
|
|
180
180
|
meta: true,
|
|
181
181
|
shift: true,
|
|
182
|
-
label:
|
|
183
|
-
component:
|
|
184
|
-
description:
|
|
185
|
-
scope:
|
|
182
|
+
label: "Ctrl+Shift+Z",
|
|
183
|
+
component: "Editor",
|
|
184
|
+
description: "Redo last undone action",
|
|
185
|
+
scope: "component",
|
|
186
186
|
},
|
|
187
187
|
|
|
188
188
|
// ----- Prompt -----
|
|
189
189
|
PROMPT_SUBMIT: {
|
|
190
|
-
key:
|
|
191
|
-
label:
|
|
192
|
-
component:
|
|
193
|
-
description:
|
|
194
|
-
scope:
|
|
190
|
+
key: "Enter",
|
|
191
|
+
label: "Enter",
|
|
192
|
+
component: "Prompt",
|
|
193
|
+
description: "Submit prompt (when submitOnEnter is true)",
|
|
194
|
+
scope: "component",
|
|
195
195
|
},
|
|
196
196
|
|
|
197
197
|
// ----- NavigationMenu -----
|
|
198
198
|
NAV_TOGGLE: {
|
|
199
|
-
key:
|
|
200
|
-
label:
|
|
201
|
-
component:
|
|
202
|
-
description:
|
|
203
|
-
scope:
|
|
199
|
+
key: "Enter",
|
|
200
|
+
label: "Enter",
|
|
201
|
+
component: "NavigationMenu",
|
|
202
|
+
description: "Toggle menu item open/closed",
|
|
203
|
+
scope: "component",
|
|
204
204
|
},
|
|
205
205
|
NAV_CLOSE: {
|
|
206
|
-
key:
|
|
207
|
-
label:
|
|
208
|
-
component:
|
|
209
|
-
description:
|
|
210
|
-
scope:
|
|
206
|
+
key: "Escape",
|
|
207
|
+
label: "Escape",
|
|
208
|
+
component: "NavigationMenu",
|
|
209
|
+
description: "Close menu and return focus to trigger",
|
|
210
|
+
scope: "component",
|
|
211
211
|
},
|
|
212
212
|
|
|
213
213
|
// ----- Command -----
|
|
214
214
|
COMMAND_SELECT: {
|
|
215
|
-
key:
|
|
216
|
-
label:
|
|
217
|
-
component:
|
|
218
|
-
description:
|
|
219
|
-
scope:
|
|
215
|
+
key: "Enter",
|
|
216
|
+
label: "Enter",
|
|
217
|
+
component: "Command",
|
|
218
|
+
description: "Select active command item",
|
|
219
|
+
scope: "component",
|
|
220
220
|
},
|
|
221
221
|
|
|
222
222
|
// ----- Collapsible -----
|
|
223
223
|
COLLAPSIBLE_TOGGLE: {
|
|
224
|
-
key:
|
|
225
|
-
label:
|
|
226
|
-
component:
|
|
227
|
-
description:
|
|
228
|
-
scope:
|
|
224
|
+
key: "Enter",
|
|
225
|
+
label: "Enter",
|
|
226
|
+
component: "Collapsible",
|
|
227
|
+
description: "Toggle collapsible open/closed",
|
|
228
|
+
scope: "component",
|
|
229
229
|
},
|
|
230
230
|
} as const satisfies Record<string, KeyboardShortcut>;
|
|
231
231
|
|
|
@@ -268,17 +268,17 @@ export function matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut
|
|
|
268
268
|
* Returns "⌘B" on Mac, "Ctrl+B" elsewhere.
|
|
269
269
|
*/
|
|
270
270
|
export function getShortcutLabel(shortcut: KeyboardShortcut): string {
|
|
271
|
-
if (typeof navigator ===
|
|
271
|
+
if (typeof navigator === "undefined") return shortcut.label;
|
|
272
272
|
|
|
273
|
-
const isMac = navigator.platform?.includes(
|
|
273
|
+
const isMac = navigator.platform?.includes("Mac") || navigator.userAgent?.includes("Mac");
|
|
274
274
|
if (!isMac) return shortcut.label;
|
|
275
275
|
|
|
276
276
|
const parts: string[] = [];
|
|
277
|
-
if (shortcut.meta) parts.push(
|
|
278
|
-
if (shortcut.shift) parts.push(
|
|
279
|
-
if (shortcut.alt) parts.push(
|
|
277
|
+
if (shortcut.meta) parts.push("⌘");
|
|
278
|
+
if (shortcut.shift) parts.push("⇧");
|
|
279
|
+
if (shortcut.alt) parts.push("⌥");
|
|
280
280
|
parts.push(shortcut.key.toUpperCase());
|
|
281
|
-
return parts.join(
|
|
281
|
+
return parts.join("");
|
|
282
282
|
}
|
|
283
283
|
|
|
284
284
|
/**
|
|
@@ -303,7 +303,10 @@ export function findConflicts(name: ShortcutName): KeyboardShortcut[] {
|
|
|
303
303
|
/**
|
|
304
304
|
* Get all registered shortcuts, optionally filtered by component or scope.
|
|
305
305
|
*/
|
|
306
|
-
export function getShortcuts(filter?: {
|
|
306
|
+
export function getShortcuts(filter?: {
|
|
307
|
+
component?: string;
|
|
308
|
+
scope?: "global" | "component";
|
|
309
|
+
}): KeyboardShortcut[] {
|
|
307
310
|
return (Object.values(KEYBOARD_SHORTCUTS) as KeyboardShortcut[]).filter((shortcut) => {
|
|
308
311
|
if (filter?.component && shortcut.component !== filter.component) return false;
|
|
309
312
|
if (filter?.scope && shortcut.scope !== filter.scope) return false;
|
|
@@ -316,25 +319,23 @@ export function getShortcuts(filter?: { component?: string; scope?: 'global' | '
|
|
|
316
319
|
// ============================================
|
|
317
320
|
|
|
318
321
|
/** Text-like input types where typing shortcuts should not fire global handlers */
|
|
319
|
-
const TEXT_INPUT_TYPES = new Set([
|
|
320
|
-
'text', 'search', 'url', 'tel', 'email', 'password', 'number',
|
|
321
|
-
]);
|
|
322
|
+
const TEXT_INPUT_TYPES = new Set(["text", "search", "url", "tel", "email", "password", "number"]);
|
|
322
323
|
|
|
323
324
|
/**
|
|
324
325
|
* Check if an element is an editable area (input, textarea, contenteditable, role="textbox").
|
|
325
326
|
* Global shortcuts should skip firing when the user is typing in one of these.
|
|
326
327
|
*/
|
|
327
328
|
export function isEditableElement(element: Element | null): boolean {
|
|
328
|
-
if (!element || !(
|
|
329
|
+
if (!element || !("tagName" in element)) return false;
|
|
329
330
|
|
|
330
331
|
const tag = element.tagName;
|
|
331
332
|
|
|
332
333
|
// <textarea>
|
|
333
|
-
if (tag ===
|
|
334
|
+
if (tag === "TEXTAREA") return true;
|
|
334
335
|
|
|
335
336
|
// <input> with text-like type
|
|
336
|
-
if (tag ===
|
|
337
|
-
const type = (element as HTMLInputElement).type?.toLowerCase() ||
|
|
337
|
+
if (tag === "INPUT") {
|
|
338
|
+
const type = (element as HTMLInputElement).type?.toLowerCase() || "text";
|
|
338
339
|
return TEXT_INPUT_TYPES.has(type);
|
|
339
340
|
}
|
|
340
341
|
|
|
@@ -343,10 +344,11 @@ export function isEditableElement(element: Element | null): boolean {
|
|
|
343
344
|
if (htmlEl.isContentEditable) return true;
|
|
344
345
|
// Fallback: check attribute directly (isContentEditable can be unreliable for detached elements)
|
|
345
346
|
const ceAttr = htmlEl.contentEditable;
|
|
346
|
-
if (ceAttr ===
|
|
347
|
+
if (ceAttr === "true" || ceAttr === "") return true;
|
|
347
348
|
|
|
348
349
|
// role="textbox" (TipTap uses this)
|
|
349
|
-
if (typeof element.getAttribute ===
|
|
350
|
+
if (typeof element.getAttribute === "function" && element.getAttribute("role") === "textbox")
|
|
351
|
+
return true;
|
|
350
352
|
|
|
351
353
|
// Check ancestors for contenteditable (e.g., a <p> inside a [contenteditable] div)
|
|
352
354
|
// Walk up manually because jsdom's closest doesn't reliably match property-set contentEditable
|
|
@@ -354,7 +356,7 @@ export function isEditableElement(element: Element | null): boolean {
|
|
|
354
356
|
while (ancestor) {
|
|
355
357
|
if ((ancestor as HTMLElement).isContentEditable) return true;
|
|
356
358
|
const ancestorCe = (ancestor as HTMLElement).contentEditable;
|
|
357
|
-
if (ancestorCe ===
|
|
359
|
+
if (ancestorCe === "true" || ancestorCe === "") return true;
|
|
358
360
|
ancestor = ancestor.parentElement;
|
|
359
361
|
}
|
|
360
362
|
|
|
@@ -390,7 +392,10 @@ const shortcutOverrides = new Map<ShortcutName, Partial<KeyboardShortcut> | null
|
|
|
390
392
|
export function configureShortcuts(
|
|
391
393
|
overrides: Partial<Record<ShortcutName, Partial<KeyboardShortcut> | null>>
|
|
392
394
|
): void {
|
|
393
|
-
for (const [name, value] of Object.entries(overrides) as [
|
|
395
|
+
for (const [name, value] of Object.entries(overrides) as [
|
|
396
|
+
ShortcutName,
|
|
397
|
+
Partial<KeyboardShortcut> | null,
|
|
398
|
+
][]) {
|
|
394
399
|
if (!(name in KEYBOARD_SHORTCUTS)) continue;
|
|
395
400
|
if (value === undefined) continue;
|
|
396
401
|
shortcutOverrides.set(name, value);
|
|
@@ -440,7 +445,7 @@ export interface UseKeyboardShortcutOptions {
|
|
|
440
445
|
* - 'component': listens on `ref` element only
|
|
441
446
|
* If omitted, uses the scope from the shortcut definition.
|
|
442
447
|
*/
|
|
443
|
-
scope?:
|
|
448
|
+
scope?: "global" | "component";
|
|
444
449
|
/** Required when scope is 'component' — the element to attach the listener to */
|
|
445
450
|
ref?: RefObject<Element | null>;
|
|
446
451
|
}
|
|
@@ -487,16 +492,16 @@ export function useKeyboardShortcut({
|
|
|
487
492
|
if (!matchesShortcut(e, resolved)) return;
|
|
488
493
|
|
|
489
494
|
// Global shortcuts skip editable elements
|
|
490
|
-
if (effectiveScope ===
|
|
495
|
+
if (effectiveScope === "global" && isEditableElement(e.target as Element)) return;
|
|
491
496
|
|
|
492
497
|
e.preventDefault();
|
|
493
498
|
handlerRef.current();
|
|
494
499
|
};
|
|
495
500
|
|
|
496
|
-
const target = effectiveScope ===
|
|
501
|
+
const target = effectiveScope === "component" ? ref?.current : document;
|
|
497
502
|
if (!target) return;
|
|
498
503
|
|
|
499
|
-
target.addEventListener(
|
|
500
|
-
return () => target.removeEventListener(
|
|
504
|
+
target.addEventListener("keydown", handleKeyDown as EventListener);
|
|
505
|
+
return () => target.removeEventListener("keydown", handleKeyDown as EventListener);
|
|
501
506
|
}, [name, enabled, scopeOverride, ref]);
|
|
502
507
|
}
|
|
@@ -245,10 +245,14 @@ function hexToRgb(hex: string): { r: number; g: number; b: number } {
|
|
|
245
245
|
if (!result) {
|
|
246
246
|
throw new Error(`Invalid hex color: ${hex}`);
|
|
247
247
|
}
|
|
248
|
+
const [, red, green, blue] = result;
|
|
249
|
+
if (!red || !green || !blue) {
|
|
250
|
+
throw new Error(`Invalid hex color: ${hex}`);
|
|
251
|
+
}
|
|
248
252
|
return {
|
|
249
|
-
r: parseInt(
|
|
250
|
-
g: parseInt(
|
|
251
|
-
b: parseInt(
|
|
253
|
+
r: parseInt(red, 16),
|
|
254
|
+
g: parseInt(green, 16),
|
|
255
|
+
b: parseInt(blue, 16),
|
|
252
256
|
};
|
|
253
257
|
}
|
|
254
258
|
|
|
@@ -409,12 +413,12 @@ function interpolateShade(palette: PaletteShades, level: number): string {
|
|
|
409
413
|
}
|
|
410
414
|
|
|
411
415
|
// Find surrounding levels
|
|
412
|
-
let lower =
|
|
413
|
-
let upper =
|
|
416
|
+
let lower = 50;
|
|
417
|
+
let upper = 950;
|
|
414
418
|
|
|
415
419
|
for (const l of levels) {
|
|
416
420
|
if (l < level) lower = l;
|
|
417
|
-
if (l > level && upper ===
|
|
421
|
+
if (l > level && upper === 950) upper = l;
|
|
418
422
|
}
|
|
419
423
|
|
|
420
424
|
const lowerColor = palette[lower as keyof PaletteShades];
|