@justanarthur/modo-ui 0.6.0-canary.8 → 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-4y816hwp.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-t2a3qmy9.js → components-1z6tdadk.js} +24 -40
  91. package/dist/shared/{components-qs4rkqsj.js → components-27nnvrwe.js} +14 -15
  92. package/dist/shared/{components-av5t26rc.js → components-2dxkv6zm.js} +7 -8
  93. package/dist/shared/{components-wqrvqq5p.js → components-2ecg8svx.js} +152 -234
  94. package/dist/shared/{components-3ydr2fqe.js → components-2ph6t61s.js} +34 -37
  95. package/dist/shared/{components-6gk118w3.js → components-39jq9va1.js} +24 -29
  96. package/dist/shared/components-3ky44908.js +9 -0
  97. package/dist/shared/{components-y1qvbawa.js → components-3mkepka5.js} +25 -28
  98. package/dist/shared/{components-xqszvkj4.js → components-4700p9kz.js} +22 -24
  99. package/dist/shared/{components-yhgq0qxx.js → components-59efxjd9.js} +12 -13
  100. package/dist/shared/{components-9j9abkct.js → components-5vgpnxgy.js} +27 -51
  101. package/dist/shared/{components-8tt3xbb5.js → components-5xc2j8jz.js} +18 -19
  102. package/dist/shared/{components-jymmaevv.js → components-6p8tfcd6.js} +29 -57
  103. package/dist/shared/{components-4nck8acq.js → components-7r3etddy.js} +54 -19
  104. package/dist/shared/{components-skfd7kff.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-vkwq2k96.js → components-b3c5et5b.js} +38 -49
  108. package/dist/shared/{components-rrbpmfx4.js → components-c6s6b43g.js} +2 -3
  109. package/dist/shared/{components-pw06rbxq.js → components-chacnk61.js} +19 -19
  110. package/dist/shared/{components-71nbt03m.js → components-cv16mryv.js} +7 -26
  111. package/dist/shared/{components-eqze3y30.js → components-d6xtjht3.js} +30 -35
  112. package/dist/shared/{components-5y5shqfd.js → components-dk0gjr5a.js} +18 -19
  113. package/dist/shared/{components-khspp26b.js → components-fzrq6tr3.js} +34 -37
  114. package/dist/shared/{components-km7fhgbk.js → components-gc5vtq2f.js} +30 -66
  115. package/dist/shared/components-gf5s6ap9.js +42 -0
  116. package/dist/shared/{components-qqcmtrbv.js → components-gz8zf3ec.js} +55 -56
  117. package/dist/shared/{components-mattt5jp.js → components-h2ajmhwn.js} +35 -107
  118. package/dist/shared/{components-awra5sff.js → components-hqeq3w9q.js} +16 -24
  119. package/dist/shared/{components-5tzhqbcw.js → components-hw9yk32z.js} +24 -36
  120. package/dist/shared/components-hyq23phv.js +310 -0
  121. package/dist/shared/{components-8mt5bsv6.js → components-jbbmdr74.js} +22 -41
  122. package/dist/shared/{components-dcc02hs2.js → components-jjw69c4c.js} +4 -7
  123. package/dist/shared/{components-2syq4mwc.js → components-jthe1pwb.js} +420 -139
  124. package/dist/shared/{components-r7q1zm7r.js → components-jwst3vtj.js} +76 -224
  125. package/dist/shared/{components-qdm3yh26.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-6b0zb8z3.js → components-mjthm1kf.js} +9 -13
  129. package/dist/shared/{components-2c64r8c9.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-dyae0y7h.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-8rb25gbe.js → components-rr7a6ja9.js} +27 -59
  136. package/dist/shared/{components-5012r6gr.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-w0xq6q9k.js → components-w1r67ag9.js} +149 -294
  144. package/dist/shared/{components-z0bqtvcp.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-5sxjeh6h.js → components-y9y0g8er.js} +28 -52
  148. package/dist/shared/components-ypp01w3p.js +986 -0
  149. package/dist/shared/{components-t50hrswb.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-124epb7f.js +0 -53
  385. package/dist/shared/components-1kab3j44.js +0 -337
  386. package/dist/shared/components-26snnbs9.js +0 -322
  387. package/dist/shared/components-34txk9rj.js +0 -35
  388. package/dist/shared/components-3h92d94m.js +0 -23
  389. package/dist/shared/components-4vfm04wq.js +0 -82
  390. package/dist/shared/components-54nq988h.js +0 -123
  391. package/dist/shared/components-7s7pykk5.js +0 -281
  392. package/dist/shared/components-7zkhz3r8.js +0 -399
  393. package/dist/shared/components-8v644a0s.js +0 -298
  394. package/dist/shared/components-a4evvq8h.js +0 -271
  395. package/dist/shared/components-adkarj8n.js +0 -35
  396. package/dist/shared/components-b1e239g3.js +0 -28
  397. package/dist/shared/components-b94t6qtj.js +0 -143
  398. package/dist/shared/components-c9yr4ed1.js +0 -44
  399. package/dist/shared/components-cwg1d0w6.js +0 -254
  400. package/dist/shared/components-d3shbwqq.js +0 -95
  401. package/dist/shared/components-dhgk6mbt.js +0 -16
  402. package/dist/shared/components-drxrtnp2.js +0 -25
  403. package/dist/shared/components-ej4r7wmj.js +0 -482
  404. package/dist/shared/components-f7h57m6t.js +0 -59
  405. package/dist/shared/components-fejdzvqc.js +0 -448
  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-mpa2y6x8.js +0 -277
  414. package/dist/shared/components-mrbaxt8q.js +0 -62
  415. package/dist/shared/components-pt5ftm4p.js +0 -38
  416. package/dist/shared/components-rpw4md2b.js +0 -179
  417. package/dist/shared/components-rtadhd9j.js +0 -64
  418. package/dist/shared/components-tz4gaf1v.js +0 -23
  419. package/dist/shared/components-wbbckbw8.js +0 -34
  420. package/dist/shared/components-xdqmt6ed.js +0 -20
  421. package/dist/shared/components-xjkdvnbg.js +0 -107
  422. package/dist/shared/components-z3v0n0de.js +0 -11
  423. package/dist/shared/components-z6dfqtyt.js +0 -1545
  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 -557
  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,59 +0,0 @@
1
- /*
2
- * Local addition (not part of Fluid Functionalism): the docs stage of the
3
- * Popover page's anchored example. A field whose icon opens a panel anchored
4
- * to the whole field, focus moving into the list and back to the text, so
5
- * the example can hold its refs and the picked value.
6
- */
7
-
8
- import { History } from 'lucide-react'
9
- import { useRef, useState } from 'react'
10
- import Button from '../../button'
11
- import Input, { InputAction } from '../../inputs/input'
12
- import Popover from './index'
13
-
14
- const RECENT = ['Quarterly report', 'Invoices from March', 'Design review notes']
15
-
16
- export default function AnchoredDemo() {
17
- const field = useRef<HTMLDivElement | null>(null)
18
- const input = useRef<HTMLInputElement | null>(null)
19
- const first = useRef<HTMLButtonElement | null>(null)
20
- const [value, setValue] = useState('')
21
-
22
- return (
23
- <div ref={field} className="w-80 max-w-full">
24
- <Popover>
25
- <Input
26
- ref={input}
27
- variant="bordered"
28
- placeholder="Search documents"
29
- value={value}
30
- onChange={setValue}
31
- endAdornment={<Popover.Trigger render={<InputAction label="Recent searches" icon={History} />} />}
32
- />
33
- <Popover.Content
34
- anchor={field}
35
- align="start"
36
- sideOffset={8}
37
- // From the keyboard, straight onto the first result; a click leaves the caret in the field.
38
- initialFocus={type => (type === 'keyboard' ? first.current : false)}
39
- finalFocus={input}
40
- className="w-[var(--anchor-width)] max-w-none gap-0 p-1"
41
- >
42
- <Popover.Title className="sr-only">Recent searches</Popover.Title>
43
- {RECENT.map((item, i) => (
44
- <Popover.Close
45
- key={item}
46
- ref={i === 0 ? first : undefined}
47
- render={
48
- <Button variant="ghost" className="w-full justify-start">
49
- {item}
50
- </Button>
51
- }
52
- onClick={() => setValue(item)}
53
- />
54
- ))}
55
- </Popover.Content>
56
- </Popover>
57
- </div>
58
- )
59
- }
@@ -1,203 +0,0 @@
1
- import Popover from './index'
2
- import Button from '../../button'
3
- import { InputGroup } from '../../inputs/input'
4
- import AnchoredDemo from './anchored-demo'
5
-
6
- # Basics
7
-
8
- ## Edit profile
9
-
10
- The panel oozes out of the trigger through a liquid neck, then lets go. Escape or a press outside closes it back into the button.
11
-
12
- <Popover>
13
- <Popover.Trigger render={<Button variant="secondary">Edit profile</Button>} />
14
- <Popover.Content className="w-72 gap-3">
15
- <div className="flex flex-col gap-1">
16
- <Popover.Title>Edit profile</Popover.Title>
17
- <Popover.Description>Update how others see you.</Popover.Description>
18
- </div>
19
- <InputGroup>
20
- <InputGroup.Field index={0} label="Name" placeholder="Ada Lovelace" />
21
- <InputGroup.Field index={1} label="Username" placeholder="@ada" />
22
- </InputGroup>
23
- <div className="flex justify-end">
24
- <Popover.Close render={<Button size="compact">Save</Button>} />
25
- </div>
26
- </Popover.Content>
27
- </Popover>
28
-
29
- ## Hover
30
-
31
- With `openOnHover` the trigger opens it on hover too; a tap still toggles it on touch.
32
-
33
- <Popover>
34
- <Popover.Trigger openOnHover delay={100} closeDelay={120} render={<Button variant="tertiary">Hover me</Button>} />
35
- <Popover.Content>
36
- <Popover.Title>Liquid preview</Popover.Title>
37
- <Popover.Description>Move away and it melts back into the button.</Popover.Description>
38
- </Popover.Content>
39
- </Popover>
40
-
41
- ## Any element as the trigger
42
-
43
- `render` takes any element, and the trigger's children fill it when it has none of its own. Pass `nativeButton={false}` when it isn't a `<button>`: Base UI adds the role and the keyboard handling.
44
-
45
- <Popover>
46
- <Popover.Trigger
47
- nativeButton={false}
48
- render={<span className="cursor-pointer weight-medium text-foreground underline decoration-border underline-offset-4" />}
49
- >
50
- Ada Lovelace
51
- </Popover.Trigger>
52
- <Popover.Content>
53
- <Popover.Title>Ada Lovelace</Popover.Title>
54
- <Popover.Description>Wrote the first published program.</Popover.Description>
55
- </Popover.Content>
56
- </Popover>
57
-
58
- # Placement
59
-
60
- ## Sides
61
-
62
- Each side keeps the neck between trigger and panel; near a viewport edge the panel flips.
63
-
64
- <div className="flex flex-wrap items-center justify-center gap-3">
65
- <Popover>
66
- <Popover.Trigger render={<Button variant="secondary">Top</Button>} />
67
- <Popover.Content side="top">
68
- <Popover.Description>Above the trigger.</Popover.Description>
69
- </Popover.Content>
70
- </Popover>
71
- <Popover>
72
- <Popover.Trigger render={<Button variant="secondary">Right</Button>} />
73
- <Popover.Content side="right">
74
- <Popover.Description>To the right.</Popover.Description>
75
- </Popover.Content>
76
- </Popover>
77
- <Popover>
78
- <Popover.Trigger render={<Button variant="secondary">Bottom</Button>} />
79
- <Popover.Content side="bottom">
80
- <Popover.Description>Below the trigger.</Popover.Description>
81
- </Popover.Content>
82
- </Popover>
83
- <Popover>
84
- <Popover.Trigger render={<Button variant="secondary">Left</Button>} />
85
- <Popover.Content side="left">
86
- <Popover.Description>To the left.</Popover.Description>
87
- </Popover.Content>
88
- </Popover>
89
- </div>
90
-
91
- ## Align
92
-
93
- `align` lines the panel up with the trigger's start edge, its center (the default) or its end edge; the neck stays between them.
94
-
95
- <div className="flex flex-wrap items-center justify-center gap-3">
96
- <Popover>
97
- <Popover.Trigger render={<Button variant="secondary">Start</Button>} />
98
- <Popover.Content align="start">
99
- <Popover.Description>Lined up with the trigger's start edge.</Popover.Description>
100
- </Popover.Content>
101
- </Popover>
102
- <Popover>
103
- <Popover.Trigger render={<Button variant="secondary">Center</Button>} />
104
- <Popover.Content align="center">
105
- <Popover.Description>Centered on the trigger.</Popover.Description>
106
- </Popover.Content>
107
- </Popover>
108
- <Popover>
109
- <Popover.Trigger render={<Button variant="secondary">End</Button>} />
110
- <Popover.Content align="end">
111
- <Popover.Description>Lined up with the trigger's end edge.</Popover.Description>
112
- </Popover.Content>
113
- </Popover>
114
- </div>
115
-
116
- ## Anchored to a field
117
-
118
- `anchor` positions the panel against another element than its trigger, here
119
- the whole field around the icon, and the panel grows out of that box.
120
- `--anchor-width` sizes it to the field. `initialFocus` moves focus to the
121
- first result when it opens from the keyboard and leaves the caret in the field
122
- on a click; `finalFocus` hands focus back to the text, so typing goes on.
123
- `AnchoredDemo` is a docs stage that holds the refs and the picked value:
124
-
125
- ```tsx
126
- const field = useRef(null)
127
- const input = useRef(null)
128
- const first = useRef(null)
129
-
130
- <div ref={field}>
131
- <Popover>
132
- <Input ref={input} endAdornment={<Popover.Trigger render={<InputAction label="Recent searches" icon={History} />} />} />
133
- <Popover.Content
134
- anchor={field}
135
- align="start"
136
- initialFocus={type => (type === 'keyboard' ? first.current : false)}
137
- finalFocus={input}
138
- className="w-[var(--anchor-width)] max-w-none"
139
- >
140
- …
141
- </Popover.Content>
142
- </Popover>
143
- </div>
144
- ```
145
-
146
- <AnchoredDemo />
147
-
148
- # Behavior
149
-
150
- ## Morph
151
-
152
- `effect="morph"` with `hideSource`: the trigger itself grows into the panel and shrinks back, one continuous surface.
153
-
154
- <Popover>
155
- <Popover.Trigger render={<Button variant="secondary">Add note</Button>} />
156
- <Popover.Content effect="morph" hideSource className="w-72 gap-3">
157
- <Popover.Title>Add note</Popover.Title>
158
- <InputGroup>
159
- <InputGroup.Field index={0} label="Note" placeholder="Write something…" />
160
- </InputGroup>
161
- <div className="flex justify-end">
162
- <Popover.Close render={<Button size="compact">Done</Button>} />
163
- </div>
164
- </Popover.Content>
165
- </Popover>
166
-
167
- ## Sources
168
-
169
- `from` changes where the surface starts: the press point grows a circle under the cursor, `center` unfolds the panel in place.
170
-
171
- <div className="flex flex-wrap items-center justify-center gap-3">
172
- <Popover>
173
- <Popover.Trigger render={<Button variant="secondary">From the pointer</Button>} />
174
- <Popover.Content from="pointer">
175
- <Popover.Description>A circle from where you pressed.</Popover.Description>
176
- </Popover.Content>
177
- </Popover>
178
- <Popover>
179
- <Popover.Trigger render={<Button variant="secondary">From its center</Button>} />
180
- <Popover.Content from="center" effect="morph">
181
- <Popover.Description>Unfolds from its own center.</Popover.Description>
182
- </Popover.Content>
183
- </Popover>
184
- </div>
185
-
186
- ## Dismissal
187
-
188
- `onOpenChange` gets Base UI's change details with the open state: `details.reason` says what asked (`'escape-key'`, `'outside-press'`, `'trigger-press'`, `'close-press'`, …) and `details.cancel()` keeps the popover as it is. This one ignores a press outside; Escape or Done close it.
189
-
190
- <Popover
191
- onOpenChange={(open, details) => {
192
- if (!open && details.reason === 'outside-press') details.cancel()
193
- }}
194
- >
195
- <Popover.Trigger render={<Button variant="secondary">Pin a note</Button>} />
196
- <Popover.Content className="w-72 gap-3">
197
- <Popover.Title>Pinned note</Popover.Title>
198
- <Popover.Description>Click around the page: it stays until you close it.</Popover.Description>
199
- <div className="flex justify-end">
200
- <Popover.Close render={<Button size="compact">Done</Button>} />
201
- </div>
202
- </Popover.Content>
203
- </Popover>
@@ -1,317 +0,0 @@
1
- /*
2
- * Local addition (not part of Fluid Functionalism): a morphing popover. The
3
- * panel grows out of its trigger through `lib/use-morph.ts`, with the goo neck
4
- * by default. After beUI's gooey popover (github.com/starc007/ui-components
5
- * `components/motion/popover.tsx` @ de52f337e520e7ee37749b36eb1c32df86137bcb —
6
- * MIT © 2026 Saurabh Chauhan, notice: LICENSE.beui) and motion-primitives'
7
- * morphing popover (github.com/ibelick/motion-primitives
8
- * `components/core/morphing-popover.tsx` @ 120f64f6ca60348e251f929e9c81f11ccbe45eda
9
- * — MIT © 2024 ibelick, notice: LICENSE.motion-primitives). Behavior is Base
10
- * UI's Popover; neither project's own dismissal, gesture or positioning code
11
- * is ported.
12
- */
13
-
14
- import { Popover as PopoverPrimitive } from '@base-ui/react/popover'
15
- import {
16
- type ComponentProps,
17
- createContext,
18
- forwardRef,
19
- type HTMLAttributes,
20
- type ReactNode,
21
- type RefObject,
22
- useContext,
23
- useImperativeHandle,
24
- useMemo,
25
- } from 'react'
26
- import { MorphSurface } from '../../../lib/morph-layers'
27
- import { useShape } from '../../../lib/shape-context'
28
- import { type SlotProps, slotId, slotRender } from '../../../lib/slot'
29
- import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
30
- import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
31
- import { useControllableState } from '../../../lib/use-controllable-state'
32
- import { inPlaceOffset, type MorphOrigin, opensInPlace, useMorph, useMorphOrigin } from '../../../lib/use-morph'
33
- import { cn } from '../../../lib/utils'
34
-
35
- interface PopoverContextValue {
36
- open: boolean
37
- origin: RefObject<MorphOrigin>
38
- }
39
-
40
- const PopoverContext = createContext<PopoverContextValue>({ open: false, origin: { current: {} } })
41
-
42
- interface PopoverTriggerProps extends SlotProps {
43
- /** Open on hover as well as on press (a tap still toggles it on touch). Defaults to `false`. */
44
- openOnHover?: boolean
45
- /** Hover delay before opening, in ms. Needs `openOnHover`. Defaults to `300`. */
46
- delay?: number
47
- /** Delay before closing once the pointer leaves, in ms. Needs `openOnHover`. Defaults to `0`. */
48
- closeDelay?: number
49
- }
50
-
51
- const PopoverTrigger = forwardRef<HTMLButtonElement, PopoverTriggerProps>(
52
- ({ render, asChild, children, ...props }, ref) => {
53
- const el = slotRender(render, asChild, children)
54
- return el ? (
55
- <PopoverPrimitive.Trigger ref={ref} render={el} {...props} id={slotId(el, props.id)} />
56
- ) : (
57
- <PopoverPrimitive.Trigger ref={ref} {...props}>
58
- {children}
59
- </PopoverPrimitive.Trigger>
60
- )
61
- },
62
- )
63
- PopoverTrigger.displayName = 'PopoverTrigger'
64
-
65
- const PopoverClose = forwardRef<HTMLButtonElement, SlotProps>(({ render, asChild, children, ...props }, ref) => {
66
- const el = slotRender(render, asChild, children)
67
- return el ? (
68
- <PopoverPrimitive.Close ref={ref} render={el} {...props} />
69
- ) : (
70
- <PopoverPrimitive.Close ref={ref} {...props}>
71
- {children}
72
- </PopoverPrimitive.Close>
73
- )
74
- })
75
- PopoverClose.displayName = 'PopoverClose'
76
-
77
- type PositionerProps = ComponentProps<typeof PopoverPrimitive.Positioner>
78
- type PopupProps = ComponentProps<typeof PopoverPrimitive.Popup>
79
-
80
- /** What the panel is positioned against: an element, a ref to one, a virtual element (`{ getBoundingClientRect }`), or a function returning either. */
81
- type PopoverAnchor = PositionerProps['anchor']
82
-
83
- /** Resolves an `anchor` to the element the panel grows from; a virtual or missing anchor gives `null`. */
84
- function anchorElement(anchor: PopoverAnchor): HTMLElement | null {
85
- const resolved = typeof anchor === 'function' ? anchor() : anchor
86
- const el = resolved && 'current' in resolved ? resolved.current : resolved
87
- return el instanceof HTMLElement ? el : null
88
- }
89
-
90
- interface PopoverContentProps extends HTMLAttributes<HTMLDivElement> {
91
- /** Side of the anchor the panel opens on; it flips when there is no room. Defaults to `'bottom'`. */
92
- side?: 'top' | 'right' | 'bottom' | 'left'
93
- /** Alignment along that side. Defaults to `'center'`, or `'start'` when the panel opens in place (`effect="morph"` with `hideSource`). */
94
- align?: 'start' | 'center' | 'end'
95
- /** Gap between anchor and panel in px — the length of the goo neck. Ignored when the panel opens in place over its trigger (`effect="morph"` with `hideSource`). Defaults to `12`. */
96
- sideOffset?: number
97
- /** Shift along the aligned edge in px, after `align` (a number, or Base UI's function of side, align and sizes). Defaults to `0`. */
98
- alignOffset?: PositionerProps['alignOffset']
99
- /** What the panel is positioned against instead of the trigger: an element, a ref to one, a virtual element (`{ getBoundingClientRect }`) or a function returning either. An element anchor is also where the panel grows from, and sets `--anchor-width` / `--anchor-height` for sizing the panel to it. Defaults to the trigger. */
100
- anchor?: PopoverAnchor
101
- /** Space kept between the panel and the edge of its collision boundary, in px or per side. Defaults to `5`. */
102
- collisionPadding?: PositionerProps['collisionPadding']
103
- /** The area the panel must stay inside: an element, several, or a rect. Defaults to `'clipping-ancestors'`. */
104
- collisionBoundary?: PositionerProps['collisionBoundary']
105
- /** Where focus goes when the panel 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 panel itself. */
106
- initialFocus?: PopupProps['initialFocus']
107
- /** Where focus goes when the panel closes: a ref, `false` to leave it, `true` for the default, or a function of how it closed. Defaults to the trigger. */
108
- finalFocus?: PopupProps['finalFocus']
109
- /** Where the panel grows from (see Morph): the pressed trigger, the press point, its own center, a viewport edge, or a ref to any element. Defaults to the `anchor` when it is an element, otherwise `'trigger'`. */
110
- from?: 'trigger' | 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
111
- /** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
112
- effect?: 'goo' | 'morph' | 'slide' | 'fade'
113
- /** Hide the trigger while open, so it reads as turning into the panel. Defaults to `false`. */
114
- hideSource?: boolean
115
- /** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'slow'`. */
116
- tier?: 'moderate' | 'slow'
117
- /** Portal target. Defaults to the document body. */
118
- container?: HTMLElement | null
119
- /** Classes for the panel's content box: padding, width, layout. */
120
- className?: string
121
- /** The panel's content. Everything inside reads the popover's surface level as its substrate. */
122
- children?: ReactNode
123
- }
124
-
125
- const PopoverContent = forwardRef<HTMLDivElement, PopoverContentProps>(
126
- (
127
- {
128
- side = 'bottom',
129
- align,
130
- sideOffset = 12,
131
- alignOffset,
132
- anchor,
133
- collisionPadding,
134
- collisionBoundary,
135
- initialFocus,
136
- finalFocus,
137
- from,
138
- effect,
139
- hideSource,
140
- tier,
141
- container,
142
- className,
143
- children,
144
- ...props
145
- },
146
- ref,
147
- ) => {
148
- const { open, origin } = useContext(PopoverContext)
149
- // An element anchor is the morph's source, read as the morph starts (a
150
- // ref fills after this render). A virtual anchor has no box to grow
151
- // from, so the panel grows from the trigger.
152
- const anchorSource = useMemo<RefObject<HTMLElement | null> | undefined>(
153
- () =>
154
- anchor
155
- ? {
156
- get current() {
157
- return anchorElement(anchor) ?? origin.current?.trigger ?? null
158
- },
159
- }
160
- : undefined,
161
- [anchor, origin],
162
- )
163
- const morph = useMorph(open, origin, {
164
- from: from ?? anchorSource,
165
- effect,
166
- hideSource,
167
- tier,
168
- // A custom `finalFocus` places focus itself; the morph's own return
169
- // to the trigger would undo it.
170
- returnFocus: typeof finalFocus === 'boolean' ? finalFocus : finalFocus === undefined,
171
- })
172
- const inPlace = opensInPlace({ effect, hideSource })
173
- useImperativeHandle(ref, () => morph.popup as HTMLDivElement, [morph.popup])
174
- const shape = useShape()
175
- // Fixed shadow, like the dropdown and select menus (see Elevated).
176
- const level = Math.min(useSurface() + 2, 8)
177
-
178
- return (
179
- <PopoverPrimitive.Portal container={container ?? undefined}>
180
- <PopoverPrimitive.Positioner
181
- side={side}
182
- align={align ?? (inPlace ? 'start' : 'center')}
183
- sideOffset={inPlace ? inPlaceOffset : sideOffset}
184
- alignOffset={alignOffset}
185
- anchor={anchor}
186
- collisionPadding={collisionPadding}
187
- collisionBoundary={collisionBoundary}
188
- className="z-50 outline-none"
189
- >
190
- <PopoverPrimitive.Popup
191
- ref={morph.popupRef}
192
- initialFocus={initialFocus}
193
- finalFocus={finalFocus}
194
- className="relative outline-none"
195
- {...props}
196
- >
197
- <SurfaceProvider value={level}>
198
- <MorphSurface
199
- morph={morph}
200
- bg={SURFACE_BG[level]}
201
- shadow={SURFACE_SHADOW[3]}
202
- radius={shape.container}
203
- className={cn('flex w-max max-w-[min(92vw,20rem)] flex-col gap-1 p-4', className)}
204
- >
205
- {children}
206
- </MorphSurface>
207
- </SurfaceProvider>
208
- </PopoverPrimitive.Popup>
209
- </PopoverPrimitive.Positioner>
210
- </PopoverPrimitive.Portal>
211
- )
212
- },
213
- )
214
- PopoverContent.displayName = 'PopoverContent'
215
-
216
- const PopoverTitle = forwardRef<HTMLHeadingElement, HTMLAttributes<HTMLHeadingElement>>(
217
- ({ className, ...props }, ref) => (
218
- <PopoverPrimitive.Title
219
- ref={ref}
220
- className={cn('text-subtitle weight-semibold text-foreground', className)}
221
- {...props}
222
- />
223
- ),
224
- )
225
- PopoverTitle.displayName = 'PopoverTitle'
226
-
227
- const PopoverDescription = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(
228
- ({ className, ...props }, ref) => (
229
- <PopoverPrimitive.Description
230
- ref={ref}
231
- className={cn('text-caption text-muted-foreground', className)}
232
- {...props}
233
- />
234
- ),
235
- )
236
- PopoverDescription.displayName = 'PopoverDescription'
237
-
238
- /** What `onOpenChange` receives besides the open state: Base UI's Popover change details. */
239
- type PopoverOpenChangeDetails = PopoverPrimitive.Root.ChangeEventDetails
240
-
241
- interface PopoverProps {
242
- /** Controlled open state. Pair with `onOpenChange`. */
243
- open?: boolean
244
- /** Initial open state, for an uncontrolled popover. Defaults to `false`. */
245
- defaultOpen?: boolean
246
- /** Called when the popover opens or closes, with Base UI's change details: `reason` (`'escape-key'`, `'outside-press'`, `'trigger-press'`, …), the `event`, and `cancel()` to keep it as it is. */
247
- onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void
248
- /** Trap focus and block page interaction while open. Defaults to `false`. */
249
- modal?: boolean
250
- /** The trigger and the panel — `Popover.Trigger` plus a `Popover.Content`. */
251
- children?: ReactNode
252
- }
253
-
254
- /**
255
- * A panel that oozes out of its trigger: the surface melts out of the button
256
- * through a liquid neck, then lets go and settles beside it.
257
- *
258
- * The morph comes from the shared engine (see Morph), so the panel can grow
259
- * from the trigger (the default), the press point, its own center, a viewport
260
- * edge or any element, with the goo neck, a plain morph, a slide or a fade.
261
- * It closes back into wherever it came from. The panel lifts 2 surface levels
262
- * off its substrate and re-provides that level. Built on Base UI's Popover:
263
- * it opens on press, or on hover too with `openOnHover`; it flips to the
264
- * other side when there is no room; Escape and an outside press close it.
265
- * `onOpenChange` hears why (`details.reason`) and can `details.cancel()` it.
266
- *
267
- * Statics:
268
- * - `Popover.Trigger` — the control that opens it: `render={<Button/>}` or
269
- * `asChild`; `openOnHover`, `delay`, `closeDelay`. Children fill a render
270
- * element that has none of its own (`render={<span/>}` + children), and
271
- * `nativeButton={false}` tells Base UI it isn't a `<button>`.
272
- * - `Popover.Content` — the panel: `side`, `align` (the trigger's `start`,
273
- * `center` or `end`), `sideOffset`, `alignOffset`, `anchor` (position it
274
- * against another element than the trigger, which it then grows from),
275
- * `collisionPadding`, `collisionBoundary`, `initialFocus`, `finalFocus`
276
- * and the morph options `from`, `effect`, `hideSource`, `tier`.
277
- * - `Popover.Title` / `Popover.Description` — its labelled heading and
278
- * supporting line, wired for screen readers.
279
- * - `Popover.Close` — closes it; same `render` / `asChild` shape.
280
- *
281
- * @example {@include ./examples.mdx}
282
- */
283
- function Popover({ open, defaultOpen = false, onOpenChange, modal = false, children }: PopoverProps) {
284
- // The change is reported here, not through the state hook, so the
285
- // handler gets Base UI's details and can cancel it.
286
- const [current, setCurrent] = useControllableState(open, defaultOpen)
287
- const { origin, capture } = useMorphOrigin()
288
- const ctx = useMemo(() => ({ open: current, origin }), [current, origin])
289
-
290
- return (
291
- <PopoverContext.Provider value={ctx}>
292
- <PopoverPrimitive.Root
293
- open={current}
294
- modal={modal}
295
- onOpenChange={(next, details) => {
296
- onOpenChange?.(next, details)
297
- if (details.isCanceled) return
298
- if (next) capture(details)
299
- setCurrent(next)
300
- }}
301
- >
302
- {children}
303
- </PopoverPrimitive.Root>
304
- </PopoverContext.Provider>
305
- )
306
- }
307
-
308
- Popover.Trigger = PopoverTrigger
309
- Popover.Content = PopoverContent
310
- Popover.Title = PopoverTitle
311
- Popover.Description = PopoverDescription
312
- Popover.Close = PopoverClose
313
-
314
- export type { PopoverContentProps, PopoverOpenChangeDetails, PopoverProps, PopoverTriggerProps }
315
- export { Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger }
316
-
317
- export default Popover
@@ -1,61 +0,0 @@
1
- import PreviewCard from './index'
2
-
3
- # Link preview
4
-
5
- Hover the link: after a short delay the card oozes out of it, and the pointer can travel into the card without closing it.
6
-
7
- <p className="max-w-md text-body text-muted-foreground">
8
- This port takes its looks from{' '}
9
- <PreviewCard>
10
- <PreviewCard.Trigger href="https://www.fluidfunctionalism.com">Fluid Functionalism</PreviewCard.Trigger>
11
- <PreviewCard.Content className="w-72">
12
- <div className="flex items-center gap-3">
13
- <span className="flex size-10 shrink-0 items-center justify-center rounded-full bg-accent text-subtitle weight-semibold text-accent-foreground">FF</span>
14
- <div className="flex min-w-0 flex-col gap-0.5">
15
- <span className="text-subtitle weight-semibold text-foreground">Fluid Functionalism</span>
16
- <span className="text-caption text-muted-foreground">fluidfunctionalism.com</span>
17
- </div>
18
- </div>
19
- <p className="text-caption text-muted-foreground">A component registry layering springs, a fluid hover, a size ladder and elevated surfaces over Radix or Base UI.</p>
20
- </PreviewCard.Content>
21
- </PreviewCard>{' '}
22
- and its behavior from Base UI.
23
- </p>
24
-
25
- # Profile
26
-
27
- A mention that previews the person behind it. `delay` shortens the wait before it opens.
28
-
29
- <p className="max-w-md text-body text-muted-foreground">
30
- The first notes on the engine came from{' '}
31
- <PreviewCard>
32
- <PreviewCard.Trigger href="#" delay={200}>@ada</PreviewCard.Trigger>
33
- <PreviewCard.Content side="top" className="w-64">
34
- <div className="flex items-center gap-3">
35
- <span className="flex size-10 shrink-0 items-center justify-center rounded-full bg-brand/15 text-subtitle weight-semibold text-brand">AL</span>
36
- <div className="flex min-w-0 flex-col gap-0.5">
37
- <span className="text-subtitle weight-semibold text-foreground">Ada Lovelace</span>
38
- <span className="text-caption text-muted-foreground">@ada</span>
39
- </div>
40
- </div>
41
- <p className="text-caption text-muted-foreground">Writes programs for engines that do not exist yet.</p>
42
- </PreviewCard.Content>
43
- </PreviewCard>{' '}
44
- before the first commit.
45
- </p>
46
-
47
- # Morph
48
-
49
- `effect="morph"` grows the card out of the link without the liquid neck.
50
-
51
- <p className="max-w-md text-body text-muted-foreground">
52
- Read the{' '}
53
- <PreviewCard>
54
- <PreviewCard.Trigger href="#">morph engine</PreviewCard.Trigger>
55
- <PreviewCard.Content effect="morph" className="w-64">
56
- <span className="text-subtitle weight-semibold text-foreground">Morph</span>
57
- <p className="text-caption text-muted-foreground">One progress value on a spring tier carries the surface from its source to its own box.</p>
58
- </PreviewCard.Content>
59
- </PreviewCard>{' '}
60
- docs for every source and effect.
61
- </p>