@yewdiel21/motion-kit 0.10.0 → 0.15.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 (459) hide show
  1. package/README.md +81 -0
  2. package/bin/motion-kit.mjs +3 -3
  3. package/dist/auto/index.d.ts +56 -3
  4. package/dist/auto/index.js +107 -3
  5. package/dist/auto/index.js.map +1 -1
  6. package/dist/{chunk-XAKC2QY7.js → chunk-6IRJYXJU.js} +3 -28
  7. package/dist/chunk-6IRJYXJU.js.map +1 -0
  8. package/dist/chunk-A6QQCF6V.js +21333 -0
  9. package/dist/chunk-A6QQCF6V.js.map +1 -0
  10. package/dist/chunk-JXRS3OEA.js +3638 -0
  11. package/dist/chunk-JXRS3OEA.js.map +1 -0
  12. package/dist/chunk-QP4QJOEN.js +72 -0
  13. package/dist/chunk-QP4QJOEN.js.map +1 -0
  14. package/dist/css/components/activity-feed.css +240 -0
  15. package/dist/css/components/add-to-cart.css +72 -0
  16. package/dist/css/components/attachment.css +266 -0
  17. package/dist/css/components/bidirectional-slider.css +168 -0
  18. package/dist/css/components/breadcrumb.css +110 -0
  19. package/dist/css/components/chart-tooltip.css +168 -0
  20. package/dist/css/components/chart.css +296 -0
  21. package/dist/css/components/code-block.css +264 -0
  22. package/dist/css/components/color-area.css +82 -0
  23. package/dist/css/components/color-field.css +67 -0
  24. package/dist/css/components/color-picker.css +131 -0
  25. package/dist/css/components/color-slider.css +113 -0
  26. package/dist/css/components/command-search.css +252 -0
  27. package/dist/css/components/context-menu.css +23 -0
  28. package/dist/css/components/credit-card.css +288 -0
  29. package/dist/css/components/data-table.css +686 -0
  30. package/dist/css/components/date-range-picker.css +168 -0
  31. package/dist/css/components/date-time-picker.css +178 -0
  32. package/dist/css/components/drawer.css +58 -0
  33. package/dist/css/components/editable-table.css +201 -0
  34. package/dist/css/components/empty-state.css +61 -0
  35. package/dist/css/components/file-explorer.css +633 -0
  36. package/dist/css/components/filter-builder.css +227 -0
  37. package/dist/css/components/heatmap-chart.css +391 -0
  38. package/dist/css/components/hold-confirm.css +87 -0
  39. package/dist/css/components/hover-card.css +19 -7
  40. package/dist/css/components/image-preview.css +283 -0
  41. package/dist/css/components/json-viewer.css +304 -0
  42. package/dist/css/components/like-button.css +78 -0
  43. package/dist/css/components/link-preview.css +275 -0
  44. package/dist/css/components/loading-button.css +77 -0
  45. package/dist/css/components/multi-select.css +267 -0
  46. package/dist/css/components/nav.css +102 -102
  47. package/dist/css/components/notification-bell.css +127 -0
  48. package/dist/css/components/orbit-menu.css +130 -0
  49. package/dist/css/components/pagination.css +10 -5
  50. package/dist/css/components/password-strength.css +183 -0
  51. package/dist/css/components/pie-chart.css +390 -0
  52. package/dist/css/components/pill-button.css +135 -0
  53. package/dist/css/components/popover.css +25 -0
  54. package/dist/css/components/progress.css +140 -0
  55. package/dist/css/components/questionnaire.css +217 -0
  56. package/dist/css/components/radar-chart.css +370 -0
  57. package/dist/css/components/radial-chart.css +398 -0
  58. package/dist/css/components/range-calendar.css +186 -0
  59. package/dist/css/components/range-slider.css +192 -0
  60. package/dist/css/components/resizable-panel.css +243 -0
  61. package/dist/css/components/rich-text-editor.css +284 -0
  62. package/dist/css/components/sankey-chart.css +358 -0
  63. package/dist/css/components/scratch-card.css +75 -0
  64. package/dist/css/components/scroll-island.css +111 -0
  65. package/dist/css/components/select.css +136 -0
  66. package/dist/css/components/skeleton.css +108 -0
  67. package/dist/css/components/split-view.css +19 -0
  68. package/dist/css/components/star-rating.css +80 -0
  69. package/dist/css/components/stat-card.css +164 -0
  70. package/dist/css/components/swipe-actions.css +105 -0
  71. package/dist/css/components/tag-input.css +244 -0
  72. package/dist/css/components/time-field.css +88 -0
  73. package/dist/css/components/timeline.css +219 -0
  74. package/dist/css/components/toolbar.css +122 -0
  75. package/dist/css/components/tooltip.css +79 -0
  76. package/dist/css/components/tree-view.css +289 -0
  77. package/dist/css/components/virtual-list.css +195 -0
  78. package/dist/css/components/voice-dots.css +70 -0
  79. package/dist/css/tokens.css +185 -181
  80. package/dist/elements/index.d.ts +849 -7
  81. package/dist/elements/index.js +1642 -8
  82. package/dist/elements/index.js.map +1 -1
  83. package/dist/{engine-GDGwQnJE.d.ts → engine-5zRIssTO.d.ts} +11 -1
  84. package/dist/engine-QECQnGz1.d.ts +33 -0
  85. package/dist/index.css +10890 -311
  86. package/dist/index.d.ts +89 -5
  87. package/dist/index.js +273 -9
  88. package/dist/index.js.map +1 -1
  89. package/dist/react/index.d.ts +686 -24
  90. package/dist/react/index.js +2345 -9
  91. package/dist/react/index.js.map +1 -1
  92. package/dist/{reduced-BmBzKH94.d.ts → reduced-6X_bns60.d.ts} +9 -2
  93. package/dist/reveal-BfyKKsw4.d.ts +2474 -0
  94. package/dist/store-CA2Qcun_.d.ts +453 -0
  95. package/package.json +9 -16
  96. package/registry.json +1096 -543
  97. package/src/auto/auto-init.ts +104 -0
  98. package/src/components/activity-feed/README.md +56 -0
  99. package/src/components/activity-feed/activity-feed.css +239 -0
  100. package/src/components/activity-feed/element.ts +36 -0
  101. package/src/components/activity-feed/engine.ts +351 -0
  102. package/src/components/activity-feed/react.tsx +32 -0
  103. package/src/components/add-to-cart/README.md +34 -0
  104. package/src/components/add-to-cart/add-to-cart.css +71 -0
  105. package/src/components/add-to-cart/element.ts +20 -0
  106. package/src/components/add-to-cart/engine.ts +206 -0
  107. package/src/components/add-to-cart/react.tsx +29 -0
  108. package/src/components/attachment/README.md +27 -0
  109. package/src/components/attachment/attachment.css +265 -0
  110. package/src/components/attachment/element.ts +50 -0
  111. package/src/components/attachment/engine.ts +469 -0
  112. package/src/components/attachment/react.tsx +65 -0
  113. package/src/components/bidirectional-slider/README.md +46 -0
  114. package/src/components/bidirectional-slider/bidirectional-slider.css +167 -0
  115. package/src/components/bidirectional-slider/element.ts +42 -0
  116. package/src/components/bidirectional-slider/engine.ts +289 -0
  117. package/src/components/bidirectional-slider/react.tsx +45 -0
  118. package/src/components/breadcrumb/README.md +38 -0
  119. package/src/components/breadcrumb/breadcrumb.css +109 -0
  120. package/src/components/breadcrumb/element.ts +27 -0
  121. package/src/components/breadcrumb/engine.ts +249 -0
  122. package/src/components/breadcrumb/react.tsx +30 -0
  123. package/src/components/chart/README.md +34 -0
  124. package/src/components/chart/chart.css +295 -0
  125. package/src/components/chart/element.ts +43 -0
  126. package/src/components/chart/engine.ts +838 -0
  127. package/src/components/chart/parts.ts +237 -0
  128. package/src/components/chart/react.tsx +50 -0
  129. package/src/components/chart/use-chart.ts +55 -0
  130. package/src/components/chart-tooltip/README.md +53 -0
  131. package/src/components/chart-tooltip/chart-tooltip.css +167 -0
  132. package/src/components/chart-tooltip/element.ts +37 -0
  133. package/src/components/chart-tooltip/engine.ts +442 -0
  134. package/src/components/chart-tooltip/react.tsx +47 -0
  135. package/src/components/code-block/README.md +19 -0
  136. package/src/components/code-block/code-block.css +263 -0
  137. package/src/components/code-block/element.ts +34 -0
  138. package/src/components/code-block/engine.ts +254 -0
  139. package/src/components/code-block/highlight.ts +244 -0
  140. package/src/components/code-block/react.tsx +94 -0
  141. package/src/components/color-area/README.md +50 -0
  142. package/src/components/color-area/color-area.css +81 -0
  143. package/src/components/color-area/element.ts +26 -0
  144. package/src/components/color-area/engine.ts +246 -0
  145. package/src/components/color-area/react.tsx +42 -0
  146. package/src/components/color-field/README.md +43 -0
  147. package/src/components/color-field/color-field.css +66 -0
  148. package/src/components/color-field/element.ts +26 -0
  149. package/src/components/color-field/engine.ts +174 -0
  150. package/src/components/color-field/react.tsx +42 -0
  151. package/src/components/color-picker/README.md +45 -0
  152. package/src/components/color-picker/color-picker.css +130 -0
  153. package/src/components/color-picker/element.ts +45 -0
  154. package/src/components/color-picker/engine.ts +314 -0
  155. package/src/components/color-picker/react.tsx +47 -0
  156. package/src/components/color-slider/README.md +55 -0
  157. package/src/components/color-slider/color-slider.css +112 -0
  158. package/src/components/color-slider/element.ts +26 -0
  159. package/src/components/color-slider/engine.ts +234 -0
  160. package/src/components/color-slider/react.tsx +45 -0
  161. package/src/components/command-search/README.md +15 -0
  162. package/src/components/command-search/command-search.css +251 -0
  163. package/src/components/command-search/element.ts +36 -0
  164. package/src/components/command-search/engine.ts +356 -0
  165. package/src/components/command-search/match.ts +53 -0
  166. package/src/components/command-search/react.tsx +66 -0
  167. package/src/components/context-menu/README.md +31 -0
  168. package/src/components/context-menu/context-menu.css +22 -0
  169. package/src/components/context-menu/element.ts +40 -0
  170. package/src/components/context-menu/engine.ts +153 -0
  171. package/src/components/context-menu/react.tsx +57 -0
  172. package/src/components/credit-card/README.md +20 -0
  173. package/src/components/credit-card/card.ts +77 -0
  174. package/src/components/credit-card/credit-card.css +287 -0
  175. package/src/components/credit-card/element.ts +33 -0
  176. package/src/components/credit-card/engine.ts +410 -0
  177. package/src/components/credit-card/react.tsx +36 -0
  178. package/src/components/data-table/README.md +83 -0
  179. package/src/components/data-table/data-table.css +685 -0
  180. package/src/components/data-table/element.ts +54 -0
  181. package/src/components/data-table/engine.ts +1111 -0
  182. package/src/components/data-table/react.tsx +94 -0
  183. package/src/components/date-range-picker/README.md +51 -0
  184. package/src/components/date-range-picker/date-range-picker.css +167 -0
  185. package/src/components/date-range-picker/element.ts +52 -0
  186. package/src/components/date-range-picker/engine.ts +352 -0
  187. package/src/components/date-range-picker/react.tsx +57 -0
  188. package/src/components/date-time-picker/README.md +48 -0
  189. package/src/components/date-time-picker/date-time-picker.css +177 -0
  190. package/src/components/date-time-picker/element.ts +47 -0
  191. package/src/components/date-time-picker/engine.ts +350 -0
  192. package/src/components/date-time-picker/react.tsx +54 -0
  193. package/src/components/dialog/README.md +103 -102
  194. package/src/components/dialog/element.ts +123 -118
  195. package/src/components/dialog/engine.ts +449 -432
  196. package/src/components/drawer/README.md +28 -0
  197. package/src/components/drawer/drawer.css +57 -0
  198. package/src/components/drawer/element.ts +21 -0
  199. package/src/components/drawer/engine.ts +56 -0
  200. package/src/components/drawer/react.tsx +85 -0
  201. package/src/components/editable-table/README.md +67 -0
  202. package/src/components/editable-table/editable-table.css +200 -0
  203. package/src/components/editable-table/element.ts +45 -0
  204. package/src/components/editable-table/engine.ts +831 -0
  205. package/src/components/editable-table/react.tsx +79 -0
  206. package/src/components/empty-state/README.md +41 -0
  207. package/src/components/empty-state/element.ts +23 -0
  208. package/src/components/empty-state/empty-state.css +60 -0
  209. package/src/components/empty-state/engine.ts +232 -0
  210. package/src/components/empty-state/react.tsx +34 -0
  211. package/src/components/file-explorer/README.md +67 -0
  212. package/src/components/file-explorer/element.ts +39 -0
  213. package/src/components/file-explorer/engine.ts +1307 -0
  214. package/src/components/file-explorer/file-explorer.css +632 -0
  215. package/src/components/file-explorer/react.tsx +77 -0
  216. package/src/components/filter-builder/README.md +47 -0
  217. package/src/components/filter-builder/element.ts +34 -0
  218. package/src/components/filter-builder/engine.ts +396 -0
  219. package/src/components/filter-builder/filter-builder.css +226 -0
  220. package/src/components/filter-builder/react.tsx +36 -0
  221. package/src/components/heatmap-chart/README.md +48 -0
  222. package/src/components/heatmap-chart/element.ts +21 -0
  223. package/src/components/heatmap-chart/engine.ts +281 -0
  224. package/src/components/heatmap-chart/heatmap-chart.css +93 -0
  225. package/src/components/heatmap-chart/react.tsx +14 -0
  226. package/src/components/hold-confirm/README.md +13 -0
  227. package/src/components/hold-confirm/element.ts +24 -0
  228. package/src/components/hold-confirm/engine.ts +216 -0
  229. package/src/components/hold-confirm/hold-confirm.css +86 -0
  230. package/src/components/hold-confirm/react.tsx +28 -0
  231. package/src/components/hover-card/README.md +6 -2
  232. package/src/components/hover-card/engine.ts +98 -7
  233. package/src/components/hover-card/hover-card.css +19 -7
  234. package/src/components/image-preview/README.md +16 -0
  235. package/src/components/image-preview/element.ts +26 -0
  236. package/src/components/image-preview/engine.ts +405 -0
  237. package/src/components/image-preview/image-preview.css +282 -0
  238. package/src/components/image-preview/react.tsx +43 -0
  239. package/src/components/json-viewer/README.md +56 -0
  240. package/src/components/json-viewer/element.ts +37 -0
  241. package/src/components/json-viewer/engine.ts +449 -0
  242. package/src/components/json-viewer/json-viewer.css +303 -0
  243. package/src/components/json-viewer/react.tsx +56 -0
  244. package/src/components/like-button/README.md +13 -0
  245. package/src/components/like-button/element.ts +47 -0
  246. package/src/components/like-button/engine.ts +145 -0
  247. package/src/components/like-button/like-button.css +77 -0
  248. package/src/components/like-button/react.tsx +39 -0
  249. package/src/components/link-preview/README.md +19 -0
  250. package/src/components/link-preview/element.ts +29 -0
  251. package/src/components/link-preview/engine.ts +192 -0
  252. package/src/components/link-preview/link-preview.css +274 -0
  253. package/src/components/link-preview/react.tsx +101 -0
  254. package/src/components/loading-button/README.md +45 -0
  255. package/src/components/loading-button/element.ts +34 -0
  256. package/src/components/loading-button/engine.ts +201 -0
  257. package/src/components/loading-button/loading-button.css +76 -0
  258. package/src/components/loading-button/react.tsx +43 -0
  259. package/src/components/multi-select/README.md +48 -0
  260. package/src/components/multi-select/element.ts +28 -0
  261. package/src/components/multi-select/engine.ts +294 -0
  262. package/src/components/multi-select/multi-select.css +266 -0
  263. package/src/components/multi-select/react.tsx +39 -0
  264. package/src/components/nav/README.md +12 -10
  265. package/src/components/nav/element.ts +5 -5
  266. package/src/components/nav/engine.ts +21 -14
  267. package/src/components/nav/nav.css +102 -102
  268. package/src/components/nav/react.tsx +4 -4
  269. package/src/components/notification-bell/README.md +14 -0
  270. package/src/components/notification-bell/element.ts +48 -0
  271. package/src/components/notification-bell/engine.ts +202 -0
  272. package/src/components/notification-bell/notification-bell.css +126 -0
  273. package/src/components/notification-bell/react.tsx +57 -0
  274. package/src/components/orbit-menu/README.md +46 -0
  275. package/src/components/orbit-menu/element.ts +27 -0
  276. package/src/components/orbit-menu/engine.ts +179 -0
  277. package/src/components/orbit-menu/orbit-menu.css +129 -0
  278. package/src/components/orbit-menu/react.tsx +44 -0
  279. package/src/components/pagination/README.md +1 -1
  280. package/src/components/pagination/engine.ts +50 -4
  281. package/src/components/pagination/pagination.css +10 -5
  282. package/src/components/password-strength/README.md +17 -0
  283. package/src/components/password-strength/element.ts +22 -0
  284. package/src/components/password-strength/engine.ts +212 -0
  285. package/src/components/password-strength/password-strength.css +182 -0
  286. package/src/components/password-strength/react.tsx +36 -0
  287. package/src/components/password-strength/score.ts +62 -0
  288. package/src/components/pie-chart/README.md +48 -0
  289. package/src/components/pie-chart/element.ts +30 -0
  290. package/src/components/pie-chart/engine.ts +283 -0
  291. package/src/components/pie-chart/pie-chart.css +92 -0
  292. package/src/components/pie-chart/react.tsx +14 -0
  293. package/src/components/pill-button/README.md +46 -0
  294. package/src/components/pill-button/element.ts +16 -0
  295. package/src/components/pill-button/engine.ts +77 -0
  296. package/src/components/pill-button/pill-button.css +134 -0
  297. package/src/components/pill-button/react.tsx +32 -0
  298. package/src/components/popover/README.md +44 -0
  299. package/src/components/popover/element.ts +31 -0
  300. package/src/components/popover/engine.ts +114 -0
  301. package/src/components/popover/popover.css +24 -0
  302. package/src/components/popover/react.tsx +50 -0
  303. package/src/components/progress/README.md +17 -0
  304. package/src/components/progress/element.ts +30 -0
  305. package/src/components/progress/engine.ts +173 -0
  306. package/src/components/progress/progress.css +139 -0
  307. package/src/components/progress/react.tsx +35 -0
  308. package/src/components/questionnaire/README.md +32 -0
  309. package/src/components/questionnaire/element.ts +118 -0
  310. package/src/components/questionnaire/engine.ts +255 -0
  311. package/src/components/questionnaire/questionnaire.css +216 -0
  312. package/src/components/questionnaire/react.tsx +140 -0
  313. package/src/components/radar-chart/README.md +48 -0
  314. package/src/components/radar-chart/element.ts +30 -0
  315. package/src/components/radar-chart/engine.ts +327 -0
  316. package/src/components/radar-chart/radar-chart.css +72 -0
  317. package/src/components/radar-chart/react.tsx +14 -0
  318. package/src/components/radial-chart/README.md +48 -0
  319. package/src/components/radial-chart/element.ts +30 -0
  320. package/src/components/radial-chart/engine.ts +290 -0
  321. package/src/components/radial-chart/radial-chart.css +100 -0
  322. package/src/components/radial-chart/react.tsx +14 -0
  323. package/src/components/range-calendar/README.md +58 -0
  324. package/src/components/range-calendar/element.ts +42 -0
  325. package/src/components/range-calendar/engine.ts +390 -0
  326. package/src/components/range-calendar/range-calendar.css +185 -0
  327. package/src/components/range-calendar/react.tsx +56 -0
  328. package/src/components/range-slider/README.md +23 -0
  329. package/src/components/range-slider/element.ts +53 -0
  330. package/src/components/range-slider/engine.ts +316 -0
  331. package/src/components/range-slider/range-slider.css +191 -0
  332. package/src/components/range-slider/react.tsx +66 -0
  333. package/src/components/resizable-panel/README.md +61 -0
  334. package/src/components/resizable-panel/element.ts +36 -0
  335. package/src/components/resizable-panel/engine.ts +551 -0
  336. package/src/components/resizable-panel/react.tsx +74 -0
  337. package/src/components/resizable-panel/resizable-panel.css +242 -0
  338. package/src/components/rich-text-editor/README.md +57 -0
  339. package/src/components/rich-text-editor/element.ts +34 -0
  340. package/src/components/rich-text-editor/engine.ts +673 -0
  341. package/src/components/rich-text-editor/react.tsx +60 -0
  342. package/src/components/rich-text-editor/rich-text-editor.css +283 -0
  343. package/src/components/sankey-chart/README.md +48 -0
  344. package/src/components/sankey-chart/element.ts +31 -0
  345. package/src/components/sankey-chart/engine.ts +401 -0
  346. package/src/components/sankey-chart/react.tsx +14 -0
  347. package/src/components/sankey-chart/sankey-chart.css +60 -0
  348. package/src/components/scratch-card/README.md +15 -0
  349. package/src/components/scratch-card/element.ts +30 -0
  350. package/src/components/scratch-card/engine.ts +257 -0
  351. package/src/components/scratch-card/react.tsx +40 -0
  352. package/src/components/scratch-card/scratch-card.css +74 -0
  353. package/src/components/scroll-island/README.md +34 -0
  354. package/src/components/scroll-island/element.ts +16 -0
  355. package/src/components/scroll-island/engine.ts +252 -0
  356. package/src/components/scroll-island/react.tsx +26 -0
  357. package/src/components/scroll-island/scroll-island.css +110 -0
  358. package/src/components/select/README.md +34 -0
  359. package/src/components/select/element.ts +26 -0
  360. package/src/components/select/engine.ts +267 -0
  361. package/src/components/select/react.tsx +33 -0
  362. package/src/components/select/select.css +135 -0
  363. package/src/components/skeleton/README.md +15 -0
  364. package/src/components/skeleton/element.ts +32 -0
  365. package/src/components/skeleton/engine.ts +104 -0
  366. package/src/components/skeleton/react.tsx +41 -0
  367. package/src/components/skeleton/skeleton.css +107 -0
  368. package/src/components/split-view/README.md +50 -0
  369. package/src/components/split-view/element.ts +34 -0
  370. package/src/components/split-view/engine.ts +114 -0
  371. package/src/components/split-view/react.tsx +63 -0
  372. package/src/components/split-view/split-view.css +18 -0
  373. package/src/components/star-rating/README.md +14 -0
  374. package/src/components/star-rating/element.ts +26 -0
  375. package/src/components/star-rating/engine.ts +217 -0
  376. package/src/components/star-rating/react.tsx +33 -0
  377. package/src/components/star-rating/star-rating.css +79 -0
  378. package/src/components/stat-card/README.md +42 -0
  379. package/src/components/stat-card/element.ts +40 -0
  380. package/src/components/stat-card/engine.ts +283 -0
  381. package/src/components/stat-card/react.tsx +36 -0
  382. package/src/components/stat-card/stat-card.css +163 -0
  383. package/src/components/swipe-actions/README.md +19 -0
  384. package/src/components/swipe-actions/element.ts +26 -0
  385. package/src/components/swipe-actions/engine.ts +260 -0
  386. package/src/components/swipe-actions/react.tsx +80 -0
  387. package/src/components/swipe-actions/swipe-actions.css +104 -0
  388. package/src/components/tag-input/README.md +42 -0
  389. package/src/components/tag-input/element.ts +39 -0
  390. package/src/components/tag-input/engine.ts +313 -0
  391. package/src/components/tag-input/react.tsx +54 -0
  392. package/src/components/tag-input/tag-input.css +243 -0
  393. package/src/components/time-field/README.md +54 -0
  394. package/src/components/time-field/element.ts +38 -0
  395. package/src/components/time-field/engine.ts +110 -0
  396. package/src/components/time-field/react.tsx +45 -0
  397. package/src/components/time-field/time-field.css +87 -0
  398. package/src/components/timeline/README.md +57 -0
  399. package/src/components/timeline/element.ts +31 -0
  400. package/src/components/timeline/engine.ts +300 -0
  401. package/src/components/timeline/react.tsx +59 -0
  402. package/src/components/timeline/timeline.css +218 -0
  403. package/src/components/toolbar/README.md +46 -0
  404. package/src/components/toolbar/element.ts +30 -0
  405. package/src/components/toolbar/engine.ts +230 -0
  406. package/src/components/toolbar/react.tsx +34 -0
  407. package/src/components/toolbar/toolbar.css +121 -0
  408. package/src/components/tooltip/README.md +46 -0
  409. package/src/components/tooltip/element.ts +22 -0
  410. package/src/components/tooltip/engine.ts +288 -0
  411. package/src/components/tooltip/react.tsx +30 -0
  412. package/src/components/tooltip/tooltip.css +78 -0
  413. package/src/components/tree-view/README.md +61 -0
  414. package/src/components/tree-view/element.ts +32 -0
  415. package/src/components/tree-view/engine.ts +743 -0
  416. package/src/components/tree-view/react.tsx +82 -0
  417. package/src/components/tree-view/tree-view.css +288 -0
  418. package/src/components/virtual-list/README.md +81 -0
  419. package/src/components/virtual-list/element.ts +42 -0
  420. package/src/components/virtual-list/engine.ts +678 -0
  421. package/src/components/virtual-list/react.tsx +101 -0
  422. package/src/components/virtual-list/virtual-list.css +194 -0
  423. package/src/components/voice-dots/README.md +48 -0
  424. package/src/components/voice-dots/element.ts +45 -0
  425. package/src/components/voice-dots/engine.ts +243 -0
  426. package/src/components/voice-dots/react.tsx +52 -0
  427. package/src/components/voice-dots/voice-dots.css +69 -0
  428. package/src/core/chips.ts +196 -0
  429. package/src/core/color.ts +304 -0
  430. package/src/core/date-range.ts +67 -0
  431. package/src/core/dates.ts +11 -1
  432. package/src/core/files.ts +107 -0
  433. package/src/core/filter.ts +229 -0
  434. package/src/core/gsap.ts +80 -65
  435. package/src/core/listbox.ts +332 -0
  436. package/src/core/mark.ts +29 -0
  437. package/src/core/position.ts +89 -0
  438. package/src/core/relative-time.ts +77 -0
  439. package/src/core/segment-field.ts +373 -0
  440. package/src/core/segments.ts +153 -0
  441. package/src/core/tree.ts +116 -0
  442. package/src/core/virtual.ts +79 -0
  443. package/src/css/tokens.css +186 -182
  444. package/src/elements/index.ts +186 -0
  445. package/src/index.ts +88 -0
  446. package/src/motion/liquid.ts +14 -4
  447. package/src/motion/micro.ts +248 -0
  448. package/src/motion/sheet.ts +88 -65
  449. package/src/motion/surface.ts +9 -0
  450. package/src/react/index.ts +71 -1
  451. package/dist/chunk-IKQ5FODN.js +0 -1617
  452. package/dist/chunk-IKQ5FODN.js.map +0 -1
  453. package/dist/chunk-J6OCFNGU.js +0 -177
  454. package/dist/chunk-J6OCFNGU.js.map +0 -1
  455. package/dist/chunk-TFNRIZHU.js +0 -3977
  456. package/dist/chunk-TFNRIZHU.js.map +0 -1
  457. package/dist/chunk-XAKC2QY7.js.map +0 -1
  458. package/dist/reveal-jsX-uwUz.d.ts +0 -625
  459. package/dist/store-DYb3tTsZ.d.ts +0 -195
@@ -0,0 +1,294 @@
1
+ import { registerMotion } from '../../core/gsap';
2
+ import { createScope } from '../../core/scope';
3
+ import { inert, type Instance } from '../../core/types';
4
+ import { createChips, type ChipItem } from '../../core/chips';
5
+ import { createListbox, filterOptions, type ListboxOption } from '../../core/listbox';
6
+ import { press, shake } from '../../motion/micro';
7
+
8
+ /*
9
+ * Multi select: a combobox field holding the chosen options as chips and a
10
+ * search input. Typing filters the options (letters in order, accents
11
+ * ignored, the matches marked); the list opens out of the field and its active
12
+ * option is a pill that glides (core/listbox.ts). Enter or a click toggles an
13
+ * option (its check draws itself); chips pop in and fold away
14
+ * (core/chips.ts). Backspace in an empty search arms the last chip (a ring),
15
+ * then removes it; ← reaches the chips. `max` stops further choices (the
16
+ * field shakes and the rest of the options turn off). An authored
17
+ * <select multiple> gives the options and stays in sync, so forms post as
18
+ * usual; otherwise `name` adds hidden inputs.
19
+ */
20
+
21
+ export interface MultiSelectOption {
22
+ value: string;
23
+ label: string;
24
+ group?: string;
25
+ hint?: string;
26
+ disabled?: boolean;
27
+ }
28
+
29
+ export interface MultiSelectOptions {
30
+ /** The options; without them, an authored <select multiple> gives them. */
31
+ options?: MultiSelectOption[];
32
+ value?: string[];
33
+ /** Search placeholder (default 'Buscar…'). */
34
+ placeholder?: string;
35
+ /** Accessible name (default: the authored <label>, else 'Selección'). */
36
+ label?: string;
37
+ /** Hidden inputs name[] (when there is no authored select). */
38
+ name?: string;
39
+ /** At most this many choices. */
40
+ max?: number;
41
+ /** Close the list after each choice (default false). */
42
+ closeOnSelect?: boolean;
43
+ disabled?: boolean;
44
+ onChange?: (values: string[]) => void;
45
+ }
46
+
47
+ export interface MultiSelectInstance extends Instance {
48
+ setValue(values: string[], notify?: boolean): void;
49
+ setOptions(options: MultiSelectOption[]): void;
50
+ open(): void;
51
+ close(): void;
52
+ readonly value: string[];
53
+ }
54
+
55
+ const CHEVRON = '<svg aria-hidden="true" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>';
56
+ const CLEAR = '<svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><path d="M7 7l10 10M17 7L7 17"/></svg>';
57
+
58
+ const readSelect = (select: HTMLSelectElement): MultiSelectOption[] =>
59
+ [...select.options].map((option) => ({
60
+ value: option.value,
61
+ label: option.label || option.textContent?.trim() || option.value,
62
+ group: option.parentElement instanceof HTMLOptGroupElement ? option.parentElement.label : undefined,
63
+ disabled: option.disabled,
64
+ }));
65
+
66
+ export function createMultiSelect(root: HTMLElement | null, settings: MultiSelectOptions = {}): MultiSelectInstance {
67
+ if (!root) return inert({ setValue() {}, setOptions() {}, open() {}, close() {}, value: [] });
68
+ registerMotion();
69
+ const scope = createScope();
70
+ const select = root.querySelector<HTMLSelectElement>('select[multiple]');
71
+ let all: MultiSelectOption[] = settings.options ?? (select ? readSelect(select) : []);
72
+ const max = Number.isFinite(settings.max) && settings.max! > 0 ? Math.floor(settings.max!) : Infinity;
73
+ const known = (value: string) => all.some((option) => option.value === value);
74
+ let value: string[] = (settings.value ?? (select ? [...select.selectedOptions].map((option) => option.value) : [])).filter(known).slice(0, max);
75
+ const labelText = settings.label ?? root.querySelector('label')?.textContent?.trim() ?? select?.getAttribute('aria-label') ?? 'Selección';
76
+
77
+ if (select) {
78
+ // The native select keeps posting the value; it is synced and out of sight.
79
+ const before = [...select.options].map((option) => option.selected);
80
+ scope.attr(select, 'hidden', '');
81
+ scope.attr(select, 'aria-hidden', 'true');
82
+ scope.attr(select, 'tabindex', '-1');
83
+ scope.add(() => [...select.options].forEach((option, i) => (option.selected = before[i] ?? false)));
84
+ }
85
+
86
+ const field = document.createElement('div');
87
+ field.dataset.mkMsField = '';
88
+ const chips = createChips({
89
+ disabled: settings.disabled,
90
+ onRemove: (removed) => toggle(removed, false),
91
+ onExit: () => input.focus(),
92
+ });
93
+ scope.add(() => chips.destroy());
94
+ const input = document.createElement('input');
95
+ input.type = 'text';
96
+ input.dataset.mkMsInput = '';
97
+ input.setAttribute('role', 'combobox');
98
+ input.setAttribute('aria-autocomplete', 'list');
99
+ input.setAttribute('aria-label', labelText);
100
+ input.autocomplete = 'off';
101
+ input.spellcheck = false;
102
+ input.placeholder = settings.placeholder ?? 'Buscar…';
103
+ input.disabled = Boolean(settings.disabled);
104
+ const clear = document.createElement('button');
105
+ clear.type = 'button';
106
+ clear.dataset.mkMsClear = '';
107
+ clear.setAttribute('aria-label', 'Quitar todo');
108
+ clear.innerHTML = CLEAR;
109
+ clear.disabled = Boolean(settings.disabled);
110
+ const chevron = document.createElement('span');
111
+ chevron.dataset.mkMsChevron = '';
112
+ chevron.innerHTML = CHEVRON;
113
+ field.append(chips.element, input, clear, chevron);
114
+ const status = document.createElement('span');
115
+ status.className = 'mk-sr-only';
116
+ status.setAttribute('role', 'status');
117
+ const hiddenHost = document.createElement('span');
118
+ hiddenHost.hidden = true;
119
+ root.append(field, status, hiddenHost);
120
+ scope.add(() => {
121
+ field.remove();
122
+ status.remove();
123
+ hiddenHost.remove();
124
+ });
125
+ scope.attr(root, 'data-mk-open', null);
126
+ scope.attr(root, 'data-mk-has-value', null);
127
+ scope.attr(root, 'data-mk-ready', '');
128
+
129
+ const listbox = createListbox({
130
+ input,
131
+ anchor: field,
132
+ host: root,
133
+ multiselectable: true,
134
+ label: labelText,
135
+ isSelected: (option) => value.includes(option),
136
+ onPick: (option) => toggle(option.value, !value.includes(option.value), true),
137
+ });
138
+ scope.add(() => listbox.destroy());
139
+
140
+ const labelOf = (option: string) => all.find((entry) => entry.value === option)?.label ?? option;
141
+ const listed = (): ListboxOption[] => {
142
+ const full = value.length >= max;
143
+ return filterOptions(all, input.value).map((option) => ({ ...option, disabled: option.disabled || (full && !value.includes(option.value)) }));
144
+ };
145
+
146
+ const sync = (animate: boolean) => {
147
+ chips.set(value.map((option): ChipItem => ({ value: option, label: labelOf(option) })), animate);
148
+ root.toggleAttribute('data-mk-has-value', value.length > 0);
149
+ input.placeholder = value.length ? '' : (settings.placeholder ?? 'Buscar…');
150
+ if (select) for (const option of select.options) option.selected = value.includes(option.value);
151
+ else if (settings.name) {
152
+ hiddenHost.replaceChildren(
153
+ ...value.map((option) => {
154
+ const hidden = document.createElement('input');
155
+ hidden.type = 'hidden';
156
+ hidden.name = `${settings.name}[]`;
157
+ hidden.value = option;
158
+ return hidden;
159
+ }),
160
+ );
161
+ }
162
+ if (listbox.isOpen) listbox.show(listed(), input.value);
163
+ };
164
+
165
+ const emit = () => {
166
+ settings.onChange?.([...value]);
167
+ root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value: [...value] } }));
168
+ };
169
+
170
+ const toggle = (option: string, on: boolean, fromList = false) => {
171
+ if (settings.disabled || on === value.includes(option)) return;
172
+ if (on && value.length >= max) {
173
+ shake(field);
174
+ status.textContent = `Máximo ${max} ${max === 1 ? 'opción' : 'opciones'}`;
175
+ return;
176
+ }
177
+ value = on ? [...value, option] : value.filter((entry) => entry !== option);
178
+ chips.arm(null);
179
+ sync(true);
180
+ status.textContent = `${labelOf(option)} ${on ? 'añadida' : 'quitada'}. ${value.length} ${value.length === 1 ? 'seleccionada' : 'seleccionadas'}.`;
181
+ if (fromList && input.value) {
182
+ input.value = '';
183
+ listbox.show(listed(), '');
184
+ }
185
+ if (fromList && settings.closeOnSelect) listbox.hide();
186
+ emit();
187
+ };
188
+
189
+ const open = () => {
190
+ if (settings.disabled || listbox.isOpen) return;
191
+ root.setAttribute('data-mk-open', '');
192
+ listbox.show(listed(), input.value);
193
+ };
194
+ const close = () => {
195
+ root.removeAttribute('data-mk-open');
196
+ listbox.hide();
197
+ };
198
+
199
+ scope.on(field, 'pointerdown', (event) => {
200
+ const target = event.target as Element | null;
201
+ if (target?.closest('[data-mk-chip-remove], [data-mk-ms-clear]')) return;
202
+ if (target !== input) event.preventDefault();
203
+ input.focus();
204
+ if (listbox.isOpen && target?.closest('[data-mk-ms-chevron]')) close();
205
+ else open();
206
+ });
207
+ scope.on(input, 'input', () => {
208
+ chips.arm(null);
209
+ open();
210
+ listbox.show(listed(), input.value);
211
+ });
212
+ scope.on(input, 'keydown', (event) => {
213
+ const key = event as KeyboardEvent;
214
+ switch (key.key) {
215
+ case 'ArrowDown':
216
+ key.preventDefault();
217
+ if (!listbox.isOpen) open();
218
+ listbox.move(1);
219
+ return;
220
+ case 'ArrowUp':
221
+ key.preventDefault();
222
+ if (!listbox.isOpen) open();
223
+ listbox.move(-1);
224
+ return;
225
+ case 'Home':
226
+ case 'End':
227
+ if (!listbox.isOpen || input.value) return;
228
+ key.preventDefault();
229
+ listbox.move(key.key === 'Home' ? 'first' : 'last');
230
+ return;
231
+ case 'Enter':
232
+ if (listbox.isOpen && listbox.pick()) key.preventDefault();
233
+ return;
234
+ case 'Escape':
235
+ if (listbox.isOpen) {
236
+ key.preventDefault();
237
+ close();
238
+ } else if (input.value) input.value = '';
239
+ return;
240
+ case 'Backspace':
241
+ if (input.value || !value.length) return;
242
+ key.preventDefault();
243
+ if (chips.armed) toggle(chips.armed, false);
244
+ else chips.arm(value[value.length - 1]!);
245
+ return;
246
+ case 'ArrowLeft':
247
+ if (input.selectionStart === 0 && input.selectionEnd === 0 && chips.focusLast()) {
248
+ key.preventDefault();
249
+ close();
250
+ }
251
+ return;
252
+ case 'Tab':
253
+ close();
254
+ return;
255
+ }
256
+ });
257
+ scope.on(input, 'blur', () => {
258
+ chips.arm(null);
259
+ // A click on an option keeps the focus (pointerdown is cancelled there); anything else closes.
260
+ close();
261
+ });
262
+ scope.on(clear, 'click', () => {
263
+ if (!value.length) return;
264
+ press(clear);
265
+ value = [];
266
+ sync(true);
267
+ status.textContent = 'Selección vacía';
268
+ input.focus();
269
+ emit();
270
+ });
271
+
272
+ sync(false);
273
+
274
+ return {
275
+ setValue(next, notify = false) {
276
+ if (scope.disposed) return;
277
+ value = next.filter(known).slice(0, max);
278
+ sync(true);
279
+ if (notify) emit();
280
+ },
281
+ setOptions(next) {
282
+ if (scope.disposed) return;
283
+ all = [...next];
284
+ value = value.filter(known);
285
+ sync(false);
286
+ },
287
+ open,
288
+ close,
289
+ get value() {
290
+ return [...value];
291
+ },
292
+ destroy: () => scope.dispose(),
293
+ };
294
+ }
@@ -0,0 +1,266 @@
1
+ /* multi-select — a 12 px field on surface-3 holding 8 px chips and a search input; a chevron that turns when the list
2
+ is open; a clear button when something is chosen. The chips and the listbox rules below are shared with tag-input
3
+ (each stylesheet works alone). */
4
+ .mk-multi-select,
5
+ mk-multi-select {
6
+ display: block;
7
+ min-width: 0;
8
+ }
9
+
10
+ [data-mk-ms-field] {
11
+ display: flex;
12
+ flex-wrap: wrap;
13
+ align-items: center;
14
+ gap: 0.35rem;
15
+ box-sizing: border-box;
16
+ min-height: 2.75rem;
17
+ padding: 0.35rem 0.4rem 0.35rem 0.5rem;
18
+ border-radius: 12px;
19
+ background: var(--mk-surface-3);
20
+ color: var(--mk-text);
21
+ cursor: text;
22
+ transition: box-shadow 0.2s ease;
23
+ }
24
+
25
+ [data-mk-ms-field]:focus-within {
26
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--mk-accent) 35%, transparent);
27
+ }
28
+
29
+ [data-mk-ms-input] {
30
+ flex: 1;
31
+ min-width: 6ch;
32
+ height: 1.75rem;
33
+ padding: 0 0.25rem;
34
+ border: 0;
35
+ background: transparent;
36
+ color: inherit;
37
+ font: inherit;
38
+ outline: none;
39
+ }
40
+
41
+ [data-mk-ms-input]::placeholder {
42
+ color: var(--mk-muted);
43
+ }
44
+
45
+ [data-mk-ms-clear],
46
+ [data-mk-ms-chevron] {
47
+ display: grid;
48
+ flex: none;
49
+ place-items: center;
50
+ width: 1.75rem;
51
+ height: 1.75rem;
52
+ color: var(--mk-muted);
53
+ }
54
+
55
+ [data-mk-ms-clear] {
56
+ padding: 0;
57
+ border: 0;
58
+ border-radius: 8px;
59
+ background: transparent;
60
+ cursor: pointer;
61
+ }
62
+
63
+ [data-mk-ms-clear]:hover {
64
+ background: color-mix(in srgb, var(--mk-text) 8%, transparent);
65
+ color: var(--mk-text);
66
+ }
67
+
68
+ :is(.mk-multi-select, mk-multi-select):not([data-mk-has-value]) [data-mk-ms-clear] {
69
+ display: none;
70
+ }
71
+
72
+ [data-mk-ms-chevron] {
73
+ transition: rotate 0.3s cubic-bezier(0.38, 0.49, 0, 1.5);
74
+ }
75
+
76
+ :is(.mk-multi-select, mk-multi-select)[data-mk-open] [data-mk-ms-chevron] {
77
+ rotate: 180deg;
78
+ }
79
+
80
+ @media (prefers-reduced-motion: reduce) {
81
+ [data-mk-ms-field],
82
+ [data-mk-ms-chevron] {
83
+ transition: none;
84
+ }
85
+ }
86
+
87
+ /* Chips (core/chips.ts): 8 px, accent-soft, a round remove button; the armed one (next Backspace) gets a ring. */
88
+ [data-mk-chips] {
89
+ display: contents;
90
+ margin: 0;
91
+ padding: 0;
92
+ list-style: none;
93
+ }
94
+
95
+ [data-mk-chip] {
96
+ display: inline-flex;
97
+ flex: none;
98
+ align-items: center;
99
+ gap: 0.15rem;
100
+ box-sizing: border-box;
101
+ max-width: 100%;
102
+ height: 1.75rem;
103
+ padding: 0 0.2rem 0 0.6rem;
104
+ overflow: hidden;
105
+ border-radius: 8px;
106
+ background: var(--mk-accent-soft);
107
+ color: var(--mk-on-accent-soft, var(--mk-text));
108
+ font-size: 0.8125rem;
109
+ font-weight: 500;
110
+ white-space: nowrap;
111
+ outline: none;
112
+ transition: box-shadow 0.2s ease;
113
+ }
114
+
115
+ [data-mk-chip-label] {
116
+ overflow: hidden;
117
+ text-overflow: ellipsis;
118
+ }
119
+
120
+ [data-mk-chip]:focus-visible,
121
+ [data-mk-chip][data-mk-armed] {
122
+ box-shadow: 0 0 0 2px var(--mk-accent);
123
+ }
124
+
125
+ [data-mk-chip-remove] {
126
+ display: grid;
127
+ flex: none;
128
+ place-items: center;
129
+ width: 1.25rem;
130
+ height: 1.25rem;
131
+ padding: 0;
132
+ border: 0;
133
+ border-radius: 50%;
134
+ background: transparent;
135
+ color: inherit;
136
+ cursor: pointer;
137
+ opacity: 0.7;
138
+ transition: background-color 0.15s ease, opacity 0.15s ease;
139
+ }
140
+
141
+ [data-mk-chip-remove]:hover {
142
+ background: color-mix(in srgb, currentColor 14%, transparent);
143
+ opacity: 1;
144
+ }
145
+
146
+ /* Listbox (core/listbox.ts): a 16 px panel in the top layer under the field; the active option sits on a pill. */
147
+ [data-mk-listbox] {
148
+ position: fixed;
149
+ inset: auto;
150
+ z-index: 2147482000;
151
+ box-sizing: border-box;
152
+ max-height: min(18rem, 50vh);
153
+ margin: 0;
154
+ padding: 0.35rem;
155
+ overflow: auto;
156
+ border: 1px solid var(--mk-outline-soft);
157
+ border-radius: 16px;
158
+ background: var(--mk-surface-1);
159
+ color: var(--mk-text);
160
+ box-shadow: 0 16px 40px -14px color-mix(in srgb, var(--mk-shadow-color, #000) 35%, transparent);
161
+ font: 0.9375rem/1.3 var(--mk-font, system-ui, sans-serif);
162
+ overscroll-behavior: contain;
163
+ }
164
+
165
+ [data-mk-listbox][hidden] {
166
+ display: none;
167
+ }
168
+
169
+ [data-mk-listbox-items] {
170
+ position: relative;
171
+ display: grid;
172
+ gap: 2px;
173
+ }
174
+
175
+ [data-mk-listbox-pill] {
176
+ position: absolute;
177
+ top: 0.35rem;
178
+ right: 0.35rem;
179
+ left: 0.35rem;
180
+ border-radius: 10px;
181
+ background: var(--mk-accent-soft);
182
+ opacity: 0;
183
+ pointer-events: none;
184
+ }
185
+
186
+ [data-mk-option] {
187
+ position: relative;
188
+ z-index: 1;
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 0.6rem;
192
+ min-height: 2.5rem;
193
+ padding: 0 0.75rem;
194
+ border-radius: 10px;
195
+ cursor: pointer;
196
+ user-select: none;
197
+ }
198
+
199
+ [data-mk-option][aria-disabled='true'] {
200
+ color: var(--mk-muted);
201
+ cursor: not-allowed;
202
+ opacity: 0.55;
203
+ }
204
+
205
+ [data-mk-option-label] {
206
+ flex: 1;
207
+ min-width: 0;
208
+ overflow-wrap: anywhere;
209
+ }
210
+
211
+ [data-mk-option-label] mark {
212
+ background: transparent;
213
+ color: inherit;
214
+ font-weight: 700;
215
+ text-decoration: underline;
216
+ text-decoration-color: var(--mk-accent);
217
+ text-decoration-thickness: 2px;
218
+ text-underline-offset: 3px;
219
+ }
220
+
221
+ [data-mk-option-hint] {
222
+ color: var(--mk-muted);
223
+ font-size: 0.8125rem;
224
+ }
225
+
226
+ [data-mk-option-check] {
227
+ display: grid;
228
+ flex: none;
229
+ place-items: center;
230
+ width: 1.15rem;
231
+ height: 1.15rem;
232
+ border: 1.5px solid var(--mk-outline);
233
+ border-radius: 5px;
234
+ color: transparent;
235
+ transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
236
+ }
237
+
238
+ [data-mk-option][aria-selected='true'] [data-mk-option-check] {
239
+ border-color: var(--mk-accent);
240
+ background: var(--mk-accent);
241
+ color: var(--mk-on-accent);
242
+ }
243
+
244
+ [data-mk-listbox-group] {
245
+ padding: 0.6rem 0.75rem 0.25rem;
246
+ color: var(--mk-muted);
247
+ font-size: 0.75rem;
248
+ font-weight: 600;
249
+ letter-spacing: 0.02em;
250
+ text-transform: uppercase;
251
+ }
252
+
253
+ [data-mk-listbox-empty] {
254
+ padding: 0.75rem;
255
+ color: var(--mk-muted);
256
+ font-size: 0.875rem;
257
+ text-align: center;
258
+ }
259
+
260
+ @media (prefers-reduced-motion: reduce) {
261
+ [data-mk-chip],
262
+ [data-mk-chip-remove],
263
+ [data-mk-option-check] {
264
+ transition: none;
265
+ }
266
+ }
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+ import { useRef, type HTMLAttributes } from 'react';
3
+ import { useIsomorphicLayoutEffect, useLatest } from '../../react/use-recipe';
4
+ import { createMultiSelect, type MultiSelectInstance, type MultiSelectOptions } from './engine';
5
+
6
+ export interface MultiSelectProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'>, MultiSelectOptions {
7
+ /** Controlled values; without it the field keeps its own (defaultValue). */
8
+ value?: string[];
9
+ defaultValue?: string[];
10
+ }
11
+
12
+ /** <MultiSelect options={people} value={chosen} onChange={setChosen} max={3} />. */
13
+ export function MultiSelect({ options, value, defaultValue, placeholder, label, name, max, closeOnSelect, disabled, onChange, className, ...props }: MultiSelectProps) {
14
+ const ref = useRef<HTMLDivElement>(null);
15
+ const instance = useRef<MultiSelectInstance | null>(null);
16
+ const change = useLatest(onChange);
17
+ const start = useRef(value ?? defaultValue ?? []);
18
+ const optionsKey = JSON.stringify(options ?? null);
19
+ useIsomorphicLayoutEffect(() => {
20
+ const created = createMultiSelect(ref.current, { options, value: value ?? start.current, placeholder, label, name, max, closeOnSelect, disabled, onChange: (next) => change.current?.(next) });
21
+ instance.current = created;
22
+ return () => {
23
+ start.current = created.value;
24
+ created.destroy();
25
+ instance.current = null;
26
+ };
27
+ // eslint-disable-next-line react-hooks/exhaustive-deps
28
+ }, [placeholder, label, name, max, closeOnSelect, disabled]);
29
+ useIsomorphicLayoutEffect(() => {
30
+ if (options && instance.current) instance.current.setOptions(options);
31
+ // eslint-disable-next-line react-hooks/exhaustive-deps
32
+ }, [optionsKey]);
33
+ const valueKey = JSON.stringify(value ?? null);
34
+ useIsomorphicLayoutEffect(() => {
35
+ if (value && instance.current && JSON.stringify(instance.current.value) !== valueKey) instance.current.setValue(value);
36
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37
+ }, [valueKey]);
38
+ return <div {...props} ref={ref} className={['mk-multi-select', className].filter(Boolean).join(' ')} />;
39
+ }
@@ -4,13 +4,15 @@ Navegación con siete estilos de escritorio y una sola barra de cristal en el m
4
4
 
5
5
  | Estilo | Cómo se ve |
6
6
  |---|---|
7
- | `clasica` | Barra lateral con borde; la página actual en una píldora rellena |
8
- | `bonita` | Píldoras de texto centradas que se ensanchan al pasar y al estar activas (padding con resorte, 0.3 s `cubic(.38,.49,0,1.5)`) |
7
+ | `sidebar` | Barra lateral con borde; la página actual en una píldora rellena |
8
+ | `pills` | Píldoras de texto centradas que se ensanchan al pasar y al estar activas (padding con resorte, 0.3 s `cubic(.38,.49,0,1.5)`) |
9
9
  | `dock` | Barra flotante de cristal centrada abajo; el botón activo se ensancha a 80 px |
10
- | `guapa` | La vista es una tarjeta sobre la cáscara tintada; la página actual es un chip blanco |
11
- | `tasks` | Riel de botones redondos de 56 px; el activo se cuadra (radio 0.3 s `cubic(.38,.49,0,2)`) |
12
- | `melon` | Barra lateral suave con un lavado primario en la página actual |
13
- | `tunnel` | Palabras grandes; la que tiene el ratón y sus vecinas crecen como un dock (1.2 / 1.09 / 1.03) |
10
+ | `card` | La vista es una tarjeta sobre la cáscara tintada; la página actual es un chip blanco |
11
+ | `rail` | Riel de botones redondos de 56 px; el activo se cuadra (radio 0.3 s `cubic(.38,.49,0,2)`) |
12
+ | `wash` | Barra lateral suave con un lavado primario en la página actual |
13
+ | `magnify` | Palabras grandes; la que tiene el ratón y sus vecinas crecen como un dock (1.2 / 1.09 / 1.03) |
14
+
15
+ Los nombres anteriores a la 0.15 (`clasica`, `bonita`, `guapa`, `tasks`, `melon`, `tunnel`) siguen funcionando: el motor los convierte en `sidebar`, `pills`, `card`, `rail`, `wash` y `magnify` (`NAV_STYLE_ALIASES`, `toNavStyle()`); en el marcado escrito usa ya la clase nueva para que se vea bien antes del JS.
14
16
 
15
17
  `accent` pinta la página actual en primary-container. Al cambiar de página el icono se rellena (`mk-nav-icon`, 125 ms, `FILL 0 → 1`, para fuentes de iconos como Material Symbols). Con `reveal`, al arrancar la cáscara se descubre desde el primer botón (`revealFrom`).
16
18
 
@@ -22,7 +24,7 @@ Navegación con siete estilos de escritorio y una sola barra de cristal en el m
22
24
  <header class="mk-shell__header"><h1 class="mk-shell__title">Inicio</h1></header>
23
25
  …
24
26
  </main>
25
- <mk-nav class="mk-nav mk-nav--bonita" nav-style="bonita" storage-key="mi-app-nav">
27
+ <mk-nav class="mk-nav mk-nav--pills" nav-style="pills" storage-key="mi-app-nav">
26
28
  <div class="mk-nav__buttons">
27
29
  <a class="mk-nav__button" href="/" aria-current="page"><svg class="mk-nav__icon">…</svg><span class="mk-nav__name">Inicio</span></a>
28
30
  <a class="mk-nav__button" href="/movimientos"><svg class="mk-nav__icon">…</svg><span class="mk-nav__name">Movimientos</span></a>
@@ -42,7 +44,7 @@ Navegación con siete estilos de escritorio y una sola barra de cristal en el m
42
44
 
43
45
  Escribe la clase `mk-nav--<estilo>` en el marcado para que se vea bien antes de que cargue el JS. Sin custom element: `createNav(document.querySelector('.mk-nav'), opciones)` sobre un `<nav>`.
44
46
 
45
- Partes: `.mk-nav__button--first` (botón de arriba: cuenta, espacio de trabajo), `.mk-nav__buttons`, `.mk-nav__actions` (`.mk-nav__button--action`), `.mk-nav__options` + `.mk-nav__label` (bloque extra que solo muestran clásica, guapa, melon y tunnel), `.mk-nav__icon`, `.mk-nav__name`, `data-mk-hide-mobile` (se esconde en el móvil). Vista: `.mk-shell__view`, `.mk-shell__header`, `.mk-shell__title`, `.mk-shell__content` (cada estilo ajusta su cabecera).
47
+ Partes: `.mk-nav__button--first` (botón de arriba: cuenta, espacio de trabajo), `.mk-nav__buttons`, `.mk-nav__actions` (`.mk-nav__button--action`), `.mk-nav__options` + `.mk-nav__label` (bloque extra que solo muestran sidebar, card, wash y magnify), `.mk-nav__icon`, `.mk-nav__name`, `data-mk-hide-mobile` (se esconde en el móvil). Vista: `.mk-shell__view`, `.mk-shell__header`, `.mk-shell__title`, `.mk-shell__content` (cada estilo ajusta su cabecera).
46
48
 
47
49
  ## React
48
50
 
@@ -52,7 +54,7 @@ const [page, setPage] = useState('home');
52
54
  <div className="mk-shell" style={{ height: '100dvh' }}>
53
55
  <main className="mk-shell__view">…</main>
54
56
  <Nav
55
- navStyle="tasks"
57
+ navStyle="rail"
56
58
  items={[
57
59
  { value: 'home', label: 'Inicio', icon: <HomeIcon /> },
58
60
  { value: 'movements', label: 'Movimientos', icon: <RowsIcon /> },
@@ -76,7 +78,7 @@ const [page, setPage] = useState('home');
76
78
 
77
79
  ## Variables CSS
78
80
 
79
- `--mk-nav-icon-size` (24px; 16px en guapa y melon con acento). Colores de los roles Material (`surface-container-*`, `primary-container`, `tertiary-container`…).
81
+ `--mk-nav-icon-size` (24px; 16px en card y wash con acento). Colores de los roles Material (`surface-container-*`, `primary-container`, `tertiary-container`…).
80
82
 
81
83
  ## Accesibilidad
82
84
 
@@ -1,8 +1,8 @@
1
1
  import { MkElement, defineElement, type OptionType } from '../../elements/base';
2
- import { createNav, type NavInstance, type NavStyle } from './engine';
2
+ import { createNav, type NavInstance, type NavStyle, type NavStyleAlias } from './engine';
3
3
 
4
4
  /**
5
- * <mk-nav class="mk-nav mk-nav--bonita" nav-style="bonita" [accent] [reveal] [storage-key="mi-app-nav"]>
5
+ * <mk-nav class="mk-nav mk-nav--pills" nav-style="pills" [accent] [reveal] [storage-key="mi-app-nav"]>
6
6
  * <div class="mk-nav__buttons"><a class="mk-nav__button" href="/">…</a></div>
7
7
  * </mk-nav>
8
8
  * Emits `mk:navigate` (detail: index, value, item, originalEvent) on click.
@@ -12,7 +12,7 @@ export class MkNavElement extends MkElement<NavInstance> {
12
12
 
13
13
  protected create(options: Record<string, unknown>) {
14
14
  return createNav(this, {
15
- style: options.navStyle as NavStyle | undefined,
15
+ style: options.navStyle as NavStyle | NavStyleAlias | undefined,
16
16
  accent: options.accent as boolean | undefined,
17
17
  reveal: Boolean(options.reveal),
18
18
  storageKey: options.storageKey as string | undefined,
@@ -22,7 +22,7 @@ export class MkNavElement extends MkElement<NavInstance> {
22
22
  // Style and accent change in place: rebuilding would replay the reveal.
23
23
  attributeChangedCallback(name: string, previous: string | null, next: string | null) {
24
24
  if (previous === next || !this.instance) return;
25
- if (name === 'nav-style' && next) this.instance.setStyle(next as NavStyle);
25
+ if (name === 'nav-style' && next) this.instance.setStyle(next as NavStyle | NavStyleAlias);
26
26
  else if (name === 'accent') this.instance.setAccent(next !== null && next !== 'false');
27
27
  else super.attributeChangedCallback(name, previous, next);
28
28
  }
@@ -31,7 +31,7 @@ export class MkNavElement extends MkElement<NavInstance> {
31
31
  this.instance?.select(target);
32
32
  }
33
33
 
34
- setStyle(style: NavStyle) {
34
+ setStyle(style: NavStyle | NavStyleAlias) {
35
35
  this.instance?.setStyle(style);
36
36
  }
37
37
  }