@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,226 @@
1
+ {
2
+ "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
+ "name": "RadioGroup",
4
+ "description": "Single selection from a list of mutually exclusive options",
5
+ "category": "forms",
6
+ "tags": [
7
+ "form",
8
+ "radio",
9
+ "selection",
10
+ "options"
11
+ ],
12
+ "status": "stable",
13
+ "sourcePath": "src/components/RadioGroup/index.tsx",
14
+ "exportName": "RadioGroup",
15
+ "propsSummary": [
16
+ "value: string",
17
+ "defaultValue: string",
18
+ "onValueChange: function",
19
+ "onChange: function",
20
+ "orientation: horizontal|vertical (default: vertical)",
21
+ "disabled: boolean (default: false)",
22
+ "name: string",
23
+ "label: string",
24
+ "helperText: string",
25
+ "error: union",
26
+ "size: sm|md|lg (default: md)",
27
+ "wrapperClassName: string",
28
+ "groupClassName: string",
29
+ "children: node (required)"
30
+ ],
31
+ "props": {
32
+ "value": {
33
+ "type": "string",
34
+ "description": "Controlled selected value",
35
+ "required": false
36
+ },
37
+ "defaultValue": {
38
+ "type": "string",
39
+ "description": "Default value (uncontrolled)",
40
+ "required": false
41
+ },
42
+ "onValueChange": {
43
+ "type": "function",
44
+ "description": "Callback when selection changes",
45
+ "required": false
46
+ },
47
+ "onChange": {
48
+ "type": "function",
49
+ "description": "Alias for onValueChange",
50
+ "required": false
51
+ },
52
+ "orientation": {
53
+ "type": "enum",
54
+ "description": "Layout orientation",
55
+ "default": "vertical",
56
+ "required": false,
57
+ "values": [
58
+ "horizontal",
59
+ "vertical"
60
+ ]
61
+ },
62
+ "disabled": {
63
+ "type": "boolean",
64
+ "description": "Disable all options",
65
+ "default": "false",
66
+ "required": false
67
+ },
68
+ "name": {
69
+ "type": "string",
70
+ "description": "Form field name",
71
+ "required": false
72
+ },
73
+ "label": {
74
+ "type": "string",
75
+ "description": "Group label",
76
+ "required": false
77
+ },
78
+ "helperText": {
79
+ "type": "string",
80
+ "description": "Helper text shown below the group",
81
+ "required": false
82
+ },
83
+ "error": {
84
+ "type": "union",
85
+ "description": "Show error styling. When a string is provided, it is displayed as an error message.",
86
+ "required": false
87
+ },
88
+ "size": {
89
+ "type": "enum",
90
+ "description": "Size variant",
91
+ "default": "md",
92
+ "required": false,
93
+ "values": [
94
+ "sm",
95
+ "md",
96
+ "lg"
97
+ ]
98
+ },
99
+ "wrapperClassName": {
100
+ "type": "string",
101
+ "description": "Class name for the outer wrapper element",
102
+ "required": false
103
+ },
104
+ "groupClassName": {
105
+ "type": "string",
106
+ "description": "Class name for the inner radio group element",
107
+ "required": false
108
+ },
109
+ "children": {
110
+ "type": "node",
111
+ "description": "RadioGroup.Item elements",
112
+ "required": true
113
+ }
114
+ },
115
+ "usage": {
116
+ "when": [
117
+ "User must select exactly one option from a small set",
118
+ "Options are mutually exclusive",
119
+ "All options should be visible at once",
120
+ "2-5 options available"
121
+ ],
122
+ "whenNot": [
123
+ "Multiple selections allowed (use Checkbox group)",
124
+ "Many options (use Select)",
125
+ "Binary on/off choice (use Switch)",
126
+ "Options need to be searchable (use Combobox)"
127
+ ],
128
+ "guidelines": [
129
+ "Always have one option pre-selected when possible",
130
+ "Order options logically (alphabetical, frequency, etc.)",
131
+ "Keep option labels concise",
132
+ "Use helperText on RadioGroup.Item for complex options"
133
+ ],
134
+ "accessibility": [
135
+ "Group must have an accessible label",
136
+ "Use arrow keys to navigate between options",
137
+ "Selected option should be clearly indicated"
138
+ ]
139
+ },
140
+ "examples": [
141
+ {
142
+ "name": "Default",
143
+ "description": "Basic radio group with labels",
144
+ "code": "<RadioGroup defaultValue=\"option1\" label=\"Select an option\">\n <RadioGroup.Item value=\"option1\" label=\"Option 1\" />\n <RadioGroup.Item value=\"option2\" label=\"Option 2\" />\n <RadioGroup.Item value=\"option3\" label=\"Option 3\" />\n</RadioGroup>"
145
+ },
146
+ {
147
+ "name": "With Helper Text",
148
+ "description": "Radio items with additional context",
149
+ "code": "<RadioGroup defaultValue=\"standard\" label=\"Shipping Method\">\n <RadioGroup.Item\n value=\"standard\"\n label=\"Standard\"\n helperText=\"5-7 business days\"\n />\n <RadioGroup.Item\n value=\"express\"\n label=\"Express\"\n helperText=\"2-3 business days\"\n />\n <RadioGroup.Item\n value=\"overnight\"\n label=\"Overnight\"\n helperText=\"Next business day\"\n />\n</RadioGroup>"
150
+ },
151
+ {
152
+ "name": "Horizontal",
153
+ "description": "Side-by-side layout",
154
+ "code": "<RadioGroup orientation=\"horizontal\" defaultValue=\"small\" label=\"Size\">\n <RadioGroup.Item value=\"small\" label=\"S\" />\n <RadioGroup.Item value=\"medium\" label=\"M\" />\n <RadioGroup.Item value=\"large\" label=\"L\" />\n <RadioGroup.Item value=\"xlarge\" label=\"XL\" />\n</RadioGroup>"
155
+ },
156
+ {
157
+ "name": "With Group Helper Text",
158
+ "description": "Group-level helper text",
159
+ "code": "<RadioGroup defaultValue=\"standard\" label=\"Plan\" helperText=\"You can change your plan at any time\">\n <RadioGroup.Item value=\"free\" label=\"Free\" />\n <RadioGroup.Item value=\"standard\" label=\"Standard\" />\n <RadioGroup.Item value=\"pro\" label=\"Pro\" />\n</RadioGroup>"
160
+ },
161
+ {
162
+ "name": "With Error",
163
+ "description": "Validation error state (string shows error message)",
164
+ "code": "<RadioGroup label=\"Required selection\" error=\"Please select an option\">\n <RadioGroup.Item value=\"a\" label=\"Option A\" />\n <RadioGroup.Item value=\"b\" label=\"Option B\" />\n</RadioGroup>"
165
+ },
166
+ {
167
+ "name": "Disabled",
168
+ "description": "Non-interactive state",
169
+ "code": "<RadioGroup disabled defaultValue=\"locked\" label=\"Locked selection\">\n <RadioGroup.Item value=\"locked\" label=\"This is locked\" />\n <RadioGroup.Item value=\"other\" label=\"Cannot select\" />\n</RadioGroup>"
170
+ },
171
+ {
172
+ "name": "Styling Targets",
173
+ "description": "Use explicit class names for wrapper/group/item styling hooks",
174
+ "code": "<RadioGroup\n defaultValue=\"a\"\n label=\"Display mode\"\n wrapperClassName=\"demo-radio-wrapper\"\n groupClassName=\"demo-radio-group\"\n>\n <RadioGroup.Item value=\"a\" label=\"Compact\" controlClassName=\"demo-radio-control\" contentClassName=\"demo-radio-content\" />\n <RadioGroup.Item value=\"b\" label=\"Comfortable\" />\n</RadioGroup>"
175
+ }
176
+ ],
177
+ "relations": [
178
+ {
179
+ "component": "Checkbox",
180
+ "relationship": "alternative",
181
+ "note": "Use Checkbox for multiple selections"
182
+ },
183
+ {
184
+ "component": "Select",
185
+ "relationship": "alternative",
186
+ "note": "Use Select for many options or limited space"
187
+ },
188
+ {
189
+ "component": "Switch",
190
+ "relationship": "alternative",
191
+ "note": "Use Switch for binary on/off choices"
192
+ }
193
+ ],
194
+ "contract": {
195
+ "propsSummary": [
196
+ "value: string - selected value",
197
+ "onValueChange: (value: string) => void",
198
+ "onChange: (value: string) => void - alias for onValueChange",
199
+ "orientation: horizontal|vertical (default: vertical)",
200
+ "size: sm|md|lg (default: md)",
201
+ "label: string - group label",
202
+ "helperText: string - helper text below the group",
203
+ "error: boolean | string - error styling and message",
204
+ "disabled: boolean - disable all options",
205
+ "wrapperClassName/groupClassName - explicit styling targets for wrapper and group",
206
+ "RadioGroup.Item supports helperText (preferred) and description (legacy alias) plus controlClassName/contentClassName for item-level styling"
207
+ ],
208
+ "a11yRules": [
209
+ "A11Y_RADIO_GROUP",
210
+ "A11Y_LABEL_REQUIRED",
211
+ "A11Y_TARGET_SIZE_MIN"
212
+ ]
213
+ },
214
+ "ai": {
215
+ "compositionPattern": "compound",
216
+ "subComponents": [
217
+ "Item"
218
+ ]
219
+ },
220
+ "provenance": {
221
+ "source": "migrated",
222
+ "verified": false,
223
+ "frameworkSupport": "native",
224
+ "extractedAt": "2026-03-13T23:19:02.692Z"
225
+ }
226
+ }
@@ -0,0 +1,131 @@
1
+ {
2
+ "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
+ "name": "ScrollArea",
4
+ "description": "A styled scrollable container with thin scrollbars and optional fade indicators.",
5
+ "category": "layout",
6
+ "tags": [
7
+ "scroll",
8
+ "overflow",
9
+ "scrollbar",
10
+ "container",
11
+ "layout"
12
+ ],
13
+ "status": "stable",
14
+ "sourcePath": "src/components/ScrollArea/index.tsx",
15
+ "exportName": "ScrollArea",
16
+ "propsSummary": [
17
+ "children: node (required)",
18
+ "orientation: horizontal|vertical|both (default: vertical)",
19
+ "scrollbarVisibility: auto|always|hover (default: auto)",
20
+ "showFades: boolean (default: false)",
21
+ "className: string"
22
+ ],
23
+ "props": {
24
+ "children": {
25
+ "type": "node",
26
+ "description": "Scrollable content",
27
+ "required": true
28
+ },
29
+ "orientation": {
30
+ "type": "enum",
31
+ "description": "Scroll direction",
32
+ "default": "vertical",
33
+ "required": false,
34
+ "values": [
35
+ "horizontal",
36
+ "vertical",
37
+ "both"
38
+ ]
39
+ },
40
+ "scrollbarVisibility": {
41
+ "type": "enum",
42
+ "description": "When to show the scrollbar",
43
+ "default": "auto",
44
+ "required": false,
45
+ "values": [
46
+ "auto",
47
+ "always",
48
+ "hover"
49
+ ]
50
+ },
51
+ "showFades": {
52
+ "type": "boolean",
53
+ "description": "Show gradient fade indicators at scroll edges",
54
+ "default": "false",
55
+ "required": false
56
+ },
57
+ "className": {
58
+ "type": "string",
59
+ "description": "Additional class name",
60
+ "required": false
61
+ }
62
+ },
63
+ "usage": {
64
+ "when": [
65
+ "Content overflows its container and needs scrolling",
66
+ "Horizontal tab bars or chip lists that may overflow",
67
+ "Scrollable panels, sidebars, or dropdown content",
68
+ "Any area where native scrollbars look too heavy"
69
+ ],
70
+ "whenNot": [
71
+ "Page-level scrolling (use native body scroll)",
72
+ "Very short content that never overflows"
73
+ ],
74
+ "guidelines": [
75
+ "Use `orientation` to constrain scroll direction",
76
+ "Use `showFades` to hint at hidden content beyond the viewport",
77
+ "The `hover` scrollbar visibility keeps the UI clean until the user interacts",
78
+ "Combine with `orientation=\"horizontal\"` for tab bars and chip rows"
79
+ ],
80
+ "accessibility": [
81
+ "Preserves native scroll behavior and keyboard support",
82
+ "Scrollbar is visible on focus for keyboard users",
83
+ "Respects prefers-reduced-motion for fade transitions"
84
+ ]
85
+ },
86
+ "examples": [
87
+ {
88
+ "name": "Vertical",
89
+ "description": "Vertical scrollable area with thin scrollbar.",
90
+ "code": "<ScrollArea style={{ height: '200px' }}>\n {/* Long content */}\n</ScrollArea>"
91
+ },
92
+ {
93
+ "name": "Horizontal",
94
+ "description": "Horizontal scrollable area for overflowing inline content like tabs or chips.",
95
+ "code": "<ScrollArea orientation=\"horizontal\">\n <div style={{ display: 'flex', gap: '8px' }}>\n {tags.map(tag => <Chip key={tag}>{tag}</Chip>)}\n </div>\n</ScrollArea>"
96
+ },
97
+ {
98
+ "name": "With Fades",
99
+ "description": "Fade indicators show when content is scrollable in either direction.",
100
+ "code": "<ScrollArea orientation=\"horizontal\" showFades>\n {/* Overflowing content */}\n</ScrollArea>"
101
+ },
102
+ {
103
+ "name": "Hover Scrollbar",
104
+ "description": "Scrollbar is hidden until the user hovers over the scroll area.",
105
+ "code": "<ScrollArea scrollbarVisibility=\"hover\" style={{ height: '200px' }}>\n {/* Content */}\n</ScrollArea>"
106
+ }
107
+ ],
108
+ "contract": {
109
+ "propsSummary": [
110
+ "orientation: horizontal|vertical|both - scroll direction",
111
+ "scrollbarVisibility: auto|always|hover - scrollbar display mode",
112
+ "showFades: boolean - gradient edge indicators"
113
+ ]
114
+ },
115
+ "ai": {
116
+ "compositionPattern": "compound",
117
+ "subComponents": [
118
+ "Root"
119
+ ],
120
+ "commonPatterns": [
121
+ "<ScrollArea orientation=\"horizontal\"><div style={{ display: \"flex\", gap: 8 }}>{items}</div></ScrollArea>",
122
+ "<ScrollArea style={{ height: 300 }}>{longContent}</ScrollArea>"
123
+ ]
124
+ },
125
+ "provenance": {
126
+ "source": "migrated",
127
+ "verified": false,
128
+ "frameworkSupport": "native",
129
+ "extractedAt": "2026-03-13T23:19:02.867Z"
130
+ }
131
+ }
@@ -0,0 +1,269 @@
1
+ {
2
+ "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
+ "name": "Select",
4
+ "description": "Dropdown for choosing from a list of options. Use when there are more than 4-5 choices that would clutter the UI.",
5
+ "category": "forms",
6
+ "tags": [
7
+ "select",
8
+ "dropdown",
9
+ "form",
10
+ "options",
11
+ "picker"
12
+ ],
13
+ "status": "stable",
14
+ "sourcePath": "src/components/Select/index.tsx",
15
+ "exportName": "Select",
16
+ "propsSummary": [
17
+ "children: node",
18
+ "value: string",
19
+ "defaultValue: string",
20
+ "onValueChange: function",
21
+ "onChange: function",
22
+ "open: boolean",
23
+ "defaultOpen: boolean",
24
+ "onOpenChange: function",
25
+ "required: boolean",
26
+ "name: string",
27
+ "placeholder: string",
28
+ "options: array",
29
+ "size: sm|md|lg (default: md)",
30
+ "className: string",
31
+ "label: string",
32
+ "helperText: string",
33
+ "error: union",
34
+ "disabled: boolean"
35
+ ],
36
+ "props": {
37
+ "children": {
38
+ "type": "node",
39
+ "description": "Select trigger and content",
40
+ "required": false
41
+ },
42
+ "value": {
43
+ "type": "string",
44
+ "description": "Controlled selected value",
45
+ "required": false
46
+ },
47
+ "defaultValue": {
48
+ "type": "string",
49
+ "description": "Default selected value (uncontrolled)",
50
+ "required": false
51
+ },
52
+ "onValueChange": {
53
+ "type": "function",
54
+ "description": "Called when selection changes",
55
+ "required": false
56
+ },
57
+ "onChange": {
58
+ "type": "function",
59
+ "description": "Alias for onValueChange",
60
+ "required": false
61
+ },
62
+ "open": {
63
+ "type": "boolean",
64
+ "description": "Controlled open state of the dropdown",
65
+ "required": false
66
+ },
67
+ "defaultOpen": {
68
+ "type": "boolean",
69
+ "description": "Initial open state for uncontrolled usage",
70
+ "default": "false",
71
+ "required": false
72
+ },
73
+ "onOpenChange": {
74
+ "type": "function",
75
+ "description": "Called when dropdown open state changes",
76
+ "required": false
77
+ },
78
+ "required": {
79
+ "type": "boolean",
80
+ "description": "Whether a selection is required",
81
+ "required": false
82
+ },
83
+ "name": {
84
+ "type": "string",
85
+ "description": "Form field name",
86
+ "required": false
87
+ },
88
+ "placeholder": {
89
+ "type": "string",
90
+ "description": "Placeholder text when no value selected",
91
+ "required": false
92
+ },
93
+ "options": {
94
+ "type": "array",
95
+ "description": "Convenience options array for simple selects (alternative to compound Select.Item children)",
96
+ "required": false
97
+ },
98
+ "size": {
99
+ "type": "enum",
100
+ "description": "Size variant",
101
+ "default": "md",
102
+ "required": false,
103
+ "values": [
104
+ "sm",
105
+ "md",
106
+ "lg"
107
+ ]
108
+ },
109
+ "className": {
110
+ "type": "string",
111
+ "description": "Wrapper class name",
112
+ "required": false
113
+ },
114
+ "label": {
115
+ "type": "string",
116
+ "description": "Visible label text above the select",
117
+ "required": false
118
+ },
119
+ "helperText": {
120
+ "type": "string",
121
+ "description": "Helper text shown below the select",
122
+ "required": false
123
+ },
124
+ "error": {
125
+ "type": "union",
126
+ "description": "Show error styling. When a string is provided, it is displayed as an error message.",
127
+ "required": false
128
+ },
129
+ "disabled": {
130
+ "type": "boolean",
131
+ "description": "Disable the select",
132
+ "default": "false",
133
+ "required": false
134
+ }
135
+ },
136
+ "usage": {
137
+ "when": [
138
+ "Choosing from a predefined list of options",
139
+ "More than 4-5 options that would clutter UI as radio buttons",
140
+ "Space-constrained forms",
141
+ "When users need to see all options at once"
142
+ ],
143
+ "whenNot": [
144
+ "Very few options (2-3) - use radio buttons",
145
+ "Users might type custom values - use Combobox",
146
+ "Multiple selections needed - use Checkbox group or MultiSelect",
147
+ "Actions, not selection - use Menu"
148
+ ],
149
+ "guidelines": [
150
+ "Include a placeholder that explains what to select",
151
+ "Use label prop for accessible field labeling",
152
+ "Use helperText for guidance and error for validation messages",
153
+ "Group related options with SelectGroup",
154
+ "Keep option text concise",
155
+ "Order options logically (alphabetical, by frequency, or by category)"
156
+ ],
157
+ "accessibility": [
158
+ "Full keyboard navigation support",
159
+ "Type-ahead search within options",
160
+ "Proper ARIA roles and attributes"
161
+ ]
162
+ },
163
+ "examples": [
164
+ {
165
+ "name": "Default",
166
+ "description": "Basic select dropdown",
167
+ "code": "<StatefulSelect placeholder=\"Select a fruit\">\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"apple\">Apple</Select.Item>\n <Select.Item value=\"banana\">Banana</Select.Item>\n <Select.Item value=\"orange\">Orange</Select.Item>\n <Select.Item value=\"grape\">Grape</Select.Item>\n </Select.Content>\n</StatefulSelect>"
168
+ },
169
+ {
170
+ "name": "With Groups",
171
+ "description": "Options organized into groups",
172
+ "code": "<StatefulSelect placeholder=\"Select a country\">\n <Select.Trigger />\n <Select.Content>\n <Select.Group>\n <Select.GroupLabel>North America</Select.GroupLabel>\n <Select.Item value=\"us\">United States</Select.Item>\n <Select.Item value=\"ca\">Canada</Select.Item>\n <Select.Item value=\"mx\">Mexico</Select.Item>\n </Select.Group>\n <Select.Group>\n <Select.GroupLabel>Europe</Select.GroupLabel>\n <Select.Item value=\"uk\">United Kingdom</Select.Item>\n <Select.Item value=\"de\">Germany</Select.Item>\n <Select.Item value=\"fr\">France</Select.Item>\n </Select.Group>\n </Select.Content>\n</StatefulSelect>"
173
+ },
174
+ {
175
+ "name": "With Label and Helper Text",
176
+ "description": "Select with built-in label and helper text",
177
+ "code": "<StatefulSelect\n label=\"Timezone\"\n placeholder=\"Select a timezone\"\n helperText=\"Used for reminders and calendar notifications.\"\n>\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"pt\">Pacific Time</Select.Item>\n <Select.Item value=\"mt\">Mountain Time</Select.Item>\n <Select.Item value=\"ct\">Central Time</Select.Item>\n <Select.Item value=\"et\">Eastern Time</Select.Item>\n </Select.Content>\n</StatefulSelect>"
178
+ },
179
+ {
180
+ "name": "Error State",
181
+ "description": "Validation error with message",
182
+ "code": "<Select\n label=\"Country\"\n placeholder=\"Select a country\"\n error=\"Please select a country\"\n>\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"us\">United States</Select.Item>\n <Select.Item value=\"uk\">United Kingdom</Select.Item>\n </Select.Content>\n</Select>"
183
+ },
184
+ {
185
+ "name": "With Disabled Options",
186
+ "description": "Some options are disabled",
187
+ "code": "<StatefulSelect placeholder=\"Select a plan\">\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"free\">Free</Select.Item>\n <Select.Item value=\"pro\">Pro</Select.Item>\n <Select.Item value=\"enterprise\" disabled>Enterprise (Contact Sales)</Select.Item>\n </Select.Content>\n</StatefulSelect>"
188
+ },
189
+ {
190
+ "name": "Scrollable List",
191
+ "description": "Long list with scroll hint — shows 4 items with half-peek of the 5th to indicate more",
192
+ "code": "<StatefulSelect placeholder=\"Select a timezone\">\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"utc-8\">Pacific Time (UTC-8)</Select.Item>\n <Select.Item value=\"utc-7\">Mountain Time (UTC-7)</Select.Item>\n <Select.Item value=\"utc-6\">Central Time (UTC-6)</Select.Item>\n <Select.Item value=\"utc-5\">Eastern Time (UTC-5)</Select.Item>\n <Select.Item value=\"utc-4\">Atlantic Time (UTC-4)</Select.Item>\n <Select.Item value=\"utc+0\">GMT (UTC+0)</Select.Item>\n <Select.Item value=\"utc+1\">Central European (UTC+1)</Select.Item>\n <Select.Item value=\"utc+5.5\">India Standard (UTC+5:30)</Select.Item>\n <Select.Item value=\"utc+8\">China Standard (UTC+8)</Select.Item>\n <Select.Item value=\"utc+9\">Japan Standard (UTC+9)</Select.Item>\n </Select.Content>\n</StatefulSelect>"
193
+ },
194
+ {
195
+ "name": "Custom Max Visible Items",
196
+ "description": "Show 6 items before scrolling with half-peek scroll hint",
197
+ "code": "<StatefulSelect placeholder=\"Select a color\">\n <Select.Trigger />\n <Select.Content maxVisibleItems={6}>\n <Select.Item value=\"red\">Red</Select.Item>\n <Select.Item value=\"orange\">Orange</Select.Item>\n <Select.Item value=\"yellow\">Yellow</Select.Item>\n <Select.Item value=\"green\">Green</Select.Item>\n <Select.Item value=\"blue\">Blue</Select.Item>\n <Select.Item value=\"indigo\">Indigo</Select.Item>\n <Select.Item value=\"violet\">Violet</Select.Item>\n <Select.Item value=\"pink\">Pink</Select.Item>\n <Select.Item value=\"teal\">Teal</Select.Item>\n <Select.Item value=\"cyan\">Cyan</Select.Item>\n </Select.Content>\n</StatefulSelect>"
198
+ },
199
+ {
200
+ "name": "Disabled",
201
+ "description": "Disabled select",
202
+ "code": "<Select disabled placeholder=\"Select an option\">\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"1\">Option 1</Select.Item>\n </Select.Content>\n</Select>"
203
+ },
204
+ {
205
+ "name": "Options Prop",
206
+ "description": "Convenience API for simple lists without manual Select.Item composition",
207
+ "code": "<StatefulSelect\n placeholder=\"Select a team\"\n options={[\n { value: 'eng', label: 'Engineering' },\n { value: 'design', label: 'Design' },\n { value: 'pm', label: 'Product' },\n ]}\n>\n <Select.Trigger />\n <Select.Content />\n</StatefulSelect>"
208
+ }
209
+ ],
210
+ "relations": [
211
+ {
212
+ "component": "Menu",
213
+ "relationship": "alternative",
214
+ "note": "Use Menu for action-based dropdowns"
215
+ },
216
+ {
217
+ "component": "Input",
218
+ "relationship": "sibling",
219
+ "note": "Use Input for free-form text entry"
220
+ },
221
+ {
222
+ "component": "Checkbox",
223
+ "relationship": "alternative",
224
+ "note": "Use Checkbox group for multiple selections"
225
+ }
226
+ ],
227
+ "contract": {
228
+ "propsSummary": [
229
+ "value: string | null - controlled selected value",
230
+ "onValueChange: (value: string | null) => void - selection handler",
231
+ "onChange: (value: string | null) => void - alias for onValueChange",
232
+ "label: string - visible label text",
233
+ "helperText: string - helper text below field",
234
+ "error: boolean | string - error styling and message",
235
+ "placeholder: string - placeholder text",
236
+ "disabled: boolean - disable select",
237
+ "size: sm|md|lg (default: md)",
238
+ "options: SelectOption[] - convenience API for simple option lists",
239
+ "maxVisibleItems: number - max visible options before scrolling (default 4)"
240
+ ],
241
+ "a11yRules": [
242
+ "A11Y_SELECT_KEYBOARD",
243
+ "A11Y_SELECT_LABEL"
244
+ ]
245
+ },
246
+ "ai": {
247
+ "compositionPattern": "compound",
248
+ "subComponents": [
249
+ "Trigger",
250
+ "Content",
251
+ "Item",
252
+ "Group",
253
+ "GroupLabel"
254
+ ],
255
+ "requiredChildren": [
256
+ "Trigger",
257
+ "Content"
258
+ ],
259
+ "commonPatterns": [
260
+ "<Select placeholder=\"Select option\"><Select.Trigger /><Select.Content><Select.Item value=\"opt1\">{label1}</Select.Item><Select.Item value=\"opt2\">{label2}</Select.Item></Select.Content></Select>"
261
+ ]
262
+ },
263
+ "provenance": {
264
+ "source": "migrated",
265
+ "verified": false,
266
+ "frameworkSupport": "native",
267
+ "extractedAt": "2026-03-13T23:19:03.116Z"
268
+ }
269
+ }