@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,126 +0,0 @@
1
- import Textarea from './index'
2
- import Button from '../../button'
3
- import Input, { InputGroup, Label } from '../input'
4
-
5
- # Basics
6
-
7
- ## Basic
8
-
9
- Type past the third line: the box grows with the text, then scrolls at eight rows.
10
-
11
- <div className="w-72 max-w-full">
12
- <Textarea placeholder="Write a note..." />
13
- </div>
14
-
15
- ## Variants
16
-
17
- `borderless` is invisible until hovered or focused; `bordered` is framed at rest.
18
-
19
- <div className="flex flex-col gap-3 w-72 max-w-full">
20
- <Textarea minRows={2} placeholder="Borderless" />
21
- <Textarea variant="bordered" minRows={2} placeholder="Bordered" />
22
- </div>
23
-
24
- ## With a Label
25
-
26
- `Label` pairs with the textarea through `htmlFor` and `id`.
27
-
28
- <div className="flex flex-col gap-1 w-72 max-w-full">
29
- <Label htmlFor="textarea-bio">Bio</Label>
30
- <Textarea id="textarea-bio" placeholder="A few words about you" />
31
- </div>
32
-
33
- ## Rows
34
-
35
- `minRows` sets the empty height and `maxRows` where growth stops. Equal values give a fixed box.
36
-
37
- <div className="flex flex-col gap-3 w-72 max-w-full">
38
- <Textarea minRows={1} maxRows={4} placeholder="Starts at one row, grows to four" />
39
- <Textarea minRows={4} maxRows={4} placeholder="Fixed at four rows" />
40
- </div>
41
-
42
- ## Compact
43
-
44
- `size="compact"` steps the text and padding down the size ladder.
45
-
46
- <div className="w-72 max-w-full">
47
- <Textarea size="compact" minRows={2} placeholder="Dense note..." />
48
- </div>
49
-
50
- # States
51
-
52
- ## Invalid
53
-
54
- `invalid` turns the field destructive.
55
-
56
- <div className="flex flex-col gap-1 w-72 max-w-full">
57
- <Label htmlFor="textarea-invalid" invalid>
58
- Message
59
- </Label>
60
- <Textarea id="textarea-invalid" defaultValue="Too short" invalid />
61
- </div>
62
-
63
- ## Disabled
64
-
65
- <div className="w-72 max-w-full">
66
- <Textarea defaultValue="Read only for now" disabled />
67
- </div>
68
-
69
- # Composition
70
-
71
- ## In a form
72
-
73
- One row lines up with an Input of the same size, so the two stack without a seam.
74
-
75
- <div className="flex flex-col gap-3 w-72 max-w-full">
76
- <div className="flex flex-col gap-1">
77
- <Label htmlFor="textarea-form-title">Title</Label>
78
- <Input id="textarea-form-title" placeholder="Short summary" />
79
- </div>
80
- <div className="flex flex-col gap-1">
81
- <Label htmlFor="textarea-form-body">Description</Label>
82
- <Textarea id="textarea-form-body" minRows={1} placeholder="Add details" />
83
- </div>
84
- </div>
85
-
86
- ## In a group
87
-
88
- Inside `InputGroup.Field` the textarea joins the group's hover, and the field's `error` turns it destructive.
89
-
90
- <InputGroup>
91
- <InputGroup.Field index={0} label="Name" placeholder="Your name" />
92
- <InputGroup.Field index={1} label="Feedback" error="Tell us a little more.">
93
- <Textarea defaultValue="Nice" />
94
- </InputGroup.Field>
95
- </InputGroup>
96
-
97
- ## Uncontrolled
98
-
99
- With neither `value` nor `onChange` the DOM holds the text, so `ref` is the real `<textarea>`: `defaultValue`, `ref.current.value = ''` and a native form reset behave as on any textarea. Type, grow the box, then reset: the text goes back to its default and the box re-fits.
100
-
101
- <form className="flex flex-col items-start gap-2 w-72 max-w-full">
102
- <Textarea name="note" aria-label="Note" defaultValue={'First line\nSecond line\nThird line\nFourth line'} />
103
- <Button type="reset" variant="ghost">Reset</Button>
104
- </form>
105
-
106
- ```tsx
107
- const ref = useRef<HTMLTextAreaElement>(null)
108
-
109
- <Textarea ref={ref} name="note" defaultValue="Hello" />
110
-
111
- ref.current.value // what was typed
112
- ref.current.value = '' // clears it
113
- ```
114
-
115
-
116
- Choose one mode per instance. A `defaultValue` with an `onChange` that is passed on some renders and not others would flip the textarea between DOM-held and controlled text.
117
-
118
- ## With a form library
119
-
120
- A `register()`-style form needs the DOM mode, but its `onChange` takes an event where the Textarea's takes a string, so the result can't be spread whole. Only that key clashes: take `onChange` out and pass it as `onInput`, the event handler that fires on every keystroke. `rest` carries `name`, `ref` and `onBlur` straight through.
121
-
122
- ```tsx
123
- const { onChange, ...rest } = register('note')
124
-
125
- <Textarea {...rest} onInput={onChange} />
126
- ```
@@ -1,207 +0,0 @@
1
- /*
2
- * Local addition (not part of Fluid Functionalism): the multi-line twin of
3
- * Input, on the same field box (`useFieldBox` in `lib/field-classes.ts`); the box grows with its text from `minRows` to `maxRows`, the way
4
- * InputMessage's composer does.
5
- */
6
-
7
- import { Field } from '@base-ui/react/field'
8
- import { forwardRef, type TextareaHTMLAttributes, useCallback, useEffect, useLayoutEffect, useRef } from 'react'
9
- import { type FieldVariant, focusControlOnPress, useFieldBox } from '../../../lib/field-classes'
10
- import type { SizeVariant } from '../../../lib/size-context'
11
- import { useControllableState } from '../../../lib/use-controllable-state'
12
- import { cn } from '../../../lib/utils'
13
-
14
- interface TextareaProps
15
- extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange' | 'value' | 'defaultValue' | 'rows'> {
16
- /** Placeholder text. */
17
- placeholder?: string
18
- /** Controlled value. Pair with `onChange`. */
19
- value?: string
20
- /** Initial value when uncontrolled. Defaults to `''`. */
21
- defaultValue?: string
22
- /** Called with the new value on every change. With neither `value` nor `onChange` the textarea keeps its text in the DOM, for `register()`-style forms that read it through a `ref`; choose one mode per instance, since a `defaultValue` with a conditional `onChange` flips between the two. A form library's event handler goes in `onInput`, not here. */
23
- onChange?: (value: string) => void
24
- /** Rows shown when empty; the box never gets shorter. Defaults to `3`. */
25
- minRows?: number
26
- /** Rows the box grows to before it scrolls. Set it to `minRows` for a fixed height. Defaults to `8`. */
27
- maxRows?: number
28
- /** Framed at rest, or invisible until hovered or focused. Defaults to `"borderless"`. */
29
- variant?: FieldVariant
30
- /** Marks the value invalid: the field turns destructive and sets `aria-invalid`. Defaults to `false`. */
31
- invalid?: boolean
32
- /** Disables the textarea. Defaults to `false`. */
33
- disabled?: boolean
34
- /** Keeps the value selectable but not editable, with the field's read-only look. Defaults to the surrounding Field's `readOnly`. */
35
- readOnly?: boolean
36
- /** Marks the textarea required. Defaults to the surrounding Field's `required`. */
37
- required?: boolean
38
- /** Pins the textarea to one step of the size ladder (36px default, 28px compact): its text and padding follow, so one row matches an Input. Defaults to the surrounding SizeProvider. */
39
- size?: SizeVariant
40
- /** Classes for the ringed box around the textarea. */
41
- className?: string
42
- }
43
-
44
- // Literal table: one row plus this padding lands on the ladder's control
45
- // height (20px leading + 8px × 2 = 36px, + 4px × 2 = 28px).
46
- const PADDING_Y: Record<SizeVariant, string> = {
47
- default: 'py-2',
48
- compact: 'py-1',
49
- }
50
-
51
- /**
52
- * Multi-line text field that grows with what you type.
53
- *
54
- * It sits on the same ground as Input: bare text at rest (or framed, with
55
- * `variant="bordered"`), a muted fill with a hairline ring on hover, the
56
- * card ground on focus, a destructive ring when `invalid`. The box starts at `minRows`, grows line by line as text wraps,
57
- * and scrolls once it reaches `maxRows`. One row lines up with an Input of
58
- * the same size, so the two stack in a form without a seam. It is
59
- * uncontrolled with `defaultValue`, or controlled with `value` + `onChange`,
60
- * fills the width of its container, and joins a Base UI `Field` when placed
61
- * inside one. Pair it with a `Label` (see Input) through `htmlFor` / `id`,
62
- * or put it in an `InputGroup.Field` to label it, join the group's hover and
63
- * take the field's error.
64
- *
65
- * With neither `value` nor `onChange` it is a plain uncontrolled `<textarea>`:
66
- * the DOM holds the text, `ref` is the real element, and `defaultValue`,
67
- * `ref.current.value = ''` and a native `form.reset()` all behave as on any
68
- * textarea (the box re-fits on input and on a form reset), which is what a form
69
- * library reading fields through refs needs. Choose one mode per instance:
70
- * a `defaultValue` with an `onChange` that is sometimes passed and sometimes
71
- * not would flip the textarea between DOM-held and controlled text.
72
- *
73
- * `register()`'s result can't be spread whole, because its `onChange` takes an
74
- * event where this one takes a string, but only that key clashes. Pull it out
75
- * and hand it to `onInput`, which is the event handler and fires on every
76
- * keystroke: `const { onChange, ...rest } = register('x')` then
77
- * `<Textarea {...rest} onInput={onChange} />` (`rest` carries `name`, `ref`
78
- * and `onBlur`).
79
- *
80
- * @example {@include ./examples.mdx}
81
- */
82
- const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
83
- (
84
- {
85
- value: valueProp,
86
- defaultValue = '',
87
- onChange: onChangeProp,
88
- minRows = 3,
89
- maxRows = 8,
90
- variant = 'borderless',
91
- invalid,
92
- disabled,
93
- readOnly,
94
- required,
95
- size,
96
- className,
97
- ...props
98
- },
99
- ref,
100
- ) => {
101
- const [value, onChange] = useControllableState(valueProp, defaultValue, onChangeProp)
102
- const domState = valueProp === undefined && onChangeProp === undefined
103
-
104
- const textareaRef = useRef<HTMLTextAreaElement | null>(null)
105
- const box = useFieldBox({ variant, invalid, disabled, readOnly, required, size })
106
-
107
- const resize = useCallback(() => {
108
- const el = textareaRef.current
109
- if (!el) return
110
- el.style.height = 'auto'
111
- const lineHeight = Number.parseFloat(getComputedStyle(el).lineHeight)
112
- const max = lineHeight * Math.max(maxRows, minRows)
113
- el.style.height = `${Math.min(Math.max(el.scrollHeight, lineHeight * minRows), max)}px`
114
- el.style.overflowY = el.scrollHeight > max ? 'auto' : 'hidden'
115
- }, [minRows, maxRows])
116
-
117
- // Layout effect: the new height lands before paint, so a wrapped line
118
- // never flashes a scrollbar. `value` and the size step aren't read here,
119
- // but they change the content height `resize` measures.
120
- useLayoutEffect(resize, [resize, value, box.size.variant])
121
-
122
- // DOM-held text changes without a render: re-fit when code assigns `ref.current.value` (the
123
- // setter is wrapped on the element, over React's own value tracker) and once a native form
124
- // reset has put the default back.
125
- useEffect(() => {
126
- const el = textareaRef.current
127
- if (!domState || !el) return
128
- const own = Object.getOwnPropertyDescriptor(el, 'value')
129
- const inherited = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')
130
- const base = own ?? inherited
131
- const set = base?.set
132
- if (set) {
133
- Object.defineProperty(el, 'value', {
134
- configurable: true,
135
- enumerable: base.enumerable,
136
- get: base.get,
137
- set(next: string) {
138
- set.call(this, next)
139
- resize()
140
- },
141
- })
142
- }
143
- const form = el.form
144
- const onReset = () => setTimeout(resize)
145
- form?.addEventListener('reset', onReset)
146
- return () => {
147
- form?.removeEventListener('reset', onReset)
148
- if (own) Object.defineProperty(el, 'value', own)
149
- else if (set) Reflect.deleteProperty(el, 'value')
150
- }
151
- }, [domState, resize])
152
-
153
- // The first measure can run while an ancestor is still at (near-)zero
154
- // width. Width-gated, so the observer never loops on its own height writes.
155
- useEffect(() => {
156
- const el = textareaRef.current
157
- if (!el) return
158
- let lastWidth = el.offsetWidth
159
- const observer = new ResizeObserver(() => {
160
- if (el.offsetWidth === lastWidth) return
161
- lastWidth = el.offsetWidth
162
- resize()
163
- })
164
- observer.observe(el)
165
- return () => observer.disconnect()
166
- }, [resize])
167
-
168
- return (
169
- // biome-ignore lint/a11y/noStaticElementInteractions: the textarea is the focusable control; the box only forwards pointer focus from its padding.
170
- <div
171
- onMouseDown={focusControlOnPress(textareaRef)}
172
- {...box.props}
173
- className={cn(box.props.className, 'flex', PADDING_Y[box.size.variant], className)}
174
- >
175
- {/* Field.Control rendered as a <textarea>: on its own a plain
176
- textarea, inside a Field.Root it joins the field's wiring. The
177
- rest props ride on the render element, since Field.Control types
178
- its own as an <input>'s; Base UI merges the two. */}
179
- <Field.Control
180
- ref={(node: HTMLElement | null) => {
181
- const textarea = node as HTMLTextAreaElement | null
182
- textareaRef.current = textarea
183
- if (typeof ref === 'function') ref(textarea)
184
- else if (ref) ref.current = textarea
185
- }}
186
- render={<textarea rows={minRows} {...props} />}
187
- {...(domState ? { defaultValue, onChange: resize } : { value, onChange: e => onChange(e.target.value) })}
188
- disabled={box.disabled}
189
- readOnly={box.readOnly}
190
- required={box.required}
191
- aria-invalid={box.invalid || undefined}
192
- className={cn(
193
- 'block w-full resize-none rounded-none bg-transparent text-foreground placeholder:text-muted-foreground outline-none font-[inherit]',
194
- box.size.text,
195
- 'weight-normal',
196
- )}
197
- />
198
- </div>
199
- )
200
- },
201
- )
202
-
203
- Textarea.displayName = 'Textarea'
204
-
205
- export type { TextareaProps }
206
- export { Textarea }
207
- export default Textarea
@@ -1,136 +0,0 @@
1
- import NavigationMenu from './index'
2
- import { BookOpen, Boxes, Code, LifeBuoy, Newspaper, Palette, Rocket, Users } from 'lucide-react'
3
-
4
- # Basic
5
-
6
- Hover or press a trigger: the panel melts out of it. Move to the next trigger and the one panel springs to the new content, which slides in from that side.
7
-
8
- <div className="flex min-h-[320px] w-full justify-center">
9
- <NavigationMenu>
10
- <NavigationMenu.List>
11
- <NavigationMenu.Indicator />
12
- <NavigationMenu.Item value="product">
13
- <NavigationMenu.Trigger>Product</NavigationMenu.Trigger>
14
- <NavigationMenu.Content className="grid w-[26rem] grid-cols-2 gap-1">
15
- <NavigationMenu.Link href="#components" icon={Boxes} description="Every control, on one size ladder.">Components</NavigationMenu.Link>
16
- <NavigationMenu.Link href="#themes" icon={Palette} description="Tokens for light, dark and your brand.">Themes</NavigationMenu.Link>
17
- <NavigationMenu.Link href="#motion" icon={Rocket} description="Springs, goo and fluid hover.">Motion</NavigationMenu.Link>
18
- <NavigationMenu.Link href="#code" icon={Code} description="Typed, documented, tree-shaken.">For developers</NavigationMenu.Link>
19
- </NavigationMenu.Content>
20
- </NavigationMenu.Item>
21
- <NavigationMenu.Item value="resources">
22
- <NavigationMenu.Trigger>Resources</NavigationMenu.Trigger>
23
- <NavigationMenu.Content className="flex w-64 flex-col">
24
- <NavigationMenu.Link href="#docs" icon={BookOpen}>Documentation</NavigationMenu.Link>
25
- <NavigationMenu.Link href="#blog" icon={Newspaper}>Blog</NavigationMenu.Link>
26
- <NavigationMenu.Link href="#community" icon={Users}>Community</NavigationMenu.Link>
27
- <NavigationMenu.Link href="#support" icon={LifeBuoy}>Support</NavigationMenu.Link>
28
- </NavigationMenu.Content>
29
- </NavigationMenu.Item>
30
- <NavigationMenu.Item>
31
- <NavigationMenu.Link href="#pricing">Pricing</NavigationMenu.Link>
32
- </NavigationMenu.Item>
33
- </NavigationMenu.List>
34
- </NavigationMenu>
35
- </div>
36
-
37
- # Current page
38
-
39
- `active` on a link marks the current page: the indicator rests under it while no panel is open, and travels to whichever item opens.
40
-
41
- <div className="flex min-h-[240px] w-full justify-center">
42
- <NavigationMenu>
43
- <NavigationMenu.List>
44
- <NavigationMenu.Indicator />
45
- <NavigationMenu.Item>
46
- <NavigationMenu.Link href="#home">Home</NavigationMenu.Link>
47
- </NavigationMenu.Item>
48
- <NavigationMenu.Item>
49
- <NavigationMenu.Link href="#projects" active>Projects</NavigationMenu.Link>
50
- </NavigationMenu.Item>
51
- <NavigationMenu.Item value="team">
52
- <NavigationMenu.Trigger>Team</NavigationMenu.Trigger>
53
- <NavigationMenu.Content className="flex w-56 flex-col">
54
- <NavigationMenu.Link href="#members">Members</NavigationMenu.Link>
55
- <NavigationMenu.Link href="#roles">Roles</NavigationMenu.Link>
56
- <NavigationMenu.Link href="#invites">Invites</NavigationMenu.Link>
57
- </NavigationMenu.Content>
58
- </NavigationMenu.Item>
59
- </NavigationMenu.List>
60
- </NavigationMenu>
61
- </div>
62
-
63
- # Effects
64
-
65
- The morph options of every overlay: here the panel grows as a plain morph on the moderate tier.
66
-
67
- <div className="flex min-h-[240px] w-full justify-center">
68
- <NavigationMenu effect="morph" tier="moderate">
69
- <NavigationMenu.List>
70
- <NavigationMenu.Item value="docs">
71
- <NavigationMenu.Trigger>Docs</NavigationMenu.Trigger>
72
- <NavigationMenu.Content className="flex w-56 flex-col">
73
- <NavigationMenu.Link href="#start">Getting started</NavigationMenu.Link>
74
- <NavigationMenu.Link href="#guides">Guides</NavigationMenu.Link>
75
- <NavigationMenu.Link href="#api">API reference</NavigationMenu.Link>
76
- </NavigationMenu.Content>
77
- </NavigationMenu.Item>
78
- <NavigationMenu.Item value="company">
79
- <NavigationMenu.Trigger>Company</NavigationMenu.Trigger>
80
- <NavigationMenu.Content className="flex w-48 flex-col">
81
- <NavigationMenu.Link href="#about">About</NavigationMenu.Link>
82
- <NavigationMenu.Link href="#careers">Careers</NavigationMenu.Link>
83
- </NavigationMenu.Content>
84
- </NavigationMenu.Item>
85
- </NavigationMenu.List>
86
- </NavigationMenu>
87
- </div>
88
-
89
- # Compact
90
-
91
- `size="compact"` steps the strip and its panels down the size ladder.
92
-
93
- <div className="flex min-h-[240px] w-full justify-center">
94
- <NavigationMenu size="compact">
95
- <NavigationMenu.List>
96
- <NavigationMenu.Indicator />
97
- <NavigationMenu.Item value="product">
98
- <NavigationMenu.Trigger>Product</NavigationMenu.Trigger>
99
- <NavigationMenu.Content className="flex w-56 flex-col">
100
- <NavigationMenu.Link href="#components" icon={Boxes} description="Every control.">Components</NavigationMenu.Link>
101
- <NavigationMenu.Link href="#themes" icon={Palette} description="Tokens and modes.">Themes</NavigationMenu.Link>
102
- </NavigationMenu.Content>
103
- </NavigationMenu.Item>
104
- <NavigationMenu.Item>
105
- <NavigationMenu.Link href="#pricing">Pricing</NavigationMenu.Link>
106
- </NavigationMenu.Item>
107
- </NavigationMenu.List>
108
- </NavigationMenu>
109
- </div>
110
-
111
- # Landmark and slots
112
-
113
- The root is the `<nav>`: it takes a ref and HTML attributes, so give it an `aria-label`. `asChild` on `Trigger` and
114
- `Content` makes them the element you pass, which keeps its type and ref: here the panel is a real `ul` of `li` links.
115
-
116
- <div className="flex min-h-[240px] w-full justify-center">
117
- <NavigationMenu aria-label="Main">
118
- <NavigationMenu.List>
119
- <NavigationMenu.Item value="docs">
120
- <NavigationMenu.Trigger asChild>
121
- <button type="button">Docs</button>
122
- </NavigationMenu.Trigger>
123
- <NavigationMenu.Content asChild className="m-0 flex w-56 list-none flex-col">
124
- <ul>
125
- <li><NavigationMenu.Link href="#start" icon={BookOpen}>Getting started</NavigationMenu.Link></li>
126
- <li><NavigationMenu.Link href="#guides" icon={Newspaper}>Guides</NavigationMenu.Link></li>
127
- <li><NavigationMenu.Link href="#api" icon={Code}>API reference</NavigationMenu.Link></li>
128
- </ul>
129
- </NavigationMenu.Content>
130
- </NavigationMenu.Item>
131
- <NavigationMenu.Item>
132
- <NavigationMenu.Link href="#pricing">Pricing</NavigationMenu.Link>
133
- </NavigationMenu.Item>
134
- </NavigationMenu.List>
135
- </NavigationMenu>
136
- </div>