@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
|
@@ -47,8 +47,8 @@ $fui-base-unit: computed.$computed-base-unit !default;
|
|
|
47
47
|
// Typography
|
|
48
48
|
// --------------------------------------------
|
|
49
49
|
$fui-font-sans:
|
|
50
|
-
"
|
|
51
|
-
|
|
50
|
+
"Onest Variable",
|
|
51
|
+
Onest,
|
|
52
52
|
-apple-system,
|
|
53
53
|
BlinkMacSystemFont,
|
|
54
54
|
"Segoe UI",
|
|
@@ -188,6 +188,17 @@ $fui-radius-lg: computed.$computed-radius-lg !default;
|
|
|
188
188
|
$fui-radius-xl: computed.$computed-radius-xl !default;
|
|
189
189
|
$fui-radius-full: computed.$computed-radius-full !default;
|
|
190
190
|
|
|
191
|
+
// --------------------------------------------
|
|
192
|
+
// Strokes + control tracks (mirror the measurement CSS vars for SCSS fallbacks)
|
|
193
|
+
// --------------------------------------------
|
|
194
|
+
$fui-stroke-hairline: measurements.target-value("stroke", "hairline") !default;
|
|
195
|
+
$fui-stroke-default: measurements.target-value("stroke", "default") !default;
|
|
196
|
+
$fui-stroke-strong: measurements.target-value("stroke", "strong") !default;
|
|
197
|
+
$fui-control-track-micro: measurements.target-value("controlTrack", "micro") !default;
|
|
198
|
+
$fui-control-track-sm: measurements.target-value("controlTrack", "sm") !default;
|
|
199
|
+
$fui-control-track-md: measurements.target-value("controlTrack", "md") !default;
|
|
200
|
+
$fui-control-track-lg: measurements.target-value("controlTrack", "lg") !default;
|
|
201
|
+
|
|
191
202
|
// --------------------------------------------
|
|
192
203
|
// Transitions
|
|
193
204
|
// --------------------------------------------
|
|
@@ -236,9 +247,10 @@ $fui-bg-elevated: computed.$computed-bg-elevated !default;
|
|
|
236
247
|
$fui-bg-subtle: computed.$computed-bg-subtle !default;
|
|
237
248
|
$fui-bg-hover: computed.$computed-bg-hover !default;
|
|
238
249
|
$fui-bg-active: computed.$computed-bg-active !default;
|
|
239
|
-
// The document canvas
|
|
240
|
-
//
|
|
241
|
-
|
|
250
|
+
// The document canvas is the derived "paper" tone in light mode (carbon 100).
|
|
251
|
+
// Body and main stay on that shared plane; raised component roles provide the
|
|
252
|
+
// contrast instead of consumer-specific page overrides.
|
|
253
|
+
$fui-body-bg: computed.$computed-body-bg !default;
|
|
242
254
|
$fui-main-bg: computed.$computed-main-bg !default;
|
|
243
255
|
|
|
244
256
|
// Text colors (derived from $fui-neutral palette)
|
|
@@ -413,6 +425,19 @@ $fui-icon-2xl: measurements.target-value("icon", "2xl") !default;
|
|
|
413
425
|
$fui-anim-offset-sm: 4px !default; // Small slide animation
|
|
414
426
|
$fui-anim-offset-md: 8px !default; // Medium slide animation
|
|
415
427
|
|
|
428
|
+
// Ambient loop durations — infinite animations (spinners, pulses, shimmer).
|
|
429
|
+
// Easing stays per-effect; duration is the system knob.
|
|
430
|
+
$fui-duration-spin: 800ms !default; // Busy indicators
|
|
431
|
+
$fui-duration-pulse: 1500ms !default; // Breathing / attention loops
|
|
432
|
+
$fui-duration-shimmer: 2000ms !default; // Placeholder shimmer
|
|
433
|
+
|
|
434
|
+
// Overlay stacking layers (kept adjacent so relative order is auditable)
|
|
435
|
+
$fui-overlay-layer-swipe: 49 !default;
|
|
436
|
+
$fui-overlay-layer-backdrop: 50 !default;
|
|
437
|
+
$fui-overlay-layer-modal: 51 !default;
|
|
438
|
+
$fui-overlay-layer-anchored: 52 !default;
|
|
439
|
+
$fui-overlay-layer-tooltip: 60 !default;
|
|
440
|
+
|
|
416
441
|
// Sidebar (multi-consumer — used by Sidebar, NavigationMenu, Theme)
|
|
417
442
|
$fui-sidebar-item-height: computed.$computed-sidebar-item-height !default; // density-responsive (compact/default: 32px, relaxed: 36px)
|
|
418
443
|
|
|
@@ -427,12 +452,48 @@ $fui-header-z-index: 40 !default;
|
|
|
427
452
|
// CodeBlock background — shared with Markdown's <pre> prose styling — and
|
|
428
453
|
// selection tint are runtime hooks so consuming apps can preserve their own
|
|
429
454
|
// code-surface treatment without forking either component.
|
|
430
|
-
|
|
455
|
+
// Light stop is the paper tertiary well — not a second dark grey.
|
|
456
|
+
$fui-code-bg: light-dark(#{$fui-bg-tertiary}, #{$fui-dark-bg-tertiary}) !default;
|
|
457
|
+
// Accent capsule — the tertiary well + wash/hairline, so the earned moment
|
|
458
|
+
// sits *into* the page rather than floating a white slab on it (lifted-verdict
|
|
459
|
+
// direction, 2026-08-22). Do not mix toward black: that paints a dark slab on
|
|
460
|
+
// the light canvas.
|
|
461
|
+
$fui-card-accent-bg: $fui-bg-tertiary !default;
|
|
462
|
+
$fui-card-accent-border: color-mix(in srgb, $fui-color-accent 30%, $fui-border) !default;
|
|
463
|
+
// Softer than a panel: the capsule is a moment, not another card.
|
|
464
|
+
$fui-card-accent-radius: $fui-radius-xl !default;
|
|
465
|
+
// Selection tint tracks the accent (pine light / sage dark), not the button
|
|
466
|
+
// chrome — the ink-first default theme paints buttons with the inverse
|
|
467
|
+
// surface, which would grey out code selection.
|
|
431
468
|
$fui-code-selection-bg: color-mix(
|
|
432
469
|
in srgb,
|
|
433
|
-
var(--fui-
|
|
470
|
+
var(--fui-color-accent, #f56138) 30%,
|
|
434
471
|
transparent
|
|
435
472
|
) !default;
|
|
473
|
+
// Default code ink follows primary text so unhighlighted fallback and shiki
|
|
474
|
+
// `css-variables` foreground stay on the same contrast floor.
|
|
475
|
+
$fui-code-text: $fui-text-primary !default;
|
|
476
|
+
// Syntax ink for CodeBlock's css-variables theme. Each light stop is ≥ 4.5:1
|
|
477
|
+
// on the light code well; each dark stop is ≥ 4.5:1 on the dark code well
|
|
478
|
+
// (gated by read-safe-contrast.test.ts).
|
|
479
|
+
$fui-code-token-keyword: #9a3412 !default;
|
|
480
|
+
$fui-code-token-string: #166534 !default;
|
|
481
|
+
$fui-code-token-comment: #5c5348 !default;
|
|
482
|
+
$fui-code-token-function: #1e3a8a !default;
|
|
483
|
+
$fui-code-token-number: #92400e !default;
|
|
484
|
+
$fui-code-token-punctuation: #3d3429 !default;
|
|
485
|
+
$fui-code-token-variable: #3d3429 !default;
|
|
486
|
+
$fui-dark-code-token-keyword: #f56138 !default;
|
|
487
|
+
$fui-dark-code-token-string: #7dcea0 !default;
|
|
488
|
+
$fui-dark-code-token-comment: #a89b8c !default;
|
|
489
|
+
$fui-dark-code-token-function: #8cb4e8 !default;
|
|
490
|
+
$fui-dark-code-token-number: #e8b86d !default;
|
|
491
|
+
$fui-dark-code-token-punctuation: #c9c2b8 !default;
|
|
492
|
+
$fui-dark-code-token-variable: #f0ede9 !default;
|
|
493
|
+
// Prose/link ink. Light is a darker accent step so 4.5:1 holds on
|
|
494
|
+
// --fui-app-main-bg; dark keeps the theme accent (already ≥ 4.5).
|
|
495
|
+
$fui-link-ink: #9a3412 !default;
|
|
496
|
+
$fui-dark-link-ink: $fui-dark-color-accent !default;
|
|
436
497
|
|
|
437
498
|
// --------------------------------------------
|
|
438
499
|
// CSS Custom Properties Export
|
|
@@ -525,6 +586,20 @@ $fui-code-selection-bg: color-mix(
|
|
|
525
586
|
--fui-transition-fast: #{$fui-transition-fast};
|
|
526
587
|
--fui-transition-normal: #{$fui-transition-normal};
|
|
527
588
|
|
|
589
|
+
// Motion primitives
|
|
590
|
+
--fui-anim-offset-sm: #{$fui-anim-offset-sm};
|
|
591
|
+
--fui-anim-offset-md: #{$fui-anim-offset-md};
|
|
592
|
+
--fui-duration-spin: #{$fui-duration-spin};
|
|
593
|
+
--fui-duration-pulse: #{$fui-duration-pulse};
|
|
594
|
+
--fui-duration-shimmer: #{$fui-duration-shimmer};
|
|
595
|
+
|
|
596
|
+
// Overlay stacking layers
|
|
597
|
+
--fui-overlay-layer-swipe: #{$fui-overlay-layer-swipe};
|
|
598
|
+
--fui-overlay-layer-backdrop: #{$fui-overlay-layer-backdrop};
|
|
599
|
+
--fui-overlay-layer-modal: #{$fui-overlay-layer-modal};
|
|
600
|
+
--fui-overlay-layer-anchored: #{$fui-overlay-layer-anchored};
|
|
601
|
+
--fui-overlay-layer-tooltip: #{$fui-overlay-layer-tooltip};
|
|
602
|
+
|
|
528
603
|
// Colors — Accent (light-dark for automatic dark mode)
|
|
529
604
|
--fui-color-accent: light-dark(#{$fui-color-accent}, #{$fui-dark-color-accent});
|
|
530
605
|
--fui-color-on-accent: light-dark(#{$fui-color-on-accent}, #{$fui-dark-color-on-accent});
|
|
@@ -626,15 +701,36 @@ $fui-code-selection-bg: color-mix(
|
|
|
626
701
|
--fui-border-strong: light-dark(#{$fui-border-strong}, #{$fui-dark-border-strong});
|
|
627
702
|
--fui-border-subtle: color-mix(in srgb, var(--fui-border-default) 68%, transparent);
|
|
628
703
|
|
|
704
|
+
// Placeholder fills. A skeleton has to read as a *missing fact* against the
|
|
705
|
+
// card it sits in — a hairline-weight tint is invisible on paper, so the
|
|
706
|
+
// base leans on the border colour and the highlight is the shimmer stop.
|
|
707
|
+
--fui-skeleton: color-mix(in srgb, var(--fui-border-default) 62%, var(--fui-bg-secondary));
|
|
708
|
+
--fui-skeleton-hi: color-mix(in srgb, var(--fui-border-default) 24%, var(--fui-bg-secondary));
|
|
709
|
+
|
|
629
710
|
// Native browser text selection tracks the accent (pine in light, sage in
|
|
630
711
|
// dark) as a soft wash — matching the Flight Recorder accent-tint.
|
|
631
712
|
// Component-selected states stay tuned per control density.
|
|
632
713
|
--fui-selection-bg: light-dark(
|
|
633
|
-
color-mix(in srgb, var(--fui-color-accent, #
|
|
634
|
-
color-mix(in srgb, var(--fui-color-accent, #
|
|
714
|
+
color-mix(in srgb, var(--fui-color-accent, #f56138) 18%, transparent),
|
|
715
|
+
color-mix(in srgb, var(--fui-color-accent, #f56138) 22%, transparent)
|
|
635
716
|
);
|
|
636
717
|
--fui-selection-color: var(--fui-text-primary);
|
|
637
718
|
|
|
719
|
+
// Persistent neutral selection for navigation, segmented controls, fields,
|
|
720
|
+
// and rows. Keep this separate from --fui-bg-active: active is the brief
|
|
721
|
+
// pointer-down state; selected must remain visible without dominating its
|
|
722
|
+
// surrounding surface.
|
|
723
|
+
--fui-control-selected-bg: color-mix(in srgb, var(--fui-text-primary) 9%, transparent);
|
|
724
|
+
|
|
725
|
+
// Checked/value controls carry product meaning, so they follow the accent
|
|
726
|
+
// rather than button chrome. This keeps Checkbox, RadioGroup, and Switch
|
|
727
|
+
// stable when a consumer customizes primary actions independently.
|
|
728
|
+
--fui-control-checked-bg: var(--fui-color-accent);
|
|
729
|
+
--fui-control-checked-bg-hover: var(--fui-color-accent-hover);
|
|
730
|
+
--fui-control-checked-border: var(--fui-color-accent);
|
|
731
|
+
--fui-control-checked-border-hover: var(--fui-color-accent-hover);
|
|
732
|
+
--fui-control-checked-color: var(--fui-color-on-accent);
|
|
733
|
+
|
|
638
734
|
// Form chrome (shared by Input, Textarea, Select, Combobox, DatePicker,
|
|
639
735
|
// ColorPicker, Editor, and listbox-style controls).
|
|
640
736
|
--fui-field-bg: color-mix(in srgb, var(--fui-bg-elevated) 72%, transparent);
|
|
@@ -646,7 +742,7 @@ $fui-code-selection-bg: color-mix(
|
|
|
646
742
|
var(--fui-border-strong)
|
|
647
743
|
);
|
|
648
744
|
--fui-field-border-focus: var(--fui-text-primary);
|
|
649
|
-
--fui-field-selection-bg:
|
|
745
|
+
--fui-field-selection-bg: var(--fui-control-selected-bg);
|
|
650
746
|
--fui-field-selection-bg-hover: color-mix(in srgb, var(--fui-text-primary) 11%, transparent);
|
|
651
747
|
--fui-field-selection-border: var(--fui-border-strong);
|
|
652
748
|
--fui-field-selection-color: var(--fui-text-primary);
|
|
@@ -673,28 +769,36 @@ $fui-code-selection-bg: color-mix(
|
|
|
673
769
|
|
|
674
770
|
// Button chrome. Every theme uses flat fills: hierarchy comes from colour,
|
|
675
771
|
// border, and state contrast rather than a second raised/gradient material.
|
|
676
|
-
//
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
black 14%
|
|
684
|
-
);
|
|
685
|
-
--fui-button-primary-border: color-mix(
|
|
686
|
-
in srgb,
|
|
687
|
-
var(--fui-button-primary-active) 74%,
|
|
688
|
-
black 26%
|
|
689
|
-
);
|
|
690
|
-
--fui-button-primary-color: #fff;
|
|
691
|
-
|
|
772
|
+
//
|
|
773
|
+
// The Fragments default is ink-first: the primary action wears the inverse
|
|
774
|
+
// surface (near-black on paper, near-white on charcoal) with the accent
|
|
775
|
+
// reserved for meaning — links, selection, focus, "contract passing".
|
|
776
|
+
// A consumer-supplied $fui-brand switches primary chrome to the accent
|
|
777
|
+
// ramp so their brand colour actually paints their buttons (previously the
|
|
778
|
+
// chrome stayed pine regardless of seed).
|
|
692
779
|
@if $fui-brand-is-default {
|
|
693
|
-
--fui-button-
|
|
780
|
+
--fui-button-primary-base: var(--fui-bg-inverse);
|
|
781
|
+
--fui-button-primary-hover: light-dark(
|
|
782
|
+
color-mix(in srgb, var(--fui-bg-inverse) 88%, white),
|
|
783
|
+
#ffffff
|
|
784
|
+
);
|
|
785
|
+
--fui-button-primary-active: light-dark(
|
|
786
|
+
color-mix(in srgb, var(--fui-bg-inverse) 92%, black),
|
|
787
|
+
color-mix(in srgb, var(--fui-bg-inverse) 94%, black)
|
|
788
|
+
);
|
|
789
|
+
--fui-button-primary-color: var(--fui-text-inverse);
|
|
790
|
+
--fui-button-radius: var(--fui-radius-xl);
|
|
694
791
|
} @else {
|
|
792
|
+
--fui-button-primary-base: var(--fui-color-accent);
|
|
793
|
+
--fui-button-primary-hover: var(--fui-color-accent-hover);
|
|
794
|
+
--fui-button-primary-active: var(--fui-color-accent-active);
|
|
795
|
+
--fui-button-primary-color: var(--fui-color-on-accent);
|
|
695
796
|
--fui-button-radius: var(--fui-radius-lg);
|
|
696
797
|
}
|
|
697
798
|
|
|
799
|
+
--fui-button-primary-border: var(--fui-button-primary-base);
|
|
800
|
+
--fui-button-primary-border-hover: var(--fui-button-primary-hover);
|
|
801
|
+
|
|
698
802
|
--fui-button-primary-bg: var(--fui-button-primary-base);
|
|
699
803
|
--fui-button-primary-bg-hover: var(--fui-button-primary-hover);
|
|
700
804
|
--fui-button-primary-bg-active: var(--fui-button-primary-active);
|
|
@@ -730,6 +834,33 @@ $fui-code-selection-bg: color-mix(
|
|
|
730
834
|
|
|
731
835
|
--fui-code-bg: #{$fui-code-bg};
|
|
732
836
|
--fui-code-selection-bg: #{$fui-code-selection-bg};
|
|
837
|
+
--fui-code-text: var(--fui-text-primary);
|
|
838
|
+
--fui-code-token-keyword: light-dark(
|
|
839
|
+
#{$fui-code-token-keyword},
|
|
840
|
+
#{$fui-dark-code-token-keyword}
|
|
841
|
+
);
|
|
842
|
+
--fui-code-token-string: light-dark(#{$fui-code-token-string}, #{$fui-dark-code-token-string});
|
|
843
|
+
--fui-code-token-comment: light-dark(
|
|
844
|
+
#{$fui-code-token-comment},
|
|
845
|
+
#{$fui-dark-code-token-comment}
|
|
846
|
+
);
|
|
847
|
+
--fui-code-token-function: light-dark(
|
|
848
|
+
#{$fui-code-token-function},
|
|
849
|
+
#{$fui-dark-code-token-function}
|
|
850
|
+
);
|
|
851
|
+
--fui-code-token-number: light-dark(#{$fui-code-token-number}, #{$fui-dark-code-token-number});
|
|
852
|
+
--fui-code-token-punctuation: light-dark(
|
|
853
|
+
#{$fui-code-token-punctuation},
|
|
854
|
+
#{$fui-dark-code-token-punctuation}
|
|
855
|
+
);
|
|
856
|
+
--fui-code-token-variable: light-dark(
|
|
857
|
+
#{$fui-code-token-variable},
|
|
858
|
+
#{$fui-dark-code-token-variable}
|
|
859
|
+
);
|
|
860
|
+
--fui-link-ink: light-dark(#{$fui-link-ink}, #{$fui-dark-link-ink});
|
|
861
|
+
--fui-card-accent-bg: var(--fui-bg-tertiary);
|
|
862
|
+
--fui-card-accent-border: color-mix(in srgb, var(--fui-color-accent) 30%, var(--fui-border));
|
|
863
|
+
--fui-card-accent-radius: #{$fui-card-accent-radius};
|
|
733
864
|
|
|
734
865
|
// Popup/menu active-item highlight — neutral, deliberately stronger than
|
|
735
866
|
// --fui-bg-hover (which is tuned for subtle surface hovers and reads as ~invisible
|
|
@@ -740,15 +871,18 @@ $fui-code-selection-bg: color-mix(
|
|
|
740
871
|
// Product shell and navigation chrome. These stay neutral-first so a
|
|
741
872
|
// dashboard page reads as one system instead of brand-tinted islands.
|
|
742
873
|
--fui-app-canvas-bg: var(--fui-body-bg);
|
|
743
|
-
|
|
744
|
-
|
|
874
|
+
// Same surface order in both themes: the rail is recessed, the main
|
|
875
|
+
// reading sheet is raised. Light: tertiary paper rail, body-bg sheet.
|
|
876
|
+
// Dark keeps the lifted rail on a deeper body.
|
|
877
|
+
--fui-app-main-bg: var(--fui-body-bg);
|
|
878
|
+
--fui-app-sidebar-bg: var(--fui-bg-tertiary);
|
|
745
879
|
--fui-sidebar-bg: var(--fui-app-sidebar-bg);
|
|
746
880
|
--fui-sidebar-border: var(--fui-border-default);
|
|
747
881
|
--fui-sidebar-item-color: var(--fui-text-secondary);
|
|
748
882
|
--fui-sidebar-item-icon-color: var(--fui-text-tertiary);
|
|
749
883
|
--fui-sidebar-item-hover-bg: var(--fui-bg-hover);
|
|
750
884
|
--fui-sidebar-item-hover-color: var(--fui-text-primary);
|
|
751
|
-
--fui-sidebar-item-active-bg:
|
|
885
|
+
--fui-sidebar-item-active-bg: var(--fui-control-selected-bg);
|
|
752
886
|
--fui-sidebar-item-active-border: transparent;
|
|
753
887
|
--fui-sidebar-item-active-color: var(--fui-text-primary);
|
|
754
888
|
--fui-sidebar-item-active-indicator: transparent;
|
|
@@ -759,6 +893,11 @@ $fui-code-selection-bg: color-mix(
|
|
|
759
893
|
--fui-badge-dot-color: currentColor;
|
|
760
894
|
--fui-card-radius: var(--fui-radius-lg);
|
|
761
895
|
--fui-card-bg: color-mix(in srgb, var(--fui-bg-elevated) 92%, transparent);
|
|
896
|
+
// Full-bleed card chrome (for example `Card.Header divided`) shares the
|
|
897
|
+
// raised-neutral plane with shell controls. Keep the semantic alias
|
|
898
|
+
// component-specific so consumers can tune card hierarchy without
|
|
899
|
+
// changing every subtle surface.
|
|
900
|
+
--fui-card-header-bg: var(--fui-bg-subtle);
|
|
762
901
|
--fui-card-border: color-mix(in srgb, var(--fui-border-default) 86%, transparent);
|
|
763
902
|
--fui-card-outlined-border: var(--fui-card-border);
|
|
764
903
|
--fui-card-shadow: inset 0 1px 0
|
|
@@ -791,7 +930,7 @@ $fui-code-selection-bg: color-mix(
|
|
|
791
930
|
--fui-table-header-border: var(--fui-border-strong);
|
|
792
931
|
--fui-table-row-hover-bg: var(--fui-bg-hover);
|
|
793
932
|
--fui-table-row-active-bg: var(--fui-bg-active);
|
|
794
|
-
--fui-table-row-selected-bg:
|
|
933
|
+
--fui-table-row-selected-bg: var(--fui-control-selected-bg);
|
|
795
934
|
--fui-table-row-selected-border: var(--fui-border-strong);
|
|
796
935
|
--fui-table-subrow-bg: color-mix(in srgb, var(--fui-bg-secondary) 62%, transparent);
|
|
797
936
|
|
|
@@ -799,17 +938,18 @@ $fui-code-selection-bg: color-mix(
|
|
|
799
938
|
--fui-tabs-pills-bg: color-mix(in srgb, var(--fui-text-primary) 5%, transparent);
|
|
800
939
|
--fui-tabs-pills-border: var(--fui-border-default);
|
|
801
940
|
--fui-tabs-pill-hover-bg: transparent;
|
|
802
|
-
--fui-tabs-pill-active-bg:
|
|
941
|
+
--fui-tabs-pill-active-bg: var(--fui-control-selected-bg);
|
|
803
942
|
--fui-tabs-pill-active-border: transparent;
|
|
804
943
|
--fui-tabs-pill-active-shadow: none;
|
|
805
|
-
--fui-toggle-group-selected-bg: var(--fui-
|
|
806
|
-
--fui-toggle-group-selected-border:
|
|
807
|
-
in srgb,
|
|
808
|
-
var(--fui-color-accent) 42%,
|
|
809
|
-
transparent
|
|
810
|
-
);
|
|
944
|
+
--fui-toggle-group-selected-bg: var(--fui-control-selected-bg);
|
|
945
|
+
--fui-toggle-group-selected-border: transparent;
|
|
811
946
|
--fui-toggle-group-selected-shadow: none;
|
|
812
947
|
|
|
948
|
+
// Header search is persistent shell chrome rather than a ghost action.
|
|
949
|
+
// One surface step above divided card headers keeps this global affordance
|
|
950
|
+
// easy to find in both themes without turning it into a selected control.
|
|
951
|
+
--fui-header-search-bg: var(--fui-bg-hover);
|
|
952
|
+
|
|
813
953
|
// Shadows (not <color> type — light-dark() can't be used, handled in dark overrides)
|
|
814
954
|
--fui-shadow-sm: #{$fui-shadow-sm};
|
|
815
955
|
--fui-shadow-md: #{$fui-shadow-md};
|
|
@@ -1091,6 +1231,11 @@ $fui-code-selection-bg: color-mix(
|
|
|
1091
1231
|
--fui-bg-highlight: color-mix(in srgb, var(--fui-text-primary) 10%, transparent);
|
|
1092
1232
|
--fui-body-bg: #{$fui-dark-body-bg};
|
|
1093
1233
|
--fui-main-bg: #{$fui-dark-main-bg};
|
|
1234
|
+
--fui-app-main-bg: var(--fui-main-bg);
|
|
1235
|
+
// Paper primary == secondary in dark, so a mix of the two is a no-op.
|
|
1236
|
+
// Tertiary is the lifted rail; main stays the deeper body.
|
|
1237
|
+
--fui-app-sidebar-bg: var(--fui-bg-tertiary);
|
|
1238
|
+
--fui-sidebar-bg: var(--fui-app-sidebar-bg);
|
|
1094
1239
|
--fui-bg-inverse: #{$fui-dark-bg-inverse};
|
|
1095
1240
|
|
|
1096
1241
|
// Text
|
package/src/utils/a11y.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import * as React from
|
|
3
|
+
import * as React from "react";
|
|
4
4
|
|
|
5
5
|
// ============================================
|
|
6
6
|
// Unique ID Generator
|
|
@@ -27,7 +27,7 @@ export function useId(prefix?: string): string {
|
|
|
27
27
|
|
|
28
28
|
const [id] = React.useState(() => {
|
|
29
29
|
if (reactId) return reactId;
|
|
30
|
-
return `${prefix ? `${prefix}-` :
|
|
30
|
+
return `${prefix ? `${prefix}-` : "fui-"}${++idCounter}`;
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
return id;
|
|
@@ -55,45 +55,45 @@ export function useId(prefix?: string): string {
|
|
|
55
55
|
* ```
|
|
56
56
|
*/
|
|
57
57
|
export function useAnnounce(): {
|
|
58
|
-
announce: (message: string, priority?:
|
|
58
|
+
announce: (message: string, priority?: "polite" | "assertive") => void;
|
|
59
59
|
} {
|
|
60
60
|
const politeRef = React.useRef<HTMLDivElement | null>(null);
|
|
61
61
|
const assertiveRef = React.useRef<HTMLDivElement | null>(null);
|
|
62
62
|
|
|
63
63
|
React.useEffect(() => {
|
|
64
64
|
// Create live regions on mount
|
|
65
|
-
const polite = document.createElement(
|
|
66
|
-
polite.setAttribute(
|
|
67
|
-
polite.setAttribute(
|
|
68
|
-
polite.setAttribute(
|
|
65
|
+
const polite = document.createElement("div");
|
|
66
|
+
polite.setAttribute("aria-live", "polite");
|
|
67
|
+
polite.setAttribute("aria-atomic", "true");
|
|
68
|
+
polite.setAttribute("role", "status");
|
|
69
69
|
Object.assign(polite.style, {
|
|
70
|
-
position:
|
|
71
|
-
width:
|
|
72
|
-
height:
|
|
73
|
-
padding:
|
|
74
|
-
margin:
|
|
75
|
-
overflow:
|
|
76
|
-
clip:
|
|
77
|
-
whiteSpace:
|
|
78
|
-
border:
|
|
70
|
+
position: "absolute",
|
|
71
|
+
width: "1px",
|
|
72
|
+
height: "1px",
|
|
73
|
+
padding: "0",
|
|
74
|
+
margin: "-1px",
|
|
75
|
+
overflow: "hidden",
|
|
76
|
+
clip: "rect(0, 0, 0, 0)",
|
|
77
|
+
whiteSpace: "nowrap",
|
|
78
|
+
border: "0",
|
|
79
79
|
});
|
|
80
80
|
document.body.appendChild(polite);
|
|
81
81
|
politeRef.current = polite;
|
|
82
82
|
|
|
83
|
-
const assertive = document.createElement(
|
|
84
|
-
assertive.setAttribute(
|
|
85
|
-
assertive.setAttribute(
|
|
86
|
-
assertive.setAttribute(
|
|
83
|
+
const assertive = document.createElement("div");
|
|
84
|
+
assertive.setAttribute("aria-live", "assertive");
|
|
85
|
+
assertive.setAttribute("aria-atomic", "true");
|
|
86
|
+
assertive.setAttribute("role", "alert");
|
|
87
87
|
Object.assign(assertive.style, {
|
|
88
|
-
position:
|
|
89
|
-
width:
|
|
90
|
-
height:
|
|
91
|
-
padding:
|
|
92
|
-
margin:
|
|
93
|
-
overflow:
|
|
94
|
-
clip:
|
|
95
|
-
whiteSpace:
|
|
96
|
-
border:
|
|
88
|
+
position: "absolute",
|
|
89
|
+
width: "1px",
|
|
90
|
+
height: "1px",
|
|
91
|
+
padding: "0",
|
|
92
|
+
margin: "-1px",
|
|
93
|
+
overflow: "hidden",
|
|
94
|
+
clip: "rect(0, 0, 0, 0)",
|
|
95
|
+
whiteSpace: "nowrap",
|
|
96
|
+
border: "0",
|
|
97
97
|
});
|
|
98
98
|
document.body.appendChild(assertive);
|
|
99
99
|
assertiveRef.current = assertive;
|
|
@@ -106,11 +106,11 @@ export function useAnnounce(): {
|
|
|
106
106
|
}, []);
|
|
107
107
|
|
|
108
108
|
const announce = React.useCallback(
|
|
109
|
-
(message: string, priority:
|
|
110
|
-
const region = priority ===
|
|
109
|
+
(message: string, priority: "polite" | "assertive" = "polite") => {
|
|
110
|
+
const region = priority === "assertive" ? assertiveRef.current : politeRef.current;
|
|
111
111
|
if (region) {
|
|
112
112
|
// Clear and re-set to ensure announcement
|
|
113
|
-
region.textContent =
|
|
113
|
+
region.textContent = "";
|
|
114
114
|
// Use requestAnimationFrame to ensure the clear is processed
|
|
115
115
|
requestAnimationFrame(() => {
|
|
116
116
|
region.textContent = message;
|
|
@@ -146,20 +146,20 @@ export function usePrefersReducedMotion(): boolean {
|
|
|
146
146
|
const [prefersReducedMotion, setPrefersReducedMotion] = React.useState(false);
|
|
147
147
|
|
|
148
148
|
React.useEffect(() => {
|
|
149
|
-
const mediaQuery = window.matchMedia(
|
|
149
|
+
const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
150
150
|
|
|
151
151
|
const handleChange = (event: MediaQueryListEvent) => {
|
|
152
152
|
setPrefersReducedMotion(event.matches);
|
|
153
153
|
};
|
|
154
154
|
|
|
155
155
|
// Modern browsers
|
|
156
|
-
mediaQuery.addEventListener(
|
|
156
|
+
mediaQuery.addEventListener("change", handleChange);
|
|
157
157
|
|
|
158
158
|
// Set initial value
|
|
159
159
|
setPrefersReducedMotion(mediaQuery.matches);
|
|
160
160
|
|
|
161
161
|
return () => {
|
|
162
|
-
mediaQuery.removeEventListener(
|
|
162
|
+
mediaQuery.removeEventListener("change", handleChange);
|
|
163
163
|
};
|
|
164
164
|
}, []);
|
|
165
165
|
|
|
@@ -183,17 +183,17 @@ export function usePrefersContrast(): boolean {
|
|
|
183
183
|
const [prefersContrast, setPrefersContrast] = React.useState(false);
|
|
184
184
|
|
|
185
185
|
React.useEffect(() => {
|
|
186
|
-
const mediaQuery = window.matchMedia(
|
|
186
|
+
const mediaQuery = window.matchMedia("(prefers-contrast: more)");
|
|
187
187
|
|
|
188
188
|
const handleChange = (event: MediaQueryListEvent) => {
|
|
189
189
|
setPrefersContrast(event.matches);
|
|
190
190
|
};
|
|
191
191
|
|
|
192
|
-
mediaQuery.addEventListener(
|
|
192
|
+
mediaQuery.addEventListener("change", handleChange);
|
|
193
193
|
setPrefersContrast(mediaQuery.matches);
|
|
194
194
|
|
|
195
195
|
return () => {
|
|
196
|
-
mediaQuery.removeEventListener(
|
|
196
|
+
mediaQuery.removeEventListener("change", handleChange);
|
|
197
197
|
};
|
|
198
198
|
}, []);
|
|
199
199
|
|
|
@@ -219,10 +219,7 @@ export function usePrefersContrast(): boolean {
|
|
|
219
219
|
* return <div ref={dialogRef}>...</div>;
|
|
220
220
|
* ```
|
|
221
221
|
*/
|
|
222
|
-
export function useFocusTrap(
|
|
223
|
-
ref: React.RefObject<HTMLElement | null>,
|
|
224
|
-
active: boolean
|
|
225
|
-
): void {
|
|
222
|
+
export function useFocusTrap(ref: React.RefObject<HTMLElement | null>, active: boolean): void {
|
|
226
223
|
const previousActiveElement = React.useRef<Element | null>(null);
|
|
227
224
|
|
|
228
225
|
React.useEffect(() => {
|
|
@@ -238,7 +235,7 @@ export function useFocusTrap(
|
|
|
238
235
|
}
|
|
239
236
|
|
|
240
237
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
241
|
-
if (event.key !==
|
|
238
|
+
if (event.key !== "Tab") return;
|
|
242
239
|
|
|
243
240
|
const focusable = getFocusableElements(container);
|
|
244
241
|
if (focusable.length === 0) return;
|
|
@@ -261,10 +258,10 @@ export function useFocusTrap(
|
|
|
261
258
|
}
|
|
262
259
|
};
|
|
263
260
|
|
|
264
|
-
container.addEventListener(
|
|
261
|
+
container.addEventListener("keydown", handleKeyDown);
|
|
265
262
|
|
|
266
263
|
return () => {
|
|
267
|
-
container.removeEventListener(
|
|
264
|
+
container.removeEventListener("keydown", handleKeyDown);
|
|
268
265
|
|
|
269
266
|
// Restore focus when trap is deactivated
|
|
270
267
|
if (previousActiveElement.current instanceof HTMLElement) {
|
|
@@ -315,11 +312,11 @@ export function handleArrowNavigation(
|
|
|
315
312
|
items: readonly unknown[],
|
|
316
313
|
currentIndex: number,
|
|
317
314
|
options: {
|
|
318
|
-
orientation?:
|
|
315
|
+
orientation?: "horizontal" | "vertical" | "both";
|
|
319
316
|
loop?: boolean;
|
|
320
317
|
} = {}
|
|
321
318
|
): number | undefined {
|
|
322
|
-
const { orientation =
|
|
319
|
+
const { orientation = "vertical", loop = true } = options;
|
|
323
320
|
const length = items.length;
|
|
324
321
|
|
|
325
322
|
if (length === 0) return undefined;
|
|
@@ -327,8 +324,8 @@ export function handleArrowNavigation(
|
|
|
327
324
|
let newIndex: number | undefined;
|
|
328
325
|
|
|
329
326
|
switch (event.key) {
|
|
330
|
-
case
|
|
331
|
-
if (orientation ===
|
|
327
|
+
case "ArrowDown":
|
|
328
|
+
if (orientation === "horizontal") return undefined;
|
|
332
329
|
event.preventDefault();
|
|
333
330
|
newIndex = currentIndex + 1;
|
|
334
331
|
if (newIndex >= length) {
|
|
@@ -336,8 +333,8 @@ export function handleArrowNavigation(
|
|
|
336
333
|
}
|
|
337
334
|
break;
|
|
338
335
|
|
|
339
|
-
case
|
|
340
|
-
if (orientation ===
|
|
336
|
+
case "ArrowUp":
|
|
337
|
+
if (orientation === "horizontal") return undefined;
|
|
341
338
|
event.preventDefault();
|
|
342
339
|
newIndex = currentIndex - 1;
|
|
343
340
|
if (newIndex < 0) {
|
|
@@ -345,8 +342,8 @@ export function handleArrowNavigation(
|
|
|
345
342
|
}
|
|
346
343
|
break;
|
|
347
344
|
|
|
348
|
-
case
|
|
349
|
-
if (orientation ===
|
|
345
|
+
case "ArrowRight":
|
|
346
|
+
if (orientation === "vertical") return undefined;
|
|
350
347
|
event.preventDefault();
|
|
351
348
|
newIndex = currentIndex + 1;
|
|
352
349
|
if (newIndex >= length) {
|
|
@@ -354,8 +351,8 @@ export function handleArrowNavigation(
|
|
|
354
351
|
}
|
|
355
352
|
break;
|
|
356
353
|
|
|
357
|
-
case
|
|
358
|
-
if (orientation ===
|
|
354
|
+
case "ArrowLeft":
|
|
355
|
+
if (orientation === "vertical") return undefined;
|
|
359
356
|
event.preventDefault();
|
|
360
357
|
newIndex = currentIndex - 1;
|
|
361
358
|
if (newIndex < 0) {
|
|
@@ -363,12 +360,12 @@ export function handleArrowNavigation(
|
|
|
363
360
|
}
|
|
364
361
|
break;
|
|
365
362
|
|
|
366
|
-
case
|
|
363
|
+
case "Home":
|
|
367
364
|
event.preventDefault();
|
|
368
365
|
newIndex = 0;
|
|
369
366
|
break;
|
|
370
367
|
|
|
371
|
-
case
|
|
368
|
+
case "End":
|
|
372
369
|
event.preventDefault();
|
|
373
370
|
newIndex = length - 1;
|
|
374
371
|
break;
|
|
@@ -384,7 +381,7 @@ export function handleArrowNavigation(
|
|
|
384
381
|
// Screen Reader Only Component
|
|
385
382
|
// ============================================
|
|
386
383
|
|
|
387
|
-
export interface
|
|
384
|
+
export interface A11yVisuallyHiddenProps {
|
|
388
385
|
children: React.ReactNode;
|
|
389
386
|
/** If true, becomes visible when focused (useful for skip links) */
|
|
390
387
|
focusable?: boolean;
|
|
@@ -408,19 +405,22 @@ export interface VisuallyHiddenProps {
|
|
|
408
405
|
* </VisuallyHidden>
|
|
409
406
|
* ```
|
|
410
407
|
*/
|
|
411
|
-
export function
|
|
408
|
+
export function A11yVisuallyHidden({
|
|
409
|
+
children,
|
|
410
|
+
focusable = false,
|
|
411
|
+
}: A11yVisuallyHiddenProps): React.ReactElement {
|
|
412
412
|
const style: React.CSSProperties = focusable
|
|
413
413
|
? {}
|
|
414
414
|
: {
|
|
415
|
-
position:
|
|
416
|
-
width:
|
|
417
|
-
height:
|
|
418
|
-
padding:
|
|
419
|
-
margin:
|
|
420
|
-
overflow:
|
|
421
|
-
clip:
|
|
422
|
-
whiteSpace:
|
|
423
|
-
border:
|
|
415
|
+
position: "absolute",
|
|
416
|
+
width: "1px",
|
|
417
|
+
height: "1px",
|
|
418
|
+
padding: "0",
|
|
419
|
+
margin: "-1px",
|
|
420
|
+
overflow: "hidden",
|
|
421
|
+
clip: "rect(0, 0, 0, 0)",
|
|
422
|
+
whiteSpace: "nowrap",
|
|
423
|
+
border: "0",
|
|
424
424
|
};
|
|
425
425
|
|
|
426
426
|
return (
|
package/src/utils/aria.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import * as React from
|
|
1
|
+
import * as React from "react";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Merge multiple aria ID values into a single space-separated string.
|
|
5
5
|
* Filters out undefined/empty values. Returns undefined if no valid IDs.
|
|
6
6
|
*/
|
|
7
7
|
export function mergeAriaIds(...ids: Array<string | undefined>): string | undefined {
|
|
8
|
-
const merged = ids.filter(Boolean).join(
|
|
8
|
+
const merged = ids.filter(Boolean).join(" ").trim();
|
|
9
9
|
return merged.length > 0 ? merged : undefined;
|
|
10
10
|
}
|
|
11
11
|
|
|
@@ -19,7 +19,7 @@ export function normalizeError(error?: boolean | string): {
|
|
|
19
19
|
} {
|
|
20
20
|
return {
|
|
21
21
|
hasError: !!error,
|
|
22
|
-
errorMessage: typeof error ===
|
|
22
|
+
errorMessage: typeof error === "string" ? error : undefined,
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
|