@fragments-sdk/ui 0.17.1 → 0.19.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 +2700 -3256
- package/dist/chart.cjs +0 -1
- package/dist/chart.js +0 -1
- package/dist/codeblock.cjs +0 -1
- package/dist/codeblock.js +0 -1
- package/dist/colorpicker.cjs +0 -1
- package/dist/colorpicker.js +0 -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 +12 -12
- package/dist/components/Alert/Alert.module.scss.js +12 -12
- package/dist/components/AppShell/AppShell.module.scss.cjs +12 -12
- package/dist/components/AppShell/AppShell.module.scss.js +12 -12
- package/dist/components/Avatar/Avatar.module.scss.cjs +13 -13
- package/dist/components/Avatar/Avatar.module.scss.js +13 -13
- package/dist/components/Badge/Badge.module.scss.cjs +13 -13
- package/dist/components/Badge/Badge.module.scss.js +13 -13
- 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/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 +12 -12
- package/dist/components/Button/Button.module.scss.js +12 -12
- package/dist/components/Card/Card.module.scss.cjs +14 -14
- package/dist/components/Card/Card.module.scss.js +14 -14
- 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 +0 -1
- 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/Chip/Chip.module.scss.cjs +15 -15
- package/dist/components/Chip/Chip.module.scss.js +15 -15
- package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +21 -21
- package/dist/components/CodeBlock/CodeBlock.module.scss.js +21 -21
- package/dist/components/CodeBlock/index.d.ts +0 -1
- 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/ColorPicker/ColorPicker.module.scss.cjs +14 -14
- package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
- package/dist/components/ColorPicker/index.d.ts +0 -1
- package/dist/components/ColorPicker/index.d.ts.map +1 -1
- package/dist/components/Combobox/Combobox.module.scss.cjs +23 -23
- package/dist/components/Combobox/Combobox.module.scss.js +23 -23
- package/dist/components/Combobox/index.cjs +13 -10
- package/dist/components/Combobox/index.d.ts.map +1 -1
- package/dist/components/Combobox/index.js +13 -10
- package/dist/components/Command/Command.module.scss.cjs +11 -11
- package/dist/components/Command/Command.module.scss.js +11 -11
- 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.module.scss.cjs +26 -26
- package/dist/components/DataTable/DataTable.module.scss.js +26 -26
- package/dist/components/DataTable/index.cjs +0 -1
- package/dist/components/DataTable/index.d.ts +0 -1
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/index.js +0 -1
- package/dist/components/DatePicker/DatePicker.module.scss.cjs +31 -31
- package/dist/components/DatePicker/DatePicker.module.scss.js +31 -31
- package/dist/components/DatePicker/index.d.ts +0 -1
- 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/Drawer/Drawer.module.scss.cjs +33 -27
- package/dist/components/Drawer/Drawer.module.scss.js +34 -28
- package/dist/components/Drawer/index.cjs +36 -14
- package/dist/components/Drawer/index.d.ts +21 -3
- package/dist/components/Drawer/index.d.ts.map +1 -1
- package/dist/components/Drawer/index.js +36 -14
- package/dist/components/Editor/Editor.module.scss.cjs +17 -17
- package/dist/components/Editor/Editor.module.scss.js +17 -17
- package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
- package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
- package/dist/components/Field/Field.module.scss.cjs +4 -4
- package/dist/components/Field/Field.module.scss.js +4 -4
- package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
- package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
- package/dist/components/Header/Header.module.scss.cjs +28 -28
- package/dist/components/Header/Header.module.scss.js +28 -28
- package/dist/components/Icon/Icon.module.scss.cjs +8 -8
- package/dist/components/Icon/Icon.module.scss.js +8 -8
- 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 +19 -19
- package/dist/components/Input/Input.module.scss.js +19 -19
- package/dist/components/Link/Link.module.scss.cjs +10 -10
- package/dist/components/Link/Link.module.scss.js +10 -10
- 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 +30 -30
- package/dist/components/Loading/Loading.module.scss.js +30 -30
- 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 +0 -1
- package/dist/components/Markdown/index.d.ts.map +1 -1
- package/dist/components/Menu/Menu.module.scss.cjs +16 -13
- package/dist/components/Menu/Menu.module.scss.js +17 -14
- package/dist/components/Menu/index.cjs +1 -1
- package/dist/components/Menu/index.d.ts.map +1 -1
- package/dist/components/Menu/index.js +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/Pagination/Pagination.module.scss.cjs +7 -7
- package/dist/components/Pagination/Pagination.module.scss.js +7 -7
- 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 +26 -14
- package/dist/components/Prompt/Prompt.module.scss.js +26 -14
- package/dist/components/Prompt/index.cjs +16 -0
- package/dist/components/Prompt/index.d.ts +17 -1
- package/dist/components/Prompt/index.d.ts.map +1 -1
- package/dist/components/Prompt/index.js +16 -0
- package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +16 -16
- package/dist/components/RadioGroup/RadioGroup.module.scss.js +16 -16
- package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +10 -10
- package/dist/components/ScrollArea/ScrollArea.module.scss.js +10 -10
- package/dist/components/Select/Select.module.scss.cjs +17 -17
- package/dist/components/Select/Select.module.scss.js +17 -17
- package/dist/components/Select/index.cjs +20 -20
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +20 -20
- package/dist/components/Separator/Separator.module.scss.cjs +10 -10
- package/dist/components/Separator/Separator.module.scss.js +10 -10
- package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
- package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
- package/dist/components/Slider/Slider.module.scss.cjs +12 -12
- package/dist/components/Slider/Slider.module.scss.js +12 -12
- package/dist/components/Slider/index.cjs +23 -21
- package/dist/components/Slider/index.js +23 -21
- package/dist/components/Stack/Stack.module.scss.cjs +35 -35
- package/dist/components/Stack/Stack.module.scss.js +35 -35
- 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 +0 -1
- package/dist/components/Table/index.d.ts.map +1 -1
- package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +7 -7
- package/dist/components/TableOfContents/TableOfContents.module.scss.js +7 -7
- package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
- package/dist/components/Tabs/Tabs.module.scss.js +9 -9
- package/dist/components/Text/Text.module.scss.cjs +38 -38
- package/dist/components/Text/Text.module.scss.js +38 -38
- package/dist/components/Textarea/Textarea.module.scss.cjs +23 -23
- package/dist/components/Textarea/Textarea.module.scss.js +23 -23
- package/dist/components/Theme/ThemeToggle.module.scss.cjs +6 -6
- package/dist/components/Theme/ThemeToggle.module.scss.js +6 -6
- 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/Toggle/Toggle.module.scss.cjs +13 -13
- package/dist/components/Toggle/Toggle.module.scss.js +13 -13
- 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 +4 -3
- package/dist/components/Tooltip/index.d.ts +4 -1
- package/dist/components/Tooltip/index.d.ts.map +1 -1
- package/dist/components/Tooltip/index.js +4 -3
- package/dist/datepicker.cjs +0 -1
- package/dist/datepicker.js +0 -1
- package/dist/index.cjs +0 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/markdown.cjs +0 -1
- package/dist/markdown.js +0 -1
- package/dist/table.cjs +0 -1
- package/dist/table.js +0 -1
- package/dist/utils/seed-derivation.cjs +29 -0
- package/dist/utils/seed-derivation.d.ts +1 -1
- package/dist/utils/seed-derivation.d.ts.map +1 -1
- package/dist/utils/seed-derivation.js +29 -0
- package/fragments.json +1 -1
- package/package.json +18 -14
- package/src/components/Accordion/Accordion.contract.json +169 -0
- package/src/components/Alert/Alert.contract.json +157 -0
- package/src/components/AppShell/AppShell.contract.json +155 -0
- package/src/components/Avatar/Avatar.contract.json +189 -0
- package/src/components/Badge/Badge.contract.json +187 -0
- package/src/components/BentoGrid/BentoGrid.contract.json +135 -0
- package/src/components/Box/Box.contract.json +423 -0
- package/src/components/Breadcrumbs/Breadcrumbs.contract.json +143 -0
- package/src/components/Button/Button.contract.json +205 -0
- package/src/components/Button/Button.module.scss +24 -1
- package/src/components/ButtonGroup/ButtonGroup.contract.json +140 -0
- package/src/components/Card/Card.contract.json +185 -0
- package/src/components/Card/Card.module.scss +5 -1
- package/src/components/Chart/Chart.contract.json +129 -0
- package/src/components/Chart/index.tsx +0 -1
- package/src/components/Checkbox/Checkbox.contract.json +246 -0
- package/src/components/Chip/Chip.contract.json +212 -0
- package/src/components/Chip/Chip.module.scss +4 -4
- package/src/components/CodeBlock/CodeBlock.contract.json +388 -0
- package/src/components/CodeBlock/index.tsx +0 -1
- package/src/components/Collapsible/Collapsible.contract.json +154 -0
- package/src/components/ColorPicker/ColorPicker.contract.json +212 -0
- package/src/components/ColorPicker/index.tsx +0 -1
- package/src/components/Combobox/Combobox.contract.json +297 -0
- package/src/components/Combobox/index.tsx +7 -8
- package/src/components/Command/Command.contract.json +165 -0
- package/src/components/Command/Command.module.scss +22 -9
- package/src/components/ConversationList/ConversationList.contract.json +151 -0
- package/src/components/DataTable/DataTable.contract.json +302 -0
- package/src/components/DataTable/index.tsx +0 -2
- package/src/components/DatePicker/DatePicker.contract.json +288 -0
- package/src/components/DatePicker/index.tsx +0 -2
- package/src/components/Dialog/Dialog.contract.json +159 -0
- package/src/components/Drawer/Drawer.contract.json +161 -0
- package/src/components/Drawer/Drawer.module.scss +45 -5
- package/src/components/Drawer/index.tsx +66 -23
- package/src/components/Editor/Editor.contract.json +263 -0
- package/src/components/EmptyState/EmptyState.contract.json +133 -0
- package/src/components/Field/Field.contract.json +157 -0
- package/src/components/Fieldset/Fieldset.contract.json +117 -0
- package/src/components/Form/Form.contract.json +145 -0
- package/src/components/Grid/Grid.contract.json +195 -0
- package/src/components/Header/Header.contract.json +196 -0
- package/src/components/Icon/Icon.contract.json +194 -0
- package/src/components/Image/Image.contract.json +209 -0
- package/src/components/Input/Input.contract.json +344 -0
- package/src/components/Input/Input.module.scss +16 -6
- package/src/components/Link/Link.contract.json +180 -0
- package/src/components/List/List.contract.json +154 -0
- package/src/components/Listbox/Listbox.contract.json +158 -0
- package/src/components/Loading/Loading.contract.json +167 -0
- package/src/components/Markdown/Markdown.contract.json +127 -0
- package/src/components/Markdown/Markdown.module.scss +0 -3
- package/src/components/Markdown/index.tsx +0 -1
- package/src/components/Menu/Menu.contract.json +177 -0
- package/src/components/Menu/Menu.module.scss +6 -0
- package/src/components/Menu/index.tsx +3 -1
- package/src/components/Message/Message.contract.json +183 -0
- package/src/components/Message/Message.module.scss +2 -2
- package/src/components/NavigationMenu/NavigationMenu.contract.json +203 -0
- package/src/components/NavigationMenu/NavigationMenu.module.scss +18 -23
- package/src/components/Pagination/Pagination.contract.json +163 -0
- package/src/components/Pagination/Pagination.module.scss +1 -1
- package/src/components/Popover/Popover.contract.json +163 -0
- package/src/components/Progress/Progress.contract.json +176 -0
- package/src/components/Prompt/Prompt.contract.json +211 -0
- package/src/components/Prompt/Prompt.module.scss +117 -3
- package/src/components/Prompt/index.tsx +40 -0
- package/src/components/RadioGroup/RadioGroup.contract.json +226 -0
- package/src/components/ScrollArea/ScrollArea.contract.json +131 -0
- package/src/components/Select/Select.contract.json +269 -0
- package/src/components/Select/index.tsx +20 -25
- package/src/components/Separator/Separator.contract.json +143 -0
- package/src/components/Sidebar/Sidebar.contract.json +258 -0
- package/src/components/Sidebar/Sidebar.module.scss +1 -1
- package/src/components/Skeleton/Skeleton.contract.json +166 -0
- package/src/components/Slider/Slider.contract.json +248 -0
- package/src/components/Slider/index.tsx +10 -10
- package/src/components/Stack/Stack.contract.json +220 -0
- package/src/components/Table/Table.contract.json +171 -0
- package/src/components/Table/index.tsx +0 -2
- package/src/components/TableOfContents/TableOfContents.contract.json +145 -0
- package/src/components/TableOfContents/TableOfContents.module.scss +19 -15
- package/src/components/Tabs/Tabs.contract.json +159 -0
- package/src/components/Text/Text.contract.json +239 -0
- package/src/components/Textarea/Textarea.contract.json +308 -0
- package/src/components/Theme/Theme.contract.json +152 -0
- package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +165 -0
- package/src/components/Toast/Toast.contract.json +181 -0
- package/src/components/Toggle/Toggle.contract.json +231 -0
- package/src/components/Toggle/Toggle.module.scss +3 -3
- package/src/components/ToggleGroup/ToggleGroup.contract.json +206 -0
- package/src/components/Tooltip/Tooltip.contract.json +214 -0
- package/src/components/Tooltip/index.tsx +7 -3
- package/src/components/VisuallyHidden/VisuallyHidden.contract.json +116 -0
- package/src/index.ts +8 -3
- package/src/styles/globals.scss +6 -1
- package/src/tokens/_computed.scss +3 -1
- package/src/tokens/_density.scss +4 -4
- package/src/tokens/_derive.scss +52 -56
- package/src/tokens/_palettes.scss +20 -1
- package/src/tokens/_seeds.scss +2 -2
- package/src/tokens/_variables.scss +45 -29
- package/src/utils/seed-derivation.ts +23 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
|
+
"name": "Switch",
|
|
4
|
+
"description": "Binary on/off switch for settings and preferences. Provides immediate visual feedback and is ideal for options that take effect instantly.",
|
|
5
|
+
"category": "forms",
|
|
6
|
+
"tags": [
|
|
7
|
+
"switch",
|
|
8
|
+
"toggle",
|
|
9
|
+
"boolean",
|
|
10
|
+
"settings",
|
|
11
|
+
"preference"
|
|
12
|
+
],
|
|
13
|
+
"status": "stable",
|
|
14
|
+
"sourcePath": "src/components/Toggle/index.tsx",
|
|
15
|
+
"exportName": "Switch",
|
|
16
|
+
"propsSummary": [
|
|
17
|
+
"checked: boolean",
|
|
18
|
+
"defaultChecked: boolean",
|
|
19
|
+
"onCheckedChange: function",
|
|
20
|
+
"onChange: function",
|
|
21
|
+
"label: string",
|
|
22
|
+
"helperText: string",
|
|
23
|
+
"description: string",
|
|
24
|
+
"disabled: boolean (default: false)",
|
|
25
|
+
"size: sm|md|lg (default: md)",
|
|
26
|
+
"className: string",
|
|
27
|
+
"name: string",
|
|
28
|
+
"id: string",
|
|
29
|
+
"aria-label: string",
|
|
30
|
+
"aria-labelledby: string",
|
|
31
|
+
"aria-describedby: string"
|
|
32
|
+
],
|
|
33
|
+
"props": {
|
|
34
|
+
"checked": {
|
|
35
|
+
"type": "boolean",
|
|
36
|
+
"description": "Whether the switch is in the on state",
|
|
37
|
+
"default": "false",
|
|
38
|
+
"required": false
|
|
39
|
+
},
|
|
40
|
+
"defaultChecked": {
|
|
41
|
+
"type": "boolean",
|
|
42
|
+
"description": "Default checked state (uncontrolled)",
|
|
43
|
+
"required": false
|
|
44
|
+
},
|
|
45
|
+
"onCheckedChange": {
|
|
46
|
+
"type": "function",
|
|
47
|
+
"description": "Called when the switch is toggled: (checked: boolean) => void",
|
|
48
|
+
"required": false
|
|
49
|
+
},
|
|
50
|
+
"onChange": {
|
|
51
|
+
"type": "function",
|
|
52
|
+
"description": "Alias for onCheckedChange: (checked: boolean) => void",
|
|
53
|
+
"required": false
|
|
54
|
+
},
|
|
55
|
+
"label": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"description": "Visible label text",
|
|
58
|
+
"required": false
|
|
59
|
+
},
|
|
60
|
+
"helperText": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"description": "Helper text shown below the label (preferred)",
|
|
63
|
+
"required": false
|
|
64
|
+
},
|
|
65
|
+
"description": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"description": "Deprecated alias for helperText",
|
|
68
|
+
"required": false
|
|
69
|
+
},
|
|
70
|
+
"disabled": {
|
|
71
|
+
"type": "boolean",
|
|
72
|
+
"description": "Whether the switch is non-interactive",
|
|
73
|
+
"default": "false",
|
|
74
|
+
"required": false
|
|
75
|
+
},
|
|
76
|
+
"size": {
|
|
77
|
+
"type": "enum",
|
|
78
|
+
"description": "Switch track size",
|
|
79
|
+
"default": "md",
|
|
80
|
+
"required": false,
|
|
81
|
+
"values": [
|
|
82
|
+
"sm",
|
|
83
|
+
"md",
|
|
84
|
+
"lg"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"className": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"description": "",
|
|
90
|
+
"required": false
|
|
91
|
+
},
|
|
92
|
+
"name": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"description": "",
|
|
95
|
+
"required": false
|
|
96
|
+
},
|
|
97
|
+
"id": {
|
|
98
|
+
"type": "string",
|
|
99
|
+
"description": "",
|
|
100
|
+
"required": false
|
|
101
|
+
},
|
|
102
|
+
"aria-label": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"description": "",
|
|
105
|
+
"required": false
|
|
106
|
+
},
|
|
107
|
+
"aria-labelledby": {
|
|
108
|
+
"type": "string",
|
|
109
|
+
"description": "",
|
|
110
|
+
"required": false
|
|
111
|
+
},
|
|
112
|
+
"aria-describedby": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"description": "",
|
|
115
|
+
"required": false
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"usage": {
|
|
119
|
+
"when": [
|
|
120
|
+
"Binary settings that take effect immediately (e.g., dark mode, notifications)",
|
|
121
|
+
"Enabling/disabling features in a settings panel",
|
|
122
|
+
"Options where the result is immediately visible",
|
|
123
|
+
"Mobile-friendly boolean inputs"
|
|
124
|
+
],
|
|
125
|
+
"whenNot": [
|
|
126
|
+
"Multiple options in a group (use checkbox group)",
|
|
127
|
+
"Selection requires form submission to take effect (use checkbox)",
|
|
128
|
+
"Yes/No questions in forms (use radio buttons)",
|
|
129
|
+
"Complex multi-state options (use select or radio)"
|
|
130
|
+
],
|
|
131
|
+
"guidelines": [
|
|
132
|
+
"Switch should always have a visible label explaining what it controls",
|
|
133
|
+
"The \"on\" state should be the positive/enabling action",
|
|
134
|
+
"Changes should take effect immediately - no save button needed",
|
|
135
|
+
"Include helperText for switches whose effect isn't obvious from the label",
|
|
136
|
+
"Group related switches visually in settings panels"
|
|
137
|
+
],
|
|
138
|
+
"accessibility": [
|
|
139
|
+
"Uses role=\"switch\" with aria-checked for proper semantics",
|
|
140
|
+
"Must have an accessible label (visible or aria-label)",
|
|
141
|
+
"Focus indicator must be clearly visible",
|
|
142
|
+
"State change must be announced by screen readers"
|
|
143
|
+
]
|
|
144
|
+
},
|
|
145
|
+
"examples": [
|
|
146
|
+
{
|
|
147
|
+
"name": "Default Off",
|
|
148
|
+
"description": "Switch in the off state",
|
|
149
|
+
"code": "<StatefulSwitch label=\"Email notifications\" />",
|
|
150
|
+
"args": {
|
|
151
|
+
"label": "Email notifications"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"name": "Checked",
|
|
156
|
+
"description": "Switch in the on state",
|
|
157
|
+
"code": "<StatefulSwitch checked label=\"Dark mode\" />",
|
|
158
|
+
"args": {
|
|
159
|
+
"checked": true,
|
|
160
|
+
"label": "Dark mode"
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"name": "With Helper Text",
|
|
165
|
+
"description": "Switch with explanatory helper text",
|
|
166
|
+
"code": "<StatefulSwitch\n checked\n label=\"Auto-save\"\n helperText=\"Automatically save changes as you type\"\n/>",
|
|
167
|
+
"args": {
|
|
168
|
+
"checked": true,
|
|
169
|
+
"label": "Auto-save",
|
|
170
|
+
"helperText": "Automatically save changes as you type"
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"name": "Sizes",
|
|
175
|
+
"description": "Available size variants",
|
|
176
|
+
"code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <StatefulSwitch size=\"sm\" checked label=\"Small switch\" />\n <StatefulSwitch size=\"md\" checked label=\"Medium switch (default)\" />\n <StatefulSwitch size=\"lg\" checked label=\"Large switch\" />\n</div>"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"name": "Disabled States",
|
|
180
|
+
"description": "Non-interactive switches showing both states",
|
|
181
|
+
"code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <Switch disabled label=\"Premium feature (upgrade required)\" />\n <Switch disabled checked label=\"System managed (read-only)\" />\n</div>"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"name": "Settings Panel",
|
|
185
|
+
"description": "Multiple switches in a realistic settings layout",
|
|
186
|
+
"code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', maxWidth: '320px' }}>\n <StatefulSwitch\n checked\n label=\"Push notifications\"\n helperText=\"Receive push notifications on your device\"\n />\n <StatefulSwitch\n checked\n label=\"Email digest\"\n helperText=\"Weekly summary of your activity\"\n />\n <StatefulSwitch\n label=\"Marketing emails\"\n helperText=\"Product updates and promotional offers\"\n />\n</div>"
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"relations": [
|
|
190
|
+
{
|
|
191
|
+
"component": "Input",
|
|
192
|
+
"relationship": "sibling",
|
|
193
|
+
"note": "Input handles text/number entry; Switch handles boolean state"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"component": "Checkbox",
|
|
197
|
+
"relationship": "alternative",
|
|
198
|
+
"note": "Use Checkbox when change requires form submission"
|
|
199
|
+
}
|
|
200
|
+
],
|
|
201
|
+
"contract": {
|
|
202
|
+
"propsSummary": [
|
|
203
|
+
"checked: boolean - on/off state",
|
|
204
|
+
"onCheckedChange: (checked) => void - state change handler",
|
|
205
|
+
"onChange: (checked) => void - alias for onCheckedChange",
|
|
206
|
+
"label: string - visible label text",
|
|
207
|
+
"helperText: string - helper text below label (preferred)",
|
|
208
|
+
"description: string - deprecated alias for helperText",
|
|
209
|
+
"disabled: boolean - non-interactive state",
|
|
210
|
+
"size: sm|md|lg - switch size"
|
|
211
|
+
],
|
|
212
|
+
"a11yRules": [
|
|
213
|
+
"A11Y_SWITCH_ROLE",
|
|
214
|
+
"A11Y_SWITCH_LABEL",
|
|
215
|
+
"A11Y_SWITCH_FOCUS",
|
|
216
|
+
"A11Y_TARGET_SIZE_MIN"
|
|
217
|
+
]
|
|
218
|
+
},
|
|
219
|
+
"ai": {
|
|
220
|
+
"compositionPattern": "compound",
|
|
221
|
+
"subComponents": [
|
|
222
|
+
"Root"
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
"provenance": {
|
|
226
|
+
"source": "migrated",
|
|
227
|
+
"verified": false,
|
|
228
|
+
"frameworkSupport": "native",
|
|
229
|
+
"extractedAt": "2026-03-13T23:19:06.429Z"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
width: var(--fui-toggle-width-sm, $fui-toggle-width-sm);
|
|
63
63
|
height: var(--fui-toggle-height-sm, $fui-toggle-height-sm);
|
|
64
64
|
--_toggle-thumb-size: calc(var(--fui-toggle-height-sm, #{$fui-toggle-height-sm}) - 4px);
|
|
65
|
-
--_toggle-inset:
|
|
65
|
+
--_toggle-inset: 1px;
|
|
66
66
|
--_toggle-translate: calc(
|
|
67
67
|
var(--fui-toggle-width-sm, #{$fui-toggle-width-sm}) -
|
|
68
68
|
var(--_toggle-thumb-size) -
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
width: var(--fui-toggle-width-lg, $fui-toggle-width-lg);
|
|
76
76
|
height: var(--fui-toggle-height-lg, $fui-toggle-height-lg);
|
|
77
77
|
--_toggle-thumb-size: calc(var(--fui-toggle-height-lg, #{$fui-toggle-height-lg}) - 4px);
|
|
78
|
-
--_toggle-inset:
|
|
78
|
+
--_toggle-inset: 1px;
|
|
79
79
|
--_toggle-translate: calc(
|
|
80
80
|
var(--fui-toggle-width-lg, #{$fui-toggle-width-lg}) -
|
|
81
81
|
var(--_toggle-thumb-size) -
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
width: var(--fui-toggle-width-md, $fui-toggle-width-md);
|
|
89
89
|
height: var(--fui-toggle-height-md, $fui-toggle-height-md);
|
|
90
90
|
--_toggle-thumb-size: calc(var(--fui-toggle-height-md, #{$fui-toggle-height-md}) - 4px);
|
|
91
|
-
--_toggle-inset:
|
|
91
|
+
--_toggle-inset: 1px;
|
|
92
92
|
--_toggle-translate: calc(
|
|
93
93
|
var(--fui-toggle-width-md, #{$fui-toggle-width-md}) -
|
|
94
94
|
var(--_toggle-thumb-size) -
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
|
+
"name": "ToggleGroup",
|
|
4
|
+
"description": "A group of toggle buttons where only one can be selected at a time. Useful for switching between views, modes, or options.",
|
|
5
|
+
"category": "forms",
|
|
6
|
+
"tags": [
|
|
7
|
+
"toggle",
|
|
8
|
+
"group",
|
|
9
|
+
"fragmented",
|
|
10
|
+
"control",
|
|
11
|
+
"tabs",
|
|
12
|
+
"switch"
|
|
13
|
+
],
|
|
14
|
+
"status": "stable",
|
|
15
|
+
"sourcePath": "src/components/ToggleGroup/index.tsx",
|
|
16
|
+
"exportName": "ToggleGroup",
|
|
17
|
+
"propsSummary": [
|
|
18
|
+
"value: string",
|
|
19
|
+
"defaultValue: string",
|
|
20
|
+
"onChange: function",
|
|
21
|
+
"onValueChange: function",
|
|
22
|
+
"children: node (required)",
|
|
23
|
+
"variant: default|pills|outline|outlined (default: default)",
|
|
24
|
+
"size: sm|md|lg (default: md)",
|
|
25
|
+
"gap: sm|none|xs (default: xs)",
|
|
26
|
+
"selectionMode: single (default: single)"
|
|
27
|
+
],
|
|
28
|
+
"props": {
|
|
29
|
+
"value": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "Currently selected value",
|
|
32
|
+
"required": false
|
|
33
|
+
},
|
|
34
|
+
"defaultValue": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"description": "Initial selected value (uncontrolled)",
|
|
37
|
+
"required": false
|
|
38
|
+
},
|
|
39
|
+
"onChange": {
|
|
40
|
+
"type": "function",
|
|
41
|
+
"description": "Called with new value when selection changes",
|
|
42
|
+
"required": false
|
|
43
|
+
},
|
|
44
|
+
"onValueChange": {
|
|
45
|
+
"type": "function",
|
|
46
|
+
"description": "Alias for onChange (Radix convention): (value: string) => void",
|
|
47
|
+
"required": false
|
|
48
|
+
},
|
|
49
|
+
"children": {
|
|
50
|
+
"type": "node",
|
|
51
|
+
"description": "ToggleGroup.Item components",
|
|
52
|
+
"required": true
|
|
53
|
+
},
|
|
54
|
+
"variant": {
|
|
55
|
+
"type": "enum",
|
|
56
|
+
"description": "Visual style",
|
|
57
|
+
"default": "default",
|
|
58
|
+
"required": false,
|
|
59
|
+
"values": [
|
|
60
|
+
"default",
|
|
61
|
+
"pills",
|
|
62
|
+
"outline",
|
|
63
|
+
"outlined"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"size": {
|
|
67
|
+
"type": "enum",
|
|
68
|
+
"description": "Size variant",
|
|
69
|
+
"default": "md",
|
|
70
|
+
"required": false,
|
|
71
|
+
"values": [
|
|
72
|
+
"sm",
|
|
73
|
+
"md",
|
|
74
|
+
"lg"
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
"gap": {
|
|
78
|
+
"type": "enum",
|
|
79
|
+
"description": "Gap between items (pills/outline variants)",
|
|
80
|
+
"default": "xs",
|
|
81
|
+
"required": false,
|
|
82
|
+
"values": [
|
|
83
|
+
"sm",
|
|
84
|
+
"none",
|
|
85
|
+
"xs"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
"selectionMode": {
|
|
89
|
+
"type": "enum",
|
|
90
|
+
"description": "Selection behavior",
|
|
91
|
+
"default": "single",
|
|
92
|
+
"required": false,
|
|
93
|
+
"values": [
|
|
94
|
+
"single"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"usage": {
|
|
99
|
+
"when": [
|
|
100
|
+
"Switching between mutually exclusive views or modes",
|
|
101
|
+
"Selecting one option from a small set (2-5 options)",
|
|
102
|
+
"Fragmented controls like view switchers",
|
|
103
|
+
"Filter or sort options"
|
|
104
|
+
],
|
|
105
|
+
"whenNot": [
|
|
106
|
+
"Multiple selections allowed (use Checkbox group)",
|
|
107
|
+
"Many options (use Select or RadioGroup)",
|
|
108
|
+
"Navigation between pages (use Tabs)",
|
|
109
|
+
"On/off toggle (use Switch component)"
|
|
110
|
+
],
|
|
111
|
+
"guidelines": [
|
|
112
|
+
"Keep options to 2-5 items for clarity",
|
|
113
|
+
"Use clear, concise labels",
|
|
114
|
+
"Consider icons for common actions (grid/list view)",
|
|
115
|
+
"Ensure adequate touch targets on mobile"
|
|
116
|
+
],
|
|
117
|
+
"accessibility": [
|
|
118
|
+
"Uses role=\"radiogroup\" for single-selection semantics",
|
|
119
|
+
"Each item has role=\"radio\" with aria-checked",
|
|
120
|
+
"Keyboard navigable with Tab and arrow keys",
|
|
121
|
+
"Focus visible on active item"
|
|
122
|
+
]
|
|
123
|
+
},
|
|
124
|
+
"examples": [
|
|
125
|
+
{
|
|
126
|
+
"name": "Default",
|
|
127
|
+
"description": "Basic toggle group",
|
|
128
|
+
"code": "<ToggleGroup value={value} onChange={setValue}>\n <ToggleGroup.Item value=\"left\">Left</ToggleGroup.Item>\n <ToggleGroup.Item value=\"center\">Center</ToggleGroup.Item>\n <ToggleGroup.Item value=\"right\">Right</ToggleGroup.Item>\n</ToggleGroup>"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "Pills Variant",
|
|
132
|
+
"description": "Pill-shaped toggle buttons",
|
|
133
|
+
"code": "<ToggleGroup value={value} onChange={setValue} variant=\"pills\">\n <ToggleGroup.Item value=\"all\">All</ToggleGroup.Item>\n <ToggleGroup.Item value=\"active\">Active</ToggleGroup.Item>\n <ToggleGroup.Item value=\"completed\">Completed</ToggleGroup.Item>\n</ToggleGroup>"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"name": "Outline Variant",
|
|
137
|
+
"description": "Outlined toggle buttons",
|
|
138
|
+
"code": "<ToggleGroup value={value} onChange={setValue} variant=\"outlined\">\n <ToggleGroup.Item value=\"day\">Day</ToggleGroup.Item>\n <ToggleGroup.Item value=\"week\">Week</ToggleGroup.Item>\n <ToggleGroup.Item value=\"month\">Month</ToggleGroup.Item>\n</ToggleGroup>"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"name": "Uncontrolled",
|
|
142
|
+
"description": "Use defaultValue for simple single-select state",
|
|
143
|
+
"code": "<ToggleGroup defaultValue=\"list\">\n <ToggleGroup.Item value=\"grid\">Grid</ToggleGroup.Item>\n <ToggleGroup.Item value=\"list\">List</ToggleGroup.Item>\n</ToggleGroup>"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"name": "Sizes",
|
|
147
|
+
"description": "Different size variants",
|
|
148
|
+
"code": "<ToggleGroup value={value} onChange={setValue} size=\"sm\">\n <ToggleGroup.Item value=\"a\">Small</ToggleGroup.Item>\n <ToggleGroup.Item value=\"b\">Size</ToggleGroup.Item>\n</ToggleGroup>\n<ToggleGroup value={value} onChange={setValue} size=\"md\">\n <ToggleGroup.Item value=\"a\">Medium</ToggleGroup.Item>\n <ToggleGroup.Item value=\"b\">Size</ToggleGroup.Item>\n</ToggleGroup>"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"name": "View Switcher",
|
|
152
|
+
"description": "Common pattern for switching between views",
|
|
153
|
+
"code": "<ToggleGroup value={view} onChange={setView} size=\"sm\">\n <ToggleGroup.Item value=\"grid\"><GridIcon /></ToggleGroup.Item>\n <ToggleGroup.Item value=\"list\"><ListIcon /></ToggleGroup.Item>\n</ToggleGroup>"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"name": "With Disabled Item",
|
|
157
|
+
"description": "Toggle group with a disabled option",
|
|
158
|
+
"code": "<ToggleGroup value={value} onChange={setValue}>\n <ToggleGroup.Item value=\"basic\">Basic</ToggleGroup.Item>\n <ToggleGroup.Item value=\"pro\">Pro</ToggleGroup.Item>\n <ToggleGroup.Item value=\"enterprise\" disabled>Enterprise</ToggleGroup.Item>\n</ToggleGroup>"
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"relations": [
|
|
162
|
+
{
|
|
163
|
+
"component": "RadioGroup",
|
|
164
|
+
"relationship": "alternative",
|
|
165
|
+
"note": "RadioGroup for form-style single selection"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"component": "Tabs",
|
|
169
|
+
"relationship": "alternative",
|
|
170
|
+
"note": "Tabs for content panel switching"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"component": "Switch",
|
|
174
|
+
"relationship": "sibling",
|
|
175
|
+
"note": "Switch for single on/off control"
|
|
176
|
+
}
|
|
177
|
+
],
|
|
178
|
+
"contract": {
|
|
179
|
+
"propsSummary": [
|
|
180
|
+
"value?: string - controlled selected value",
|
|
181
|
+
"defaultValue?: string - initial selected value (uncontrolled)",
|
|
182
|
+
"onChange: (value: string) => void - change handler (or onValueChange)",
|
|
183
|
+
"children: ToggleGroup.Item[] - toggle items",
|
|
184
|
+
"variant: default|pills|outline|outlined - visual style (outlined aliases outline)",
|
|
185
|
+
"size: sm|md - size variant",
|
|
186
|
+
"gap: none|xs|sm - spacing",
|
|
187
|
+
"selectionMode: single (default: single)"
|
|
188
|
+
],
|
|
189
|
+
"a11yRules": [
|
|
190
|
+
"A11Y_GROUP_ROLE",
|
|
191
|
+
"A11Y_KEYBOARD_ACCESSIBLE"
|
|
192
|
+
]
|
|
193
|
+
},
|
|
194
|
+
"ai": {
|
|
195
|
+
"compositionPattern": "compound",
|
|
196
|
+
"subComponents": [
|
|
197
|
+
"Item"
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
"provenance": {
|
|
201
|
+
"source": "migrated",
|
|
202
|
+
"verified": false,
|
|
203
|
+
"frameworkSupport": "native",
|
|
204
|
+
"extractedAt": "2026-03-13T23:19:07.233Z"
|
|
205
|
+
}
|
|
206
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
|
+
"name": "Tooltip",
|
|
4
|
+
"description": "Contextual help text that appears on hover or focus. Perfect for explaining icons, truncated text, or providing additional context.",
|
|
5
|
+
"category": "feedback",
|
|
6
|
+
"tags": [
|
|
7
|
+
"tooltip",
|
|
8
|
+
"hint",
|
|
9
|
+
"help",
|
|
10
|
+
"hover",
|
|
11
|
+
"contextual"
|
|
12
|
+
],
|
|
13
|
+
"status": "stable",
|
|
14
|
+
"sourcePath": "src/components/Tooltip/index.tsx",
|
|
15
|
+
"exportName": "Tooltip",
|
|
16
|
+
"propsSummary": [
|
|
17
|
+
"children: element (required)",
|
|
18
|
+
"content: node (required)",
|
|
19
|
+
"side: top|bottom|left|right (default: top)",
|
|
20
|
+
"align: start|center|end (default: center)",
|
|
21
|
+
"sideOffset: number (default: 6)",
|
|
22
|
+
"delay: number",
|
|
23
|
+
"closeDelay: number",
|
|
24
|
+
"disabled: boolean (default: false)",
|
|
25
|
+
"arrow: boolean (default: true)",
|
|
26
|
+
"open: boolean",
|
|
27
|
+
"defaultOpen: boolean",
|
|
28
|
+
"onOpenChange: function",
|
|
29
|
+
"contentProps: object",
|
|
30
|
+
"style: object"
|
|
31
|
+
],
|
|
32
|
+
"props": {
|
|
33
|
+
"children": {
|
|
34
|
+
"type": "element",
|
|
35
|
+
"description": "The element that triggers the tooltip",
|
|
36
|
+
"required": true
|
|
37
|
+
},
|
|
38
|
+
"content": {
|
|
39
|
+
"type": "node",
|
|
40
|
+
"description": "Content to display in the tooltip",
|
|
41
|
+
"required": true
|
|
42
|
+
},
|
|
43
|
+
"side": {
|
|
44
|
+
"type": "enum",
|
|
45
|
+
"description": "Which side to show the tooltip",
|
|
46
|
+
"default": "top",
|
|
47
|
+
"required": false,
|
|
48
|
+
"values": [
|
|
49
|
+
"top",
|
|
50
|
+
"bottom",
|
|
51
|
+
"left",
|
|
52
|
+
"right"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"align": {
|
|
56
|
+
"type": "enum",
|
|
57
|
+
"description": "Alignment along the side",
|
|
58
|
+
"default": "center",
|
|
59
|
+
"required": false,
|
|
60
|
+
"values": [
|
|
61
|
+
"start",
|
|
62
|
+
"center",
|
|
63
|
+
"end"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"sideOffset": {
|
|
67
|
+
"type": "number",
|
|
68
|
+
"description": "Distance from trigger in pixels",
|
|
69
|
+
"default": "6",
|
|
70
|
+
"required": false
|
|
71
|
+
},
|
|
72
|
+
"delay": {
|
|
73
|
+
"type": "number",
|
|
74
|
+
"description": "Delay before showing (ms)",
|
|
75
|
+
"default": "400",
|
|
76
|
+
"required": false
|
|
77
|
+
},
|
|
78
|
+
"closeDelay": {
|
|
79
|
+
"type": "number",
|
|
80
|
+
"description": "Delay before hiding (ms)",
|
|
81
|
+
"default": "0",
|
|
82
|
+
"required": false
|
|
83
|
+
},
|
|
84
|
+
"disabled": {
|
|
85
|
+
"type": "boolean",
|
|
86
|
+
"description": "Disable the tooltip",
|
|
87
|
+
"default": "false",
|
|
88
|
+
"required": false
|
|
89
|
+
},
|
|
90
|
+
"arrow": {
|
|
91
|
+
"type": "boolean",
|
|
92
|
+
"description": "Show arrow pointing to trigger",
|
|
93
|
+
"default": "true",
|
|
94
|
+
"required": false
|
|
95
|
+
},
|
|
96
|
+
"open": {
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"description": "Controlled open state",
|
|
99
|
+
"required": false
|
|
100
|
+
},
|
|
101
|
+
"defaultOpen": {
|
|
102
|
+
"type": "boolean",
|
|
103
|
+
"description": "Default open state",
|
|
104
|
+
"default": "false",
|
|
105
|
+
"required": false
|
|
106
|
+
},
|
|
107
|
+
"onOpenChange": {
|
|
108
|
+
"type": "function",
|
|
109
|
+
"description": "Callback when open state changes",
|
|
110
|
+
"required": false
|
|
111
|
+
},
|
|
112
|
+
"contentProps": {
|
|
113
|
+
"type": "object",
|
|
114
|
+
"description": "Props forwarded to the tooltip popup element (preferred way to pass popup attrs/className/style)",
|
|
115
|
+
"required": false
|
|
116
|
+
},
|
|
117
|
+
"style": {
|
|
118
|
+
"type": "object",
|
|
119
|
+
"description": "",
|
|
120
|
+
"required": false
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"usage": {
|
|
124
|
+
"when": [
|
|
125
|
+
"Explaining icon-only buttons",
|
|
126
|
+
"Showing full text for truncated content",
|
|
127
|
+
"Providing keyboard shortcuts",
|
|
128
|
+
"Brief contextual help that fits in one line"
|
|
129
|
+
],
|
|
130
|
+
"whenNot": [
|
|
131
|
+
"Long-form help content (use Popover)",
|
|
132
|
+
"Critical information users must see (use Alert)",
|
|
133
|
+
"Interactive content (use Popover or Menu)",
|
|
134
|
+
"Mobile-primary interfaces (tooltips require hover)"
|
|
135
|
+
],
|
|
136
|
+
"guidelines": [
|
|
137
|
+
"Keep tooltip text concise (under 80 characters)",
|
|
138
|
+
"Use sentence case, no period for single sentences",
|
|
139
|
+
"Avoid duplicating visible label text",
|
|
140
|
+
"Consider mobile users who cannot hover",
|
|
141
|
+
"Use contentProps for tooltip popup attributes/styling; top-level HTML attrs are applied to the popup for backward compatibility"
|
|
142
|
+
],
|
|
143
|
+
"accessibility": [
|
|
144
|
+
"Accessible via focus as well as hover",
|
|
145
|
+
"Uses role=\"tooltip\" with proper aria association",
|
|
146
|
+
"Delay prevents tooltips from appearing during navigation"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
"examples": [
|
|
150
|
+
{
|
|
151
|
+
"name": "Default",
|
|
152
|
+
"description": "Basic tooltip on hover",
|
|
153
|
+
"code": "<Tooltip content=\"Save your changes\">\n <Button>Save</Button>\n</Tooltip>"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"name": "Positions",
|
|
157
|
+
"description": "Tooltips on different sides",
|
|
158
|
+
"code": "<div style={{ display: 'flex', gap: '16px', padding: '40px' }}>\n <Tooltip content=\"Top tooltip\" side=\"top\">\n <Button variant=\"secondary\">Top</Button>\n </Tooltip>\n <Tooltip content=\"Bottom tooltip\" side=\"bottom\">\n <Button variant=\"secondary\">Bottom</Button>\n </Tooltip>\n <Tooltip content=\"Left tooltip\" side=\"left\">\n <Button variant=\"secondary\">Left</Button>\n </Tooltip>\n <Tooltip content=\"Right tooltip\" side=\"right\">\n <Button variant=\"secondary\">Right</Button>\n </Tooltip>\n</div>"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"name": "With Shortcut",
|
|
162
|
+
"description": "Tooltip showing keyboard shortcut",
|
|
163
|
+
"code": "<Tooltip content=\"Undo (Ctrl+Z)\">\n <Button variant=\"ghost\">Undo</Button>\n</Tooltip>"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"name": "No Arrow",
|
|
167
|
+
"description": "Tooltip without arrow",
|
|
168
|
+
"code": "<Tooltip content=\"Clean tooltip\" arrow={false}>\n <Button variant=\"secondary\">Hover me</Button>\n</Tooltip>"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"name": "With Content Props",
|
|
172
|
+
"description": "Pass popup attributes/styling using contentProps",
|
|
173
|
+
"code": "<Tooltip content=\"Custom popup attrs\" contentProps={{ id: 'custom-tooltip-popup' }}>\n <Button variant=\"secondary\">Hover me</Button>\n</Tooltip>"
|
|
174
|
+
}
|
|
175
|
+
],
|
|
176
|
+
"relations": [
|
|
177
|
+
{
|
|
178
|
+
"component": "Popover",
|
|
179
|
+
"relationship": "alternative",
|
|
180
|
+
"note": "Use Popover for interactive or longer content"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"component": "Alert",
|
|
184
|
+
"relationship": "alternative",
|
|
185
|
+
"note": "Use Alert for critical information that must be visible"
|
|
186
|
+
}
|
|
187
|
+
],
|
|
188
|
+
"contract": {
|
|
189
|
+
"propsSummary": [
|
|
190
|
+
"content: ReactNode - tooltip content",
|
|
191
|
+
"side: top|bottom|left|right - position",
|
|
192
|
+
"delay: number - show delay in ms (default: 400)",
|
|
193
|
+
"arrow: boolean - show arrow (default: true)",
|
|
194
|
+
"contentProps: HTMLAttributes<HTMLDivElement> - popup element props"
|
|
195
|
+
],
|
|
196
|
+
"a11yRules": [
|
|
197
|
+
"A11Y_TOOLTIP_FOCUS",
|
|
198
|
+
"A11Y_TOOLTIP_ROLE"
|
|
199
|
+
]
|
|
200
|
+
},
|
|
201
|
+
"ai": {
|
|
202
|
+
"compositionPattern": "compound",
|
|
203
|
+
"subComponents": [
|
|
204
|
+
"Root",
|
|
205
|
+
"Provider"
|
|
206
|
+
]
|
|
207
|
+
},
|
|
208
|
+
"provenance": {
|
|
209
|
+
"source": "migrated",
|
|
210
|
+
"verified": false,
|
|
211
|
+
"frameworkSupport": "native",
|
|
212
|
+
"extractedAt": "2026-03-13T23:19:07.058Z"
|
|
213
|
+
}
|
|
214
|
+
}
|