@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,27 @@
1
+ import ThinkingIndicator from './index'
2
+
3
+ # Basic
4
+
5
+ <ThinkingIndicator />
6
+
7
+ # Text only
8
+
9
+ Drop the glyph for an inline indicator, e.g. before a streamed reply.
10
+
11
+ <ThinkingIndicator showIcon={false} />
12
+
13
+ # Compact
14
+
15
+ The compact step of the size ladder, for dense transcripts.
16
+
17
+ <ThinkingIndicator size="compact" />
18
+
19
+ # Goo
20
+
21
+ Three dots melt into one blob and split again through the goo filter (see Morph), beside a plain label.
22
+
23
+ <ThinkingIndicator variant="goo" />
24
+
25
+ # Goo, compact
26
+
27
+ <ThinkingIndicator variant="goo" size="compact" />
@@ -0,0 +1,210 @@
1
+ /*
2
+ * Ported from Fluid Functionalism — github.com/mickadesign/fluid-functionalism
3
+ * `registry/default/thinking-indicator.tsx` @ b3587bdbd83fc66c2a6aae3817ffb856cb09260b
4
+ * MIT License © 2026 Micka Touillaud — fluidfunctionalism.com (notice: LICENSE.fluid-functionalism)
5
+ * Local modifications:
6
+ * - `"use client"` dropped; `framer-motion` → `motion/react`; `@/lib/*` →
7
+ * `../../../lib/*`.
8
+ * - Prop JSDoc kept from upstream (it matches the FF docs API table);
9
+ * modo TSDoc and examples on `ThinkingIndicator`. The `.shimmer-text` rule
10
+ * the label rides lives in base.css.
11
+ * - Styling reads DS tokens (AGENTS.md styling): `text-[Npx]` →
12
+ * `text-<role>[-compact]`; inline `fontVariationSettings` → `weight-*`;
13
+ * `duration-80|120|160` and tier-length JS durations → `duration-<tier>` /
14
+ * `spring.*`.
15
+ * - A `variant="goo"` look (local, the morph style's goo): three
16
+ * `muted-foreground` dots that melt into one blob (swelling to hold their
17
+ * area) and split again through the shared `GooFilter`, one loop every
18
+ * eight slow-tier lengths, beside a plain cycling label. Reduced motion
19
+ * (`useReduceMotion`: the OS setting or MotionConfig's, which now also
20
+ * counts for the shimmer look) holds them split and still. The default stays upstream's
21
+ * `shimmer` look.
22
+ */
23
+
24
+ import { AnimatePresence, motion } from 'motion/react'
25
+ import { forwardRef, type HTMLAttributes, useEffect, useId, useState } from 'react'
26
+ import { GooFilter } from '../../../lib/morph-layers'
27
+ import { useReduceMotion } from '../../../lib/reduced-motion'
28
+ import { type SizeVariant, useSize } from '../../../lib/size-context'
29
+ import { spring } from '../../../lib/springs'
30
+ import { GOO_BLUR_RATIO } from '../../../lib/use-morph'
31
+ import { cn } from '../../../lib/utils'
32
+
33
+ const circleA = 'M 12 8 C 14.21 8 16 9.79 16 12 C 16 14.21 14.21 16 12 16 C 9.79 16 8 14.21 8 12 C 8 9.79 9.79 8 12 8 Z'
34
+
35
+ const infinity = 'M 12 12 C 14 8.5 19 8.5 19 12 C 19 15.5 14 15.5 12 12 C 10 8.5 5 8.5 5 12 C 5 15.5 10 15.5 12 12 Z'
36
+
37
+ const circleB =
38
+ 'M 12 16 C 14.21 16 16 14.21 16 12 C 16 9.79 14.21 8 12 8 C 9.79 8 8 9.79 8 12 C 8 14.21 9.79 16 12 16 Z'
39
+
40
+ const words = ['Thinking', 'Moonwalking', 'Planning', 'Refining']
41
+
42
+ // Per ladder step, as literal classes for the extractor: the dot, the box of
43
+ // the three split dots, and the spacing between dot centers, wide enough that
44
+ // split dots let go of each other through the goo.
45
+ const DOTS: Record<SizeVariant, { box: string; dot: string; radius: number; gap: number }> = {
46
+ default: { box: 'h-5 w-[26px]', dot: 'size-1.5', radius: 3, gap: 10 },
47
+ compact: { box: 'h-[18px] w-[23px]', dot: 'size-[5px]', radius: 2.5, gap: 9 },
48
+ }
49
+
50
+ // The merged blob holds the three dots' area, so it swells as they melt in.
51
+ const MERGED = Math.sqrt(3)
52
+
53
+ /** Three dots that melt into one blob and split again, through the shared goo filter. */
54
+ function GooDots({ step, still }: { step: SizeVariant; still: boolean }) {
55
+ const gooId = `thinking-goo-${useId().replace(/:/g, '')}`
56
+ const { box, dot, radius, gap } = DOTS[step]
57
+ // Split → merged → split over eight slow-tier lengths. A spring per move
58
+ // is over in a frame or two at this size, too quick to see a neck form;
59
+ // eased all the way, the necks stretch and snap in view.
60
+ const loop = { duration: spring.slow.duration * 8, ease: 'easeInOut' as const, repeat: Infinity }
61
+
62
+ return (
63
+ <span aria-hidden className={cn('relative shrink-0', box)}>
64
+ <GooFilter id={gooId} blur={radius * GOO_BLUR_RATIO} />
65
+ {/* The filter is the effect itself: it melts the token-colored dots into one shape. */}
66
+ <span className="absolute inset-0 flex items-center justify-center" style={{ filter: `url(#${gooId})` }}>
67
+ {[-1, 0, 1].map(side => (
68
+ <motion.span
69
+ key={side}
70
+ className={cn('absolute rounded-full bg-muted-foreground', dot)}
71
+ animate={still ? { x: side * gap } : side ? { x: [side * gap, 0, side * gap] } : { scale: [1, MERGED, 1] }}
72
+ transition={still ? { duration: 0 } : loop}
73
+ />
74
+ ))}
75
+ </span>
76
+ </span>
77
+ )
78
+ }
79
+
80
+ interface ThinkingIndicatorProps extends HTMLAttributes<HTMLDivElement> {
81
+ /** The look: `shimmer` morphs a circle⇄infinity glyph beside a shimmering label (Fluid Functionalism's), `goo` melts three dots into one blob and splits them again beside a plain label. Defaults to `"shimmer"`. */
82
+ variant?: 'shimmer' | 'goo'
83
+ /** Show the glyph (or, for `goo`, the dots) before the label. Set to `false` for a text-only indicator (e.g. inline before a streamed reply). Defaults to `true`. */
84
+ showIcon?: boolean
85
+ /** Step on the size ladder. Wins over the surrounding SizeProvider. Defaults to the provider's step, else `"default"`. */
86
+ size?: SizeVariant
87
+ }
88
+
89
+ /**
90
+ * Animated status indicator with morphing SVG and cycling text — the
91
+ * assistant's working state.
92
+ *
93
+ * A glyph that morphs circle to infinity and back sits next to a shimmering
94
+ * label that cycles Thinking, Moonwalking, Planning, Refining, each word
95
+ * swapped on a spring. The row reserves the width of the longest word, so
96
+ * nothing around it shifts while the words change. One static "Thinking…" is
97
+ * announced to screen readers instead of a re-announcement every four
98
+ * seconds, and reduced motion drops both the morph and the cycling for a
99
+ * still glyph and label.
100
+ *
101
+ * `variant="goo"` swaps the glyph for three dots that melt into one blob and
102
+ * split again through the goo filter (see Morph), beside a plain label;
103
+ * reduced motion holds them split.
104
+ *
105
+ * @example {@include ./examples.mdx}
106
+ */
107
+ const ThinkingIndicator = forwardRef<HTMLDivElement, ThinkingIndicatorProps>(
108
+ ({ className, variant = 'shimmer', showIcon = true, size, ...props }, ref) => {
109
+ const step = useSize(size).variant
110
+ const compactStep = step === 'compact'
111
+ const [index, setIndex] = useState(0)
112
+ // Reduced motion drops the infinite glyph morph and the word cycling — a
113
+ // static glyph and label carry the same meaning without the movement.
114
+ const reduceMotion = useReduceMotion()
115
+ const label = variant === 'goo' ? 'text-muted-foreground' : 'shimmer-text'
116
+
117
+ useEffect(() => {
118
+ if (reduceMotion) return
119
+ const interval = setInterval(() => {
120
+ setIndex(i => (i + 1) % words.length)
121
+ }, 4000)
122
+ return () => clearInterval(interval)
123
+ }, [reduceMotion])
124
+
125
+ return (
126
+ <div ref={ref} role="status" className={cn('flex items-center gap-2 px-3 py-2', className)} {...props}>
127
+ {/* Static announcement — the cycling word display below is aria-hidden
128
+ so screen readers hear one "Thinking…" instead of a re-announcement
129
+ every 4 seconds. */}
130
+ <span className="sr-only">Thinking…</span>
131
+ {showIcon && variant === 'goo' && <GooDots step={step} still={reduceMotion} />}
132
+ {showIcon && variant === 'shimmer' && (
133
+ <motion.svg
134
+ aria-hidden
135
+ width={compactStep ? 18 : 20}
136
+ height={compactStep ? 18 : 20}
137
+ viewBox="0 0 24 24"
138
+ fill="none"
139
+ stroke="currentColor"
140
+ strokeWidth={1.5}
141
+ strokeLinecap="round"
142
+ strokeLinejoin="round"
143
+ className="text-muted-foreground shrink-0"
144
+ >
145
+ {reduceMotion ? (
146
+ <path d={infinity} />
147
+ ) : (
148
+ <motion.path
149
+ d={circleA}
150
+ initial={{ d: circleA }}
151
+ animate={{
152
+ d: [circleA, infinity, circleB, infinity, circleA],
153
+ }}
154
+ transition={{
155
+ d: {
156
+ duration: 6,
157
+ ease: 'easeInOut',
158
+ repeat: Infinity,
159
+ times: [0, 0.25, 0.5, 0.75, 1.0],
160
+ },
161
+ }}
162
+ />
163
+ )}
164
+ </motion.svg>
165
+ )}
166
+ <span
167
+ aria-hidden="true"
168
+ className={cn(
169
+ 'inline-grid overflow-hidden',
170
+ compactStep ? 'text-body-compact' : 'text-body',
171
+ 'weight-medium',
172
+ )}
173
+ >
174
+ <span className={cn('col-start-1 row-start-1 invisible', label)}>
175
+ {words.reduce((a, b) => (a.length >= b.length ? a : b))}
176
+ </span>
177
+ {reduceMotion ? (
178
+ <span className={cn('col-start-1 row-start-1', label)}>{words[0]}</span>
179
+ ) : (
180
+ <AnimatePresence mode="popLayout" initial={false}>
181
+ <motion.span
182
+ key={words[index]}
183
+ className={cn('col-start-1 row-start-1', label)}
184
+ initial={{ y: '80%', opacity: 0 }}
185
+ animate={{
186
+ y: 0,
187
+ opacity: 1,
188
+ transition: { duration: spring.slow.duration, ease: [0.4, 0, 0.2, 1] },
189
+ }}
190
+ exit={{
191
+ y: '-80%',
192
+ opacity: 0,
193
+ transition: { duration: spring.slow.exit.duration, ease: [0.4, 0, 0.2, 1] },
194
+ }}
195
+ >
196
+ {words[index]}
197
+ </motion.span>
198
+ </AnimatePresence>
199
+ )}
200
+ </span>
201
+ </div>
202
+ )
203
+ },
204
+ )
205
+
206
+ ThinkingIndicator.displayName = 'ThinkingIndicator'
207
+
208
+ export type { ThinkingIndicatorProps }
209
+ export { ThinkingIndicator }
210
+ export default ThinkingIndicator
@@ -0,0 +1,148 @@
1
+ import Accordion from './index'
2
+
3
+ # Standalone
4
+
5
+ A single collapsible item with its own hover state.
6
+
7
+ <Accordion type="single" collapsible defaultValue="item-1">
8
+ <Accordion.Item value="item-1">
9
+ <Accordion.Trigger>What is this component?</Accordion.Trigger>
10
+ <Accordion.Content>
11
+ A collapsible accordion with animated expand/collapse and spring-animated chevron.
12
+ </Accordion.Content>
13
+ </Accordion.Item>
14
+ </Accordion>
15
+
16
+ # Single Expand
17
+
18
+ Multiple items with fluid hover — only one can be expanded at a time.
19
+
20
+ <Accordion.Group type="single" collapsible defaultValue="item-1">
21
+ <Accordion.Item value="item-1" index={0}>
22
+ <Accordion.Trigger>Getting Started</Accordion.Trigger>
23
+ <Accordion.Content>
24
+ Install the component and import it into your project. The accordion
25
+ supports both single and multiple expand modes.
26
+ </Accordion.Content>
27
+ </Accordion.Item>
28
+ <Accordion.Item value="item-2" index={1}>
29
+ <Accordion.Trigger>Styling</Accordion.Trigger>
30
+ <Accordion.Content>
31
+ The component integrates with the shape system for pill or rounded
32
+ border-radius variants. All animations use spring physics.
33
+ </Accordion.Content>
34
+ </Accordion.Item>
35
+ <Accordion.Item value="item-3" index={2}>
36
+ <Accordion.Trigger>Accessibility</Accordion.Trigger>
37
+ <Accordion.Content>
38
+ Built on Base UI Accordion with WAI-ARIA attributes, keyboard
39
+ navigation, and focus management.
40
+ </Accordion.Content>
41
+ </Accordion.Item>
42
+ <Accordion.Item value="item-4" index={3}>
43
+ <Accordion.Trigger>Animation</Accordion.Trigger>
44
+ <Accordion.Content>
45
+ The panel morphs out of its row and the chevron rotates on a spring.
46
+ The fluid hover background tracks your cursor.
47
+ </Accordion.Content>
48
+ </Accordion.Item>
49
+ </Accordion.Group>
50
+
51
+ # Multi Expand
52
+
53
+ Multiple items with fluid hover — several can be expanded at once.
54
+
55
+ <Accordion.Group type="multiple" defaultValue={['item-1', 'item-3']}>
56
+ <Accordion.Item value="item-1" index={0}>
57
+ <Accordion.Trigger>First Section</Accordion.Trigger>
58
+ <Accordion.Content>
59
+ Multiple items can be expanded at the same time.
60
+ </Accordion.Content>
61
+ </Accordion.Item>
62
+ <Accordion.Item value="item-2" index={1}>
63
+ <Accordion.Trigger>Second Section</Accordion.Trigger>
64
+ <Accordion.Content>
65
+ Click any trigger to expand or collapse independently.
66
+ </Accordion.Content>
67
+ </Accordion.Item>
68
+ <Accordion.Item value="item-3" index={2}>
69
+ <Accordion.Trigger>Third Section</Accordion.Trigger>
70
+ <Accordion.Content>
71
+ Each item operates independently in multiple mode.
72
+ </Accordion.Content>
73
+ </Accordion.Item>
74
+ </Accordion.Group>
75
+
76
+ # Row highlight
77
+
78
+ With `highlight="trigger"` an expanded item holds no tint — the fill
79
+ scopes to the row and waits for hover. Suits dense panels, where a block
80
+ per open item reads as a second layer.
81
+
82
+ <Accordion.Group type="single" collapsible defaultValue="item-1" highlight="trigger">
83
+ <Accordion.Item value="item-1" index={0}>
84
+ <Accordion.Trigger>Expanded, but not tinted</Accordion.Trigger>
85
+ <Accordion.Content>
86
+ The panel reads as part of the page rather than a filled block.
87
+ </Accordion.Content>
88
+ </Accordion.Item>
89
+ <Accordion.Item value="item-2" index={1}>
90
+ <Accordion.Trigger>Hover any row</Accordion.Trigger>
91
+ <Accordion.Content>
92
+ The fill follows your cursor instead of marking a state.
93
+ </Accordion.Content>
94
+ </Accordion.Item>
95
+ <Accordion.Item value="item-3" index={2}>
96
+ <Accordion.Trigger>Compare with the sections above</Accordion.Trigger>
97
+ <Accordion.Content>
98
+ Those hold a block across the row and its panel while open.
99
+ </Accordion.Content>
100
+ </Accordion.Item>
101
+ </Accordion.Group>
102
+
103
+ # Morph
104
+
105
+ Each panel drips out of the row where it was pressed (its middle, from the keyboard) and widens into the item, its content revealed by the same shape; closing folds it back into the row. The rows below ride its bottom edge.
106
+
107
+ <Accordion.Group type="single" collapsible defaultValue="shipping">
108
+ <Accordion.Item value="shipping" index={0}>
109
+ <Accordion.Trigger>When does my order ship?</Accordion.Trigger>
110
+ <Accordion.Content>
111
+ Orders placed before noon leave the same day. You get a tracking
112
+ link by email as soon as the parcel is scanned.
113
+ </Accordion.Content>
114
+ </Accordion.Item>
115
+ <Accordion.Item value="returns" index={1}>
116
+ <Accordion.Trigger>Can I return it?</Accordion.Trigger>
117
+ <Accordion.Content>
118
+ Anything unused comes back free within 30 days. Start a return from
119
+ your order page and print the label.
120
+ </Accordion.Content>
121
+ </Accordion.Item>
122
+ <Accordion.Item value="warranty" index={2}>
123
+ <Accordion.Trigger>What does the warranty cover?</Accordion.Trigger>
124
+ <Accordion.Content>
125
+ Two years on parts and labour. Accidental damage is covered once,
126
+ on top of that.
127
+ </Accordion.Content>
128
+ </Accordion.Item>
129
+ </Accordion.Group>
130
+
131
+ # Without the goo
132
+
133
+ `effect="morph"` grows the same shape with no liquid neck to its row; `tier="moderate"` runs the goo on the quicker, critically damped spring.
134
+
135
+ <Accordion.Group type="single" collapsible>
136
+ <Accordion.Item value="morph" index={0}>
137
+ <Accordion.Trigger>Plain morph</Accordion.Trigger>
138
+ <Accordion.Content effect="morph">
139
+ The tint grows from the press point into the item, with no neck.
140
+ </Accordion.Content>
141
+ </Accordion.Item>
142
+ <Accordion.Item value="moderate" index={1}>
143
+ <Accordion.Trigger>Moderate tier</Accordion.Trigger>
144
+ <Accordion.Content tier="moderate">
145
+ The goo again, on the moderate spring.
146
+ </Accordion.Content>
147
+ </Accordion.Item>
148
+ </Accordion.Group>