@sixthshift/design-system 0.3.0 → 0.4.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 (508) hide show
  1. package/README.md +114 -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 +13 -0
  32. package/dist/components/Card/Card.d.ts.map +1 -1
  33. package/dist/components/Card/Card.js +15 -2
  34. package/dist/components/Card/Card.js.map +1 -1
  35. package/dist/components/Checkbox/Checkbox.d.ts +21 -0
  36. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  37. package/dist/components/Checkbox/Checkbox.js +22 -1
  38. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  39. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +22 -0
  40. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  41. package/dist/components/CheckboxGroup/CheckboxGroup.js +22 -0
  42. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
  43. package/dist/components/Code/Editor/Editor.js +2 -2
  44. package/dist/components/Code/Editor/Editor.js.map +1 -1
  45. package/dist/components/Code/Editor/themes.d.ts +2 -2
  46. package/dist/components/Code/Editor/themes.d.ts.map +1 -1
  47. package/dist/components/Code/Editor/themes.js +50 -32
  48. package/dist/components/Code/Editor/themes.js.map +1 -1
  49. package/dist/components/Code/ValidationStatus/ValidationStatus.d.ts.map +1 -1
  50. package/dist/components/Code/ValidationStatus/ValidationStatus.js.map +1 -1
  51. package/dist/components/DatePicker/DatePicker.d.ts +43 -0
  52. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  53. package/dist/components/DatePicker/DatePicker.js +166 -4
  54. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  55. package/dist/components/DatePicker/DateSegments.d.ts +60 -0
  56. package/dist/components/DatePicker/DateSegments.d.ts.map +1 -0
  57. package/dist/components/DatePicker/DateSegments.js +80 -0
  58. package/dist/components/DatePicker/DateSegments.js.map +1 -0
  59. package/dist/components/DatePicker/datepicker.types.d.ts +19 -1
  60. package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
  61. package/dist/components/DatePicker/index.d.ts +1 -1
  62. package/dist/components/DatePicker/index.d.ts.map +1 -1
  63. package/dist/components/DateRangePicker/DateRangePicker.d.ts +20 -2
  64. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  65. package/dist/components/DateRangePicker/DateRangePicker.js +22 -4
  66. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  67. package/dist/components/DateRangePicker/daterangepicker.types.d.ts +6 -1
  68. package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
  69. package/dist/components/DateTimePicker/DateTimePicker.d.ts +30 -2
  70. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  71. package/dist/components/DateTimePicker/DateTimePicker.js +105 -32
  72. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  73. package/dist/components/DateTimePicker/DateTimeSegments.d.ts +41 -0
  74. package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -0
  75. package/dist/components/DateTimePicker/DateTimeSegments.js +67 -0
  76. package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -0
  77. package/dist/components/DateTimePicker/datetimepicker.types.d.ts +6 -1
  78. package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
  79. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +28 -2
  80. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
  81. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +136 -58
  82. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
  83. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +6 -1
  84. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
  85. package/dist/components/Field/Field.d.ts +15 -17
  86. package/dist/components/Field/Field.d.ts.map +1 -1
  87. package/dist/components/Field/Field.js +18 -3
  88. package/dist/components/Field/Field.js.map +1 -1
  89. package/dist/components/FormField/FormField.d.ts +15 -0
  90. package/dist/components/FormField/FormField.d.ts.map +1 -1
  91. package/dist/components/FormField/FormField.js +15 -0
  92. package/dist/components/FormField/FormField.js.map +1 -1
  93. package/dist/components/HoverCard/HoverCard.d.ts +6 -0
  94. package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
  95. package/dist/components/HoverCard/HoverCard.js +6 -0
  96. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  97. package/dist/components/Input/Input.d.ts +15 -0
  98. package/dist/components/Input/Input.d.ts.map +1 -1
  99. package/dist/components/Input/Input.js +18 -3
  100. package/dist/components/Input/Input.js.map +1 -1
  101. package/dist/components/LineChart/LineChart.d.ts +17 -0
  102. package/dist/components/LineChart/LineChart.d.ts.map +1 -1
  103. package/dist/components/LineChart/LineChart.js +17 -0
  104. package/dist/components/LineChart/LineChart.js.map +1 -1
  105. package/dist/components/Markdown/Markdown.d.ts +17 -0
  106. package/dist/components/Markdown/Markdown.d.ts.map +1 -1
  107. package/dist/components/Markdown/Markdown.js +17 -0
  108. package/dist/components/Markdown/Markdown.js.map +1 -1
  109. package/dist/components/Message/Message.d.ts +49 -4
  110. package/dist/components/Message/Message.d.ts.map +1 -1
  111. package/dist/components/Message/Message.js +53 -17
  112. package/dist/components/Message/Message.js.map +1 -1
  113. package/dist/components/Message/index.d.ts +1 -1
  114. package/dist/components/Message/index.d.ts.map +1 -1
  115. package/dist/components/Modal/Modal.d.ts +36 -0
  116. package/dist/components/Modal/Modal.d.ts.map +1 -1
  117. package/dist/components/Modal/Modal.js +37 -1
  118. package/dist/components/Modal/Modal.js.map +1 -1
  119. package/dist/components/Modal/components/ModalHeader.js +1 -1
  120. package/dist/components/Modal/components/ModalHeader.js.map +1 -1
  121. package/dist/components/Popover/Popover.d.ts +29 -0
  122. package/dist/components/Popover/Popover.d.ts.map +1 -1
  123. package/dist/components/Popover/Popover.js +29 -0
  124. package/dist/components/Popover/Popover.js.map +1 -1
  125. package/dist/components/ProgressBar/ProgressBar.d.ts +14 -0
  126. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
  127. package/dist/components/ProgressBar/ProgressBar.js +14 -0
  128. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  129. package/dist/components/RadioButton/RadioButton.d.ts +26 -0
  130. package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
  131. package/dist/components/RadioButton/RadioButton.js +35 -1
  132. package/dist/components/RadioButton/RadioButton.js.map +1 -1
  133. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts +26 -0
  134. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
  135. package/dist/components/RadioButtonGroup/RadioButtonGroup.js +33 -0
  136. package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  137. package/dist/components/SearchInput/SearchInput.d.ts +10 -0
  138. package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
  139. package/dist/components/SearchInput/SearchInput.js +12 -1
  140. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  141. package/dist/components/Select/Select.d.ts +4 -5
  142. package/dist/components/Select/Select.d.ts.map +1 -1
  143. package/dist/components/Select/Select.js +4 -5
  144. package/dist/components/Select/Select.js.map +1 -1
  145. package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
  146. package/dist/components/Select/SelectDropdown.js +4 -3
  147. package/dist/components/Select/SelectDropdown.js.map +1 -1
  148. package/dist/components/Select/SelectTrigger.js +2 -2
  149. package/dist/components/Select/SelectTrigger.js.map +1 -1
  150. package/dist/components/Separator/Separator.d.ts +10 -0
  151. package/dist/components/Separator/Separator.d.ts.map +1 -1
  152. package/dist/components/Separator/Separator.js +10 -0
  153. package/dist/components/Separator/Separator.js.map +1 -1
  154. package/dist/components/Sheet/Sheet.d.ts +6 -0
  155. package/dist/components/Sheet/Sheet.d.ts.map +1 -1
  156. package/dist/components/Sheet/Sheet.js +7 -1
  157. package/dist/components/Sheet/Sheet.js.map +1 -1
  158. package/dist/components/Sheet/components/SheetFooter.js +1 -1
  159. package/dist/components/Sheet/components/SheetFooter.js.map +1 -1
  160. package/dist/components/Sheet/components/SheetHeader.js +1 -1
  161. package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
  162. package/dist/components/Sparkline/Sparkline.d.ts +11 -0
  163. package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
  164. package/dist/components/Sparkline/Sparkline.js +11 -0
  165. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  166. package/dist/components/Spinner/Spinner.d.ts +27 -2
  167. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  168. package/dist/components/Spinner/Spinner.js +28 -3
  169. package/dist/components/Spinner/Spinner.js.map +1 -1
  170. package/dist/components/Switch/Switch.d.ts +18 -0
  171. package/dist/components/Switch/Switch.d.ts.map +1 -1
  172. package/dist/components/Switch/Switch.js +19 -1
  173. package/dist/components/Switch/Switch.js.map +1 -1
  174. package/dist/components/Tabs/Tabs.d.ts +6 -0
  175. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  176. package/dist/components/Tabs/Tabs.js +6 -0
  177. package/dist/components/Tabs/Tabs.js.map +1 -1
  178. package/dist/components/Tabs/components/TabsTrigger.d.ts.map +1 -1
  179. package/dist/components/Tabs/components/TabsTrigger.js +22 -6
  180. package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
  181. package/dist/components/TagChip/TagChip.d.ts +14 -12
  182. package/dist/components/TagChip/TagChip.d.ts.map +1 -1
  183. package/dist/components/TagChip/TagChip.js +14 -1
  184. package/dist/components/TagChip/TagChip.js.map +1 -1
  185. package/dist/components/TagInput/TagInput.d.ts +11 -8
  186. package/dist/components/TagInput/TagInput.d.ts.map +1 -1
  187. package/dist/components/TagInput/TagInput.js +11 -0
  188. package/dist/components/TagInput/TagInput.js.map +1 -1
  189. package/dist/components/Text/Text.d.ts +9 -0
  190. package/dist/components/Text/Text.d.ts.map +1 -1
  191. package/dist/components/Text/Text.js +9 -0
  192. package/dist/components/Text/Text.js.map +1 -1
  193. package/dist/components/TextInline/TextInline.d.ts +15 -4
  194. package/dist/components/TextInline/TextInline.d.ts.map +1 -1
  195. package/dist/components/TextInline/TextInline.js +11 -0
  196. package/dist/components/TextInline/TextInline.js.map +1 -1
  197. package/dist/components/Textarea/Textarea.d.ts +12 -0
  198. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  199. package/dist/components/Textarea/Textarea.js +13 -1
  200. package/dist/components/Textarea/Textarea.js.map +1 -1
  201. package/dist/components/TimePicker/TimeColumn.d.ts +10 -1
  202. package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
  203. package/dist/components/TimePicker/TimeColumn.js +8 -1
  204. package/dist/components/TimePicker/TimeColumn.js.map +1 -1
  205. package/dist/components/TimePicker/TimePicker.d.ts +32 -0
  206. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
  207. package/dist/components/TimePicker/TimePicker.js +93 -6
  208. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  209. package/dist/components/TimePicker/TimeSegments.d.ts +50 -0
  210. package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -0
  211. package/dist/components/TimePicker/TimeSegments.js +93 -0
  212. package/dist/components/TimePicker/TimeSegments.js.map +1 -0
  213. package/dist/components/TimePicker/timepicker.hooks.d.ts +0 -4
  214. package/dist/components/TimePicker/timepicker.hooks.d.ts.map +1 -1
  215. package/dist/components/TimePicker/timepicker.hooks.js +1 -23
  216. package/dist/components/TimePicker/timepicker.hooks.js.map +1 -1
  217. package/dist/components/TimePicker/timepicker.types.d.ts +0 -2
  218. package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
  219. package/dist/components/Toast/Toast.d.ts +27 -0
  220. package/dist/components/Toast/Toast.d.ts.map +1 -1
  221. package/dist/components/Toast/Toast.js +28 -1
  222. package/dist/components/Toast/Toast.js.map +1 -1
  223. package/dist/components/Toggle/Toggle.d.ts +31 -12
  224. package/dist/components/Toggle/Toggle.d.ts.map +1 -1
  225. package/dist/components/Toggle/Toggle.js +19 -31
  226. package/dist/components/Toggle/Toggle.js.map +1 -1
  227. package/dist/components/Toggle/index.d.ts +1 -1
  228. package/dist/components/Toggle/index.d.ts.map +1 -1
  229. package/dist/components/Toggle/index.js +1 -1
  230. package/dist/components/Toggle/index.js.map +1 -1
  231. package/dist/components/ToggleGroup/ToggleGroup.d.ts +17 -0
  232. package/dist/components/ToggleGroup/ToggleGroup.d.ts.map +1 -1
  233. package/dist/components/ToggleGroup/ToggleGroup.js +17 -0
  234. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  235. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
  236. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts.map +1 -1
  237. package/dist/components/ToggleGroup/ToggleGroupItem.js +7 -6
  238. package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
  239. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +4 -3
  240. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
  241. package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
  242. package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
  243. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +4 -3
  244. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
  245. package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
  246. package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
  247. package/dist/components/ToggleGroup/toggleGroup.types.d.ts +12 -3
  248. package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
  249. package/dist/components/Tooltip/Tooltip.d.ts +6 -0
  250. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  251. package/dist/components/Tooltip/Tooltip.js +6 -0
  252. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  253. package/dist/date-time/index.d.ts.map +1 -1
  254. package/dist/date-time/index.js +0 -1
  255. package/dist/date-time/index.js.map +1 -1
  256. package/dist/internal/PickerField.d.ts +45 -0
  257. package/dist/internal/PickerField.d.ts.map +1 -0
  258. package/dist/internal/PickerField.js +24 -0
  259. package/dist/internal/PickerField.js.map +1 -0
  260. package/dist/internal/SegmentedField.d.ts +98 -0
  261. package/dist/internal/SegmentedField.d.ts.map +1 -0
  262. package/dist/internal/SegmentedField.js +315 -0
  263. package/dist/internal/SegmentedField.js.map +1 -0
  264. package/dist/internal/index.d.ts +2 -0
  265. package/dist/internal/index.d.ts.map +1 -1
  266. package/dist/internal/index.js +2 -0
  267. package/dist/internal/index.js.map +1 -1
  268. package/dist/theme/index.d.ts +2 -2
  269. package/dist/theme/index.d.ts.map +1 -1
  270. package/dist/theme/index.js +1 -1
  271. package/dist/theme/index.js.map +1 -1
  272. package/dist/theme/schema.d.ts +0 -22
  273. package/dist/theme/schema.d.ts.map +1 -1
  274. package/dist/theme/schema.js +0 -9
  275. package/dist/theme/schema.js.map +1 -1
  276. package/package.json +3 -45
  277. package/src/components/Badge/Badge.tsx +85 -48
  278. package/src/components/Badge/index.ts +10 -1
  279. package/src/components/BarChart/BarChart.tsx +12 -0
  280. package/src/components/Button/Button.tsx +129 -106
  281. package/src/components/Button/index.ts +10 -1
  282. package/src/components/Calendar/Calendar.tsx +29 -16
  283. package/src/components/Calendar/CalendarView.tsx +10 -1
  284. package/src/components/Calendar/calendar.types.ts +10 -0
  285. package/src/components/Card/Card.tsx +15 -2
  286. package/src/components/Checkbox/Checkbox.tsx +22 -2
  287. package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -0
  288. package/src/components/Code/Editor/Editor.tsx +2 -2
  289. package/src/components/Code/Editor/themes.ts +50 -32
  290. package/src/components/Code/ValidationStatus/ValidationStatus.tsx +6 -3
  291. package/src/components/DatePicker/DatePicker.tsx +279 -28
  292. package/src/components/DatePicker/DateSegments.tsx +125 -0
  293. package/src/components/DatePicker/datepicker.types.ts +21 -1
  294. package/src/components/DatePicker/index.ts +8 -1
  295. package/src/components/DateRangePicker/DateRangePicker.tsx +22 -4
  296. package/src/components/DateRangePicker/daterangepicker.types.ts +7 -1
  297. package/src/components/DateTimePicker/DateTimePicker.tsx +143 -70
  298. package/src/components/DateTimePicker/DateTimeSegments.tsx +113 -0
  299. package/src/components/DateTimePicker/datetimepicker.types.ts +7 -1
  300. package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +195 -104
  301. package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +7 -1
  302. package/src/components/Field/Field.tsx +20 -22
  303. package/src/components/FormField/FormField.tsx +15 -0
  304. package/src/components/HoverCard/HoverCard.tsx +6 -0
  305. package/src/components/Input/Input.tsx +19 -4
  306. package/src/components/LineChart/LineChart.tsx +17 -0
  307. package/src/components/Markdown/Markdown.tsx +17 -0
  308. package/src/components/Message/Message.tsx +73 -23
  309. package/src/components/Message/index.ts +1 -1
  310. package/src/components/Modal/Modal.tsx +42 -3
  311. package/src/components/Modal/components/ModalHeader.tsx +1 -1
  312. package/src/components/Popover/Popover.tsx +29 -0
  313. package/src/components/ProgressBar/ProgressBar.tsx +14 -0
  314. package/src/components/RadioButton/RadioButton.tsx +34 -3
  315. package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +32 -0
  316. package/src/components/SearchInput/SearchInput.tsx +13 -2
  317. package/src/components/Select/Select.tsx +4 -5
  318. package/src/components/Select/SelectDropdown.tsx +13 -9
  319. package/src/components/Select/SelectTrigger.tsx +7 -7
  320. package/src/components/Separator/Separator.tsx +10 -0
  321. package/src/components/Sheet/Sheet.tsx +8 -2
  322. package/src/components/Sheet/components/SheetFooter.tsx +1 -1
  323. package/src/components/Sheet/components/SheetHeader.tsx +2 -2
  324. package/src/components/Sparkline/Sparkline.tsx +11 -0
  325. package/src/components/Spinner/Spinner.tsx +28 -3
  326. package/src/components/Switch/Switch.tsx +27 -4
  327. package/src/components/Tabs/Tabs.tsx +6 -0
  328. package/src/components/Tabs/components/TabsTrigger.tsx +22 -5
  329. package/src/components/TagChip/TagChip.tsx +18 -16
  330. package/src/components/TagInput/TagInput.tsx +11 -8
  331. package/src/components/Text/Text.tsx +9 -0
  332. package/src/components/TextInline/TextInline.tsx +11 -0
  333. package/src/components/Textarea/Textarea.tsx +13 -1
  334. package/src/components/TimePicker/TimeColumn.tsx +24 -1
  335. package/src/components/TimePicker/TimePicker.tsx +127 -39
  336. package/src/components/TimePicker/TimeSegments.tsx +131 -0
  337. package/src/components/TimePicker/timepicker.hooks.ts +1 -24
  338. package/src/components/TimePicker/timepicker.types.ts +0 -3
  339. package/src/components/Toast/Toast.tsx +28 -1
  340. package/src/components/Toggle/Toggle.tsx +34 -32
  341. package/src/components/Toggle/index.ts +1 -1
  342. package/src/components/ToggleGroup/ToggleGroup.tsx +17 -0
  343. package/src/components/ToggleGroup/ToggleGroupItem.tsx +13 -8
  344. package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +3 -1
  345. package/src/components/ToggleGroup/ToggleGroupSingle.tsx +3 -1
  346. package/src/components/ToggleGroup/toggleGroup.types.ts +12 -3
  347. package/src/components/Tooltip/Tooltip.tsx +6 -0
  348. package/src/date-time/index.ts +0 -1
  349. package/src/internal/PickerField.tsx +90 -0
  350. package/src/internal/SegmentedField.tsx +445 -0
  351. package/src/internal/index.ts +2 -0
  352. package/src/theme/index.ts +0 -6
  353. package/src/theme/recipes/badge.css +140 -0
  354. package/src/theme/recipes/button.css +167 -0
  355. package/src/theme/recipes/card.css +26 -0
  356. package/src/theme/recipes/checkbox.css +44 -0
  357. package/src/theme/recipes/field.css +14 -0
  358. package/src/theme/recipes/index.css +28 -0
  359. package/src/theme/recipes/input.css +29 -0
  360. package/src/theme/recipes/message.css +47 -0
  361. package/src/theme/recipes/modal.css +31 -0
  362. package/src/theme/recipes/radio-button.css +42 -0
  363. package/src/theme/recipes/search-input.css +16 -0
  364. package/src/theme/recipes/select.css +105 -0
  365. package/src/theme/recipes/sheet.css +34 -0
  366. package/src/theme/recipes/spinner.css +17 -0
  367. package/src/theme/recipes/switch.css +39 -0
  368. package/src/theme/recipes/tabs.css +41 -0
  369. package/src/theme/recipes/tag-chip.css +27 -0
  370. package/src/theme/recipes/textarea.css +20 -0
  371. package/src/theme/recipes/toggle.css +92 -0
  372. package/src/theme/schema.ts +0 -27
  373. package/src/theme/tokens.css +26 -9
  374. package/dist/components/Avatar/Avatar.d.ts +0 -6
  375. package/dist/components/Avatar/Avatar.d.ts.map +0 -1
  376. package/dist/components/Avatar/Avatar.js +0 -11
  377. package/dist/components/Avatar/Avatar.js.map +0 -1
  378. package/dist/components/Avatar/index.d.ts +0 -2
  379. package/dist/components/Avatar/index.d.ts.map +0 -1
  380. package/dist/components/Avatar/index.js +0 -2
  381. package/dist/components/Avatar/index.js.map +0 -1
  382. package/dist/components/Breadcrumb/Breadcrumb.d.ts +0 -12
  383. package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +0 -1
  384. package/dist/components/Breadcrumb/Breadcrumb.js +0 -19
  385. package/dist/components/Breadcrumb/Breadcrumb.js.map +0 -1
  386. package/dist/components/Breadcrumb/index.d.ts +0 -2
  387. package/dist/components/Breadcrumb/index.d.ts.map +0 -1
  388. package/dist/components/Breadcrumb/index.js +0 -2
  389. package/dist/components/Breadcrumb/index.js.map +0 -1
  390. package/dist/components/ColorDot/ColorDot.d.ts +0 -19
  391. package/dist/components/ColorDot/ColorDot.d.ts.map +0 -1
  392. package/dist/components/ColorDot/ColorDot.js +0 -36
  393. package/dist/components/ColorDot/ColorDot.js.map +0 -1
  394. package/dist/components/ColorDot/index.d.ts +0 -2
  395. package/dist/components/ColorDot/index.d.ts.map +0 -1
  396. package/dist/components/ColorDot/index.js +0 -2
  397. package/dist/components/ColorDot/index.js.map +0 -1
  398. package/dist/components/EmptyState/EmptyState.d.ts +0 -26
  399. package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
  400. package/dist/components/EmptyState/EmptyState.js +0 -9
  401. package/dist/components/EmptyState/EmptyState.js.map +0 -1
  402. package/dist/components/EmptyState/index.d.ts +0 -2
  403. package/dist/components/EmptyState/index.d.ts.map +0 -1
  404. package/dist/components/EmptyState/index.js +0 -2
  405. package/dist/components/EmptyState/index.js.map +0 -1
  406. package/dist/components/HeatMap/HeatMapCalendar.d.ts +0 -11
  407. package/dist/components/HeatMap/HeatMapCalendar.d.ts.map +0 -1
  408. package/dist/components/HeatMap/HeatMapCalendar.js +0 -68
  409. package/dist/components/HeatMap/HeatMapCalendar.js.map +0 -1
  410. package/dist/components/HeatMap/HeatMapMatrix.d.ts +0 -12
  411. package/dist/components/HeatMap/HeatMapMatrix.d.ts.map +0 -1
  412. package/dist/components/HeatMap/HeatMapMatrix.js +0 -35
  413. package/dist/components/HeatMap/HeatMapMatrix.js.map +0 -1
  414. package/dist/components/HeatMap/heat-map.utils.d.ts +0 -10
  415. package/dist/components/HeatMap/heat-map.utils.d.ts.map +0 -1
  416. package/dist/components/HeatMap/heat-map.utils.js +0 -10
  417. package/dist/components/HeatMap/heat-map.utils.js.map +0 -1
  418. package/dist/components/HeatMap/index.d.ts +0 -4
  419. package/dist/components/HeatMap/index.d.ts.map +0 -1
  420. package/dist/components/HeatMap/index.js +0 -3
  421. package/dist/components/HeatMap/index.js.map +0 -1
  422. package/dist/components/MetricList/MetricList.d.ts +0 -9
  423. package/dist/components/MetricList/MetricList.d.ts.map +0 -1
  424. package/dist/components/MetricList/MetricList.js +0 -8
  425. package/dist/components/MetricList/MetricList.js.map +0 -1
  426. package/dist/components/MetricList/MetricRow.d.ts +0 -13
  427. package/dist/components/MetricList/MetricRow.d.ts.map +0 -1
  428. package/dist/components/MetricList/MetricRow.js +0 -13
  429. package/dist/components/MetricList/MetricRow.js.map +0 -1
  430. package/dist/components/MetricList/index.d.ts +0 -3
  431. package/dist/components/MetricList/index.d.ts.map +0 -1
  432. package/dist/components/MetricList/index.js +0 -3
  433. package/dist/components/MetricList/index.js.map +0 -1
  434. package/dist/components/NavBottom/NavBottom.d.ts +0 -16
  435. package/dist/components/NavBottom/NavBottom.d.ts.map +0 -1
  436. package/dist/components/NavBottom/NavBottom.js +0 -21
  437. package/dist/components/NavBottom/NavBottom.js.map +0 -1
  438. package/dist/components/NavBottom/index.d.ts +0 -3
  439. package/dist/components/NavBottom/index.d.ts.map +0 -1
  440. package/dist/components/NavBottom/index.js +0 -2
  441. package/dist/components/NavBottom/index.js.map +0 -1
  442. package/dist/components/NavSide/NavItem.d.ts +0 -9
  443. package/dist/components/NavSide/NavItem.d.ts.map +0 -1
  444. package/dist/components/NavSide/NavItem.js +0 -13
  445. package/dist/components/NavSide/NavItem.js.map +0 -1
  446. package/dist/components/NavSide/NavSide.d.ts +0 -16
  447. package/dist/components/NavSide/NavSide.d.ts.map +0 -1
  448. package/dist/components/NavSide/NavSide.js +0 -12
  449. package/dist/components/NavSide/NavSide.js.map +0 -1
  450. package/dist/components/NavSide/index.d.ts +0 -3
  451. package/dist/components/NavSide/index.d.ts.map +0 -1
  452. package/dist/components/NavSide/index.js +0 -2
  453. package/dist/components/NavSide/index.js.map +0 -1
  454. package/dist/components/NavSide/types.d.ts +0 -38
  455. package/dist/components/NavSide/types.d.ts.map +0 -1
  456. package/dist/components/NavSide/types.js +0 -2
  457. package/dist/components/NavSide/types.js.map +0 -1
  458. package/dist/components/Pagination/Pagination.d.ts +0 -35
  459. package/dist/components/Pagination/Pagination.d.ts.map +0 -1
  460. package/dist/components/Pagination/Pagination.js +0 -26
  461. package/dist/components/Pagination/Pagination.js.map +0 -1
  462. package/dist/components/Pagination/index.d.ts +0 -3
  463. package/dist/components/Pagination/index.d.ts.map +0 -1
  464. package/dist/components/Pagination/index.js +0 -2
  465. package/dist/components/Pagination/index.js.map +0 -1
  466. package/dist/components/Skeleton/Skeleton.d.ts +0 -4
  467. package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
  468. package/dist/components/Skeleton/Skeleton.js +0 -9
  469. package/dist/components/Skeleton/Skeleton.js.map +0 -1
  470. package/dist/components/Skeleton/index.d.ts +0 -2
  471. package/dist/components/Skeleton/index.d.ts.map +0 -1
  472. package/dist/components/Skeleton/index.js +0 -2
  473. package/dist/components/Skeleton/index.js.map +0 -1
  474. package/dist/components/StatsCard/StatsCard.d.ts +0 -17
  475. package/dist/components/StatsCard/StatsCard.d.ts.map +0 -1
  476. package/dist/components/StatsCard/StatsCard.js +0 -15
  477. package/dist/components/StatsCard/StatsCard.js.map +0 -1
  478. package/dist/components/StatsCard/index.d.ts +0 -2
  479. package/dist/components/StatsCard/index.d.ts.map +0 -1
  480. package/dist/components/StatsCard/index.js +0 -2
  481. package/dist/components/StatsCard/index.js.map +0 -1
  482. package/src/components/Avatar/Avatar.tsx +0 -19
  483. package/src/components/Avatar/index.ts +0 -1
  484. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -47
  485. package/src/components/Breadcrumb/index.ts +0 -5
  486. package/src/components/ColorDot/ColorDot.tsx +0 -52
  487. package/src/components/ColorDot/index.ts +0 -1
  488. package/src/components/EmptyState/EmptyState.tsx +0 -30
  489. package/src/components/EmptyState/index.ts +0 -1
  490. package/src/components/HeatMap/HeatMapCalendar.tsx +0 -127
  491. package/src/components/HeatMap/HeatMapMatrix.tsx +0 -75
  492. package/src/components/HeatMap/heat-map.utils.ts +0 -15
  493. package/src/components/HeatMap/index.ts +0 -3
  494. package/src/components/MetricList/MetricList.tsx +0 -18
  495. package/src/components/MetricList/MetricRow.tsx +0 -30
  496. package/src/components/MetricList/index.ts +0 -2
  497. package/src/components/NavBottom/NavBottom.tsx +0 -55
  498. package/src/components/NavBottom/index.ts +0 -3
  499. package/src/components/NavSide/NavItem.tsx +0 -39
  500. package/src/components/NavSide/NavSide.tsx +0 -42
  501. package/src/components/NavSide/index.ts +0 -2
  502. package/src/components/NavSide/types.ts +0 -36
  503. package/src/components/Pagination/Pagination.tsx +0 -86
  504. package/src/components/Pagination/index.ts +0 -2
  505. package/src/components/Skeleton/Skeleton.tsx +0 -9
  506. package/src/components/Skeleton/index.ts +0 -1
  507. package/src/components/StatsCard/StatsCard.tsx +0 -41
  508. package/src/components/StatsCard/index.ts +0 -1
@@ -0,0 +1,131 @@
1
+ import type { Temporal } from "../../date-time";
2
+ import { SegmentedField, type SegmentSpec, type SegmentValues } from "../../internal";
3
+ import { parsedToTemporal, temporalTimeToISO, to12Hour, to24Hour } from "./timepicker.hooks";
4
+ import type { ClockFormat, TimeFormat } from "./timepicker.types";
5
+
6
+ export type TimeSegmentsProps = {
7
+ /** The time the segments display. `undefined` leaves them empty. */
8
+ value: Temporal.PlainTime | undefined;
9
+ /**
10
+ * Fires with a complete time, or `undefined` the moment the segments stop
11
+ * describing one. Never fires a partial time.
12
+ */
13
+ onChange: (time: Temporal.PlainTime | undefined) => void;
14
+ /** `"HH:mm:ss"` adds a seconds segment. */
15
+ format?: TimeFormat | undefined;
16
+ /** `"12h"` runs the hour 1–12 and adds an AM/PM segment. */
17
+ clockFormat?: ClockFormat | undefined;
18
+ isDisabled?: boolean | undefined;
19
+ isInvalid?: boolean | undefined;
20
+ label?: string | undefined;
21
+ onOpenRequest?: (() => void) | undefined;
22
+ onSubmit?: (() => void) | undefined;
23
+ id?: string | undefined;
24
+ className?: string | undefined;
25
+ };
26
+
27
+ const PERIODS = ["AM", "PM"];
28
+
29
+ /**
30
+ * The segments for a clock, which depend on both format props: the hour's range
31
+ * is the difference between a 12-hour and a 24-hour clock, and AM/PM only exists
32
+ * in the former.
33
+ */
34
+ export function timeSpec(format: TimeFormat, clockFormat: ClockFormat, leadingSeparator?: string): SegmentSpec[] {
35
+ const twelve = clockFormat === "12h";
36
+ const spec: SegmentSpec[] = [
37
+ { name: "hour", label: "Hour", placeholder: "hh", digits: 2, min: twelve ? 1 : 0, max: twelve ? 12 : 23, separatorBefore: leadingSeparator },
38
+ { name: "minute", label: "Minute", placeholder: "mm", digits: 2, min: 0, max: 59, separatorBefore: ":" },
39
+ ];
40
+ if (format === "HH:mm:ss") {
41
+ spec.push({ name: "second", label: "Second", placeholder: "ss", digits: 2, min: 0, max: 59, separatorBefore: ":" });
42
+ }
43
+ if (twelve) {
44
+ // A choice segment rather than a number: `a` and `p` type it, arrows toggle
45
+ // it, and it announces "AM" instead of an index.
46
+ spec.push({ kind: "choice", name: "period", label: "AM/PM", placeholder: "--", options: PERIODS, separatorBefore: " " });
47
+ }
48
+ return spec;
49
+ }
50
+
51
+ export function timeCodec(format: TimeFormat, clockFormat: ClockFormat) {
52
+ const twelve = clockFormat === "12h";
53
+ const withSeconds = format === "HH:mm:ss";
54
+
55
+ const toSegments = (time: Temporal.PlainTime | undefined): SegmentValues => {
56
+ if (!time) {
57
+ return {
58
+ hour: null,
59
+ minute: null,
60
+ ...(withSeconds ? { second: null } : {}),
61
+ ...(twelve ? { period: null } : {}),
62
+ };
63
+ }
64
+ const { hour12, period } = to12Hour(time.hour);
65
+ return {
66
+ hour: twelve ? hour12 : time.hour,
67
+ minute: time.minute,
68
+ ...(withSeconds ? { second: time.second } : {}),
69
+ ...(twelve ? { period: period === "PM" ? 1 : 0 } : {}),
70
+ };
71
+ };
72
+
73
+ const fromSegments = (values: Record<string, number>): Temporal.PlainTime => {
74
+ const hour = twelve ? to24Hour(values.hour!, values.period === 1 ? "PM" : "AM") : values.hour!;
75
+ // Seconds are part of the value even when the field does not show them —
76
+ // `onChange` always emits canonical `HH:MM:SS`.
77
+ return parsedToTemporal({ hour, minute: values.minute!, second: withSeconds ? values.second! : 0 });
78
+ };
79
+
80
+ /**
81
+ * A pasted time is read as `H:MM`, `H:MM:SS`, optionally followed by a
82
+ * meridiem. The hour is interpreted in the field's own clock, so `9:30 PM`
83
+ * pasted into a 24-hour field still lands on 21:30.
84
+ */
85
+ const parsePaste = (text: string): SegmentValues | null => {
86
+ const match = /^(\d{1,2}):(\d{2})(?::(\d{2}))?\s*(am|pm)?$/i.exec(text.trim());
87
+ if (!match) return null;
88
+ const meridiem = match[4]?.toUpperCase();
89
+ let hour = Number(match[1]);
90
+ if (meridiem) hour = to24Hour(hour, meridiem === "PM" ? "PM" : "AM");
91
+ if (hour > 23 || Number(match[2]) > 59) return null;
92
+ const second = match[3] === undefined ? 0 : Number(match[3]);
93
+ if (second > 59) return null;
94
+ return toSegments(parsedToTemporal({ hour, minute: Number(match[2]), second }));
95
+ };
96
+
97
+ return { toSegments, fromSegments, parsePaste };
98
+ }
99
+
100
+ /**
101
+ * The typeable half of `TimePicker`: a time as spinbutton segments.
102
+ *
103
+ * A thin spec over `SegmentedField`, which owns the keyboard model. What belongs
104
+ * to clocks specifically lives here: the hour's range and the AM/PM segment,
105
+ * both decided by `clockFormat`, and the fact that the value always carries
106
+ * seconds even when the field does not show them.
107
+ *
108
+ * `minuteStep` deliberately does not constrain typing. It sets the popover
109
+ * column's increment, but snapping a typed `:37` onto a 15-minute grid would
110
+ * fight the keystrokes.
111
+ *
112
+ * Internal to `TimePicker`; not exported from `./index.ts`.
113
+ */
114
+ export function TimeSegments({ value, onChange, format = "HH:mm", clockFormat = "12h", label = "Time", ...rest }: TimeSegmentsProps) {
115
+ const spec = timeSpec(format, clockFormat);
116
+ const { toSegments, fromSegments, parsePaste } = timeCodec(format, clockFormat);
117
+
118
+ return (
119
+ <SegmentedField<Temporal.PlainTime>
120
+ spec={spec}
121
+ value={value}
122
+ toSegments={toSegments}
123
+ fromSegments={fromSegments}
124
+ keyOf={(time) => temporalTimeToISO(time, "HH:mm:ss")}
125
+ onChange={onChange}
126
+ parsePaste={parsePaste}
127
+ label={label}
128
+ {...rest}
129
+ />
130
+ );
131
+ }
@@ -1,4 +1,4 @@
1
- import { formatTimePadded, Temporal } from "../../date-time";
1
+ import { Temporal } from "../../date-time";
2
2
  import type { ClockFormat, ParsedTime, TimeFormat, TimePeriod } from "./timepicker.types";
3
3
 
4
4
  // =============================================================================
@@ -41,29 +41,6 @@ export function temporalTimeToISO(time: Temporal.PlainTime, format: TimeFormat =
41
41
  // Time Formatting
42
42
  // =============================================================================
43
43
 
44
- /**
45
- * Format Temporal.PlainTime for display
46
- */
47
- export function formatTimeDisplay(time: Temporal.PlainTime, clockFormat: ClockFormat = "12h", format: TimeFormat = "HH:mm"): string {
48
- if (clockFormat === "12h") {
49
- return formatTimePadded(time);
50
- }
51
- // 24h format
52
- if (format === "HH:mm:ss") {
53
- return time.toLocaleString("en-US", {
54
- hour: "2-digit",
55
- minute: "2-digit",
56
- second: "2-digit",
57
- hour12: false,
58
- });
59
- }
60
- return time.toLocaleString("en-US", {
61
- hour: "2-digit",
62
- minute: "2-digit",
63
- hour12: false,
64
- });
65
- }
66
-
67
44
  // =============================================================================
68
45
  // Time Comparison
69
46
  // =============================================================================
@@ -67,9 +67,6 @@ export type TimePickerProps = {
67
67
  /** Preset options (shown in sidebar) */
68
68
  presets?: TimePresetOption[];
69
69
 
70
- /** Placeholder text */
71
- placeholder?: string;
72
-
73
70
  /** Input name for form submission */
74
71
  name?: string;
75
72
 
@@ -31,6 +31,33 @@ export type ToastProps = Omit<MessageProps, "size"> & {
31
31
  // Toast
32
32
  // =============================================================================
33
33
 
34
+ /**
35
+ * A transient notification for the outcome of an action that already
36
+ * happened — a save, a delete, a failed request — self-positioned bottom
37
+ * center. Reach for `Toast` over `Message` when the feedback is about an
38
+ * action and shouldn't stick around in the page's layout; reach for
39
+ * `Message` when the feedback belongs inline, in the place the caller puts
40
+ * it (a form's own validation state, an in-card page-load error).
41
+ *
42
+ * Toast renders `Message` internally (`<Message intent={intent}>` wrapping
43
+ * `MessageIcon`/`MessageBody`/`MessageTitle`/`MessageDescription`), so it
44
+ * inherits Message's live-region role mapping: `intent="danger"` gets
45
+ * `role="alert"` (assertive), everything else gets `role="status"` (polite).
46
+ * `action`/`onAction` render a link-style button inside the description; the
47
+ * dismiss (X) button only renders when `onClose` is provided.
48
+ *
49
+ * `standalone` (default `true`) controls positioning: when `true`, Toast
50
+ * portals itself (`FloatingPortal`, optionally to a custom `root`) and
51
+ * applies the fixed bottom-center classes itself. Set it to `false` when a
52
+ * parent already handles portalling and position — this is how
53
+ * `OverlayContext`'s toast stack renders it. Toast has no built-in
54
+ * auto-dismiss timer; that's `useToast`'s job, one layer up.
55
+ *
56
+ * Exit animation (`usePresence`) keeps Toast mounted through its fade-out,
57
+ * so `onClose` fires only after the animation completes. Toast has no focus
58
+ * trap and no Escape handling of its own — it's a passive notification, not
59
+ * a dialog.
60
+ */
34
61
  export const Toast = React.forwardRef<HTMLDivElement, ToastProps>(
35
62
  ({ className, intent = "neutral", title, icon, action, onAction, onClose, root, standalone = true, children, ...props }, ref) => {
36
63
  const { ref: presenceRef, state, isMounted, show, hide } = usePresence();
@@ -93,7 +120,7 @@ export const Toast = React.forwardRef<HTMLDivElement, ToastProps>(
93
120
  </MessageDescription>
94
121
  </MessageBody>
95
122
  {onClose && (
96
- <Button variant="ghost" size="icon" className="h-6 w-6 shrink-0 opacity-70 hover:opacity-100" onClick={handleClose} aria-label="Dismiss">
123
+ <Button variant="ghost" iconOnly className="h-6 w-6 shrink-0 opacity-70 hover:opacity-100" onClick={handleClose} aria-label="Dismiss">
97
124
  <X className="h-4 w-4" />
98
125
  </Button>
99
126
  )}
@@ -1,40 +1,20 @@
1
1
  import { useControllableState } from "@sixthshift/design-system/hooks";
2
2
  import { cn } from "@sixthshift/design-system/utils";
3
- import { cva, type VariantProps } from "class-variance-authority";
3
+ import type { VariantProps } from "class-variance-authority";
4
4
  import * as React from "react";
5
- import { buttonVariants } from "../Button/Button";
5
+ import { type ButtonIntent, type ButtonVariant, buttonRecipe, type buttonVariants } from "../Button/Button";
6
6
 
7
7
  /**
8
- * Pressed-state backgrounds matching Button's active: states.
9
- * When a toggle is "on", its resting background becomes the pressed token.
8
+ * `variant` and `intent` are no longer CVA variants on `buttonVariants` — they
9
+ * select a recipe cell in CSS — so they are declared here rather than inherited
10
+ * through `VariantProps`, which now yields `size` alone.
10
11
  */
11
- const togglePressedVariants = cva("", {
12
- variants: {
13
- variant: { solid: "", outline: "", ghost: "", link: "" },
14
- intent: { neutral: "", danger: "", success: "", warning: "" },
15
- },
16
- compoundVariants: [
17
- // Solid — use the main -pressed background
18
- { variant: "solid", intent: "neutral", className: "bg-bg-brand-pressed hover:bg-bg-brand-pressed" },
19
- { variant: "solid", intent: "danger", className: "bg-bg-danger-pressed hover:bg-bg-danger-pressed" },
20
- { variant: "solid", intent: "success", className: "bg-bg-success-pressed hover:bg-bg-success-pressed" },
21
- { variant: "solid", intent: "warning", className: "bg-bg-warning-pressed hover:bg-bg-warning-pressed" },
22
- // Outline — use the subtle -pressed background
23
- { variant: "outline", intent: "neutral", className: "bg-bg-subtle-pressed text-fg-normal hover:bg-bg-subtle-pressed" },
24
- { variant: "outline", intent: "danger", className: "bg-bg-danger-subtle-pressed text-fg-on-danger-subtle-pressed hover:bg-bg-danger-subtle-pressed" },
25
- { variant: "outline", intent: "success", className: "bg-bg-success-subtle-pressed text-fg-on-success-subtle-pressed hover:bg-bg-success-subtle-pressed" },
26
- { variant: "outline", intent: "warning", className: "bg-bg-warning-subtle-pressed text-fg-on-warning-subtle-pressed hover:bg-bg-warning-subtle-pressed" },
27
- // Ghost — same as outline
28
- { variant: "ghost", intent: "neutral", className: "bg-bg-subtle-pressed text-fg-normal hover:bg-bg-subtle-pressed" },
29
- { variant: "ghost", intent: "danger", className: "bg-bg-danger-subtle-pressed text-fg-on-danger-subtle-pressed hover:bg-bg-danger-subtle-pressed" },
30
- { variant: "ghost", intent: "success", className: "bg-bg-success-subtle-pressed text-fg-on-success-subtle-pressed hover:bg-bg-success-subtle-pressed" },
31
- { variant: "ghost", intent: "warning", className: "bg-bg-warning-subtle-pressed text-fg-on-warning-subtle-pressed hover:bg-bg-warning-subtle-pressed" },
32
- ],
33
- defaultVariants: { variant: "solid", intent: "neutral" },
34
- });
35
-
36
12
  export type ToggleProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onChange" | "value"> &
37
13
  VariantProps<typeof buttonVariants> & {
14
+ variant?: ButtonVariant | undefined;
15
+ intent?: ButtonIntent | undefined;
16
+ /** Square the toggle at its current size, for an icon with no label. */
17
+ iconOnly?: boolean;
38
18
  /** Controlled pressed state */
39
19
  pressed?: boolean;
40
20
  /** Default pressed state for uncontrolled mode */
@@ -43,14 +23,35 @@ export type ToggleProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "o
43
23
  onPressedChange?: (pressed: boolean) => void;
44
24
  };
45
25
 
26
+ /**
27
+ * A single button that toggles between pressed and unpressed, for a binary
28
+ * setting styled like an action (e.g. a bold/italic button in a toolbar) —
29
+ * for a set of mutually exclusive or multi-select options, use `ToggleGroup`
30
+ * instead.
31
+ *
32
+ * Built directly on Button: it calls `buttonRecipe(...)` and takes the same
33
+ * `variant`/`intent`/`size` axes Button does, plus `iconOnly` for a toolbar
34
+ * toggle whose whole content is an icon. The
35
+ * pressed-state colour mapping lives in `src/theme/recipes/toggle.css`,
36
+ * keyed off the `data-state="on" | "off"` attribute this component renders
37
+ * alongside `aria-pressed`.
38
+ *
39
+ * Controlled via `pressed`/`defaultPressed`/`onPressedChange`
40
+ * (`useControllableState`).
41
+ */
46
42
  const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(
47
- ({ className, variant, intent, size, pressed: controlledPressed, defaultPressed = false, onPressedChange, disabled, children, ...props }, ref) => {
43
+ (
44
+ { className, variant, intent, size, iconOnly = false, pressed: controlledPressed, defaultPressed = false, onPressedChange, disabled, children, ...props },
45
+ ref
46
+ ) => {
48
47
  const [pressed, setPressed] = useControllableState({
49
48
  value: controlledPressed,
50
49
  defaultValue: defaultPressed,
51
50
  onChange: onPressedChange,
52
51
  });
53
52
 
53
+ const recipe = buttonRecipe({ variant, intent, size, iconOnly });
54
+
54
55
  return (
55
56
  <button
56
57
  type="button"
@@ -59,7 +60,8 @@ const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(
59
60
  disabled={disabled}
60
61
  ref={ref}
61
62
  onClick={() => setPressed(!pressed)}
62
- className={cn(buttonVariants({ variant, intent, size }), pressed && togglePressedVariants({ variant, intent }), className)}
63
+ {...recipe}
64
+ className={cn(recipe.className, className)}
63
65
  {...props}
64
66
  >
65
67
  {children}
@@ -69,4 +71,4 @@ const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(
69
71
  );
70
72
  Toggle.displayName = "Toggle";
71
73
 
72
- export { Toggle, togglePressedVariants };
74
+ export { Toggle };
@@ -1 +1 @@
1
- export { Toggle, type ToggleProps, togglePressedVariants } from "./Toggle";
1
+ export { Toggle, type ToggleProps } from "./Toggle";
@@ -3,6 +3,23 @@ import { ToggleGroupMultiple } from "./ToggleGroupMultiple";
3
3
  import { ToggleGroupSingle } from "./ToggleGroupSingle";
4
4
  import type { ToggleGroupProps } from "./toggleGroup.types";
5
5
 
6
+ /**
7
+ * A group of `Toggle`-styled buttons for choosing one or more options,
8
+ * switched by `type`: `"single"` renders `role="radiogroup"` with
9
+ * `role="radio"` items — one tab stop, arrow keys move focus and selection
10
+ * together (clicking the already-selected item is a no-op, there's no
11
+ * deselect) — while `"multiple"` renders `role="group"` with `aria-pressed`
12
+ * items, each independently tabbable and toggled on its own. `value`/
13
+ * `defaultValue`/`onValueChange` follow `type`: a string for single, a
14
+ * string array for multiple (`useControllableState`).
15
+ *
16
+ * Items are built on the same `buttonRecipe` as `Button`/`Toggle` and take
17
+ * the same `variant`/`intent`, with two differences: `variant` excludes
18
+ * `"link"` (no clear pressed state for an underline in a group) and `size`
19
+ * excludes `"xl"` (too large for grouped toggles) — see
20
+ * `toggleGroup.types.ts`. `appearance` chooses `"segmented"` (items joined
21
+ * into one border) or `"separate"` (individually bordered, gapped) rendering.
22
+ */
6
23
  const ToggleGroup = React.forwardRef<HTMLDivElement, ToggleGroupProps>((props, ref) => {
7
24
  if (props.type === "multiple") {
8
25
  return <ToggleGroupMultiple ref={ref} {...props} />;
@@ -1,11 +1,10 @@
1
1
  import { cn } from "@sixthshift/design-system/utils";
2
2
  import * as React from "react";
3
- import { buttonVariants } from "../Button/Button";
4
- import { togglePressedVariants } from "../Toggle/Toggle";
3
+ import { buttonRecipe } from "../Button/Button";
5
4
  import type { ToggleGroupBaseProps, ToggleGroupOption } from "./toggleGroup.types";
6
5
 
7
6
  type ItemProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
8
- Required<Pick<ToggleGroupBaseProps, "appearance" | "orientation" | "variant" | "intent" | "size">> & {
7
+ Required<Pick<ToggleGroupBaseProps, "appearance" | "orientation" | "variant" | "intent" | "size" | "iconOnly">> & {
9
8
  option: ToggleGroupOption;
10
9
  selected: boolean;
11
10
  groupDisabled?: boolean | undefined;
@@ -14,24 +13,30 @@ type ItemProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
14
13
  };
15
14
 
16
15
  const ToggleGroupItem = React.forwardRef<HTMLButtonElement, ItemProps>(
17
- ({ option, selected, groupDisabled, appearance, orientation, variant, intent, size, index, total, ...props }, ref) => {
16
+ ({ option, selected, groupDisabled, appearance, orientation, variant, intent, size, iconOnly, index, total, ...props }, ref) => {
18
17
  const isDisabled = groupDisabled || option.disabled;
19
18
  const isFirst = index === 0;
20
19
  const isLast = index === total - 1;
21
20
  const isVertical = orientation === "vertical";
22
21
  const isSegmented = appearance === "segmented";
23
22
 
24
- // Both modes share the same base: buttonVariants + togglePressedVariants.
25
- // Segmented just overrides border/shadow/rounding so items join cleanly.
23
+ // Both modes share the same base: buttonVariants + the pressed-state cells
24
+ // in recipes/toggle.css. Segmented just overrides border/shadow/rounding
25
+ // so items join cleanly.
26
+ const recipe = buttonRecipe({ variant, intent, size, iconOnly });
27
+
26
28
  return (
27
29
  <button
28
30
  ref={ref}
31
+ {...recipe}
29
32
  type="button"
33
+ // Same attribute Toggle renders for `pressed` — recipes/toggle.css
34
+ // selects on it, so selected/unselected items pick up the same cells.
35
+ data-state={selected ? "on" : "off"}
30
36
  disabled={isDisabled}
31
37
  aria-label={option.ariaLabel}
32
38
  className={cn(
33
- buttonVariants({ variant, intent, size }),
34
- selected && togglePressedVariants({ variant, intent }),
39
+ recipe.className,
35
40
  // Segmented: only override rounding (let buttonVariants handle border/color).
36
41
  // Negative margin collapses double borders between outline items.
37
42
  isSegmented &&
@@ -15,7 +15,8 @@ const ToggleGroupMultiple = React.forwardRef<HTMLDivElement, ToggleGroupMultiple
15
15
  orientation = "horizontal",
16
16
  variant = "solid",
17
17
  intent = "neutral",
18
- size = "default",
18
+ size = "md",
19
+ iconOnly = false,
19
20
  disabled,
20
21
  className,
21
22
  ...props
@@ -46,6 +47,7 @@ const ToggleGroupMultiple = React.forwardRef<HTMLDivElement, ToggleGroupMultiple
46
47
  variant={variant}
47
48
  intent={intent}
48
49
  size={size}
50
+ iconOnly={iconOnly}
49
51
  index={index}
50
52
  total={options.length}
51
53
  aria-pressed={value.includes(option.value)}
@@ -17,7 +17,8 @@ const ToggleGroupSingle = React.forwardRef<HTMLDivElement, ToggleGroupSingleProp
17
17
  orientation = "horizontal",
18
18
  variant = "solid",
19
19
  intent = "neutral",
20
- size = "default",
20
+ size = "md",
21
+ iconOnly = false,
21
22
  disabled,
22
23
  className,
23
24
  ...props
@@ -88,6 +89,7 @@ const ToggleGroupSingle = React.forwardRef<HTMLDivElement, ToggleGroupSingleProp
88
89
  variant={variant}
89
90
  intent={intent}
90
91
  size={size}
92
+ iconOnly={iconOnly}
91
93
  index={index}
92
94
  total={options.length}
93
95
  role="radio"
@@ -1,4 +1,5 @@
1
1
  import type * as React from "react";
2
+ import type { ButtonIntentName, ButtonVariantName } from "../Button/Button";
2
3
  import type { ToggleProps } from "../Toggle/Toggle";
3
4
 
4
5
  /** Extract a prop's union type from ToggleProps, stripping null added by CVA */
@@ -22,12 +23,20 @@ export type ToggleGroupBaseProps = Omit<React.HTMLAttributes<HTMLDivElement>, "o
22
23
  appearance?: "segmented" | "separate";
23
24
  /** Layout orientation */
24
25
  orientation?: "vertical" | "horizontal";
25
- /** Button variant (link excluded as it has no clear pressed state in groups) */
26
- variant?: Exclude<ToggleProp<"variant">, "link">;
26
+ /**
27
+ * Button variant (link excluded as it has no clear pressed state in groups).
28
+ *
29
+ * Deliberately the closed union, not Button's widened `ButtonVariant`: an
30
+ * `Exclude` cannot remove `link` from a type that already admits any string,
31
+ * so narrowing here requires narrowing from the closed names.
32
+ */
33
+ variant?: Exclude<ButtonVariantName, "link">;
27
34
  /** Color intent */
28
- intent?: ToggleProp<"intent">;
35
+ intent?: ButtonIntentName;
29
36
  /** Button size (xl excluded — too large for grouped toggles) */
30
37
  size?: Exclude<ToggleProp<"size">, "xl">;
38
+ /** Square every item at the current size, for icon-only options */
39
+ iconOnly?: boolean;
31
40
  /** Disable all options */
32
41
  disabled?: boolean;
33
42
  };
@@ -60,6 +60,12 @@ const TooltipRoot = ({ open: controlledOpen, onOpenChange, placement = "top", de
60
60
  return <TooltipContext.Provider value={contextValue}>{children}</TooltipContext.Provider>;
61
61
  };
62
62
 
63
+ /**
64
+ * NOTE: Storybook shows the copy in Tooltip.stories.tsx
65
+ * (`parameters.docs.description.component`), not this comment. react-docgen
66
+ * cannot extract a description from an `Object.assign` / cast export, so a
67
+ * second copy here would only drift. Edit the stories file.
68
+ */
63
69
  export const Tooltip = Object.assign(TooltipRoot, {
64
70
  Trigger: TooltipTrigger,
65
71
  Body: TooltipBody,
@@ -315,7 +315,6 @@ export {
315
315
  // until: dateRange?.to ? serialize(dateRange.to) : undefined,
316
316
  // };
317
317
  //
318
- // See: packages/web/src/api/activity-log/useActivityLog.ts for reference implementation
319
318
  // =============================================================================
320
319
 
321
320
  // =============================================================================
@@ -0,0 +1,90 @@
1
+ import { cn } from "@sixthshift/design-system/utils";
2
+ import { X } from "lucide-react";
3
+ import * as React from "react";
4
+
5
+ export type PickerFieldProps = {
6
+ /** The segments, or whatever the field holds. */
7
+ children: React.ReactNode;
8
+ /** Icon for the button that opens the popover — a calendar or a clock. */
9
+ icon: React.ReactNode;
10
+ /** Accessible name for that button, e.g. `"Open calendar for start date"`. */
11
+ toggleLabel: string;
12
+ /**
13
+ * Props for the toggle button — in practice Floating UI's
14
+ * `getReferenceProps()`, spread last so its handlers win.
15
+ */
16
+ toggleProps?: React.ButtonHTMLAttributes<HTMLButtonElement> | undefined;
17
+ /** Drives `aria-expanded` and whether `aria-controls` is set. */
18
+ isOpen: boolean;
19
+ /** Id of the popover this field opens. */
20
+ contentId: string;
21
+ isDisabled?: boolean | undefined;
22
+ isInvalid?: boolean | undefined;
23
+ /** Omit to render no clear button. */
24
+ onClear?: ((event: React.MouseEvent) => void) | undefined;
25
+ /** Accessible name for the clear button, e.g. `"Clear end date"`. */
26
+ clearLabel?: string | undefined;
27
+ className?: string | undefined;
28
+ onFocusCapture?: React.FocusEventHandler<HTMLDivElement> | undefined;
29
+ };
30
+
31
+ /**
32
+ * The bordered box every picker trigger is: an icon button that opens the
33
+ * popover, the field itself, and an optional clear button.
34
+ *
35
+ * Extracted because there were six of these — `DatePicker` alone had three, one
36
+ * per mode plus the two range halves — and they had already started to drift in
37
+ * padding. The field height, the `focus-within` ring, the invalid border and the
38
+ * disabled treatment are decided once here, so changing them is one edit rather
39
+ * than six.
40
+ *
41
+ * Width is deliberately not decided here: a time field is narrower than a
42
+ * date-and-time field, so callers pass their own `min-w-*` through `className`.
43
+ *
44
+ * The ref is the box element — what Floating UI anchors to.
45
+ *
46
+ * Internal. Not exported from the package.
47
+ */
48
+ export const PickerField = React.forwardRef<HTMLDivElement, PickerFieldProps>(
49
+ (
50
+ { children, icon, toggleLabel, toggleProps, isOpen, contentId, isDisabled = false, isInvalid = false, onClear, clearLabel, className, onFocusCapture },
51
+ ref
52
+ ) => (
53
+ <div
54
+ ref={ref}
55
+ onFocusCapture={onFocusCapture}
56
+ className={cn(
57
+ "relative flex h-9 items-center gap-1 rounded-md border border-border-normal bg-transparent py-1 pl-1.5 shadow-xs transition-colors focus-within:ring-2 focus-within:ring-focus-ring",
58
+ onClear ? "pr-9" : "pr-3",
59
+ isInvalid && "border-border-danger",
60
+ isDisabled && "cursor-not-allowed opacity-50",
61
+ className
62
+ )}
63
+ >
64
+ <button
65
+ type="button"
66
+ disabled={isDisabled}
67
+ aria-label={toggleLabel}
68
+ aria-haspopup="dialog"
69
+ aria-expanded={isOpen}
70
+ aria-controls={isOpen ? contentId : undefined}
71
+ className="rounded-sm p-1 text-fg-subtle transition-colors hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed"
72
+ {...toggleProps}
73
+ >
74
+ {icon}
75
+ </button>
76
+ {children}
77
+ {onClear && (
78
+ <button
79
+ type="button"
80
+ onClick={onClear}
81
+ aria-label={clearLabel}
82
+ className="absolute right-3 rounded-sm p-0.5 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring"
83
+ >
84
+ <X className="h-3.5 w-3.5" />
85
+ </button>
86
+ )}
87
+ </div>
88
+ )
89
+ );
90
+ PickerField.displayName = "PickerField";