@fragments-sdk/ui 0.13.0 → 0.14.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/dist/assets/ui.css +1642 -1679
- package/dist/chart.cjs.map +1 -1
- package/dist/chart.js.map +1 -1
- package/dist/codeblock.cjs +26 -18
- package/dist/codeblock.cjs.map +1 -1
- package/dist/codeblock.js +26 -18
- package/dist/codeblock.js.map +1 -1
- package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
- package/dist/components/Accordion/Accordion.module.scss.js +8 -8
- package/dist/components/Accordion/index.cjs +7 -3
- package/dist/components/Accordion/index.cjs.map +1 -1
- package/dist/components/Accordion/index.d.ts +24 -11
- package/dist/components/Accordion/index.d.ts.map +1 -1
- package/dist/components/Accordion/index.js +7 -3
- package/dist/components/Accordion/index.js.map +1 -1
- package/dist/components/Alert/Alert.module.scss.cjs +12 -12
- package/dist/components/Alert/Alert.module.scss.js +12 -12
- package/dist/components/Alert/index.cjs +37 -15
- package/dist/components/Alert/index.cjs.map +1 -1
- package/dist/components/Alert/index.d.ts +15 -22
- package/dist/components/Alert/index.d.ts.map +1 -1
- package/dist/components/Alert/index.js +37 -15
- package/dist/components/Alert/index.js.map +1 -1
- package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
- package/dist/components/AppShell/AppShell.module.scss.js +14 -14
- package/dist/components/AppShell/index.cjs +3 -1
- package/dist/components/AppShell/index.cjs.map +1 -1
- package/dist/components/AppShell/index.d.ts.map +1 -1
- package/dist/components/AppShell/index.js +3 -1
- package/dist/components/AppShell/index.js.map +1 -1
- package/dist/components/Avatar/index.cjs +9 -1
- package/dist/components/Avatar/index.cjs.map +1 -1
- package/dist/components/Avatar/index.d.ts +2 -0
- package/dist/components/Avatar/index.d.ts.map +1 -1
- package/dist/components/Avatar/index.js +9 -1
- package/dist/components/Avatar/index.js.map +1 -1
- package/dist/components/Badge/index.cjs +4 -2
- package/dist/components/Badge/index.cjs.map +1 -1
- package/dist/components/Badge/index.d.ts +3 -0
- package/dist/components/Badge/index.d.ts.map +1 -1
- package/dist/components/Badge/index.js +4 -2
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +11 -11
- package/dist/components/BentoGrid/BentoGrid.module.scss.js +11 -11
- package/dist/components/BentoGrid/index.cjs +8 -5
- package/dist/components/BentoGrid/index.cjs.map +1 -1
- package/dist/components/BentoGrid/index.d.ts +2 -8
- package/dist/components/BentoGrid/index.d.ts.map +1 -1
- package/dist/components/BentoGrid/index.js +8 -5
- package/dist/components/BentoGrid/index.js.map +1 -1
- package/dist/components/Box/index.cjs +12 -2
- package/dist/components/Box/index.cjs.map +1 -1
- package/dist/components/Box/index.d.ts +1 -1
- package/dist/components/Box/index.d.ts.map +1 -1
- package/dist/components/Box/index.js +12 -2
- package/dist/components/Box/index.js.map +1 -1
- package/dist/components/Breadcrumbs/index.cjs +3 -1
- package/dist/components/Breadcrumbs/index.cjs.map +1 -1
- package/dist/components/Breadcrumbs/index.d.ts +3 -1
- package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/components/Breadcrumbs/index.js +3 -1
- package/dist/components/Breadcrumbs/index.js.map +1 -1
- package/dist/components/Button/Button.module.scss.cjs +11 -11
- package/dist/components/Button/Button.module.scss.js +11 -11
- package/dist/components/Button/index.cjs +5 -2
- package/dist/components/Button/index.cjs.map +1 -1
- package/dist/components/Button/index.d.ts +3 -3
- package/dist/components/Button/index.d.ts.map +1 -1
- package/dist/components/Button/index.js +5 -2
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/ButtonGroup/index.cjs +3 -2
- package/dist/components/ButtonGroup/index.cjs.map +1 -1
- package/dist/components/ButtonGroup/index.d.ts +1 -2
- package/dist/components/ButtonGroup/index.d.ts.map +1 -1
- package/dist/components/ButtonGroup/index.js +3 -2
- package/dist/components/ButtonGroup/index.js.map +1 -1
- package/dist/components/Card/Card.module.scss.cjs +14 -14
- package/dist/components/Card/Card.module.scss.js +14 -14
- package/dist/components/Card/index.cjs +3 -22
- package/dist/components/Card/index.cjs.map +1 -1
- package/dist/components/Card/index.d.ts +6 -11
- package/dist/components/Card/index.d.ts.map +1 -1
- package/dist/components/Card/index.js +3 -22
- package/dist/components/Card/index.js.map +1 -1
- 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 +3 -3
- package/dist/components/Chart/index.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.scss.cjs +10 -10
- package/dist/components/Checkbox/Checkbox.module.scss.js +10 -10
- package/dist/components/Checkbox/index.cjs +11 -4
- package/dist/components/Checkbox/index.cjs.map +1 -1
- package/dist/components/Checkbox/index.d.ts +6 -0
- package/dist/components/Checkbox/index.d.ts.map +1 -1
- package/dist/components/Checkbox/index.js +11 -4
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/Chip/index.cjs +11 -3
- package/dist/components/Chip/index.cjs.map +1 -1
- package/dist/components/Chip/index.d.ts +1 -2
- package/dist/components/Chip/index.d.ts.map +1 -1
- package/dist/components/Chip/index.js +11 -3
- package/dist/components/Chip/index.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +20 -20
- package/dist/components/CodeBlock/CodeBlock.module.scss.js +20 -20
- package/dist/components/CodeBlock/index.d.ts +8 -2
- package/dist/components/CodeBlock/index.d.ts.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.scss.cjs +10 -10
- package/dist/components/Collapsible/Collapsible.module.scss.js +10 -10
- package/dist/components/Combobox/Combobox.module.scss.cjs +15 -15
- package/dist/components/Combobox/Combobox.module.scss.js +15 -15
- package/dist/components/Combobox/index.cjs +68 -18
- package/dist/components/Combobox/index.cjs.map +1 -1
- package/dist/components/Combobox/index.d.ts +32 -11
- package/dist/components/Combobox/index.d.ts.map +1 -1
- package/dist/components/Combobox/index.js +68 -18
- package/dist/components/Combobox/index.js.map +1 -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 +4 -4
- package/dist/components/Command/index.cjs.map +1 -1
- package/dist/components/Command/index.d.ts +1 -1
- package/dist/components/Command/index.d.ts.map +1 -1
- package/dist/components/Command/index.js +4 -4
- package/dist/components/Command/index.js.map +1 -1
- package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
- package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
- package/dist/components/ConversationList/index.cjs +6 -3
- package/dist/components/ConversationList/index.cjs.map +1 -1
- package/dist/components/ConversationList/index.d.ts +1 -1
- package/dist/components/ConversationList/index.d.ts.map +1 -1
- package/dist/components/ConversationList/index.js +6 -3
- package/dist/components/ConversationList/index.js.map +1 -1
- package/dist/components/DataTable/DataTable.module.scss.cjs +26 -26
- package/dist/components/DataTable/DataTable.module.scss.js +26 -26
- package/dist/components/DataTable/index.cjs +13 -4
- package/dist/components/DataTable/index.cjs.map +1 -1
- package/dist/components/DataTable/index.d.ts +7 -2
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/index.js +13 -4
- package/dist/components/DataTable/index.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.module.scss.cjs +26 -26
- package/dist/components/DatePicker/DatePicker.module.scss.js +26 -26
- package/dist/components/DatePicker/index.d.ts +2 -2
- 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 +2 -1
- package/dist/components/Dialog/index.cjs.map +1 -1
- package/dist/components/Dialog/index.d.ts +20 -7
- package/dist/components/Dialog/index.d.ts.map +1 -1
- package/dist/components/Dialog/index.js +2 -1
- package/dist/components/Dialog/index.js.map +1 -1
- package/dist/components/Drawer/Drawer.module.scss.cjs +26 -26
- package/dist/components/Drawer/Drawer.module.scss.js +26 -26
- package/dist/components/Drawer/index.cjs +30 -3
- package/dist/components/Drawer/index.cjs.map +1 -1
- package/dist/components/Drawer/index.d.ts +3 -1
- package/dist/components/Drawer/index.d.ts.map +1 -1
- package/dist/components/Drawer/index.js +13 -3
- package/dist/components/Drawer/index.js.map +1 -1
- 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.cjs +32 -7
- package/dist/components/Editor/index.cjs.map +1 -1
- package/dist/components/Editor/index.d.ts +16 -3
- package/dist/components/Editor/index.d.ts.map +1 -1
- package/dist/components/Editor/index.js +32 -7
- package/dist/components/Editor/index.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
- package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
- package/dist/components/EmptyState/index.cjs +12 -8
- package/dist/components/EmptyState/index.cjs.map +1 -1
- package/dist/components/EmptyState/index.d.ts +8 -12
- package/dist/components/EmptyState/index.d.ts.map +1 -1
- package/dist/components/EmptyState/index.js +12 -8
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/Fieldset/index.cjs +2 -2
- package/dist/components/Fieldset/index.cjs.map +1 -1
- package/dist/components/Fieldset/index.d.ts +2 -3
- package/dist/components/Fieldset/index.d.ts.map +1 -1
- package/dist/components/Fieldset/index.js +2 -2
- package/dist/components/Fieldset/index.js.map +1 -1
- package/dist/components/Form/index.cjs +13 -13
- package/dist/components/Form/index.cjs.map +1 -1
- package/dist/components/Form/index.d.ts +5 -2
- package/dist/components/Form/index.d.ts.map +1 -1
- package/dist/components/Form/index.js +13 -13
- package/dist/components/Form/index.js.map +1 -1
- package/dist/components/Grid/Grid.module.scss.cjs +57 -57
- package/dist/components/Grid/Grid.module.scss.js +57 -57
- package/dist/components/Grid/index.cjs +7 -4
- package/dist/components/Grid/index.cjs.map +1 -1
- package/dist/components/Grid/index.d.ts +5 -3
- package/dist/components/Grid/index.d.ts.map +1 -1
- package/dist/components/Grid/index.js +7 -4
- package/dist/components/Grid/index.js.map +1 -1
- package/dist/components/Header/Header.module.scss.cjs +21 -21
- package/dist/components/Header/Header.module.scss.js +21 -21
- package/dist/components/Header/index.cjs +61 -23
- package/dist/components/Header/index.cjs.map +1 -1
- package/dist/components/Header/index.d.ts +27 -34
- package/dist/components/Header/index.d.ts.map +1 -1
- package/dist/components/Header/index.js +61 -23
- package/dist/components/Header/index.js.map +1 -1
- package/dist/components/Icon/index.cjs +11 -1
- package/dist/components/Icon/index.cjs.map +1 -1
- package/dist/components/Icon/index.d.ts +28 -9
- package/dist/components/Icon/index.d.ts.map +1 -1
- package/dist/components/Icon/index.js +11 -1
- package/dist/components/Icon/index.js.map +1 -1
- package/dist/components/Image/index.cjs +15 -4
- package/dist/components/Image/index.cjs.map +1 -1
- package/dist/components/Image/index.d.ts +7 -1
- package/dist/components/Image/index.d.ts.map +1 -1
- package/dist/components/Image/index.js +15 -4
- package/dist/components/Image/index.js.map +1 -1
- package/dist/components/Input/Input.module.scss.cjs +13 -13
- package/dist/components/Input/Input.module.scss.js +13 -13
- package/dist/components/Input/index.cjs +79 -31
- package/dist/components/Input/index.cjs.map +1 -1
- package/dist/components/Input/index.d.ts +17 -3
- package/dist/components/Input/index.d.ts.map +1 -1
- package/dist/components/Input/index.js +79 -31
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Link/index.cjs +17 -0
- package/dist/components/Link/index.cjs.map +1 -1
- package/dist/components/Link/index.d.ts.map +1 -1
- package/dist/components/Link/index.js +17 -0
- package/dist/components/Link/index.js.map +1 -1
- package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
- package/dist/components/Listbox/Listbox.module.scss.js +8 -8
- package/dist/components/Listbox/index.cjs +10 -6
- package/dist/components/Listbox/index.cjs.map +1 -1
- package/dist/components/Listbox/index.d.ts +2 -2
- package/dist/components/Listbox/index.d.ts.map +1 -1
- package/dist/components/Listbox/index.js +10 -6
- package/dist/components/Listbox/index.js.map +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 +4 -2
- package/dist/components/Markdown/index.d.ts.map +1 -1
- package/dist/components/Menu/Menu.module.scss.cjs +13 -13
- package/dist/components/Menu/Menu.module.scss.js +13 -13
- package/dist/components/Menu/index.cjs +12 -1
- package/dist/components/Menu/index.cjs.map +1 -1
- package/dist/components/Menu/index.d.ts +9 -4
- package/dist/components/Menu/index.d.ts.map +1 -1
- package/dist/components/Menu/index.js +12 -1
- package/dist/components/Menu/index.js.map +1 -1
- 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 +28 -28
- package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +28 -28
- package/dist/components/NavigationMenu/NavigationMenuContext.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenuContext.d.ts +8 -0
- package/dist/components/NavigationMenu/NavigationMenuContext.d.ts.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenuContext.js.map +1 -1
- package/dist/components/NavigationMenu/index.cjs +49 -10
- package/dist/components/NavigationMenu/index.cjs.map +1 -1
- package/dist/components/NavigationMenu/index.d.ts +5 -1
- package/dist/components/NavigationMenu/index.d.ts.map +1 -1
- package/dist/components/NavigationMenu/index.js +49 -10
- package/dist/components/NavigationMenu/index.js.map +1 -1
- package/dist/components/Pagination/index.cjs +37 -9
- package/dist/components/Pagination/index.cjs.map +1 -1
- package/dist/components/Pagination/index.d.ts +2 -3
- package/dist/components/Pagination/index.d.ts.map +1 -1
- package/dist/components/Pagination/index.js +37 -9
- package/dist/components/Pagination/index.js.map +1 -1
- package/dist/components/Popover/Popover.module.scss.cjs +10 -10
- package/dist/components/Popover/Popover.module.scss.js +10 -10
- package/dist/components/Popover/index.cjs +43 -2
- package/dist/components/Popover/index.cjs.map +1 -1
- package/dist/components/Popover/index.d.ts +16 -6
- package/dist/components/Popover/index.d.ts.map +1 -1
- package/dist/components/Popover/index.js +26 -2
- package/dist/components/Popover/index.js.map +1 -1
- package/dist/components/Progress/index.cjs +3 -1
- package/dist/components/Progress/index.cjs.map +1 -1
- package/dist/components/Progress/index.d.ts.map +1 -1
- package/dist/components/Progress/index.js +3 -1
- package/dist/components/Progress/index.js.map +1 -1
- package/dist/components/Prompt/Prompt.module.scss.cjs +14 -14
- package/dist/components/Prompt/Prompt.module.scss.js +14 -14
- package/dist/components/Prompt/index.cjs +14 -2
- package/dist/components/Prompt/index.cjs.map +1 -1
- package/dist/components/Prompt/index.d.ts +8 -5
- package/dist/components/Prompt/index.d.ts.map +1 -1
- package/dist/components/Prompt/index.js +14 -2
- package/dist/components/Prompt/index.js.map +1 -1
- package/dist/components/RadioGroup/index.cjs +14 -6
- package/dist/components/RadioGroup/index.cjs.map +1 -1
- package/dist/components/RadioGroup/index.d.ts +12 -2
- package/dist/components/RadioGroup/index.d.ts.map +1 -1
- package/dist/components/RadioGroup/index.js +14 -6
- package/dist/components/RadioGroup/index.js.map +1 -1
- package/dist/components/Select/Select.module.scss.cjs +10 -10
- package/dist/components/Select/Select.module.scss.js +10 -10
- package/dist/components/Select/index.cjs +37 -24
- package/dist/components/Select/index.cjs.map +1 -1
- package/dist/components/Select/index.d.ts +6 -2
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +37 -24
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
- package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
- package/dist/components/Sidebar/index.cjs +2 -2
- package/dist/components/Sidebar/index.cjs.map +1 -1
- package/dist/components/Sidebar/index.d.ts +3 -3
- package/dist/components/Sidebar/index.d.ts.map +1 -1
- package/dist/components/Sidebar/index.js +2 -2
- package/dist/components/Sidebar/index.js.map +1 -1
- package/dist/components/Skeleton/index.cjs +6 -3
- package/dist/components/Skeleton/index.cjs.map +1 -1
- package/dist/components/Skeleton/index.d.ts +3 -7
- package/dist/components/Skeleton/index.d.ts.map +1 -1
- package/dist/components/Skeleton/index.js +6 -3
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/Slider/Slider.module.scss.cjs +13 -10
- package/dist/components/Slider/Slider.module.scss.cjs.map +1 -1
- package/dist/components/Slider/Slider.module.scss.js +13 -10
- package/dist/components/Slider/Slider.module.scss.js.map +1 -1
- package/dist/components/Slider/index.cjs +33 -1
- package/dist/components/Slider/index.cjs.map +1 -1
- package/dist/components/Slider/index.d.ts +2 -0
- package/dist/components/Slider/index.d.ts.map +1 -1
- package/dist/components/Slider/index.js +33 -1
- package/dist/components/Slider/index.js.map +1 -1
- package/dist/components/Stack/index.cjs +12 -2
- package/dist/components/Stack/index.cjs.map +1 -1
- package/dist/components/Stack/index.d.ts +3 -2
- package/dist/components/Stack/index.d.ts.map +1 -1
- package/dist/components/Stack/index.js +12 -2
- package/dist/components/Stack/index.js.map +1 -1
- package/dist/components/Table/Table.module.scss.cjs +16 -16
- package/dist/components/Table/Table.module.scss.js +16 -16
- package/dist/components/Table/index.d.ts +10 -4
- package/dist/components/Table/index.d.ts.map +1 -1
- package/dist/components/TableOfContents/index.cjs +8 -5
- package/dist/components/TableOfContents/index.cjs.map +1 -1
- package/dist/components/TableOfContents/index.d.ts +2 -2
- package/dist/components/TableOfContents/index.d.ts.map +1 -1
- package/dist/components/TableOfContents/index.js +8 -5
- package/dist/components/TableOfContents/index.js.map +1 -1
- package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
- package/dist/components/Tabs/Tabs.module.scss.js +9 -9
- package/dist/components/Tabs/index.cjs +9 -6
- package/dist/components/Tabs/index.cjs.map +1 -1
- package/dist/components/Tabs/index.d.ts +4 -1
- package/dist/components/Tabs/index.d.ts.map +1 -1
- package/dist/components/Tabs/index.js +9 -6
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Textarea/index.cjs +61 -43
- package/dist/components/Textarea/index.cjs.map +1 -1
- package/dist/components/Textarea/index.d.ts +9 -1
- package/dist/components/Textarea/index.d.ts.map +1 -1
- package/dist/components/Textarea/index.js +61 -43
- package/dist/components/Textarea/index.js.map +1 -1
- package/dist/components/Theme/index.cjs +3 -1
- package/dist/components/Theme/index.cjs.map +1 -1
- package/dist/components/Theme/index.d.ts +2 -4
- package/dist/components/Theme/index.d.ts.map +1 -1
- package/dist/components/Theme/index.js +3 -1
- package/dist/components/Theme/index.js.map +1 -1
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +22 -22
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +22 -22
- package/dist/components/Toast/Toast.module.scss.cjs +20 -20
- package/dist/components/Toast/Toast.module.scss.js +20 -20
- package/dist/components/Toast/index.cjs +15 -14
- package/dist/components/Toast/index.cjs.map +1 -1
- package/dist/components/Toast/index.d.ts +9 -5
- package/dist/components/Toast/index.d.ts.map +1 -1
- package/dist/components/Toast/index.js +15 -14
- package/dist/components/Toast/index.js.map +1 -1
- package/dist/components/Toggle/Toggle.module.scss.cjs +11 -11
- package/dist/components/Toggle/Toggle.module.scss.js +11 -11
- package/dist/components/Toggle/index.cjs +1 -1
- package/dist/components/Toggle/index.cjs.map +1 -1
- package/dist/components/Toggle/index.js +1 -1
- package/dist/components/Toggle/index.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
- package/dist/components/ToggleGroup/index.cjs +27 -8
- package/dist/components/ToggleGroup/index.cjs.map +1 -1
- package/dist/components/ToggleGroup/index.d.ts +8 -3
- package/dist/components/ToggleGroup/index.d.ts.map +1 -1
- package/dist/components/ToggleGroup/index.js +27 -8
- package/dist/components/ToggleGroup/index.js.map +1 -1
- 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 +20 -4
- package/dist/components/Tooltip/index.cjs.map +1 -1
- package/dist/components/Tooltip/index.d.ts +3 -1
- package/dist/components/Tooltip/index.d.ts.map +1 -1
- package/dist/components/Tooltip/index.js +20 -4
- package/dist/components/Tooltip/index.js.map +1 -1
- package/dist/components/VisuallyHidden/index.cjs +10 -2
- package/dist/components/VisuallyHidden/index.cjs.map +1 -1
- package/dist/components/VisuallyHidden/index.d.ts +1 -1
- package/dist/components/VisuallyHidden/index.d.ts.map +1 -1
- package/dist/components/VisuallyHidden/index.js +10 -2
- package/dist/components/VisuallyHidden/index.js.map +1 -1
- package/dist/datepicker.cjs +8 -1
- package/dist/datepicker.cjs.map +1 -1
- package/dist/datepicker.js +8 -1
- package/dist/datepicker.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/markdown.cjs +5 -5
- package/dist/markdown.cjs.map +1 -1
- package/dist/markdown.js +5 -5
- package/dist/markdown.js.map +1 -1
- package/dist/table.cjs +19 -3
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +19 -3
- package/dist/table.js.map +1 -1
- package/fragments.json +1 -1
- package/package.json +2 -2
- package/src/blocks/AccountSettings.block.ts +1 -1
- package/src/blocks/ActivityFeed.block.ts +1 -1
- package/src/blocks/ActivityFeedSkeleton.block.ts +1 -1
- package/src/blocks/BlogEditor.block.ts +1 -1
- package/src/blocks/ChatInterface.block.ts +1 -1
- package/src/blocks/ChatMessages.block.ts +1 -1
- package/src/blocks/CheckoutForm.block.ts +1 -1
- package/src/blocks/CommandPalette.block.ts +1 -1
- package/src/blocks/ContactForm.block.ts +1 -1
- package/src/blocks/DashboardLayout.block.ts +1 -1
- package/src/blocks/DashboardPage.block.ts +1 -1
- package/src/blocks/DashboardSkeleton.block.ts +1 -1
- package/src/blocks/DataTable.block.ts +1 -1
- package/src/blocks/EmptyState.block.ts +1 -1
- package/src/blocks/FAQSection.block.ts +1 -1
- package/src/blocks/FeatureGrid.block.ts +1 -1
- package/src/blocks/HeroSection.block.ts +1 -1
- package/src/blocks/LoginForm.block.ts +1 -1
- package/src/blocks/NavigationHeader.block.ts +1 -1
- package/src/blocks/PaginatedTable.block.ts +1 -1
- package/src/blocks/PricingComparison.block.ts +1 -1
- package/src/blocks/ProductCard.block.ts +1 -1
- package/src/blocks/RegistrationForm.block.ts +1 -1
- package/src/blocks/SettingsDrawer.block.ts +1 -1
- package/src/blocks/SettingsPanel.block.ts +1 -1
- package/src/blocks/ShoppingCart.block.ts +1 -1
- package/src/blocks/StatsCard.block.ts +1 -1
- package/src/blocks/StatsCardSkeleton.block.ts +1 -1
- package/src/blocks/TableSkeleton.block.ts +1 -1
- package/src/blocks/ThinkingStates.block.ts +1 -1
- package/src/components/Accordion/Accordion.fragment.tsx +7 -7
- package/src/components/Accordion/Accordion.module.scss +2 -2
- package/src/components/Accordion/Accordion.test.tsx +8 -5
- package/src/components/Accordion/index.tsx +33 -13
- package/src/components/Alert/Alert.fragment.tsx +5 -1
- package/src/components/Alert/Alert.module.scss +1 -1
- package/src/components/Alert/Alert.test.tsx +25 -0
- package/src/components/Alert/index.tsx +49 -30
- package/src/components/AppShell/AppShell.fragment.tsx +1 -1
- package/src/components/AppShell/AppShell.module.scss +5 -5
- package/src/components/AppShell/AppShell.test.tsx +12 -0
- package/src/components/AppShell/index.tsx +2 -0
- package/src/components/Avatar/Avatar.fragment.tsx +7 -1
- package/src/components/Avatar/Avatar.test.tsx +24 -2
- package/src/components/Avatar/index.tsx +13 -1
- package/src/components/Badge/Badge.fragment.tsx +16 -1
- package/src/components/Badge/Badge.test.tsx +8 -1
- package/src/components/Badge/index.tsx +7 -2
- package/src/components/BentoGrid/BentoGrid.fragment.tsx +3 -1
- package/src/components/BentoGrid/BentoGrid.module.scss +52 -16
- package/src/components/BentoGrid/BentoGrid.test.tsx +20 -0
- package/src/components/BentoGrid/index.tsx +9 -12
- package/src/components/Box/Box.fragment.tsx +3 -1
- package/src/components/Box/Box.test.tsx +14 -0
- package/src/components/Box/index.tsx +8 -2
- package/src/components/Breadcrumbs/Breadcrumbs.fragment.tsx +19 -1
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +13 -0
- package/src/components/Breadcrumbs/index.tsx +5 -1
- package/src/components/Button/Button.fragment.tsx +28 -6
- package/src/components/Button/Button.module.scss +3 -3
- package/src/components/Button/Button.test.tsx +11 -0
- package/src/components/Button/index.tsx +16 -6
- package/src/components/ButtonGroup/ButtonGroup.fragment.tsx +4 -2
- package/src/components/ButtonGroup/ButtonGroup.test.tsx +10 -0
- package/src/components/ButtonGroup/index.tsx +3 -3
- package/src/components/Card/Card.fragment.tsx +24 -9
- package/src/components/Card/Card.module.scss +8 -8
- package/src/components/Card/Card.test.tsx +4 -5
- package/src/components/Card/index.tsx +8 -38
- package/src/components/Chart/Chart.fragment.tsx +5 -3
- package/src/components/Chart/Chart.module.scss +1 -1
- package/src/components/Chart/index.tsx +12 -10
- package/src/components/Checkbox/Checkbox.fragment.tsx +27 -1
- package/src/components/Checkbox/Checkbox.module.scss +3 -3
- package/src/components/Checkbox/index.tsx +16 -3
- package/src/components/Chip/Chip.fragment.tsx +20 -3
- package/src/components/Chip/Chip.test.tsx +28 -0
- package/src/components/Chip/index.tsx +14 -6
- package/src/components/CodeBlock/CodeBlock.fragment.tsx +3 -1
- package/src/components/CodeBlock/CodeBlock.module.scss +9 -9
- package/src/components/CodeBlock/CodeBlock.test.tsx +21 -0
- package/src/components/CodeBlock/index.tsx +23 -9
- package/src/components/Collapsible/Collapsible.fragment.tsx +1 -1
- package/src/components/Collapsible/Collapsible.module.scss +1 -1
- package/src/components/ColorPicker/ColorPicker.fragment.tsx +1 -1
- package/src/components/Combobox/Combobox.fragment.tsx +63 -9
- package/src/components/Combobox/Combobox.module.scss +4 -7
- package/src/components/Combobox/Combobox.test.tsx +24 -3
- package/src/components/Combobox/index.tsx +117 -34
- package/src/components/Command/Command.fragment.tsx +3 -3
- package/src/components/Command/Command.module.scss +5 -5
- package/src/components/Command/Command.test.tsx +17 -0
- package/src/components/Command/index.tsx +8 -5
- package/src/components/ConversationList/ConversationList.fragment.tsx +4 -3
- package/src/components/ConversationList/ConversationList.module.scss +5 -5
- package/src/components/ConversationList/ConversationList.test.tsx +21 -0
- package/src/components/ConversationList/index.tsx +8 -4
- package/src/components/DataTable/DataTable.fragment.tsx +12 -2
- package/src/components/DataTable/DataTable.module.scss +3 -3
- package/src/components/DataTable/DataTable.test.tsx +23 -2
- package/src/components/DataTable/index.tsx +23 -5
- package/src/components/DatePicker/DatePicker.fragment.tsx +3 -1
- package/src/components/DatePicker/DatePicker.module.scss +1 -1
- package/src/components/DatePicker/DatePicker.test.tsx +17 -0
- package/src/components/DatePicker/index.tsx +9 -2
- package/src/components/Dialog/Dialog.fragment.tsx +28 -1
- package/src/components/Dialog/Dialog.module.scss +6 -6
- package/src/components/Dialog/index.tsx +25 -7
- package/src/components/Drawer/Drawer.fragment.tsx +4 -1
- package/src/components/Drawer/Drawer.module.scss +3 -3
- package/src/components/Drawer/Drawer.test.tsx +8 -0
- package/src/components/Drawer/index.tsx +15 -3
- package/src/components/Editor/Editor.fragment.tsx +10 -3
- package/src/components/Editor/Editor.module.scss +4 -4
- package/src/components/Editor/Editor.test.tsx +68 -1
- package/src/components/Editor/index.tsx +60 -9
- package/src/components/EmptyState/EmptyState.fragment.tsx +3 -1
- package/src/components/EmptyState/EmptyState.module.scss +3 -3
- package/src/components/EmptyState/EmptyState.test.tsx +18 -0
- package/src/components/EmptyState/index.tsx +16 -16
- package/src/components/Field/Field.fragment.tsx +1 -1
- package/src/components/Fieldset/Fieldset.fragment.tsx +3 -1
- package/src/components/Fieldset/Fieldset.test.tsx +14 -0
- package/src/components/Fieldset/index.tsx +3 -4
- package/src/components/Form/Form.fragment.tsx +12 -7
- package/src/components/Form/index.tsx +13 -17
- package/src/components/Grid/Grid.fragment.tsx +4 -3
- package/src/components/Grid/Grid.module.scss +3 -3
- package/src/components/Grid/index.tsx +11 -6
- package/src/components/Header/Header.fragment.tsx +31 -1
- package/src/components/Header/Header.module.scss +6 -6
- package/src/components/Header/Header.test.tsx +95 -1
- package/src/components/Header/index.tsx +95 -46
- package/src/components/Icon/Icon.fragment.tsx +21 -8
- package/src/components/Icon/Icon.test.tsx +27 -3
- package/src/components/Icon/index.tsx +39 -15
- package/src/components/Image/Image.fragment.tsx +15 -1
- package/src/components/Image/Image.test.tsx +32 -1
- package/src/components/Image/index.tsx +24 -4
- package/src/components/Input/Input.fragment.tsx +49 -1
- package/src/components/Input/Input.module.scss +4 -2
- package/src/components/Input/Input.test.tsx +3 -3
- package/src/components/Input/index.tsx +103 -37
- package/src/components/Link/Link.fragment.tsx +7 -6
- package/src/components/Link/Link.test.tsx +17 -1
- package/src/components/Link/index.tsx +22 -0
- package/src/components/List/List.fragment.tsx +1 -1
- package/src/components/Listbox/Listbox.fragment.tsx +3 -3
- package/src/components/Listbox/Listbox.module.scss +4 -4
- package/src/components/Listbox/Listbox.test.tsx +14 -0
- package/src/components/Listbox/index.tsx +12 -2
- package/src/components/Loading/Loading.fragment.tsx +1 -1
- package/src/components/Markdown/Markdown.fragment.tsx +5 -3
- package/src/components/Markdown/Markdown.module.scss +5 -5
- package/src/components/Markdown/Markdown.test.tsx +6 -0
- package/src/components/Markdown/index.tsx +12 -9
- package/src/components/Menu/Menu.fragment.tsx +19 -1
- package/src/components/Menu/Menu.module.scss +11 -11
- package/src/components/Menu/index.tsx +19 -7
- package/src/components/Message/Message.fragment.tsx +1 -1
- package/src/components/Message/Message.module.scss +3 -3
- package/src/components/NavigationMenu/NavigationMenu.fragment.tsx +9 -1
- package/src/components/NavigationMenu/NavigationMenu.module.scss +7 -7
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -0
- package/src/components/NavigationMenu/NavigationMenuContext.ts +14 -0
- package/src/components/NavigationMenu/index.tsx +70 -7
- package/src/components/Pagination/Pagination.fragment.tsx +4 -1
- package/src/components/Pagination/Pagination.test.tsx +39 -0
- package/src/components/Pagination/index.tsx +36 -10
- package/src/components/Popover/Popover.fragment.tsx +18 -1
- package/src/components/Popover/Popover.module.scss +13 -13
- package/src/components/Popover/index.tsx +33 -8
- package/src/components/Progress/Progress.fragment.tsx +3 -1
- package/src/components/Progress/Progress.test.tsx +8 -0
- package/src/components/Progress/index.tsx +9 -1
- package/src/components/Prompt/Prompt.fragment.tsx +4 -1
- package/src/components/Prompt/Prompt.module.scss +3 -3
- package/src/components/Prompt/Prompt.test.tsx +19 -0
- package/src/components/Prompt/index.tsx +24 -6
- package/src/components/RadioGroup/RadioGroup.fragment.tsx +31 -1
- package/src/components/RadioGroup/index.tsx +22 -3
- package/src/components/ScrollArea/ScrollArea.fragment.tsx +1 -1
- package/src/components/Select/Select.fragment.tsx +30 -3
- package/src/components/Select/Select.module.scss +3 -3
- package/src/components/Select/index.tsx +46 -33
- package/src/components/Separator/Separator.fragment.tsx +1 -1
- package/src/components/Sidebar/Sidebar.fragment.tsx +3 -1
- package/src/components/Sidebar/Sidebar.module.scss +20 -20
- package/src/components/Sidebar/Sidebar.test.tsx +25 -0
- package/src/components/Sidebar/index.tsx +7 -7
- package/src/components/Skeleton/Skeleton.fragment.tsx +3 -1
- package/src/components/Skeleton/Skeleton.test.tsx +12 -0
- package/src/components/Skeleton/index.tsx +6 -7
- package/src/components/Slider/Slider.fragment.tsx +21 -1
- package/src/components/Slider/Slider.module.scss +31 -0
- package/src/components/Slider/Slider.test.tsx +16 -0
- package/src/components/Slider/index.tsx +40 -1
- package/src/components/Stack/Stack.fragment.tsx +3 -1
- package/src/components/Stack/index.tsx +13 -6
- package/src/components/Table/Table.fragment.tsx +43 -2
- package/src/components/Table/Table.module.scss +2 -2
- package/src/components/Table/index.tsx +23 -5
- package/src/components/TableOfContents/TableOfContents.fragment.tsx +4 -2
- package/src/components/TableOfContents/TableOfContents.test.tsx +34 -9
- package/src/components/TableOfContents/index.tsx +9 -5
- package/src/components/Tabs/Tabs.fragment.tsx +33 -8
- package/src/components/Tabs/Tabs.module.scss +8 -8
- package/src/components/Tabs/index.tsx +22 -14
- package/src/components/Text/Text.fragment.tsx +1 -1
- package/src/components/Textarea/Textarea.fragment.tsx +27 -1
- package/src/components/Textarea/index.tsx +39 -14
- package/src/components/Theme/Theme.fragment.tsx +3 -1
- package/src/components/Theme/Theme.test.tsx +11 -0
- package/src/components/Theme/index.tsx +3 -3
- package/src/components/ThinkingIndicator/ThinkingIndicator.fragment.tsx +1 -1
- package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +1 -1
- package/src/components/Toast/Toast.fragment.tsx +6 -3
- package/src/components/Toast/Toast.module.scss +8 -6
- package/src/components/Toast/index.tsx +24 -20
- package/src/components/Toggle/Toggle.fragment.tsx +1 -1
- package/src/components/Toggle/Toggle.module.scss +61 -21
- package/src/components/Toggle/index.tsx +3 -3
- package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +33 -8
- package/src/components/ToggleGroup/ToggleGroup.module.scss +3 -3
- package/src/components/ToggleGroup/index.tsx +29 -9
- package/src/components/Tooltip/Tooltip.fragment.tsx +16 -1
- package/src/components/Tooltip/Tooltip.module.scss +1 -1
- package/src/components/Tooltip/index.tsx +16 -1
- package/src/components/VisuallyHidden/VisuallyHidden.fragment.tsx +3 -1
- package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +12 -0
- package/src/components/VisuallyHidden/index.tsx +7 -3
- package/src/index.ts +3 -2
- package/src/tokens/_computed.scss +1 -19
- package/src/tokens/_density.scss +0 -42
- package/src/tokens/_mixins.scss +4 -0
- package/src/tokens/_variables.scss +12 -114
|
@@ -28,6 +28,9 @@ export type SortingState = Array<{ id: string; desc: boolean }>;
|
|
|
28
28
|
export type RowSelectionState = Record<string, boolean>;
|
|
29
29
|
export type ExpandedState = true | Record<string, boolean>;
|
|
30
30
|
type OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);
|
|
31
|
+
export type DataTableRowClickEvent =
|
|
32
|
+
| React.MouseEvent<HTMLTableRowElement>
|
|
33
|
+
| React.KeyboardEvent<HTMLTableRowElement>;
|
|
31
34
|
|
|
32
35
|
export type DataTableColumn<T> = ColumnDef<T, unknown>;
|
|
33
36
|
|
|
@@ -81,7 +84,7 @@ export interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableEl
|
|
|
81
84
|
/** Selection change handler */
|
|
82
85
|
onRowSelectionChange?: OnChangeFn<RowSelectionState>;
|
|
83
86
|
/** Row click handler */
|
|
84
|
-
onRowClick?: (row: T) => void;
|
|
87
|
+
onRowClick?: (row: T, event: DataTableRowClickEvent) => void;
|
|
85
88
|
/** Extract sub-rows from a row for expandable tree tables */
|
|
86
89
|
getSubRows?: (row: T) => T[] | undefined;
|
|
87
90
|
/** Controlled expanded state */
|
|
@@ -100,6 +103,10 @@ export interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableEl
|
|
|
100
103
|
striped?: boolean;
|
|
101
104
|
/** Wrap table in a bordered container */
|
|
102
105
|
bordered?: boolean;
|
|
106
|
+
/** Additional class name for the outer wrapper div */
|
|
107
|
+
wrapperClassName?: string;
|
|
108
|
+
/** Props forwarded to the outer wrapper div */
|
|
109
|
+
wrapperProps?: React.HTMLAttributes<HTMLDivElement>;
|
|
103
110
|
}
|
|
104
111
|
|
|
105
112
|
function getColumnSizeStyle(
|
|
@@ -159,6 +166,8 @@ function DataTableRoot<T>({
|
|
|
159
166
|
captionHidden = false,
|
|
160
167
|
striped = false,
|
|
161
168
|
bordered = false,
|
|
169
|
+
wrapperClassName,
|
|
170
|
+
wrapperProps,
|
|
162
171
|
'aria-label': ariaLabel,
|
|
163
172
|
'aria-describedby': ariaDescribedBy,
|
|
164
173
|
...htmlProps
|
|
@@ -267,10 +276,19 @@ function DataTableRoot<T>({
|
|
|
267
276
|
]
|
|
268
277
|
.filter(Boolean)
|
|
269
278
|
.join(' ');
|
|
279
|
+
const { className: wrapperPropsClassName, ...restWrapperProps } = wrapperProps ?? {};
|
|
280
|
+
const wrapperClasses = [
|
|
281
|
+
styles.wrapper,
|
|
282
|
+
bordered && styles.bordered,
|
|
283
|
+
wrapperClassName,
|
|
284
|
+
wrapperPropsClassName,
|
|
285
|
+
]
|
|
286
|
+
.filter(Boolean)
|
|
287
|
+
.join(' ');
|
|
270
288
|
|
|
271
289
|
if (isEmpty) {
|
|
272
290
|
return (
|
|
273
|
-
<div className={
|
|
291
|
+
<div {...restWrapperProps} className={wrapperClasses}>
|
|
274
292
|
<table
|
|
275
293
|
{...htmlProps}
|
|
276
294
|
className={rootClasses}
|
|
@@ -297,7 +315,7 @@ function DataTableRoot<T>({
|
|
|
297
315
|
}
|
|
298
316
|
|
|
299
317
|
return (
|
|
300
|
-
<div className={
|
|
318
|
+
<div {...restWrapperProps} className={wrapperClasses}>
|
|
301
319
|
<table
|
|
302
320
|
{...htmlProps}
|
|
303
321
|
className={rootClasses}
|
|
@@ -382,7 +400,7 @@ function DataTableRoot<T>({
|
|
|
382
400
|
const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {
|
|
383
401
|
if (!onRowClick) return;
|
|
384
402
|
if (isInteractiveTarget(event.target, event.currentTarget)) return;
|
|
385
|
-
onRowClick(row.original);
|
|
403
|
+
onRowClick(row.original, event);
|
|
386
404
|
};
|
|
387
405
|
|
|
388
406
|
const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {
|
|
@@ -390,7 +408,7 @@ function DataTableRoot<T>({
|
|
|
390
408
|
if (isInteractiveTarget(event.target, event.currentTarget)) return;
|
|
391
409
|
if (event.key === 'Enter' || event.key === ' ') {
|
|
392
410
|
event.preventDefault();
|
|
393
|
-
onRowClick(row.original);
|
|
411
|
+
onRowClick(row.original, event);
|
|
394
412
|
}
|
|
395
413
|
};
|
|
396
414
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
-
import { defineFragment } from '@fragments-sdk/
|
|
2
|
+
import { defineFragment } from '@fragments-sdk/core';
|
|
3
3
|
import { DatePicker } from '.';
|
|
4
4
|
import type { DateRange } from '.';
|
|
5
5
|
import { subDays } from 'date-fns';
|
|
@@ -71,6 +71,7 @@ export default defineFragment({
|
|
|
71
71
|
'Add presets for common ranges (Today, Last 7 days, Last 30 days)',
|
|
72
72
|
'Use disabledDates to prevent selecting past dates or unavailable dates',
|
|
73
73
|
'Provide a meaningful placeholder',
|
|
74
|
+
'DatePicker.Trigger forwards button props and defaults to type="button" (safe inside forms)',
|
|
74
75
|
],
|
|
75
76
|
accessibility: [
|
|
76
77
|
'Full keyboard navigation within the calendar grid',
|
|
@@ -144,6 +145,7 @@ export default defineFragment({
|
|
|
144
145
|
'numberOfMonths: number - months visible (default 1)',
|
|
145
146
|
'disabled: boolean - disable picker',
|
|
146
147
|
'disabledDates: Matcher - dates to disable',
|
|
148
|
+
'DatePicker.Trigger: button props supported (type defaults to "button")',
|
|
147
149
|
],
|
|
148
150
|
scenarioTags: [
|
|
149
151
|
'form.date',
|
|
@@ -359,7 +359,7 @@
|
|
|
359
359
|
display: flex;
|
|
360
360
|
align-items: center;
|
|
361
361
|
width: 100%;
|
|
362
|
-
padding: var(--fui-
|
|
362
|
+
padding: var(--fui-space-1, $fui-space-1) var(--fui-space-3, $fui-space-3);
|
|
363
363
|
border-radius: var(--fui-radius-sm, $fui-radius-sm);
|
|
364
364
|
font-size: var(--fui-font-size-sm, $fui-font-size-sm);
|
|
365
365
|
color: var(--fui-text-primary, $fui-text-primary);
|
|
@@ -53,6 +53,23 @@ describe('DatePicker', () => {
|
|
|
53
53
|
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
+
it('uses button semantics and forwards button props on Trigger', () => {
|
|
57
|
+
render(
|
|
58
|
+
<form>
|
|
59
|
+
<DatePicker>
|
|
60
|
+
<DatePicker.Trigger data-testid="trigger" type="button" name="date-trigger" />
|
|
61
|
+
<DatePicker.Content>
|
|
62
|
+
<DatePicker.Calendar />
|
|
63
|
+
</DatePicker.Content>
|
|
64
|
+
</DatePicker>
|
|
65
|
+
</form>
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const trigger = screen.getByTestId('trigger');
|
|
69
|
+
expect(trigger).toHaveAttribute('type', 'button');
|
|
70
|
+
expect(trigger).toHaveAttribute('name', 'date-trigger');
|
|
71
|
+
});
|
|
72
|
+
|
|
56
73
|
it('shows placeholder text when no value selected', () => {
|
|
57
74
|
renderDatePicker({ placeholder: 'Choose date' });
|
|
58
75
|
expect(screen.getByText('Choose date')).toBeInTheDocument();
|
|
@@ -50,7 +50,7 @@ export interface DatePickerProps {
|
|
|
50
50
|
name?: string;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
export interface DatePickerTriggerProps extends React.
|
|
53
|
+
export interface DatePickerTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
54
54
|
children?: React.ReactNode;
|
|
55
55
|
placeholder?: string;
|
|
56
56
|
}
|
|
@@ -430,7 +430,13 @@ function DatePickerRoot({
|
|
|
430
430
|
);
|
|
431
431
|
}
|
|
432
432
|
|
|
433
|
-
function DatePickerTrigger({
|
|
433
|
+
function DatePickerTrigger({
|
|
434
|
+
children,
|
|
435
|
+
placeholder,
|
|
436
|
+
className,
|
|
437
|
+
type = 'button',
|
|
438
|
+
...htmlProps
|
|
439
|
+
}: DatePickerTriggerProps) {
|
|
434
440
|
const ctx = useDatePickerContext();
|
|
435
441
|
const placeholderText = placeholder ?? ctx.placeholder;
|
|
436
442
|
|
|
@@ -446,6 +452,7 @@ function DatePickerTrigger({ children, placeholder, className, ...htmlProps }: D
|
|
|
446
452
|
return (
|
|
447
453
|
<BasePopover.Trigger
|
|
448
454
|
{...htmlProps}
|
|
455
|
+
type={type}
|
|
449
456
|
className={classes}
|
|
450
457
|
disabled={ctx.disabled}
|
|
451
458
|
>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { defineFragment } from '@fragments-sdk/
|
|
2
|
+
import { defineFragment } from '@fragments-sdk/core';
|
|
3
3
|
import { Dialog } from '.';
|
|
4
4
|
import { Button } from '../Button';
|
|
5
5
|
|
|
@@ -34,6 +34,7 @@ export default defineFragment({
|
|
|
34
34
|
'Use descriptive title that explains the purpose',
|
|
35
35
|
'Allow dismissal via backdrop click or close button for non-critical dialogs',
|
|
36
36
|
'Trap focus within the dialog for accessibility',
|
|
37
|
+
'Dialog.Trigger and Dialog.Close support asChild for buttons, links, and router link components',
|
|
37
38
|
],
|
|
38
39
|
accessibility: [
|
|
39
40
|
'Automatically traps focus within the dialog',
|
|
@@ -80,6 +81,7 @@ export default defineFragment({
|
|
|
80
81
|
'open: boolean - controlled open state',
|
|
81
82
|
'onOpenChange: (open) => void - open state handler',
|
|
82
83
|
'modal: boolean - blocks page interaction (default: true)',
|
|
84
|
+
'Dialog.Content initialFocus?: boolean - control auto-focus on open (default: true)',
|
|
83
85
|
'Dialog.Content size: sm|md|lg|xl|full - dialog width',
|
|
84
86
|
],
|
|
85
87
|
scenarioTags: [
|
|
@@ -97,6 +99,7 @@ export default defineFragment({
|
|
|
97
99
|
requiredChildren: ['Content'],
|
|
98
100
|
commonPatterns: [
|
|
99
101
|
'<Dialog><Dialog.Trigger><Button>Open</Button></Dialog.Trigger><Dialog.Content><Dialog.Header><Dialog.Title>{title}</Dialog.Title></Dialog.Header><Dialog.Body>{content}</Dialog.Body><Dialog.Footer><Dialog.Close><Button variant="secondary">Cancel</Button></Dialog.Close><Button>Confirm</Button></Dialog.Footer></Dialog.Content></Dialog>',
|
|
102
|
+
'<Dialog><Dialog.Trigger asChild><a href="/settings">Open settings</a></Dialog.Trigger><Dialog.Content initialFocus={false}>...</Dialog.Content></Dialog>',
|
|
100
103
|
],
|
|
101
104
|
},
|
|
102
105
|
|
|
@@ -184,5 +187,29 @@ export default defineFragment({
|
|
|
184
187
|
</Dialog>
|
|
185
188
|
),
|
|
186
189
|
},
|
|
190
|
+
{
|
|
191
|
+
name: 'Link Trigger + No Initial Focus',
|
|
192
|
+
description: 'Use asChild with a link trigger and disable automatic initial focus when needed',
|
|
193
|
+
render: () => (
|
|
194
|
+
<Dialog>
|
|
195
|
+
<Dialog.Trigger asChild>
|
|
196
|
+
<a href="#dialog-demo">Open via link</a>
|
|
197
|
+
</Dialog.Trigger>
|
|
198
|
+
<Dialog.Content size="sm" initialFocus={false}>
|
|
199
|
+
<Dialog.Header>
|
|
200
|
+
<Dialog.Title>Linked Trigger</Dialog.Title>
|
|
201
|
+
<Dialog.Description>
|
|
202
|
+
Example using asChild with an anchor element and manual focus behavior.
|
|
203
|
+
</Dialog.Description>
|
|
204
|
+
</Dialog.Header>
|
|
205
|
+
<Dialog.Footer>
|
|
206
|
+
<Dialog.Close asChild>
|
|
207
|
+
<Button variant="secondary">Close</Button>
|
|
208
|
+
</Dialog.Close>
|
|
209
|
+
</Dialog.Footer>
|
|
210
|
+
</Dialog.Content>
|
|
211
|
+
</Dialog>
|
|
212
|
+
),
|
|
213
|
+
},
|
|
187
214
|
],
|
|
188
215
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
@use
|
|
2
|
-
@use
|
|
1
|
+
@use "../../tokens/variables" as *;
|
|
2
|
+
@use "../../tokens/mixins" as *;
|
|
3
3
|
|
|
4
4
|
// Backdrop overlay
|
|
5
5
|
.backdrop {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
display: flex;
|
|
31
31
|
align-items: center;
|
|
32
32
|
justify-content: center;
|
|
33
|
-
padding: var(--fui-space-
|
|
33
|
+
padding: var(--fui-space-2, $fui-space-2);
|
|
34
34
|
overflow-y: auto;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
|
|
93
93
|
// Header area
|
|
94
94
|
.header {
|
|
95
|
-
padding: var(--fui-
|
|
95
|
+
padding: var(--fui-space-3, $fui-space-3) var(--fui-space-4, $fui-space-4);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
// Title
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
|
|
115
115
|
// Body content
|
|
116
116
|
.body {
|
|
117
|
-
padding: 0 var(--fui-
|
|
117
|
+
padding: 0 var(--fui-space-4, $fui-space-4) var(--fui-space-3, $fui-space-3);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
// Footer for actions
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
align-items: center;
|
|
124
124
|
justify-content: flex-end;
|
|
125
125
|
gap: var(--fui-space-1, $fui-space-1);
|
|
126
|
-
padding: var(--fui-
|
|
126
|
+
padding: var(--fui-space-2, $fui-space-2) var(--fui-space-4, $fui-space-4);
|
|
127
127
|
border-top: 1px solid var(--fui-border, $fui-border);
|
|
128
128
|
background-color: var(--fui-bg-secondary, $fui-bg-secondary);
|
|
129
129
|
border-radius: 0 0 var(--fui-radius-lg, $fui-radius-lg) var(--fui-radius-lg, $fui-radius-lg);
|
|
@@ -31,6 +31,9 @@ export interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
31
31
|
* @default "md"
|
|
32
32
|
* @see https://usefragments.com/components/dialog#sizes */
|
|
33
33
|
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
34
|
+
/** Whether the dialog should autofocus content on open.
|
|
35
|
+
* @default true */
|
|
36
|
+
initialFocus?: boolean;
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
export interface DialogTitleProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {
|
|
@@ -53,15 +56,29 @@ export interface DialogFooterProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
53
56
|
children: React.ReactNode;
|
|
54
57
|
}
|
|
55
58
|
|
|
56
|
-
|
|
59
|
+
type DialogTriggerAsButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
57
60
|
children: React.ReactNode;
|
|
58
|
-
asChild?:
|
|
59
|
-
}
|
|
61
|
+
asChild?: false;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
type DialogTriggerAsChildProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {
|
|
65
|
+
children: React.ReactElement;
|
|
66
|
+
asChild: true;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export type DialogTriggerProps = DialogTriggerAsButtonProps | DialogTriggerAsChildProps;
|
|
60
70
|
|
|
61
|
-
|
|
71
|
+
type DialogCloseAsButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
62
72
|
children?: React.ReactNode;
|
|
63
|
-
asChild?:
|
|
64
|
-
}
|
|
73
|
+
asChild?: false;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
type DialogCloseAsChildProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {
|
|
77
|
+
children: React.ReactElement;
|
|
78
|
+
asChild: true;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export type DialogCloseProps = DialogCloseAsButtonProps | DialogCloseAsChildProps;
|
|
65
82
|
|
|
66
83
|
// ============================================
|
|
67
84
|
// Close Icon
|
|
@@ -134,6 +151,7 @@ function DialogTrigger({
|
|
|
134
151
|
function DialogContent({
|
|
135
152
|
children,
|
|
136
153
|
size = 'md',
|
|
154
|
+
initialFocus = true,
|
|
137
155
|
className,
|
|
138
156
|
...htmlProps
|
|
139
157
|
}: DialogContentProps) {
|
|
@@ -145,7 +163,7 @@ function DialogContent({
|
|
|
145
163
|
<BaseDialog.Portal>
|
|
146
164
|
<BaseDialog.Backdrop className={styles.backdrop} />
|
|
147
165
|
<BaseDialog.Viewport className={styles.positioner}>
|
|
148
|
-
<BaseDialog.Popup initialFocus {...htmlProps} className={popupClasses}>
|
|
166
|
+
<BaseDialog.Popup initialFocus={initialFocus} {...htmlProps} className={popupClasses}>
|
|
149
167
|
{children}
|
|
150
168
|
</BaseDialog.Popup>
|
|
151
169
|
</BaseDialog.Viewport>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { defineFragment } from '@fragments-sdk/
|
|
2
|
+
import { defineFragment } from '@fragments-sdk/core';
|
|
3
3
|
import { Drawer } from '.';
|
|
4
4
|
import { Button } from '../Button';
|
|
5
5
|
import { Stack } from '../Stack';
|
|
@@ -36,6 +36,8 @@ export default defineFragment({
|
|
|
36
36
|
'Use bottom for mobile-style action sheets',
|
|
37
37
|
'Provide clear close affordance (X button or cancel)',
|
|
38
38
|
'Keep drawer content focused on a single task',
|
|
39
|
+
'Drawer.Trigger and Drawer.Close with asChild require a single valid React element child',
|
|
40
|
+
'Set Drawer.Content initialFocus={false} when custom focus management is needed',
|
|
39
41
|
],
|
|
40
42
|
accessibility: [
|
|
41
43
|
'Automatically traps focus within the drawer',
|
|
@@ -84,6 +86,7 @@ export default defineFragment({
|
|
|
84
86
|
'modal: boolean - blocks page interaction (default: true)',
|
|
85
87
|
'Drawer.Content side: left|right|top|bottom - slide direction (default: right)',
|
|
86
88
|
'Drawer.Content size: sm|md|lg|xl|full - panel size',
|
|
89
|
+
'Drawer.Content initialFocus: boolean - auto-focus popup on open (default: true)',
|
|
87
90
|
],
|
|
88
91
|
scenarioTags: [
|
|
89
92
|
'overlay.drawer',
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
|
|
129
129
|
// Header area
|
|
130
130
|
.header {
|
|
131
|
-
padding: var(--fui-
|
|
131
|
+
padding: var(--fui-space-3, $fui-space-3) var(--fui-space-4, $fui-space-4);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
// Title
|
|
@@ -151,7 +151,7 @@
|
|
|
151
151
|
// Body content
|
|
152
152
|
.body {
|
|
153
153
|
flex: 1;
|
|
154
|
-
padding: 0 var(--fui-
|
|
154
|
+
padding: 0 var(--fui-space-4, $fui-space-4) var(--fui-space-3, $fui-space-3);
|
|
155
155
|
overflow-y: auto;
|
|
156
156
|
}
|
|
157
157
|
|
|
@@ -161,7 +161,7 @@
|
|
|
161
161
|
align-items: center;
|
|
162
162
|
justify-content: flex-end;
|
|
163
163
|
gap: var(--fui-space-1, $fui-space-1);
|
|
164
|
-
padding: var(--fui-
|
|
164
|
+
padding: var(--fui-space-2, $fui-space-2) var(--fui-space-4, $fui-space-4);
|
|
165
165
|
border-top: 1px solid var(--fui-border, $fui-border);
|
|
166
166
|
background-color: var(--fui-bg-secondary, $fui-bg-secondary);
|
|
167
167
|
}
|
|
@@ -118,6 +118,14 @@ describe('Drawer', () => {
|
|
|
118
118
|
});
|
|
119
119
|
});
|
|
120
120
|
|
|
121
|
+
it('accepts Drawer.Content initialFocus prop', async () => {
|
|
122
|
+
renderDrawer({ defaultOpen: true }, { initialFocus: false });
|
|
123
|
+
|
|
124
|
+
await waitFor(() => {
|
|
125
|
+
expect(screen.getByText('Drawer Title')).toBeInTheDocument();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
121
129
|
it('has no accessibility violations when open', async () => {
|
|
122
130
|
const { container } = renderDrawer({ defaultOpen: true });
|
|
123
131
|
|
|
@@ -36,6 +36,8 @@ export interface DrawerContentProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
36
36
|
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
37
37
|
/** Whether to show the backdrop overlay (default: true). Set to false for non-modal bottom panels. */
|
|
38
38
|
backdrop?: boolean;
|
|
39
|
+
/** Whether to autofocus an element on open (default: true) */
|
|
40
|
+
initialFocus?: boolean;
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
export interface DrawerTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
@@ -68,6 +70,13 @@ export interface DrawerCloseProps extends React.ButtonHTMLAttributes<HTMLButtonE
|
|
|
68
70
|
asChild?: boolean;
|
|
69
71
|
}
|
|
70
72
|
|
|
73
|
+
function getAsChildElement(children: React.ReactNode, componentName: string): React.ReactElement {
|
|
74
|
+
if (!React.isValidElement(children)) {
|
|
75
|
+
throw new Error(`${componentName} with asChild requires a single valid React element child.`);
|
|
76
|
+
}
|
|
77
|
+
return children;
|
|
78
|
+
}
|
|
79
|
+
|
|
71
80
|
// ============================================
|
|
72
81
|
// Close Icon
|
|
73
82
|
// ============================================
|
|
@@ -122,8 +131,9 @@ function DrawerTrigger({
|
|
|
122
131
|
...htmlProps
|
|
123
132
|
}: DrawerTriggerProps) {
|
|
124
133
|
if (asChild) {
|
|
134
|
+
const child = getAsChildElement(children, 'Drawer.Trigger');
|
|
125
135
|
return (
|
|
126
|
-
<BaseDialog.Trigger {...htmlProps} className={className} render={
|
|
136
|
+
<BaseDialog.Trigger {...htmlProps} className={className} render={child}>
|
|
127
137
|
{null}
|
|
128
138
|
</BaseDialog.Trigger>
|
|
129
139
|
);
|
|
@@ -141,6 +151,7 @@ function DrawerContent({
|
|
|
141
151
|
side = 'right',
|
|
142
152
|
size = 'md',
|
|
143
153
|
backdrop = true,
|
|
154
|
+
initialFocus = true,
|
|
144
155
|
className,
|
|
145
156
|
...htmlProps
|
|
146
157
|
}: DrawerContentProps) {
|
|
@@ -156,7 +167,7 @@ function DrawerContent({
|
|
|
156
167
|
return (
|
|
157
168
|
<BaseDialog.Portal>
|
|
158
169
|
{backdrop && <BaseDialog.Backdrop className={styles.backdrop} />}
|
|
159
|
-
<BaseDialog.Popup initialFocus {...htmlProps} data-side={side} className={popupClasses}>
|
|
170
|
+
<BaseDialog.Popup initialFocus={initialFocus} {...htmlProps} data-side={side} className={popupClasses}>
|
|
160
171
|
{children}
|
|
161
172
|
</BaseDialog.Popup>
|
|
162
173
|
</BaseDialog.Portal>
|
|
@@ -207,12 +218,13 @@ function DrawerClose({ children, asChild, className, ...htmlProps }: DrawerClose
|
|
|
207
218
|
}
|
|
208
219
|
|
|
209
220
|
if (asChild) {
|
|
221
|
+
const child = getAsChildElement(children, 'Drawer.Close');
|
|
210
222
|
return (
|
|
211
223
|
<BaseDialog.Close
|
|
212
224
|
{...htmlProps}
|
|
213
225
|
data-drawer-close
|
|
214
226
|
className={className}
|
|
215
|
-
render={
|
|
227
|
+
render={child}
|
|
216
228
|
>
|
|
217
229
|
{null}
|
|
218
230
|
</BaseDialog.Close>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { defineFragment } from '@fragments-sdk/
|
|
2
|
+
import { defineFragment } from '@fragments-sdk/core';
|
|
3
3
|
import { Editor } from '.';
|
|
4
4
|
import { Button } from '../Button';
|
|
5
5
|
|
|
@@ -37,9 +37,11 @@ export default defineFragment({
|
|
|
37
37
|
'Install @tiptap/react, @tiptap/starter-kit, and @tiptap/extension-link for rich text mode',
|
|
38
38
|
'Falls back to a markdown-aware textarea when TipTap is not installed',
|
|
39
39
|
'Use onAutoSave for periodic content persistence',
|
|
40
|
+
'onAutoSave may return a Promise; save status updates after the async save resolves/rejects',
|
|
40
41
|
'Use size prop (sm/md/lg) to control editor height',
|
|
41
42
|
'Use maxLength to show character limit with visual warning states',
|
|
42
43
|
'New formats (headings, blockquote, orderedList, undo, redo) are opt-in via the formats prop',
|
|
44
|
+
'Use toolbarIcons to swap in icons from any icon package without changing toolbar button labels or accessibility behavior',
|
|
43
45
|
],
|
|
44
46
|
accessibility: [
|
|
45
47
|
'Toolbar has role="toolbar" with aria-label',
|
|
@@ -97,7 +99,7 @@ export default defineFragment({
|
|
|
97
99
|
},
|
|
98
100
|
onAutoSave: {
|
|
99
101
|
type: 'function',
|
|
100
|
-
description: 'Auto-save callback, called at autoSaveInterval',
|
|
102
|
+
description: 'Auto-save callback, called at autoSaveInterval (may be async)',
|
|
101
103
|
},
|
|
102
104
|
autoSaveInterval: {
|
|
103
105
|
type: 'number',
|
|
@@ -113,6 +115,10 @@ export default defineFragment({
|
|
|
113
115
|
type: 'number',
|
|
114
116
|
description: 'Maximum character count. Shows counter in status bar with warning (90%) and error (over limit) states',
|
|
115
117
|
},
|
|
118
|
+
toolbarIcons: {
|
|
119
|
+
type: 'object',
|
|
120
|
+
description: 'Optional toolbar icon overrides keyed by format/action (e.g. bold, italic, undo). Values can be React nodes or render functions.',
|
|
121
|
+
},
|
|
116
122
|
},
|
|
117
123
|
|
|
118
124
|
relations: [
|
|
@@ -143,9 +149,10 @@ export default defineFragment({
|
|
|
143
149
|
'formats: EditorFormat[] - toolbar buttons (default: all 6)',
|
|
144
150
|
'toolbar: boolean - show default toolbar (default: true)',
|
|
145
151
|
'statusBar: boolean - show word/char counts (default: true)',
|
|
146
|
-
'onAutoSave: (value: string) => void - auto-save handler',
|
|
152
|
+
'onAutoSave: (value: string) => void | Promise<void> - auto-save handler',
|
|
147
153
|
'size: "sm" | "md" | "lg" - editor height preset (default: "md")',
|
|
148
154
|
'maxLength: number - character limit with visual indicator',
|
|
155
|
+
'toolbarIcons: Partial<Record<EditorFormat, ReactNode | (state) => ReactNode>> - custom toolbar icons',
|
|
149
156
|
],
|
|
150
157
|
scenarioTags: [
|
|
151
158
|
'form.editor',
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
justify-content: space-between;
|
|
65
65
|
flex-wrap: wrap;
|
|
66
66
|
gap: var(--fui-space-2, $fui-space-2);
|
|
67
|
-
padding: var(--fui-
|
|
67
|
+
padding: var(--fui-space-1, $fui-space-1) var(--fui-space-2, $fui-space-2);
|
|
68
68
|
border-bottom: 1px solid var(--fui-border, $fui-border);
|
|
69
69
|
background-color: var(--fui-bg-secondary, $fui-bg-secondary);
|
|
70
70
|
}
|
|
@@ -161,7 +161,7 @@
|
|
|
161
161
|
.contentRich {
|
|
162
162
|
// TipTap editor styling
|
|
163
163
|
:global(.tiptap) {
|
|
164
|
-
padding: var(--fui-
|
|
164
|
+
padding: var(--fui-space-3, $fui-space-3);
|
|
165
165
|
min-height: 200px;
|
|
166
166
|
outline: none;
|
|
167
167
|
@include text-base;
|
|
@@ -268,7 +268,7 @@
|
|
|
268
268
|
width: 100%;
|
|
269
269
|
height: 100%;
|
|
270
270
|
min-height: 200px;
|
|
271
|
-
padding: var(--fui-
|
|
271
|
+
padding: var(--fui-space-3, $fui-space-3);
|
|
272
272
|
background: transparent;
|
|
273
273
|
border: none;
|
|
274
274
|
resize: none;
|
|
@@ -298,7 +298,7 @@
|
|
|
298
298
|
align-items: center;
|
|
299
299
|
justify-content: space-between;
|
|
300
300
|
gap: var(--fui-space-2, $fui-space-2);
|
|
301
|
-
padding: var(--fui-
|
|
301
|
+
padding: var(--fui-space-1, $fui-space-1) var(--fui-space-2, $fui-space-2);
|
|
302
302
|
border-top: 1px solid var(--fui-border, $fui-border);
|
|
303
303
|
background-color: var(--fui-bg-secondary, $fui-bg-secondary);
|
|
304
304
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
1
2
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { render, screen, userEvent, expectNoA11yViolations } from '../../test/utils';
|
|
3
|
+
import { render, screen, userEvent, expectNoA11yViolations, act } from '../../test/utils';
|
|
3
4
|
import { Editor } from './index';
|
|
4
5
|
import { Button } from '../Button';
|
|
5
6
|
|
|
@@ -11,6 +12,7 @@ function renderEditor(
|
|
|
11
12
|
defaultValue?: string;
|
|
12
13
|
onValueChange?: (v: string) => void;
|
|
13
14
|
formats?: ('bold' | 'italic' | 'strikethrough' | 'link' | 'code' | 'bulletList')[];
|
|
15
|
+
toolbarIcons?: Partial<Record<'bold' | 'italic' | 'strikethrough' | 'link' | 'code' | 'bulletList', ReactNode>>;
|
|
14
16
|
} = {},
|
|
15
17
|
) {
|
|
16
18
|
return render(
|
|
@@ -21,6 +23,7 @@ function renderEditor(
|
|
|
21
23
|
readOnly={props.readOnly}
|
|
22
24
|
defaultValue={props.defaultValue}
|
|
23
25
|
formats={props.formats}
|
|
26
|
+
toolbarIcons={props.toolbarIcons}
|
|
24
27
|
>
|
|
25
28
|
<Editor.Toolbar>
|
|
26
29
|
<Editor.ToolbarGroup aria-label="Text formatting">
|
|
@@ -71,6 +74,17 @@ describe('Editor', () => {
|
|
|
71
74
|
expect(screen.getByRole('button', { name: /code/i })).toBeInTheDocument();
|
|
72
75
|
});
|
|
73
76
|
|
|
77
|
+
it('renders custom toolbar icons from toolbarIcons', () => {
|
|
78
|
+
renderEditor({
|
|
79
|
+
formats: ['bold'],
|
|
80
|
+
toolbarIcons: {
|
|
81
|
+
bold: <span data-testid="custom-bold-icon" aria-hidden="true">B*</span>,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
expect(screen.getByRole('button', { name: /bold/i })).toBeInTheDocument();
|
|
85
|
+
expect(screen.getByTestId('custom-bold-icon')).toBeInTheDocument();
|
|
86
|
+
});
|
|
87
|
+
|
|
74
88
|
it('renders toolbar with proper ARIA role', () => {
|
|
75
89
|
renderEditor();
|
|
76
90
|
expect(screen.getByRole('toolbar')).toBeInTheDocument();
|
|
@@ -122,6 +136,28 @@ describe('Editor', () => {
|
|
|
122
136
|
expect(boldBtn).toHaveAttribute('aria-pressed', 'false');
|
|
123
137
|
});
|
|
124
138
|
|
|
139
|
+
it('supports state-aware toolbar icon render functions', () => {
|
|
140
|
+
render(
|
|
141
|
+
<Editor
|
|
142
|
+
formats={['bold']}
|
|
143
|
+
toolbarIcons={{
|
|
144
|
+
bold: ({ active, isDisabled }) => (
|
|
145
|
+
<span
|
|
146
|
+
data-testid="bold-icon-state"
|
|
147
|
+
data-active={String(active)}
|
|
148
|
+
data-disabled={String(isDisabled)}
|
|
149
|
+
aria-hidden="true"
|
|
150
|
+
/>
|
|
151
|
+
),
|
|
152
|
+
}}
|
|
153
|
+
/>
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
const icon = screen.getByTestId('bold-icon-state');
|
|
157
|
+
expect(icon).toHaveAttribute('data-active', 'false');
|
|
158
|
+
expect(icon).toHaveAttribute('data-disabled', 'false');
|
|
159
|
+
});
|
|
160
|
+
|
|
125
161
|
it('disables toolbar buttons when editor is disabled', () => {
|
|
126
162
|
renderEditor({ disabled: true, formats: ['bold', 'italic'] });
|
|
127
163
|
expect(screen.getByRole('button', { name: /bold/i })).toBeDisabled();
|
|
@@ -167,6 +203,37 @@ describe('Editor', () => {
|
|
|
167
203
|
expect(screen.getByText('0 Words')).toBeInTheDocument();
|
|
168
204
|
});
|
|
169
205
|
|
|
206
|
+
it('supports async onAutoSave callbacks and updates status after resolution', async () => {
|
|
207
|
+
vi.useFakeTimers();
|
|
208
|
+
let resolveSave: (() => void) | undefined;
|
|
209
|
+
const onAutoSave = vi.fn(
|
|
210
|
+
() =>
|
|
211
|
+
new Promise<void>((resolve) => {
|
|
212
|
+
resolveSave = resolve;
|
|
213
|
+
})
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
render(
|
|
217
|
+
<Editor defaultValue="Hello world" onAutoSave={onAutoSave} autoSaveInterval={25}>
|
|
218
|
+
<Editor.Content />
|
|
219
|
+
<Editor.StatusIndicator />
|
|
220
|
+
</Editor>
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
await vi.advanceTimersByTimeAsync(25);
|
|
224
|
+
expect(onAutoSave).toHaveBeenCalledTimes(1);
|
|
225
|
+
expect(String(onAutoSave.mock.calls[0][0])).toContain('Hello world');
|
|
226
|
+
expect(screen.getByText('SAVING...')).toBeInTheDocument();
|
|
227
|
+
|
|
228
|
+
await act(async () => {
|
|
229
|
+
resolveSave?.();
|
|
230
|
+
await Promise.resolve();
|
|
231
|
+
});
|
|
232
|
+
expect(screen.getByText('AUTO-SAVED')).toBeInTheDocument();
|
|
233
|
+
|
|
234
|
+
vi.useRealTimers();
|
|
235
|
+
});
|
|
236
|
+
|
|
170
237
|
it('has no accessibility violations', async () => {
|
|
171
238
|
const { container } = renderEditor();
|
|
172
239
|
await expectNoA11yViolations(container);
|