@justanarthur/modo-ui 0.5.0 → 0.6.0-canary.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 (461) hide show
  1. package/DESIGN.md +608 -0
  2. package/README.md +61 -39
  3. package/blocks/sidebar-app/examples.mdx +33 -0
  4. package/blocks/sidebar-app/index.tsx +218 -0
  5. package/blocks/sidebar-app/inset-topbar.tsx +25 -0
  6. package/blocks/sidebar-app/menu-grid.ts +26 -0
  7. package/blocks/sidebar-app/nav-data.ts +36 -0
  8. package/blocks/sidebar-app/search-field.tsx +48 -0
  9. package/blocks/sidebar-app/user-footer.tsx +67 -0
  10. package/blocks/sidebar-app/workspace-header.tsx +129 -0
  11. package/components/AI/input-message/examples.mdx +124 -0
  12. package/components/AI/input-message/file-thumbnail.tsx +173 -0
  13. package/components/AI/input-message/index.tsx +1383 -0
  14. package/components/AI/thinking-indicator/examples.mdx +27 -0
  15. package/components/AI/thinking-indicator/index.tsx +210 -0
  16. package/components/accordion/examples.mdx +148 -0
  17. package/components/accordion/index.tsx +1034 -0
  18. package/components/avatar/examples.mdx +95 -0
  19. package/components/avatar/index.tsx +129 -0
  20. package/components/badge/change-demo.tsx +29 -0
  21. package/components/badge/examples.mdx +120 -0
  22. package/components/badge/index.tsx +225 -0
  23. package/components/badge/variants.ts +73 -0
  24. package/components/button/examples.mdx +164 -0
  25. package/components/button/index.tsx +416 -0
  26. package/components/button/loading-demo.tsx +25 -0
  27. package/components/button/variants.ts +166 -0
  28. package/components/card/examples.mdx +212 -0
  29. package/components/card/index.tsx +1037 -0
  30. package/components/copy/examples.mdx +87 -0
  31. package/components/copy/index.tsx +482 -0
  32. package/components/inputs/checkbox/examples.mdx +83 -0
  33. package/components/inputs/checkbox/index.tsx +611 -0
  34. package/components/inputs/checkbox/select-all-demo.tsx +48 -0
  35. package/components/inputs/color-picker/examples.mdx +72 -0
  36. package/components/inputs/color-picker/index.tsx +1955 -0
  37. package/components/inputs/color-picker/variants.ts +401 -0
  38. package/components/inputs/combobox/examples.mdx +273 -0
  39. package/components/inputs/combobox/index.tsx +1436 -0
  40. package/components/inputs/combobox/remote-demo.tsx +101 -0
  41. package/components/inputs/date-time/calendar/examples.mdx +34 -0
  42. package/components/inputs/date-time/calendar/index.tsx +351 -0
  43. package/components/inputs/date-time/calendar/use-month-window.ts +163 -0
  44. package/components/inputs/date-time/date-picker/examples.mdx +166 -0
  45. package/components/inputs/date-time/date-picker/index.tsx +385 -0
  46. package/components/inputs/date-time/date-picker/masked-date-input.tsx +336 -0
  47. package/components/inputs/date-time/date-range-picker/examples.mdx +29 -0
  48. package/components/inputs/date-time/date-range-picker/index.tsx +217 -0
  49. package/components/inputs/date-time/duration-picker/examples.mdx +16 -0
  50. package/components/inputs/date-time/duration-picker/index.tsx +189 -0
  51. package/components/inputs/date-time/month-picker/examples.mdx +16 -0
  52. package/components/inputs/date-time/month-picker/index.tsx +190 -0
  53. package/components/inputs/date-time/picker-shell.tsx +395 -0
  54. package/components/inputs/date-time/time-columns.tsx +91 -0
  55. package/components/inputs/date-time/time-picker/examples.mdx +26 -0
  56. package/components/inputs/date-time/time-picker/index.tsx +166 -0
  57. package/components/inputs/field/examples.mdx +113 -0
  58. package/components/inputs/field/index.tsx +267 -0
  59. package/components/inputs/file-dropzone/examples.mdx +73 -0
  60. package/components/inputs/file-dropzone/file-row.tsx +201 -0
  61. package/components/inputs/file-dropzone/index.tsx +296 -0
  62. package/components/inputs/file-dropzone/upload-demo.tsx +67 -0
  63. package/components/inputs/file-dropzone/variants.ts +94 -0
  64. package/components/inputs/input/examples.mdx +135 -0
  65. package/components/inputs/input/index.tsx +494 -0
  66. package/components/inputs/input/password-demo.tsx +30 -0
  67. package/components/inputs/label/examples.mdx +67 -0
  68. package/components/inputs/label/index.tsx +85 -0
  69. package/components/inputs/number-input/examples.mdx +56 -0
  70. package/components/inputs/number-input/index.tsx +214 -0
  71. package/components/inputs/radio/examples.mdx +77 -0
  72. package/components/inputs/radio/index.tsx +636 -0
  73. package/components/inputs/search/examples.mdx +74 -0
  74. package/components/inputs/search/index.tsx +333 -0
  75. package/components/inputs/select/examples.mdx +218 -0
  76. package/components/inputs/select/index.tsx +862 -0
  77. package/components/inputs/select/variants.ts +32 -0
  78. package/components/inputs/slider/examples.mdx +127 -0
  79. package/components/inputs/slider/index.tsx +1725 -0
  80. package/components/inputs/switch/examples.mdx +94 -0
  81. package/components/inputs/switch/index.tsx +504 -0
  82. package/components/inputs/textarea/examples.mdx +88 -0
  83. package/components/inputs/textarea/index.tsx +161 -0
  84. package/components/navigation/navigation-menu/examples.mdx +109 -0
  85. package/components/navigation/navigation-menu/index.tsx +613 -0
  86. package/components/navigation/pagination/examples.mdx +64 -0
  87. package/components/navigation/pagination/index.tsx +395 -0
  88. package/components/navigation/sidebar/examples.mdx +319 -0
  89. package/components/navigation/sidebar/index.tsx +453 -0
  90. package/components/navigation/sidebar/sidebar-core.tsx +1408 -0
  91. package/components/navigation/sidebar/sidebar-menu.tsx +1495 -0
  92. package/components/navigation/sidebar/sidebar.css +74 -0
  93. package/components/navigation/sidebar/variants.ts +55 -0
  94. package/components/navigation/tabs/examples.mdx +89 -0
  95. package/components/navigation/tabs/index.tsx +494 -0
  96. package/components/navigation/tabs-subtle/examples.mdx +49 -0
  97. package/components/navigation/tabs-subtle/index.tsx +512 -0
  98. package/components/overlays/alert-dialog/examples.mdx +123 -0
  99. package/components/overlays/alert-dialog/index.tsx +258 -0
  100. package/components/overlays/alert-dialog/pending-demo.tsx +36 -0
  101. package/components/overlays/command/examples.mdx +113 -0
  102. package/components/overlays/command/index.tsx +416 -0
  103. package/components/overlays/context-menu/examples.mdx +56 -0
  104. package/components/overlays/context-menu/index.tsx +279 -0
  105. package/components/overlays/dialog/examples.mdx +144 -0
  106. package/components/overlays/dialog/index.tsx +366 -0
  107. package/components/overlays/dropdown/dropdown-search.tsx +395 -0
  108. package/components/overlays/dropdown/examples.mdx +294 -0
  109. package/components/overlays/dropdown/index.tsx +1168 -0
  110. package/components/overlays/dropdown/menu-item.tsx +464 -0
  111. package/components/overlays/dropdown/menu-parts.tsx +660 -0
  112. package/components/overlays/popover/anchored-demo.tsx +59 -0
  113. package/components/overlays/popover/examples.mdx +180 -0
  114. package/components/overlays/popover/index.tsx +315 -0
  115. package/components/overlays/preview-card/examples.mdx +61 -0
  116. package/components/overlays/preview-card/index.tsx +204 -0
  117. package/components/overlays/sheet/examples.mdx +89 -0
  118. package/components/overlays/sheet/index.tsx +247 -0
  119. package/components/overlays/toast/examples.mdx +68 -0
  120. package/components/overlays/toast/global-demo.tsx +72 -0
  121. package/components/overlays/toast/index.tsx +474 -0
  122. package/components/overlays/toast/manager.ts +193 -0
  123. package/components/overlays/tooltip/examples.mdx +106 -0
  124. package/components/overlays/tooltip/index.tsx +519 -0
  125. package/components/progress/examples.mdx +59 -0
  126. package/components/progress/index.tsx +174 -0
  127. package/components/progress/progress.css +49 -0
  128. package/components/progress/step-demo.tsx +27 -0
  129. package/components/table/examples.mdx +184 -0
  130. package/components/table/index.tsx +510 -0
  131. package/components/table/sort-demo.tsx +61 -0
  132. package/dist/base.css +100 -0
  133. package/dist/blocks/sidebar-app/index.js +39 -26
  134. package/dist/components/AI/input-message/index.js +22 -16
  135. package/dist/components/AI/thinking-indicator/index.js +9 -6
  136. package/dist/components/accordion/index.js +16 -13
  137. package/dist/components/avatar/index.d.ts +46 -0
  138. package/dist/components/avatar/index.js +18 -0
  139. package/dist/components/badge/index.d.ts +18 -11
  140. package/dist/components/badge/index.js +11 -7
  141. package/dist/components/badge/variants.d.ts +33 -0
  142. package/dist/components/badge/variants.js +10 -0
  143. package/dist/components/button/index.d.ts +53 -17
  144. package/dist/components/button/index.js +10 -6
  145. package/dist/components/button/variants.d.ts +39 -0
  146. package/dist/components/button/variants.js +8 -0
  147. package/dist/components/card/index.d.ts +16 -3
  148. package/dist/components/card/index.js +16 -11
  149. package/dist/components/copy/index.js +13 -9
  150. package/dist/components/inputs/checkbox/index.d.ts +28 -9
  151. package/dist/components/inputs/checkbox/index.js +17 -13
  152. package/dist/components/inputs/color-picker/index.d.ts +13 -13
  153. package/dist/components/inputs/color-picker/index.js +25 -18
  154. package/dist/components/inputs/color-picker/variants.d.ts +61 -0
  155. package/dist/components/inputs/color-picker/variants.js +28 -0
  156. package/dist/components/inputs/combobox/index.d.ts +60 -17
  157. package/dist/components/inputs/combobox/index.js +26 -18
  158. package/dist/components/inputs/date-time/calendar/index.js +14 -11
  159. package/dist/components/inputs/date-time/date-picker/index.d.ts +53 -11
  160. package/dist/components/inputs/date-time/date-picker/index.js +33 -25
  161. package/dist/components/inputs/date-time/date-range-picker/index.d.ts +3 -3
  162. package/dist/components/inputs/date-time/date-range-picker/index.js +32 -24
  163. package/dist/components/inputs/date-time/duration-picker/index.d.ts +3 -3
  164. package/dist/components/inputs/date-time/duration-picker/index.js +32 -24
  165. package/dist/components/inputs/date-time/month-picker/index.d.ts +3 -3
  166. package/dist/components/inputs/date-time/month-picker/index.js +31 -23
  167. package/dist/components/inputs/date-time/time-picker/index.d.ts +3 -3
  168. package/dist/components/inputs/date-time/time-picker/index.js +32 -24
  169. package/dist/components/inputs/field/index.d.ts +116 -0
  170. package/dist/components/inputs/field/index.js +28 -0
  171. package/dist/components/inputs/file-dropzone/index.d.ts +165 -0
  172. package/dist/components/inputs/file-dropzone/index.js +32 -0
  173. package/dist/components/inputs/file-dropzone/variants.d.ts +35 -0
  174. package/dist/components/inputs/file-dropzone/variants.js +12 -0
  175. package/dist/components/inputs/input/index.d.ts +95 -13
  176. package/dist/components/inputs/input/index.js +17 -9
  177. package/dist/components/inputs/label/index.d.ts +32 -0
  178. package/dist/components/inputs/label/index.js +11 -0
  179. package/dist/components/inputs/number-input/index.d.ts +84 -0
  180. package/dist/components/inputs/number-input/index.js +20 -0
  181. package/dist/components/inputs/radio/index.d.ts +20 -5
  182. package/dist/components/inputs/radio/index.js +15 -12
  183. package/dist/components/inputs/search/index.js +25 -18
  184. package/dist/components/inputs/select/index.d.ts +41 -11
  185. package/dist/components/inputs/select/index.js +27 -14
  186. package/dist/components/inputs/select/variants.d.ts +5 -0
  187. package/dist/components/inputs/select/variants.js +6 -0
  188. package/dist/components/inputs/slider/index.js +7 -5
  189. package/dist/components/inputs/switch/index.d.ts +8 -2
  190. package/dist/components/inputs/switch/index.js +14 -12
  191. package/dist/components/inputs/textarea/index.d.ts +4 -0
  192. package/dist/components/inputs/textarea/index.js +8 -6
  193. package/dist/components/navigation/navigation-menu/index.d.ts +114 -0
  194. package/dist/components/navigation/navigation-menu/index.js +40 -0
  195. package/dist/components/navigation/pagination/index.d.ts +73 -0
  196. package/dist/components/navigation/pagination/index.js +39 -0
  197. package/dist/components/navigation/sidebar/index.d.ts +44 -21
  198. package/dist/components/navigation/sidebar/index.js +41 -31
  199. package/dist/components/navigation/sidebar/variants.d.ts +25 -0
  200. package/dist/components/navigation/sidebar/variants.js +28 -0
  201. package/dist/components/navigation/tabs/index.d.ts +8 -2
  202. package/dist/components/navigation/tabs/index.js +14 -10
  203. package/dist/components/navigation/tabs-subtle/index.js +12 -10
  204. package/dist/components/overlays/alert-dialog/index.d.ts +121 -15
  205. package/dist/components/overlays/alert-dialog/index.js +22 -13
  206. package/dist/components/overlays/command/index.js +24 -17
  207. package/dist/components/overlays/context-menu/index.d.ts +33 -17
  208. package/dist/components/overlays/context-menu/index.js +27 -18
  209. package/dist/components/overlays/dialog/index.js +17 -12
  210. package/dist/components/overlays/dropdown/index.d.ts +257 -31
  211. package/dist/components/overlays/dropdown/index.js +42 -17
  212. package/dist/components/overlays/popover/index.d.ts +31 -9
  213. package/dist/components/overlays/popover/index.js +12 -9
  214. package/dist/components/overlays/preview-card/index.js +11 -8
  215. package/dist/components/overlays/sheet/index.js +18 -13
  216. package/dist/components/overlays/toast/index.d.ts +123 -47
  217. package/dist/components/overlays/toast/index.js +18 -10
  218. package/dist/components/overlays/tooltip/index.d.ts +113 -21
  219. package/dist/components/overlays/tooltip/index.js +15 -6
  220. package/dist/components/progress/index.d.ts +56 -0
  221. package/dist/components/progress/index.js +15 -0
  222. package/dist/components/table/index.d.ts +63 -8
  223. package/dist/components/table/index.js +19 -9
  224. package/dist/index.d.ts +2201 -736
  225. package/dist/index.js +223 -82
  226. package/dist/lib/date-locale.d.ts +14 -0
  227. package/dist/lib/date-locale.js +16 -0
  228. package/dist/lib/field-classes.d.ts +144 -0
  229. package/dist/lib/field-classes.js +40 -0
  230. package/dist/lib/field-variants.d.ts +47 -0
  231. package/dist/lib/field-variants.js +26 -0
  232. package/dist/lib/fluid-hover-highlight.d.ts +112 -0
  233. package/dist/lib/fluid-hover-highlight.js +17 -0
  234. package/dist/lib/focus-ring.d.ts +18 -0
  235. package/dist/lib/focus-ring.js +10 -0
  236. package/dist/lib/goo-indicator.d.ts +46 -0
  237. package/dist/lib/goo-indicator.js +14 -0
  238. package/dist/lib/icon-context.d.ts +30 -0
  239. package/dist/lib/icon-context.js +12 -0
  240. package/dist/lib/inert.d.ts +9 -0
  241. package/dist/lib/inert.js +8 -0
  242. package/dist/lib/morph-layers.d.ts +93 -0
  243. package/dist/lib/morph-layers.js +13 -0
  244. package/dist/lib/morph-part.d.ts +21 -0
  245. package/dist/lib/morph-part.js +12 -0
  246. package/dist/lib/popup.d.ts +20 -0
  247. package/dist/lib/popup.js +12 -0
  248. package/dist/lib/reduced-motion.d.ts +9 -0
  249. package/dist/lib/reduced-motion.js +6 -0
  250. package/dist/lib/row-index.d.ts +10 -0
  251. package/dist/lib/row-index.js +8 -0
  252. package/dist/lib/row-order.d.ts +28 -0
  253. package/dist/lib/row-order.js +10 -0
  254. package/dist/lib/scroll-column.d.ts +27 -0
  255. package/dist/lib/scroll-column.js +18 -0
  256. package/dist/lib/shape-context.d.ts +30 -0
  257. package/dist/lib/shape-context.js +12 -0
  258. package/dist/lib/size-context.d.ts +94 -0
  259. package/dist/lib/size-context.js +20 -0
  260. package/dist/lib/size-scale.d.ts +79 -0
  261. package/dist/lib/size-scale.js +8 -0
  262. package/dist/lib/slot.d.ts +12 -0
  263. package/dist/lib/slot.js +6 -0
  264. package/dist/lib/springs.d.ts +44 -0
  265. package/dist/lib/springs.js +8 -0
  266. package/dist/lib/surface-classes.d.ts +19 -0
  267. package/dist/lib/surface-classes.js +10 -0
  268. package/dist/lib/surface-context.d.ts +9 -0
  269. package/dist/lib/surface-context.js +8 -0
  270. package/dist/lib/use-controllable-state.d.ts +2 -0
  271. package/dist/lib/use-controllable-state.js +6 -0
  272. package/dist/lib/use-fluid-hover.d.ts +138 -0
  273. package/dist/lib/use-fluid-hover.js +14 -0
  274. package/dist/lib/use-is-mobile.d.ts +2 -0
  275. package/dist/lib/use-is-mobile.js +6 -0
  276. package/dist/lib/use-keyboard-nav-gate.d.ts +20 -0
  277. package/dist/lib/use-keyboard-nav-gate.js +7 -0
  278. package/dist/lib/use-merge-split.d.ts +47 -0
  279. package/dist/lib/use-merge-split.js +15 -0
  280. package/dist/lib/use-morph.d.ts +101 -0
  281. package/dist/lib/use-morph.js +20 -0
  282. package/dist/lib/use-touch-primary.d.ts +2 -0
  283. package/dist/lib/use-touch-primary.js +6 -0
  284. package/dist/lib/utils.d.ts +3 -0
  285. package/dist/lib/utils.js +6 -0
  286. package/dist/preset.d.ts +17 -0
  287. package/dist/preset.js +22 -2
  288. package/dist/primitives/code/index.js +7 -5
  289. package/dist/primitives/craft/index.js +9 -6
  290. package/dist/primitives/fluid-hover/index.js +9 -8
  291. package/dist/primitives/morph/index.js +15 -10
  292. package/dist/primitives/motion/index.js +10 -8
  293. package/dist/primitives/scroll-area/index.js +4 -3
  294. package/dist/primitives/separator/index.d.ts +25 -0
  295. package/dist/primitives/separator/index.js +9 -0
  296. package/dist/primitives/sizes/index.js +6 -4
  297. package/dist/primitives/skeleton/index.d.ts +35 -0
  298. package/dist/primitives/skeleton/index.js +12 -0
  299. package/dist/primitives/surface/index.js +6 -4
  300. package/dist/shared/{components-3mkepka5.js → components-0jmqhx2k.js} +28 -25
  301. package/dist/shared/components-124epb7f.js +53 -0
  302. package/dist/shared/{components-gz8zf3ec.js → components-1k0wv53d.js} +15 -43
  303. package/dist/shared/components-26snnbs9.js +322 -0
  304. package/dist/shared/{components-2dxkv6zm.js → components-2c0qcfx4.js} +8 -7
  305. package/dist/shared/{components-473g814w.js → components-2mt9te6d.js} +243 -137
  306. package/dist/shared/{components-hawvy2qz.js → components-2z48g4fp.js} +9 -30
  307. package/dist/shared/components-34txk9rj.js +35 -0
  308. package/dist/shared/components-3h92d94m.js +23 -0
  309. package/dist/shared/{components-zfnmn5d4.js → components-3sp623ae.js} +36 -31
  310. package/dist/shared/{components-jwst3vtj.js → components-3wxkjgqn.js} +186 -76
  311. package/dist/shared/{components-s2bz1xpk.js → components-49bsynbw.js} +8 -5
  312. package/dist/shared/components-4bwsd46w.js +71 -0
  313. package/dist/shared/components-4n4f5m3e.js +297 -0
  314. package/dist/shared/{components-0q0sqfh4.js → components-4y816hwp.js} +27 -49
  315. package/dist/shared/components-52ngsgca.js +399 -0
  316. package/dist/shared/{components-y9y0g8er.js → components-52r5763g.js} +22 -19
  317. package/dist/shared/components-559tf7yb.js +28 -0
  318. package/dist/shared/components-5mkga9hj.js +440 -0
  319. package/dist/shared/{components-kwa6mrf9.js → components-5s0nfqvw.js} +14 -9
  320. package/dist/shared/{components-dk0gjr5a.js → components-60atskhp.js} +19 -18
  321. package/dist/shared/{components-rr7a6ja9.js → components-658b26nb.js} +21 -18
  322. package/dist/shared/{components-xxvdw7k1.js → components-65vwfjs6.js} +37 -34
  323. package/dist/shared/{components-frw34b65.js → components-6j2fh74k.js} +114 -123
  324. package/dist/shared/components-6zg1yft7.js +167 -0
  325. package/dist/shared/components-6zng858q.js +53 -0
  326. package/dist/shared/components-72w4ge68.js +64 -0
  327. package/dist/shared/{components-cv16mryv.js → components-78x40gee.js} +13 -7
  328. package/dist/shared/{components-b2wyq2cq.js → components-7d4r7hh1.js} +39 -57
  329. package/dist/shared/components-7ntvvegr.js +316 -0
  330. package/dist/shared/components-8nwsqjn8.js +34 -0
  331. package/dist/shared/{components-5xc2j8jz.js → components-8tt3xbb5.js} +19 -18
  332. package/dist/shared/{components-vc7vq5nz.js → components-9as3rf68.js} +6 -3
  333. package/dist/shared/components-9mys9jna.js +255 -0
  334. package/dist/shared/components-adkarj8n.js +35 -0
  335. package/dist/shared/{components-b3c5et5b.js → components-ae9fncz4.js} +32 -31
  336. package/dist/shared/{components-hqeq3w9q.js → components-awra5sff.js} +24 -16
  337. package/dist/shared/components-b1e239g3.js +28 -0
  338. package/dist/shared/{components-q5xj5c16.js → components-b1f2bjf1.js} +9 -8
  339. package/dist/shared/{components-qmmjx1qw.js → components-bn42vq6d.js} +71 -72
  340. package/dist/shared/components-c96g82th.js +1444 -0
  341. package/dist/shared/components-c9yr4ed1.js +44 -0
  342. package/dist/shared/components-d3shbwqq.js +95 -0
  343. package/dist/shared/{components-jjw69c4c.js → components-dcc02hs2.js} +7 -4
  344. package/dist/shared/{components-men63rwj.js → components-de99ykt7.js} +3 -2
  345. package/dist/shared/components-dhgk6mbt.js +16 -0
  346. package/dist/shared/components-drxrtnp2.js +25 -0
  347. package/dist/shared/{components-6p8tfcd6.js → components-ds9fqat9.js} +21 -18
  348. package/dist/shared/{components-mjthm1kf.js → components-egy4tyjt.js} +11 -8
  349. package/dist/shared/components-f0xfpkhh.js +82 -0
  350. package/dist/shared/components-f7h57m6t.js +59 -0
  351. package/dist/shared/{components-d6xtjht3.js → components-fjkpbg6n.js} +33 -30
  352. package/dist/shared/{components-gc5vtq2f.js → components-gh0qeey3.js} +63 -29
  353. package/dist/shared/{components-39jq9va1.js → components-gvbapfen.js} +29 -24
  354. package/dist/shared/{components-5vgpnxgy.js → components-gzesg7hy.js} +19 -16
  355. package/dist/shared/components-h6p86be3.js +19 -0
  356. package/dist/shared/components-h83az0bz.js +33 -0
  357. package/dist/shared/components-jjrj6ymn.js +104 -0
  358. package/dist/shared/{components-wvp1m52g.js → components-jp5v0m0f.js} +15 -14
  359. package/dist/shared/{components-zrkzcayz.js → components-jqpefjsn.js} +54 -6
  360. package/dist/shared/{components-1z6tdadk.js → components-k74j4hwh.js} +20 -17
  361. package/dist/shared/components-kswxnm3h.js +24 -0
  362. package/dist/shared/{components-jbbmdr74.js → components-mkkbbgb7.js} +36 -17
  363. package/dist/shared/{components-pbmqctfa.js → components-mpw667rb.js} +169 -65
  364. package/dist/shared/{components-s5ngg32c.js → components-paa08427.js} +121 -47
  365. package/dist/shared/{components-vfbhxf5r.js → components-pd42emw3.js} +6 -5
  366. package/dist/shared/{components-hw9yk32z.js → components-pmfszv7a.js} +35 -23
  367. package/dist/shared/{components-chacnk61.js → components-pw06rbxq.js} +19 -19
  368. package/dist/shared/components-q03cktx8.js +246 -0
  369. package/dist/shared/{components-kvr7f9hy.js → components-qdm3yh26.js} +19 -10
  370. package/dist/shared/{components-27nnvrwe.js → components-qs4rkqsj.js} +15 -14
  371. package/dist/shared/{components-s083f38z.js → components-r6gbmkew.js} +22 -21
  372. package/dist/shared/{components-ta7shw28.js → components-r8eqs7gz.js} +4 -4
  373. package/dist/shared/{components-sn1rxx1d.js → components-rm02h9nt.js} +12 -11
  374. package/dist/shared/{components-c6s6b43g.js → components-rrbpmfx4.js} +3 -2
  375. package/dist/shared/{components-n7mjr357.js → components-tz1fv35x.js} +3 -2
  376. package/dist/shared/components-tz4gaf1v.js +23 -0
  377. package/dist/shared/{components-zx6b6yby.js → components-vf45j12c.js} +4 -18
  378. package/dist/shared/{components-3ky44908.js → components-vfjc9jzz.js} +2 -3
  379. package/dist/shared/{components-39vmfq9s.js → components-vsa625vk.js} +21 -20
  380. package/dist/shared/components-wawnmkph.js +500 -0
  381. package/dist/shared/components-wktrrb4m.js +38 -0
  382. package/dist/shared/{components-8snj490h.js → components-wwd363me.js} +78 -32
  383. package/dist/shared/{components-5pnw8183.js → components-xcwvgcrd.js} +23 -22
  384. package/dist/shared/components-xdqmt6ed.js +20 -0
  385. package/dist/shared/{components-h2ajmhwn.js → components-y1w3a6wx.js} +107 -35
  386. package/dist/shared/{components-ar66gnt0.js → components-y6578b8h.js} +37 -34
  387. package/dist/shared/{components-59efxjd9.js → components-yhgq0qxx.js} +13 -12
  388. package/dist/shared/{components-jthe1pwb.js → components-yz84gpkq.js} +101 -404
  389. package/dist/shared/components-z3v0n0de.js +11 -0
  390. package/dist/shared/{components-7r3etddy.js → components-z9n19fyk.js} +19 -54
  391. package/dist/shared/components-zbvjzh1p.js +141 -0
  392. package/dist/styles.css +241 -16
  393. package/dist/tailwind.css +13 -0
  394. package/dist/tokens.css +34 -0
  395. package/index.ts +60 -0
  396. package/lib/date-locale.ts +50 -0
  397. package/lib/field-classes.ts +115 -0
  398. package/lib/field-variants.ts +117 -0
  399. package/lib/fluid-hover-highlight.tsx +139 -0
  400. package/lib/focus-ring.tsx +46 -0
  401. package/lib/goo-indicator.tsx +261 -0
  402. package/lib/icon-context.tsx +310 -0
  403. package/lib/inert.ts +22 -0
  404. package/lib/morph-layers.tsx +102 -0
  405. package/lib/morph-part.tsx +49 -0
  406. package/lib/popup.ts +52 -0
  407. package/lib/reduced-motion.ts +19 -0
  408. package/lib/row-index.tsx +29 -0
  409. package/lib/row-order.tsx +115 -0
  410. package/lib/scroll-column.tsx +244 -0
  411. package/lib/shape-context.tsx +124 -0
  412. package/lib/size-context.tsx +66 -0
  413. package/lib/size-scale.ts +115 -0
  414. package/lib/slot.ts +25 -0
  415. package/lib/springs.ts +62 -0
  416. package/lib/surface-classes.ts +58 -0
  417. package/lib/surface-context.tsx +21 -0
  418. package/lib/use-controllable-state.ts +44 -0
  419. package/lib/use-fluid-hover.ts +541 -0
  420. package/lib/use-is-mobile.ts +25 -0
  421. package/lib/use-keyboard-nav-gate.ts +45 -0
  422. package/lib/use-merge-split.tsx +209 -0
  423. package/lib/use-morph.ts +557 -0
  424. package/lib/use-touch-primary.tsx +43 -0
  425. package/lib/utils.ts +37 -0
  426. package/package.json +177 -4
  427. package/preset.ts +196 -0
  428. package/primitives/code/examples.mdx +27 -0
  429. package/primitives/code/index.tsx +80 -0
  430. package/primitives/craft/demos.tsx +173 -0
  431. package/primitives/craft/examples.mdx +138 -0
  432. package/primitives/craft/index.tsx +76 -0
  433. package/primitives/fluid-hover/examples.mdx +84 -0
  434. package/primitives/fluid-hover/index.tsx +316 -0
  435. package/primitives/morph/examples.mdx +135 -0
  436. package/primitives/morph/index.tsx +192 -0
  437. package/primitives/motion/examples.mdx +100 -0
  438. package/primitives/motion/index.tsx +160 -0
  439. package/primitives/scroll-area/examples.mdx +58 -0
  440. package/primitives/scroll-area/index.tsx +200 -0
  441. package/primitives/separator/examples.mdx +30 -0
  442. package/primitives/separator/index.tsx +53 -0
  443. package/primitives/sizes/examples.mdx +167 -0
  444. package/primitives/sizes/index.tsx +89 -0
  445. package/primitives/skeleton/examples.mdx +51 -0
  446. package/primitives/skeleton/index.tsx +72 -0
  447. package/primitives/skeleton/skeleton.css +15 -0
  448. package/primitives/surface/examples.mdx +173 -0
  449. package/primitives/surface/index.tsx +109 -0
  450. package/primitives/surface/surface.css +176 -0
  451. package/dist/shared/components-0sn7ypjw.js +0 -61
  452. package/dist/shared/components-1434p1mh.js +0 -123
  453. package/dist/shared/components-a86dytt0.js +0 -986
  454. package/dist/shared/components-gf5s6ap9.js +0 -42
  455. package/dist/shared/components-hyq23phv.js +0 -310
  456. package/dist/shared/components-ng72k97e.js +0 -128
  457. package/dist/shared/components-raknhppb.js +0 -64
  458. package/dist/shared/components-vynjtrk6.js +0 -19
  459. package/dist/shared/components-wy9jpqny.js +0 -146
  460. /package/dist/shared/{components-1v7rxytx.js → components-3ey0hzpb.js} +0 -0
  461. /package/dist/shared/{components-ezxhrmer.js → components-jcnjay5g.js} +0 -0
@@ -0,0 +1,279 @@
1
+ /*
2
+ * Local addition (not part of Fluid Functionalism): a context menu that grows
3
+ * out of the press point through `lib/use-morph.ts`, goo by default. Behavior
4
+ * is Base UI's ContextMenu (right click, long press, positioning at the
5
+ * pointer, roving highlight, typeahead, dismissal). The rows are Dropdown's:
6
+ * `MenuItem` from `components/overlays/dropdown/menu-item.tsx`, `Dropdown.Label` and
7
+ * `Dropdown.Separator`, with the fluid hover highlight gliding between them.
8
+ */
9
+
10
+ import { ContextMenu as ContextMenuPrimitive } from '@base-ui/react/context-menu'
11
+ import {
12
+ createContext,
13
+ forwardRef,
14
+ type ReactNode,
15
+ type RefObject,
16
+ useContext,
17
+ useEffect,
18
+ useImperativeHandle,
19
+ useMemo,
20
+ useRef,
21
+ } from 'react'
22
+ import { FluidHoverHighlight } from '../../../lib/fluid-hover-highlight'
23
+ import { MorphSurface } from '../../../lib/morph-layers'
24
+ import { isDisabledRow, popupScrollAreaClass, popupViewportClass } from '../../../lib/popup'
25
+ import { shapeMap } from '../../../lib/shape-context'
26
+ import { type SizeVariant, useSize } from '../../../lib/size-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 { useFluidHover } from '../../../lib/use-fluid-hover'
31
+ import { type MorphOrigin, useMorph, useMorphOrigin } from '../../../lib/use-morph'
32
+ import { cn } from '../../../lib/utils'
33
+ import { ScrollArea } from '../../../primitives/scroll-area'
34
+ import { SizeProvider } from '../../../primitives/sizes'
35
+ import { DropdownLabel, DropdownSeparator } from '../dropdown'
36
+ import { DropdownContext, MenuItem, type MenuItemProps, type MenuItemRenderOptions } from '../dropdown/menu-item'
37
+
38
+ // The rows' radii, as in Dropdown: menus keep the "rounded" shape whatever the
39
+ // rest of the UI is shaped.
40
+ const shape = shapeMap.rounded
41
+
42
+ interface ContextMenuContextValue {
43
+ open: boolean
44
+ origin: RefObject<MorphOrigin>
45
+ }
46
+
47
+ const ContextMenuContext = createContext<ContextMenuContextValue>({ open: false, origin: { current: {} } })
48
+
49
+ const ShortcutContext = createContext<string | undefined>(undefined)
50
+
51
+ function RowShortcut() {
52
+ const shortcut = useContext(ShortcutContext)
53
+ const compact = useSize().variant === 'compact'
54
+ if (!shortcut) return null
55
+ return (
56
+ <kbd
57
+ className={cn('shrink-0 pl-4 font-sans text-muted-foreground', compact ? 'text-caption-compact' : 'text-caption')}
58
+ >
59
+ {shortcut}
60
+ </kbd>
61
+ )
62
+ }
63
+
64
+ // MenuItem's render hook: the styled row goes into Base UI's context-menu item.
65
+ function renderMenuItem({
66
+ radio,
67
+ checkbox,
68
+ checked,
69
+ disabled,
70
+ label,
71
+ closeOnClick,
72
+ onClick,
73
+ element,
74
+ children,
75
+ }: MenuItemRenderOptions) {
76
+ // The row's activation goes on the primitive: Base UI's Enter/Space calls
77
+ // only the primitive's own onClick.
78
+ return radio || checkbox ? (
79
+ <ContextMenuPrimitive.CheckboxItem
80
+ checked={checked}
81
+ disabled={disabled}
82
+ label={label}
83
+ closeOnClick={closeOnClick}
84
+ onClick={onClick}
85
+ render={element}
86
+ >
87
+ {children}
88
+ <RowShortcut />
89
+ </ContextMenuPrimitive.CheckboxItem>
90
+ ) : (
91
+ <ContextMenuPrimitive.Item
92
+ disabled={disabled}
93
+ label={label}
94
+ closeOnClick={closeOnClick}
95
+ onClick={onClick}
96
+ render={element}
97
+ >
98
+ {children}
99
+ <RowShortcut />
100
+ </ContextMenuPrimitive.Item>
101
+ )
102
+ }
103
+
104
+ interface ContextMenuItemProps extends MenuItemProps {
105
+ /** Keyboard shortcut shown at the row's end, e.g. `⌘C`. */
106
+ shortcut?: string
107
+ }
108
+
109
+ const ContextMenuItem = forwardRef<HTMLDivElement, ContextMenuItemProps>(({ shortcut, ...props }, ref) => (
110
+ <ShortcutContext.Provider value={shortcut}>
111
+ <MenuItem ref={ref} {...props} />
112
+ </ShortcutContext.Provider>
113
+ ))
114
+ ContextMenuItem.displayName = 'ContextMenuItem'
115
+
116
+ interface ContextMenuContentProps {
117
+ /** Where the menu grows from (see Morph): the press point, its own center, a viewport edge, or a ref to any element. Defaults to `'pointer'`. */
118
+ from?: 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
119
+ /** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
120
+ effect?: 'goo' | 'morph' | 'slide' | 'fade'
121
+ /** Hide the `from` element while open, so it reads as turning into the menu. Defaults to `false`. */
122
+ hideSource?: boolean
123
+ /** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'moderate'`. */
124
+ tier?: 'moderate' | 'slow'
125
+ /** Portal target. Defaults to the document body. */
126
+ container?: HTMLElement | null
127
+ /** Extra classes for the menu surface — it is 14rem wide by default. */
128
+ className?: string
129
+ /** `ContextMenu.Item` rows, plus `ContextMenu.Label` and `ContextMenu.Separator`. */
130
+ children?: ReactNode
131
+ }
132
+
133
+ const ContextMenuContent = forwardRef<HTMLDivElement, ContextMenuContentProps>(
134
+ ({ from = 'pointer', effect, hideSource, tier = 'moderate', container, className, children }, ref) => {
135
+ const { open, origin } = useContext(ContextMenuContext)
136
+ const morph = useMorph(open, origin, { from, effect, hideSource, tier })
137
+ useImperativeHandle(ref, () => morph.popup as HTMLDivElement, [morph.popup])
138
+ // Fixed shadow, like Dropdown (see Elevated).
139
+ const level = Math.min(useSurface() + 2, 8)
140
+ const containerRef = useRef<HTMLDivElement>(null)
141
+ const hover = useFluidHover(containerRef, { isItemDisabled: isDisabledRow })
142
+ const { activeIndex, setActiveIndex, handlers, registerItem, remeasure } = hover
143
+
144
+ // Rows stay registered between opens, so their rects are stale until the
145
+ // menu is open again; a close drops the highlight so the next open doesn't
146
+ // spring it over from the last row.
147
+ useEffect(() => {
148
+ if (open) remeasure()
149
+ else setActiveIndex(null)
150
+ }, [open, remeasure, setActiveIndex])
151
+
152
+ const rows = useMemo(
153
+ () => ({ registerItem, activeIndex, inMenu: true, renderMenuItem }),
154
+ [registerItem, activeIndex],
155
+ )
156
+
157
+ return (
158
+ <ContextMenuPrimitive.Portal container={container ?? undefined}>
159
+ <ContextMenuPrimitive.Positioner className="z-50 outline-none">
160
+ <ContextMenuPrimitive.Popup
161
+ ref={morph.popupRef}
162
+ onMouseEnter={handlers.onMouseEnter}
163
+ onMouseMove={handlers.onMouseMove}
164
+ onMouseLeave={handlers.onMouseLeave}
165
+ onClick={handlers.onClick}
166
+ // Keyboard navigation moves focus between rows; the hover background follows it.
167
+ onFocus={e => {
168
+ const index = (e.target as HTMLElement)
169
+ .closest('[data-fluid-hover-index]')
170
+ ?.getAttribute('data-fluid-hover-index')
171
+ if (index != null) setActiveIndex(Number(index))
172
+ }}
173
+ onBlur={e => {
174
+ if (!e.currentTarget.contains(e.relatedTarget as Node)) setActiveIndex(null)
175
+ }}
176
+ className="relative select-none outline-none"
177
+ >
178
+ <SurfaceProvider value={level}>
179
+ <MorphSurface
180
+ morph={morph}
181
+ bg={SURFACE_BG[level]}
182
+ shadow={SURFACE_SHADOW[3]}
183
+ radius={shape.container}
184
+ className={cn(
185
+ 'flex w-56 max-h-[min(480px,var(--available-height))] flex-col overflow-hidden',
186
+ shape.container,
187
+ className,
188
+ )}
189
+ >
190
+ <ScrollArea className={popupScrollAreaClass} viewportClassName={cn(popupViewportClass, 'scroll-fade')}>
191
+ <div ref={containerRef} className="relative flex flex-col p-1">
192
+ <FluidHoverHighlight hover={hover} hidden={!open} className={shape.bg} />
193
+ <DropdownContext.Provider value={rows}>{children}</DropdownContext.Provider>
194
+ </div>
195
+ </ScrollArea>
196
+ </MorphSurface>
197
+ </SurfaceProvider>
198
+ </ContextMenuPrimitive.Popup>
199
+ </ContextMenuPrimitive.Positioner>
200
+ </ContextMenuPrimitive.Portal>
201
+ )
202
+ },
203
+ )
204
+ ContextMenuContent.displayName = 'ContextMenuContent'
205
+
206
+ interface ContextMenuProps {
207
+ /** Controlled open state. Pair with `onOpenChange`. */
208
+ open?: boolean
209
+ /** Initial open state, for an uncontrolled menu. Defaults to `false`. */
210
+ defaultOpen?: boolean
211
+ /** Called when the menu opens or closes. */
212
+ onOpenChange?: (open: boolean) => void
213
+ /** Turns the trigger area back into a plain one: no menu on right click or long press. Defaults to `false`. */
214
+ disabled?: boolean
215
+ /** Pins the rows to one step of the size ladder (default 36px, compact 28px — see Sizes). Omitted, they follow the surrounding SizeProvider. */
216
+ size?: SizeVariant
217
+ /** The area and the menu — `ContextMenu.Trigger` plus a `ContextMenu.Content`. */
218
+ children?: ReactNode
219
+ }
220
+
221
+ /**
222
+ * A menu that grows out of the pointer on right click, or on a long press on
223
+ * touch: the surface swells from the exact point you pressed into the menu.
224
+ *
225
+ * The morph comes from the shared engine (see Morph): from the press point
226
+ * by default, or from its own center, a viewport edge or any element, with
227
+ * the goo, a plain morph, a slide or a fade. The rows are Dropdown's — the
228
+ * fluid hover background gliding between them, icons that firm up under it,
229
+ * dimmed disabled rows the pointer skips — plus a keyboard shortcut at the
230
+ * end of a row. The menu lifts 2 surface levels off its substrate. Built on
231
+ * Base UI's ContextMenu: it opens at the pointer and flips or shifts to stay
232
+ * on screen, arrow keys and typeahead move between rows, and picking a row,
233
+ * Escape or an outside press closes it.
234
+ *
235
+ * Statics:
236
+ * - `ContextMenu.Trigger` — the area that opens it (a `div`).
237
+ * - `ContextMenu.Content` — the menu: the morph options `from`, `effect`,
238
+ * `hideSource`, `tier`.
239
+ * - `ContextMenu.Item` — a row: `index`, `label`, `icon`, `shortcut`,
240
+ * `onSelect`, `disabled`.
241
+ * - `ContextMenu.Label` / `ContextMenu.Separator` — a caption over a run of
242
+ * rows and a rule between runs (Dropdown's).
243
+ *
244
+ * @example {@include ./examples.mdx}
245
+ */
246
+ function ContextMenu({ open, defaultOpen = false, onOpenChange, disabled = false, size, children }: ContextMenuProps) {
247
+ const [current, setCurrent] = useControllableState(open, defaultOpen, onOpenChange)
248
+ const { origin, capture } = useMorphOrigin()
249
+ const ctx = useMemo(() => ({ open: current, origin }), [current, origin])
250
+
251
+ const root = (
252
+ <ContextMenuContext.Provider value={ctx}>
253
+ <ContextMenuPrimitive.Root
254
+ open={current}
255
+ disabled={disabled}
256
+ onOpenChange={(next, details) => {
257
+ if (next) capture(details)
258
+ setCurrent(next)
259
+ }}
260
+ >
261
+ {children}
262
+ </ContextMenuPrimitive.Root>
263
+ </ContextMenuContext.Provider>
264
+ )
265
+
266
+ // The portalled menu reads the size through React context.
267
+ return size ? <SizeProvider size={size}>{root}</SizeProvider> : root
268
+ }
269
+
270
+ ContextMenu.Trigger = ContextMenuPrimitive.Trigger
271
+ ContextMenu.Content = ContextMenuContent
272
+ ContextMenu.Item = ContextMenuItem
273
+ ContextMenu.Label = DropdownLabel
274
+ ContextMenu.Separator = DropdownSeparator
275
+
276
+ export type { ContextMenuContentProps, ContextMenuItemProps, ContextMenuProps }
277
+ export { ContextMenu, ContextMenuContent, ContextMenuItem }
278
+
279
+ export default ContextMenu
@@ -0,0 +1,144 @@
1
+ import Dialog from './index'
2
+ import Button from '../../button'
3
+ import Select from '../../inputs/select'
4
+ import Morph from '../../../primitives/morph'
5
+
6
+ # Basic
7
+
8
+ A trigger, a header, and a footer whose Cancel is a `Dialog.Close`. The ✕
9
+ in the corner comes with `Dialog.Content`.
10
+
11
+ <Dialog>
12
+ <Dialog.Trigger render={<Button variant="tertiary">Open dialog</Button>} />
13
+ <Dialog.Content>
14
+ <Dialog.Header>
15
+ <Dialog.Title>Create teamspace</Dialog.Title>
16
+ <Dialog.Description>
17
+ Add a new teamspace to organize your projects and collaborate with your team.
18
+ </Dialog.Description>
19
+ </Dialog.Header>
20
+ <Dialog.Footer>
21
+ <Dialog.Close render={<Button variant="ghost">Cancel</Button>} />
22
+ <Button>Create</Button>
23
+ </Dialog.Footer>
24
+ </Dialog.Content>
25
+ </Dialog>
26
+
27
+ # Sizes
28
+
29
+ 3 widths: `sm` for a confirmation, `lg` for a short form, `xl` for a
30
+ layout of its own. Each is one notch narrower inside a compact region.
31
+
32
+ <div className="flex flex-wrap items-center gap-2">
33
+ {[
34
+ { size: 'sm', label: 'Small', copy: '400px: a confirmation, 1 field, a short message.' },
35
+ { size: 'lg', label: 'Large', copy: '540px: a short form, or a longer confirmation.' },
36
+ { size: 'xl', label: 'Extra large', copy: '880px: 2 columns, a table, or a sidebar beside a panel.' },
37
+ ].map(({ size, label, copy }) => (
38
+ <Dialog key={label}>
39
+ <Dialog.Trigger render={<Button variant="secondary">{label}</Button>} />
40
+ <Dialog.Content size={size}>
41
+ <Dialog.Header>
42
+ <Dialog.Title>{label} dialog</Dialog.Title>
43
+ <Dialog.Description>{copy}</Dialog.Description>
44
+ </Dialog.Header>
45
+ <Dialog.Footer>
46
+ <Dialog.Close render={<Button variant="ghost">Close</Button>} />
47
+ </Dialog.Footer>
48
+ </Dialog.Content>
49
+ </Dialog>
50
+ ))}
51
+ </div>
52
+
53
+ # Surfaces inside a dialog
54
+
55
+ Not an FF docs section — a modo addition standing in for FF's "With a
56
+ sidebar" example, which this port omits along with Sidebar. The dialog
57
+ settles at `substrate + 4` and re-provides that level, so the Select's
58
+ popover lifts 2 more from there instead of painting the dialog's own
59
+ background. Nothing is passed between them.
60
+
61
+ <Dialog>
62
+ <Dialog.Trigger render={<Button variant="secondary">Invite people</Button>} />
63
+ <Dialog.Content>
64
+ <Dialog.Header>
65
+ <Dialog.Title>Invite to your workspace</Dialog.Title>
66
+ <Dialog.Description>
67
+ The panel sits 4 levels above the page; the role menu lifts 2 more from there.
68
+ </Dialog.Description>
69
+ </Dialog.Header>
70
+ <Select defaultValue="member">
71
+ <Select.Trigger placeholder="Select role" />
72
+ <Select.Content>
73
+ <Select.Item index={0} value="owner">Workspace owner</Select.Item>
74
+ <Select.Item index={1} value="member">Member</Select.Item>
75
+ <Select.Item index={2} value="restricted">Restricted member</Select.Item>
76
+ </Select.Content>
77
+ </Select>
78
+ <Dialog.Footer>
79
+ <Dialog.Close render={<Button variant="ghost">Cancel</Button>} />
80
+ <Button>Send invites</Button>
81
+ </Dialog.Footer>
82
+ </Dialog.Content>
83
+ </Dialog>
84
+
85
+ # Morph sources
86
+
87
+ `from` picks where the panel grows from: the pressed trigger (the default), the press point, its own center, or a side of the window. `effect` switches the goo neck for a plain morph, a slide or a fade.
88
+
89
+ <div className="flex flex-wrap items-center justify-center gap-3">
90
+ <Dialog>
91
+ <Dialog.Trigger render={<Button variant="secondary">From the trigger</Button>} />
92
+ <Dialog.Content>
93
+ <Dialog.Header>
94
+ <Dialog.Title>From the trigger</Dialog.Title>
95
+ <Dialog.Description>The surface oozes out of the button and travels to the center.</Dialog.Description>
96
+ </Dialog.Header>
97
+ </Dialog.Content>
98
+ </Dialog>
99
+ <Dialog>
100
+ <Dialog.Trigger render={<Button variant="secondary">From the pointer</Button>} />
101
+ <Dialog.Content from="pointer" effect="morph">
102
+ <Dialog.Header>
103
+ <Dialog.Title>From the pointer</Dialog.Title>
104
+ <Dialog.Description>A circle grows from where you pressed.</Dialog.Description>
105
+ </Dialog.Header>
106
+ </Dialog.Content>
107
+ </Dialog>
108
+ <Dialog>
109
+ <Dialog.Trigger render={<Button variant="secondary">From its center</Button>} />
110
+ <Dialog.Content from="center" effect="morph">
111
+ <Dialog.Header>
112
+ <Dialog.Title>From its center</Dialog.Title>
113
+ <Dialog.Description>The panel unfolds in place toward every edge.</Dialog.Description>
114
+ </Dialog.Header>
115
+ </Dialog.Content>
116
+ </Dialog>
117
+ <Dialog>
118
+ <Dialog.Trigger render={<Button variant="secondary">From the bottom</Button>} />
119
+ <Dialog.Content from="bottom" effect="slide">
120
+ <Dialog.Header>
121
+ <Dialog.Title>From the bottom</Dialog.Title>
122
+ <Dialog.Description>The finished panel slides up from the edge of the window.</Dialog.Description>
123
+ </Dialog.Header>
124
+ </Dialog.Content>
125
+ </Dialog>
126
+ </div>
127
+
128
+ # From a card
129
+
130
+ The trigger can be any element. `Morph.Part` pairs the card's cover and title with their twins in the panel, so they fly into the dialog and back.
131
+
132
+ <Dialog>
133
+ <Dialog.Trigger className="flex w-56 flex-col gap-3 rounded-xl bg-surface-2 p-3 text-left shadow-surface-2 outline-none focus-visible:ring-1 focus-visible:ring-focus-ring">
134
+ <Morph.Part id="cover" className="h-28 w-full rounded-lg bg-brand/20" />
135
+ <Morph.Part id="title" className="text-subtitle weight-semibold text-foreground">Liquid glass</Morph.Part>
136
+ </Dialog.Trigger>
137
+ <Dialog.Content size="lg" effect="morph" hideSource>
138
+ <div className="flex flex-col gap-4">
139
+ <Morph.Part id="cover" className="h-48 w-full rounded-lg bg-brand/20" />
140
+ <Morph.Part id="title" className="text-title weight-bold text-foreground">Liquid glass</Morph.Part>
141
+ <Dialog.Description>The card grows into the dialog: its cover and title travel with it, and the rest of the panel is revealed around them.</Dialog.Description>
142
+ </div>
143
+ </Dialog.Content>
144
+ </Dialog>