@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,36 +1,71 @@
|
|
|
1
|
-
import * as React from
|
|
2
|
-
import styles from
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import styles from "./Text.module.scss";
|
|
3
|
+
import { isProductionBuild } from "../../utils/env";
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Typography component for rendering text with consistent styling.
|
|
6
7
|
* @see https://usefragments.com/components/text
|
|
7
8
|
*/
|
|
8
9
|
export type TextRole =
|
|
9
|
-
|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
|
10
|
+
| "caption"
|
|
11
|
+
| "ui-compact"
|
|
12
|
+
| "ui-standard"
|
|
13
|
+
| "body-compact"
|
|
14
|
+
| "body-relaxed"
|
|
15
|
+
| "title-sm"
|
|
16
|
+
| "title-md"
|
|
17
|
+
| "title-lg"
|
|
18
|
+
| "display"
|
|
19
|
+
| "code";
|
|
18
20
|
|
|
19
|
-
export type TextSize =
|
|
20
|
-
export type TextWeight =
|
|
21
|
-
export type TextFont =
|
|
22
|
-
export type TextTracking =
|
|
21
|
+
export type TextSize = "2xs" | "xs" | "sm" | "base" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl";
|
|
22
|
+
export type TextWeight = "normal" | "medium" | "semibold" | "bold";
|
|
23
|
+
export type TextFont = "sans" | "mono";
|
|
24
|
+
export type TextTracking = "normal" | "tight" | "tighter" | "tightest";
|
|
23
25
|
|
|
24
|
-
type TextSharedProps = Omit<React.HTMLAttributes<HTMLElement>,
|
|
26
|
+
type TextSharedProps = Omit<React.HTMLAttributes<HTMLElement>, "color" | "role"> & {
|
|
25
27
|
children: React.ReactNode;
|
|
26
28
|
/** HTML element to render.
|
|
27
29
|
* @default "span" */
|
|
28
|
-
as?:
|
|
29
|
-
|
|
30
|
+
as?:
|
|
31
|
+
| "h1"
|
|
32
|
+
| "h2"
|
|
33
|
+
| "h3"
|
|
34
|
+
| "h4"
|
|
35
|
+
| "h5"
|
|
36
|
+
| "h6"
|
|
37
|
+
| "p"
|
|
38
|
+
| "span"
|
|
39
|
+
| "label"
|
|
40
|
+
| "div"
|
|
41
|
+
| "strong"
|
|
42
|
+
| "em"
|
|
43
|
+
| "small"
|
|
44
|
+
| "mark"
|
|
45
|
+
| "del"
|
|
46
|
+
| "ins"
|
|
47
|
+
| "sub"
|
|
48
|
+
| "sup"
|
|
49
|
+
| "time"
|
|
50
|
+
| "address"
|
|
51
|
+
| "blockquote"
|
|
52
|
+
| "cite"
|
|
53
|
+
| "code"
|
|
54
|
+
| "abbr";
|
|
55
|
+
/** Text color. `"muted"` is an alias for `"tertiary"`. `"accent"` is the brand
|
|
56
|
+
* spend for one word inside a line (a repo name). `"success" | "warning" | "danger"`
|
|
30
57
|
* are for a run of text that carries a state on its own; prefer Badge or Alert when the
|
|
31
58
|
* state deserves a container.
|
|
32
59
|
* @default "primary" */
|
|
33
|
-
color?:
|
|
60
|
+
color?:
|
|
61
|
+
| "primary"
|
|
62
|
+
| "secondary"
|
|
63
|
+
| "tertiary"
|
|
64
|
+
| "muted"
|
|
65
|
+
| "accent"
|
|
66
|
+
| "success"
|
|
67
|
+
| "warning"
|
|
68
|
+
| "danger";
|
|
34
69
|
/** Truncate text with ellipsis when it overflows */
|
|
35
70
|
truncate?: boolean;
|
|
36
71
|
/** Number of lines before truncating (requires truncate=true) */
|
|
@@ -55,7 +90,7 @@ type TextRoleProps = {
|
|
|
55
90
|
type TextLegacyScaleProps = {
|
|
56
91
|
role?: never;
|
|
57
92
|
size?: TextSize;
|
|
58
|
-
variant?:
|
|
93
|
+
variant?: "section-label" | "eyebrow";
|
|
59
94
|
weight?: TextWeight;
|
|
60
95
|
font?: TextFont;
|
|
61
96
|
letterSpacing?: TextTracking;
|
|
@@ -63,65 +98,68 @@ type TextLegacyScaleProps = {
|
|
|
63
98
|
|
|
64
99
|
export type TextProps = TextSharedProps & (TextRoleProps | TextLegacyScaleProps);
|
|
65
100
|
|
|
66
|
-
const TextRoot = React.forwardRef<HTMLElement, TextProps>(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
: false;
|
|
101
|
+
const TextRoot = React.forwardRef<HTMLElement, TextProps>(function Text(
|
|
102
|
+
{
|
|
103
|
+
children,
|
|
104
|
+
as: Component = "span",
|
|
105
|
+
role,
|
|
106
|
+
variant,
|
|
107
|
+
size,
|
|
108
|
+
weight,
|
|
109
|
+
color,
|
|
110
|
+
font,
|
|
111
|
+
truncate,
|
|
112
|
+
lineClamp,
|
|
113
|
+
letterSpacing,
|
|
114
|
+
tabularNums,
|
|
115
|
+
className,
|
|
116
|
+
style,
|
|
117
|
+
...htmlProps
|
|
118
|
+
},
|
|
119
|
+
ref
|
|
120
|
+
) {
|
|
121
|
+
const ignoredLegacyProps = role
|
|
122
|
+
? [size, variant, weight, font, letterSpacing].some((value) => value !== undefined)
|
|
123
|
+
: false;
|
|
90
124
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
125
|
+
if (!isProductionBuild() && ignoredLegacyProps) {
|
|
126
|
+
console.warn(
|
|
127
|
+
"[Text] Semantic role takes precedence over size, variant, weight, font, and letterSpacing."
|
|
128
|
+
);
|
|
129
|
+
}
|
|
96
130
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
131
|
+
const classes = [
|
|
132
|
+
styles.text,
|
|
133
|
+
role && styles[`role-${role}`],
|
|
134
|
+
!role && variant && styles[`variant-${variant}`],
|
|
135
|
+
!role && size && styles[`size-${size}`],
|
|
136
|
+
!role && weight && styles[`weight-${weight}`],
|
|
137
|
+
color && styles[`color-${color}`],
|
|
138
|
+
!role && font === "mono" && styles.mono,
|
|
139
|
+
truncate && styles.truncate,
|
|
140
|
+
lineClamp && styles.lineClamp,
|
|
141
|
+
!role && letterSpacing && styles[`tracking-${letterSpacing}`],
|
|
142
|
+
tabularNums && styles.tabularNums,
|
|
143
|
+
className,
|
|
144
|
+
]
|
|
145
|
+
.filter(Boolean)
|
|
146
|
+
.join(" ");
|
|
113
147
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
148
|
+
const lineClampStyle = lineClamp
|
|
149
|
+
? ({ "--fui-line-clamp": lineClamp, ...style } as React.CSSProperties)
|
|
150
|
+
: style;
|
|
117
151
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
152
|
+
return (
|
|
153
|
+
<Component
|
|
154
|
+
ref={ref as React.Ref<never>}
|
|
155
|
+
className={classes}
|
|
156
|
+
style={lineClampStyle}
|
|
157
|
+
{...htmlProps}
|
|
158
|
+
>
|
|
159
|
+
{children}
|
|
160
|
+
</Component>
|
|
161
|
+
);
|
|
162
|
+
});
|
|
125
163
|
|
|
126
164
|
export const Text = Object.assign(TextRoot, {
|
|
127
165
|
Root: TextRoot,
|
|
@@ -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",
|
|
@@ -78,23 +73,14 @@
|
|
|
78
73
|
"description": "Resize behavior",
|
|
79
74
|
"default": "vertical",
|
|
80
75
|
"required": false,
|
|
81
|
-
"values": [
|
|
82
|
-
"none",
|
|
83
|
-
"vertical",
|
|
84
|
-
"horizontal",
|
|
85
|
-
"both"
|
|
86
|
-
]
|
|
76
|
+
"values": ["none", "vertical", "horizontal", "both"]
|
|
87
77
|
},
|
|
88
78
|
"size": {
|
|
89
79
|
"type": "enum",
|
|
90
80
|
"description": "Size variant",
|
|
91
81
|
"default": "md",
|
|
92
82
|
"required": false,
|
|
93
|
-
"values": [
|
|
94
|
-
"sm",
|
|
95
|
-
"md",
|
|
96
|
-
"lg"
|
|
97
|
-
]
|
|
83
|
+
"values": ["sm", "md", "lg"]
|
|
98
84
|
},
|
|
99
85
|
"disabled": {
|
|
100
86
|
"type": "boolean",
|
|
@@ -209,61 +195,61 @@
|
|
|
209
195
|
"Selecting from predefined options (use Select)"
|
|
210
196
|
],
|
|
211
197
|
"guidelines": [
|
|
212
|
-
"Set
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
"
|
|
198
|
+
"Set rows to match the expected answer length",
|
|
199
|
+
"Placeholder shows an example, not the label",
|
|
200
|
+
"Pair maxLength with showCharCount so the limit is visible",
|
|
201
|
+
"Use resize=\"none\" only when the layout truly cannot flex"
|
|
216
202
|
],
|
|
217
203
|
"accessibility": [
|
|
218
|
-
"
|
|
219
|
-
"
|
|
220
|
-
"Error
|
|
204
|
+
"Give every textarea a visible label",
|
|
205
|
+
"Put format hints in helperText, not the placeholder",
|
|
206
|
+
"Error text says what to fix, not just that it failed"
|
|
221
207
|
]
|
|
222
208
|
},
|
|
223
209
|
"examples": [
|
|
224
210
|
{
|
|
225
211
|
"name": "Default",
|
|
226
|
-
"description": "
|
|
212
|
+
"description": "Three rows, draggable from the bottom-right corner.",
|
|
227
213
|
"code": "<Textarea\n label=\"Description\"\n placeholder=\"Enter a description...\"\n/>"
|
|
228
214
|
},
|
|
229
215
|
{
|
|
230
216
|
"name": "With Helper Text",
|
|
231
|
-
"description": "
|
|
217
|
+
"description": "Supporting text sits under the box.",
|
|
232
218
|
"code": "<Textarea\n label=\"Bio\"\n placeholder=\"Tell us about yourself...\"\n helperText=\"Max 500 characters\"\n maxLength={500}\n/>"
|
|
233
219
|
},
|
|
234
220
|
{
|
|
235
221
|
"name": "Error State",
|
|
236
|
-
"description": "
|
|
222
|
+
"description": "Red border, and helperText becomes the reason.",
|
|
237
223
|
"code": "<Textarea\n label=\"Comments\"\n placeholder=\"Add your comments...\"\n error\n helperText=\"This field is required\"\n/>"
|
|
238
224
|
},
|
|
239
225
|
{
|
|
240
226
|
"name": "Disabled",
|
|
241
|
-
"description": "
|
|
227
|
+
"description": "Dimmed and unfocusable.",
|
|
242
228
|
"code": "<Textarea\n label=\"Notes\"\n placeholder=\"Cannot edit...\"\n disabled\n/>"
|
|
243
229
|
},
|
|
244
230
|
{
|
|
245
231
|
"name": "Custom Rows",
|
|
246
|
-
"description": "
|
|
232
|
+
"description": "rows={6} doubles the visible height before scrolling.",
|
|
247
233
|
"code": "<Textarea\n label=\"Long Description\"\n placeholder=\"Enter detailed information...\"\n rows={6}\n/>"
|
|
248
234
|
},
|
|
249
235
|
{
|
|
250
236
|
"name": "Sizes",
|
|
251
|
-
"description": "
|
|
237
|
+
"description": "Three heights: sm, md, lg.",
|
|
252
238
|
"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
239
|
},
|
|
254
240
|
{
|
|
255
|
-
"name": "
|
|
256
|
-
"description": "
|
|
257
|
-
"code": "<Textarea\n label=\"Notes\"\n placeholder=\"Add notes...\"\n
|
|
241
|
+
"name": "Fixed Height",
|
|
242
|
+
"description": "resize=\"none\" removes the drag handle so the box stays put.",
|
|
243
|
+
"code": "<Textarea\n label=\"Notes\"\n placeholder=\"Add notes...\"\n resize=\"none\"\n/>"
|
|
258
244
|
},
|
|
259
245
|
{
|
|
260
246
|
"name": "Success State",
|
|
261
|
-
"description": "
|
|
247
|
+
"description": "Green border confirms the value passed validation.",
|
|
262
248
|
"code": "<Textarea\n label=\"Bio\"\n value=\"A short bio about myself.\"\n success\n helperText=\"Looks great!\"\n/>"
|
|
263
249
|
},
|
|
264
250
|
{
|
|
265
251
|
"name": "With Character Counter",
|
|
266
|
-
"description": "
|
|
252
|
+
"description": "Live count against maxLength sits below the box.",
|
|
267
253
|
"code": "<Textarea\n label=\"Bio\"\n placeholder=\"Tell us about yourself...\"\n maxLength={200}\n showCharCount\n/>"
|
|
268
254
|
}
|
|
269
255
|
],
|
|
@@ -289,15 +275,11 @@
|
|
|
289
275
|
"rootProps: HTMLAttributes<HTMLDivElement> - wrapper element props",
|
|
290
276
|
"...native textarea attributes are supported (readOnly, autoComplete, maxLength, onKeyDown, etc.)"
|
|
291
277
|
],
|
|
292
|
-
"a11yRules": [
|
|
293
|
-
"A11Y_LABEL_REQUIRED"
|
|
294
|
-
]
|
|
278
|
+
"a11yRules": ["A11Y_LABEL_REQUIRED"]
|
|
295
279
|
},
|
|
296
280
|
"ai": {
|
|
297
281
|
"compositionPattern": "compound",
|
|
298
|
-
"subComponents": [
|
|
299
|
-
"Root"
|
|
300
|
-
]
|
|
282
|
+
"subComponents": ["Root"]
|
|
301
283
|
},
|
|
302
284
|
"provenance": {
|
|
303
285
|
"source": "migrated",
|
|
@@ -58,9 +58,7 @@
|
|
|
58
58
|
&[rows="1"] {
|
|
59
59
|
block-size: var(--_fui-field-track);
|
|
60
60
|
min-block-size: var(--_fui-field-track);
|
|
61
|
-
padding-block: calc(
|
|
62
|
-
(var(--_fui-field-track) - 1lh - 2 * var(--_fui-field-stroke)) / 2
|
|
63
|
-
);
|
|
61
|
+
padding-block: calc((var(--_fui-field-track) - 1lh - 2 * var(--_fui-field-stroke)) / 2);
|
|
64
62
|
overflow-y: hidden;
|
|
65
63
|
}
|
|
66
64
|
}
|
|
@@ -166,7 +164,7 @@
|
|
|
166
164
|
|
|
167
165
|
@media (prefers-contrast: more) {
|
|
168
166
|
.textarea {
|
|
169
|
-
border-width: 2px;
|
|
167
|
+
border-width: var(--fui-stroke-default, 2px);
|
|
170
168
|
border-color: var(--fui-text-primary, $fui-text-primary);
|
|
171
169
|
|
|
172
170
|
&:focus-visible {
|
|
@@ -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": "Gives every component below it a light, dark, or system color mode, and remembers the choice.",
|
|
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,8 @@
|
|
|
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
|
+
"ThemeToggle appearance: group|icon (default: group)"
|
|
24
19
|
],
|
|
25
20
|
"props": {
|
|
26
21
|
"children": {
|
|
@@ -33,31 +28,19 @@
|
|
|
33
28
|
"description": "Default theme mode for uncontrolled usage",
|
|
34
29
|
"default": "system",
|
|
35
30
|
"required": false,
|
|
36
|
-
"values": [
|
|
37
|
-
"light",
|
|
38
|
-
"dark",
|
|
39
|
-
"system"
|
|
40
|
-
]
|
|
31
|
+
"values": ["light", "dark", "system"]
|
|
41
32
|
},
|
|
42
33
|
"defaultTheme": {
|
|
43
34
|
"type": "enum",
|
|
44
35
|
"description": "",
|
|
45
36
|
"required": false,
|
|
46
|
-
"values": [
|
|
47
|
-
"light",
|
|
48
|
-
"dark",
|
|
49
|
-
"system"
|
|
50
|
-
]
|
|
37
|
+
"values": ["light", "dark", "system"]
|
|
51
38
|
},
|
|
52
39
|
"mode": {
|
|
53
40
|
"type": "enum",
|
|
54
41
|
"description": "Controlled theme mode",
|
|
55
42
|
"required": false,
|
|
56
|
-
"values": [
|
|
57
|
-
"light",
|
|
58
|
-
"dark",
|
|
59
|
-
"system"
|
|
60
|
-
]
|
|
43
|
+
"values": ["light", "dark", "system"]
|
|
61
44
|
},
|
|
62
45
|
"onModeChange": {
|
|
63
46
|
"type": "function",
|
|
@@ -75,52 +58,51 @@
|
|
|
75
58
|
"description": "How to apply theme to DOM",
|
|
76
59
|
"default": "data-theme",
|
|
77
60
|
"required": false,
|
|
78
|
-
"values": [
|
|
79
|
-
"data-theme",
|
|
80
|
-
"class"
|
|
81
|
-
]
|
|
61
|
+
"values": ["data-theme", "class"]
|
|
82
62
|
}
|
|
83
63
|
},
|
|
84
64
|
"usage": {
|
|
85
65
|
"when": [
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"Persisting theme preference across sessions"
|
|
66
|
+
"An app needs light and dark modes",
|
|
67
|
+
"The user's choice should survive a reload",
|
|
68
|
+
"You want to honour the OS setting by default"
|
|
90
69
|
],
|
|
91
70
|
"whenNot": [
|
|
92
|
-
"
|
|
93
|
-
"
|
|
71
|
+
"Recoloring one component (use its props)",
|
|
72
|
+
"A single one-off color swap (use a CSS variable)"
|
|
94
73
|
],
|
|
95
74
|
"guidelines": [
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"ThemeToggle forwards DOM props (id, data-*, className, handlers) to the toggle group"
|
|
75
|
+
"ThemeProvider goes at the root, once",
|
|
76
|
+
"useTheme reads and sets the mode anywhere below it",
|
|
77
|
+
"storageKey renames the localStorage entry",
|
|
78
|
+
"attribute=\"class\" if your CSS keys off .dark instead of data-theme",
|
|
79
|
+
"appearance=\"icon\" for tight toolbars; the default group shows both modes"
|
|
102
80
|
],
|
|
103
81
|
"accessibility": [
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"System preference is detected via prefers-color-scheme media query"
|
|
82
|
+
"The toggle's label names the mode it is in",
|
|
83
|
+
"System mode follows prefers-color-scheme"
|
|
107
84
|
]
|
|
108
85
|
},
|
|
109
86
|
"examples": [
|
|
110
87
|
{
|
|
111
88
|
"name": "Default",
|
|
112
|
-
"description": "
|
|
113
|
-
"code": "<ThemeProvider defaultMode=\"system\">\n <
|
|
89
|
+
"description": "Wrap the app once; every token below resolves to the active mode.",
|
|
90
|
+
"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
91
|
},
|
|
115
92
|
{
|
|
116
93
|
"name": "With Toggle",
|
|
117
|
-
"description": "
|
|
94
|
+
"description": "The toggle cycles light, dark, then back to system.",
|
|
118
95
|
"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
96
|
},
|
|
120
97
|
{
|
|
121
98
|
"name": "Toggle Sizes",
|
|
122
|
-
"description": "
|
|
99
|
+
"description": "Three sizes so the control fits whatever bar holds it.",
|
|
123
100
|
"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>"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "Icon Toggle",
|
|
104
|
+
"description": "A single icon button for toolbars with no room to spare.",
|
|
105
|
+
"code": "<ThemeProvider defaultMode=\"system\">\n <ThemeToggle appearance=\"icon\" aria-label=\"Switch color mode\" />\n</ThemeProvider>"
|
|
124
106
|
}
|
|
125
107
|
],
|
|
126
108
|
"relations": [
|
|
@@ -137,11 +119,10 @@
|
|
|
137
119
|
"onModeChange: (mode) => void - change handler",
|
|
138
120
|
"attribute: data-theme|class - DOM theme attribute",
|
|
139
121
|
"ThemeToggle size: sm|md|lg - toggle button size",
|
|
122
|
+
"ThemeToggle appearance: group|icon - segmented or compact icon control (default: group)",
|
|
140
123
|
"ThemeToggle forwards div DOM props to the button group root"
|
|
141
124
|
],
|
|
142
|
-
"a11yRules": [
|
|
143
|
-
"A11Y_TARGET_SIZE_MIN"
|
|
144
|
-
]
|
|
125
|
+
"a11yRules": ["A11Y_TARGET_SIZE_MIN"]
|
|
145
126
|
},
|
|
146
127
|
"provenance": {
|
|
147
128
|
"source": "migrated",
|
|
@@ -81,7 +81,7 @@ function ThemeProvider({
|
|
|
81
81
|
const systemPreference = useSystemPreference();
|
|
82
82
|
|
|
83
83
|
// Warn on deprecated prop usage (dev only)
|
|
84
|
-
if (
|
|
84
|
+
if (!isProductionBuild() && defaultTheme !== undefined) {
|
|
85
85
|
console.warn(
|
|
86
86
|
"[Fragments] ThemeProvider: `defaultTheme` is deprecated. Use `defaultMode` instead. " +
|
|
87
87
|
"`defaultTheme` will be removed in v1.0."
|
|
@@ -194,6 +194,7 @@ export { ThemeProvider, ThemeToggle, useTheme };
|
|
|
194
194
|
// Import + re-export seed derivation types — canonical definitions in utils/seed-derivation.ts
|
|
195
195
|
import type { NeutralPalette, DensityPreset, RadiusStyle } from "../../utils/seed-derivation";
|
|
196
196
|
import { applyMeasurementSelection } from "../../measurements";
|
|
197
|
+
import { isProductionBuild } from "../../utils/env";
|
|
197
198
|
export type { NeutralPalette, DensityPreset, RadiusStyle };
|
|
198
199
|
|
|
199
200
|
export interface ConfigureThemeOptions {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
align-items: stretch;
|
|
12
12
|
gap: 0;
|
|
13
13
|
padding: 0;
|
|
14
|
-
background-color: var(--fui-bg-tertiary, $fui-bg-tertiary);
|
|
14
|
+
background-color: var(--fui-theme-toggle-bg, var(--fui-bg-tertiary, #{$fui-bg-tertiary}));
|
|
15
15
|
border-radius: var(--fui-radius-md, $fui-radius-md);
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -36,14 +36,28 @@
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
.toggleButtonActive {
|
|
39
|
-
background-color: var(
|
|
39
|
+
background-color: var(
|
|
40
|
+
--fui-theme-toggle-active-bg,
|
|
41
|
+
var(--fui-control-selected-bg, #{$fui-bg-active})
|
|
42
|
+
);
|
|
40
43
|
color: var(--fui-text-primary, $fui-text-primary);
|
|
41
|
-
box-shadow: var(--fui-shadow
|
|
44
|
+
box-shadow: var(--fui-theme-toggle-active-shadow, none);
|
|
42
45
|
}
|
|
43
46
|
|
|
44
|
-
|
|
47
|
+
.iconButton {
|
|
48
|
+
background-color: transparent;
|
|
49
|
+
color: var(--fui-text-secondary, $fui-text-secondary);
|
|
50
|
+
|
|
51
|
+
&:hover {
|
|
52
|
+
color: var(--fui-text-primary, $fui-text-primary);
|
|
53
|
+
background-color: var(--fui-bg-hover, $fui-bg-hover);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Size variants — nested for the group, same-element for appearance="icon"
|
|
45
58
|
.sizeSm {
|
|
46
|
-
.toggleButton
|
|
59
|
+
.toggleButton,
|
|
60
|
+
&.toggleButton {
|
|
47
61
|
@include action.icon-only("sm");
|
|
48
62
|
|
|
49
63
|
svg {
|
|
@@ -53,7 +67,8 @@
|
|
|
53
67
|
}
|
|
54
68
|
|
|
55
69
|
.sizeMd {
|
|
56
|
-
.toggleButton
|
|
70
|
+
.toggleButton,
|
|
71
|
+
&.toggleButton {
|
|
57
72
|
@include action.icon-only("md");
|
|
58
73
|
|
|
59
74
|
svg {
|
|
@@ -63,7 +78,8 @@
|
|
|
63
78
|
}
|
|
64
79
|
|
|
65
80
|
.sizeLg {
|
|
66
|
-
.toggleButton
|
|
81
|
+
.toggleButton,
|
|
82
|
+
&.toggleButton {
|
|
67
83
|
@include action.icon-only("lg");
|
|
68
84
|
|
|
69
85
|
svg {
|