@yewdiel21/motion-kit 0.10.0 → 0.14.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 (365) hide show
  1. package/README.md +155 -93
  2. package/dist/auto/index.d.ts +53 -3
  3. package/dist/auto/index.js +101 -3
  4. package/dist/auto/index.js.map +1 -1
  5. package/dist/{chunk-IKQ5FODN.js → chunk-6P4P7NU6.js} +2 -218
  6. package/dist/chunk-6P4P7NU6.js.map +1 -0
  7. package/dist/chunk-CU6SXW3E.js +20334 -0
  8. package/dist/chunk-CU6SXW3E.js.map +1 -0
  9. package/dist/{chunk-XAKC2QY7.js → chunk-EY4BJKC4.js} +3 -28
  10. package/dist/chunk-EY4BJKC4.js.map +1 -0
  11. package/dist/chunk-QP4QJOEN.js +72 -0
  12. package/dist/chunk-QP4QJOEN.js.map +1 -0
  13. package/dist/css/components/activity-feed.css +240 -0
  14. package/dist/css/components/attachment.css +266 -0
  15. package/dist/css/components/breadcrumb.css +110 -0
  16. package/dist/css/components/chart-tooltip.css +168 -0
  17. package/dist/css/components/chart.css +296 -0
  18. package/dist/css/components/code-block.css +264 -0
  19. package/dist/css/components/color-area.css +82 -0
  20. package/dist/css/components/color-field.css +67 -0
  21. package/dist/css/components/color-picker.css +131 -0
  22. package/dist/css/components/color-slider.css +113 -0
  23. package/dist/css/components/command-search.css +252 -0
  24. package/dist/css/components/context-menu.css +23 -0
  25. package/dist/css/components/credit-card.css +288 -0
  26. package/dist/css/components/data-table.css +591 -0
  27. package/dist/css/components/date-range-picker.css +168 -0
  28. package/dist/css/components/date-time-picker.css +178 -0
  29. package/dist/css/components/drawer.css +58 -0
  30. package/dist/css/components/editable-table.css +201 -0
  31. package/dist/css/components/empty-state.css +61 -0
  32. package/dist/css/components/file-explorer.css +633 -0
  33. package/dist/css/components/filter-builder.css +232 -0
  34. package/dist/css/components/hold-confirm.css +87 -0
  35. package/dist/css/components/hover-card.css +13 -7
  36. package/dist/css/components/image-preview.css +195 -0
  37. package/dist/css/components/json-viewer.css +272 -0
  38. package/dist/css/components/like-button.css +78 -0
  39. package/dist/css/components/link-preview.css +275 -0
  40. package/dist/css/components/loading-button.css +77 -0
  41. package/dist/css/components/multi-select.css +267 -0
  42. package/dist/css/components/notification-bell.css +127 -0
  43. package/dist/css/components/password-strength.css +183 -0
  44. package/dist/css/components/popover.css +25 -0
  45. package/dist/css/components/progress.css +140 -0
  46. package/dist/css/components/questionnaire.css +217 -0
  47. package/dist/css/components/range-calendar.css +186 -0
  48. package/dist/css/components/range-slider.css +192 -0
  49. package/dist/css/components/resizable-panel.css +243 -0
  50. package/dist/css/components/rich-text-editor.css +284 -0
  51. package/dist/css/components/scratch-card.css +75 -0
  52. package/dist/css/components/skeleton.css +108 -0
  53. package/dist/css/components/split-view.css +19 -0
  54. package/dist/css/components/star-rating.css +80 -0
  55. package/dist/css/components/stat-card.css +164 -0
  56. package/dist/css/components/swipe-actions.css +105 -0
  57. package/dist/css/components/tag-input.css +244 -0
  58. package/dist/css/components/time-field.css +88 -0
  59. package/dist/css/components/timeline.css +219 -0
  60. package/dist/css/components/tooltip.css +79 -0
  61. package/dist/css/components/tree-view.css +210 -0
  62. package/dist/css/components/virtual-list.css +195 -0
  63. package/dist/css/tokens.css +185 -181
  64. package/dist/elements/index.d.ts +674 -5
  65. package/dist/elements/index.js +1361 -8
  66. package/dist/elements/index.js.map +1 -1
  67. package/dist/{engine-GDGwQnJE.d.ts → engine-Cn6IhE3z.d.ts} +1 -1
  68. package/dist/engine-QECQnGz1.d.ts +33 -0
  69. package/dist/index.css +9104 -189
  70. package/dist/index.d.ts +89 -5
  71. package/dist/index.js +243 -9
  72. package/dist/index.js.map +1 -1
  73. package/dist/react/index.d.ts +579 -23
  74. package/dist/react/index.js +2042 -7
  75. package/dist/react/index.js.map +1 -1
  76. package/dist/{reduced-BmBzKH94.d.ts → reduced-BBUusld6.d.ts} +9 -2
  77. package/dist/reveal-DEvp6U6T.d.ts +2381 -0
  78. package/dist/{store-DYb3tTsZ.d.ts → store-DjkTBX7f.d.ts} +2 -2
  79. package/package.json +1 -1
  80. package/registry.json +406 -1
  81. package/src/auto/auto-init.ts +98 -0
  82. package/src/components/activity-feed/README.md +56 -0
  83. package/src/components/activity-feed/activity-feed.css +239 -0
  84. package/src/components/activity-feed/element.ts +36 -0
  85. package/src/components/activity-feed/engine.ts +351 -0
  86. package/src/components/activity-feed/react.tsx +32 -0
  87. package/src/components/attachment/README.md +27 -0
  88. package/src/components/attachment/attachment.css +265 -0
  89. package/src/components/attachment/element.ts +50 -0
  90. package/src/components/attachment/engine.ts +469 -0
  91. package/src/components/attachment/react.tsx +65 -0
  92. package/src/components/breadcrumb/README.md +38 -0
  93. package/src/components/breadcrumb/breadcrumb.css +109 -0
  94. package/src/components/breadcrumb/element.ts +27 -0
  95. package/src/components/breadcrumb/engine.ts +249 -0
  96. package/src/components/breadcrumb/react.tsx +30 -0
  97. package/src/components/chart/README.md +24 -0
  98. package/src/components/chart/chart.css +295 -0
  99. package/src/components/chart/element.ts +41 -0
  100. package/src/components/chart/engine.ts +811 -0
  101. package/src/components/chart/react.tsx +50 -0
  102. package/src/components/chart-tooltip/README.md +53 -0
  103. package/src/components/chart-tooltip/chart-tooltip.css +167 -0
  104. package/src/components/chart-tooltip/element.ts +37 -0
  105. package/src/components/chart-tooltip/engine.ts +442 -0
  106. package/src/components/chart-tooltip/react.tsx +47 -0
  107. package/src/components/code-block/README.md +19 -0
  108. package/src/components/code-block/code-block.css +263 -0
  109. package/src/components/code-block/element.ts +34 -0
  110. package/src/components/code-block/engine.ts +254 -0
  111. package/src/components/code-block/highlight.ts +244 -0
  112. package/src/components/code-block/react.tsx +94 -0
  113. package/src/components/color-area/README.md +50 -0
  114. package/src/components/color-area/color-area.css +81 -0
  115. package/src/components/color-area/element.ts +26 -0
  116. package/src/components/color-area/engine.ts +246 -0
  117. package/src/components/color-area/react.tsx +42 -0
  118. package/src/components/color-field/README.md +43 -0
  119. package/src/components/color-field/color-field.css +66 -0
  120. package/src/components/color-field/element.ts +26 -0
  121. package/src/components/color-field/engine.ts +174 -0
  122. package/src/components/color-field/react.tsx +42 -0
  123. package/src/components/color-picker/README.md +45 -0
  124. package/src/components/color-picker/color-picker.css +130 -0
  125. package/src/components/color-picker/element.ts +45 -0
  126. package/src/components/color-picker/engine.ts +314 -0
  127. package/src/components/color-picker/react.tsx +47 -0
  128. package/src/components/color-slider/README.md +55 -0
  129. package/src/components/color-slider/color-slider.css +112 -0
  130. package/src/components/color-slider/element.ts +26 -0
  131. package/src/components/color-slider/engine.ts +234 -0
  132. package/src/components/color-slider/react.tsx +45 -0
  133. package/src/components/command-search/README.md +15 -0
  134. package/src/components/command-search/command-search.css +251 -0
  135. package/src/components/command-search/element.ts +36 -0
  136. package/src/components/command-search/engine.ts +356 -0
  137. package/src/components/command-search/match.ts +53 -0
  138. package/src/components/command-search/react.tsx +66 -0
  139. package/src/components/context-menu/README.md +31 -0
  140. package/src/components/context-menu/context-menu.css +22 -0
  141. package/src/components/context-menu/element.ts +40 -0
  142. package/src/components/context-menu/engine.ts +153 -0
  143. package/src/components/context-menu/react.tsx +57 -0
  144. package/src/components/credit-card/README.md +20 -0
  145. package/src/components/credit-card/card.ts +77 -0
  146. package/src/components/credit-card/credit-card.css +287 -0
  147. package/src/components/credit-card/element.ts +33 -0
  148. package/src/components/credit-card/engine.ts +410 -0
  149. package/src/components/credit-card/react.tsx +36 -0
  150. package/src/components/data-table/README.md +83 -0
  151. package/src/components/data-table/data-table.css +590 -0
  152. package/src/components/data-table/element.ts +54 -0
  153. package/src/components/data-table/engine.ts +1059 -0
  154. package/src/components/data-table/react.tsx +94 -0
  155. package/src/components/date-range-picker/README.md +51 -0
  156. package/src/components/date-range-picker/date-range-picker.css +167 -0
  157. package/src/components/date-range-picker/element.ts +52 -0
  158. package/src/components/date-range-picker/engine.ts +352 -0
  159. package/src/components/date-range-picker/react.tsx +57 -0
  160. package/src/components/date-time-picker/README.md +48 -0
  161. package/src/components/date-time-picker/date-time-picker.css +177 -0
  162. package/src/components/date-time-picker/element.ts +47 -0
  163. package/src/components/date-time-picker/engine.ts +350 -0
  164. package/src/components/date-time-picker/react.tsx +54 -0
  165. package/src/components/dialog/README.md +103 -102
  166. package/src/components/dialog/element.ts +123 -118
  167. package/src/components/dialog/engine.ts +449 -432
  168. package/src/components/drawer/README.md +28 -0
  169. package/src/components/drawer/drawer.css +57 -0
  170. package/src/components/drawer/element.ts +21 -0
  171. package/src/components/drawer/engine.ts +56 -0
  172. package/src/components/drawer/react.tsx +85 -0
  173. package/src/components/editable-table/README.md +67 -0
  174. package/src/components/editable-table/editable-table.css +200 -0
  175. package/src/components/editable-table/element.ts +45 -0
  176. package/src/components/editable-table/engine.ts +775 -0
  177. package/src/components/editable-table/react.tsx +79 -0
  178. package/src/components/empty-state/README.md +41 -0
  179. package/src/components/empty-state/element.ts +23 -0
  180. package/src/components/empty-state/empty-state.css +60 -0
  181. package/src/components/empty-state/engine.ts +232 -0
  182. package/src/components/empty-state/react.tsx +34 -0
  183. package/src/components/file-explorer/README.md +67 -0
  184. package/src/components/file-explorer/element.ts +39 -0
  185. package/src/components/file-explorer/engine.ts +1307 -0
  186. package/src/components/file-explorer/file-explorer.css +632 -0
  187. package/src/components/file-explorer/react.tsx +77 -0
  188. package/src/components/filter-builder/README.md +47 -0
  189. package/src/components/filter-builder/element.ts +34 -0
  190. package/src/components/filter-builder/engine.ts +365 -0
  191. package/src/components/filter-builder/filter-builder.css +231 -0
  192. package/src/components/filter-builder/react.tsx +36 -0
  193. package/src/components/hold-confirm/README.md +13 -0
  194. package/src/components/hold-confirm/element.ts +24 -0
  195. package/src/components/hold-confirm/engine.ts +216 -0
  196. package/src/components/hold-confirm/hold-confirm.css +86 -0
  197. package/src/components/hold-confirm/react.tsx +28 -0
  198. package/src/components/hover-card/README.md +6 -2
  199. package/src/components/hover-card/engine.ts +68 -6
  200. package/src/components/hover-card/hover-card.css +13 -7
  201. package/src/components/image-preview/README.md +16 -0
  202. package/src/components/image-preview/element.ts +26 -0
  203. package/src/components/image-preview/engine.ts +325 -0
  204. package/src/components/image-preview/image-preview.css +194 -0
  205. package/src/components/image-preview/react.tsx +43 -0
  206. package/src/components/json-viewer/README.md +56 -0
  207. package/src/components/json-viewer/element.ts +37 -0
  208. package/src/components/json-viewer/engine.ts +440 -0
  209. package/src/components/json-viewer/json-viewer.css +271 -0
  210. package/src/components/json-viewer/react.tsx +56 -0
  211. package/src/components/like-button/README.md +13 -0
  212. package/src/components/like-button/element.ts +47 -0
  213. package/src/components/like-button/engine.ts +145 -0
  214. package/src/components/like-button/like-button.css +77 -0
  215. package/src/components/like-button/react.tsx +39 -0
  216. package/src/components/link-preview/README.md +19 -0
  217. package/src/components/link-preview/element.ts +29 -0
  218. package/src/components/link-preview/engine.ts +192 -0
  219. package/src/components/link-preview/link-preview.css +274 -0
  220. package/src/components/link-preview/react.tsx +101 -0
  221. package/src/components/loading-button/README.md +45 -0
  222. package/src/components/loading-button/element.ts +34 -0
  223. package/src/components/loading-button/engine.ts +201 -0
  224. package/src/components/loading-button/loading-button.css +76 -0
  225. package/src/components/loading-button/react.tsx +43 -0
  226. package/src/components/multi-select/README.md +48 -0
  227. package/src/components/multi-select/element.ts +28 -0
  228. package/src/components/multi-select/engine.ts +294 -0
  229. package/src/components/multi-select/multi-select.css +266 -0
  230. package/src/components/multi-select/react.tsx +39 -0
  231. package/src/components/notification-bell/README.md +14 -0
  232. package/src/components/notification-bell/element.ts +48 -0
  233. package/src/components/notification-bell/engine.ts +202 -0
  234. package/src/components/notification-bell/notification-bell.css +126 -0
  235. package/src/components/notification-bell/react.tsx +57 -0
  236. package/src/components/password-strength/README.md +17 -0
  237. package/src/components/password-strength/element.ts +22 -0
  238. package/src/components/password-strength/engine.ts +212 -0
  239. package/src/components/password-strength/password-strength.css +182 -0
  240. package/src/components/password-strength/react.tsx +36 -0
  241. package/src/components/password-strength/score.ts +62 -0
  242. package/src/components/popover/README.md +44 -0
  243. package/src/components/popover/element.ts +31 -0
  244. package/src/components/popover/engine.ts +114 -0
  245. package/src/components/popover/popover.css +24 -0
  246. package/src/components/popover/react.tsx +50 -0
  247. package/src/components/progress/README.md +17 -0
  248. package/src/components/progress/element.ts +30 -0
  249. package/src/components/progress/engine.ts +173 -0
  250. package/src/components/progress/progress.css +139 -0
  251. package/src/components/progress/react.tsx +35 -0
  252. package/src/components/questionnaire/README.md +32 -0
  253. package/src/components/questionnaire/element.ts +118 -0
  254. package/src/components/questionnaire/engine.ts +255 -0
  255. package/src/components/questionnaire/questionnaire.css +216 -0
  256. package/src/components/questionnaire/react.tsx +140 -0
  257. package/src/components/range-calendar/README.md +58 -0
  258. package/src/components/range-calendar/element.ts +42 -0
  259. package/src/components/range-calendar/engine.ts +390 -0
  260. package/src/components/range-calendar/range-calendar.css +185 -0
  261. package/src/components/range-calendar/react.tsx +56 -0
  262. package/src/components/range-slider/README.md +23 -0
  263. package/src/components/range-slider/element.ts +53 -0
  264. package/src/components/range-slider/engine.ts +316 -0
  265. package/src/components/range-slider/range-slider.css +191 -0
  266. package/src/components/range-slider/react.tsx +66 -0
  267. package/src/components/resizable-panel/README.md +61 -0
  268. package/src/components/resizable-panel/element.ts +36 -0
  269. package/src/components/resizable-panel/engine.ts +551 -0
  270. package/src/components/resizable-panel/react.tsx +74 -0
  271. package/src/components/resizable-panel/resizable-panel.css +242 -0
  272. package/src/components/rich-text-editor/README.md +57 -0
  273. package/src/components/rich-text-editor/element.ts +34 -0
  274. package/src/components/rich-text-editor/engine.ts +673 -0
  275. package/src/components/rich-text-editor/react.tsx +60 -0
  276. package/src/components/rich-text-editor/rich-text-editor.css +283 -0
  277. package/src/components/scratch-card/README.md +15 -0
  278. package/src/components/scratch-card/element.ts +30 -0
  279. package/src/components/scratch-card/engine.ts +257 -0
  280. package/src/components/scratch-card/react.tsx +40 -0
  281. package/src/components/scratch-card/scratch-card.css +74 -0
  282. package/src/components/skeleton/README.md +15 -0
  283. package/src/components/skeleton/element.ts +32 -0
  284. package/src/components/skeleton/engine.ts +104 -0
  285. package/src/components/skeleton/react.tsx +41 -0
  286. package/src/components/skeleton/skeleton.css +107 -0
  287. package/src/components/split-view/README.md +50 -0
  288. package/src/components/split-view/element.ts +34 -0
  289. package/src/components/split-view/engine.ts +114 -0
  290. package/src/components/split-view/react.tsx +63 -0
  291. package/src/components/split-view/split-view.css +18 -0
  292. package/src/components/star-rating/README.md +14 -0
  293. package/src/components/star-rating/element.ts +26 -0
  294. package/src/components/star-rating/engine.ts +217 -0
  295. package/src/components/star-rating/react.tsx +33 -0
  296. package/src/components/star-rating/star-rating.css +79 -0
  297. package/src/components/stat-card/README.md +42 -0
  298. package/src/components/stat-card/element.ts +40 -0
  299. package/src/components/stat-card/engine.ts +283 -0
  300. package/src/components/stat-card/react.tsx +36 -0
  301. package/src/components/stat-card/stat-card.css +163 -0
  302. package/src/components/swipe-actions/README.md +19 -0
  303. package/src/components/swipe-actions/element.ts +26 -0
  304. package/src/components/swipe-actions/engine.ts +260 -0
  305. package/src/components/swipe-actions/react.tsx +80 -0
  306. package/src/components/swipe-actions/swipe-actions.css +104 -0
  307. package/src/components/tag-input/README.md +42 -0
  308. package/src/components/tag-input/element.ts +39 -0
  309. package/src/components/tag-input/engine.ts +313 -0
  310. package/src/components/tag-input/react.tsx +54 -0
  311. package/src/components/tag-input/tag-input.css +243 -0
  312. package/src/components/time-field/README.md +54 -0
  313. package/src/components/time-field/element.ts +38 -0
  314. package/src/components/time-field/engine.ts +110 -0
  315. package/src/components/time-field/react.tsx +45 -0
  316. package/src/components/time-field/time-field.css +87 -0
  317. package/src/components/timeline/README.md +57 -0
  318. package/src/components/timeline/element.ts +31 -0
  319. package/src/components/timeline/engine.ts +300 -0
  320. package/src/components/timeline/react.tsx +59 -0
  321. package/src/components/timeline/timeline.css +218 -0
  322. package/src/components/tooltip/README.md +46 -0
  323. package/src/components/tooltip/element.ts +22 -0
  324. package/src/components/tooltip/engine.ts +288 -0
  325. package/src/components/tooltip/react.tsx +30 -0
  326. package/src/components/tooltip/tooltip.css +78 -0
  327. package/src/components/tree-view/README.md +61 -0
  328. package/src/components/tree-view/element.ts +32 -0
  329. package/src/components/tree-view/engine.ts +569 -0
  330. package/src/components/tree-view/react.tsx +78 -0
  331. package/src/components/tree-view/tree-view.css +209 -0
  332. package/src/components/virtual-list/README.md +81 -0
  333. package/src/components/virtual-list/element.ts +42 -0
  334. package/src/components/virtual-list/engine.ts +678 -0
  335. package/src/components/virtual-list/react.tsx +101 -0
  336. package/src/components/virtual-list/virtual-list.css +194 -0
  337. package/src/core/chips.ts +196 -0
  338. package/src/core/color.ts +304 -0
  339. package/src/core/date-range.ts +67 -0
  340. package/src/core/dates.ts +11 -1
  341. package/src/core/files.ts +107 -0
  342. package/src/core/filter.ts +229 -0
  343. package/src/core/gsap.ts +80 -65
  344. package/src/core/listbox.ts +332 -0
  345. package/src/core/mark.ts +29 -0
  346. package/src/core/position.ts +89 -0
  347. package/src/core/relative-time.ts +77 -0
  348. package/src/core/segment-field.ts +373 -0
  349. package/src/core/segments.ts +153 -0
  350. package/src/core/tree.ts +116 -0
  351. package/src/core/virtual.ts +79 -0
  352. package/src/css/tokens.css +186 -182
  353. package/src/elements/index.ts +147 -0
  354. package/src/index.ts +72 -0
  355. package/src/motion/micro.ts +248 -0
  356. package/src/motion/sheet.ts +88 -65
  357. package/src/motion/surface.ts +9 -0
  358. package/src/react/index.ts +57 -0
  359. package/dist/chunk-IKQ5FODN.js.map +0 -1
  360. package/dist/chunk-J6OCFNGU.js +0 -177
  361. package/dist/chunk-J6OCFNGU.js.map +0 -1
  362. package/dist/chunk-TFNRIZHU.js +0 -3977
  363. package/dist/chunk-TFNRIZHU.js.map +0 -1
  364. package/dist/chunk-XAKC2QY7.js.map +0 -1
  365. package/dist/reveal-jsX-uwUz.d.ts +0 -625
package/src/index.ts CHANGED
@@ -200,3 +200,75 @@ export { createWeightHover, type WeightHoverOptions, type WeightHoverInstance }
200
200
  export { createSticker, type StickerOptions, type StickerInstance, type StickerState } from './recipes/sticker/create-sticker';
201
201
  export { createScrollDock, type ScrollDockOptions, type ScrollDockInstance } from './recipes/scroll-dock/create-scroll-dock';
202
202
  export { createLocalClock, type LocalClockOptions, type LocalClockInstance } from './recipes/local-clock/create-local-clock';
203
+ export { createAttachment, acceptsFile, describeAccept, formatBytes, type AttachmentOptions, type AttachmentInstance, type AttachmentFile, type AttachmentStatus, type AttachmentRejection, type AttachmentRejectCode, type AttachmentLabels } from './components/attachment/engine';
204
+ export { createSkeleton, skeletonBones, type SkeletonOptions, type SkeletonInstance, type SkeletonShape, type SkeletonAnimation } from './components/skeleton/engine';
205
+ export { createQuestionnaire, readAnswers, type QuestionnaireOptions, type QuestionnaireInstance, type QuestionnaireAnswers, type QuestionnaireLabels } from './components/questionnaire/engine';
206
+ export { createCodeBlock, codeLines, type CodeBlockOptions, type CodeBlockInstance } from './components/code-block/engine';
207
+ export { createContextMenu, type ContextMenuOptions, type ContextMenuInstance } from './components/context-menu/engine';
208
+ export { createDrawer, type DrawerOptions, type DrawerInstance, type DrawerSide } from './components/drawer/engine';
209
+ export { createLinkPreview, safeHref, safeImage, linkDomain, type LinkPreviewOptions, type LinkPreviewInstance, type LinkPreviewVariant } from './components/link-preview/engine';
210
+ export { createProgress, type ProgressOptions, type ProgressInstance, type ProgressVariant } from './components/progress/engine';
211
+ export { createRangeSlider, type RangeSliderOptions, type RangeSliderInstance, type RangeValue } from './components/range-slider/engine';
212
+ export { createChart, type ChartOptions, type ChartInstance, type ChartSeries, type ChartPoint, type ChartType } from './components/chart/engine';
213
+ export { press, blurIn, blurOut, collapse, shake, ringPulse, burst, rollDigits, type BlurInOptions, type BurstOptions } from './motion/micro';
214
+ export { createCreditCard, type CreditCardOptions, type CreditCardInstance, type CreditCardField, type CreditCardValues, type CreditCardLabels } from './components/credit-card/engine';
215
+ export { detectBrand, formatNumber, luhn, parseExpiry, cardLength, cvcLength, BRAND_LABELS, type CardBrand, type Expiry } from './components/credit-card/card';
216
+ export { createCommandSearch, type CommandSearchOptions, type CommandSearchInstance, type CommandItem } from './components/command-search/engine';
217
+ export { matchScore, type Match } from './components/command-search/match';
218
+ export { createHoldConfirm, type HoldConfirmOptions, type HoldConfirmInstance } from './components/hold-confirm/engine';
219
+ export { createImagePreview, type ImagePreviewOptions, type ImagePreviewInstance } from './components/image-preview/engine';
220
+ export { createLikeButton, type LikeButtonOptions, type LikeButtonInstance } from './components/like-button/engine';
221
+ export { createNotificationBell, type NotificationBellOptions, type NotificationBellInstance } from './components/notification-bell/engine';
222
+ export { createPasswordStrength, type PasswordStrengthOptions, type PasswordStrengthInstance } from './components/password-strength/engine';
223
+ export { scorePassword, STRENGTH_LABELS, type PasswordScore, type PasswordChecks } from './components/password-strength/score';
224
+ export { createScratchCard, type ScratchCardOptions, type ScratchCardInstance } from './components/scratch-card/engine';
225
+ export { createStarRating, type StarRatingOptions, type StarRatingInstance } from './components/star-rating/engine';
226
+ export { createSwipeActions, type SwipeActionsOptions, type SwipeActionsInstance, type SwipeSide } from './components/swipe-actions/engine';
227
+ export { tokenize, renderCode, languageFamily, type Token, type TokenType } from './components/code-block/highlight';
228
+ export { createColorSlider, type ColorSliderOptions, type ColorSliderInstance } from './components/color-slider/engine';
229
+ export { createColorArea, type ColorAreaOptions, type ColorAreaInstance } from './components/color-area/engine';
230
+ export { createColorField, type ColorFieldOptions, type ColorFieldInstance } from './components/color-field/engine';
231
+ export { createColorPicker, type ColorPickerOptions, type ColorPickerInstance } from './components/color-picker/engine';
232
+ export { createTimeField, type TimeFieldOptions, type TimeFieldInstance } from './components/time-field/engine';
233
+ export { createRangeCalendar, bandDuration, type RangeCalendarOptions, type RangeCalendarInstance } from './components/range-calendar/engine';
234
+ export { createDateRangePicker, type DateRangePickerOptions, type DateRangePickerInstance } from './components/date-range-picker/engine';
235
+ export {
236
+ parseColor, formatColor, toHex, toHsva, hsvToRgb, rgbToHsv, getChannel, setChannel, channelText, luminance, CHANNEL_LABELS,
237
+ type Hsva, type Rgba, type Hsla, type ColorFormat, type ColorChannel,
238
+ } from './core/color';
239
+ export { parseTime, formatTime, type TimeValue } from './core/segments';
240
+ export { toRange, rangeKeys, rangeLength, type DateRange } from './core/date-range';
241
+ export { createTooltip, type TooltipOptions, type TooltipInstance } from './components/tooltip/engine';
242
+ export { place, type Placement, type Side, type Placed } from './core/position';
243
+ export { createPopover, type PopoverOptions, type PopoverInstance } from './components/popover/engine';
244
+ export { createLoadingButton, type LoadingButtonOptions, type LoadingButtonInstance, type LoadingState } from './components/loading-button/engine';
245
+ export { createBreadcrumb, type BreadcrumbOptions, type BreadcrumbInstance, type BreadcrumbItem } from './components/breadcrumb/engine';
246
+ export { createEmptyState, type EmptyStateOptions, type EmptyStateInstance, type EmptyIllustration, type EmptyAction } from './components/empty-state/engine';
247
+ export { createStatCard, type StatCardOptions, type StatCardInstance } from './components/stat-card/engine';
248
+ export { createChartTooltip, type ChartTooltipOptions, type ChartTooltipInstance, type ChartTooltipSeries } from './components/chart-tooltip/engine';
249
+ export { createMultiSelect, type MultiSelectOptions, type MultiSelectInstance, type MultiSelectOption } from './components/multi-select/engine';
250
+ export { createTagInput, type TagInputOptions, type TagInputInstance } from './components/tag-input/engine';
251
+ export { createDateTimePicker, toDateTimeValue, dateTimeKey, type DateTimePickerOptions, type DateTimePickerInstance } from './components/date-time-picker/engine';
252
+ export { createFilterBuilder, type FilterBuilderOptions, type FilterBuilderInstance } from './components/filter-builder/engine';
253
+ export {
254
+ matchesFilter, describeFilter, emptyFilter, hasConditions, OPERATORS,
255
+ type FilterField, type FilterFieldType, type FilterGroup, type FilterRule, type FilterNode, type FilterValue,
256
+ } from './core/filter';
257
+ export { createTimeline, type TimelineOptions, type TimelineInstance, type TimelineEvent, type TimelineStatus } from './components/timeline/engine';
258
+ export { relativeTime, dayLabel, type TimeInput } from './core/relative-time';
259
+ export { createActivityFeed, type ActivityFeedOptions, type ActivityFeedInstance, type ActivityItem, type ActivityActor, type ActivityKind } from './components/activity-feed/engine';
260
+ export { createTreeView, type TreeViewOptions, type TreeViewInstance } from './components/tree-view/engine';
261
+ export { findNode, checkStates, toggleCheck, searchTree, type TreeNode, type CheckState } from './core/tree';
262
+ export { createFileExplorer, type FileExplorerOptions, type FileExplorerInstance, type FileView, type FileChange } from './components/file-explorer/engine';
263
+ export { formatSize, fileFamily, sortEntries, type FileEntry, type FileFamily, type FileSort } from './core/files';
264
+ export { createJsonViewer, jsonPath, type JsonViewerOptions, type JsonViewerInstance, type JsonType } from './components/json-viewer/engine';
265
+ export { createVirtualList, type VirtualListOptions, type VirtualListInstance, type VirtualKey, type VirtualScrollOptions } from './components/virtual-list/engine';
266
+ export { createSizes, type VirtualSizes, type VirtualRange } from './core/virtual';
267
+ export { createResizablePanel, normaliseSizes, type ResizablePanelOptions, type ResizablePanelInstance, type PanelOrientation } from './components/resizable-panel/engine';
268
+ export { createSplitView, type SplitViewOptions, type SplitViewInstance, type SplitSide } from './components/split-view/engine';
269
+ export {
270
+ createDataTable,
271
+ type DataTableOptions, type DataTableInstance, type DataColumn, type DataColumnType, type DataAction, type DataRow, type DataSort, type RowId, type SortDirection,
272
+ } from './components/data-table/engine';
273
+ export { createEditableTable, type EditableTableOptions, type EditableTableInstance, type EditableColumn, type RowChange, type EditorKind } from './components/editable-table/engine';
274
+ export { createRichTextEditor, sanitizeHtml, type RichTextEditorOptions, type RichTextEditorInstance, type RichCommand } from './components/rich-text-editor/engine';
@@ -0,0 +1,248 @@
1
+ import { gsap, EASE, registerMotion } from '../core/gsap';
2
+ import { reduced } from '../core/reduced';
3
+
4
+ /*
5
+ * Melonmind microinteractions (sources/app/css/ui-elements/animations.css,
6
+ * button.css, popover.css) on GSAP, shared by the components:
7
+ * - press: buttonClickAnimation, scale .95 × .9 and back in 500 ms (click curve).
8
+ * - blurIn: search-result-item-in (blur 16, y −20, 500 ms, 50 ms apart),
9
+ * animation-general-in-2 (pop: blur 32, scale .7, 300 ms) or general-in (soft).
10
+ * - blurOut: item-out / -left / -bottom (blur 16, 500 ms).
11
+ * - collapse: a removed row folds (height 0, blur 16, 250 ms).
12
+ * - shake: the error shake (±4 px, 500 ms).
13
+ * - ringPulse: animation-highlight-2 (inset ring 0 → 4 px → 0 in 1 s).
14
+ * - burst: particles flying out of a control (like, rating, confirm).
15
+ * - rollDigits: Melonmind's RollingNumber, changed characters roll in their direction.
16
+ * Every helper returns its animation, or null under reduced motion (final state at once).
17
+ */
18
+
19
+ type Targets = Element | Element[] | NodeListOf<Element> | null | undefined;
20
+
21
+ const list = (targets: Targets) => (!targets ? [] : targets instanceof Element ? [targets] : [...targets]);
22
+ const live = () => {
23
+ registerMotion();
24
+ return !reduced();
25
+ };
26
+
27
+ /** Press bounce (Melonmind buttonClickAnimation). */
28
+ export function press(el: Element | null | undefined) {
29
+ if (!el || !live()) return null;
30
+ gsap.killTweensOf(el, 'scaleX,scaleY');
31
+ return gsap
32
+ .timeline({
33
+ onComplete: () => {
34
+ gsap.set(el, { clearProps: 'scale,transform' });
35
+ },
36
+ })
37
+ .to(el, { scaleX: 0.95, scaleY: 0.9, duration: 0.1, ease: 'power2.out' })
38
+ .to(el, { scaleX: 1, scaleY: 1, duration: 0.5, ease: EASE.click });
39
+ }
40
+
41
+ export interface BlurInOptions {
42
+ /** rise: list item (y −20, blur 16); pop: surface (scale .7, blur 32); soft: scale .96, blur 16. */
43
+ from?: 'rise' | 'pop' | 'soft';
44
+ stagger?: number;
45
+ delay?: number;
46
+ duration?: number;
47
+ }
48
+
49
+ export function blurIn(targets: Targets, { from = 'rise', stagger = 0.05, delay = 0, duration }: BlurInOptions = {}) {
50
+ const items = list(targets);
51
+ if (!items.length || !live()) return null;
52
+ const start =
53
+ from === 'pop' ? { opacity: 0, scale: 0.7, filter: 'blur(32px)' } : from === 'soft' ? { opacity: 0, scale: 0.96, filter: 'blur(16px)' } : { opacity: 0, y: -20, filter: 'blur(16px)' };
54
+ return gsap.fromTo(items, start, {
55
+ opacity: 1,
56
+ y: 0,
57
+ scale: 1,
58
+ filter: 'blur(0px)',
59
+ duration: duration ?? (from === 'pop' ? 0.3 : 0.5),
60
+ ease: from === 'pop' ? EASE.pop : 'power2.out',
61
+ stagger,
62
+ delay,
63
+ clearProps: 'opacity,transform,filter',
64
+ });
65
+ }
66
+
67
+ export function blurOut(targets: Targets, { to = 'up', onComplete }: { to?: 'up' | 'left' | 'down'; onComplete?: () => void } = {}) {
68
+ const items = list(targets);
69
+ if (!items.length) return null;
70
+ if (!live()) {
71
+ onComplete?.();
72
+ return null;
73
+ }
74
+ const end = to === 'left' ? { x: -64 } : to === 'down' ? { y: 24 } : { y: -20 };
75
+ return gsap.to(items, { ...end, opacity: 0, filter: 'blur(16px)', duration: 0.5, ease: 'power2.out', onComplete });
76
+ }
77
+
78
+ /** Fold an element away (Melonmind today-appt-item-out). */
79
+ export function collapse(el: HTMLElement | null | undefined, { onComplete }: { onComplete?: () => void } = {}) {
80
+ if (!el) return null;
81
+ if (!live()) {
82
+ onComplete?.();
83
+ return null;
84
+ }
85
+ return gsap.to(el, {
86
+ height: 0,
87
+ paddingTop: 0,
88
+ paddingBottom: 0,
89
+ marginTop: 0,
90
+ marginBottom: 0,
91
+ opacity: 0,
92
+ filter: 'blur(16px)',
93
+ overflow: 'hidden',
94
+ duration: 0.25,
95
+ ease: 'power2.in',
96
+ onComplete,
97
+ });
98
+ }
99
+
100
+ /** The error shake. */
101
+ export function shake(el: Element | null | undefined, distance = 4) {
102
+ if (!el || !live()) return null;
103
+ gsap.killTweensOf(el, 'x');
104
+ return gsap.to(el, {
105
+ keyframes: { x: [0, -distance, distance, -distance, 0] },
106
+ duration: 0.5,
107
+ ease: EASE.shake,
108
+ clearProps: 'x,transform',
109
+ });
110
+ }
111
+
112
+ /** An inset ring that swells and fades (Melonmind animation-highlight-2). */
113
+ export function ringPulse(el: HTMLElement | null | undefined, color = 'var(--mk-accent-soft)') {
114
+ if (!el || !live()) return null;
115
+ const before = { color: el.style.outlineColor, style: el.style.outlineStyle, offset: el.style.outlineOffset };
116
+ el.style.outlineColor = color;
117
+ el.style.outlineStyle = 'solid';
118
+ el.style.outlineOffset = '-4px';
119
+ const restore = () => {
120
+ el.style.outlineColor = before.color;
121
+ el.style.outlineStyle = before.style;
122
+ el.style.outlineOffset = before.offset;
123
+ el.style.removeProperty('outline-width');
124
+ if (el.getAttribute('style') === '') el.removeAttribute('style');
125
+ };
126
+ return gsap.fromTo(el, { outlineWidth: 0 }, { keyframes: { outlineWidth: [0, 4, 0] }, duration: 1, ease: 'power1.inOut', onComplete: restore, onInterrupt: restore });
127
+ }
128
+
129
+ export interface BurstOptions {
130
+ count?: number;
131
+ distance?: number;
132
+ /** CSS colours, used in turn. */
133
+ colors?: string[];
134
+ /** An expanding ring behind the particles. */
135
+ ring?: boolean;
136
+ size?: number;
137
+ }
138
+
139
+ /** Particles flying out of the centre of `origin` (like, rating, confirm). Removed when done. */
140
+ export function burst(origin: HTMLElement | null | undefined, { count = 7, distance = 28, colors = ['var(--mk-accent)'], ring = true, size = 6 }: BurstOptions = {}) {
141
+ if (!origin || !live()) return null;
142
+ const layer = document.createElement('span');
143
+ layer.setAttribute('aria-hidden', 'true');
144
+ layer.dataset.mkBurst = '';
145
+ Object.assign(layer.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'visible', display: 'grid', placeItems: 'center' });
146
+ const positioned = getComputedStyle(origin).position !== 'static';
147
+ const previousPosition = origin.style.position;
148
+ if (!positioned) origin.style.position = 'relative';
149
+ origin.append(layer);
150
+ const cleanup = () => {
151
+ layer.remove();
152
+ if (!positioned) origin.style.position = previousPosition;
153
+ if (origin.getAttribute('style') === '') origin.removeAttribute('style');
154
+ };
155
+ const timeline = gsap.timeline({ onComplete: cleanup, onInterrupt: cleanup });
156
+ if (ring) {
157
+ const circle = document.createElement('span');
158
+ Object.assign(circle.style, { position: 'absolute', width: '100%', aspectRatio: '1', borderRadius: '50%', border: `2px solid ${colors[0]}` });
159
+ layer.append(circle);
160
+ timeline.fromTo(circle, { scale: 0.3, opacity: 0.9 }, { scale: 1.6, opacity: 0, duration: 0.5, ease: 'power2.out' }, 0);
161
+ }
162
+ for (let i = 0; i < count; i++) {
163
+ const angle = (i / count) * Math.PI * 2 - Math.PI / 2;
164
+ for (const [k, scale] of [[0, 1], [1, 0.6]] as const) {
165
+ const dot = document.createElement('span');
166
+ Object.assign(dot.style, {
167
+ position: 'absolute',
168
+ width: `${size * scale}px`,
169
+ height: `${size * scale}px`,
170
+ borderRadius: '50%',
171
+ background: colors[(i + k) % colors.length],
172
+ });
173
+ layer.append(dot);
174
+ const reach = distance * (k ? 0.72 : 1);
175
+ const turn = k ? 0.32 : 0;
176
+ timeline.fromTo(
177
+ dot,
178
+ { x: 0, y: 0, scale: 0, opacity: 1 },
179
+ { x: Math.cos(angle + turn) * reach, y: Math.sin(angle + turn) * reach, scale: 1, duration: 0.45, ease: 'power3.out' },
180
+ 0.05,
181
+ );
182
+ timeline.to(dot, { scale: 0, opacity: 0, duration: 0.3, ease: 'power2.in' }, 0.38);
183
+ }
184
+ }
185
+ return timeline;
186
+ }
187
+
188
+ const rolling = new WeakMap<HTMLElement, gsap.core.Timeline>();
189
+
190
+ /**
191
+ * Write `text` into `el`, rolling the characters that changed (up when the value
192
+ * grew, down when it shrank). Unchanged characters stay; the final DOM is plain text.
193
+ */
194
+ export function rollDigits(el: HTMLElement | null | undefined, text: string, direction: 1 | -1 = 1, duration = 0.5) {
195
+ if (!el) return null;
196
+ rolling.get(el)?.progress(1).kill();
197
+ rolling.delete(el);
198
+ const previous = el.textContent ?? '';
199
+ if (previous === text || !live()) {
200
+ el.textContent = text;
201
+ return null;
202
+ }
203
+ // Right-aligned comparison: digits keep their place value.
204
+ const width = Math.max(previous.length, text.length);
205
+ const oldChars = previous.padStart(width, ' ');
206
+ const newChars = text.padStart(width, ' ');
207
+ el.textContent = '';
208
+ const label = document.createElement('span');
209
+ label.className = 'mk-sr-only';
210
+ label.textContent = text;
211
+ const visual = document.createElement('span');
212
+ visual.setAttribute('aria-hidden', 'true');
213
+ visual.style.display = 'inline-flex';
214
+ const moving: Array<[HTMLElement, HTMLElement]> = [];
215
+ // Only the padding added for the alignment is skipped; spaces inside the text stay.
216
+ const padding = Math.min(width - previous.length, width - text.length);
217
+ for (let i = padding; i < width; i++) {
218
+ const before = oldChars[i]!;
219
+ const after = newChars[i]!;
220
+ const cell = document.createElement('span');
221
+ Object.assign(cell.style, { position: 'relative', display: 'inline-block', overflow: 'hidden', whiteSpace: 'pre' });
222
+ const next = document.createElement('span');
223
+ next.style.display = 'inline-block';
224
+ next.textContent = after;
225
+ cell.append(next);
226
+ if (before !== after) {
227
+ const old = document.createElement('span');
228
+ Object.assign(old.style, { position: 'absolute', left: '0', top: '0', display: 'inline-block' });
229
+ old.textContent = before;
230
+ cell.append(old);
231
+ moving.push([old, next]);
232
+ }
233
+ visual.append(cell);
234
+ }
235
+ el.append(label, visual);
236
+ const timeline = gsap.timeline({
237
+ onComplete: () => {
238
+ el.textContent = text;
239
+ rolling.delete(el);
240
+ },
241
+ });
242
+ moving.forEach(([old, next], i) => {
243
+ timeline.to(old, { yPercent: -100 * direction, opacity: 0, filter: 'blur(4px)', duration, ease: EASE.signature }, i * 0.03);
244
+ timeline.fromTo(next, { yPercent: 100 * direction, opacity: 0, filter: 'blur(4px)' }, { yPercent: 0, opacity: 1, filter: 'blur(0px)', duration, ease: EASE.signature }, i * 0.03);
245
+ });
246
+ rolling.set(el, timeline);
247
+ return timeline;
248
+ }
@@ -1,65 +1,88 @@
1
- import { gsap, EASE, registerMotion } from '../core/gsap';
2
- import { motionSpring } from '../core/physics-spring';
3
- import { reduced } from '../core/reduced';
4
- import { clearStyles } from '../core/styles';
5
- import { TIMING } from '../core/timing';
6
- import { backdropVeil, ghostOf } from './surface';
7
-
8
- /*
9
- * project sheet: the surface rises from below the screen (0.72 s,
10
- * cubic(.16,1,.3,1)) while the page behind ([data-mk-underlay]) sinks to
11
- * scale .98 / opacity .4 on a 300/30 spring. It closes through an inert copy
12
- * that drops away, so focus returns at once.
13
- */
14
-
15
- const UNDERLAY_STYLES = ['transform', 'translate', 'rotate', 'scale', 'transform-origin', 'opacity'];
16
-
17
- export function sheetOpen(surface: HTMLElement) {
18
- if (reduced()) return null;
19
- registerMotion();
20
- return gsap.fromTo(surface, { yPercent: 100 }, { yPercent: 0, duration: TIMING.sheet.open, ease: EASE.sheet, clearProps: 'transform' });
21
- }
22
-
23
- /** Drop a copy of the (still open) sheet off the bottom of the screen. */
24
- export function sheetClose(surface: HTMLElement, { inPlace = false }: { inPlace?: boolean } = {}) {
25
- registerMotion();
26
- const dragged = inPlace ? Number(gsap.getProperty(surface, 'y')) || 0 : 0;
27
- gsap.killTweensOf(surface);
28
- clearStyles([surface], ['transform', 'translate', 'rotate', 'scale']);
29
- const ghost = reduced() ? null : ghostOf(surface);
30
- if (!ghost) return null;
31
- const veil = backdropVeil(surface);
32
- document.body.append(veil, ghost);
33
- gsap.to(veil, { opacity: 0, duration: TIMING.sheet.close, ease: 'power3.in', onComplete: () => veil.remove() });
34
- return gsap.fromTo(
35
- ghost,
36
- { y: dragged, yPercent: 0 },
37
- { yPercent: 100, duration: TIMING.sheet.close, ease: EASE.sheet, onComplete: () => ghost.remove() },
38
- );
39
- }
40
-
41
- export function pushUnderlay(elements: HTMLElement[]) {
42
- if (!elements.length || reduced()) return;
43
- registerMotion();
44
- const { ease, duration } = motionSpring(...TIMING.springs.underlay);
45
- gsap.to(elements, {
46
- scale: TIMING.sheet.underlayScale,
47
- opacity: TIMING.sheet.underlayOpacity,
48
- transformOrigin: '50% 0',
49
- duration,
50
- ease,
51
- overwrite: 'auto',
52
- });
53
- }
54
-
55
- export function releaseUnderlay(elements: HTMLElement[], animated = true) {
56
- if (!elements.length) return;
57
- const restore = () => clearStyles(elements, UNDERLAY_STYLES);
58
- if (!animated || reduced()) {
59
- gsap.killTweensOf(elements);
60
- restore();
61
- return;
62
- }
63
- const { ease, duration } = motionSpring(...TIMING.springs.underlay);
64
- gsap.to(elements, { scale: 1, opacity: 1, duration, ease, overwrite: 'auto', onComplete: restore });
65
- }
1
+ import { gsap, EASE, registerMotion } from '../core/gsap';
2
+ import { motionSpring } from '../core/physics-spring';
3
+ import { reduced } from '../core/reduced';
4
+ import { clearStyles } from '../core/styles';
5
+ import { TIMING } from '../core/timing';
6
+ import { backdropVeil, ghostOf } from './surface';
7
+
8
+ /*
9
+ * project sheet: the surface rises from below the screen (0.72 s,
10
+ * cubic(.16,1,.3,1)) while the page behind ([data-mk-underlay]) sinks to
11
+ * scale .98 / opacity .4 on a 300/30 spring. It closes through an inert copy
12
+ * that drops away, so focus returns at once.
13
+ */
14
+
15
+ const UNDERLAY_STYLES = ['transform', 'translate', 'rotate', 'scale', 'transform-origin', 'opacity'];
16
+
17
+ export function sheetOpen(surface: HTMLElement) {
18
+ if (reduced()) return null;
19
+ registerMotion();
20
+ return gsap.fromTo(surface, { yPercent: 100 }, { yPercent: 0, duration: TIMING.sheet.open, ease: EASE.sheet, clearProps: 'transform' });
21
+ }
22
+
23
+ /** Side of a drawer surface: data-mk-drawer="left", else right. */
24
+ const slideFrom = (surface: HTMLElement) => (surface.dataset.mkDrawer === 'left' ? -1 : 1);
25
+
26
+ /** Drawer: the surface slides in from its side on the sheet curve. */
27
+ export function slideOpen(surface: HTMLElement) {
28
+ if (reduced()) return null;
29
+ registerMotion();
30
+ return gsap.fromTo(surface, { xPercent: 104 * slideFrom(surface) }, { xPercent: 0, duration: TIMING.sheet.open, ease: EASE.sheet, clearProps: 'transform' });
31
+ }
32
+
33
+ /** Slide a copy of the (still open) drawer back off its side, so focus returns at once. */
34
+ export function slideClose(surface: HTMLElement) {
35
+ registerMotion();
36
+ gsap.killTweensOf(surface);
37
+ clearStyles([surface], ['transform', 'translate', 'rotate', 'scale']);
38
+ const ghost = reduced() ? null : ghostOf(surface);
39
+ if (!ghost) return null;
40
+ const veil = backdropVeil(surface);
41
+ document.body.append(veil, ghost);
42
+ gsap.to(veil, { opacity: 0, duration: TIMING.sheet.close * 0.8, ease: 'power3.in', onComplete: () => veil.remove() });
43
+ return gsap.to(ghost, { xPercent: 104 * slideFrom(surface), duration: TIMING.sheet.close * 0.8, ease: 'power3.in', onComplete: () => ghost.remove() });
44
+ }
45
+
46
+ /** Drop a copy of the (still open) sheet off the bottom of the screen. */
47
+ export function sheetClose(surface: HTMLElement, { inPlace = false }: { inPlace?: boolean } = {}) {
48
+ registerMotion();
49
+ const dragged = inPlace ? Number(gsap.getProperty(surface, 'y')) || 0 : 0;
50
+ gsap.killTweensOf(surface);
51
+ clearStyles([surface], ['transform', 'translate', 'rotate', 'scale']);
52
+ const ghost = reduced() ? null : ghostOf(surface);
53
+ if (!ghost) return null;
54
+ const veil = backdropVeil(surface);
55
+ document.body.append(veil, ghost);
56
+ gsap.to(veil, { opacity: 0, duration: TIMING.sheet.close, ease: 'power3.in', onComplete: () => veil.remove() });
57
+ return gsap.fromTo(
58
+ ghost,
59
+ { y: dragged, yPercent: 0 },
60
+ { yPercent: 100, duration: TIMING.sheet.close, ease: EASE.sheet, onComplete: () => ghost.remove() },
61
+ );
62
+ }
63
+
64
+ export function pushUnderlay(elements: HTMLElement[]) {
65
+ if (!elements.length || reduced()) return;
66
+ registerMotion();
67
+ const { ease, duration } = motionSpring(...TIMING.springs.underlay);
68
+ gsap.to(elements, {
69
+ scale: TIMING.sheet.underlayScale,
70
+ opacity: TIMING.sheet.underlayOpacity,
71
+ transformOrigin: '50% 0',
72
+ duration,
73
+ ease,
74
+ overwrite: 'auto',
75
+ });
76
+ }
77
+
78
+ export function releaseUnderlay(elements: HTMLElement[], animated = true) {
79
+ if (!elements.length) return;
80
+ const restore = () => clearStyles(elements, UNDERLAY_STYLES);
81
+ if (!animated || reduced()) {
82
+ gsap.killTweensOf(elements);
83
+ restore();
84
+ return;
85
+ }
86
+ const { ease, duration } = motionSpring(...TIMING.springs.underlay);
87
+ gsap.to(elements, { scale: 1, opacity: 1, duration, ease, overwrite: 'auto', onComplete: restore });
88
+ }
@@ -78,6 +78,15 @@ export function ghostOf(surface: HTMLElement): HTMLElement | null {
78
78
  const ghost = document.createElement('div');
79
79
  ghost.className = surface.className;
80
80
  ghost.innerHTML = surface.innerHTML;
81
+ // The markup carries attributes, not what was typed or chosen since: copy the live values too.
82
+ const live = surface.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>('input, textarea, select');
83
+ ghost.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>('input, textarea, select').forEach((copy, i) => {
84
+ const source = live[i];
85
+ if (!source) return;
86
+ if (copy instanceof HTMLSelectElement) copy.selectedIndex = (source as HTMLSelectElement).selectedIndex;
87
+ else copy.value = source.value;
88
+ if (copy instanceof HTMLInputElement && source instanceof HTMLInputElement) copy.checked = source.checked;
89
+ });
81
90
  ghost.setAttribute('aria-hidden', 'true');
82
91
  ghost.inert = true;
83
92
  ghost.dataset.mkGhost = '';
@@ -99,3 +99,60 @@ export { useWeightHover } from './use-weight-hover';
99
99
  export { useSticker } from './use-sticker';
100
100
  export { useScrollDock } from './use-scroll-dock';
101
101
  export { useLocalClock } from './use-local-clock';
102
+ export { Attachment, type AttachmentProps, type AttachmentUpload } from '../components/attachment/react';
103
+ export { Skeleton, type SkeletonProps } from '../components/skeleton/react';
104
+ export { Questionnaire, type QuestionnaireProps, type Question, type QuestionType, type QuestionOption } from '../components/questionnaire/react';
105
+ export { CodeBlock, type CodeBlockProps } from '../components/code-block/react';
106
+ export { ContextMenu, type ContextMenuProps } from '../components/context-menu/react';
107
+ export { Drawer, useDrawer, type DrawerRootProps } from '../components/drawer/react';
108
+ export { LinkPreview, type LinkPreviewProps } from '../components/link-preview/react';
109
+ export { Progress, type ProgressProps } from '../components/progress/react';
110
+ export { RangeSlider, type RangeSliderProps } from '../components/range-slider/react';
111
+ export { Chart, type ChartProps } from '../components/chart/react';
112
+ export { CreditCard, type CreditCardProps } from '../components/credit-card/react';
113
+ export { CommandSearch, type CommandSearchProps } from '../components/command-search/react';
114
+ export type { CommandItem } from '../components/command-search/engine';
115
+ export { HoldConfirm, type HoldConfirmProps } from '../components/hold-confirm/react';
116
+ export { ImagePreview, type ImagePreviewProps, type PreviewImage } from '../components/image-preview/react';
117
+ export { LikeButton, type LikeButtonProps } from '../components/like-button/react';
118
+ export { NotificationBell, type NotificationBellProps } from '../components/notification-bell/react';
119
+ export { PasswordStrength, type PasswordStrengthProps } from '../components/password-strength/react';
120
+ export { ScratchCard, type ScratchCardProps } from '../components/scratch-card/react';
121
+ export { StarRating, type StarRatingProps } from '../components/star-rating/react';
122
+ export { SwipeActions, type SwipeActionsProps, type SwipeRowProps, type SwipeAction } from '../components/swipe-actions/react';
123
+ export { ColorSlider, type ColorSliderProps } from '../components/color-slider/react';
124
+ export { ColorArea, type ColorAreaProps } from '../components/color-area/react';
125
+ export { ColorField, type ColorFieldProps } from '../components/color-field/react';
126
+ export { ColorPicker, type ColorPickerProps } from '../components/color-picker/react';
127
+ export { TimeField, type TimeFieldProps } from '../components/time-field/react';
128
+ export { RangeCalendar, type RangeCalendarProps } from '../components/range-calendar/react';
129
+ export { DateRangePicker, type DateRangePickerProps } from '../components/date-range-picker/react';
130
+ export { Tooltip, type TooltipProps } from '../components/tooltip/react';
131
+ export { Popover, type PopoverProps } from '../components/popover/react';
132
+ export { LoadingButton, type LoadingButtonProps } from '../components/loading-button/react';
133
+ export { Breadcrumb, type BreadcrumbProps } from '../components/breadcrumb/react';
134
+ export { EmptyState, type EmptyStateProps } from '../components/empty-state/react';
135
+ export { StatCard, type StatCardProps } from '../components/stat-card/react';
136
+ export { ChartTooltip, type ChartTooltipProps } from '../components/chart-tooltip/react';
137
+ export { MultiSelect, type MultiSelectProps } from '../components/multi-select/react';
138
+ export { TagInput, type TagInputProps } from '../components/tag-input/react';
139
+ export { DateTimePicker, type DateTimePickerProps } from '../components/date-time-picker/react';
140
+ export { FilterBuilder, type FilterBuilderProps } from '../components/filter-builder/react';
141
+ export { Timeline, type TimelineProps } from '../components/timeline/react';
142
+ export type { TimelineEvent, TimelineStatus } from '../components/timeline/engine';
143
+ export { ActivityFeed, type ActivityFeedProps, type ActivityFeedHandle } from '../components/activity-feed/react';
144
+ export type { ActivityItem, ActivityActor, ActivityKind } from '../components/activity-feed/engine';
145
+ export { TreeView, type TreeViewProps, type TreeViewHandle } from '../components/tree-view/react';
146
+ export type { TreeNode } from '../core/tree';
147
+ export { FileExplorer, type FileExplorerProps, type FileExplorerHandle } from '../components/file-explorer/react';
148
+ export type { FileEntry, FileView, FileChange } from '../components/file-explorer/engine';
149
+ export { JsonViewer, type JsonViewerProps, type JsonViewerHandle } from '../components/json-viewer/react';
150
+ export { VirtualList, type VirtualListProps, type VirtualListHandle } from '../components/virtual-list/react';
151
+ export { ResizablePanel, type ResizablePanelProps, type ResizablePanelHandle } from '../components/resizable-panel/react';
152
+ export { SplitView, type SplitViewProps, type SplitViewHandle } from '../components/split-view/react';
153
+ export { DataTable, type DataTableProps, type DataTableHandle } from '../components/data-table/react';
154
+ export type { DataColumn, DataAction, DataRow, DataSort, RowId } from '../components/data-table/engine';
155
+ export { EditableTable, type EditableTableProps, type EditableTableHandle } from '../components/editable-table/react';
156
+ export type { EditableColumn, RowChange, EditorKind } from '../components/editable-table/engine';
157
+ export { RichTextEditor, type RichTextEditorProps, type RichTextEditorHandle } from '../components/rich-text-editor/react';
158
+ export type { RichCommand } from '../components/rich-text-editor/engine';