@justanarthur/modo-ui 0.6.0-canary.9 → 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 (490) hide show
  1. package/README.md +66 -164
  2. package/dist/base.css +4 -141
  3. package/dist/blocks/sidebar-app/index.js +26 -40
  4. package/dist/components/AI/input-message/index.js +16 -23
  5. package/dist/components/AI/thinking-indicator/index.js +6 -9
  6. package/dist/components/accordion/index.d.ts +11 -39
  7. package/dist/components/accordion/index.js +13 -18
  8. package/dist/components/badge/index.d.ts +11 -18
  9. package/dist/components/badge/index.js +7 -12
  10. package/dist/components/button/index.d.ts +17 -53
  11. package/dist/components/button/index.js +6 -11
  12. package/dist/components/card/index.d.ts +9 -32
  13. package/dist/components/card/index.js +11 -17
  14. package/dist/components/copy/index.d.ts +8 -41
  15. package/dist/components/copy/index.js +9 -15
  16. package/dist/components/inputs/checkbox/index.d.ts +9 -28
  17. package/dist/components/inputs/checkbox/index.js +13 -18
  18. package/dist/components/inputs/color-picker/index.d.ts +14 -22
  19. package/dist/components/inputs/color-picker/index.js +18 -26
  20. package/dist/components/inputs/combobox/index.d.ts +20 -85
  21. package/dist/components/inputs/combobox/index.js +18 -27
  22. package/dist/components/inputs/date-time/calendar/index.d.ts +18 -24
  23. package/dist/components/inputs/date-time/calendar/index.js +11 -15
  24. package/dist/components/inputs/date-time/date-picker/index.d.ts +16 -105
  25. package/dist/components/inputs/date-time/date-picker/index.js +25 -35
  26. package/dist/components/inputs/date-time/date-range-picker/index.d.ts +12 -106
  27. package/dist/components/inputs/date-time/date-range-picker/index.js +24 -35
  28. package/dist/components/inputs/date-time/duration-picker/index.d.ts +13 -66
  29. package/dist/components/inputs/date-time/duration-picker/index.js +24 -33
  30. package/dist/components/inputs/date-time/month-picker/index.d.ts +10 -60
  31. package/dist/components/inputs/date-time/month-picker/index.js +23 -32
  32. package/dist/components/inputs/date-time/time-picker/index.d.ts +10 -58
  33. package/dist/components/inputs/date-time/time-picker/index.js +24 -33
  34. package/dist/components/inputs/input/index.d.ts +13 -95
  35. package/dist/components/inputs/input/index.js +9 -18
  36. package/dist/components/inputs/radio/index.d.ts +5 -20
  37. package/dist/components/inputs/radio/index.js +12 -16
  38. package/dist/components/inputs/search/index.d.ts +3 -3
  39. package/dist/components/inputs/search/index.js +18 -26
  40. package/dist/components/inputs/select/index.d.ts +23 -99
  41. package/dist/components/inputs/select/index.js +14 -29
  42. package/dist/components/inputs/slider/index.d.ts +0 -9
  43. package/dist/components/inputs/slider/index.js +5 -8
  44. package/dist/components/inputs/switch/index.d.ts +2 -8
  45. package/dist/components/inputs/switch/index.js +12 -15
  46. package/dist/components/inputs/textarea/index.d.ts +1 -20
  47. package/dist/components/inputs/textarea/index.js +6 -9
  48. package/dist/components/navigation/sidebar/index.d.ts +21 -44
  49. package/dist/components/navigation/sidebar/index.js +31 -42
  50. package/dist/components/navigation/tabs/index.d.ts +2 -8
  51. package/dist/components/navigation/tabs/index.js +10 -15
  52. package/dist/components/navigation/tabs-subtle/index.js +10 -13
  53. package/dist/components/overlays/alert-dialog/index.d.ts +16 -135
  54. package/dist/components/overlays/alert-dialog/index.js +13 -23
  55. package/dist/components/overlays/command/index.d.ts +20 -25
  56. package/dist/components/overlays/command/index.js +17 -25
  57. package/dist/components/overlays/context-menu/index.d.ts +17 -39
  58. package/dist/components/overlays/context-menu/index.js +18 -29
  59. package/dist/components/overlays/dialog/index.d.ts +16 -42
  60. package/dist/components/overlays/dialog/index.js +12 -20
  61. package/dist/components/overlays/dropdown/index.d.ts +34 -304
  62. package/dist/components/overlays/dropdown/index.js +17 -44
  63. package/dist/components/overlays/popover/index.d.ts +12 -38
  64. package/dist/components/overlays/popover/index.js +9 -13
  65. package/dist/components/overlays/preview-card/index.js +8 -12
  66. package/dist/components/overlays/sheet/index.d.ts +8 -25
  67. package/dist/components/overlays/sheet/index.js +13 -19
  68. package/dist/components/overlays/toast/index.d.ts +50 -209
  69. package/dist/components/overlays/toast/index.js +10 -23
  70. package/dist/components/overlays/tooltip/index.d.ts +21 -123
  71. package/dist/components/overlays/tooltip/index.js +6 -16
  72. package/dist/components/table/index.d.ts +8 -63
  73. package/dist/components/table/index.js +9 -20
  74. package/dist/index.d.ts +1048 -2999
  75. package/dist/index.js +82 -231
  76. package/dist/preset.d.ts +0 -22
  77. package/dist/preset.js +2 -24
  78. package/dist/primitives/code/index.js +5 -8
  79. package/dist/primitives/craft/index.js +6 -10
  80. package/dist/primitives/fluid-hover/index.js +8 -10
  81. package/dist/primitives/morph/index.js +10 -16
  82. package/dist/primitives/motion/index.js +8 -11
  83. package/dist/primitives/scroll-area/index.js +3 -5
  84. package/dist/primitives/sizes/index.js +4 -6
  85. package/dist/primitives/surface/index.js +4 -6
  86. package/dist/shared/{components-c7rwx0ap.js → components-0q0sqfh4.js} +49 -27
  87. package/dist/shared/components-0sn7ypjw.js +61 -0
  88. package/dist/shared/{components-vc864c51.js → components-11da9ajg.js} +5 -8
  89. package/dist/shared/components-1434p1mh.js +123 -0
  90. package/dist/shared/{components-c74gf16d.js → components-1z6tdadk.js} +24 -40
  91. package/dist/shared/{components-bae8sbjx.js → components-27nnvrwe.js} +14 -15
  92. package/dist/shared/{components-qh1cvj6p.js → components-2dxkv6zm.js} +7 -8
  93. package/dist/shared/{components-y0kfy2g4.js → components-2ecg8svx.js} +152 -234
  94. package/dist/shared/{components-c5w5zk0s.js → components-2ph6t61s.js} +34 -37
  95. package/dist/shared/{components-4j3t39dd.js → components-39jq9va1.js} +24 -29
  96. package/dist/shared/components-3ky44908.js +9 -0
  97. package/dist/shared/{components-syynwm1r.js → components-3mkepka5.js} +25 -28
  98. package/dist/shared/{components-wgtjt2af.js → components-4700p9kz.js} +22 -24
  99. package/dist/shared/{components-yhgq0qxx.js → components-59efxjd9.js} +12 -13
  100. package/dist/shared/{components-91zw3d9f.js → components-5vgpnxgy.js} +27 -51
  101. package/dist/shared/{components-kz5q11pp.js → components-5xc2j8jz.js} +18 -19
  102. package/dist/shared/{components-zkk3fmw8.js → components-6p8tfcd6.js} +29 -57
  103. package/dist/shared/{components-4nck8acq.js → components-7r3etddy.js} +54 -19
  104. package/dist/shared/{components-svkt577j.js → components-8snj490h.js} +32 -78
  105. package/dist/shared/{components-ctqmge8t.js → components-b0eac83j.js} +30 -9
  106. package/dist/shared/{components-9sttq78t.js → components-b2wyq2cq.js} +59 -41
  107. package/dist/shared/{components-pv1dyrtn.js → components-b3c5et5b.js} +38 -49
  108. package/dist/shared/{components-rrbpmfx4.js → components-c6s6b43g.js} +2 -3
  109. package/dist/shared/{components-pwayrkw9.js → components-chacnk61.js} +19 -19
  110. package/dist/shared/{components-71nbt03m.js → components-cv16mryv.js} +7 -26
  111. package/dist/shared/{components-hgv6tygd.js → components-d6xtjht3.js} +30 -35
  112. package/dist/shared/{components-z8fedth5.js → components-dk0gjr5a.js} +18 -19
  113. package/dist/shared/{components-cet3jpa0.js → components-fzrq6tr3.js} +34 -37
  114. package/dist/shared/{components-cnead5qm.js → components-gc5vtq2f.js} +30 -66
  115. package/dist/shared/components-gf5s6ap9.js +42 -0
  116. package/dist/shared/{components-0h78g3b5.js → components-gz8zf3ec.js} +55 -56
  117. package/dist/shared/{components-mattt5jp.js → components-h2ajmhwn.js} +35 -107
  118. package/dist/shared/{components-m06yq8wk.js → components-hqeq3w9q.js} +23 -38
  119. package/dist/shared/{components-7qx17na9.js → components-hw9yk32z.js} +24 -36
  120. package/dist/shared/components-hyq23phv.js +310 -0
  121. package/dist/shared/{components-9jmjnkqd.js → components-jbbmdr74.js} +22 -41
  122. package/dist/shared/{components-dcc02hs2.js → components-jjw69c4c.js} +4 -7
  123. package/dist/shared/{components-303jf96s.js → components-jthe1pwb.js} +420 -139
  124. package/dist/shared/{components-dtca4s6b.js → components-jwst3vtj.js} +76 -224
  125. package/dist/shared/{components-dc5q749x.js → components-kvr7f9hy.js} +10 -19
  126. package/dist/shared/{components-s8yqk2dc.js → components-kwa6mrf9.js} +11 -46
  127. package/dist/shared/{components-de99ykt7.js → components-men63rwj.js} +2 -3
  128. package/dist/shared/{components-qx27excf.js → components-mjthm1kf.js} +9 -13
  129. package/dist/shared/{components-1e64t8aj.js → components-n42c79bz.js} +22 -23
  130. package/dist/shared/{components-tz1fv35x.js → components-n7mjr357.js} +2 -3
  131. package/dist/shared/components-ng72k97e.js +128 -0
  132. package/dist/shared/{components-w2jqa6hx.js → components-pbmqctfa.js} +65 -169
  133. package/dist/shared/{components-px2zm7dc.js → components-q5xj5c16.js} +8 -9
  134. package/dist/shared/components-raknhppb.js +64 -0
  135. package/dist/shared/{components-2a7hcand.js → components-rr7a6ja9.js} +27 -59
  136. package/dist/shared/{components-005jt2nz.js → components-s083f38z.js} +34 -164
  137. package/dist/shared/components-s5ngg32c.js +267 -0
  138. package/dist/shared/components-sn1rxx1d.js +143 -0
  139. package/dist/shared/{components-r8eqs7gz.js → components-ta7shw28.js} +4 -4
  140. package/dist/shared/{components-9as3rf68.js → components-vc7vq5nz.js} +3 -6
  141. package/dist/shared/{components-ft3zdc79.js → components-vfbhxf5r.js} +5 -6
  142. package/dist/shared/components-vynjtrk6.js +19 -0
  143. package/dist/shared/{components-p0fm0bab.js → components-w1r67ag9.js} +149 -294
  144. package/dist/shared/{components-xd3emmy4.js → components-w90endve.js} +72 -71
  145. package/dist/shared/{components-t5pk5nmc.js → components-wvp1m52g.js} +102 -149
  146. package/dist/shared/components-wy9jpqny.js +146 -0
  147. package/dist/shared/{components-yxmxn2jp.js → components-y9y0g8er.js} +28 -52
  148. package/dist/shared/components-ypp01w3p.js +986 -0
  149. package/dist/shared/{components-czdvj1a8.js → components-zfnmn5d4.js} +36 -82
  150. package/dist/shared/{components-jqpefjsn.js → components-zrkzcayz.js} +6 -54
  151. package/dist/shared/{components-vf45j12c.js → components-zx6b6yby.js} +18 -4
  152. package/dist/styles.css +32 -320
  153. package/dist/tailwind.css +0 -16
  154. package/dist/tokens.css +0 -67
  155. package/package.json +4 -227
  156. package/DESIGN.md +0 -623
  157. package/blocks/sidebar-app/examples.mdx +0 -33
  158. package/blocks/sidebar-app/index.tsx +0 -218
  159. package/blocks/sidebar-app/inset-topbar.tsx +0 -25
  160. package/blocks/sidebar-app/menu-grid.ts +0 -26
  161. package/blocks/sidebar-app/nav-data.ts +0 -36
  162. package/blocks/sidebar-app/search-field.tsx +0 -48
  163. package/blocks/sidebar-app/user-footer.tsx +0 -67
  164. package/blocks/sidebar-app/workspace-header.tsx +0 -129
  165. package/components/AI/input-message/examples.mdx +0 -130
  166. package/components/AI/input-message/file-thumbnail.tsx +0 -173
  167. package/components/AI/input-message/index.tsx +0 -1385
  168. package/components/AI/thinking-indicator/examples.mdx +0 -27
  169. package/components/AI/thinking-indicator/index.tsx +0 -210
  170. package/components/accordion/examples.mdx +0 -233
  171. package/components/accordion/index.tsx +0 -1071
  172. package/components/avatar/examples.mdx +0 -95
  173. package/components/avatar/index.tsx +0 -129
  174. package/components/badge/change-demo.tsx +0 -29
  175. package/components/badge/examples.mdx +0 -124
  176. package/components/badge/index.tsx +0 -225
  177. package/components/badge/variants.ts +0 -73
  178. package/components/button/examples.mdx +0 -168
  179. package/components/button/index.tsx +0 -424
  180. package/components/button/loading-demo.tsx +0 -25
  181. package/components/button/variants.ts +0 -168
  182. package/components/card/examples.mdx +0 -251
  183. package/components/card/index.tsx +0 -1070
  184. package/components/copy/examples.mdx +0 -125
  185. package/components/copy/index.tsx +0 -662
  186. package/components/inputs/checkbox/examples.mdx +0 -87
  187. package/components/inputs/checkbox/index.tsx +0 -611
  188. package/components/inputs/checkbox/select-all-demo.tsx +0 -48
  189. package/components/inputs/color-picker/examples.mdx +0 -111
  190. package/components/inputs/color-picker/index.tsx +0 -1981
  191. package/components/inputs/color-picker/variants.ts +0 -401
  192. package/components/inputs/combobox/examples.mdx +0 -366
  193. package/components/inputs/combobox/index.tsx +0 -1527
  194. package/components/inputs/combobox/remote-demo.tsx +0 -105
  195. package/components/inputs/date-time/calendar/examples.mdx +0 -45
  196. package/components/inputs/date-time/calendar/index.tsx +0 -370
  197. package/components/inputs/date-time/calendar/use-month-window.ts +0 -173
  198. package/components/inputs/date-time/date-picker/examples.mdx +0 -243
  199. package/components/inputs/date-time/date-picker/index.tsx +0 -476
  200. package/components/inputs/date-time/date-picker/masked-date-input.tsx +0 -348
  201. package/components/inputs/date-time/date-range-picker/examples.mdx +0 -93
  202. package/components/inputs/date-time/date-range-picker/index.tsx +0 -525
  203. package/components/inputs/date-time/duration-picker/examples.mdx +0 -40
  204. package/components/inputs/date-time/duration-picker/index.tsx +0 -253
  205. package/components/inputs/date-time/month-picker/examples.mdx +0 -45
  206. package/components/inputs/date-time/month-picker/index.tsx +0 -254
  207. package/components/inputs/date-time/picker-shell.tsx +0 -581
  208. package/components/inputs/date-time/time-columns.tsx +0 -94
  209. package/components/inputs/date-time/time-picker/examples.mdx +0 -57
  210. package/components/inputs/date-time/time-picker/index.tsx +0 -227
  211. package/components/inputs/field/examples.mdx +0 -117
  212. package/components/inputs/field/index.tsx +0 -268
  213. package/components/inputs/file-dropzone/examples.mdx +0 -83
  214. package/components/inputs/file-dropzone/file-row.tsx +0 -201
  215. package/components/inputs/file-dropzone/index.tsx +0 -316
  216. package/components/inputs/file-dropzone/upload-demo.tsx +0 -67
  217. package/components/inputs/file-dropzone/variants.ts +0 -94
  218. package/components/inputs/input/examples.mdx +0 -166
  219. package/components/inputs/input/index.tsx +0 -494
  220. package/components/inputs/input/password-demo.tsx +0 -30
  221. package/components/inputs/label/examples.mdx +0 -67
  222. package/components/inputs/label/index.tsx +0 -85
  223. package/components/inputs/number-input/examples.mdx +0 -69
  224. package/components/inputs/number-input/index.tsx +0 -221
  225. package/components/inputs/radio/examples.mdx +0 -77
  226. package/components/inputs/radio/index.tsx +0 -636
  227. package/components/inputs/search/examples.mdx +0 -74
  228. package/components/inputs/search/index.tsx +0 -333
  229. package/components/inputs/select/examples.mdx +0 -296
  230. package/components/inputs/select/index.tsx +0 -1044
  231. package/components/inputs/select/variants.ts +0 -32
  232. package/components/inputs/slider/examples.mdx +0 -153
  233. package/components/inputs/slider/index.tsx +0 -1867
  234. package/components/inputs/switch/examples.mdx +0 -96
  235. package/components/inputs/switch/index.tsx +0 -504
  236. package/components/inputs/textarea/examples.mdx +0 -126
  237. package/components/inputs/textarea/index.tsx +0 -207
  238. package/components/navigation/navigation-menu/examples.mdx +0 -136
  239. package/components/navigation/navigation-menu/index.tsx +0 -704
  240. package/components/navigation/pagination/examples.mdx +0 -74
  241. package/components/navigation/pagination/index.tsx +0 -401
  242. package/components/navigation/sidebar/examples.mdx +0 -325
  243. package/components/navigation/sidebar/index.tsx +0 -453
  244. package/components/navigation/sidebar/sidebar-core.tsx +0 -1408
  245. package/components/navigation/sidebar/sidebar-menu.tsx +0 -1495
  246. package/components/navigation/sidebar/sidebar.css +0 -74
  247. package/components/navigation/sidebar/variants.ts +0 -55
  248. package/components/navigation/tabs/examples.mdx +0 -89
  249. package/components/navigation/tabs/index.tsx +0 -494
  250. package/components/navigation/tabs-subtle/examples.mdx +0 -49
  251. package/components/navigation/tabs-subtle/index.tsx +0 -512
  252. package/components/overlays/alert-dialog/examples.mdx +0 -123
  253. package/components/overlays/alert-dialog/index.tsx +0 -276
  254. package/components/overlays/alert-dialog/pending-demo.tsx +0 -36
  255. package/components/overlays/command/examples.mdx +0 -113
  256. package/components/overlays/command/index.tsx +0 -425
  257. package/components/overlays/context-menu/examples.mdx +0 -56
  258. package/components/overlays/context-menu/index.tsx +0 -279
  259. package/components/overlays/dialog/examples.mdx +0 -165
  260. package/components/overlays/dialog/index.tsx +0 -451
  261. package/components/overlays/dropdown/dropdown-search.tsx +0 -395
  262. package/components/overlays/dropdown/examples.mdx +0 -444
  263. package/components/overlays/dropdown/index.tsx +0 -1241
  264. package/components/overlays/dropdown/menu-item.tsx +0 -510
  265. package/components/overlays/dropdown/menu-parts.tsx +0 -725
  266. package/components/overlays/popover/anchored-demo.tsx +0 -59
  267. package/components/overlays/popover/examples.mdx +0 -203
  268. package/components/overlays/popover/index.tsx +0 -317
  269. package/components/overlays/preview-card/examples.mdx +0 -61
  270. package/components/overlays/preview-card/index.tsx +0 -204
  271. package/components/overlays/sheet/examples.mdx +0 -101
  272. package/components/overlays/sheet/index.tsx +0 -307
  273. package/components/overlays/toast/examples.mdx +0 -85
  274. package/components/overlays/toast/global-demo.tsx +0 -72
  275. package/components/overlays/toast/index.tsx +0 -544
  276. package/components/overlays/toast/manager.ts +0 -193
  277. package/components/overlays/tooltip/examples.mdx +0 -106
  278. package/components/overlays/tooltip/index.tsx +0 -539
  279. package/components/progress/examples.mdx +0 -59
  280. package/components/progress/index.tsx +0 -174
  281. package/components/progress/progress.css +0 -49
  282. package/components/progress/step-demo.tsx +0 -27
  283. package/components/table/examples.mdx +0 -188
  284. package/components/table/index.tsx +0 -535
  285. package/components/table/sort-demo.tsx +0 -61
  286. package/dist/components/avatar/index.d.ts +0 -46
  287. package/dist/components/avatar/index.js +0 -19
  288. package/dist/components/badge/variants.d.ts +0 -33
  289. package/dist/components/badge/variants.js +0 -10
  290. package/dist/components/button/variants.d.ts +0 -39
  291. package/dist/components/button/variants.js +0 -8
  292. package/dist/components/inputs/color-picker/variants.d.ts +0 -61
  293. package/dist/components/inputs/color-picker/variants.js +0 -28
  294. package/dist/components/inputs/field/index.d.ts +0 -116
  295. package/dist/components/inputs/field/index.js +0 -29
  296. package/dist/components/inputs/file-dropzone/index.d.ts +0 -167
  297. package/dist/components/inputs/file-dropzone/index.js +0 -33
  298. package/dist/components/inputs/file-dropzone/variants.d.ts +0 -35
  299. package/dist/components/inputs/file-dropzone/variants.js +0 -12
  300. package/dist/components/inputs/label/index.d.ts +0 -32
  301. package/dist/components/inputs/label/index.js +0 -11
  302. package/dist/components/inputs/number-input/index.d.ts +0 -87
  303. package/dist/components/inputs/number-input/index.js +0 -21
  304. package/dist/components/inputs/select/variants.d.ts +0 -5
  305. package/dist/components/inputs/select/variants.js +0 -6
  306. package/dist/components/navigation/navigation-menu/index.d.ts +0 -126
  307. package/dist/components/navigation/navigation-menu/index.js +0 -41
  308. package/dist/components/navigation/pagination/index.d.ts +0 -75
  309. package/dist/components/navigation/pagination/index.js +0 -41
  310. package/dist/components/navigation/sidebar/variants.d.ts +0 -25
  311. package/dist/components/navigation/sidebar/variants.js +0 -28
  312. package/dist/components/progress/index.d.ts +0 -56
  313. package/dist/components/progress/index.js +0 -15
  314. package/dist/docs/index.d.ts +0 -83
  315. package/dist/docs/index.js +0 -288
  316. package/dist/docs/vite.d.ts +0 -31
  317. package/dist/docs/vite.js +0 -45
  318. package/dist/lib/date-locale.d.ts +0 -26
  319. package/dist/lib/date-locale.js +0 -24
  320. package/dist/lib/field-classes.d.ts +0 -149
  321. package/dist/lib/field-classes.js +0 -41
  322. package/dist/lib/field-variants.d.ts +0 -47
  323. package/dist/lib/field-variants.js +0 -26
  324. package/dist/lib/fluid-hover-highlight.d.ts +0 -112
  325. package/dist/lib/fluid-hover-highlight.js +0 -17
  326. package/dist/lib/focus-ring.d.ts +0 -18
  327. package/dist/lib/focus-ring.js +0 -11
  328. package/dist/lib/goo-indicator.d.ts +0 -46
  329. package/dist/lib/goo-indicator.js +0 -14
  330. package/dist/lib/icon-context.d.ts +0 -30
  331. package/dist/lib/icon-context.js +0 -12
  332. package/dist/lib/inert.d.ts +0 -9
  333. package/dist/lib/inert.js +0 -8
  334. package/dist/lib/morph-layers.d.ts +0 -93
  335. package/dist/lib/morph-layers.js +0 -13
  336. package/dist/lib/morph-part.d.ts +0 -21
  337. package/dist/lib/morph-part.js +0 -12
  338. package/dist/lib/popup.d.ts +0 -20
  339. package/dist/lib/popup.js +0 -12
  340. package/dist/lib/reduced-motion.d.ts +0 -9
  341. package/dist/lib/reduced-motion.js +0 -6
  342. package/dist/lib/row-index.d.ts +0 -10
  343. package/dist/lib/row-index.js +0 -8
  344. package/dist/lib/row-order.d.ts +0 -28
  345. package/dist/lib/row-order.js +0 -10
  346. package/dist/lib/scroll-column.d.ts +0 -31
  347. package/dist/lib/scroll-column.js +0 -19
  348. package/dist/lib/shape-context.d.ts +0 -30
  349. package/dist/lib/shape-context.js +0 -13
  350. package/dist/lib/shape-radius.d.ts +0 -19
  351. package/dist/lib/shape-radius.js +0 -6
  352. package/dist/lib/size-context.d.ts +0 -94
  353. package/dist/lib/size-context.js +0 -20
  354. package/dist/lib/size-scale.d.ts +0 -79
  355. package/dist/lib/size-scale.js +0 -8
  356. package/dist/lib/slot.d.ts +0 -39
  357. package/dist/lib/slot.js +0 -14
  358. package/dist/lib/springs.d.ts +0 -44
  359. package/dist/lib/springs.js +0 -8
  360. package/dist/lib/surface-classes.d.ts +0 -19
  361. package/dist/lib/surface-classes.js +0 -10
  362. package/dist/lib/surface-context.d.ts +0 -9
  363. package/dist/lib/surface-context.js +0 -8
  364. package/dist/lib/use-controllable-state.d.ts +0 -2
  365. package/dist/lib/use-controllable-state.js +0 -6
  366. package/dist/lib/use-fluid-hover.d.ts +0 -138
  367. package/dist/lib/use-fluid-hover.js +0 -14
  368. package/dist/lib/use-is-mobile.d.ts +0 -2
  369. package/dist/lib/use-is-mobile.js +0 -6
  370. package/dist/lib/use-keyboard-nav-gate.d.ts +0 -20
  371. package/dist/lib/use-keyboard-nav-gate.js +0 -7
  372. package/dist/lib/use-merge-split.d.ts +0 -47
  373. package/dist/lib/use-merge-split.js +0 -15
  374. package/dist/lib/use-morph.d.ts +0 -101
  375. package/dist/lib/use-morph.js +0 -20
  376. package/dist/lib/use-touch-primary.d.ts +0 -2
  377. package/dist/lib/use-touch-primary.js +0 -6
  378. package/dist/lib/utils.d.ts +0 -3
  379. package/dist/lib/utils.js +0 -6
  380. package/dist/primitives/separator/index.d.ts +0 -25
  381. package/dist/primitives/separator/index.js +0 -9
  382. package/dist/primitives/skeleton/index.d.ts +0 -35
  383. package/dist/primitives/skeleton/index.js +0 -13
  384. package/dist/shared/components-01w9qcfa.js +0 -277
  385. package/dist/shared/components-124epb7f.js +0 -53
  386. package/dist/shared/components-26snnbs9.js +0 -322
  387. package/dist/shared/components-2krsc300.js +0 -254
  388. package/dist/shared/components-2qbqqpgq.js +0 -1545
  389. package/dist/shared/components-34txk9rj.js +0 -35
  390. package/dist/shared/components-3h92d94m.js +0 -23
  391. package/dist/shared/components-4vfm04wq.js +0 -82
  392. package/dist/shared/components-54nq988h.js +0 -123
  393. package/dist/shared/components-7s7pykk5.js +0 -281
  394. package/dist/shared/components-868v7scv.js +0 -399
  395. package/dist/shared/components-8jrk5eye.js +0 -448
  396. package/dist/shared/components-adkarj8n.js +0 -35
  397. package/dist/shared/components-b1e239g3.js +0 -28
  398. package/dist/shared/components-b94t6qtj.js +0 -143
  399. package/dist/shared/components-bsqynhaj.js +0 -179
  400. package/dist/shared/components-c9yr4ed1.js +0 -44
  401. package/dist/shared/components-d3shbwqq.js +0 -95
  402. package/dist/shared/components-dhgk6mbt.js +0 -16
  403. package/dist/shared/components-drxrtnp2.js +0 -25
  404. package/dist/shared/components-f7h57m6t.js +0 -59
  405. package/dist/shared/components-g3eafs70.js +0 -337
  406. package/dist/shared/components-gx4h5rbb.js +0 -40
  407. package/dist/shared/components-gyt7my41.js +0 -328
  408. package/dist/shared/components-h6p86be3.js +0 -19
  409. package/dist/shared/components-h83az0bz.js +0 -33
  410. package/dist/shared/components-hdzrqqpx.js +0 -55
  411. package/dist/shared/components-krtx3m5b.js +0 -84
  412. package/dist/shared/components-kswxnm3h.js +0 -24
  413. package/dist/shared/components-mhza2wdn.js +0 -482
  414. package/dist/shared/components-mrbaxt8q.js +0 -62
  415. package/dist/shared/components-pt5ftm4p.js +0 -38
  416. package/dist/shared/components-rtadhd9j.js +0 -64
  417. package/dist/shared/components-tv7b8tet.js +0 -271
  418. package/dist/shared/components-tz4gaf1v.js +0 -23
  419. package/dist/shared/components-wbbckbw8.js +0 -34
  420. package/dist/shared/components-wknae3m4.js +0 -298
  421. package/dist/shared/components-xdqmt6ed.js +0 -20
  422. package/dist/shared/components-xjkdvnbg.js +0 -107
  423. package/dist/shared/components-z3v0n0de.js +0 -11
  424. package/dist/tokens/colors.css +0 -230
  425. package/dist/tokens/motion.css +0 -40
  426. package/dist/tokens/radius.css +0 -10
  427. package/dist/tokens/spacing.css +0 -9
  428. package/dist/tokens/typography.css +0 -119
  429. package/docs/chrome.css +0 -120
  430. package/docs/chrome.tsx +0 -283
  431. package/docs/index.ts +0 -9
  432. package/docs/vite.ts +0 -85
  433. package/index.ts +0 -60
  434. package/lib/date-locale.ts +0 -195
  435. package/lib/field-classes.ts +0 -121
  436. package/lib/field-variants.ts +0 -117
  437. package/lib/fluid-hover-highlight.tsx +0 -139
  438. package/lib/focus-ring.tsx +0 -46
  439. package/lib/goo-indicator.tsx +0 -261
  440. package/lib/icon-context.tsx +0 -310
  441. package/lib/inert.ts +0 -22
  442. package/lib/morph-layers.tsx +0 -102
  443. package/lib/morph-part.tsx +0 -49
  444. package/lib/popup.ts +0 -52
  445. package/lib/reduced-motion.ts +0 -19
  446. package/lib/row-index.tsx +0 -29
  447. package/lib/row-order.tsx +0 -126
  448. package/lib/scroll-column.tsx +0 -273
  449. package/lib/shape-context.tsx +0 -138
  450. package/lib/shape-radius.ts +0 -67
  451. package/lib/size-context.tsx +0 -66
  452. package/lib/size-scale.ts +0 -115
  453. package/lib/slot.ts +0 -115
  454. package/lib/springs.ts +0 -62
  455. package/lib/surface-classes.ts +0 -58
  456. package/lib/surface-context.tsx +0 -21
  457. package/lib/use-controllable-state.ts +0 -44
  458. package/lib/use-fluid-hover.ts +0 -541
  459. package/lib/use-is-mobile.ts +0 -25
  460. package/lib/use-keyboard-nav-gate.ts +0 -45
  461. package/lib/use-merge-split.tsx +0 -209
  462. package/lib/use-morph.ts +0 -575
  463. package/lib/use-touch-primary.tsx +0 -43
  464. package/lib/utils.ts +0 -37
  465. package/preset.ts +0 -199
  466. package/primitives/code/examples.mdx +0 -27
  467. package/primitives/code/index.tsx +0 -80
  468. package/primitives/craft/demos.tsx +0 -173
  469. package/primitives/craft/examples.mdx +0 -142
  470. package/primitives/craft/index.tsx +0 -76
  471. package/primitives/fluid-hover/examples.mdx +0 -84
  472. package/primitives/fluid-hover/index.tsx +0 -316
  473. package/primitives/morph/examples.mdx +0 -139
  474. package/primitives/morph/index.tsx +0 -192
  475. package/primitives/motion/examples.mdx +0 -100
  476. package/primitives/motion/index.tsx +0 -160
  477. package/primitives/scroll-area/examples.mdx +0 -58
  478. package/primitives/scroll-area/index.tsx +0 -204
  479. package/primitives/separator/examples.mdx +0 -30
  480. package/primitives/separator/index.tsx +0 -53
  481. package/primitives/sizes/examples.mdx +0 -167
  482. package/primitives/sizes/index.tsx +0 -89
  483. package/primitives/skeleton/examples.mdx +0 -51
  484. package/primitives/skeleton/index.tsx +0 -72
  485. package/primitives/skeleton/skeleton.css +0 -15
  486. package/primitives/surface/examples.mdx +0 -173
  487. package/primitives/surface/index.tsx +0 -109
  488. package/primitives/surface/surface.css +0 -176
  489. /package/dist/shared/{components-3ey0hzpb.js → components-1v7rxytx.js} +0 -0
  490. /package/dist/shared/{components-jcnjay5g.js → components-ezxhrmer.js} +0 -0
@@ -1,544 +0,0 @@
1
- /*
2
- * Local addition (not part of Fluid Functionalism): gooey toasts after Sileo
3
- * (github.com/hiaaryan/sileo `src/sileo.tsx` + `src/styles.css` @
4
- * 9793f844349983e140cf33cebbb8f51626d41407 — MIT, notice: LICENSE.sileo). A
5
- * pill with the state's icon and title melts into a body with the description
6
- * and an action, through the shared goo filter; the body opens a beat after
7
- * the toast lands and folds back before it leaves (Sileo's autopilot), or
8
- * whenever it is hovered. Base UI's Toast owns the queue, timers, swipe to
9
- * dismiss and announcements; Sileo's own store, timers and swipe are not
10
- * ported. The toast is drawn like every other morph surface: the Elevated
11
- * level's background shapes melted by the shared goo filter, their shadows
12
- * beneath, the content on top. Colors are the status tokens, the sizes the
13
- * control ladder's, and the motion the spring tiers; reduced motion keeps the
14
- * fades and snaps the shapes. The global `toast()` (`manager.ts`) feeds a
15
- * `Toast` mounted with `manager={toast}` from anywhere, React or not; titles
16
- * and descriptions take any node, `icon` replaces the state's glyph and
17
- * `action` takes a button's `{ label, onClick }` or any node. The state
18
- * glyphs come from the icon set (`useIcons`), so an `IconProvider` swaps them.
19
- * `Toast.Action` / `Toast.Close` wrap Base UI's parts as compact Buttons
20
- * (`render` / `asChild` as the slot shape), so a custom action node needs no
21
- * `@base-ui/react/toast` import.
22
- */
23
-
24
- import { type ToastManager, Toast as ToastPrimitive } from '@base-ui/react/toast'
25
- import { AnimatePresence, motion } from 'motion/react'
26
- import {
27
- cloneElement,
28
- createContext,
29
- forwardRef,
30
- isValidElement,
31
- type ReactNode,
32
- type Ref,
33
- useContext,
34
- useEffect,
35
- useId,
36
- useLayoutEffect,
37
- useMemo,
38
- useRef,
39
- useState,
40
- } from 'react'
41
- import { type IconComponent, type IconName, useIcon, useIcons } from '../../../lib/icon-context'
42
- import { GooFilter } from '../../../lib/morph-layers'
43
- import { useReduceMotion } from '../../../lib/reduced-motion'
44
- import { useShape } from '../../../lib/shape-context'
45
- import { sizeMap } from '../../../lib/size-context'
46
- import { type SlotProps, slotRender } from '../../../lib/slot'
47
- import { spring } from '../../../lib/springs'
48
- import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
49
- import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
50
- import { GOO_BLUR_RATIO, holdExit } from '../../../lib/use-morph'
51
- import { cn } from '../../../lib/utils'
52
- import Button, { type ButtonProps } from '../../button'
53
- import {
54
- type ToastActionOptions,
55
- type ToastData,
56
- type ToastHandle,
57
- type ToastInput,
58
- type ToastOptions,
59
- type ToastPromiseOptions,
60
- type ToastSource,
61
- type ToastType,
62
- toast,
63
- toManagerOptions,
64
- } from './manager'
65
-
66
- type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'
67
-
68
- const ICONS: Record<ToastType, IconName> = {
69
- success: 'check',
70
- loading: 'loader-circle',
71
- error: 'x',
72
- warning: 'circle-alert',
73
- info: 'info',
74
- action: 'arrow-right',
75
- }
76
-
77
- // Literal per state so the class extractor sees each one.
78
- const TONES: Record<ToastType, string> = {
79
- success: 'text-status-success bg-status-success/16',
80
- loading: 'text-status-loading bg-status-loading/16',
81
- error: 'text-status-error bg-status-error/16',
82
- warning: 'text-status-warning bg-status-warning/16',
83
- info: 'text-status-info bg-status-info/16',
84
- action: 'text-status-action bg-status-action/16',
85
- }
86
-
87
- const VIEWPORT: Record<ToastPosition, string> = {
88
- 'top-left': 'top-4 left-4 items-start',
89
- 'top-center': 'top-4 left-1/2 -translate-x-1/2 items-center',
90
- 'top-right': 'top-4 right-4 items-end',
91
- 'bottom-left': 'bottom-4 left-4 flex-col-reverse items-start',
92
- 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2 flex-col-reverse items-center',
93
- 'bottom-right': 'bottom-4 right-4 flex-col-reverse items-end',
94
- }
95
-
96
- // The pill is one control tall, and the goo melts as much as its radius allows.
97
- const PILL = sizeMap.default.controlHeight
98
- const BLUR = (PILL / 2) * GOO_BLUR_RATIO
99
- const SNAP = { duration: 0 }
100
- const AUTO_EXPAND_MS = 150
101
- const AUTO_COLLAPSE_BEFORE_MS = 2000
102
-
103
- const ToastSettings = createContext<{ position: ToastPosition; timeout: number }>({
104
- position: 'top-right',
105
- timeout: 6000,
106
- })
107
-
108
- /**
109
- * Shows toasts from inside a `Toast`: `show`, the per-state shortcuts,
110
- * `promise`, `update` and `close` (alias `dismiss`), plus the `toasts` showing.
111
- * Under a `Toast` with `manager={toast}` it works on the same stack as the
112
- * global `toast()`.
113
- */
114
- function useToast() {
115
- const manager = ToastPrimitive.useToastManager<ToastData>()
116
-
117
- return useMemo(() => {
118
- const show = (o: ToastInput) => manager.add({ type: 'info', ...toManagerOptions(o) })
119
- const typed = (type: ToastType) => (o: ToastInput) =>
120
- show(typeof o === 'string' ? { title: o, type } : { ...o, type })
121
- const result = <T,>(r: ToastPromiseOptions<T>['success']) =>
122
- typeof r === 'function' ? (value: T) => toManagerOptions(r(value)) : toManagerOptions(r)
123
-
124
- return {
125
- toasts: manager.toasts,
126
- show,
127
- success: typed('success'),
128
- error: typed('error'),
129
- warning: typed('warning'),
130
- info: typed('info'),
131
- promise: <T,>(promise: Promise<T>, o: ToastPromiseOptions<T>) =>
132
- manager.promise(promise, {
133
- loading: toManagerOptions(o.loading),
134
- success: result(o.success),
135
- error: result(o.error),
136
- }),
137
- update: (id: string, o: ToastInput) => manager.update(id, toManagerOptions(o)),
138
- close: manager.close,
139
- dismiss: manager.close,
140
- }
141
- }, [manager])
142
- }
143
-
144
- interface Box {
145
- x: number
146
- y: number
147
- width: number
148
- height: number
149
- }
150
-
151
- function Shape({ box, className, shapeRef }: { box: Box; className: string; shapeRef?: Ref<HTMLDivElement> }) {
152
- const reduced = useReduceMotion()
153
- return (
154
- <motion.div
155
- ref={shapeRef}
156
- aria-hidden
157
- className={cn('pointer-events-none absolute top-0 left-0', className)}
158
- initial={false}
159
- animate={{ ...box }}
160
- transition={reduced ? SNAP : spring.slow}
161
- />
162
- )
163
- }
164
-
165
- /** The pill's glyph: the state's icon, or the toast's own `icon` (a component, or any node). */
166
- function StatusIcon({ type, icon }: { type: ToastType; icon: ToastData['icon'] }) {
167
- const icons = useIcons()
168
- // A component is a function or a forwardRef / memo object; an element is a node.
169
- const component =
170
- typeof icon === 'function' ||
171
- (typeof icon === 'object' && icon !== null && '$$typeof' in icon && !isValidElement(icon))
172
- if (icon != null && icon !== false && !component) return <>{icon}</>
173
- const Icon = component ? (icon as IconComponent) : icons[ICONS[type]]
174
- return <Icon size={14} strokeWidth={2.5} className={type === 'loading' && !component ? 'animate-spin' : undefined} />
175
- }
176
-
177
- function ToastItem({ toast }: { toast: ToastPrimitive.Root.ToastObject<ToastData> }) {
178
- const { position, timeout } = useContext(ToastSettings)
179
- const shape = useShape()
180
- // Lifts 2 levels off its substrate with a fixed shadow, like a popover.
181
- const level = Math.min(useSurface() + 2, 8)
182
- const gooId = `toast-goo-${useId().replace(/:/g, '')}`
183
- const type = (toast.type ?? 'info') as ToastType
184
- const customAction = toast.data?.action
185
- const top = position.startsWith('top')
186
- const ending = toast.transitionStatus === 'ending'
187
- const hasBody = Boolean(toast.description || toast.actionProps || customAction)
188
- const [hovered, setHovered] = useState(false)
189
- const [auto, setAuto] = useState(false)
190
- const expanded = hasBody && type !== 'loading' && !ending && (hovered || auto)
191
- const root = useRef<HTMLDivElement>(null)
192
- const header = useRef<HTMLDivElement>(null)
193
- const body = useRef<HTMLDivElement>(null)
194
- const bodyShape = useRef<HTMLDivElement>(null)
195
- const [size, setSize] = useState({ width: 0, pill: PILL, body: 0, radius: 0 })
196
-
197
- useEffect(() => {
198
- if (!hasBody || type === 'loading') return
199
- const life = toast.timeout ?? timeout
200
- const open = setTimeout(() => setAuto(true), AUTO_EXPAND_MS)
201
- const close =
202
- life > 0 ? setTimeout(() => setAuto(false), Math.max(AUTO_EXPAND_MS, life - AUTO_COLLAPSE_BEFORE_MS)) : undefined
203
- return () => {
204
- clearTimeout(open)
205
- clearTimeout(close)
206
- }
207
- }, [hasBody, type, toast.timeout, timeout])
208
-
209
- // The header and the body content keep their natural size (the header is
210
- // `w-max`, outside the pill), so measuring them never feeds back the
211
- // animated shapes. A body that appears later (a promise's result) is
212
- // observed from then on.
213
- useLayoutEffect(() => {
214
- const measure = () =>
215
- setSize({
216
- width: root.current?.offsetWidth ?? 0,
217
- pill: Math.max(PILL, header.current?.offsetWidth ?? 0),
218
- body: body.current?.offsetHeight ?? 0,
219
- radius: bodyShape.current ? Number.parseFloat(getComputedStyle(bodyShape.current).borderTopLeftRadius) || 0 : 0,
220
- })
221
- const observer = new ResizeObserver(measure)
222
- for (const el of [header.current, body.current]) if (el) observer.observe(el)
223
- measure()
224
- return () => observer.disconnect()
225
- }, [hasBody])
226
-
227
- useLayoutEffect(() => {
228
- if (!ending || !root.current) return
229
- const hold = holdExit(root.current, 'moderate')
230
- return () => hold.cancel()
231
- }, [ending])
232
-
233
- // The pill sits on the toast's side of the screen; the body opens away from
234
- // the edge. While open, the pill reaches into the body by the body's corner
235
- // radius, covering that corner, so the outer edge runs straight and the goo
236
- // only rounds the inner corner (Sileo's open pill). The body's padding on
237
- // the pill side clears that reach. The header and the body content ride the
238
- // same values as their shapes, so they never drift apart mid-spring.
239
- const bodyHeight = expanded ? size.body : 0
240
- const height = PILL + bodyHeight
241
- const pillX = position.endsWith('left')
242
- ? 0
243
- : position.endsWith('right')
244
- ? size.width - size.pill
245
- : (size.width - size.pill) / 2
246
- const pillHeight = PILL + Math.min(bodyHeight, size.radius)
247
- const pill = { x: pillX, y: top ? 0 : height - pillHeight, width: size.pill, height: pillHeight }
248
- const bodyBox = { x: 0, y: top ? PILL : 0, width: size.width, height: bodyHeight }
249
- const reduced = useReduceMotion()
250
- // Reduced motion keeps the fades and drops the travel.
251
- const away = reduced ? { opacity: 0 } : { opacity: 0, y: top ? -6 : 6, scale: 0.95 }
252
- const move = reduced ? SNAP : spring.slow
253
-
254
- return (
255
- <ToastPrimitive.Root
256
- ref={root}
257
- toast={toast}
258
- swipeDirection={[top ? 'up' : 'down', position.endsWith('left') ? 'left' : 'right']}
259
- onMouseEnter={() => setHovered(true)}
260
- onMouseLeave={() => setHovered(false)}
261
- render={
262
- <motion.div
263
- initial={{ ...away, height: PILL }}
264
- animate={ending ? { ...away, height } : { opacity: 1, y: 0, scale: 1, height }}
265
- transition={ending ? spring.moderate.exit : { ...spring.moderate, height: move }}
266
- />
267
- }
268
- className="relative w-[min(22rem,calc(100vw-2rem))] select-none outline-none [translate:var(--toast-swipe-movement-x)_var(--toast-swipe-movement-y)]"
269
- >
270
- <GooFilter id={gooId} blur={BLUR} />
271
- <Shape box={pill} className={cn('rounded-full', SURFACE_SHADOW[3])} />
272
- {hasBody && <Shape box={bodyBox} className={cn(shape.container, SURFACE_SHADOW[3])} />}
273
- {/* The filter is the effect itself: it melts the two token-filled shapes into one. */}
274
- <div aria-hidden className="pointer-events-none absolute inset-0" style={{ filter: `url(#${gooId})` }}>
275
- <Shape box={pill} className={cn('rounded-full', SURFACE_BG[level])} />
276
- {hasBody && <Shape box={bodyBox} shapeRef={bodyShape} className={cn(shape.container, SURFACE_BG[level])} />}
277
- </div>
278
-
279
- <SurfaceProvider value={level}>
280
- <motion.div
281
- ref={header}
282
- className="absolute top-0 left-0 flex h-9 w-max items-center py-1.5 pr-4 pl-1.5"
283
- initial={false}
284
- animate={{ x: pillX, y: top ? 0 : height - PILL }}
285
- transition={move}
286
- >
287
- <ToastPrimitive.Title className="relative inline-flex items-center whitespace-nowrap">
288
- <AnimatePresence mode="popLayout" initial={false}>
289
- <motion.span
290
- // A string title keys itself; a node title crossfades on each update.
291
- key={`${type}-${typeof toast.title === 'string' ? toast.title : toast.updateKey}`}
292
- className="inline-flex items-center gap-2"
293
- initial={{ opacity: 0, filter: 'blur(4px)' }}
294
- animate={{ opacity: 1, filter: 'blur(0px)' }}
295
- exit={{ opacity: 0, filter: 'blur(4px)', transition: spring.moderate.exit }}
296
- transition={spring.moderate}
297
- >
298
- <span className={cn('flex size-6 items-center justify-center rounded-full', TONES[type])}>
299
- <StatusIcon type={type} icon={toast.data?.icon} />
300
- </span>
301
- <span className="text-body weight-medium text-foreground">{toast.title}</span>
302
- </motion.span>
303
- </AnimatePresence>
304
- </ToastPrimitive.Title>
305
- </motion.div>
306
- {hasBody && (
307
- <motion.div
308
- className="absolute top-0 left-0 w-full overflow-hidden"
309
- initial={false}
310
- animate={{ y: bodyBox.y, height: bodyHeight, opacity: expanded ? 1 : 0 }}
311
- transition={{ ...move, opacity: expanded ? spring.slow : spring.slow.exit }}
312
- >
313
- <div ref={body} className={cn('flex flex-col items-start gap-3 p-4', top ? 'pt-6' : 'pb-6')}>
314
- <ToastPrimitive.Description className="text-caption text-muted-foreground" />
315
- {toast.actionProps && <ToastPrimitive.Action render={<Button size="compact" variant="secondary" />} />}
316
- {customAction}
317
- </div>
318
- </motion.div>
319
- )}
320
- </SurfaceProvider>
321
- </ToastPrimitive.Root>
322
- )
323
- }
324
-
325
- function ToastList() {
326
- const { toasts } = ToastPrimitive.useToastManager<ToastData>()
327
- return toasts.map(toast => <ToastItem key={toast.id} toast={toast} />)
328
- }
329
-
330
- interface ToastTriggerProps extends Omit<SlotProps, 'type' | 'title'> {
331
- /** The toast's title, in the pill. */
332
- title?: ReactNode
333
- /** Text for the body the pill melts into. */
334
- description?: ReactNode
335
- /** State: sets the icon and its color. Defaults to `'info'`. */
336
- type?: 'success' | 'loading' | 'error' | 'warning' | 'info' | 'action'
337
- /** Ms before it leaves; 0 keeps it until dismissed. Defaults to the `Toast`'s `timeout`. */
338
- timeout?: number
339
- /** Replaces the state's icon in the pill: an icon component, or any node. */
340
- icon?: IconComponent | ReactNode
341
- /** A button in the body (`{ label, onClick }`), or any node. */
342
- action?: ToastActionOptions | ReactNode
343
- /** Runs a task: the toast shows `title` while it is pending, then `success` or `error`. */
344
- promise?: () => Promise<unknown>
345
- /** The toast once `promise` resolves. */
346
- success?: ToastOptions
347
- /** The toast if `promise` rejects. */
348
- error?: ToastOptions
349
- }
350
-
351
- const ToastTrigger = forwardRef<HTMLButtonElement, ToastTriggerProps>(
352
- (
353
- {
354
- title,
355
- description,
356
- type,
357
- timeout,
358
- icon,
359
- action,
360
- promise,
361
- success,
362
- error,
363
- render,
364
- asChild,
365
- children,
366
- onClick,
367
- // The element is the control itself (cloned, no Base UI button), so there is nothing to tell.
368
- nativeButton: _nativeButton,
369
- ...props
370
- },
371
- ref,
372
- ) => {
373
- const toasts = useToast()
374
- const el = slotRender(render, asChild, children)
375
- const press = (event: React.MouseEvent<HTMLButtonElement>) => {
376
- onClick?.(event)
377
- if (promise) {
378
- // The error toast is the report; the rejection Base UI hands back would only surface unhandled.
379
- toasts
380
- .promise(promise(), { loading: { title, description, icon }, success: success ?? {}, error: error ?? {} })
381
- .catch(() => {})
382
- return
383
- }
384
- toasts.show({ title, description, type, timeout, icon, action })
385
- }
386
- return el ? (
387
- cloneElement(el, { ...props, ref, onClick: press })
388
- ) : (
389
- <button ref={ref} type="button" {...props} onClick={press}>
390
- {children}
391
- </button>
392
- )
393
- },
394
- )
395
- ToastTrigger.displayName = 'ToastTrigger'
396
-
397
- type ToastButtonVariant = NonNullable<ButtonProps['variant']>
398
-
399
- interface ToastActionProps extends SlotProps {
400
- /** The Button's variant when there is no `render` element. Defaults to `'secondary'`. */
401
- variant?: ToastButtonVariant
402
- }
403
-
404
- /**
405
- * A button inside a toast (a custom `action` node or `description`), on Base UI's
406
- * `Toast.Action`: a compact Button by default, or `render` / `asChild`. A toast shown with
407
- * `action: { label, onClick }` already renders one.
408
- */
409
- const ToastAction = forwardRef<HTMLButtonElement, ToastActionProps>(
410
- ({ render, asChild, children, variant = 'secondary', ...props }, ref) => {
411
- const child = asChild && isValidElement(children) ? children : undefined
412
- const el = render ?? child ?? <Button size="compact" variant={variant} />
413
- // Base UI renders the action only when it has children, so they go to the part, not the element.
414
- const label = child
415
- ? (child.props as { children?: ReactNode }).children
416
- : (children ?? (el.props as { children?: ReactNode }).children)
417
- return (
418
- <ToastPrimitive.Action ref={ref} render={el} {...props}>
419
- {label}
420
- </ToastPrimitive.Action>
421
- )
422
- },
423
- )
424
- ToastAction.displayName = 'ToastAction'
425
-
426
- interface ToastCloseProps extends SlotProps {
427
- /** The Button's variant when there is no `render` element. Defaults to `'ghost'`. */
428
- variant?: ToastButtonVariant
429
- }
430
-
431
- /**
432
- * Dismisses the toast it sits in (a custom `action` node or `description`), on Base UI's
433
- * `Toast.Close`: a compact Button around `children`, an ✕ labelled `Close` without them, or
434
- * `render` / `asChild`.
435
- */
436
- const ToastClose = forwardRef<HTMLButtonElement, ToastCloseProps>(
437
- ({ render, asChild, children, variant = 'ghost', ...props }, ref) => {
438
- const XIcon = useIcon('x')
439
- const el =
440
- slotRender(render, asChild, children) ??
441
- (children === undefined ? (
442
- <Button size="icon-compact" variant={variant} aria-label="Close">
443
- <XIcon />
444
- </Button>
445
- ) : (
446
- <Button size="compact" variant={variant}>
447
- {children}
448
- </Button>
449
- ))
450
- return <ToastPrimitive.Close ref={ref} render={el} {...props} />
451
- },
452
- )
453
- ToastClose.displayName = 'ToastClose'
454
-
455
- interface ToastProps {
456
- /** Where toasts stack; the pill sits on that side and the body opens away from the edge. Defaults to `'top-right'`. */
457
- position?: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'
458
- /** How many toasts show at once; older ones wait. Defaults to `3`. */
459
- limit?: number
460
- /** Ms a toast stays; hovering pauses it. Defaults to `6000`. */
461
- timeout?: number
462
- /** Also renders the toasts this manager shows: pass the global `toast` so `toast()` calls from anywhere land here (mount one such `Toast` per app), or a manager from Base UI's `Toast.createToastManager()`. */
463
- manager?: ToastSource
464
- /** The part of the app that can show toasts, with `Toast.Trigger`s or `useToast()`. Optional: a `Toast` with a `manager` can stand alone. */
465
- children?: ReactNode
466
- }
467
-
468
- /**
469
- * Gooey toasts: a pill with the state's icon and title that melts into a body
470
- * with the details.
471
- *
472
- * Each toast lands as a pill one control tall; when it has a description or
473
- * an action, the pill melts into a body a beat later through the shared goo
474
- * filter (see Morph), and folds back before it leaves, or stays open while
475
- * hovered. Six states (`success`, `loading`, `error`, `warning`, `info`,
476
- * `action`) set the icon and its status color; a promise toast spins as
477
- * `loading` and crossfades into its result. Built on Base UI's Toast:
478
- * timers pause on hover, a swipe toward the edge dismisses, and screen
479
- * readers hear every toast.
480
- *
481
- * `Toast` wraps the part of the app that shows toasts and renders them at
482
- * its `position`. Show one with `Toast.Trigger`, or call `useToast()`
483
- * inside it: `show`, `success`, `error`, `warning`, `info`, `promise`,
484
- * `update` and `close`.
485
- *
486
- * Or mount one `<Toast manager={toast} />` near the root and call the global
487
- * `toast()` from anywhere, inside React or not: `toast({ title, description,
488
- * type, timeout, icon, action, onClose })`, `toast.success`, `.error`,
489
- * `.warning`, `.info`, `.loading`, `.promise`, `.update(id, …)` and
490
- * `.dismiss(id?)`. Each call returns a handle with the toast's `id`,
491
- * `update` and `dismiss`; calls made before the `Toast` mounts wait for it.
492
- * Titles and descriptions take any node, `icon` replaces the state's glyph,
493
- * and `action` is a button (`{ label, onClick }`) or any node.
494
- *
495
- * Statics:
496
- * - `Toast.Action` / `Toast.Close` — a button and a dismiss for a custom
497
- * `action` node (or a description): compact Buttons by default (the close
498
- * an ✕ without children), or `render` / `asChild`.
499
- * - `Toast.Trigger` — a control that shows a toast when pressed:
500
- * `render={<Button/>}` or `asChild`, with the toast's `title`,
501
- * `description`, `type`, `timeout`, `action`, or a `promise` with its
502
- * `success` / `error` toasts.
503
- *
504
- * @example {@include ./examples.mdx}
505
- */
506
- function Toast({ position = 'top-right', limit = 3, timeout = 6000, manager, children }: ToastProps) {
507
- const settings = useMemo(() => ({ position, timeout }), [position, timeout])
508
-
509
- return (
510
- // The provider only ever subscribes to the manager, which is all a `ToastSource` promises.
511
- <ToastPrimitive.Provider limit={limit} timeout={timeout} toastManager={manager as ToastManager | undefined}>
512
- <ToastSettings.Provider value={settings}>
513
- {children}
514
- <ToastPrimitive.Portal>
515
- <ToastPrimitive.Viewport className={cn('fixed z-[60] flex flex-col gap-2 outline-none', VIEWPORT[position])}>
516
- <ToastList />
517
- </ToastPrimitive.Viewport>
518
- </ToastPrimitive.Portal>
519
- </ToastSettings.Provider>
520
- </ToastPrimitive.Provider>
521
- )
522
- }
523
-
524
- Toast.Trigger = ToastTrigger
525
- Toast.Action = ToastAction
526
- Toast.Close = ToastClose
527
-
528
- export type {
529
- ToastActionOptions,
530
- ToastActionProps,
531
- ToastCloseProps,
532
- ToastHandle,
533
- ToastInput,
534
- ToastOptions,
535
- ToastPosition,
536
- ToastPromiseOptions,
537
- ToastProps,
538
- ToastSource,
539
- ToastTriggerProps,
540
- ToastType,
541
- }
542
- export { Toast, ToastAction, ToastClose, ToastTrigger, toast, useToast }
543
-
544
- export default Toast