@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,204 +0,0 @@
1
- /*
2
- * Local addition (not part of Fluid Functionalism): a hover card that oozes
3
- * out of its link. The card grows out of the trigger through
4
- * `lib/use-morph.ts`, with the goo neck by default, like Popover — after
5
- * beUI's gooey popover (github.com/starc007/ui-components
6
- * `components/motion/popover.tsx` @ de52f337e520e7ee37749b36eb1c32df86137bcb —
7
- * MIT © 2026 Saurabh Chauhan, notice: LICENSE.beui). Behavior is Base UI's
8
- * PreviewCard: hover and focus delays, the safe path into the card, dismissal
9
- * and positioning.
10
- */
11
-
12
- import { PreviewCard as PreviewCardPrimitive } from '@base-ui/react/preview-card'
13
- import {
14
- type AnchorHTMLAttributes,
15
- createContext,
16
- forwardRef,
17
- type HTMLAttributes,
18
- type ReactElement,
19
- type ReactNode,
20
- type RefObject,
21
- useContext,
22
- useImperativeHandle,
23
- useMemo,
24
- } from 'react'
25
- import { MorphSurface } from '../../../lib/morph-layers'
26
- import { useShape } from '../../../lib/shape-context'
27
- import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
28
- import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
29
- import { useControllableState } from '../../../lib/use-controllable-state'
30
- import { inPlaceOffset, type MorphOrigin, opensInPlace, useMorph, useMorphOrigin } from '../../../lib/use-morph'
31
- import { cn } from '../../../lib/utils'
32
-
33
- interface PreviewCardContextValue {
34
- open: boolean
35
- origin: RefObject<MorphOrigin>
36
- }
37
-
38
- const PreviewCardContext = createContext<PreviewCardContextValue>({ open: false, origin: { current: {} } })
39
-
40
- interface PreviewCardTriggerProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
41
- /** Hover delay before the card opens, in ms. Defaults to `600`. */
42
- delay?: number
43
- /** Delay before the card closes once the pointer leaves, in ms. Defaults to `300`. */
44
- closeDelay?: number
45
- /** The element that becomes the trigger instead of the default link, e.g. an avatar; it brings its own styling. */
46
- render?: ReactElement
47
- /** Extra classes for the link. */
48
- className?: string
49
- /** The link's content. */
50
- children?: ReactNode
51
- }
52
-
53
- const PreviewCardTrigger = forwardRef<HTMLAnchorElement, PreviewCardTriggerProps>(
54
- ({ render, className, ...props }, ref) => (
55
- <PreviewCardPrimitive.Trigger
56
- ref={ref}
57
- render={render}
58
- className={cn(
59
- !render &&
60
- 'weight-medium text-foreground underline decoration-border underline-offset-4 transition-colors duration-fast hover:decoration-foreground',
61
- className,
62
- )}
63
- {...props}
64
- />
65
- ),
66
- )
67
- PreviewCardTrigger.displayName = 'PreviewCardTrigger'
68
-
69
- interface PreviewCardContentProps extends HTMLAttributes<HTMLDivElement> {
70
- /** Side of the link the card opens on; it flips when there is no room. Defaults to `'bottom'`. */
71
- side?: 'top' | 'right' | 'bottom' | 'left'
72
- /** Alignment along that side. Defaults to `'center'`, or `'start'` when the card opens in place (`effect="morph"` with `hideSource`). */
73
- align?: 'start' | 'center' | 'end'
74
- /** Gap between link and card in px — the length of the goo neck. Ignored when the card opens in place over its link (`effect="morph"` with `hideSource`). Defaults to `12`. */
75
- sideOffset?: number
76
- /** Where the card grows from (see Morph): the hovered link, its own center, a viewport edge, or a ref to any element. Defaults to `'trigger'`. */
77
- from?: 'trigger' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
78
- /** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
79
- effect?: 'goo' | 'morph' | 'slide' | 'fade'
80
- /** Hide the link while open, so it reads as turning into the card. Defaults to `false`. */
81
- hideSource?: boolean
82
- /** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'slow'`. */
83
- tier?: 'moderate' | 'slow'
84
- /** Portal target. Defaults to the document body. */
85
- container?: HTMLElement | null
86
- /** Classes for the card's content box: padding, width, layout. */
87
- className?: string
88
- /** The card's content. Everything inside reads the card's surface level as its substrate. */
89
- children?: ReactNode
90
- }
91
-
92
- const PreviewCardContent = forwardRef<HTMLDivElement, PreviewCardContentProps>(
93
- (
94
- {
95
- side = 'bottom',
96
- align,
97
- sideOffset = 12,
98
- from,
99
- effect,
100
- hideSource,
101
- tier,
102
- container,
103
- className,
104
- children,
105
- ...props
106
- },
107
- ref,
108
- ) => {
109
- const { open, origin } = useContext(PreviewCardContext)
110
- const morph = useMorph(open, origin, { from, effect, hideSource, tier })
111
- const inPlace = opensInPlace({ effect, hideSource })
112
- useImperativeHandle(ref, () => morph.popup as HTMLDivElement, [morph.popup])
113
- const shape = useShape()
114
- // Fixed shadow, like Popover (see Elevated).
115
- const level = Math.min(useSurface() + 2, 8)
116
-
117
- return (
118
- <PreviewCardPrimitive.Portal container={container ?? undefined}>
119
- <PreviewCardPrimitive.Positioner
120
- side={side}
121
- align={align ?? (inPlace ? 'start' : 'center')}
122
- sideOffset={inPlace ? inPlaceOffset : sideOffset}
123
- className="z-50 outline-none"
124
- >
125
- <PreviewCardPrimitive.Popup ref={morph.popupRef} className="relative outline-none" {...props}>
126
- <SurfaceProvider value={level}>
127
- <MorphSurface
128
- morph={morph}
129
- bg={SURFACE_BG[level]}
130
- shadow={SURFACE_SHADOW[3]}
131
- radius={shape.container}
132
- className={cn('flex w-max max-w-[min(92vw,20rem)] flex-col gap-3 p-4', className)}
133
- >
134
- {children}
135
- </MorphSurface>
136
- </SurfaceProvider>
137
- </PreviewCardPrimitive.Popup>
138
- </PreviewCardPrimitive.Positioner>
139
- </PreviewCardPrimitive.Portal>
140
- )
141
- },
142
- )
143
- PreviewCardContent.displayName = 'PreviewCardContent'
144
-
145
- interface PreviewCardProps {
146
- /** Controlled open state. Pair with `onOpenChange`. */
147
- open?: boolean
148
- /** Initial open state, for an uncontrolled card. Defaults to `false`. */
149
- defaultOpen?: boolean
150
- /** Called when the card opens or closes. */
151
- onOpenChange?: (open: boolean) => void
152
- /** The link and the card — `PreviewCard.Trigger` plus a `PreviewCard.Content`. */
153
- children?: ReactNode
154
- }
155
-
156
- /**
157
- * A card that oozes out of a link on hover: a preview of what is behind it,
158
- * melting out of the link through a liquid neck.
159
- *
160
- * The morph comes from the shared engine (see Morph), so the card can grow
161
- * from the link (the default), its own center, a viewport edge or any
162
- * element, with the goo neck, a plain morph, a slide or a fade, and closes
163
- * back into wherever it came from. The card lifts 2 surface levels off its
164
- * substrate and re-provides that level. Built on Base UI's PreviewCard: it
165
- * opens after a hover or focus delay, stays open while the pointer travels
166
- * into it, flips to the other side when there is no room, and closes on
167
- * leave, Escape or an outside press. The card is a visual extra that touch
168
- * and screen-reader users never get, so the link must make sense on its own.
169
- *
170
- * Statics:
171
- * - `PreviewCard.Trigger` — the link: `href`, `delay`, `closeDelay`, or
172
- * `render` for another element.
173
- * - `PreviewCard.Content` — the card: `side`, `align`, `sideOffset` and the
174
- * morph options `from`, `effect`, `hideSource`, `tier`.
175
- *
176
- * @example {@include ./examples.mdx}
177
- */
178
- function PreviewCard({ open, defaultOpen = false, onOpenChange, children }: PreviewCardProps) {
179
- const [current, setCurrent] = useControllableState(open, defaultOpen, onOpenChange)
180
- const { origin, capture } = useMorphOrigin()
181
- const ctx = useMemo(() => ({ open: current, origin }), [current, origin])
182
-
183
- return (
184
- <PreviewCardContext.Provider value={ctx}>
185
- <PreviewCardPrimitive.Root
186
- open={current}
187
- onOpenChange={(next, details) => {
188
- if (next) capture(details)
189
- setCurrent(next)
190
- }}
191
- >
192
- {children}
193
- </PreviewCardPrimitive.Root>
194
- </PreviewCardContext.Provider>
195
- )
196
- }
197
-
198
- PreviewCard.Trigger = PreviewCardTrigger
199
- PreviewCard.Content = PreviewCardContent
200
-
201
- export type { PreviewCardContentProps, PreviewCardProps, PreviewCardTriggerProps }
202
- export { PreviewCard, PreviewCardContent, PreviewCardTrigger }
203
-
204
- export default PreviewCard
@@ -1,101 +0,0 @@
1
- import Sheet from './index'
2
- import Button from '../../button'
3
-
4
- # Bottom sheet
5
-
6
- The sheet oozes up out of the bottom edge. Swipe it back down, press outside or hit Escape to send it back.
7
-
8
- <Sheet>
9
- <Sheet.Trigger render={<Button variant="secondary">Open sheet</Button>} />
10
- <Sheet.Content>
11
- <Sheet.Header>
12
- <Sheet.Title>Share project</Sheet.Title>
13
- <Sheet.Description>Anyone with the link can view it.</Sheet.Description>
14
- </Sheet.Header>
15
- <Sheet.Footer>
16
- <Sheet.Close render={<Button variant="ghost">Cancel</Button>} />
17
- <Sheet.Close render={<Button>Copy link</Button>} />
18
- </Sheet.Footer>
19
- </Sheet.Content>
20
- </Sheet>
21
-
22
- # Sides
23
-
24
- `side` attaches the sheet to any edge; it grows from that edge and is swiped back toward it.
25
-
26
- <div className="flex flex-wrap items-center justify-center gap-3">
27
- <Sheet side="right">
28
- <Sheet.Trigger render={<Button variant="secondary">Right</Button>} />
29
- <Sheet.Content>
30
- <Sheet.Title>Filters</Sheet.Title>
31
- <Sheet.Description>A side sheet takes the full height and caps its width.</Sheet.Description>
32
- </Sheet.Content>
33
- </Sheet>
34
- <Sheet side="left">
35
- <Sheet.Trigger render={<Button variant="secondary">Left</Button>} />
36
- <Sheet.Content>
37
- <Sheet.Title>Navigation</Sheet.Title>
38
- <Sheet.Description>Swipe left to dismiss.</Sheet.Description>
39
- </Sheet.Content>
40
- </Sheet>
41
- <Sheet side="top">
42
- <Sheet.Trigger render={<Button variant="secondary">Top</Button>} />
43
- <Sheet.Content>
44
- <Sheet.Title>Announcement</Sheet.Title>
45
- <Sheet.Description>Swipe up to dismiss.</Sheet.Description>
46
- </Sheet.Content>
47
- </Sheet>
48
- </div>
49
-
50
- # Side and width on the content
51
-
52
- The Radix shape works too: `side` on `Sheet.Content` overrides the root's, and the swipe follows it. `popupClassName` sizes the sheet's box past its default width.
53
-
54
- <Sheet>
55
- <Sheet.Trigger render={<Button variant="secondary">Wide left sheet</Button>} />
56
- <Sheet.Content side="left" popupClassName="w-[min(32rem,calc(100%-1rem))]">
57
- <Sheet.Title>Activity</Sheet.Title>
58
- <Sheet.Description>A wider panel for a longer read.</Sheet.Description>
59
- </Sheet.Content>
60
- </Sheet>
61
-
62
- # From the trigger
63
-
64
- `from="trigger"` grows the sheet out of the button instead of the edge; once open it behaves like any sheet.
65
-
66
- <Sheet>
67
- <Sheet.Trigger render={<Button variant="secondary">From the button</Button>} />
68
- <Sheet.Content from="trigger">
69
- <Sheet.Title>From the button</Sheet.Title>
70
- <Sheet.Description>The surface melts out of the trigger and settles at the bottom edge.</Sheet.Description>
71
- </Sheet.Content>
72
- </Sheet>
73
-
74
- # Snap points
75
-
76
- A top or bottom sheet can rest at `snapPoints`: here 40% of the window, then nearly all of it. Drag the handle between them.
77
-
78
- <Sheet snapPoints={[0.4, 0.9]}>
79
- <Sheet.Trigger render={<Button variant="secondary">Open with snap points</Button>} />
80
- <Sheet.Content className="min-h-[90dvh]">
81
- <Sheet.Title>Two heights</Sheet.Title>
82
- <Sheet.Description>Swipe up to expand, down to fold back or dismiss.</Sheet.Description>
83
- </Sheet.Content>
84
- </Sheet>
85
-
86
- # Indent
87
-
88
- Wrap the page in `Sheet.Indent` under a `Sheet.Provider` and it eases back while a sheet is open.
89
-
90
- <Sheet.Provider>
91
- <Sheet.Indent className="flex w-full flex-col items-center gap-3 rounded-xl bg-surface-2 p-8">
92
- <span className="text-caption text-muted-foreground">The page behind the sheet</span>
93
- <Sheet>
94
- <Sheet.Trigger render={<Button variant="secondary">Open sheet</Button>} />
95
- <Sheet.Content>
96
- <Sheet.Title>On top of the page</Sheet.Title>
97
- <Sheet.Description>The page scales back a little while this is open.</Sheet.Description>
98
- </Sheet.Content>
99
- </Sheet>
100
- </Sheet.Indent>
101
- </Sheet.Provider>
@@ -1,307 +0,0 @@
1
- /*
2
- * Local addition (not part of Fluid Functionalism): a sheet attached to an edge
3
- * of the window. Base UI's Drawer owns the behavior (swipe to dismiss, snap
4
- * points, focus, scroll lock); the panel grows through the shared morph layer
5
- * (`lib/use-morph.ts`), from its own edge with the goo neck by default, and a
6
- * swipe that dismisses it slides it on off its edge (the morph's `exit`). Its
7
- * title, description, close and trigger are Dialog's parts, which Base UI
8
- * shares with the Drawer. Replaces beUI's bottom sheet and drawer
9
- * (github.com/starc007/ui-components @ de52f337e520e7ee37749b36eb1c32df86137bcb
10
- * — MIT © 2026 Saurabh Chauhan, notice: LICENSE.beui) without porting their
11
- * drag, snap or focus code.
12
- */
13
-
14
- import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer'
15
- import { motion } from 'motion/react'
16
- import {
17
- type ComponentProps,
18
- createContext,
19
- forwardRef,
20
- type HTMLAttributes,
21
- type ReactNode,
22
- type RefObject,
23
- useContext,
24
- useImperativeHandle,
25
- useLayoutEffect,
26
- useState,
27
- } from 'react'
28
- import { MorphSurface } from '../../../lib/morph-layers'
29
- import { useShape } from '../../../lib/shape-context'
30
- import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
31
- import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
32
- import { useMorph } from '../../../lib/use-morph'
33
- import { cn } from '../../../lib/utils'
34
- import {
35
- DialogClose,
36
- DialogDescription,
37
- DialogFooter,
38
- DialogHeader,
39
- DialogState,
40
- DialogTitle,
41
- DialogTrigger,
42
- useDialogState,
43
- } from '../dialog'
44
-
45
- type SheetSide = 'top' | 'right' | 'bottom' | 'left'
46
-
47
- interface SheetContextValue {
48
- side: SheetSide
49
- swiped: boolean
50
- /** A `Sheet.Content` `side` overriding the root's, so the swipe follows it. */
51
- setContentSide: (side: SheetSide | undefined) => void
52
- }
53
-
54
- /** The sheet's edge, and whether its last close was a swipe. */
55
- const SheetContext = createContext<SheetContextValue>({ side: 'bottom', swiped: false, setContentSide: () => {} })
56
-
57
- const SWIPE: Record<SheetSide, 'up' | 'right' | 'down' | 'left'> = {
58
- top: 'up',
59
- right: 'right',
60
- bottom: 'down',
61
- left: 'left',
62
- }
63
-
64
- const PLACEMENT: Record<SheetSide, string> = {
65
- top: 'inset-x-2 top-2 mx-auto max-w-[36rem] max-h-[calc(100dvh-4rem)]',
66
- bottom: 'inset-x-2 bottom-2 mx-auto max-w-[36rem] max-h-[calc(100dvh-4rem)]',
67
- left: 'inset-y-2 left-2 w-[min(24rem,calc(100%-1rem))]',
68
- right: 'inset-y-2 right-2 w-[min(24rem,calc(100%-1rem))]',
69
- }
70
-
71
- const DRAWER_OFFSET = 4
72
-
73
- // Literal per shape so the class extractor sees each one.
74
- const INDENT_RADIUS = { pill: 'data-[active]:rounded-3xl', rounded: 'data-[active]:rounded-xl' }
75
-
76
- interface SheetContentProps extends HTMLAttributes<HTMLDivElement> {
77
- /** Where the sheet grows from (see Morph): its own edge, the pressed trigger, the press point, its center, another edge, or a ref to any element. Defaults to the sheet's `side`. */
78
- from?: 'trigger' | 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
79
- /** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
80
- effect?: 'goo' | 'morph' | 'slide' | 'fade'
81
- /** Hide the trigger while open, so it reads as turning into the sheet. Defaults to `false`. */
82
- hideSource?: boolean
83
- /** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'slow'`. */
84
- tier?: 'moderate' | 'slow'
85
- /** Portal target. Defaults to the document body. */
86
- container?: HTMLElement | null
87
- /** The edge the sheet is attached to, overriding the root's `side` (the Radix shape); the swipe follows it. Defaults to the `Sheet`'s `side`. */
88
- side?: SheetSide
89
- /** Where focus goes when the sheet opens: a ref, `false` to leave it, `true` for the default, or a function of how it opened (`'mouse'`, `'touch'`, `'pen'`, `'keyboard'`). Defaults to the first tabbable element in the panel. */
90
- initialFocus?: DrawerPopupProps['initialFocus']
91
- /** Where focus goes when the sheet closes: a ref, `false` to leave it, `true` for the default, or a function of how it closed. Defaults to the trigger. */
92
- finalFocus?: DrawerPopupProps['finalFocus']
93
- /** Classes for the positioned popup box, merged after its placement (`max-w-[36rem]` on top and bottom, `w-[min(24rem,calc(100%-1rem))]` on the sides), so a width class resizes the sheet. */
94
- popupClassName?: string
95
- /** Classes for the sheet's content box: padding, layout. */
96
- className?: string
97
- /** The sheet's content. Everything inside reads the sheet's surface level as its substrate. */
98
- children?: ReactNode
99
- }
100
-
101
- type DrawerPopupProps = ComponentProps<typeof DrawerPrimitive.Popup>
102
-
103
- const SheetContent = forwardRef<HTMLDivElement, SheetContentProps>(
104
- (
105
- {
106
- from,
107
- effect,
108
- hideSource,
109
- tier,
110
- container,
111
- side: sideProp,
112
- initialFocus,
113
- finalFocus,
114
- popupClassName,
115
- className,
116
- children,
117
- ...props
118
- },
119
- ref,
120
- ) => {
121
- const { side: rootSide, swiped, setContentSide } = useContext(SheetContext)
122
- const side = sideProp ?? rootSide
123
- // Hand the root the content's edge so the swipe direction follows it.
124
- useLayoutEffect(() => {
125
- if (!sideProp) return
126
- setContentSide(sideProp)
127
- return () => setContentSide(undefined)
128
- }, [sideProp, setContentSide])
129
- const { open, origin } = useDialogState()
130
- const morph = useMorph(open, origin, {
131
- from: from ?? side,
132
- effect,
133
- hideSource,
134
- tier,
135
- exit: swiped ? { effect: 'slide', from: side } : undefined,
136
- // A custom `finalFocus` places focus itself; the morph's own return
137
- // to the trigger would undo it.
138
- returnFocus: typeof finalFocus === 'boolean' ? finalFocus : finalFocus === undefined,
139
- })
140
- useImperativeHandle(ref, () => morph.popup as HTMLDivElement, [morph.popup])
141
- const shape = useShape()
142
- const level = Math.min(useSurface() + DRAWER_OFFSET, 8)
143
- const edge = side === 'top' || side === 'bottom'
144
-
145
- return (
146
- <DrawerPrimitive.Portal container={container ?? undefined}>
147
- <DrawerPrimitive.Backdrop
148
- render={<motion.div style={{ opacity: morph.progress }} />}
149
- className={cn(container ? 'absolute' : 'fixed', 'inset-0 z-50 bg-scrim')}
150
- />
151
- {/* The viewport carries Base UI's swipe handling; the popup sits in it. */}
152
- <DrawerPrimitive.Viewport className={cn(container ? 'absolute' : 'fixed', 'inset-0 z-50')}>
153
- <DrawerPrimitive.Popup
154
- ref={morph.popupRef}
155
- {...props}
156
- initialFocus={initialFocus}
157
- finalFocus={finalFocus}
158
- className={cn(
159
- 'absolute flex flex-col focus:outline-none',
160
- PLACEMENT[side],
161
- // Follows the finger through Base UI's swipe variables (the snap
162
- // offset only moves top and bottom sheets) and springs back on
163
- // release; Base UI drops the transition while a swipe is live.
164
- '[transform:translate(var(--drawer-swipe-movement-x),calc(var(--drawer-snap-point-offset)_+_var(--drawer-swipe-movement-y)))]',
165
- 'transition-[transform] duration-slow',
166
- popupClassName,
167
- )}
168
- >
169
- <SurfaceProvider value={level}>
170
- <MorphSurface
171
- morph={morph}
172
- bg={SURFACE_BG[level]}
173
- shadow={SURFACE_SHADOW[level]}
174
- radius={shape.container}
175
- className={cn('flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-6', edge && 'pt-3', className)}
176
- >
177
- {edge && <div aria-hidden className="mx-auto h-1 w-10 shrink-0 rounded-full bg-overlay/16" />}
178
- {children}
179
- </MorphSurface>
180
- </SurfaceProvider>
181
- </DrawerPrimitive.Popup>
182
- </DrawerPrimitive.Viewport>
183
- </DrawerPrimitive.Portal>
184
- )
185
- },
186
- )
187
- SheetContent.displayName = 'SheetContent'
188
-
189
- const SheetIndent = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => {
190
- const shape = useShape()
191
- return (
192
- <DrawerPrimitive.Indent
193
- ref={ref}
194
- className={cn(
195
- 'origin-top transition-[transform] duration-slow data-[active]:scale-[0.96] data-[active]:overflow-hidden',
196
- INDENT_RADIUS[shape.variant],
197
- className,
198
- )}
199
- {...props}
200
- />
201
- )
202
- })
203
- SheetIndent.displayName = 'SheetIndent'
204
-
205
- /** What `onOpenChange` receives besides the open state: Base UI's Drawer change details. */
206
- type SheetOpenChangeDetails = DrawerPrimitive.Root.ChangeEventDetails
207
-
208
- interface SheetProps {
209
- /** Controlled open state. */
210
- open?: boolean
211
- /** Initial open state, for an uncontrolled sheet. Defaults to `false`. */
212
- defaultOpen?: boolean
213
- /** Called when the sheet opens or closes, including by a swipe, with Base UI's change details: `reason` (`'swipe'`, `'escape-key'`, `'outside-press'`, …), the `event`, and `cancel()` to keep it as it is. */
214
- onOpenChange?: (open: boolean, details: SheetOpenChangeDetails) => void
215
- /** The edge the sheet is attached to; a swipe back toward it dismisses it. A `Sheet.Content` `side` overrides it. Defaults to `'bottom'`. */
216
- side?: 'top' | 'right' | 'bottom' | 'left'
217
- /** Snap points for a top or bottom sheet: fractions of the viewport height (0–1), pixels, or `px` / `rem` strings. */
218
- snapPoints?: (number | string)[]
219
- /** The snap point an uncontrolled sheet opens at. Defaults to the first one. */
220
- defaultSnapPoint?: number | string
221
- /** Traps focus and locks page scroll while open. Defaults to `true`. */
222
- modal?: boolean
223
- /** Ignore presses outside the sheet: only Escape, a swipe and its own closes dismiss it. Defaults to `false`. */
224
- disablePointerDismissal?: boolean
225
- /** The trigger and the content — `Sheet.Trigger` plus a `Sheet.Content`. */
226
- children?: ReactNode
227
- }
228
-
229
- /**
230
- * A panel attached to an edge of the window, swiped away to dismiss.
231
- *
232
- * The sheet grows out of its own edge with the goo neck by default (see
233
- * Morph), or from its trigger, the press point or any element, and closes
234
- * back the same way. Base UI's Drawer does the rest: a swipe back toward the
235
- * edge dismisses it (it slides on off the edge from where the finger let
236
- * go), top and bottom sheets can rest at `snapPoints`, and
237
- * focus and scroll are held while it is open. It floats a spacing step off
238
- * its edge and lifts 4 surface levels off its substrate, like a dialog; top
239
- * and bottom sheets show a handle. `onOpenChange` hears why
240
- * (`details.reason`, `'swipe'` included) and can `details.cancel()` it.
241
- *
242
- * Statics:
243
- * - `Sheet.Trigger`, `Sheet.Header`, `Sheet.Footer`, `Sheet.Title`,
244
- * `Sheet.Description`, `Sheet.Close` — Dialog's parts, which work the same
245
- * here.
246
- * - `Sheet.Content` — the panel: `side` (overrides the root's),
247
- * `initialFocus`, `finalFocus`, `popupClassName` (sizes the popup box),
248
- * and the morph options `from`, `effect`,
249
- * `hideSource`, `tier`.
250
- * - `Sheet.Provider` / `Sheet.Indent` — wrap the page in an `Indent` under a
251
- * `Provider` and it eases back while any sheet inside is open.
252
- *
253
- * @example {@include ./examples.mdx}
254
- */
255
- function Sheet({
256
- children,
257
- open,
258
- defaultOpen,
259
- onOpenChange,
260
- side = 'bottom',
261
- snapPoints,
262
- defaultSnapPoint,
263
- modal = true,
264
- disablePointerDismissal,
265
- }: SheetProps) {
266
- const [swiped, setSwiped] = useState(false)
267
- const [contentSide, setContentSide] = useState<SheetSide>()
268
- const edge = contentSide ?? side
269
-
270
- return (
271
- <SheetContext.Provider value={{ side: edge, swiped, setContentSide }}>
272
- <DialogState open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>
273
- {root => (
274
- <DrawerPrimitive.Root
275
- open={root.open}
276
- onOpenChange={(next, details) => {
277
- root.onOpenChange(next, details)
278
- if (!details.isCanceled) setSwiped(!next && details.reason === 'swipe')
279
- }}
280
- swipeDirection={SWIPE[edge]}
281
- snapPoints={snapPoints}
282
- defaultSnapPoint={defaultSnapPoint}
283
- modal={modal}
284
- disablePointerDismissal={disablePointerDismissal}
285
- >
286
- {children}
287
- </DrawerPrimitive.Root>
288
- )}
289
- </DialogState>
290
- </SheetContext.Provider>
291
- )
292
- }
293
-
294
- Sheet.Trigger = DialogTrigger
295
- Sheet.Content = SheetContent
296
- Sheet.Header = DialogHeader
297
- Sheet.Footer = DialogFooter
298
- Sheet.Title = DialogTitle
299
- Sheet.Description = DialogDescription
300
- Sheet.Close = DialogClose
301
- Sheet.Provider = DrawerPrimitive.Provider
302
- Sheet.Indent = SheetIndent
303
-
304
- export type { SheetContentProps, SheetOpenChangeDetails, SheetProps, SheetSide }
305
- export { Sheet, SheetContent, SheetIndent }
306
-
307
- export default Sheet