@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,33 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as React from
|
|
4
|
-
import { createPortal } from
|
|
5
|
-
import { Menu as BaseMenu } from
|
|
6
|
-
import { CaretDown, List, X } from
|
|
7
|
-
import { useFocusTrap } from
|
|
8
|
-
import { ScrollArea } from
|
|
9
|
-
import styles from
|
|
10
|
-
import { useSidebar } from
|
|
11
|
-
import { POPUP_OFFSET_PX } from
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { createPortal } from "react-dom";
|
|
5
|
+
import { Menu as BaseMenu } from "@base-ui/react/menu";
|
|
6
|
+
import { CaretDown, List, X } from "@phosphor-icons/react";
|
|
7
|
+
import { useFocusTrap } from "../../utils/a11y";
|
|
8
|
+
import { ScrollArea } from "../ScrollArea";
|
|
9
|
+
import styles from "./Header.module.scss";
|
|
10
|
+
import { useSidebar } from "../Sidebar";
|
|
11
|
+
import { POPUP_OFFSET_PX } from "../../recipes/popup";
|
|
12
12
|
|
|
13
13
|
// ============================================
|
|
14
14
|
// Types
|
|
15
15
|
// ============================================
|
|
16
16
|
|
|
17
17
|
export interface HeaderIconRenderState {
|
|
18
|
-
slot:
|
|
18
|
+
slot: "menu" | "close" | "navMenuChevron" | "mobileClose";
|
|
19
19
|
open?: boolean;
|
|
20
20
|
active?: boolean;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
export type HeaderIconSlot =
|
|
24
|
-
| React.ReactNode
|
|
25
|
-
| ((state: HeaderIconRenderState) => React.ReactNode);
|
|
23
|
+
export type HeaderIconSlot = React.ReactNode | ((state: HeaderIconRenderState) => React.ReactNode);
|
|
26
24
|
|
|
27
|
-
export type HeaderIcons = Partial<Record<HeaderIconRenderState[
|
|
25
|
+
export type HeaderIcons = Partial<Record<HeaderIconRenderState["slot"], HeaderIconSlot>>;
|
|
28
26
|
|
|
29
|
-
export type HeaderNavAlign =
|
|
30
|
-
export type HeaderContainer =
|
|
27
|
+
export type HeaderNavAlign = "start" | "center";
|
|
28
|
+
export type HeaderContainer = "full" | "page";
|
|
31
29
|
|
|
32
30
|
export interface HeaderElevatedOnScrollOptions {
|
|
33
31
|
/** Scroll offset before the elevated surface is applied */
|
|
@@ -39,7 +37,7 @@ export interface HeaderProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
39
37
|
/** Header height (default: '56px') */
|
|
40
38
|
height?: string;
|
|
41
39
|
/** Position behavior */
|
|
42
|
-
position?:
|
|
40
|
+
position?: "static" | "fixed" | "sticky";
|
|
43
41
|
/** Apply the elevated header surface after scroll */
|
|
44
42
|
elevatedOnScroll?: boolean | HeaderElevatedOnScrollOptions;
|
|
45
43
|
/** Navigation alignment inside the header */
|
|
@@ -61,15 +59,19 @@ export interface HeaderBrandProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
61
59
|
export interface HeaderNavProps extends React.HTMLAttributes<HTMLElement> {
|
|
62
60
|
children: React.ReactNode;
|
|
63
61
|
/** Accessible label for navigation */
|
|
64
|
-
|
|
62
|
+
"aria-label"?: string;
|
|
65
63
|
}
|
|
66
64
|
|
|
67
|
-
export interface HeaderNavItemProps extends Omit<React.HTMLAttributes<HTMLElement>,
|
|
65
|
+
export interface HeaderNavItemProps extends Omit<React.HTMLAttributes<HTMLElement>, "onClick"> {
|
|
68
66
|
children: React.ReactNode;
|
|
69
67
|
/** Whether this item is active/current */
|
|
70
68
|
active?: boolean;
|
|
71
69
|
/** Link destination */
|
|
72
70
|
href?: string;
|
|
71
|
+
/** Anchor target, when `href` renders an anchor */
|
|
72
|
+
target?: React.AnchorHTMLAttributes<HTMLAnchorElement>["target"];
|
|
73
|
+
/** Anchor rel, when `href` renders an anchor */
|
|
74
|
+
rel?: React.AnchorHTMLAttributes<HTMLAnchorElement>["rel"];
|
|
73
75
|
/** Render as child element (polymorphic) */
|
|
74
76
|
asChild?: boolean;
|
|
75
77
|
/** Click handler */
|
|
@@ -90,7 +92,7 @@ export interface HeaderTriggerProps extends React.ButtonHTMLAttributes<HTMLButto
|
|
|
90
92
|
/** Custom trigger content */
|
|
91
93
|
children?: React.ReactNode;
|
|
92
94
|
/** Accessible label */
|
|
93
|
-
|
|
95
|
+
"aria-label"?: string;
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
export interface HeaderNavMenuProps extends React.HTMLAttributes<HTMLLIElement> {
|
|
@@ -137,7 +139,7 @@ const HeaderContext = React.createContext<HeaderContextValue | null>(null);
|
|
|
137
139
|
function useHeaderContext(): HeaderContextValue {
|
|
138
140
|
const ctx = React.useContext(HeaderContext);
|
|
139
141
|
if (!ctx) {
|
|
140
|
-
throw new Error(
|
|
142
|
+
throw new Error("Header compound components must be used within a Header");
|
|
141
143
|
}
|
|
142
144
|
return ctx;
|
|
143
145
|
}
|
|
@@ -152,14 +154,17 @@ function useHeaderIcons(): HeaderIcons | undefined {
|
|
|
152
154
|
return React.useContext(HeaderIconContext);
|
|
153
155
|
}
|
|
154
156
|
|
|
155
|
-
function renderHeaderIcon(
|
|
157
|
+
function renderHeaderIcon(
|
|
158
|
+
slot: HeaderIconSlot | undefined,
|
|
159
|
+
state: HeaderIconRenderState
|
|
160
|
+
): React.ReactNode {
|
|
156
161
|
if (slot === undefined) return undefined;
|
|
157
|
-
return typeof slot ===
|
|
162
|
+
return typeof slot === "function" ? slot(state) : slot;
|
|
158
163
|
}
|
|
159
164
|
|
|
160
165
|
function composeEventHandlers<E extends { defaultPrevented: boolean }>(
|
|
161
166
|
userHandler: ((event: E) => void) | undefined,
|
|
162
|
-
internalHandler: (event: E) => void
|
|
167
|
+
internalHandler: (event: E) => void
|
|
163
168
|
) {
|
|
164
169
|
return (event: E) => {
|
|
165
170
|
userHandler?.(event);
|
|
@@ -172,14 +177,14 @@ function useIsMobile() {
|
|
|
172
177
|
const [isMobile, setIsMobile] = React.useState(false);
|
|
173
178
|
|
|
174
179
|
React.useEffect(() => {
|
|
175
|
-
if (typeof window ===
|
|
180
|
+
if (typeof window === "undefined") return;
|
|
176
181
|
|
|
177
|
-
const mq = window.matchMedia(
|
|
182
|
+
const mq = window.matchMedia("(max-width: 767px)");
|
|
178
183
|
setIsMobile(mq.matches);
|
|
179
184
|
|
|
180
185
|
const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);
|
|
181
|
-
mq.addEventListener(
|
|
182
|
-
return () => mq.removeEventListener(
|
|
186
|
+
mq.addEventListener("change", handler);
|
|
187
|
+
return () => mq.removeEventListener("change", handler);
|
|
183
188
|
}, []);
|
|
184
189
|
|
|
185
190
|
return isMobile;
|
|
@@ -194,11 +199,11 @@ function useIsMobile() {
|
|
|
194
199
|
*/
|
|
195
200
|
function HeaderRoot({
|
|
196
201
|
children,
|
|
197
|
-
height =
|
|
198
|
-
position =
|
|
202
|
+
height = "56px",
|
|
203
|
+
position = "static",
|
|
199
204
|
elevatedOnScroll = false,
|
|
200
|
-
navAlign =
|
|
201
|
-
container =
|
|
205
|
+
navAlign = "start",
|
|
206
|
+
container = "full",
|
|
202
207
|
icons,
|
|
203
208
|
className,
|
|
204
209
|
style: styleProp,
|
|
@@ -208,30 +213,32 @@ function HeaderRoot({
|
|
|
208
213
|
const [scrolled, setScrolled] = React.useState(false);
|
|
209
214
|
const shouldElevateOnScroll = Boolean(elevatedOnScroll);
|
|
210
215
|
const scrollThreshold =
|
|
211
|
-
typeof elevatedOnScroll ===
|
|
216
|
+
typeof elevatedOnScroll === "object" ? (elevatedOnScroll.threshold ?? 16) : 16;
|
|
212
217
|
|
|
213
218
|
React.useEffect(() => {
|
|
214
219
|
if (!shouldElevateOnScroll) return;
|
|
215
220
|
|
|
216
221
|
const updateScrolled = () => setScrolled(window.scrollY > scrollThreshold);
|
|
217
222
|
updateScrolled();
|
|
218
|
-
window.addEventListener(
|
|
219
|
-
return () => window.removeEventListener(
|
|
223
|
+
window.addEventListener("scroll", updateScrolled, { passive: true });
|
|
224
|
+
return () => window.removeEventListener("scroll", updateScrolled);
|
|
220
225
|
}, [scrollThreshold, shouldElevateOnScroll]);
|
|
221
226
|
|
|
222
227
|
const classes = [
|
|
223
228
|
styles.header,
|
|
224
|
-
position ===
|
|
225
|
-
position ===
|
|
229
|
+
position === "fixed" && styles.fixed,
|
|
230
|
+
position === "sticky" && styles.sticky,
|
|
226
231
|
shouldElevateOnScroll && styles.elevatedOnScroll,
|
|
227
232
|
shouldElevateOnScroll && scrolled && styles.scrolled,
|
|
228
|
-
navAlign ===
|
|
229
|
-
container ===
|
|
233
|
+
navAlign === "center" && styles.navCentered,
|
|
234
|
+
container === "page" && styles.containerPage,
|
|
230
235
|
className,
|
|
231
|
-
]
|
|
236
|
+
]
|
|
237
|
+
.filter(Boolean)
|
|
238
|
+
.join(" ");
|
|
232
239
|
|
|
233
240
|
const style: React.CSSProperties = {
|
|
234
|
-
|
|
241
|
+
"--header-height": height,
|
|
235
242
|
...styleProp,
|
|
236
243
|
} as React.CSSProperties;
|
|
237
244
|
|
|
@@ -250,9 +257,7 @@ function HeaderRoot({
|
|
|
250
257
|
data-position={position}
|
|
251
258
|
data-scrolled={shouldElevateOnScroll ? scrolled : undefined}
|
|
252
259
|
>
|
|
253
|
-
<div className={styles.container}>
|
|
254
|
-
{children}
|
|
255
|
-
</div>
|
|
260
|
+
<div className={styles.container}>{children}</div>
|
|
256
261
|
</header>
|
|
257
262
|
</HeaderIconContext.Provider>
|
|
258
263
|
</HeaderContext.Provider>
|
|
@@ -269,7 +274,7 @@ function HeaderBrand({
|
|
|
269
274
|
className,
|
|
270
275
|
...htmlProps
|
|
271
276
|
}: HeaderBrandProps) {
|
|
272
|
-
const classes = [styles.brand, className].filter(Boolean).join(
|
|
277
|
+
const classes = [styles.brand, className].filter(Boolean).join(" ");
|
|
273
278
|
|
|
274
279
|
if (asChild && React.isValidElement(children)) {
|
|
275
280
|
const childProps = children.props as {
|
|
@@ -281,7 +286,7 @@ function HeaderBrand({
|
|
|
281
286
|
return React.cloneElement(children, {
|
|
282
287
|
...restHtmlProps,
|
|
283
288
|
...(href ? { href } : {}),
|
|
284
|
-
className: [classes, childProps.className].filter(Boolean).join(
|
|
289
|
+
className: [classes, childProps.className].filter(Boolean).join(" "),
|
|
285
290
|
onClick: onClick ? composeEventHandlers(childProps.onClick, onClick) : childProps.onClick,
|
|
286
291
|
} as React.HTMLAttributes<HTMLElement>);
|
|
287
292
|
}
|
|
@@ -294,7 +299,11 @@ function HeaderBrand({
|
|
|
294
299
|
);
|
|
295
300
|
}
|
|
296
301
|
|
|
297
|
-
return
|
|
302
|
+
return (
|
|
303
|
+
<div {...htmlProps} className={classes}>
|
|
304
|
+
{children}
|
|
305
|
+
</div>
|
|
306
|
+
);
|
|
298
307
|
}
|
|
299
308
|
|
|
300
309
|
/**
|
|
@@ -302,17 +311,15 @@ function HeaderBrand({
|
|
|
302
311
|
*/
|
|
303
312
|
function HeaderNav({
|
|
304
313
|
children,
|
|
305
|
-
|
|
314
|
+
"aria-label": ariaLabel = "Main navigation",
|
|
306
315
|
className,
|
|
307
316
|
...htmlProps
|
|
308
317
|
}: HeaderNavProps) {
|
|
309
|
-
const classes = [styles.nav, className].filter(Boolean).join(
|
|
318
|
+
const classes = [styles.nav, className].filter(Boolean).join(" ");
|
|
310
319
|
|
|
311
320
|
return (
|
|
312
321
|
<nav {...htmlProps} className={classes} aria-label={ariaLabel}>
|
|
313
|
-
<ul className={styles.navList}>
|
|
314
|
-
{children}
|
|
315
|
-
</ul>
|
|
322
|
+
<ul className={styles.navList}>{children}</ul>
|
|
316
323
|
</nav>
|
|
317
324
|
);
|
|
318
325
|
}
|
|
@@ -329,16 +336,14 @@ function HeaderNavItem({
|
|
|
329
336
|
className,
|
|
330
337
|
...htmlProps
|
|
331
338
|
}: HeaderNavItemProps) {
|
|
332
|
-
const classes = [
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
className,
|
|
336
|
-
].filter(Boolean).join(' ');
|
|
339
|
+
const classes = [styles.navItem, active && styles.navItemActive, className]
|
|
340
|
+
.filter(Boolean)
|
|
341
|
+
.join(" ");
|
|
337
342
|
|
|
338
343
|
const itemProps = {
|
|
339
344
|
className: classes,
|
|
340
345
|
onClick,
|
|
341
|
-
|
|
346
|
+
"aria-current": active ? ("page" as const) : undefined,
|
|
342
347
|
};
|
|
343
348
|
|
|
344
349
|
if (asChild && React.isValidElement(children)) {
|
|
@@ -352,7 +357,7 @@ function HeaderNavItem({
|
|
|
352
357
|
...htmlProps,
|
|
353
358
|
...itemProps,
|
|
354
359
|
onClick: composeEventHandlers(childProps.onClick, onClick ?? (() => {})),
|
|
355
|
-
className: [classes, childProps.className].filter(Boolean).join(
|
|
360
|
+
className: [classes, childProps.className].filter(Boolean).join(" "),
|
|
356
361
|
} as React.HTMLAttributes<HTMLElement>)}
|
|
357
362
|
</li>
|
|
358
363
|
);
|
|
@@ -386,21 +391,27 @@ function HeaderSearch({
|
|
|
386
391
|
className,
|
|
387
392
|
...htmlProps
|
|
388
393
|
}: HeaderSearchProps) {
|
|
389
|
-
const classes = [
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
className,
|
|
393
|
-
].filter(Boolean).join(' ');
|
|
394
|
+
const classes = [styles.search, expandable && styles.searchExpandable, className]
|
|
395
|
+
.filter(Boolean)
|
|
396
|
+
.join(" ");
|
|
394
397
|
|
|
395
|
-
return
|
|
398
|
+
return (
|
|
399
|
+
<div {...htmlProps} className={classes}>
|
|
400
|
+
{children}
|
|
401
|
+
</div>
|
|
402
|
+
);
|
|
396
403
|
}
|
|
397
404
|
|
|
398
405
|
/**
|
|
399
406
|
* Header.Actions - Right-side actions container
|
|
400
407
|
*/
|
|
401
408
|
function HeaderActions({ children, className, ...htmlProps }: HeaderActionsProps) {
|
|
402
|
-
const classes = [styles.actions, className].filter(Boolean).join(
|
|
403
|
-
return
|
|
409
|
+
const classes = [styles.actions, className].filter(Boolean).join(" ");
|
|
410
|
+
return (
|
|
411
|
+
<div {...htmlProps} className={classes}>
|
|
412
|
+
{children}
|
|
413
|
+
</div>
|
|
414
|
+
);
|
|
404
415
|
}
|
|
405
416
|
|
|
406
417
|
/**
|
|
@@ -412,7 +423,7 @@ function HeaderActions({ children, className, ...htmlProps }: HeaderActionsProps
|
|
|
412
423
|
*/
|
|
413
424
|
function HeaderTrigger({
|
|
414
425
|
children,
|
|
415
|
-
|
|
426
|
+
"aria-label": ariaLabel = "Toggle navigation",
|
|
416
427
|
className,
|
|
417
428
|
onClick,
|
|
418
429
|
...htmlProps
|
|
@@ -428,18 +439,18 @@ function HeaderTrigger({
|
|
|
428
439
|
}
|
|
429
440
|
|
|
430
441
|
// Determine which state to use: sidebar (if available with a real provider) or header internal
|
|
431
|
-
const hasSidebarProvider =
|
|
432
|
-
|
|
442
|
+
const hasSidebarProvider =
|
|
443
|
+
sidebar.open !== undefined &&
|
|
444
|
+
sidebar.setOpen !== undefined &&
|
|
445
|
+
typeof sidebar.setOpen === "function";
|
|
433
446
|
const isUsingSidebar = hasSidebarProvider && sidebar.isMobile;
|
|
434
447
|
|
|
435
448
|
const open = isUsingSidebar ? sidebar.open : (headerCtx?.mobileOpen ?? false);
|
|
436
|
-
const setOpen = isUsingSidebar
|
|
437
|
-
? sidebar.setOpen
|
|
438
|
-
: (headerCtx?.setMobileOpen ?? (() => {}));
|
|
449
|
+
const setOpen = isUsingSidebar ? sidebar.setOpen : (headerCtx?.setMobileOpen ?? (() => {}));
|
|
439
450
|
|
|
440
|
-
const classes = [styles.trigger, className].filter(Boolean).join(
|
|
451
|
+
const classes = [styles.trigger, className].filter(Boolean).join(" ");
|
|
441
452
|
const iconSlot = open ? icons?.close : icons?.menu;
|
|
442
|
-
const iconState: HeaderIconRenderState = { slot: open ?
|
|
453
|
+
const iconState: HeaderIconRenderState = { slot: open ? "close" : "menu", open };
|
|
443
454
|
const iconOverride = renderHeaderIcon(iconSlot, iconState);
|
|
444
455
|
|
|
445
456
|
return (
|
|
@@ -451,7 +462,9 @@ function HeaderTrigger({
|
|
|
451
462
|
aria-label={ariaLabel}
|
|
452
463
|
aria-expanded={open}
|
|
453
464
|
>
|
|
454
|
-
{children ||
|
|
465
|
+
{children ||
|
|
466
|
+
iconOverride ||
|
|
467
|
+
(open ? <X size={24} aria-hidden /> : <List size={24} aria-hidden />)}
|
|
455
468
|
</button>
|
|
456
469
|
);
|
|
457
470
|
}
|
|
@@ -460,7 +473,7 @@ function HeaderTrigger({
|
|
|
460
473
|
* Header.Spacer - Flexible spacer to push items apart
|
|
461
474
|
*/
|
|
462
475
|
function HeaderSpacer({ className }: { className?: string }) {
|
|
463
|
-
const classes = [styles.spacer, className].filter(Boolean).join(
|
|
476
|
+
const classes = [styles.spacer, className].filter(Boolean).join(" ");
|
|
464
477
|
return <div className={classes} />;
|
|
465
478
|
}
|
|
466
479
|
|
|
@@ -480,9 +493,11 @@ function HeaderNavMenu({
|
|
|
480
493
|
styles.navMenuTrigger,
|
|
481
494
|
active && styles.navItemActive,
|
|
482
495
|
className,
|
|
483
|
-
]
|
|
496
|
+
]
|
|
497
|
+
.filter(Boolean)
|
|
498
|
+
.join(" ");
|
|
484
499
|
const chevronIcon = renderHeaderIcon(icons?.navMenuChevron, {
|
|
485
|
-
slot:
|
|
500
|
+
slot: "navMenuChevron",
|
|
486
501
|
active,
|
|
487
502
|
});
|
|
488
503
|
|
|
@@ -491,15 +506,22 @@ function HeaderNavMenu({
|
|
|
491
506
|
<BaseMenu.Root modal={false}>
|
|
492
507
|
<BaseMenu.Trigger className={triggerClasses}>
|
|
493
508
|
{label}
|
|
494
|
-
{chevronIcon
|
|
495
|
-
|
|
496
|
-
|
|
509
|
+
{chevronIcon ? (
|
|
510
|
+
<span className={styles.navMenuChevron} aria-hidden>
|
|
511
|
+
{chevronIcon}
|
|
512
|
+
</span>
|
|
513
|
+
) : (
|
|
514
|
+
<CaretDown size={12} className={styles.navMenuChevron} aria-hidden />
|
|
515
|
+
)}
|
|
497
516
|
</BaseMenu.Trigger>
|
|
498
517
|
<BaseMenu.Portal>
|
|
499
|
-
<BaseMenu.Positioner
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
518
|
+
<BaseMenu.Positioner
|
|
519
|
+
side="bottom"
|
|
520
|
+
align="start"
|
|
521
|
+
sideOffset={POPUP_OFFSET_PX}
|
|
522
|
+
className={styles.navMenuPositioner}
|
|
523
|
+
>
|
|
524
|
+
<BaseMenu.Popup className={styles.navMenuPopup}>{children}</BaseMenu.Popup>
|
|
503
525
|
</BaseMenu.Positioner>
|
|
504
526
|
</BaseMenu.Portal>
|
|
505
527
|
</BaseMenu.Root>
|
|
@@ -518,19 +540,13 @@ function HeaderNavMenuItem({
|
|
|
518
540
|
className,
|
|
519
541
|
...htmlProps
|
|
520
542
|
}: HeaderNavMenuItemProps) {
|
|
521
|
-
const classes = [
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
className,
|
|
525
|
-
].filter(Boolean).join(' ');
|
|
543
|
+
const classes = [styles.navMenuItem, active && styles.navMenuItemActive, className]
|
|
544
|
+
.filter(Boolean)
|
|
545
|
+
.join(" ");
|
|
526
546
|
|
|
527
547
|
if (asChild && React.isValidElement(children)) {
|
|
528
548
|
return (
|
|
529
|
-
<BaseMenu.Item
|
|
530
|
-
{...htmlProps}
|
|
531
|
-
className={classes}
|
|
532
|
-
render={children as React.ReactElement}
|
|
533
|
-
/>
|
|
549
|
+
<BaseMenu.Item {...htmlProps} className={classes} render={children as React.ReactElement} />
|
|
534
550
|
);
|
|
535
551
|
}
|
|
536
552
|
|
|
@@ -564,38 +580,36 @@ function HeaderMobileNav({ children, className }: HeaderMobileNavProps) {
|
|
|
564
580
|
// Lock body scroll when open
|
|
565
581
|
React.useEffect(() => {
|
|
566
582
|
if (!mobileOpen) return;
|
|
567
|
-
document.body.style.overflow =
|
|
568
|
-
return () => {
|
|
583
|
+
document.body.style.overflow = "hidden";
|
|
584
|
+
return () => {
|
|
585
|
+
document.body.style.overflow = "";
|
|
586
|
+
};
|
|
569
587
|
}, [mobileOpen]);
|
|
570
588
|
|
|
571
589
|
// Handle Escape
|
|
572
590
|
React.useEffect(() => {
|
|
573
591
|
if (!mobileOpen) return;
|
|
574
592
|
const handleKeyDown = (e: KeyboardEvent) => {
|
|
575
|
-
if (e.key ===
|
|
593
|
+
if (e.key === "Escape") setMobileOpen(false);
|
|
576
594
|
};
|
|
577
|
-
document.addEventListener(
|
|
578
|
-
return () => document.removeEventListener(
|
|
595
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
596
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
579
597
|
}, [mobileOpen, setMobileOpen]);
|
|
580
598
|
|
|
581
599
|
if (!mobileOpen) return null;
|
|
582
|
-
if (typeof document ===
|
|
600
|
+
if (typeof document === "undefined") return null;
|
|
583
601
|
|
|
584
602
|
const closeIcon = renderHeaderIcon(icons?.mobileClose, {
|
|
585
|
-
slot:
|
|
603
|
+
slot: "mobileClose",
|
|
586
604
|
open: true,
|
|
587
605
|
});
|
|
588
606
|
|
|
589
607
|
const drawerContent = (
|
|
590
608
|
<>
|
|
591
|
-
<div
|
|
592
|
-
className={styles.mobileNavBackdrop}
|
|
593
|
-
onClick={() => setMobileOpen(false)}
|
|
594
|
-
aria-hidden
|
|
595
|
-
/>
|
|
609
|
+
<div className={styles.mobileNavBackdrop} onClick={() => setMobileOpen(false)} aria-hidden />
|
|
596
610
|
<div
|
|
597
611
|
ref={drawerRef}
|
|
598
|
-
className={[styles.mobileNavDrawer, className].filter(Boolean).join(
|
|
612
|
+
className={[styles.mobileNavDrawer, className].filter(Boolean).join(" ")}
|
|
599
613
|
role="dialog"
|
|
600
614
|
aria-modal
|
|
601
615
|
aria-label="Navigation"
|
|
@@ -610,7 +624,7 @@ function HeaderMobileNav({ children, className }: HeaderMobileNavProps) {
|
|
|
610
624
|
{closeIcon ?? <X size={20} aria-hidden />}
|
|
611
625
|
</button>
|
|
612
626
|
</div>
|
|
613
|
-
<ScrollArea orientation="vertical" className={styles.mobileNavBody}>
|
|
627
|
+
<ScrollArea orientation="vertical" showFades className={styles.mobileNavBody}>
|
|
614
628
|
{children}
|
|
615
629
|
</ScrollArea>
|
|
616
630
|
</div>
|
|
@@ -634,11 +648,9 @@ function HeaderMobileNavLink({
|
|
|
634
648
|
}: HeaderNavItemProps) {
|
|
635
649
|
const { setMobileOpen } = useHeaderContext();
|
|
636
650
|
|
|
637
|
-
const classes = [
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
className,
|
|
641
|
-
].filter(Boolean).join(' ');
|
|
651
|
+
const classes = [styles.mobileNavLink, active && styles.mobileNavLinkActive, className]
|
|
652
|
+
.filter(Boolean)
|
|
653
|
+
.join(" ");
|
|
642
654
|
|
|
643
655
|
const handleClick: React.MouseEventHandler<HTMLElement> = (e) => {
|
|
644
656
|
onClick?.(e);
|
|
@@ -652,7 +664,7 @@ function HeaderMobileNavLink({
|
|
|
652
664
|
};
|
|
653
665
|
return React.cloneElement(children, {
|
|
654
666
|
...htmlProps,
|
|
655
|
-
className: [classes, childProps.className].filter(Boolean).join(
|
|
667
|
+
className: [classes, childProps.className].filter(Boolean).join(" "),
|
|
656
668
|
onClick: composeEventHandlers(childProps.onClick, handleClick),
|
|
657
669
|
} as React.HTMLAttributes<HTMLElement>);
|
|
658
670
|
}
|
|
@@ -680,7 +692,7 @@ function HeaderMobileNavActions({
|
|
|
680
692
|
className,
|
|
681
693
|
...htmlProps
|
|
682
694
|
}: HeaderMobileNavActionsProps) {
|
|
683
|
-
const classes = [styles.mobileNavActions, className].filter(Boolean).join(
|
|
695
|
+
const classes = [styles.mobileNavActions, className].filter(Boolean).join(" ");
|
|
684
696
|
|
|
685
697
|
return (
|
|
686
698
|
<div {...htmlProps} className={classes}>
|
|
@@ -693,15 +705,15 @@ function HeaderMobileNavActions({
|
|
|
693
705
|
* Header.SkipLink - Skip to main content link (accessibility)
|
|
694
706
|
*/
|
|
695
707
|
function HeaderSkipLink({
|
|
696
|
-
children =
|
|
697
|
-
href =
|
|
708
|
+
children = "Skip to main content",
|
|
709
|
+
href = "#main-content",
|
|
698
710
|
className,
|
|
699
711
|
}: {
|
|
700
712
|
children?: React.ReactNode;
|
|
701
713
|
href?: string;
|
|
702
714
|
className?: string;
|
|
703
715
|
}) {
|
|
704
|
-
const classes = [styles.skipLink, className].filter(Boolean).join(
|
|
716
|
+
const classes = [styles.skipLink, className].filter(Boolean).join(" ");
|
|
705
717
|
return (
|
|
706
718
|
<a href={href} className={classes}>
|
|
707
719
|
{children}
|