@sixthshift/design-system 0.4.0 → 0.6.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 (417) hide show
  1. package/README.md +134 -87
  2. package/dist/components/Badge/Badge.d.ts +2 -2
  3. package/dist/components/Badge/Badge.js +2 -2
  4. package/dist/components/Button/Button.d.ts +1 -1
  5. package/dist/components/Button/Button.js +1 -1
  6. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  7. package/dist/components/Calendar/Calendar.js +1 -0
  8. package/dist/components/Calendar/Calendar.js.map +1 -1
  9. package/dist/components/Calendar/CalendarView.d.ts +0 -11
  10. package/dist/components/Calendar/CalendarView.d.ts.map +1 -1
  11. package/dist/components/Calendar/CalendarView.js +1 -0
  12. package/dist/components/Calendar/CalendarView.js.map +1 -1
  13. package/dist/components/Calendar/calendar.hooks.d.ts.map +1 -1
  14. package/dist/components/Calendar/calendar.hooks.js +1 -0
  15. package/dist/components/Calendar/calendar.hooks.js.map +1 -1
  16. package/dist/components/Card/Card.d.ts +50 -4
  17. package/dist/components/Card/Card.d.ts.map +1 -1
  18. package/dist/components/Card/Card.js +89 -5
  19. package/dist/components/Card/Card.js.map +1 -1
  20. package/dist/components/Card/index.d.ts +1 -1
  21. package/dist/components/Card/index.d.ts.map +1 -1
  22. package/dist/components/Card/index.js +1 -1
  23. package/dist/components/Card/index.js.map +1 -1
  24. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  25. package/dist/components/Checkbox/Checkbox.js +1 -0
  26. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  27. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  28. package/dist/components/CheckboxGroup/CheckboxGroup.js +1 -0
  29. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
  30. package/dist/components/Code/Editor/Editor.d.ts.map +1 -1
  31. package/dist/components/Code/Editor/Editor.js +1 -0
  32. package/dist/components/Code/Editor/Editor.js.map +1 -1
  33. package/dist/components/Code/Workspace/StatusBar.d.ts.map +1 -1
  34. package/dist/components/Code/Workspace/StatusBar.js +1 -0
  35. package/dist/components/Code/Workspace/StatusBar.js.map +1 -1
  36. package/dist/components/Code/Workspace/Toolbar.d.ts.map +1 -1
  37. package/dist/components/Code/Workspace/Toolbar.js +1 -0
  38. package/dist/components/Code/Workspace/Toolbar.js.map +1 -1
  39. package/dist/components/Code/Workspace/Workspace.d.ts.map +1 -1
  40. package/dist/components/Code/Workspace/Workspace.js +1 -0
  41. package/dist/components/Code/Workspace/Workspace.js.map +1 -1
  42. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  43. package/dist/components/DatePicker/DatePicker.js +5 -0
  44. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  45. package/dist/components/DatePicker/DateSegments.d.ts.map +1 -1
  46. package/dist/components/DatePicker/DateSegments.js +1 -0
  47. package/dist/components/DatePicker/DateSegments.js.map +1 -1
  48. package/dist/components/DatePicker/datepicker.hooks.d.ts.map +1 -1
  49. package/dist/components/DatePicker/datepicker.hooks.js +1 -0
  50. package/dist/components/DatePicker/datepicker.hooks.js.map +1 -1
  51. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  52. package/dist/components/DateRangePicker/DateRangePicker.js +1 -0
  53. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  54. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  55. package/dist/components/DateTimePicker/DateTimePicker.js +5 -0
  56. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  57. package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -1
  58. package/dist/components/DateTimePicker/DateTimeSegments.js +1 -0
  59. package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -1
  60. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
  61. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +5 -0
  62. package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
  63. package/dist/components/FormField/FormField.d.ts +31 -10
  64. package/dist/components/FormField/FormField.d.ts.map +1 -1
  65. package/dist/components/FormField/FormField.js +46 -17
  66. package/dist/components/FormField/FormField.js.map +1 -1
  67. package/dist/components/FormField/index.d.ts +2 -2
  68. package/dist/components/FormField/index.d.ts.map +1 -1
  69. package/dist/components/FormField/index.js +1 -1
  70. package/dist/components/FormField/index.js.map +1 -1
  71. package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
  72. package/dist/components/HoverCard/HoverCard.js +1 -0
  73. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  74. package/dist/components/HoverCard/components/HoverCardContent.d.ts.map +1 -1
  75. package/dist/components/HoverCard/components/HoverCardContent.js +1 -0
  76. package/dist/components/HoverCard/components/HoverCardContent.js.map +1 -1
  77. package/dist/components/HoverCard/components/HoverCardContext.d.ts.map +1 -1
  78. package/dist/components/HoverCard/components/HoverCardContext.js +1 -0
  79. package/dist/components/HoverCard/components/HoverCardContext.js.map +1 -1
  80. package/dist/components/HoverCard/components/HoverCardTrigger.d.ts.map +1 -1
  81. package/dist/components/HoverCard/components/HoverCardTrigger.js +1 -0
  82. package/dist/components/HoverCard/components/HoverCardTrigger.js.map +1 -1
  83. package/dist/components/Message/Message.d.ts +1 -1
  84. package/dist/components/Message/Message.js +1 -1
  85. package/dist/components/Modal/Modal.d.ts +14 -9
  86. package/dist/components/Modal/Modal.d.ts.map +1 -1
  87. package/dist/components/Modal/Modal.js +42 -20
  88. package/dist/components/Modal/Modal.js.map +1 -1
  89. package/dist/components/Modal/components/ModalContext.d.ts.map +1 -1
  90. package/dist/components/Modal/components/ModalContext.js +1 -0
  91. package/dist/components/Modal/components/ModalContext.js.map +1 -1
  92. package/dist/components/Modal/components/ModalHeader.d.ts.map +1 -1
  93. package/dist/components/Modal/components/ModalHeader.js +1 -0
  94. package/dist/components/Modal/components/ModalHeader.js.map +1 -1
  95. package/dist/components/Popover/Popover.d.ts.map +1 -1
  96. package/dist/components/Popover/Popover.js +5 -0
  97. package/dist/components/Popover/Popover.js.map +1 -1
  98. package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
  99. package/dist/components/Popover/components/PopoverBody.js +1 -0
  100. package/dist/components/Popover/components/PopoverBody.js.map +1 -1
  101. package/dist/components/Popover/components/PopoverClose.d.ts.map +1 -1
  102. package/dist/components/Popover/components/PopoverClose.js +1 -0
  103. package/dist/components/Popover/components/PopoverClose.js.map +1 -1
  104. package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
  105. package/dist/components/Popover/components/PopoverContext.js +1 -0
  106. package/dist/components/Popover/components/PopoverContext.js.map +1 -1
  107. package/dist/components/Popover/components/PopoverTrigger.d.ts.map +1 -1
  108. package/dist/components/Popover/components/PopoverTrigger.js +1 -0
  109. package/dist/components/Popover/components/PopoverTrigger.js.map +1 -1
  110. package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
  111. package/dist/components/RadioButton/RadioButton.js +1 -0
  112. package/dist/components/RadioButton/RadioButton.js.map +1 -1
  113. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
  114. package/dist/components/RadioButtonGroup/RadioButtonGroup.js +1 -0
  115. package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  116. package/dist/components/SearchInput/SearchInput.d.ts +10 -7
  117. package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
  118. package/dist/components/SearchInput/SearchInput.js +11 -6
  119. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  120. package/dist/components/Select/Select.d.ts +6 -0
  121. package/dist/components/Select/Select.d.ts.map +1 -1
  122. package/dist/components/Select/Select.js +9 -3
  123. package/dist/components/Select/Select.js.map +1 -1
  124. package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
  125. package/dist/components/Select/SelectDropdown.js +1 -0
  126. package/dist/components/Select/SelectDropdown.js.map +1 -1
  127. package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
  128. package/dist/components/Select/SelectTrigger.js +5 -1
  129. package/dist/components/Select/SelectTrigger.js.map +1 -1
  130. package/dist/components/Select/useSelectKeyboard.d.ts.map +1 -1
  131. package/dist/components/Select/useSelectKeyboard.js +1 -0
  132. package/dist/components/Select/useSelectKeyboard.js.map +1 -1
  133. package/dist/components/Sheet/Sheet.d.ts.map +1 -1
  134. package/dist/components/Sheet/Sheet.js +23 -9
  135. package/dist/components/Sheet/Sheet.js.map +1 -1
  136. package/dist/components/Sheet/components/SheetContext.d.ts.map +1 -1
  137. package/dist/components/Sheet/components/SheetContext.js +1 -0
  138. package/dist/components/Sheet/components/SheetContext.js.map +1 -1
  139. package/dist/components/Sheet/components/SheetHeader.d.ts.map +1 -1
  140. package/dist/components/Sheet/components/SheetHeader.js +1 -0
  141. package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
  142. package/dist/components/Spinner/Spinner.d.ts +2 -2
  143. package/dist/components/Spinner/Spinner.js +2 -2
  144. package/dist/components/Switch/Switch.d.ts.map +1 -1
  145. package/dist/components/Switch/Switch.js +1 -0
  146. package/dist/components/Switch/Switch.js.map +1 -1
  147. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  148. package/dist/components/Tabs/Tabs.js +1 -0
  149. package/dist/components/Tabs/Tabs.js.map +1 -1
  150. package/dist/components/Tabs/components/TabsContext.d.ts.map +1 -1
  151. package/dist/components/Tabs/components/TabsContext.js +1 -0
  152. package/dist/components/Tabs/components/TabsContext.js.map +1 -1
  153. package/dist/components/Tabs/components/TabsList.d.ts.map +1 -1
  154. package/dist/components/Tabs/components/TabsList.js +1 -0
  155. package/dist/components/Tabs/components/TabsList.js.map +1 -1
  156. package/dist/components/Tabs/components/TabsPanels.d.ts.map +1 -1
  157. package/dist/components/Tabs/components/TabsPanels.js +1 -0
  158. package/dist/components/Tabs/components/TabsPanels.js.map +1 -1
  159. package/dist/components/Tabs/components/TabsTrigger.d.ts.map +1 -1
  160. package/dist/components/Tabs/components/TabsTrigger.js +2 -1
  161. package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
  162. package/dist/components/TagChip/TagChip.d.ts.map +1 -1
  163. package/dist/components/TagChip/TagChip.js +1 -0
  164. package/dist/components/TagChip/TagChip.js.map +1 -1
  165. package/dist/components/TagInput/TagInput.d.ts +8 -2
  166. package/dist/components/TagInput/TagInput.d.ts.map +1 -1
  167. package/dist/components/TagInput/TagInput.js +8 -5
  168. package/dist/components/TagInput/TagInput.js.map +1 -1
  169. package/dist/components/Textarea/Textarea.d.ts +21 -5
  170. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  171. package/dist/components/Textarea/Textarea.js +31 -5
  172. package/dist/components/Textarea/Textarea.js.map +1 -1
  173. package/dist/components/TimePicker/PeriodSelector.d.ts.map +1 -1
  174. package/dist/components/TimePicker/PeriodSelector.js +1 -0
  175. package/dist/components/TimePicker/PeriodSelector.js.map +1 -1
  176. package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
  177. package/dist/components/TimePicker/TimeColumn.js +1 -0
  178. package/dist/components/TimePicker/TimeColumn.js.map +1 -1
  179. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
  180. package/dist/components/TimePicker/TimePicker.js +5 -0
  181. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  182. package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -1
  183. package/dist/components/TimePicker/TimeSegments.js +1 -0
  184. package/dist/components/TimePicker/TimeSegments.js.map +1 -1
  185. package/dist/components/Toast/Toast.d.ts +16 -2
  186. package/dist/components/Toast/Toast.d.ts.map +1 -1
  187. package/dist/components/Toast/Toast.js +16 -6
  188. package/dist/components/Toast/Toast.js.map +1 -1
  189. package/dist/components/Toggle/Toggle.d.ts +1 -1
  190. package/dist/components/Toggle/Toggle.d.ts.map +1 -1
  191. package/dist/components/Toggle/Toggle.js +2 -1
  192. package/dist/components/Toggle/Toggle.js.map +1 -1
  193. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +2 -0
  194. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
  195. package/dist/components/ToggleGroup/ToggleGroupMultiple.js +4 -3
  196. package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
  197. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +2 -0
  198. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
  199. package/dist/components/ToggleGroup/ToggleGroupSingle.js +4 -3
  200. package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
  201. package/dist/components/ToggleGroup/toggleGroup.types.d.ts +7 -0
  202. package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
  203. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  204. package/dist/components/Tooltip/Tooltip.js +1 -0
  205. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  206. package/dist/components/Tooltip/components/TooltipBody.d.ts.map +1 -1
  207. package/dist/components/Tooltip/components/TooltipBody.js +1 -0
  208. package/dist/components/Tooltip/components/TooltipBody.js.map +1 -1
  209. package/dist/components/Tooltip/components/TooltipContext.d.ts.map +1 -1
  210. package/dist/components/Tooltip/components/TooltipContext.js +1 -0
  211. package/dist/components/Tooltip/components/TooltipContext.js.map +1 -1
  212. package/dist/components/Tooltip/components/TooltipTrigger.d.ts.map +1 -1
  213. package/dist/components/Tooltip/components/TooltipTrigger.js +1 -0
  214. package/dist/components/Tooltip/components/TooltipTrigger.js.map +1 -1
  215. package/dist/hooks/useCollapsible.d.ts.map +1 -1
  216. package/dist/hooks/useCollapsible.js +1 -0
  217. package/dist/hooks/useCollapsible.js.map +1 -1
  218. package/dist/hooks/useControllableState.d.ts.map +1 -1
  219. package/dist/hooks/useControllableState.js +1 -0
  220. package/dist/hooks/useControllableState.js.map +1 -1
  221. package/dist/hooks/useDebouncedCallback.d.ts.map +1 -1
  222. package/dist/hooks/useDebouncedCallback.js +1 -0
  223. package/dist/hooks/useDebouncedCallback.js.map +1 -1
  224. package/dist/hooks/useDebouncedState.d.ts.map +1 -1
  225. package/dist/hooks/useDebouncedState.js +1 -0
  226. package/dist/hooks/useDebouncedState.js.map +1 -1
  227. package/dist/hooks/useDeviceFormFactor.d.ts.map +1 -1
  228. package/dist/hooks/useDeviceFormFactor.js +1 -0
  229. package/dist/hooks/useDeviceFormFactor.js.map +1 -1
  230. package/dist/hooks/useLocalStorage.d.ts.map +1 -1
  231. package/dist/hooks/useLocalStorage.js +1 -0
  232. package/dist/hooks/useLocalStorage.js.map +1 -1
  233. package/dist/hooks/useMergedFloatingRef.d.ts.map +1 -1
  234. package/dist/hooks/useMergedFloatingRef.js +1 -0
  235. package/dist/hooks/useMergedFloatingRef.js.map +1 -1
  236. package/dist/hooks/usePresence.d.ts.map +1 -1
  237. package/dist/hooks/usePresence.js +1 -0
  238. package/dist/hooks/usePresence.js.map +1 -1
  239. package/dist/hooks/useStack.d.ts.map +1 -1
  240. package/dist/hooks/useStack.js +34 -10
  241. package/dist/hooks/useStack.js.map +1 -1
  242. package/dist/hooks/useTheme.d.ts.map +1 -1
  243. package/dist/hooks/useTheme.js +1 -0
  244. package/dist/hooks/useTheme.js.map +1 -1
  245. package/dist/internal/PickerField.d.ts.map +1 -1
  246. package/dist/internal/PickerField.js +1 -0
  247. package/dist/internal/PickerField.js.map +1 -1
  248. package/dist/internal/SegmentedField.d.ts.map +1 -1
  249. package/dist/internal/SegmentedField.js +1 -0
  250. package/dist/internal/SegmentedField.js.map +1 -1
  251. package/dist/internal/escapeLayers.d.ts +12 -0
  252. package/dist/internal/escapeLayers.d.ts.map +1 -0
  253. package/dist/internal/escapeLayers.js +48 -0
  254. package/dist/internal/escapeLayers.js.map +1 -0
  255. package/dist/lib/ErrorBoundary.d.ts.map +1 -1
  256. package/dist/lib/ErrorBoundary.js +1 -0
  257. package/dist/lib/ErrorBoundary.js.map +1 -1
  258. package/dist/lib/contexts/ComponentsContext/ComponentsContext.d.ts.map +1 -1
  259. package/dist/lib/contexts/ComponentsContext/ComponentsContext.js +1 -0
  260. package/dist/lib/contexts/ComponentsContext/ComponentsContext.js.map +1 -1
  261. package/dist/lib/contexts/OverlayContext/OverlayContext.d.ts +9 -4
  262. package/dist/lib/contexts/OverlayContext/OverlayContext.d.ts.map +1 -1
  263. package/dist/lib/contexts/OverlayContext/OverlayContext.js +34 -10
  264. package/dist/lib/contexts/OverlayContext/OverlayContext.js.map +1 -1
  265. package/dist/lib/contexts/OverlayContext/ToastStack.d.ts +20 -0
  266. package/dist/lib/contexts/OverlayContext/ToastStack.d.ts.map +1 -0
  267. package/dist/lib/contexts/OverlayContext/ToastStack.js +45 -0
  268. package/dist/lib/contexts/OverlayContext/ToastStack.js.map +1 -0
  269. package/dist/lib/contexts/OverlayContext/hooks/useModal.d.ts.map +1 -1
  270. package/dist/lib/contexts/OverlayContext/hooks/useModal.js +1 -0
  271. package/dist/lib/contexts/OverlayContext/hooks/useModal.js.map +1 -1
  272. package/dist/lib/contexts/OverlayContext/hooks/useToast.d.ts +27 -10
  273. package/dist/lib/contexts/OverlayContext/hooks/useToast.d.ts.map +1 -1
  274. package/dist/lib/contexts/OverlayContext/hooks/useToast.js +31 -49
  275. package/dist/lib/contexts/OverlayContext/hooks/useToast.js.map +1 -1
  276. package/dist/lib/contexts/OverlayContext/index.d.ts +2 -0
  277. package/dist/lib/contexts/OverlayContext/index.d.ts.map +1 -1
  278. package/dist/lib/contexts/OverlayContext/index.js +2 -0
  279. package/dist/lib/contexts/OverlayContext/index.js.map +1 -1
  280. package/dist/lib/contexts/OverlayContext/toastStore.d.ts +68 -0
  281. package/dist/lib/contexts/OverlayContext/toastStore.d.ts.map +1 -0
  282. package/dist/lib/contexts/OverlayContext/toastStore.js +69 -0
  283. package/dist/lib/contexts/OverlayContext/toastStore.js.map +1 -0
  284. package/dist/lib/withErrorBoundary.d.ts.map +1 -1
  285. package/dist/lib/withErrorBoundary.js +1 -0
  286. package/dist/lib/withErrorBoundary.js.map +1 -1
  287. package/dist/lib/withSuspenseAndErrorBoundary.d.ts.map +1 -1
  288. package/dist/lib/withSuspenseAndErrorBoundary.js +1 -0
  289. package/dist/lib/withSuspenseAndErrorBoundary.js.map +1 -1
  290. package/dist/{theme/schema.d.ts → theming/vocabulary.d.ts} +4 -4
  291. package/dist/theming/vocabulary.d.ts.map +1 -0
  292. package/dist/{theme/schema.js → theming/vocabulary.js} +4 -4
  293. package/dist/theming/vocabulary.js.map +1 -0
  294. package/package.json +22 -9
  295. package/src/components/Badge/Badge.tsx +2 -2
  296. package/src/components/Button/Button.tsx +1 -1
  297. package/src/{theme/recipes/button.css → components/Button/button.recipe.css} +2 -2
  298. package/src/components/Calendar/Calendar.tsx +2 -0
  299. package/src/components/Calendar/CalendarView.tsx +2 -0
  300. package/src/components/Calendar/calendar.hooks.ts +2 -0
  301. package/src/components/Card/Card.tsx +105 -17
  302. package/src/{theme/recipes/card.css → components/Card/card.recipe.css} +6 -1
  303. package/src/components/Card/index.ts +1 -1
  304. package/src/components/Checkbox/Checkbox.tsx +2 -0
  305. package/src/components/CheckboxGroup/CheckboxGroup.tsx +2 -0
  306. package/src/components/Code/Editor/Editor.tsx +2 -0
  307. package/src/components/Code/Workspace/StatusBar.tsx +2 -0
  308. package/src/components/Code/Workspace/Toolbar.tsx +2 -0
  309. package/src/components/Code/Workspace/Workspace.tsx +2 -0
  310. package/src/components/DatePicker/DatePicker.tsx +7 -0
  311. package/src/components/DatePicker/DateSegments.tsx +2 -0
  312. package/src/components/DatePicker/datepicker.hooks.ts +2 -0
  313. package/src/components/DateRangePicker/DateRangePicker.tsx +2 -0
  314. package/src/components/DateTimePicker/DateTimePicker.tsx +7 -1
  315. package/src/components/DateTimePicker/DateTimeSegments.tsx +2 -0
  316. package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +7 -1
  317. package/src/components/FormField/FormField.tsx +94 -42
  318. package/src/components/FormField/index.ts +2 -2
  319. package/src/components/HoverCard/HoverCard.tsx +2 -0
  320. package/src/components/HoverCard/components/HoverCardContent.tsx +2 -0
  321. package/src/components/HoverCard/components/HoverCardContext.tsx +2 -0
  322. package/src/components/HoverCard/components/HoverCardTrigger.tsx +2 -0
  323. package/src/components/Message/Message.tsx +1 -1
  324. package/src/components/Modal/Modal.tsx +77 -51
  325. package/src/components/Modal/components/ModalContext.tsx +2 -0
  326. package/src/components/Modal/components/ModalHeader.tsx +2 -0
  327. package/src/components/Popover/Popover.tsx +7 -0
  328. package/src/components/Popover/components/PopoverBody.tsx +2 -0
  329. package/src/components/Popover/components/PopoverClose.tsx +2 -0
  330. package/src/components/Popover/components/PopoverContext.tsx +2 -0
  331. package/src/components/Popover/components/PopoverTrigger.tsx +2 -0
  332. package/src/components/RadioButton/RadioButton.tsx +2 -0
  333. package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +2 -0
  334. package/src/components/SearchInput/SearchInput.tsx +15 -8
  335. package/src/components/Select/Select.tsx +24 -1
  336. package/src/components/Select/SelectDropdown.tsx +2 -0
  337. package/src/components/Select/SelectTrigger.tsx +5 -0
  338. package/src/components/Select/useSelectKeyboard.ts +2 -0
  339. package/src/components/Sheet/Sheet.tsx +49 -34
  340. package/src/components/Sheet/components/SheetContext.tsx +2 -0
  341. package/src/components/Sheet/components/SheetHeader.tsx +2 -0
  342. package/src/components/Spinner/Spinner.tsx +2 -2
  343. package/src/components/Switch/Switch.tsx +2 -0
  344. package/src/components/Tabs/Tabs.tsx +2 -0
  345. package/src/components/Tabs/components/TabsContext.tsx +2 -0
  346. package/src/components/Tabs/components/TabsList.tsx +2 -0
  347. package/src/components/Tabs/components/TabsPanels.tsx +2 -0
  348. package/src/components/Tabs/components/TabsTrigger.tsx +3 -1
  349. package/src/{theme/recipes/tabs.css → components/Tabs/tabs.recipe.css} +1 -1
  350. package/src/components/TagChip/TagChip.tsx +2 -0
  351. package/src/components/TagInput/TagInput.tsx +15 -6
  352. package/src/components/Textarea/Textarea.tsx +42 -6
  353. package/src/{theme/recipes/textarea.css → components/Textarea/textarea.recipe.css} +1 -1
  354. package/src/components/TimePicker/PeriodSelector.tsx +2 -0
  355. package/src/components/TimePicker/TimeColumn.tsx +2 -0
  356. package/src/components/TimePicker/TimePicker.tsx +7 -0
  357. package/src/components/TimePicker/TimeSegments.tsx +2 -0
  358. package/src/components/Toast/Toast.tsx +22 -6
  359. package/src/components/Toggle/Toggle.tsx +3 -1
  360. package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +6 -0
  361. package/src/components/ToggleGroup/ToggleGroupSingle.tsx +6 -0
  362. package/src/components/ToggleGroup/toggleGroup.types.ts +7 -0
  363. package/src/components/Tooltip/Tooltip.tsx +2 -0
  364. package/src/components/Tooltip/components/TooltipBody.tsx +2 -0
  365. package/src/components/Tooltip/components/TooltipContext.tsx +2 -0
  366. package/src/components/Tooltip/components/TooltipTrigger.tsx +2 -0
  367. package/src/hooks/useCollapsible.ts +2 -0
  368. package/src/hooks/useControllableState.ts +2 -0
  369. package/src/hooks/useDebouncedCallback.ts +2 -0
  370. package/src/hooks/useDebouncedState.ts +2 -0
  371. package/src/hooks/useDeviceFormFactor.ts +2 -0
  372. package/src/hooks/useLocalStorage.ts +2 -0
  373. package/src/hooks/useMergedFloatingRef.ts +2 -0
  374. package/src/hooks/usePresence.ts +2 -0
  375. package/src/hooks/useStack.ts +35 -12
  376. package/src/hooks/useTheme.ts +2 -0
  377. package/src/internal/PickerField.tsx +2 -0
  378. package/src/internal/SegmentedField.tsx +2 -0
  379. package/src/internal/escapeLayers.ts +53 -0
  380. package/src/lib/ErrorBoundary.tsx +2 -0
  381. package/src/lib/contexts/ComponentsContext/ComponentsContext.tsx +2 -0
  382. package/src/lib/contexts/OverlayContext/OverlayContext.tsx +53 -26
  383. package/src/lib/contexts/OverlayContext/ToastStack.tsx +71 -0
  384. package/src/lib/contexts/OverlayContext/hooks/useModal.tsx +2 -0
  385. package/src/lib/contexts/OverlayContext/hooks/useToast.ts +30 -73
  386. package/src/lib/contexts/OverlayContext/index.ts +2 -0
  387. package/src/lib/contexts/OverlayContext/toastStore.ts +138 -0
  388. package/src/lib/withErrorBoundary.tsx +2 -0
  389. package/src/lib/withSuspenseAndErrorBoundary.tsx +2 -0
  390. package/src/theme/linen/index.css +11 -0
  391. package/src/theme/linen/palette.css +87 -0
  392. package/src/theme/linen/theme.css +371 -0
  393. package/src/theming/tailwind.css +356 -0
  394. package/src/{theme/schema.ts → theming/vocabulary.ts} +3 -3
  395. package/dist/theme/index.d.ts +0 -9
  396. package/dist/theme/index.d.ts.map +0 -1
  397. package/dist/theme/index.js +0 -8
  398. package/dist/theme/index.js.map +0 -1
  399. package/dist/theme/schema.d.ts.map +0 -1
  400. package/dist/theme/schema.js.map +0 -1
  401. package/src/theme/index.ts +0 -39
  402. package/src/theme/recipes/index.css +0 -28
  403. package/src/theme/tokens.css +0 -824
  404. /package/src/{theme/recipes/badge.css → components/Badge/badge.recipe.css} +0 -0
  405. /package/src/{theme/recipes/checkbox.css → components/Checkbox/checkbox.recipe.css} +0 -0
  406. /package/src/{theme/recipes/field.css → components/Field/field.recipe.css} +0 -0
  407. /package/src/{theme/recipes/input.css → components/Input/input.recipe.css} +0 -0
  408. /package/src/{theme/recipes/message.css → components/Message/message.recipe.css} +0 -0
  409. /package/src/{theme/recipes/modal.css → components/Modal/modal.recipe.css} +0 -0
  410. /package/src/{theme/recipes/radio-button.css → components/RadioButton/radio-button.recipe.css} +0 -0
  411. /package/src/{theme/recipes/search-input.css → components/SearchInput/search-input.recipe.css} +0 -0
  412. /package/src/{theme/recipes/select.css → components/Select/select.recipe.css} +0 -0
  413. /package/src/{theme/recipes/sheet.css → components/Sheet/sheet.recipe.css} +0 -0
  414. /package/src/{theme/recipes/spinner.css → components/Spinner/spinner.recipe.css} +0 -0
  415. /package/src/{theme/recipes/switch.css → components/Switch/switch.recipe.css} +0 -0
  416. /package/src/{theme/recipes/tag-chip.css → components/TagChip/tag-chip.recipe.css} +0 -0
  417. /package/src/{theme/recipes/toggle.css → components/Toggle/toggle.recipe.css} +0 -0
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import { useEffect } from "react";
3
+ /**
4
+ * Registry of open "escape layers" — transient floating overlays (popovers,
5
+ * select dropdowns, picker calendars) that should consume an Escape press
6
+ * before any dialog beneath them reacts to it.
7
+ *
8
+ * The dialogs and these overlays each listen for Escape on `document`
9
+ * independently (floating-ui's `useDismiss` has no tree here), and document
10
+ * listeners fire in registration order — usually the dialog's first, since it
11
+ * opened first. So a dialog cannot rely on `defaultPrevented`; instead it asks
12
+ * this registry whether a layer is open and, if so, leaves the Escape to it.
13
+ * The registry is read synchronously during the event, before React commits
14
+ * the layer's close, so the layer that is handling this Escape still counts.
15
+ *
16
+ * Module-level on purpose: Popover, Select and Modal live in separate subpath
17
+ * entries with no shared context, and a context would also miss overlays
18
+ * rendered outside an `OverlayProvider`.
19
+ */
20
+ const transientLayers = new Set();
21
+ const dialogLayers = new Set();
22
+ /** True while any transient escape-consuming overlay (popover-like) is open. */
23
+ export const hasOpenEscapeLayer = () => transientLayers.size > 0;
24
+ /** True while any modal dialog is open. A non-modal Sheet under a Modal defers Escape to it. */
25
+ export const hasOpenEscapeDialog = () => dialogLayers.size > 0;
26
+ function useRegistration(registry, active) {
27
+ useEffect(() => {
28
+ if (!active)
29
+ return;
30
+ const token = Symbol("escape-layer");
31
+ registry.add(token);
32
+ return () => {
33
+ registry.delete(token);
34
+ };
35
+ }, [registry, active]);
36
+ }
37
+ /**
38
+ * Marks this component as an open transient escape layer while `active` is
39
+ * true. Call with the overlay's `open` state.
40
+ */
41
+ export function useEscapeLayer(active) {
42
+ useRegistration(transientLayers, active);
43
+ }
44
+ /** Marks this component as an open modal dialog while `active` is true. */
45
+ export function useEscapeDialog(active) {
46
+ useRegistration(dialogLayers, active);
47
+ }
48
+ //# sourceMappingURL=escapeLayers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escapeLayers.js","sourceRoot":"","sources":["../../src/internal/escapeLayers.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;AAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;AAEvC,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC;AAEjE,gGAAgG;AAChG,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC;AAE/D,SAAS,eAAe,CAAC,QAAqB,EAAE,MAAe;IAC7D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;QACrC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/lib/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,SAAS,CAAC,CAAC;IACjE,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,qBAAa,aAAc,SAAQ,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC5C,KAAK,EAAE,KAAK;IAKxB,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAI3C,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;IAI7D,KAAK,aAEH;IAEO,MAAM;CAahB"}
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/lib/ErrorBoundary.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,SAAS,CAAC,CAAC;IACjE,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,qBAAa,aAAc,SAAQ,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC5C,KAAK,EAAE,KAAK;IAKxB,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAI3C,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;IAI7D,KAAK,aAEH;IAEO,MAAM;CAahB"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { Component } from "react";
2
3
  export class ErrorBoundary extends Component {
3
4
  constructor(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/lib/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkC,MAAM,OAAO,CAAC;AAgBlE,MAAM,OAAO,aAAc,SAAQ,SAAuB;IACxD,YAAY,KAAY;QACtB,KAAK,CAAC,KAAK,CAAC,CAAC;QAYf,UAAK,GAAG,GAAG,EAAE;YACX,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC;QAbA,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAEQ,iBAAiB,CAAC,KAAY,EAAE,SAAoB;QAC3D,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IAMQ,MAAM;QACb,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACnC,OAAO,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/lib/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAkC,MAAM,OAAO,CAAC;AAgBlE,MAAM,OAAO,aAAc,SAAQ,SAAuB;IACxD,YAAY,KAAY;QACtB,KAAK,CAAC,KAAK,CAAC,CAAC;QAYf,UAAK,GAAG,GAAG,EAAE;YACX,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC;QAbA,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAEQ,iBAAiB,CAAC,KAAY,EAAE,SAAoB;QAC3D,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IAMQ,MAAM;QACb,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACnC,OAAO,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentsContext.d.ts","sourceRoot":"","sources":["../../../../src/lib/contexts/ComponentsContext/ComponentsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAc,MAAM,OAAO,CAAC;AAE1F,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,KAAK,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAEpD,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAYF,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;IACtD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CACjC,CAAC,CAAC;AAEH,eAAO,MAAM,kBAAkB,6BAA8B,uBAAuB,gCAEnF,CAAC;AAEF,eAAO,MAAM,aAAa,kBAAsC,CAAC"}
1
+ {"version":3,"file":"ComponentsContext.d.ts","sourceRoot":"","sources":["../../../../src/lib/contexts/ComponentsContext/ComponentsContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAc,MAAM,OAAO,CAAC;AAE1F,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,KAAK,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAEpD,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAYF,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;IACtD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CACjC,CAAC,CAAC;AAEH,eAAO,MAAM,kBAAkB,6BAA8B,uBAAuB,gCAEnF,CAAC;AAEF,eAAO,MAAM,aAAa,kBAAsC,CAAC"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx } from "react/jsx-runtime";
2
3
  import { createContext, useContext } from "react";
3
4
  const DefaultLink = ({ href, children, ...props }) => (_jsx("a", { href: href, ...props, children: children }));
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentsContext.js","sourceRoot":"","sources":["../../../../src/lib/contexts/ComponentsContext/ComponentsContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAA0C,UAAU,EAAE,MAAM,OAAO,CAAC;AAe1F,MAAM,WAAW,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAa,EAAE,EAAE,CAAC,CAC/D,YAAG,IAAI,EAAE,IAAI,KAAM,KAAK,YACrB,QAAQ,GACP,CACL,CAAC;AAEF,MAAM,iBAAiB,GAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAE5D,MAAM,iBAAiB,GAAG,aAAa,CAAa,iBAAiB,CAAC,CAAC;AAMvE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,UAAU,EAAE,QAAQ,EAA2B,EAAE,EAAE,CAAC,CACvF,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,iBAAiB,EAAE,GAAG,UAAU,EAAE,YAAG,QAAQ,GAA8B,CACpH,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"ComponentsContext.js","sourceRoot":"","sources":["../../../../src/lib/contexts/ComponentsContext/ComponentsContext.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAA0C,UAAU,EAAE,MAAM,OAAO,CAAC;AAe1F,MAAM,WAAW,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAa,EAAE,EAAE,CAAC,CAC/D,YAAG,IAAI,EAAE,IAAI,KAAM,KAAK,YACrB,QAAQ,GACP,CACL,CAAC;AAEF,MAAM,iBAAiB,GAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAE5D,MAAM,iBAAiB,GAAG,aAAa,CAAa,iBAAiB,CAAC,CAAC;AAMvE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,UAAU,EAAE,QAAQ,EAA2B,EAAE,EAAE,CAAC,CACvF,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,iBAAiB,EAAE,GAAG,UAAU,EAAE,YAAG,QAAQ,GAA8B,CACpH,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC"}
@@ -1,9 +1,14 @@
1
1
  import { type FloatingPortalProps } from "@floating-ui/react";
2
2
  import { type StackItem, useStack } from "@sixthshift/design-system/hooks";
3
3
  import { type FunctionComponent, type PropsWithChildren } from "react";
4
+ import { type ToastStore } from "./toastStore.js";
4
5
  type OverlayContextProps = {
5
6
  modal?: FloatingPortalProps["root"];
6
7
  toast?: FloatingPortalProps["root"];
8
+ /** The toast stack to render. Default: the app's one, which `toast()` opens onto. Hand in your own for a second bundle or a test. */
9
+ toasts?: ToastStore;
10
+ /** Merged over the toast stack's container classes, so an app can move it (above a bottom bar, into a corner). */
11
+ toastClassName?: string;
7
12
  };
8
13
  /** Stack item for overlays - component is a self-contained wrapper */
9
14
  type OverlayStackItem = StackItem & {
@@ -14,12 +19,12 @@ type OverlayStackItem = StackItem & {
14
19
  onClose?: (() => void) | undefined;
15
20
  };
16
21
  type OverlayContextType = {
17
- modalRoot: FloatingPortalProps["root"];
22
+ modalRoot: FloatingPortalProps["root"] | undefined;
18
23
  modalStack: ReturnType<typeof useStack<OverlayStackItem>>;
19
- toastRoot: FloatingPortalProps["root"];
20
- toastStack: ReturnType<typeof useStack<OverlayStackItem>>;
24
+ toastRoot: FloatingPortalProps["root"] | undefined;
25
+ toastStore: ToastStore;
21
26
  };
22
27
  export declare const useOverlayContext: () => OverlayContextType;
23
- export declare const OverlayProvider: ({ modal: modalRoot, toast: toastRoot, children }: PropsWithChildren<OverlayContextProps>) => import("react").JSX.Element;
28
+ export declare const OverlayProvider: ({ modal: modalRoot, toast: toastRoot, toasts: toastStore, toastClassName, children, }: PropsWithChildren<OverlayContextProps>) => import("react").JSX.Element;
24
29
  export {};
25
30
  //# sourceMappingURL=OverlayContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayContext.d.ts","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/OverlayContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAiB,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAkC,MAAM,OAAO,CAAC;AAEtH,KAAK,mBAAmB,GAAG;IACzB,KAAK,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CACrC,CAAC;AAEF,sEAAsE;AACtE,KAAK,gBAAgB,GAAG,SAAS,GAAG;IAElC,SAAS,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAClC,qDAAqD;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,SAAS,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvC,UAAU,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1D,SAAS,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvC,UAAU,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAC3D,CAAC;AAGF,eAAO,MAAM,iBAAiB,0BAAmC,CAAC;AAElE,eAAO,MAAM,eAAe,qDAAsD,iBAAiB,CAAC,mBAAmB,CAAC,gCA+DvH,CAAC"}
1
+ {"version":3,"file":"OverlayContext.d.ts","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/OverlayContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAiB,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAkC,MAAM,OAAO,CAAC;AAGtH,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEhF,KAAK,mBAAmB,GAAG;IACzB,KAAK,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACpC,qIAAqI;IACrI,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,kHAAkH;IAClH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,sEAAsE;AACtE,KAAK,gBAAgB,GAAG,SAAS,GAAG;IAElC,SAAS,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAClC,qDAAqD;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IAIxB,SAAS,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACnD,UAAU,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1D,SAAS,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACnD,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAWF,eAAO,MAAM,iBAAiB,0BAAmC,CAAC;AAElE,eAAO,MAAM,eAAe,0FAMzB,iBAAiB,CAAC,mBAAmB,CAAC,gCAgExC,CAAC"}
@@ -1,22 +1,46 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { FloatingPortal } from "@floating-ui/react";
3
4
  import { useStack } from "@sixthshift/design-system/hooks";
4
5
  import { createContext, useContext, useEffect, useMemo } from "react";
6
+ import { hasOpenEscapeLayer } from "../../../internal/escapeLayers.js";
7
+ import { ToastStack } from "./ToastStack.js";
8
+ import { toastStore as defaultToastStore } from "./toastStore.js";
9
+ /**
10
+ * `root` omitted when the caller gave none, rather than passed as `undefined`
11
+ * or `null`. The distinction is load-bearing: `FloatingPortal` bails out of
12
+ * creating its portal node entirely on an explicit `null` ("wait for the root
13
+ * to exist"), and only a missing `root` falls through to `document.body`.
14
+ */
15
+ const rootProp = (root) => (root === undefined ? {} : { root });
5
16
  const OverlayContext = createContext(undefined);
6
17
  export const useOverlayContext = () => useContext(OverlayContext);
7
- export const OverlayProvider = ({ modal: modalRoot, toast: toastRoot, children }) => {
8
- const resolvedModalRoot = modalRoot ?? document.body;
9
- const resolvedToastRoot = toastRoot ?? document.body;
18
+ export const OverlayProvider = ({ modal: modalRoot, toast: toastRoot, toasts: toastStore = defaultToastStore, toastClassName, children, }) => {
19
+ // The roots pass through unresolved, deliberately. `"use client"` makes this a
20
+ // Client Component, but a Client Component is still rendered once on the
21
+ // server — defaulting to `document.body` here read the DOM at render scope and
22
+ // threw "document is not defined" on the first App Router request, which
23
+ // src/testing/stories.ssr.test.tsx and src/exports.ssr.test.tsx now catch. It
24
+ // bought nothing either: `FloatingPortal` already falls back to
25
+ // `document.body` when no `root` is given, and does it in an effect, on the
26
+ // client, where a body exists. Both portals below are behind a non-empty
27
+ // stack, and both stacks start empty, so nothing portals on the server anyway.
28
+ //
29
+ // Modals are a `useStack` here; toasts are a store outside React, so that
30
+ // `toast()` works from code that is not a component.
10
31
  const modalStack = useStack([]);
11
- const toastStack = useStack([]);
12
32
  const [modals] = modalStack;
13
- const [toasts] = toastStack;
14
33
  // Global escape key handler - closes topmost modal
15
34
  useEffect(() => {
16
35
  if (modals.length === 0)
17
36
  return;
18
37
  const handleEscape = (event) => {
19
38
  if (event.key === "Escape") {
39
+ // A transient overlay open above the modal (a Select dropdown, a
40
+ // Popover, a picker calendar) consumes this Escape via its own
41
+ // dismiss handling — closing the modal too would double-fire.
42
+ if (hasOpenEscapeLayer())
43
+ return;
20
44
  const topModal = modals.at(-1);
21
45
  topModal?.onClose?.();
22
46
  }
@@ -26,11 +50,11 @@ export const OverlayProvider = ({ modal: modalRoot, toast: toastRoot, children }
26
50
  }, [modals]);
27
51
  // Memoize context value to prevent unnecessary re-renders in consumers
28
52
  const contextValue = useMemo(() => ({
29
- modalRoot: resolvedModalRoot,
53
+ modalRoot,
30
54
  modalStack,
31
- toastRoot: resolvedToastRoot,
32
- toastStack,
33
- }), [resolvedModalRoot, modalStack, resolvedToastRoot, toastStack]);
34
- return (_jsxs(OverlayContext.Provider, { value: contextValue, children: [children, modals.length > 0 && (_jsx(FloatingPortal, { root: resolvedModalRoot, children: modals.map(({ id, component: Component, data }) => (_jsx(Component, { data: data }, id))) })), toasts.length > 0 && (_jsx(FloatingPortal, { root: resolvedToastRoot, children: _jsx("div", { className: "pointer-events-none fixed bottom-6 left-1/2 z-toast flex -translate-x-1/2 flex-col-reverse items-center gap-3", children: toasts.map(({ id, component: Component, onClose, ...props }) => (_jsx("div", { className: "pointer-events-auto", children: _jsx(Component, { onClose: onClose, ...props }) }, id))) }) }))] }));
55
+ toastRoot,
56
+ toastStore,
57
+ }), [modalRoot, modalStack, toastRoot, toastStore]);
58
+ return (_jsxs(OverlayContext.Provider, { value: contextValue, children: [children, modals.length > 0 && (_jsx(FloatingPortal, { ...rootProp(modalRoot), children: modals.map(({ id, component: Component, data }) => (_jsx(Component, { data: data }, id))) })), _jsx(ToastStack, { store: toastStore, className: toastClassName, ...rootProp(toastRoot) })] }));
35
59
  };
36
60
  //# sourceMappingURL=OverlayContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayContext.js","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/OverlayContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAkB,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAkD,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAwBtH,MAAM,cAAc,GAAG,aAAa,CAAqB,SAA0C,CAAC,CAAC;AACrG,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAA0C,EAAE,EAAE;IAC1H,MAAM,iBAAiB,GAAG,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC;IACrD,MAAM,iBAAiB,GAAG,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC;IAErD,MAAM,UAAU,GAAG,QAAQ,CAAmB,EAAE,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,QAAQ,CAAmB,EAAE,CAAC,CAAC;IAElD,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;IAC5B,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;IAE5B,mDAAmD;IACnD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhC,MAAM,YAAY,GAAG,CAAC,KAAoB,EAAE,EAAE;YAC5C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACnD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,uEAAuE;IACvE,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC;QACL,SAAS,EAAE,iBAAiB;QAC5B,UAAU;QACV,SAAS,EAAE,iBAAiB;QAC5B,UAAU;KACX,CAAC,EACF,CAAC,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAC/D,CAAC;IAEF,OAAO,CACL,MAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,aACzC,QAAQ,EAGR,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,KAAC,cAAc,IAAC,IAAI,EAAE,iBAAiB,YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAClD,KAAC,SAAS,IAAU,IAAI,EAAE,IAAI,IAAd,EAAE,CAAgB,CACnC,CAAC,GACa,CAClB,EAGA,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,KAAC,cAAc,IAAC,IAAI,EAAE,iBAAiB,YACrC,cAAK,SAAS,EAAC,+GAA+G,YAC3H,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,CAC/D,cAAc,SAAS,EAAC,qBAAqB,YAC3C,KAAC,SAAS,IAAC,OAAO,EAAE,OAAO,KAAM,KAAK,GAAI,IADlC,EAAE,CAEN,CACP,CAAC,GACE,GACS,CAClB,IACuB,CAC3B,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"OverlayContext.js","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/OverlayContext.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,cAAc,EAA4B,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAkB,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAkD,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACtH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAmB,MAAM,cAAc,CAAC;AA+BhF;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,CAAC,IAA6C,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzG,MAAM,cAAc,GAAG,aAAa,CAAqB,SAA0C,CAAC,CAAC;AACrG,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC9B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,GAAG,iBAAiB,EACtC,cAAc,EACd,QAAQ,GAC+B,EAAE,EAAE;IAC3C,+EAA+E;IAC/E,yEAAyE;IACzE,+EAA+E;IAC/E,yEAAyE;IACzE,8EAA8E;IAC9E,gEAAgE;IAChE,4EAA4E;IAC5E,yEAAyE;IACzE,+EAA+E;IAC/E,EAAE;IACF,0EAA0E;IAC1E,qDAAqD;IACrD,MAAM,UAAU,GAAG,QAAQ,CAAmB,EAAE,CAAC,CAAC;IAElD,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;IAE5B,mDAAmD;IACnD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhC,MAAM,YAAY,GAAG,CAAC,KAAoB,EAAE,EAAE;YAC5C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3B,iEAAiE;gBACjE,+DAA+D;gBAC/D,8DAA8D;gBAC9D,IAAI,kBAAkB,EAAE;oBAAE,OAAO;gBACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACnD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,uEAAuE;IACvE,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC;QACL,SAAS;QACT,UAAU;QACV,SAAS;QACT,UAAU;KACX,CAAC,EACF,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAC/C,CAAC;IAEF,OAAO,CACL,MAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,aACzC,QAAQ,EAGR,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,KAAC,cAAc,OAAK,QAAQ,CAAC,SAAS,CAAC,YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAClD,KAAC,SAAS,IAAU,IAAI,EAAE,IAAI,IAAd,EAAE,CAAgB,CACnC,CAAC,GACa,CAClB,EAGD,KAAC,UAAU,IAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,KAAM,QAAQ,CAAC,SAAS,CAAC,GAAI,IAC7D,CAC3B,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type FloatingPortalProps } from "@floating-ui/react";
2
+ import { type ToastRecord, type ToastStore } from "./toastStore.js";
3
+ /** The store's stack, re-rendering the caller as it changes. Empty during server rendering. */
4
+ export declare function useToasts(store?: ToastStore): readonly ToastRecord[];
5
+ export type ToastStackProps = {
6
+ /** The stack to render. Default: the app's one, which `toast()` opens onto. */
7
+ store?: ToastStore | undefined;
8
+ /** Portal root (default: `document.body`). */
9
+ root?: FloatingPortalProps["root"] | undefined;
10
+ /** Merged over the container's classes, so an app can move the stack (above a bottom bar, to a corner). */
11
+ className?: string | undefined;
12
+ };
13
+ /** The container's own classes: bottom centre, newest at the bottom, click-through between toasts. */
14
+ export declare const TOAST_STACK_CLASS = "pointer-events-none fixed bottom-6 left-1/2 z-toast flex -translate-x-1/2 flex-col-reverse items-center gap-3";
15
+ /**
16
+ * The open toasts, portalled and positioned. `OverlayProvider` renders one;
17
+ * render it yourself only when there is no provider to host it.
18
+ */
19
+ export declare function ToastStack({ store, root, className }: ToastStackProps): import("react").JSX.Element | null;
20
+ //# sourceMappingURL=ToastStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToastStack.d.ts","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/ToastStack.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAI9E,OAAO,EAA8B,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAI7F,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,KAAK,GAAE,UAAyB,GAAG,SAAS,WAAW,EAAE,CAElF;AA4BD,MAAM,MAAM,eAAe,GAAG;IAC5B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/C,2GAA2G;IAC3G,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,kHAAkH,CAAC;AAEjJ;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,eAAe,sCAapF"}
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { FloatingPortal } from "@floating-ui/react";
4
+ import { Toast } from "@sixthshift/design-system/toast";
5
+ import { cn } from "@sixthshift/design-system/utils";
6
+ import { useCallback, useEffect, useSyncExternalStore } from "react";
7
+ import { toastStore as defaultStore } from "./toastStore.js";
8
+ const EMPTY = [];
9
+ /** The store's stack, re-rendering the caller as it changes. Empty during server rendering. */
10
+ export function useToasts(store = defaultStore) {
11
+ return useSyncExternalStore(store.subscribe, store.snapshot, () => EMPTY);
12
+ }
13
+ /**
14
+ * One toast in the stack: the dismissal timer lives here, not in the store,
15
+ * so the store stays free of the DOM. Expiry and the X button take the same
16
+ * path — `open` flips false, `Toast` plays its exit, and `onClose` drops the
17
+ * record once the animation ends.
18
+ */
19
+ function ToastItem({ record, store }) {
20
+ const { id, duration, closing } = record;
21
+ // `duration` is the stack's to act on, not the toast's to render.
22
+ const { component: Component = Toast, duration: _duration, ...props } = record.options;
23
+ useEffect(() => {
24
+ if (duration <= 0 || closing)
25
+ return;
26
+ const timer = setTimeout(() => store.close(id), duration);
27
+ return () => clearTimeout(timer);
28
+ }, [id, duration, closing, store]);
29
+ const onClose = useCallback(() => store.remove(id), [store, id]);
30
+ return (_jsx("div", { className: "pointer-events-auto", "data-toast-id": id, "data-toast-intent": props.intent ?? "neutral", children: _jsx(Component, { ...props, standalone: false, open: !closing, onClose: onClose }) }));
31
+ }
32
+ /** The container's own classes: bottom centre, newest at the bottom, click-through between toasts. */
33
+ export const TOAST_STACK_CLASS = "pointer-events-none fixed bottom-6 left-1/2 z-toast flex -translate-x-1/2 flex-col-reverse items-center gap-3";
34
+ /**
35
+ * The open toasts, portalled and positioned. `OverlayProvider` renders one;
36
+ * render it yourself only when there is no provider to host it.
37
+ */
38
+ export function ToastStack({ store = defaultStore, root, className }) {
39
+ const toasts = useToasts(store);
40
+ if (toasts.length === 0)
41
+ return null;
42
+ // `root` omitted rather than passed as `undefined`: see OverlayContext's `rootProp`.
43
+ return (_jsx(FloatingPortal, { ...(root === undefined ? {} : { root }), children: _jsx("div", { className: cn(TOAST_STACK_CLASS, className), "data-toast-stack": "", "data-count": toasts.length, children: toasts.map((record) => (_jsx(ToastItem, { record: record, store: store }, record.id))) }) }));
44
+ }
45
+ //# sourceMappingURL=ToastStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToastStack.js","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/ToastStack.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,cAAc,EAA4B,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACxD,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,UAAU,IAAI,YAAY,EAAqC,MAAM,cAAc,CAAC;AAE7F,MAAM,KAAK,GAA2B,EAAE,CAAC;AAEzC,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,QAAoB,YAAY;IACxD,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAA8C;IAC9E,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IACzC,kEAAkE;IAClE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;IAEvF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,IAAI,CAAC,IAAI,OAAO;YAAE,OAAO;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1D,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAEjE,OAAO,CACL,cAAK,SAAS,EAAC,qBAAqB,mBAAgB,EAAE,uBAAqB,KAAK,CAAC,MAAM,IAAI,SAAS,YAClG,KAAC,SAAS,OAAK,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAI,GACzE,CACP,CAAC;AACJ,CAAC;AAWD,sGAAsG;AACtG,MAAM,CAAC,MAAM,iBAAiB,GAAG,+GAA+G,CAAC;AAEjJ;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,GAAG,YAAY,EAAE,IAAI,EAAE,SAAS,EAAmB;IACnF,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,qFAAqF;IACrF,OAAO,CACL,KAAC,cAAc,OAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,YACtD,cAAK,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,sBAAmB,EAAE,gBAAa,MAAM,CAAC,MAAM,YAC5F,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACtB,KAAC,SAAS,IAAiB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,IAAvC,MAAM,CAAC,EAAE,CAAkC,CAC5D,CAAC,GACE,GACS,CAClB,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useModal.d.ts","sourceRoot":"","sources":["../../../../../src/lib/contexts/OverlayContext/hooks/useModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACtG,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAwC,MAAM,OAAO,CAAC;AAOjG,uCAAuC;AACvC,MAAM,MAAM,mBAAmB,CAAC,KAAK,GAAG,SAAS,IAAI;IACnD,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,oCAAoC;IACpC,IAAI,EAAE,KAAK,CAAC;CACb,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC;AAElD,wCAAwC;AACxC,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,UAAU,CAAC,GAAG;IAChG,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,iDAAiD;IACjD,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAC;AAMF,eAAO,MAAM,QAAQ;gBAuDhB,KAAK,yBAAyB,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,YAAW,gBAAgB,CAAC,KAAK,CAAC;;;0BA0B/E,KAAK;;;CAanC,CAAC"}
1
+ {"version":3,"file":"useModal.d.ts","sourceRoot":"","sources":["../../../../../src/lib/contexts/OverlayContext/hooks/useModal.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACtG,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAwC,MAAM,OAAO,CAAC;AAOjG,uCAAuC;AACvC,MAAM,MAAM,mBAAmB,CAAC,KAAK,GAAG,SAAS,IAAI;IACnD,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,oCAAoC;IACpC,IAAI,EAAE,KAAK,CAAC;CACb,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC;AAElD,wCAAwC;AACxC,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,UAAU,CAAC,GAAG;IAChG,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,iDAAiD;IACjD,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAC;AAMF,eAAO,MAAM,QAAQ;gBAuDhB,KAAK,yBAAyB,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,YAAW,gBAAgB,CAAC,KAAK,CAAC;;;0BA0B/E,KAAK;;;CAanC,CAAC"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx } from "react/jsx-runtime";
2
3
  import { ModalContextProvider } from "@sixthshift/design-system/modal";
3
4
  import { Suspense, useCallback, useId, useRef } from "react";
@@ -1 +1 @@
1
- {"version":3,"file":"useModal.js","sourceRoot":"","sources":["../../../../../src/lib/contexts/OverlayContext/hooks/useModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAiC,MAAM,iCAAiC,CAAC;AACtG,OAAO,EAAsC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAwBtD,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,EACJ,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,GACzB,GAAG,iBAAiB,EAAE,CAAC;IAExB,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE7B;;OAEG;IACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAoB,SAAoD,EAAE,UAAmC,EAA6B,EAAE,EAAE;QAC5I,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,EAAE,gBAAgB,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;QAElF,MAAM,UAAU,GAAY,GAAG,EAAE;YAC/B,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,EAAE,IAAI,EAAsB,EAAE,EAAE,CAAC,CACrD,KAAC,oBAAoB,IAAC,OAAO,EAAE,UAAU,YACvC,KAAC,QAAQ,IAAC,QAAQ,EAAE,gBAAgB,YAClC,KAAC,SAAS,IAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,WAAW,CAAU,KAAM,cAAc,GAAI,GAC7G,GACU,CACxB,CAAC;QAEF,QAAQ,CAAC;YACP,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE;gBACJ,EAAE;gBACF,SAAS,EAAE,YAAY;gBACvB,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,WAAW;aAClB;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,OAAc,EAAE,EAAE;YAChC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC;QAEF,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC,EACD,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CACnC,CAAC;IAEF,OAAO;QACL,SAAS;QACT,cAAc;KACf,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"useModal.js","sourceRoot":"","sources":["../../../../../src/lib/contexts/OverlayContext/hooks/useModal.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,oBAAoB,EAAiC,MAAM,iCAAiC,CAAC;AACtG,OAAO,EAAsC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAwBtD,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,EACJ,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,GACzB,GAAG,iBAAiB,EAAE,CAAC;IAExB,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE7B;;OAEG;IACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAoB,SAAoD,EAAE,UAAmC,EAA6B,EAAE,EAAE;QAC5I,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,EAAE,gBAAgB,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;QAElF,MAAM,UAAU,GAAY,GAAG,EAAE;YAC/B,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,EAAE,IAAI,EAAsB,EAAE,EAAE,CAAC,CACrD,KAAC,oBAAoB,IAAC,OAAO,EAAE,UAAU,YACvC,KAAC,QAAQ,IAAC,QAAQ,EAAE,gBAAgB,YAClC,KAAC,SAAS,IAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,WAAW,CAAU,KAAM,cAAc,GAAI,GAC7G,GACU,CACxB,CAAC;QAEF,QAAQ,CAAC;YACP,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE;gBACJ,EAAE;gBACF,SAAS,EAAE,YAAY;gBACvB,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,WAAW;aAClB;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,OAAc,EAAE,EAAE;YAChC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC;QAEF,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC,EACD,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CACnC,CAAC;IAEF,OAAO;QACL,SAAS;QACT,cAAc;KACf,CAAC;AACJ,CAAC,CAAC"}
@@ -1,12 +1,29 @@
1
- import { type ToastProps } from "@sixthshift/design-system/toast";
2
- import { type FunctionComponent } from "react";
3
- type ToastPropsWithDuration = Omit<ToastProps, "onClose"> & {
4
- /** Auto-dismiss duration in ms. Set to 0 to disable. Default: 5000 */
5
- duration?: number;
1
+ import { type ToastOptions } from "../toastStore.js";
2
+ /**
3
+ * Open toasts on the provider's stack, with the content decided at the moment
4
+ * of opening: an error's message, a count, whatever the action produced.
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * const { openToast } = useToast();
9
+ *
10
+ * async function save() {
11
+ * try {
12
+ * await api.save();
13
+ * openToast({ intent: "success", title: "Saved" });
14
+ * } catch (error) {
15
+ * openToast({ intent: "danger", title: "Could not save", children: String(error) });
16
+ * }
17
+ * }
18
+ * ```
19
+ *
20
+ * Outside any provider this opens on the app's default stack, which is also
21
+ * what the plain `toast()` export uses, so code that is not a component — a
22
+ * store, a callback from a service worker — has the same door.
23
+ */
24
+ export declare const useToast: () => {
25
+ openToast: (options: ToastOptions) => import("../index.js").ToastHandle;
26
+ closeToast: (id: string) => void;
27
+ closeAllToasts: () => void;
6
28
  };
7
- export declare const useToast: (args: ToastPropsWithDuration | FunctionComponent<ToastProps>) => {
8
- openToast: () => void;
9
- closeToast: () => void;
10
- };
11
- export {};
12
29
  //# sourceMappingURL=useToast.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useToast.d.ts","sourceRoot":"","sources":["../../../../../src/lib/contexts/OverlayContext/hooks/useToast.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,KAAK,iBAAiB,EAAyC,MAAM,OAAO,CAAC;AAWtF,KAAK,sBAAsB,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG;IAC1D,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAWF,eAAO,MAAM,QAAQ,SAAU,sBAAsB,GAAG,iBAAiB,CAAC,UAAU,CAAC;;;CAoDpF,CAAC"}
1
+ {"version":3,"file":"useToast.d.ts","sourceRoot":"","sources":["../../../../../src/lib/contexts/OverlayContext/hooks/useToast.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8B,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,QAAQ;yBAGqB,YAAY;qBAChB,MAAM;;CAI3C,CAAC"}
@@ -1,52 +1,34 @@
1
- import { Toast } from "@sixthshift/design-system/toast";
2
- import { useCallback, useEffect, useId, useRef } from "react";
1
+ "use client";
2
+ import { useCallback } from "react";
3
3
  import { useOverlayContext } from "../OverlayContext.js";
4
- // Default auto-dismiss duration in milliseconds
5
- const DEFAULT_DURATION = 5000;
6
- // Native replacements for lodash functions
7
- const isFunction = (value) => typeof value === "function";
8
- const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
9
- export const useToast = (args) => {
10
- const { toastStack: [, dispatch], } = useOverlayContext();
11
- const id = useId();
12
- const customComponent = isFunction(args) ? args : null;
13
- const props = isPlainObject(args) ? args : {};
14
- const { duration = DEFAULT_DURATION, ...toastPropsRaw } = props;
15
- const closeToast = useCallback(() => {
16
- dispatch({ type: "remove", id, transition: { duration: 300 } });
17
- }, [dispatch, id]);
18
- // `openToast` has to be both referentially stable — callers put it in effect
19
- // dependency arrays — and able to see the current props. A ref refreshed after
20
- // every render gives both.
21
- //
22
- // It previously memoised the props object against JSON.stringify(props) as a
23
- // cache key. JSON.stringify silently drops function-valued properties, so a
24
- // changed `onAction` whose serialisable fields were identical did not
25
- // invalidate the key, and `openToast` kept firing the stale closure.
26
- const latest = useRef({ customComponent, toastProps: toastPropsRaw, duration });
27
- useEffect(() => {
28
- latest.current = { customComponent, toastProps: toastPropsRaw, duration };
29
- });
30
- const openToast = useCallback(() => {
31
- const { customComponent: component, toastProps, duration: autoDismiss } = latest.current;
32
- dispatch({
33
- type: "push",
34
- item: {
35
- id,
36
- component: component ?? Toast,
37
- onClose: closeToast,
38
- standalone: false, // OverlayContext handles positioning
39
- ...toastProps,
40
- },
41
- });
42
- // Auto-dismiss if duration is set
43
- if (autoDismiss > 0) {
44
- setTimeout(closeToast, autoDismiss);
45
- }
46
- }, [dispatch, id, closeToast]);
47
- return {
48
- openToast,
49
- closeToast,
50
- };
4
+ import { toastStore as defaultStore } from "../toastStore.js";
5
+ /**
6
+ * Open toasts on the provider's stack, with the content decided at the moment
7
+ * of opening: an error's message, a count, whatever the action produced.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const { openToast } = useToast();
12
+ *
13
+ * async function save() {
14
+ * try {
15
+ * await api.save();
16
+ * openToast({ intent: "success", title: "Saved" });
17
+ * } catch (error) {
18
+ * openToast({ intent: "danger", title: "Could not save", children: String(error) });
19
+ * }
20
+ * }
21
+ * ```
22
+ *
23
+ * Outside any provider this opens on the app's default stack, which is also
24
+ * what the plain `toast()` export uses, so code that is not a component — a
25
+ * store, a callback from a service worker — has the same door.
26
+ */
27
+ export const useToast = () => {
28
+ const store = useOverlayContext()?.toastStore ?? defaultStore;
29
+ const openToast = useCallback((options) => store.open(options), [store]);
30
+ const closeToast = useCallback((id) => store.close(id), [store]);
31
+ const closeAllToasts = useCallback(() => store.clear(), [store]);
32
+ return { openToast, closeToast, closeAllToasts };
51
33
  };
52
34
  //# sourceMappingURL=useToast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useToast.js","sourceRoot":"","sources":["../../../../../src/lib/contexts/OverlayContext/hooks/useToast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAmB,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAA0B,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,gDAAgD;AAChD,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,2CAA2C;AAC3C,MAAM,UAAU,GAAG,CAAC,KAAc,EAA0C,EAAE,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC;AAE3G,MAAM,aAAa,GAAG,CAAC,KAAc,EAAmC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAgBhJ,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAA4D,EAAE,EAAE;IACvF,MAAM,EACJ,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,GACzB,GAAG,iBAAiB,EAAE,CAAC;IAExB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,EAA6B,CAAC;IAC1E,MAAM,EAAE,QAAQ,GAAG,gBAAgB,EAAE,GAAG,aAAa,EAAE,GAAG,KAAK,CAAC;IAEhE,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAEnB,6EAA6E;IAC7E,+EAA+E;IAC/E,2BAA2B;IAC3B,EAAE;IACF,6EAA6E;IAC7E,4EAA4E;IAC5E,sEAAsE;IACtE,qEAAqE;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,GAAG,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QAEzF,QAAQ,CAAC;YACP,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE;gBACJ,EAAE;gBACF,SAAS,EAAE,SAAS,IAAI,KAAK;gBAC7B,OAAO,EAAE,UAAU;gBACnB,UAAU,EAAE,KAAK,EAAE,qCAAqC;gBACxD,GAAG,UAAU;aACI;SACpB,CAAC,CAAC;QAEH,kCAAkC;QAClC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAE/B,OAAO;QACL,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"useToast.js","sourceRoot":"","sources":["../../../../../src/lib/contexts/OverlayContext/hooks/useToast.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,IAAI,YAAY,EAAqB,MAAM,eAAe,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,KAAK,GAAG,iBAAiB,EAAE,EAAE,UAAU,IAAI,YAAY,CAAC;IAE9D,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,OAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEjE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AACnD,CAAC,CAAC"}
@@ -3,4 +3,6 @@ export { Modal } from "@sixthshift/design-system/modal";
3
3
  export * from "./hooks/useModal.js";
4
4
  export * from "./hooks/useToast.js";
5
5
  export * from "./OverlayContext.js";
6
+ export { TOAST_STACK_CLASS, ToastStack, type ToastStackProps, useToasts } from "./ToastStack.js";
7
+ export * from "./toastStore.js";
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9F,cAAc,cAAc,CAAC"}
@@ -3,4 +3,6 @@ export { Modal } from "@sixthshift/design-system/modal";
3
3
  export * from "./hooks/useModal.js";
4
4
  export * from "./hooks/useToast.js";
5
5
  export * from "./OverlayContext.js";
6
+ export { TOAST_STACK_CLASS, ToastStack, useToasts } from "./ToastStack.js";
7
+ export * from "./toastStore.js";
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/index.ts"],"names":[],"mappings":"AACA,kDAAkD;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/index.ts"],"names":[],"mappings":"AACA,kDAAkD;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAwB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9F,cAAc,cAAc,CAAC"}
@@ -0,0 +1,68 @@
1
+ import type { ToastProps } from "@sixthshift/design-system/toast";
2
+ import type { FunctionComponent } from "react";
3
+ /** What a caller passes to open a toast: the `Toast`'s own props, plus how long it stays. */
4
+ export type ToastOptions = Omit<ToastProps, "onClose" | "open" | "standalone" | "root"> & {
5
+ /**
6
+ * Milliseconds until the toast dismisses itself. `0` keeps it until it is
7
+ * dismissed by hand. Default: `0` for `intent="danger"` (a failure usually
8
+ * carries a message worth reading, and often a retry), `5000` otherwise.
9
+ */
10
+ duration?: number;
11
+ /** Render this instead of `Toast`. It receives `ToastProps` and must honour `open` and `onClose` as `Toast` does. */
12
+ component?: FunctionComponent<ToastProps>;
13
+ };
14
+ /** One toast as the stack holds it. */
15
+ export type ToastRecord = {
16
+ id: string;
17
+ options: ToastOptions;
18
+ /** The resolved lifetime, in ms; `0` sticks. */
19
+ duration: number;
20
+ /** Playing its exit; removed once the animation ends. */
21
+ closing: boolean;
22
+ };
23
+ /** What `open` hands back: the toast's id, and a way to close it early. */
24
+ export type ToastHandle = {
25
+ id: string;
26
+ close: () => void;
27
+ };
28
+ /**
29
+ * The stack of open toasts, with subscribers. No DOM and no timers: the
30
+ * `ToastStack` that renders it owns dismissal timing, and `Toast` owns the
31
+ * exit animation. Plain functions, so a toast can be opened from anywhere —
32
+ * an event handler, a store, a service-worker callback — not only from a
33
+ * component.
34
+ */
35
+ export type ToastStore = {
36
+ /** Register a listener; returns the unsubscribe. */
37
+ subscribe: (listener: () => void) => () => void;
38
+ /** The current stack, oldest first. Reference-stable until it changes, as `useSyncExternalStore` needs. */
39
+ snapshot: () => readonly ToastRecord[];
40
+ /** Add a toast. Past `max`, the oldest is dropped at once. */
41
+ open: (options: ToastOptions) => ToastHandle;
42
+ /** Begin a toast's exit. It leaves the stack when `remove` is called, which `Toast` does after its animation. */
43
+ close: (id: string) => void;
44
+ /** Drop a toast at once. */
45
+ remove: (id: string) => void;
46
+ /** Begin every toast's exit. */
47
+ clear: () => void;
48
+ };
49
+ export type ToastStoreOptions = {
50
+ /** How many toasts show at once; the oldest falls off. Default: 3 — a short stack reads on a phone. */
51
+ max?: number;
52
+ /** Ids in open order. Injectable so a test can name them. */
53
+ newId?: () => string;
54
+ };
55
+ export declare const DEFAULT_TOAST_DURATION = 5000;
56
+ export declare const DEFAULT_MAX_TOASTS = 3;
57
+ /** The lifetime an intent gets when none is given: failures stay, everything else expires. */
58
+ export declare function defaultToastDuration(intent: ToastOptions["intent"]): number;
59
+ export declare function createToastStore({ max, newId }?: ToastStoreOptions): ToastStore;
60
+ /** The app's one stack: what `OverlayProvider` renders unless handed another. */
61
+ export declare const toastStore: ToastStore;
62
+ /** Open a toast on the app's stack, from anywhere. Returns its id and a way to close it early. */
63
+ export declare function toast(options: ToastOptions): ToastHandle;
64
+ /** Begin a toast's exit on the app's stack. */
65
+ export declare function closeToast(id: string): void;
66
+ /** Begin every toast's exit on the app's stack. */
67
+ export declare function closeAllToasts(): void;
68
+ //# sourceMappingURL=toastStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toastStore.d.ts","sourceRoot":"","sources":["../../../../src/lib/contexts/OverlayContext/toastStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAM/C,6FAA6F;AAC7F,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC,GAAG;IACxF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qHAAqH;IACrH,SAAS,CAAC,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;CAC3C,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,CAAC;IACtB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,oDAAoD;IACpD,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,2GAA2G;IAC3G,QAAQ,EAAE,MAAM,SAAS,WAAW,EAAE,CAAC;IACvC,8DAA8D;IAC9D,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,WAAW,CAAC;IAC7C,iHAAiH;IACjH,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,4BAA4B;IAC5B,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,gCAAgC;IAChC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uGAAuG;IACvG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB,CAAC;AAMF,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,8FAA8F;AAC9F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,MAAM,CAE3E;AAWD,wBAAgB,gBAAgB,CAAC,EAAE,GAAwB,EAAE,KAAc,EAAE,GAAE,iBAAsB,GAAG,UAAU,CAqCjH;AAED,iFAAiF;AACjF,eAAO,MAAM,UAAU,YAAqB,CAAC;AAE7C,kGAAkG;AAClG,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,WAAW,CAExD;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,mDAAmD;AACnD,wBAAgB,cAAc,IAAI,IAAI,CAErC"}