@usefragments/ui 1.6.0 → 2.0.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 +54 -66
- 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/nav-glyph.cjs +139 -0
- package/dist/assets/nav-glyph.d.ts +28 -0
- package/dist/assets/nav-glyph.d.ts.map +1 -0
- package/dist/assets/nav-glyph.js +139 -0
- package/dist/assets/nav-glyph.module.scss.cjs +71 -0
- package/dist/assets/nav-glyph.module.scss.js +71 -0
- package/dist/assets/ui.css +6885 -6308
- package/dist/blocks/components/StatsCard.d.ts +1 -1
- package/dist/blocks/components/StatsCard.d.ts.map +1 -1
- package/dist/chart.cjs +24 -6
- package/dist/chart.js +24 -6
- package/dist/codeblock.cjs +76 -43
- package/dist/codeblock.js +71 -38
- package/dist/colorpicker.cjs +4 -1
- package/dist/colorpicker.js +4 -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 +23 -20
- package/dist/components/Alert/Alert.module.scss.js +23 -20
- package/dist/components/Alert/index.cjs +20 -8
- package/dist/components/Alert/index.d.ts +17 -11
- package/dist/components/Alert/index.d.ts.map +1 -1
- package/dist/components/Alert/index.js +20 -8
- package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
- package/dist/components/AppShell/AppShell.module.scss.js +14 -14
- package/dist/components/AppShell/index.cjs +2 -2
- package/dist/components/AppShell/index.js +2 -2
- 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 +33 -31
- package/dist/components/Badge/Badge.module.scss.js +33 -31
- package/dist/components/Badge/index.cjs +13 -3
- package/dist/components/Badge/index.d.ts +18 -13
- package/dist/components/Badge/index.d.ts.map +1 -1
- package/dist/components/Badge/index.js +13 -3
- 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 +11 -8
- package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +11 -8
- package/dist/components/Breadcrumbs/index.cjs +1 -1
- package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/components/Breadcrumbs/index.js +1 -1
- package/dist/components/Button/Button.module.scss.cjs +36 -27
- package/dist/components/Button/Button.module.scss.js +36 -27
- package/dist/components/Button/index.cjs +20 -4
- package/dist/components/Button/index.d.ts +18 -10
- package/dist/components/Button/index.d.ts.map +1 -1
- package/dist/components/Button/index.js +20 -4
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +15 -15
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +15 -15
- package/dist/components/Card/Card.module.scss.cjs +31 -26
- package/dist/components/Card/Card.module.scss.js +32 -27
- package/dist/components/Card/index.cjs +16 -3
- package/dist/components/Card/index.d.ts +23 -15
- package/dist/components/Card/index.d.ts.map +1 -1
- package/dist/components/Card/index.js +16 -3
- 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 +11 -11
- package/dist/components/Checkbox/Checkbox.module.scss.js +11 -11
- package/dist/components/Checkbox/index.cjs +4 -4
- package/dist/components/Checkbox/index.d.ts +4 -6
- package/dist/components/Checkbox/index.d.ts.map +1 -1
- package/dist/components/Checkbox/index.js +4 -4
- package/dist/components/Chip/Chip.module.scss.cjs +19 -19
- package/dist/components/Chip/Chip.module.scss.js +19 -19
- package/dist/components/Chip/index.cjs +3 -3
- package/dist/components/Chip/index.d.ts +8 -3
- package/dist/components/Chip/index.d.ts.map +1 -1
- package/dist/components/Chip/index.js +3 -3
- 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 +20 -5
- 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 +26 -6
- package/dist/components/Combobox/index.d.ts.map +1 -1
- package/dist/components/Combobox/index.js +26 -6
- package/dist/components/Command/Command.module.scss.cjs +14 -11
- package/dist/components/Command/Command.module.scss.js +14 -11
- package/dist/components/Command/index.cjs +28 -16
- package/dist/components/Command/index.d.ts +8 -3
- package/dist/components/Command/index.d.ts.map +1 -1
- package/dist/components/Command/index.js +28 -16
- package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
- package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
- package/dist/components/ConversationList/index.cjs +2 -2
- package/dist/components/ConversationList/index.js +2 -2
- 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 +31 -28
- package/dist/components/DataTable/DataTable.module.scss.js +31 -28
- package/dist/components/DataTable/DataTable.virtual.d.ts.map +1 -1
- 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 +13 -16
- package/dist/components/Dialog/index.d.ts +11 -10
- package/dist/components/Dialog/index.d.ts.map +1 -1
- package/dist/components/Dialog/index.js +13 -16
- package/dist/components/Drawer/Drawer.module.scss.cjs +39 -39
- package/dist/components/Drawer/Drawer.module.scss.js +40 -40
- package/dist/components/Drawer/index.cjs +2 -2
- package/dist/components/Drawer/index.d.ts +5 -4
- package/dist/components/Drawer/index.d.ts.map +1 -1
- package/dist/components/Drawer/index.js +2 -2
- 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 +13 -6
- package/dist/components/EmptyState/index.d.ts +13 -5
- package/dist/components/EmptyState/index.d.ts.map +1 -1
- package/dist/components/EmptyState/index.js +13 -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/Grid.module.scss.cjs +54 -54
- package/dist/components/Grid/Grid.module.scss.js +54 -54
- 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 +30 -33
- package/dist/components/Icon/Icon.module.scss.js +30 -33
- package/dist/components/Icon/index.cjs +15 -14
- package/dist/components/Icon/index.d.ts +23 -12
- package/dist/components/Icon/index.d.ts.map +1 -1
- package/dist/components/Icon/index.js +15 -14
- package/dist/components/IconButton/IconButton.module.scss.cjs +12 -12
- package/dist/components/IconButton/IconButton.module.scss.js +12 -12
- package/dist/components/IconButton/index.cjs +2 -1
- package/dist/components/IconButton/index.d.ts +4 -4
- 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 +15 -21
- package/dist/components/Input/Input.module.scss.js +15 -21
- package/dist/components/Input/index.cjs +2 -14
- package/dist/components/Input/index.d.ts +0 -2
- package/dist/components/Input/index.d.ts.map +1 -1
- package/dist/components/Input/index.js +2 -14
- package/dist/components/Link/Link.module.scss.cjs +26 -14
- package/dist/components/Link/Link.module.scss.js +26 -14
- package/dist/components/Link/index.cjs +13 -2
- package/dist/components/Link/index.d.ts +11 -4
- package/dist/components/Link/index.d.ts.map +1 -1
- package/dist/components/Link/index.js +13 -2
- package/dist/components/List/List.module.scss.cjs +23 -19
- package/dist/components/List/List.module.scss.js +23 -19
- package/dist/components/List/index.cjs +7 -7
- package/dist/components/List/index.d.ts +10 -7
- package/dist/components/List/index.d.ts.map +1 -1
- package/dist/components/List/index.js +7 -7
- 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 +5 -5
- package/dist/components/Loading/index.d.ts +8 -7
- package/dist/components/Loading/index.d.ts.map +1 -1
- package/dist/components/Loading/index.js +5 -5
- 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 +20 -20
- package/dist/components/Message/Message.module.scss.js +20 -20
- package/dist/components/Message/index.cjs +1 -1
- package/dist/components/Message/index.d.ts +1 -1
- package/dist/components/Message/index.js +1 -1
- 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 +28 -25
- package/dist/components/Progress/Progress.module.scss.js +28 -25
- package/dist/components/Progress/index.cjs +21 -12
- package/dist/components/Progress/index.d.ts +10 -6
- package/dist/components/Progress/index.d.ts.map +1 -1
- package/dist/components/Progress/index.js +21 -12
- package/dist/components/Prompt/Prompt.module.scss.cjs +30 -30
- package/dist/components/Prompt/Prompt.module.scss.js +30 -30
- package/dist/components/Prompt/index.cjs +7 -7
- package/dist/components/Prompt/index.d.ts +11 -9
- package/dist/components/Prompt/index.d.ts.map +1 -1
- package/dist/components/Prompt/index.js +7 -7
- package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +20 -17
- package/dist/components/RadioGroup/RadioGroup.module.scss.js +20 -17
- package/dist/components/RadioGroup/index.cjs +10 -5
- package/dist/components/RadioGroup/index.d.ts +11 -7
- package/dist/components/RadioGroup/index.d.ts.map +1 -1
- package/dist/components/RadioGroup/index.js +10 -5
- 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/Select/index.cjs +26 -20
- package/dist/components/Select/index.d.ts +5 -5
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +26 -20
- package/dist/components/Separator/Separator.module.scss.cjs +25 -19
- package/dist/components/Separator/Separator.module.scss.js +25 -19
- package/dist/components/Separator/index.cjs +10 -8
- package/dist/components/Separator/index.d.ts +4 -2
- package/dist/components/Separator/index.d.ts.map +1 -1
- package/dist/components/Separator/index.js +10 -8
- 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 +15 -38
- 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 +15 -38
- package/dist/components/Skeleton/Skeleton.module.scss.cjs +50 -46
- package/dist/components/Skeleton/Skeleton.module.scss.js +50 -46
- package/dist/components/Skeleton/index.cjs +7 -7
- package/dist/components/Skeleton/index.d.ts +8 -7
- package/dist/components/Skeleton/index.d.ts.map +1 -1
- package/dist/components/Skeleton/index.js +7 -7
- 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 +14 -10
- 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 +14 -10
- package/dist/components/Tabs/Tabs.module.scss.cjs +18 -18
- package/dist/components/Tabs/Tabs.module.scss.js +18 -18
- package/dist/components/Tabs/index.cjs +30 -11
- package/dist/components/Tabs/index.d.ts +8 -6
- package/dist/components/Tabs/index.d.ts.map +1 -1
- package/dist/components/Tabs/index.js +30 -11
- package/dist/components/Text/Text.module.scss.cjs +109 -97
- package/dist/components/Text/Text.module.scss.js +109 -97
- package/dist/components/Text/index.cjs +45 -41
- package/dist/components/Text/index.d.ts +24 -19
- package/dist/components/Text/index.d.ts.map +1 -1
- package/dist/components/Text/index.js +45 -41
- package/dist/components/Textarea/Textarea.module.scss.cjs +22 -28
- package/dist/components/Textarea/Textarea.module.scss.js +22 -28
- package/dist/components/Textarea/index.cjs +3 -10
- package/dist/components/Textarea/index.d.ts +0 -2
- package/dist/components/Textarea/index.d.ts.map +1 -1
- package/dist/components/Textarea/index.js +3 -10
- package/dist/components/Theme/index.cjs +22 -5
- package/dist/components/Theme/index.d.ts +6 -12
- package/dist/components/Theme/index.d.ts.map +1 -1
- package/dist/components/Theme/index.js +22 -5
- package/dist/components/ThemeToggle/ThemeButton.cjs +51 -0
- package/dist/components/ThemeToggle/ThemeButton.d.ts +16 -0
- package/dist/components/ThemeToggle/ThemeButton.d.ts.map +1 -0
- package/dist/components/ThemeToggle/ThemeButton.js +34 -0
- package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +6 -6
- package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +6 -6
- package/dist/components/ThemeToggle/icons.cjs +48 -0
- package/dist/components/ThemeToggle/icons.d.ts +10 -0
- package/dist/components/ThemeToggle/icons.d.ts.map +1 -0
- package/dist/components/ThemeToggle/icons.js +48 -0
- package/dist/components/ThemeToggle/index.cjs +6 -50
- package/dist/components/ThemeToggle/index.d.ts +5 -3
- package/dist/components/ThemeToggle/index.d.ts.map +1 -1
- package/dist/components/ThemeToggle/index.js +3 -47
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +18 -15
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +18 -15
- package/dist/components/ThinkingIndicator/index.cjs +7 -8
- package/dist/components/ThinkingIndicator/index.d.ts +6 -5
- package/dist/components/ThinkingIndicator/index.d.ts.map +1 -1
- package/dist/components/ThinkingIndicator/index.js +7 -8
- package/dist/components/Toast/Toast.module.scss.cjs +28 -29
- package/dist/components/Toast/Toast.module.scss.js +29 -30
- package/dist/components/Toast/index.cjs +28 -30
- package/dist/components/Toast/index.d.ts +9 -8
- package/dist/components/Toast/index.d.ts.map +1 -1
- package/dist/components/Toast/index.js +28 -30
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +21 -19
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +22 -20
- package/dist/components/ToggleGroup/index.cjs +4 -5
- package/dist/components/ToggleGroup/index.d.ts +7 -6
- package/dist/components/ToggleGroup/index.d.ts.map +1 -1
- package/dist/components/ToggleGroup/index.js +4 -5
- 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/VisuallyHidden.module.scss.cjs +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.js +1 -1
- package/dist/components/VisuallyHidden/index.d.ts +2 -2
- package/dist/data-table-virtual.cjs +3 -2
- package/dist/data-table-virtual.js +3 -2
- package/dist/data-table.cjs +3 -2
- package/dist/data-table.js +3 -2
- package/dist/datepicker.cjs +26 -13
- package/dist/datepicker.js +26 -13
- package/dist/editor.cjs +68 -28
- package/dist/editor.js +68 -28
- package/dist/index.cjs +6 -2
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/markdown.cjs +21 -29
- package/dist/markdown.js +21 -29
- package/dist/measurements/generated.cjs +46 -94
- package/dist/measurements/generated.d.ts +44 -92
- package/dist/measurements/generated.d.ts.map +1 -1
- package/dist/measurements/generated.js +46 -94
- package/dist/measurements/index.d.ts +1 -1
- package/dist/measurements/index.d.ts.map +1 -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 -7
- package/dist/utils/seed-derivation.d.ts +1 -3
- package/dist/utils/seed-derivation.d.ts.map +1 -1
- package/dist/utils/seed-derivation.js +10 -7
- package/dist/utils/theme-presets.cjs +5 -10
- package/dist/utils/theme-presets.d.ts +1 -2
- package/dist/utils/theme-presets.d.ts.map +1 -1
- package/dist/utils/theme-presets.js +5 -10
- package/fragments.json +1 -1
- package/package.json +9 -10
- package/src/assets/fragments-logo.tsx +2 -2
- package/src/assets/fragments-wordmark.tsx +4 -2
- package/src/assets/nav-glyph.module.scss +166 -0
- package/src/assets/nav-glyph.tsx +188 -0
- package/src/components/Accordion/Accordion.contract.json +24 -48
- package/src/components/Accordion/Accordion.module.scss +5 -3
- package/src/components/Alert/Alert.contract.json +49 -65
- package/src/components/Alert/Alert.module.scss +57 -47
- package/src/components/Alert/index.tsx +72 -39
- package/src/components/AppShell/AppShell.contract.json +34 -51
- package/src/components/AppShell/AppShell.module.scss +99 -54
- package/src/components/AppShell/index.tsx +2 -2
- package/src/components/Avatar/Avatar.contract.json +31 -48
- package/src/components/Avatar/Avatar.module.scss +4 -2
- package/src/components/Badge/Badge.contract.json +86 -55
- package/src/components/Badge/Badge.module.scss +80 -48
- package/src/components/Badge/index.tsx +34 -17
- package/src/components/BentoGrid/BentoGrid.contract.json +21 -45
- package/src/components/BentoGrid/BentoGrid.module.scss +4 -8
- package/src/components/Box/Box.contract.json +40 -148
- package/src/components/Box/Box.module.scss +7 -6
- package/src/components/Box/index.tsx +92 -99
- package/src/components/Breadcrumbs/Breadcrumbs.contract.json +21 -34
- package/src/components/Breadcrumbs/Breadcrumbs.module.scss +27 -12
- package/src/components/Breadcrumbs/index.tsx +5 -1
- package/src/components/Button/Button.module.scss +261 -185
- package/src/components/Button/index.tsx +41 -28
- package/src/components/ButtonGroup/ButtonGroup.contract.json +34 -49
- package/src/components/ButtonGroup/ButtonGroup.module.scss +8 -6
- package/src/components/Card/Card.consumer-fixture.module.scss +5 -2
- package/src/components/Card/Card.module.scss +97 -76
- package/src/components/Card/index.tsx +44 -20
- package/src/components/Chart/Chart.contract.json +21 -29
- package/src/components/Chart/Chart.module.scss +6 -5
- package/src/components/Chart/index.tsx +36 -6
- package/src/components/Checkbox/Checkbox.contract.json +28 -27
- package/src/components/Checkbox/Checkbox.module.scss +47 -54
- package/src/components/Checkbox/index.tsx +10 -10
- package/src/components/Chip/Chip.contract.json +38 -45
- package/src/components/Chip/Chip.module.scss +24 -23
- package/src/components/Chip/index.tsx +12 -7
- package/src/components/CodeBlock/CodeBlock.contract.json +46 -76
- package/src/components/CodeBlock/CodeBlock.module.scss +75 -73
- package/src/components/CodeBlock/css-variables-theme.ts +102 -0
- package/src/components/CodeBlock/index.tsx +114 -51
- package/src/components/Collapsible/Collapsible.contract.json +21 -36
- package/src/components/Collapsible/Collapsible.module.scss +1 -7
- package/src/components/ColorPicker/ColorPicker.contract.json +29 -48
- package/src/components/ColorPicker/ColorPicker.module.scss +34 -24
- package/src/components/ColorPicker/index.tsx +6 -1
- package/src/components/Combobox/Combobox.contract.json +36 -37
- package/src/components/Combobox/Combobox.module.scss +16 -19
- package/src/components/Combobox/index.tsx +41 -6
- package/src/components/Command/Command.contract.json +28 -44
- package/src/components/Command/Command.module.scss +19 -21
- package/src/components/Command/index.tsx +64 -47
- package/src/components/ComponentDefaults/ComponentDefaults.contract.json +91 -0
- package/src/components/ConversationList/ConversationList.contract.json +27 -32
- package/src/components/ConversationList/ConversationList.module.scss +2 -3
- package/src/components/ConversationList/index.tsx +2 -2
- package/src/components/DataTable/DataTable.icons.tsx +4 -21
- package/src/components/DataTable/DataTable.module.scss +24 -17
- package/src/components/DataTable/DataTable.virtual.tsx +3 -2
- package/src/components/DataTable/index.tsx +9 -8
- package/src/components/DatePicker/DatePicker.contract.json +27 -28
- package/src/components/DatePicker/DatePicker.module.scss +41 -44
- package/src/components/DatePicker/index.tsx +23 -9
- package/src/components/Dialog/Dialog.module.scss +26 -32
- package/src/components/Dialog/index.tsx +51 -39
- package/src/components/Drawer/Drawer.contract.json +28 -42
- package/src/components/Drawer/Drawer.module.scss +123 -64
- package/src/components/Drawer/index.tsx +7 -5
- package/src/components/Editor/Editor.contract.json +32 -49
- package/src/components/Editor/Editor.module.scss +60 -25
- package/src/components/Editor/index.tsx +240 -179
- package/src/components/EmptyState/EmptyState.contract.json +33 -45
- package/src/components/EmptyState/EmptyState.module.scss +37 -21
- package/src/components/EmptyState/index.tsx +56 -23
- package/src/components/Field/Field.contract.json +28 -46
- package/src/components/Field/Field.module.scss +2 -1
- package/src/components/Field/index.tsx +5 -1
- package/src/components/Fieldset/Fieldset.contract.json +21 -38
- package/src/components/Fieldset/Fieldset.module.scss +15 -7
- package/src/components/Form/Form.contract.json +23 -23
- package/src/components/Grid/Grid.contract.json +28 -64
- package/src/components/Grid/Grid.module.scss +2 -2
- package/src/components/Grid/index.tsx +10 -10
- package/src/components/Header/Header.contract.json +31 -67
- package/src/components/Header/Header.module.scss +57 -54
- package/src/components/Header/index.tsx +134 -122
- package/src/components/Icon/Icon.contract.json +37 -81
- package/src/components/Icon/Icon.module.scss +13 -12
- package/src/components/Icon/index.tsx +31 -31
- package/src/components/IconButton/IconButton.contract.json +37 -21
- package/src/components/IconButton/IconButton.module.scss +19 -11
- package/src/components/IconButton/index.tsx +6 -5
- package/src/components/Image/Image.contract.json +23 -56
- package/src/components/Input/Input.contract.json +25 -44
- package/src/components/Input/Input.module.scss +6 -55
- package/src/components/Input/index.tsx +2 -18
- package/src/components/Link/Link.contract.json +46 -58
- package/src/components/Link/Link.module.scss +41 -10
- package/src/components/Link/index.tsx +27 -6
- package/src/components/List/List.contract.json +33 -62
- package/src/components/List/List.module.scss +10 -5
- package/src/components/List/index.tsx +17 -13
- package/src/components/Listbox/Listbox.contract.json +21 -37
- package/src/components/Listbox/Listbox.module.scss +14 -20
- package/src/components/Loading/Loading.contract.json +41 -65
- package/src/components/Loading/Loading.module.scss +37 -31
- package/src/components/Loading/index.tsx +15 -14
- 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 +45 -6
- package/src/components/Markdown/index.tsx +48 -49
- package/src/components/Menu/Menu.contract.json +30 -46
- package/src/components/Menu/Menu.module.scss +32 -16
- package/src/components/Message/Message.contract.json +31 -54
- package/src/components/Message/Message.module.scss +18 -9
- package/src/components/Message/index.tsx +2 -2
- package/src/components/NavigationMenu/NavigationMenu.contract.json +36 -45
- package/src/components/NavigationMenu/NavigationMenu.module.scss +66 -66
- package/src/components/NavigationMenu/index.tsx +105 -81
- package/src/components/Pagination/Pagination.contract.json +22 -40
- package/src/components/Pagination/Pagination.module.scss +9 -16
- package/src/components/Popover/Popover.contract.json +28 -50
- package/src/components/Popover/Popover.module.scss +30 -28
- package/src/components/Progress/Progress.contract.json +39 -35
- package/src/components/Progress/Progress.module.scss +16 -10
- package/src/components/Progress/index.tsx +34 -16
- package/src/components/Prompt/Prompt.contract.json +40 -56
- package/src/components/Prompt/Prompt.module.scss +49 -48
- package/src/components/Prompt/index.tsx +17 -15
- package/src/components/RadioGroup/RadioGroup.contract.json +29 -28
- package/src/components/RadioGroup/RadioGroup.module.scss +50 -45
- package/src/components/RadioGroup/index.tsx +23 -10
- package/src/components/ScrollArea/ScrollArea.contract.json +18 -19
- package/src/components/ScrollArea/ScrollArea.module.scss +45 -48
- package/src/components/ScrollArea/index.tsx +16 -16
- package/src/components/ScrollArea/scroll-state.ts +24 -24
- package/src/components/Select/Select.module.scss +20 -19
- package/src/components/Select/index.tsx +26 -24
- package/src/components/Separator/Separator.contract.json +29 -53
- package/src/components/Separator/Separator.module.scss +24 -40
- package/src/components/Separator/index.tsx +16 -11
- package/src/components/Sidebar/Sidebar.contract.json +35 -67
- package/src/components/Sidebar/Sidebar.module.scss +94 -88
- package/src/components/Sidebar/index.tsx +167 -167
- package/src/components/Skeleton/Skeleton.contract.json +34 -60
- package/src/components/Skeleton/Skeleton.module.scss +50 -26
- package/src/components/Skeleton/index.tsx +16 -15
- package/src/components/Slider/Slider.contract.json +27 -39
- package/src/components/Slider/Slider.module.scss +9 -22
- package/src/components/Stack/Stack.contract.json +30 -57
- package/src/components/Stack/Stack.module.scss +26 -24
- package/src/components/Stack/index.tsx +3 -3
- package/src/components/Switch/Switch.contract.json +33 -46
- package/src/components/Switch/Switch.module.scss +106 -59
- package/src/components/Table/Table.contract.json +28 -46
- package/src/components/Table/Table.module.scss +24 -16
- package/src/components/TableOfContents/TableOfContents.contract.json +34 -21
- package/src/components/TableOfContents/TableOfContents.module.scss +17 -13
- package/src/components/TableOfContents/index.tsx +27 -10
- package/src/components/Tabs/Tabs.contract.json +35 -56
- package/src/components/Tabs/Tabs.module.scss +27 -31
- package/src/components/Tabs/index.tsx +30 -15
- package/src/components/Text/Text.contract.json +52 -72
- package/src/components/Text/Text.module.scss +34 -18
- package/src/components/Text/index.tsx +123 -83
- package/src/components/Textarea/Textarea.contract.json +24 -55
- package/src/components/Textarea/Textarea.module.scss +22 -52
- package/src/components/Textarea/index.tsx +3 -14
- package/src/components/Theme/Theme.contract.json +35 -53
- package/src/components/Theme/index.tsx +41 -13
- package/src/components/ThemeToggle/ThemeButton.tsx +49 -0
- package/src/components/ThemeToggle/ThemeToggle.module.scss +20 -27
- package/src/components/ThemeToggle/icons.tsx +46 -0
- package/src/components/ThemeToggle/index.tsx +9 -55
- package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +34 -50
- package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +9 -7
- package/src/components/ThinkingIndicator/index.tsx +12 -14
- package/src/components/Toast/Toast.contract.json +55 -49
- package/src/components/Toast/Toast.module.scss +50 -105
- package/src/components/Toast/index.tsx +39 -34
- package/src/components/ToggleGroup/ToggleGroup.contract.json +39 -40
- package/src/components/ToggleGroup/ToggleGroup.module.scss +30 -27
- package/src/components/ToggleGroup/index.tsx +11 -11
- package/src/components/Tooltip/Tooltip.contract.json +31 -52
- package/src/components/Tooltip/Tooltip.module.scss +16 -10
- package/src/components/Tooltip/index.tsx +19 -24
- package/src/components/VisuallyHidden/VisuallyHidden.contract.json +22 -44
- package/src/components/VisuallyHidden/VisuallyHidden.module.scss +4 -14
- package/src/components/VisuallyHidden/index.tsx +5 -5
- package/src/index.ts +16 -12
- package/src/measurements/MeasurementTargets.module.scss +6 -7
- package/src/measurements/generated.ts +46 -97
- package/src/measurements/index.ts +0 -1
- package/src/measurements/measurements.json +44 -116
- package/src/recipes/_action.scss +4 -4
- package/src/recipes/_boolean-range.scss +12 -16
- package/src/recipes/_feedback.scss +17 -16
- package/src/recipes/_field.scss +28 -16
- package/src/recipes/_layout.scss +14 -7
- package/src/recipes/_navigation.scss +84 -29
- package/src/recipes/_overlay.scss +143 -43
- package/src/recipes/_popup.scss +54 -34
- package/src/recipes/_prose.scss +48 -28
- package/src/recipes/_representation.scss +10 -9
- package/src/recipes/_segmented.scss +1 -1
- package/src/recipes/_table-chrome.scss +42 -17
- package/src/recipes/_target.scss +2 -4
- package/src/recipes/_typography.scss +10 -0
- package/src/scss.d.ts +1 -1
- package/src/styles/globals.scss +31 -25
- package/src/tokens/_component-properties.scss +19 -1
- package/src/tokens/_computed.scss +32 -49
- package/src/tokens/_derive.scss +112 -210
- package/src/tokens/_measurements.catalog.generated.css +62 -44
- package/src/tokens/_measurements.generated.scss +119 -249
- package/src/tokens/_mixins.scss +49 -48
- package/src/tokens/_palettes.scss +39 -167
- package/src/tokens/_property-registrations.scss +9 -0
- package/src/tokens/_seeds.scss +20 -31
- package/src/tokens/_variables.scss +251 -94
- 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 +11 -14
- package/src/utils/theme-presets.ts +5 -12
- package/dist/blocks/AccountSettings.block.d.ts +0 -3
- package/dist/blocks/AccountSettings.block.d.ts.map +0 -1
- package/dist/blocks/ActivityFeedSkeleton.block.d.ts +0 -3
- package/dist/blocks/ActivityFeedSkeleton.block.d.ts.map +0 -1
- package/dist/blocks/BlogEditor.block.d.ts +0 -3
- package/dist/blocks/BlogEditor.block.d.ts.map +0 -1
- package/dist/blocks/ChatInterface.block.d.ts +0 -3
- package/dist/blocks/ChatInterface.block.d.ts.map +0 -1
- package/dist/blocks/ChatMessages.block.d.ts +0 -3
- package/dist/blocks/ChatMessages.block.d.ts.map +0 -1
- package/dist/blocks/CheckoutForm.block.d.ts +0 -3
- package/dist/blocks/CheckoutForm.block.d.ts.map +0 -1
- package/dist/blocks/CommandPalette.block.d.ts +0 -3
- package/dist/blocks/CommandPalette.block.d.ts.map +0 -1
- package/dist/blocks/ContactForm.block.d.ts +0 -3
- package/dist/blocks/ContactForm.block.d.ts.map +0 -1
- package/dist/blocks/DashboardPage.block.d.ts +0 -3
- package/dist/blocks/DashboardPage.block.d.ts.map +0 -1
- package/dist/blocks/DashboardSkeleton.block.d.ts +0 -3
- package/dist/blocks/DashboardSkeleton.block.d.ts.map +0 -1
- package/dist/blocks/DataTable.block.d.ts +0 -3
- package/dist/blocks/DataTable.block.d.ts.map +0 -1
- package/dist/blocks/EmptyState.block.d.ts +0 -3
- package/dist/blocks/EmptyState.block.d.ts.map +0 -1
- package/dist/blocks/FAQSection.block.d.ts +0 -3
- package/dist/blocks/FAQSection.block.d.ts.map +0 -1
- package/dist/blocks/FeatureGrid.block.d.ts +0 -3
- package/dist/blocks/FeatureGrid.block.d.ts.map +0 -1
- package/dist/blocks/HeroSection.block.d.ts +0 -3
- package/dist/blocks/HeroSection.block.d.ts.map +0 -1
- package/dist/blocks/NavigationHeader.block.d.ts +0 -3
- package/dist/blocks/NavigationHeader.block.d.ts.map +0 -1
- package/dist/blocks/PaginatedTable.block.d.ts +0 -3
- package/dist/blocks/PaginatedTable.block.d.ts.map +0 -1
- package/dist/blocks/PricingComparison.block.d.ts +0 -3
- package/dist/blocks/PricingComparison.block.d.ts.map +0 -1
- package/dist/blocks/ProductCard.block.d.ts +0 -3
- package/dist/blocks/ProductCard.block.d.ts.map +0 -1
- package/dist/blocks/RegistrationForm.block.d.ts +0 -3
- package/dist/blocks/RegistrationForm.block.d.ts.map +0 -1
- package/dist/blocks/SettingsDrawer.block.d.ts +0 -3
- package/dist/blocks/SettingsDrawer.block.d.ts.map +0 -1
- package/dist/blocks/SettingsPanel.block.d.ts +0 -3
- package/dist/blocks/SettingsPanel.block.d.ts.map +0 -1
- package/dist/blocks/ShoppingCart.block.d.ts +0 -3
- package/dist/blocks/ShoppingCart.block.d.ts.map +0 -1
- package/dist/blocks/StatsCardSkeleton.block.d.ts +0 -3
- package/dist/blocks/StatsCardSkeleton.block.d.ts.map +0 -1
- package/dist/blocks/TableSkeleton.block.d.ts +0 -3
- package/dist/blocks/TableSkeleton.block.d.ts.map +0 -1
- package/dist/blocks/ThinkingStates.block.d.ts +0 -3
- package/dist/blocks/ThinkingStates.block.d.ts.map +0 -1
- package/dist/components/Toggle/index.d.ts +0 -3
- package/dist/components/Toggle/index.d.ts.map +0 -1
- 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
- package/src/components/Toggle/index.ts +0 -7
- package/src/tokens/_density.scss +0 -85
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
3
|
"name": "Textarea",
|
|
4
|
-
"description": "
|
|
5
|
-
"category": "
|
|
6
|
-
"tags": [
|
|
7
|
-
"input",
|
|
8
|
-
"text",
|
|
9
|
-
"form",
|
|
10
|
-
"multiline"
|
|
11
|
-
],
|
|
4
|
+
"description": "Collects multi-line text for longer form content.",
|
|
5
|
+
"category": "inputs",
|
|
6
|
+
"tags": ["input", "text", "form", "multiline"],
|
|
12
7
|
"status": "stable",
|
|
13
8
|
"sourcePath": "src/components/Textarea/index.tsx",
|
|
14
9
|
"exportName": "Textarea",
|
|
@@ -23,7 +18,6 @@
|
|
|
23
18
|
"size: sm|md|lg (default: md)",
|
|
24
19
|
"disabled: boolean (default: false)",
|
|
25
20
|
"error: boolean (default: false)",
|
|
26
|
-
"success: boolean (default: false)",
|
|
27
21
|
"showCharCount: boolean (default: false)",
|
|
28
22
|
"label: string",
|
|
29
23
|
"helperText: string",
|
|
@@ -78,23 +72,14 @@
|
|
|
78
72
|
"description": "Resize behavior",
|
|
79
73
|
"default": "vertical",
|
|
80
74
|
"required": false,
|
|
81
|
-
"values": [
|
|
82
|
-
"none",
|
|
83
|
-
"vertical",
|
|
84
|
-
"horizontal",
|
|
85
|
-
"both"
|
|
86
|
-
]
|
|
75
|
+
"values": ["none", "vertical", "horizontal", "both"]
|
|
87
76
|
},
|
|
88
77
|
"size": {
|
|
89
78
|
"type": "enum",
|
|
90
79
|
"description": "Size variant",
|
|
91
80
|
"default": "md",
|
|
92
81
|
"required": false,
|
|
93
|
-
"values": [
|
|
94
|
-
"sm",
|
|
95
|
-
"md",
|
|
96
|
-
"lg"
|
|
97
|
-
]
|
|
82
|
+
"values": ["sm", "md", "lg"]
|
|
98
83
|
},
|
|
99
84
|
"disabled": {
|
|
100
85
|
"type": "boolean",
|
|
@@ -108,12 +93,6 @@
|
|
|
108
93
|
"default": "false",
|
|
109
94
|
"required": false
|
|
110
95
|
},
|
|
111
|
-
"success": {
|
|
112
|
-
"type": "boolean",
|
|
113
|
-
"description": "Whether to show success/validated styling",
|
|
114
|
-
"default": "false",
|
|
115
|
-
"required": false
|
|
116
|
-
},
|
|
117
96
|
"showCharCount": {
|
|
118
97
|
"type": "boolean",
|
|
119
98
|
"description": "Show character counter when maxLength is set",
|
|
@@ -209,61 +188,56 @@
|
|
|
209
188
|
"Selecting from predefined options (use Select)"
|
|
210
189
|
],
|
|
211
190
|
"guidelines": [
|
|
212
|
-
"Set
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
"
|
|
191
|
+
"Set rows to match the expected answer length",
|
|
192
|
+
"Placeholder shows an example, not the label",
|
|
193
|
+
"Pair maxLength with showCharCount so the limit is visible",
|
|
194
|
+
"Use resize=\"none\" only when the layout truly cannot flex"
|
|
216
195
|
],
|
|
217
196
|
"accessibility": [
|
|
218
|
-
"
|
|
219
|
-
"
|
|
220
|
-
"Error
|
|
197
|
+
"Give every textarea a visible label",
|
|
198
|
+
"Put format hints in helperText, not the placeholder",
|
|
199
|
+
"Error text says what to fix, not just that it failed"
|
|
221
200
|
]
|
|
222
201
|
},
|
|
223
202
|
"examples": [
|
|
224
203
|
{
|
|
225
204
|
"name": "Default",
|
|
226
|
-
"description": "
|
|
205
|
+
"description": "Three rows, draggable from the bottom-right corner.",
|
|
227
206
|
"code": "<Textarea\n label=\"Description\"\n placeholder=\"Enter a description...\"\n/>"
|
|
228
207
|
},
|
|
229
208
|
{
|
|
230
209
|
"name": "With Helper Text",
|
|
231
|
-
"description": "
|
|
210
|
+
"description": "Supporting text sits under the box.",
|
|
232
211
|
"code": "<Textarea\n label=\"Bio\"\n placeholder=\"Tell us about yourself...\"\n helperText=\"Max 500 characters\"\n maxLength={500}\n/>"
|
|
233
212
|
},
|
|
234
213
|
{
|
|
235
214
|
"name": "Error State",
|
|
236
|
-
"description": "
|
|
215
|
+
"description": "Red border, and helperText becomes the reason.",
|
|
237
216
|
"code": "<Textarea\n label=\"Comments\"\n placeholder=\"Add your comments...\"\n error\n helperText=\"This field is required\"\n/>"
|
|
238
217
|
},
|
|
239
218
|
{
|
|
240
219
|
"name": "Disabled",
|
|
241
|
-
"description": "
|
|
220
|
+
"description": "Dimmed and unfocusable.",
|
|
242
221
|
"code": "<Textarea\n label=\"Notes\"\n placeholder=\"Cannot edit...\"\n disabled\n/>"
|
|
243
222
|
},
|
|
244
223
|
{
|
|
245
224
|
"name": "Custom Rows",
|
|
246
|
-
"description": "
|
|
225
|
+
"description": "rows={6} doubles the visible height before scrolling.",
|
|
247
226
|
"code": "<Textarea\n label=\"Long Description\"\n placeholder=\"Enter detailed information...\"\n rows={6}\n/>"
|
|
248
227
|
},
|
|
249
228
|
{
|
|
250
229
|
"name": "Sizes",
|
|
251
|
-
"description": "
|
|
230
|
+
"description": "Three heights: sm, md, lg.",
|
|
252
231
|
"code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '12px', maxWidth: '400px' }}>\n <Textarea label=\"Small\" size=\"sm\" placeholder=\"Small textarea\" />\n <Textarea label=\"Medium\" size=\"md\" placeholder=\"Medium textarea\" />\n <Textarea label=\"Large\" size=\"lg\" placeholder=\"Large textarea\" />\n</div>"
|
|
253
232
|
},
|
|
254
233
|
{
|
|
255
|
-
"name": "
|
|
256
|
-
"description": "
|
|
257
|
-
"code": "<Textarea\n label=\"Notes\"\n placeholder=\"Add notes...\"\n
|
|
258
|
-
},
|
|
259
|
-
{
|
|
260
|
-
"name": "Success State",
|
|
261
|
-
"description": "Textarea showing validated/success styling",
|
|
262
|
-
"code": "<Textarea\n label=\"Bio\"\n value=\"A short bio about myself.\"\n success\n helperText=\"Looks great!\"\n/>"
|
|
234
|
+
"name": "Fixed Height",
|
|
235
|
+
"description": "resize=\"none\" removes the drag handle so the box stays put.",
|
|
236
|
+
"code": "<Textarea\n label=\"Notes\"\n placeholder=\"Add notes...\"\n resize=\"none\"\n/>"
|
|
263
237
|
},
|
|
264
238
|
{
|
|
265
239
|
"name": "With Character Counter",
|
|
266
|
-
"description": "
|
|
240
|
+
"description": "Live count against maxLength sits below the box.",
|
|
267
241
|
"code": "<Textarea\n label=\"Bio\"\n placeholder=\"Tell us about yourself...\"\n maxLength={200}\n showCharCount\n/>"
|
|
268
242
|
}
|
|
269
243
|
],
|
|
@@ -281,7 +255,6 @@
|
|
|
281
255
|
"label: string - label text",
|
|
282
256
|
"size: sm|md|lg (default: md)",
|
|
283
257
|
"error: boolean - error state",
|
|
284
|
-
"success: boolean - shows success/validated styling",
|
|
285
258
|
"showCharCount: boolean - show character counter (requires maxLength)",
|
|
286
259
|
"disabled: boolean - disabled state",
|
|
287
260
|
"resize: none|vertical|horizontal|both",
|
|
@@ -289,15 +262,11 @@
|
|
|
289
262
|
"rootProps: HTMLAttributes<HTMLDivElement> - wrapper element props",
|
|
290
263
|
"...native textarea attributes are supported (readOnly, autoComplete, maxLength, onKeyDown, etc.)"
|
|
291
264
|
],
|
|
292
|
-
"a11yRules": [
|
|
293
|
-
"A11Y_LABEL_REQUIRED"
|
|
294
|
-
]
|
|
265
|
+
"a11yRules": ["A11Y_LABEL_REQUIRED"]
|
|
295
266
|
},
|
|
296
267
|
"ai": {
|
|
297
268
|
"compositionPattern": "compound",
|
|
298
|
-
"subComponents": [
|
|
299
|
-
"Root"
|
|
300
|
-
]
|
|
269
|
+
"subComponents": ["Root"]
|
|
301
270
|
},
|
|
302
271
|
"provenance": {
|
|
303
272
|
"source": "migrated",
|
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
@use "../../recipes/layout";
|
|
6
6
|
@use "../../recipes/typography";
|
|
7
7
|
|
|
8
|
+
// Fallbacks for the field recipe's size hooks when no size class has set them.
|
|
9
|
+
$_track: field.track("md");
|
|
10
|
+
$_stroke: field.stroke();
|
|
11
|
+
$_block-inset: var(--fui-raw-space-8, #{measurements.raw-space(8)});
|
|
12
|
+
|
|
8
13
|
.wrapper {
|
|
9
14
|
@include field.wrapper;
|
|
10
15
|
}
|
|
@@ -34,17 +39,18 @@
|
|
|
34
39
|
display: block;
|
|
35
40
|
width: 100%;
|
|
36
41
|
min-block-size: max(
|
|
37
|
-
var(--_fui-field-track),
|
|
42
|
+
var(--_fui-field-track, #{$_track}),
|
|
38
43
|
calc(
|
|
39
|
-
var(--
|
|
40
|
-
var(--_fui-
|
|
44
|
+
var(--fui-textarea-min-rows, 1) * 1lh + 2 *
|
|
45
|
+
var(--_fui-textarea-block-inset, #{$_block-inset}) + 2 *
|
|
46
|
+
var(--_fui-field-stroke, #{$_stroke})
|
|
41
47
|
)
|
|
42
48
|
);
|
|
43
49
|
max-block-size: calc(
|
|
44
|
-
var(--
|
|
45
|
-
var(--_fui-field-stroke)
|
|
50
|
+
var(--fui-textarea-max-rows, 9999) * 1lh + 2 *
|
|
51
|
+
var(--_fui-textarea-block-inset, #{$_block-inset}) + 2 * var(--_fui-field-stroke, #{$_stroke})
|
|
46
52
|
);
|
|
47
|
-
padding-block: var(--_fui-textarea-block-inset);
|
|
53
|
+
padding-block: var(--_fui-textarea-block-inset, #{$_block-inset});
|
|
48
54
|
|
|
49
55
|
&::placeholder {
|
|
50
56
|
color: var(--fui-text-tertiary, $fui-text-tertiary);
|
|
@@ -54,12 +60,14 @@
|
|
|
54
60
|
@include field.focus-state;
|
|
55
61
|
}
|
|
56
62
|
|
|
63
|
+
@include high-contrast-outline;
|
|
64
|
+
|
|
57
65
|
// Single-line: same track as Input — height lock, horizontal pad only.
|
|
58
66
|
&[rows="1"] {
|
|
59
|
-
block-size: var(--_fui-field-track);
|
|
60
|
-
min-block-size: var(--_fui-field-track);
|
|
67
|
+
block-size: var(--_fui-field-track, #{$_track});
|
|
68
|
+
min-block-size: var(--_fui-field-track, #{$_track});
|
|
61
69
|
padding-block: calc(
|
|
62
|
-
(var(--_fui-field-track) - 1lh - 2 * var(--_fui-field-stroke)) / 2
|
|
70
|
+
(var(--_fui-field-track, #{$_track}) - 1lh - 2 * var(--_fui-field-stroke, #{$_stroke})) / 2
|
|
63
71
|
);
|
|
64
72
|
overflow-y: hidden;
|
|
65
73
|
}
|
|
@@ -107,18 +115,7 @@
|
|
|
107
115
|
@include field.invalid-state;
|
|
108
116
|
|
|
109
117
|
&:focus-visible {
|
|
110
|
-
|
|
111
|
-
@include focus-ring-error;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Success state — green border for validated fields
|
|
116
|
-
.success {
|
|
117
|
-
border-color: var(--fui-color-success-text, $fui-color-success-text);
|
|
118
|
-
|
|
119
|
-
&:focus-visible {
|
|
120
|
-
border-color: var(--fui-color-success-text, $fui-color-success-text);
|
|
121
|
-
@include focus-ring-success;
|
|
118
|
+
@include field.invalid-focus-state;
|
|
122
119
|
}
|
|
123
120
|
}
|
|
124
121
|
|
|
@@ -127,12 +124,6 @@
|
|
|
127
124
|
color: var(--fui-color-danger-text, $fui-color-danger-text);
|
|
128
125
|
}
|
|
129
126
|
|
|
130
|
-
// Auto-detect success state
|
|
131
|
-
.wrapper[data-success] .helper,
|
|
132
|
-
.helperSuccess {
|
|
133
|
-
color: var(--fui-color-success-text, $fui-color-success-text);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
127
|
// Footer row — helper + character counter side by side
|
|
137
128
|
.footer {
|
|
138
129
|
display: flex;
|
|
@@ -150,7 +141,10 @@
|
|
|
150
141
|
.charCount {
|
|
151
142
|
@include typography.role("caption");
|
|
152
143
|
|
|
153
|
-
margin-block-start: var(
|
|
144
|
+
margin-block-start: var(
|
|
145
|
+
--fui-field-message-gap,
|
|
146
|
+
var(--fui-raw-space-4, #{measurements.raw-space(4)})
|
|
147
|
+
);
|
|
154
148
|
margin-inline-start: auto;
|
|
155
149
|
font-family: var(--fui-font-mono, $fui-font-mono);
|
|
156
150
|
white-space: nowrap;
|
|
@@ -160,30 +154,6 @@
|
|
|
160
154
|
color: var(--fui-color-danger-text, $fui-color-danger-text);
|
|
161
155
|
}
|
|
162
156
|
|
|
163
|
-
// ============================================
|
|
164
|
-
// Accessibility: High Contrast Mode
|
|
165
|
-
// ============================================
|
|
166
|
-
|
|
167
|
-
@media (prefers-contrast: more) {
|
|
168
|
-
.textarea {
|
|
169
|
-
border-width: 2px;
|
|
170
|
-
border-color: var(--fui-text-primary, $fui-text-primary);
|
|
171
|
-
|
|
172
|
-
&:focus-visible {
|
|
173
|
-
border-color: var(--fui-color-accent, $fui-color-accent);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
.error,
|
|
178
|
-
.textarea[aria-invalid] {
|
|
179
|
-
border-color: var(--fui-color-danger-text, $fui-color-danger-text);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
.success {
|
|
183
|
-
border-color: var(--fui-color-success-text, $fui-color-success-text);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
157
|
// ============================================
|
|
188
158
|
// Accessibility: Reduced Motion
|
|
189
159
|
// ============================================
|
|
@@ -28,8 +28,6 @@ export interface TextareaProps extends Omit<
|
|
|
28
28
|
disabled?: boolean;
|
|
29
29
|
/** Error state */
|
|
30
30
|
error?: boolean;
|
|
31
|
-
/** Success state */
|
|
32
|
-
success?: boolean;
|
|
33
31
|
/** Show character count when maxLength is set */
|
|
34
32
|
showCharCount?: boolean;
|
|
35
33
|
/** Label text above the textarea */
|
|
@@ -76,7 +74,6 @@ const TextareaRoot = React.forwardRef<HTMLTextAreaElement, TextareaProps>(functi
|
|
|
76
74
|
size: sizeProp,
|
|
77
75
|
disabled = false,
|
|
78
76
|
error = false,
|
|
79
|
-
success = false,
|
|
80
77
|
showCharCount = false,
|
|
81
78
|
label,
|
|
82
79
|
helperText,
|
|
@@ -113,29 +110,21 @@ const TextareaRoot = React.forwardRef<HTMLTextAreaElement, TextareaProps>(functi
|
|
|
113
110
|
styles.textarea,
|
|
114
111
|
styles[size],
|
|
115
112
|
error && styles.error,
|
|
116
|
-
success && styles.success,
|
|
117
113
|
styles[`resize-${resize}`],
|
|
118
114
|
]
|
|
119
115
|
.filter(Boolean)
|
|
120
116
|
.join(" ");
|
|
121
117
|
|
|
122
|
-
const helperClasses = [
|
|
123
|
-
styles.helper,
|
|
124
|
-
error && styles.helperError,
|
|
125
|
-
success && styles.helperSuccess,
|
|
126
|
-
]
|
|
127
|
-
.filter(Boolean)
|
|
128
|
-
.join(" ");
|
|
118
|
+
const helperClasses = [styles.helper, error && styles.helperError].filter(Boolean).join(" ");
|
|
129
119
|
|
|
130
120
|
const textareaInlineStyle = {
|
|
131
|
-
"--
|
|
132
|
-
"--
|
|
121
|
+
"--fui-textarea-min-rows": minRows ?? 1,
|
|
122
|
+
"--fui-textarea-max-rows": maxRows ?? 9999,
|
|
133
123
|
} as React.CSSProperties;
|
|
134
124
|
|
|
135
125
|
return (
|
|
136
126
|
<div
|
|
137
127
|
{...rootProps}
|
|
138
|
-
data-success={success || undefined}
|
|
139
128
|
className={[styles.wrapper, rootProps?.className, className].filter(Boolean).join(" ")}
|
|
140
129
|
style={{ ...(rootProps?.style ?? {}), ...(wrapperStyle ?? {}) }}
|
|
141
130
|
>
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
3
|
"name": "Theme",
|
|
4
|
-
"description": "
|
|
5
|
-
"category": "
|
|
6
|
-
"tags": [
|
|
7
|
-
"theme",
|
|
8
|
-
"dark-mode",
|
|
9
|
-
"light-mode",
|
|
10
|
-
"provider",
|
|
11
|
-
"toggle"
|
|
12
|
-
],
|
|
4
|
+
"description": "Utility provider that gives everything below it a light, dark, or system color mode.",
|
|
5
|
+
"category": "utilities",
|
|
6
|
+
"tags": ["theme", "dark-mode", "light-mode", "provider", "toggle"],
|
|
13
7
|
"status": "stable",
|
|
14
8
|
"sourcePath": "src/components/Theme/index.tsx",
|
|
15
9
|
"exportName": "ThemeProvider",
|
|
@@ -20,7 +14,9 @@
|
|
|
20
14
|
"mode: light|dark|system",
|
|
21
15
|
"onModeChange: function",
|
|
22
16
|
"storageKey: string (default: fui-theme)",
|
|
23
|
-
"attribute: data-theme|class (default: data-theme)"
|
|
17
|
+
"attribute: data-theme|class (default: data-theme)",
|
|
18
|
+
"Theme.Toggle size: sm|md|lg",
|
|
19
|
+
"Theme.Button size: sm|md|lg"
|
|
24
20
|
],
|
|
25
21
|
"props": {
|
|
26
22
|
"children": {
|
|
@@ -33,31 +29,19 @@
|
|
|
33
29
|
"description": "Default theme mode for uncontrolled usage",
|
|
34
30
|
"default": "system",
|
|
35
31
|
"required": false,
|
|
36
|
-
"values": [
|
|
37
|
-
"light",
|
|
38
|
-
"dark",
|
|
39
|
-
"system"
|
|
40
|
-
]
|
|
32
|
+
"values": ["light", "dark", "system"]
|
|
41
33
|
},
|
|
42
34
|
"defaultTheme": {
|
|
43
35
|
"type": "enum",
|
|
44
36
|
"description": "",
|
|
45
37
|
"required": false,
|
|
46
|
-
"values": [
|
|
47
|
-
"light",
|
|
48
|
-
"dark",
|
|
49
|
-
"system"
|
|
50
|
-
]
|
|
38
|
+
"values": ["light", "dark", "system"]
|
|
51
39
|
},
|
|
52
40
|
"mode": {
|
|
53
41
|
"type": "enum",
|
|
54
42
|
"description": "Controlled theme mode",
|
|
55
43
|
"required": false,
|
|
56
|
-
"values": [
|
|
57
|
-
"light",
|
|
58
|
-
"dark",
|
|
59
|
-
"system"
|
|
60
|
-
]
|
|
44
|
+
"values": ["light", "dark", "system"]
|
|
61
45
|
},
|
|
62
46
|
"onModeChange": {
|
|
63
47
|
"type": "function",
|
|
@@ -75,52 +59,51 @@
|
|
|
75
59
|
"description": "How to apply theme to DOM",
|
|
76
60
|
"default": "data-theme",
|
|
77
61
|
"required": false,
|
|
78
|
-
"values": [
|
|
79
|
-
"data-theme",
|
|
80
|
-
"class"
|
|
81
|
-
]
|
|
62
|
+
"values": ["data-theme", "class"]
|
|
82
63
|
}
|
|
83
64
|
},
|
|
84
65
|
"usage": {
|
|
85
66
|
"when": [
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"Persisting theme preference across sessions"
|
|
67
|
+
"An app needs light and dark modes",
|
|
68
|
+
"The user's choice should survive a reload",
|
|
69
|
+
"You want to honour the OS setting by default"
|
|
90
70
|
],
|
|
91
71
|
"whenNot": [
|
|
92
|
-
"
|
|
93
|
-
"
|
|
72
|
+
"Recoloring one component (use its props)",
|
|
73
|
+
"A single one-off color swap (use a CSS variable)"
|
|
94
74
|
],
|
|
95
75
|
"guidelines": [
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"ThemeToggle forwards DOM props (id, data-*, className, handlers) to the toggle group"
|
|
76
|
+
"ThemeProvider goes at the root, once",
|
|
77
|
+
"useTheme reads and sets the mode anywhere below it",
|
|
78
|
+
"storageKey renames the localStorage entry",
|
|
79
|
+
"attribute=\"class\" if your CSS keys off .dark instead of data-theme",
|
|
80
|
+
"ThemeProvider renders no chrome of its own; Theme.Toggle is the segmented light/dark/system control and Theme.Button the single icon button for tight toolbars"
|
|
102
81
|
],
|
|
103
82
|
"accessibility": [
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"System preference is detected via prefers-color-scheme media query"
|
|
83
|
+
"The toggle's label names the mode it is in",
|
|
84
|
+
"System mode follows prefers-color-scheme"
|
|
107
85
|
]
|
|
108
86
|
},
|
|
109
87
|
"examples": [
|
|
110
88
|
{
|
|
111
89
|
"name": "Default",
|
|
112
|
-
"description": "
|
|
113
|
-
"code": "<ThemeProvider defaultMode=\"system\">\n <
|
|
90
|
+
"description": "Wrap the app once; every token below resolves to the active mode.",
|
|
91
|
+
"code": "<ThemeProvider defaultMode=\"system\">\n <div\n style={{\n padding: '16px',\n borderRadius: '8px',\n background: 'var(--fui-bg-elevated)',\n color: 'var(--fui-text-primary)',\n }}\n >\n Everything inside follows the system color scheme.\n </div>\n</ThemeProvider>"
|
|
114
92
|
},
|
|
115
93
|
{
|
|
116
94
|
"name": "With Toggle",
|
|
117
|
-
"description": "
|
|
95
|
+
"description": "The toggle cycles light, dark, then back to system.",
|
|
118
96
|
"code": "<ThemeProvider defaultMode=\"light\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <ThemeToggle />\n <span>Click to cycle themes</span>\n </div>\n</ThemeProvider>"
|
|
119
97
|
},
|
|
120
98
|
{
|
|
121
99
|
"name": "Toggle Sizes",
|
|
122
|
-
"description": "
|
|
100
|
+
"description": "Three sizes so the control fits whatever bar holds it.",
|
|
123
101
|
"code": "<ThemeProvider defaultMode=\"light\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <ThemeToggle size=\"sm\" />\n <ThemeToggle size=\"md\" />\n <ThemeToggle size=\"lg\" />\n </div>\n</ThemeProvider>"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "Theme Button",
|
|
105
|
+
"description": "A single icon button for toolbars with no room to spare.",
|
|
106
|
+
"code": "<ThemeProvider defaultMode=\"system\">\n <ThemeButton aria-label=\"Switch color mode\" />\n</ThemeProvider>"
|
|
124
107
|
}
|
|
125
108
|
],
|
|
126
109
|
"relations": [
|
|
@@ -136,12 +119,11 @@
|
|
|
136
119
|
"mode: light|dark|system - controlled mode",
|
|
137
120
|
"onModeChange: (mode) => void - change handler",
|
|
138
121
|
"attribute: data-theme|class - DOM theme attribute",
|
|
139
|
-
"
|
|
140
|
-
"
|
|
122
|
+
"Theme.Toggle size: sm|md|lg - segmented light/dark/system control",
|
|
123
|
+
"Theme.Toggle forwards div DOM props to the button group root",
|
|
124
|
+
"Theme.Button size: sm|md|lg - single ghost icon button that flips light and dark, built on IconButton"
|
|
141
125
|
],
|
|
142
|
-
"a11yRules": [
|
|
143
|
-
"A11Y_TARGET_SIZE_MIN"
|
|
144
|
-
]
|
|
126
|
+
"a11yRules": ["A11Y_TARGET_SIZE_MIN"]
|
|
145
127
|
},
|
|
146
128
|
"provenance": {
|
|
147
129
|
"source": "migrated",
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { ComponentDefaultsProvider, type ComponentDefaults } from "../ComponentDefaults";
|
|
5
|
-
import { ThemeToggle } from "../ThemeToggle";
|
|
5
|
+
import { ThemeButton, ThemeToggle } from "../ThemeToggle";
|
|
6
6
|
import { ThemeContext, useTheme, type ThemeContextValue, type ThemeMode } from "./context";
|
|
7
7
|
|
|
8
|
-
export type { ThemeToggleProps } from "../ThemeToggle";
|
|
8
|
+
export type { ThemeButtonProps, ThemeToggleProps } from "../ThemeToggle";
|
|
9
9
|
export type { ThemeMode, UseThemeReturn } from "./context";
|
|
10
10
|
|
|
11
11
|
// ============================================
|
|
@@ -68,6 +68,22 @@ function useSystemPreference(): "light" | "dark" {
|
|
|
68
68
|
* ThemeProvider - Provides theme context to children
|
|
69
69
|
* SSR-safe: initializes from localStorage in useEffect
|
|
70
70
|
*/
|
|
71
|
+
function suppressTransitions(): () => void {
|
|
72
|
+
const style = document.createElement("style");
|
|
73
|
+
style.textContent = "*,*::before,*::after{transition:none!important}";
|
|
74
|
+
document.head.append(style);
|
|
75
|
+
return () => {
|
|
76
|
+
// Read layout for its side effect: a synchronous style flush commits the
|
|
77
|
+
// new colors while the override still applies, so nothing starts moving.
|
|
78
|
+
void document.body.offsetHeight;
|
|
79
|
+
if (typeof requestAnimationFrame === "function") {
|
|
80
|
+
requestAnimationFrame(() => requestAnimationFrame(() => style.remove()));
|
|
81
|
+
} else {
|
|
82
|
+
style.remove();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
71
87
|
function ThemeProvider({
|
|
72
88
|
children,
|
|
73
89
|
componentDefaults,
|
|
@@ -81,7 +97,7 @@ function ThemeProvider({
|
|
|
81
97
|
const systemPreference = useSystemPreference();
|
|
82
98
|
|
|
83
99
|
// Warn on deprecated prop usage (dev only)
|
|
84
|
-
if (
|
|
100
|
+
if (!isProductionBuild() && defaultTheme !== undefined) {
|
|
85
101
|
console.warn(
|
|
86
102
|
"[Fragments] ThemeProvider: `defaultTheme` is deprecated. Use `defaultMode` instead. " +
|
|
87
103
|
"`defaultTheme` will be removed in v1.0."
|
|
@@ -121,6 +137,20 @@ function ThemeProvider({
|
|
|
121
137
|
if (typeof document === "undefined" || !mounted) return;
|
|
122
138
|
|
|
123
139
|
const root = document.documentElement;
|
|
140
|
+
const current =
|
|
141
|
+
attribute === "data-theme"
|
|
142
|
+
? root.getAttribute("data-theme")
|
|
143
|
+
: root.classList.contains("dark")
|
|
144
|
+
? "dark"
|
|
145
|
+
: root.classList.contains("light")
|
|
146
|
+
? "light"
|
|
147
|
+
: null;
|
|
148
|
+
|
|
149
|
+
// A flip changes color, background, border and shadow on nearly every
|
|
150
|
+
// element at once; every transition on those properties would fire
|
|
151
|
+
// together and the switch smears instead of snapping. Turn transitions
|
|
152
|
+
// off for the swap, flush, then restore on the next frame.
|
|
153
|
+
const restore = current !== resolvedMode ? suppressTransitions() : null;
|
|
124
154
|
|
|
125
155
|
if (attribute === "data-theme") {
|
|
126
156
|
root.setAttribute("data-theme", resolvedMode);
|
|
@@ -128,6 +158,8 @@ function ThemeProvider({
|
|
|
128
158
|
root.classList.remove("light", "dark");
|
|
129
159
|
root.classList.add(resolvedMode);
|
|
130
160
|
}
|
|
161
|
+
|
|
162
|
+
restore?.();
|
|
131
163
|
}, [resolvedMode, attribute, mounted]);
|
|
132
164
|
|
|
133
165
|
// Persist to localStorage when mode changes
|
|
@@ -182,27 +214,27 @@ export const Theme = Object.assign(ThemeProvider, {
|
|
|
182
214
|
Root: ThemeProvider,
|
|
183
215
|
Provider: ThemeProvider,
|
|
184
216
|
Toggle: ThemeToggle,
|
|
217
|
+
Button: ThemeButton,
|
|
185
218
|
useTheme,
|
|
186
219
|
});
|
|
187
220
|
|
|
188
|
-
export { ThemeProvider, ThemeToggle, useTheme };
|
|
221
|
+
export { ThemeProvider, ThemeToggle, ThemeButton, useTheme };
|
|
189
222
|
|
|
190
223
|
// ============================================
|
|
191
224
|
// configureTheme — JS-only seed configuration
|
|
192
225
|
// ============================================
|
|
193
226
|
|
|
194
227
|
// Import + re-export seed derivation types — canonical definitions in utils/seed-derivation.ts
|
|
195
|
-
import type { NeutralPalette,
|
|
228
|
+
import type { NeutralPalette, RadiusStyle } from "../../utils/seed-derivation";
|
|
196
229
|
import { applyMeasurementSelection } from "../../measurements";
|
|
197
|
-
|
|
230
|
+
import { isProductionBuild } from "../../utils/env";
|
|
231
|
+
export type { NeutralPalette, RadiusStyle };
|
|
198
232
|
|
|
199
233
|
export interface ConfigureThemeOptions {
|
|
200
234
|
/** Brand/accent color as hex */
|
|
201
235
|
brand?: string;
|
|
202
236
|
/** Neutral palette name */
|
|
203
237
|
neutral?: NeutralPalette;
|
|
204
|
-
/** Spacing density preset */
|
|
205
|
-
density?: DensityPreset;
|
|
206
238
|
/** Border radius style */
|
|
207
239
|
radiusStyle?: RadiusStyle;
|
|
208
240
|
/** Danger/error color as hex */
|
|
@@ -247,7 +279,6 @@ function setVar(el: HTMLElement, name: string, value: string) {
|
|
|
247
279
|
* configureTheme({
|
|
248
280
|
* brand: '#6366f1',
|
|
249
281
|
* neutral: 'ice',
|
|
250
|
-
* density: 'compact',
|
|
251
282
|
* radiusStyle: 'rounded',
|
|
252
283
|
* });
|
|
253
284
|
* ```
|
|
@@ -277,8 +308,5 @@ export function configureTheme(options: ConfigureThemeOptions): void {
|
|
|
277
308
|
// Named geometry is selected through the generated Measurement Module.
|
|
278
309
|
// Partial calls leave the omitted selector untouched and never write numeric
|
|
279
310
|
// CSS maps inline.
|
|
280
|
-
applyMeasurementSelection(root, {
|
|
281
|
-
density: options.density,
|
|
282
|
-
radiusStyle: options.radiusStyle,
|
|
283
|
-
});
|
|
311
|
+
applyMeasurementSelection(root, { radiusStyle: options.radiusStyle });
|
|
284
312
|
}
|