@refraction-ui/react 0.19.1 → 0.20.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 (342) hide show
  1. package/dist/chunk-533MCMSU.js +2355 -0
  2. package/dist/chunk-533MCMSU.js.map +7 -0
  3. package/dist/chunk-AMK4VCBG.js +250 -0
  4. package/dist/chunk-AMK4VCBG.js.map +7 -0
  5. package/dist/chunk-BOLFYVI6.js +90 -0
  6. package/dist/chunk-BOLFYVI6.js.map +7 -0
  7. package/dist/chunk-F7B64KT3.js +187 -0
  8. package/dist/chunk-F7B64KT3.js.map +7 -0
  9. package/dist/chunk-FD37DFCC.js +77 -0
  10. package/dist/chunk-FD37DFCC.js.map +7 -0
  11. package/dist/chunk-H54FLNAF.js +132 -0
  12. package/dist/chunk-H54FLNAF.js.map +7 -0
  13. package/dist/chunk-INP46354.js +664 -0
  14. package/dist/chunk-INP46354.js.map +7 -0
  15. package/dist/chunk-ONACRMG4.js +116 -0
  16. package/dist/chunk-ONACRMG4.js.map +7 -0
  17. package/dist/chunk-SDZ3LROZ.js +7 -0
  18. package/dist/chunk-SDZ3LROZ.js.map +7 -0
  19. package/dist/chunk-TOZBR4GL.js +154 -0
  20. package/dist/chunk-TOZBR4GL.js.map +7 -0
  21. package/dist/chunk-UNEM2TRI.js +225 -0
  22. package/dist/chunk-UNEM2TRI.js.map +7 -0
  23. package/dist/chunk-VK3EQ34F.js +92 -0
  24. package/dist/chunk-VK3EQ34F.js.map +7 -0
  25. package/dist/chunk-WK2IIUFO.js +316 -0
  26. package/dist/chunk-WK2IIUFO.js.map +7 -0
  27. package/dist/chunk-WSPJTQAV.js +59 -0
  28. package/dist/chunk-WSPJTQAV.js.map +7 -0
  29. package/dist/chunk-XWP763SH.js +3 -2
  30. package/dist/chunk-XWP763SH.js.map +7 -1
  31. package/dist/chunk-Y2FNNAIL.js +80 -0
  32. package/dist/chunk-Y2FNNAIL.js.map +1 -0
  33. package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
  34. package/dist/chunk-ZF3OHCGV.js.map +7 -0
  35. package/dist/form.cjs +5 -11
  36. package/dist/form.cjs.map +1 -1
  37. package/dist/form.js +6 -12
  38. package/dist/form.js.map +1 -1
  39. package/dist/index.cjs +2879 -33936
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +126 -28780
  44. package/dist/internal/react-app-shell/index.d.cts +2 -22
  45. package/dist/internal/react-app-shell/index.d.ts +2 -22
  46. package/dist/internal/react-badge/index.d.cts +5 -0
  47. package/dist/internal/react-badge/index.d.ts +5 -0
  48. package/dist/internal/react-callout/index.d.cts +4 -0
  49. package/dist/internal/react-callout/index.d.ts +4 -0
  50. package/dist/internal/react-card/index.d.cts +8 -1
  51. package/dist/internal/react-card/index.d.ts +8 -1
  52. package/dist/internal/react-collapsible/index.d.cts +0 -3
  53. package/dist/internal/react-collapsible/index.d.ts +0 -3
  54. package/dist/internal/react-combobox/index.d.cts +0 -3
  55. package/dist/internal/react-combobox/index.d.ts +0 -3
  56. package/dist/internal/react-command/index.d.cts +0 -3
  57. package/dist/internal/react-command/index.d.ts +0 -3
  58. package/dist/internal/react-data-table/index.d.cts +0 -3
  59. package/dist/internal/react-data-table/index.d.ts +0 -3
  60. package/dist/internal/react-dialog/index.d.cts +0 -3
  61. package/dist/internal/react-dialog/index.d.ts +0 -3
  62. package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
  63. package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
  64. package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
  65. package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
  66. package/dist/internal/react-form/index.d.cts +2 -21
  67. package/dist/internal/react-form/index.d.ts +2 -21
  68. package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
  69. package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
  70. package/dist/internal/react-link-card/index.d.cts +8 -2
  71. package/dist/internal/react-link-card/index.d.ts +8 -2
  72. package/dist/internal/react-popover/index.d.cts +0 -3
  73. package/dist/internal/react-popover/index.d.ts +0 -3
  74. package/dist/internal/react-sheet/index.d.cts +0 -3
  75. package/dist/internal/react-sheet/index.d.ts +0 -3
  76. package/dist/internal/react-slot/index.d.cts +23 -0
  77. package/dist/internal/react-slot/index.d.ts +23 -0
  78. package/dist/internal/react-toast/index.d.cts +0 -3
  79. package/dist/internal/react-toast/index.d.ts +0 -3
  80. package/dist/internal/react-tooltip/index.d.cts +0 -3
  81. package/dist/internal/react-tooltip/index.d.ts +0 -3
  82. package/dist/react-accordion.js +125 -0
  83. package/dist/react-accordion.js.map +7 -0
  84. package/dist/react-ai.js +257 -0
  85. package/dist/react-ai.js.map +7 -0
  86. package/dist/react-analytics.js +1698 -0
  87. package/dist/react-analytics.js.map +7 -0
  88. package/dist/react-animated-text.js +164 -0
  89. package/dist/react-animated-text.js.map +7 -0
  90. package/dist/react-app-shell.js +631 -0
  91. package/dist/react-app-shell.js.map +7 -0
  92. package/dist/react-audience-feature-card.js +53 -0
  93. package/dist/react-audience-feature-card.js.map +7 -0
  94. package/dist/react-audio-room.js +166 -0
  95. package/dist/react-audio-room.js.map +7 -0
  96. package/dist/react-auth.js +211 -0
  97. package/dist/react-auth.js.map +7 -0
  98. package/dist/react-avatar-group.js +154 -0
  99. package/dist/react-avatar-group.js.map +7 -0
  100. package/dist/react-avatar.js +168 -0
  101. package/dist/react-avatar.js.map +7 -0
  102. package/dist/react-badge.js +86 -0
  103. package/dist/react-badge.js.map +7 -0
  104. package/dist/react-bottom-nav.js +67 -0
  105. package/dist/react-bottom-nav.js.map +7 -0
  106. package/dist/react-brand-network-cell.js +92 -0
  107. package/dist/react-brand-network-cell.js.map +7 -0
  108. package/dist/react-breadcrumbs.js +104 -0
  109. package/dist/react-breadcrumbs.js.map +7 -0
  110. package/dist/react-browser-chrome-mock.js +89 -0
  111. package/dist/react-browser-chrome-mock.js.map +7 -0
  112. package/dist/react-button.js +13 -0
  113. package/dist/react-button.js.map +7 -0
  114. package/dist/react-calendar.js +301 -0
  115. package/dist/react-calendar.js.map +7 -0
  116. package/dist/react-call-controls.js +113 -0
  117. package/dist/react-call-controls.js.map +7 -0
  118. package/dist/react-callout.js +152 -0
  119. package/dist/react-callout.js.map +7 -0
  120. package/dist/react-card-grid.js +34 -0
  121. package/dist/react-card-grid.js.map +7 -0
  122. package/dist/react-card.js +200 -0
  123. package/dist/react-card.js.map +7 -0
  124. package/dist/react-carousel.js +132 -0
  125. package/dist/react-carousel.js.map +7 -0
  126. package/dist/react-charts.js +509 -0
  127. package/dist/react-charts.js.map +7 -0
  128. package/dist/react-checkbox.js +156 -0
  129. package/dist/react-checkbox.js.map +7 -0
  130. package/dist/react-checklist.js +168 -0
  131. package/dist/react-checklist.js.map +7 -0
  132. package/dist/react-code-block.js +78 -0
  133. package/dist/react-code-block.js.map +7 -0
  134. package/dist/react-code-editor.js +184 -0
  135. package/dist/react-code-editor.js.map +7 -0
  136. package/dist/react-collapsible.js +192 -0
  137. package/dist/react-collapsible.js.map +7 -0
  138. package/dist/react-combobox.js +609 -0
  139. package/dist/react-combobox.js.map +7 -0
  140. package/dist/react-command-input.js +202 -0
  141. package/dist/react-command-input.js.map +7 -0
  142. package/dist/react-command.js +364 -0
  143. package/dist/react-command.js.map +7 -0
  144. package/dist/react-composer.js +2036 -0
  145. package/dist/react-composer.js.map +7 -0
  146. package/dist/react-content-protection.js +133 -0
  147. package/dist/react-content-protection.js.map +7 -0
  148. package/dist/react-conversation.js +1226 -0
  149. package/dist/react-conversation.js.map +7 -0
  150. package/dist/react-cookie-consent.js +291 -0
  151. package/dist/react-cookie-consent.js.map +7 -0
  152. package/dist/react-data-table.js +310 -0
  153. package/dist/react-data-table.js.map +7 -0
  154. package/dist/react-date-picker.js +95 -0
  155. package/dist/react-date-picker.js.map +7 -0
  156. package/dist/react-device-frame.js +137 -0
  157. package/dist/react-device-frame.js.map +7 -0
  158. package/dist/react-dialog.js +218 -0
  159. package/dist/react-dialog.js.map +7 -0
  160. package/dist/react-diff-viewer.js +460 -0
  161. package/dist/react-diff-viewer.js.map +7 -0
  162. package/dist/react-dropdown-menu.js +292 -0
  163. package/dist/react-dropdown-menu.js.map +7 -0
  164. package/dist/react-editor-status-bar.js +148 -0
  165. package/dist/react-editor-status-bar.js.map +7 -0
  166. package/dist/react-editor-tabs.js +159 -0
  167. package/dist/react-editor-tabs.js.map +7 -0
  168. package/dist/react-emoji-picker.js +238 -0
  169. package/dist/react-emoji-picker.js.map +7 -0
  170. package/dist/react-empty-state.js +90 -0
  171. package/dist/react-empty-state.js.map +7 -0
  172. package/dist/react-feedback-dialog.js +275 -0
  173. package/dist/react-feedback-dialog.js.map +7 -0
  174. package/dist/react-file-tree.js +376 -0
  175. package/dist/react-file-tree.js.map +7 -0
  176. package/dist/react-file-upload.js +360 -0
  177. package/dist/react-file-upload.js.map +7 -0
  178. package/dist/react-floating-reactions.js +124 -0
  179. package/dist/react-floating-reactions.js.map +7 -0
  180. package/dist/react-flow-editor.js +198 -0
  181. package/dist/react-flow-editor.js.map +7 -0
  182. package/dist/react-footer.js +67 -0
  183. package/dist/react-footer.js.map +7 -0
  184. package/dist/react-graph-view.js +197 -0
  185. package/dist/react-graph-view.js.map +7 -0
  186. package/dist/react-icon-system.js +9 -0
  187. package/dist/react-icon-system.js.map +7 -0
  188. package/dist/react-infinite-canvas.js +8 -0
  189. package/dist/react-infinite-canvas.js.map +7 -0
  190. package/dist/react-inline-editor.js +216 -0
  191. package/dist/react-inline-editor.js.map +7 -0
  192. package/dist/react-input-group.js +150 -0
  193. package/dist/react-input-group.js.map +7 -0
  194. package/dist/react-input.js +10 -0
  195. package/dist/react-input.js.map +7 -0
  196. package/dist/react-install-prompt.js +132 -0
  197. package/dist/react-install-prompt.js.map +7 -0
  198. package/dist/react-kanban-board.js +198 -0
  199. package/dist/react-kanban-board.js.map +7 -0
  200. package/dist/react-keyboard-shortcut.js +36 -0
  201. package/dist/react-keyboard-shortcut.js.map +7 -0
  202. package/dist/react-language-selector.js +311 -0
  203. package/dist/react-language-selector.js.map +7 -0
  204. package/dist/react-link-card.js +48 -0
  205. package/dist/react-link-card.js.map +7 -0
  206. package/dist/react-live-captions.js +92 -0
  207. package/dist/react-live-captions.js.map +7 -0
  208. package/dist/react-live-cursors.js +145 -0
  209. package/dist/react-live-cursors.js.map +7 -0
  210. package/dist/react-live-transcript.js +117 -0
  211. package/dist/react-live-transcript.js.map +7 -0
  212. package/dist/react-location-selector.js +252 -0
  213. package/dist/react-location-selector.js.map +7 -0
  214. package/dist/react-logger.js +415 -0
  215. package/dist/react-logger.js.map +7 -0
  216. package/dist/react-markdown-renderer.js +12 -0
  217. package/dist/react-markdown-renderer.js.map +7 -0
  218. package/dist/react-marquee-strip.js +62 -0
  219. package/dist/react-marquee-strip.js.map +7 -0
  220. package/dist/react-mascot.js +367 -0
  221. package/dist/react-mascot.js.map +7 -0
  222. package/dist/react-mastery-bar.js +97 -0
  223. package/dist/react-mastery-bar.js.map +7 -0
  224. package/dist/react-mini-map.js +207 -0
  225. package/dist/react-mini-map.js.map +7 -0
  226. package/dist/react-mobile-nav.js +216 -0
  227. package/dist/react-mobile-nav.js.map +7 -0
  228. package/dist/react-navbar.js +96 -0
  229. package/dist/react-navbar.js.map +7 -0
  230. package/dist/react-numbered-steps.js +67 -0
  231. package/dist/react-numbered-steps.js.map +7 -0
  232. package/dist/react-otp-input.js +318 -0
  233. package/dist/react-otp-input.js.map +7 -0
  234. package/dist/react-pagination.js +199 -0
  235. package/dist/react-pagination.js.map +7 -0
  236. package/dist/react-password-input.js +104 -0
  237. package/dist/react-password-input.js.map +7 -0
  238. package/dist/react-payment.js +81 -0
  239. package/dist/react-payment.js.map +7 -0
  240. package/dist/react-popover.js +176 -0
  241. package/dist/react-popover.js.map +7 -0
  242. package/dist/react-pre-call-lobby.js +309 -0
  243. package/dist/react-pre-call-lobby.js.map +7 -0
  244. package/dist/react-presence-indicator.js +86 -0
  245. package/dist/react-presence-indicator.js.map +7 -0
  246. package/dist/react-pricing-card.js +142 -0
  247. package/dist/react-pricing-card.js.map +7 -0
  248. package/dist/react-progress-display.js +188 -0
  249. package/dist/react-progress-display.js.map +7 -0
  250. package/dist/react-radial-gauge.js +193 -0
  251. package/dist/react-radial-gauge.js.map +7 -0
  252. package/dist/react-radio.js +169 -0
  253. package/dist/react-radio.js.map +7 -0
  254. package/dist/react-rating-scale.js +171 -0
  255. package/dist/react-rating-scale.js.map +7 -0
  256. package/dist/react-reaction-bar.js +111 -0
  257. package/dist/react-reaction-bar.js.map +7 -0
  258. package/dist/react-resizable-layout.js +298 -0
  259. package/dist/react-resizable-layout.js.map +7 -0
  260. package/dist/react-rich-editor.js +1 -0
  261. package/dist/react-rich-editor.js.map +7 -0
  262. package/dist/react-search-bar.js +285 -0
  263. package/dist/react-search-bar.js.map +7 -0
  264. package/dist/react-section-head.js +65 -0
  265. package/dist/react-section-head.js.map +7 -0
  266. package/dist/react-segmented-control.js +215 -0
  267. package/dist/react-segmented-control.js.map +7 -0
  268. package/dist/react-select.js +389 -0
  269. package/dist/react-select.js.map +7 -0
  270. package/dist/react-separator.js +86 -0
  271. package/dist/react-separator.js.map +7 -0
  272. package/dist/react-sheet.js +310 -0
  273. package/dist/react-sheet.js.map +7 -0
  274. package/dist/react-sidebar.js +100 -0
  275. package/dist/react-sidebar.js.map +7 -0
  276. package/dist/react-skeleton.js +91 -0
  277. package/dist/react-skeleton.js.map +7 -0
  278. package/dist/react-skip-to-content.js +38 -0
  279. package/dist/react-skip-to-content.js.map +7 -0
  280. package/dist/react-slide-viewer.js +264 -0
  281. package/dist/react-slide-viewer.js.map +7 -0
  282. package/dist/react-slider.js +105 -0
  283. package/dist/react-slider.js.map +7 -0
  284. package/dist/react-slot-picker.js +184 -0
  285. package/dist/react-slot-picker.js.map +7 -0
  286. package/dist/react-slot.js +7 -0
  287. package/dist/react-slot.js.map +7 -0
  288. package/dist/react-social-auth-button.js +169 -0
  289. package/dist/react-social-auth-button.js.map +7 -0
  290. package/dist/react-sortable-list.js +204 -0
  291. package/dist/react-sortable-list.js.map +7 -0
  292. package/dist/react-stat-grid.js +69 -0
  293. package/dist/react-stat-grid.js.map +7 -0
  294. package/dist/react-status-indicator.js +117 -0
  295. package/dist/react-status-indicator.js.map +7 -0
  296. package/dist/react-steps.js +167 -0
  297. package/dist/react-steps.js.map +7 -0
  298. package/dist/react-sticky-note.js +131 -0
  299. package/dist/react-sticky-note.js.map +7 -0
  300. package/dist/react-switch.js +139 -0
  301. package/dist/react-switch.js.map +7 -0
  302. package/dist/react-table-of-contents.js +80 -0
  303. package/dist/react-table-of-contents.js.map +7 -0
  304. package/dist/react-tabs.js +230 -0
  305. package/dist/react-tabs.js.map +7 -0
  306. package/dist/react-terminal.js +101 -0
  307. package/dist/react-terminal.js.map +7 -0
  308. package/dist/react-test-results.js +158 -0
  309. package/dist/react-test-results.js.map +7 -0
  310. package/dist/react-textarea.js +89 -0
  311. package/dist/react-textarea.js.map +7 -0
  312. package/dist/react-thread-view.js +139 -0
  313. package/dist/react-thread-view.js.map +7 -0
  314. package/dist/react-timeline.js +153 -0
  315. package/dist/react-timeline.js.map +7 -0
  316. package/dist/react-toast.js +253 -0
  317. package/dist/react-toast.js.map +7 -0
  318. package/dist/react-tooltip.js +221 -0
  319. package/dist/react-tooltip.js.map +7 -0
  320. package/dist/react-version-selector.js +270 -0
  321. package/dist/react-version-selector.js.map +7 -0
  322. package/dist/react-video-grid.js +129 -0
  323. package/dist/react-video-grid.js.map +7 -0
  324. package/dist/react-video-player.js +206 -0
  325. package/dist/react-video-player.js.map +7 -0
  326. package/dist/react-video-tile.js +8 -0
  327. package/dist/react-video-tile.js.map +7 -0
  328. package/dist/react-voice-pill.js +314 -0
  329. package/dist/react-voice-pill.js.map +7 -0
  330. package/dist/react-waveform.js +558 -0
  331. package/dist/react-waveform.js.map +7 -0
  332. package/dist/react-wizard.js +337 -0
  333. package/dist/react-wizard.js.map +7 -0
  334. package/dist/styles.css +7 -0
  335. package/dist/theme.js +1 -1
  336. package/package.json +3 -2
  337. package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
  338. package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
  339. package/dist/chunk-4A4BW3GR.js.map +0 -1
  340. package/dist/index.js.map +0 -1
  341. package/dist/module-X3HTTRQK.js +0 -6438
  342. package/dist/module-X3HTTRQK.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../textarea/src/textarea.ts", "../../textarea/src/textarea.styles.ts", "../../react-textarea/src/textarea.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\nexport interface TextareaProps {\n disabled?: boolean\n readOnly?: boolean\n required?: boolean\n 'aria-invalid'?: boolean\n rows?: number\n maxRows?: number\n}\n\nexport interface TextareaAPI {\n /** ARIA attributes to spread on the element */\n ariaProps: Partial<AccessibilityProps> & { 'aria-invalid'?: boolean; 'aria-required'?: boolean }\n /** Data attributes for CSS styling hooks */\n dataAttributes: Record<string, string>\n}\n\nexport function createTextarea(props: TextareaProps = {}): TextareaAPI {\n const {\n disabled = false,\n readOnly = false,\n required = false,\n 'aria-invalid': ariaInvalid,\n } = props\n\n const ariaProps: TextareaAPI['ariaProps'] = {}\n\n if (disabled) {\n ariaProps['aria-disabled'] = true\n }\n\n if (ariaInvalid) {\n ariaProps['aria-invalid'] = true\n }\n\n if (required) {\n ariaProps['aria-required'] = true\n }\n\n const dataAttributes: Record<string, string> = {}\n\n if (disabled) {\n dataAttributes['data-disabled'] = ''\n }\n\n if (readOnly) {\n dataAttributes['data-readonly'] = ''\n }\n\n if (ariaInvalid) {\n dataAttributes['data-invalid'] = ''\n }\n\n return {\n ariaProps,\n dataAttributes,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const textareaVariants = cva({\n base: 'flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n variants: {\n size: {\n sm: 'min-h-[40px] text-xs',\n default: 'min-h-[60px]',\n lg: 'min-h-[80px] text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n})\n", "import * as React from 'react'\nimport {\n createTextarea,\n textareaVariants,\n} from '@refraction-ui/textarea'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n size?: 'sm' | 'default' | 'lg'\n maxRows?: number\n}\n\n/**\n * Textarea component — renders a styled textarea with size support.\n *\n * Uses the headless @refraction-ui/textarea core for state, ARIA, and data attributes.\n * Styling via Tailwind utility classes (no external CSS-in-JS).\n */\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n function Textarea({ size, className, disabled, readOnly, required, rows, maxRows, 'aria-invalid': ariaInvalid, ...props }, ref) {\n const api = createTextarea({\n disabled,\n readOnly,\n required,\n rows,\n maxRows,\n 'aria-invalid': ariaInvalid === true ? true : undefined,\n })\n\n const classes = cn(textareaVariants({ size }), className)\n\n return (\n <textarea\n ref={ref}\n className={classes}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n rows={rows}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n />\n )\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;AAkBO,SAAS,eAAe,QAAuB,CAAA,GAAiB;AACrE,QAAM;IACJ,WAAW;IACX,WAAW;IACX,WAAW;IACX,gBAAgB;EAAA,IACd;AAEJ,QAAM,YAAsC,CAAA;AAE5C,MAAI,UAAU;AACZ,cAAU,eAAe,IAAI;EAC/B;AAEA,MAAI,aAAa;AACf,cAAU,cAAc,IAAI;EAC9B;AAEA,MAAI,UAAU;AACZ,cAAU,eAAe,IAAI;EAC/B;AAEA,QAAM,iBAAyC,CAAA;AAE/C,MAAI,UAAU;AACZ,mBAAe,eAAe,IAAI;EACpC;AAEA,MAAI,UAAU;AACZ,mBAAe,eAAe,IAAI;EACpC;AAEA,MAAI,aAAa;AACf,mBAAe,cAAc,IAAI;EACnC;AAEA,SAAO;IACL;IACA;EAAA;AAEJ;ACxDO,IAAM,mBAAmB,IAAI;EAClC,MAAM;EACN,UAAU;IACR,MAAM;MACJ,IAAI;MACJ,SAAS;MACT,IAAI;IAAA;EACN;EAEF,iBAAiB;IACf,MAAM;EAAA;AAEV,CAAC;;;;ACIM,IAAM,WAAiB;EAC5B,SAASA,UAAS,EAAE,MAAM,WAAW,UAAU,UAAU,UAAU,MAAM,SAAS,gBAAgB,aAAa,GAAG,MAAA,GAAS,KAAK;AAC9H,UAAM,MAAM,eAAe;MACzB;MACA;MACA;MACA;MACA;MACA,gBAAgB,gBAAgB,OAAO,OAAO;IAAA,CAC/C;AAED,UAAM,UAAU,GAAG,iBAAiB,EAAE,KAAA,CAAM,GAAG,SAAS;AAExD,WACE;MAAC;MAAA;QACC;QACA,WAAW;QACX;QACA;QACA;QACA;QACC,GAAG,IAAI;QACP,GAAG,IAAI;QACP,GAAG;MAAA;IAAA;EAGV;AACF;",
6
+ "names": ["Textarea"]
7
+ }
@@ -0,0 +1,139 @@
1
+ import {
2
+ createThreadView,
3
+ formatRelativeTime,
4
+ formatTimestamp,
5
+ threadActionsStyles,
6
+ threadAttachmentStyles,
7
+ threadAuthorStyles,
8
+ threadAvatarStyles,
9
+ threadBodyStyles,
10
+ threadContainerStyles,
11
+ threadContentStyles,
12
+ threadEditedStyles,
13
+ threadMessageStyles,
14
+ threadReactionsStyles,
15
+ threadReplyIndicatorStyles,
16
+ threadTimestampStyles
17
+ } from "./chunk-ONACRMG4.js";
18
+ import {
19
+ cn
20
+ } from "./chunk-ZF3OHCGV.js";
21
+
22
+ // ../react-thread-view/dist/index.js
23
+ import * as React from "react";
24
+ function MessageComponent({
25
+ message,
26
+ api
27
+ }) {
28
+ return React.createElement(
29
+ "div",
30
+ { className: threadMessageStyles, ...api.getMessageAriaProps(message) },
31
+ // Avatar
32
+ React.createElement(
33
+ "div",
34
+ { className: threadAvatarStyles },
35
+ message.author.avatarUrl ? React.createElement("img", {
36
+ src: message.author.avatarUrl,
37
+ alt: message.author.name,
38
+ className: "h-full w-full object-cover"
39
+ }) : message.author.name.charAt(0).toUpperCase()
40
+ ),
41
+ // Content
42
+ React.createElement(
43
+ "div",
44
+ { className: threadContentStyles },
45
+ React.createElement(
46
+ "div",
47
+ { className: "flex items-baseline" },
48
+ React.createElement("span", { className: threadAuthorStyles }, message.author.name),
49
+ React.createElement(
50
+ "span",
51
+ { className: threadTimestampStyles },
52
+ api.formatTimestamp(message.timestamp)
53
+ ),
54
+ message.edited && React.createElement("span", { className: threadEditedStyles }, "(edited)")
55
+ ),
56
+ React.createElement("div", { className: threadBodyStyles }, message.content),
57
+ // Reactions
58
+ message.reactions && message.reactions.length > 0 && React.createElement(
59
+ "div",
60
+ { className: threadReactionsStyles },
61
+ message.reactions.map(
62
+ (reaction, i) => React.createElement(
63
+ "button",
64
+ {
65
+ key: `${reaction.emoji}-${i}`,
66
+ type: "button",
67
+ className: cn(
68
+ "inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-xs cursor-pointer",
69
+ reaction.userReacted ? "border-primary bg-primary/10" : "border-border"
70
+ ),
71
+ onClick: () => api.react(message.id, reaction.emoji)
72
+ },
73
+ `${reaction.emoji} ${reaction.count}`
74
+ )
75
+ )
76
+ ),
77
+ // Reply indicator
78
+ message.replies && message.replies.length > 0 && React.createElement(
79
+ "div",
80
+ { className: threadReplyIndicatorStyles },
81
+ `${message.replies.length} ${message.replies.length === 1 ? "reply" : "replies"}`
82
+ ),
83
+ // Attachments
84
+ message.attachments && message.attachments.map(
85
+ (attachment) => React.createElement(
86
+ "div",
87
+ { key: attachment.id, className: threadAttachmentStyles },
88
+ React.createElement("span", null, "\u{1F4CE}"),
89
+ React.createElement("span", { className: "truncate" }, attachment.name)
90
+ )
91
+ ),
92
+ // Actions (reply button)
93
+ React.createElement(
94
+ "div",
95
+ { className: threadActionsStyles },
96
+ React.createElement(
97
+ "button",
98
+ {
99
+ type: "button",
100
+ className: "text-xs text-muted-foreground hover:text-foreground cursor-pointer",
101
+ onClick: () => api.startReply(message.id),
102
+ ...api.getReplyButtonAriaProps(message.id)
103
+ },
104
+ "Reply"
105
+ )
106
+ )
107
+ )
108
+ );
109
+ }
110
+ var ThreadView = React.forwardRef(
111
+ function ThreadView2({ messages, onReply, onReact, currentUserId, className }, ref) {
112
+ const api = createThreadView({ messages, onReply, onReact, currentUserId });
113
+ return React.createElement(
114
+ "div",
115
+ { ref, ...api.ariaProps, className: cn(threadContainerStyles, className) },
116
+ messages.map(
117
+ (message) => React.createElement(MessageComponent, {
118
+ key: message.id,
119
+ message,
120
+ api
121
+ })
122
+ )
123
+ );
124
+ }
125
+ );
126
+ export {
127
+ ThreadView,
128
+ formatRelativeTime,
129
+ formatTimestamp,
130
+ threadAuthorStyles,
131
+ threadAvatarStyles,
132
+ threadBodyStyles,
133
+ threadContainerStyles,
134
+ threadContentStyles,
135
+ threadMessageStyles,
136
+ threadReactionsStyles,
137
+ threadTimestampStyles
138
+ };
139
+ //# sourceMappingURL=react-thread-view.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../react-thread-view/src/thread-view.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport {\n createThreadView,\n threadContainerStyles,\n threadMessageStyles,\n threadAvatarStyles,\n threadContentStyles,\n threadAuthorStyles,\n threadTimestampStyles,\n threadBodyStyles,\n threadReactionsStyles,\n threadReplyIndicatorStyles,\n threadActionsStyles,\n threadAttachmentStyles,\n threadEditedStyles,\n type MessageData,\n type MessageReaction,\n} from '@refraction-ui/thread-view'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface ThreadViewProps {\n messages: MessageData[]\n onReply?: (messageId: string, content: string) => void\n onReact?: (messageId: string, emoji: string) => void\n currentUserId?: string\n className?: string\n}\n\nfunction MessageComponent({\n message,\n api,\n}: {\n message: MessageData\n api: ReturnType<typeof createThreadView>\n}) {\n return React.createElement(\n 'div',\n { className: threadMessageStyles, ...api.getMessageAriaProps(message) },\n // Avatar\n React.createElement(\n 'div',\n { className: threadAvatarStyles },\n message.author.avatarUrl\n ? React.createElement('img', {\n src: message.author.avatarUrl,\n alt: message.author.name,\n className: 'h-full w-full object-cover',\n })\n : message.author.name.charAt(0).toUpperCase(),\n ),\n // Content\n React.createElement(\n 'div',\n { className: threadContentStyles },\n React.createElement(\n 'div',\n { className: 'flex items-baseline' },\n React.createElement('span', { className: threadAuthorStyles }, message.author.name),\n React.createElement(\n 'span',\n { className: threadTimestampStyles },\n api.formatTimestamp(message.timestamp),\n ),\n message.edited &&\n React.createElement('span', { className: threadEditedStyles }, '(edited)'),\n ),\n React.createElement('div', { className: threadBodyStyles }, message.content),\n // Reactions\n message.reactions &&\n message.reactions.length > 0 &&\n React.createElement(\n 'div',\n { className: threadReactionsStyles },\n message.reactions.map((reaction, i) =>\n React.createElement(\n 'button',\n {\n key: `${reaction.emoji}-${i}`,\n type: 'button',\n className: cn(\n 'inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-xs cursor-pointer',\n reaction.userReacted ? 'border-primary bg-primary/10' : 'border-border',\n ),\n onClick: () => api.react(message.id, reaction.emoji),\n },\n `${reaction.emoji} ${reaction.count}`,\n ),\n ),\n ),\n // Reply indicator\n message.replies &&\n message.replies.length > 0 &&\n React.createElement(\n 'div',\n { className: threadReplyIndicatorStyles },\n `${message.replies.length} ${message.replies.length === 1 ? 'reply' : 'replies'}`,\n ),\n // Attachments\n message.attachments &&\n message.attachments.map((attachment) =>\n React.createElement(\n 'div',\n { key: attachment.id, className: threadAttachmentStyles },\n React.createElement('span', null, '\\u{1F4CE}'),\n React.createElement('span', { className: 'truncate' }, attachment.name),\n ),\n ),\n // Actions (reply button)\n React.createElement(\n 'div',\n { className: threadActionsStyles },\n React.createElement(\n 'button',\n {\n type: 'button',\n className: 'text-xs text-muted-foreground hover:text-foreground cursor-pointer',\n onClick: () => api.startReply(message.id),\n ...api.getReplyButtonAriaProps(message.id),\n },\n 'Reply',\n ),\n ),\n ),\n )\n}\n\nexport const ThreadView = React.forwardRef<HTMLDivElement, ThreadViewProps>(\n function ThreadView({ messages, onReply, onReact, currentUserId, className }, ref) {\n const api = createThreadView({ messages, onReply, onReact, currentUserId })\n\n return React.createElement(\n 'div',\n { ref, ...api.ariaProps, className: cn(threadContainerStyles, className) },\n messages.map((message) =>\n React.createElement(MessageComponent, {\n key: message.id,\n message,\n api,\n }),\n ),\n )\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAS,iBAAiB;EACxB;EACA;AACF,GAGG;AACD,SAAa;IACX;IACA,EAAE,WAAW,qBAAqB,GAAG,IAAI,oBAAoB,OAAO,EAAA;;IAE9D;MACJ;MACA,EAAE,WAAW,mBAAA;MACb,QAAQ,OAAO,YACL,oBAAc,OAAO;QACzB,KAAK,QAAQ,OAAO;QACpB,KAAK,QAAQ,OAAO;QACpB,WAAW;MAAA,CACZ,IACD,QAAQ,OAAO,KAAK,OAAO,CAAC,EAAE,YAAA;IAAY;;IAG1C;MACJ;MACA,EAAE,WAAW,oBAAA;MACP;QACJ;QACA,EAAE,WAAW,sBAAA;QACP,oBAAc,QAAQ,EAAE,WAAW,mBAAA,GAAsB,QAAQ,OAAO,IAAI;QAC5E;UACJ;UACA,EAAE,WAAW,sBAAA;UACb,IAAI,gBAAgB,QAAQ,SAAS;QAAA;QAEvC,QAAQ,UACA,oBAAc,QAAQ,EAAE,WAAW,mBAAA,GAAsB,UAAU;MAAA;MAEvE,oBAAc,OAAO,EAAE,WAAW,iBAAA,GAAoB,QAAQ,OAAO;;MAE3E,QAAQ,aACN,QAAQ,UAAU,SAAS,KACrB;QACJ;QACA,EAAE,WAAW,sBAAA;QACb,QAAQ,UAAU;UAAI,CAAC,UAAU,MACzB;YACJ;YACA;cACE,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC;cAC3B,MAAM;cACN,WAAW;gBACT;gBACA,SAAS,cAAc,iCAAiC;cAAA;cAE1D,SAAS,MAAM,IAAI,MAAM,QAAQ,IAAI,SAAS,KAAK;YAAA;YAErD,GAAG,SAAS,KAAK,IAAI,SAAS,KAAK;UAAA;QACrC;MACF;;MAGJ,QAAQ,WACN,QAAQ,QAAQ,SAAS,KACnB;QACJ;QACA,EAAE,WAAW,2BAAA;QACb,GAAG,QAAQ,QAAQ,MAAM,IAAI,QAAQ,QAAQ,WAAW,IAAI,UAAU,SAAS;MAAA;;MAGnF,QAAQ,eACN,QAAQ,YAAY;QAAI,CAAC,eACjB;UACJ;UACA,EAAE,KAAK,WAAW,IAAI,WAAW,uBAAA;UAC3B,oBAAc,QAAQ,MAAM,WAAW;UACvC,oBAAc,QAAQ,EAAE,WAAW,WAAA,GAAc,WAAW,IAAI;QAAA;MACxE;;MAGE;QACJ;QACA,EAAE,WAAW,oBAAA;QACP;UACJ;UACA;YACE,MAAM;YACN,WAAW;YACX,SAAS,MAAM,IAAI,WAAW,QAAQ,EAAE;YACxC,GAAG,IAAI,wBAAwB,QAAQ,EAAE;UAAA;UAE3C;QAAA;MACF;IACF;EACF;AAEJ;AAEO,IAAM,aAAmB;EAC9B,SAASA,YAAW,EAAE,UAAU,SAAS,SAAS,eAAe,UAAA,GAAa,KAAK;AACnF,UAAM,MAAM,iBAAiB,EAAE,UAAU,SAAS,SAAS,cAAA,CAAe;AAE1E,WAAa;MACX;MACA,EAAE,KAAK,GAAG,IAAI,WAAW,WAAW,GAAG,uBAAuB,SAAS,EAAA;MACvE,SAAS;QAAI,CAAC,YACN,oBAAc,kBAAkB;UACpC,KAAK,QAAQ;UACb;UACA;QAAA,CACD;MAAA;IACH;EAEF;AACF;",
6
+ "names": ["ThreadView"]
7
+ }
@@ -0,0 +1,153 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-timeline/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../timeline/dist/index.js
10
+ function createTimeline(props = {}) {
11
+ const { orientation = "vertical" } = props;
12
+ const ariaProps = {
13
+ role: "list"
14
+ };
15
+ const dataAttributes = {
16
+ "data-orientation": orientation
17
+ };
18
+ return { ariaProps, dataAttributes };
19
+ }
20
+ function getTimelineItemAria() {
21
+ return { role: "listitem" };
22
+ }
23
+ function resolveTimelineItems(items) {
24
+ return items.map((item) => ({
25
+ ...item,
26
+ status: item.status ?? "default",
27
+ time: item.time ?? "",
28
+ description: item.description ?? ""
29
+ }));
30
+ }
31
+ var timelineVariants = cva({
32
+ base: "relative",
33
+ variants: {
34
+ orientation: {
35
+ vertical: "flex flex-col",
36
+ horizontal: "flex flex-row items-start overflow-x-auto"
37
+ }
38
+ },
39
+ defaultVariants: {
40
+ orientation: "vertical"
41
+ }
42
+ });
43
+ var timelineItemVariants = cva({
44
+ base: "relative flex gap-4",
45
+ variants: {
46
+ orientation: {
47
+ vertical: "flex-row pb-8 last:pb-0",
48
+ horizontal: "flex-col items-center flex-1 px-2"
49
+ }
50
+ },
51
+ defaultVariants: {
52
+ orientation: "vertical"
53
+ }
54
+ });
55
+ var timelineMarkerVariants = cva({
56
+ base: [
57
+ "relative z-10 flex shrink-0 items-center justify-center",
58
+ "size-3 rounded-full border-2",
59
+ "transition-colors"
60
+ ].join(" "),
61
+ variants: {
62
+ status: {
63
+ done: "bg-primary border-primary",
64
+ current: "bg-background border-primary ring-2 ring-primary ring-offset-2 ring-offset-background",
65
+ upcoming: "bg-muted border-muted-foreground/30",
66
+ default: "bg-background border-border"
67
+ }
68
+ },
69
+ defaultVariants: {
70
+ status: "default"
71
+ }
72
+ });
73
+ var timelineConnectorVariants = cva({
74
+ base: "absolute bg-border",
75
+ variants: {
76
+ orientation: {
77
+ vertical: "left-[5px] top-3 w-0.5 h-full",
78
+ horizontal: "top-[5px] left-1/2 w-full h-0.5"
79
+ }
80
+ },
81
+ defaultVariants: {
82
+ orientation: "vertical"
83
+ }
84
+ });
85
+ var timelineGutterClass = "relative flex flex-col items-center";
86
+ var timelineTimeClass = "text-xs text-muted-foreground tabular-nums";
87
+ var timelineTitleClass = "text-sm font-medium text-foreground leading-snug";
88
+ var timelineDescriptionClass = "mt-0.5 text-xs text-muted-foreground leading-relaxed";
89
+ var timelineContentClass = "flex flex-col min-w-0";
90
+
91
+ // ../react-timeline/dist/index.js
92
+ import { jsxs, jsx } from "react/jsx-runtime";
93
+ var TimelineItem = React.forwardRef(
94
+ function TimelineItem2({ item, orientation, isLast }, ref) {
95
+ const itemAria = getTimelineItemAria();
96
+ return /* @__PURE__ */ jsxs(
97
+ "li",
98
+ {
99
+ ref,
100
+ ...itemAria,
101
+ className: timelineItemVariants({ orientation }),
102
+ "data-status": item.status,
103
+ children: [
104
+ /* @__PURE__ */ jsxs("div", { className: timelineGutterClass, children: [
105
+ /* @__PURE__ */ jsx("div", { className: timelineMarkerVariants({ status: item.status }) }),
106
+ !isLast && /* @__PURE__ */ jsx("div", { className: timelineConnectorVariants({ orientation }) })
107
+ ] }),
108
+ /* @__PURE__ */ jsxs("div", { className: timelineContentClass, children: [
109
+ item.time && /* @__PURE__ */ jsx("span", { className: timelineTimeClass, children: item.time }),
110
+ /* @__PURE__ */ jsx("span", { className: timelineTitleClass, children: item.title }),
111
+ item.description && /* @__PURE__ */ jsx("p", { className: timelineDescriptionClass, children: item.description })
112
+ ] })
113
+ ]
114
+ }
115
+ );
116
+ }
117
+ );
118
+ var Timeline = React.forwardRef(
119
+ function Timeline2({ items, orientation = "vertical", renderItem, className, ...props }, ref) {
120
+ const resolved = React.useMemo(() => resolveTimelineItems(items), [items]);
121
+ const api = createTimeline({ orientation });
122
+ return /* @__PURE__ */ jsx(
123
+ "ul",
124
+ {
125
+ ref,
126
+ className: cn(timelineVariants({ orientation }), className),
127
+ ...api.ariaProps,
128
+ ...api.dataAttributes,
129
+ ...props,
130
+ children: resolved.map((item, index) => {
131
+ const isLast = index === resolved.length - 1;
132
+ if (renderItem) {
133
+ return /* @__PURE__ */ jsx(React.Fragment, { children: renderItem(item, index, isLast) }, item.id);
134
+ }
135
+ return /* @__PURE__ */ jsx(
136
+ TimelineItem,
137
+ {
138
+ item,
139
+ orientation,
140
+ isLast
141
+ },
142
+ item.id
143
+ );
144
+ })
145
+ }
146
+ );
147
+ }
148
+ );
149
+ export {
150
+ Timeline,
151
+ TimelineItem
152
+ };
153
+ //# sourceMappingURL=react-timeline.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../timeline/src/timeline.ts", "../../timeline/src/timeline.styles.ts", "../../react-timeline/src/timeline.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\n/** Layout orientation of the timeline. */\nexport type TimelineOrientation = 'vertical' | 'horizontal'\n\n/** Visual status of a single timeline item. */\nexport type TimelineItemStatus = 'done' | 'current' | 'upcoming' | 'default'\n\n/** Data describing a single event in the timeline. */\nexport interface TimelineItemData {\n /** Unique identifier for the item. */\n id: string\n /** Primary label shown beside the marker. */\n title: string\n /** Optional timestamp / date string shown near the marker. */\n time?: string\n /** Additional detail text rendered below the title. */\n description?: string\n /** Visual status of this item. Defaults to `'default'` when omitted. */\n status?: TimelineItemStatus\n}\n\nexport interface TimelineProps {\n /** Ordered list of events to display. */\n items: TimelineItemData[]\n /** Layout direction. */\n orientation?: TimelineOrientation\n}\n\nexport interface TimelineAPI {\n /** ARIA attributes to spread on the list container (`role=\"list\"`). */\n ariaProps: Partial<AccessibilityProps>\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Build the framework-agnostic container props for a timeline.\n *\n * Returns `role=\"list\"` (the items carry `role=\"listitem\"`) plus a\n * `data-orientation` attribute. The function is JSX-free so it can run in\n * any environment including server-side Node and Astro SSR.\n */\nexport function createTimeline(\n props: Pick<TimelineProps, 'orientation'> = {},\n): TimelineAPI {\n const { orientation = 'vertical' } = props\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'list',\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-orientation': orientation,\n }\n\n return { ariaProps, dataAttributes }\n}\n\n/**\n * Accessibility props for a single timeline item.\n *\n * Every item gets `role=\"listitem\"` regardless of status so screen readers\n * announce the full list correctly.\n */\nexport function getTimelineItemAria(): Partial<AccessibilityProps> {\n return { role: 'listitem' }\n}\n\n/**\n * Normalise a raw list of timeline items so every entry has an explicit\n * `status`. Items without a status receive `'default'`.\n *\n * This is the single source of truth shared by every adapter — call it once\n * at render time and iterate over the result.\n */\nexport function resolveTimelineItems(\n items: TimelineItemData[],\n): Required<TimelineItemData>[] {\n return items.map((item) => ({\n ...item,\n status: item.status ?? 'default',\n time: item.time ?? '',\n description: item.description ?? '',\n }))\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * Outer rail / list container.\n *\n * Vertical: a single column; horizontal: a row so items sit side-by-side.\n */\nexport const timelineVariants = cva({\n base: 'relative',\n variants: {\n orientation: {\n vertical: 'flex flex-col',\n horizontal: 'flex flex-row items-start overflow-x-auto',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\n/**\n * A single event row / column.\n *\n * In vertical mode items stack with a left gutter for the marker + connector.\n * In horizontal mode each item takes equal width and the connector runs above.\n */\nexport const timelineItemVariants = cva({\n base: 'relative flex gap-4',\n variants: {\n orientation: {\n vertical: 'flex-row pb-8 last:pb-0',\n horizontal: 'flex-col items-center flex-1 px-2',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\n/**\n * The marker / dot that represents the event on the rail.\n *\n * Status variants map directly to semantic token colours so theming is\n * handled at the design-token level, not inline.\n */\nexport const timelineMarkerVariants = cva({\n base: [\n 'relative z-10 flex shrink-0 items-center justify-center',\n 'size-3 rounded-full border-2',\n 'transition-colors',\n ].join(' '),\n variants: {\n status: {\n done: 'bg-primary border-primary',\n current: 'bg-background border-primary ring-2 ring-primary ring-offset-2 ring-offset-background',\n upcoming: 'bg-muted border-muted-foreground/30',\n default: 'bg-background border-border',\n },\n },\n defaultVariants: {\n status: 'default',\n },\n})\n\n/**\n * The connector line drawn between adjacent markers.\n *\n * Vertical: a thin vertical stripe anchored to the left gutter.\n * Horizontal: a thin horizontal stripe anchored above the content row.\n * The last item hides its connector so the rail terminates cleanly.\n */\nexport const timelineConnectorVariants = cva({\n base: 'absolute bg-border',\n variants: {\n orientation: {\n vertical: 'left-[5px] top-3 w-0.5 h-full',\n horizontal: 'top-[5px] left-1/2 w-full h-0.5',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\n/** Wrapper that holds the marker + connector in the gutter column/row. */\nexport const timelineGutterClass = 'relative flex flex-col items-center'\n\n/** Time / date label rendered near the marker. */\nexport const timelineTimeClass = 'text-xs text-muted-foreground tabular-nums'\n\n/** Primary event title. */\nexport const timelineTitleClass = 'text-sm font-medium text-foreground leading-snug'\n\n/** Secondary description text. */\nexport const timelineDescriptionClass = 'mt-0.5 text-xs text-muted-foreground leading-relaxed'\n\n/** Content block (title + description) next to or below the marker. */\nexport const timelineContentClass = 'flex flex-col min-w-0'\n", "import * as React from 'react'\nimport {\n createTimeline,\n getTimelineItemAria,\n resolveTimelineItems,\n timelineVariants,\n timelineItemVariants,\n timelineMarkerVariants,\n timelineConnectorVariants,\n timelineGutterClass,\n timelineTimeClass,\n timelineTitleClass,\n timelineDescriptionClass,\n timelineContentClass,\n type TimelineOrientation,\n type TimelineItemData,\n type TimelineItemStatus,\n} from '@refraction-ui/timeline'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { TimelineOrientation, TimelineItemData, TimelineItemStatus }\n\nexport interface TimelineItemProps {\n /** The normalised item data. */\n item: Required<TimelineItemData>\n /** Orientation inherited from the parent Timeline. */\n orientation: TimelineOrientation\n /** True when this is the last item (hides the trailing connector). */\n isLast: boolean\n}\n\n/** A single event entry inside a Timeline. */\nexport const TimelineItem = React.forwardRef<HTMLLIElement, TimelineItemProps>(\n function TimelineItem({ item, orientation, isLast }, ref) {\n const itemAria = getTimelineItemAria()\n return (\n <li\n ref={ref}\n {...itemAria}\n className={timelineItemVariants({ orientation })}\n data-status={item.status}\n >\n {/* Gutter: marker dot + connector line */}\n <div className={timelineGutterClass}>\n <div className={timelineMarkerVariants({ status: item.status })} />\n {!isLast && (\n <div className={timelineConnectorVariants({ orientation })} />\n )}\n </div>\n\n {/* Content */}\n <div className={timelineContentClass}>\n {item.time && (\n <span className={timelineTimeClass}>{item.time}</span>\n )}\n <span className={timelineTitleClass}>{item.title}</span>\n {item.description && (\n <p className={timelineDescriptionClass}>{item.description}</p>\n )}\n </div>\n </li>\n )\n },\n)\n\nexport interface TimelineProps\n extends Omit<React.HTMLAttributes<HTMLUListElement>, 'children'> {\n /** Ordered list of events to render. */\n items: TimelineItemData[]\n /** Layout direction. Defaults to `'vertical'`. */\n orientation?: TimelineOrientation\n /**\n * Optional render-prop override for a single item.\n * Receives the normalised item and its index; return a React node.\n */\n renderItem?: (\n item: Required<TimelineItemData>,\n index: number,\n isLast: boolean,\n ) => React.ReactNode\n}\n\n/**\n * Timeline — a time-ordered list of events with a marker rail.\n *\n * Renders `role=\"list\"`; each item carries `role=\"listitem\"`.\n * Supports vertical (default) and horizontal orientations.\n * Pass `renderItem` to take full control of individual entries.\n */\nexport const Timeline = React.forwardRef<HTMLUListElement, TimelineProps>(\n function Timeline({ items, orientation = 'vertical', renderItem, className, ...props }, ref) {\n const resolved = React.useMemo(() => resolveTimelineItems(items), [items])\n const api = createTimeline({ orientation })\n\n return (\n <ul\n ref={ref}\n className={cn(timelineVariants({ orientation }), className)}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n {resolved.map((item, index) => {\n const isLast = index === resolved.length - 1\n if (renderItem) {\n return (\n <React.Fragment key={item.id}>\n {renderItem(item, index, isLast)}\n </React.Fragment>\n )\n }\n return (\n <TimelineItem\n key={item.id}\n item={item}\n orientation={orientation}\n isLast={isLast}\n />\n )\n })}\n </ul>\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["TimelineItem", "Timeline"]
7
+ }
@@ -0,0 +1,253 @@
1
+ import {
2
+ cn,
3
+ cva,
4
+ devWarn,
5
+ generateId
6
+ } from "./chunk-ZF3OHCGV.js";
7
+
8
+ // ../react-toast/dist/index.js
9
+ import * as React from "react";
10
+
11
+ // ../toast/dist/index.js
12
+ function createToast(props = {}) {
13
+ const {
14
+ variant = "default",
15
+ duration = 3e3,
16
+ open: controlledOpen,
17
+ onOpenChange
18
+ } = props;
19
+ const now = props.now ?? (() => Date.now());
20
+ let isOpen = controlledOpen ?? true;
21
+ let timerId = null;
22
+ let remaining = duration;
23
+ let startedAt = 0;
24
+ function dismiss() {
25
+ clearTimer();
26
+ isOpen = false;
27
+ onOpenChange?.(false);
28
+ }
29
+ function clearTimer() {
30
+ if (timerId !== null) {
31
+ clearTimeout(timerId);
32
+ timerId = null;
33
+ }
34
+ }
35
+ function startTimer() {
36
+ if (duration <= 0) return;
37
+ clearTimer();
38
+ remaining = duration;
39
+ startedAt = now();
40
+ timerId = setTimeout(dismiss, remaining);
41
+ }
42
+ function pauseTimer() {
43
+ if (timerId === null) return;
44
+ clearTimer();
45
+ remaining = remaining - (now() - startedAt);
46
+ if (remaining < 0) remaining = 0;
47
+ }
48
+ function resumeTimer() {
49
+ if (duration <= 0 || remaining <= 0) return;
50
+ clearTimer();
51
+ startedAt = now();
52
+ timerId = setTimeout(dismiss, remaining);
53
+ }
54
+ const ariaProps = {
55
+ role: "alert",
56
+ "aria-live": "assertive",
57
+ "aria-atomic": true
58
+ };
59
+ return {
60
+ state: {
61
+ get open() {
62
+ return controlledOpen !== void 0 ? controlledOpen : isOpen;
63
+ },
64
+ variant
65
+ },
66
+ ariaProps,
67
+ dismiss,
68
+ startTimer,
69
+ pauseTimer,
70
+ resumeTimer
71
+ };
72
+ }
73
+ function createToastManager(config = {}) {
74
+ const now = config.now ?? (() => Date.now());
75
+ let toasts = [];
76
+ const listeners = /* @__PURE__ */ new Set();
77
+ const timers = /* @__PURE__ */ new Map();
78
+ function notify() {
79
+ const snapshot = [...toasts];
80
+ for (const fn of listeners) {
81
+ fn(snapshot);
82
+ }
83
+ }
84
+ function dismiss(id) {
85
+ const timer = timers.get(id);
86
+ if (timer) {
87
+ clearTimeout(timer);
88
+ timers.delete(id);
89
+ }
90
+ toasts = toasts.filter((t) => t.id !== id);
91
+ notify();
92
+ }
93
+ function toast(message, opts) {
94
+ const id = generateId("rfr-toast");
95
+ const variant = opts?.variant ?? "default";
96
+ const duration = opts?.duration ?? 3e3;
97
+ const entry = {
98
+ id,
99
+ message,
100
+ variant,
101
+ duration,
102
+ createdAt: now()
103
+ };
104
+ toasts = [...toasts, entry];
105
+ notify();
106
+ if (duration > 0) {
107
+ const timer = setTimeout(() => dismiss(id), duration);
108
+ timers.set(id, timer);
109
+ }
110
+ return id;
111
+ }
112
+ function subscribe(fn) {
113
+ listeners.add(fn);
114
+ return () => {
115
+ listeners.delete(fn);
116
+ };
117
+ }
118
+ return {
119
+ toast,
120
+ dismiss,
121
+ get toasts() {
122
+ return toasts;
123
+ },
124
+ subscribe
125
+ };
126
+ }
127
+ var toastVariants = cva({
128
+ base: "pointer-events-auto relative flex w-full items-center justify-between gap-2 overflow-hidden rounded-lg border p-4 shadow-lg transition-all",
129
+ variants: {
130
+ variant: {
131
+ default: "border bg-background text-foreground",
132
+ success: "border-l-4 border-success/50 bg-success/10 text-success",
133
+ error: "border-l-4 border-destructive/50 bg-destructive/10 text-destructive",
134
+ warning: "border-l-4 border-warning/50 bg-warning/10 text-warning"
135
+ }
136
+ },
137
+ defaultVariants: {
138
+ variant: "default"
139
+ }
140
+ });
141
+
142
+ // ../react-toast/dist/index.js
143
+ var ToastContext = React.createContext(null);
144
+ function useToastContext() {
145
+ const ctx = React.useContext(ToastContext);
146
+ if (!ctx) {
147
+ devWarn(
148
+ "react-toast/use-toast-outside-provider",
149
+ "useToast() was called outside a <ToastProvider>. Wrap your app (or the consuming subtree) in <ToastProvider> so the toast context is available."
150
+ );
151
+ throw new Error("useToast must be used within a <ToastProvider>");
152
+ }
153
+ return ctx;
154
+ }
155
+ function ToastProvider({ children }) {
156
+ const managerRef = React.useRef(null);
157
+ if (managerRef.current === null) {
158
+ managerRef.current = createToastManager();
159
+ }
160
+ const ctx = React.useMemo(
161
+ () => ({ manager: managerRef.current }),
162
+ []
163
+ );
164
+ return React.createElement(ToastContext.Provider, { value: ctx }, children);
165
+ }
166
+ function useToast() {
167
+ const { manager } = useToastContext();
168
+ const [toasts, setToasts] = React.useState(manager.toasts);
169
+ React.useEffect(() => {
170
+ setToasts(manager.toasts);
171
+ const unsub = manager.subscribe(setToasts);
172
+ return unsub;
173
+ }, [manager]);
174
+ return {
175
+ toast: manager.toast,
176
+ dismiss: manager.dismiss,
177
+ toasts
178
+ };
179
+ }
180
+ var Toast = React.forwardRef(
181
+ function Toast2({ entry, onDismiss, className, children, onMouseEnter, onMouseLeave, ...props }, ref) {
182
+ const api = React.useMemo(
183
+ () => createToast({ variant: entry.variant, duration: entry.duration }),
184
+ [entry.variant, entry.duration]
185
+ );
186
+ React.useEffect(() => {
187
+ api.startTimer();
188
+ return () => api.pauseTimer();
189
+ }, [api]);
190
+ const handleMouseEnter = (e) => {
191
+ api.pauseTimer();
192
+ onMouseEnter?.(e);
193
+ };
194
+ const handleMouseLeave = (e) => {
195
+ api.resumeTimer();
196
+ onMouseLeave?.(e);
197
+ };
198
+ return React.createElement(
199
+ "div",
200
+ {
201
+ ref,
202
+ className: cn(toastVariants({ variant: entry.variant }), className),
203
+ ...api.ariaProps,
204
+ onMouseEnter: handleMouseEnter,
205
+ onMouseLeave: handleMouseLeave,
206
+ ...props
207
+ },
208
+ React.createElement("div", { className: "flex-1" }, entry.message),
209
+ children,
210
+ onDismiss && React.createElement(
211
+ "button",
212
+ {
213
+ type: "button",
214
+ className: "shrink-0",
215
+ onClick: () => onDismiss(entry.id),
216
+ "aria-label": "Dismiss"
217
+ },
218
+ "\xD7"
219
+ )
220
+ );
221
+ }
222
+ );
223
+ var Toaster = React.forwardRef(
224
+ function Toaster2({ className, ...props }, ref) {
225
+ const { toasts, dismiss } = useToast();
226
+ return React.createElement(
227
+ "div",
228
+ {
229
+ ref,
230
+ className: cn(
231
+ "fixed bottom-4 right-4 z-50 flex flex-col gap-2 w-full max-w-sm pointer-events-none",
232
+ className
233
+ ),
234
+ ...props
235
+ },
236
+ toasts.map(
237
+ (entry) => React.createElement(Toast, {
238
+ key: entry.id,
239
+ entry,
240
+ onDismiss: dismiss
241
+ })
242
+ )
243
+ );
244
+ }
245
+ );
246
+ export {
247
+ Toast,
248
+ ToastProvider,
249
+ Toaster,
250
+ toastVariants,
251
+ useToast
252
+ };
253
+ //# sourceMappingURL=react-toast.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../toast/src/toast.ts", "../../toast/src/toast.styles.ts", "../../react-toast/src/toast.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\nimport { generateId } from '@refraction-ui/shared'\n\nexport type ToastVariant = 'default' | 'success' | 'error' | 'warning'\n\n/** Icon name for each toast variant — non-color indicator for colorblind safety */\nconst TOAST_ICONS: Record<ToastVariant, string> = {\n default: 'info-circle',\n success: 'check-circle',\n error: 'x-circle',\n warning: 'alert-triangle',\n}\n\n/** Get the icon name for a toast variant (colorblind-safe: meaning not conveyed by color alone) */\nexport function getToastIcon(variant: ToastVariant): string {\n return TOAST_ICONS[variant]\n}\n\nexport interface ToastProps {\n /** Visual variant */\n variant?: ToastVariant\n /** Auto-dismiss duration in ms (default: 3000). Set to 0 to disable. */\n duration?: number\n /** Whether the toast is open (controlled) */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Elapsed-time clock for timer pause/resume math (ms). Default: ambient `Date.now()` — inject for deterministic tests. */\n now?: () => number\n}\n\nexport interface ToastState {\n open: boolean\n variant: ToastVariant\n}\n\nexport interface ToastAPI {\n /** Current toast state */\n state: ToastState\n /** ARIA attributes for the toast element */\n ariaProps: Partial<AccessibilityProps>\n /** Dismiss the toast */\n dismiss(): void\n /** Start the auto-dismiss timer */\n startTimer(): void\n /** Pause the auto-dismiss timer (e.g. on hover) */\n pauseTimer(): void\n /** Resume the auto-dismiss timer */\n resumeTimer(): void\n}\n\nexport function createToast(props: ToastProps = {}): ToastAPI {\n const {\n variant = 'default',\n duration = 3000,\n open: controlledOpen,\n onOpenChange,\n } = props\n\n // Injection boundary: ambient time is the default; inject `now` for deterministic timer math.\n const now = props.now ?? (() => Date.now())\n let isOpen = controlledOpen ?? true\n let timerId: ReturnType<typeof setTimeout> | null = null\n let remaining = duration\n let startedAt = 0\n\n function dismiss(): void {\n clearTimer()\n isOpen = false\n onOpenChange?.(false)\n }\n\n function clearTimer(): void {\n if (timerId !== null) {\n clearTimeout(timerId)\n timerId = null\n }\n }\n\n function startTimer(): void {\n if (duration <= 0) return\n clearTimer()\n remaining = duration\n startedAt = now()\n timerId = setTimeout(dismiss, remaining)\n }\n\n function pauseTimer(): void {\n if (timerId === null) return\n clearTimer()\n remaining = remaining - (now() - startedAt)\n if (remaining < 0) remaining = 0\n }\n\n function resumeTimer(): void {\n if (duration <= 0 || remaining <= 0) return\n clearTimer()\n startedAt = now()\n timerId = setTimeout(dismiss, remaining)\n }\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'alert',\n 'aria-live': 'assertive',\n 'aria-atomic': true,\n }\n\n return {\n state: {\n get open() {\n return controlledOpen !== undefined ? controlledOpen : isOpen\n },\n variant,\n },\n ariaProps,\n dismiss,\n startTimer,\n pauseTimer,\n resumeTimer,\n }\n}\n\n/** Entry in the toast manager */\nexport interface ToastEntry {\n id: string\n message: string\n variant: ToastVariant\n duration: number\n createdAt: number\n}\n\nexport interface ToastManagerAPI {\n /** Add a new toast. Returns the toast id. */\n toast(message: string, opts?: { variant?: ToastVariant; duration?: number }): string\n /** Dismiss a toast by id */\n dismiss(id: string): void\n /** Current toast list (read-only) */\n readonly toasts: ReadonlyArray<ToastEntry>\n /** Subscribe to toast list changes. Returns unsubscribe function. */\n subscribe(fn: (toasts: ReadonlyArray<ToastEntry>) => void): () => void\n}\n\nexport interface ToastManagerConfig {\n /** Clock for entry `createdAt` stamps (ms). Default: ambient `Date.now()` — inject for deterministic tests. */\n now?: () => number\n}\n\nexport function createToastManager(config: ToastManagerConfig = {}): ToastManagerAPI {\n // Injection boundary: ambient time is the default; inject `now` for deterministic createdAt.\n const now = config.now ?? (() => Date.now())\n let toasts: ToastEntry[] = []\n const listeners = new Set<(toasts: ReadonlyArray<ToastEntry>) => void>()\n const timers = new Map<string, ReturnType<typeof setTimeout>>()\n\n function notify(): void {\n const snapshot = [...toasts]\n for (const fn of listeners) {\n fn(snapshot)\n }\n }\n\n function dismiss(id: string): void {\n const timer = timers.get(id)\n if (timer) {\n clearTimeout(timer)\n timers.delete(id)\n }\n toasts = toasts.filter((t) => t.id !== id)\n notify()\n }\n\n function toast(\n message: string,\n opts?: { variant?: ToastVariant; duration?: number },\n ): string {\n const id = generateId('rfr-toast')\n const variant = opts?.variant ?? 'default'\n const duration = opts?.duration ?? 3000\n\n const entry: ToastEntry = {\n id,\n message,\n variant,\n duration,\n createdAt: now(),\n }\n\n toasts = [...toasts, entry]\n notify()\n\n if (duration > 0) {\n const timer = setTimeout(() => dismiss(id), duration)\n timers.set(id, timer)\n }\n\n return id\n }\n\n function subscribe(fn: (toasts: ReadonlyArray<ToastEntry>) => void): () => void {\n listeners.add(fn)\n return () => {\n listeners.delete(fn)\n }\n }\n\n return {\n toast,\n dismiss,\n get toasts() {\n return toasts\n },\n subscribe,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const toastVariants = cva({\n base: 'pointer-events-auto relative flex w-full items-center justify-between gap-2 overflow-hidden rounded-lg border p-4 shadow-lg transition-all',\n variants: {\n variant: {\n default: 'border bg-background text-foreground',\n success: 'border-l-4 border-success/50 bg-success/10 text-success',\n error: 'border-l-4 border-destructive/50 bg-destructive/10 text-destructive',\n warning: 'border-l-4 border-warning/50 bg-warning/10 text-warning',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n", "import * as React from 'react'\nimport {\n createToast,\n createToastManager,\n toastVariants,\n type ToastVariant,\n type ToastEntry,\n type ToastManagerAPI,\n} from '@refraction-ui/toast'\nimport { cn, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface ToastContextValue {\n manager: ToastManagerAPI\n}\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null)\n\nfunction useToastContext(): ToastContextValue {\n const ctx = React.useContext(ToastContext)\n if (!ctx) {\n devWarn(\n 'react-toast/use-toast-outside-provider',\n 'useToast() was called outside a <ToastProvider>. Wrap your app (or the consuming subtree) in <ToastProvider> so the toast context is available.',\n )\n throw new Error('useToast must be used within a <ToastProvider>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// ToastProvider\n// ---------------------------------------------------------------------------\n\nexport interface ToastProviderProps {\n children?: React.ReactNode\n}\n\nexport function ToastProvider({ children }: ToastProviderProps) {\n const managerRef = React.useRef<ToastManagerAPI | null>(null)\n if (managerRef.current === null) {\n managerRef.current = createToastManager()\n }\n\n const ctx = React.useMemo<ToastContextValue>(\n () => ({ manager: managerRef.current! }),\n [],\n )\n\n return React.createElement(ToastContext.Provider, { value: ctx }, children)\n}\n\n// ---------------------------------------------------------------------------\n// useToast hook\n// ---------------------------------------------------------------------------\n\nexport interface UseToastReturn {\n /** Show a new toast */\n toast: (message: string, opts?: { variant?: ToastVariant; duration?: number }) => string\n /** Dismiss a toast by id */\n dismiss: (id: string) => void\n /** Current toast entries */\n toasts: ReadonlyArray<ToastEntry>\n}\n\nexport function useToast(): UseToastReturn {\n const { manager } = useToastContext()\n const [toasts, setToasts] = React.useState<ReadonlyArray<ToastEntry>>(manager.toasts)\n\n React.useEffect(() => {\n // Sync initial state\n setToasts(manager.toasts)\n const unsub = manager.subscribe(setToasts)\n return unsub\n }, [manager])\n\n return {\n toast: manager.toast,\n dismiss: manager.dismiss,\n toasts,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Toast (individual toast component)\n// ---------------------------------------------------------------------------\n\nexport interface ToastProps extends React.HTMLAttributes<HTMLDivElement> {\n entry: ToastEntry\n onDismiss?: (id: string) => void\n}\n\nexport const Toast = React.forwardRef<HTMLDivElement, ToastProps>(\n function Toast({ entry, onDismiss, className, children, onMouseEnter, onMouseLeave, ...props }, ref) {\n const api = React.useMemo(\n () => createToast({ variant: entry.variant, duration: entry.duration }),\n [entry.variant, entry.duration],\n )\n\n // Start auto-dismiss timer on mount\n React.useEffect(() => {\n api.startTimer()\n return () => api.pauseTimer()\n }, [api])\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLDivElement>) => {\n api.pauseTimer()\n onMouseEnter?.(e)\n }\n\n const handleMouseLeave = (e: React.MouseEvent<HTMLDivElement>) => {\n api.resumeTimer()\n onMouseLeave?.(e)\n }\n\n return React.createElement(\n 'div',\n {\n ref,\n className: cn(toastVariants({ variant: entry.variant }), className),\n ...api.ariaProps,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n ...props,\n },\n React.createElement('div', { className: 'flex-1' }, entry.message),\n children,\n onDismiss &&\n React.createElement(\n 'button',\n {\n type: 'button',\n className: 'shrink-0',\n onClick: () => onDismiss(entry.id),\n 'aria-label': 'Dismiss',\n },\n '\\u00d7',\n ),\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// Toaster (container that renders all active toasts)\n// ---------------------------------------------------------------------------\n\nexport interface ToasterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const Toaster = React.forwardRef<HTMLDivElement, ToasterProps>(\n function Toaster({ className, ...props }, ref) {\n const { toasts, dismiss } = useToast()\n\n return React.createElement(\n 'div',\n {\n ref,\n className: cn(\n 'fixed bottom-4 right-4 z-50 flex flex-col gap-2 w-full max-w-sm pointer-events-none',\n className,\n ),\n ...props,\n },\n toasts.map((entry) =>\n React.createElement(Toast, {\n key: entry.id,\n entry,\n onDismiss: dismiss,\n }),\n ),\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["Toast", "Toaster"]
7
+ }