@sixthshift/design-system 0.3.0 → 0.5.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 (518) hide show
  1. package/README.md +116 -12
  2. package/dist/components/Badge/Badge.d.ts +64 -9
  3. package/dist/components/Badge/Badge.d.ts.map +1 -1
  4. package/dist/components/Badge/Badge.js +54 -46
  5. package/dist/components/Badge/Badge.js.map +1 -1
  6. package/dist/components/Badge/index.d.ts +1 -1
  7. package/dist/components/Badge/index.d.ts.map +1 -1
  8. package/dist/components/Badge/index.js +1 -1
  9. package/dist/components/Badge/index.js.map +1 -1
  10. package/dist/components/BarChart/BarChart.d.ts +12 -0
  11. package/dist/components/BarChart/BarChart.d.ts.map +1 -1
  12. package/dist/components/BarChart/BarChart.js +12 -0
  13. package/dist/components/BarChart/BarChart.js.map +1 -1
  14. package/dist/components/Button/Button.d.ts +85 -6
  15. package/dist/components/Button/Button.d.ts.map +1 -1
  16. package/dist/components/Button/Button.js +97 -106
  17. package/dist/components/Button/Button.js.map +1 -1
  18. package/dist/components/Button/index.d.ts +1 -1
  19. package/dist/components/Button/index.d.ts.map +1 -1
  20. package/dist/components/Button/index.js +1 -1
  21. package/dist/components/Button/index.js.map +1 -1
  22. package/dist/components/Calendar/Calendar.d.ts +18 -4
  23. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  24. package/dist/components/Calendar/Calendar.js +19 -5
  25. package/dist/components/Calendar/Calendar.js.map +1 -1
  26. package/dist/components/Calendar/CalendarView.d.ts.map +1 -1
  27. package/dist/components/Calendar/CalendarView.js +10 -2
  28. package/dist/components/Calendar/CalendarView.js.map +1 -1
  29. package/dist/components/Calendar/calendar.types.d.ts +9 -0
  30. package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
  31. package/dist/components/Card/Card.d.ts +61 -2
  32. package/dist/components/Card/Card.d.ts.map +1 -1
  33. package/dist/components/Card/Card.js +99 -3
  34. package/dist/components/Card/Card.js.map +1 -1
  35. package/dist/components/Card/index.d.ts +1 -1
  36. package/dist/components/Card/index.d.ts.map +1 -1
  37. package/dist/components/Card/index.js +1 -1
  38. package/dist/components/Card/index.js.map +1 -1
  39. package/dist/components/Checkbox/Checkbox.d.ts +21 -0
  40. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  41. package/dist/components/Checkbox/Checkbox.js +22 -1
  42. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  43. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +22 -0
  44. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  45. package/dist/components/CheckboxGroup/CheckboxGroup.js +22 -0
  46. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
  47. package/dist/components/Code/Editor/Editor.js +2 -2
  48. package/dist/components/Code/Editor/Editor.js.map +1 -1
  49. package/dist/components/Code/Editor/themes.d.ts +2 -2
  50. package/dist/components/Code/Editor/themes.d.ts.map +1 -1
  51. package/dist/components/Code/Editor/themes.js +50 -32
  52. package/dist/components/Code/Editor/themes.js.map +1 -1
  53. package/dist/components/Code/ValidationStatus/ValidationStatus.d.ts.map +1 -1
  54. package/dist/components/Code/ValidationStatus/ValidationStatus.js.map +1 -1
  55. package/dist/components/DatePicker/DatePicker.d.ts +43 -0
  56. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  57. package/dist/components/DatePicker/DatePicker.js +166 -4
  58. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  59. package/dist/components/DatePicker/DateSegments.d.ts +60 -0
  60. package/dist/components/DatePicker/DateSegments.d.ts.map +1 -0
  61. package/dist/components/DatePicker/DateSegments.js +80 -0
  62. package/dist/components/DatePicker/DateSegments.js.map +1 -0
  63. package/dist/components/DatePicker/datepicker.types.d.ts +19 -1
  64. package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
  65. package/dist/components/DatePicker/index.d.ts +1 -1
  66. package/dist/components/DatePicker/index.d.ts.map +1 -1
  67. package/dist/components/DateRangePicker/DateRangePicker.d.ts +20 -2
  68. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  69. package/dist/components/DateRangePicker/DateRangePicker.js +22 -4
  70. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  71. package/dist/components/DateRangePicker/daterangepicker.types.d.ts +6 -1
  72. package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
  73. package/dist/components/DateTimePicker/DateTimePicker.d.ts +30 -2
  74. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  75. package/dist/components/DateTimePicker/DateTimePicker.js +105 -32
  76. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  77. package/dist/components/DateTimePicker/DateTimeSegments.d.ts +41 -0
  78. package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -0
  79. package/dist/components/DateTimePicker/DateTimeSegments.js +67 -0
  80. package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -0
  81. package/dist/components/DateTimePicker/datetimepicker.types.d.ts +6 -1
  82. package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
  83. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +28 -2
  84. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
  85. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +136 -58
  86. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
  87. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +6 -1
  88. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
  89. package/dist/components/Field/Field.d.ts +15 -17
  90. package/dist/components/Field/Field.d.ts.map +1 -1
  91. package/dist/components/Field/Field.js +18 -3
  92. package/dist/components/Field/Field.js.map +1 -1
  93. package/dist/components/FormField/FormField.d.ts +15 -0
  94. package/dist/components/FormField/FormField.d.ts.map +1 -1
  95. package/dist/components/FormField/FormField.js +15 -0
  96. package/dist/components/FormField/FormField.js.map +1 -1
  97. package/dist/components/HoverCard/HoverCard.d.ts +6 -0
  98. package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
  99. package/dist/components/HoverCard/HoverCard.js +6 -0
  100. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  101. package/dist/components/Input/Input.d.ts +15 -0
  102. package/dist/components/Input/Input.d.ts.map +1 -1
  103. package/dist/components/Input/Input.js +18 -3
  104. package/dist/components/Input/Input.js.map +1 -1
  105. package/dist/components/LineChart/LineChart.d.ts +17 -0
  106. package/dist/components/LineChart/LineChart.d.ts.map +1 -1
  107. package/dist/components/LineChart/LineChart.js +17 -0
  108. package/dist/components/LineChart/LineChart.js.map +1 -1
  109. package/dist/components/Markdown/Markdown.d.ts +17 -0
  110. package/dist/components/Markdown/Markdown.d.ts.map +1 -1
  111. package/dist/components/Markdown/Markdown.js +17 -0
  112. package/dist/components/Markdown/Markdown.js.map +1 -1
  113. package/dist/components/Message/Message.d.ts +49 -4
  114. package/dist/components/Message/Message.d.ts.map +1 -1
  115. package/dist/components/Message/Message.js +53 -17
  116. package/dist/components/Message/Message.js.map +1 -1
  117. package/dist/components/Message/index.d.ts +1 -1
  118. package/dist/components/Message/index.d.ts.map +1 -1
  119. package/dist/components/Modal/Modal.d.ts +36 -0
  120. package/dist/components/Modal/Modal.d.ts.map +1 -1
  121. package/dist/components/Modal/Modal.js +37 -1
  122. package/dist/components/Modal/Modal.js.map +1 -1
  123. package/dist/components/Modal/components/ModalHeader.js +1 -1
  124. package/dist/components/Modal/components/ModalHeader.js.map +1 -1
  125. package/dist/components/Popover/Popover.d.ts +29 -0
  126. package/dist/components/Popover/Popover.d.ts.map +1 -1
  127. package/dist/components/Popover/Popover.js +29 -0
  128. package/dist/components/Popover/Popover.js.map +1 -1
  129. package/dist/components/ProgressBar/ProgressBar.d.ts +14 -0
  130. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
  131. package/dist/components/ProgressBar/ProgressBar.js +14 -0
  132. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  133. package/dist/components/RadioButton/RadioButton.d.ts +26 -0
  134. package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
  135. package/dist/components/RadioButton/RadioButton.js +35 -1
  136. package/dist/components/RadioButton/RadioButton.js.map +1 -1
  137. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts +26 -0
  138. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
  139. package/dist/components/RadioButtonGroup/RadioButtonGroup.js +33 -0
  140. package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  141. package/dist/components/SearchInput/SearchInput.d.ts +10 -0
  142. package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
  143. package/dist/components/SearchInput/SearchInput.js +12 -1
  144. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  145. package/dist/components/Select/Select.d.ts +4 -5
  146. package/dist/components/Select/Select.d.ts.map +1 -1
  147. package/dist/components/Select/Select.js +4 -5
  148. package/dist/components/Select/Select.js.map +1 -1
  149. package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
  150. package/dist/components/Select/SelectDropdown.js +4 -3
  151. package/dist/components/Select/SelectDropdown.js.map +1 -1
  152. package/dist/components/Select/SelectTrigger.js +2 -2
  153. package/dist/components/Select/SelectTrigger.js.map +1 -1
  154. package/dist/components/Separator/Separator.d.ts +10 -0
  155. package/dist/components/Separator/Separator.d.ts.map +1 -1
  156. package/dist/components/Separator/Separator.js +10 -0
  157. package/dist/components/Separator/Separator.js.map +1 -1
  158. package/dist/components/Sheet/Sheet.d.ts +6 -0
  159. package/dist/components/Sheet/Sheet.d.ts.map +1 -1
  160. package/dist/components/Sheet/Sheet.js +7 -1
  161. package/dist/components/Sheet/Sheet.js.map +1 -1
  162. package/dist/components/Sheet/components/SheetFooter.js +1 -1
  163. package/dist/components/Sheet/components/SheetFooter.js.map +1 -1
  164. package/dist/components/Sheet/components/SheetHeader.js +1 -1
  165. package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
  166. package/dist/components/Sparkline/Sparkline.d.ts +11 -0
  167. package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
  168. package/dist/components/Sparkline/Sparkline.js +11 -0
  169. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  170. package/dist/components/Spinner/Spinner.d.ts +27 -2
  171. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  172. package/dist/components/Spinner/Spinner.js +28 -3
  173. package/dist/components/Spinner/Spinner.js.map +1 -1
  174. package/dist/components/Switch/Switch.d.ts +18 -0
  175. package/dist/components/Switch/Switch.d.ts.map +1 -1
  176. package/dist/components/Switch/Switch.js +19 -1
  177. package/dist/components/Switch/Switch.js.map +1 -1
  178. package/dist/components/Tabs/Tabs.d.ts +6 -0
  179. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  180. package/dist/components/Tabs/Tabs.js +6 -0
  181. package/dist/components/Tabs/Tabs.js.map +1 -1
  182. package/dist/components/Tabs/components/TabsTrigger.d.ts.map +1 -1
  183. package/dist/components/Tabs/components/TabsTrigger.js +22 -6
  184. package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
  185. package/dist/components/TagChip/TagChip.d.ts +14 -12
  186. package/dist/components/TagChip/TagChip.d.ts.map +1 -1
  187. package/dist/components/TagChip/TagChip.js +14 -1
  188. package/dist/components/TagChip/TagChip.js.map +1 -1
  189. package/dist/components/TagInput/TagInput.d.ts +11 -8
  190. package/dist/components/TagInput/TagInput.d.ts.map +1 -1
  191. package/dist/components/TagInput/TagInput.js +11 -0
  192. package/dist/components/TagInput/TagInput.js.map +1 -1
  193. package/dist/components/Text/Text.d.ts +9 -0
  194. package/dist/components/Text/Text.d.ts.map +1 -1
  195. package/dist/components/Text/Text.js +9 -0
  196. package/dist/components/Text/Text.js.map +1 -1
  197. package/dist/components/TextInline/TextInline.d.ts +15 -4
  198. package/dist/components/TextInline/TextInline.d.ts.map +1 -1
  199. package/dist/components/TextInline/TextInline.js +11 -0
  200. package/dist/components/TextInline/TextInline.js.map +1 -1
  201. package/dist/components/Textarea/Textarea.d.ts +12 -0
  202. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  203. package/dist/components/Textarea/Textarea.js +13 -1
  204. package/dist/components/Textarea/Textarea.js.map +1 -1
  205. package/dist/components/TimePicker/TimeColumn.d.ts +10 -1
  206. package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
  207. package/dist/components/TimePicker/TimeColumn.js +8 -1
  208. package/dist/components/TimePicker/TimeColumn.js.map +1 -1
  209. package/dist/components/TimePicker/TimePicker.d.ts +32 -0
  210. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
  211. package/dist/components/TimePicker/TimePicker.js +93 -6
  212. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  213. package/dist/components/TimePicker/TimeSegments.d.ts +50 -0
  214. package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -0
  215. package/dist/components/TimePicker/TimeSegments.js +93 -0
  216. package/dist/components/TimePicker/TimeSegments.js.map +1 -0
  217. package/dist/components/TimePicker/timepicker.hooks.d.ts +0 -4
  218. package/dist/components/TimePicker/timepicker.hooks.d.ts.map +1 -1
  219. package/dist/components/TimePicker/timepicker.hooks.js +1 -23
  220. package/dist/components/TimePicker/timepicker.hooks.js.map +1 -1
  221. package/dist/components/TimePicker/timepicker.types.d.ts +0 -2
  222. package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
  223. package/dist/components/Toast/Toast.d.ts +27 -0
  224. package/dist/components/Toast/Toast.d.ts.map +1 -1
  225. package/dist/components/Toast/Toast.js +28 -1
  226. package/dist/components/Toast/Toast.js.map +1 -1
  227. package/dist/components/Toggle/Toggle.d.ts +31 -12
  228. package/dist/components/Toggle/Toggle.d.ts.map +1 -1
  229. package/dist/components/Toggle/Toggle.js +19 -31
  230. package/dist/components/Toggle/Toggle.js.map +1 -1
  231. package/dist/components/Toggle/index.d.ts +1 -1
  232. package/dist/components/Toggle/index.d.ts.map +1 -1
  233. package/dist/components/Toggle/index.js +1 -1
  234. package/dist/components/Toggle/index.js.map +1 -1
  235. package/dist/components/ToggleGroup/ToggleGroup.d.ts +17 -0
  236. package/dist/components/ToggleGroup/ToggleGroup.d.ts.map +1 -1
  237. package/dist/components/ToggleGroup/ToggleGroup.js +17 -0
  238. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  239. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
  240. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts.map +1 -1
  241. package/dist/components/ToggleGroup/ToggleGroupItem.js +7 -6
  242. package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
  243. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +4 -3
  244. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
  245. package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
  246. package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
  247. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +4 -3
  248. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
  249. package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
  250. package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
  251. package/dist/components/ToggleGroup/toggleGroup.types.d.ts +12 -3
  252. package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
  253. package/dist/components/Tooltip/Tooltip.d.ts +6 -0
  254. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  255. package/dist/components/Tooltip/Tooltip.js +6 -0
  256. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  257. package/dist/date-time/index.d.ts.map +1 -1
  258. package/dist/date-time/index.js +0 -1
  259. package/dist/date-time/index.js.map +1 -1
  260. package/dist/internal/PickerField.d.ts +45 -0
  261. package/dist/internal/PickerField.d.ts.map +1 -0
  262. package/dist/internal/PickerField.js +24 -0
  263. package/dist/internal/PickerField.js.map +1 -0
  264. package/dist/internal/SegmentedField.d.ts +98 -0
  265. package/dist/internal/SegmentedField.d.ts.map +1 -0
  266. package/dist/internal/SegmentedField.js +315 -0
  267. package/dist/internal/SegmentedField.js.map +1 -0
  268. package/dist/internal/index.d.ts +2 -0
  269. package/dist/internal/index.d.ts.map +1 -1
  270. package/dist/internal/index.js +2 -0
  271. package/dist/internal/index.js.map +1 -1
  272. package/dist/lib/contexts/OverlayContext/OverlayContext.d.ts +2 -2
  273. package/dist/lib/contexts/OverlayContext/OverlayContext.d.ts.map +1 -1
  274. package/dist/lib/contexts/OverlayContext/OverlayContext.js +17 -6
  275. package/dist/lib/contexts/OverlayContext/OverlayContext.js.map +1 -1
  276. package/dist/theme/index.d.ts +2 -2
  277. package/dist/theme/index.d.ts.map +1 -1
  278. package/dist/theme/index.js +1 -1
  279. package/dist/theme/index.js.map +1 -1
  280. package/dist/theme/schema.d.ts +0 -22
  281. package/dist/theme/schema.d.ts.map +1 -1
  282. package/dist/theme/schema.js +0 -9
  283. package/dist/theme/schema.js.map +1 -1
  284. package/package.json +7 -48
  285. package/src/components/Badge/Badge.tsx +85 -48
  286. package/src/components/Badge/index.ts +10 -1
  287. package/src/components/BarChart/BarChart.tsx +12 -0
  288. package/src/components/Button/Button.tsx +129 -106
  289. package/src/components/Button/index.ts +10 -1
  290. package/src/components/Calendar/Calendar.tsx +29 -16
  291. package/src/components/Calendar/CalendarView.tsx +10 -1
  292. package/src/components/Calendar/calendar.types.ts +10 -0
  293. package/src/components/Card/Card.tsx +114 -15
  294. package/src/components/Card/index.ts +1 -1
  295. package/src/components/Checkbox/Checkbox.tsx +22 -2
  296. package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -0
  297. package/src/components/Code/Editor/Editor.tsx +2 -2
  298. package/src/components/Code/Editor/themes.ts +50 -32
  299. package/src/components/Code/ValidationStatus/ValidationStatus.tsx +6 -3
  300. package/src/components/DatePicker/DatePicker.tsx +279 -28
  301. package/src/components/DatePicker/DateSegments.tsx +125 -0
  302. package/src/components/DatePicker/datepicker.types.ts +21 -1
  303. package/src/components/DatePicker/index.ts +8 -1
  304. package/src/components/DateRangePicker/DateRangePicker.tsx +22 -4
  305. package/src/components/DateRangePicker/daterangepicker.types.ts +7 -1
  306. package/src/components/DateTimePicker/DateTimePicker.tsx +143 -70
  307. package/src/components/DateTimePicker/DateTimeSegments.tsx +113 -0
  308. package/src/components/DateTimePicker/datetimepicker.types.ts +7 -1
  309. package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +195 -104
  310. package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +7 -1
  311. package/src/components/Field/Field.tsx +20 -22
  312. package/src/components/FormField/FormField.tsx +15 -0
  313. package/src/components/HoverCard/HoverCard.tsx +6 -0
  314. package/src/components/Input/Input.tsx +19 -4
  315. package/src/components/LineChart/LineChart.tsx +17 -0
  316. package/src/components/Markdown/Markdown.tsx +17 -0
  317. package/src/components/Message/Message.tsx +73 -23
  318. package/src/components/Message/index.ts +1 -1
  319. package/src/components/Modal/Modal.tsx +42 -3
  320. package/src/components/Modal/components/ModalHeader.tsx +1 -1
  321. package/src/components/Popover/Popover.tsx +29 -0
  322. package/src/components/ProgressBar/ProgressBar.tsx +14 -0
  323. package/src/components/RadioButton/RadioButton.tsx +34 -3
  324. package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +32 -0
  325. package/src/components/SearchInput/SearchInput.tsx +13 -2
  326. package/src/components/Select/Select.tsx +4 -5
  327. package/src/components/Select/SelectDropdown.tsx +13 -9
  328. package/src/components/Select/SelectTrigger.tsx +7 -7
  329. package/src/components/Separator/Separator.tsx +10 -0
  330. package/src/components/Sheet/Sheet.tsx +8 -2
  331. package/src/components/Sheet/components/SheetFooter.tsx +1 -1
  332. package/src/components/Sheet/components/SheetHeader.tsx +2 -2
  333. package/src/components/Sparkline/Sparkline.tsx +11 -0
  334. package/src/components/Spinner/Spinner.tsx +28 -3
  335. package/src/components/Switch/Switch.tsx +27 -4
  336. package/src/components/Tabs/Tabs.tsx +6 -0
  337. package/src/components/Tabs/components/TabsTrigger.tsx +22 -5
  338. package/src/components/TagChip/TagChip.tsx +18 -16
  339. package/src/components/TagInput/TagInput.tsx +11 -8
  340. package/src/components/Text/Text.tsx +9 -0
  341. package/src/components/TextInline/TextInline.tsx +11 -0
  342. package/src/components/Textarea/Textarea.tsx +13 -1
  343. package/src/components/TimePicker/TimeColumn.tsx +24 -1
  344. package/src/components/TimePicker/TimePicker.tsx +127 -39
  345. package/src/components/TimePicker/TimeSegments.tsx +131 -0
  346. package/src/components/TimePicker/timepicker.hooks.ts +1 -24
  347. package/src/components/TimePicker/timepicker.types.ts +0 -3
  348. package/src/components/Toast/Toast.tsx +28 -1
  349. package/src/components/Toggle/Toggle.tsx +34 -32
  350. package/src/components/Toggle/index.ts +1 -1
  351. package/src/components/ToggleGroup/ToggleGroup.tsx +17 -0
  352. package/src/components/ToggleGroup/ToggleGroupItem.tsx +13 -8
  353. package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +3 -1
  354. package/src/components/ToggleGroup/ToggleGroupSingle.tsx +3 -1
  355. package/src/components/ToggleGroup/toggleGroup.types.ts +12 -3
  356. package/src/components/Tooltip/Tooltip.tsx +6 -0
  357. package/src/date-time/index.ts +0 -1
  358. package/src/internal/PickerField.tsx +90 -0
  359. package/src/internal/SegmentedField.tsx +445 -0
  360. package/src/internal/index.ts +2 -0
  361. package/src/lib/contexts/OverlayContext/OverlayContext.tsx +21 -10
  362. package/src/theme/index.ts +0 -6
  363. package/src/theme/recipes/badge.css +140 -0
  364. package/src/theme/recipes/button.css +167 -0
  365. package/src/theme/recipes/card.css +31 -0
  366. package/src/theme/recipes/checkbox.css +44 -0
  367. package/src/theme/recipes/field.css +14 -0
  368. package/src/theme/recipes/index.css +28 -0
  369. package/src/theme/recipes/input.css +29 -0
  370. package/src/theme/recipes/message.css +47 -0
  371. package/src/theme/recipes/modal.css +31 -0
  372. package/src/theme/recipes/radio-button.css +42 -0
  373. package/src/theme/recipes/search-input.css +16 -0
  374. package/src/theme/recipes/select.css +105 -0
  375. package/src/theme/recipes/sheet.css +34 -0
  376. package/src/theme/recipes/spinner.css +17 -0
  377. package/src/theme/recipes/switch.css +39 -0
  378. package/src/theme/recipes/tabs.css +41 -0
  379. package/src/theme/recipes/tag-chip.css +27 -0
  380. package/src/theme/recipes/textarea.css +20 -0
  381. package/src/theme/recipes/toggle.css +92 -0
  382. package/src/theme/schema.ts +0 -27
  383. package/src/theme/tokens.css +26 -9
  384. package/dist/components/Avatar/Avatar.d.ts +0 -6
  385. package/dist/components/Avatar/Avatar.d.ts.map +0 -1
  386. package/dist/components/Avatar/Avatar.js +0 -11
  387. package/dist/components/Avatar/Avatar.js.map +0 -1
  388. package/dist/components/Avatar/index.d.ts +0 -2
  389. package/dist/components/Avatar/index.d.ts.map +0 -1
  390. package/dist/components/Avatar/index.js +0 -2
  391. package/dist/components/Avatar/index.js.map +0 -1
  392. package/dist/components/Breadcrumb/Breadcrumb.d.ts +0 -12
  393. package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +0 -1
  394. package/dist/components/Breadcrumb/Breadcrumb.js +0 -19
  395. package/dist/components/Breadcrumb/Breadcrumb.js.map +0 -1
  396. package/dist/components/Breadcrumb/index.d.ts +0 -2
  397. package/dist/components/Breadcrumb/index.d.ts.map +0 -1
  398. package/dist/components/Breadcrumb/index.js +0 -2
  399. package/dist/components/Breadcrumb/index.js.map +0 -1
  400. package/dist/components/ColorDot/ColorDot.d.ts +0 -19
  401. package/dist/components/ColorDot/ColorDot.d.ts.map +0 -1
  402. package/dist/components/ColorDot/ColorDot.js +0 -36
  403. package/dist/components/ColorDot/ColorDot.js.map +0 -1
  404. package/dist/components/ColorDot/index.d.ts +0 -2
  405. package/dist/components/ColorDot/index.d.ts.map +0 -1
  406. package/dist/components/ColorDot/index.js +0 -2
  407. package/dist/components/ColorDot/index.js.map +0 -1
  408. package/dist/components/EmptyState/EmptyState.d.ts +0 -26
  409. package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
  410. package/dist/components/EmptyState/EmptyState.js +0 -9
  411. package/dist/components/EmptyState/EmptyState.js.map +0 -1
  412. package/dist/components/EmptyState/index.d.ts +0 -2
  413. package/dist/components/EmptyState/index.d.ts.map +0 -1
  414. package/dist/components/EmptyState/index.js +0 -2
  415. package/dist/components/EmptyState/index.js.map +0 -1
  416. package/dist/components/HeatMap/HeatMapCalendar.d.ts +0 -11
  417. package/dist/components/HeatMap/HeatMapCalendar.d.ts.map +0 -1
  418. package/dist/components/HeatMap/HeatMapCalendar.js +0 -68
  419. package/dist/components/HeatMap/HeatMapCalendar.js.map +0 -1
  420. package/dist/components/HeatMap/HeatMapMatrix.d.ts +0 -12
  421. package/dist/components/HeatMap/HeatMapMatrix.d.ts.map +0 -1
  422. package/dist/components/HeatMap/HeatMapMatrix.js +0 -35
  423. package/dist/components/HeatMap/HeatMapMatrix.js.map +0 -1
  424. package/dist/components/HeatMap/heat-map.utils.d.ts +0 -10
  425. package/dist/components/HeatMap/heat-map.utils.d.ts.map +0 -1
  426. package/dist/components/HeatMap/heat-map.utils.js +0 -10
  427. package/dist/components/HeatMap/heat-map.utils.js.map +0 -1
  428. package/dist/components/HeatMap/index.d.ts +0 -4
  429. package/dist/components/HeatMap/index.d.ts.map +0 -1
  430. package/dist/components/HeatMap/index.js +0 -3
  431. package/dist/components/HeatMap/index.js.map +0 -1
  432. package/dist/components/MetricList/MetricList.d.ts +0 -9
  433. package/dist/components/MetricList/MetricList.d.ts.map +0 -1
  434. package/dist/components/MetricList/MetricList.js +0 -8
  435. package/dist/components/MetricList/MetricList.js.map +0 -1
  436. package/dist/components/MetricList/MetricRow.d.ts +0 -13
  437. package/dist/components/MetricList/MetricRow.d.ts.map +0 -1
  438. package/dist/components/MetricList/MetricRow.js +0 -13
  439. package/dist/components/MetricList/MetricRow.js.map +0 -1
  440. package/dist/components/MetricList/index.d.ts +0 -3
  441. package/dist/components/MetricList/index.d.ts.map +0 -1
  442. package/dist/components/MetricList/index.js +0 -3
  443. package/dist/components/MetricList/index.js.map +0 -1
  444. package/dist/components/NavBottom/NavBottom.d.ts +0 -16
  445. package/dist/components/NavBottom/NavBottom.d.ts.map +0 -1
  446. package/dist/components/NavBottom/NavBottom.js +0 -21
  447. package/dist/components/NavBottom/NavBottom.js.map +0 -1
  448. package/dist/components/NavBottom/index.d.ts +0 -3
  449. package/dist/components/NavBottom/index.d.ts.map +0 -1
  450. package/dist/components/NavBottom/index.js +0 -2
  451. package/dist/components/NavBottom/index.js.map +0 -1
  452. package/dist/components/NavSide/NavItem.d.ts +0 -9
  453. package/dist/components/NavSide/NavItem.d.ts.map +0 -1
  454. package/dist/components/NavSide/NavItem.js +0 -13
  455. package/dist/components/NavSide/NavItem.js.map +0 -1
  456. package/dist/components/NavSide/NavSide.d.ts +0 -16
  457. package/dist/components/NavSide/NavSide.d.ts.map +0 -1
  458. package/dist/components/NavSide/NavSide.js +0 -12
  459. package/dist/components/NavSide/NavSide.js.map +0 -1
  460. package/dist/components/NavSide/index.d.ts +0 -3
  461. package/dist/components/NavSide/index.d.ts.map +0 -1
  462. package/dist/components/NavSide/index.js +0 -2
  463. package/dist/components/NavSide/index.js.map +0 -1
  464. package/dist/components/NavSide/types.d.ts +0 -38
  465. package/dist/components/NavSide/types.d.ts.map +0 -1
  466. package/dist/components/NavSide/types.js +0 -2
  467. package/dist/components/NavSide/types.js.map +0 -1
  468. package/dist/components/Pagination/Pagination.d.ts +0 -35
  469. package/dist/components/Pagination/Pagination.d.ts.map +0 -1
  470. package/dist/components/Pagination/Pagination.js +0 -26
  471. package/dist/components/Pagination/Pagination.js.map +0 -1
  472. package/dist/components/Pagination/index.d.ts +0 -3
  473. package/dist/components/Pagination/index.d.ts.map +0 -1
  474. package/dist/components/Pagination/index.js +0 -2
  475. package/dist/components/Pagination/index.js.map +0 -1
  476. package/dist/components/Skeleton/Skeleton.d.ts +0 -4
  477. package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
  478. package/dist/components/Skeleton/Skeleton.js +0 -9
  479. package/dist/components/Skeleton/Skeleton.js.map +0 -1
  480. package/dist/components/Skeleton/index.d.ts +0 -2
  481. package/dist/components/Skeleton/index.d.ts.map +0 -1
  482. package/dist/components/Skeleton/index.js +0 -2
  483. package/dist/components/Skeleton/index.js.map +0 -1
  484. package/dist/components/StatsCard/StatsCard.d.ts +0 -17
  485. package/dist/components/StatsCard/StatsCard.d.ts.map +0 -1
  486. package/dist/components/StatsCard/StatsCard.js +0 -15
  487. package/dist/components/StatsCard/StatsCard.js.map +0 -1
  488. package/dist/components/StatsCard/index.d.ts +0 -2
  489. package/dist/components/StatsCard/index.d.ts.map +0 -1
  490. package/dist/components/StatsCard/index.js +0 -2
  491. package/dist/components/StatsCard/index.js.map +0 -1
  492. package/src/components/Avatar/Avatar.tsx +0 -19
  493. package/src/components/Avatar/index.ts +0 -1
  494. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -47
  495. package/src/components/Breadcrumb/index.ts +0 -5
  496. package/src/components/ColorDot/ColorDot.tsx +0 -52
  497. package/src/components/ColorDot/index.ts +0 -1
  498. package/src/components/EmptyState/EmptyState.tsx +0 -30
  499. package/src/components/EmptyState/index.ts +0 -1
  500. package/src/components/HeatMap/HeatMapCalendar.tsx +0 -127
  501. package/src/components/HeatMap/HeatMapMatrix.tsx +0 -75
  502. package/src/components/HeatMap/heat-map.utils.ts +0 -15
  503. package/src/components/HeatMap/index.ts +0 -3
  504. package/src/components/MetricList/MetricList.tsx +0 -18
  505. package/src/components/MetricList/MetricRow.tsx +0 -30
  506. package/src/components/MetricList/index.ts +0 -2
  507. package/src/components/NavBottom/NavBottom.tsx +0 -55
  508. package/src/components/NavBottom/index.ts +0 -3
  509. package/src/components/NavSide/NavItem.tsx +0 -39
  510. package/src/components/NavSide/NavSide.tsx +0 -42
  511. package/src/components/NavSide/index.ts +0 -2
  512. package/src/components/NavSide/types.ts +0 -36
  513. package/src/components/Pagination/Pagination.tsx +0 -86
  514. package/src/components/Pagination/index.ts +0 -2
  515. package/src/components/Skeleton/Skeleton.tsx +0 -9
  516. package/src/components/Skeleton/index.ts +0 -1
  517. package/src/components/StatsCard/StatsCard.tsx +0 -41
  518. package/src/components/StatsCard/index.ts +0 -1
@@ -6,27 +6,48 @@ import { MessageDescription } from "./components/MessageDescription";
6
6
  import { MessageIcon } from "./components/MessageIcon";
7
7
  import { MessageTitle } from "./components/MessageTitle";
8
8
 
9
- export const messageVariants = cva("flex gap-3 rounded-lg border p-4 text-sm [&>svg]:shrink-0", {
10
- variants: {
11
- intent: {
12
- neutral: "border-border-normal bg-bg-normal text-fg-normal",
13
- success: "border-border-success bg-bg-success-subtle text-fg-on-success-subtle",
14
- warning: "border-border-warning bg-bg-warning-subtle text-fg-on-warning-subtle",
15
- danger: "border-border-danger bg-bg-danger-subtle text-fg-on-danger-subtle",
9
+ /**
10
+ * Geometry only, plus the three `--message-*` component tokens.
11
+ *
12
+ * Every colour reads a `--message-*` component token whose value is decided by
13
+ * src/theme/recipes/message.css. That file is the mapping from `intent` to a
14
+ * semantic token — the layer that used to be the `intent` entry in `variants`
15
+ * here, compiled into class-name literals and unreachable from outside.
16
+ * `size` stays here: it is pure geometry (padding, gap, font-size), not
17
+ * colour, so it has no reason to move.
18
+ */
19
+ export const messageVariants = cva(
20
+ // One literal, deliberately: `useSortedClasses --unsafe` strips the trailing
21
+ // space before a `+`, silently welding the last class of one fragment to the
22
+ // first of the next. A single string means the sorter has nothing to break.
23
+ "message border-(color:--message-border) flex gap-3 rounded-lg border bg-(--message-bg) p-4 text-(--message-fg) text-sm [&>svg]:shrink-0",
24
+ {
25
+ variants: {
26
+ size: {
27
+ md: "p-4",
28
+ sm: "gap-2 p-3 text-xs",
29
+ },
16
30
  },
17
- size: {
18
- default: "p-4",
19
- sm: "gap-2 p-3 text-xs",
31
+ defaultVariants: {
32
+ size: "md",
20
33
  },
21
- },
22
- defaultVariants: {
23
- intent: "neutral",
24
- size: "default",
25
- },
26
- });
34
+ }
35
+ );
36
+
37
+ /**
38
+ * Widened deliberately, same reasoning as `ButtonIntent` in Button.tsx: adding
39
+ * an intent is a CSS change in the consuming app (a new `.message[data-intent=…]`
40
+ * cell in message.css), not a release here, so the type has to admit values
41
+ * this file has never heard of while still autocompleting the ones it ships.
42
+ */
43
+ type Loose<T extends string> = T | (string & {});
44
+
45
+ export type MessageIntentName = "neutral" | "success" | "warning" | "danger";
46
+ export type MessageIntent = Loose<MessageIntentName>;
27
47
 
28
48
  export type MessageProps = React.HTMLAttributes<HTMLDivElement> &
29
49
  VariantProps<typeof messageVariants> & {
50
+ intent?: MessageIntent | undefined;
30
51
  /** Simple API: Optional title displayed above children */
31
52
  title?: React.ReactNode;
32
53
  /** Simple API: Optional icon displayed on the left */
@@ -41,14 +62,43 @@ export type MessageProps = React.HTMLAttributes<HTMLDivElement> &
41
62
  * success confirmation or a static "Note" callout stamped as `alert` trains
42
63
  * users to ignore the role that actually matters. Consumers can override by
43
64
  * passing their own `role` — `props` is spread after this.
65
+ *
66
+ * `intent` is widened to admit values this file has never heard of (see
67
+ * `MessageIntent` above), so this is deliberately not a lookup keyed by the
68
+ * closed union: an unrecognised intent has no entry and must fall through to
69
+ * `"status"` rather than resolving to `undefined`, which would render with no
70
+ * live-region role at all.
44
71
  */
45
- const intentRole = {
46
- neutral: "status",
47
- success: "status",
48
- warning: "status",
49
- danger: "alert",
50
- } as const;
72
+ const ALERT_INTENTS: ReadonlySet<string> = new Set<MessageIntentName>(["danger"]);
73
+ function intentRole(intent: MessageIntent): "status" | "alert" {
74
+ return ALERT_INTENTS.has(intent) ? "alert" : "status";
75
+ }
51
76
 
77
+ /**
78
+ * An inline feedback banner — info, success, warning, or error — that
79
+ * renders wherever the caller places it and stays until the caller removes
80
+ * it. Reach for `Message` over `Toast` when the feedback belongs in the
81
+ * page's own layout (form validation, an in-card load error); reach for
82
+ * `Toast` when it should float above the page and disappear on its own.
83
+ * `Toast` itself renders a `Message` internally.
84
+ *
85
+ * `intent` (`"neutral"` (default) | `"success"` | `"warning"` | `"danger"`,
86
+ * widened to accept any string) drives both the color, via `--message-*`
87
+ * component tokens, and the ARIA live-region role: `"danger"` is the only
88
+ * intent that gets `role="alert"` (assertive — cuts off whatever a screen
89
+ * reader was announcing); every other intent, including one this library has
90
+ * never heard of, gets `role="status"` (polite — announced at the next
91
+ * natural pause). An unrecognised intent still falls through to
92
+ * `role="status"` rather than resolving to no role at all. `role` can be
93
+ * overridden directly if a specific case needs it. `size` (`"md"` | `"sm"`)
94
+ * is geometry only (padding/gap/font-size) and carries no color.
95
+ *
96
+ * Two ways to give it content: the simple API (`title` + `icon` props, with
97
+ * `children` as the description), or compound children (`Message.Icon`,
98
+ * `Message.Body`, `Message.Title`, `Message.Description`) for layouts the
99
+ * simple API can't express. Message detects which one is in use by
100
+ * inspecting its children, so the two aren't meant to be mixed.
101
+ */
52
102
  export const Message = React.forwardRef<HTMLDivElement, MessageProps>(({ className, intent = "neutral", size, title, icon, children, ...props }, ref) => {
53
103
  const hasCompoundChildren = React.Children.toArray(children).some(
54
104
  (child) =>
@@ -57,7 +107,7 @@ export const Message = React.forwardRef<HTMLDivElement, MessageProps>(({ classNa
57
107
  );
58
108
 
59
109
  return (
60
- <div ref={ref} role={intentRole[intent ?? "neutral"]} className={cn(messageVariants({ intent, size, className }))} {...props}>
110
+ <div ref={ref} role={intentRole(intent)} data-intent={intent} className={cn(messageVariants({ size, className }))} {...props}>
61
111
  {hasCompoundChildren ? (
62
112
  children
63
113
  ) : (
@@ -6,5 +6,5 @@ export type { MessageIconProps } from "./components/MessageIcon";
6
6
  export { MessageIcon } from "./components/MessageIcon";
7
7
  export type { MessageTitleProps } from "./components/MessageTitle";
8
8
  export { MessageTitle } from "./components/MessageTitle";
9
- export type { MessageProps } from "./Message";
9
+ export type { MessageIntent, MessageIntentName, MessageProps } from "./Message";
10
10
  export { Message, messageVariants } from "./Message";
@@ -126,7 +126,10 @@ const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(
126
126
 
127
127
  return (
128
128
  <FloatingFocusManager context={context} modal>
129
- <FloatingOverlay lockScroll className={cn("fixed inset-0 z-modal bg-bg-overlay", isEntering && "animate-fade-in", isExiting && "animate-fade-out")}>
129
+ <FloatingOverlay
130
+ lockScroll
131
+ className={cn("modal-overlay fixed inset-0 z-modal bg-(--modal-overlay-bg)", isEntering && "animate-fade-in", isExiting && "animate-fade-out")}
132
+ >
130
133
  <div
131
134
  ref={mergedRef}
132
135
  role="dialog"
@@ -137,8 +140,8 @@ const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(
137
140
  tabIndex={-1}
138
141
  data-state={state}
139
142
  className={cn(
140
- "fixed flex flex-col overflow-hidden outline-hidden",
141
- "rounded-xl border border-border-normal bg-bg-normal",
143
+ "modal fixed flex flex-col overflow-hidden outline-hidden",
144
+ "border-(color:--modal-border) rounded-xl border bg-(--modal-bg)",
142
145
  // Size
143
146
  sizeClasses[size],
144
147
  // Cap height so ModalBody scrolls instead of overflowing the viewport
@@ -171,6 +174,42 @@ ModalRoot.displayName = "Modal";
171
174
  // Compound Component Export
172
175
  // =============================================================================
173
176
 
177
+ /**
178
+ * A centered, backdrop-dimmed dialog that fully interrupts the page — the
179
+ * background stays visually present but the user can't reach it. Reach for
180
+ * `Modal` when the interruption should own the user's attention completely
181
+ * (a confirmation, a focused form); reach for `Sheet` when the page behind
182
+ * should stay visible and interactive, or `Popover` when there's no need for
183
+ * a backdrop at all.
184
+ *
185
+ * `size` (`"sm" | "md" | "lg" | "full"`, default `"md"`) sets the desktop
186
+ * width — every size slides up full-width from the bottom on mobile.
187
+ * `align` positions the desktop dialog `"center"` (default) or `"top"`.
188
+ * `dismissable` (default `true`) governs outside-press only: clicking the
189
+ * backdrop closes the modal unless set to `false`. `closable` shows an X
190
+ * button in `Modal.Header`.
191
+ *
192
+ * Modal is mount-driven — a parent (or `useModal`'s stack) decides whether it
193
+ * renders at all, so there's no `open` prop. `onOpenChange` still exists,
194
+ * firing only with `false` on dismissal, so every overlay in this library
195
+ * shares one open/close shape. Escape is *not* wired inside Modal itself:
196
+ * `OverlayProvider` owns it globally so a stack of modals closes
197
+ * topmost-first. That means Escape only closes a Modal opened through
198
+ * `useModal()` — one a parent mounts directly from its own boolean state
199
+ * won't respond to Escape unless the app wires that separately.
200
+ *
201
+ * Focus moves into the modal on mount and is trapped there
202
+ * (`FloatingFocusManager modal`) until it unmounts, then returns to whatever
203
+ * triggered it. The dialog carries `role="dialog"` and `aria-modal="true"`,
204
+ * and names itself from `Modal.Header` via `aria-labelledby` unless the
205
+ * caller passes their own `aria-label`. It stays mounted through its
206
+ * fade-out exit animation (`usePresence`), so `onOpenChange(false)` fires
207
+ * only after the animation completes.
208
+ *
209
+ * Compound: `Modal.Header` (title + optional close button), `Modal.Body`
210
+ * (scrolls internally so the modal itself never grows past the viewport),
211
+ * `Modal.Footer` (action buttons). None are required.
212
+ */
174
213
  export const Modal = Object.assign(ModalRoot, {
175
214
  Header: ModalHeader,
176
215
  Body: ModalBody,
@@ -30,7 +30,7 @@ export const ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(({
30
30
  type="button"
31
31
  onClick={onClose}
32
32
  aria-label="Close"
33
- className="absolute top-4 right-4 cursor-pointer rounded-md p-1 text-fg-subtle transition-colors hover:bg-bg-subtle hover:text-fg-normal"
33
+ className="modal-close absolute top-4 right-4 cursor-pointer rounded-md p-1 text-(--modal-close-fg) transition-colors hover:bg-(--modal-close-bg-hovered) hover:text-(--modal-close-fg-hovered)"
34
34
  >
35
35
  <X size={16} />
36
36
  </button>
@@ -68,6 +68,35 @@ const PopoverRoot = ({ open: controlledOpen, onOpenChange, defaultOpen = false,
68
68
  return <PopoverContext.Provider value={contextValue}>{children}</PopoverContext.Provider>;
69
69
  };
70
70
 
71
+ /**
72
+ * A click-triggered floating panel anchored to a trigger element, with no
73
+ * backdrop. Reach for `Popover` over `Modal`/`Sheet` when the content is a
74
+ * menu, a small edit form, or info-on-demand that should stay tethered to
75
+ * whatever the user clicked, rather than taking over the page. Reach for
76
+ * `HoverCard` instead when the panel should open passively on hover/focus
77
+ * rather than a click, and for `Tooltip` when it's a short text label rather
78
+ * than a panel with real content.
79
+ *
80
+ * Works both controlled (`open` + `onOpenChange`) and uncontrolled
81
+ * (`defaultOpen`) via `useControllableState`. `placement` (default
82
+ * `"bottom"`) and `offsetPx` (default `8`) position it relative to the
83
+ * trigger through floating-ui's `offset → flip → shift` middleware, which
84
+ * repositions automatically on scroll/resize (`autoUpdate`).
85
+ *
86
+ * Opens via `useClick` and dismisses via `useDismiss` — outside-press and
87
+ * Escape both close it, handled directly by floating-ui rather than
88
+ * `OverlayProvider`, since a Popover isn't part of the modal stack.
89
+ * `Popover.Body` renders in a `FloatingPortal` to `document.body` and hard
90
+ * unmounts (`return null`) when closed — there's no exit animation. It
91
+ * carries `role="dialog"` and, since there's no title slot to read from,
92
+ * names itself from `Popover.Trigger` via `aria-labelledby` unless the
93
+ * caller passes their own `aria-label`/`aria-labelledby`.
94
+ *
95
+ * Compound: `Popover.Trigger` (`asChild` to render the child element as the
96
+ * trigger instead of wrapping it in a `<button>`), `Popover.Body`,
97
+ * `Popover.Close` (a button that calls `onOpenChange(false)` — for a close
98
+ * affordance inside the panel's own content).
99
+ */
71
100
  export const Popover = Object.assign(PopoverRoot, {
72
101
  Trigger: PopoverTrigger,
73
102
  Body: PopoverBody,
@@ -11,6 +11,20 @@ export type ProgressBarProps = {
11
11
  className?: string;
12
12
  };
13
13
 
14
+ /**
15
+ * Determinate progress meter: a labelled fill bar plus an optional `n/total`
16
+ * fraction (`showFraction`, default `true`).
17
+ *
18
+ * The bar itself is `role="progressbar"` with `aria-valuemin`/`-valuenow`/
19
+ * `-valuemax`/`-valuetext`, and `label` (default `"Progress"`) sets its
20
+ * accessible name — give it something more specific than the default when
21
+ * more than one bar can appear on a page. `completed` is clamped into
22
+ * `[0, total]` before it drives the fill width or `aria-valuenow`, so an
23
+ * out-of-range value (negative, or greater than `total`) can't produce
24
+ * invalid CSS or an impossible reported value — though the fraction text
25
+ * still shows the raw, unclamped numbers. When `total` is not positive the
26
+ * bar renders as indeterminate: no `aria-valuenow`/`aria-valuemax`, 0% fill.
27
+ */
14
28
  export const ProgressBar = React.forwardRef<HTMLDivElement, ProgressBarProps>(
15
29
  ({ completed, total, showFraction = true, label = "Progress", className }, ref) => {
16
30
  // A caller can hand us anything; the bar must not render an out-of-range
@@ -23,6 +23,32 @@ const RadioButtonIcon = () => (
23
23
  </svg>
24
24
  );
25
25
 
26
+ /**
27
+ * A single custom radio option — a button with `role="radio"` rather than
28
+ * a native `<input type="radio">`, so it can be styled without fighting
29
+ * native radio rendering.
30
+ *
31
+ * Unlike `Checkbox`, it holds no internal state: `checked` is a plain
32
+ * controlled prop (default `false`, no `defaultChecked`), and clicking an
33
+ * unselected radio calls `onCheckedChange(true)` — the caller owns tracking
34
+ * which option in a group is selected. In practice that means using
35
+ * `RadioButtonGroup` to manage a group's value, or wiring up the shared
36
+ * selection by hand.
37
+ *
38
+ * Clicking an already-selected radio does nothing and reports nothing: a radio
39
+ * is not a toggle, and the way to deselect one is to select a sibling. That
40
+ * makes `onCheckedChange` a one-way signal — it is only ever called with
41
+ * `true`.
42
+ *
43
+ * Only participates in native form submission when `name` is set, via a
44
+ * hidden native `<input type="radio">` rendered alongside the button and
45
+ * kept in sync (`value` defaults to `"on"`); give every radio in a group the
46
+ * same `name` to group them for native submission.
47
+ *
48
+ * Passing `label` wraps the button and a `<Label>` together and wires
49
+ * `htmlFor`/`id` between them; without it, you get just the button and must
50
+ * supply your own accessible name.
51
+ */
26
52
  const RadioButton = React.forwardRef<HTMLButtonElement, RadioButtonProps>(
27
53
  ({ className, checked = false, onCheckedChange, disabled, name, value = "on", label, labelClassName, id: idProp, ...props }, ref) => {
28
54
  const generatedId = React.useId();
@@ -39,10 +65,15 @@ const RadioButton = React.forwardRef<HTMLButtonElement, RadioButtonProps>(
39
65
  data-state={checked ? "checked" : "unchecked"}
40
66
  disabled={disabled}
41
67
  ref={ref}
42
- onClick={() => onCheckedChange?.(!checked)}
68
+ // A radio is not a toggle: activating the selected option leaves it
69
+ // selected, and reports nothing, so a caller holding the selection
70
+ // does not see a spurious change. Deselection happens by selecting a
71
+ // sibling, which is what `RadioButtonGroup` does.
72
+ onClick={() => {
73
+ if (!checked) onCheckedChange?.(true);
74
+ }}
43
75
  className={cn(
44
- "peer h-4 w-4 shrink-0 cursor-pointer rounded-full border border-border-brand shadow focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
45
- checked && "bg-bg-brand text-fg-on-brand",
76
+ "radio-button peer border-(color:--radio-button-border) focus-visible:ring-(color:--radio-button-ring) h-4 w-4 shrink-0 cursor-pointer rounded-full border bg-(--radio-button-bg) text-(--radio-button-fg) shadow focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
46
77
  className
47
78
  )}
48
79
  {...props}
@@ -37,6 +37,32 @@ export type RadioButtonGroupProps = Omit<React.HTMLAttributes<HTMLDivElement>, "
37
37
  onBlur?: () => void;
38
38
  };
39
39
 
40
+ /**
41
+ * A set of mutually exclusive radio options sharing one controlled/
42
+ * uncontrolled `string` selection, via the `value`/`defaultValue`/
43
+ * `onValueChange` triad (`useControllableState`).
44
+ *
45
+ * `variant="default"` (the default) renders one `RadioButton` per option.
46
+ * `variant="button"` is a separate rendering path — not a re-skinned
47
+ * `RadioButton` — a row/column of plain buttons with `role="radio"`;
48
+ * contiguous buttons touch and share borders (`appearance="segmented"`, the
49
+ * default) or sit apart with their own rounded corners
50
+ * (`appearance="separate"`).
51
+ *
52
+ * Implements the WAI-ARIA radiogroup keyboard pattern: the group is one tab
53
+ * stop, landing on the checked option (or the first enabled option if none
54
+ * is checked), and arrow/Home/End keys move focus *and* selection between
55
+ * enabled options, wrapping at the ends.
56
+ *
57
+ * Form submission only happens when `name` is set. In the default variant
58
+ * that means each underlying `RadioButton` gets `name`, so one hidden
59
+ * native radio input is rendered per option; in the button variant the
60
+ * group itself renders a single hidden `<input type="hidden">` carrying the
61
+ * selected value.
62
+ *
63
+ * Renders `role="radiogroup"`; focus leaving the whole group — not just
64
+ * moving between options — fires `onBlur`.
65
+ */
40
66
  const RadioButtonGroup = React.forwardRef<HTMLDivElement, RadioButtonGroupProps>(
41
67
  (
42
68
  {
@@ -81,6 +107,12 @@ const RadioButtonGroup = React.forwardRef<HTMLDivElement, RadioButtonGroupProps>
81
107
  );
82
108
 
83
109
  const handleOptionSelect = (optionValue: string) => {
110
+ // Re-selecting the current option reports nothing, as a native radio does
111
+ // not. The guard lives here as well as in `RadioButton` because the button
112
+ // variant is a separate rendering path that never goes through it — and
113
+ // the two variants must not disagree about this. `ToggleGroup` in
114
+ // `"single"` mode already works this way.
115
+ if (optionValue === value) return;
84
116
  setValue(optionValue);
85
117
  };
86
118
 
@@ -1,4 +1,5 @@
1
1
  import { Input } from "@sixthshift/design-system/input";
2
+ import { cn } from "@sixthshift/design-system/utils";
2
3
  import { Search, X } from "lucide-react";
3
4
  import * as React from "react";
4
5
 
@@ -10,6 +11,16 @@ export type SearchInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>,
10
11
  clearLabel?: string;
11
12
  };
12
13
 
14
+ /**
15
+ * Text input specialised for search: a search icon fixed on the left and,
16
+ * once there is a value, a clear button on the right.
17
+ *
18
+ * Wraps `Input`, using its `iconLeft`/`iconRight` slots, rather than
19
+ * reimplementing the field. Always controlled — `value` is required and
20
+ * there is no `defaultValue`/uncontrolled mode. `onChange` receives the
21
+ * string value directly, not the change event. Clearing calls `onClear` if
22
+ * provided, otherwise calls `onChange("")`.
23
+ */
13
24
  const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
14
25
  ({ className, value, onChange, onClear, clearLabel = "Clear search", ...props }, ref) => {
15
26
  const handleClear = () => {
@@ -29,12 +40,12 @@ const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
29
40
  iconLeft={<Search />}
30
41
  iconRight={
31
42
  value ? (
32
- <button type="button" onClick={handleClear} aria-label={clearLabel} className="rounded hover:bg-bg-subtle">
43
+ <button type="button" onClick={handleClear} aria-label={clearLabel} className="rounded hover:bg-(--search-input-clear-bg-hovered)">
33
44
  <X />
34
45
  </button>
35
46
  ) : undefined
36
47
  }
37
- className={className}
48
+ className={cn("search-input", className)}
38
49
  {...props}
39
50
  />
40
51
  );
@@ -337,10 +337,9 @@ const SelectRoot = forwardRef(function SelectRoot<T extends string = string>(pro
337
337
  SelectRoot.displayName = "Select";
338
338
 
339
339
  /**
340
- * The trigger is the ref target: `register` from a form library and
341
- * scroll-into-view both want it, and it is a `<div>` in both the button and the
342
- * searchable variants. It does swap nodes when the searchable trigger replaces
343
- * the button one, so a callback ref sees null and then the new element — normal
344
- * for conditional rendering, but worth knowing if you cache the node.
340
+ * NOTE: Storybook shows the copy in Select.stories.tsx
341
+ * (`parameters.docs.description.component`), not this comment. react-docgen
342
+ * cannot extract a description from this declaration shape, so keeping a
343
+ * second copy here would only drift. Edit the stories file.
345
344
  */
346
345
  export const Select = SelectRoot as <T extends string = string>(props: SelectProps<T> & { ref?: Ref<HTMLDivElement> }) => ReactElement;
@@ -66,13 +66,16 @@ export const SelectDropdown = <T extends string>({
66
66
  tabIndex={-1}
67
67
  onKeyDown={onKeyDown}
68
68
  style={floatingStyles}
69
- className="z-popover max-h-60 overflow-y-auto rounded-md border border-border-normal bg-bg-normal shadow-lg"
69
+ className="select-dropdown border-(color:--select-dropdown-border) z-popover max-h-60 overflow-y-auto rounded-md border bg-(--select-dropdown-bg) shadow-lg"
70
70
  >
71
71
  {displayOptions.length === 0 ? (
72
- <div className="px-3 py-2 text-center text-fg-subtle text-sm">{searchValue ? `No results for "${searchValue}"` : "No options available"}</div>
72
+ <div className="px-3 py-2 text-center text-(--select-dropdown-empty-fg) text-sm">
73
+ {searchValue ? `No results for "${searchValue}"` : "No options available"}
74
+ </div>
73
75
  ) : (
74
76
  displayOptions.map((option, index) => {
75
77
  const isSelected = selectedValues.has(option.value);
78
+ const isHighlighted = highlightedIndex === index;
76
79
  return (
77
80
  <button
78
81
  key={option.value}
@@ -84,6 +87,10 @@ export const SelectDropdown = <T extends string>({
84
87
  id={selectOptionId(listboxId, index)}
85
88
  role="option"
86
89
  aria-selected={isSelected}
90
+ // Surfaces the keyboard/mouse "current" option as an attribute
91
+ // the select.css recipe selects on, rather than compiling it
92
+ // straight into a class name — see select.css's header.
93
+ data-highlighted={isHighlighted ? "true" : undefined}
87
94
  // The options are not tab stops and must not steal focus: the
88
95
  // listbox holds it and delegates via aria-activedescendant, so a
89
96
  // click that moved focus onto the option would strand the keyboard
@@ -93,18 +100,15 @@ export const SelectDropdown = <T extends string>({
93
100
  onClick={() => onSelect(option.value)}
94
101
  onMouseEnter={() => onHighlight(index)}
95
102
  className={cn(
96
- `flex w-full cursor-pointer items-center px-3 py-2 text-fg-normal text-sm transition-colors`,
103
+ `select-option flex w-full cursor-pointer items-center bg-(--select-option-bg) px-3 py-2 text-(--select-option-fg) text-sm transition-colors`,
97
104
  multiple && "gap-2",
98
- highlightedIndex === index && "bg-bg-subtle",
99
- isSelected ? "font-medium text-fg-normal" : "text-fg-subtle"
105
+ isSelected && "font-medium"
100
106
  )}
101
107
  >
102
108
  {multiple && (
103
109
  <span
104
- className={cn(
105
- "flex h-4 w-4 shrink-0 items-center justify-center rounded-xs border",
106
- isSelected ? "border-border-brand bg-bg-brand text-fg-on-brand" : "border-border-normal"
107
- )}
110
+ data-selected={isSelected ? "true" : undefined}
111
+ className="select-option-indicator border-(color:--select-option-indicator-border) flex h-4 w-4 shrink-0 items-center justify-center rounded-xs border bg-(--select-option-indicator-bg) text-(--select-option-indicator-fg)"
108
112
  >
109
113
  {isSelected && <Check className="h-3 w-3" />}
110
114
  </span>
@@ -41,7 +41,7 @@ export const SelectTriggerButton = ({
41
41
  const showClear = showClearButton && !collapsed;
42
42
 
43
43
  return (
44
- <div ref={rootRef} className="relative w-full">
44
+ <div ref={rootRef} className="select-trigger relative w-full">
45
45
  <button
46
46
  ref={setReference}
47
47
  type="button"
@@ -49,7 +49,7 @@ export const SelectTriggerButton = ({
49
49
  onKeyDown={onKeyDown}
50
50
  disabled={disabled}
51
51
  className={cn(
52
- `flex w-full cursor-pointer items-center gap-2 rounded-md border border-border-normal bg-bg-normal px-3 py-2 font-medium text-fg-normal text-sm transition-colors hover:bg-bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50`,
52
+ `border-(color:--select-trigger-border) focus-visible:ring-(color:--select-trigger-ring) flex w-full cursor-pointer items-center gap-2 rounded-md border bg-(--select-trigger-bg) px-3 py-2 font-medium text-(--select-trigger-fg) text-sm transition-colors hover:bg-(--select-trigger-bg-hovered) focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50`,
53
53
  collapsed ? "justify-center" : "justify-between",
54
54
  showClear && "pr-9",
55
55
  className
@@ -67,7 +67,7 @@ export const SelectTriggerButton = ({
67
67
  <>
68
68
  <span className="truncate">{displayLabel}</span>
69
69
  <span className="flex shrink-0 items-center gap-1">
70
- <ChevronDown className={cn("h-4 w-4 text-fg-subtle transition-transform", open && "rotate-180")} />
70
+ <ChevronDown className={cn("h-4 w-4 text-(--select-trigger-icon-fg) transition-transform", open && "rotate-180")} />
71
71
  </span>
72
72
  </>
73
73
  )}
@@ -77,7 +77,7 @@ export const SelectTriggerButton = ({
77
77
  type="button"
78
78
  onClick={onClear}
79
79
  disabled={disabled}
80
- className="absolute top-1/2 right-8 -translate-y-1/2 rounded-sm p-0.5 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring"
80
+ className="select-trigger-clear focus-visible:ring-(color:--select-trigger-ring) absolute top-1/2 right-8 -translate-y-1/2 rounded-sm p-0.5 text-(--select-trigger-clear-fg) hover:bg-(--select-trigger-clear-bg-hovered) hover:text-(--select-trigger-clear-fg-hovered) focus-visible:outline-none focus-visible:ring-2"
81
81
  aria-label="Clear selection"
82
82
  >
83
83
  <X className="h-3.5 w-3.5" />
@@ -128,7 +128,7 @@ export const SelectTriggerSearch = ({
128
128
  if (typeof rootRef === "function") rootRef(node);
129
129
  else if (rootRef) (rootRef as WritableRefObject<HTMLDivElement | null>).current = node;
130
130
  }}
131
- className={cn("relative flex w-full items-center", className)}
131
+ className={cn("select-trigger relative flex w-full items-center", className)}
132
132
  >
133
133
  <input
134
134
  ref={inputRef as React.RefObject<HTMLInputElement>}
@@ -139,7 +139,7 @@ export const SelectTriggerSearch = ({
139
139
  placeholder={displayLabel}
140
140
  disabled={disabled}
141
141
  className={cn(
142
- `flex-1 rounded-md border border-border-normal bg-bg-normal px-3 py-2 font-medium text-fg-normal text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50`
142
+ `border-(color:--select-trigger-border) focus-visible:ring-(color:--select-trigger-ring) flex-1 rounded-md border bg-(--select-trigger-bg) px-3 py-2 font-medium text-(--select-trigger-fg) text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50`
143
143
  )}
144
144
  role="combobox"
145
145
  aria-expanded={open}
@@ -148,6 +148,6 @@ export const SelectTriggerSearch = ({
148
148
  aria-autocomplete="list"
149
149
  {...props}
150
150
  />
151
- <ChevronDown className="pointer-events-none absolute right-3 h-4 w-4 text-fg-subtle" />
151
+ <ChevronDown className="pointer-events-none absolute right-3 h-4 w-4 text-(--select-trigger-icon-fg)" />
152
152
  </div>
153
153
  );
@@ -6,6 +6,16 @@ export type SeparatorProps = React.HTMLAttributes<HTMLDivElement> & {
6
6
  decorative?: boolean;
7
7
  };
8
8
 
9
+ /**
10
+ * Thin dividing line, horizontal or vertical (`orientation`, default
11
+ * `"horizontal"`). Renders a `<div>`, not `<hr>`.
12
+ *
13
+ * `decorative` (default `true`) controls whether it is exposed to assistive
14
+ * tech: decorative renders `role="none"` and no `aria-orientation`, so it is
15
+ * invisible to a screen reader; set `decorative={false}` for a divider that
16
+ * is actually part of the content's structure (e.g. between menu sections),
17
+ * which renders `role="separator"` and `aria-orientation` instead.
18
+ */
9
19
  const Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => (
10
20
  <div
11
21
  ref={ref}
@@ -128,8 +128,8 @@ const SheetRoot = forwardRef<HTMLDivElement, SheetProps>(
128
128
  data-state={state}
129
129
  data-side={side}
130
130
  className={cn(
131
- "fixed top-0 bottom-0 z-sheet flex flex-col overflow-hidden bg-bg-normal outline-hidden",
132
- "border-border-normal shadow-lg",
131
+ "sheet fixed top-0 bottom-0 z-sheet flex flex-col overflow-hidden bg-(--sheet-bg) outline-hidden",
132
+ "border-(color:--sheet-border) shadow-lg",
133
133
  side === "right" ? "right-0 border-l" : "left-0 border-r",
134
134
  sizeClasses[size],
135
135
  "max-sm:inset-x-0",
@@ -154,6 +154,12 @@ SheetRoot.displayName = "Sheet";
154
154
  // Compound Component Export
155
155
  // =============================================================================
156
156
 
157
+ /**
158
+ * NOTE: Storybook shows the copy in Sheet.stories.tsx
159
+ * (`parameters.docs.description.component`), not this comment. react-docgen
160
+ * cannot extract a description from this declaration shape, so keeping a
161
+ * second copy here would only drift. Edit the stories file.
162
+ */
157
163
  export const Sheet = Object.assign(SheetRoot, {
158
164
  Header: SheetHeader,
159
165
  Body: SheetBody,
@@ -4,6 +4,6 @@ import * as React from "react";
4
4
  export type SheetFooterProps = React.HTMLAttributes<HTMLDivElement>;
5
5
 
6
6
  export const SheetFooter = React.forwardRef<HTMLDivElement, SheetFooterProps>(({ className, ...props }, ref) => (
7
- <div ref={ref} className={cn("flex items-center border-border-normal border-t p-4", className)} {...props} />
7
+ <div ref={ref} className={cn("sheet-footer border-(color:--sheet-footer-border) flex items-center border-t p-4", className)} {...props} />
8
8
  ));
9
9
  SheetFooter.displayName = "SheetFooter";
@@ -24,7 +24,7 @@ export const SheetHeader = React.forwardRef<HTMLDivElement, SheetHeaderProps>(({
24
24
  <div
25
25
  ref={ref}
26
26
  id={id ?? context?.titleId}
27
- className={cn("flex flex-col space-y-1.5 border-border-normal border-b p-6", closable && "pr-12", className)}
27
+ className={cn("sheet-header border-(color:--sheet-header-border) flex flex-col space-y-1.5 border-b p-6", closable && "pr-12", className)}
28
28
  {...props}
29
29
  >
30
30
  {children}
@@ -33,7 +33,7 @@ export const SheetHeader = React.forwardRef<HTMLDivElement, SheetHeaderProps>(({
33
33
  type="button"
34
34
  onClick={onClose}
35
35
  aria-label="Close"
36
- className="absolute top-4 right-4 cursor-pointer rounded-md p-1 text-fg-subtle transition-colors hover:bg-bg-subtle hover:text-fg-normal"
36
+ className="sheet-close absolute top-4 right-4 cursor-pointer rounded-md p-1 text-(--sheet-close-fg) transition-colors hover:bg-(--sheet-close-bg-hovered) hover:text-(--sheet-close-fg-hovered)"
37
37
  >
38
38
  <X size={16} />
39
39
  </button>
@@ -51,6 +51,17 @@ function buildPath(points: { x: number; y: number }[], interpolation: Interpolat
51
51
  return parts.join(" ");
52
52
  }
53
53
 
54
+ /**
55
+ * A minimal inline trend line for embedding in a table cell or card — an
56
+ * `<svg>` inside an `inline-block` `<span>`, sized to `width`/`height` rather
57
+ * than a chart that lays out its own labels or axes.
58
+ *
59
+ * Requires at least 2 data points; with fewer it renders nothing (`null`).
60
+ * `color` is a single CSS color string (default `var(--fg-brand)`), and
61
+ * `interpolation` reuses the same `Interpolation` type as `LineChart`. The
62
+ * accessible name is a static `aria-label="Trend line"` — it does not
63
+ * describe the actual values.
64
+ */
54
65
  export const Sparkline = React.forwardRef<HTMLSpanElement, SparklineProps>(
55
66
  ({ data, width = 80, height = 24, color = "var(--fg-brand)", fillArea = false, interpolation = "monotone", strokeWidth = 1.5, className, ...rest }, ref) => {
56
67
  if (data.length < 2) return null;