@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,176 @@
1
+ {
2
+ "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
+ "name": "Progress",
4
+ "description": "Visual indicator of task completion or loading state. Available in linear and circular variants.",
5
+ "category": "feedback",
6
+ "tags": [
7
+ "progress",
8
+ "loading",
9
+ "indicator",
10
+ "percentage",
11
+ "status"
12
+ ],
13
+ "status": "stable",
14
+ "sourcePath": "src/components/Progress/index.tsx",
15
+ "exportName": "Progress",
16
+ "propsSummary": [
17
+ "value: number (default: null)",
18
+ "min: number (default: 0)",
19
+ "max: number (default: 100)",
20
+ "size: sm|md|lg (default: md)",
21
+ "variant: default|success|warning|danger (default: default)",
22
+ "label: string",
23
+ "showValue: boolean (default: false)",
24
+ "formatValue: function"
25
+ ],
26
+ "props": {
27
+ "value": {
28
+ "type": "number",
29
+ "description": "Current progress value (0-100). Null for indeterminate.",
30
+ "default": "null",
31
+ "required": false
32
+ },
33
+ "min": {
34
+ "type": "number",
35
+ "description": "Minimum value",
36
+ "default": "0",
37
+ "required": false
38
+ },
39
+ "max": {
40
+ "type": "number",
41
+ "description": "Maximum value",
42
+ "default": "100",
43
+ "required": false
44
+ },
45
+ "size": {
46
+ "type": "enum",
47
+ "description": "Size of the progress bar",
48
+ "default": "md",
49
+ "required": false,
50
+ "values": [
51
+ "sm",
52
+ "md",
53
+ "lg"
54
+ ]
55
+ },
56
+ "variant": {
57
+ "type": "enum",
58
+ "description": "Color variant",
59
+ "default": "default",
60
+ "required": false,
61
+ "values": [
62
+ "default",
63
+ "success",
64
+ "warning",
65
+ "danger"
66
+ ]
67
+ },
68
+ "label": {
69
+ "type": "string",
70
+ "description": "Label text above the progress bar",
71
+ "required": false
72
+ },
73
+ "showValue": {
74
+ "type": "boolean",
75
+ "description": "Show percentage value",
76
+ "default": "false",
77
+ "required": false
78
+ },
79
+ "formatValue": {
80
+ "type": "function",
81
+ "description": "Custom formatter for displayed progress value",
82
+ "required": false
83
+ }
84
+ },
85
+ "usage": {
86
+ "when": [
87
+ "Showing upload/download progress",
88
+ "Displaying task completion percentage",
89
+ "Form completion indicators",
90
+ "Loading states with known duration"
91
+ ],
92
+ "whenNot": [
93
+ "Unknown loading duration (use Spinner)",
94
+ "Step-based progress (use Stepper)",
95
+ "Status without percentage (use Badge)"
96
+ ],
97
+ "guidelines": [
98
+ "Use determinate progress when you know the completion percentage",
99
+ "Use indeterminate for unknown durations",
100
+ "Include a label for context when the purpose isnt obvious",
101
+ "Use appropriate color variants for success/warning/danger states",
102
+ "Determinate values are clamped to the min/max range for display"
103
+ ],
104
+ "accessibility": [
105
+ "Uses role=\"progressbar\" with aria-valuenow",
106
+ "Label is associated with the progress bar",
107
+ "State changes are announced to screen readers"
108
+ ]
109
+ },
110
+ "examples": [
111
+ {
112
+ "name": "Default",
113
+ "description": "Basic progress bar with percentage",
114
+ "code": "<Progress value={60} label=\"Uploading...\" showValue />"
115
+ },
116
+ {
117
+ "name": "Variants",
118
+ "description": "Different color variants for different states",
119
+ "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>\n <Progress value={75} variant=\"default\" label=\"Processing\" showValue />\n <Progress value={100} variant=\"success\" label=\"Complete\" showValue />\n <Progress value={80} variant=\"warning\" label=\"Almost full\" showValue />\n <Progress value={95} variant=\"danger\" label=\"Storage critical\" showValue />\n</div>"
120
+ },
121
+ {
122
+ "name": "Sizes",
123
+ "description": "Different progress bar sizes",
124
+ "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>\n <Progress value={50} size=\"sm\" label=\"Small\" />\n <Progress value={50} size=\"md\" label=\"Medium\" />\n <Progress value={50} size=\"lg\" label=\"Large\" />\n</div>"
125
+ },
126
+ {
127
+ "name": "Indeterminate",
128
+ "description": "Loading state with unknown duration",
129
+ "code": "<Progress value={null} label=\"Loading...\" />"
130
+ },
131
+ {
132
+ "name": "Circular",
133
+ "description": "Circular progress indicator",
134
+ "code": "<div style={{ display: 'flex', gap: '24px', alignItems: 'center' }}>\n <CircularProgress value={25} size=\"sm\" />\n <CircularProgress value={50} size=\"md\" showValue />\n <CircularProgress value={75} size=\"lg\" showValue variant=\"success\" />\n <CircularProgress value={null} size=\"md\" />\n</div>"
135
+ }
136
+ ],
137
+ "relations": [
138
+ {
139
+ "component": "Badge",
140
+ "relationship": "alternative",
141
+ "note": "Use Badge for status without percentage"
142
+ },
143
+ {
144
+ "component": "Alert",
145
+ "relationship": "sibling",
146
+ "note": "Use Alert for completion messages"
147
+ }
148
+ ],
149
+ "contract": {
150
+ "propsSummary": [
151
+ "value: number|null - progress percentage (null for indeterminate)",
152
+ "size: sm|md|lg - bar thickness",
153
+ "variant: default|success|warning|danger - color",
154
+ "label: string - descriptive label",
155
+ "showValue: boolean - display percentage",
156
+ "Determinate display values are clamped (and invalid min/max ranges render as 0%)"
157
+ ],
158
+ "a11yRules": [
159
+ "A11Y_PROGRESS_ROLE",
160
+ "A11Y_PROGRESS_VALUE"
161
+ ]
162
+ },
163
+ "ai": {
164
+ "compositionPattern": "compound",
165
+ "subComponents": [
166
+ "Root",
167
+ "Circular"
168
+ ]
169
+ },
170
+ "provenance": {
171
+ "source": "migrated",
172
+ "verified": false,
173
+ "frameworkSupport": "native",
174
+ "extractedAt": "2026-03-13T23:19:02.339Z"
175
+ }
176
+ }
@@ -0,0 +1,211 @@
1
+ {
2
+ "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
+ "name": "Prompt",
4
+ "description": "Multi-line input with toolbar for AI/chat interfaces",
5
+ "category": "ai",
6
+ "tags": [
7
+ "prompt",
8
+ "chat",
9
+ "ai",
10
+ "input",
11
+ "textarea",
12
+ "form"
13
+ ],
14
+ "status": "stable",
15
+ "sourcePath": "src/components/Prompt/index.tsx",
16
+ "exportName": "Prompt",
17
+ "propsSummary": [
18
+ "children: node (required)",
19
+ "value: string",
20
+ "defaultValue: string (default: )",
21
+ "onChange: function",
22
+ "onSubmit: function",
23
+ "placeholder: string (default: Ask, Search or Chat...)",
24
+ "disabled: boolean (default: false)",
25
+ "loading: boolean (default: false)",
26
+ "minRows: number (default: 1)",
27
+ "maxRows: number (default: 8)",
28
+ "autoResize: boolean (default: true)",
29
+ "submitOnEnter: boolean (default: true)",
30
+ "variant: default|fixed|sticky (default: default)"
31
+ ],
32
+ "props": {
33
+ "children": {
34
+ "type": "node",
35
+ "description": "Prompt composition using Prompt sub-components",
36
+ "required": true
37
+ },
38
+ "value": {
39
+ "type": "string",
40
+ "description": "Controlled input value",
41
+ "required": false
42
+ },
43
+ "defaultValue": {
44
+ "type": "string",
45
+ "description": "Uncontrolled default value",
46
+ "default": "",
47
+ "required": false
48
+ },
49
+ "onChange": {
50
+ "type": "function",
51
+ "description": "Called when value changes",
52
+ "required": false
53
+ },
54
+ "onSubmit": {
55
+ "type": "function",
56
+ "description": "Called on form submission",
57
+ "required": false
58
+ },
59
+ "placeholder": {
60
+ "type": "string",
61
+ "description": "Placeholder text for the textarea",
62
+ "default": "Ask, Search or Chat...",
63
+ "required": false
64
+ },
65
+ "disabled": {
66
+ "type": "boolean",
67
+ "description": "Disable the entire prompt",
68
+ "default": "false",
69
+ "required": false
70
+ },
71
+ "loading": {
72
+ "type": "boolean",
73
+ "description": "Show loading state",
74
+ "default": "false",
75
+ "required": false
76
+ },
77
+ "minRows": {
78
+ "type": "number",
79
+ "description": "Minimum number of visible rows",
80
+ "default": "1",
81
+ "required": false
82
+ },
83
+ "maxRows": {
84
+ "type": "number",
85
+ "description": "Maximum number of visible rows",
86
+ "default": "8",
87
+ "required": false
88
+ },
89
+ "autoResize": {
90
+ "type": "boolean",
91
+ "description": "Enable auto-resize based on content",
92
+ "default": "true",
93
+ "required": false
94
+ },
95
+ "submitOnEnter": {
96
+ "type": "boolean",
97
+ "description": "Submit on Enter (Shift+Enter for newline)",
98
+ "default": "true",
99
+ "required": false
100
+ },
101
+ "variant": {
102
+ "type": "enum",
103
+ "description": "Visual/positioning variant",
104
+ "default": "default",
105
+ "required": false,
106
+ "values": [
107
+ "default",
108
+ "fixed",
109
+ "sticky"
110
+ ]
111
+ }
112
+ },
113
+ "usage": {
114
+ "when": [
115
+ "Building chat or AI assistant interfaces",
116
+ "Need multi-line input with submit action",
117
+ "Require toolbar with actions like attachments or model selection"
118
+ ],
119
+ "whenNot": [
120
+ "Simple single-line text input (use Input)",
121
+ "Basic multi-line without toolbar (use Textarea)",
122
+ "Search-only interface (use Input with search variant)"
123
+ ],
124
+ "guidelines": [
125
+ "Always provide an onSubmit handler",
126
+ "Use loading state during API calls",
127
+ "Prompt.Textarea forwards native textarea props (autoComplete, inputMode, aria-*, data-*, handlers)",
128
+ "Prompt.Textarea composes your onChange/onKeyDown handlers with built-in submit and auto-resize behavior",
129
+ "Consider showing usage/token limits for AI contexts"
130
+ ],
131
+ "accessibility": [
132
+ "Enter submits, Shift+Enter for newline",
133
+ "Submit button is keyboard accessible",
134
+ "Loading state prevents duplicate submissions"
135
+ ]
136
+ },
137
+ "examples": [
138
+ {
139
+ "name": "Basic",
140
+ "description": "Simple prompt with submit button",
141
+ "code": "<Prompt onSubmit={(value) => console.log(value)}>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions />\n <Prompt.Info>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
142
+ },
143
+ {
144
+ "name": "With Actions",
145
+ "description": "Prompt with attachment and mode buttons",
146
+ "code": "<Prompt onSubmit={(value) => console.log(value)}>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions>\n <Prompt.ActionButton aria-label=\"Add attachment\">\n +\n </Prompt.ActionButton>\n <Prompt.ModeButton>Auto</Prompt.ModeButton>\n </Prompt.Actions>\n <Prompt.Info>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
147
+ },
148
+ {
149
+ "name": "With Usage",
150
+ "description": "Shows token usage indicator",
151
+ "code": "<Prompt onSubmit={(value) => console.log(value)}>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions>\n <Prompt.ActionButton aria-label=\"Add attachment\">\n +\n </Prompt.ActionButton>\n <Prompt.ModeButton active>Auto</Prompt.ModeButton>\n </Prompt.Actions>\n <Prompt.Info>\n <Prompt.Usage>52% used</Prompt.Usage>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
152
+ },
153
+ {
154
+ "name": "Loading State",
155
+ "description": "During API submission",
156
+ "code": "<Prompt\n onSubmit={(value) => console.log(value)}\n loading\n defaultValue=\"Tell me about the weather...\"\n>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions>\n <Prompt.ActionButton aria-label=\"Add attachment\">\n +\n </Prompt.ActionButton>\n <Prompt.ModeButton>Auto</Prompt.ModeButton>\n </Prompt.Actions>\n <Prompt.Info>\n <Prompt.Usage>52% used</Prompt.Usage>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
157
+ },
158
+ {
159
+ "name": "Disabled",
160
+ "description": "Non-interactive prompt",
161
+ "code": "<Prompt onSubmit={(value) => console.log(value)} disabled>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions>\n <Prompt.ActionButton aria-label=\"Add attachment\">\n +\n </Prompt.ActionButton>\n </Prompt.Actions>\n <Prompt.Info>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
162
+ }
163
+ ],
164
+ "relations": [
165
+ {
166
+ "component": "Input",
167
+ "relationship": "alternative",
168
+ "note": "Use Input for simple single-line text input"
169
+ },
170
+ {
171
+ "component": "Textarea",
172
+ "relationship": "alternative",
173
+ "note": "Use Textarea for multi-line without toolbar"
174
+ }
175
+ ],
176
+ "contract": {
177
+ "propsSummary": [
178
+ "value: string - controlled input value",
179
+ "onSubmit: (value: string) => void - submission handler",
180
+ "placeholder: string - hint text (default: \"Ask, Search or Chat...\")",
181
+ "disabled: boolean - disables interaction",
182
+ "loading: boolean - shows loading state",
183
+ "minRows/maxRows: number - row constraints (default: 1/8)",
184
+ "submitOnEnter: boolean - Enter key behavior (default: true)",
185
+ "Prompt.Textarea accepts native textarea props and optional aria-label override"
186
+ ],
187
+ "a11yRules": [
188
+ "A11Y_TEXTAREA_LABEL",
189
+ "A11Y_BUTTON_LABEL"
190
+ ]
191
+ },
192
+ "ai": {
193
+ "compositionPattern": "compound",
194
+ "subComponents": [
195
+ "Textarea",
196
+ "Toolbar",
197
+ "Actions",
198
+ "Info",
199
+ "ActionButton",
200
+ "ModeButton",
201
+ "Usage",
202
+ "Submit"
203
+ ]
204
+ },
205
+ "provenance": {
206
+ "source": "migrated",
207
+ "verified": false,
208
+ "frameworkSupport": "native",
209
+ "extractedAt": "2026-03-13T23:19:02.513Z"
210
+ }
211
+ }
@@ -11,13 +11,77 @@
11
11
  flex-direction: column;
12
12
  border-radius: var(--fui-radius-xl, $fui-radius-xl);
13
13
  overflow: hidden;
14
+ position: relative;
15
+
16
+ // Beam border — rotating conic gradient clipped to a 1px border
17
+ &::before,
18
+ &::after {
19
+ content: '';
20
+ position: absolute;
21
+ inset: 0;
22
+ border-radius: inherit;
23
+ pointer-events: none;
24
+ }
25
+
26
+ // Gradient layer (behind everything)
27
+ &::before {
28
+ inset: -1px;
29
+ z-index: 0;
30
+ background: conic-gradient(
31
+ from var(--beam-angle, 0deg) at 50% 50%,
32
+ transparent 0%,
33
+ transparent 25%,
34
+ var(--fui-color-accent, $fui-color-accent) 45%,
35
+ transparent 50%,
36
+ transparent 55%,
37
+ color-mix(in srgb, var(--fui-color-accent, $fui-color-accent) 40%, transparent) 70%,
38
+ transparent 75%,
39
+ transparent 100%
40
+ );
41
+ animation: beam-rotate 4s linear infinite;
42
+ opacity: 0.6;
43
+ transition: opacity 300ms ease;
44
+ }
45
+
46
+ // Mask layer — covers the interior, leaving only the 1px border visible
47
+ &::after {
48
+ inset: 1px;
49
+ z-index: 1;
50
+ background: var(--fui-bg-elevated, $fui-bg-elevated);
51
+ }
52
+
53
+ // Content must sit above the mask
54
+ > * {
55
+ position: relative;
56
+ z-index: 2;
57
+ }
58
+
59
+ &:focus-within::before {
60
+ opacity: 1;
61
+ }
14
62
 
15
63
  &[data-disabled] {
16
64
  opacity: 0.5;
17
65
  pointer-events: none;
66
+
67
+ &::before {
68
+ animation-play-state: paused;
69
+ opacity: 0.2;
70
+ }
18
71
  }
19
72
  }
20
73
 
74
+ @keyframes beam-rotate {
75
+ from { --beam-angle: 0deg; }
76
+ to { --beam-angle: 360deg; }
77
+ }
78
+
79
+ @property --beam-angle {
80
+ syntax: '<angle>';
81
+ initial-value: 0deg;
82
+ inherits: false;
83
+ }
84
+
21
85
  // Fixed variant - for viewport-fixed prompts (centered to page)
22
86
  .fixed {
23
87
  position: fixed;
@@ -71,9 +135,11 @@
71
135
  color: var(--fui-text-tertiary, $fui-text-tertiary);
72
136
  }
73
137
 
138
+ // Focus is shown on the prompt container via :focus-within instead
139
+ &:focus,
74
140
  &:focus-visible {
75
- @include focus-ring;
76
- border-radius: var(--fui-radius-md, $fui-radius-md);
141
+ outline: none;
142
+ box-shadow: none;
77
143
  }
78
144
 
79
145
  &:disabled {
@@ -81,6 +147,52 @@
81
147
  }
82
148
  }
83
149
 
150
+ // ============================================
151
+ // Tabs (floating above the prompt body)
152
+ // ============================================
153
+
154
+ .tabs {
155
+ display: flex;
156
+ justify-content: center;
157
+ margin-bottom: calc(-1 * var(--fui-space-1, $fui-space-1)); // overlap the prompt border
158
+ position: relative;
159
+ z-index: 1;
160
+ }
161
+
162
+ .tabsInner {
163
+ display: inline-flex;
164
+ gap: 1px;
165
+ background-color: var(--fui-bg-elevated, $fui-bg-elevated);
166
+ border-radius: var(--fui-radius-lg, $fui-radius-lg) var(--fui-radius-lg, $fui-radius-lg) 0 0;
167
+ padding: 3px 3px 0 3px;
168
+ border: 1px solid var(--fui-border, $fui-border);
169
+ border-bottom: none;
170
+ }
171
+
172
+ .tabButton {
173
+ @include button-reset;
174
+
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: center;
178
+ padding: var(--fui-space-1, $fui-space-1) var(--fui-space-3, $fui-space-3);
179
+ border-radius: var(--fui-radius-md, $fui-radius-md) var(--fui-radius-md, $fui-radius-md) 0 0;
180
+ font-size: var(--fui-font-size-sm, $fui-font-size-sm);
181
+ font-weight: var(--fui-font-weight-medium, $fui-font-weight-medium);
182
+ color: var(--fui-text-tertiary, $fui-text-tertiary);
183
+ transition: all 120ms ease;
184
+ white-space: nowrap;
185
+
186
+ &:hover {
187
+ color: var(--fui-text-primary, $fui-text-primary);
188
+ }
189
+ }
190
+
191
+ .tabButtonActive {
192
+ background-color: var(--fui-bg-secondary, $fui-bg-secondary);
193
+ color: var(--fui-text-primary, $fui-text-primary);
194
+ }
195
+
84
196
  // ============================================
85
197
  // Toolbar
86
198
  // ============================================
@@ -102,7 +214,9 @@
102
214
  .actions {
103
215
  display: flex;
104
216
  align-items: center;
217
+ align-self: flex-end;
105
218
  gap: var(--fui-space-1, $fui-space-1);
219
+ padding: 0 var(--fui-space-2, $fui-space-2) var(--fui-space-2, $fui-space-2) 0;
106
220
  }
107
221
 
108
222
  .info {
@@ -201,7 +315,7 @@
201
315
  height: 2rem;
202
316
  border-radius: var(--fui-radius-full, $fui-radius-full);
203
317
  background-color: var(--fui-color-accent, $fui-color-accent);
204
- color: var(--fui-text-inverse, $fui-text-inverse);
318
+ color: var(--fui-color-on-accent, $fui-color-on-accent);
205
319
 
206
320
  &:hover:not(:disabled) {
207
321
  background-color: var(--fui-color-accent-hover, $fui-color-accent-hover);
@@ -55,6 +55,20 @@ export interface PromptToolbarProps {
55
55
  className?: string;
56
56
  }
57
57
 
58
+ export interface PromptTabsProps {
59
+ children: React.ReactNode;
60
+ className?: string;
61
+ }
62
+
63
+ export interface PromptTabProps {
64
+ children: React.ReactNode;
65
+ /** Whether this tab is currently active */
66
+ active?: boolean;
67
+ /** Click handler */
68
+ onClick?: React.MouseEventHandler<HTMLButtonElement>;
69
+ className?: string;
70
+ }
71
+
58
72
  export interface PromptActionsProps {
59
73
  children?: React.ReactNode;
60
74
  className?: string;
@@ -330,6 +344,28 @@ function PromptToolbar({ children, className }: PromptToolbarProps) {
330
344
  return <div className={classes}>{children}</div>;
331
345
  }
332
346
 
347
+ function PromptTabs({ children, className }: PromptTabsProps) {
348
+ const classes = [styles.tabs, className].filter(Boolean).join(' ');
349
+ return (
350
+ <div className={classes}>
351
+ <div className={styles.tabsInner}>{children}</div>
352
+ </div>
353
+ );
354
+ }
355
+
356
+ function PromptTab({ children, active = false, onClick, className }: PromptTabProps) {
357
+ const classes = [
358
+ styles.tabButton,
359
+ active && styles.tabButtonActive,
360
+ className,
361
+ ].filter(Boolean).join(' ');
362
+ return (
363
+ <button type="button" className={classes} onClick={onClick} aria-pressed={active}>
364
+ {children}
365
+ </button>
366
+ );
367
+ }
368
+
333
369
  function PromptActions({ children, className }: PromptActionsProps) {
334
370
  if (!children) return null;
335
371
  const classes = [styles.actions, className].filter(Boolean).join(' ');
@@ -444,6 +480,8 @@ function PromptSubmit({
444
480
  export const Prompt = Object.assign(PromptRoot, {
445
481
  Textarea: PromptTextarea,
446
482
  Toolbar: PromptToolbar,
483
+ Tabs: PromptTabs,
484
+ Tab: PromptTab,
447
485
  Actions: PromptActions,
448
486
  Info: PromptInfo,
449
487
  ActionButton: PromptActionButton,
@@ -456,6 +494,8 @@ export {
456
494
  PromptRoot,
457
495
  PromptTextarea,
458
496
  PromptToolbar,
497
+ PromptTabs,
498
+ PromptTab,
459
499
  PromptActions,
460
500
  PromptInfo,
461
501
  PromptActionButton,