@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,28 @@
1
+ # drawer
2
+
3
+ Panel lateral izquierdo/derecho u hoja inferior sobre el motor de [dialog](../dialog/README.md): `<dialog>` nativo, foco, Escape, fondo, botones de cierre, retorno de foco al disparador y bloqueo del scroll de la página mientras es modal. Los laterales entran deslizándose desde su lado (curva de la hoja, 0.72 s); el inferior es la variante `sheet` existente, con arrastre para cerrar.
4
+
5
+ ```html
6
+ <button type="button" class="mk-button" data-mk-open="filtros">Filtros</button>
7
+ <mk-drawer id="filtros" side="left" heading="Filtros" description="Acota la lista">
8
+ <label class="mk-field">…</label>
9
+ <footer data-mk-part="footer"><button class="mk-button" data-mk-close>Aplicar</button></footer>
10
+ </mk-drawer>
11
+ ```
12
+
13
+ `defineElements()`; `createDrawer(dialog, { side: 'left' })` sobre un `<dialog class="mk-dialog">` propio con partes `header`, `title`, `description`, `body`, `footer`, `close`. React:
14
+
15
+ ```tsx
16
+ <Drawer.Root side="right" onOpenChange={setOpen}>
17
+ <Drawer.Trigger className="mk-button">Detalles</Drawer.Trigger>
18
+ <Drawer.Content>
19
+ <Drawer.Header><Drawer.Title>Pedido</Drawer.Title><Drawer.Close /></Drawer.Header>
20
+ <Drawer.Body>…</Drawer.Body>
21
+ <Drawer.Footer><button data-mk-close>Listo</button></Drawer.Footer>
22
+ </Drawer.Content>
23
+ </Drawer.Root>
24
+ ```
25
+
26
+ Opciones: `side='right'|'left'|'bottom'` y las de Dialog salvo variante, ubicación y ventana flotante (`backdrop`, `closeOnBackdrop`, `modal`, `drag` sólo abajo, `triggers`, `labels`, `onOpen`, `onClose`). Instancia igual que Dialog: `open(origin?)`, `close()`, `toggle()`, `isOpen`, `destroy()`; eventos `mk:open`, `mk:close` (cancelable) y `mk:closed`. `useDrawer()` da `{open, setOpen, side, instance}`. `Drawer.Root` acepta `open`, `defaultOpen` y `onOpenChange`.
27
+
28
+ El cierre desliza una copia inerte para devolver el foco al momento. El custom element mueve sus hijos al `<dialog>` y los devuelve al desconectarse. Variables: `--mk-drawer-width` (400px), las de `.mk-dialog`. En móvil el lateral ocupa hasta el 88 % del ancho. Movimiento reducido abre y cierra sin desplazamiento.
@@ -0,0 +1,57 @@
1
+ /* drawer — a full-height side panel (8 px from the edges, 400 px) or the bottom sheet; built on .mk-dialog. */
2
+ .mk-dialog[data-mk-drawer] {
3
+ --mk-drawer-width: 400px;
4
+ }
5
+
6
+ .mk-dialog:is([data-mk-drawer='left'], [data-mk-drawer='right']):not([data-mk-placement='anchor']) {
7
+ position: fixed;
8
+ width: min(var(--mk-drawer-width), calc(100vw - 16px));
9
+ height: calc(100dvh - 16px);
10
+ max-height: none;
11
+ margin: 0;
12
+ border-radius: var(--mk-dialog-radius);
13
+ }
14
+
15
+ .mk-dialog[data-mk-drawer='left']:not([data-mk-placement='anchor']) {
16
+ inset: 8px auto 8px 8px;
17
+ }
18
+
19
+ .mk-dialog[data-mk-drawer='right']:not([data-mk-placement='anchor']) {
20
+ inset: 8px 8px 8px auto;
21
+ }
22
+
23
+ /* Footer actions stay at the bottom of the panel. */
24
+ .mk-dialog[data-mk-drawer] [data-mk-part='footer'] {
25
+ margin-top: auto;
26
+ }
27
+
28
+ .mk-dialog[data-mk-drawer='bottom'] {
29
+ --mk-sheet-max-width: 640px;
30
+ }
31
+
32
+ /* Phones: the side panel keeps a strip of the page visible and squares its outer edge. */
33
+ @media (max-width: 679px) {
34
+ .mk-dialog:is([data-mk-drawer='left'], [data-mk-drawer='right']):not([data-mk-placement='anchor']) {
35
+ width: min(var(--mk-drawer-width), 88vw);
36
+ height: 100dvh;
37
+ padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom);
38
+ }
39
+
40
+ .mk-dialog[data-mk-drawer='left']:not([data-mk-placement='anchor']) {
41
+ inset: 0 auto 0 0;
42
+ border-radius: 0 var(--mk-dialog-radius) var(--mk-dialog-radius) 0;
43
+ }
44
+
45
+ .mk-dialog[data-mk-drawer='right']:not([data-mk-placement='anchor']) {
46
+ inset: 0 0 0 auto;
47
+ border-radius: var(--mk-dialog-radius) 0 0 var(--mk-dialog-radius);
48
+ }
49
+ }
50
+
51
+ mk-drawer {
52
+ display: contents;
53
+ }
54
+
55
+ mk-drawer:not(:defined) {
56
+ display: none;
57
+ }
@@ -0,0 +1,21 @@
1
+ import { defineElement, type OptionType } from '../../elements/base';
2
+ import type { DialogInstance, DialogOptions } from '../dialog/engine';
3
+ import { MkDialogElement } from '../dialog/element';
4
+ import { createDrawer, type DrawerSide } from './engine';
5
+
6
+ /**
7
+ * <mk-drawer id="filtros" side="left" heading="Filtros" [description] [no-backdrop] [persistent]>…</mk-drawer>
8
+ * Any [data-mk-open="filtros"] opens it. Children move into a native <dialog class="mk-dialog mk-drawer">
9
+ * (header, body and a [data-mk-part="footer"] child kept out of the scroll) and back on disconnect.
10
+ */
11
+ export class MkDrawerElement extends MkDialogElement {
12
+ static options: Record<string, OptionType> = { ...MkDialogElement.options, side: 'string' };
13
+
14
+ protected createEngine(dialog: HTMLDialogElement, options: DialogOptions, attributes: Record<string, unknown>): DialogInstance {
15
+ dialog.classList.add('mk-drawer');
16
+ const { variant: _variant, placement: _placement, float: _float, ...rest } = options;
17
+ return createDrawer(dialog, { ...rest, side: attributes.side as DrawerSide | undefined });
18
+ }
19
+ }
20
+
21
+ export const defineDrawer = () => defineElement('mk-drawer', MkDrawerElement);
@@ -0,0 +1,56 @@
1
+ import { createScope } from '../../core/scope';
2
+ import { inert, warnOnce } from '../../core/types';
3
+ import { createDialog, type DialogInstance, type DialogOptions } from '../dialog/engine';
4
+
5
+ /*
6
+ * Drawer: the dialog engine (native <dialog>, focus, Escape, backdrop, return
7
+ * to the opener, data-mk-close/[data-mk-part="close"] buttons) as a side panel
8
+ * that slides in from the left or right on the sheet curve, or a bottom sheet
9
+ * (the existing sheet variant, with drag to dismiss). Modal drawers lock the
10
+ * page scroll while open. Parts: header, title, description, body, footer, close.
11
+ */
12
+
13
+ export type DrawerSide = 'left' | 'right' | 'bottom';
14
+
15
+ export interface DrawerOptions extends Omit<DialogOptions, 'variant' | 'placement' | 'float' | 'anchor' | 'animateContent'> {
16
+ side?: DrawerSide;
17
+ }
18
+
19
+ export type DrawerInstance = DialogInstance;
20
+
21
+ export function createDrawer(dialog: HTMLElement | null, options: DrawerOptions = {}): DrawerInstance {
22
+ if (!dialog) {
23
+ warnOnce('drawer: missing <dialog> element');
24
+ return inert({ open() {}, close() {}, toggle() {}, float() {}, dock() {}, isOpen: false, isFloating: false, element: null as unknown as HTMLElement });
25
+ }
26
+ const scope = createScope();
27
+ const side: DrawerSide = options.side === 'left' || options.side === 'bottom' ? options.side : 'right';
28
+ const { side: _side, ...rest } = options;
29
+ scope.attr(dialog, 'data-mk-drawer', side);
30
+ const surface = createDialog(dialog, {
31
+ ...rest,
32
+ variant: side === 'bottom' ? 'sheet' : 'drawer',
33
+ // Side panels are full height: they do not resize or drag down.
34
+ autoResize: side === 'bottom' ? options.autoResize : false,
35
+ drag: side === 'bottom' ? options.drag ?? true : false,
36
+ float: false,
37
+ });
38
+ return {
39
+ open: surface.open,
40
+ close: surface.close,
41
+ toggle: surface.toggle,
42
+ float() {},
43
+ dock() {},
44
+ get isOpen() {
45
+ return surface.isOpen;
46
+ },
47
+ get isFloating() {
48
+ return false;
49
+ },
50
+ element: dialog,
51
+ destroy() {
52
+ surface.destroy();
53
+ scope.dispose();
54
+ },
55
+ };
56
+ }
@@ -0,0 +1,85 @@
1
+ 'use client';
2
+ import { createContext, useContext, useMemo, type ButtonHTMLAttributes, type DialogHTMLAttributes, type ReactNode } from 'react';
3
+ import { Dialog, useSurfaceEngine, useSurfaceRoot, type SurfaceContextValue, type SurfaceRootProps } from '../dialog/react';
4
+ import { createDrawer, type DrawerInstance, type DrawerOptions, type DrawerSide } from './engine';
5
+
6
+ interface DrawerContextValue extends SurfaceContextValue<DrawerInstance> {
7
+ side: DrawerSide;
8
+ }
9
+
10
+ const DrawerContext = createContext<DrawerContextValue | null>(null);
11
+
12
+ function useDrawerContext(part: string) {
13
+ const value = useContext(DrawerContext);
14
+ if (!value) throw new Error(`<Drawer.${part}> must be inside <Drawer.Root>`);
15
+ return value;
16
+ }
17
+
18
+ export interface DrawerRootProps extends Omit<SurfaceRootProps, 'variant' | 'placement' | 'float' | 'anchor' | 'animateContent'> {
19
+ side?: DrawerSide;
20
+ children?: ReactNode;
21
+ }
22
+
23
+ function Root({ side = 'right', children, ...props }: DrawerRootProps) {
24
+ const surface = useSurfaceRoot<DrawerInstance>(props);
25
+ return <DrawerContext.Provider value={{ ...surface, side }}>{children}</DrawerContext.Provider>;
26
+ }
27
+
28
+ /** A button that opens the drawer; focus returns to it on close. */
29
+ function Trigger({ onClick, children, ...props }: ButtonHTMLAttributes<HTMLButtonElement>) {
30
+ const context = useDrawerContext('Trigger');
31
+ return (
32
+ <button
33
+ type="button"
34
+ aria-haspopup="dialog"
35
+ aria-expanded={context.open}
36
+ {...props}
37
+ onClick={(event) => {
38
+ onClick?.(event);
39
+ if (event.defaultPrevented) return;
40
+ context.origin.current = event.currentTarget;
41
+ context.setOpen(!context.open);
42
+ }}
43
+ >
44
+ {children}
45
+ </button>
46
+ );
47
+ }
48
+
49
+ function Content({ className, children, ...props }: Omit<DialogHTMLAttributes<HTMLDialogElement>, 'open'>) {
50
+ const context = useDrawerContext('Content');
51
+ // The side is part of the engine's options: changing it rebuilds the drawer.
52
+ const options = useMemo(() => ({ ...context.options, side: context.side }) as typeof context.options, [context.options, context.side]);
53
+ const ref = useSurfaceEngine({ ...context, options }, (dialog, engineOptions) => createDrawer(dialog, engineOptions as DrawerOptions));
54
+ return (
55
+ <dialog ref={ref} className={['mk-dialog mk-drawer', className].filter(Boolean).join(' ')} {...props}>
56
+ {children}
57
+ </dialog>
58
+ );
59
+ }
60
+
61
+ /**
62
+ * drawer for React (the Dialog parts inside):
63
+ * <Drawer.Root side="left"><Drawer.Trigger>Filtros</Drawer.Trigger><Drawer.Content>
64
+ * <Drawer.Header><Drawer.Title>…</Drawer.Title><Drawer.Close /></Drawer.Header>
65
+ * <Drawer.Body>…</Drawer.Body><Drawer.Footer>…</Drawer.Footer>
66
+ * </Drawer.Content></Drawer.Root>
67
+ */
68
+ export const Drawer = {
69
+ Root,
70
+ Trigger,
71
+ Content,
72
+ Header: Dialog.Header,
73
+ Title: Dialog.Title,
74
+ Description: Dialog.Description,
75
+ Actions: Dialog.Actions,
76
+ Body: Dialog.Body,
77
+ Footer: Dialog.Footer,
78
+ Close: Dialog.Close,
79
+ };
80
+
81
+ /** Open state of the surrounding <Drawer.Root>. */
82
+ export function useDrawer() {
83
+ const context = useDrawerContext('useDrawer');
84
+ return { open: context.open, setOpen: context.setOpen, side: context.side, instance: context.instance };
85
+ }
@@ -0,0 +1,67 @@
1
+ # editable-table
2
+
3
+ Tabla editable con edición de celdas, validación y guardado, montada sobre `data-table`: conserva su orden, búsqueda, filtros, páginas y selección. Un anillo de acento se desliza de celda en celda con las flechas (.22 s, curva swing). Intro, F2 o simplemente empezar a escribir abren el editor de la celda (texto, número, fecha, opción o casilla) con un pequeño pop. Intro guarda y baja, Tab avanza de lado y Escape deja la celda como estaba.
4
+
5
+ Un valor que no pasa la validación sacude el editor y una línea explica por qué. Las celdas cambiadas llevan un punto de acento que hace pop y un tinte suave, y sobre la tabla se despliega una barra con el número de cambios (que rueda), «Descartar» y «Guardar» (también Ctrl/⌘ + S). Guardar espera a `onSave()`: el botón gira y luego las celdas guardadas destellan y sus marcas se apagan; si falla, la barra se sacude y los cambios se quedan. Las filas nuevas entran arriba con su primera celda abierta.
6
+
7
+ ## HTML / Astro
8
+
9
+ ```html
10
+ <mk-editable-table class="mk-editable-table" new-row='{"categoria":"hogar","activo":true}'
11
+ columns='[{"key":"producto","label":"Producto","required":true},
12
+ {"key":"precio","label":"Precio","type":"number","min":0},
13
+ {"key":"categoria","label":"Categoría","type":"select","options":[{"value":"hogar","label":"Hogar"},{"value":"cocina","label":"Cocina"}]},
14
+ {"key":"activo","label":"Activo","type":"boolean"}]'
15
+ rows='[{"id":1,"producto":"Taza","precio":189,"categoria":"cocina","activo":true}]'></mk-editable-table>
16
+
17
+ <script>
18
+ const table = document.querySelector('mk-editable-table');
19
+ table.addEventListener('mk:save', (event) => enviar(event.detail.changes));
20
+ </script>
21
+ ```
22
+
23
+ Con JavaScript, `createEditableTable(root, opciones)` recibe `onSave` (una promesa: si se rechaza, los cambios se quedan) y `validate` en cada columna.
24
+
25
+ ## React
26
+
27
+ ```tsx
28
+ <EditableTable
29
+ columns={columnas}
30
+ rows={productos}
31
+ newRow={() => ({ categoria: 'hogar', activo: true })}
32
+ onSave={async (cambios, filas) => {
33
+ await api.guardar(cambios);
34
+ setProductos(filas);
35
+ }}
36
+ />
37
+ ```
38
+
39
+ Unas `rows` nuevas desde la app reemplazan las de la tabla (los cambios pendientes se van con ellas): devuélvelas después de guardar.
40
+
41
+ ## Columnas
42
+
43
+ Las de `data-table` y además: `editable` (por defecto `true`; una columna con `render` no se edita), `editor` (`text`, `number`, `date`, `select` o `checkbox`; por defecto según `type`), `required`, `min`, `max` y `validate(valor, fila)`, que devuelve un mensaje o nada. Los números aceptan coma o punto decimal.
44
+
45
+ ## Opciones
46
+
47
+ Todas las de `data-table`, más:
48
+
49
+ | Opción | Atributo | Qué hace |
50
+ |---|---|---|
51
+ | `onSave(cambios, filas)` | — (evento `mk:save`) | Guarda los cambios; si la promesa se rechaza, se quedan pendientes. |
52
+ | `onChange(cambios)` | — (evento `mk:change`) | Después de cada edición. |
53
+ | `newRow()` | `new-row` (JSON) | Valores de una fila nueva; muestra «Agregar fila». |
54
+
55
+ Cada cambio es `{ id, row, changes, isNew?, removed? }`.
56
+
57
+ ## API
58
+
59
+ `edit(id, clave)`, `setValue(id, clave, valor)` (devuelve `false` si no pasa la validación), `addRow(valores?)`, `removeRows(ids)`, `save()`, `discard()`, `setRows(filas)`, `changes`, `dirty`, `rows`, `table` (la `data-table` de abajo), `destroy()`.
60
+
61
+ ## Teclado
62
+
63
+ Flechas para moverse; Inicio y Fin van al principio o al final de la fila (con Ctrl, de la tabla); Intro o F2 editan; escribir empieza a editar con lo escrito; Supr o Retroceso vacían la celda; Espacio cambia una casilla. Dentro del editor, Intro guarda y baja, Tab y Mayús + Tab guardan y avanzan, y Escape cancela. Ctrl/⌘ + S guarda todo.
64
+
65
+ ## Accesibilidad
66
+
67
+ La tabla es un `grid` de WAI-ARIA con una sola celda tabulable (tabindex móvil), `aria-readonly` en las celdas que no se editan y un editor con nombre («Precio, editar») que marca `aria-invalid` cuando el valor no pasa. Los errores se anuncian como alerta y un estado discreto anuncia lo guardado y lo descartado. Con movimiento reducido no hay deslizamientos ni destellos.
@@ -0,0 +1,200 @@
1
+ /* editable-table — data-table (needs data-table.css) whose cells edit in place: a 2 px accent ring that glides from
2
+ cell to cell, editors that fill the cell (8 px, accent border), changed cells with an accent dot that pops and a
3
+ soft tint, invalid ones ringed in the error colour, new rows tinted, saved cells that flash; the bar of changes
4
+ (12 px, surface-3) folds open above the table with Descartar and Guardar. */
5
+ .mk-editable-table,
6
+ mk-editable-table {
7
+ position: relative;
8
+ display: grid;
9
+ gap: 0.75rem;
10
+ min-width: 0;
11
+ color: var(--mk-text);
12
+ font-size: 0.875rem;
13
+ }
14
+
15
+ [data-mk-editable] [data-mk-dt-scroll] {
16
+ position: relative;
17
+ }
18
+
19
+ [data-mk-editable] td[data-key] {
20
+ outline: none;
21
+ }
22
+
23
+ [data-mk-editable] td[data-mk-et-editable] {
24
+ cursor: cell;
25
+ }
26
+
27
+ [data-mk-et-ring] {
28
+ position: absolute;
29
+ top: 0;
30
+ left: 0;
31
+ border-radius: 6px;
32
+ box-shadow: inset 0 0 0 2px var(--mk-accent);
33
+ opacity: 0;
34
+ pointer-events: none;
35
+ transition: opacity 0.15s;
36
+ }
37
+
38
+ [data-mk-editable] td[data-mk-et-dirty] {
39
+ position: relative;
40
+ background: color-mix(in srgb, var(--mk-accent) 9%, transparent);
41
+ }
42
+
43
+ [data-mk-editable] td[data-mk-et-dirty]::after {
44
+ content: '';
45
+ position: absolute;
46
+ top: 6px;
47
+ right: 6px;
48
+ width: 6px;
49
+ height: 6px;
50
+ border-radius: 50%;
51
+ background: var(--mk-accent);
52
+ }
53
+
54
+ [data-mk-editable] td[data-mk-et-pop]::after {
55
+ animation: mk-et-pop 0.4s cubic-bezier(0.38, 0.49, 0, 1.5);
56
+ }
57
+
58
+ @keyframes mk-et-pop {
59
+ from {
60
+ transform: scale(0);
61
+ }
62
+ }
63
+
64
+ [data-mk-editable] td[data-mk-et-invalid] {
65
+ background: color-mix(in srgb, var(--mk-error) 9%, transparent);
66
+ box-shadow: inset 0 0 0 2px var(--mk-error);
67
+ }
68
+
69
+ [data-mk-editable] td[data-mk-et-saved] {
70
+ animation: mk-et-saved 1.2s ease-out;
71
+ }
72
+
73
+ @keyframes mk-et-saved {
74
+ 0%,
75
+ 30% {
76
+ background: color-mix(in srgb, var(--mk-accent) 30%, transparent);
77
+ }
78
+ }
79
+
80
+ [data-mk-editable] tr[data-mk-et-new] td {
81
+ background: color-mix(in srgb, var(--mk-accent-soft) 45%, transparent);
82
+ }
83
+
84
+ [data-mk-editable] td[data-mk-et-editing] {
85
+ padding: 0 0.375rem;
86
+ }
87
+
88
+ [data-mk-et-editor] {
89
+ box-sizing: border-box;
90
+ width: 100%;
91
+ min-width: 6rem;
92
+ height: 2.25rem;
93
+ padding: 0 0.5rem;
94
+ border: 1.5px solid var(--mk-accent);
95
+ border-radius: 8px;
96
+ outline: none;
97
+ background: var(--mk-surface-1);
98
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--mk-accent) 22%, transparent);
99
+ color: var(--mk-text);
100
+ font: inherit;
101
+ text-align: inherit;
102
+ }
103
+
104
+ [data-mk-et-editor][aria-invalid='true'] {
105
+ border-color: var(--mk-error);
106
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--mk-error) 22%, transparent);
107
+ }
108
+
109
+ [data-mk-et-save] {
110
+ display: flex;
111
+ flex-wrap: wrap;
112
+ align-items: center;
113
+ gap: 0.5rem;
114
+ min-width: 0;
115
+ padding: 0.5rem 0.5rem 0.5rem 1rem;
116
+ border-radius: 12px;
117
+ background: var(--mk-surface-3);
118
+ }
119
+
120
+ [data-mk-et-save][hidden],
121
+ [data-mk-et-error][hidden] {
122
+ display: none;
123
+ }
124
+
125
+ [data-mk-et-save-text] {
126
+ flex: 1 1 auto;
127
+ font-weight: 500;
128
+ }
129
+
130
+ [data-mk-et-save-count] {
131
+ display: inline-block;
132
+ font-variant-numeric: tabular-nums;
133
+ font-weight: 700;
134
+ }
135
+
136
+ [data-mk-et-error] {
137
+ flex: 1 1 100%;
138
+ order: 3;
139
+ color: var(--mk-error);
140
+ font-size: 0.8125rem;
141
+ font-weight: 500;
142
+ }
143
+
144
+ [data-mk-et-save] button {
145
+ display: inline-flex;
146
+ align-items: center;
147
+ gap: 0.375rem;
148
+ height: 2.25rem;
149
+ padding: 0 0.875rem;
150
+ border: 0;
151
+ border-radius: 8px;
152
+ background: none;
153
+ color: var(--mk-text);
154
+ font: inherit;
155
+ font-weight: 600;
156
+ cursor: pointer;
157
+ }
158
+
159
+ [data-mk-et-save] button:focus-visible {
160
+ outline: 2px solid var(--mk-accent);
161
+ outline-offset: 2px;
162
+ }
163
+
164
+ [data-mk-et-save] button:disabled {
165
+ opacity: 0.38;
166
+ cursor: default;
167
+ }
168
+
169
+ [data-mk-et-save] button[data-mk-et-save-button] {
170
+ background: var(--mk-accent);
171
+ color: var(--mk-on-accent);
172
+ }
173
+
174
+ [data-mk-et-save-button][aria-busy='true']::before {
175
+ content: '';
176
+ width: 0.875rem;
177
+ height: 0.875rem;
178
+ border: 2px solid currentColor;
179
+ border-right-color: transparent;
180
+ border-radius: 50%;
181
+ animation: mk-et-spin 0.8s linear infinite;
182
+ }
183
+
184
+ @keyframes mk-et-spin {
185
+ to {
186
+ transform: rotate(360deg);
187
+ }
188
+ }
189
+
190
+ @media (prefers-reduced-motion: reduce) {
191
+ [data-mk-editable] td:is([data-mk-et-pop], [data-mk-et-saved])::after,
192
+ [data-mk-editable] td[data-mk-et-saved],
193
+ [data-mk-et-save-button][aria-busy='true']::before {
194
+ animation: none;
195
+ }
196
+
197
+ [data-mk-et-ring] {
198
+ transition: none;
199
+ }
200
+ }
@@ -0,0 +1,45 @@
1
+ import { MkElement, defineElement, type OptionType } from '../../elements/base';
2
+ import { createEditableTable, type EditableTableInstance } from './engine';
3
+ import type { DataRow } from '../data-table/engine';
4
+
5
+ /**
6
+ * <mk-editable-table class="mk-editable-table" new-row='{"estado":"nuevo"}'
7
+ * columns='[{"key":"producto","label":"Producto","required":true},{"key":"precio","label":"Precio","type":"number","min":0}]'
8
+ * rows='[{"id":1,"producto":"Taza","precio":189}]'></mk-editable-table>
9
+ * Emits mk:change ({changes}) and mk:save ({changes}); listen to mk:save to send them (the engine keeps them as saved).
10
+ */
11
+ export class MkEditableTableElement extends MkElement<EditableTableInstance> {
12
+ static options: Record<string, OptionType> = {
13
+ columns: 'json',
14
+ rows: 'json',
15
+ rowKey: 'string',
16
+ caption: 'string',
17
+ pageSize: 'number',
18
+ selectable: 'boolean',
19
+ search: 'string',
20
+ filters: 'boolean',
21
+ columnsMenu: 'boolean',
22
+ newRow: 'json',
23
+ locale: 'string',
24
+ };
25
+
26
+ protected create(options: Record<string, unknown>) {
27
+ const raw = this.getAttribute('search');
28
+ const search = raw === null || raw === '' ? true : raw === 'false' ? false : raw;
29
+ const template = options.newRow as DataRow | undefined;
30
+ return createEditableTable<DataRow>(this, { ...options, search, newRow: template ? () => ({ ...template }) : undefined } as Parameters<typeof createEditableTable>[1]);
31
+ }
32
+
33
+ attributeChangedCallback(name: string, previous: string | null, next: string | null) {
34
+ if (previous === next || !this.instance) return;
35
+ if (name === 'rows') {
36
+ try {
37
+ this.instance.setRows(JSON.parse(next ?? '[]') as DataRow[]);
38
+ } catch {
39
+ // Malformed JSON: keep the current rows.
40
+ }
41
+ } else super.attributeChangedCallback(name, previous, next);
42
+ }
43
+ }
44
+
45
+ export const defineEditableTable = () => defineElement('mk-editable-table', MkEditableTableElement);