@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,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
3
|
"name": "Form",
|
|
4
|
-
"description": "
|
|
5
|
-
"category": "
|
|
4
|
+
"description": "Distributes server-side validation errors to its Field components.",
|
|
5
|
+
"category": "inputs",
|
|
6
6
|
"tags": ["form", "validation", "errors", "submit", "server"],
|
|
7
7
|
"status": "stable",
|
|
8
8
|
"sourcePath": "src/components/Form/index.tsx",
|
|
@@ -50,47 +50,47 @@
|
|
|
50
50
|
},
|
|
51
51
|
"usage": {
|
|
52
52
|
"when": [
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"Combining client and server validation in one form"
|
|
53
|
+
"The server rejects a submission and each reason must reach its own field",
|
|
54
|
+
"Client and server validation live in the same form"
|
|
56
55
|
],
|
|
57
56
|
"whenNot": [
|
|
58
|
-
"
|
|
59
|
-
"
|
|
57
|
+
"Client-side validation only (a native form plus Field is enough)",
|
|
58
|
+
"Layout without submission (use Grid or Card)"
|
|
60
59
|
],
|
|
61
60
|
"guidelines": [
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"Use onSubmit
|
|
65
|
-
"Field
|
|
66
|
-
"
|
|
67
|
-
"
|
|
61
|
+
"errors is keyed by field name: Record<string, string | string[]>",
|
|
62
|
+
"Clear a field's error in onClearErrors when the user edits it",
|
|
63
|
+
"Use onSubmit; onFormSubmit is a deprecated alias",
|
|
64
|
+
"A Field picks up its error by matching name",
|
|
65
|
+
"Leave Field.Error unmatched so it shows whatever the server sent",
|
|
66
|
+
"Put a Grid inside Form or Fieldset for multi-column layouts",
|
|
67
|
+
"Buttons go in Form.Actions so they stay right-aligned"
|
|
68
68
|
],
|
|
69
69
|
"accessibility": [
|
|
70
|
-
"Renders
|
|
71
|
-
"
|
|
70
|
+
"Renders a real form element",
|
|
71
|
+
"Errors link back to their field via aria-describedby"
|
|
72
72
|
]
|
|
73
73
|
},
|
|
74
74
|
"examples": [
|
|
75
75
|
{
|
|
76
76
|
"name": "Sign up",
|
|
77
|
-
"description": "
|
|
77
|
+
"description": "Paired name fields, then full-width rows and a right-aligned submit.",
|
|
78
78
|
"code": "<Form onSubmit={(e) => { e.preventDefault(); }}>\n <Grid columns={2} gap=\"md\">\n <Field name=\"firstName\">\n <Field.Label>First Name</Field.Label>\n <Field.Control>\n <Input placeholder=\"Jane\" />\n </Field.Control>\n </Field>\n <Field name=\"lastName\">\n <Field.Label>Last Name</Field.Label>\n <Field.Control>\n <Input placeholder=\"Doe\" />\n </Field.Control>\n </Field>\n <Grid.Item colSpan=\"full\">\n <Field name=\"email\">\n <Field.Label>Email</Field.Label>\n <Field.Control>\n <Input type=\"email\" placeholder=\"jane@example.com\" />\n </Field.Control>\n <Field.Error match=\"typeMismatch\">Enter a valid email address</Field.Error>\n </Field>\n </Grid.Item>\n <Grid.Item colSpan=\"full\">\n <Field name=\"password\">\n <Field.Label>Password</Field.Label>\n <Field.Control>\n <Input type=\"password\" placeholder=\"At least 8 characters\" />\n </Field.Control>\n <Field.Description>Must be at least 8 characters</Field.Description>\n </Field>\n </Grid.Item>\n <Grid.Item colSpan=\"full\">\n <Field name=\"terms\">\n <Field.Control>\n <Checkbox label=\"I agree to the terms and conditions\" />\n </Field.Control>\n </Field>\n </Grid.Item>\n </Grid>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Create Account</Button>\n </Form.Actions>\n</Form>"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"name": "Profile settings",
|
|
82
|
-
"description": "
|
|
82
|
+
"description": "Fieldsets split a long form into sections the user can scan.",
|
|
83
83
|
"code": "<Form onSubmit={(e) => { e.preventDefault(); }}>\n <Fieldset>\n <Fieldset.Legend>Profile</Fieldset.Legend>\n <Grid columns={2} gap=\"md\">\n <Field name=\"displayName\">\n <Field.Label>Display Name</Field.Label>\n <Field.Control>\n <Input placeholder=\"How others see you\" />\n </Field.Control>\n </Field>\n <Field name=\"timezone\">\n <Field.Label>Timezone</Field.Label>\n <Field.Control>\n <Select placeholder=\"Select timezone\">\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"utc\">UTC</Select.Item>\n <Select.Item value=\"est\">Eastern (EST)</Select.Item>\n <Select.Item value=\"pst\">Pacific (PST)</Select.Item>\n <Select.Item value=\"gmt\">GMT</Select.Item>\n </Select.Content>\n </Select>\n </Field.Control>\n </Field>\n <Grid.Item colSpan=\"full\">\n <Field name=\"bio\">\n <Field.Label>Bio</Field.Label>\n <Field.Control>\n <Textarea placeholder=\"Tell us about yourself\" rows={3} maxLength={280} />\n </Field.Control>\n <Field.Description>Max 280 characters</Field.Description>\n </Field>\n </Grid.Item>\n </Grid>\n </Fieldset>\n <Fieldset>\n <Fieldset.Legend>Notifications</Fieldset.Legend>\n <Field name=\"emailNotifs\">\n <Field.Control>\n <Switch label=\"Email notifications\" />\n </Field.Control>\n </Field>\n <Field name=\"marketingEmails\">\n <Field.Control>\n <Switch label=\"Marketing emails\" />\n </Field.Control>\n </Field>\n <Field name=\"frequency\">\n <Field.Label>Digest frequency</Field.Label>\n <Field.Control>\n <RadioGroup name=\"frequency\" orientation=\"vertical\">\n <RadioGroup.Item value=\"daily\" label=\"Daily\" />\n <RadioGroup.Item value=\"weekly\" label=\"Weekly\" />\n <RadioGroup.Item value=\"monthly\" label=\"Monthly\" />\n </RadioGroup>\n </Field.Control>\n </Field>\n </Fieldset>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Save Changes</Button>\n </Form.Actions>\n</Form>"
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
"name": "Contact form",
|
|
87
|
-
"description": "
|
|
87
|
+
"description": "Mixed control types in one submission flow.",
|
|
88
88
|
"code": "<Form onSubmit={(e) => { e.preventDefault(); }}>\n <Grid columns={2} gap=\"md\">\n <Field name=\"name\">\n <Field.Label>Name</Field.Label>\n <Field.Control>\n <Input placeholder=\"Your name\" />\n </Field.Control>\n </Field>\n <Field name=\"email\">\n <Field.Label>Email</Field.Label>\n <Field.Control>\n <Input type=\"email\" placeholder=\"you@example.com\" />\n </Field.Control>\n </Field>\n <Grid.Item colSpan=\"full\">\n <Field name=\"subject\">\n <Field.Label>Subject</Field.Label>\n <Field.Control>\n <Select placeholder=\"What is this about?\">\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"general\">General Inquiry</Select.Item>\n <Select.Item value=\"support\">Technical Support</Select.Item>\n <Select.Item value=\"billing\">Billing</Select.Item>\n <Select.Item value=\"feedback\">Feedback</Select.Item>\n </Select.Content>\n </Select>\n </Field.Control>\n </Field>\n </Grid.Item>\n <Grid.Item colSpan=\"full\">\n <Field name=\"message\">\n <Field.Label>Message</Field.Label>\n <Field.Control>\n <Textarea placeholder=\"How can we help?\" rows={5} />\n </Field.Control>\n </Field>\n </Grid.Item>\n <Grid.Item colSpan=\"full\">\n <Field name=\"copy\">\n <Field.Control>\n <Checkbox label=\"Send me a copy\" />\n </Field.Control>\n </Field>\n </Grid.Item>\n </Grid>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Send Message</Button>\n </Form.Actions>\n</Form>"
|
|
89
89
|
},
|
|
90
90
|
{
|
|
91
91
|
"name": "With server errors",
|
|
92
|
-
"description": "
|
|
93
|
-
"code": "<Form errors={{ username: 'Username is already taken', email: 'Email is already registered' }}>\n <Grid columns={2} gap=\"md\">\n <Field name=\"username\">\n <Field.Label>Username</Field.Label>\n <Field.Control>\n <Input defaultValue=\"janedoe\" />\n </Field.Control>\n <Field.Error
|
|
92
|
+
"description": "Errors from the server land on the fields that caused them.",
|
|
93
|
+
"code": "<Form errors={{ username: 'Username is already taken', email: 'Email is already registered' }}>\n <Grid columns={2} gap=\"md\">\n <Field name=\"username\">\n <Field.Label>Username</Field.Label>\n <Field.Control>\n <Input defaultValue=\"janedoe\" />\n </Field.Control>\n <Field.Error />\n </Field>\n <Field name=\"email\">\n <Field.Label>Email</Field.Label>\n <Field.Control>\n <Input type=\"email\" defaultValue=\"jane@example.com\" />\n </Field.Control>\n <Field.Error />\n </Field>\n </Grid>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Submit</Button>\n </Form.Actions>\n</Form>"
|
|
94
94
|
}
|
|
95
95
|
],
|
|
96
96
|
"relations": [
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
3
|
"name": "Grid",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "Arranges items into responsive columns with one shared gap.",
|
|
5
5
|
"category": "layout",
|
|
6
|
-
"tags": [
|
|
7
|
-
"grid",
|
|
8
|
-
"layout",
|
|
9
|
-
"columns",
|
|
10
|
-
"responsive"
|
|
11
|
-
],
|
|
6
|
+
"tags": ["grid", "layout", "columns", "responsive"],
|
|
12
7
|
"status": "stable",
|
|
13
8
|
"sourcePath": "src/components/Grid/index.tsx",
|
|
14
9
|
"exportName": "Grid",
|
|
@@ -43,57 +38,33 @@
|
|
|
43
38
|
"type": "string",
|
|
44
39
|
"description": "Minimum width for auto-fill columns (e.g., \"16rem\", \"250px\")",
|
|
45
40
|
"required": false,
|
|
46
|
-
"constraints": [
|
|
47
|
-
"Only applies when columns=\"auto\""
|
|
48
|
-
]
|
|
41
|
+
"constraints": ["Only applies when columns=\"auto\""]
|
|
49
42
|
},
|
|
50
43
|
"gap": {
|
|
51
44
|
"type": "union",
|
|
52
45
|
"description": "Gap between grid items. Accepts string tokens or numbers (1-8) mapped to the spacing scale",
|
|
53
46
|
"default": "md",
|
|
54
47
|
"required": false,
|
|
55
|
-
"values": [
|
|
56
|
-
"none",
|
|
57
|
-
"xs",
|
|
58
|
-
"sm",
|
|
59
|
-
"md",
|
|
60
|
-
"lg",
|
|
61
|
-
"xl"
|
|
62
|
-
]
|
|
48
|
+
"values": ["none", "xs", "sm", "md", "lg", "xl"]
|
|
63
49
|
},
|
|
64
50
|
"alignItems": {
|
|
65
51
|
"type": "enum",
|
|
66
52
|
"description": "Vertical alignment of items within their cells",
|
|
67
53
|
"required": false,
|
|
68
|
-
"values": [
|
|
69
|
-
"start",
|
|
70
|
-
"center",
|
|
71
|
-
"end",
|
|
72
|
-
"stretch"
|
|
73
|
-
]
|
|
54
|
+
"values": ["start", "center", "end", "stretch"]
|
|
74
55
|
},
|
|
75
56
|
"justifyItems": {
|
|
76
57
|
"type": "enum",
|
|
77
58
|
"description": "Horizontal alignment of items within their cells",
|
|
78
59
|
"required": false,
|
|
79
|
-
"values": [
|
|
80
|
-
"start",
|
|
81
|
-
"center",
|
|
82
|
-
"end",
|
|
83
|
-
"stretch"
|
|
84
|
-
]
|
|
60
|
+
"values": ["start", "center", "end", "stretch"]
|
|
85
61
|
},
|
|
86
62
|
"padding": {
|
|
87
63
|
"type": "enum",
|
|
88
64
|
"description": "Internal padding of the grid container",
|
|
89
65
|
"default": "none",
|
|
90
66
|
"required": false,
|
|
91
|
-
"values": [
|
|
92
|
-
"none",
|
|
93
|
-
"sm",
|
|
94
|
-
"md",
|
|
95
|
-
"lg"
|
|
96
|
-
]
|
|
67
|
+
"values": ["none", "sm", "md", "lg"]
|
|
97
68
|
},
|
|
98
69
|
"className": {
|
|
99
70
|
"type": "string",
|
|
@@ -108,23 +79,21 @@
|
|
|
108
79
|
},
|
|
109
80
|
"usage": {
|
|
110
81
|
"when": [
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"Any content that should reflow across breakpoints"
|
|
82
|
+
"Cards, tiles, or media that reflow across breakpoints",
|
|
83
|
+
"Multi-column form layouts",
|
|
84
|
+
"Dashboard widget layouts"
|
|
115
85
|
],
|
|
116
86
|
"whenNot": [
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
87
|
+
"One-directional lists (use Stack)",
|
|
88
|
+
"Editorial mosaics with feature tiles (use BentoGrid)",
|
|
89
|
+
"Navigation bars (use Header)"
|
|
120
90
|
],
|
|
121
91
|
"guidelines": [
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
"
|
|
125
|
-
"
|
|
126
|
-
"Keep
|
|
127
|
-
"Pass DOM attributes (id, role, aria-*, data-*, event handlers) directly to Grid and Grid.Item roots when needed"
|
|
92
|
+
"columns=\"auto\" with minChildWidth adapts without breakpoints",
|
|
93
|
+
"Pass { base, md, lg } to columns for explicit per-breakpoint control",
|
|
94
|
+
"Numeric gaps (1-8) map to the same spacing scale as the tokens",
|
|
95
|
+
"Wrap a child in Grid.Item to span columns; colSpan=\"full\" spans the row",
|
|
96
|
+
"Keep source order equal to visual order — Grid does not reorder for screen readers"
|
|
128
97
|
],
|
|
129
98
|
"accessibility": [
|
|
130
99
|
"Grid is purely visual — it does not affect reading order or semantics",
|
|
@@ -134,33 +103,28 @@
|
|
|
134
103
|
"examples": [
|
|
135
104
|
{
|
|
136
105
|
"name": "Default",
|
|
137
|
-
"description": "
|
|
138
|
-
"code": "<Grid columns={3} gap=\"md\">\n
|
|
106
|
+
"description": "A fixed count of equal columns.",
|
|
107
|
+
"code": "import { Box } from '@/components/Box';\nimport { Grid } from '@/components/Grid';\n\n<Box width=\"100%\">\n <Grid columns={3} gap=\"md\">\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">One</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Two</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Three</Box>\n </Grid>\n</Box>"
|
|
139
108
|
},
|
|
140
109
|
{
|
|
141
110
|
"name": "Responsive",
|
|
142
|
-
"description": "
|
|
143
|
-
"code": "<Grid columns={{ base: 1, md: 2, lg: 3 }} gap=\"md\">\n
|
|
111
|
+
"description": "Column count changes per breakpoint.",
|
|
112
|
+
"code": "import { Box } from '@/components/Box';\nimport { Grid } from '@/components/Grid';\n\n<Box width=\"100%\">\n <Grid columns={{ base: 1, md: 2, lg: 3 }} gap=\"md\">\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 1</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 2</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 3</Box>\n </Grid>\n</Box>"
|
|
144
113
|
},
|
|
145
114
|
{
|
|
146
115
|
"name": "Auto-fill",
|
|
147
|
-
"description": "
|
|
148
|
-
"code": "<Grid columns=\"auto\" minChildWidth=\"
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
"name": "Numeric Gap",
|
|
152
|
-
"description": "Using number values (1-8) mapped to the spacing scale",
|
|
153
|
-
"code": "<Grid columns={3} gap={4}>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Gap 4</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Gap 4</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Gap 4</div>\n</Grid>"
|
|
116
|
+
"description": "Columns fit themselves to a minimum child width — no breakpoints needed.",
|
|
117
|
+
"code": "import { Box } from '@/components/Box';\nimport { Grid } from '@/components/Grid';\n\n<Box width=\"100%\">\n <Grid columns=\"auto\" minChildWidth=\"10rem\" gap=\"md\">\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 1</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 2</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 3</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 4</Box>\n </Grid>\n</Box>"
|
|
154
118
|
},
|
|
155
119
|
{
|
|
156
120
|
"name": "With Spanning",
|
|
157
|
-
"description": "Grid
|
|
158
|
-
"code": "<Grid columns={4} gap=\"md\">\n
|
|
121
|
+
"description": "Grid.Item stretches a child across columns.",
|
|
122
|
+
"code": "import { Box } from '@/components/Box';\nimport { Grid } from '@/components/Grid';\n\n<Box width=\"100%\">\n <Grid columns={4} gap=\"md\">\n <Grid.Item colSpan={2}>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Spans 2 columns</Box>\n </Grid.Item>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">1 col</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">1 col</Box>\n <Grid.Item colSpan=\"full\">\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Full width</Box>\n </Grid.Item>\n </Grid>\n</Box>"
|
|
159
123
|
},
|
|
160
124
|
{
|
|
161
125
|
"name": "Form Layout",
|
|
162
|
-
"description": "
|
|
163
|
-
"code": "
|
|
126
|
+
"description": "Paired fields with one full-width row.",
|
|
127
|
+
"code": "import { Box } from '@/components/Box';\nimport { Field } from '@/components/Field';\nimport { Grid } from '@/components/Grid';\nimport { Input } from '@/components/Input';\n\n<Box width=\"100%\">\n <Grid columns={{ base: 1, md: 2 }} gap=\"md\">\n <Field>\n <Field.Label>First name</Field.Label>\n <Input placeholder=\"Ada\" />\n </Field>\n <Field>\n <Field.Label>Last name</Field.Label>\n <Input placeholder=\"Lovelace\" />\n </Field>\n <Grid.Item colSpan=\"full\">\n <Field>\n <Field.Label>Email address</Field.Label>\n <Input type=\"email\" placeholder=\"ada@example.com\" />\n </Field>\n </Grid.Item>\n </Grid>\n</Box>"
|
|
164
128
|
}
|
|
165
129
|
],
|
|
166
130
|
"relations": [
|
|
@@ -88,10 +88,10 @@ function isResponsiveColumns(columns: GridProps["columns"]): columns is Responsi
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
const paddingClasses: Record<NonNullable<GridProps["padding"]>, string> = {
|
|
91
|
-
none: styles.paddingNone,
|
|
92
|
-
sm: styles.paddingSm,
|
|
93
|
-
md: styles.paddingMd,
|
|
94
|
-
lg: styles.paddingLg,
|
|
91
|
+
none: styles.paddingNone ?? "",
|
|
92
|
+
sm: styles.paddingSm ?? "",
|
|
93
|
+
md: styles.paddingMd ?? "",
|
|
94
|
+
lg: styles.paddingLg ?? "",
|
|
95
95
|
};
|
|
96
96
|
|
|
97
97
|
// ============================================
|
|
@@ -118,12 +118,12 @@ export const Grid = React.forwardRef<HTMLDivElement, GridProps>(function Grid(
|
|
|
118
118
|
let inlineStyle: React.CSSProperties | undefined;
|
|
119
119
|
|
|
120
120
|
if (columns === "auto") {
|
|
121
|
-
columnsClass = styles.columnsAuto;
|
|
121
|
+
columnsClass = styles.columnsAuto ?? "";
|
|
122
122
|
if (minChildWidth) {
|
|
123
123
|
inlineStyle = { "--fui-grid-min-child-width": minChildWidth } as React.CSSProperties;
|
|
124
124
|
}
|
|
125
125
|
} else if (isResponsiveColumns(columns)) {
|
|
126
|
-
columnsClass = styles.columnsResponsive;
|
|
126
|
+
columnsClass = styles.columnsResponsive ?? "";
|
|
127
127
|
const vars: Record<string, string> = {};
|
|
128
128
|
if (columns.base) vars["--fui-grid-cols"] = String(columns.base);
|
|
129
129
|
if (columns.sm) vars["--fui-grid-cols-sm"] = String(columns.sm);
|
|
@@ -132,7 +132,7 @@ export const Grid = React.forwardRef<HTMLDivElement, GridProps>(function Grid(
|
|
|
132
132
|
if (columns.xl) vars["--fui-grid-cols-xl"] = String(columns.xl);
|
|
133
133
|
inlineStyle = vars as unknown as React.CSSProperties;
|
|
134
134
|
} else {
|
|
135
|
-
columnsClass = styles[`columns${columns}`];
|
|
135
|
+
columnsClass = styles[`columns${columns}`] ?? "";
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
inlineStyle = {
|
|
@@ -165,9 +165,9 @@ export const Grid = React.forwardRef<HTMLDivElement, GridProps>(function Grid(
|
|
|
165
165
|
// ============================================
|
|
166
166
|
|
|
167
167
|
const subgridClasses: Record<string, string> = {
|
|
168
|
-
rows: styles.subgridRows,
|
|
169
|
-
columns: styles.subgridColumns,
|
|
170
|
-
both: styles.subgridBoth,
|
|
168
|
+
rows: styles.subgridRows ?? "",
|
|
169
|
+
columns: styles.subgridColumns ?? "",
|
|
170
|
+
both: styles.subgridBoth ?? "",
|
|
171
171
|
};
|
|
172
172
|
|
|
173
173
|
const GridItem = React.forwardRef<HTMLDivElement, GridItemProps>(function GridItem(
|
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
3
|
"name": "Header",
|
|
4
|
-
"description": "
|
|
5
|
-
"category": "
|
|
6
|
-
"tags": [
|
|
7
|
-
"header",
|
|
8
|
-
"navigation",
|
|
9
|
-
"navbar",
|
|
10
|
-
"brand",
|
|
11
|
-
"layout",
|
|
12
|
-
"dropdown"
|
|
13
|
-
],
|
|
4
|
+
"description": "Composes brand, navigation, search, and actions into one responsive app bar.",
|
|
5
|
+
"category": "layout",
|
|
6
|
+
"tags": ["header", "navigation", "navbar", "brand", "layout", "dropdown"],
|
|
14
7
|
"status": "stable",
|
|
15
8
|
"sourcePath": "src/components/Header/index.tsx",
|
|
16
9
|
"exportName": "Header",
|
|
@@ -41,11 +34,7 @@
|
|
|
41
34
|
"description": "Position behavior (usually controlled by AppShell)",
|
|
42
35
|
"default": "static",
|
|
43
36
|
"required": false,
|
|
44
|
-
"values": [
|
|
45
|
-
"static",
|
|
46
|
-
"fixed",
|
|
47
|
-
"sticky"
|
|
48
|
-
]
|
|
37
|
+
"values": ["static", "fixed", "sticky"]
|
|
49
38
|
},
|
|
50
39
|
"elevatedOnScroll": {
|
|
51
40
|
"type": "boolean|object",
|
|
@@ -80,37 +69,22 @@
|
|
|
80
69
|
},
|
|
81
70
|
"usage": {
|
|
82
71
|
"when": [
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"Header with responsive mobile menu trigger",
|
|
87
|
-
"Grouping related nav items under a dropdown menu"
|
|
72
|
+
"Top-level navigation for an app or site",
|
|
73
|
+
"Inside AppShell.Header",
|
|
74
|
+
"Anywhere brand, nav, and actions share one row"
|
|
88
75
|
],
|
|
89
76
|
"whenNot": [
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
77
|
+
"Section headings inside a page (use a heading)",
|
|
78
|
+
"Toolbars scoped to one panel (use Toolbar)",
|
|
79
|
+
"Sidebar-only navigation (use Sidebar)"
|
|
93
80
|
],
|
|
94
81
|
"guidelines": [
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"Header.Trigger
|
|
100
|
-
"Header.
|
|
101
|
-
"Use Header.Spacer to push items apart",
|
|
102
|
-
"Use Header.NavMenu to group related nav items under a dropdown",
|
|
103
|
-
"Use Header.NavMenuItem inside Header.NavMenu for dropdown items",
|
|
104
|
-
"Header sub-components forward DOM props (id, aria-*, data-*, handlers) to their rendered elements",
|
|
105
|
-
"Header.Brand asChild composes custom link components while preserving canonical brand styling",
|
|
106
|
-
"Header.NavItem asChild composes click handlers instead of overwriting the child handler",
|
|
107
|
-
"Use elevatedOnScroll on sticky marketing headers that need a boundary after scrolling",
|
|
108
|
-
"Use navAlign=\"center\" when navigation must stay centered independently of brand and actions",
|
|
109
|
-
"Use container=\"page\" when the header should share a bounded page gutter",
|
|
110
|
-
"Use Header.MobileNavActions for the primary action row inside Header.MobileNav",
|
|
111
|
-
"Use the Header icons prop to replace internal mobile trigger and dropdown chevron icons with any icon package",
|
|
112
|
-
"For rich dropdown content (titles, descriptions, icons), use NavigationMenu instead of Header.Nav",
|
|
113
|
-
"NavigationMenu also provides an automatic mobile drawer, replacing Header.Trigger + Sidebar for mobile nav"
|
|
82
|
+
"Header.Spacer pushes the actions cluster to the right",
|
|
83
|
+
"Omit Header.Brand when the sidebar already shows the logo",
|
|
84
|
+
"container=\"page\" caps the content at page width for marketing bars",
|
|
85
|
+
"elevatedOnScroll adds a bottom border once the page scrolls",
|
|
86
|
+
"Pair Header.Trigger with Header.MobileNav for small screens",
|
|
87
|
+
"Header.SkipLink should be the first child"
|
|
114
88
|
],
|
|
115
89
|
"accessibility": [
|
|
116
90
|
"Include Header.SkipLink for keyboard users",
|
|
@@ -123,43 +97,38 @@
|
|
|
123
97
|
"examples": [
|
|
124
98
|
{
|
|
125
99
|
"name": "For Default Layout",
|
|
126
|
-
"description": "
|
|
127
|
-
"code": "<
|
|
100
|
+
"description": "Brand, nav, and actions for AppShell layout=\"default\".",
|
|
101
|
+
"code": "import { Box } from '@/components/Box';\nimport { Button } from '@/components/Button';\nimport { Header } from '@/components/Header';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.SkipLink />\n <Header.Trigger />\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/dashboard\" active>Dashboard</Header.NavItem>\n <Header.NavItem href=\"/projects\">Projects</Header.NavItem>\n <Header.NavItem href=\"/settings\">Settings</Header.NavItem>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n <Button variant=\"secondary\" size=\"sm\">Sign In</Button>\n </Header.Actions>\n </Header>\n</Box>"
|
|
128
102
|
},
|
|
129
103
|
{
|
|
130
104
|
"name": "Marketing Header",
|
|
131
|
-
"description": "Sticky
|
|
132
|
-
"code": "<Header position=\"sticky\" elevatedOnScroll navAlign=\"center\" container=\"page\">\n
|
|
105
|
+
"description": "Sticky page-width bar that gains a border on scroll, with a mobile drawer.",
|
|
106
|
+
"code": "import { Box } from '@/components/Box';\nimport { Button } from '@/components/Button';\nimport { Header } from '@/components/Header';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header position=\"sticky\" elevatedOnScroll navAlign=\"center\" container=\"page\">\n <Header.SkipLink href=\"#main-content\" />\n <Header.Brand asChild>\n <a href=\"/\" aria-label=\"Home\">Logo</a>\n </Header.Brand>\n <Header.Nav aria-label=\"Main navigation\">\n <Header.NavItem href=\"/docs\">Docs</Header.NavItem>\n <Header.NavItem href=\"/pricing\">Pricing</Header.NavItem>\n </Header.Nav>\n <Header.Actions>\n <Button size=\"sm\">Start free</Button>\n </Header.Actions>\n <Header.Trigger />\n <Header.MobileNav>\n <Header.MobileNavLink href=\"/docs\">Docs</Header.MobileNavLink>\n <Header.MobileNavLink href=\"/pricing\">Pricing</Header.MobileNavLink>\n <Header.MobileNavActions>\n <Button size=\"sm\">Start free</Button>\n </Header.MobileNavActions>\n </Header.MobileNav>\n </Header>\n</Box>"
|
|
133
107
|
},
|
|
134
108
|
{
|
|
135
109
|
"name": "With Dropdown Nav",
|
|
136
|
-
"description": "Header
|
|
137
|
-
"code": "<
|
|
110
|
+
"description": "Header.NavMenu groups related links behind one trigger.",
|
|
111
|
+
"code": "import { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/components\" active>Components</Header.NavItem>\n <Header.NavItem href=\"/blocks\">Blocks</Header.NavItem>\n <Header.NavMenu label=\"Docs\">\n <Header.NavMenuItem href=\"/getting-started\">Getting Started</Header.NavMenuItem>\n <Header.NavMenuItem href=\"/cli\">CLI Reference</Header.NavMenuItem>\n <Header.NavMenuItem href=\"/mcp\">MCP Tools</Header.NavMenuItem>\n </Header.NavMenu>\n <Header.NavItem href=\"/blog\">Blog</Header.NavItem>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</Box>"
|
|
138
112
|
},
|
|
139
113
|
{
|
|
140
114
|
"name": "For Sidebar Layout",
|
|
141
|
-
"description": "
|
|
142
|
-
"code": "<
|
|
115
|
+
"description": "No brand — the logo lives in the sidebar instead.",
|
|
116
|
+
"code": "import { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Input } from '@/components/Input';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.SkipLink />\n <Header.Trigger />\n <Header.Search>\n <Input placeholder=\"Search...\" style={{ width: '240px' }} />\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</Box>"
|
|
143
117
|
},
|
|
144
118
|
{
|
|
145
119
|
"name": "Minimal",
|
|
146
|
-
"description": "
|
|
147
|
-
"code": "<
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
"name": "With Search",
|
|
151
|
-
"description": "Header featuring a prominent search input",
|
|
152
|
-
"code": "<ThemeProvider defaultMode=\"light\">\n <Header>\n <Header.Brand>Docs</Header.Brand>\n <Header.Search>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n background: 'var(--fui-bg-secondary)',\n borderRadius: '6px',\n color: 'var(--fui-text-tertiary)',\n fontSize: '14px',\n width: '280px'\n }}>\n <MagnifyingGlass size={16} /> Search documentation...\n </div>\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</ThemeProvider>"
|
|
120
|
+
"description": "Just the drawer trigger and actions.",
|
|
121
|
+
"code": "import { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.Trigger />\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</Box>"
|
|
153
122
|
},
|
|
154
123
|
{
|
|
155
124
|
"name": "With Skip Link",
|
|
156
|
-
"description": "
|
|
157
|
-
"code": "<
|
|
125
|
+
"description": "Header.SkipLink gives keyboard users a jump to main content.",
|
|
126
|
+
"code": "import { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.SkipLink href=\"#main-content\">Skip to content</Header.SkipLink>\n <Header.Brand>Accessible App</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/\" active>Home</Header.NavItem>\n <Header.NavItem href=\"/about\">About</Header.NavItem>\n </Header.Nav>\n </Header>\n</Box>"
|
|
158
127
|
},
|
|
159
128
|
{
|
|
160
129
|
"name": "With NavigationMenu",
|
|
161
|
-
"description": "
|
|
162
|
-
"code": "<
|
|
130
|
+
"description": "Rich dropdown panels with titles and descriptions.",
|
|
131
|
+
"code": "import { Box } from '@/components/Box';\nimport { Button } from '@/components/Button';\nimport { Header } from '@/components/Header';\nimport { NavigationMenu } from '@/components/NavigationMenu';\nimport { Stack } from '@/components/Stack';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <Header.Nav>\n <NavigationMenu aria-label=\"Site navigation\">\n <NavigationMenu.List>\n <NavigationMenu.Item value=\"products\">\n <NavigationMenu.Trigger>Products</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <Box padding=\"xs\" style={{ minWidth: '200px' }}>\n <Stack gap=\"none\">\n <NavigationMenu.Link href=\"/analytics\" title=\"Analytics\" description=\"Track your metrics.\" />\n <NavigationMenu.Link href=\"/automation\" title=\"Automation\" description=\"Automate workflows.\" />\n </Stack>\n </Box>\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n <NavigationMenu.Item>\n <NavigationMenu.Link href=\"/pricing\">Pricing</NavigationMenu.Link>\n </NavigationMenu.Item>\n </NavigationMenu.List>\n <NavigationMenu.Viewport />\n </NavigationMenu>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n <Button variant=\"primary\" size=\"sm\">Sign Up</Button>\n </Header.Actions>\n </Header>\n</Box>"
|
|
163
132
|
}
|
|
164
133
|
],
|
|
165
134
|
"relations": [
|
|
@@ -197,12 +166,7 @@
|
|
|
197
166
|
"Header.NavMenu provides dropdown groups via Base UI Menu",
|
|
198
167
|
"Header.MobileNavActions provides an action row inside the mobile drawer"
|
|
199
168
|
],
|
|
200
|
-
"a11yRules": [
|
|
201
|
-
"A11Y_HEADER_LANDMARK",
|
|
202
|
-
"A11Y_NAV_LABEL",
|
|
203
|
-
"A11Y_SKIP_LINK",
|
|
204
|
-
"A11Y_BUTTON_LABEL"
|
|
205
|
-
]
|
|
169
|
+
"a11yRules": ["A11Y_HEADER_LANDMARK", "A11Y_NAV_LABEL", "A11Y_SKIP_LINK", "A11Y_BUTTON_LABEL"]
|
|
206
170
|
},
|
|
207
171
|
"ai": {
|
|
208
172
|
"compositionPattern": "compound",
|