@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.
Files changed (286) hide show
  1. package/dist/assets/ui.css +2700 -3256
  2. package/dist/chart.cjs +0 -1
  3. package/dist/chart.js +0 -1
  4. package/dist/codeblock.cjs +0 -1
  5. package/dist/codeblock.js +0 -1
  6. package/dist/colorpicker.cjs +0 -1
  7. package/dist/colorpicker.js +0 -1
  8. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  9. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  10. package/dist/components/Alert/Alert.module.scss.cjs +12 -12
  11. package/dist/components/Alert/Alert.module.scss.js +12 -12
  12. package/dist/components/AppShell/AppShell.module.scss.cjs +12 -12
  13. package/dist/components/AppShell/AppShell.module.scss.js +12 -12
  14. package/dist/components/Avatar/Avatar.module.scss.cjs +13 -13
  15. package/dist/components/Avatar/Avatar.module.scss.js +13 -13
  16. package/dist/components/Badge/Badge.module.scss.cjs +13 -13
  17. package/dist/components/Badge/Badge.module.scss.js +13 -13
  18. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  19. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  20. package/dist/components/Box/Box.module.scss.cjs +152 -152
  21. package/dist/components/Box/Box.module.scss.js +152 -152
  22. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +8 -8
  23. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +8 -8
  24. package/dist/components/Button/Button.module.scss.cjs +12 -12
  25. package/dist/components/Button/Button.module.scss.js +12 -12
  26. package/dist/components/Card/Card.module.scss.cjs +14 -14
  27. package/dist/components/Card/Card.module.scss.js +14 -14
  28. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  29. package/dist/components/Chart/Chart.module.scss.js +15 -15
  30. package/dist/components/Chart/index.d.ts +0 -1
  31. package/dist/components/Chart/index.d.ts.map +1 -1
  32. package/dist/components/Checkbox/Checkbox.module.scss.cjs +10 -10
  33. package/dist/components/Checkbox/Checkbox.module.scss.js +10 -10
  34. package/dist/components/Chip/Chip.module.scss.cjs +15 -15
  35. package/dist/components/Chip/Chip.module.scss.js +15 -15
  36. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +21 -21
  37. package/dist/components/CodeBlock/CodeBlock.module.scss.js +21 -21
  38. package/dist/components/CodeBlock/index.d.ts +0 -1
  39. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  40. package/dist/components/Collapsible/Collapsible.module.scss.cjs +10 -10
  41. package/dist/components/Collapsible/Collapsible.module.scss.js +10 -10
  42. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  43. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  44. package/dist/components/ColorPicker/index.d.ts +0 -1
  45. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  46. package/dist/components/Combobox/Combobox.module.scss.cjs +23 -23
  47. package/dist/components/Combobox/Combobox.module.scss.js +23 -23
  48. package/dist/components/Combobox/index.cjs +13 -10
  49. package/dist/components/Combobox/index.d.ts.map +1 -1
  50. package/dist/components/Combobox/index.js +13 -10
  51. package/dist/components/Command/Command.module.scss.cjs +11 -11
  52. package/dist/components/Command/Command.module.scss.js +11 -11
  53. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  54. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  55. package/dist/components/DataTable/DataTable.module.scss.cjs +26 -26
  56. package/dist/components/DataTable/DataTable.module.scss.js +26 -26
  57. package/dist/components/DataTable/index.cjs +0 -1
  58. package/dist/components/DataTable/index.d.ts +0 -1
  59. package/dist/components/DataTable/index.d.ts.map +1 -1
  60. package/dist/components/DataTable/index.js +0 -1
  61. package/dist/components/DatePicker/DatePicker.module.scss.cjs +31 -31
  62. package/dist/components/DatePicker/DatePicker.module.scss.js +31 -31
  63. package/dist/components/DatePicker/index.d.ts +0 -1
  64. package/dist/components/DatePicker/index.d.ts.map +1 -1
  65. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  66. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  67. package/dist/components/Drawer/Drawer.module.scss.cjs +33 -27
  68. package/dist/components/Drawer/Drawer.module.scss.js +34 -28
  69. package/dist/components/Drawer/index.cjs +36 -14
  70. package/dist/components/Drawer/index.d.ts +21 -3
  71. package/dist/components/Drawer/index.d.ts.map +1 -1
  72. package/dist/components/Drawer/index.js +36 -14
  73. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  74. package/dist/components/Editor/Editor.module.scss.js +17 -17
  75. package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
  76. package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
  77. package/dist/components/Field/Field.module.scss.cjs +4 -4
  78. package/dist/components/Field/Field.module.scss.js +4 -4
  79. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  80. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  81. package/dist/components/Header/Header.module.scss.cjs +28 -28
  82. package/dist/components/Header/Header.module.scss.js +28 -28
  83. package/dist/components/Icon/Icon.module.scss.cjs +8 -8
  84. package/dist/components/Icon/Icon.module.scss.js +8 -8
  85. package/dist/components/Image/Image.module.scss.cjs +27 -27
  86. package/dist/components/Image/Image.module.scss.js +27 -27
  87. package/dist/components/Input/Input.module.scss.cjs +19 -19
  88. package/dist/components/Input/Input.module.scss.js +19 -19
  89. package/dist/components/Link/Link.module.scss.cjs +10 -10
  90. package/dist/components/Link/Link.module.scss.js +10 -10
  91. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  92. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  93. package/dist/components/Loading/Loading.module.scss.cjs +30 -30
  94. package/dist/components/Loading/Loading.module.scss.js +30 -30
  95. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  96. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  97. package/dist/components/Markdown/index.d.ts +0 -1
  98. package/dist/components/Markdown/index.d.ts.map +1 -1
  99. package/dist/components/Menu/Menu.module.scss.cjs +16 -13
  100. package/dist/components/Menu/Menu.module.scss.js +17 -14
  101. package/dist/components/Menu/index.cjs +1 -1
  102. package/dist/components/Menu/index.d.ts.map +1 -1
  103. package/dist/components/Menu/index.js +1 -1
  104. package/dist/components/Message/Message.module.scss.cjs +18 -18
  105. package/dist/components/Message/Message.module.scss.js +18 -18
  106. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +28 -28
  107. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +28 -28
  108. package/dist/components/Pagination/Pagination.module.scss.cjs +7 -7
  109. package/dist/components/Pagination/Pagination.module.scss.js +7 -7
  110. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  111. package/dist/components/Popover/Popover.module.scss.js +10 -10
  112. package/dist/components/Progress/Progress.module.scss.cjs +25 -25
  113. package/dist/components/Progress/Progress.module.scss.js +25 -25
  114. package/dist/components/Prompt/Prompt.module.scss.cjs +26 -14
  115. package/dist/components/Prompt/Prompt.module.scss.js +26 -14
  116. package/dist/components/Prompt/index.cjs +16 -0
  117. package/dist/components/Prompt/index.d.ts +17 -1
  118. package/dist/components/Prompt/index.d.ts.map +1 -1
  119. package/dist/components/Prompt/index.js +16 -0
  120. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +16 -16
  121. package/dist/components/RadioGroup/RadioGroup.module.scss.js +16 -16
  122. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +10 -10
  123. package/dist/components/ScrollArea/ScrollArea.module.scss.js +10 -10
  124. package/dist/components/Select/Select.module.scss.cjs +17 -17
  125. package/dist/components/Select/Select.module.scss.js +17 -17
  126. package/dist/components/Select/index.cjs +20 -20
  127. package/dist/components/Select/index.d.ts.map +1 -1
  128. package/dist/components/Select/index.js +20 -20
  129. package/dist/components/Separator/Separator.module.scss.cjs +10 -10
  130. package/dist/components/Separator/Separator.module.scss.js +10 -10
  131. package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
  132. package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
  133. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  134. package/dist/components/Slider/Slider.module.scss.js +12 -12
  135. package/dist/components/Slider/index.cjs +23 -21
  136. package/dist/components/Slider/index.js +23 -21
  137. package/dist/components/Stack/Stack.module.scss.cjs +35 -35
  138. package/dist/components/Stack/Stack.module.scss.js +35 -35
  139. package/dist/components/Table/Table.module.scss.cjs +16 -16
  140. package/dist/components/Table/Table.module.scss.js +16 -16
  141. package/dist/components/Table/index.d.ts +0 -1
  142. package/dist/components/Table/index.d.ts.map +1 -1
  143. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +7 -7
  144. package/dist/components/TableOfContents/TableOfContents.module.scss.js +7 -7
  145. package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
  146. package/dist/components/Tabs/Tabs.module.scss.js +9 -9
  147. package/dist/components/Text/Text.module.scss.cjs +38 -38
  148. package/dist/components/Text/Text.module.scss.js +38 -38
  149. package/dist/components/Textarea/Textarea.module.scss.cjs +23 -23
  150. package/dist/components/Textarea/Textarea.module.scss.js +23 -23
  151. package/dist/components/Theme/ThemeToggle.module.scss.cjs +6 -6
  152. package/dist/components/Theme/ThemeToggle.module.scss.js +6 -6
  153. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +22 -22
  154. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +22 -22
  155. package/dist/components/Toast/Toast.module.scss.cjs +20 -20
  156. package/dist/components/Toast/Toast.module.scss.js +20 -20
  157. package/dist/components/Toggle/Toggle.module.scss.cjs +13 -13
  158. package/dist/components/Toggle/Toggle.module.scss.js +13 -13
  159. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
  160. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
  161. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  162. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  163. package/dist/components/Tooltip/index.cjs +4 -3
  164. package/dist/components/Tooltip/index.d.ts +4 -1
  165. package/dist/components/Tooltip/index.d.ts.map +1 -1
  166. package/dist/components/Tooltip/index.js +4 -3
  167. package/dist/datepicker.cjs +0 -1
  168. package/dist/datepicker.js +0 -1
  169. package/dist/index.cjs +0 -1
  170. package/dist/index.d.ts +2 -3
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +0 -1
  173. package/dist/markdown.cjs +0 -1
  174. package/dist/markdown.js +0 -1
  175. package/dist/table.cjs +0 -1
  176. package/dist/table.js +0 -1
  177. package/dist/utils/seed-derivation.cjs +29 -0
  178. package/dist/utils/seed-derivation.d.ts +1 -1
  179. package/dist/utils/seed-derivation.d.ts.map +1 -1
  180. package/dist/utils/seed-derivation.js +29 -0
  181. package/fragments.json +1 -1
  182. package/package.json +18 -14
  183. package/src/components/Accordion/Accordion.contract.json +169 -0
  184. package/src/components/Alert/Alert.contract.json +157 -0
  185. package/src/components/AppShell/AppShell.contract.json +155 -0
  186. package/src/components/Avatar/Avatar.contract.json +189 -0
  187. package/src/components/Badge/Badge.contract.json +187 -0
  188. package/src/components/BentoGrid/BentoGrid.contract.json +135 -0
  189. package/src/components/Box/Box.contract.json +423 -0
  190. package/src/components/Breadcrumbs/Breadcrumbs.contract.json +143 -0
  191. package/src/components/Button/Button.contract.json +205 -0
  192. package/src/components/Button/Button.module.scss +24 -1
  193. package/src/components/ButtonGroup/ButtonGroup.contract.json +140 -0
  194. package/src/components/Card/Card.contract.json +185 -0
  195. package/src/components/Card/Card.module.scss +5 -1
  196. package/src/components/Chart/Chart.contract.json +129 -0
  197. package/src/components/Chart/index.tsx +0 -1
  198. package/src/components/Checkbox/Checkbox.contract.json +246 -0
  199. package/src/components/Chip/Chip.contract.json +212 -0
  200. package/src/components/Chip/Chip.module.scss +4 -4
  201. package/src/components/CodeBlock/CodeBlock.contract.json +388 -0
  202. package/src/components/CodeBlock/index.tsx +0 -1
  203. package/src/components/Collapsible/Collapsible.contract.json +154 -0
  204. package/src/components/ColorPicker/ColorPicker.contract.json +212 -0
  205. package/src/components/ColorPicker/index.tsx +0 -1
  206. package/src/components/Combobox/Combobox.contract.json +297 -0
  207. package/src/components/Combobox/index.tsx +7 -8
  208. package/src/components/Command/Command.contract.json +165 -0
  209. package/src/components/Command/Command.module.scss +22 -9
  210. package/src/components/ConversationList/ConversationList.contract.json +151 -0
  211. package/src/components/DataTable/DataTable.contract.json +302 -0
  212. package/src/components/DataTable/index.tsx +0 -2
  213. package/src/components/DatePicker/DatePicker.contract.json +288 -0
  214. package/src/components/DatePicker/index.tsx +0 -2
  215. package/src/components/Dialog/Dialog.contract.json +159 -0
  216. package/src/components/Drawer/Drawer.contract.json +161 -0
  217. package/src/components/Drawer/Drawer.module.scss +45 -5
  218. package/src/components/Drawer/index.tsx +66 -23
  219. package/src/components/Editor/Editor.contract.json +263 -0
  220. package/src/components/EmptyState/EmptyState.contract.json +133 -0
  221. package/src/components/Field/Field.contract.json +157 -0
  222. package/src/components/Fieldset/Fieldset.contract.json +117 -0
  223. package/src/components/Form/Form.contract.json +145 -0
  224. package/src/components/Grid/Grid.contract.json +195 -0
  225. package/src/components/Header/Header.contract.json +196 -0
  226. package/src/components/Icon/Icon.contract.json +194 -0
  227. package/src/components/Image/Image.contract.json +209 -0
  228. package/src/components/Input/Input.contract.json +344 -0
  229. package/src/components/Input/Input.module.scss +16 -6
  230. package/src/components/Link/Link.contract.json +180 -0
  231. package/src/components/List/List.contract.json +154 -0
  232. package/src/components/Listbox/Listbox.contract.json +158 -0
  233. package/src/components/Loading/Loading.contract.json +167 -0
  234. package/src/components/Markdown/Markdown.contract.json +127 -0
  235. package/src/components/Markdown/Markdown.module.scss +0 -3
  236. package/src/components/Markdown/index.tsx +0 -1
  237. package/src/components/Menu/Menu.contract.json +177 -0
  238. package/src/components/Menu/Menu.module.scss +6 -0
  239. package/src/components/Menu/index.tsx +3 -1
  240. package/src/components/Message/Message.contract.json +183 -0
  241. package/src/components/Message/Message.module.scss +2 -2
  242. package/src/components/NavigationMenu/NavigationMenu.contract.json +203 -0
  243. package/src/components/NavigationMenu/NavigationMenu.module.scss +18 -23
  244. package/src/components/Pagination/Pagination.contract.json +163 -0
  245. package/src/components/Pagination/Pagination.module.scss +1 -1
  246. package/src/components/Popover/Popover.contract.json +163 -0
  247. package/src/components/Progress/Progress.contract.json +176 -0
  248. package/src/components/Prompt/Prompt.contract.json +211 -0
  249. package/src/components/Prompt/Prompt.module.scss +117 -3
  250. package/src/components/Prompt/index.tsx +40 -0
  251. package/src/components/RadioGroup/RadioGroup.contract.json +226 -0
  252. package/src/components/ScrollArea/ScrollArea.contract.json +131 -0
  253. package/src/components/Select/Select.contract.json +269 -0
  254. package/src/components/Select/index.tsx +20 -25
  255. package/src/components/Separator/Separator.contract.json +143 -0
  256. package/src/components/Sidebar/Sidebar.contract.json +258 -0
  257. package/src/components/Sidebar/Sidebar.module.scss +1 -1
  258. package/src/components/Skeleton/Skeleton.contract.json +166 -0
  259. package/src/components/Slider/Slider.contract.json +248 -0
  260. package/src/components/Slider/index.tsx +10 -10
  261. package/src/components/Stack/Stack.contract.json +220 -0
  262. package/src/components/Table/Table.contract.json +171 -0
  263. package/src/components/Table/index.tsx +0 -2
  264. package/src/components/TableOfContents/TableOfContents.contract.json +145 -0
  265. package/src/components/TableOfContents/TableOfContents.module.scss +19 -15
  266. package/src/components/Tabs/Tabs.contract.json +159 -0
  267. package/src/components/Text/Text.contract.json +239 -0
  268. package/src/components/Textarea/Textarea.contract.json +308 -0
  269. package/src/components/Theme/Theme.contract.json +152 -0
  270. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +165 -0
  271. package/src/components/Toast/Toast.contract.json +181 -0
  272. package/src/components/Toggle/Toggle.contract.json +231 -0
  273. package/src/components/Toggle/Toggle.module.scss +3 -3
  274. package/src/components/ToggleGroup/ToggleGroup.contract.json +206 -0
  275. package/src/components/Tooltip/Tooltip.contract.json +214 -0
  276. package/src/components/Tooltip/index.tsx +7 -3
  277. package/src/components/VisuallyHidden/VisuallyHidden.contract.json +116 -0
  278. package/src/index.ts +8 -3
  279. package/src/styles/globals.scss +6 -1
  280. package/src/tokens/_computed.scss +3 -1
  281. package/src/tokens/_density.scss +4 -4
  282. package/src/tokens/_derive.scss +52 -56
  283. package/src/tokens/_palettes.scss +20 -1
  284. package/src/tokens/_seeds.scss +2 -2
  285. package/src/tokens/_variables.scss +45 -29
  286. 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: 2px;
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: 2px;
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: 2px;
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
+ }