@sixthshift/design-system 0.2.1 → 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 (604) hide show
  1. package/README.md +242 -33
  2. package/dist/components/Badge/Badge.d.ts +65 -7
  3. package/dist/components/Badge/Badge.d.ts.map +1 -1
  4. package/dist/components/Badge/Badge.js +56 -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 +20 -2
  11. package/dist/components/BarChart/BarChart.d.ts.map +1 -1
  12. package/dist/components/BarChart/BarChart.js +17 -3
  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 +31 -1
  23. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  24. package/dist/components/Calendar/Calendar.js +94 -225
  25. package/dist/components/Calendar/Calendar.js.map +1 -1
  26. package/dist/components/Calendar/CalendarView.d.ts +15 -0
  27. package/dist/components/Calendar/CalendarView.d.ts.map +1 -0
  28. package/dist/components/Calendar/CalendarView.js +263 -0
  29. package/dist/components/Calendar/CalendarView.js.map +1 -0
  30. package/dist/components/Calendar/calendar.types.d.ts +87 -27
  31. package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
  32. package/dist/components/Calendar/calendar.types.js +10 -3
  33. package/dist/components/Calendar/calendar.types.js.map +1 -1
  34. package/dist/components/Calendar/index.d.ts +16 -2
  35. package/dist/components/Calendar/index.d.ts.map +1 -1
  36. package/dist/components/Calendar/index.js +15 -1
  37. package/dist/components/Calendar/index.js.map +1 -1
  38. package/dist/components/Card/Card.d.ts +13 -0
  39. package/dist/components/Card/Card.d.ts.map +1 -1
  40. package/dist/components/Card/Card.js +15 -2
  41. package/dist/components/Card/Card.js.map +1 -1
  42. package/dist/components/Checkbox/Checkbox.d.ts +21 -0
  43. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  44. package/dist/components/Checkbox/Checkbox.js +22 -1
  45. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  46. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +22 -0
  47. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  48. package/dist/components/CheckboxGroup/CheckboxGroup.js +22 -0
  49. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
  50. package/dist/components/Code/Editor/Editor.js +2 -2
  51. package/dist/components/Code/Editor/Editor.js.map +1 -1
  52. package/dist/components/Code/Editor/themes.d.ts +2 -2
  53. package/dist/components/Code/Editor/themes.d.ts.map +1 -1
  54. package/dist/components/Code/Editor/themes.js +50 -32
  55. package/dist/components/Code/Editor/themes.js.map +1 -1
  56. package/dist/components/Code/ValidationStatus/ValidationStatus.d.ts.map +1 -1
  57. package/dist/components/Code/ValidationStatus/ValidationStatus.js.map +1 -1
  58. package/dist/components/DatePicker/DatePicker.d.ts +45 -2
  59. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  60. package/dist/components/DatePicker/DatePicker.js +228 -11
  61. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  62. package/dist/components/DatePicker/DateSegments.d.ts +60 -0
  63. package/dist/components/DatePicker/DateSegments.d.ts.map +1 -0
  64. package/dist/components/DatePicker/DateSegments.js +80 -0
  65. package/dist/components/DatePicker/DateSegments.js.map +1 -0
  66. package/dist/components/DatePicker/datepicker.types.d.ts +53 -37
  67. package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
  68. package/dist/components/DatePicker/datepicker.types.js +5 -3
  69. package/dist/components/DatePicker/datepicker.types.js.map +1 -1
  70. package/dist/components/DatePicker/index.d.ts +10 -1
  71. package/dist/components/DatePicker/index.d.ts.map +1 -1
  72. package/dist/components/DatePicker/index.js +8 -0
  73. package/dist/components/DatePicker/index.js.map +1 -1
  74. package/dist/components/DateRangePicker/DateRangePicker.d.ts +22 -3
  75. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  76. package/dist/components/DateRangePicker/DateRangePicker.js +38 -24
  77. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  78. package/dist/components/DateRangePicker/daterangepicker.types.d.ts +26 -21
  79. package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
  80. package/dist/components/DateRangePicker/daterangepicker.types.js +6 -0
  81. package/dist/components/DateRangePicker/daterangepicker.types.js.map +1 -1
  82. package/dist/components/DateRangePicker/index.d.ts +8 -1
  83. package/dist/components/DateRangePicker/index.d.ts.map +1 -1
  84. package/dist/components/DateRangePicker/index.js +6 -0
  85. package/dist/components/DateRangePicker/index.js.map +1 -1
  86. package/dist/components/DateTimePicker/DateTimePicker.d.ts +32 -4
  87. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  88. package/dist/components/DateTimePicker/DateTimePicker.js +133 -42
  89. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  90. package/dist/components/DateTimePicker/DateTimeSegments.d.ts +41 -0
  91. package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -0
  92. package/dist/components/DateTimePicker/DateTimeSegments.js +67 -0
  93. package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -0
  94. package/dist/components/DateTimePicker/datetimepicker.types.d.ts +26 -18
  95. package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
  96. package/dist/components/DateTimePicker/datetimepicker.types.js +10 -0
  97. package/dist/components/DateTimePicker/datetimepicker.types.js.map +1 -1
  98. package/dist/components/DateTimePicker/index.d.ts +8 -1
  99. package/dist/components/DateTimePicker/index.d.ts.map +1 -1
  100. package/dist/components/DateTimePicker/index.js +6 -0
  101. package/dist/components/DateTimePicker/index.js.map +1 -1
  102. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +30 -4
  103. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
  104. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +171 -72
  105. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
  106. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +28 -19
  107. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
  108. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js +8 -0
  109. package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js.map +1 -1
  110. package/dist/components/DateTimeRangePicker/index.d.ts +8 -0
  111. package/dist/components/DateTimeRangePicker/index.d.ts.map +1 -1
  112. package/dist/components/DateTimeRangePicker/index.js +7 -0
  113. package/dist/components/DateTimeRangePicker/index.js.map +1 -1
  114. package/dist/components/Field/Field.d.ts +18 -20
  115. package/dist/components/Field/Field.d.ts.map +1 -1
  116. package/dist/components/Field/Field.js +22 -5
  117. package/dist/components/Field/Field.js.map +1 -1
  118. package/dist/components/FormField/FormField.d.ts +15 -0
  119. package/dist/components/FormField/FormField.d.ts.map +1 -1
  120. package/dist/components/FormField/FormField.js +15 -0
  121. package/dist/components/FormField/FormField.js.map +1 -1
  122. package/dist/components/HoverCard/HoverCard.d.ts +6 -0
  123. package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
  124. package/dist/components/HoverCard/HoverCard.js +6 -0
  125. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  126. package/dist/components/Input/Input.d.ts +15 -0
  127. package/dist/components/Input/Input.d.ts.map +1 -1
  128. package/dist/components/Input/Input.js +18 -3
  129. package/dist/components/Input/Input.js.map +1 -1
  130. package/dist/components/LineChart/LineChart.d.ts +35 -2
  131. package/dist/components/LineChart/LineChart.d.ts.map +1 -1
  132. package/dist/components/LineChart/LineChart.js +22 -3
  133. package/dist/components/LineChart/LineChart.js.map +1 -1
  134. package/dist/components/Markdown/Markdown.d.ts +19 -4
  135. package/dist/components/Markdown/Markdown.d.ts.map +1 -1
  136. package/dist/components/Markdown/Markdown.js +20 -2
  137. package/dist/components/Markdown/Markdown.js.map +1 -1
  138. package/dist/components/Message/Message.d.ts +49 -4
  139. package/dist/components/Message/Message.d.ts.map +1 -1
  140. package/dist/components/Message/Message.js +62 -11
  141. package/dist/components/Message/Message.js.map +1 -1
  142. package/dist/components/Message/index.d.ts +1 -1
  143. package/dist/components/Message/index.d.ts.map +1 -1
  144. package/dist/components/Modal/Modal.d.ts +60 -5
  145. package/dist/components/Modal/Modal.d.ts.map +1 -1
  146. package/dist/components/Modal/Modal.js +52 -6
  147. package/dist/components/Modal/Modal.js.map +1 -1
  148. package/dist/components/Modal/components/ModalContext.d.ts +14 -0
  149. package/dist/components/Modal/components/ModalContext.d.ts.map +1 -1
  150. package/dist/components/Modal/components/ModalContext.js.map +1 -1
  151. package/dist/components/Modal/components/ModalHeader.d.ts.map +1 -1
  152. package/dist/components/Modal/components/ModalHeader.js +13 -2
  153. package/dist/components/Modal/components/ModalHeader.js.map +1 -1
  154. package/dist/components/Popover/Popover.d.ts +29 -0
  155. package/dist/components/Popover/Popover.d.ts.map +1 -1
  156. package/dist/components/Popover/Popover.js +36 -0
  157. package/dist/components/Popover/Popover.js.map +1 -1
  158. package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
  159. package/dist/components/Popover/components/PopoverBody.js +5 -2
  160. package/dist/components/Popover/components/PopoverBody.js.map +1 -1
  161. package/dist/components/Popover/components/PopoverContext.d.ts +1 -0
  162. package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
  163. package/dist/components/Popover/components/PopoverContext.js.map +1 -1
  164. package/dist/components/Popover/components/PopoverTrigger.d.ts.map +1 -1
  165. package/dist/components/Popover/components/PopoverTrigger.js +2 -2
  166. package/dist/components/Popover/components/PopoverTrigger.js.map +1 -1
  167. package/dist/components/ProgressBar/ProgressBar.d.ts +16 -1
  168. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
  169. package/dist/components/ProgressBar/ProgressBar.js +19 -3
  170. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  171. package/dist/components/RadioButton/RadioButton.d.ts +26 -0
  172. package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
  173. package/dist/components/RadioButton/RadioButton.js +35 -1
  174. package/dist/components/RadioButton/RadioButton.js.map +1 -1
  175. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts +26 -0
  176. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
  177. package/dist/components/RadioButtonGroup/RadioButtonGroup.js +33 -0
  178. package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  179. package/dist/components/SearchInput/SearchInput.d.ts +10 -0
  180. package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
  181. package/dist/components/SearchInput/SearchInput.js +12 -1
  182. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  183. package/dist/components/Select/Select.d.ts +10 -2
  184. package/dist/components/Select/Select.d.ts.map +1 -1
  185. package/dist/components/Select/Select.js +63 -18
  186. package/dist/components/Select/Select.js.map +1 -1
  187. package/dist/components/Select/SelectDropdown.d.ts +14 -2
  188. package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
  189. package/dist/components/Select/SelectDropdown.js +20 -4
  190. package/dist/components/Select/SelectDropdown.js.map +1 -1
  191. package/dist/components/Select/SelectTrigger.d.ts +10 -3
  192. package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
  193. package/dist/components/Select/SelectTrigger.js +12 -3
  194. package/dist/components/Select/SelectTrigger.js.map +1 -1
  195. package/dist/components/Select/useSelectKeyboard.d.ts +15 -1
  196. package/dist/components/Select/useSelectKeyboard.d.ts.map +1 -1
  197. package/dist/components/Select/useSelectKeyboard.js +73 -65
  198. package/dist/components/Select/useSelectKeyboard.js.map +1 -1
  199. package/dist/components/Separator/Separator.d.ts +10 -0
  200. package/dist/components/Separator/Separator.d.ts.map +1 -1
  201. package/dist/components/Separator/Separator.js +10 -0
  202. package/dist/components/Separator/Separator.js.map +1 -1
  203. package/dist/components/Sheet/Sheet.d.ts +25 -5
  204. package/dist/components/Sheet/Sheet.d.ts.map +1 -1
  205. package/dist/components/Sheet/Sheet.js +24 -6
  206. package/dist/components/Sheet/Sheet.js.map +1 -1
  207. package/dist/components/Sheet/components/SheetContext.d.ts +10 -0
  208. package/dist/components/Sheet/components/SheetContext.d.ts.map +1 -1
  209. package/dist/components/Sheet/components/SheetContext.js.map +1 -1
  210. package/dist/components/Sheet/components/SheetFooter.js +1 -1
  211. package/dist/components/Sheet/components/SheetFooter.js.map +1 -1
  212. package/dist/components/Sheet/components/SheetHeader.d.ts.map +1 -1
  213. package/dist/components/Sheet/components/SheetHeader.js +11 -2
  214. package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
  215. package/dist/components/Sparkline/Sparkline.d.ts +21 -2
  216. package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
  217. package/dist/components/Sparkline/Sparkline.js +16 -3
  218. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  219. package/dist/components/Spinner/Spinner.d.ts +27 -2
  220. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  221. package/dist/components/Spinner/Spinner.js +28 -3
  222. package/dist/components/Spinner/Spinner.js.map +1 -1
  223. package/dist/components/Switch/Switch.d.ts +18 -0
  224. package/dist/components/Switch/Switch.d.ts.map +1 -1
  225. package/dist/components/Switch/Switch.js +19 -1
  226. package/dist/components/Switch/Switch.js.map +1 -1
  227. package/dist/components/Tabs/Tabs.d.ts +8 -2
  228. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  229. package/dist/components/Tabs/Tabs.js +6 -0
  230. package/dist/components/Tabs/Tabs.js.map +1 -1
  231. package/dist/components/Tabs/components/TabsList.d.ts +1 -1
  232. package/dist/components/Tabs/components/TabsList.d.ts.map +1 -1
  233. package/dist/components/Tabs/components/TabsList.js +5 -4
  234. package/dist/components/Tabs/components/TabsList.js.map +1 -1
  235. package/dist/components/Tabs/components/TabsPanels.d.ts +1 -1
  236. package/dist/components/Tabs/components/TabsPanels.d.ts.map +1 -1
  237. package/dist/components/Tabs/components/TabsPanels.js +5 -3
  238. package/dist/components/Tabs/components/TabsPanels.js.map +1 -1
  239. package/dist/components/Tabs/components/TabsTrigger.d.ts.map +1 -1
  240. package/dist/components/Tabs/components/TabsTrigger.js +22 -6
  241. package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
  242. package/dist/components/TagChip/TagChip.d.ts +16 -13
  243. package/dist/components/TagChip/TagChip.d.ts.map +1 -1
  244. package/dist/components/TagChip/TagChip.js +18 -3
  245. package/dist/components/TagChip/TagChip.js.map +1 -1
  246. package/dist/components/TagInput/TagInput.d.ts +12 -9
  247. package/dist/components/TagInput/TagInput.d.ts.map +1 -1
  248. package/dist/components/TagInput/TagInput.js +16 -4
  249. package/dist/components/TagInput/TagInput.js.map +1 -1
  250. package/dist/components/Text/Text.d.ts +9 -0
  251. package/dist/components/Text/Text.d.ts.map +1 -1
  252. package/dist/components/Text/Text.js +9 -0
  253. package/dist/components/Text/Text.js.map +1 -1
  254. package/dist/components/TextInline/TextInline.d.ts +15 -4
  255. package/dist/components/TextInline/TextInline.d.ts.map +1 -1
  256. package/dist/components/TextInline/TextInline.js +11 -0
  257. package/dist/components/TextInline/TextInline.js.map +1 -1
  258. package/dist/components/Textarea/Textarea.d.ts +12 -0
  259. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  260. package/dist/components/Textarea/Textarea.js +13 -1
  261. package/dist/components/Textarea/Textarea.js.map +1 -1
  262. package/dist/components/TimePicker/TimeColumn.d.ts +10 -1
  263. package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
  264. package/dist/components/TimePicker/TimeColumn.js +8 -1
  265. package/dist/components/TimePicker/TimeColumn.js.map +1 -1
  266. package/dist/components/TimePicker/TimePicker.d.ts +34 -2
  267. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
  268. package/dist/components/TimePicker/TimePicker.js +118 -15
  269. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  270. package/dist/components/TimePicker/TimeSegments.d.ts +50 -0
  271. package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -0
  272. package/dist/components/TimePicker/TimeSegments.js +93 -0
  273. package/dist/components/TimePicker/TimeSegments.js.map +1 -0
  274. package/dist/components/TimePicker/timepicker.hooks.d.ts +0 -4
  275. package/dist/components/TimePicker/timepicker.hooks.d.ts.map +1 -1
  276. package/dist/components/TimePicker/timepicker.hooks.js +1 -23
  277. package/dist/components/TimePicker/timepicker.hooks.js.map +1 -1
  278. package/dist/components/TimePicker/timepicker.types.d.ts +14 -15
  279. package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
  280. package/dist/components/TimePicker/timepicker.types.js +4 -3
  281. package/dist/components/TimePicker/timepicker.types.js.map +1 -1
  282. package/dist/components/Toast/Toast.d.ts +27 -0
  283. package/dist/components/Toast/Toast.d.ts.map +1 -1
  284. package/dist/components/Toast/Toast.js +28 -1
  285. package/dist/components/Toast/Toast.js.map +1 -1
  286. package/dist/components/Toggle/Toggle.d.ts +31 -12
  287. package/dist/components/Toggle/Toggle.d.ts.map +1 -1
  288. package/dist/components/Toggle/Toggle.js +19 -31
  289. package/dist/components/Toggle/Toggle.js.map +1 -1
  290. package/dist/components/Toggle/index.d.ts +1 -1
  291. package/dist/components/Toggle/index.d.ts.map +1 -1
  292. package/dist/components/Toggle/index.js +1 -1
  293. package/dist/components/Toggle/index.js.map +1 -1
  294. package/dist/components/ToggleGroup/ToggleGroup.d.ts +17 -0
  295. package/dist/components/ToggleGroup/ToggleGroup.d.ts.map +1 -1
  296. package/dist/components/ToggleGroup/ToggleGroup.js +17 -0
  297. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  298. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
  299. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts.map +1 -1
  300. package/dist/components/ToggleGroup/ToggleGroupItem.js +7 -6
  301. package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
  302. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +4 -3
  303. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
  304. package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
  305. package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
  306. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +4 -3
  307. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
  308. package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
  309. package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
  310. package/dist/components/ToggleGroup/toggleGroup.types.d.ts +12 -3
  311. package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
  312. package/dist/components/Tooltip/Tooltip.d.ts +6 -0
  313. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  314. package/dist/components/Tooltip/Tooltip.js +6 -0
  315. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  316. package/dist/date-time/index.d.ts +2 -0
  317. package/dist/date-time/index.d.ts.map +1 -1
  318. package/dist/date-time/index.js +9 -1
  319. package/dist/date-time/index.js.map +1 -1
  320. package/dist/date-time/iso.d.ts +261 -0
  321. package/dist/date-time/iso.d.ts.map +1 -0
  322. package/dist/date-time/iso.js +358 -0
  323. package/dist/date-time/iso.js.map +1 -0
  324. package/dist/date-time/now.d.ts +7 -6
  325. package/dist/date-time/now.d.ts.map +1 -1
  326. package/dist/date-time/now.js +3 -3
  327. package/dist/date-time/now.js.map +1 -1
  328. package/dist/internal/PickerField.d.ts +45 -0
  329. package/dist/internal/PickerField.d.ts.map +1 -0
  330. package/dist/internal/PickerField.js +24 -0
  331. package/dist/internal/PickerField.js.map +1 -0
  332. package/dist/internal/SegmentedField.d.ts +98 -0
  333. package/dist/internal/SegmentedField.d.ts.map +1 -0
  334. package/dist/internal/SegmentedField.js +315 -0
  335. package/dist/internal/SegmentedField.js.map +1 -0
  336. package/dist/internal/index.d.ts +2 -0
  337. package/dist/internal/index.d.ts.map +1 -1
  338. package/dist/internal/index.js +2 -0
  339. package/dist/internal/index.js.map +1 -1
  340. package/dist/theme/index.d.ts +4 -3
  341. package/dist/theme/index.d.ts.map +1 -1
  342. package/dist/theme/index.js +3 -2
  343. package/dist/theme/index.js.map +1 -1
  344. package/dist/theme/schema.d.ts +49 -33
  345. package/dist/theme/schema.d.ts.map +1 -1
  346. package/dist/theme/schema.js +30 -21
  347. package/dist/theme/schema.js.map +1 -1
  348. package/package.json +11 -59
  349. package/src/components/Badge/Badge.tsx +87 -49
  350. package/src/components/Badge/index.ts +10 -1
  351. package/src/components/BarChart/BarChart.tsx +37 -30
  352. package/src/components/Button/Button.tsx +129 -106
  353. package/src/components/Button/index.ts +10 -1
  354. package/src/components/Calendar/Calendar.tsx +104 -401
  355. package/src/components/Calendar/CalendarView.tsx +454 -0
  356. package/src/components/Calendar/calendar.types.ts +104 -29
  357. package/src/components/Calendar/index.ts +16 -17
  358. package/src/components/Card/Card.tsx +15 -2
  359. package/src/components/Checkbox/Checkbox.tsx +22 -2
  360. package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -0
  361. package/src/components/Code/Editor/Editor.tsx +2 -2
  362. package/src/components/Code/Editor/themes.ts +50 -32
  363. package/src/components/Code/ValidationStatus/ValidationStatus.tsx +6 -3
  364. package/src/components/DatePicker/DatePicker.tsx +369 -42
  365. package/src/components/DatePicker/DateSegments.tsx +125 -0
  366. package/src/components/DatePicker/datepicker.types.ts +58 -39
  367. package/src/components/DatePicker/index.ts +11 -3
  368. package/src/components/DateRangePicker/DateRangePicker.tsx +38 -24
  369. package/src/components/DateRangePicker/daterangepicker.types.ts +29 -23
  370. package/src/components/DateRangePicker/index.ts +9 -1
  371. package/src/components/DateTimePicker/DateTimePicker.tsx +189 -88
  372. package/src/components/DateTimePicker/DateTimeSegments.tsx +113 -0
  373. package/src/components/DateTimePicker/datetimepicker.types.ts +29 -19
  374. package/src/components/DateTimePicker/index.ts +9 -1
  375. package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +251 -126
  376. package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +31 -20
  377. package/src/components/DateTimeRangePicker/index.ts +9 -0
  378. package/src/components/Field/Field.tsx +25 -26
  379. package/src/components/FormField/FormField.tsx +15 -0
  380. package/src/components/HoverCard/HoverCard.tsx +6 -0
  381. package/src/components/Input/Input.tsx +19 -4
  382. package/src/components/LineChart/LineChart.tsx +164 -141
  383. package/src/components/Markdown/Markdown.tsx +21 -3
  384. package/src/components/Message/Message.tsx +83 -17
  385. package/src/components/Message/index.ts +1 -1
  386. package/src/components/Modal/Modal.tsx +157 -86
  387. package/src/components/Modal/components/ModalContext.tsx +14 -0
  388. package/src/components/Modal/components/ModalHeader.tsx +15 -3
  389. package/src/components/Popover/Popover.tsx +36 -0
  390. package/src/components/Popover/components/PopoverBody.tsx +6 -1
  391. package/src/components/Popover/components/PopoverContext.tsx +1 -0
  392. package/src/components/Popover/components/PopoverTrigger.tsx +2 -1
  393. package/src/components/ProgressBar/ProgressBar.tsx +46 -28
  394. package/src/components/RadioButton/RadioButton.tsx +34 -3
  395. package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +32 -0
  396. package/src/components/SearchInput/SearchInput.tsx +13 -2
  397. package/src/components/Select/Select.tsx +75 -19
  398. package/src/components/Select/SelectDropdown.tsx +45 -12
  399. package/src/components/Select/SelectTrigger.tsx +31 -8
  400. package/src/components/Select/useSelectKeyboard.ts +20 -10
  401. package/src/components/Separator/Separator.tsx +10 -0
  402. package/src/components/Sheet/Sheet.tsx +114 -83
  403. package/src/components/Sheet/components/SheetContext.tsx +10 -0
  404. package/src/components/Sheet/components/SheetFooter.tsx +1 -1
  405. package/src/components/Sheet/components/SheetHeader.tsx +18 -3
  406. package/src/components/Sparkline/Sparkline.tsx +40 -36
  407. package/src/components/Spinner/Spinner.tsx +28 -3
  408. package/src/components/Switch/Switch.tsx +27 -4
  409. package/src/components/Tabs/Tabs.tsx +6 -0
  410. package/src/components/Tabs/components/TabsList.tsx +5 -3
  411. package/src/components/Tabs/components/TabsPanels.tsx +5 -3
  412. package/src/components/Tabs/components/TabsTrigger.tsx +22 -5
  413. package/src/components/TagChip/TagChip.tsx +27 -18
  414. package/src/components/TagInput/TagInput.tsx +16 -11
  415. package/src/components/Text/Text.tsx +9 -0
  416. package/src/components/TextInline/TextInline.tsx +11 -0
  417. package/src/components/Textarea/Textarea.tsx +13 -1
  418. package/src/components/TimePicker/TimeColumn.tsx +24 -1
  419. package/src/components/TimePicker/TimePicker.tsx +157 -51
  420. package/src/components/TimePicker/TimeSegments.tsx +131 -0
  421. package/src/components/TimePicker/timepicker.hooks.ts +1 -24
  422. package/src/components/TimePicker/timepicker.types.ts +14 -16
  423. package/src/components/Toast/Toast.tsx +28 -1
  424. package/src/components/Toggle/Toggle.tsx +34 -32
  425. package/src/components/Toggle/index.ts +1 -1
  426. package/src/components/ToggleGroup/ToggleGroup.tsx +17 -0
  427. package/src/components/ToggleGroup/ToggleGroupItem.tsx +13 -8
  428. package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +3 -1
  429. package/src/components/ToggleGroup/ToggleGroupSingle.tsx +3 -1
  430. package/src/components/ToggleGroup/toggleGroup.types.ts +12 -3
  431. package/src/components/Tooltip/Tooltip.tsx +6 -0
  432. package/src/date-time/index.ts +61 -1
  433. package/src/date-time/iso.ts +511 -0
  434. package/src/date-time/now.ts +10 -9
  435. package/src/internal/PickerField.tsx +90 -0
  436. package/src/internal/SegmentedField.tsx +445 -0
  437. package/src/internal/index.ts +2 -0
  438. package/src/theme/index.ts +11 -9
  439. package/src/theme/recipes/badge.css +140 -0
  440. package/src/theme/recipes/button.css +167 -0
  441. package/src/theme/recipes/card.css +26 -0
  442. package/src/theme/recipes/checkbox.css +44 -0
  443. package/src/theme/recipes/field.css +14 -0
  444. package/src/theme/recipes/index.css +28 -0
  445. package/src/theme/recipes/input.css +29 -0
  446. package/src/theme/recipes/message.css +47 -0
  447. package/src/theme/recipes/modal.css +31 -0
  448. package/src/theme/recipes/radio-button.css +42 -0
  449. package/src/theme/recipes/search-input.css +16 -0
  450. package/src/theme/recipes/select.css +105 -0
  451. package/src/theme/recipes/sheet.css +34 -0
  452. package/src/theme/recipes/spinner.css +17 -0
  453. package/src/theme/recipes/switch.css +39 -0
  454. package/src/theme/recipes/tabs.css +41 -0
  455. package/src/theme/recipes/tag-chip.css +27 -0
  456. package/src/theme/recipes/textarea.css +20 -0
  457. package/src/theme/recipes/toggle.css +92 -0
  458. package/src/theme/schema.ts +59 -58
  459. package/src/theme/tokens.css +824 -0
  460. package/dist/components/Avatar/Avatar.d.ts +0 -6
  461. package/dist/components/Avatar/Avatar.d.ts.map +0 -1
  462. package/dist/components/Avatar/Avatar.js +0 -11
  463. package/dist/components/Avatar/Avatar.js.map +0 -1
  464. package/dist/components/Avatar/index.d.ts +0 -2
  465. package/dist/components/Avatar/index.d.ts.map +0 -1
  466. package/dist/components/Avatar/index.js +0 -2
  467. package/dist/components/Avatar/index.js.map +0 -1
  468. package/dist/components/Breadcrumb/Breadcrumb.d.ts +0 -12
  469. package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +0 -1
  470. package/dist/components/Breadcrumb/Breadcrumb.js +0 -19
  471. package/dist/components/Breadcrumb/Breadcrumb.js.map +0 -1
  472. package/dist/components/Breadcrumb/index.d.ts +0 -2
  473. package/dist/components/Breadcrumb/index.d.ts.map +0 -1
  474. package/dist/components/Breadcrumb/index.js +0 -2
  475. package/dist/components/Breadcrumb/index.js.map +0 -1
  476. package/dist/components/ColorDot/ColorDot.d.ts +0 -13
  477. package/dist/components/ColorDot/ColorDot.d.ts.map +0 -1
  478. package/dist/components/ColorDot/ColorDot.js +0 -34
  479. package/dist/components/ColorDot/ColorDot.js.map +0 -1
  480. package/dist/components/ColorDot/index.d.ts +0 -2
  481. package/dist/components/ColorDot/index.d.ts.map +0 -1
  482. package/dist/components/ColorDot/index.js +0 -2
  483. package/dist/components/ColorDot/index.js.map +0 -1
  484. package/dist/components/EmptyState/EmptyState.d.ts +0 -15
  485. package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
  486. package/dist/components/EmptyState/EmptyState.js +0 -7
  487. package/dist/components/EmptyState/EmptyState.js.map +0 -1
  488. package/dist/components/EmptyState/index.d.ts +0 -2
  489. package/dist/components/EmptyState/index.d.ts.map +0 -1
  490. package/dist/components/EmptyState/index.js +0 -2
  491. package/dist/components/EmptyState/index.js.map +0 -1
  492. package/dist/components/HeatMap/HeatMapCalendar.d.ts +0 -11
  493. package/dist/components/HeatMap/HeatMapCalendar.d.ts.map +0 -1
  494. package/dist/components/HeatMap/HeatMapCalendar.js +0 -68
  495. package/dist/components/HeatMap/HeatMapCalendar.js.map +0 -1
  496. package/dist/components/HeatMap/HeatMapMatrix.d.ts +0 -12
  497. package/dist/components/HeatMap/HeatMapMatrix.d.ts.map +0 -1
  498. package/dist/components/HeatMap/HeatMapMatrix.js +0 -35
  499. package/dist/components/HeatMap/HeatMapMatrix.js.map +0 -1
  500. package/dist/components/HeatMap/heat-map.utils.d.ts +0 -10
  501. package/dist/components/HeatMap/heat-map.utils.d.ts.map +0 -1
  502. package/dist/components/HeatMap/heat-map.utils.js +0 -10
  503. package/dist/components/HeatMap/heat-map.utils.js.map +0 -1
  504. package/dist/components/HeatMap/index.d.ts +0 -4
  505. package/dist/components/HeatMap/index.d.ts.map +0 -1
  506. package/dist/components/HeatMap/index.js +0 -3
  507. package/dist/components/HeatMap/index.js.map +0 -1
  508. package/dist/components/MetricList/MetricList.d.ts +0 -9
  509. package/dist/components/MetricList/MetricList.d.ts.map +0 -1
  510. package/dist/components/MetricList/MetricList.js +0 -6
  511. package/dist/components/MetricList/MetricList.js.map +0 -1
  512. package/dist/components/MetricList/MetricRow.d.ts +0 -13
  513. package/dist/components/MetricList/MetricRow.d.ts.map +0 -1
  514. package/dist/components/MetricList/MetricRow.js +0 -13
  515. package/dist/components/MetricList/MetricRow.js.map +0 -1
  516. package/dist/components/MetricList/index.d.ts +0 -3
  517. package/dist/components/MetricList/index.d.ts.map +0 -1
  518. package/dist/components/MetricList/index.js +0 -3
  519. package/dist/components/MetricList/index.js.map +0 -1
  520. package/dist/components/NavBottom/NavBottom.d.ts +0 -15
  521. package/dist/components/NavBottom/NavBottom.d.ts.map +0 -1
  522. package/dist/components/NavBottom/NavBottom.js +0 -19
  523. package/dist/components/NavBottom/NavBottom.js.map +0 -1
  524. package/dist/components/NavBottom/index.d.ts +0 -3
  525. package/dist/components/NavBottom/index.d.ts.map +0 -1
  526. package/dist/components/NavBottom/index.js +0 -2
  527. package/dist/components/NavBottom/index.js.map +0 -1
  528. package/dist/components/NavSide/NavItem.d.ts +0 -9
  529. package/dist/components/NavSide/NavItem.d.ts.map +0 -1
  530. package/dist/components/NavSide/NavItem.js +0 -13
  531. package/dist/components/NavSide/NavItem.js.map +0 -1
  532. package/dist/components/NavSide/NavSide.d.ts +0 -15
  533. package/dist/components/NavSide/NavSide.d.ts.map +0 -1
  534. package/dist/components/NavSide/NavSide.js +0 -10
  535. package/dist/components/NavSide/NavSide.js.map +0 -1
  536. package/dist/components/NavSide/index.d.ts +0 -3
  537. package/dist/components/NavSide/index.d.ts.map +0 -1
  538. package/dist/components/NavSide/index.js +0 -2
  539. package/dist/components/NavSide/index.js.map +0 -1
  540. package/dist/components/NavSide/types.d.ts +0 -38
  541. package/dist/components/NavSide/types.d.ts.map +0 -1
  542. package/dist/components/NavSide/types.js +0 -2
  543. package/dist/components/NavSide/types.js.map +0 -1
  544. package/dist/components/Pagination/Pagination.d.ts +0 -35
  545. package/dist/components/Pagination/Pagination.d.ts.map +0 -1
  546. package/dist/components/Pagination/Pagination.js +0 -26
  547. package/dist/components/Pagination/Pagination.js.map +0 -1
  548. package/dist/components/Pagination/index.d.ts +0 -3
  549. package/dist/components/Pagination/index.d.ts.map +0 -1
  550. package/dist/components/Pagination/index.js +0 -2
  551. package/dist/components/Pagination/index.js.map +0 -1
  552. package/dist/components/Skeleton/Skeleton.d.ts +0 -3
  553. package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
  554. package/dist/components/Skeleton/Skeleton.js +0 -7
  555. package/dist/components/Skeleton/Skeleton.js.map +0 -1
  556. package/dist/components/Skeleton/index.d.ts +0 -2
  557. package/dist/components/Skeleton/index.d.ts.map +0 -1
  558. package/dist/components/Skeleton/index.js +0 -2
  559. package/dist/components/Skeleton/index.js.map +0 -1
  560. package/dist/components/StatsCard/StatsCard.d.ts +0 -17
  561. package/dist/components/StatsCard/StatsCard.d.ts.map +0 -1
  562. package/dist/components/StatsCard/StatsCard.js +0 -13
  563. package/dist/components/StatsCard/StatsCard.js.map +0 -1
  564. package/dist/components/StatsCard/index.d.ts +0 -2
  565. package/dist/components/StatsCard/index.d.ts.map +0 -1
  566. package/dist/components/StatsCard/index.js +0 -2
  567. package/dist/components/StatsCard/index.js.map +0 -1
  568. package/dist/styles.css +0 -2
  569. package/dist/theme.generated.css +0 -438
  570. package/src/components/Avatar/Avatar.tsx +0 -19
  571. package/src/components/Avatar/index.ts +0 -1
  572. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -47
  573. package/src/components/Breadcrumb/index.ts +0 -5
  574. package/src/components/ColorDot/ColorDot.tsx +0 -50
  575. package/src/components/ColorDot/index.ts +0 -1
  576. package/src/components/EmptyState/EmptyState.tsx +0 -29
  577. package/src/components/EmptyState/index.ts +0 -1
  578. package/src/components/HeatMap/HeatMapCalendar.tsx +0 -127
  579. package/src/components/HeatMap/HeatMapMatrix.tsx +0 -75
  580. package/src/components/HeatMap/heat-map.utils.ts +0 -15
  581. package/src/components/HeatMap/index.ts +0 -3
  582. package/src/components/MetricList/MetricList.tsx +0 -13
  583. package/src/components/MetricList/MetricRow.tsx +0 -30
  584. package/src/components/MetricList/index.ts +0 -2
  585. package/src/components/NavBottom/NavBottom.tsx +0 -53
  586. package/src/components/NavBottom/index.ts +0 -3
  587. package/src/components/NavSide/NavItem.tsx +0 -39
  588. package/src/components/NavSide/NavSide.tsx +0 -40
  589. package/src/components/NavSide/index.ts +0 -2
  590. package/src/components/NavSide/types.ts +0 -36
  591. package/src/components/Pagination/Pagination.tsx +0 -86
  592. package/src/components/Pagination/index.ts +0 -2
  593. package/src/components/Skeleton/Skeleton.tsx +0 -7
  594. package/src/components/Skeleton/index.ts +0 -1
  595. package/src/components/StatsCard/StatsCard.tsx +0 -40
  596. package/src/components/StatsCard/index.ts +0 -1
  597. package/src/styles/base.css +0 -41
  598. package/src/theme/palette.json +0 -100
  599. package/src/theme/palette.schema.json +0 -40
  600. package/src/theme/theme.json +0 -349
  601. package/src/theme/theme.schema.json +0 -876
  602. package/src/theme/typography.json +0 -7
  603. package/src/theme/typography.schema.json +0 -36
  604. package/tailwind.config.ts +0 -261
@@ -6,33 +6,99 @@ 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 */
33
54
  icon?: React.ReactNode;
34
55
  };
35
56
 
57
+ /**
58
+ * A message is a live region, and the intent decides how rudely it interrupts.
59
+ * `danger` is the only intent that earns `role="alert"` — an assertive region
60
+ * cuts off whatever the screen reader was saying. Everything else is
61
+ * `role="status"` (polite), which is announced at the next natural pause. A
62
+ * success confirmation or a static "Note" callout stamped as `alert` trains
63
+ * users to ignore the role that actually matters. Consumers can override by
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.
71
+ */
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
+ }
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
+ */
36
102
  export const Message = React.forwardRef<HTMLDivElement, MessageProps>(({ className, intent = "neutral", size, title, icon, children, ...props }, ref) => {
37
103
  const hasCompoundChildren = React.Children.toArray(children).some(
38
104
  (child) =>
@@ -41,7 +107,7 @@ export const Message = React.forwardRef<HTMLDivElement, MessageProps>(({ classNa
41
107
  );
42
108
 
43
109
  return (
44
- <div ref={ref} role="alert" className={cn(messageVariants({ intent, size, className }))} {...props}>
110
+ <div ref={ref} role={intentRole(intent)} data-intent={intent} className={cn(messageVariants({ size, className }))} {...props}>
45
111
  {hasCompoundChildren ? (
46
112
  children
47
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";
@@ -1,14 +1,14 @@
1
1
  import { FloatingFocusManager, FloatingOverlay, useDismiss, useFloating, useInteractions, useRole } from "@floating-ui/react";
2
2
  import { useMergedFloatingRef, usePresence } from "@sixthshift/design-system/hooks";
3
3
  import { cn } from "@sixthshift/design-system/utils";
4
- import { type HTMLAttributes, type ReactNode, useCallback, useContext, useEffect, useMemo } from "react";
4
+ import { forwardRef, type HTMLAttributes, type ReactNode, useCallback, useContext, useEffect, useId, useMemo, useState } from "react";
5
5
  import { ModalBody, ModalContext, ModalFooter, ModalHeader } from "./components";
6
6
 
7
7
  // =============================================================================
8
8
  // Types
9
9
  // =============================================================================
10
10
 
11
- export type ModalProps = Pick<HTMLAttributes<HTMLDivElement>, "className" | "style"> & {
11
+ export type ModalProps = Pick<HTMLAttributes<HTMLDivElement>, "className" | "style" | "aria-label" | "aria-labelledby" | "aria-describedby"> & {
12
12
  /**
13
13
  * Called when the modal's open state should change. Today Modal is mount-driven
14
14
  * (parent conditionally renders), so this fires only with `false` on dismissal.
@@ -47,98 +47,169 @@ const sizeClasses = {
47
47
  // Modal
48
48
  // =============================================================================
49
49
 
50
- const ModalRoot = ({ onOpenChange, size = "md", className, style, children, dismissable = true, closable, align = "center" }: ModalProps) => {
51
- // Prefer explicit prop over context (context is set by useModal's overlay system)
52
- const contextValue = useContext(ModalContext);
53
- // Context provides a parameterless onClose for programmatic modals; adapt to the boolean shape.
54
- const handleDismiss = useCallback(() => {
55
- if (onOpenChange) onOpenChange(false);
56
- else contextValue?.onClose();
57
- }, [onOpenChange, contextValue]);
58
-
59
- const { ref: presenceRef, state, isMounted, show, hide } = usePresence();
60
-
61
- useEffect(() => {
62
- show();
63
- }, [show]);
64
-
65
- const handleClose = useCallback(() => {
66
- hide(handleDismiss);
67
- }, [handleDismiss, hide]);
68
-
69
- const { refs, context } = useFloating({
70
- open: true,
71
- onOpenChange: (nextOpen) => {
72
- if (!nextOpen) handleClose();
50
+ const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(
51
+ (
52
+ {
53
+ onOpenChange,
54
+ size = "md",
55
+ className,
56
+ style,
57
+ children,
58
+ dismissable = true,
59
+ closable,
60
+ align = "center",
61
+ "aria-label": ariaLabel,
62
+ "aria-labelledby": ariaLabelledBy,
63
+ "aria-describedby": ariaDescribedBy,
73
64
  },
74
- });
75
-
76
- const mergedRef = useMergedFloatingRef(refs, presenceRef);
77
-
78
- const dismiss = useDismiss(context, {
79
- enabled: dismissable,
80
- // OverlayContext handles escape key for proper stack ordering
81
- escapeKey: false,
82
- outsidePress: true,
83
- outsidePressEvent: "mousedown",
84
- });
85
-
86
- const role = useRole(context, {
87
- role: "dialog",
88
- });
89
-
90
- const { getFloatingProps } = useInteractions([dismiss, role]);
91
-
92
- const modalContextValue = useMemo(() => ({ onClose: handleClose, closable }), [closable, handleClose]); // eslint-disable-line react-hooks/exhaustive-deps
93
-
94
- if (!isMounted) return null;
95
-
96
- const isEntering = state === "entering";
97
- const isExiting = state === "exiting";
98
-
99
- return (
100
- <FloatingFocusManager context={context} modal>
101
- <FloatingOverlay lockScroll className={cn("fixed inset-0 z-modal bg-bg-overlay", isEntering && "animate-fade-in", isExiting && "animate-fade-out")}>
102
- <div
103
- ref={mergedRef}
104
- role="dialog"
105
- aria-modal="true"
106
- tabIndex={-1}
107
- data-state={state}
108
- className={cn(
109
- "fixed flex flex-col overflow-hidden outline-hidden",
110
- "rounded-xl border border-border-normal bg-bg-normal",
111
- // Size
112
- sizeClasses[size],
113
- // Cap height so ModalBody scrolls instead of overflowing the viewport
114
- "max-h-[95%]",
115
- // Mobile: slide up from bottom, full width
116
- "max-sm:inset-x-0 max-sm:bottom-0 max-sm:rounded-b-none",
117
- isEntering && "max-sm:animate-slide-up-in",
118
- isExiting && "max-sm:animate-slide-up-out",
119
- // Desktop: horizontal center + vertical alignment
120
- "sm:left-1/2 sm:-translate-x-1/2",
121
- align === "center" && "sm:top-1/2 sm:-translate-y-1/2",
122
- align === "top" && "sm:top-[15vh]",
123
- isEntering && "sm:animate-fade-in",
124
- isExiting && "sm:animate-fade-out",
125
- className
126
- )}
127
- style={style}
128
- {...getFloatingProps({})}
65
+ ref
66
+ ) => {
67
+ // Prefer explicit prop over context (context is set by useModal's overlay system)
68
+ const contextValue = useContext(ModalContext);
69
+ // Context provides a parameterless onClose for programmatic modals; adapt to the boolean shape.
70
+ const handleDismiss = useCallback(() => {
71
+ if (onOpenChange) onOpenChange(false);
72
+ else contextValue?.onClose();
73
+ }, [onOpenChange, contextValue]);
74
+
75
+ const { ref: presenceRef, state, isMounted, show, hide } = usePresence();
76
+
77
+ useEffect(() => {
78
+ show();
79
+ }, [show]);
80
+
81
+ const handleClose = useCallback(() => {
82
+ hide(handleDismiss);
83
+ }, [handleDismiss, hide]);
84
+
85
+ const { refs, context } = useFloating({
86
+ open: true,
87
+ onOpenChange: (nextOpen) => {
88
+ if (!nextOpen) handleClose();
89
+ },
90
+ });
91
+
92
+ const mergedRef = useMergedFloatingRef<HTMLDivElement>(refs, presenceRef, ref);
93
+
94
+ const dismiss = useDismiss(context, {
95
+ enabled: dismissable,
96
+ // OverlayContext handles escape key for proper stack ordering
97
+ escapeKey: false,
98
+ outsidePress: true,
99
+ outsidePressEvent: "mousedown",
100
+ });
101
+
102
+ const role = useRole(context, {
103
+ role: "dialog",
104
+ });
105
+
106
+ const { getFloatingProps } = useInteractions([dismiss, role]);
107
+
108
+ // The dialog names itself from its header. `Modal.Header` stamps `titleId`
109
+ // on itself and reports back, so a headerless modal falls through to the
110
+ // caller's `aria-label` instead of referencing an id that isn't there.
111
+ const titleId = useId();
112
+ const [hasTitle, setHasTitle] = useState(false);
113
+ const registerTitle = useCallback((present: boolean) => setHasTitle(present), []);
114
+
115
+ // `aria-labelledby` beats `aria-label` in the name computation, so a caller
116
+ // who passes a label must not also be pointed at the header — they would
117
+ // never see their own string win.
118
+ const labelledBy = ariaLabelledBy ?? (ariaLabel || !hasTitle ? undefined : titleId);
119
+
120
+ const modalContextValue = useMemo(() => ({ onClose: handleClose, closable, titleId, registerTitle }), [closable, handleClose, titleId, registerTitle]);
121
+
122
+ if (!isMounted) return null;
123
+
124
+ const isEntering = state === "entering";
125
+ const isExiting = state === "exiting";
126
+
127
+ return (
128
+ <FloatingFocusManager context={context} modal>
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")}
129
132
  >
130
- <ModalContext.Provider value={modalContextValue}>{children}</ModalContext.Provider>
131
- </div>
132
- </FloatingOverlay>
133
- </FloatingFocusManager>
134
- );
135
- };
133
+ <div
134
+ ref={mergedRef}
135
+ role="dialog"
136
+ aria-modal="true"
137
+ aria-label={ariaLabel}
138
+ aria-labelledby={labelledBy}
139
+ aria-describedby={ariaDescribedBy}
140
+ tabIndex={-1}
141
+ data-state={state}
142
+ className={cn(
143
+ "modal fixed flex flex-col overflow-hidden outline-hidden",
144
+ "border-(color:--modal-border) rounded-xl border bg-(--modal-bg)",
145
+ // Size
146
+ sizeClasses[size],
147
+ // Cap height so ModalBody scrolls instead of overflowing the viewport
148
+ "max-h-[95%]",
149
+ // Mobile: slide up from bottom, full width
150
+ "max-sm:inset-x-0 max-sm:bottom-0 max-sm:rounded-b-none",
151
+ isEntering && "max-sm:animate-slide-up-in",
152
+ isExiting && "max-sm:animate-slide-up-out",
153
+ // Desktop: horizontal center + vertical alignment
154
+ "sm:left-1/2 sm:-translate-x-1/2",
155
+ align === "center" && "sm:top-1/2 sm:-translate-y-1/2",
156
+ align === "top" && "sm:top-[15vh]",
157
+ isEntering && "sm:animate-fade-in",
158
+ isExiting && "sm:animate-fade-out",
159
+ className
160
+ )}
161
+ style={style}
162
+ {...getFloatingProps({})}
163
+ >
164
+ <ModalContext.Provider value={modalContextValue}>{children}</ModalContext.Provider>
165
+ </div>
166
+ </FloatingOverlay>
167
+ </FloatingFocusManager>
168
+ );
169
+ }
170
+ );
136
171
  ModalRoot.displayName = "Modal";
137
172
 
138
173
  // =============================================================================
139
174
  // Compound Component Export
140
175
  // =============================================================================
141
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
+ */
142
213
  export const Modal = Object.assign(ModalRoot, {
143
214
  Header: ModalHeader,
144
215
  Body: ModalBody,
@@ -9,6 +9,20 @@ export type OnClose = () => void;
9
9
  interface ModalContextValue {
10
10
  onClose: OnClose;
11
11
  closable?: boolean | undefined;
12
+ /**
13
+ * The id `Modal.Header` stamps on itself so the dialog can name itself from
14
+ * its own title. A dialog with no accessible name is announced as just
15
+ * "dialog", which tells a screen-reader user nothing about what interrupted
16
+ * them.
17
+ */
18
+ titleId?: string;
19
+ /**
20
+ * The header reports its presence, because a headerless modal must not point
21
+ * `aria-labelledby` at an element that never rendered — a dangling reference
22
+ * is worse than no reference at all (it resolves to an empty name and axe
23
+ * flags it as an invalid attribute value).
24
+ */
25
+ registerTitle?: (present: boolean) => void;
12
26
  }
13
27
 
14
28
  export const ModalContext = createContext<ModalContextValue | null>(null);
@@ -5,20 +5,32 @@ import { ModalContext } from "./ModalContext";
5
5
 
6
6
  export type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>;
7
7
 
8
- export const ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(({ className, children, ...props }, ref) => {
8
+ export const ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(({ className, children, id, ...props }, ref) => {
9
9
  const context = React.useContext(ModalContext);
10
10
  const closable = context?.closable;
11
11
  const onClose = context?.onClose;
12
+ const registerTitle = context?.registerTitle;
13
+
14
+ // Tell the dialog it has a title to point `aria-labelledby` at, and take that
15
+ // back on unmount so a header removed at runtime doesn't leave a dangling
16
+ // reference behind. A caller-supplied `id` wins over the generated one, which
17
+ // also means the dialog can no longer find it — say so rather than pointing
18
+ // at an id that isn't in the DOM, and let the caller label the Modal itself.
19
+ const ownsTitleId = id === undefined;
20
+ React.useEffect(() => {
21
+ registerTitle?.(ownsTitleId);
22
+ return () => registerTitle?.(false);
23
+ }, [registerTitle, ownsTitleId]);
12
24
 
13
25
  return (
14
- <div ref={ref} className={cn("flex flex-col space-y-1.5 p-6", closable && "pr-12", className)} {...props}>
26
+ <div ref={ref} id={id ?? context?.titleId} className={cn("flex flex-col space-y-1.5 p-6", closable && "pr-12", className)} {...props}>
15
27
  {children}
16
28
  {closable && (
17
29
  <button
18
30
  type="button"
19
31
  onClick={onClose}
20
32
  aria-label="Close"
21
- 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)"
22
34
  >
23
35
  <X size={16} />
24
36
  </button>
@@ -44,6 +44,12 @@ const PopoverRoot = ({ open: controlledOpen, onOpenChange, defaultOpen = false,
44
44
 
45
45
  const id = useId();
46
46
  const contentId = `popover-content-${id}`;
47
+ // `Popover.Body` is a `role="dialog"`, and a dialog with no accessible name is
48
+ // announced as just "dialog". There is no title sub-part to read from, so the
49
+ // trigger — which always has a label, because it is what the user clicked —
50
+ // names the popover. A caller passing their own `aria-label`/`aria-labelledby`
51
+ // to `Popover.Body` still wins.
52
+ const triggerId = `popover-trigger-${id}`;
47
53
 
48
54
  const contextValue = {
49
55
  open,
@@ -56,11 +62,41 @@ const PopoverRoot = ({ open: controlledOpen, onOpenChange, defaultOpen = false,
56
62
  getReferenceProps,
57
63
  getFloatingProps,
58
64
  contentId,
65
+ triggerId,
59
66
  };
60
67
 
61
68
  return <PopoverContext.Provider value={contextValue}>{children}</PopoverContext.Provider>;
62
69
  };
63
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
+ */
64
100
  export const Popover = Object.assign(PopoverRoot, {
65
101
  Trigger: PopoverTrigger,
66
102
  Body: PopoverBody,
@@ -6,7 +6,11 @@ import { usePopoverContext } from "./PopoverContext";
6
6
  export type PopoverBodyProps = React.HTMLAttributes<HTMLDivElement>;
7
7
 
8
8
  export const PopoverBody = React.forwardRef<HTMLDivElement, PopoverBodyProps>(({ className, children, ...props }, forwardedRef) => {
9
- const { open, refs, floatingStyles, getFloatingProps, contentId } = usePopoverContext();
9
+ const { open, refs, floatingStyles, getFloatingProps, contentId, triggerId } = usePopoverContext();
10
+
11
+ // `aria-labelledby` outranks `aria-label` in the name computation, so the
12
+ // trigger only names the dialog when the caller hasn't named it themselves.
13
+ const hasOwnLabel = props["aria-label"] !== undefined || props["aria-labelledby"] !== undefined;
10
14
 
11
15
  if (!open) return null;
12
16
 
@@ -20,6 +24,7 @@ export const PopoverBody = React.forwardRef<HTMLDivElement, PopoverBodyProps>(({
20
24
  }}
21
25
  id={contentId}
22
26
  role="dialog"
27
+ aria-labelledby={hasOwnLabel ? undefined : triggerId}
23
28
  style={floatingStyles}
24
29
  className={cn("z-popover rounded-lg border border-border-normal bg-bg-normal p-4 shadow-lg", className)}
25
30
  {...getFloatingProps(props)}
@@ -11,6 +11,7 @@ export type PopoverContextValue = {
11
11
  getReferenceProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
12
12
  getFloatingProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
13
13
  contentId: string;
14
+ triggerId: string;
14
15
  };
15
16
 
16
17
  export const PopoverContext = createContext<PopoverContextValue | null>(null);
@@ -8,7 +8,7 @@ export type PopoverTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement>
8
8
  };
9
9
 
10
10
  export const PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTriggerProps>(({ asChild = false, children, ...props }, forwardedRef) => {
11
- const { refs, getReferenceProps, contentId, open } = usePopoverContext();
11
+ const { refs, getReferenceProps, contentId, triggerId, open } = usePopoverContext();
12
12
  const Comp = asChild ? Slot : "button";
13
13
 
14
14
  return (
@@ -19,6 +19,7 @@ export const PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTrigger
19
19
  else if (forwardedRef) forwardedRef.current = node;
20
20
  }}
21
21
  type={asChild ? undefined : "button"}
22
+ id={triggerId}
22
23
  aria-haspopup="dialog"
23
24
  aria-expanded={open}
24
25
  aria-controls={open ? contentId : undefined}