@yewdiel21/motion-kit 0.9.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -0
- package/dist/auto/index.d.ts +72 -3
- package/dist/auto/index.js +139 -3
- package/dist/auto/index.js.map +1 -1
- package/dist/{chunk-BFC27F2G.js → chunk-6P4P7NU6.js} +2 -218
- package/dist/chunk-6P4P7NU6.js.map +1 -0
- package/dist/chunk-CU6SXW3E.js +20334 -0
- package/dist/chunk-CU6SXW3E.js.map +1 -0
- package/dist/{chunk-XDWBVFHQ.js → chunk-EY4BJKC4.js} +1203 -29
- package/dist/chunk-EY4BJKC4.js.map +1 -0
- package/dist/chunk-QP4QJOEN.js +72 -0
- package/dist/chunk-QP4QJOEN.js.map +1 -0
- package/dist/css/components/activity-feed.css +240 -0
- package/dist/css/components/attachment.css +266 -0
- package/dist/css/components/breadcrumb.css +110 -0
- package/dist/css/components/calendar.css +159 -0
- package/dist/css/components/chart-tooltip.css +168 -0
- package/dist/css/components/chart.css +296 -0
- package/dist/css/components/code-block.css +264 -0
- package/dist/css/components/color-area.css +82 -0
- package/dist/css/components/color-field.css +67 -0
- package/dist/css/components/color-picker.css +131 -0
- package/dist/css/components/color-slider.css +113 -0
- package/dist/css/components/command-search.css +252 -0
- package/dist/css/components/context-menu.css +23 -0
- package/dist/css/components/credit-card.css +288 -0
- package/dist/css/components/data-table.css +591 -0
- package/dist/css/components/date-range-picker.css +168 -0
- package/dist/css/components/date-time-picker.css +178 -0
- package/dist/css/components/drawer.css +58 -0
- package/dist/css/components/editable-table.css +201 -0
- package/dist/css/components/empty-state.css +61 -0
- package/dist/css/components/file-explorer.css +633 -0
- package/dist/css/components/filter-builder.css +232 -0
- package/dist/css/components/hold-confirm.css +87 -0
- package/dist/css/components/hover-card.css +20 -0
- package/dist/css/components/image-preview.css +195 -0
- package/dist/css/components/input-otp.css +10 -0
- package/dist/css/components/json-viewer.css +272 -0
- package/dist/css/components/like-button.css +78 -0
- package/dist/css/components/link-preview.css +275 -0
- package/dist/css/components/loading-button.css +77 -0
- package/dist/css/components/multi-select.css +267 -0
- package/dist/css/components/notification-bell.css +127 -0
- package/dist/css/components/pagination.css +11 -0
- package/dist/css/components/password-strength.css +183 -0
- package/dist/css/components/popover.css +25 -0
- package/dist/css/components/progress.css +140 -0
- package/dist/css/components/quantity.css +16 -0
- package/dist/css/components/questionnaire.css +217 -0
- package/dist/css/components/range-calendar.css +186 -0
- package/dist/css/components/range-slider.css +192 -0
- package/dist/css/components/resizable-panel.css +243 -0
- package/dist/css/components/rich-text-editor.css +284 -0
- package/dist/css/components/scratch-card.css +75 -0
- package/dist/css/components/skeleton.css +108 -0
- package/dist/css/components/slot-picker.css +126 -0
- package/dist/css/components/split-view.css +19 -0
- package/dist/css/components/star-rating.css +80 -0
- package/dist/css/components/stat-card.css +164 -0
- package/dist/css/components/studio-dock.css +35 -0
- package/dist/css/components/swipe-actions.css +105 -0
- package/dist/css/components/tag-input.css +244 -0
- package/dist/css/components/time-field.css +88 -0
- package/dist/css/components/timeline.css +219 -0
- package/dist/css/components/tooltip.css +79 -0
- package/dist/css/components/trailer.css +37 -0
- package/dist/css/components/tree-view.css +210 -0
- package/dist/css/components/virtual-list.css +195 -0
- package/dist/css/controls.css +65 -0
- package/dist/css/tokens.css +185 -181
- package/dist/elements/index.d.ts +742 -5
- package/dist/elements/index.js +1527 -8
- package/dist/elements/index.js.map +1 -1
- package/dist/{engine-GDGwQnJE.d.ts → engine-Cn6IhE3z.d.ts} +1 -1
- package/dist/engine-QECQnGz1.d.ts +33 -0
- package/dist/index.css +10113 -181
- package/dist/index.d.ts +89 -5
- package/dist/index.js +285 -9
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +678 -23
- package/dist/react/index.js +2389 -7
- package/dist/react/index.js.map +1 -1
- package/dist/{reduced-B98f8LPs.d.ts → reduced-BBUusld6.d.ts} +206 -2
- package/dist/reveal-DEvp6U6T.d.ts +2381 -0
- package/dist/{store-pHiUvxP8.d.ts → store-DjkTBX7f.d.ts} +2 -2
- package/package.json +1 -1
- package/registry.json +583 -104
- package/skills/motion-kit/SKILL.md +209 -189
- package/src/auto/auto-init.ts +136 -0
- package/src/components/activity-feed/README.md +56 -0
- package/src/components/activity-feed/activity-feed.css +239 -0
- package/src/components/activity-feed/element.ts +36 -0
- package/src/components/activity-feed/engine.ts +351 -0
- package/src/components/activity-feed/react.tsx +32 -0
- package/src/components/attachment/README.md +27 -0
- package/src/components/attachment/attachment.css +265 -0
- package/src/components/attachment/element.ts +50 -0
- package/src/components/attachment/engine.ts +469 -0
- package/src/components/attachment/react.tsx +65 -0
- package/src/components/breadcrumb/README.md +38 -0
- package/src/components/breadcrumb/breadcrumb.css +109 -0
- package/src/components/breadcrumb/element.ts +27 -0
- package/src/components/breadcrumb/engine.ts +249 -0
- package/src/components/breadcrumb/react.tsx +30 -0
- package/src/components/calendar/README.md +82 -0
- package/src/components/calendar/calendar.css +158 -0
- package/src/components/calendar/element.ts +27 -0
- package/src/components/calendar/engine.ts +412 -0
- package/src/components/calendar/react.tsx +69 -0
- package/src/components/chart/README.md +24 -0
- package/src/components/chart/chart.css +295 -0
- package/src/components/chart/element.ts +41 -0
- package/src/components/chart/engine.ts +811 -0
- package/src/components/chart/react.tsx +50 -0
- package/src/components/chart-tooltip/README.md +53 -0
- package/src/components/chart-tooltip/chart-tooltip.css +167 -0
- package/src/components/chart-tooltip/element.ts +37 -0
- package/src/components/chart-tooltip/engine.ts +442 -0
- package/src/components/chart-tooltip/react.tsx +47 -0
- package/src/components/code-block/README.md +19 -0
- package/src/components/code-block/code-block.css +263 -0
- package/src/components/code-block/element.ts +34 -0
- package/src/components/code-block/engine.ts +254 -0
- package/src/components/code-block/highlight.ts +244 -0
- package/src/components/code-block/react.tsx +94 -0
- package/src/components/color-area/README.md +50 -0
- package/src/components/color-area/color-area.css +81 -0
- package/src/components/color-area/element.ts +26 -0
- package/src/components/color-area/engine.ts +246 -0
- package/src/components/color-area/react.tsx +42 -0
- package/src/components/color-field/README.md +43 -0
- package/src/components/color-field/color-field.css +66 -0
- package/src/components/color-field/element.ts +26 -0
- package/src/components/color-field/engine.ts +174 -0
- package/src/components/color-field/react.tsx +42 -0
- package/src/components/color-picker/README.md +45 -0
- package/src/components/color-picker/color-picker.css +130 -0
- package/src/components/color-picker/element.ts +45 -0
- package/src/components/color-picker/engine.ts +314 -0
- package/src/components/color-picker/react.tsx +47 -0
- package/src/components/color-slider/README.md +55 -0
- package/src/components/color-slider/color-slider.css +112 -0
- package/src/components/color-slider/element.ts +26 -0
- package/src/components/color-slider/engine.ts +234 -0
- package/src/components/color-slider/react.tsx +45 -0
- package/src/components/command-search/README.md +15 -0
- package/src/components/command-search/command-search.css +251 -0
- package/src/components/command-search/element.ts +36 -0
- package/src/components/command-search/engine.ts +356 -0
- package/src/components/command-search/match.ts +53 -0
- package/src/components/command-search/react.tsx +66 -0
- package/src/components/context-menu/README.md +31 -0
- package/src/components/context-menu/context-menu.css +22 -0
- package/src/components/context-menu/element.ts +40 -0
- package/src/components/context-menu/engine.ts +153 -0
- package/src/components/context-menu/react.tsx +57 -0
- package/src/components/credit-card/README.md +20 -0
- package/src/components/credit-card/card.ts +77 -0
- package/src/components/credit-card/credit-card.css +287 -0
- package/src/components/credit-card/element.ts +33 -0
- package/src/components/credit-card/engine.ts +410 -0
- package/src/components/credit-card/react.tsx +36 -0
- package/src/components/data-table/README.md +83 -0
- package/src/components/data-table/data-table.css +590 -0
- package/src/components/data-table/element.ts +54 -0
- package/src/components/data-table/engine.ts +1059 -0
- package/src/components/data-table/react.tsx +94 -0
- package/src/components/date-range-picker/README.md +51 -0
- package/src/components/date-range-picker/date-range-picker.css +167 -0
- package/src/components/date-range-picker/element.ts +52 -0
- package/src/components/date-range-picker/engine.ts +352 -0
- package/src/components/date-range-picker/react.tsx +57 -0
- package/src/components/date-time-picker/README.md +48 -0
- package/src/components/date-time-picker/date-time-picker.css +177 -0
- package/src/components/date-time-picker/element.ts +47 -0
- package/src/components/date-time-picker/engine.ts +350 -0
- package/src/components/date-time-picker/react.tsx +54 -0
- package/src/components/dialog/README.md +103 -102
- package/src/components/dialog/element.ts +123 -118
- package/src/components/dialog/engine.ts +449 -432
- package/src/components/drawer/README.md +28 -0
- package/src/components/drawer/drawer.css +57 -0
- package/src/components/drawer/element.ts +21 -0
- package/src/components/drawer/engine.ts +56 -0
- package/src/components/drawer/react.tsx +85 -0
- package/src/components/editable-table/README.md +67 -0
- package/src/components/editable-table/editable-table.css +200 -0
- package/src/components/editable-table/element.ts +45 -0
- package/src/components/editable-table/engine.ts +775 -0
- package/src/components/editable-table/react.tsx +79 -0
- package/src/components/empty-state/README.md +41 -0
- package/src/components/empty-state/element.ts +23 -0
- package/src/components/empty-state/empty-state.css +60 -0
- package/src/components/empty-state/engine.ts +232 -0
- package/src/components/empty-state/react.tsx +34 -0
- package/src/components/file-explorer/README.md +67 -0
- package/src/components/file-explorer/element.ts +39 -0
- package/src/components/file-explorer/engine.ts +1307 -0
- package/src/components/file-explorer/file-explorer.css +632 -0
- package/src/components/file-explorer/react.tsx +77 -0
- package/src/components/filter-builder/README.md +47 -0
- package/src/components/filter-builder/element.ts +34 -0
- package/src/components/filter-builder/engine.ts +365 -0
- package/src/components/filter-builder/filter-builder.css +231 -0
- package/src/components/filter-builder/react.tsx +36 -0
- package/src/components/hold-confirm/README.md +13 -0
- package/src/components/hold-confirm/element.ts +24 -0
- package/src/components/hold-confirm/engine.ts +216 -0
- package/src/components/hold-confirm/hold-confirm.css +86 -0
- package/src/components/hold-confirm/react.tsx +28 -0
- package/src/components/hover-card/README.md +20 -0
- package/src/components/hover-card/element.ts +8 -0
- package/src/components/hover-card/engine.ts +131 -0
- package/src/components/hover-card/hover-card.css +19 -0
- package/src/components/hover-card/react.tsx +19 -0
- package/src/components/image-preview/README.md +16 -0
- package/src/components/image-preview/element.ts +26 -0
- package/src/components/image-preview/engine.ts +325 -0
- package/src/components/image-preview/image-preview.css +194 -0
- package/src/components/image-preview/react.tsx +43 -0
- package/src/components/input-otp/README.md +18 -0
- package/src/components/input-otp/element.ts +14 -0
- package/src/components/input-otp/engine.ts +106 -0
- package/src/components/input-otp/input-otp.css +9 -0
- package/src/components/input-otp/react.tsx +21 -0
- package/src/components/json-viewer/README.md +56 -0
- package/src/components/json-viewer/element.ts +37 -0
- package/src/components/json-viewer/engine.ts +440 -0
- package/src/components/json-viewer/json-viewer.css +271 -0
- package/src/components/json-viewer/react.tsx +56 -0
- package/src/components/like-button/README.md +13 -0
- package/src/components/like-button/element.ts +47 -0
- package/src/components/like-button/engine.ts +145 -0
- package/src/components/like-button/like-button.css +77 -0
- package/src/components/like-button/react.tsx +39 -0
- package/src/components/link-preview/README.md +19 -0
- package/src/components/link-preview/element.ts +29 -0
- package/src/components/link-preview/engine.ts +192 -0
- package/src/components/link-preview/link-preview.css +274 -0
- package/src/components/link-preview/react.tsx +101 -0
- package/src/components/loading-button/README.md +45 -0
- package/src/components/loading-button/element.ts +34 -0
- package/src/components/loading-button/engine.ts +201 -0
- package/src/components/loading-button/loading-button.css +76 -0
- package/src/components/loading-button/react.tsx +43 -0
- package/src/components/multi-select/README.md +48 -0
- package/src/components/multi-select/element.ts +28 -0
- package/src/components/multi-select/engine.ts +294 -0
- package/src/components/multi-select/multi-select.css +266 -0
- package/src/components/multi-select/react.tsx +39 -0
- package/src/components/notification-bell/README.md +14 -0
- package/src/components/notification-bell/element.ts +48 -0
- package/src/components/notification-bell/engine.ts +202 -0
- package/src/components/notification-bell/notification-bell.css +126 -0
- package/src/components/notification-bell/react.tsx +57 -0
- package/src/components/pagination/README.md +17 -0
- package/src/components/pagination/element.ts +14 -0
- package/src/components/pagination/engine.ts +102 -0
- package/src/components/pagination/pagination.css +10 -0
- package/src/components/pagination/react.tsx +22 -0
- package/src/components/password-strength/README.md +17 -0
- package/src/components/password-strength/element.ts +22 -0
- package/src/components/password-strength/engine.ts +212 -0
- package/src/components/password-strength/password-strength.css +182 -0
- package/src/components/password-strength/react.tsx +36 -0
- package/src/components/password-strength/score.ts +62 -0
- package/src/components/popover/README.md +44 -0
- package/src/components/popover/element.ts +31 -0
- package/src/components/popover/engine.ts +114 -0
- package/src/components/popover/popover.css +24 -0
- package/src/components/popover/react.tsx +50 -0
- package/src/components/progress/README.md +17 -0
- package/src/components/progress/element.ts +30 -0
- package/src/components/progress/engine.ts +173 -0
- package/src/components/progress/progress.css +139 -0
- package/src/components/progress/react.tsx +35 -0
- package/src/components/quantity/README.md +20 -0
- package/src/components/quantity/element.ts +14 -0
- package/src/components/quantity/engine.ts +85 -0
- package/src/components/quantity/quantity.css +15 -0
- package/src/components/quantity/react.tsx +21 -0
- package/src/components/questionnaire/README.md +32 -0
- package/src/components/questionnaire/element.ts +118 -0
- package/src/components/questionnaire/engine.ts +255 -0
- package/src/components/questionnaire/questionnaire.css +216 -0
- package/src/components/questionnaire/react.tsx +140 -0
- package/src/components/range-calendar/README.md +58 -0
- package/src/components/range-calendar/element.ts +42 -0
- package/src/components/range-calendar/engine.ts +390 -0
- package/src/components/range-calendar/range-calendar.css +185 -0
- package/src/components/range-calendar/react.tsx +56 -0
- package/src/components/range-slider/README.md +23 -0
- package/src/components/range-slider/element.ts +53 -0
- package/src/components/range-slider/engine.ts +316 -0
- package/src/components/range-slider/range-slider.css +191 -0
- package/src/components/range-slider/react.tsx +66 -0
- package/src/components/resizable-panel/README.md +61 -0
- package/src/components/resizable-panel/element.ts +36 -0
- package/src/components/resizable-panel/engine.ts +551 -0
- package/src/components/resizable-panel/react.tsx +74 -0
- package/src/components/resizable-panel/resizable-panel.css +242 -0
- package/src/components/rich-text-editor/README.md +57 -0
- package/src/components/rich-text-editor/element.ts +34 -0
- package/src/components/rich-text-editor/engine.ts +673 -0
- package/src/components/rich-text-editor/react.tsx +60 -0
- package/src/components/rich-text-editor/rich-text-editor.css +283 -0
- package/src/components/scratch-card/README.md +15 -0
- package/src/components/scratch-card/element.ts +30 -0
- package/src/components/scratch-card/engine.ts +257 -0
- package/src/components/scratch-card/react.tsx +40 -0
- package/src/components/scratch-card/scratch-card.css +74 -0
- package/src/components/skeleton/README.md +15 -0
- package/src/components/skeleton/element.ts +32 -0
- package/src/components/skeleton/engine.ts +104 -0
- package/src/components/skeleton/react.tsx +41 -0
- package/src/components/skeleton/skeleton.css +107 -0
- package/src/components/slot-picker/README.md +68 -0
- package/src/components/slot-picker/element.ts +27 -0
- package/src/components/slot-picker/engine.ts +412 -0
- package/src/components/slot-picker/react.tsx +76 -0
- package/src/components/slot-picker/slot-picker.css +125 -0
- package/src/components/split-view/README.md +50 -0
- package/src/components/split-view/element.ts +34 -0
- package/src/components/split-view/engine.ts +114 -0
- package/src/components/split-view/react.tsx +63 -0
- package/src/components/split-view/split-view.css +18 -0
- package/src/components/star-rating/README.md +14 -0
- package/src/components/star-rating/element.ts +26 -0
- package/src/components/star-rating/engine.ts +217 -0
- package/src/components/star-rating/react.tsx +33 -0
- package/src/components/star-rating/star-rating.css +79 -0
- package/src/components/stat-card/README.md +42 -0
- package/src/components/stat-card/element.ts +40 -0
- package/src/components/stat-card/engine.ts +283 -0
- package/src/components/stat-card/react.tsx +36 -0
- package/src/components/stat-card/stat-card.css +163 -0
- package/src/components/studio-dock/README.md +44 -0
- package/src/components/studio-dock/element.ts +11 -0
- package/src/components/studio-dock/engine.ts +212 -0
- package/src/components/studio-dock/react.tsx +23 -0
- package/src/components/studio-dock/studio-dock.css +34 -0
- package/src/components/swipe-actions/README.md +19 -0
- package/src/components/swipe-actions/element.ts +26 -0
- package/src/components/swipe-actions/engine.ts +260 -0
- package/src/components/swipe-actions/react.tsx +80 -0
- package/src/components/swipe-actions/swipe-actions.css +104 -0
- package/src/components/tag-input/README.md +42 -0
- package/src/components/tag-input/element.ts +39 -0
- package/src/components/tag-input/engine.ts +313 -0
- package/src/components/tag-input/react.tsx +54 -0
- package/src/components/tag-input/tag-input.css +243 -0
- package/src/components/time-field/README.md +54 -0
- package/src/components/time-field/element.ts +38 -0
- package/src/components/time-field/engine.ts +110 -0
- package/src/components/time-field/react.tsx +45 -0
- package/src/components/time-field/time-field.css +87 -0
- package/src/components/timeline/README.md +57 -0
- package/src/components/timeline/element.ts +31 -0
- package/src/components/timeline/engine.ts +300 -0
- package/src/components/timeline/react.tsx +59 -0
- package/src/components/timeline/timeline.css +218 -0
- package/src/components/tooltip/README.md +46 -0
- package/src/components/tooltip/element.ts +22 -0
- package/src/components/tooltip/engine.ts +288 -0
- package/src/components/tooltip/react.tsx +30 -0
- package/src/components/tooltip/tooltip.css +78 -0
- package/src/components/trailer/README.md +28 -0
- package/src/components/trailer/element.ts +13 -0
- package/src/components/trailer/engine.ts +189 -0
- package/src/components/trailer/react.tsx +16 -0
- package/src/components/trailer/trailer.css +36 -0
- package/src/components/tree-view/README.md +61 -0
- package/src/components/tree-view/element.ts +32 -0
- package/src/components/tree-view/engine.ts +569 -0
- package/src/components/tree-view/react.tsx +78 -0
- package/src/components/tree-view/tree-view.css +209 -0
- package/src/components/virtual-list/README.md +81 -0
- package/src/components/virtual-list/element.ts +42 -0
- package/src/components/virtual-list/engine.ts +678 -0
- package/src/components/virtual-list/react.tsx +101 -0
- package/src/components/virtual-list/virtual-list.css +194 -0
- package/src/core/chips.ts +196 -0
- package/src/core/color.ts +304 -0
- package/src/core/date-range.ts +67 -0
- package/src/core/dates.ts +108 -0
- package/src/core/files.ts +107 -0
- package/src/core/filter.ts +229 -0
- package/src/core/gsap.ts +80 -65
- package/src/core/listbox.ts +332 -0
- package/src/core/mark.ts +29 -0
- package/src/core/position.ts +89 -0
- package/src/core/relative-time.ts +77 -0
- package/src/core/segment-field.ts +373 -0
- package/src/core/segments.ts +153 -0
- package/src/core/tree.ts +116 -0
- package/src/core/virtual.ts +79 -0
- package/src/css/controls/README.md +14 -0
- package/src/css/controls/status.css +63 -0
- package/src/css/tokens.css +186 -182
- package/src/elements/index.ts +171 -0
- package/src/index.ts +97 -0
- package/src/motion/micro.ts +248 -0
- package/src/motion/sheet.ts +88 -65
- package/src/motion/surface.ts +9 -0
- package/src/react/index.ts +78 -0
- package/src/react/use-action-button.ts +6 -0
- package/src/react/use-editorial-reveal.ts +7 -0
- package/src/react/use-film-hero.ts +6 -0
- package/src/react/use-font-cycle.ts +7 -0
- package/src/react/use-image-zoom.ts +5 -0
- package/src/react/use-joined-cta.ts +5 -0
- package/src/react/use-local-clock.ts +5 -0
- package/src/react/use-scroll-dock.ts +5 -0
- package/src/react/use-sticker.ts +5 -0
- package/src/react/use-studio-dock.ts +8 -0
- package/src/react/use-thumbnail-nav.ts +7 -0
- package/src/react/use-trailer.ts +6 -0
- package/src/react/use-weight-hover.ts +5 -0
- package/src/recipes/action-button/README.md +31 -0
- package/src/recipes/action-button/action-button.css +113 -0
- package/src/recipes/action-button/create-action-button.ts +56 -0
- package/src/recipes/editorial-reveal/README.md +35 -0
- package/src/recipes/editorial-reveal/create-editorial-reveal.ts +91 -0
- package/src/recipes/editorial-reveal/editorial-reveal.css +17 -0
- package/src/recipes/film-hero/README.md +23 -0
- package/src/recipes/film-hero/create-film-hero.ts +65 -0
- package/src/recipes/film-hero/film-hero.css +29 -0
- package/src/recipes/font-cycle/README.md +11 -0
- package/src/recipes/font-cycle/create-font-cycle.ts +126 -0
- package/src/recipes/font-cycle/font-cycle.css +36 -0
- package/src/recipes/image-zoom/README.md +16 -0
- package/src/recipes/image-zoom/create-image-zoom.ts +27 -0
- package/src/recipes/image-zoom/image-zoom.css +7 -0
- package/src/recipes/joined-cta/README.md +13 -0
- package/src/recipes/joined-cta/create-joined-cta.ts +22 -0
- package/src/recipes/joined-cta/joined-cta.css +17 -0
- package/src/recipes/local-clock/README.md +31 -0
- package/src/recipes/local-clock/create-local-clock.ts +61 -0
- package/src/recipes/scroll-dock/README.md +46 -0
- package/src/recipes/scroll-dock/create-scroll-dock.ts +72 -0
- package/src/recipes/scroll-dock/scroll-dock.css +70 -0
- package/src/recipes/sticker/README.md +59 -0
- package/src/recipes/sticker/create-sticker.ts +490 -0
- package/src/recipes/sticker/sticker.css +112 -0
- package/src/recipes/thumbnail-nav/README.md +16 -0
- package/src/recipes/thumbnail-nav/create-thumbnail-nav.ts +165 -0
- package/src/recipes/thumbnail-nav/thumbnail-nav.css +108 -0
- package/src/recipes/weight-hover/README.md +37 -0
- package/src/recipes/weight-hover/create-weight-hover.ts +136 -0
- package/src/recipes/weight-hover/weight-hover.css +7 -0
- package/dist/chunk-BFC27F2G.js.map +0 -1
- package/dist/chunk-J6OCFNGU.js +0 -177
- package/dist/chunk-J6OCFNGU.js.map +0 -1
- package/dist/chunk-JQMJQSXD.js +0 -2374
- package/dist/chunk-JQMJQSXD.js.map +0 -1
- package/dist/chunk-XDWBVFHQ.js.map +0 -1
- package/dist/reveal-C0hCDcB_.d.ts +0 -415
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/curves.ts","../src/core/gsap.ts","../src/core/channels.ts","../src/core/split.ts","../src/core/frame.ts","../src/core/styles.ts","../src/core/physics-spring.ts","../src/motion/flow.ts","../src/motion/entrances.ts","../src/core/pointer.ts","../src/motion/reveal.ts","../src/motion/indicator.ts","../src/motion/count.ts","../src/motion/confetti.ts","../src/motion/anchor.ts","../src/motion/drag-dismiss.ts","../src/motion/floating.ts","../src/motion/surface.ts","../src/motion/liquid.ts","../src/motion/morph.ts","../src/motion/sheet.ts","../src/components/dialog/engine.ts","../src/components/menu/engine.ts","../src/components/chat-background/engine.ts","../src/components/steps/engine.ts","../src/components/quantity/engine.ts","../src/components/pagination/engine.ts","../src/components/hover-card/engine.ts","../src/components/input-otp/engine.ts","../src/components/studio-dock/engine.ts","../src/components/trailer/engine.ts","../src/core/dates.ts","../src/components/calendar/engine.ts","../src/components/slot-picker/engine.ts","../src/motion/micro.ts","../src/components/attachment/engine.ts","../src/components/skeleton/engine.ts","../src/components/questionnaire/engine.ts","../src/components/code-block/highlight.ts","../src/components/code-block/engine.ts","../src/components/context-menu/engine.ts","../src/components/drawer/engine.ts","../src/components/link-preview/engine.ts","../src/components/progress/engine.ts","../src/components/range-slider/engine.ts","../src/components/chart/engine.ts","../src/components/credit-card/card.ts","../src/components/credit-card/engine.ts","../src/components/command-search/match.ts","../src/components/command-search/engine.ts","../src/components/hold-confirm/engine.ts","../src/components/image-preview/engine.ts","../src/components/like-button/engine.ts","../src/components/notification-bell/engine.ts","../src/components/password-strength/score.ts","../src/components/password-strength/engine.ts","../src/components/scratch-card/engine.ts","../src/components/star-rating/engine.ts","../src/components/swipe-actions/engine.ts","../src/core/color.ts","../src/components/color-slider/engine.ts","../src/components/color-area/engine.ts","../src/components/color-field/engine.ts","../src/components/color-picker/engine.ts","../src/core/segments.ts","../src/core/segment-field.ts","../src/components/time-field/engine.ts","../src/core/date-range.ts","../src/components/range-calendar/engine.ts","../src/components/date-range-picker/engine.ts","../src/core/position.ts","../src/components/tooltip/engine.ts","../src/components/popover/engine.ts","../src/components/loading-button/engine.ts","../src/components/breadcrumb/engine.ts","../src/components/empty-state/engine.ts","../src/components/stat-card/engine.ts","../src/components/chart-tooltip/engine.ts","../src/core/chips.ts","../src/core/listbox.ts","../src/components/multi-select/engine.ts","../src/components/tag-input/engine.ts","../src/components/date-time-picker/engine.ts","../src/core/filter.ts","../src/components/filter-builder/engine.ts","../src/core/relative-time.ts","../src/components/timeline/engine.ts","../src/components/activity-feed/engine.ts","../src/core/mark.ts","../src/core/tree.ts","../src/components/tree-view/engine.ts","../src/core/files.ts","../src/components/file-explorer/engine.ts","../src/components/json-viewer/engine.ts","../src/core/virtual.ts","../src/components/virtual-list/engine.ts","../src/components/resizable-panel/engine.ts","../src/components/split-view/engine.ts","../src/components/data-table/engine.ts","../src/components/editable-table/engine.ts","../src/components/rich-text-editor/engine.ts"],"sourcesContent":["/** curve paths (CustomEase SVG syntax). */\nexport const PATHS = {\n /** The signature: a strong deceleration that is not a plain ease-out. */\n signature: 'M0,0 C0.308,0.19 0.107,0.633 0.288,0.866 0.382,0.987 0.656,1 1,1',\n /** Lists and steps entering (`flowSoft`, also `numberSoft`). */\n flow: 'M0,0 C0.25,0.1 0.25,1 1,1',\n /** A conversation scrolling to its newest message. */\n chatScroll: 'M0,0 C0.308,0.19 0.318,0.567 0.5,0.8 0.593,0.921 0.656,1 1,1',\n} as const;\n\n/**\n * A damped spring sampled as an ease path: `ratio` below 1\n * overshoots and settles, `velocity` is the starting speed.\n */\nexport function springPath(ratio: number, velocity = 0, steps = 72): string {\n const damping = Math.min(Math.max(ratio, 0.05), 0.999);\n const stiffness = 5.6;\n const frequency = (stiffness / damping) * Math.sqrt(1 - damping * damping);\n const phase = (velocity - stiffness) / frequency;\n const at = (time: number) =>\n 1 + Math.exp(-stiffness * time) * (-Math.cos(frequency * time) + phase * Math.sin(frequency * time));\n let path = 'M0,0';\n for (let step = 1; step <= steps; step += 1) {\n const time = step / steps;\n path += ` L${time.toFixed(4)},${(step === steps ? 1 : at(time)).toFixed(4)}`;\n }\n return path;\n}\n\n/**\n * own linear() sampling of the signature curve (its backdrop tint),\n * for CSS and the Web Animations API.\n */\nexport const SIGNATURE_LINEAR =\n 'linear(0 0%, .017 2.5%, .037 5%, .061 7.5%, .091 10%, .13 12.5%, .184 15%, .275 17.5%, .562 20%, .733 22.5%, .803 25%, .848 27.5%, .88 30%, .902 32.5%, .942 40%, .97 50%, .985 60%, .993 70%, .998 80%, 1 90%, 1 100%)';\n","import { gsap } from 'gsap';\r\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\r\nimport { SplitText } from 'gsap/SplitText';\r\nimport { CustomEase } from 'gsap/CustomEase';\r\nimport { Flip } from 'gsap/Flip';\r\nimport { PATHS, springPath } from './curves';\r\n\r\n/** elastic overshoot; close to the `--mk-ease-elastic` CSS curve. */\r\nexport const ELASTIC = 'elastic.out(1, 0.45)';\r\n\r\n/** Custom eases registered by `registerMotion()`. Use the names as GSAP `ease` values. */\r\nexport const EASE = {\r\n signature: 'mk-signature',\r\n flow: 'mk-flow',\r\n /** A closing surface's fade (`.56,.27,0,1`). Kept from v0.1; same curve as `fadeAway`. */\r\n close: 'mk-close',\r\n fadeAway: 'mk-fade-away',\r\n /** A closing surface's blur (`.37,.35,0,1`). */\r\n blurAway: 'mk-blur-away',\r\n chatScroll: 'mk-chat-scroll',\r\n /** Items travelling to a new place in a list (spring ratio .52). */\r\n layoutReflow: 'mk-layout-reflow',\r\n /** A dragged item landing in its slot (spring ratio .62). */\r\n sortableLand: 'mk-sortable-land',\r\n slot: 'mk-slot',\r\n slotResize: 'mk-slot-resize',\r\n liquidSize: 'mk-liquid-size',\r\n swatch: 'mk-swatch',\r\n swatchLight: 'mk-swatch-light',\r\n sheet: 'mk-sheet',\r\n inOut: 'mk-in-out',\r\n /** Melonmind's button press (`buttonClickAnimation`, .37,1.42,.37,1). */\r\n click: 'mk-click',\r\n /** Melonmind's playful padding/radius morph (.38,.49,0,2). */\r\n playful: 'mk-playful',\r\n /** Melonmind's surface entrance (`animation-general-in-2`, .1,.8,0,1.1). */\r\n pop: 'mk-pop',\r\n /** Melonmind's entry wipe (.38,.49,0,1). */\r\n wipe: 'mk-wipe',\r\n /** Melonmind's error shake (.6,.6,.12,1.26). */\r\n shake: 'mk-shake',\r\n} as const;\r\n\r\nconst CURVES: Record<keyof typeof EASE, string> = {\r\n signature: PATHS.signature,\r\n flow: PATHS.flow,\r\n close: '.56,.27,0,1',\r\n fadeAway: '.56,.27,0,1',\r\n blurAway: '.37,.35,0,1',\r\n chatScroll: PATHS.chatScroll,\r\n layoutReflow: springPath(0.52),\r\n sortableLand: springPath(0.62),\r\n slot: '.34,1.56,.64,1',\r\n slotResize: '.2,0,0,1',\r\n liquidSize: '.8,.3,.5,.8',\r\n swatch: '.38,.49,0,1.5',\r\n swatchLight: '.11,1,0,1',\r\n sheet: '.16,1,.3,1',\r\n inOut: '.42,0,.58,1',\r\n click: '.37,1.42,.37,1',\r\n playful: '.38,.49,0,2',\r\n pop: '.1,.8,0,1.1',\r\n wipe: '.38,.49,0,1',\r\n shake: '.6,.6,.12,1.26',\r\n};\r\n\r\nlet registered = false;\r\n\r\n/** Register plugins and eases once. Safe to call from every recipe and during SSR (no-op). */\r\nexport function registerMotion() {\r\n if (typeof window === 'undefined') return;\r\n // Cancels the MK_HEAD_SCRIPT safety net: JS owns the entrance states from here on.\r\n document.documentElement.classList.add('mk-ready');\r\n if (registered) return;\r\n registered = true;\r\n gsap.registerPlugin(ScrollTrigger, SplitText, CustomEase, Flip);\r\n for (const key of Object.keys(EASE) as Array<keyof typeof EASE>) CustomEase.create(EASE[key], CURVES[key]);\r\n}\r\n\r\nexport { gsap, ScrollTrigger, SplitText, CustomEase, Flip };\r\n","import { gsap } from 'gsap';\n\n/**\n * per-property motion channels:\n * each value moves toward its target either on a spring (stiffness, damping, an\n * initial kick) or on an eased duration, all stepped on GSAP's ticker. Used by\n * surfaces that grow out of a control (liquid dialog, toasts) and floating windows.\n */\n\nexport type Channel =\n | { type: 'spring'; stiffness: number; damping: number; mass?: number; velocity?: number; direction?: number }\n | { type: 'ease'; duration: number; ease: (progress: number) => number };\n\nexport interface ChannelState {\n current: number;\n origin: number;\n target: number;\n velocity: number;\n elapsed: number;\n active: boolean;\n config: Channel | null;\n}\n\nexport const easeOut = (t: number) => 1 - (1 - t) * (1 - t);\nexport const easeOutCubic = (t: number) => 1 - (1 - t) ** 3;\nexport const easeInCubic = (t: number) => t * t * t;\n\n/** A cubic-bezier as a function of progress. */\nexport function bezier(x1: number, y1: number, x2: number, y2: number) {\n const at = (t: number, a: number, b: number) => {\n const u = 1 - t;\n return 3 * u * u * t * a + 3 * u * t * t * b + t * t * t;\n };\n return (progress: number) => {\n if (progress <= 0 || progress >= 1) return Math.min(1, Math.max(0, progress));\n let low = 0;\n let high = 1;\n let t = progress;\n for (let step = 0; step < 24; step += 1) {\n const x = at(t, x1, x2);\n if (Math.abs(x - progress) < 1e-5) break;\n if (x < progress) low = t;\n else high = t;\n t = (low + high) / 2;\n }\n return at(t, y1, y2);\n };\n}\n\nexport const spring = (stiffness: number, damping: number, extra: { mass?: number; velocity?: number; direction?: number } = {}): Channel => ({\n type: 'spring',\n stiffness,\n damping,\n ...extra,\n});\n\nexport const eased = (duration: number, ease: (progress: number) => number): Channel => ({ type: 'ease', duration, ease });\n\nexport const createChannelState = (value: number): ChannelState => ({\n current: value,\n origin: value,\n target: value,\n velocity: 0,\n elapsed: 0,\n active: false,\n config: null,\n});\n\n/** Advance one channel by `seconds`. Pure: exported for tests and custom loops. */\nexport function stepChannel(channel: ChannelState, seconds: number) {\n const config = channel.config;\n if (!channel.active || !config) return;\n if (config.type === 'spring') {\n // Sub-steps of at most 1/60 s keep stiff springs stable; a long frame is capped.\n const time = Math.min(0.064, Math.max(0, seconds));\n const steps = Math.max(1, Math.ceil(time / (1 / 60) - 1e-9));\n const step = time / steps;\n for (let index = 0; index < steps; index += 1) {\n const force = -config.stiffness * (channel.current - channel.target) - config.damping * channel.velocity;\n channel.velocity += (force / (config.mass ?? 1)) * step;\n channel.current += channel.velocity * step;\n }\n if (Math.abs(channel.velocity) <= 0.01 && Math.abs(channel.target - channel.current) <= 0.01) {\n channel.current = channel.target;\n channel.velocity = 0;\n channel.active = false;\n }\n } else {\n channel.elapsed += Math.max(0, seconds);\n const progress = Math.min(1, channel.elapsed / config.duration);\n channel.current = progress >= 1 ? channel.target : channel.origin + (channel.target - channel.origin) * config.ease(progress);\n if (progress >= 1) channel.active = false;\n }\n}\n\n/** Animate named values toward targets, each on its own channel, calling `onChange` per frame. */\nexport function channels<K extends string>(start: Record<K, number>, onChange: (name: K, value: number) => void) {\n const names = Object.keys(start) as K[];\n const state = Object.fromEntries(names.map((name) => [name, createChannelState(start[name])])) as Record<K, ChannelState>;\n let last = 0;\n let resolveDone: (() => void) | null = null;\n\n const tick = () => {\n const now = performance.now();\n const elapsed = Math.max(0, (now - last) / 1000);\n last = now;\n let running = false;\n for (const name of names) {\n const channel = state[name];\n if (!channel.active) continue;\n stepChannel(channel, elapsed);\n onChange(name, channel.current);\n running ||= channel.active;\n }\n if (!running) {\n gsap.ticker.remove(tick);\n resolveDone?.();\n resolveDone = null;\n }\n };\n\n return {\n state,\n /** Start moving; resolves when every channel has settled (or `stop()` is called). */\n animate(targets: Partial<Record<K, number>>, configs: Partial<Record<K, Channel>>): Promise<void> {\n for (const name of Object.keys(targets) as K[]) {\n const channel = state[name];\n const config = configs[name];\n if (!channel || !config) continue;\n channel.config = config;\n channel.origin = channel.current;\n channel.target = targets[name] as number;\n channel.elapsed = 0;\n if (config.type === 'spring' && config.velocity) {\n const sign = config.direction !== undefined ? Math.sign(config.direction) : Math.sign(channel.target - channel.current);\n channel.velocity = Math.abs(config.velocity) * sign;\n }\n channel.active = channel.target !== channel.current || channel.velocity !== 0;\n }\n last = performance.now();\n gsap.ticker.remove(tick);\n gsap.ticker.add(tick);\n resolveDone?.();\n return new Promise((resolve) => {\n resolveDone = resolve;\n });\n },\n stop() {\n gsap.ticker.remove(tick);\n for (const name of names) state[name].active = false;\n resolveDone?.();\n resolveDone = null;\n },\n };\n}\n\n/** A damped spring as an ease function of progress. */\nexport function springEase(ratio: number, velocity = 0) {\n const damping = Math.min(Math.max(ratio, 0.05), 0.999);\n const stiffness = 5.6;\n const frequency = (stiffness / damping) * Math.sqrt(1 - damping * damping);\n const phase = (velocity - stiffness) / frequency;\n return (progress: number) =>\n progress >= 1 ? 1 : 1 + Math.exp(-stiffness * progress) * (-Math.cos(frequency * progress) + phase * Math.sin(frequency * progress));\n}\n","/**\n * Split text for animation and put it back afterwards. Words become inline-block\n * spans (so they can move); spaces stay plain text so lines still wrap. Elements\n * matched by `exclude` (tables, code) are left whole.\n */\nexport interface Split {\n parts: HTMLElement[];\n revert(): void;\n}\n\nexport interface SplitWordsOptions {\n exclude?: string[];\n className?: string;\n}\n\nexport function splitWords(el: HTMLElement, { exclude = ['table', 'pre'], className = 'mk-split-word' }: SplitWordsOptions = {}): Split {\n const parts: HTMLElement[] = [];\n const replaced: Array<[Text, Node[]]> = [];\n const skip = exclude.join(',');\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n const texts: Text[] = [];\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const parent = (node as Text).parentElement;\n if (skip && parent?.closest(skip) && el.contains(parent.closest(skip))) continue;\n if ((node as Text).data.trim()) texts.push(node as Text);\n }\n for (const text of texts) {\n const pieces = text.data.split(/(\\s+)/);\n const nodes: Node[] = [];\n for (const piece of pieces) {\n if (!piece) continue;\n if (/^\\s+$/.test(piece)) {\n nodes.push(document.createTextNode(piece));\n continue;\n }\n const span = document.createElement('span');\n span.className = className;\n span.style.display = 'inline-block';\n span.textContent = piece;\n parts.push(span);\n nodes.push(span);\n }\n text.replaceWith(...nodes);\n replaced.push([text, nodes]);\n }\n let reverted = false;\n return {\n parts,\n revert() {\n if (reverted) return;\n reverted = true;\n for (const [text, nodes] of replaced.reverse()) {\n nodes[0]?.parentNode?.insertBefore(text, nodes[0]);\n for (const node of nodes) node.parentNode?.removeChild(node);\n }\n el.normalize();\n },\n };\n}\n\ntype Segmenter = { segment(text: string): Iterable<{ segment: string }> };\n\n/** User-perceived characters (emoji with modifiers stay whole), at most `limit`. */\nexport function splitGraphemes(text: string, limit = 64): string[] {\n const Ctor = (Intl as unknown as { Segmenter?: new (locale?: string, options?: { granularity: string }) => Segmenter }).Segmenter;\n const all = Ctor ? Array.from(new Ctor(undefined, { granularity: 'grapheme' }).segment(text), (part) => part.segment) : Array.from(text);\n return all.slice(0, limit);\n}\n","/** requestAnimationFrame with a timer fallback (tests, old WebViews). Returns a cancel function. */\nexport function requestFrame(fn: (time: number) => void): () => void {\n if (typeof requestAnimationFrame === 'function') {\n const id = requestAnimationFrame(fn);\n return () => cancelAnimationFrame(id);\n }\n const id = setTimeout(() => fn(Date.now()), 16);\n return () => clearTimeout(id);\n}\n\n/** Resolves on the next frame, after the framework has painted a DOM change. */\nexport const nextFrame = () => new Promise<void>((resolve) => requestFrame(() => resolve()));\n","/**\n * Remove inline properties GSAP wrote, without asking GSAP. `gsap.set(el,\n * { clearProps: 'transform' })` measures the element first, and an element\n * that is not rendered (a closed <dialog>, display: none) is moved to the end of\n * the document and back to be measured — which reorders text around it and\n * disconnects custom elements inside. This only edits the style attribute and\n * drops GSAP's cache so the next tween starts from scratch.\n */\nexport function clearStyles(targets: Iterable<Element>, properties: string[]) {\n for (const element of targets) {\n const style = (element as HTMLElement).style;\n if (!style) continue;\n for (const property of properties) style.removeProperty(property);\n if (element.getAttribute('style') === '') element.removeAttribute('style');\n delete (element as unknown as { _gsap?: unknown })._gsap;\n }\n}\n\n/** What the surface morphs write. */\nexport const MORPH_STYLES = [\n 'transform',\n 'translate',\n 'rotate',\n 'scale',\n 'transform-origin',\n 'clip-path',\n 'opacity',\n 'visibility',\n 'filter',\n 'will-change',\n];\n","/*\n * Motion/Framer's physical spring — stiffness, damping and mass, released from\n * rest at 0 toward 1, with parameter pairs such as (400/10, 260/18…).\n * motionSpring() gives a GSAP ease plus the time it takes to settle;\n * springLinear() samples it as a CSS linear(). Ratio-based springs\n * stay in springPath / springEase.\n */\n\nconst REST = 0.001;\nconst STEP = 1 / 240;\nconst LIMIT = 10;\n\nexport interface MotionSpring {\n /** Progress 0…1 over `duration` → position (overshoots when bouncy). */\n ease: (progress: number) => number;\n /** Seconds until it stays within 0.1 % of the target. */\n duration: number;\n}\n\nfunction position(stiffness: number, damping: number, mass: number) {\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n if (zeta < 1) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return (t: number) => 1 - Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0) / wd) * Math.sin(wd * t));\n }\n if (zeta === 1) return (t: number) => 1 - Math.exp(-w0 * t) * (1 + w0 * t);\n const root = Math.sqrt(zeta * zeta - 1);\n const r1 = -w0 * (zeta - root);\n const r2 = -w0 * (zeta + root);\n return (t: number) => 1 - (r2 * Math.exp(r1 * t) - r1 * Math.exp(r2 * t)) / (r2 - r1);\n}\n\nconst springs = new Map<string, MotionSpring>();\n\nexport function motionSpring(stiffness: number, damping: number, mass = 1): MotionSpring {\n const key = `${stiffness}/${damping}/${mass}`;\n const known = springs.get(key);\n if (known) return known;\n const x = position(Math.max(stiffness, 1e-6), Math.max(damping, 0), Math.max(mass, 1e-6));\n let settled = 0;\n for (let i = 0; i * STEP <= LIMIT; i++) if (Math.abs(x(i * STEP) - 1) > REST) settled = (i + 1) * STEP;\n const duration = Math.round(Math.min(settled, LIMIT) * 1000) / 1000;\n const spring: MotionSpring = {\n ease: (progress) => (progress <= 0 ? 0 : progress >= 1 ? 1 : x(progress * duration)),\n duration,\n };\n springs.set(key, spring);\n return spring;\n}\n\n/** Seconds a Motion spring takes to settle. */\nexport const springDuration = (stiffness: number, damping: number, mass = 1) => motionSpring(stiffness, damping, mass).duration;\n\n/** The spring as a CSS linear() easing (pair it with springDuration). */\nexport function springLinear(stiffness: number, damping: number, mass = 1, points = 40) {\n const { ease } = motionSpring(stiffness, damping, mass);\n return `linear(${Array.from({ length: points + 1 }, (_, i) => Number(ease(i / points).toFixed(4))).join(', ')})`;\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { nextFrame } from '../core/frame';\nimport { clearStyles } from '../core/styles';\n\n/*\n * flowIn / flowOut: items drop in from 20 px above out of a 16 px blur,\n * 0.5 s, 50 ms apart (`flowSoft`), and leave 20 px down into the same blur.\n * Style 2 grows them from 90 % instead of moving them.\n */\n\nexport interface FlowInOptions {\n /** Distance travelled (style 1), px. */\n y?: number;\n blur?: number;\n duration?: number;\n stagger?: number;\n delay?: number;\n /** 1: drop from above (default). 2: grow from `startScale`. */\n style?: 1 | 2;\n startScale?: number;\n /** Last item first. */\n reverse?: boolean;\n /** With a single container as target, animate its matches instead. */\n target?: string;\n ease?: string;\n /**\n * Hide with visibility as well as opacity (default). Off for controls that must\n * take focus while they enter (menu options): a visibility:hidden element cannot.\n */\n autoAlpha?: boolean;\n}\n\nexport interface FlowOutOptions {\n y?: number;\n blur?: number;\n duration?: number;\n stagger?: number;\n delay?: number;\n reverse?: boolean;\n target?: string;\n}\n\nconst CLEAR = 'transform,filter,opacity,visibility';\n\nfunction list(targets: gsap.TweenTarget, target?: string, reverse?: boolean): HTMLElement[] {\n let items: HTMLElement[];\n if (target && targets instanceof Element) items = [...targets.querySelectorAll<HTMLElement>(target)];\n else items = gsap.utils.toArray<HTMLElement>(targets);\n return reverse ? items.reverse() : items;\n}\n\n/** Flow items in. Returns the tween, or null when there is nothing to animate or motion is reduced. */\nexport function flowIn(targets: gsap.TweenTarget, options: FlowInOptions = {}): gsap.core.Tween | null {\n registerMotion();\n const {\n y = 20,\n blur = 16,\n duration = TIMING.flow,\n stagger = TIMING.flowStagger,\n delay = 0,\n style = 1,\n startScale = 0.9,\n reverse = false,\n target,\n ease = EASE.flow,\n autoAlpha = true,\n } = options;\n const items = list(targets, target, reverse);\n if (!items.length) return null;\n if (reduced()) {\n // Not gsap.set(clearProps): it would move hidden items around to measure them.\n clearStyles(items, ['transform', 'translate', 'rotate', 'scale', 'filter', 'opacity', 'visibility']);\n return null;\n }\n const from = style === 2 ? { scale: startScale } : { y: -y };\n const to = style === 2 ? { scale: 1 } : { y: 0 };\n const alpha = autoAlpha ? 'autoAlpha' : 'opacity';\n return gsap.fromTo(\n items,\n { ...from, [alpha]: 0, filter: `blur(${blur}px)` },\n { ...to, [alpha]: 1, filter: 'blur(0px)', duration, stagger, delay, ease, clearProps: CLEAR },\n );\n}\n\n/** Flow items out (down into a blur). They stay hidden afterwards; flowIn brings them back. */\nexport function flowOut(targets: gsap.TweenTarget, options: FlowOutOptions = {}): gsap.core.Tween | null {\n registerMotion();\n const { y = 20, blur = 16, duration = TIMING.flow, stagger = TIMING.flowStagger, delay = 0, reverse = false, target } = options;\n const items = list(targets, target, reverse);\n if (!items.length) return null;\n if (reduced()) {\n gsap.set(items, { autoAlpha: 0 });\n return null;\n }\n return gsap.to(items, { y, autoAlpha: 0, filter: `blur(${blur}px)`, duration, stagger, delay, ease: EASE.flow });\n}\n\n/**\n * step change: the current children flow out, `mutate` swaps the\n * content (render the next step there), and after a frame the new children flow in.\n */\nexport async function stepChange(\n container: HTMLElement,\n mutate: () => void | Promise<void>,\n { duration = TIMING.stepChange }: { duration?: number } = {},\n): Promise<void> {\n const before = [...container.children] as HTMLElement[];\n const out = flowOut(before, { duration });\n if (out) await out;\n await mutate();\n await nextFrame();\n flowIn([...container.children] as HTMLElement[], { duration });\n}\n","import { TIMING } from '../core/timing';\nimport { flowIn } from './flow';\n\n/*\n * Named entrances: the same\n * flowIn with each surface's own scale, blur and rhythm.\n */\n\n/** Navigation menu options: grow from 90 % out of 4 px blur, last first, after 0.1 s. */\nexport const flowInMenu = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.9, blur: 4, reverse: true, autoAlpha: false, ...TIMING.menu });\n\n/** Theme picker swatches: pop in from half size, 10 ms apart. */\nexport const flowInPalette = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.5, blur: 4, autoAlpha: false, ...TIMING.palette });\n\n/** Form cards (`[data-flow-item]`): grow from 90 % out of 8 px blur. */\nexport const flowInForm = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.9, blur: 8, ...TIMING.form });\n\n/** Landing pieces: grow from 85 % out of 24 px blur, after 0.15 s. */\nexport const flowInLanding = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.85, blur: 24, ...TIMING.landing });\n\n/** Long-form content (`[data-flow]`, markdown blocks): style 2, 0.6 s, 60 ms apart. */\nexport const flowInContent = (root: Element) =>\n flowIn(root, { style: 2, target: '[data-flow], .markdown-content > *', ...TIMING.content });\n","import { gsap } from 'gsap';\n\n/** Live pointer position (viewport px) plus movement accumulated since the last frame. */\nexport const pointer = { x: 0, y: 0, active: false };\n\nlet mx = 0;\nlet my = 0;\nlet lastX: number | null = null;\nlet lastY: number | null = null;\nlet users = 0;\n\nfunction onMove(e: PointerEvent) {\n if (lastX !== null && lastY !== null) {\n mx += e.clientX - lastX;\n my += e.clientY - lastY;\n }\n lastX = pointer.x = e.clientX;\n lastY = pointer.y = e.clientY;\n pointer.active = true;\n}\n\nfunction onOut(e: PointerEvent) {\n if (e.relatedTarget) return;\n pointer.active = false;\n lastX = lastY = null;\n}\n\n/** Start tracking (reference-counted). Call the returned function when the recipe is destroyed. */\nexport function bindPointer(): () => void {\n if (users++ === 0) {\n addEventListener('pointermove', onMove, { passive: true });\n document.addEventListener('pointerout', onOut);\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (--users > 0) return;\n removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerout', onOut);\n pointer.active = false;\n lastX = lastY = null;\n mx = my = 0;\n };\n}\n\nlet frameMovement = { mx: 0, my: 0 };\nlet movementFrame = -1;\n\n/**\n * Pointer movement since the previous animation frame. Every caller in the same\n * frame gets the same value (two recipes on a page both feel the pointer); the\n * next frame starts again from what moved since.\n */\nexport function takeMovement() {\n const frame = gsap.ticker.frame;\n if (frame !== movementFrame) {\n movementFrame = frame;\n frameMovement = { mx, my };\n mx = my = 0;\n }\n return frameMovement;\n}\n","import { gsap, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { pointer } from '../core/pointer';\nimport { TIMING } from '../core/timing';\n\n/*\n * reveal: a veil in the\n * surface's own colour covers it and a round opening grows from the origin,\n * uncovering the content like a wave; then the veil fades. Overshoot 2 lets the\n * opening pass the far corner halfway through, so the end is soft.\n */\n\nexport type RevealSpeed = keyof typeof TIMING.reveal;\n\nexport interface RevealOptions {\n /** Element (its centre) or viewport point. Default: the last pointer position, else the centre. */\n origin?: Element | { x: number; y: number } | null;\n speed?: RevealSpeed;\n delay?: number;\n overshoot?: number;\n /** Veil colour. Default: the first opaque background up the tree, else var(--mk-bg). */\n fill?: string;\n}\n\nexport interface RevealHandle {\n timeline: gsap.core.Timeline;\n finished: Promise<void>;\n /** Stop now and remove the veil. */\n cancel(): void;\n}\n\nconst TRANSPARENT = /^(transparent|rgba\\(0, 0, 0, 0\\))$/;\n\nfunction backgroundOf(el: Element): string {\n for (let node: Element | null = el; node; node = node.parentElement) {\n const color = getComputedStyle(node).backgroundColor;\n if (color && !TRANSPARENT.test(color)) return color;\n }\n return 'var(--mk-bg, #fff)';\n}\n\nexport function revealFrom(target: HTMLElement, options: RevealOptions = {}): RevealHandle | null {\n if (reduced() || !target.isConnected) return null;\n registerMotion();\n const { speed = 'normal', delay = 0, overshoot = 2 } = options;\n const style = getComputedStyle(target);\n const fill = options.fill ?? backgroundOf(target);\n const position = target.style.position;\n if (style.position === 'static') target.style.position = 'relative';\n\n const box = target.getBoundingClientRect();\n const width = target.clientWidth;\n const height = target.clientHeight;\n let point: { x: number; y: number } | null = null;\n const origin = options.origin;\n if (origin instanceof Element) {\n if (origin.isConnected) {\n const rect = origin.getBoundingClientRect();\n point = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n }\n } else if (origin) point = origin;\n else if (origin === undefined && pointer.active) point = { x: pointer.x, y: pointer.y };\n const x = point ? point.x - box.left - target.clientLeft : width / 2;\n const y = point ? point.y - box.top - target.clientTop : height / 2;\n const radius =\n Math.max(Math.hypot(x, y), Math.hypot(width - x, y), Math.hypot(x, height - y), Math.hypot(width - x, height - y)) * overshoot;\n\n const veil = document.createElement('div');\n veil.setAttribute('aria-hidden', 'true');\n veil.dataset.mkVeil = '';\n Object.assign(veil.style, {\n position: 'absolute',\n top: `${target.scrollTop}px`,\n left: `${target.scrollLeft}px`,\n width: `${width}px`,\n height: `${height}px`,\n borderRadius: style.borderRadius,\n pointerEvents: 'none',\n zIndex: '1000',\n });\n const progress = { value: 0 };\n const paint = () => {\n veil.style.background = `radial-gradient(${radius}px at ${x}px ${y}px, transparent 0%, ${fill} ${progress.value}%)`;\n };\n paint();\n target.append(veil);\n\n let done = false;\n let resolve!: () => void;\n const finished = new Promise<void>((r) => (resolve = r));\n const cleanup = () => {\n if (done) return;\n done = true;\n veil.remove();\n target.style.position = position;\n resolve();\n };\n const [duration, fade] = TIMING.reveal[speed];\n const timeline = gsap\n .timeline({ delay, onComplete: cleanup, onInterrupt: cleanup })\n .to(progress, { value: 100, duration, ease: 'power2.out', onUpdate: paint }, 0)\n .to(veil, { opacity: 0, duration: fade, ease: 'power1.out' }, Math.max(0, duration * Math.min(1, 1 / overshoot) - 0.1));\n\n return {\n timeline,\n finished,\n cancel() {\n timeline.kill();\n cleanup();\n },\n };\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * Tabs: the indicator fits the selected option's box in 0.45 s\n * on the signature curve (Flip.fit in the original; here the same box is\n * tweened directly). The indicator is an absolutely positioned child at 0,0 of\n * the group. A scrolling group centres the selected option.\n */\n\nexport interface IndicatorOptions {\n immediate?: boolean;\n duration?: number;\n /** Scroll container to centre the target in (when it overflows). */\n scroller?: HTMLElement | null;\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport function slideIndicator(indicator: HTMLElement, target: HTMLElement | null, options: IndicatorOptions = {}) {\n registerMotion();\n const { immediate = false, duration = TIMING.indicator, scroller, orientation = 'horizontal' } = options;\n gsap.killTweensOf(indicator);\n if (!target) {\n gsap.set(indicator, { opacity: 0 });\n return null;\n }\n const box = { x: target.offsetLeft, y: target.offsetTop, width: target.offsetWidth, height: target.offsetHeight, opacity: 1 };\n if (scroller) {\n const horizontal = orientation === 'horizontal';\n const overflow = horizontal ? scroller.scrollWidth > scroller.clientWidth : scroller.scrollHeight > scroller.clientHeight;\n if (overflow && typeof scroller.scrollTo === 'function') {\n const offset = horizontal\n ? box.x - (scroller.clientWidth - box.width) / 2\n : box.y - (scroller.clientHeight - box.height) / 2;\n scroller.scrollTo({ [horizontal ? 'left' : 'top']: offset, behavior: immediate || reduced() ? 'auto' : 'smooth' });\n }\n }\n if (immediate || reduced()) {\n gsap.set(indicator, box);\n return null;\n }\n return gsap.to(indicator, { ...box, duration, ease: EASE.signature });\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { requestFrame } from '../core/frame';\n\n/*\n * Numbers that count to their new value: animated number (`numberSoft`,\n * 0.6 s; 0.7 s on prices) and the onboarding's revealed balance (rAF, 0.9 s,\n * ease-out cubic). Both continue from the value currently shown.\n */\n\nexport type NumberFormat = (value: number) => string;\nexport interface CountOptions {\n /** Start value. Default: the last value counted on this element, else the number in its text. */\n from?: number;\n duration?: number;\n format?: NumberFormat;\n}\n\nconst shown = new WeakMap<Element, number>();\nconst tweens = new WeakMap<Element, gsap.core.Tween>();\nconst frames = new WeakMap<Element, () => void>();\nconst defaultFormat: NumberFormat = (value) => String(Math.round(value));\n\nfunction current(el: Element): number {\n const known = shown.get(el);\n if (known !== undefined) return known;\n const parsed = Number((el.textContent ?? '').replace(/[^\\d.-]/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\n/** Tween a plain number (no DOM): `onUpdate` gets each value. Reduced motion jumps to `to`. */\nexport function tweenNumber(from: number, to: number, onUpdate: (value: number) => void, { duration = TIMING.number }: { duration?: number } = {}) {\n registerMotion();\n if (from === to || reduced()) {\n onUpdate(to);\n return null;\n }\n const state = { value: from };\n return gsap.to(state, { value: to, duration, ease: EASE.flow, onUpdate: () => onUpdate(state.value), onComplete: () => onUpdate(to) });\n}\n\nexport function countTo(el: HTMLElement, to: number, { from, duration = TIMING.number, format = defaultFormat }: CountOptions = {}) {\n registerMotion();\n tweens.get(el)?.kill();\n const start = from ?? current(el);\n const write = (value: number) => {\n shown.set(el, value);\n el.textContent = format(value);\n };\n if (start === to || reduced()) {\n write(to);\n return null;\n }\n const state = { value: start };\n const tween = gsap.to(state, {\n value: to,\n duration,\n ease: EASE.flow,\n onUpdate: () => write(state.value),\n onComplete: () => {\n write(to);\n tweens.delete(el);\n },\n });\n tweens.set(el, tween);\n return tween;\n}\n\n/** Count with requestAnimationFrame and ease-out cubic. Returns a cancel function. */\nexport function revealCounter(el: HTMLElement, to: number, { from, duration = TIMING.revealCounter, format = defaultFormat }: CountOptions = {}) {\n frames.get(el)?.();\n const start = from ?? current(el);\n const write = (value: number) => {\n shown.set(el, value);\n el.textContent = format(value);\n };\n if (start === to || reduced()) {\n write(to);\n return () => {};\n }\n let began: number | null = null;\n let cancel = () => {};\n const step = (time: number) => {\n began ??= time;\n const progress = Math.min(1, (time - began) / (duration * 1000));\n write(start + (to - start) * (1 - (1 - progress) ** 3));\n if (progress < 1) cancel = requestFrame(step);\n else frames.delete(el);\n };\n cancel = requestFrame(step);\n const stop = () => cancel();\n frames.set(el, stop);\n return stop;\n}\n","import { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * success confetti: 45 paper pieces burst from a point (2–8 px a\n * frame, a little upward), fall with gravity .15, slow by .98 a frame, spin and\n * fade (.015–.03 a frame). Physics per 60 fps frame, scaled by the real frame\n * time. The canvas is decorative and removes itself when the last piece fades.\n */\n\nexport interface ConfettiOptions {\n count?: number;\n /** Default: the theme's primary, tertiary, secondary and containers. */\n colors?: string[];\n /** Draw inside this (positioned) element instead of over the whole window. */\n container?: HTMLElement | null;\n}\n\nexport interface ConfettiHandle {\n stop(): void;\n finished: Promise<void>;\n}\n\nconst FALLBACK = ['#3DDC84', '#A3E8C1', '#E8D0A3', '#1A73E8', '#8AB4F8'];\nconst ROLES = ['primary', 'tertiary', 'secondary', 'primary-container', 'tertiary-container'];\nconst between = ([min, max]: readonly [number, number]) => min + Math.random() * (max - min);\n\nfunction themeColors(from: Element) {\n const style = getComputedStyle(from);\n const colors = ROLES.map((role) => style.getPropertyValue(`--md-sys-color-${role}`).trim()).filter(Boolean);\n return colors.length ? colors : FALLBACK;\n}\n\nexport function confetti(origin?: Element | { x: number; y: number } | null, options: ConfettiOptions = {}): ConfettiHandle {\n const idle: ConfettiHandle = { stop() {}, finished: Promise.resolve() };\n if (typeof document === 'undefined' || reduced()) return idle;\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return idle;\n const config = TIMING.confetti;\n const container = options.container ?? null;\n const box = container ? container.getBoundingClientRect() : { left: 0, top: 0, width: innerWidth, height: innerHeight };\n const ratio = window.devicePixelRatio || 1;\n canvas.width = Math.max(1, Math.round(box.width * ratio));\n canvas.height = Math.max(1, Math.round(box.height * ratio));\n canvas.setAttribute('aria-hidden', 'true');\n canvas.dataset.mkConfetti = '';\n Object.assign(canvas.style, {\n position: container ? 'absolute' : 'fixed',\n inset: '0',\n width: container ? '100%' : '100vw',\n height: container ? '100%' : '100vh',\n zIndex: '2147483647',\n pointerEvents: 'none',\n });\n context.scale(ratio, ratio);\n\n let x = box.width / 2;\n let y = box.height / 2;\n if (origin instanceof Element) {\n const rect = origin.getBoundingClientRect();\n x = rect.left + rect.width / 2 - box.left;\n y = rect.top + rect.height / 2 - box.top;\n } else if (origin) {\n x = origin.x - box.left;\n y = origin.y - box.top;\n }\n const colors = options.colors?.length\n ? options.colors\n : themeColors(origin instanceof Element ? origin : (container ?? document.documentElement));\n const pieces = Array.from({ length: options.count ?? config.count }, () => {\n const angle = Math.random() * Math.PI * 2;\n const speed = between(config.speed);\n return {\n x,\n y,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed - config.lift,\n radius: between(config.radius),\n color: colors[Math.floor(Math.random() * colors.length)]!,\n alpha: 1,\n decay: between(config.decay),\n rotation: Math.random() * 360,\n spin: (Math.random() * 2 - 1) * config.spin,\n };\n });\n\n let frame = 0;\n let last = 0;\n let stopped = false;\n let resolve!: () => void;\n const finished = new Promise<void>((done) => (resolve = done));\n const stop = () => {\n if (stopped) return;\n stopped = true;\n cancelAnimationFrame(frame);\n canvas.remove();\n resolve();\n };\n const draw = (now: number) => {\n const f = last ? Math.min((now - last) / (1000 / 60), 3) : 1;\n last = now;\n context.clearRect(0, 0, box.width, box.height);\n let alive = false;\n const drag = Math.pow(config.drag, f);\n for (const piece of pieces) {\n if (piece.alpha <= 0) continue;\n alive = true;\n piece.x += piece.vx * f;\n piece.y += piece.vy * f;\n piece.vy += config.gravity * f;\n piece.vx *= drag;\n piece.vy *= drag;\n piece.alpha -= piece.decay * f;\n piece.rotation += piece.spin * f;\n context.save();\n context.translate(piece.x, piece.y);\n context.rotate((piece.rotation * Math.PI) / 180);\n context.globalAlpha = Math.max(0, piece.alpha);\n context.fillStyle = piece.color;\n context.fillRect(-piece.radius, -piece.radius / 2, piece.radius * 2, piece.radius);\n context.restore();\n }\n if (alive && !stopped) frame = requestAnimationFrame(draw);\n else stop();\n };\n (container ?? document.body).append(canvas);\n frame = requestAnimationFrame(draw);\n return { stop, finished };\n}\n","/*\n * Place an anchored surface (menu, anchored dialog) under its opener, left\n * aligned with it, inside the viewport: above when there is no room below,\n * beside it when neither fits (never covering it), else as low as it can go.\n * Under 680 px the stylesheet's full-screen sheet wins, so the inline place is cleared.\n */\n\nconst EDGE = 16;\nconst GAP = 8;\nconst PHONE = 680;\n/** Shorthands and longhands: some engines keep the longhands of a removed shorthand. */\nconst PLACED = ['top', 'left', 'right', 'bottom', 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left'];\n\nexport interface Viewport {\n width: number;\n height: number;\n}\n\nexport function anchorSurface(surface: HTMLElement, origin: DOMRect | null | undefined, viewport?: Viewport) {\n const view = viewport ?? { width: innerWidth, height: innerHeight };\n if (!origin || view.width < PHONE) {\n for (const side of PLACED) surface.style.removeProperty(side);\n return;\n }\n const box = surface.getBoundingClientRect();\n const clampLeft = (value: number) => Math.max(EDGE, Math.min(value, view.width - box.width - EDGE));\n const below = origin.bottom + GAP;\n const above = origin.top - GAP - box.height;\n const lowest = Math.max(EDGE, view.height - box.height - EDGE);\n const besideRight = origin.right + GAP;\n const besideLeft = origin.left - GAP - box.width;\n let top: number;\n let left: number;\n if (below <= lowest) [top, left] = [below, clampLeft(origin.left)];\n else if (above >= EDGE) [top, left] = [above, clampLeft(origin.left)];\n else if (besideRight + box.width <= view.width - EDGE) [top, left] = [Math.min(Math.max(EDGE, origin.top), lowest), besideRight];\n else if (besideLeft >= EDGE) [top, left] = [Math.min(Math.max(EDGE, origin.top), lowest), besideLeft];\n else [top, left] = [lowest, clampLeft(origin.left)];\n Object.assign(surface.style, { margin: '0', top: `${Math.round(top)}px`, left: `${Math.round(left)}px`, right: 'auto', bottom: 'auto' });\n}\n\n/** Remove the inline place anchorSurface wrote. */\nexport function clearAnchor(surface: HTMLElement) {\n for (const side of PLACED) surface.style.removeProperty(side);\n}\n","import { gsap, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * modal drag: a surface follows a drag (or a pull\n * with the wheel) at half speed and shrinks as it goes down (1 − y/400); past\n * 100 px it is dismissed, otherwise it springs back (elastic.out(.5,.5), 0.5 s).\n * A drag starts after 6 px, ignores controls, scrollable areas that can still\n * scroll, popovers and [data-mk-no-drag]; with a [data-mk-drag-handle] only the\n * handle drags. The wheel dismisses at speed 1.5 past 16 px, or past 100 px.\n */\n\nconst START = 6;\nconst FOLLOW = 0.5;\nconst DISMISS = 100;\nconst SHRINK = 400;\nconst WHEEL_SPEED = 1.5;\nconst WHEEL_MIN = 16;\nconst WHEEL_IDLE = 90;\nconst WHEEL_COOLDOWN = 250;\nconst CONTROLS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'label',\n 'summary',\n '[contenteditable=\"true\"]',\n '[role=\"button\"]',\n '[role=\"slider\"]',\n '[role=\"combobox\"]',\n '[role=\"option\"]',\n '[role=\"checkbox\"]',\n '[role=\"menuitem\"]',\n].join(',');\n\n/** The nearest element between `target` and `surface` that scrolls vertically. */\nfunction scrollerOf(target: EventTarget | null, surface: HTMLElement) {\n let element = target instanceof Element ? target : null;\n while (element) {\n if (element.scrollHeight > element.clientHeight + 1) {\n const overflow = getComputedStyle(element).overflowY;\n if (overflow === 'auto' || overflow === 'scroll') return element;\n }\n if (element === surface) break;\n element = element.parentElement;\n }\n return null;\n}\n\nconst draggableFrom = (target: EventTarget | null, surface: HTMLElement) =>\n target instanceof Element &&\n !target.closest('[data-mk-no-drag], [popover]') &&\n !target.closest(CONTROLS) &&\n !(surface.querySelector('[data-mk-drag-handle]') && !target.closest('[data-mk-drag-handle]'));\n\nexport interface DragDismissOptions {\n /** Whether a gesture may start now (not while opening, saving or floating). */\n canDrag?: () => boolean;\n onDismiss: () => void;\n}\n\n/** Let `surface` be dragged away. Returns the function that detaches it. */\nexport function attachDragDismiss(surface: HTMLElement, { canDrag = () => true, onDismiss }: DragDismissOptions) {\n registerMotion();\n let pointer: number | null = null;\n let startX = 0;\n let startY = 0;\n let mode: 'drag' | 'scroll' | null = null;\n let pulled = 0;\n let base = { x: 0, y: 0, scale: 1 };\n let target: EventTarget | null = null;\n\n const noSelect = (event: Event) => event.preventDefault();\n const begin = () => {\n mode = 'drag';\n gsap.killTweensOf(surface, 'x,y,scale');\n base = {\n x: Number(gsap.getProperty(surface, 'x')) || 0,\n y: Number(gsap.getProperty(surface, 'y')) || 0,\n scale: Number(gsap.getProperty(surface, 'scaleX')) || 1,\n };\n window.getSelection?.()?.removeAllRanges();\n document.body.style.userSelect = 'none';\n document.addEventListener('selectstart', noSelect);\n };\n const follow = (dx: number, dy: number) => {\n pulled = dy * FOLLOW;\n gsap.set(surface, { x: base.x + dx * FOLLOW, y: base.y + pulled, scale: Math.max(0.1, base.scale * (1 - pulled / SHRINK)) });\n };\n const restore = () => gsap.to(surface, { x: 0, y: 0, scale: 1, duration: TIMING.drag.restore, ease: 'elastic.out(0.5,0.5)' });\n const release = () => {\n document.removeEventListener('selectstart', noSelect);\n document.body.style.userSelect = '';\n const dismiss = pulled > DISMISS;\n mode = null;\n pulled = 0;\n if (dismiss) onDismiss();\n else restore();\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 || pointer !== null || reduced() || !canDrag()) return;\n if (!draggableFrom(event.target, surface)) return;\n pointer = event.pointerId;\n target = event.target;\n startX = event.clientX;\n startY = event.clientY;\n mode = null;\n pulled = 0;\n };\n const onPointerMove = (event: PointerEvent) => {\n if (event.pointerId !== pointer || mode === 'scroll') return;\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (mode === null) {\n if (Math.abs(dx) < START && Math.abs(dy) < START) return;\n if (event.pointerType !== 'mouse') {\n // A touch decides between scrolling the content and dragging the surface.\n const scroller = scrollerOf(target, surface);\n if (scroller && Math.abs(dx) < Math.abs(dy) && !(dy > 0 && scroller.scrollTop <= 0)) {\n mode = 'scroll';\n return;\n }\n }\n begin();\n }\n if (event.cancelable) event.preventDefault();\n follow(dx, dy);\n };\n const onPointerUp = (event: PointerEvent) => {\n if (event.pointerId !== pointer) return;\n pointer = null;\n target = null;\n if (mode !== 'drag') {\n mode = null;\n return;\n }\n // The click that ends a drag does not reach what is under the pointer.\n const swallow = (click: Event) => {\n click.stopPropagation();\n click.preventDefault();\n };\n window.addEventListener('click', swallow, { capture: true, once: true });\n setTimeout(() => window.removeEventListener('click', swallow, { capture: true }), 50);\n release();\n };\n\n // Pulling down with the wheel (scrolling up past the top) drags it as well.\n let wheeling = false;\n let wheelPull = 0;\n let wheelSpeed = 0;\n let lastWheel = 0;\n let idle: ReturnType<typeof setTimeout> | undefined;\n let quietUntil = 0;\n const deltaOf = (event: WheelEvent) =>\n event.deltaMode === 1 ? event.deltaY * 16 : event.deltaMode === 2 ? event.deltaY * innerHeight : event.deltaY;\n function endWheel(dismiss: boolean, at: number) {\n window.removeEventListener('wheel', onWheelCapture, { capture: true });\n clearTimeout(idle);\n wheeling = false;\n quietUntil = at + WHEEL_COOLDOWN;\n pulled = 0;\n wheelPull = 0;\n wheelSpeed = 0;\n lastWheel = 0;\n document.body.style.userSelect = '';\n if (dismiss) onDismiss();\n else restore();\n }\n function stepWheel(event: WheelEvent) {\n const amount = -deltaOf(event);\n const elapsed = lastWheel ? Math.max(1, event.timeStamp - lastWheel) : 16;\n lastWheel = event.timeStamp;\n wheelSpeed = wheelSpeed * 0.4 + (amount / elapsed) * 0.6;\n wheelPull = Math.max(0, wheelPull + amount);\n follow(0, wheelPull);\n if ((wheelSpeed > WHEEL_SPEED && pulled > WHEEL_MIN) || pulled > DISMISS) {\n endWheel(true, event.timeStamp);\n return;\n }\n clearTimeout(idle);\n idle = setTimeout(() => wheeling && endWheel(false, performance.now()), WHEEL_IDLE);\n }\n function onWheelCapture(event: WheelEvent) {\n if (!wheeling) return;\n event.preventDefault();\n event.stopPropagation();\n stepWheel(event);\n }\n const onWheel = (event: WheelEvent) => {\n if (wheeling || reduced() || !canDrag()) return;\n const up = deltaOf(event) < 0;\n const scroller = scrollerOf(event.target, surface);\n const canScroll = scroller\n ? up\n ? scroller.scrollTop > 0\n : scroller.scrollTop + scroller.clientHeight < scroller.scrollHeight - 1\n : false;\n if (canScroll || !up || event.timeStamp < quietUntil) return;\n if (event.target instanceof Element && event.target.closest('[data-mk-no-drag], [popover]')) return;\n event.preventDefault();\n wheeling = true;\n wheelPull = 0;\n wheelSpeed = 0;\n lastWheel = 0;\n begin();\n mode = null;\n window.addEventListener('wheel', onWheelCapture, { passive: false, capture: true });\n stepWheel(event);\n };\n\n surface.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('pointermove', onPointerMove, { passive: false });\n window.addEventListener('pointerup', onPointerUp);\n window.addEventListener('pointercancel', onPointerUp);\n surface.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n surface.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n window.removeEventListener('pointercancel', onPointerUp);\n surface.removeEventListener('wheel', onWheel);\n window.removeEventListener('wheel', onWheelCapture, { capture: true });\n clearTimeout(idle);\n document.removeEventListener('selectstart', noSelect);\n document.body.style.userSelect = '';\n };\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * floating modal: on desktop (≥ 680 px) a handle\n * lifts a surface into a window that moves on a spring (1100/38, mass by area),\n * glides when flung (≥ 350 px/s, decays in 0.18 s), stays inside the viewport\n * (8 px margin), resizes from its corners (min 320 × 240) and remembers where it\n * was left (localStorage `mk-float.<key>`). A press on the handle without\n * moving toggles floating.\n */\n\nconst MIN_WIDTH = 320;\nconst MIN_HEIGHT = 240;\nconst MARGIN = 8;\nconst DESKTOP = 680;\nconst LIFT = 4;\nconst SPRING = { stiffness: 1100, damping: 38 };\nconst MASS_AREA = 24_000;\nconst MAX_MASS = 1.5;\nconst REST_SPEED = 24;\nconst FLING_SPEED = 350;\nconst POINTER_SMOOTHING = 0.05;\nconst SHRINK_FULL = 0.85;\nconst FLOAT_SHADOW = 'rgba(0, 0, 0, 0.24) 0px 0px 24px -6px';\n\nexport const floatingAvailable = () => typeof innerWidth === 'number' && innerWidth >= DESKTOP;\n\nexport interface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** A window kept inside the viewport, at least 320 × 240. */\nexport function clampRect(rect: Rect, viewport = { width: innerWidth, height: innerHeight }): Rect {\n const maxWidth = Math.max(MIN_WIDTH, viewport.width - MARGIN * 2);\n const maxHeight = Math.max(MIN_HEIGHT, viewport.height - MARGIN * 2);\n const width = Math.min(maxWidth, Math.max(MIN_WIDTH, rect.width));\n const height = Math.min(maxHeight, Math.max(MIN_HEIGHT, rect.height));\n return {\n top: Math.min(Math.max(MARGIN, viewport.height - height - MARGIN), Math.max(MARGIN, rect.top)),\n left: Math.min(Math.max(MARGIN, viewport.width - width - MARGIN), Math.max(MARGIN, rect.left)),\n width,\n height,\n };\n}\n\nconst rectOf = (element: HTMLElement): Rect => {\n const box = element.getBoundingClientRect();\n return { top: box.top, left: box.left, width: box.width, height: box.height };\n};\n\nconst place = (element: HTMLElement, rect: Rect) =>\n Object.assign(element.style, {\n position: 'fixed',\n inset: 'auto',\n margin: '0',\n top: `${rect.top}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n maxWidth: 'none',\n maxHeight: 'none',\n });\n\nconst storageKey = (key: string) => `mk-float.${key}`;\n\n/** Where a floating window was left, if this device remembers it. */\nexport function savedFloat(key: string): Rect | null {\n try {\n const value = JSON.parse(localStorage.getItem(storageKey(key)) ?? 'null') as Rect | null;\n return value && (['top', 'left', 'width', 'height'] as const).every((name) => Number.isFinite(value[name])) ? clampRect(value) : null;\n } catch {\n return null;\n }\n}\n\nfunction saveFloat(key: string, rect: Rect) {\n try {\n localStorage.setItem(\n storageKey(key),\n JSON.stringify({ top: Math.round(rect.top), left: Math.round(rect.left), width: Math.round(rect.width), height: Math.round(rect.height) }),\n );\n } catch {\n // A convenience only.\n }\n}\n\nexport function forgetFloat(key: string) {\n try {\n localStorage.removeItem(storageKey(key));\n } catch {\n // A convenience only.\n }\n}\n\n/** Lift a surface into a window at `rect` (its shadow eases in, 0.45 s). */\nexport function liftWindow(surface: HTMLElement, rect: Rect) {\n registerMotion();\n place(surface, clampRect(rect));\n surface.classList.add('is-floating');\n if (!reduced()) {\n gsap.fromTo(\n surface,\n { boxShadow: 'rgba(0, 0, 0, 0) 0px 0px 0px 0px' },\n { boxShadow: FLOAT_SHADOW, duration: TIMING.float.shadow, ease: EASE.signature, clearProps: 'boxShadow' },\n );\n }\n}\n\nconst PLACED = [\n 'position',\n 'inset',\n 'right',\n 'bottom',\n 'margin',\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n 'top',\n 'left',\n 'width',\n 'height',\n 'max-width',\n 'max-height',\n];\n\n/** Remove what liftWindow wrote (no animation). */\nexport function unplaceWindow(surface: HTMLElement) {\n surface.classList.remove('is-floating');\n for (const name of PLACED) surface.style.removeProperty(name);\n}\n\n/** Put a floating surface back in its place, travelling from where it floated. */\nexport function dockWindow(surface: HTMLElement, from: Rect) {\n registerMotion();\n unplaceWindow(surface);\n if (reduced()) return;\n const to = rectOf(surface);\n gsap.from(surface, { x: from.left - to.left, y: from.top - to.top, duration: TIMING.float.shadow, ease: EASE.signature, clearProps: 'transform' });\n}\n\nexport interface FloatingOptions {\n key: string;\n handle: HTMLElement;\n corners?: HTMLElement[];\n isFloating: () => boolean;\n float: () => void;\n dock: () => void;\n}\n\n/** Move a floating surface by its handle and resize it from its corners. Returns the detach function. */\nexport function attachFloating(surface: HTMLElement, { key, handle, corners = [], isFloating, float, dock }: FloatingOptions) {\n const cleanups: Array<() => void> = [];\n const listen = (element: HTMLElement, listener: (event: PointerEvent) => void) => {\n element.addEventListener('pointerdown', listener);\n cleanups.push(() => element.removeEventListener('pointerdown', listener));\n };\n let active: number | null = null;\n let release: (() => void) | null = null;\n /**\n * Follow one pointer until it is released. Moves and the release are heard on\n * the window, not only through pointer capture: the window moves under the\n * pointer, and where capture does not hold the gesture must still end.\n */\n const capture = (element: HTMLElement, down: PointerEvent, { onMove, onUp }: { onMove: (event: PointerEvent) => void; onUp: () => void }) => {\n release?.();\n active = down.pointerId;\n try {\n element.setPointerCapture?.(down.pointerId);\n } catch {\n // The window listeners below still follow the pointer.\n }\n const move = (event: PointerEvent) => {\n if (event.pointerId === active) onMove(event);\n };\n const up = (event: PointerEvent) => {\n if (event.pointerId !== active) return;\n stop();\n onUp();\n };\n const stop = () => {\n active = null;\n release = null;\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n window.removeEventListener('pointercancel', up);\n };\n release = stop;\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n window.addEventListener('pointercancel', up);\n };\n cleanups.push(() => release?.());\n\n type Body = {\n x: number;\n y: number;\n vx: number;\n vy: number;\n w: number;\n h: number;\n targetX: number;\n targetY: number;\n targetW: number;\n targetH: number;\n mass: number;\n time: number;\n gliding: boolean;\n fromX: number;\n fromY: number;\n pointerVx: number;\n pointerVy: number;\n pointerX: number;\n pointerY: number;\n pointerTime: number;\n };\n let body: Body | null = null;\n const settle = () => {\n if (!body) return;\n gsap.ticker.remove(tick);\n body = null;\n };\n function tick() {\n if (!body) return;\n const now = performance.now();\n const elapsed = Math.min((now - body.time) / 1000, 1 / 30);\n if (elapsed <= 0) return;\n body.time = now;\n if (body.gliding) {\n const decay = Math.exp(-elapsed / TIMING.float.glideDecay);\n body.vx *= decay;\n body.vy *= decay;\n } else {\n body.vx += (((body.targetX - body.x) * SPRING.stiffness - body.vx * SPRING.damping) * elapsed) / body.mass;\n body.vy += (((body.targetY - body.y) * SPRING.stiffness - body.vy * SPRING.damping) * elapsed) / body.mass;\n }\n body.x += body.vx * elapsed;\n body.y += body.vy * elapsed;\n const smoothing = 1 - Math.exp(-elapsed / TIMING.float.sizeSmoothing);\n body.w += (body.targetW - body.w) * smoothing;\n body.h += (body.targetH - body.h) * smoothing;\n if (Math.abs(body.targetW - body.w) < 0.5) body.w = body.targetW;\n if (Math.abs(body.targetH - body.h) < 0.5) body.h = body.targetH;\n const rect = clampRect({ top: body.y, left: body.x, width: body.w, height: body.h });\n if (rect.left !== body.x) {\n body.x = rect.left;\n body.vx = 0;\n }\n if (rect.top !== body.y) {\n body.y = rect.top;\n body.vy = 0;\n }\n place(surface, rect);\n const resting = Math.hypot(body.vx, body.vy) < REST_SPEED && body.w === body.targetW && body.h === body.targetH;\n if (body.gliding && resting) {\n saveFloat(key, rect);\n settle();\n }\n }\n\n listen(handle, (down) => {\n if (down.button !== 0 || active !== null || !floatingAvailable()) return;\n down.preventDefault();\n settle();\n let moved = false;\n capture(handle, down, {\n onMove(event) {\n const dx = event.clientX - down.clientX;\n const dy = event.clientY - down.clientY;\n if (!moved) {\n if (Math.abs(dx) < LIFT && Math.abs(dy) < LIFT) return;\n moved = true;\n if (!isFloating()) float();\n const rect = rectOf(surface);\n const fullWidth = innerWidth - MARGIN * 2;\n const fullHeight = innerHeight - MARGIN * 2;\n // A window as large as the screen shrinks so it can be moved.\n const width = rect.width >= fullWidth - 2 ? Math.max(MIN_WIDTH, Math.round(fullWidth * SHRINK_FULL)) : rect.width;\n const height = rect.height >= fullHeight - 2 ? Math.max(MIN_HEIGHT, Math.round(fullHeight * SHRINK_FULL)) : rect.height;\n const grip = rect.width > 0 ? (down.clientX - rect.left) / rect.width : 0;\n const left = rect.left + (rect.width - width) * grip;\n const now = performance.now();\n body = {\n x: left,\n y: rect.top,\n vx: 0,\n vy: 0,\n w: rect.width,\n h: rect.height,\n targetX: left,\n targetY: rect.top,\n targetW: width,\n targetH: height,\n mass: Math.min(MAX_MASS, Math.max(1, Math.sqrt((rect.width * rect.height) / MASS_AREA))),\n time: now,\n gliding: false,\n fromX: left,\n fromY: rect.top,\n pointerVx: 0,\n pointerVy: 0,\n pointerX: event.clientX,\n pointerY: event.clientY,\n pointerTime: now,\n };\n gsap.ticker.add(tick);\n }\n if (!body) return;\n body.targetX = body.fromX + dx;\n body.targetY = body.fromY + dy;\n const now = performance.now();\n const seconds = Math.max(1, now - body.pointerTime) / 1000;\n const smoothing = 1 - Math.exp(-seconds / POINTER_SMOOTHING);\n body.pointerVx += ((event.clientX - body.pointerX) / seconds - body.pointerVx) * smoothing;\n body.pointerVy += ((event.clientY - body.pointerY) / seconds - body.pointerVy) * smoothing;\n body.pointerX = event.clientX;\n body.pointerY = event.clientY;\n body.pointerTime = now;\n },\n onUp() {\n if (!moved) {\n if (isFloating()) dock();\n else float();\n return;\n }\n if (!body) return;\n // A fling keeps gliding; a gentle release stays where it is.\n const speed = performance.now() - body.pointerTime > 80 ? 0 : Math.hypot(body.pointerVx, body.pointerVy);\n if (speed >= FLING_SPEED) {\n body.vx = body.pointerVx;\n body.vy = body.pointerVy;\n } else {\n body.vx = 0;\n body.vy = 0;\n body.targetX = body.x;\n body.targetY = body.y;\n }\n body.gliding = true;\n },\n });\n });\n\n for (const corner of corners) {\n listen(corner, (down) => {\n if (down.button !== 0 || active !== null || !floatingAvailable()) return;\n down.preventDefault();\n settle();\n const side = corner.dataset.mkFloatCorner ?? 'br';\n const fromLeft = side.endsWith('l');\n const fromTop = side.startsWith('t');\n let start: Rect | null = null;\n capture(corner, down, {\n onMove(event) {\n const dx = event.clientX - down.clientX;\n const dy = event.clientY - down.clientY;\n if (!start) {\n if (Math.abs(dx) < LIFT && Math.abs(dy) < LIFT) return;\n if (!isFloating()) float();\n start = rectOf(surface);\n }\n const width = Math.min(innerWidth - MARGIN * 2, Math.max(MIN_WIDTH, fromLeft ? start.width - dx : start.width + dx));\n const height = Math.min(innerHeight - MARGIN * 2, Math.max(MIN_HEIGHT, fromTop ? start.height - dy : start.height + dy));\n place(\n surface,\n clampRect({\n top: fromTop ? start.top + start.height - height : start.top,\n left: fromLeft ? start.left + start.width - width : start.left,\n width,\n height,\n }),\n );\n },\n onUp() {\n if (start) saveFloat(key, rectOf(surface));\n },\n });\n });\n }\n\n return () => {\n if (body?.gliding) saveFloat(key, rectOf(surface));\n settle();\n for (const cleanup of cleanups) cleanup();\n };\n}\n","import { SIGNATURE_LINEAR } from '../core/curves';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * Helpers shared by surfaces (dialogs, menus): opening a <dialog> with a\n * fallback where showModal is missing, the backdrop tint, and an inert visual\n * copy (ghost) that plays a close while the real element is already gone.\n */\n\n/** A computed colour with no alpha: `transparent`, `rgba(…, 0)` or `color(… / 0)`. */\nexport const transparentColor = (color: string) =>\n !color || color === 'transparent' || /,\\s*0\\)$/.test(color) || /\\/\\s*0\\)$/.test(color);\n\ntype DialogLike = HTMLElement & Partial<Pick<HTMLDialogElement, 'showModal' | 'show' | 'close'>>;\n\n/** Open a <dialog> modally (or not). Falls back to the `open` attribute. */\nexport function openModal(dialog: DialogLike, modal = true) {\n if (dialog.hasAttribute('open')) return;\n if (modal && typeof dialog.showModal === 'function') dialog.showModal();\n else if (typeof dialog.show === 'function') dialog.show();\n else dialog.setAttribute('open', '');\n}\n\nexport function closeModal(dialog: DialogLike) {\n if (typeof dialog.close === 'function') dialog.close();\n else dialog.removeAttribute('open');\n}\n\n/**\n * Fade a modal <dialog>'s ::backdrop in (tint: 0.5 s on the signature\n * curve) or out (linear). Resolves at once without the Web Animations API.\n */\nexport function fadeBackdrop(dialog: HTMLElement, direction: 'in' | 'out'): Promise<void> {\n if (typeof dialog.animate !== 'function' || reduced()) return Promise.resolve();\n try {\n const animation = dialog.animate(direction === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }], {\n duration: (direction === 'in' ? TIMING.dialog.backdrop : TIMING.dialog.close) * 1000,\n easing: direction === 'in' ? SIGNATURE_LINEAR : 'linear',\n fill: direction === 'out' ? 'forwards' : 'none',\n pseudoElement: '::backdrop',\n });\n return animation.finished.then(\n () => undefined,\n () => undefined,\n );\n } catch {\n return Promise.resolve();\n }\n}\n\n/**\n * An inert visual copy of `surface`, fixed over the place it occupies now and not\n * yet in the document (null when it has no size). A picture, not a second form:\n * no ids, labels, names or roles to collide with the page.\n */\n/** A fixed copy of a modal's backdrop (tint and blur), for a closing ghost to fade with. Not appended. */\nexport function backdropVeil(surface: HTMLElement): HTMLElement {\n const backdrop = getComputedStyle(surface, '::backdrop');\n const veil = document.createElement('div');\n veil.setAttribute('aria-hidden', 'true');\n veil.dataset.mkVeil = '';\n Object.assign(veil.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483645',\n background: backdrop.background || backdrop.backgroundColor,\n backdropFilter: backdrop.backdropFilter,\n pointerEvents: 'none',\n });\n return veil;\n}\n\nexport function ghostOf(surface: HTMLElement): HTMLElement | null {\n const rect = surface.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n const style = getComputedStyle(surface);\n const ghost = document.createElement('div');\n ghost.className = surface.className;\n ghost.innerHTML = surface.innerHTML;\n // The markup carries attributes, not what was typed or chosen since: copy the live values too.\n const live = surface.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>('input, textarea, select');\n ghost.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>('input, textarea, select').forEach((copy, i) => {\n const source = live[i];\n if (!source) return;\n if (copy instanceof HTMLSelectElement) copy.selectedIndex = (source as HTMLSelectElement).selectedIndex;\n else copy.value = source.value;\n if (copy instanceof HTMLInputElement && source instanceof HTMLInputElement) copy.checked = source.checked;\n });\n ghost.setAttribute('aria-hidden', 'true');\n ghost.inert = true;\n ghost.dataset.mkGhost = '';\n const strip = ['id', 'for', 'name', 'aria-labelledby', 'aria-describedby', 'aria-label', 'role'];\n for (const element of ghost.querySelectorAll(strip.map((name) => `[${name}]`).join(','))) {\n for (const name of strip) element.removeAttribute(name);\n }\n for (const label of ghost.querySelectorAll('label')) {\n const span = document.createElement('span');\n span.className = label.className;\n span.append(...label.childNodes);\n label.replaceWith(span);\n }\n Object.assign(ghost.style, {\n position: 'fixed',\n inset: 'auto',\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n margin: '0',\n display: style.display === 'none' ? 'flex' : style.display,\n flexDirection: style.flexDirection,\n zIndex: '2147483646',\n pointerEvents: 'none',\n });\n return ghost;\n}\n","import { gsap } from '../core/gsap';\nimport { bezier, channels, easeOut, eased, spring } from '../core/channels';\nimport { TIMING } from '../core/timing';\nimport { transparentColor } from './surface';\n\n/*\n * liquid modal: the opener's colour melts into the\n * surface. Two blobs (one on the opener, one with the surface's shape) sit under\n * a \"goo\" filter (blur 20, alpha threshold 19·a − 9), so while the surface's\n * blob swings out of the opener on a spring (144/14, kick 2400 px/s) they\n * stretch and merge like a liquid; the content zooms in from twice its size.\n * Each property runs on its own channel, as in the source.\n */\n\nconst GOO = 'mk-liquid-goo';\n\n/** The goo filter, added to the page once. */\nfunction ensureGoo() {\n if (document.getElementById(GOO)) return;\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('width', '0');\n svg.setAttribute('height', '0');\n svg.style.position = 'absolute';\n svg.innerHTML = `<defs><filter id=\"${GOO}\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\"><feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"20\"/><feColorMatrix type=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 19 -9\"/></filter></defs>`;\n document.body.append(svg);\n}\n\ninterface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** A layer under the surface's content, in viewport coordinates, holding the blobs. */\nfunction gooLayer(surface: HTMLElement) {\n ensureGoo();\n const box = surface.getBoundingClientRect();\n const layer = document.createElement('div');\n layer.className = 'mk-morph-face mk-liquid';\n layer.setAttribute('aria-hidden', 'true');\n Object.assign(layer.style, {\n position: 'absolute',\n left: `${-box.left - surface.clientLeft}px`,\n top: `${-box.top - surface.clientTop}px`,\n width: `${innerWidth}px`,\n height: `${innerHeight}px`,\n zIndex: '-1',\n pointerEvents: 'none',\n filter: `url(#${GOO})`,\n borderRadius: '0',\n background: 'none',\n });\n const blob = (from: Box, radius: number, color: string) => {\n const element = document.createElement('div');\n Object.assign(element.style, {\n position: 'absolute',\n top: `${from.top}px`,\n left: `${from.left}px`,\n width: `${from.width}px`,\n height: `${from.height}px`,\n borderRadius: `${radius}px`,\n background: color,\n });\n layer.append(element);\n return element;\n };\n surface.append(layer);\n return { layer, blob };\n}\n\n/** The surface turns into a frame while its blob is the visible shape. */\nfunction hideFrame(surface: HTMLElement) {\n const saved = surface.getAttribute('style');\n Object.assign(surface.style, {\n transition: 'none',\n background: 'transparent',\n boxShadow: 'none',\n borderColor: 'transparent',\n overflow: 'visible',\n });\n return () => {\n if (saved === null) surface.removeAttribute('style');\n else surface.setAttribute('style', saved);\n };\n}\n\nconst radiusOf = (element: HTMLElement, box: DOMRect) =>\n Math.min(parseFloat(getComputedStyle(element).borderTopLeftRadius) || 0, box.width / 2, box.height / 2);\n\n/** Content parts move and zoom about the surface's centre. */\nfunction centerParts(surface: HTMLElement, parts: HTMLElement[]) {\n const box = surface.getBoundingClientRect();\n const centerX = box.left + box.width / 2;\n const centerY = box.top + box.height / 2;\n for (const part of parts) {\n const own = part.getBoundingClientRect();\n gsap.set(part, { transformOrigin: `${centerX - own.left}px ${centerY - own.top}px` });\n }\n return { centerX, centerY };\n}\n\ntype Frame = { top: number; left: number; width: number; height: number; scale: number; blur: number };\n\n/** Open `surface` out of `origin` the liquid way. Returns a function that stops it and settles the surface. */\nexport function liquidOpen(surface: HTMLElement, origin: HTMLElement, parts: HTMLElement[]) {\n const box = surface.getBoundingClientRect();\n const start = origin.getBoundingClientRect();\n const surfaceColor = getComputedStyle(surface).backgroundColor;\n const originLook = getComputedStyle(origin).backgroundColor;\n const originColor = transparentColor(originLook) ? surfaceColor : originLook;\n const endRadius = radiusOf(surface, box);\n const startRadius = radiusOf(origin, start);\n const { centerX, centerY } = centerParts(surface, parts);\n const restore = hideFrame(surface);\n const { layer, blob } = gooLayer(surface);\n const originBlob = blob(start, startRadius, originColor);\n const shape = blob(start, startRadius, originColor);\n const towardX = start.left + start.width / 2 < innerWidth / 2 ? 1 : -1;\n const towardY = start.top + start.height / 2 < innerHeight / 2 ? 1 : -1;\n if (parts.length) gsap.set(parts, { opacity: 0 });\n const current: Frame = { top: start.top, left: start.left, width: start.width, height: start.height, scale: 2, blur: 8 };\n const paint = () => {\n if (!parts.length) return;\n gsap.set(parts, {\n x: current.left + current.width / 2 - centerX,\n y: current.top + current.height / 2 - centerY,\n scale: current.scale,\n filter: `blur(${current.blur}px)`,\n });\n };\n const motion = channels({ ...current, radius: startRadius }, (name, value) => {\n if (name === 'radius') shape.style.borderRadius = `${value}px`;\n else {\n current[name] = value;\n if (name === 'top' || name === 'left' || name === 'width' || name === 'height') shape.style[name] = `${value}px`;\n paint();\n }\n });\n const L = TIMING.liquid;\n void motion.animate(\n { top: box.top, left: box.left, width: box.width, height: box.height, radius: endRadius, scale: 1, blur: 0 },\n {\n top: spring(144, 14, { velocity: 2400, direction: towardY }),\n left: spring(144, 14, { velocity: 2400, direction: towardX }),\n width: eased(L.size, bezier(0.8, 0.3, 0.5, 0.8)),\n height: eased(L.size, bezier(0.8, 0.3, 0.5, 0.8)),\n radius: eased(L.radius, easeOut),\n scale: eased(L.content, easeOut),\n blur: eased(L.content, easeOut),\n },\n );\n gsap.to(shape, { background: surfaceColor, duration: L.color, delay: L.colorDelay, ease: 'power2.out' });\n if (parts.length) gsap.to(parts, { opacity: 1, duration: L.color, delay: L.colorDelay, ease: 'power2.out' });\n gsap.to(originBlob, { opacity: 0, duration: L.ghost, delay: L.ghostDelay, ease: 'power2.out' });\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n motion.stop();\n clearTimeout(timer);\n layer.remove();\n restore();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter' });\n };\n // The springs settle well within the source's 1.1 s window.\n const timer = setTimeout(finish, L.safetyMs);\n return finish;\n}\n\n/** Close `surface` back into `origin` the liquid way, then call `onComplete`. */\nexport function liquidClose(surface: HTMLElement, origin: HTMLElement, parts: HTMLElement[], onComplete: () => void) {\n const box = surface.getBoundingClientRect();\n const end = origin.getBoundingClientRect();\n const surfaceColor = getComputedStyle(surface).backgroundColor;\n const originLook = getComputedStyle(origin).backgroundColor;\n const originColor = transparentColor(originLook) ? surfaceColor : originLook;\n const startRadius = radiusOf(surface, box);\n const endRadius = radiusOf(origin, end);\n const { centerX, centerY } = centerParts(surface, parts);\n hideFrame(surface);\n const { blob } = gooLayer(surface);\n const originBlob = blob(end, endRadius, originColor);\n originBlob.style.opacity = '0';\n const shape = blob(box, startRadius, surfaceColor);\n const current: Frame = { top: box.top, left: box.left, width: box.width, height: box.height, scale: 1, blur: 0 };\n const motion = channels({ ...current, radius: startRadius, opacity: 1 }, (name, value) => {\n if (name === 'radius') shape.style.borderRadius = `${value}px`;\n else if (name === 'opacity') {\n if (parts.length) gsap.set(parts, { opacity: value });\n } else {\n current[name] = value;\n if (name === 'top' || name === 'left' || name === 'width' || name === 'height') shape.style[name] = `${value}px`;\n if (parts.length) {\n gsap.set(parts, {\n x: current.left + current.width / 2 - centerX,\n y: current.top + current.height / 2 - centerY,\n scale: current.scale,\n filter: `blur(${current.blur}px)`,\n });\n }\n }\n });\n const L = TIMING.liquid;\n void motion.animate(\n { top: end.top, left: end.left, width: end.width, height: end.height, radius: endRadius, scale: 2, blur: 8, opacity: 0 },\n {\n top: spring(130, 18),\n left: spring(130, 18),\n width: eased(L.closeSize, easeOut),\n height: eased(L.closeSize, easeOut),\n // It rounds into the opener's shape early, long before it arrives.\n radius: eased(L.closeSize, easeOut),\n scale: eased(L.closeContent, easeOut),\n blur: eased(L.closeContent, easeOut),\n opacity: spring(137, 20),\n },\n );\n gsap.to(originBlob, { opacity: 1, duration: L.originRestore, delay: 0.15, ease: 'power2.in' });\n gsap.to(shape, { background: originColor, duration: L.originRestore, ease: 'power2.out' });\n gsap.to(surface, { opacity: 0, duration: TIMING.dialog.close, ease: 'power3.in' });\n setTimeout(() => {\n motion.stop();\n onComplete();\n }, L.safetyMs);\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { MORPH_STYLES, clearStyles } from '../core/styles';\nimport { liquidClose, liquidOpen } from './liquid';\nimport { backdropVeil, ghostOf, transparentColor } from './surface';\n\n/*\n * Container transform: a surface\n * (dialog, menu, option list) grows out of the control that opened it and folds\n * back into it. The surface itself is never scaled: it starts clipped to the\n * opener's size and corners, moved onto the opener, and widens to its own box\n * while the opener's colour fades into its own. A dialog's content travels as\n * one group, scaled from the opener's box to its own while it sharpens and\n * fades in. `data-mk-shared=\"id\"` pieces (a title) fly between opener and surface.\n */\n\nconst FACE = 'mk-morph-face';\nconst HIDDEN_ORIGIN = 'data-mk-morph-origin';\nconst SHARED = 'data-mk-shared';\nconst SHARED_HIDDEN = 'data-mk-shared-hidden';\n\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n\n/** A computed radius in pixels (percentages resolve against `size`). */\nconst radiusOf = (value: string, size: number) => {\n const parsed = Number.parseFloat(value) || 0;\n return value.trim().endsWith('%') ? (parsed / 100) * size : parsed;\n};\n\ninterface Shape {\n /** Offset that puts the clipped area on the opener. */\n x: number;\n y: number;\n /** Clip at the opener's size, and the full surface. */\n from: string;\n to: string;\n /** The clipped area in the surface's own coordinates. */\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Where the surface starts: the area of the opener's size nearest to it inside\n * the surface, and the offset that moves that area onto the opener. Null when\n * the opener is gone, tiny or off screen.\n */\nfunction shapeOf(surface: HTMLElement, origin: HTMLElement | null): Shape | null {\n if (!origin?.isConnected) return null;\n const start = origin.getBoundingClientRect();\n const box = surface.getBoundingClientRect();\n if (start.width < 4 || start.height < 4 || !box.width || !box.height) return null;\n if (start.bottom < 0 || start.top > innerHeight || start.right < 0 || start.left > innerWidth) return null;\n const width = Math.min(start.width, box.width);\n const height = Math.min(start.height, box.height);\n const left = clamp(start.left - box.left, 0, box.width - width);\n const top = clamp(start.top - box.top, 0, box.height - height);\n const corner = Math.min(radiusOf(getComputedStyle(origin).borderTopLeftRadius, start.height), width / 2, height / 2);\n const radius = radiusOf(getComputedStyle(surface).borderTopLeftRadius, box.height);\n return {\n x: start.left + (start.width - width) / 2 - (box.left + left),\n y: start.top + (start.height - height) / 2 - (box.top + top),\n from: `inset(${top}px ${box.width - left - width}px ${box.height - top - height}px ${left}px round ${corner}px)`,\n to: `inset(0px 0px 0px 0px round ${radius}px)`,\n left,\n top,\n width,\n height,\n };\n}\n\n/** Properties that make a copy look like the opener wherever it is placed. */\nconst LOOK = [\n 'display',\n 'alignItems',\n 'justifyContent',\n 'gap',\n 'padding',\n 'borderRadius',\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'backgroundColor',\n 'color',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'lineHeight',\n 'letterSpacing',\n 'whiteSpace',\n] as const;\n\n/**\n * A layer over the surface that looks like the opener: its colour fills the\n * surface and, for lists, a copy of its label sits where it was. Fading it out\n * turns the opener into the surface.\n */\nfunction faceOf(surface: HTMLElement, origin: HTMLElement, shape: Shape, withCopy: boolean) {\n const look = getComputedStyle(origin);\n const face = document.createElement('div');\n face.className = FACE;\n face.setAttribute('aria-hidden', 'true');\n face.inert = true;\n if (!transparentColor(look.backgroundColor)) face.style.background = look.backgroundColor;\n surface.append(face);\n if (!withCopy) return { face, copy: null as HTMLElement | null };\n const copy = document.createElement('span');\n copy.innerHTML = origin.innerHTML;\n for (const element of copy.querySelectorAll('[id], [name], [for]')) for (const name of ['id', 'name', 'for']) element.removeAttribute(name);\n for (const property of LOOK) copy.style[property] = look[property];\n Object.assign(copy.style, {\n position: 'absolute',\n left: `${shape.left}px`,\n top: `${shape.top}px`,\n width: `${shape.width}px`,\n height: `${shape.height}px`,\n boxSizing: 'border-box',\n margin: '0',\n overflow: 'hidden',\n });\n face.append(copy);\n return { face, copy };\n}\n\n/** The morph each surface is playing, so a new one stops it first. */\nconst running = new WeakMap<HTMLElement, gsap.core.Animation>();\n\n/** Whether a surface is opening or closing right now. */\nexport const isMorphing = (surface: HTMLElement) => running.has(surface);\n\nfunction stop(surface: HTMLElement) {\n running.get(surface)?.kill();\n running.delete(surface);\n gsap.killTweensOf(surface);\n for (const face of surface.querySelectorAll(`:scope > .${FACE}`)) face.remove();\n clearStyles([surface], MORPH_STYLES);\n}\n\n/** Stop a surface's morph now and put the surface and its content back to rest. */\nexport function stopMorph(surface: HTMLElement) {\n stop(surface);\n const parts = [...surface.querySelectorAll<HTMLElement>(':scope > *')].filter((element) => !element.classList.contains('mk-liquid'));\n gsap.killTweensOf(parts);\n clearStyles(parts, MORPH_STYLES);\n}\n\n/** Small controls disappear into the surface they open, like a shared element. */\nconst compact = (element: HTMLElement) => {\n const box = element.getBoundingClientRect();\n return box.width <= 360 && box.height <= 72;\n};\n\n/** Show a hidden opener again; with `fade` it comes back while its surface closes (0.3 s after 0.2 s). */\nexport function showOrigin(origin: HTMLElement | null | undefined, { fade = false }: { fade?: boolean } = {}) {\n if (!origin?.hasAttribute(HIDDEN_ORIGIN)) return;\n if (!fade || reduced()) {\n origin.removeAttribute(HIDDEN_ORIGIN);\n return;\n }\n const previous = origin.style.transition;\n const { originShow, originShowDelay } = TIMING.dialog;\n origin.style.transition = `opacity ${originShow}s cubic-bezier(0.215, 0.61, 0.355, 1) ${originShowDelay}s`;\n origin.removeAttribute(HIDDEN_ORIGIN);\n setTimeout(() => {\n origin.style.transition = previous;\n }, (originShow + originShowDelay) * 1000 + 50);\n}\n\n/** Scale and offset that fit the content, as one group, into the opener's box inside the surface. */\nfunction groupOf(surface: HTMLElement, parts: HTMLElement[], shape: Shape) {\n const box = surface.getBoundingClientRect();\n for (const part of parts) {\n const own = part.getBoundingClientRect();\n gsap.set(part, { transformOrigin: `${box.left - own.left}px ${box.top - own.top}px` });\n }\n return {\n x: shape.left,\n y: shape.top,\n scaleX: box.width ? shape.width / box.width : 1,\n scaleY: box.height ? shape.height / box.height : 1,\n };\n}\n\nconst escape = (value: string) => (typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(value) : value.replace(/\"/g, '\\\\\"'));\n\nfunction sharedPairs(origin: HTMLElement, surface: HTMLElement) {\n return [origin, ...origin.querySelectorAll<HTMLElement>(`[${SHARED}]`)]\n .filter((source) => source.hasAttribute(SHARED))\n .map((source) => ({\n source,\n target: surface.querySelector<HTMLElement>(`[${SHARED}=\"${escape(source.getAttribute(SHARED) ?? '')}\"]`),\n }))\n .filter((pair): pair is { source: HTMLElement; target: HTMLElement } => pair.target !== null);\n}\n\n/** Where an element's text sits: its box without padding and border. */\nfunction textBox(element: HTMLElement) {\n const box = element.getBoundingClientRect();\n const style = getComputedStyle(element);\n const px = (value: string) => parseFloat(value) || 0;\n const left = box.left + px(style.borderLeftWidth) + px(style.paddingLeft);\n const top = box.top + px(style.borderTopWidth) + px(style.paddingTop);\n const bottom = box.bottom - px(style.borderBottomWidth) - px(style.paddingBottom);\n return { left, top, height: Math.max(0, bottom - top), style };\n}\n\nconst textOf = (element: HTMLElement) =>\n element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement\n ? element.value || element.placeholder\n : (element.firstChild?.textContent ?? element.textContent ?? '');\n\n/** Fly a copy of `from`'s text onto `to` (place, size, colour) in the top layer. Resolves when it lands. */\nfunction flyText(from: HTMLElement, to: HTMLElement, text: string, duration: number) {\n return new Promise<void>((resolve) => {\n const start = textBox(from);\n const end = textBox(to);\n const fromSize = parseFloat(start.style.fontSize) || 16;\n const toSize = parseFloat(end.style.fontSize) || fromSize;\n const scale = toSize / fromSize;\n const ghost = document.createElement('div');\n ghost.setAttribute('aria-hidden', 'true');\n ghost.setAttribute('popover', 'manual');\n ghost.textContent = text;\n Object.assign(ghost.style, {\n position: 'fixed',\n inset: 'auto',\n left: `${start.left}px`,\n top: `${start.top}px`,\n margin: '0',\n padding: '0',\n border: '0',\n background: 'transparent',\n overflow: 'visible',\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n fontFamily: start.style.fontFamily,\n fontSize: start.style.fontSize,\n fontWeight: start.style.fontWeight,\n lineHeight: `${start.height || fromSize * 1.2}px`,\n letterSpacing: start.style.letterSpacing,\n color: start.style.color,\n transformOrigin: '0 0',\n });\n document.body.append(ghost);\n if (typeof ghost.showPopover === 'function') ghost.showPopover();\n const height = (start.height || fromSize * 1.2) * scale;\n gsap.to(ghost, {\n x: end.left - start.left,\n y: end.top + end.height / 2 - height / 2 - start.top,\n scale,\n color: end.style.color,\n duration,\n ease: EASE.signature,\n onComplete: () => {\n ghost.remove();\n resolve();\n },\n });\n });\n}\n\n/** Show the opener's shared pieces again (a surface closed without its animation). */\nexport function releaseShared(origin: HTMLElement | null | undefined) {\n if (!origin) return;\n for (const element of [origin, ...origin.querySelectorAll(`[${SHARED_HIDDEN}]`)]) element.removeAttribute(SHARED_HIDDEN);\n}\n\n/** The opener's pieces travel into the surface; they stay hidden at home until it closes. */\nexport function shareInto(origin: HTMLElement, surface: HTMLElement, duration: number = TIMING.dialog.open) {\n for (const { source, target } of sharedPairs(origin, surface)) {\n const text = textOf(source);\n source.setAttribute(SHARED_HIDDEN, '');\n gsap.set(target, { opacity: 0 });\n void flyText(source, target, text, duration).then(() => gsap.set(target, { clearProps: 'opacity' }));\n }\n}\n\n/** The surface's pieces travel back home and show there again. */\nexport function shareBack(surface: HTMLElement, origin: HTMLElement, duration: number = TIMING.dialog.close) {\n for (const { source, target } of sharedPairs(origin, surface)) {\n gsap.set(target, { opacity: 0 });\n void flyText(target, source, textOf(source), duration).then(() => source.removeAttribute(SHARED_HIDDEN));\n }\n}\n\nexport interface MorphOpenOptions {\n duration?: number;\n /** Keep a compact opener hidden while the surface is open; call showOrigin when it closes. */\n hideOrigin?: boolean;\n /** What enters inside the surface (selector); by default its children. */\n content?: string;\n /** Delay between content parts: an option list cascades instead of growing as one. */\n stagger?: number;\n liquid?: boolean;\n}\n\nconst partsOf = (surface: HTMLElement, content: string | undefined) =>\n [...surface.querySelectorAll<HTMLElement>(content ?? ':scope > *')].filter(\n (element) => !element.classList.contains(FACE) && !element.classList.contains('mk-liquid'),\n );\n\n/**\n * Open `surface` out of `origin`. Returns the timeline (null when reduced).\n * Shape travels from the opener (0.7 s, signature) and takes the surface's\n * colour over the first 0.3 s; the content grows from the opener's box out of\n * an 8 px blur on the same curve. Without an opener on screen: scale .92 → 1, 0.35 s.\n */\nexport function morphOpen(surface: HTMLElement, origin: HTMLElement | null, options: MorphOpenOptions = {}) {\n registerMotion();\n const { duration = TIMING.dialog.open, hideOrigin = false, content, stagger = 0, liquid = false } = options;\n stop(surface);\n if (reduced()) return null;\n const parts = partsOf(surface, content);\n if (liquid && !stagger && origin && shapeOf(surface, origin)) {\n if (hideOrigin && compact(origin)) origin.setAttribute(HIDDEN_ORIGIN, '');\n const settle = liquidOpen(surface, origin, parts);\n const window = gsap.timeline({\n onComplete: () => {\n settle();\n running.delete(surface);\n },\n onInterrupt: settle,\n });\n window.to({}, { duration: TIMING.liquid.safetyMs / 1000 });\n running.set(surface, window);\n return window;\n }\n const enter = stagger\n ? { opacity: 1, y: 0, duration: TIMING.dialog.list, ease: 'power2.out', stagger, clearProps: 'opacity,transform' }\n : { opacity: 1, filter: 'blur(0px)', duration, ease: EASE.signature, clearProps: 'opacity,filter' };\n const enterFrom = stagger ? { opacity: 0, y: -6 } : { opacity: 0, filter: 'blur(8px)' };\n const shape = shapeOf(surface, origin);\n if (!shape || !origin) {\n const rise = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n },\n })\n .fromTo(\n surface,\n { opacity: 0, scale: 0.92 },\n { opacity: 1, scale: 1, duration: TIMING.dialog.fallback, ease: 'power2.out', clearProps: 'opacity,transform' },\n );\n if (parts.length) rise.fromTo(parts, enterFrom, { ...enter, duration: Math.min(enter.duration, TIMING.dialog.fallback) }, 0);\n running.set(surface, rise);\n return rise;\n }\n const list = Boolean(stagger);\n if (!list) shareInto(origin, surface, duration);\n const { face, copy } = faceOf(surface, origin, shape, list);\n const group = list ? null : groupOf(surface, parts, shape);\n if (hideOrigin && compact(origin)) origin.setAttribute(HIDDEN_ORIGIN, '');\n const finish = () => {\n face.remove();\n running.delete(surface);\n gsap.set(surface, { clearProps: 'transform,clipPath,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter' });\n };\n const timeline = gsap\n .timeline({ onComplete: finish, onInterrupt: finish })\n .fromTo(\n surface,\n { x: shape.x, y: shape.y, clipPath: shape.from, willChange: 'transform,clip-path' },\n { x: 0, y: 0, clipPath: shape.to, duration, ease: EASE.signature },\n 0,\n )\n // The opener's colour hands over early, so a light button never flashes over a dark form.\n .to(face, { opacity: 0, duration: TIMING.dialog.surfaceColor, ease: EASE.signature }, 0);\n if (copy) timeline.to(copy, { opacity: 0, duration: 0.25, ease: 'power2.out' }, 0.05);\n if (parts.length) {\n if (group) {\n timeline.fromTo(\n parts,\n { ...group, opacity: 0, filter: 'blur(8px)' },\n { x: 0, y: 0, scaleX: 1, scaleY: 1, opacity: 1, filter: 'blur(0px)', duration, ease: EASE.signature },\n 0,\n );\n } else timeline.fromTo(parts, enterFrom, enter, duration * 0.2);\n }\n running.set(surface, timeline);\n return timeline;\n}\n\nexport interface MorphCloseOptions {\n duration?: number;\n content?: string;\n liquid?: boolean;\n}\n\n/**\n * Fold `surface` back into `origin`, then call `onComplete` (which hides it).\n * Without an opener on screen it closes in place: 90 % scale, 32 px blur.\n */\nexport function morphClose(surface: HTMLElement, origin: HTMLElement | null, onComplete: () => void, options: MorphCloseOptions = {}) {\n registerMotion();\n const { duration = TIMING.dialog.close, content, liquid = false } = options;\n stop(surface);\n if (reduced()) {\n onComplete();\n return null;\n }\n const parts = partsOf(surface, content);\n const shape = shapeOf(surface, origin);\n if (!shape || !origin) {\n const fade = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n gsap.set(surface, { clearProps: 'opacity,transform' });\n if (parts.length) gsap.set(parts, { clearProps: 'filter' });\n },\n })\n .to(surface, { scale: 0.9, duration, ease: EASE.signature }, 0)\n .to(surface, { opacity: 0, duration, ease: EASE.fadeAway }, 0);\n if (parts.length) fade.to(parts, { filter: 'blur(32px)', duration, ease: EASE.blurAway }, 0);\n running.set(surface, fade);\n return fade;\n }\n const list = content !== undefined;\n if (liquid && !list) {\n liquidClose(surface, origin, parts, onComplete);\n return null;\n }\n const { face, copy } = faceOf(surface, origin, shape, list);\n gsap.set(copy ? [face, copy] : face, { opacity: 0 });\n if (!list) {\n // The shape folds back into the opener and takes its colour (0.5 s); the\n // content heads for the opener on a 2 s path while it fades and blurs away\n // within the 0.5 s, and the surface fades out (power3.in).\n shareBack(surface, origin, duration);\n const group = groupOf(surface, parts, shape);\n const signature = gsap.parseEase(EASE.signature);\n const toward = (progress: number) => signature(progress * (duration / TIMING.dialog.contentReturn));\n const timeline = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n face.remove();\n gsap.set(surface, { clearProps: 'transform,clipPath,opacity,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter,borderRadius' });\n },\n onInterrupt: () => {\n face.remove();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter,borderRadius' });\n },\n })\n .fromTo(\n surface,\n { clipPath: shape.to, willChange: 'transform,clip-path' },\n { x: shape.x, y: shape.y, clipPath: shape.from, duration, ease: EASE.signature },\n 0,\n )\n .to(face, { opacity: 1, duration, ease: EASE.signature }, 0)\n .to(surface, { opacity: 0, duration, ease: 'power3.in' }, 0);\n if (parts.length) {\n timeline\n .to(parts, { ...group, duration, ease: toward }, 0)\n // Rounds the content toward a 400 px radius while it fades and blurs.\n .to(parts, { opacity: 0, borderRadius: '400px', duration, ease: EASE.fadeAway }, 0)\n .to(parts, { filter: 'blur(32px)', duration, ease: EASE.blurAway }, 0);\n }\n running.set(surface, timeline);\n return timeline;\n }\n // A list: its content dissolves while the shape travels back and takes the label back.\n const timeline = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n face.remove();\n gsap.set(surface, { clearProps: 'transform,clipPath,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,filter' });\n },\n onInterrupt: () => {\n face.remove();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,filter' });\n },\n })\n .fromTo(\n surface,\n { clipPath: shape.to, willChange: 'transform,clip-path' },\n { x: shape.x, y: shape.y, clipPath: shape.from, duration, ease: EASE.signature },\n 0,\n )\n .to(face, { opacity: 1, duration: duration * 0.5, ease: 'power1.in' }, duration * 0.3);\n if (parts.length) timeline.to(parts, { opacity: 0, filter: 'blur(32px)', duration: duration * 0.7, ease: 'power2.in' }, 0);\n if (copy) timeline.to(copy, { opacity: 1, duration: duration * 0.3, ease: 'power1.in' }, duration * 0.65);\n running.set(surface, timeline);\n return timeline;\n}\n\n/**\n * Close a modal at once (focus returns, the page takes input) while an inert\n * copy folds back into the opener over a fading veil. `inPlace` (after a drag)\n * closes it where it was dropped instead of folding into the opener.\n */\nexport function morphCloseWithGhost(\n surface: HTMLElement,\n origin: HTMLElement | null,\n { inPlace = false, liquid = false }: { inPlace?: boolean; liquid?: boolean } = {},\n) {\n registerMotion();\n const dragged = inPlace\n ? {\n x: Number(gsap.getProperty(surface, 'x')) || 0,\n y: Number(gsap.getProperty(surface, 'y')) || 0,\n scale: Number(gsap.getProperty(surface, 'scaleX')) || 1,\n }\n : null;\n if (dragged) gsap.set(surface, { clearProps: 'transform' });\n const ghost = reduced() ? null : ghostOf(surface);\n if (!ghost) {\n showOrigin(origin);\n releaseShared(origin);\n return;\n }\n // The veil copies the modal's backdrop (tint and blur) and fades with the copy.\n const veil = backdropVeil(surface);\n document.body.append(veil, ghost);\n showOrigin(origin, { fade: true });\n gsap.to(veil, { opacity: 0, duration: TIMING.dialog.close, ease: 'power3.in' });\n if (dragged) gsap.set(ghost, { ...dragged, transformOrigin: getComputedStyle(surface).transformOrigin });\n morphClose(\n ghost,\n dragged ? null : origin,\n () => {\n showOrigin(origin);\n releaseShared(origin);\n ghost.remove();\n veil.remove();\n },\n { liquid },\n );\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\r\nimport { motionSpring } from '../core/physics-spring';\r\nimport { reduced } from '../core/reduced';\r\nimport { clearStyles } from '../core/styles';\r\nimport { TIMING } from '../core/timing';\r\nimport { backdropVeil, ghostOf } from './surface';\r\n\r\n/*\r\n * project sheet: the surface rises from below the screen (0.72 s,\r\n * cubic(.16,1,.3,1)) while the page behind ([data-mk-underlay]) sinks to\r\n * scale .98 / opacity .4 on a 300/30 spring. It closes through an inert copy\r\n * that drops away, so focus returns at once.\r\n */\r\n\r\nconst UNDERLAY_STYLES = ['transform', 'translate', 'rotate', 'scale', 'transform-origin', 'opacity'];\r\n\r\nexport function sheetOpen(surface: HTMLElement) {\r\n if (reduced()) return null;\r\n registerMotion();\r\n return gsap.fromTo(surface, { yPercent: 100 }, { yPercent: 0, duration: TIMING.sheet.open, ease: EASE.sheet, clearProps: 'transform' });\r\n}\r\n\r\n/** Side of a drawer surface: data-mk-drawer=\"left\", else right. */\r\nconst slideFrom = (surface: HTMLElement) => (surface.dataset.mkDrawer === 'left' ? -1 : 1);\r\n\r\n/** Drawer: the surface slides in from its side on the sheet curve. */\r\nexport function slideOpen(surface: HTMLElement) {\r\n if (reduced()) return null;\r\n registerMotion();\r\n return gsap.fromTo(surface, { xPercent: 104 * slideFrom(surface) }, { xPercent: 0, duration: TIMING.sheet.open, ease: EASE.sheet, clearProps: 'transform' });\r\n}\r\n\r\n/** Slide a copy of the (still open) drawer back off its side, so focus returns at once. */\r\nexport function slideClose(surface: HTMLElement) {\r\n registerMotion();\r\n gsap.killTweensOf(surface);\r\n clearStyles([surface], ['transform', 'translate', 'rotate', 'scale']);\r\n const ghost = reduced() ? null : ghostOf(surface);\r\n if (!ghost) return null;\r\n const veil = backdropVeil(surface);\r\n document.body.append(veil, ghost);\r\n gsap.to(veil, { opacity: 0, duration: TIMING.sheet.close * 0.8, ease: 'power3.in', onComplete: () => veil.remove() });\r\n return gsap.to(ghost, { xPercent: 104 * slideFrom(surface), duration: TIMING.sheet.close * 0.8, ease: 'power3.in', onComplete: () => ghost.remove() });\r\n}\r\n\r\n/** Drop a copy of the (still open) sheet off the bottom of the screen. */\r\nexport function sheetClose(surface: HTMLElement, { inPlace = false }: { inPlace?: boolean } = {}) {\r\n registerMotion();\r\n const dragged = inPlace ? Number(gsap.getProperty(surface, 'y')) || 0 : 0;\r\n gsap.killTweensOf(surface);\r\n clearStyles([surface], ['transform', 'translate', 'rotate', 'scale']);\r\n const ghost = reduced() ? null : ghostOf(surface);\r\n if (!ghost) return null;\r\n const veil = backdropVeil(surface);\r\n document.body.append(veil, ghost);\r\n gsap.to(veil, { opacity: 0, duration: TIMING.sheet.close, ease: 'power3.in', onComplete: () => veil.remove() });\r\n return gsap.fromTo(\r\n ghost,\r\n { y: dragged, yPercent: 0 },\r\n { yPercent: 100, duration: TIMING.sheet.close, ease: EASE.sheet, onComplete: () => ghost.remove() },\r\n );\r\n}\r\n\r\nexport function pushUnderlay(elements: HTMLElement[]) {\r\n if (!elements.length || reduced()) return;\r\n registerMotion();\r\n const { ease, duration } = motionSpring(...TIMING.springs.underlay);\r\n gsap.to(elements, {\r\n scale: TIMING.sheet.underlayScale,\r\n opacity: TIMING.sheet.underlayOpacity,\r\n transformOrigin: '50% 0',\r\n duration,\r\n ease,\r\n overwrite: 'auto',\r\n });\r\n}\r\n\r\nexport function releaseUnderlay(elements: HTMLElement[], animated = true) {\r\n if (!elements.length) return;\r\n const restore = () => clearStyles(elements, UNDERLAY_STYLES);\r\n if (!animated || reduced()) {\r\n gsap.killTweensOf(elements);\r\n restore();\r\n return;\r\n }\r\n const { ease, duration } = motionSpring(...TIMING.springs.underlay);\r\n gsap.to(elements, { scale: 1, opacity: 1, duration, ease, overwrite: 'auto', onComplete: restore });\r\n}\r\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\r\nimport { reduced } from '../../core/reduced';\r\nimport { createScope } from '../../core/scope';\r\nimport { TIMING } from '../../core/timing';\r\nimport { inert, warnOnce, type Cleanup, type Instance } from '../../core/types';\r\nimport { MORPH_STYLES, clearStyles } from '../../core/styles';\r\nimport { anchorSurface, clearAnchor } from '../../motion/anchor';\r\nimport { attachDragDismiss } from '../../motion/drag-dismiss';\r\nimport {\r\n attachFloating,\r\n dockWindow,\r\n floatingAvailable,\r\n forgetFloat,\r\n liftWindow,\r\n savedFloat,\r\n unplaceWindow,\r\n} from '../../motion/floating';\r\nimport { isMorphing, morphCloseWithGhost, morphOpen, releaseShared, showOrigin, stopMorph } from '../../motion/morph';\r\nimport { pushUnderlay, releaseUnderlay, sheetClose, sheetOpen, slideClose, slideOpen } from '../../motion/sheet';\r\nimport { closeModal, fadeBackdrop, openModal } from '../../motion/surface';\r\n\r\n/*\r\n * Dialog on a native <dialog> (focus trap, Escape, top layer): the\r\n * control that opened it turns into it and it folds back into that control\r\n * (morph or liquid) over a backdrop tinted on the signature curve. It eases to\r\n * new heights (auto-resize), can be dragged away (> 100 px) and, on desktop,\r\n * lifted into a floating window by its handle. Parts: [data-mk-part] header,\r\n * title, description, body, footer, close, handle.\r\n */\r\n\r\n/** drawer: slides in from its side (data-mk-drawer=\"left|right\", see createDrawer). */\r\nexport type DialogVariant = 'morph' | 'liquid' | 'sheet' | 'drawer';\r\nexport type DialogPlacement = 'center' | 'anchor' | 'side';\r\n\r\nexport interface DialogLabels {\r\n close?: string;\r\n float?: string;\r\n dock?: string;\r\n}\r\n\r\nexport interface DialogOptions {\r\n /** morph (default), liquid, or sheet: rises from the bottom and pushes [data-mk-underlay] back. */\r\n variant?: DialogVariant;\r\n placement?: DialogPlacement;\r\n /** placement 'anchor': the box to place it against, read on open and resize (default: the opener's). */\r\n anchor?: () => DOMRect | null | undefined;\r\n /** Tinted backdrop; false leaves it transparent (menus). */\r\n backdrop?: boolean;\r\n closeOnBackdrop?: boolean;\r\n /** Drag (or wheel) down to dismiss. */\r\n drag?: boolean;\r\n /** A key turns on the floating window (desktop) and remembers its place. */\r\n float?: string | false;\r\n autoResize?: boolean;\r\n /** `[data-mk-open=\"<id>\"]` buttons open it: true uses the dialog's id; a string names another id; false: none. */\r\n triggers?: boolean | string;\r\n /** Modal (default) or a non-modal dialog. */\r\n modal?: boolean;\r\n labels?: DialogLabels;\r\n /** Grow the content with the surface (default). Menus turn it off and cascade their items instead. */\r\n animateContent?: boolean;\r\n onOpen?: () => void;\r\n /** After it closed, whatever closed it. */\r\n onClose?: () => void;\r\n}\r\n\r\nexport interface DialogInstance extends Instance {\r\n /** `origin`: the control it grows from; omitted, the focused control; null, none (scale-in). */\r\n open(origin?: HTMLElement | null): void;\r\n close(): void;\r\n toggle(origin?: HTMLElement | null): void;\r\n float(): void;\r\n dock(): void;\r\n readonly isOpen: boolean;\r\n readonly isFloating: boolean;\r\n readonly element: HTMLElement;\r\n}\r\n\r\nconst DEFAULT_LABELS: Required<DialogLabels> = { close: 'Cerrar', float: 'Ventana flotante', dock: 'Volver a su sitio' };\r\nconst FIELDS = '[autofocus], input:not([type=\"hidden\"]):not(:disabled), textarea:not(:disabled), select:not(:disabled)';\r\nconst CORNERS = ['tl', 'tr', 'bl', 'br'] as const;\r\nlet uid = 0;\r\n\r\nconst part = (dialog: HTMLElement, name: string) => dialog.querySelector<HTMLElement>(`[data-mk-part=\"${name}\"]`);\r\n\r\nexport function createDialog(dialog: HTMLElement | null, options: DialogOptions = {}): DialogInstance {\r\n if (!dialog) {\r\n warnOnce('dialog: missing <dialog> element');\r\n return inert({ open() {}, close() {}, toggle() {}, float() {}, dock() {}, isOpen: false, isFloating: false, element: null as unknown as HTMLElement });\r\n }\r\n registerMotion();\r\n const {\r\n variant = 'morph',\r\n placement = 'center',\r\n backdrop = true,\r\n closeOnBackdrop = true,\r\n drag = true,\r\n float: floatKey = false,\r\n autoResize = true,\r\n triggers = true,\r\n modal = true,\r\n } = options;\r\n const labels = { ...DEFAULT_LABELS, ...options.labels };\r\n const liquid = variant === 'liquid';\r\n const sheet = variant === 'sheet';\r\n const drawer = variant === 'drawer';\r\n const scope = createScope();\r\n /** Effects that live while it is open. */\r\n let session: Cleanup[] = [];\r\n let opener: HTMLElement | null = null;\r\n let isOpen = false;\r\n let closing = false;\r\n let floating = false;\r\n /**\r\n * Lifting and docking swap modal ↔ popover: the native `close` events they cause\r\n * (queued, so they arrive later) are not the person closing it.\r\n */\r\n let ownCloses = 0;\r\n const closeNatively = () => {\r\n if (!dialog.hasAttribute('open')) return;\r\n ownCloses += 1;\r\n closeModal(dialog as HTMLDialogElement);\r\n };\r\n let destroyed = false;\r\n /** destroy() is under way: the page behind comes back at once. */\r\n let tearingDown = false;\r\n\r\n if (placement !== 'center') scope.attr(dialog, 'data-mk-placement', placement);\r\n if (!backdrop) scope.attr(dialog, 'data-mk-backdrop', 'none');\r\n scope.attr(dialog, 'data-mk-variant', variant);\r\n const title = part(dialog, 'title');\r\n if (title && !dialog.hasAttribute('aria-label') && !dialog.hasAttribute('aria-labelledby')) {\r\n if (!title.id) scope.attr(title, 'id', `mk-dialog-title-${++uid}`);\r\n scope.attr(dialog, 'aria-labelledby', title.id);\r\n }\r\n const description = part(dialog, 'description');\r\n if (description && !dialog.hasAttribute('aria-describedby')) {\r\n if (!description.id) scope.attr(description, 'id', `mk-dialog-description-${++uid}`);\r\n scope.attr(dialog, 'aria-describedby', description.id);\r\n }\r\n const closeButton = part(dialog, 'close');\r\n if (closeButton && !closeButton.hasAttribute('aria-label') && !closeButton.textContent?.trim()) {\r\n scope.attr(closeButton, 'aria-label', labels.close);\r\n }\r\n const handle = floatKey ? part(dialog, 'handle') : null;\r\n if (handle) {\r\n scope.attr(handle, 'data-mk-no-drag', '');\r\n scope.attr(handle, 'aria-pressed', 'false');\r\n scope.attr(handle, 'aria-label', labels.float);\r\n }\r\n const corners: HTMLElement[] = [];\r\n if (floatKey) {\r\n for (const corner of CORNERS) {\r\n const element = document.createElement('span');\r\n element.className = 'mk-float-corner';\r\n element.dataset.mkFloatCorner = corner;\r\n element.dataset.mkNoDrag = '';\r\n element.setAttribute('aria-hidden', 'true');\r\n dialog.append(element);\r\n corners.push(element);\r\n }\r\n scope.add(() => corners.forEach((corner) => corner.remove()));\r\n }\r\n\r\n const emit = (type: string, cancelable = false, detail: Record<string, unknown> = {}) =>\r\n dialog.dispatchEvent(new CustomEvent(type, { bubbles: true, cancelable, detail: { dialog, ...detail } }));\r\n\r\n const endSession = () => {\r\n for (const cleanup of session.splice(0).reverse()) cleanup();\r\n };\r\n\r\n const settleFloating = () => {\r\n if (!floating) return;\r\n floating = false;\r\n if (typeof dialog.hidePopover === 'function' && dialog.hasAttribute('popover')) {\r\n try {\r\n dialog.hidePopover();\r\n } catch {\r\n // Already hidden.\r\n }\r\n }\r\n dialog.removeAttribute('popover');\r\n unplaceWindow(dialog);\r\n if (handle) {\r\n handle.setAttribute('aria-pressed', 'false');\r\n handle.setAttribute('aria-label', labels.float);\r\n }\r\n };\r\n\r\n /** Closed without our animation (owner, form[method=dialog], destroy). */\r\n const closedQuietly = () => {\r\n stopMorph(dialog);\r\n endSession();\r\n isOpen = false;\r\n closing = false;\r\n showOrigin(opener);\r\n releaseShared(opener);\r\n emit('mk:closed');\r\n options.onClose?.();\r\n };\r\n\r\n const lift = () => {\r\n if (!floatKey || floating || !isOpen || !floatingAvailable()) return;\r\n const box = dialog.getBoundingClientRect();\r\n const rect = savedFloat(floatKey) ?? { top: box.top, left: box.left, width: box.width, height: box.height };\r\n const focused = document.activeElement;\r\n // Its backdrop leaves as the window lifts off the page.\r\n const backdropStyle = getComputedStyle(dialog, '::backdrop');\r\n const veil = document.createElement('div');\r\n veil.setAttribute('aria-hidden', 'true');\r\n Object.assign(veil.style, {\r\n position: 'fixed',\r\n inset: '0',\r\n background: backdropStyle.background || backdropStyle.backgroundColor,\r\n backdropFilter: backdropStyle.backdropFilter,\r\n pointerEvents: 'none',\r\n });\r\n closeNatively();\r\n document.body.append(veil);\r\n dialog.setAttribute('popover', 'manual');\r\n if (typeof dialog.showPopover === 'function') dialog.showPopover();\r\n else openModal(dialog, false);\r\n liftWindow(dialog, rect);\r\n gsap.to(veil, { opacity: 0, duration: reduced() ? 0 : TIMING.float.shadow, ease: EASE.signature, onComplete: () => veil.remove() });\r\n floating = true;\r\n if (handle) {\r\n handle.setAttribute('aria-pressed', 'true');\r\n handle.setAttribute('aria-label', labels.dock);\r\n }\r\n showOrigin(opener, { fade: true });\r\n if (focused instanceof HTMLElement && dialog.contains(focused)) focused.focus();\r\n };\r\n\r\n const dock = () => {\r\n if (!floatKey || !floating) return;\r\n const box = dialog.getBoundingClientRect();\r\n const focused = document.activeElement;\r\n floating = false;\r\n if (typeof dialog.hidePopover === 'function') dialog.hidePopover();\r\n dialog.removeAttribute('popover');\r\n closeNatively();\r\n openModal(dialog, modal);\r\n dockWindow(dialog, { top: box.top, left: box.left, width: box.width, height: box.height });\r\n if (backdrop) void fadeBackdrop(dialog, 'in');\r\n forgetFloat(floatKey);\r\n if (handle) {\r\n handle.setAttribute('aria-pressed', 'false');\r\n handle.setAttribute('aria-label', labels.float);\r\n }\r\n if (focused instanceof HTMLElement && dialog.contains(focused)) focused.focus();\r\n };\r\n\r\n const anchorBox = () => (options.anchor ? options.anchor() : opener?.isConnected ? opener.getBoundingClientRect() : null);\r\n\r\n const startSession = () => {\r\n if (drawer && modal) {\r\n const root = document.documentElement;\r\n const overflow = root.style.overflow;\r\n root.style.overflow = 'hidden';\r\n session.push(() => {\r\n root.style.overflow = overflow;\r\n if (root.getAttribute('style') === '') root.removeAttribute('style');\r\n });\r\n }\r\n if (sheet) {\r\n const behind = [...document.querySelectorAll<HTMLElement>('[data-mk-underlay]')];\r\n pushUnderlay(behind);\r\n const root = document.documentElement;\r\n const overflow = root.style.overflow;\r\n root.style.overflow = 'hidden';\r\n session.push(() => {\r\n root.style.overflow = overflow;\r\n if (root.getAttribute('style') === '') root.removeAttribute('style');\r\n releaseUnderlay(behind, !tearingDown);\r\n });\r\n }\r\n if (autoResize && typeof ResizeObserver === 'function') {\r\n let last = dialog.offsetHeight;\r\n let resizing: gsap.core.Tween | null = null;\r\n const observer = new ResizeObserver(() => {\r\n if (resizing?.isActive()) return;\r\n const next = dialog.offsetHeight;\r\n const previous = last;\r\n last = next;\r\n // A floating window's size is the person's, not its content's.\r\n if (floating || Math.abs(next - previous) < 2 || !previous || isMorphing(dialog) || reduced()) return;\r\n resizing = gsap.fromTo(\r\n dialog,\r\n { height: previous },\r\n {\r\n height: next,\r\n duration: TIMING.dialog.autoResize,\r\n ease: EASE.signature,\r\n clearProps: 'height',\r\n onComplete: () => {\r\n last = dialog.offsetHeight;\r\n },\r\n },\r\n );\r\n });\r\n observer.observe(dialog);\r\n session.push(() => {\r\n observer.disconnect();\r\n resizing?.kill();\r\n clearStyles([dialog], ['height']);\r\n });\r\n }\r\n if (drag) {\r\n session.push(\r\n attachDragDismiss(dialog, {\r\n canDrag: () => !isMorphing(dialog) && !floating && !closing && isOpen,\r\n onDismiss: () => close(true),\r\n }),\r\n );\r\n }\r\n if (placement === 'anchor') {\r\n const onResize = () => {\r\n if (isOpen && !floating) anchorSurface(dialog, anchorBox());\r\n };\r\n addEventListener('resize', onResize);\r\n session.push(() => {\r\n removeEventListener('resize', onResize);\r\n clearAnchor(dialog);\r\n });\r\n }\r\n if (floatKey && handle) {\r\n session.push(attachFloating(dialog, { key: floatKey, handle, corners, isFloating: () => floating, float: lift, dock }));\r\n const onResize = () => {\r\n if (floating && !floatingAvailable()) dock();\r\n };\r\n addEventListener('resize', onResize);\r\n session.push(() => removeEventListener('resize', onResize));\r\n }\r\n };\r\n\r\n const open = (origin?: HTMLElement | null) => {\r\n if (destroyed || isOpen) return;\r\n const active = document.activeElement;\r\n // undefined: the focused control (usually the one clicked); null: no opener at all.\r\n opener = origin !== undefined ? origin : active instanceof HTMLElement && active !== document.body && !dialog.contains(active) ? active : null;\r\n closing = false;\r\n isOpen = true;\r\n openModal(dialog, modal);\r\n if (placement === 'anchor') anchorSurface(dialog, anchorBox());\r\n if (backdrop && modal) void fadeBackdrop(dialog, 'in');\r\n if (sheet) sheetOpen(dialog);\r\n else if (drawer) slideOpen(dialog);\r\n else morphOpen(dialog, opener, { hideOrigin: true, liquid, content: options.animateContent === false ? ':scope > :not(*)' : undefined });\r\n startSession();\r\n // Forms start at their first field (after showModal: a closed dialog cannot take focus).\r\n dialog.querySelector<HTMLElement>(FIELDS)?.focus({ preventScroll: true });\r\n emit('mk:open', false, { origin: opener });\r\n options.onOpen?.();\r\n };\r\n\r\n /** Animated close: the dialog closes at once while an inert copy folds into the opener. */\r\n const close = (inPlace = false) => {\r\n if (destroyed || !isOpen || closing) return;\r\n if (!emit('mk:close', true, { inPlace })) return;\r\n closing = true;\r\n // The copy is measured first: the session cleanup clears an anchored place.\r\n if (sheet) sheetClose(dialog, { inPlace });\r\n else if (drawer) slideClose(dialog);\r\n else morphCloseWithGhost(dialog, opener, { inPlace, liquid });\r\n endSession();\r\n if (floating) settleFloating();\r\n if (dialog.hasAttribute('open')) closeModal(dialog as HTMLDialogElement);\r\n isOpen = false;\r\n closing = false;\r\n if (opener?.isConnected) opener.focus();\r\n emit('mk:closed');\r\n options.onClose?.();\r\n };\r\n\r\n scope.on(dialog, 'cancel', (event) => {\r\n event.preventDefault();\r\n close();\r\n });\r\n scope.on(dialog, 'close', () => {\r\n if (ownCloses > 0) {\r\n ownCloses -= 1;\r\n return;\r\n }\r\n // A native close we did not start (form method=\"dialog\", dialog.close()).\r\n if (!isOpen || closing) return;\r\n closedQuietly();\r\n });\r\n scope.on(dialog, 'keydown', (event) => {\r\n // A floating (non-modal) window still closes with Escape.\r\n if ((event as KeyboardEvent).key === 'Escape' && floating) {\r\n event.preventDefault();\r\n close();\r\n }\r\n });\r\n scope.on(dialog, 'click', (event) => {\r\n const target = event.target as Element | null;\r\n if (target?.closest('[data-mk-part=\"close\"], [data-mk-close]') && dialog.contains(target)) {\r\n close();\r\n return;\r\n }\r\n if (target !== dialog || !closeOnBackdrop || floating) return;\r\n const mouse = event as MouseEvent;\r\n const box = dialog.getBoundingClientRect();\r\n if (mouse.clientX < box.left || mouse.clientX > box.right || mouse.clientY < box.top || mouse.clientY > box.bottom) close();\r\n });\r\n const triggerId = triggers === true ? dialog.id : triggers || '';\r\n if (triggerId) {\r\n const selector = `[data-mk-open=\"${typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(triggerId) : triggerId}\"]`;\r\n scope.on(document, 'click', (event) => {\r\n const trigger = (event.target as Element | null)?.closest<HTMLElement>(selector);\r\n if (!trigger || dialog.contains(trigger)) return;\r\n event.preventDefault();\r\n if (isOpen) close();\r\n else open(trigger);\r\n });\r\n }\r\n dialog.dataset.mkReady = '';\r\n\r\n return {\r\n open,\r\n close: () => close(),\r\n toggle: (origin?: HTMLElement | null) => (isOpen ? close() : open(origin)),\r\n float: lift,\r\n dock,\r\n get isOpen() {\r\n return isOpen;\r\n },\r\n get isFloating() {\r\n return floating;\r\n },\r\n element: dialog,\r\n destroy() {\r\n if (destroyed) return;\r\n tearingDown = true;\r\n if (isOpen) {\r\n settleFloating();\r\n closing = true;\r\n if (dialog.hasAttribute('open')) closeModal(dialog as HTMLDialogElement);\r\n closedQuietly();\r\n }\r\n destroyed = true;\r\n endSession();\r\n gsap.killTweensOf(dialog);\r\n clearStyles([dialog], [...MORPH_STYLES, 'height']);\r\n scope.dispose();\r\n delete dialog.dataset.mkReady;\r\n },\r\n };\r\n}\r\n","import { createScope } from '../../core/scope';\nimport { gsap } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce } from '../../core/types';\nimport { flowInMenu } from '../../motion/entrances';\nimport { createDialog, type DialogInstance, type DialogOptions } from '../dialog/engine';\n\n/*\n * Options menu: the same surface engine as a dialog, anchored to its\n * button, without a tinted backdrop, on a translucent surface that grows out of\n * the button; its options flow in from 90 % out of a 4 px blur, last first,\n * 40 ms apart, after 0.1 s. Arrow keys, Home and End move between options.\n */\n\nexport interface MenuOptions extends Omit<DialogOptions, 'placement' | 'backdrop' | 'drag' | 'autoResize' | 'animateContent'> {\n ticket?: boolean;\n /** Close after an option is chosen (default). */\n closeOnSelect?: boolean;\n onSelect?: (value: string, item: HTMLElement) => void;\n}\n\nexport interface MenuInstance extends DialogInstance {\n readonly items: HTMLElement[];\n}\n\nconst ITEM = '[data-mk-item]';\n\nexport function createMenu(dialog: HTMLElement | null, options: MenuOptions = {}): MenuInstance {\n if (!dialog) {\n warnOnce('menu: missing <dialog> element');\n return inert({\n open() {},\n close() {},\n toggle() {},\n float() {},\n dock() {},\n isOpen: false,\n isFloating: false,\n element: null as unknown as HTMLElement,\n items: [],\n });\n }\n const { closeOnSelect = true } = options;\n const scope = createScope();\n let ticketAnimation: gsap.core.Timeline | undefined;\n if (options.ticket) {\n scope.attr(dialog, 'data-mk-ticket', '');\n scope.attr(dialog, 'style', dialog.getAttribute('style'));\n for (const item of dialog.querySelectorAll<HTMLElement>(ITEM)) scope.attr(item, 'style', item.getAttribute('style'));\n scope.add(() => ticketAnimation?.kill());\n }\n const items = () => [...dialog.querySelectorAll<HTMLElement>(ITEM)].filter((item) => !item.hasAttribute('disabled') && item.getAttribute('aria-disabled') !== 'true');\n\n scope.attr(dialog, 'role', 'menu');\n // Options can come and go (frameworks): roles are applied now and on every open.\n const markItems = () => {\n for (const item of dialog.querySelectorAll<HTMLElement>(ITEM)) {\n scope.attr(item, 'role', 'menuitem');\n scope.attr(item, 'tabindex', '-1');\n }\n };\n markItems();\n\n const surface = createDialog(dialog, {\n ...options,\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n animateContent: false,\n onOpen: () => {\n markItems();\n const list = items();\n if (options.ticket && !reduced()) {\n ticketAnimation?.kill();\n ticketAnimation = gsap.timeline()\n .fromTo(dialog, { clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0% 0)', duration: TIMING.ticketMenu.open, ease: 'expo.out' })\n .fromTo(list, { yPercent: TIMING.ticketMenu.from }, { yPercent: 0, duration: TIMING.ticketMenu.content, stagger: TIMING.ticketMenu.stagger, ease: 'expo.out' }, 0);\n } else flowInMenu(list);\n list[0]?.focus({ preventScroll: true });\n options.onOpen?.();\n },\n });\n\n const select = (item: HTMLElement) => {\n const value = item.dataset.mkValue ?? item.textContent?.trim() ?? '';\n dialog.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { value, item } }));\n options.onSelect?.(value, item);\n if (closeOnSelect) surface.close();\n };\n\n scope.on(dialog, 'click', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);\n if (item && dialog.contains(item) && items().includes(item)) select(item);\n });\n scope.on(dialog, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const list = items();\n if (!list.length) return;\n const at = list.indexOf(document.activeElement as HTMLElement);\n const moves: Record<string, number> = {\n ArrowDown: at < 0 ? 0 : (at + 1) % list.length,\n ArrowUp: at < 0 ? list.length - 1 : (at - 1 + list.length) % list.length,\n Home: 0,\n End: list.length - 1,\n };\n if (key in moves) {\n event.preventDefault();\n list[moves[key]]?.focus();\n return;\n }\n // Buttons and links activate themselves; other items need Enter and Space.\n const target = event.target as HTMLElement;\n if ((key === 'Enter' || key === ' ') && list.includes(target) && !target.matches('button, a[href]')) {\n event.preventDefault();\n select(target);\n }\n });\n\n return {\n open: surface.open,\n close: surface.close,\n toggle: surface.toggle,\n float: surface.float,\n dock: surface.dock,\n get isOpen() {\n return surface.isOpen;\n },\n get isFloating() {\n return surface.isFloating;\n },\n get items() {\n return items();\n },\n element: dialog,\n destroy() {\n surface.destroy();\n scope.dispose();\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * Chat background: two soft blobs (primary-container and\n * tertiary-container, 800 px radial gradients, saturate 150 %) orbit behind the\n * chat and a grain sits on top. Energy (0…1, e.g. the microphone's) speeds the\n * orbits up (10 − 3.5·e s and 15 − 4.5·e s), brightens the blobs (.5 + .15·e) and\n * scales them ((1 + .1·e)·scale). Onboarding's \"busy\" state pushes it to energy\n * 1.6 and scale 1.8 in 0.8 s (power2.out) and back in 0.6 s (power2.inOut).\n */\n\nexport interface ChatBackgroundOptions {\n energy?: number;\n scale?: number;\n}\n\nexport interface ChatBackgroundInstance extends Instance {\n setEnergy(energy: number): void;\n setScale(scale: number): void;\n /** Onboarding's busy state: energy 1.6 / scale 1.8, or back to rest. */\n busy(on: boolean): void;\n readonly energy: number;\n readonly scale: number;\n}\n\nconst VARS = ['--mk-chat-orbit-1', '--mk-chat-orbit-2', '--mk-chat-blob-opacity', '--mk-chat-scale'];\nconst instances = new WeakMap<Element, ChatBackgroundInstance>();\n\n/** The background instance running on `el` (steps and chat use it to drive the energy). */\nexport const chatBackgroundOf = (el: Element | null | undefined) => (el ? (instances.get(el) ?? null) : null);\n\nexport function createChatBackground(root: HTMLElement | null, options: ChatBackgroundOptions = {}): ChatBackgroundInstance {\n if (!root) {\n warnOnce('chat-background: missing root');\n return inert({ setEnergy() {}, setScale() {}, busy() {}, energy: 0, scale: 1 });\n }\n registerMotion();\n const scope = createScope();\n const state = { energy: options.energy ?? 0, scale: options.scale ?? 1 };\n let noise = root.querySelector<HTMLElement>(':scope > .mk-chat-background__noise');\n if (!noise) {\n noise = document.createElement('div');\n noise.className = 'mk-chat-background__noise';\n noise.setAttribute('aria-hidden', 'true');\n root.append(noise);\n const created = noise;\n scope.add(() => created.remove());\n }\n scope.attr(root, 'aria-hidden', 'true');\n\n const paint = () => {\n const e = Math.max(0, state.energy);\n root.style.setProperty('--mk-chat-orbit-1', `${Math.max(1, 10 - 3.5 * e).toFixed(3)}s`);\n root.style.setProperty('--mk-chat-orbit-2', `${Math.max(1, 15 - 4.5 * e).toFixed(3)}s`);\n root.style.setProperty('--mk-chat-blob-opacity', (0.5 + 0.15 * e).toFixed(3));\n root.style.setProperty('--mk-chat-scale', ((1 + 0.1 * e) * state.scale).toFixed(3));\n };\n scope.add(() => {\n gsap.killTweensOf(state);\n for (const name of VARS) root.style.removeProperty(name);\n if (root.getAttribute('style') === '') root.removeAttribute('style');\n });\n paint();\n\n const instance: ChatBackgroundInstance = {\n setEnergy(energy: number) {\n state.energy = Number.isFinite(energy) ? energy : 0;\n paint();\n },\n setScale(scale: number) {\n state.scale = Number.isFinite(scale) ? scale : 1;\n paint();\n },\n busy(on: boolean) {\n const to = on ? { energy: 1.6, scale: 1.8 } : { energy: 0, scale: 1 };\n gsap.killTweensOf(state);\n if (reduced()) {\n Object.assign(state, to);\n paint();\n return;\n }\n gsap.to(state, {\n ...to,\n duration: on ? TIMING.onboarding.busy : TIMING.onboarding.idle,\n ease: on ? 'power2.out' : 'power2.inOut',\n onUpdate: paint,\n });\n },\n get energy() {\n return state.energy;\n },\n get scale() {\n return state.scale;\n },\n destroy() {\n instances.delete(root);\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n instances.set(root, instance);\n root.dataset.mkReady = '';\n return instance;\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { nextFrame } from '../../core/frame';\nimport { entrances, reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { clearStyles } from '../../core/styles';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { revealCounter } from '../../motion/count';\nimport { flowIn, flowOut } from '../../motion/flow';\nimport { chatBackgroundOf } from '../chat-background/engine';\n\n/*\n * onboarding: one step at a time. Changing step flows the current\n * step's items out (down into a 16 px blur, 0.5 s, 50 ms apart), swaps the step,\n * waits a frame and flows the next one's items in from above. A counter rolls\n * to the step number (0.9 s), focus moves to the new step's title, and while a\n * step works (busy) the chat background inside speeds up and grows (energy 1.6,\n * scale 1.8 in 0.8 s; back in 0.6 s).\n * Parts: [data-mk-step] (items: [data-mk-flow-item], else its children),\n * [data-mk-step-title], [data-mk-counter], [data-mk-step-next|prev|goto=\"n\"].\n */\n\nexport interface StepsOptions {\n /** First step shown (0-based). Default: the one marked data-mk-current, else 0. */\n index?: number;\n duration?: number;\n /** Flow the first step in on start. */\n animateFirst?: boolean;\n /** Items of a step that flow (default [data-mk-flow-item], else the step's children). */\n target?: string;\n onChange?: (index: number, previous: number) => void;\n}\n\nexport interface StepsInstance extends Instance {\n next(): Promise<void>;\n prev(): Promise<void>;\n goTo(index: number): Promise<void>;\n /** A step is working: drives the chat background inside. */\n busy(on: boolean): void;\n readonly index: number;\n readonly count: number;\n readonly steps: HTMLElement[];\n}\n\nexport interface StepDetail {\n index: number;\n previous: number;\n step: HTMLElement;\n}\n\nconst STEP = '[data-mk-step]';\nconst ITEM_STYLES = ['transform', 'translate', 'rotate', 'scale', 'filter', 'opacity', 'visibility'];\n\nexport function createSteps(root: HTMLElement | null, options: StepsOptions = {}): StepsInstance {\n // Steps of this root only, not those of a nested one.\n const steps = root\n ? [...root.querySelectorAll<HTMLElement>(STEP)].filter((step) => {\n const outer = step.parentElement?.closest(STEP);\n return !outer || !root.contains(outer);\n })\n : [];\n if (!root || !steps.length) {\n warnOnce('steps: needs [data-mk-step] children');\n return inert({ next: async () => {}, prev: async () => {}, goTo: async () => {}, busy() {}, index: -1, count: 0, steps: [] });\n }\n registerMotion();\n const scope = createScope();\n const { duration = TIMING.onboarding.step, animateFirst = true, target = '[data-mk-flow-item]' } = options;\n const clamp = (value: number) => Math.min(steps.length - 1, Math.max(0, Math.round(value)));\n const marked = steps.findIndex((step) => step.hasAttribute('data-mk-current'));\n let index = clamp(options.index ?? (marked >= 0 ? marked : 0));\n let wanted = index;\n let running: Promise<void> | null = null;\n let stopCounter = () => {};\n\n const itemsOf = (step: HTMLElement) => {\n const marked = [...step.querySelectorAll<HTMLElement>(target)];\n return marked.length ? marked : ([...step.children] as HTMLElement[]);\n };\n const show = (current: number) => {\n steps.forEach((step, i) => {\n scope.attr(step, 'hidden', i === current ? null : '');\n scope.attr(step, 'data-mk-current', i === current ? '' : null);\n });\n };\n const counter = () => {\n const el = root.querySelector<HTMLElement>('[data-mk-counter]');\n if (!el) return;\n stopCounter();\n stopCounter = revealCounter(el, index + 1, { duration: TIMING.onboarding.counter });\n };\n const focusTitle = (step: HTMLElement) => {\n const title = step.querySelector<HTMLElement>('[data-mk-step-title]') ?? step.querySelector<HTMLElement>('h1, h2, h3, h4, h5, h6');\n if (!title) return;\n if (!title.hasAttribute('tabindex') && title.tabIndex < 0) scope.attr(title, 'tabindex', '-1');\n title.focus({ preventScroll: true });\n };\n\n // One loop at a time; it follows `wanted` until it settles. `running` is cleared\n // in the same tick the loop ends, so a goTo right after starts a new one.\n const change = async () => {\n try {\n while (wanted !== index && !scope.disposed) {\n const previous = index;\n const next = wanted;\n const out = reduced() ? null : flowOut(itemsOf(steps[previous]!), { duration });\n if (out) await out;\n if (scope.disposed) return;\n index = next;\n show(index);\n const step = steps[index]!;\n await nextFrame();\n if (scope.disposed) return;\n // Opacity only: a visibility-hidden title could not take the focus.\n const items = itemsOf(step);\n clearStyles(items, ['visibility']);\n flowIn(items, { duration, autoAlpha: false });\n counter();\n focusTitle(step);\n root.dispatchEvent(new CustomEvent<StepDetail>('mk:step', { bubbles: true, detail: { index, previous, step } }));\n options.onChange?.(index, previous);\n }\n } finally {\n running = null;\n }\n };\n\n const goTo = (to: number) => {\n wanted = clamp(to);\n if (wanted === index && !running) return Promise.resolve();\n running ??= change();\n return running;\n };\n\n show(index);\n scope.add(() => {\n stopCounter();\n for (const step of steps) {\n const items = itemsOf(step);\n gsap.killTweensOf(items);\n clearStyles(items, ITEM_STYLES);\n }\n });\n scope.on(root, 'click', (event) => {\n const trigger = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-step-next], [data-mk-step-prev], [data-mk-step-goto]');\n if (!trigger || !root.contains(trigger)) return;\n if (trigger.hasAttribute('data-mk-step-next')) void goTo(wanted + 1);\n else if (trigger.hasAttribute('data-mk-step-prev')) void goTo(wanted - 1);\n else void goTo(Number(trigger.dataset.mkStepGoto) - 1);\n });\n const counterEl = root.querySelector<HTMLElement>('[data-mk-counter]');\n if (counterEl) {\n const text = counterEl.textContent;\n counterEl.textContent = String(index + 1);\n scope.add(() => {\n counterEl.textContent = text;\n });\n }\n if (animateFirst && entrances()) flowIn(itemsOf(steps[index]!), { duration });\n root.dataset.mkReady = '';\n\n return {\n next: () => goTo(wanted + 1),\n prev: () => goTo(wanted - 1),\n goTo,\n busy(on: boolean) {\n scope.attr(root, 'aria-busy', on ? 'true' : null);\n const background = root.querySelector('.mk-chat-background, mk-chat-background');\n chatBackgroundOf(background)?.busy(on);\n },\n get index() {\n return index;\n },\n get count() {\n return steps.length;\n },\n get steps() {\n return steps;\n },\n destroy() {\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface QuantityOptions {\n min?: number;\n max?: number;\n step?: number;\n value?: number;\n disabled?: boolean;\n onChange?: (value: number) => void;\n}\nexport interface QuantityInstance extends Instance {\n setValue(value: number, notify?: boolean): void;\n readonly value: number;\n}\n\n/** Bounded numeric control. Bite/rotation is CSS; buttons remain native. */\nexport function createQuantity(root: HTMLElement | null, options: QuantityOptions = {}): QuantityInstance {\n const input = root?.querySelector<HTMLInputElement>('[data-mk-quantity-input]');\n if (!root || !input) return inert({ setValue() {}, value: 0 });\n const scope = createScope();\n const min = Number.isFinite(options.min) ? options.min! : 1;\n const max = Number.isFinite(options.max) ? Math.max(min, options.max!) : Math.max(min, 999);\n const step = Number.isFinite(options.step) && options.step! > 0 ? options.step! : 1;\n const steps = Math.floor((max - min) / step + 1e-9);\n const upper = Math.min(max, Number((min + steps * step).toFixed(10)));\n const normalize = (n: number) => Math.max(min, Math.min(upper, Number((min + Math.round((n - min) / step) * step).toFixed(10))));\n const original = input.value;\n const disabled = options.disabled ?? input.disabled;\n const decrease = root.querySelector<HTMLButtonElement>('[data-mk-quantity-decrease]');\n const increase = root.querySelector<HTMLButtonElement>('[data-mk-quantity-increase]');\n scope.attr(input, 'min', String(min));\n scope.attr(input, 'max', String(max));\n scope.attr(input, 'step', String(step));\n scope.attr(input, 'disabled', disabled ? '' : null);\n scope.attr(root, 'data-mk-ready', '');\n const initial = input.value.trim() ? Number(input.value) : NaN;\n let value = normalize(Number.isFinite(options.value) ? options.value! : Number.isFinite(initial) ? initial : min);\n let pendingReset: Event | null = null;\n const typed = () => (input.value.trim() && Number.isFinite(input.valueAsNumber) ? input.valueAsNumber : NaN);\n const render = (syncInput = true) => {\n if (pendingReset) {\n if (pendingReset.eventPhase !== 0) return;\n if (!pendingReset.defaultPrevented) value = normalize(Number.isFinite(typed()) ? typed() : min);\n pendingReset = null;\n }\n if (syncInput) input.value = String(value);\n if (decrease) scope.attr(decrease, 'disabled', disabled || value <= min ? '' : null);\n if (increase) scope.attr(increase, 'disabled', disabled || value >= upper ? '' : null);\n };\n const commit = (next: number, notify: boolean, syncInput: boolean) => {\n if (scope.disposed || !Number.isFinite(next)) return;\n if (pendingReset?.eventPhase === 0) pendingReset = null;\n const previous = value;\n value = normalize(next);\n render(syncInput);\n if (notify && value !== previous) {\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value, previous } }));\n }\n };\n const setValue = (next: number, notify = true) => commit(next, notify, true);\n if (decrease) scope.on(decrease, 'click', () => { if (!decrease.disabled) setValue(value - step); });\n if (increase) scope.on(increase, 'click', () => { if (!increase.disabled) setValue(value + step); });\n // While typing, commit only numbers that are already valid and leave the text alone;\n // partial or out-of-range input settles on change/blur.\n scope.on(input, 'input', () => {\n const n = typed();\n if (Number.isFinite(n) && normalize(n) === n) commit(n, true, false);\n });\n scope.on(input, 'change', () => {\n if (Number.isFinite(typed())) setValue(typed());\n else render();\n });\n scope.on(input, 'blur', () => render());\n if (input.form) scope.on(input.form, 'reset', (event) => {\n // reset's native default action runs after its listeners. Match the final input silently.\n render();\n pendingReset = event;\n scope.timeout(() => { if (pendingReset === event) render(); }, 0);\n });\n scope.add(() => { input.value = original; });\n render();\n return { setValue, get value() { return value; }, destroy: () => scope.dispose() };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface PaginationOptions {\n totalPages?: number;\n page?: number;\n siblings?: number;\n pageLabel?: (page: number) => string;\n onChange?: (page: number) => void;\n}\nexport interface PaginationInstance extends Instance {\n setPage(page: number, notify?: boolean): void;\n setTotalPages(total: number): void;\n readonly page: number;\n readonly totalPages: number;\n}\n// Reserve room for the page-window arithmetic so incrementing always progresses.\nconst positive = (n: number | undefined, fallback: number) => Number.isFinite(n) ? Math.max(1, Math.min(Number.MAX_SAFE_INTEGER - 32, Math.floor(n!))) : fallback;\n\n/** Renders a bounded window of pages, even when totalPages is very large. */\nexport function createPagination(root: HTMLElement | null, options: PaginationOptions = {}): PaginationInstance {\n const pages = root?.querySelector<HTMLElement>('[data-mk-pagination-pages]');\n if (!root || !pages) return inert({ setPage() {}, setTotalPages() {}, page: 1, totalPages: 1 });\n const scope = createScope();\n const original = [...pages.childNodes];\n const previous = root.querySelector<HTMLButtonElement>('[data-mk-pagination-previous]');\n const next = root.querySelector<HTMLButtonElement>('[data-mk-pagination-next]');\n let total = positive(options.totalPages, 10);\n let page = Math.min(total, positive(options.page, 1));\n const siblings = Math.min(10, Math.max(0, Number.isFinite(options.siblings) ? Math.floor(options.siblings!) : 1));\n scope.attr(root, 'data-mk-ready', '');\n const render = () => {\n const hadFocus = pages.contains(document.activeElement);\n const selected = new Set([1, total]);\n for (let n = Math.max(1, page - siblings); n <= Math.min(total, page + siblings); n++) selected.add(n);\n const fragment = document.createDocumentFragment();\n let last = 0;\n for (const n of [...selected].sort((a, b) => a - b)) {\n if (last && n - last > 1) {\n const gap = document.createElement('span');\n gap.className = 'mk-pagination__gap';\n gap.textContent = '…';\n gap.setAttribute('aria-hidden', 'true');\n fragment.append(gap);\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkPage = String(n);\n button.textContent = String(n);\n button.setAttribute('aria-label', options.pageLabel?.(n) ?? `Página ${n}`);\n if (n === page) button.setAttribute('aria-current', 'page');\n fragment.append(button);\n last = n;\n }\n pages.replaceChildren(fragment);\n if (hadFocus) pages.querySelector<HTMLButtonElement>('[aria-current]')?.focus();\n if (previous) scope.attr(previous, 'disabled', page === 1 ? '' : null);\n if (next) scope.attr(next, 'disabled', page === total ? '' : null);\n };\n const setPage = (value: number, notify = true) => {\n if (scope.disposed || !Number.isFinite(value)) return;\n const candidate = Math.max(1, Math.min(total, Math.round(value)));\n if (candidate === page) return;\n const focused = pages.contains(document.activeElement);\n page = candidate;\n render();\n if (focused) pages.querySelector<HTMLButtonElement>('[aria-current]')?.focus();\n if (notify) {\n options.onChange?.(page);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { page, totalPages: total } }));\n }\n };\n scope.on(root, 'click', (event) => {\n const target = (event.target as Element).closest<HTMLButtonElement>('button');\n if (!target || target.disabled) return;\n if (target === previous) setPage(page - 1);\n else if (target === next) setPage(page + 1);\n else if (target.dataset.mkPage) setPage(Number(target.dataset.mkPage));\n });\n scope.on(root, 'keydown', (event) => {\n if (!(event.target instanceof HTMLButtonElement)) return;\n const to = event.key === 'ArrowRight' ? page + 1 : event.key === 'ArrowLeft' ? page - 1 : event.key === 'Home' ? 1 : event.key === 'End' ? total : null;\n if (to === null) return;\n event.preventDefault();\n setPage(to);\n pages.querySelector<HTMLButtonElement>('[aria-current]')?.focus();\n });\n scope.add(() => pages.replaceChildren(...original));\n render();\n return {\n setPage,\n setTotalPages(value) {\n if (scope.disposed || !Number.isFinite(value)) return;\n total = positive(value, 1);\n if (page > total) setPage(total);\n else render();\n },\n get page() { return page; },\n get totalPages() { return total; },\n destroy: () => scope.dispose(),\n };\n}\n","import { requestFrame } from '../../core/frame';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface HoverCardOptions {\n openDelay?: number;\n closeDelay?: number;\n /** Preferred side; it flips when the viewport has no room there. */\n placement?: 'top' | 'bottom';\n onOpenChange?: (open: boolean) => void;\n}\nexport interface HoverCardInstance extends Instance {\n open(): void;\n close(): void;\n /** Place the open panel again (after its content changed size). */\n reposition(): void;\n readonly isOpen: boolean;\n}\nlet sequence = 0;\n/** Distance kept from the viewport edges. */\nconst EDGE = 12;\nconst GAP = 12;\n\n/**\n * Nonmodal preview: pointer, keyboard focus and tap all reveal the same panel.\n * The panel stays inside the viewport: it flips to the other side when its own\n * has no room and shifts sideways (--mk-hover-shift) away from the edges, again\n * on scroll and resize. Opened from the keyboard it appears without the entrance.\n */\nexport function createHoverCard(root: HTMLElement | null, options: HoverCardOptions = {}): HoverCardInstance {\n const trigger = root?.querySelector<HTMLElement>('[data-mk-hover-trigger]');\n const panel = root?.querySelector<HTMLElement>('[data-mk-hover-panel]');\n if (!root || !trigger || !panel) return inert({ open() {}, close() {}, reposition() {}, isOpen: false });\n const scope = createScope();\n const openDelay = Number.isFinite(options.openDelay) ? Math.max(0, options.openDelay!) : 120;\n const closeDelay = Number.isFinite(options.closeDelay) ? Math.max(0, options.closeDelay!) : 140;\n const preferred = options.placement ?? 'top';\n let opened = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pointerInside = false;\n /** The last input was a pointer (focus that follows a click is not keyboard). */\n let pointerInput = false;\n let id = panel.id;\n if (!id) { do { id = `mk-hover-${++sequence}`; } while (document.getElementById(id)); }\n scope.attr(panel, 'id', id);\n scope.attr(trigger, 'aria-controls', id);\n scope.attr(root, 'data-mk-placement', preferred);\n scope.attr(root, 'data-mk-side', preferred);\n scope.attr(root, 'style', root.getAttribute('style'));\n scope.attr(root, 'data-mk-ready', '');\n\n const place = () => {\n if (!opened || scope.disposed) return;\n root.style.removeProperty('--mk-hover-shift');\n const anchor = root.getBoundingClientRect();\n const box = panel.getBoundingClientRect();\n const view = { width: innerWidth, height: innerHeight };\n const need = box.height + GAP + EDGE;\n const above = anchor.top;\n const below = view.height - anchor.bottom;\n let side = preferred;\n if (preferred === 'top' && above < need && below > above) side = 'bottom';\n if (preferred === 'bottom' && below < need && above > below) side = 'top';\n scope.attr(root, 'data-mk-side', side);\n // The panel starts at the root's left edge; move it back inside the viewport.\n const left = anchor.left;\n let shift = 0;\n if (left + box.width > view.width - EDGE) shift = view.width - EDGE - box.width - left;\n if (left + shift < EDGE) shift = EDGE - left;\n if (shift) root.style.setProperty('--mk-hover-shift', `${Math.round(shift)}px`);\n };\n let pending: (() => void) | null = null;\n const schedulePlace = () => {\n if (!opened || pending) return;\n pending = requestFrame(() => {\n pending = null;\n place();\n });\n };\n scope.add(() => pending?.());\n\n const cancel = () => { clearTimeout(timer); timer = undefined; };\n const set = (value: boolean) => {\n cancel();\n if (scope.disposed) return;\n const changed = value !== opened;\n opened = value;\n scope.attr(trigger, 'aria-expanded', String(value));\n scope.attr(panel, 'hidden', value ? null : '');\n scope.attr(root, 'data-mk-open', value ? '' : null);\n if (value && changed) {\n scope.attr(root, 'data-mk-input', pointerInput ? 'pointer' : 'keyboard');\n place();\n }\n if (changed) {\n options.onOpenChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:open-change', { bubbles: true, detail: { open: value } }));\n }\n };\n const schedule = (value: boolean, delay: number) => { cancel(); timer = setTimeout(() => set(value), delay); };\n scope.on(root, 'pointerenter', () => { pointerInside = true; pointerInput = true; schedule(true, openDelay); });\n scope.on(root, 'pointerleave', () => {\n pointerInside = false;\n if (!root.contains(document.activeElement)) schedule(false, closeDelay);\n });\n scope.on(root, 'pointerdown', () => { pointerInput = true; });\n scope.on(document, 'keydown', () => { pointerInput = false; }, true);\n scope.on(root, 'focusin', () => set(true));\n scope.on(root, 'focusout', (event) => {\n if (!pointerInside && !root.contains((event as FocusEvent).relatedTarget as Node | null)) schedule(false, closeDelay);\n });\n scope.on(trigger, 'click', () => { pointerInput = true; set(true); });\n scope.on(document, 'pointerdown', (event) => { if (!root.contains(event.target as Node)) set(false); });\n scope.on(root, 'keydown', (event) => {\n if (event.key !== 'Escape' || !opened) return;\n event.preventDefault();\n trigger.focus();\n set(false);\n });\n scope.on(window, 'resize', schedulePlace);\n scope.on(window, 'scroll', schedulePlace, { capture: true, passive: true });\n scope.add(cancel);\n set(false);\n return {\n open: () => set(true),\n close: () => set(false),\n reposition: place,\n get isOpen() { return opened; },\n destroy: () => scope.dispose(),\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface InputOtpOptions {\n length?: number;\n value?: string;\n mask?: boolean;\n onChange?: (value: string) => void;\n onComplete?: (value: string) => void;\n}\nexport interface InputOtpInstance extends Instance {\n setValue(value: string, notify?: boolean): void;\n focus(): void;\n readonly value: string;\n}\n\n/** One real input preserves native editing, mobile autofill and password managers. */\nexport function createInputOtp(root: HTMLElement | null, options: InputOtpOptions = {}): InputOtpInstance {\n const input = root?.querySelector<HTMLInputElement>('[data-mk-otp-input]');\n const slots = root?.querySelector<HTMLElement>('[data-mk-otp-slots]');\n if (!root || !input || !slots) return inert({ setValue() {}, focus() {}, value: '' });\n const scope = createScope();\n const length = Number.isFinite(options.length) ? Math.min(16, Math.max(1, Math.round(options.length!))) : 6;\n const clean = (text: string) => text.replace(/[^0-9]/g, '').slice(0, length);\n const original = input.value;\n const originalNodes = [...slots.childNodes];\n let value = clean(options.value ?? input.value);\n let pendingReset: Event | null = null;\n const cells = Array.from({ length }, () => {\n const cell = document.createElement('span');\n cell.className = 'mk-input-otp__slot';\n return cell;\n });\n slots.replaceChildren(...cells);\n scope.attr(slots, 'aria-hidden', 'true');\n scope.attr(input, 'type', 'text');\n scope.attr(input, 'inputmode', 'numeric');\n scope.attr(input, 'autocomplete', 'one-time-code');\n scope.attr(input, 'maxlength', String(length));\n scope.attr(input, 'pattern', `[0-9]{${length}}`);\n scope.attr(root, 'data-mk-ready', '');\n const render = () => {\n if (pendingReset) {\n if (pendingReset.eventPhase !== 0) return;\n if (!pendingReset.defaultPrevented) value = clean(input.value);\n pendingReset = null;\n }\n input.value = value;\n const active = document.activeElement === input ? Math.min(length - 1, input.selectionStart ?? value.length) : -1;\n cells.forEach((cell, i) => {\n const text = value[i] ? options.mask ? '•' : value[i]! : '';\n if (cell.textContent !== text) cell.textContent = text;\n cell.toggleAttribute('data-mk-active', i === active);\n cell.toggleAttribute('data-mk-filled', i < value.length);\n });\n scope.attr(root, 'data-mk-complete', value.length === length ? '' : null);\n };\n const setValue = (next: string, notify = true) => {\n if (scope.disposed) return;\n if (pendingReset?.eventPhase === 0) pendingReset = null;\n const previous = value;\n value = clean(String(next));\n render();\n if (notify && value !== previous) {\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value, complete: value.length === length } }));\n if (value.length === length) {\n options.onComplete?.(value);\n root.dispatchEvent(new CustomEvent('mk:complete', { bubbles: true, detail: { value } }));\n }\n }\n };\n scope.on(input, 'input', (event) => {\n if ((event as InputEvent).isComposing) return;\n const caret = clean(input.value.slice(0, input.selectionStart ?? input.value.length)).length;\n setValue(input.value);\n input.setSelectionRange(caret, caret);\n render();\n });\n scope.on(input, 'compositionend', () => setValue(input.value));\n scope.on(input, 'paste', (event) => {\n const text = (event as ClipboardEvent).clipboardData?.getData('text');\n if (text === undefined) return;\n event.preventDefault();\n const start = input.selectionStart ?? value.length;\n const end = input.selectionEnd ?? start;\n const inserted = clean(text);\n setValue(value.slice(0, start) + inserted + value.slice(end));\n const caret = Math.min(length, start + inserted.length);\n input.setSelectionRange(caret, caret);\n render();\n });\n scope.on(input, 'focus', render);\n scope.on(input, 'blur', render);\n scope.on(input, 'keyup', render);\n scope.on(input, 'click', render);\n scope.on(document, 'selectionchange', () => { if (document.activeElement === input) render(); });\n if (input.form) scope.on(input.form, 'reset', (event) => {\n render();\n pendingReset = event;\n scope.timeout(() => { if (pendingReset === event) render(); }, 0);\n });\n scope.add(() => { slots.replaceChildren(...originalNodes); input.value = original; });\n render();\n return { setValue, focus: () => { if (!scope.disposed) input.focus(); }, get value() { return value; }, destroy: () => scope.dispose() };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport type StudioDockView = 'menu' | 'contact' | 'reel';\nexport interface StudioDockState { open: boolean; view: StudioDockView; page: number; }\nexport interface StudioDockOptions {\n /** Seconds. Reference sheet: 1.3 s, outBack(.52). */\n duration?: number;\n ease?: string;\n /** Move focus into a newly opened view. Defaults to true. */\n focusOnOpen?: boolean;\n /** Contain Tab within the open panel and its toggle. Defaults to true. */\n trapFocus?: boolean;\n onChange?: (state: StudioDockState) => void;\n}\nexport interface StudioDockInstance extends Instance {\n open(view?: StudioDockView): void;\n close(): void;\n toggle(): void;\n selectPage(index: number): void;\n readonly state: StudioDockState;\n}\n\nlet nextId = 0;\n/** Panel distance from the dock's edge (bar + gap); --mk-studio-dock-offset overrides it. */\nconst PANEL_OFFSET = 76;\nconst VIEWPORT_GAP = 12;\nconst MIN_SPACE = 320;\nconst FOCUSABLE = 'a[href],button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),video[controls],[tabindex]:not([tabindex=\"-1\"])';\n\n/** A contained studio sheet. Markup remains useful without JavaScript; fixed positioning is CSS opt-in. */\nexport function createStudioDock(root: HTMLElement | null, options: StudioDockOptions = {}): StudioDockInstance {\n const toggleButton = root?.querySelector<HTMLButtonElement>('[data-mk-studio-toggle]');\n const panel = root?.querySelector<HTMLElement>('[data-mk-studio-panel]');\n if (!root || !toggleButton || !panel) return inert({ open() {}, close() {}, toggle() {}, selectPage() {}, state: { open: false, view: 'menu' as const, page: 0 } });\n registerMotion();\n const scope = createScope();\n const context = gsap.context(() => {}, root);\n scope.add(() => context.revert());\n const views = [...panel.querySelectorAll<HTMLElement>('[data-mk-studio-view]')];\n const pages = [...panel.querySelectorAll<HTMLElement>('[data-mk-studio-page]')];\n const pageButtons = [...root.querySelectorAll<HTMLElement>('[data-mk-studio-page-to]')];\n const slide = root.querySelector<HTMLElement>('[data-mk-studio-slide]');\n const tracked = [root, panel, ...(slide ? [slide] : [])];\n tracked.forEach(el => { const style = el.getAttribute('style'); scope.add(() => style === null ? el.removeAttribute('style') : el.setAttribute('style', style)); });\n scope.attr(panel, 'id', panel.id || `mk-studio-panel-${++nextId}`);\n scope.attr(panel, 'role', panel.getAttribute('role') || 'dialog');\n scope.attr(panel, 'aria-label', panel.getAttribute('aria-label') || 'Studio navigation');\n scope.attr(panel, 'tabindex', '-1');\n scope.attr(toggleButton, 'aria-controls', panel.id);\n scope.attr(toggleButton, 'aria-expanded', 'false');\n scope.attr(panel, 'hidden', '');\n scope.attr(panel, 'aria-hidden', 'true');\n scope.attr(root, 'data-mk-ready', '');\n let state: StudioDockState = { open: false, view: 'menu', page: 0 };\n let previousFocus: HTMLElement | null = null;\n let animation: gsap.core.Tween | undefined;\n let slideStart: number | null = null;\n let slideDistance = 0;\n let slideMoved = false;\n let suppressSlideClick = false;\n\n // The sheet opens above the bar. Cap it to the room actually left in the viewport\n // (it scrolls inside) and open it below the bar when above is too tight.\n const place = (decide = false) => {\n const view = root.ownerDocument.defaultView;\n if (!state.open || !view) return;\n const rect = root.getBoundingClientRect();\n const offset = parseFloat(view.getComputedStyle(root).getPropertyValue('--mk-studio-dock-offset')) || PANEL_OFFSET;\n const above = rect.bottom - offset - VIEWPORT_GAP;\n const below = view.innerHeight - rect.top - offset - VIEWPORT_GAP;\n // The direction is chosen on open only, so scrolling never flips an open sheet.\n if (decide) scope.attr(root, 'data-mk-studio-below', above < Math.min(panel.scrollHeight || MIN_SPACE, MIN_SPACE) && below > above ? '' : null);\n const flip = root.hasAttribute('data-mk-studio-below');\n root.style.setProperty('--mk-studio-dock-space', `${Math.max(MIN_SPACE / 2, Math.floor(flip ? below : above))}px`);\n };\n const hidden = () => root.hasAttribute('data-mk-studio-below')\n ? { clipPath: 'inset(0% 0% 100% 0% round 18px)', y: -16, opacity: 0 }\n : { clipPath: 'inset(100% 0% 0% 0% round 18px)', y: 16, opacity: 0 };\n const notify = () => {\n const value = { ...state };\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:studio-dock', { bubbles: true, detail: value }));\n };\n const isTabbable = (el: HTMLElement) => el.tabIndex >= 0 && !el.closest('[hidden], [inert]') && el.getAttribute('aria-disabled') !== 'true';\n const visibleFocus = () => [...panel.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(isTabbable);\n const focusView = () => { if (options.focusOnOpen !== false) (visibleFocus()[0] ?? panel).focus({ preventScroll: true }); };\n const setView = (view: StudioDockView) => {\n state.view = views.length && !views.some(el => el.dataset.mkStudioView === view) ? 'menu' : view;\n views.forEach(el => scope.attr(el, 'hidden', el.dataset.mkStudioView === state.view ? null : ''));\n scope.attr(root, 'data-mk-studio-active', state.view);\n panel.querySelectorAll<HTMLVideoElement>('video').forEach(video => { if (state.view !== 'reel') video.pause(); });\n };\n const selectPage = (index: number, announce = true) => {\n if (scope.disposed || !pages.length || !Number.isFinite(index)) return;\n state.page = ((Math.round(index) % pages.length) + pages.length) % pages.length;\n pages.forEach((el, i) => scope.attr(el, 'hidden', i === state.page ? null : ''));\n pageButtons.forEach(el => scope.attr(el, 'aria-current', Number(el.dataset.mkStudioPageTo) === state.page ? 'true' : null));\n if (announce) notify();\n };\n const open = (view: StudioDockView = 'menu') => {\n if (scope.disposed) return;\n const wasOpen = state.open;\n if (wasOpen && state.view === view) return;\n if (!wasOpen) {\n const active = root.ownerDocument.activeElement;\n previousFocus = active instanceof HTMLElement && active !== root.ownerDocument.body && !panel.contains(active) ? active : toggleButton;\n }\n animation?.kill();\n state.open = true;\n scope.attr(panel, 'hidden', null);\n scope.attr(panel, 'inert', null);\n scope.attr(panel, 'aria-hidden', 'false');\n scope.attr(root, 'data-mk-studio-open', '');\n scope.attr(toggleButton, 'aria-expanded', 'true');\n setView(view);\n place(!wasOpen);\n if (!reduced()) context.add(() => {\n animation = gsap.fromTo(panel, hidden(), { clipPath: 'inset(0% 0% 0% 0% round 18px)', y: 0, opacity: 1, duration: Math.max(0, options.duration ?? 1.3), ease: options.ease ?? 'back.out(0.52)', overwrite: true });\n });\n else context.add(() => { gsap.set(panel, { clipPath: 'inset(0% round 18px)', y: 0, opacity: 1 }); });\n focusView();\n notify();\n };\n const close = (restoreFocus = true) => {\n if (scope.disposed || !state.open) return;\n animation?.kill();\n state.open = false;\n scope.attr(toggleButton, 'aria-expanded', 'false');\n scope.attr(root, 'data-mk-studio-open', null);\n // Stop focus immediately while the visual sheet collapses.\n scope.attr(panel, 'inert', '');\n scope.attr(panel, 'aria-hidden', 'true');\n if (reduced()) scope.attr(panel, 'hidden', '');\n else context.add(() => {\n animation = gsap.to(panel, { ...hidden(), duration: Math.max(0, options.duration ?? 1.3), ease: options.ease ?? 'back.out(0.52)', overwrite: true, onComplete: () => { if (!scope.disposed && !state.open) scope.attr(panel, 'hidden', ''); } });\n });\n panel.querySelectorAll<HTMLVideoElement>('video').forEach(video => video.pause());\n if (restoreFocus) (previousFocus?.isConnected ? previousFocus : toggleButton).focus({ preventScroll: true });\n notify();\n };\n scope.on(root, 'click', event => {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n if (target.closest('[data-mk-studio-toggle]') === toggleButton) state.open ? close() : open();\n else if (target.closest('[data-mk-studio-close]')) close();\n else if (target.closest('[data-mk-studio-slide]')) {\n if (suppressSlideClick) { event.preventDefault(); suppressSlideClick = false; }\n else open('contact');\n } else {\n const view = target.closest<HTMLElement>('[data-mk-studio-to]')?.dataset.mkStudioTo;\n if (view === 'menu' || view === 'contact' || view === 'reel') open(view);\n const page = target.closest<HTMLElement>('[data-mk-studio-page-to]');\n if (page) selectPage(Number(page.dataset.mkStudioPageTo));\n }\n });\n if (root.ownerDocument.defaultView) scope.on(root.ownerDocument.defaultView, 'resize', () => place());\n scope.on(root.ownerDocument, 'scroll', () => place(), { passive: true, capture: true });\n scope.on(root.ownerDocument, 'pointerdown', event => {\n if (state.open && event.target instanceof Node && !root.contains(event.target)) close(false);\n });\n scope.on(root.ownerDocument, 'keydown', event => {\n if (!state.open || event.defaultPrevented) return;\n if (event.key === 'Escape') { event.preventDefault(); close(); return; }\n if (!(event.target instanceof Node) || !root.contains(event.target)) return;\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && (event.target as Element).closest('[data-mk-studio-pages]')) {\n event.preventDefault(); selectPage(state.page + (event.key === 'ArrowRight' ? 1 : -1));\n pageButtons.find(el => Number(el.dataset.mkStudioPageTo) === state.page)?.focus();\n }\n if (event.key === 'Tab' && options.trapFocus !== false) {\n // querySelectorAll keeps the authored DOM order, including a toggle before OR after the panel.\n const elements = [...root.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(el => (el === toggleButton || panel.contains(el)) && isTabbable(el));\n if (!elements.length) { event.preventDefault(); panel.focus(); return; }\n const first = elements[0]!, last = elements.at(-1)!;\n if (event.shiftKey && (root.ownerDocument.activeElement === first || root.ownerDocument.activeElement === panel)) { event.preventDefault(); last.focus(); }\n else if (!event.shiftKey && root.ownerDocument.activeElement === last) { event.preventDefault(); first.focus(); }\n }\n });\n if (slide) {\n scope.on(slide, 'pointerdown', event => { if (event.button !== 0) return; slideStart = event.clientX; slideDistance = 0; slideMoved = false; });\n scope.on(root.ownerDocument, 'pointermove', event => {\n if (slideStart === null) return;\n const width = Math.max(0, (slide.parentElement?.clientWidth ?? 0) - slide.offsetWidth);\n slideMoved ||= Math.abs(event.clientX - slideStart) > 5;\n slideDistance = Math.max(0, Math.min(width, event.clientX - slideStart));\n if (!reduced()) slide.style.setProperty('--mk-studio-drag', `${slideDistance}px`);\n });\n const release = (cancel = false) => {\n if (slideStart === null) return;\n const width = Math.max(0, (slide.parentElement?.clientWidth ?? 0) - slide.offsetWidth);\n suppressSlideClick = slideMoved;\n slideStart = null;\n slide.style.removeProperty('--mk-studio-drag');\n if (!cancel && width > 0 && slideDistance / width >= .7) open('contact');\n scope.timeout(() => { suppressSlideClick = false; }, 150);\n };\n scope.on(root.ownerDocument, 'pointerup', () => release());\n scope.on(root.ownerDocument, 'pointercancel', () => release(true));\n }\n const clocks = [...root.querySelectorAll<HTMLElement>('[data-mk-studio-timezone]')];\n const clockOriginals = clocks.map(el => ({ el, text: el.textContent, style: el.getAttribute('style') }));\n const tick = () => clocks.forEach(el => {\n try { el.textContent = new Intl.DateTimeFormat(undefined, { hour: '2-digit', minute: '2-digit', timeZone: el.dataset.mkStudioTimezone }).format(new Date()); } catch { /* Invalid caller time zone leaves the original label intact. */ }\n });\n if (clocks.length) { tick(); const timer = setInterval(tick, 60_000); scope.add(() => clearInterval(timer)); }\n scope.add(() => clockOriginals.forEach(({ el, text, style }) => { el.textContent = text; if (style === null) el.removeAttribute('style'); else el.setAttribute('style', style); }));\n setView('menu');\n selectPage(0, false);\n return { open, close, toggle: () => state.open ? close() : open(), selectPage, get state() { return { ...state }; }, destroy() { if (scope.disposed) return; const focused = root.contains(root.ownerDocument.activeElement); animation?.kill(); panel.querySelectorAll<HTMLVideoElement>('video').forEach(video => video.pause()); scope.dispose(); if (focused) toggleButton.focus({ preventScroll: true }); } };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { createDialog } from '../dialog/engine';\n\nexport interface TrailerOptions {\n triggers?: boolean | string;\n autoplay?: boolean;\n closeOnBackdrop?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n}\nexport interface TrailerInstance extends Instance {\n open(origin?: HTMLElement | null): void;\n close(): void;\n toggle(origin?: HTMLElement | null): void;\n play(): Promise<boolean>;\n pause(): void;\n seek(seconds: number): void;\n setVolume(volume: number): void;\n readonly isOpen: boolean;\n}\nconst time = (value: number) => {\n const seconds = Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0;\n return `${Math.floor(seconds / 60).toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`;\n};\n\n/** Native modal + consumer-owned video, with optional accessible custom transport controls. */\nexport function createTrailer(root: HTMLElement | null, options: TrailerOptions = {}): TrailerInstance {\n const video = root?.querySelector<HTMLVideoElement>('video');\n if (!root || !video || root.tagName !== 'DIALOG') return inert({ open() {}, close() {}, toggle() {}, play: async () => false, pause() {}, seek() {}, setVolume() {}, isOpen: false });\n const scope = createScope();\n const get = <T extends HTMLElement>(name: string) => root.querySelector<T>(`[data-mk-trailer-${name}]`);\n const playButton = get<HTMLButtonElement>('play');\n const muteButton = get<HTMLButtonElement>('mute');\n const fullButton = get<HTMLButtonElement>('fullscreen');\n // The Fullscreen API rejects HTMLDialogElement. A consumer can wrap media and\n // transport in a stage; otherwise fullscreen just the native video element.\n const fullTarget = get<HTMLElement>('stage') ?? video;\n const captionsButton = get<HTMLButtonElement>('captions');\n const seekInput = get<HTMLInputElement>('seek');\n const volumeInput = get<HTMLInputElement>('volume');\n const output = get<HTMLElement>('time');\n const status = get<HTMLElement>('status');\n const originalText = [output, status].filter((el): el is HTMLElement => !!el).map(el => [el, el.textContent] as const);\n scope.add(() => originalText.forEach(([el, text]) => { el.textContent = text; }));\n scope.attr(root, 'data-mk-trailer-ready', '');\n scope.attr(root, 'data-mk-trailer-state', 'paused');\n const controls = video.controls;\n // Keep the browser's controls unless the consumer supplied a complete transport.\n if (playButton && muteButton && seekInput && (!video.querySelector('track') || captionsButton)) video.controls = false;\n scope.add(() => { video.controls = controls; });\n for (const input of [seekInput, volumeInput]) {\n if (!input) continue;\n const initialValue = input.value;\n scope.add(() => { input.value = initialValue; });\n scope.attr(input, 'min', '0');\n scope.attr(input, 'max', '1');\n scope.attr(input, 'step', input === volumeInput ? '.01' : '.1');\n scope.attr(input, 'aria-label', input.getAttribute('aria-label') ?? (input === volumeInput ? 'Volumen' : 'Posición del video'));\n }\n if (status) scope.attr(status, 'role', 'status');\n const tell = (message: string) => { if (!scope.disposed && status) status.textContent = message; };\n const sync = () => {\n if (scope.disposed) return;\n const duration = Number.isFinite(video.duration) ? Math.max(0, video.duration) : 0;\n scope.attr(root, 'data-mk-trailer-state', video.ended ? 'ended' : video.paused ? 'paused' : 'playing');\n if (playButton) {\n scope.attr(playButton, 'aria-label', video.paused || video.ended ? 'Reproducir' : 'Pausar');\n scope.attr(playButton, 'aria-pressed', String(!video.paused && !video.ended));\n }\n if (muteButton) {\n scope.attr(muteButton, 'aria-label', video.muted ? 'Activar sonido' : 'Silenciar');\n scope.attr(muteButton, 'aria-pressed', String(video.muted));\n }\n if (seekInput) {\n scope.attr(seekInput, 'max', String(duration || 1));\n scope.attr(seekInput, 'disabled', duration ? null : '');\n scope.attr(seekInput, 'aria-valuetext', `${time(video.currentTime)} de ${time(duration)}`);\n seekInput.value = String(Number.isFinite(video.currentTime) ? video.currentTime : 0);\n }\n if (volumeInput) volumeInput.value = String(video.muted ? 0 : video.volume);\n if (captionsButton) {\n scope.attr(captionsButton, 'disabled', video.textTracks.length ? null : '');\n scope.attr(captionsButton, 'aria-pressed', String(video.textTracks[0]?.mode === 'showing'));\n }\n if (output) output.textContent = `${time(video.currentTime)} / ${time(duration)}`;\n };\n let playRequest = 0;\n let wantsPlayback = false;\n const pause = () => { if (!scope.disposed) { wantsPlayback = false; ++playRequest; video.pause(); sync(); } };\n const play = async () => {\n if (scope.disposed) return false;\n wantsPlayback = true;\n const request = ++playRequest;\n try {\n await video.play();\n if (scope.disposed || request !== playRequest) {\n // A stale request must not pause a newer play after a quick close/reopen.\n if (scope.disposed || !wantsPlayback) video.pause();\n return false;\n }\n tell('');\n sync();\n return true;\n } catch {\n if (scope.disposed || request !== playRequest) return false;\n wantsPlayback = false;\n tell('No se pudo reproducir el video. Revisa la fuente y vuelve a intentarlo.');\n sync();\n return false;\n }\n };\n const seek = (seconds: number) => {\n if (scope.disposed || !Number.isFinite(seconds) || !Number.isFinite(video.duration) || video.duration <= 0) return;\n video.currentTime = Math.max(0, Math.min(video.duration, seconds));\n sync();\n };\n const setVolume = (volume: number) => {\n if (scope.disposed || !Number.isFinite(volume)) return;\n video.volume = Math.max(0, Math.min(1, volume));\n video.muted = volume <= 0;\n sync();\n };\n const exitFullscreen = () => {\n if (document.fullscreenElement !== fullTarget) return;\n void document.exitFullscreen?.().catch(() => {});\n };\n const dialog = createDialog(root, {\n triggers: options.triggers,\n closeOnBackdrop: options.closeOnBackdrop ?? true,\n drag: false,\n autoResize: false,\n animateContent: false,\n onOpen: () => { sync(); if (options.autoplay) void play(); options.onOpen?.(); },\n onClose: () => { ++playRequest; pause(); exitFullscreen(); options.onClose?.(); },\n });\n if (playButton) scope.on(playButton, 'click', () => video.paused || video.ended ? void play() : pause());\n if (muteButton) scope.on(muteButton, 'click', () => { video.muted = !video.muted; sync(); });\n if (seekInput) scope.on(seekInput, 'input', () => seek(Number(seekInput.value)));\n if (volumeInput) scope.on(volumeInput, 'input', () => setVolume(Number(volumeInput.value)));\n if (captionsButton) scope.on(captionsButton, 'click', () => {\n const track = video.textTracks[0];\n if (track) track.mode = track.mode === 'showing' ? 'hidden' : 'showing';\n sync();\n });\n const fullscreen = async () => {\n if (scope.disposed) return;\n try {\n if (document.fullscreenElement === fullTarget) await document.exitFullscreen?.();\n else if (fullTarget.requestFullscreen) {\n await fullTarget.requestFullscreen();\n if (scope.disposed || !dialog.isOpen) exitFullscreen();\n }\n else tell('La pantalla completa no está disponible en este navegador.');\n } catch { tell('No se pudo abrir la pantalla completa.'); }\n };\n if (fullButton) {\n scope.attr(fullButton, 'aria-label', 'Pantalla completa');\n scope.on(fullButton, 'click', () => { void fullscreen(); });\n scope.on(document, 'fullscreenchange', () => {\n scope.attr(fullButton, 'aria-label', document.fullscreenElement === fullTarget ? 'Salir de pantalla completa' : 'Pantalla completa');\n });\n }\n for (const event of ['loadedmetadata', 'durationchange', 'timeupdate', 'play', 'pause', 'ended', 'volumechange']) scope.on(video, event, sync);\n scope.on(video, 'error', () => { tell('El video no está disponible.'); scope.attr(root, 'data-mk-trailer-state', 'error'); });\n scope.on(root, 'keydown', (event) => {\n if (!dialog.isOpen || (event.target instanceof Element && event.target.closest('button, input, select, textarea, a, [contenteditable]'))) return;\n if (event.key === ' ' || event.key.toLowerCase() === 'k') { event.preventDefault(); video.paused ? void play() : pause(); }\n else if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') { event.preventDefault(); seek(video.currentTime + (event.key === 'ArrowRight' ? 5 : -5)); }\n else if (event.key.toLowerCase() === 'm') { video.muted = !video.muted; sync(); }\n });\n sync();\n return {\n open: (origin) => { if (!scope.disposed) dialog.open(origin); },\n close: () => { if (!scope.disposed) dialog.close(); },\n toggle: (origin) => { if (!scope.disposed) dialog.toggle(origin); },\n play, pause, seek, setVolume,\n get isOpen() { return dialog.isOpen; },\n destroy() {\n if (scope.disposed) return;\n wantsPlayback = false;\n ++playRequest;\n video.pause();\n exitFullscreen();\n dialog.destroy();\n scope.dispose();\n },\n };\n}\n","/*\n * Calendar date helpers on local dates (no time zone maths): the calendar and\n * slot-picker components share them. Days are compared by their YYYY-MM-DD key.\n */\n\nexport type DateInput = Date | string | number;\n\n/** Local midnight of a date; \"2026-10-23\" is read as a local day, not UTC. */\nexport function toDate(input: DateInput | null | undefined, fallback = new Date()): Date {\n if (input instanceof Date) return Number.isNaN(input.getTime()) ? startOfDay(fallback) : startOfDay(input);\n if (typeof input === 'string') {\n const day = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(input.trim());\n if (day) return new Date(Number(day[1]), Number(day[2]) - 1, Number(day[3]));\n }\n if (typeof input === 'string' || typeof input === 'number') {\n const parsed = new Date(input);\n if (!Number.isNaN(parsed.getTime())) return startOfDay(parsed);\n }\n return startOfDay(fallback);\n}\n\n/** A full date-time (events keep their hour). */\nexport function toDateTime(input: DateInput): Date | null {\n if (input instanceof Date) return Number.isNaN(input.getTime()) ? null : input;\n if (typeof input === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(input.trim())) return toDate(input);\n const parsed = new Date(input);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport const startOfDay = (date: Date) => new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\nexport const addDays = (date: Date, days: number) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n\n/** Same day number in another month, clamped to that month's length (Jan 31 + 1 → Feb 28/29). */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const last = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();\n return new Date(target.getFullYear(), target.getMonth(), Math.min(date.getDate(), last));\n}\n\nexport const startOfMonth = (date: Date) => new Date(date.getFullYear(), date.getMonth(), 1);\n\nexport function startOfWeek(date: Date, firstDay = 0): Date {\n const shift = (date.getDay() - firstDay + 7) % 7;\n return addDays(startOfDay(date), -shift);\n}\n\nexport const sameDay = (a: Date | null | undefined, b: Date | null | undefined) =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n\nexport const sameMonth = (a: Date, b: Date) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** YYYY-MM-DD of the local day. */\nexport const dayKey = (date: Date) => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n\n/** The weeks shown for a month: from the week of the 1st to the week of the last day (4–6 rows). */\nexport function monthWeeks(date: Date, firstDay = 0): Date[][] {\n const first = startOfMonth(date);\n const last = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n const weeks: Date[][] = [];\n for (let start = startOfWeek(first, firstDay); start <= last; start = addDays(start, 7)) {\n weeks.push(Array.from({ length: 7 }, (_, i) => addDays(start, i)));\n }\n return weeks;\n}\n\nexport const weekDays = (date: Date, firstDay = 0) => Array.from({ length: 7 }, (_, i) => addDays(startOfWeek(date, firstDay), i));\n\n/** Weekday names in display order, e.g. [\"dom\", \"lun\", …] for es with firstDay 0. */\nexport function weekdayNames(locale: string, firstDay = 0, width: 'long' | 'short' | 'narrow' = 'short'): string[] {\n const format = safeFormat(locale, { weekday: width });\n // 2024-09-01 was a Sunday.\n return Array.from({ length: 7 }, (_, i) => format.format(new Date(2024, 8, 1 + ((firstDay + i) % 7))));\n}\n\nexport function safeFormat(locale: string | undefined, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n try {\n return new Intl.DateTimeFormat(locale, options);\n } catch {\n return new Intl.DateTimeFormat(undefined, options);\n }\n}\n\n/** Numbers in the language of the page around `element`: \"4,6\" and \"1204\" on a Spanish page, \"4.6\" and \"1,204\" in English. */\nexport function numberFormat(element: Element, options: Intl.NumberFormatOptions = {}): Intl.NumberFormat {\n const locale = element.closest('[lang]')?.getAttribute('lang') || undefined;\n try {\n return new Intl.NumberFormat(locale, options);\n } catch {\n return new Intl.NumberFormat(undefined, options);\n }\n}\n\nexport const capitalize =(text: string) => text.charAt(0).toLocaleUpperCase() + text.slice(1);\n\n/** Options given as JSON text (data-mk-* attributes through autoInit) become values. */\nexport function fromJson<T>(value: T | string | undefined): T | undefined {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nexport const clampFirstDay =(n: unknown) => (Number.isInteger(n) && (n as number) >= 0 && (n as number) <= 6 ? (n as number) : 0);\n","import { gsap, registerMotion } from '../../core/gsap';\r\nimport { reduced } from '../../core/reduced';\r\nimport { createScope } from '../../core/scope';\r\nimport { inert, type Instance } from '../../core/types';\r\nimport {\r\n addDays, addMonths, capitalize, clampFirstDay, dayKey, monthWeeks, safeFormat, sameDay, sameMonth,\r\n fromJson, startOfWeek, toDate, toDateTime, weekDays, weekdayNames, type DateInput,\r\n} from '../../core/dates';\r\nimport { flowIn } from '../../motion/flow';\r\n\r\n/*\r\n * Calendar (Melon Mind, section-calendar-test): month and week grids with\r\n * event chips. Motion from the reference: on first load the day cells flow in\r\n * (search-result-item-in: y −20, blur 16, .5 s) 5 ms apart and the events\r\n * 20 ms apart (CalendarComponent eventsSet → flowChilds). Changing month or\r\n * week slides the grid like Melon Mind's time slots: out −30 px / in +30 px,\r\n * .25 s ease-out (schedulePicker.css view transitions); the old grid leaves\r\n * first (.12 s) so two dense months never overlap. Keyboard: an ARIA grid\r\n * with a roving day button.\r\n */\r\n\r\nexport type CalendarView = 'month' | 'week';\r\nexport type CalendarEventStatus = 'pending' | 'done' | 'cancelled';\r\n\r\nexport interface CalendarEvent {\r\n id: string | number;\r\n title: string;\r\n start: DateInput;\r\n end?: DateInput;\r\n allDay?: boolean;\r\n status?: CalendarEventStatus;\r\n /** Any CSS colour for the chip. */\r\n color?: string;\r\n}\r\n\r\nexport interface CalendarRange { start: Date; end: Date; view: CalendarView }\r\n\r\nexport interface CalendarLabels {\r\n more?: (count: number) => string;\r\n events?: (count: number) => string;\r\n status?: Partial<Record<CalendarEventStatus, string>>;\r\n}\r\n\r\nexport interface CalendarOptions {\r\n /** Date the calendar opens on. */\r\n date?: DateInput;\r\n view?: CalendarView;\r\n /** 0 = Sunday … 6 = Saturday. */\r\n firstDay?: number;\r\n locale?: string;\r\n events?: CalendarEvent[];\r\n /** Chips per day in the month view before \"+N\". */\r\n maxEvents?: number;\r\n selected?: DateInput | null;\r\n /** Override \"today\" (tests, demos in another zone). */\r\n today?: DateInput;\r\n labels?: CalendarLabels;\r\n onSelect?: (date: Date) => void;\r\n onEventClick?: (event: CalendarEvent) => void;\r\n onNavigate?: (range: CalendarRange) => void;\r\n}\r\n\r\nexport interface CalendarInstance extends Instance {\r\n next(): void;\r\n prev(): void;\r\n goToday(): void;\r\n setDate(date: DateInput): void;\r\n setView(view: CalendarView): void;\r\n setEvents(events: CalendarEvent[]): void;\r\n select(date: DateInput | null, notify?: boolean): void;\r\n readonly date: Date;\r\n readonly view: CalendarView;\r\n readonly selected: Date | null;\r\n readonly range: CalendarRange;\r\n}\r\n\r\nconst SLIDE = 30;\r\nconst SLIDE_OUT = 0.12;\r\nconst SLIDE_GAP = 0.1;\r\nconst SLIDE_DURATION = 0.25;\r\nconst CELL_STAGGER = 0.005;\r\nconst EVENT_STAGGER = 0.02;\r\n\r\nexport function createCalendar(root: HTMLElement | null, options: CalendarOptions = {}): CalendarInstance {\r\n const grid = root?.querySelector<HTMLElement>('[data-mk-calendar-grid]');\r\n if (!root || !grid) {\r\n const now = toDate(null);\r\n return inert({\r\n next() {}, prev() {}, goToday() {}, setDate() {}, setView() {}, setEvents() {}, select() {},\r\n date: now, view: 'month' as CalendarView, selected: null, range: { start: now, end: now, view: 'month' as CalendarView },\r\n });\r\n }\r\n registerMotion();\r\n const scope = createScope();\r\n const ctx = gsap.context(() => {});\r\n scope.add(() => ctx.revert());\r\n const locale = options.locale ?? 'es';\r\n const firstDay = clampFirstDay(options.firstDay);\r\n const maxEvents = Number.isFinite(options.maxEvents) ? Math.max(0, Math.floor(options.maxEvents!)) : 3;\r\n const labels = {\r\n more: options.labels?.more ?? ((n: number) => `+${n} más`),\r\n events: options.labels?.events ?? ((n: number) => (n === 1 ? '1 evento' : `${n} eventos`)),\r\n status: { pending: 'pendiente', done: 'completado', cancelled: 'cancelado', ...options.labels?.status },\r\n };\r\n let date = toDate(options.date);\r\n let view: CalendarView = options.view === 'week' ? 'week' : 'month';\r\n let selected: Date | null = options.selected ? toDate(options.selected) : null;\r\n let focusDay: Date = selected ?? date;\r\n let events: CalendarEvent[] = [];\r\n let byDay = new Map<string, CalendarEvent[]>();\r\n let first = true;\r\n const today = () => toDate(options.today ?? null);\r\n\r\n const title = root.querySelector<HTMLElement>('[data-mk-calendar-title]');\r\n const prevButton = root.querySelector<HTMLButtonElement>('[data-mk-calendar-prev]');\r\n const nextButton = root.querySelector<HTMLButtonElement>('[data-mk-calendar-next]');\r\n const todayButton = root.querySelector<HTMLButtonElement>('[data-mk-calendar-today]');\r\n const viewButtons = [...root.querySelectorAll<HTMLButtonElement>('[data-mk-calendar-view]')];\r\n\r\n const originalGrid = [...grid.childNodes];\r\n const originalTitle = title ? [...title.childNodes] : [];\r\n scope.add(() => {\r\n grid.replaceChildren(...originalGrid);\r\n title?.replaceChildren(...originalTitle);\r\n });\r\n scope.attr(root, 'data-mk-ready', '');\r\n scope.attr(grid, 'role', 'grid');\r\n if (title) {\r\n if (!title.id) scope.attr(title, 'id', `mk-calendar-${Math.random().toString(36).slice(2, 8)}`);\r\n scope.attr(grid, 'aria-labelledby', title.id);\r\n }\r\n\r\n const monthTitle = safeFormat(locale, { month: 'long', year: 'numeric' });\r\n const rangeTitle = safeFormat(locale, { day: 'numeric', month: 'short', year: 'numeric' });\r\n const fullDay = safeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' });\r\n const timeFormat = safeFormat(locale, { hour: 'numeric', minute: '2-digit' });\r\n\r\n const index = (list: CalendarEvent[]) => {\r\n events = Array.isArray(list) ? list.filter((e) => e && toDateTime(e.start)) : [];\r\n byDay = new Map();\r\n const sorted = [...events].sort((a, b) => toDateTime(a.start)!.getTime() - toDateTime(b.start)!.getTime());\r\n for (const event of sorted) {\r\n const start = toDate(toDateTime(event.start)!);\r\n const endTime = event.end ? toDateTime(event.end) : null;\r\n const end = endTime && endTime > start ? toDate(endTime) : start;\r\n // Multi-day events show on every day they cover (at most two months).\r\n for (let day = start, n = 0; day <= end && n < 62; day = addDays(day, 1), n++) {\r\n const key = dayKey(day);\r\n byDay.set(key, [...(byDay.get(key) ?? []), event]);\r\n }\r\n }\r\n };\r\n index(fromJson<CalendarEvent[]>(options.events) ?? []);\r\n\r\n const days = () => (view === 'week' ? [weekDays(date, firstDay)] : monthWeeks(date, firstDay));\r\n const range = (): CalendarRange => {\r\n const weeks = days();\r\n return { start: weeks[0][0], end: weeks[weeks.length - 1][6], view };\r\n };\r\n const inRange = (day: Date) => {\r\n const r = range();\r\n return day >= r.start && day <= r.end;\r\n };\r\n\r\n const header = () => {\r\n const row = document.createElement('div');\r\n row.className = 'mk-calendar__head';\r\n row.setAttribute('role', 'row');\r\n const long = weekdayNames(locale, firstDay, 'short');\r\n const narrow = weekdayNames(locale, firstDay, 'narrow');\r\n long.forEach((name, i) => {\r\n const cell = document.createElement('div');\r\n cell.className = 'mk-calendar__weekday';\r\n cell.setAttribute('role', 'columnheader');\r\n cell.innerHTML = '<span class=\"mk-calendar__weekday-long\"></span><span class=\"mk-calendar__weekday-narrow\" aria-hidden=\"true\"></span>';\r\n cell.firstElementChild!.textContent = name;\r\n cell.lastElementChild!.textContent = narrow[i];\r\n row.append(cell);\r\n });\r\n return row;\r\n };\r\n\r\n const chip = (event: CalendarEvent) => {\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\n button.className = 'mk-calendar__event';\r\n button.dataset.mkEvent = String(event.id);\r\n const status = event.status ?? 'pending';\r\n button.dataset.state = status;\r\n if (event.color) button.style.setProperty('--mk-calendar-event-color', event.color);\r\n const start = toDateTime(event.start)!;\r\n const time = event.allDay ? '' : timeFormat.format(start);\r\n button.innerHTML = '<span class=\"mk-calendar__status\" aria-hidden=\"true\"></span><span class=\"mk-calendar__event-title\"></span><span class=\"mk-calendar__event-time\"></span>';\r\n button.children[1].textContent = event.title;\r\n button.children[2].textContent = time;\r\n button.setAttribute('aria-label', [event.title, time, labels.status[status]].filter(Boolean).join(', '));\r\n return button;\r\n };\r\n\r\n const body = () => {\r\n const wrap = document.createElement('div');\r\n wrap.className = 'mk-calendar__body';\r\n wrap.dataset.view = view;\r\n wrap.setAttribute('role', 'rowgroup');\r\n const now = today();\r\n const focusKey = dayKey(focusDay);\r\n for (const week of days()) {\r\n const row = document.createElement('div');\r\n row.className = 'mk-calendar__week';\r\n row.setAttribute('role', 'row');\r\n for (const day of week) {\r\n const key = dayKey(day);\r\n const cell = document.createElement('div');\r\n cell.className = 'mk-calendar__day';\r\n cell.setAttribute('role', 'gridcell');\r\n cell.dataset.mkDate = key;\r\n if (view === 'month' && !sameMonth(day, date)) cell.dataset.outside = '';\r\n if (sameDay(day, now)) cell.dataset.today = '';\r\n const isSelected = sameDay(day, selected);\r\n cell.setAttribute('aria-selected', String(isSelected));\r\n const list = byDay.get(key) ?? [];\r\n const number = document.createElement('button');\r\n number.type = 'button';\r\n number.className = 'mk-calendar__number';\r\n number.dataset.mkDay = key;\r\n number.textContent = view === 'week' ? `${day.getDate()}` : String(day.getDate());\r\n number.tabIndex = key === focusKey ? 0 : -1;\r\n number.setAttribute('aria-label', `${capitalize(fullDay.format(day))}${list.length ? `, ${labels.events(list.length)}` : ''}`);\r\n if (sameDay(day, now)) number.setAttribute('aria-current', 'date');\r\n cell.append(number);\r\n if (list.length) {\r\n const box = document.createElement('div');\r\n box.className = 'mk-calendar__events';\r\n const shown = view === 'week' ? list : list.slice(0, maxEvents);\r\n for (const event of shown) box.append(chip(event));\r\n if (shown.length < list.length) {\r\n const more = document.createElement('button');\r\n more.type = 'button';\r\n more.className = 'mk-calendar__more';\r\n more.dataset.mkMore = key;\r\n more.textContent = labels.more(list.length - shown.length);\r\n box.append(more);\r\n }\r\n cell.append(box);\r\n }\r\n row.append(cell);\r\n }\r\n wrap.append(row);\r\n }\r\n return wrap;\r\n };\r\n\r\n let current: HTMLElement | null = null;\r\n const leaving = new Set<HTMLElement>();\r\n scope.add(() => leaving.forEach((el) => el.remove()));\r\n\r\n const syncChrome = () => {\r\n if (title) {\r\n const r = range();\r\n let text = capitalize(monthTitle.format(date));\r\n if (view === 'week') {\r\n const format = rangeTitle as Intl.DateTimeFormat & { formatRange?: (a: Date, b: Date) => string };\r\n text = format.formatRange ? format.formatRange(r.start, r.end) : `${rangeTitle.format(r.start)} – ${rangeTitle.format(r.end)}`;\r\n }\r\n title.textContent = text;\r\n }\r\n for (const button of viewButtons) {\r\n scope.attr(button, 'aria-pressed', String(button.dataset.mkCalendarView === view));\r\n }\r\n };\r\n\r\n const render = (direction: number) => {\r\n const next = body();\r\n const motion = !reduced();\r\n if (!current) {\r\n grid.replaceChildren(header(), next);\r\n } else if (motion && direction !== 0) {\r\n const old = current;\r\n old.style.top = `${old.offsetTop}px`;\r\n old.classList.add('mk-calendar__body--leaving');\r\n old.setAttribute('aria-hidden', 'true');\r\n old.querySelectorAll('button').forEach((b) => (b.tabIndex = -1));\r\n leaving.add(old);\r\n grid.append(next);\r\n ctx.add(() => {\r\n // Out, then in: two dense month grids crossfading read as noise.\r\n gsap.to(old, { x: -SLIDE * direction, opacity: 0, duration: SLIDE_OUT, ease: 'power1.in', onComplete: () => { old.remove(); leaving.delete(old); } });\r\n gsap.fromTo(next, { x: SLIDE * direction, opacity: 0 }, { x: 0, opacity: 1, duration: SLIDE_DURATION, delay: SLIDE_GAP, ease: 'power2.out', clearProps: 'transform,opacity' });\r\n });\r\n } else {\r\n current.replaceWith(next);\r\n }\r\n current = next;\r\n syncChrome();\r\n if (motion) {\r\n ctx.add(() => {\r\n if (first) flowIn(next, { target: '.mk-calendar__day', stagger: CELL_STAGGER });\r\n flowIn(next, { target: '.mk-calendar__event, .mk-calendar__more', stagger: EVENT_STAGGER, delay: first ? 0.1 : direction ? SLIDE_GAP + SLIDE_DURATION * 0.5 : 0 });\r\n });\r\n }\r\n first = false;\r\n };\r\n\r\n const focusButton = () => grid.querySelector<HTMLButtonElement>(`.mk-calendar__body:not(.mk-calendar__body--leaving) [data-mk-day=\"${dayKey(focusDay)}\"]`);\r\n const navigate = (to: Date, focus = false) => {\r\n if (scope.disposed) return;\r\n const from = date;\r\n const moved = view === 'week' ? !sameDay(startOfWeek(to, firstDay), startOfWeek(from, firstDay)) : !sameMonth(to, from);\r\n date = to;\r\n focusDay = to;\r\n if (moved) {\r\n render(to > from ? 1 : -1);\r\n const r = range();\r\n options.onNavigate?.(r);\r\n root.dispatchEvent(new CustomEvent('mk:navigate', { bubbles: true, detail: r }));\r\n } else {\r\n grid.querySelectorAll<HTMLButtonElement>('[data-mk-day]').forEach((b) => (b.tabIndex = b.dataset.mkDay === dayKey(to) ? 0 : -1));\r\n }\r\n if (focus) focusButton()?.focus();\r\n };\r\n\r\n const select = (value: DateInput | null, notify = true) => {\r\n if (scope.disposed) return;\r\n selected = value === null ? null : toDate(value);\r\n grid.querySelectorAll<HTMLElement>('.mk-calendar__day').forEach((cell) => cell.setAttribute('aria-selected', String(!!selected && cell.dataset.mkDate === dayKey(selected))));\r\n if (selected && notify) {\r\n options.onSelect?.(selected);\r\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { date: selected, key: dayKey(selected) } }));\r\n }\r\n };\r\n\r\n scope.on(root, 'click', (e) => {\r\n const target = (e.target as Element).closest<HTMLElement>('button');\r\n if (!target || !root.contains(target) || (target as HTMLButtonElement).disabled) return;\r\n if (target === prevButton) navigate(view === 'week' ? addDays(date, -7) : addMonths(date, -1));\r\n else if (target === nextButton) navigate(view === 'week' ? addDays(date, 7) : addMonths(date, 1));\r\n else if (target === todayButton) navigate(today(), true);\r\n else if (target.dataset.mkCalendarView) setView(target.dataset.mkCalendarView as CalendarView);\r\n else if (target.dataset.mkEvent !== undefined) {\r\n const event = events.find((ev) => String(ev.id) === target.dataset.mkEvent);\r\n if (event) {\r\n options.onEventClick?.(event);\r\n root.dispatchEvent(new CustomEvent('mk:event', { bubbles: true, detail: { event } }));\r\n }\r\n } else if (target.dataset.mkDay || target.dataset.mkMore) {\r\n const day = toDate(target.dataset.mkDay ?? target.dataset.mkMore);\r\n focusDay = day;\r\n grid.querySelectorAll<HTMLButtonElement>('[data-mk-day]').forEach((b) => (b.tabIndex = b.dataset.mkDay === dayKey(day) ? 0 : -1));\r\n select(day);\r\n }\r\n });\r\n\r\n scope.on(grid, 'keydown', (e) => {\r\n const event = e as KeyboardEvent;\r\n const target = event.target as HTMLElement;\r\n if (!target.dataset?.mkDay) return;\r\n const day = toDate(target.dataset.mkDay);\r\n const map: Record<string, () => Date> = {\r\n ArrowLeft: () => addDays(day, -1),\r\n ArrowRight: () => addDays(day, 1),\r\n ArrowUp: () => addDays(day, -7),\r\n ArrowDown: () => addDays(day, 7),\r\n Home: () => startOfWeek(day, firstDay),\r\n End: () => addDays(startOfWeek(day, firstDay), 6),\r\n PageUp: () => addMonths(day, event.shiftKey ? -12 : -1),\r\n PageDown: () => addMonths(day, event.shiftKey ? 12 : 1),\r\n };\r\n const to = map[event.key]?.();\r\n if (!to) return;\r\n event.preventDefault();\r\n if (!event.key.startsWith('Page') && inRange(to)) {\r\n focusDay = to;\r\n grid.querySelectorAll<HTMLButtonElement>('[data-mk-day]').forEach((b) => (b.tabIndex = b.dataset.mkDay === dayKey(to) ? 0 : -1));\r\n focusButton()?.focus();\r\n } else navigate(to, true);\r\n });\r\n\r\n const setView = (next: CalendarView) => {\r\n if (scope.disposed || (next !== 'month' && next !== 'week') || next === view) return;\r\n view = next;\r\n date = focusDay;\r\n render(0);\r\n const r = range();\r\n options.onNavigate?.(r);\r\n root.dispatchEvent(new CustomEvent('mk:navigate', { bubbles: true, detail: r }));\r\n };\r\n\r\n render(0);\r\n\r\n return {\r\n next: () => navigate(view === 'week' ? addDays(date, 7) : addMonths(date, 1)),\r\n prev: () => navigate(view === 'week' ? addDays(date, -7) : addMonths(date, -1)),\r\n goToday: () => navigate(today()),\r\n setDate: (value) => navigate(toDate(value, date)),\r\n setView,\r\n setEvents(list) {\r\n if (scope.disposed) return;\r\n const hadFocus = grid.contains(document.activeElement);\r\n index(fromJson<CalendarEvent[]>(list) ?? []);\r\n const fresh = body();\r\n current?.replaceWith(fresh);\r\n current = fresh;\r\n if (hadFocus) focusButton()?.focus();\r\n },\r\n select,\r\n get date() { return date; },\r\n get view() { return view; },\r\n get selected() { return selected; },\r\n get range() { return range(); },\r\n destroy: () => scope.dispose(),\r\n };\r\n}\r\n","import { CustomEase, gsap, registerMotion } from '../../core/gsap';\r\nimport { reduced } from '../../core/reduced';\r\nimport { createScope } from '../../core/scope';\r\nimport { inert, type Instance } from '../../core/types';\r\nimport {\r\n addDays, addMonths, capitalize, clampFirstDay, dayKey, monthWeeks, safeFormat, sameDay, sameMonth,\r\n fromJson, startOfWeek, toDate, weekdayNames, type DateInput,\r\n} from '../../core/dates';\r\nimport { flowIn } from '../../motion/flow';\r\n\r\n/*\r\n * Slot picker (Melon Mind \"Agendar cita\"): a compact month on one side and the\r\n * day's times on the other. From the reference: changing day slides the times\r\n * out −30 px and the new ones in from +30 px, .25 s ease-out (view transition\r\n * \"time-slot\", schedulePicker.css); the first list grows in (scale .7, blur 32,\r\n * .3 s cubic-bezier(.38,.49,0,1.1)); the day heading opens 0 → 56 px in .5 s\r\n * cubic-bezier(.38,.49,0,1.4) and a picked time lights up in .7 s\r\n * (animation-highlight-1). Month changes slide the days the same way.\r\n */\r\n\r\nexport type SlotSource = string[] | Record<string, string[]> | ((date: Date) => string[] | Promise<string[]>);\r\n\r\nexport interface SlotValue { date: Date; time: string; key: string; value: string }\r\n\r\nexport interface SlotPickerLabels {\r\n placeholder?: string;\r\n empty?: string;\r\n loading?: string;\r\n heading?: (date: Date) => string;\r\n}\r\n\r\nexport interface SlotPickerOptions {\r\n /** Month shown first (and the selected day when `value` is not given). */\r\n date?: DateInput;\r\n /** Initial value: \"2026-10-23T10:30\" or { date, time }. */\r\n value?: string | { date: DateInput; time: string } | null;\r\n slots?: SlotSource;\r\n min?: DateInput;\r\n max?: DateInput;\r\n /** Weekdays never available (0 = Sunday). */\r\n closedDays?: number[];\r\n isDisabled?: (date: Date) => boolean;\r\n firstDay?: number;\r\n locale?: string;\r\n labels?: SlotPickerLabels;\r\n onChange?: (value: SlotValue) => void;\r\n onDateChange?: (date: Date) => void;\r\n}\r\n\r\nexport interface SlotPickerInstance extends Instance {\r\n selectDate(date: DateInput): void;\r\n selectTime(time: string | null): void;\r\n setSlots(slots: SlotSource): void;\r\n readonly date: Date | null;\r\n readonly time: string | null;\r\n readonly value: string | null;\r\n}\r\n\r\nconst SLIDE = 30;\r\nconst SLIDE_DURATION = 0.25;\r\nlet slotEaseReady = false;\r\n\r\nexport function createSlotPicker(root: HTMLElement | null, options: SlotPickerOptions = {}): SlotPickerInstance {\r\n const daysHost = root?.querySelector<HTMLElement>('[data-mk-slot-days]');\r\n const timesHost = root?.querySelector<HTMLElement>('[data-mk-slot-times]');\r\n if (!root || !daysHost || !timesHost) {\r\n return inert({ selectDate() {}, selectTime() {}, setSlots() {}, date: null, time: null, value: null });\r\n }\r\n registerMotion();\r\n if (!slotEaseReady && typeof window !== 'undefined') {\r\n CustomEase.create('mk-slot-in', '.38,.49,0,1.1');\r\n slotEaseReady = true;\r\n }\r\n const scope = createScope();\r\n const ctx = gsap.context(() => {});\r\n scope.add(() => ctx.revert());\r\n const locale = options.locale ?? 'es';\r\n const firstDay = clampFirstDay(options.firstDay);\r\n const labels = {\r\n placeholder: options.labels?.placeholder ?? 'Elige un día para ver los horarios.',\r\n empty: options.labels?.empty ?? 'No hay horarios este día.',\r\n loading: options.labels?.loading ?? 'Cargando horarios…',\r\n heading: options.labels?.heading ?? ((d: Date) => capitalize(safeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long' }).format(d))),\r\n };\r\n const min = options.min !== undefined ? toDate(options.min) : null;\r\n const max = options.max !== undefined ? toDate(options.max) : null;\r\n const closedList = fromJson<number[]>(options.closedDays);\r\n const closed = new Set((Array.isArray(closedList) ? closedList : []).filter((n) => Number.isInteger(n)));\r\n let slots: SlotSource = fromJson<SlotSource>(options.slots) ?? [];\r\n\r\n const initial = (() => {\r\n const v = options.value;\r\n if (typeof v === 'string') {\r\n const match = /^(\\d{4}-\\d{2}-\\d{2})(?:T(\\d{1,2}:\\d{2}))?/.exec(v);\r\n return match ? { date: toDate(match[1]), time: match[2] ?? null } : null;\r\n }\r\n return v ? { date: toDate(v.date), time: v.time ?? null } : null;\r\n })();\r\n let month = initial?.date ?? toDate(options.date);\r\n let date: Date | null = initial?.date ?? (options.date !== undefined ? toDate(options.date) : null);\r\n let time: string | null = initial?.time ?? null;\r\n let focusDay = date ?? month;\r\n let times: string[] = [];\r\n let request = 0;\r\n\r\n const title = root.querySelector<HTMLElement>('[data-mk-slot-title]');\r\n const heading = root.querySelector<HTMLElement>('[data-mk-slot-heading]');\r\n const prev = root.querySelector<HTMLButtonElement>('[data-mk-slot-prev]');\r\n const next = root.querySelector<HTMLButtonElement>('[data-mk-slot-next]');\r\n const output = root.querySelector<HTMLInputElement>('[data-mk-slot-value]');\r\n const originals = [daysHost, timesHost, title, heading].filter(Boolean).map((el) => [el!, [...el!.childNodes]] as const);\r\n scope.add(() => originals.forEach(([el, nodes]) => el.replaceChildren(...nodes)));\r\n if (output) {\r\n const before = output.value;\r\n scope.add(() => { output.value = before; });\r\n }\r\n scope.attr(root, 'data-mk-ready', '');\r\n scope.attr(daysHost, 'role', 'grid');\r\n scope.attr(timesHost, 'role', 'radiogroup');\r\n if (heading) {\r\n if (!heading.id) scope.attr(heading, 'id', `mk-slot-${Math.random().toString(36).slice(2, 8)}`);\r\n scope.attr(timesHost, 'aria-labelledby', heading.id);\r\n }\r\n if (title) {\r\n if (!title.id) scope.attr(title, 'id', `mk-slot-month-${Math.random().toString(36).slice(2, 8)}`);\r\n scope.attr(daysHost, 'aria-labelledby', title.id);\r\n }\r\n\r\n const monthTitle = safeFormat(locale, { month: 'long', year: 'numeric' });\r\n const fullDay = safeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' });\r\n const disabled = (d: Date) => (min && d < min) || (max && d > max) || closed.has(d.getDay()) || !!options.isDisabled?.(d);\r\n\r\n /* ── Days ───────────────────────────────────────────── */\r\n let daysBody: HTMLElement | null = null;\r\n const leaving = new Set<HTMLElement>();\r\n scope.add(() => leaving.forEach((el) => el.remove()));\r\n const buildDays = () => {\r\n const wrap = document.createElement('div');\r\n wrap.className = 'mk-slot-picker__days';\r\n wrap.setAttribute('role', 'rowgroup');\r\n const head = document.createElement('div');\r\n head.className = 'mk-slot-picker__weekdays';\r\n head.setAttribute('role', 'row');\r\n for (const name of weekdayNames(locale, firstDay, 'short')) {\r\n const cell = document.createElement('span');\r\n cell.setAttribute('role', 'columnheader');\r\n cell.textContent = name.slice(0, 2);\r\n head.append(cell);\r\n }\r\n wrap.append(head);\r\n const focusKey = dayKey(focusDay);\r\n for (const week of monthWeeks(month, firstDay)) {\r\n const row = document.createElement('div');\r\n row.className = 'mk-slot-picker__week';\r\n row.setAttribute('role', 'row');\r\n for (const d of week) {\r\n const cell = document.createElement('span');\r\n cell.setAttribute('role', 'gridcell');\r\n if (!sameMonth(d, month)) {\r\n row.append(cell);\r\n continue;\r\n }\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\n button.className = 'mk-slot-picker__day';\r\n button.dataset.mkSlotDay = dayKey(d);\r\n button.textContent = String(d.getDate());\r\n button.tabIndex = dayKey(d) === focusKey ? 0 : -1;\r\n button.setAttribute('aria-label', capitalize(fullDay.format(d)));\r\n if (disabled(d)) button.disabled = true;\r\n if (sameDay(d, new Date())) button.setAttribute('aria-current', 'date');\r\n cell.setAttribute('aria-selected', String(sameDay(d, date)));\r\n cell.append(button);\r\n row.append(cell);\r\n }\r\n wrap.append(row);\r\n }\r\n return wrap;\r\n };\r\n const renderDays = (direction: number) => {\r\n const fresh = buildDays();\r\n if (title) title.textContent = capitalize(monthTitle.format(month));\r\n // No earlier month when its last day is before `min`; no later one when its first day is after `max`.\r\n if (prev) scope.attr(prev, 'disabled', min && new Date(month.getFullYear(), month.getMonth(), 0) < min ? '' : null);\r\n if (next) scope.attr(next, 'disabled', max && new Date(month.getFullYear(), month.getMonth() + 1, 1) > max ? '' : null);\r\n if (daysBody && direction && !reduced()) {\r\n const old = daysBody;\r\n old.style.top = `${old.offsetTop}px`;\r\n old.classList.add('mk-slot-picker__leaving');\r\n old.setAttribute('aria-hidden', 'true');\r\n leaving.add(old);\r\n daysHost.append(fresh);\r\n ctx.add(() => {\r\n gsap.to(old, { x: -SLIDE * direction, opacity: 0, duration: SLIDE_DURATION, ease: 'power1.out', onComplete: () => { old.remove(); leaving.delete(old); } });\r\n gsap.fromTo(fresh, { x: SLIDE * direction, opacity: 0 }, { x: 0, opacity: 1, duration: SLIDE_DURATION, ease: 'power1.out', clearProps: 'transform,opacity' });\r\n });\r\n } else if (daysBody) daysBody.replaceWith(fresh);\r\n else daysHost.replaceChildren(fresh);\r\n daysBody = fresh;\r\n };\r\n const dayButton = (d: Date) => daysHost.querySelector<HTMLButtonElement>(`.mk-slot-picker__days:not(.mk-slot-picker__leaving) [data-mk-slot-day=\"${dayKey(d)}\"]`);\r\n const moveFocus = (to: Date, focus: boolean) => {\r\n focusDay = to;\r\n if (!sameMonth(to, month)) {\r\n const direction = to > month ? 1 : -1;\r\n month = to;\r\n renderDays(direction);\r\n } else daysHost.querySelectorAll<HTMLButtonElement>('[data-mk-slot-day]').forEach((b) => (b.tabIndex = b.dataset.mkSlotDay === dayKey(to) ? 0 : -1));\r\n if (focus) dayButton(to)?.focus();\r\n };\r\n\r\n /* ── Times ──────────────────────────────────────────── */\r\n let timesBody: HTMLElement | null = null;\r\n let firstList = true;\r\n const buildTimes = (state: 'placeholder' | 'loading' | 'ready') => {\r\n const wrap = document.createElement('div');\r\n wrap.className = 'mk-slot-picker__list';\r\n if (state !== 'ready' || !times.length) {\r\n const note = document.createElement('p');\r\n note.className = 'mk-slot-picker__note';\r\n note.textContent = state === 'placeholder' ? labels.placeholder : state === 'loading' ? labels.loading : labels.empty;\r\n wrap.append(note);\r\n return wrap;\r\n }\r\n const focusTime = time && times.includes(time) ? time : times[0];\r\n for (const t of times) {\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\n button.className = 'mk-slot-picker__time';\r\n button.setAttribute('role', 'radio');\r\n button.dataset.mkSlotTime = t;\r\n button.textContent = t;\r\n button.setAttribute('aria-checked', String(t === time));\r\n button.tabIndex = t === focusTime ? 0 : -1;\r\n wrap.append(button);\r\n }\r\n return wrap;\r\n };\r\n const renderTimes = (state: 'placeholder' | 'loading' | 'ready', direction: number) => {\r\n const fresh = buildTimes(state);\r\n scope.attr(timesHost, 'aria-busy', state === 'loading' ? 'true' : null);\r\n const motion = !reduced();\r\n if (timesBody && direction && motion) {\r\n const old = timesBody;\r\n old.style.top = `${old.offsetTop}px`;\r\n old.classList.add('mk-slot-picker__leaving');\r\n old.setAttribute('aria-hidden', 'true');\r\n old.querySelectorAll('button').forEach((b) => (b.tabIndex = -1));\r\n leaving.add(old);\r\n timesHost.append(fresh);\r\n ctx.add(() => {\r\n gsap.to(old, { x: -SLIDE * direction, opacity: 0, duration: SLIDE_DURATION, ease: 'power1.out', onComplete: () => { old.remove(); leaving.delete(old); } });\r\n gsap.fromTo(fresh, { x: SLIDE * direction, opacity: 0 }, { x: 0, opacity: 1, duration: SLIDE_DURATION, ease: 'power1.out', clearProps: 'transform,opacity' });\r\n });\r\n } else if (timesBody) timesBody.replaceWith(fresh);\r\n else timesHost.replaceChildren(fresh);\r\n timesBody = fresh;\r\n if (state === 'ready' && times.length && motion && firstList) {\r\n firstList = false;\r\n ctx.add(() => flowIn(fresh, { target: '.mk-slot-picker__time', style: 2, startScale: 0.7, blur: 32, duration: 0.3, stagger: 0.02, ease: 'mk-slot-in' }));\r\n }\r\n };\r\n const resolve = (d: Date): string[] | Promise<string[]> => {\r\n const source = slots;\r\n if (Array.isArray(source)) return source;\r\n if (typeof source === 'function') return source(d);\r\n return source?.[dayKey(d)] ?? [];\r\n };\r\n const clean = (list: unknown) => (Array.isArray(list) ? [...new Set(list.filter((t): t is string => typeof t === 'string' && /^\\d{1,2}:\\d{2}$/.test(t)))] : []);\r\n const load = (direction: number) => {\r\n if (!date) {\r\n times = [];\r\n renderTimes('placeholder', 0);\r\n return;\r\n }\r\n const mine = ++request;\r\n let result: string[] | Promise<string[]>;\r\n try {\r\n result = resolve(date);\r\n } catch {\r\n result = [];\r\n }\r\n if (result && typeof (result as Promise<string[]>).then === 'function') {\r\n renderTimes('loading', direction);\r\n (result as Promise<string[]>).then(\r\n (list) => { if (mine === request && !scope.disposed) { times = clean(list); renderTimes('ready', 0); } },\r\n () => { if (mine === request && !scope.disposed) { times = []; renderTimes('ready', 0); } },\r\n );\r\n } else {\r\n times = clean(result);\r\n if (time && !times.includes(time)) time = null;\r\n renderTimes('ready', direction);\r\n }\r\n };\r\n\r\n const syncHeading = () => {\r\n if (!heading) return;\r\n if (date) {\r\n heading.textContent = labels.heading(date);\r\n if (!heading.hasAttribute('data-mk-shown')) scope.attr(heading, 'data-mk-shown', '');\r\n }\r\n };\r\n const emit = () => {\r\n const key = date ? dayKey(date) : '';\r\n const value = date && time ? `${key}T${time}` : null;\r\n if (output) {\r\n output.value = value ?? '';\r\n output.dispatchEvent(new Event('input', { bubbles: true }));\r\n output.dispatchEvent(new Event('change', { bubbles: true }));\r\n }\r\n if (date && time && value) {\r\n const detail: SlotValue = { date, time, key, value };\r\n options.onChange?.(detail);\r\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail }));\r\n }\r\n };\r\n\r\n const selectDate = (input: DateInput, notify = true) => {\r\n if (scope.disposed) return;\r\n const d = toDate(input);\r\n if (disabled(d)) return;\r\n const direction = date ? Math.sign(d.getTime() - date.getTime()) : 0;\r\n if (sameDay(d, date)) return;\r\n date = d;\r\n time = null;\r\n focusDay = d;\r\n if (!sameMonth(d, month)) {\r\n const dir = d > month ? 1 : -1;\r\n month = d;\r\n renderDays(dir);\r\n }\r\n daysHost.querySelectorAll<HTMLElement>('[role=\"gridcell\"]').forEach((cell) => {\r\n const b = cell.querySelector<HTMLButtonElement>('[data-mk-slot-day]');\r\n if (b) {\r\n cell.setAttribute('aria-selected', String(b.dataset.mkSlotDay === dayKey(d)));\r\n b.tabIndex = b.dataset.mkSlotDay === dayKey(d) ? 0 : -1;\r\n }\r\n });\r\n syncHeading();\r\n load(direction);\r\n if (notify) {\r\n options.onDateChange?.(d);\r\n emit();\r\n }\r\n };\r\n const selectTime = (t: string | null, notify = true) => {\r\n if (scope.disposed || !date) return;\r\n if (t !== null && !times.includes(t)) return;\r\n time = t;\r\n timesHost.querySelectorAll<HTMLButtonElement>('[data-mk-slot-time]').forEach((b) => {\r\n b.setAttribute('aria-checked', String(b.dataset.mkSlotTime === t));\r\n b.tabIndex = (t ? b.dataset.mkSlotTime === t : b === timesHost.querySelector('[data-mk-slot-time]')) ? 0 : -1;\r\n });\r\n if (notify) emit();\r\n };\r\n\r\n scope.on(root, 'click', (e) => {\r\n const target = (e.target as Element).closest<HTMLButtonElement>('button');\r\n if (!target || target.disabled || !root.contains(target)) return;\r\n if (target === prev) moveFocus(addMonths(month, -1), false);\r\n else if (target === next) moveFocus(addMonths(month, 1), false);\r\n else if (target.dataset.mkSlotDay) selectDate(target.dataset.mkSlotDay);\r\n else if (target.dataset.mkSlotTime) selectTime(target.dataset.mkSlotTime);\r\n });\r\n scope.on(daysHost, 'keydown', (e) => {\r\n const event = e as KeyboardEvent;\r\n const key = (event.target as HTMLElement).dataset?.mkSlotDay;\r\n if (!key) return;\r\n const d = toDate(key);\r\n const to = ({\r\n ArrowLeft: () => addDays(d, -1), ArrowRight: () => addDays(d, 1), ArrowUp: () => addDays(d, -7), ArrowDown: () => addDays(d, 7),\r\n Home: () => startOfWeek(d, firstDay), End: () => addDays(startOfWeek(d, firstDay), 6),\r\n PageUp: () => addMonths(d, -1), PageDown: () => addMonths(d, 1),\r\n } as Record<string, () => Date>)[event.key]?.();\r\n if (!to) return;\r\n event.preventDefault();\r\n moveFocus(to, true);\r\n });\r\n scope.on(timesHost, 'keydown', (e) => {\r\n const event = e as KeyboardEvent;\r\n const current = (event.target as HTMLElement).dataset?.mkSlotTime;\r\n if (!current) return;\r\n const i = times.indexOf(current);\r\n const to = ({ ArrowRight: i + 1, ArrowDown: i + 1, ArrowLeft: i - 1, ArrowUp: i - 1, Home: 0, End: times.length - 1 } as Record<string, number>)[event.key];\r\n if (to === undefined) return;\r\n event.preventDefault();\r\n const t = times[(to + times.length) % times.length];\r\n selectTime(t);\r\n timesHost.querySelector<HTMLButtonElement>(`[data-mk-slot-time=\"${t}\"]`)?.focus();\r\n });\r\n\r\n renderDays(0);\r\n if (date) {\r\n syncHeading();\r\n load(0);\r\n if (time && !times.includes(time)) time = null;\r\n } else renderTimes('placeholder', 0);\r\n\r\n return {\r\n selectDate: (d) => selectDate(d),\r\n selectTime: (t) => selectTime(t),\r\n setSlots(source) {\r\n if (scope.disposed) return;\r\n slots = fromJson<SlotSource>(source) ?? [];\r\n load(0);\r\n },\r\n get date() { return date; },\r\n get time() { return time; },\r\n get value() { return date && time ? `${dayKey(date)}T${time}` : null; },\r\n destroy: () => scope.dispose(),\r\n };\r\n}\r\n","import { gsap, EASE, registerMotion } from '../core/gsap';\r\nimport { reduced } from '../core/reduced';\r\n\r\n/*\r\n * Melonmind microinteractions (sources/app/css/ui-elements/animations.css,\r\n * button.css, popover.css) on GSAP, shared by the components:\r\n * - press: buttonClickAnimation, scale .95 × .9 and back in 500 ms (click curve).\r\n * - blurIn: search-result-item-in (blur 16, y −20, 500 ms, 50 ms apart),\r\n * animation-general-in-2 (pop: blur 32, scale .7, 300 ms) or general-in (soft).\r\n * - blurOut: item-out / -left / -bottom (blur 16, 500 ms).\r\n * - collapse: a removed row folds (height 0, blur 16, 250 ms).\r\n * - shake: the error shake (±4 px, 500 ms).\r\n * - ringPulse: animation-highlight-2 (inset ring 0 → 4 px → 0 in 1 s).\r\n * - burst: particles flying out of a control (like, rating, confirm).\r\n * - rollDigits: Melonmind's RollingNumber, changed characters roll in their direction.\r\n * Every helper returns its animation, or null under reduced motion (final state at once).\r\n */\r\n\r\ntype Targets = Element | Element[] | NodeListOf<Element> | null | undefined;\r\n\r\nconst list = (targets: Targets) => (!targets ? [] : targets instanceof Element ? [targets] : [...targets]);\r\nconst live = () => {\r\n registerMotion();\r\n return !reduced();\r\n};\r\n\r\n/** Press bounce (Melonmind buttonClickAnimation). */\r\nexport function press(el: Element | null | undefined) {\r\n if (!el || !live()) return null;\r\n gsap.killTweensOf(el, 'scaleX,scaleY');\r\n return gsap\r\n .timeline({\r\n onComplete: () => {\r\n gsap.set(el, { clearProps: 'scale,transform' });\r\n },\r\n })\r\n .to(el, { scaleX: 0.95, scaleY: 0.9, duration: 0.1, ease: 'power2.out' })\r\n .to(el, { scaleX: 1, scaleY: 1, duration: 0.5, ease: EASE.click });\r\n}\r\n\r\nexport interface BlurInOptions {\r\n /** rise: list item (y −20, blur 16); pop: surface (scale .7, blur 32); soft: scale .96, blur 16. */\r\n from?: 'rise' | 'pop' | 'soft';\r\n stagger?: number;\r\n delay?: number;\r\n duration?: number;\r\n}\r\n\r\nexport function blurIn(targets: Targets, { from = 'rise', stagger = 0.05, delay = 0, duration }: BlurInOptions = {}) {\r\n const items = list(targets);\r\n if (!items.length || !live()) return null;\r\n const start =\r\n from === 'pop' ? { opacity: 0, scale: 0.7, filter: 'blur(32px)' } : from === 'soft' ? { opacity: 0, scale: 0.96, filter: 'blur(16px)' } : { opacity: 0, y: -20, filter: 'blur(16px)' };\r\n return gsap.fromTo(items, start, {\r\n opacity: 1,\r\n y: 0,\r\n scale: 1,\r\n filter: 'blur(0px)',\r\n duration: duration ?? (from === 'pop' ? 0.3 : 0.5),\r\n ease: from === 'pop' ? EASE.pop : 'power2.out',\r\n stagger,\r\n delay,\r\n clearProps: 'opacity,transform,filter',\r\n });\r\n}\r\n\r\nexport function blurOut(targets: Targets, { to = 'up', onComplete }: { to?: 'up' | 'left' | 'down'; onComplete?: () => void } = {}) {\r\n const items = list(targets);\r\n if (!items.length) return null;\r\n if (!live()) {\r\n onComplete?.();\r\n return null;\r\n }\r\n const end = to === 'left' ? { x: -64 } : to === 'down' ? { y: 24 } : { y: -20 };\r\n return gsap.to(items, { ...end, opacity: 0, filter: 'blur(16px)', duration: 0.5, ease: 'power2.out', onComplete });\r\n}\r\n\r\n/** Fold an element away (Melonmind today-appt-item-out). */\r\nexport function collapse(el: HTMLElement | null | undefined, { onComplete }: { onComplete?: () => void } = {}) {\r\n if (!el) return null;\r\n if (!live()) {\r\n onComplete?.();\r\n return null;\r\n }\r\n return gsap.to(el, {\r\n height: 0,\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n marginTop: 0,\r\n marginBottom: 0,\r\n opacity: 0,\r\n filter: 'blur(16px)',\r\n overflow: 'hidden',\r\n duration: 0.25,\r\n ease: 'power2.in',\r\n onComplete,\r\n });\r\n}\r\n\r\n/** The error shake. */\r\nexport function shake(el: Element | null | undefined, distance = 4) {\r\n if (!el || !live()) return null;\r\n gsap.killTweensOf(el, 'x');\r\n return gsap.to(el, {\r\n keyframes: { x: [0, -distance, distance, -distance, 0] },\r\n duration: 0.5,\r\n ease: EASE.shake,\r\n clearProps: 'x,transform',\r\n });\r\n}\r\n\r\n/** An inset ring that swells and fades (Melonmind animation-highlight-2). */\r\nexport function ringPulse(el: HTMLElement | null | undefined, color = 'var(--mk-accent-soft)') {\r\n if (!el || !live()) return null;\r\n const before = { color: el.style.outlineColor, style: el.style.outlineStyle, offset: el.style.outlineOffset };\r\n el.style.outlineColor = color;\r\n el.style.outlineStyle = 'solid';\r\n el.style.outlineOffset = '-4px';\r\n const restore = () => {\r\n el.style.outlineColor = before.color;\r\n el.style.outlineStyle = before.style;\r\n el.style.outlineOffset = before.offset;\r\n el.style.removeProperty('outline-width');\r\n if (el.getAttribute('style') === '') el.removeAttribute('style');\r\n };\r\n return gsap.fromTo(el, { outlineWidth: 0 }, { keyframes: { outlineWidth: [0, 4, 0] }, duration: 1, ease: 'power1.inOut', onComplete: restore, onInterrupt: restore });\r\n}\r\n\r\nexport interface BurstOptions {\r\n count?: number;\r\n distance?: number;\r\n /** CSS colours, used in turn. */\r\n colors?: string[];\r\n /** An expanding ring behind the particles. */\r\n ring?: boolean;\r\n size?: number;\r\n}\r\n\r\n/** Particles flying out of the centre of `origin` (like, rating, confirm). Removed when done. */\r\nexport function burst(origin: HTMLElement | null | undefined, { count = 7, distance = 28, colors = ['var(--mk-accent)'], ring = true, size = 6 }: BurstOptions = {}) {\r\n if (!origin || !live()) return null;\r\n const layer = document.createElement('span');\r\n layer.setAttribute('aria-hidden', 'true');\r\n layer.dataset.mkBurst = '';\r\n Object.assign(layer.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'visible', display: 'grid', placeItems: 'center' });\r\n const positioned = getComputedStyle(origin).position !== 'static';\r\n const previousPosition = origin.style.position;\r\n if (!positioned) origin.style.position = 'relative';\r\n origin.append(layer);\r\n const cleanup = () => {\r\n layer.remove();\r\n if (!positioned) origin.style.position = previousPosition;\r\n if (origin.getAttribute('style') === '') origin.removeAttribute('style');\r\n };\r\n const timeline = gsap.timeline({ onComplete: cleanup, onInterrupt: cleanup });\r\n if (ring) {\r\n const circle = document.createElement('span');\r\n Object.assign(circle.style, { position: 'absolute', width: '100%', aspectRatio: '1', borderRadius: '50%', border: `2px solid ${colors[0]}` });\r\n layer.append(circle);\r\n timeline.fromTo(circle, { scale: 0.3, opacity: 0.9 }, { scale: 1.6, opacity: 0, duration: 0.5, ease: 'power2.out' }, 0);\r\n }\r\n for (let i = 0; i < count; i++) {\r\n const angle = (i / count) * Math.PI * 2 - Math.PI / 2;\r\n for (const [k, scale] of [[0, 1], [1, 0.6]] as const) {\r\n const dot = document.createElement('span');\r\n Object.assign(dot.style, {\r\n position: 'absolute',\r\n width: `${size * scale}px`,\r\n height: `${size * scale}px`,\r\n borderRadius: '50%',\r\n background: colors[(i + k) % colors.length],\r\n });\r\n layer.append(dot);\r\n const reach = distance * (k ? 0.72 : 1);\r\n const turn = k ? 0.32 : 0;\r\n timeline.fromTo(\r\n dot,\r\n { x: 0, y: 0, scale: 0, opacity: 1 },\r\n { x: Math.cos(angle + turn) * reach, y: Math.sin(angle + turn) * reach, scale: 1, duration: 0.45, ease: 'power3.out' },\r\n 0.05,\r\n );\r\n timeline.to(dot, { scale: 0, opacity: 0, duration: 0.3, ease: 'power2.in' }, 0.38);\r\n }\r\n }\r\n return timeline;\r\n}\r\n\r\nconst rolling = new WeakMap<HTMLElement, gsap.core.Timeline>();\r\n\r\n/**\r\n * Write `text` into `el`, rolling the characters that changed (up when the value\r\n * grew, down when it shrank). Unchanged characters stay; the final DOM is plain text.\r\n */\r\nexport function rollDigits(el: HTMLElement | null | undefined, text: string, direction: 1 | -1 = 1, duration = 0.5) {\r\n if (!el) return null;\r\n rolling.get(el)?.progress(1).kill();\r\n rolling.delete(el);\r\n const previous = el.textContent ?? '';\r\n if (previous === text || !live()) {\r\n el.textContent = text;\r\n return null;\r\n }\r\n // Right-aligned comparison: digits keep their place value.\r\n const width = Math.max(previous.length, text.length);\r\n const oldChars = previous.padStart(width, ' ');\r\n const newChars = text.padStart(width, ' ');\r\n el.textContent = '';\r\n const label = document.createElement('span');\r\n label.className = 'mk-sr-only';\r\n label.textContent = text;\r\n const visual = document.createElement('span');\r\n visual.setAttribute('aria-hidden', 'true');\r\n visual.style.display = 'inline-flex';\r\n const moving: Array<[HTMLElement, HTMLElement]> = [];\r\n // Only the padding added for the alignment is skipped; spaces inside the text stay.\r\n const padding = Math.min(width - previous.length, width - text.length);\r\n for (let i = padding; i < width; i++) {\r\n const before = oldChars[i]!;\r\n const after = newChars[i]!;\r\n const cell = document.createElement('span');\r\n Object.assign(cell.style, { position: 'relative', display: 'inline-block', overflow: 'hidden', whiteSpace: 'pre' });\r\n const next = document.createElement('span');\r\n next.style.display = 'inline-block';\r\n next.textContent = after;\r\n cell.append(next);\r\n if (before !== after) {\r\n const old = document.createElement('span');\r\n Object.assign(old.style, { position: 'absolute', left: '0', top: '0', display: 'inline-block' });\r\n old.textContent = before;\r\n cell.append(old);\r\n moving.push([old, next]);\r\n }\r\n visual.append(cell);\r\n }\r\n el.append(label, visual);\r\n const timeline = gsap.timeline({\r\n onComplete: () => {\r\n el.textContent = text;\r\n rolling.delete(el);\r\n },\r\n });\r\n moving.forEach(([old, next], i) => {\r\n timeline.to(old, { yPercent: -100 * direction, opacity: 0, filter: 'blur(4px)', duration, ease: EASE.signature }, i * 0.03);\r\n timeline.fromTo(next, { yPercent: 100 * direction, opacity: 0, filter: 'blur(4px)' }, { yPercent: 0, opacity: 1, filter: 'blur(0px)', duration, ease: EASE.signature }, i * 0.03);\r\n });\r\n rolling.set(el, timeline);\r\n return timeline;\r\n}\r\n","import { gsap } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { blurIn, blurOut, collapse, shake } from '../../motion/micro';\n\n/*\n * Attachment: native file chooser plus drop zone, and a card per file with\n * name, type, size, upload progress/status and a remove button. Files are\n * validated (accept, maxSize, maxFiles) and rejected with a reason; accepted\n * ones are kept when more arrive. The app owns the upload: it reads\n * onFiles / mk:files and reports back with setProgress(id, value, status).\n * Image previews are object URLs, revoked when the file leaves or on destroy.\n * Parts (made when absent): [data-mk-attachment-input], [data-mk-attachment-drop],\n * [data-mk-attachment-list].\n */\n\nexport type AttachmentStatus = 'idle' | 'uploading' | 'complete' | 'error';\nexport type AttachmentRejectCode = 'type' | 'size' | 'count';\n\nexport interface AttachmentFile {\n id: string;\n name: string;\n size: number;\n type: string;\n /** The picked File (absent for files described by metadata only). */\n file?: File;\n /** 0–100 once the app reports it. */\n progress?: number;\n status: AttachmentStatus;\n /** Object URL of an image preview, or a URL supplied with initialFiles. */\n preview?: string;\n}\n\nexport interface AttachmentRejection {\n file: File;\n code: AttachmentRejectCode;\n message: string;\n}\n\nexport interface AttachmentLabels {\n choose?: string;\n drop?: string;\n remove?: string;\n list?: string;\n uploading?: string;\n complete?: string;\n error?: string;\n added?: (count: number) => string;\n removed?: (name: string) => string;\n rejected?: (rejection: { name: string; code: AttachmentRejectCode; limit: string }) => string;\n}\n\nexport interface AttachmentOptions {\n /** Like input[accept]: extensions (.pdf), MIME types (image/png) and wildcards (image/*). */\n accept?: string;\n multiple?: boolean;\n /** Most files kept (multiple only). */\n maxFiles?: number;\n /** Largest file, in bytes. */\n maxSize?: number;\n disabled?: boolean;\n /** Form name of the file input (it carries the kept files where the browser allows). */\n name?: string;\n /** Files shown from the start (e.g. already uploaded). */\n initialFiles?: Array<Partial<AttachmentFile> & { name: string }>;\n /** Visible hint under the drop text (default: the limits). */\n hint?: string;\n labels?: AttachmentLabels;\n onFiles?: (added: AttachmentFile[], files: AttachmentFile[]) => void;\n onRemove?: (removed: AttachmentFile, files: AttachmentFile[]) => void;\n onReject?: (rejections: AttachmentRejection[]) => void;\n}\n\nexport interface AttachmentInstance extends Instance {\n /** Validate and add files; returns the accepted ones. */\n addFiles(files: Iterable<File> | ArrayLike<File>): AttachmentFile[];\n remove(id: string): void;\n /** Report upload progress (0–100) and, optionally, the status. */\n setProgress(id: string, value: number, status?: AttachmentStatus): void;\n clear(): void;\n readonly files: AttachmentFile[];\n}\n\nconst DEFAULT_LABELS = {\n choose: 'Elige archivos',\n drop: 'o arrástralos aquí',\n remove: 'Quitar',\n list: 'Archivos adjuntos',\n uploading: 'Subiendo',\n complete: 'Listo',\n error: 'Error al subir',\n added: (count: number) => (count === 1 ? '1 archivo añadido' : `${count} archivos añadidos`),\n removed: (name: string) => `${name} quitado`,\n rejected: ({ name, code, limit }: { name: string; code: AttachmentRejectCode; limit: string }) =>\n code === 'type' ? `${name}: tipo no permitido` : code === 'size' ? `${name}: supera ${limit}` : `${name}: máximo ${limit}`,\n} satisfies Required<AttachmentLabels>;\n\nlet sequence = 0;\n\n/** 1 KB = 1024 B; one decimal under 10. */\nexport function formatBytes(bytes: number) {\n if (!Number.isFinite(bytes) || bytes < 0) return '';\n const units = ['B', 'KB', 'MB', 'GB'];\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n const digits = unit && value < 10 ? 1 : 0;\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: digits }).format(value)} ${units[unit]}`;\n}\n\nconst KINDS: Record<string, string> = { image: 'imágenes', video: 'vídeos', audio: 'audio', text: 'texto' };\n\n/** Readable accept list: image/* → imágenes, .pdf → PDF, application/zip → ZIP. */\nexport function describeAccept(accept: string | undefined) {\n return (accept ?? '')\n .split(',')\n .map((rule) => rule.trim().toLowerCase())\n .filter(Boolean)\n .map((rule) => (rule.startsWith('.') ? rule.slice(1).toUpperCase() : rule.endsWith('/*') ? KINDS[rule.slice(0, -2)] ?? rule : (rule.split('/')[1] ?? rule).toUpperCase()))\n .filter((label, i, all) => all.indexOf(label) === i)\n .join(', ');\n}\n\n/** Does a file match an accept list (extensions, MIME types, type/*)? */\nexport function acceptsFile(file: { name: string; type: string }, accept: string | undefined) {\n const rules = (accept ?? '').split(',').map((rule) => rule.trim().toLowerCase()).filter(Boolean);\n if (!rules.length) return true;\n const name = file.name.toLowerCase();\n const type = (file.type || '').toLowerCase();\n return rules.some((rule) => {\n if (rule.startsWith('.')) return name.endsWith(rule);\n if (rule.endsWith('/*')) return type.startsWith(rule.slice(0, -1));\n return type === rule;\n });\n}\n\nconst extension = (name: string) => {\n const dot = name.lastIndexOf('.');\n return dot > 0 && dot < name.length - 1 ? name.slice(dot + 1).slice(0, 4).toUpperCase() : 'FILE';\n};\nconst canPreview = (type: string) => /^image\\//i.test(type) && typeof URL !== 'undefined' && typeof URL.createObjectURL === 'function';\n\nexport function createAttachment(root: HTMLElement | null, options: AttachmentOptions = {}): AttachmentInstance {\n if (!root) return inert({ addFiles: () => [], remove() {}, setProgress() {}, clear() {}, files: [] });\n const scope = createScope();\n const labels = { ...DEFAULT_LABELS, ...options.labels };\n const multiple = options.multiple ?? false;\n const maxFiles = multiple ? (options.maxFiles && options.maxFiles > 0 ? Math.floor(options.maxFiles) : Infinity) : 1;\n const maxSize = options.maxSize && options.maxSize > 0 ? options.maxSize : Infinity;\n const disabled = options.disabled ?? false;\n const files: AttachmentFile[] = [];\n const rows = new Map<string, HTMLElement>();\n /** Rows on their way out (removed when their exit ends, or on destroy). */\n const leaving = new Set<HTMLElement>();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n /** Object URLs this instance made (revoked when their file leaves). */\n const owned = new Set<string>();\n\n const made = <K extends keyof HTMLElementTagNameMap>(tag: K, parent: Element = root) => {\n const element = document.createElement(tag);\n parent.append(element);\n scope.add(() => element.remove());\n return element;\n };\n\n let drop = root.querySelector<HTMLElement>('[data-mk-attachment-drop]');\n let input = root.querySelector<HTMLInputElement>('input[type=\"file\"][data-mk-attachment-input], [data-mk-attachment-drop] input[type=\"file\"]');\n if (!drop) {\n drop = made('label');\n drop.dataset.mkAttachmentDrop = '';\n const icon = document.createElement('span');\n icon.dataset.mkPart = 'icon';\n icon.setAttribute('aria-hidden', 'true');\n const text = document.createElement('span');\n text.dataset.mkPart = 'prompt';\n const choose = document.createElement('strong');\n choose.textContent = labels.choose;\n text.append(choose, ` ${labels.drop}`);\n const hint = document.createElement('small');\n hint.dataset.mkPart = 'hint';\n const kinds = describeAccept(options.accept);\n const limits = [kinds && kinds.charAt(0).toUpperCase() + kinds.slice(1), Number.isFinite(maxSize) ? `hasta ${formatBytes(maxSize)}` : '', Number.isFinite(maxFiles) && multiple ? `máx. ${maxFiles} archivos` : '']\n .filter(Boolean)\n .join(' · ');\n hint.textContent = options.hint ?? limits;\n drop.append(icon, text);\n if (hint.textContent) drop.append(hint);\n }\n if (!input) {\n input = made('input', drop);\n input.type = 'file';\n input.dataset.mkAttachmentInput = '';\n }\n let list = root.querySelector<HTMLElement>('[data-mk-attachment-list]');\n if (!list) {\n list = made('ul');\n list.dataset.mkAttachmentList = '';\n }\n const error = made('p');\n error.dataset.mkAttachmentError = '';\n error.setAttribute('role', 'alert');\n error.hidden = true;\n const status = made('p');\n status.dataset.mkAttachmentStatus = '';\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n\n scope.attr(input, 'accept', options.accept ?? input.getAttribute('accept'));\n scope.attr(input, 'multiple', multiple ? '' : null);\n scope.attr(input, 'disabled', disabled ? '' : null);\n if (options.name) scope.attr(input, 'name', options.name);\n scope.attr(list, 'aria-label', list.getAttribute('aria-label') ?? labels.list);\n scope.attr(root, 'data-mk-ready', '');\n scope.attr(root, 'data-mk-disabled', disabled ? '' : null);\n\n const snapshot = (file: AttachmentFile): AttachmentFile => ({ ...file });\n const all = () => files.map(snapshot);\n const announce = (text: string) => {\n status.textContent = text;\n };\n\n const describe = (file: AttachmentFile) => {\n const parts = [extension(file.name), formatBytes(file.size)];\n if (file.status === 'uploading') parts.push(`${labels.uploading} ${Math.round(file.progress ?? 0)} %`);\n else if (file.status === 'complete') parts.push(labels.complete);\n else if (file.status === 'error') parts.push(labels.error);\n return parts.filter(Boolean).join(' · ');\n };\n\n const paint = (file: AttachmentFile) => {\n const row = rows.get(file.id);\n if (!row) return;\n row.dataset.mkStatus = file.status;\n row.querySelector<HTMLElement>('[data-mk-part=\"detail\"]')!.textContent = describe(file);\n const progress = row.querySelector('progress')!;\n progress.hidden = file.progress === undefined || file.status === 'idle';\n progress.value = file.progress ?? 0;\n };\n\n const renderRow = (file: AttachmentFile) => {\n const row = document.createElement('li');\n row.dataset.mkAttachmentItem = '';\n row.dataset.mkId = file.id;\n const thumb = document.createElement('span');\n thumb.dataset.mkPart = 'thumb';\n thumb.setAttribute('aria-hidden', 'true');\n if (file.preview) {\n const image = document.createElement('img');\n image.alt = '';\n image.src = file.preview;\n image.addEventListener('error', () => image.replaceWith(extension(file.name)), { once: true });\n thumb.append(image);\n } else thumb.textContent = extension(file.name);\n const meta = document.createElement('span');\n meta.dataset.mkPart = 'meta';\n const name = document.createElement('span');\n name.dataset.mkPart = 'name';\n name.textContent = file.name;\n name.title = file.name;\n const detail = document.createElement('span');\n detail.dataset.mkPart = 'detail';\n const progress = document.createElement('progress');\n progress.max = 100;\n progress.setAttribute('aria-label', `${labels.uploading} ${file.name}`);\n meta.append(name, detail, progress);\n const remove = document.createElement('button');\n remove.type = 'button';\n remove.dataset.mkAttachmentRemove = '';\n remove.setAttribute('aria-label', `${labels.remove} ${file.name}`);\n remove.disabled = disabled;\n remove.innerHTML = '<svg aria-hidden=\"true\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n row.append(thumb, meta, remove);\n list!.append(row);\n rows.set(file.id, row);\n paint(file);\n };\n\n const revoke = (file: AttachmentFile) => {\n if (file.preview && owned.delete(file.preview)) URL.revokeObjectURL(file.preview);\n };\n\n /** Where the browser allows it, the input carries the kept files for a native form submit. */\n const syncInput = () => {\n if (!options.name || typeof DataTransfer === 'undefined') return;\n try {\n const transfer = new DataTransfer();\n for (const file of files) if (file.file) transfer.items.add(file.file);\n input!.files = transfer.files;\n } catch {\n // Older engines cannot assign files: the app reads them from onFiles.\n }\n };\n\n const discard = (file: AttachmentFile, notify: boolean) => {\n const at = files.indexOf(file);\n if (at < 0) return;\n files.splice(at, 1);\n revoke(file);\n const row = rows.get(file.id);\n rows.delete(file.id);\n // Keep the keyboard in the list: the next remove button, else the chooser.\n const focused = row?.contains(document.activeElement);\n const next = [row?.nextElementSibling, row?.previousElementSibling].find((sibling) => sibling && !leaving.has(sibling as HTMLElement));\n if (row) {\n // Out of reach at once; it slides left, blurs and folds (Melonmind item-out-left + collapse).\n row.inert = true;\n row.setAttribute('aria-hidden', 'true');\n leaving.add(row);\n const done = () => {\n leaving.delete(row);\n row.remove();\n };\n if (reduced()) done();\n else keep(gsap.timeline({ onComplete: done }).add(blurOut(row, { to: 'left' }) ?? gsap.timeline()).add(collapse(row) ?? gsap.timeline(), 0.18));\n }\n if (focused) (next?.querySelector<HTMLElement>('[data-mk-attachment-remove]') ?? input)?.focus();\n syncInput();\n if (!notify) return;\n announce(labels.removed(file.name));\n const detail = { file: snapshot(file), files: all() };\n options.onRemove?.(detail.file, detail.files);\n root.dispatchEvent(new CustomEvent('mk:remove', { bubbles: true, detail }));\n };\n\n const create = (seed: Partial<AttachmentFile> & { name: string }, source?: File): AttachmentFile => {\n const type = seed.type ?? source?.type ?? '';\n let preview = seed.preview;\n // A blob URL carried over from a destroyed instance was revoked with it: make a new one.\n if (source && canPreview(type) && (!preview || preview.startsWith('blob:'))) {\n preview = URL.createObjectURL(source);\n owned.add(preview);\n }\n const progress = Number.isFinite(seed.progress) ? Math.min(100, Math.max(0, seed.progress!)) : undefined;\n return { id: seed.id ?? `mk-file-${++sequence}`, name: seed.name, size: seed.size ?? source?.size ?? 0, type, file: source ?? seed.file, progress, status: seed.status ?? 'idle', preview };\n };\n\n const addFiles = (incoming: Iterable<File> | ArrayLike<File>) => {\n if (scope.disposed || disabled) return [];\n const incomingFiles = Array.from(incoming as ArrayLike<File>);\n const accepted: AttachmentFile[] = [];\n const rejected: AttachmentRejection[] = [];\n const reject = (file: File, code: AttachmentRejectCode) => {\n const limit = code === 'size' ? formatBytes(maxSize) : code === 'count' ? `${maxFiles} ${maxFiles === 1 ? 'archivo' : 'archivos'}` : options.accept ?? '';\n rejected.push({ file, code, message: labels.rejected({ name: file.name, code, limit }) });\n };\n for (const file of incomingFiles) {\n if (!acceptsFile(file, options.accept)) reject(file, 'type');\n else if (file.size > maxSize) reject(file, 'size');\n else if (multiple && files.length + accepted.length >= maxFiles) reject(file, 'count');\n else if (!multiple && accepted.length) reject(file, 'count');\n else accepted.push(create({ name: file.name }, file));\n }\n // One file at a time: a new valid pick replaces the current one.\n if (!multiple && accepted.length) for (const old of [...files]) discard(old, true);\n for (const file of accepted) {\n files.push(file);\n renderRow(file);\n }\n keep(blurIn(accepted.map((file) => rows.get(file.id)!).filter(Boolean)));\n if (rejected.length) keep(shake(drop));\n error.hidden = !rejected.length;\n error.textContent = rejected.map((item) => item.message).join(' · ');\n if (accepted.length) {\n syncInput();\n announce(labels.added(accepted.length));\n const detail = { added: accepted.map(snapshot), files: all() };\n options.onFiles?.(detail.added, detail.files);\n root.dispatchEvent(new CustomEvent('mk:files', { bubbles: true, detail }));\n }\n if (rejected.length) {\n options.onReject?.(rejected);\n for (const rejection of rejected) root.dispatchEvent(new CustomEvent('mk:reject', { bubbles: true, detail: rejection }));\n }\n return accepted.map(snapshot);\n };\n\n for (const seed of options.initialFiles ?? []) {\n const file = create(seed, seed.file);\n files.push(file);\n renderRow(file);\n }\n\n scope.on(input, 'change', () => {\n if (disabled || !input!.files?.length) return;\n const picked = [...input!.files];\n addFiles(picked);\n // Without DataTransfer the same file could not be picked twice: clear the pick.\n if (!options.name || typeof DataTransfer === 'undefined') input!.value = '';\n });\n scope.on(list, 'click', (event) => {\n const button = (event.target as Element | null)?.closest<HTMLButtonElement>('[data-mk-attachment-remove]');\n const id = button?.closest<HTMLElement>('[data-mk-attachment-item]')?.dataset.mkId;\n if (!button || button.disabled || !id) return;\n const file = files.find((item) => item.id === id);\n if (file) discard(file, true);\n });\n let depth = 0;\n const dragging = (on: boolean) => scope.attr(drop, 'data-mk-dragging', on ? '' : null);\n const hasFiles = (event: Event) => [...((event as DragEvent).dataTransfer?.types ?? ['Files'])].includes('Files');\n scope.on(drop, 'dragenter', (event) => {\n if (disabled || !hasFiles(event)) return;\n event.preventDefault();\n depth += 1;\n dragging(true);\n });\n scope.on(drop, 'dragover', (event) => {\n if (disabled || !hasFiles(event)) return;\n event.preventDefault();\n const transfer = (event as DragEvent).dataTransfer;\n if (transfer) transfer.dropEffect = 'copy';\n });\n scope.on(drop, 'dragleave', () => {\n depth = Math.max(0, depth - 1);\n if (!depth) dragging(false);\n });\n scope.on(drop, 'drop', (event) => {\n event.preventDefault();\n depth = 0;\n dragging(false);\n if (disabled) return;\n const dropped = (event as DragEvent).dataTransfer?.files;\n if (dropped?.length) addFiles(dropped);\n });\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n for (const row of leaving) row.remove();\n leaving.clear();\n for (const file of files) revoke(file);\n for (const row of rows.values()) row.remove();\n rows.clear();\n });\n\n return {\n addFiles,\n remove(id) {\n if (scope.disposed || disabled) return;\n const file = files.find((item) => item.id === id);\n if (file) discard(file, true);\n },\n setProgress(id, value, nextStatus) {\n if (scope.disposed) return;\n const file = files.find((item) => item.id === id);\n if (!file || !Number.isFinite(value)) return;\n file.progress = Math.min(100, Math.max(0, value));\n file.status = nextStatus ?? (file.progress >= 100 ? 'complete' : 'uploading');\n paint(file);\n if (file.status === 'complete' || file.status === 'error') announce(`${file.name}: ${file.status === 'complete' ? labels.complete : labels.error}`);\n },\n clear() {\n if (scope.disposed || disabled) return;\n for (const file of [...files]) discard(file, true);\n },\n get files() {\n return all();\n },\n destroy: () => scope.dispose(),\n };\n}\n","import type { gsap } from '../../core/gsap';\r\nimport { createScope } from '../../core/scope';\r\nimport { inert, type Instance } from '../../core/types';\r\nimport { blurIn } from '../../motion/micro';\r\n\r\n/*\r\n * Skeleton: a decorative placeholder ([data-mk-skeleton-placeholder], made from\r\n * `shape` when absent) stands in for the real content ([data-mk-skeleton-content])\r\n * while loading. The root is aria-busy and a hidden status names what loads; the\r\n * placeholder is aria-hidden. Content the author hid stays hidden. Pulse and\r\n * shimmer are CSS; reduced motion keeps a still surface.\r\n */\r\n\r\nexport type SkeletonShape = 'text' | 'avatar' | 'image' | 'card';\r\nexport type SkeletonAnimation = 'pulse' | 'shimmer' | 'none';\r\n\r\nexport interface SkeletonOptions {\r\n loading?: boolean;\r\n animation?: SkeletonAnimation;\r\n /** Placeholder made when the markup has none. */\r\n shape?: SkeletonShape;\r\n /** Text lines of a generated text placeholder (default 3). */\r\n lines?: number;\r\n /** Announced while loading (default 'Cargando'). */\r\n label?: string;\r\n}\r\n\r\nexport interface SkeletonInstance extends Instance {\r\n setLoading(loading: boolean): void;\r\n readonly loading: boolean;\r\n}\r\n\r\n/** Bones of each shape: block (image), circle (avatar), line (text). */\r\nexport function skeletonBones(shape: SkeletonShape, lines = 3): Array<'block' | 'circle' | 'line' | 'short'> {\r\n const count = Math.max(1, Math.round(lines) || 1);\r\n const text = Array.from({ length: count }, (_, i) => (i === count - 1 && count > 1 ? 'short' : 'line') as 'line' | 'short');\r\n if (shape === 'avatar') return ['circle', 'line', 'short'];\r\n if (shape === 'image') return ['block'];\r\n if (shape === 'card') return ['block', 'line', 'short'];\r\n return text;\r\n}\r\n\r\nexport function createSkeleton(root: HTMLElement | null, options: SkeletonOptions = {}): SkeletonInstance {\r\n if (!root) return inert({ setLoading() {}, loading: false });\r\n const scope = createScope();\r\n const shape = options.shape ?? 'text';\r\n const animation = options.animation ?? 'pulse';\r\n let loading = options.loading ?? true;\r\n\r\n let placeholder = root.querySelector<HTMLElement>('[data-mk-skeleton-placeholder]');\r\n if (!placeholder) {\r\n const made = document.createElement('div');\r\n made.dataset.mkSkeletonPlaceholder = '';\r\n made.dataset.mkShape = shape;\r\n for (const bone of skeletonBones(shape, options.lines)) {\r\n const element = document.createElement('span');\r\n element.dataset.mkBone = bone;\r\n made.append(element);\r\n }\r\n root.prepend(made);\r\n scope.add(() => made.remove());\r\n placeholder = made;\r\n }\r\n const contents = [...root.querySelectorAll<HTMLElement>('[data-mk-skeleton-content]')];\r\n const authoredHidden = new Map(contents.map((content) => [content, content.hidden]));\r\n const status = document.createElement('span');\r\n status.className = 'mk-sr-only';\r\n status.dataset.mkSkeletonStatus = '';\r\n root.append(status);\r\n scope.add(() => status.remove());\r\n\r\n scope.attr(placeholder, 'aria-hidden', 'true');\r\n scope.attr(root, 'data-mk-shape', shape);\r\n scope.attr(root, 'data-mk-animation', animation);\r\n scope.attr(root, 'data-mk-ready', '');\r\n\r\n // The reveal animates the content's inline style: the authored one comes back on destroy.\r\n for (const content of contents) scope.attr(content, 'style', content.getAttribute('style'));\r\n let reveal: gsap.core.Animation | null = null;\r\n scope.add(() => reveal?.progress(1).kill());\r\n const render = () => {\r\n scope.attr(root, 'aria-busy', String(loading));\r\n scope.attr(placeholder!, 'hidden', loading ? null : '');\r\n for (const content of contents) scope.attr(content, 'hidden', loading || authoredHidden.get(content) ? '' : null);\r\n status.textContent = loading ? options.label ?? 'Cargando' : '';\r\n };\r\n render();\r\n\r\n return {\r\n setLoading(next) {\r\n if (scope.disposed || next === loading) return;\r\n loading = next;\r\n render();\r\n // Melonmind's list entrance (blur 16, y −20, 50 ms apart) for what was waiting.\r\n reveal?.progress(1).kill();\r\n if (!loading) reveal = blurIn(contents.filter((content) => !content.hidden), { stagger: 0.05 });\r\n root.dispatchEvent(new CustomEvent('mk:loading', { bubbles: true, detail: { loading } }));\r\n },\r\n get loading() {\r\n return loading;\r\n },\r\n destroy: () => scope.dispose(),\r\n };\r\n}\r\n","import { createScope } from '../../core/scope';\r\nimport { inert, type Instance } from '../../core/types';\r\nimport { createSteps } from '../steps/engine';\r\nimport { shake } from '../../motion/micro';\r\n\r\n/*\r\n * Questionnaire: a native form split into [data-mk-question] steps, moved by\r\n * the steps engine (flow out/in, counter, focus on the title). Next validates\r\n * the current step first — required text, choices and checkbox groups (one\r\n * checked is enough) — marks invalid fields, writes the message and focuses\r\n * the first one. Submitting on the last step completes once; native reset\r\n * clears errors and completion and returns to the first step.\r\n * Parts: [data-mk-question], [data-mk-question-next|prev], [data-mk-question-error],\r\n * [data-mk-question-complete], [data-mk-counter] (step number).\r\n */\r\n\r\nexport type QuestionnaireAnswers = Record<string, string | string[]>;\r\n\r\nexport interface QuestionnaireLabels {\r\n required?: string;\r\n choice?: string;\r\n}\r\n\r\nexport interface QuestionnaireOptions {\r\n index?: number;\r\n labels?: QuestionnaireLabels;\r\n onChange?: (index: number, answers: QuestionnaireAnswers) => void;\r\n onComplete?: (answers: QuestionnaireAnswers) => void;\r\n}\r\n\r\nexport interface QuestionnaireInstance extends Instance {\r\n /** Validate the current step and go on (or complete on the last one). */\r\n next(): Promise<boolean>;\r\n prev(): Promise<void>;\r\n /** Native form reset: clears answers, errors and completion. */\r\n reset(): void;\r\n readonly answers: QuestionnaireAnswers;\r\n readonly index: number;\r\n readonly count: number;\r\n readonly complete: boolean;\r\n}\r\n\r\ntype Field = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\nconst FIELDS = 'input[name], select[name], textarea[name]';\r\nconst SKIP = new Set(['button', 'submit', 'reset', 'image', 'file']);\r\nlet sequence = 0;\r\n\r\n/** Answers of a form keyed by field name: checkboxes and multi-selects give arrays. */\r\nexport function readAnswers(form: HTMLElement): QuestionnaireAnswers {\r\n const answers: QuestionnaireAnswers = {};\r\n for (const field of form.querySelectorAll<Field>(FIELDS)) {\r\n if (field.disabled || SKIP.has(field.type)) continue;\r\n const { name } = field;\r\n if (field instanceof HTMLInputElement && field.type === 'checkbox') {\r\n const list = (answers[name] as string[] | undefined) ?? [];\r\n if (field.checked) list.push(field.value);\r\n answers[name] = list;\r\n } else if (field instanceof HTMLInputElement && field.type === 'radio') {\r\n if (field.checked) answers[name] = field.value;\r\n else answers[name] ??= '';\r\n } else if (field instanceof HTMLSelectElement && field.multiple) {\r\n answers[name] = [...field.selectedOptions].map((option) => option.value);\r\n } else answers[name] = field.value;\r\n }\r\n return answers;\r\n}\r\n\r\nexport function createQuestionnaire(root: HTMLElement | null, options: QuestionnaireOptions = {}): QuestionnaireInstance {\r\n const form = root instanceof HTMLFormElement ? root : root?.querySelector('form') ?? null;\r\n const sections = form ? [...form.querySelectorAll<HTMLElement>('[data-mk-question]')] : [];\r\n if (!root || !form || !sections.length) {\r\n return inert({ next: async () => false, prev: async () => {}, reset() {}, answers: {}, index: -1, count: 0, complete: false });\r\n }\r\n const scope = createScope();\r\n const labels = { required: 'Completa este campo.', choice: 'Elige al menos una opción.', ...options.labels };\r\n for (const section of sections) if (!section.hasAttribute('data-mk-step')) scope.attr(section, 'data-mk-step', '');\r\n const start = Math.min(sections.length - 1, Math.max(0, Math.round(options.index ?? 0)));\r\n let index = start;\r\n let complete = false;\r\n // Our own navigation buttons only (not [data-mk-step-*]): steps never skips validation.\r\n const steps = createSteps(form, { index: start, animateFirst: false });\r\n scope.add(() => steps.destroy());\r\n scope.attr(form, 'novalidate', '');\r\n scope.attr(form, 'data-mk-questionnaire', '');\r\n\r\n const fieldsOf = (section: HTMLElement) => [...section.querySelectorAll<Field>(FIELDS)].filter((field) => !field.disabled && !SKIP.has(field.type));\r\n const errorOf = (section: HTMLElement) => section.querySelector<HTMLElement>('[data-mk-question-error]') ?? form.querySelector<HTMLElement>('[data-mk-question-error]');\r\n const errorTexts = new Map<HTMLElement, string | null>();\r\n const writeError = (element: HTMLElement | null, text: string) => {\r\n if (!element) return;\r\n if (!errorTexts.has(element)) errorTexts.set(element, element.textContent);\r\n element.textContent = text;\r\n };\r\n scope.add(() => errorTexts.forEach((text, element) => (element.textContent = text)));\r\n for (const element of form.querySelectorAll<HTMLElement>('[data-mk-question-error]')) {\r\n if (!element.id) scope.attr(element, 'id', `mk-question-error-${++sequence}`);\r\n if (!element.matches('output') && !element.hasAttribute('role')) scope.attr(element, 'role', 'alert');\r\n }\r\n\r\n const markValid = (field: Field) => {\r\n scope.attr(field, 'aria-invalid', null);\r\n scope.attr(field, 'aria-errormessage', null);\r\n };\r\n const clearErrors = () => {\r\n for (const field of form.querySelectorAll<Field>(FIELDS)) markValid(field);\r\n for (const element of form.querySelectorAll<HTMLElement>('[data-mk-question-error]')) writeError(element, '');\r\n };\r\n\r\n /** Invalid fields of a step and the first message. */\r\n const check = (section: HTMLElement) => {\r\n const invalid: Field[] = [];\r\n let message = '';\r\n const groups = new Map<string, HTMLInputElement[]>();\r\n for (const field of fieldsOf(section)) {\r\n if (field instanceof HTMLInputElement && (field.type === 'checkbox' || field.type === 'radio')) {\r\n const group = groups.get(field.name) ?? [];\r\n group.push(field);\r\n groups.set(field.name, group);\r\n continue;\r\n }\r\n const empty = field.required && !field.value.trim();\r\n if (empty || !field.checkValidity()) {\r\n invalid.push(field);\r\n message ||= empty ? labels.required : field.validationMessage || labels.required;\r\n }\r\n }\r\n for (const group of groups.values()) {\r\n const required = group.some((field) => field.required) || Boolean(group[0]!.closest('[data-mk-required]'));\r\n if (required && !group.some((field) => field.checked)) {\r\n invalid.push(...group);\r\n message ||= labels.choice;\r\n }\r\n }\r\n return { invalid, message };\r\n };\r\n\r\n const validate = (section: HTMLElement) => {\r\n clearErrors();\r\n const { invalid, message } = check(section);\r\n if (!invalid.length) return true;\r\n const error = errorOf(section);\r\n writeError(error, message);\r\n for (const field of invalid) {\r\n scope.attr(field, 'aria-invalid', 'true');\r\n if (error?.id) scope.attr(field, 'aria-errormessage', error.id);\r\n }\r\n invalid[0]!.focus();\r\n shake(invalid[0]!.closest('[data-mk-question-options], [data-mk-question-field]') ?? invalid[0]!);\r\n root.dispatchEvent(new CustomEvent('mk:invalid', { bubbles: true, detail: { index, fields: invalid } }));\r\n return false;\r\n };\r\n\r\n const render = () => {\r\n scope.attr(form, 'data-mk-complete', complete ? '' : null);\r\n form.style.setProperty('--mk-question-progress', String(complete ? 1 : (index + 1) / sections.length));\r\n for (const panel of form.querySelectorAll<HTMLElement>('[data-mk-question-complete]')) scope.attr(panel, 'hidden', complete ? null : '');\r\n };\r\n scope.attr(form, 'style', form.getAttribute('style'));\r\n\r\n const finish = () => {\r\n if (complete) return;\r\n complete = true;\r\n render();\r\n const answers = readAnswers(form);\r\n const panel = form.querySelector<HTMLElement>('[data-mk-question-complete]');\r\n if (panel) {\r\n if (!panel.hasAttribute('tabindex')) scope.attr(panel, 'tabindex', '-1');\r\n panel.focus({ preventScroll: true });\r\n }\r\n options.onComplete?.(answers);\r\n root.dispatchEvent(new CustomEvent('mk:complete', { bubbles: true, detail: { answers } }));\r\n };\r\n\r\n const go = async (to: number) => {\r\n const previous = index;\r\n index = to;\r\n render();\r\n await steps.goTo(to);\r\n if (scope.disposed) return;\r\n const answers = readAnswers(form);\r\n options.onChange?.(index, answers);\r\n root.dispatchEvent(new CustomEvent('mk:question', { bubbles: true, detail: { index, previous, answers } }));\r\n };\r\n\r\n // Everything before the first await runs at once: a submit completes synchronously.\r\n const next = async () => {\r\n if (scope.disposed) return false;\r\n if (complete) return true;\r\n if (!validate(sections[index]!)) return false;\r\n if (index === sections.length - 1) {\r\n finish();\r\n return true;\r\n }\r\n await go(index + 1);\r\n return !scope.disposed;\r\n };\r\n const prev = async () => {\r\n if (scope.disposed || complete || index === 0) return;\r\n clearErrors();\r\n await go(index - 1);\r\n };\r\n\r\n scope.on(form, 'click', (event) => {\r\n const trigger = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-question-next], [data-mk-question-prev]');\r\n if (!trigger || !form.contains(trigger)) return;\r\n event.preventDefault();\r\n if (trigger.hasAttribute('data-mk-question-next')) void next();\r\n else void prev();\r\n });\r\n scope.on(form, 'submit', (event) => {\r\n event.preventDefault();\r\n void next();\r\n });\r\n // A corrected field stops being invalid as soon as it is.\r\n const recheck = (event: Event) => {\r\n const field = (event.target as Element | null)?.closest<Field>(FIELDS);\r\n if (!field || field.getAttribute('aria-invalid') !== 'true') return;\r\n const section = field.closest<HTMLElement>('[data-mk-question]');\r\n if (!section) return;\r\n const { invalid } = check(section);\r\n for (const candidate of fieldsOf(section)) if (!invalid.includes(candidate)) markValid(candidate);\r\n if (!invalid.length) writeError(errorOf(section), '');\r\n };\r\n scope.on(form, 'input', recheck);\r\n scope.on(form, 'change', recheck);\r\n scope.on(form, 'reset', (event) => {\r\n if (event.defaultPrevented) return;\r\n clearErrors();\r\n complete = false;\r\n if (index !== 0) void go(0);\r\n else render();\r\n });\r\n render();\r\n\r\n return {\r\n next,\r\n prev,\r\n reset() {\r\n if (!scope.disposed) form.reset();\r\n },\r\n get answers() {\r\n return readAnswers(form);\r\n },\r\n get index() {\r\n return index;\r\n },\r\n get count() {\r\n return sections.length;\r\n },\r\n get complete() {\r\n return complete;\r\n },\r\n destroy: () => scope.dispose(),\r\n };\r\n}\r\n","/*\r\n * A small syntax highlighter for code blocks: no dependency, no HTML parsing.\r\n * It splits code into typed tokens whose texts concatenate back to the exact\r\n * input, then builds one [data-mk-code-line] per line with spans created\r\n * through textContent, so markup in the code is always shown, never run.\r\n * Languages: ts, js, tsx, jsx, json, css, html (also xml, svg, astro, vue), bash (sh, shell, zsh).\r\n */\r\n\r\nexport type TokenType = 'plain' | 'keyword' | 'string' | 'comment' | 'number' | 'tag' | 'attr' | 'property' | 'function' | 'punctuation' | 'operator';\r\n\r\nexport interface Token {\r\n type: TokenType;\r\n text: string;\r\n}\r\n\r\ntype Family = 'script' | 'markup' | 'css' | 'shell' | 'json' | 'plain';\r\n\r\nconst ALIASES: Record<string, Family> = {\r\n ts: 'script',\r\n typescript: 'script',\r\n js: 'script',\r\n javascript: 'script',\r\n mjs: 'script',\r\n cjs: 'script',\r\n tsx: 'script',\r\n jsx: 'script',\r\n json: 'json',\r\n css: 'css',\r\n scss: 'css',\r\n html: 'markup',\r\n xml: 'markup',\r\n svg: 'markup',\r\n astro: 'markup',\r\n vue: 'markup',\r\n bash: 'shell',\r\n sh: 'shell',\r\n shell: 'shell',\r\n zsh: 'shell',\r\n console: 'shell',\r\n};\r\n\r\nconst JSX = new Set(['tsx', 'jsx', 'astro', 'vue']);\r\n\r\nconst SCRIPT_KEYWORDS = new Set(\r\n 'import export from as default const let var function return if else for while do switch case break continue new class extends super this typeof instanceof in of await async yield try catch finally throw delete void interface type enum implements public private protected readonly static declare namespace keyof satisfies true false null undefined'.split(\r\n ' ',\r\n ),\r\n);\r\nconst SHELL_KEYWORDS = new Set('if then else elif fi for in do done while until case esac function return export local set unset echo cd source'.split(' '));\r\n\r\n/** The language a code block uses, or 'plain'. */\r\nexport function languageFamily(language: string | undefined): Family {\r\n return ALIASES[(language ?? '').trim().toLowerCase()] ?? 'plain';\r\n}\r\n\r\ninterface Rule {\r\n type: TokenType;\r\n re: RegExp;\r\n}\r\n\r\nconst sticky = (source: string) => new RegExp(source, 'y');\r\n\r\nconst RULES: Record<Exclude<Family, 'plain'>, Rule[]> = {\r\n script: [\r\n { type: 'comment', re: sticky(String.raw`\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)`) },\r\n { type: 'string', re: sticky(String.raw`\"(?:\\\\.|[^\"\\\\\\n])*\"?|'(?:\\\\.|[^'\\\\\\n])*'?|\\`(?:\\\\[\\s\\S]|[^\\`\\\\])*\\`?`) },\r\n { type: 'number', re: sticky(String.raw`\\b(?:0[xX][\\da-fA-F_]+|\\d[\\d_]*(?:\\.\\d+)?(?:[eE][+-]?\\d+)?n?)\\b`) },\r\n { type: 'punctuation', re: sticky(String.raw`[{}()[\\];,.]`) },\r\n { type: 'operator', re: sticky(String.raw`=>|[=!<>]=?=?|&&|\\|\\||\\?\\??|[+\\-*/%&|^~:]`) },\r\n ],\r\n json: [\r\n { type: 'property', re: sticky(String.raw`\"(?:\\\\.|[^\"\\\\\\n])*\"(?=\\s*:)`) },\r\n { type: 'string', re: sticky(String.raw`\"(?:\\\\.|[^\"\\\\\\n])*\"?`) },\r\n { type: 'number', re: sticky(String.raw`-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b`) },\r\n { type: 'keyword', re: sticky(String.raw`\\b(?:true|false|null)\\b`) },\r\n { type: 'punctuation', re: sticky(String.raw`[{}[\\],:]`) },\r\n ],\r\n css: [\r\n { type: 'comment', re: sticky(String.raw`\\/\\*[\\s\\S]*?(?:\\*\\/|$)`) },\r\n { type: 'string', re: sticky(String.raw`\"(?:\\\\.|[^\"\\\\\\n])*\"?|'(?:\\\\.|[^'\\\\\\n])*'?`) },\r\n { type: 'keyword', re: sticky(String.raw`@[\\w-]+|!important`) },\r\n { type: 'property', re: sticky(String.raw`--[\\w-]+|[a-zA-Z-]+(?=\\s*:(?!:))`) },\r\n { type: 'number', re: sticky(String.raw`#[\\da-fA-F]{3,8}\\b|-?\\d*\\.?\\d+(?:%|[a-zA-Z]+)?`) },\r\n { type: 'function', re: sticky(String.raw`[\\w-]+(?=\\()`) },\r\n { type: 'punctuation', re: sticky(String.raw`[{}()[\\];,:]`) },\r\n ],\r\n markup: [\r\n { type: 'comment', re: sticky(String.raw`<!--[\\s\\S]*?(?:-->|$)`) },\r\n { type: 'tag', re: sticky(String.raw`<\\/?[A-Za-z][\\w.:-]*|\\/?>`) },\r\n { type: 'string', re: sticky(String.raw`\"[^\"\\n]*\"?|'[^'\\n]*'?`) },\r\n { type: 'attr', re: sticky(String.raw`[\\w:@.-]+(?==)`) },\r\n { type: 'punctuation', re: sticky(String.raw`[{}=]`) },\r\n ],\r\n shell: [\r\n { type: 'comment', re: sticky(String.raw`(?:^|(?<=\\s))#[^\\n]*`) },\r\n { type: 'string', re: sticky(String.raw`\"(?:\\\\.|[^\"\\\\])*\"?|'[^']*'?`) },\r\n { type: 'property', re: sticky(String.raw`\\$\\{?[\\w@#?*]+\\}?`) },\r\n { type: 'attr', re: sticky(String.raw`(?<=\\s)--?[\\w-]+(?:=[^\\s]*)?`) },\r\n { type: 'number', re: sticky(String.raw`\\b\\d+\\b`) },\r\n { type: 'operator', re: sticky(String.raw`&&|\\|\\||[|>&;]`) },\r\n ],\r\n};\r\n\r\nconst IDENT = /[A-Za-z_$][\\w$-]*/y;\r\nconst JSX_OPEN = /<\\/?(?:[A-Za-z][\\w.:-]*(?=[\\s/>])|(?=>))/y;\r\nconst JSX_CLOSE = /\\/?>/y;\r\nconst JSX_ATTR = /[A-Za-z_:][\\w:-]*(?==)/y;\r\n\r\nconst lastMeaningful = (tokens: Token[]) => {\r\n for (let i = tokens.length - 1; i >= 0; i--) if (tokens[i]!.text.trim()) return tokens[i]!;\r\n return null;\r\n};\r\n\r\n/** Typed tokens whose texts join back to `code` exactly. */\r\nexport function tokenize(code: string, language?: string): Token[] {\r\n const text = String(code ?? '');\r\n const family = languageFamily(language);\r\n if (family === 'plain') return text ? [{ type: 'plain', text }] : [];\r\n const rules = RULES[family];\r\n const jsx = family === 'script' && JSX.has((language ?? '').trim().toLowerCase());\r\n const tokens: Token[] = [];\r\n const push = (type: TokenType, value: string) => {\r\n const last = tokens[tokens.length - 1];\r\n if (last && last.type === 'plain' && type === 'plain') last.text += value;\r\n else tokens.push({ type, text: value });\r\n };\r\n const take = (re: RegExp, at: number) => {\r\n re.lastIndex = at;\r\n const match = re.exec(text);\r\n return match && match[0] ? match[0] : null;\r\n };\r\n let i = 0;\r\n // Inside `<…>` (markup and JSX), and how deep in JSX children we are.\r\n let inTag = false;\r\n let closing = false;\r\n let depth = 0;\r\n scan: while (i < text.length) {\r\n if (jsx) {\r\n if (!inTag) {\r\n const open = take(JSX_OPEN, i);\r\n const before = lastMeaningful(tokens);\r\n // `a < b` is a comparison; a tag follows `(`, `{`, `=`, `return`, another tag or JSX children.\r\n if (open && (depth > 0 || !before || /[({>=,?:;[]$/.test(before.text) || before.text === 'return')) {\r\n push('tag', open);\r\n inTag = true;\r\n closing = open.startsWith('</');\r\n i += open.length;\r\n continue;\r\n }\r\n } else {\r\n const close = take(JSX_CLOSE, i);\r\n if (close) {\r\n push('tag', close);\r\n inTag = false;\r\n if (closing) depth = Math.max(0, depth - 1);\r\n else if (close === '>') depth += 1;\r\n i += close.length;\r\n continue;\r\n }\r\n const attr = take(JSX_ATTR, i);\r\n if (attr) {\r\n push('attr', attr);\r\n i += attr.length;\r\n continue;\r\n }\r\n }\r\n }\r\n // Markup outside tags: only comments and tags count; the rest is text.\r\n const usable = family === 'markup' && !inTag ? rules.slice(0, 2) : rules;\r\n for (const rule of usable) {\r\n const match = take(rule.re, i);\r\n if (!match) continue;\r\n if (family === 'markup' && rule.type === 'tag') inTag = !match.endsWith('>');\r\n push(rule.type, match);\r\n i += match.length;\r\n continue scan;\r\n }\r\n if (family === 'script' || family === 'shell') {\r\n const found = take(IDENT, i);\r\n if (found) {\r\n const word = family === 'script' ? found.replace(/-.*$/, '') : found;\r\n const after = text.slice(i + word.length).match(/^\\s*(\\S)/)?.[1];\r\n const before = lastMeaningful(tokens);\r\n let type: TokenType = 'plain';\r\n if ((family === 'script' ? SCRIPT_KEYWORDS : SHELL_KEYWORDS).has(word)) type = 'keyword';\r\n else if (after === '(') type = 'function';\r\n else if (family === 'script' && before?.text === '.') type = 'property';\r\n else if (family === 'shell' && /(?:^|[\\n|;&])[ \\t]*$/.test(text.slice(0, i))) type = 'function';\r\n else if (family === 'script' && /^[A-Z]/.test(word)) type = 'function';\r\n push(type, word);\r\n i += word.length;\r\n continue;\r\n }\r\n }\r\n push('plain', text[i]!);\r\n i += 1;\r\n }\r\n return tokens;\r\n}\r\n\r\n/** Tokens split into lines (a token spanning lines is cut at each newline). */\r\nexport function tokenLines(tokens: Token[]): Token[][] {\r\n const lines: Token[][] = [[]];\r\n for (const token of tokens) {\r\n const parts = token.text.split('\\n');\r\n parts.forEach((part, index) => {\r\n if (index) lines.push([]);\r\n if (part) lines[lines.length - 1]!.push({ type: token.type, text: part });\r\n });\r\n }\r\n return lines;\r\n}\r\n\r\n/**\r\n * Write highlighted code into `target`: one [data-mk-code-line] per line, joined\r\n * by newline text nodes, so `target.textContent` is the code itself.\r\n */\r\nexport function renderCode(target: Element, code: string, language?: string, highlight: number[] = []) {\r\n const marked = new Set(highlight);\r\n const lines = tokenLines(tokenize(code, language));\r\n // A final newline ends the last line; it does not open an empty one (the text node stays).\r\n const trailing = lines.length > 1 && !lines[lines.length - 1]!.length;\r\n if (trailing) lines.pop();\r\n const nodes: Node[] = [];\r\n lines.forEach((line, index) => {\r\n if (index) nodes.push(document.createTextNode('\\n'));\r\n const row = document.createElement('span');\r\n row.dataset.mkCodeLine = '';\r\n if (marked.has(index + 1)) row.dataset.mkHighlight = '';\r\n for (const token of line) {\r\n if (token.type === 'plain') {\r\n row.append(token.text);\r\n continue;\r\n }\r\n const span = document.createElement('span');\r\n span.dataset.mkToken = token.type;\r\n span.textContent = token.text;\r\n row.append(span);\r\n }\r\n nodes.push(row);\r\n });\r\n if (trailing) nodes.push(document.createTextNode('\\n'));\r\n target.replaceChildren(...nodes);\r\n}\r\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { press } from '../../motion/micro';\nimport { languageFamily, renderCode } from './highlight';\n\n/*\n * Code block: <pre><code> with optional title/language header, line numbers and\n * a copy button. Code is always text (textContent), so markup-looking strings\n * show as code. Copy writes the exact string with the Clipboard API and reports\n * success or failure in a polite status; on failure the code is selected so it\n * can be copied by hand. A copy that finishes after destroy changes nothing.\n * Parts (made when absent): pre > code, [data-mk-code-copy], [data-mk-code-status].\n */\n\nexport interface CodeBlockOptions {\n /** The code; omitted, the text already in <code> is used (and read at copy time). */\n code?: string;\n language?: string;\n title?: string;\n lineNumbers?: boolean;\n /** Colour the syntax (default: when the language is supported). */\n highlight?: boolean;\n /** 1-based lines to mark. */\n highlightLines?: number[];\n copyLabel?: string;\n copiedLabel?: string;\n errorLabel?: string;\n onCopy?: (ok: boolean) => void;\n}\n\nexport interface CodeBlockInstance extends Instance {\n setCode(code: string): void;\n /** Copy the code; resolves true when the clipboard took it. */\n copy(): Promise<boolean>;\n readonly code: string;\n}\n\nconst COPY_ICON =\n '<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\"><rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2.5\"/><path d=\"M5 15V6a2 2 0 0 1 2-2h8\"/></svg>';\nconst FEEDBACK_MS = 2000;\n\n/**\n * New code flows in line by line: opacity, blur 12 and an 8 px drop through the\n * --mk-line-y custom property (no measured transform, so the newline text nodes\n * between lines never move). Capped at 40 lines so long files stay quick.\n */\nexport function flowLines(root: Element | null) {\n if (!root || reduced()) return null;\n registerMotion();\n const lines = [...root.querySelectorAll('[data-mk-code-line]')].slice(0, 40);\n if (!lines.length) return null;\n return gsap.fromTo(\n lines,\n { opacity: 0, filter: 'blur(12px)', '--mk-line-y': '-8px' },\n { opacity: 1, filter: 'blur(0px)', '--mk-line-y': '0px', duration: 0.4, ease: 'power2.out', stagger: 0.015, clearProps: 'opacity,filter,--mk-line-y' },\n );\n}\n\n/** Line count of a code string (a final newline does not open a line). */\nexport const codeLines = (code: string) => Math.max(1, code.replace(/\\n$/, '').split('\\n').length);\n\nexport function createCodeBlock(root: HTMLElement | null, options: CodeBlockOptions = {}): CodeBlockInstance {\n if (!root) return inert({ setCode() {}, copy: async () => false, code: '' });\n registerMotion();\n const scope = createScope();\n const copyLabel = options.copyLabel ?? 'Copiar';\n const copiedLabel = options.copiedLabel ?? 'Copiado';\n const errorLabel = options.errorLabel ?? 'No se pudo copiar';\n const made = <K extends keyof HTMLElementTagNameMap>(tag: K, place: (element: HTMLElementTagNameMap[K]) => void) => {\n const element = document.createElement(tag);\n place(element);\n scope.add(() => element.remove());\n return element;\n };\n\n let pre = root.querySelector('pre');\n if (!pre) pre = made('pre', (element) => root.append(element));\n let code = pre.querySelector('code');\n if (!code) code = made('code', (element) => pre!.append(element));\n const authoredText = code.textContent ?? '';\n let owned = false;\n let text = authoredText;\n /** From now on the engine writes the text (and puts the authored one back on destroy). */\n const own = () => {\n if (owned) return;\n owned = true;\n scope.add(() => (code!.textContent = authoredText));\n };\n if (options.code !== undefined) {\n own();\n text = options.code;\n }\n\n // The editor bar: three quiet dots, the file name, the language and the copy button.\n let header = root.querySelector<HTMLElement>('[data-mk-code-header]');\n if (!header) {\n header = made('div', (element) => root.prepend(element));\n header.dataset.mkCodeHeader = '';\n const dots = document.createElement('span');\n dots.dataset.mkCodeDots = '';\n dots.setAttribute('aria-hidden', 'true');\n dots.append(document.createElement('i'), document.createElement('i'), document.createElement('i'));\n header.append(dots);\n const name = document.createElement('span');\n name.dataset.mkCodeTitle = '';\n name.textContent = options.title ?? '';\n header.append(name);\n if (options.language) {\n const language = document.createElement('span');\n language.dataset.mkCodeLanguage = '';\n language.textContent = options.language;\n header.append(language);\n }\n }\n if (!root.querySelector('[data-mk-code-copy]')) {\n const button = made('button', (element) => (header ?? root).append(element));\n button.type = 'button';\n button.dataset.mkCodeCopy = '';\n button.innerHTML = `${COPY_ICON}<span data-mk-code-copy-text>${copyLabel.replace(/[&<>\"]/g, (c) => `&#${c.charCodeAt(0)};`)}</span>`;\n }\n for (const button of root.querySelectorAll<HTMLButtonElement>('button[data-mk-code-copy]')) if (!button.hasAttribute('type')) scope.attr(button, 'type', 'button');\n let status = root.querySelector<HTMLElement>('[data-mk-code-status]');\n if (!status) {\n status = made('span', (element) => root.append(element));\n status.dataset.mkCodeStatus = '';\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n } else if (!status.matches('output') && !status.hasAttribute('role')) scope.attr(status, 'role', 'status');\n const statusText = status.textContent;\n scope.add(() => (status!.textContent = statusText));\n\n // Long lines scroll: the region takes keyboard focus so it can be scrolled.\n if (!pre.hasAttribute('tabindex')) scope.attr(pre, 'tabindex', '0');\n if (options.language) scope.attr(root, 'data-mk-language', options.language);\n if (options.lineNumbers) scope.attr(root, 'data-mk-line-numbers', '');\n scope.attr(root, 'data-mk-ready', '');\n\n // A framework that already rendered the lines owns them; the engine only copies.\n const prerendered = Boolean(code.querySelector('[data-mk-code-line]'));\n /** Text given through setCode while a framework renders the lines. */\n let given: string | null = null;\n const highlight = !prerendered && (options.highlight ?? languageFamily(options.language) !== 'plain');\n if (highlight) own();\n const render = () => {\n if (highlight) renderCode(code!, text, options.language, options.highlightLines);\n else if (owned) code!.textContent = text;\n };\n render();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n /** The copy button springs to the width of its new label (Melonmind's playful curve). */\n const resize = (change: () => void) => {\n const buttons = [...root.querySelectorAll<HTMLElement>('[data-mk-code-copy]')];\n const before = buttons.map((button) => button.getBoundingClientRect().width);\n change();\n if (reduced()) return;\n buttons.forEach((button, i) => {\n const after = button.getBoundingClientRect().width;\n if (!before[i] || !after || Math.abs(after - before[i]!) < 1) return;\n keep(gsap.fromTo(button, { width: before[i] }, { width: after, duration: 0.45, ease: EASE.playful, clearProps: 'width' }));\n });\n };\n\n let attempt = 0;\n const feedback = (ok: boolean) => {\n // The button shows the outcome too (CSS reads data-mk-feedback) and springs to its width.\n const labels = [...root.querySelectorAll<HTMLElement>('[data-mk-code-copy-text]')];\n resize(() => {\n scope.attr(root, 'data-mk-copied', ok ? '' : null);\n scope.attr(root, 'data-mk-copy-error', ok ? null : '');\n for (const label of labels) scope.attr(label, 'data-mk-feedback', ok ? copiedLabel : errorLabel);\n });\n for (const button of root.querySelectorAll('[data-mk-code-copy]')) keep(press(button));\n status!.textContent = ok ? copiedLabel : errorLabel;\n const mine = attempt;\n scope.timeout(() => {\n if (mine !== attempt) return;\n resize(() => {\n scope.attr(root, 'data-mk-copied', null);\n scope.attr(root, 'data-mk-copy-error', null);\n for (const label of labels) scope.attr(label, 'data-mk-feedback', null);\n });\n }, FEEDBACK_MS);\n };\n const selectCode = () => {\n const selection = typeof getSelection === 'function' ? getSelection() : null;\n if (!selection) return;\n const range = document.createRange();\n range.selectNodeContents(code!);\n selection.removeAllRanges();\n selection.addRange(range);\n };\n const current = () => given ?? (owned ? text : ((code!.isConnected ? code : root.querySelector('code'))?.textContent ?? ''));\n\n const copy = async () => {\n if (scope.disposed) return false;\n const mine = ++attempt;\n const value = current();\n let ok = false;\n try {\n if (!navigator.clipboard?.writeText) throw new Error('clipboard unavailable');\n await navigator.clipboard.writeText(value);\n ok = true;\n } catch {\n ok = false;\n }\n // Destroyed (or a newer copy started) meanwhile: leave the DOM alone.\n if (scope.disposed) return false;\n if (mine !== attempt) return ok;\n feedback(ok);\n if (!ok) selectCode();\n options.onCopy?.(ok);\n root.dispatchEvent(new CustomEvent('mk:copy', { bubbles: true, detail: { ok, code: value } }));\n return ok;\n };\n\n // Delegated: a framework may replace the button.\n scope.on(root, 'click', (event) => {\n const button = (event.target as Element | null)?.closest('[data-mk-code-copy]');\n if (button && root.contains(button)) void copy();\n });\n\n return {\n setCode(next) {\n if (scope.disposed) return;\n // Framework-rendered lines: only the text to copy changes.\n if (prerendered) {\n given = String(next);\n return;\n }\n own();\n const changed = text !== String(next);\n text = String(next);\n render();\n if (changed && highlight) keep(flowLines(code));\n },\n copy,\n get code() {\n return current();\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { createMenu, type MenuInstance, type MenuOptions } from '../menu/engine';\n\n/*\n * Context menu: the options menu (same surface, cascade, arrows/Home/End,\n * Enter, Escape, disabled items) opened by a right click at the pointer, by\n * the Menu key or Shift+F10 beside the focused element, or by a long press on\n * touch. It scales in where it opens (no morph from a phantom source), stays\n * inside the viewport and gives focus back to the element focused before it.\n * Inputs and editable text keep the browser's own menu unless overrideEditable.\n * Parts: [data-mk-context-trigger] (else the root) and dialog[data-mk-context-menu].\n */\n\nexport interface ContextMenuOptions extends Omit<MenuOptions, 'triggers' | 'anchor'> {\n /** Replace the browser menu on inputs and editable text too. */\n overrideEditable?: boolean;\n /** Touch long press that opens it, in ms (0: off). Default 550. */\n longPress?: number;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface ContextMenuInstance extends Instance {\n /** Open at viewport coordinates; focus returns to `origin` (default: the focused element). */\n openAt(x: number, y: number, origin?: HTMLElement | null): void;\n /** Open beside `origin` (default: the focused element in the trigger, else the trigger). */\n open(origin?: HTMLElement | null): void;\n close(): void;\n readonly isOpen: boolean;\n readonly menu: MenuInstance | null;\n}\n\nconst TRIGGER = '[data-mk-context-trigger]';\nconst EDITABLE = 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"])';\nconst SLOP = 10;\n\nconst pointBox = (x: number, y: number) =>\n ({ x, y, left: x, top: y, right: x, bottom: y, width: 0, height: 0, toJSON: () => ({ x, y }) }) as DOMRect;\n\nconst focusable = (element: Element | null): element is HTMLElement =>\n element instanceof HTMLElement && element !== document.body && element.isConnected && !element.hasAttribute('disabled') && (element.tabIndex >= 0 || element.matches('a[href], button, input, select, textarea, [tabindex]'));\n\nexport function createContextMenu(root: HTMLElement | null, options: ContextMenuOptions = {}): ContextMenuInstance {\n const trigger = root ? (root.matches(TRIGGER) ? root : root.querySelector<HTMLElement>(TRIGGER) ?? root) : null;\n const dialog = root?.querySelector<HTMLElement>('[data-mk-context-menu]') ?? null;\n if (!root || !trigger || !dialog) {\n warnOnce('context-menu: needs a [data-mk-context-menu] <dialog> inside the root');\n return inert({ openAt() {}, open() {}, close() {}, isOpen: false, menu: null });\n }\n const scope = createScope();\n const { overrideEditable = false, longPress = 550, onOpenChange, ...menuOptions } = options;\n let box: DOMRect | null = null;\n let returnTo: HTMLElement | null = null;\n\n const menu = createMenu(dialog, { ...menuOptions, triggers: false, anchor: () => box });\n scope.add(() => menu.destroy());\n if (!focusable(trigger)) scope.attr(trigger, 'tabindex', '0');\n scope.attr(trigger, 'aria-haspopup', 'menu');\n scope.attr(root, 'data-mk-ready', '');\n\n const inMenu = (target: EventTarget | null) => target instanceof Node && dialog.contains(target);\n const editable = (target: EventTarget | null) => !overrideEditable && target instanceof Element && Boolean(target.closest(EDITABLE));\n\n const show = (rect: DOMRect, origin: HTMLElement | null) => {\n if (scope.disposed || menu.isOpen) return;\n box = rect;\n const active = document.activeElement;\n returnTo = origin ?? (focusable(active) && !inMenu(active) ? active : focusable(trigger) ? trigger : null);\n // null: no morph source; the menu scales in where it is placed.\n menu.open(null);\n };\n const openAt = (x: number, y: number, origin?: HTMLElement | null) => {\n if (!Number.isFinite(x) || !Number.isFinite(y)) return;\n show(pointBox(x, y), origin ?? null);\n };\n const open = (origin?: HTMLElement | null) => {\n const active = document.activeElement;\n const from = origin ?? (active instanceof HTMLElement && trigger.contains(active) && !inMenu(active) ? active : trigger);\n show(from.getBoundingClientRect(), from);\n };\n\n scope.on(dialog, 'mk:open', () => {\n scope.attr(trigger, 'aria-expanded', 'true');\n onOpenChange?.(true);\n });\n scope.on(dialog, 'mk:closed', () => {\n scope.attr(trigger, 'aria-expanded', null);\n box = null;\n const target = returnTo;\n returnTo = null;\n if (target?.isConnected) target.focus({ preventScroll: true });\n onOpenChange?.(false);\n });\n\n scope.on(trigger, 'contextmenu', (event) => {\n if (inMenu(event.target)) {\n event.preventDefault();\n return;\n }\n if (editable(event.target)) return;\n event.preventDefault();\n if (menu.isOpen) return;\n const mouse = event as MouseEvent;\n // A keyboard-made contextmenu has no pointer position worth using.\n if (mouse.button === 0 && mouse.clientX === 0 && mouse.clientY === 0) open();\n else openAt(mouse.clientX, mouse.clientY);\n });\n scope.on(trigger, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if (inMenu(key.target) || !(key.key === 'ContextMenu' || (key.key === 'F10' && key.shiftKey))) return;\n if (editable(key.target)) return;\n key.preventDefault();\n open(key.target instanceof HTMLElement && trigger.contains(key.target) ? key.target : trigger);\n });\n\n if (longPress > 0) {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let start: { x: number; y: number } | null = null;\n const cancel = () => {\n clearTimeout(timer);\n timer = undefined;\n start = null;\n };\n scope.on(trigger, 'pointerdown', (event) => {\n const pointer = event as PointerEvent;\n if (pointer.pointerType !== 'touch' || inMenu(pointer.target) || editable(pointer.target)) return;\n cancel();\n start = { x: pointer.clientX, y: pointer.clientY };\n timer = setTimeout(() => {\n const at = start;\n cancel();\n if (at) openAt(at.x, at.y, focusable(trigger) ? trigger : null);\n }, longPress);\n });\n scope.on(trigger, 'pointermove', (event) => {\n const pointer = event as PointerEvent;\n if (start && Math.hypot(pointer.clientX - start.x, pointer.clientY - start.y) > SLOP) cancel();\n });\n for (const type of ['pointerup', 'pointercancel', 'pointerleave']) scope.on(trigger, type, cancel);\n scope.add(cancel);\n }\n\n return {\n openAt,\n open,\n close: () => menu.close(),\n get isOpen() {\n return menu.isOpen;\n },\n menu,\n destroy: () => scope.dispose(),\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, warnOnce } from '../../core/types';\nimport { createDialog, type DialogInstance, type DialogOptions } from '../dialog/engine';\n\n/*\n * Drawer: the dialog engine (native <dialog>, focus, Escape, backdrop, return\n * to the opener, data-mk-close/[data-mk-part=\"close\"] buttons) as a side panel\n * that slides in from the left or right on the sheet curve, or a bottom sheet\n * (the existing sheet variant, with drag to dismiss). Modal drawers lock the\n * page scroll while open. Parts: header, title, description, body, footer, close.\n */\n\nexport type DrawerSide = 'left' | 'right' | 'bottom';\n\nexport interface DrawerOptions extends Omit<DialogOptions, 'variant' | 'placement' | 'float' | 'anchor' | 'animateContent'> {\n side?: DrawerSide;\n}\n\nexport type DrawerInstance = DialogInstance;\n\nexport function createDrawer(dialog: HTMLElement | null, options: DrawerOptions = {}): DrawerInstance {\n if (!dialog) {\n warnOnce('drawer: missing <dialog> element');\n return inert({ open() {}, close() {}, toggle() {}, float() {}, dock() {}, isOpen: false, isFloating: false, element: null as unknown as HTMLElement });\n }\n const scope = createScope();\n const side: DrawerSide = options.side === 'left' || options.side === 'bottom' ? options.side : 'right';\n const { side: _side, ...rest } = options;\n scope.attr(dialog, 'data-mk-drawer', side);\n const surface = createDialog(dialog, {\n ...rest,\n variant: side === 'bottom' ? 'sheet' : 'drawer',\n // Side panels are full height: they do not resize or drag down.\n autoResize: side === 'bottom' ? options.autoResize : false,\n drag: side === 'bottom' ? options.drag ?? true : false,\n float: false,\n });\n return {\n open: surface.open,\n close: surface.close,\n toggle: surface.toggle,\n float() {},\n dock() {},\n get isOpen() {\n return surface.isOpen;\n },\n get isFloating() {\n return false;\n },\n element: dialog,\n destroy() {\n surface.destroy();\n scope.dispose();\n },\n };\n}\n","import { createScope } from '../../core/scope';\r\nimport { inert, type Instance } from '../../core/types';\r\nimport { createHoverCard, type HoverCardInstance, type HoverCardOptions } from '../hover-card/engine';\r\n\r\n/*\r\n * Link preview: a resource card (thumbnail or domain initial, site, title,\r\n * description) around a real link, or a link that previews that card in a\r\n * hover card (pointer, focus, tap). The app supplies the metadata; nothing is\r\n * fetched. Links accept http(s) and relative URLs only; strings are text; a\r\n * thumbnail that fails to load gives way to the domain initial.\r\n * Made into an empty root; with authored markup ([data-mk-link-card],\r\n * img[data-mk-link-image], [data-mk-hover-trigger]) only the behaviour is added.\r\n */\r\n\r\n/** card: image on top (default); row: thumbnail beside the text; hover: a link that previews the card. */\r\nexport type LinkPreviewVariant = 'card' | 'row' | 'hover';\r\n\r\n/** The arrow of the card's go button (decorative). */\r\nconst GO_ICON =\r\n '<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=\"M7 17L17 7M9 7h8v8\"/></svg>';\r\n\r\nexport interface LinkPreviewOptions extends Pick<HoverCardOptions, 'openDelay' | 'closeDelay' | 'placement' | 'onOpenChange'> {\r\n url?: string;\r\n title?: string;\r\n description?: string;\r\n /** Thumbnail URL (http(s), relative, data:image or blob). */\r\n image?: string;\r\n imageAlt?: string;\r\n siteName?: string;\r\n variant?: LinkPreviewVariant;\r\n /** Text of the hover variant's link (default: the title). */\r\n label?: string;\r\n /** '_blank' opens a new tab (with rel=\"noopener noreferrer\"). */\r\n target?: string;\r\n}\r\n\r\nexport interface LinkPreviewInstance extends Instance {\r\n /** The link actually used (null when the URL was refused). */\r\n readonly href: string | null;\r\n readonly hoverCard: HoverCardInstance | null;\r\n}\r\n\r\n// Browsers drop tabs/newlines inside URLs (\"java\\nscript:\"): check what they will see.\r\nconst squash = (url: string) => url.replace(/[\\u0000- \\u007f]+/g, '');\r\nconst schemeOf = (url: string) => /^([a-z][a-z\\d+.-]*):/i.exec(squash(url))?.[1]?.toLowerCase() ?? null;\r\n\r\n/** http(s) or relative links; anything else (javascript:, data:, vbscript:…) is null. */\r\nexport function safeHref(url: string | null | undefined): string | null {\r\n if (typeof url !== 'string' || !url.trim()) return null;\r\n const scheme = schemeOf(url.trim());\r\n return scheme === null || scheme === 'http' || scheme === 'https' ? url.trim() : null;\r\n}\r\n\r\n/** Image sources: http(s), relative, blob: and data:image/… */\r\nexport function safeImage(url: string | null | undefined): string | null {\r\n if (typeof url !== 'string' || !url.trim()) return null;\r\n const value = url.trim();\r\n const scheme = schemeOf(value);\r\n if (scheme === null || scheme === 'http' || scheme === 'https' || scheme === 'blob') return value;\r\n return scheme === 'data' && /^data:image\\//i.test(squash(value)) ? value : null;\r\n}\r\n\r\n/** Host without www. of an absolute link; relative links have none (same on server and client). */\r\nexport function linkDomain(href: string | null) {\r\n if (!href) return '';\r\n try {\r\n return new URL(href.startsWith('//') ? `https:${href}` : href).hostname.replace(/^www\\./, '');\r\n } catch {\r\n return '';\r\n }\r\n}\r\n\r\nlet sequence = 0;\r\n\r\nconst part = (tag: string, name: string, text?: string) => {\r\n const element = document.createElement(tag);\r\n element.dataset.mkPart = name;\r\n if (text !== undefined) element.textContent = text;\r\n return element;\r\n};\r\n\r\n/** The card markup (also used by the hover panel). Text only; the href is already safe. */\r\nfunction buildCard(options: LinkPreviewOptions, href: string | null) {\r\n const domain = linkDomain(href);\r\n // Spans (not divs): the hover variant lives inside running text.\r\n const card = document.createElement(href ? 'a' : 'span');\r\n card.dataset.mkLinkCard = '';\r\n if (href) {\r\n card.setAttribute('href', href);\r\n if (options.target) {\r\n card.setAttribute('target', options.target);\r\n if (options.target === '_blank') card.setAttribute('rel', 'noopener noreferrer');\r\n }\r\n }\r\n const id = `mk-link-${++sequence}`;\r\n const media = part('span', 'media');\r\n const fallback = part('span', 'fallback', (options.siteName || domain || options.title || '?').trim().charAt(0).toUpperCase());\r\n fallback.setAttribute('aria-hidden', 'true');\r\n media.append(fallback);\r\n const image = safeImage(options.image);\r\n if (image) {\r\n const img = document.createElement('img');\r\n img.dataset.mkLinkImage = '';\r\n img.alt = options.imageAlt ?? '';\r\n img.loading = 'lazy';\r\n img.decoding = 'async';\r\n img.src = image;\r\n media.append(img);\r\n }\r\n const text = part('span', 'text');\r\n const site = [options.siteName, domain].filter(Boolean).filter((value, i, all) => all.indexOf(value) === i).join(' · ');\r\n if (site) {\r\n const meta = part('span', 'meta');\r\n const favicon = part('span', 'favicon', (options.siteName || domain).trim().charAt(0).toUpperCase());\r\n favicon.setAttribute('aria-hidden', 'true');\r\n meta.append(favicon, part('span', 'site', site));\r\n text.append(meta);\r\n }\r\n const title = part('span', 'title', options.title || domain || href || '');\r\n title.id = `${id}-title`;\r\n text.append(title);\r\n if (options.description) {\r\n const description = part('span', 'description', options.description);\r\n description.id = `${id}-description`;\r\n text.append(description);\r\n card.setAttribute('aria-describedby', description.id);\r\n }\r\n card.setAttribute('aria-labelledby', title.id);\r\n const go = part('span', 'go');\r\n go.setAttribute('aria-hidden', 'true');\r\n go.innerHTML = GO_ICON;\r\n card.append(media, text, go);\r\n return card;\r\n}\r\n\r\nexport function createLinkPreview(root: HTMLElement | null, options: LinkPreviewOptions = {}): LinkPreviewInstance {\r\n if (!root) return inert({ href: null, hoverCard: null });\r\n const scope = createScope();\r\n const variant: LinkPreviewVariant = options.variant === 'hover' || options.variant === 'row' ? options.variant : 'card';\r\n const href = safeHref(options.url);\r\n const authored = root.querySelector('[data-mk-link-card], [data-mk-hover-trigger]');\r\n const made: Node[] = [];\r\n if (!authored) {\r\n const card = buildCard(options, href);\r\n if (variant === 'hover') {\r\n const trigger = document.createElement(href ? 'a' : 'span');\r\n trigger.dataset.mkHoverTrigger = '';\r\n if (href) trigger.setAttribute('href', href);\r\n else trigger.tabIndex = 0;\r\n if (href && options.target) {\r\n trigger.setAttribute('target', options.target);\r\n if (options.target === '_blank') trigger.setAttribute('rel', 'noopener noreferrer');\r\n }\r\n trigger.textContent = options.label || options.title || linkDomain(href) || href || '';\r\n const panel = document.createElement('span');\r\n panel.dataset.mkHoverPanel = '';\r\n panel.setAttribute('role', 'region');\r\n panel.setAttribute('aria-label', `Vista previa: ${options.title || linkDomain(href)}`);\r\n panel.hidden = true;\r\n panel.append(card);\r\n made.push(trigger, panel);\r\n } else made.push(card);\r\n root.append(...made);\r\n scope.add(() => made.forEach((node) => node.parentNode?.removeChild(node)));\r\n }\r\n scope.attr(root, 'data-mk-link-variant', variant);\r\n if (variant === 'hover' && !root.classList.contains('mk-hover-card')) {\r\n scope.attr(root, 'class', root.getAttribute('class'));\r\n root.classList.add('mk-hover-card');\r\n }\r\n scope.attr(root, 'data-mk-ready', '');\r\n\r\n // A thumbnail that fails gives way to the initial (listeners go with destroy).\r\n for (const img of root.querySelectorAll<HTMLImageElement>('img[data-mk-link-image]')) {\r\n const failed = () => {\r\n scope.attr(img, 'hidden', '');\r\n scope.attr(root, 'data-mk-image', 'error');\r\n };\r\n scope.on(img, 'error', failed);\r\n }\r\n\r\n const hoverCard = root.querySelector('[data-mk-hover-trigger]') ? createHoverCard(root, options) : null;\r\n if (hoverCard) scope.add(() => hoverCard.destroy());\r\n\r\n return {\r\n get href() {\r\n return href ?? root.querySelector<HTMLAnchorElement>('a[data-mk-link-card], a[data-mk-hover-trigger]')?.getAttribute('href') ?? null;\r\n },\r\n hoverCard,\r\n destroy: () => scope.dispose(),\r\n };\r\n}\r\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\r\nimport { reduced } from '../../core/reduced';\r\nimport { createScope } from '../../core/scope';\r\nimport { inert, type Instance } from '../../core/types';\r\nimport { burst, rollDigits } from '../../motion/micro';\r\n\r\n/*\r\n * Progress: a bar or a ring (Melon Mind's MetricsRing: radius (size - stroke) / 2,\r\n * dasharray from the ratio, starting at 12 o'clock). The root is the progressbar;\r\n * the drawing is one decorative [data-mk-progress-visual] child. ARIA follows a\r\n * new value at once; the drawing glides to it with GSAP (Melonmind's playful\r\n * swing, .38,.49,0,1.5): going up, a light runs at the head and the figure rolls\r\n * up; going down, the figure rolls down. Reaching the maximum fires a small burst.\r\n * null is indeterminate. Nothing is live: assistive tech reads the value on arrival.\r\n */\r\n\r\nexport type ProgressVariant = 'linear' | 'ring';\r\n\r\nexport interface ProgressOptions {\r\n /** Current value; null is indeterminate. Default: min. */\r\n value?: number | null;\r\n min?: number;\r\n max?: number;\r\n label?: string;\r\n variant?: ProgressVariant;\r\n /** Write the percentage beside the bar (inside the ring). */\r\n showValue?: boolean;\r\n /** Text for the value (also aria-valuetext). Default: rounded percentage. */\r\n formatValue?: (value: number, ratio: number) => string;\r\n /** Glide duration in seconds (default .7). */\r\n duration?: number;\r\n}\r\n\r\nexport interface ProgressInstance extends Instance {\r\n setValue(value: number | null): void;\r\n readonly value: number | null;\r\n}\r\n\r\nconst SVG = 'http://www.w3.org/2000/svg';\r\nconst RING_SIZE = 48;\r\nconst RING_STROKE = 5;\r\nconst RADIUS = (RING_SIZE - RING_STROKE) / 2;\r\nconst CIRCUMFERENCE = 2 * Math.PI * RADIUS;\r\n\r\nconst finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\r\n\r\nexport function createProgress(root: HTMLElement | null, options: ProgressOptions = {}): ProgressInstance {\r\n if (!root) return inert({ setValue() {}, value: null });\r\n registerMotion();\r\n const scope = createScope();\r\n const min = finite(options.min) ? options.min : 0;\r\n const max = finite(options.max) && options.max > min ? options.max : Math.max(min + 1, 100);\r\n const variant: ProgressVariant = options.variant === 'ring' ? 'ring' : 'linear';\r\n const duration = finite(options.duration) ? Math.max(0, options.duration) : 0.7;\r\n const clamp = (n: number) => Math.min(max, Math.max(min, n));\r\n let value: number | null = options.value === null ? null : clamp(finite(options.value) ? options.value : min);\r\n\r\n const visual = document.createElement('span');\r\n visual.dataset.mkProgressVisual = '';\r\n visual.setAttribute('aria-hidden', 'true');\r\n let arc: SVGCircleElement | null = null;\r\n let head: HTMLElement | null = null;\r\n let ring: SVGSVGElement | null = null;\r\n if (variant === 'ring') {\r\n ring = document.createElementNS(SVG, 'svg');\r\n ring.setAttribute('viewBox', `0 0 ${RING_SIZE} ${RING_SIZE}`);\r\n ring.dataset.mkPart = 'ring';\r\n const circle = (part: string) => {\r\n const element = document.createElementNS(SVG, 'circle');\r\n element.setAttribute('cx', String(RING_SIZE / 2));\r\n element.setAttribute('cy', String(RING_SIZE / 2));\r\n element.setAttribute('r', String(RADIUS));\r\n element.setAttribute('fill', 'none');\r\n element.setAttribute('stroke-width', String(RING_STROKE));\r\n element.dataset.mkPart = part;\r\n ring!.append(element);\r\n return element;\r\n };\r\n circle('track');\r\n arc = circle('arc');\r\n arc.setAttribute('stroke-linecap', 'round');\r\n visual.append(ring);\r\n } else {\r\n const track = document.createElement('span');\r\n track.dataset.mkPart = 'track';\r\n const bar = document.createElement('span');\r\n bar.dataset.mkPart = 'bar';\r\n head = document.createElement('span');\r\n head.dataset.mkPart = 'head';\r\n track.append(bar, head);\r\n visual.append(track);\r\n }\r\n const text = options.showValue ? document.createElement('span') : null;\r\n if (text) {\r\n text.dataset.mkPart = 'value';\r\n visual.append(text);\r\n }\r\n root.append(visual);\r\n\r\n scope.attr(root, 'style', root.getAttribute('style'));\r\n scope.attr(root, 'role', 'progressbar');\r\n scope.attr(root, 'aria-valuemin', String(min));\r\n scope.attr(root, 'aria-valuemax', String(max));\r\n if (options.label) scope.attr(root, 'aria-label', options.label);\r\n scope.attr(root, 'data-mk-variant', variant);\r\n scope.attr(root, 'data-mk-ready', '');\r\n\r\n const ratioOf = (n: number | null) => (n === null ? 0 : (n - min) / (max - min));\r\n const labelOf = (n: number | null) => (n === null ? '' : options.formatValue ? options.formatValue(n, ratioOf(n)) : `${Math.round(ratioOf(n) * 100)} %`);\r\n /** What is drawn now (it trails `value` while gliding). */\r\n const shown = { ratio: ratioOf(value) };\r\n const draw = () => {\r\n const ratio = Math.min(1, Math.max(0, shown.ratio));\r\n root.style.setProperty('--mk-progress', ratio.toFixed(4));\r\n if (arc) {\r\n const length = value === null ? CIRCUMFERENCE * 0.25 : CIRCUMFERENCE * ratio;\r\n arc.setAttribute('stroke-dasharray', `${length.toFixed(2)} ${CIRCUMFERENCE.toFixed(2)}`);\r\n }\r\n };\r\n let glide: gsap.core.Tween | null = null;\r\n const motion: gsap.core.Animation[] = [];\r\n scope.add(() => {\r\n glide?.kill();\r\n for (const animation of motion.splice(0)) animation.progress(1).kill();\r\n visual.remove();\r\n });\r\n\r\n const render = (previous: number | null, animate: boolean) => {\r\n const label = labelOf(value);\r\n scope.attr(root, 'aria-valuenow', value === null ? null : String(value));\r\n scope.attr(root, 'aria-valuetext', value !== null && options.formatValue ? label : null);\r\n scope.attr(root, 'data-mk-indeterminate', value === null ? '' : null);\r\n scope.attr(root, 'data-mk-complete', value !== null && value >= max ? '' : null);\r\n const target = ratioOf(value);\r\n const direction: 1 | -1 = previous === null || value === null || value >= previous ? 1 : -1;\r\n glide?.kill();\r\n if (!animate || reduced() || value === null || previous === null || duration === 0) {\r\n shown.ratio = target;\r\n draw();\r\n if (text) text.textContent = label;\r\n return;\r\n }\r\n glide = gsap.to(shown, { ratio: target, duration, ease: EASE.swatch, onUpdate: draw });\r\n if (text) {\r\n const roll = rollDigits(text, label, direction);\r\n if (roll) motion.push(roll);\r\n }\r\n // Going up: a light runs at the head of the bar; the ring breathes.\r\n if (direction > 0 && head) motion.push(gsap.fromTo(head, { opacity: 1, scale: 0.4 }, { opacity: 0, scale: 1.6, duration: 0.6, ease: 'power2.out' }));\r\n if (ring) motion.push(gsap.fromTo(ring, { scale: direction > 0 ? 1.06 : 0.95 }, { scale: 1, duration: 0.5, ease: EASE.click, clearProps: 'scale,transform' }));\r\n if (value >= max && previous < max) {\r\n const done = burst(variant === 'ring' ? visual : (text ?? visual), { count: 6, distance: 22, ring: variant === 'ring' });\r\n if (done) motion.push(done);\r\n }\r\n if (motion.length > 12) motion.splice(0, motion.length - 12);\r\n };\r\n render(null, false);\r\n\r\n return {\r\n setValue(next) {\r\n if (scope.disposed) return;\r\n const previous = value;\r\n if (next === null) value = null;\r\n else if (finite(next)) value = clamp(next);\r\n else return;\r\n render(previous, true);\r\n },\r\n get value() {\r\n return value;\r\n },\r\n destroy: () => scope.dispose(),\r\n };\r\n}\r\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { press } from '../../motion/micro';\n\n/*\n * Range slider on native <input type=\"range\"> (keyboard, touch and forms come\n * from the platform). One input is a value, two are an interval whose thumbs\n * never cross. `input` updates value and output at once; `change` commits (onChange /\n * mk:change) only when the committed value differs. The native thumbs are\n * transparent hit areas: the engine draws its own fill, thumbs and value\n * bubbles and moves them with GSAP, tightly while dragging and with Melonmind's\n * swing (.38,.49,0,1.5) for keys, presets, setValue and form reset. A grabbed\n * thumb grows on the click curve and shows its value above it.\n * Parts: [data-mk-range-input] (made when absent), [data-mk-range-track], [data-mk-range-output].\n */\n\nexport type RangeValue = number | [number, number];\n\nexport interface RangeSliderOptions {\n min?: number;\n max?: number;\n step?: number;\n value?: RangeValue;\n disabled?: boolean;\n /** Form name; an interval submits name[0] and name[1]. */\n name?: string;\n /** Accessible name of the input(s). */\n label?: string;\n /** Text for the output and aria-valuetext. */\n formatValue?: (value: number) => string;\n onInput?: (value: RangeValue) => void;\n onChange?: (value: RangeValue) => void;\n}\n\nexport interface RangeSliderInstance extends Instance {\n setValue(value: RangeValue, notify?: boolean): void;\n readonly value: RangeValue;\n}\n\nconst finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\nconst attrNumber = (input: HTMLInputElement | undefined, name: string) => {\n const raw = input?.getAttribute(name);\n return raw !== null && raw !== undefined && raw.trim() !== '' && Number.isFinite(Number(raw)) ? Number(raw) : undefined;\n};\nconst decimals = (n: number) => {\n const [, fraction = ''] = String(n).split('.');\n return fraction.length;\n};\n\nexport function createRangeSlider(root: HTMLElement | null, options: RangeSliderOptions = {}): RangeSliderInstance {\n if (!root) return inert({ setValue() {}, value: 0 });\n registerMotion();\n const scope = createScope();\n let inputs = [...root.querySelectorAll<HTMLInputElement>('input[data-mk-range-input]')].slice(0, 2);\n if (!inputs.length) {\n const count = Array.isArray(options.value) ? 2 : 1;\n inputs = Array.from({ length: count }, () => {\n const input = document.createElement('input');\n input.type = 'range';\n input.dataset.mkRangeInput = '';\n root.append(input);\n scope.add(() => input.remove());\n return input;\n });\n }\n const pair = inputs.length === 2;\n const first = inputs[0];\n const min = finite(options.min) ? options.min : attrNumber(first, 'min') ?? 0;\n const maxOption = finite(options.max) ? options.max : attrNumber(first, 'max') ?? 100;\n const max = Math.max(min, maxOption);\n const stepOption = finite(options.step) ? options.step : attrNumber(first, 'step') ?? 1;\n const step = stepOption > 0 ? stepOption : 1;\n const places = Math.min(10, Math.max(decimals(step), decimals(min)));\n const fix = (n: number) => Number(n.toFixed(places));\n const upper = Math.min(max, fix(min + Math.floor((max - min) / step + 1e-9) * step));\n const normalize = (n: number) => Math.max(min, Math.min(upper, fix(min + Math.round((n - min) / step) * step)));\n const disabled = options.disabled ?? inputs.some((input) => input.disabled);\n const output = root.querySelector<HTMLElement>('[data-mk-range-output]');\n const format = (n: number) => (options.formatValue ? options.formatValue(n) : String(n));\n const originals = inputs.map((input) => input.value);\n\n const ordered = (list: number[]) => (pair ? [...list].sort((a, b) => a - b) : list);\n const read = () => inputs.map((input) => (input.value.trim() !== '' && Number.isFinite(Number(input.value)) ? normalize(Number(input.value)) : NaN));\n /**\n * Starting values. The parser clamps value=\"500\" to the input's own range (0–100 by\n * default) before min/max are set here: an authored value that was only clamped wins.\n */\n const authored = () => {\n const current = read();\n return inputs.map((input, i) => {\n const written = attrNumber(input, 'value');\n if (written === undefined) return current[i]!;\n const low = attrNumber(input, 'min') ?? 0;\n const high = Math.max(low, attrNumber(input, 'max') ?? 100);\n return Number(input.value) === Math.min(high, Math.max(low, written)) ? normalize(written) : current[i]!;\n });\n };\n const initial = (() => {\n const wanted = options.value;\n const fromOption = Array.isArray(wanted) ? wanted : finite(wanted) ? [wanted, wanted] : null;\n const fromInputs = authored();\n return inputs.map((_, i) => {\n const candidate = fromOption?.[i];\n if (finite(candidate)) return normalize(candidate);\n return Number.isFinite(fromInputs[i]) ? fromInputs[i]! : i === 0 ? min : upper;\n });\n })();\n let values = ordered(initial);\n let committed = [...values];\n\n // First registered, last undone: values return after min/max/step are authored again.\n scope.add(() => inputs.forEach((input, i) => (input.value = originals[i]!)));\n scope.attr(root, 'style', root.getAttribute('style'));\n scope.attr(root, 'data-mk-ready', '');\n scope.attr(root, 'data-mk-range', pair ? 'interval' : 'single');\n inputs.forEach((input, i) => {\n scope.attr(input, 'min', String(min));\n scope.attr(input, 'max', String(upper));\n scope.attr(input, 'step', String(step));\n scope.attr(input, 'disabled', disabled ? '' : null);\n if (pair) scope.attr(input, 'style', input.getAttribute('style'));\n if (options.name) scope.attr(input, 'name', pair ? `${options.name}[${i}]` : options.name);\n if (options.label) scope.attr(input, 'aria-label', pair ? `${options.label} · ${i === 0 ? 'mínimo' : 'máximo'}` : options.label);\n });\n if (output) {\n const text = output.textContent;\n // The inputs announce their own value; a live <output> would repeat every step of a drag.\n scope.attr(output, 'aria-live', 'off');\n scope.add(() => {\n output.textContent = text;\n });\n }\n\n // The drawn fill, thumbs and bubbles (decorative; the inputs stay the control).\n const track = root.querySelector<HTMLElement>('[data-mk-range-track]') ?? first!.parentElement ?? root;\n const visual = document.createElement('span');\n visual.dataset.mkRangeVisual = '';\n visual.setAttribute('aria-hidden', 'true');\n const fill = document.createElement('span');\n fill.dataset.mkPart = 'fill';\n visual.append(fill);\n const thumbs = inputs.map(() => {\n const thumb = document.createElement('span');\n thumb.dataset.mkPart = 'thumb';\n const bubble = document.createElement('span');\n bubble.dataset.mkPart = 'bubble';\n thumb.append(bubble);\n visual.append(thumb);\n return { thumb, bubble };\n });\n track.append(visual);\n\n const span = upper - min || 1;\n const ratio = (n: number) => (n - min) / span;\n /** What is drawn (ratios); it trails `values` while gliding. */\n const shown = { a: pair ? ratio(values[0]!) : 0, b: ratio(pair ? values[1]! : values[0]!) };\n const draw = () => {\n root.style.setProperty('--mk-range-start', shown.a.toFixed(4));\n root.style.setProperty('--mk-range-end', shown.b.toFixed(4));\n };\n let glide: gsap.core.Tween | null = null;\n const effects = new Set<gsap.core.Animation>();\n const trackEffect = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n glide?.kill();\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf(thumbs.flatMap(({ thumb, bubble }) => [thumb, bubble]));\n visual.remove();\n });\n let dragging = -1;\n const bubbleFor = (i: number, on: boolean) => {\n const part = thumbs[i];\n if (!part) return;\n part.thumb.toggleAttribute('data-mk-active', on);\n if (reduced()) {\n part.bubble.style.opacity = on ? '1' : '';\n return;\n }\n gsap.killTweensOf(part.bubble);\n if (on) trackEffect(gsap.fromTo(part.bubble, { opacity: 0, y: 4, scale: 0.9 }, { opacity: 1, y: 0, scale: 1, duration: 0.3, ease: EASE.pop }));\n else trackEffect(gsap.to(part.bubble, { opacity: 0, y: 4, duration: 0.2, delay: 0.35, ease: 'power2.in', clearProps: 'transform' }));\n };\n const grow = (i: number, on: boolean) => {\n const part = thumbs[i];\n if (!part || reduced()) return;\n trackEffect(gsap.to(part.thumb, { scale: on ? 1.22 : 1, duration: on ? 0.35 : 0.5, ease: EASE.click, overwrite: 'auto' }));\n };\n\n type Mode = 'set' | 'drag' | 'glide';\n const current = (): RangeValue => (pair ? [values[0]!, values[1]!] : values[0]!);\n const render = (mode: Mode = 'glide') => {\n const target = { a: pair ? ratio(values[0]!) : 0, b: ratio(pair ? values[1]! : values[0]!) };\n glide?.kill();\n if (mode === 'set' || reduced()) {\n Object.assign(shown, target);\n draw();\n } else glide = gsap.to(shown, { ...target, duration: mode === 'drag' ? 0.14 : 0.5, ease: mode === 'drag' ? 'power3.out' : EASE.swatch, onUpdate: draw });\n inputs.forEach((input, i) => {\n input.value = String(values[i]);\n if (options.formatValue) scope.attr(input, 'aria-valuetext', format(values[i]!));\n // The upper thumb stays reachable when both meet at the right end.\n if (pair) input.style.zIndex = i === 0 && values[0]! >= upper ? '3' : '';\n thumbs[i]!.bubble.textContent = format(values[i]!);\n });\n if (output) output.textContent = pair ? `${format(values[0]!)} – ${format(values[1]!)}` : format(values[0]!);\n };\n const same = (a: number[], b: number[]) => a.length === b.length && a.every((n, i) => n === b[i]);\n const emit = (type: 'mk:input' | 'mk:change', previous?: RangeValue) =>\n root.dispatchEvent(new CustomEvent(type, { bubbles: true, detail: type === 'mk:change' ? { value: current(), previous } : { value: current() } }));\n const commit = (notify: boolean) => {\n if (same(values, committed)) return;\n const previous: RangeValue = pair ? [committed[0]!, committed[1]!] : committed[0]!;\n committed = [...values];\n if (!notify) return;\n options.onChange?.(current());\n emit('mk:change', previous);\n };\n /** The thumb `i` moved: keep it on the grid and behind/ahead of the other. */\n const take = (i: number) => {\n const raw = inputs[i]!.value;\n const n = raw.trim() !== '' && Number.isFinite(Number(raw)) ? normalize(Number(raw)) : NaN;\n if (!Number.isFinite(n)) return false;\n let next = n;\n if (pair) next = i === 0 ? Math.min(next, values[1]!) : Math.max(next, values[0]!);\n const changed = next !== values[i];\n values[i] = next;\n return changed;\n };\n\n inputs.forEach((input, i) => {\n // Inputs and the inputs of a destroyed instance are ignored by the scope.\n scope.on(input, 'input', () => {\n if (disabled) return render('set');\n const changed = take(i);\n render(dragging === i ? 'drag' : 'glide');\n if (!changed) return;\n // A key step nudges its thumb.\n if (dragging !== i && !reduced()) trackEffect(gsap.fromTo(thumbs[i]!.thumb, { scale: 1.18 }, { scale: 1, duration: 0.45, ease: EASE.click }));\n options.onInput?.(current());\n emit('mk:input');\n });\n scope.on(input, 'change', () => {\n if (disabled) return render('set');\n take(i);\n render(dragging === i ? 'drag' : 'glide');\n const before = committed.join();\n commit(true);\n if (committed.join() !== before) trackEffect(press(output));\n });\n scope.on(input, 'pointerdown', () => {\n if (disabled) return;\n dragging = i;\n grow(i, true);\n bubbleFor(i, true);\n const release = () => {\n removeEventListener('pointerup', release);\n removeEventListener('pointercancel', release);\n if (dragging !== i) return;\n dragging = -1;\n grow(i, false);\n if (document.activeElement !== input || !input.matches(':focus-visible')) bubbleFor(i, false);\n };\n addEventListener('pointerup', release);\n addEventListener('pointercancel', release);\n scope.add(release);\n });\n scope.on(input, 'focus', () => {\n thumbs[i]!.thumb.toggleAttribute('data-mk-focus', input.matches(':focus-visible'));\n if (input.matches(':focus-visible')) bubbleFor(i, true);\n });\n scope.on(input, 'blur', () => {\n thumbs[i]!.thumb.removeAttribute('data-mk-focus');\n if (dragging !== i) bubbleFor(i, false);\n });\n });\n const form = first?.form;\n if (form) {\n scope.on(form, 'reset', (event) => {\n // The native reset writes the default values after its listeners: read them next.\n scope.timeout(() => {\n if (event.defaultPrevented || scope.disposed) return;\n const restored = read().map((n, i) => (Number.isFinite(n) ? n : i === 0 ? min : upper));\n values = ordered(restored);\n committed = [...values];\n render('glide');\n }, 0);\n });\n }\n render('set');\n\n return {\n setValue(next, notify = true) {\n if (scope.disposed) return;\n const list = Array.isArray(next) ? next : [next, next];\n const candidate = inputs.map((_, i) => (finite(list[i]) ? normalize(list[i]!) : values[i]!));\n values = ordered(candidate);\n // A controlled parent echoing the drag follows tightly; anything else glides.\n render(dragging >= 0 ? 'drag' : 'glide');\n // Silent sets (a controlled parent echoing a drag) leave the committed value alone,\n // so the user's change still reports.\n if (notify) commit(true);\n },\n get value() {\n return current();\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { requestFrame } from '../../core/frame';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * Chart: line, area and bar (grouped or stacked) drawn as SVG from the app's\n * data — no chart runtime. The look is Melon Mind's Indicadores: one series is\n * monochrome (the text colour, 2.5 px), only the zero baseline is drawn (value\n * labels on request), the last value sits in a pill at the end of the line with\n * its point ringed in the surface colour, the selection is a dotted guide with\n * markers that pop, and the tooltip is the inverse glass. Bars are up to 24 px\n * wide with 3 px rounded ends, 2 px gaps and the stack total above.\n * Motion: lines wipe in (700 ms, .38,.49,0,1), bars grow from the baseline,\n * and new data glides from the drawn values to the new ones (scale included).\n * Pointer, touch and keyboard (arrows, Home, End, Escape) select a point; a\n * table carries every value for screen readers. Resizes with its container.\n */\n\nexport type ChartType = 'line' | 'area' | 'bar';\n\nexport interface ChartPoint {\n label: string;\n value: number | null;\n}\n\nexport interface ChartSeries {\n name: string;\n /** One value per label; null is a gap (no data). */\n values: Array<number | null>;\n /** Any CSS colour; default: monochrome for one series, else the --mk-chart-N slot. */\n color?: string;\n /** Lines: an SVG dash pattern, e.g. '5 5' (a pace or goal) or '1 6' (a projection). */\n dash?: string;\n}\n\nexport interface ChartOptions {\n type?: ChartType;\n labels?: string[];\n series?: ChartSeries[];\n /** One series as label/value pairs (instead of labels + series). */\n points?: ChartPoint[];\n /** Bars only: stack the series. */\n stacked?: boolean;\n formatValue?: (value: number) => string;\n /** Accessible name (and table caption). */\n label?: string;\n /** Plot height in px (default 240). */\n height?: number;\n emptyLabel?: string;\n /** Legend (default: two or more series). */\n legend?: boolean;\n /** Value labels and hairlines on the y axis (default false: the baseline only). */\n axis?: boolean;\n /** Lines: the last value of the first series in a pill at its end (default true). */\n endLabel?: boolean;\n /** The built-in tooltip card (default true); false keeps the guide and markers for chart-tooltip. */\n tooltip?: boolean;\n onSelect?: (index: number | null) => void;\n}\n\nexport interface ChartInstance extends Instance {\n /** Merge new options and draw again (keeps the selection when it still exists). */\n update(options: ChartOptions): void;\n select(index: number | null): void;\n readonly selected: number | null;\n}\n\nconst SVG = 'http://www.w3.org/2000/svg';\nconst SLOTS = 8;\nconst BAR_MAX = 24;\nconst GAP = 2;\nconst END_RADIUS = 3;\nlet sequence = 0;\n\nconst svg = <K extends keyof SVGElementTagNameMap>(tag: K, attrs: Record<string, string | number> = {}) => {\n const element = document.createElementNS(SVG, tag);\n for (const [name, value] of Object.entries(attrs)) element.setAttribute(name, String(value));\n return element;\n};\nconst finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\nconst round = (n: number) => Math.round(n * 100) / 100;\n\n/** 1, 2, 2.5 or 5 × 10ⁿ just above `raw`. */\nfunction niceStep(raw: number) {\n const power = 10 ** Math.floor(Math.log10(raw));\n const fraction = raw / power;\n return (fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10) * power;\n}\n\n/** Bar path from the baseline `base` to `end`, rounded only at the data end. */\nfunction barPath(x: number, width: number, base: number, end: number, rounded: boolean) {\n const height = Math.abs(base - end);\n const r = rounded ? Math.min(END_RADIUS, width / 2, height) : 0;\n const dir = end < base ? 1 : -1;\n if (!r) return `M${round(x)},${round(base)}V${round(end)}H${round(x + width)}V${round(base)}Z`;\n return `M${round(x)},${round(base)}V${round(end + dir * r)}Q${round(x)},${round(end)} ${round(x + r)},${round(end)}H${round(x + width - r)}Q${round(x + width)},${round(end)} ${round(x + width)},${round(end + dir * r)}V${round(base)}Z`;\n}\n\ninterface Model {\n labels: string[];\n series: Array<ChartSeries & { color: string }>;\n}\n\nfunction modelOf(options: ChartOptions): Model {\n const fromPoints = options.points?.length ? { labels: options.points.map((point) => String(point.label)), series: [{ name: options.label ?? '', values: options.points.map((point) => point.value) }] } : null;\n const labels = fromPoints?.labels ?? (options.labels ?? []).map(String);\n const raw: ChartSeries[] = fromPoints?.series ?? options.series ?? [];\n if (raw.length > SLOTS) warnOnce(`chart: ${raw.length} series; past ${SLOTS} they share a neutral colour — fold the rest into \"Other\"`);\n const count = Math.max(labels.length, ...raw.map((series) => series.values.length), 0);\n const fullLabels = Array.from({ length: count }, (_, i) => labels[i] ?? String(i + 1));\n const mono = raw.length === 1;\n const series = raw.map((series, i) => ({\n name: String(series.name ?? ''),\n values: Array.from({ length: count }, (_, j) => (finite(series.values[j]) ? series.values[j]! : null)),\n color: series.color ?? (mono ? 'var(--mk-chart-mono)' : i < SLOTS ? `var(--mk-chart-${i + 1})` : 'var(--mk-chart-other)'),\n dash: series.dash,\n }));\n return { labels: fullLabels, series };\n}\n\ntype Values = Array<Array<number | null>>;\n\nexport function createChart(root: HTMLElement | null, initial: ChartOptions = {}): ChartInstance {\n if (!root) return inert({ update() {}, select() {}, selected: null });\n registerMotion();\n const scope = createScope();\n const uid = `mk-chart-${++sequence}`;\n let options: ChartOptions = { ...initial };\n let selected: number | null = null;\n let model = modelOf(options);\n\n const made = <K extends keyof HTMLElementTagNameMap>(tag: K, parent: Element = root) => {\n const element = document.createElement(tag);\n parent.append(element);\n scope.add(() => element.remove());\n return element;\n };\n const plot = made('div');\n plot.dataset.mkChartPlot = '';\n const canvas = svg('svg');\n canvas.dataset.mkChartSvg = '';\n canvas.setAttribute('role', 'img');\n canvas.setAttribute('tabindex', '0');\n canvas.setAttribute('focusable', 'true');\n plot.append(canvas);\n const pill = made('span', plot);\n pill.dataset.mkChartEnd = '';\n pill.setAttribute('aria-hidden', 'true');\n pill.hidden = true;\n const tooltip = made('div', plot);\n tooltip.dataset.mkChartTooltip = '';\n tooltip.setAttribute('aria-hidden', 'true');\n tooltip.hidden = true;\n const empty = made('p');\n empty.dataset.mkChartEmpty = '';\n empty.hidden = true;\n const legend = made('ul');\n legend.dataset.mkChartLegend = '';\n const table = made('table');\n table.dataset.mkChartTable = '';\n table.className = 'mk-sr-only';\n const live = made('span');\n live.className = 'mk-sr-only';\n live.setAttribute('role', 'status');\n scope.attr(root, 'data-mk-ready', '');\n\n // Layout of the last paint, for selection.\n let geometry = { width: 0, height: 0, top: 0, bottom: 0, left: 0, right: 0, xs: [] as number[], y: (n: number) => n, base: 0 };\n let cursor: SVGGElement | null = null;\n let band: SVGRectElement | null = null;\n /** What is drawn now: values and domain (they trail the model while gliding). */\n let shown: { values: Values; lo: number; hi: number; type: ChartType; stacked: boolean } | null = null;\n let glide: gsap.core.Tween | null = null;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation) => {\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n glide?.kill();\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf(tooltip);\n });\n\n const format = (value: number) => {\n if (options.formatValue) return options.formatValue(value);\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 }).format(value);\n };\n const type = (): ChartType => (options.type === 'bar' || options.type === 'area' ? options.type : 'line');\n const stacked = () => type() === 'bar' && Boolean(options.stacked) && model.series.length > 1;\n const hasData = () => model.labels.length > 0 && model.series.some((series) => series.values.some(finite));\n\n const totalsOf = (values: Values, index: number) => {\n let up = 0;\n let down = 0;\n for (const list of values) {\n const value = list[index];\n if (!finite(value)) continue;\n if (value >= 0) up += value;\n else down += value;\n }\n return { up, down };\n };\n const targetValues = (): Values => model.series.map((series) => series.values);\n const totals = (index: number) => totalsOf(targetValues(), index);\n\n const domainOf = (values: Values) => {\n let lo = 0;\n let hi = 0;\n model.labels.forEach((_, i) => {\n if (stacked()) {\n const { up, down } = totalsOf(values, i);\n hi = Math.max(hi, up);\n lo = Math.min(lo, down);\n } else {\n for (const list of values) {\n const value = list[i];\n if (!finite(value)) continue;\n hi = Math.max(hi, value);\n lo = Math.min(lo, value);\n }\n }\n });\n if (hi === lo) hi = lo + 1;\n const step = niceStep((hi - lo) / 4);\n // With value labels the scale rounds to them; without, it is the data ×1.04 (Melonmind).\n if (!options.axis) return { lo: lo * 1.04, hi: hi * 1.04, step: Math.max(hi * 1.04 - lo * 1.04, 1e-9) };\n return { lo: Math.floor(lo / step + 1e-9) * step, hi: Math.ceil(hi / step - 1e-9) * step, step };\n };\n\n const describe = () => {\n const name = options.label ?? 'Gráfica';\n if (!hasData()) return `${name}: ${options.emptyLabel ?? 'sin datos'}`;\n const names = model.series.map((series) => series.name).filter(Boolean).join(', ');\n return `${name}. ${model.labels.length} ${model.labels.length === 1 ? 'punto' : 'puntos'}, de ${model.labels[0]} a ${model.labels[model.labels.length - 1]}${names ? `. Series: ${names}` : ''}. Usa las flechas para recorrer los valores.`;\n };\n\n const renderTable = () => {\n table.replaceChildren();\n const caption = document.createElement('caption');\n caption.textContent = options.label ?? 'Gráfica';\n const head = document.createElement('thead');\n const headRow = document.createElement('tr');\n const corner = document.createElement('th');\n corner.scope = 'col';\n corner.textContent = 'Etiqueta';\n headRow.append(corner);\n for (const series of model.series) {\n const th = document.createElement('th');\n th.scope = 'col';\n th.textContent = series.name || 'Valor';\n headRow.append(th);\n }\n if (stacked()) {\n const th = document.createElement('th');\n th.scope = 'col';\n th.textContent = 'Total';\n headRow.append(th);\n }\n head.append(headRow);\n const body = document.createElement('tbody');\n model.labels.forEach((label, i) => {\n const row = document.createElement('tr');\n const th = document.createElement('th');\n th.scope = 'row';\n th.textContent = label;\n row.append(th);\n for (const series of model.series) {\n const td = document.createElement('td');\n const value = series.values[i];\n td.textContent = finite(value) ? format(value) : '—';\n row.append(td);\n }\n if (stacked()) {\n const td = document.createElement('td');\n const { up, down } = totals(i);\n td.textContent = format(up + down);\n row.append(td);\n }\n body.append(row);\n });\n table.append(caption, head, body);\n };\n\n const renderLegend = () => {\n legend.replaceChildren();\n const show = options.legend ?? model.series.length > 1;\n legend.hidden = !show || !hasData();\n if (legend.hidden) return;\n for (const series of model.series) {\n const item = document.createElement('li');\n const swatch = document.createElement('span');\n swatch.dataset.mkChartSwatch = '';\n swatch.dataset.mkType = type();\n swatch.style.background = series.color;\n swatch.style.color = series.color;\n if (series.dash) swatch.dataset.mkDash = '';\n swatch.setAttribute('aria-hidden', 'true');\n const name = document.createElement('span');\n name.textContent = series.name;\n item.append(swatch, name);\n legend.append(item);\n }\n };\n\n const lastPoint = (list: Array<number | null> | undefined) => {\n if (!list) return -1;\n for (let i = list.length - 1; i >= 0; i--) if (finite(list[i])) return i;\n return -1;\n };\n\n /** Draw `values` on the domain lo…hi (called every frame while gliding). */\n const paint = (values: Values, lo: number, hi: number, step: number) => {\n canvas.replaceChildren();\n const width = Math.max(120, Math.round(plot.clientWidth || root.clientWidth || 600));\n const height = Math.max(80, Math.round(finite(options.height) ? options.height : 240));\n canvas.setAttribute('viewBox', `0 0 ${width} ${height}`);\n canvas.setAttribute('width', String(width));\n canvas.setAttribute('height', String(height));\n const bar = type() === 'bar';\n const axis = Boolean(options.axis);\n const ticks: number[] = [];\n for (let t = lo; t <= hi + step / 2; t += step) ticks.push(Number(t.toPrecision(12)));\n const tickText = ticks.map(format);\n const withEnd = !bar && options.endLabel !== false && lastPoint(values[0]) >= 0;\n const left = axis ? Math.min(96, Math.max(28, Math.max(...tickText.map((text) => text.length)) * 7 + 12)) : 4;\n const top = 16;\n const right = withEnd ? Math.min(120, Math.max(48, format(values[0]![lastPoint(values[0])]!).length * 7.5 + 28)) : 8;\n const bottom = 30;\n const plotW = width - left - right;\n const plotH = height - top - bottom;\n const y = (n: number) => top + plotH - ((n - lo) / (hi - lo || 1)) * plotH;\n const base = y(0);\n const n = model.labels.length;\n const slot = plotW / n;\n const xs = model.labels.map((_, i) => (bar ? left + slot * (i + 0.5) : n === 1 ? left + plotW / 2 : left + (plotW * i) / (n - 1)));\n geometry = { width, height, top, bottom: top + plotH, left, right: width - right, xs, y, base };\n\n // Baseline (and, with `axis`, hairlines with their values).\n const grid = svg('g', { 'data-mk-part': 'grid' });\n if (!axis) {\n const zero = svg('line', { x1: left, x2: width - right, y1: round(base), y2: round(base) });\n zero.dataset.mkZero = '';\n grid.append(zero);\n }\n if (axis) ticks.forEach((tick, i) => {\n const at = round(y(tick));\n const line = svg('line', { x1: left, x2: width - right, y1: at, y2: at });\n if (tick === 0) line.dataset.mkZero = '';\n grid.append(line);\n const text = svg('text', { x: left - 8, y: at, 'text-anchor': 'end', 'dominant-baseline': 'middle' });\n text.textContent = tickText[i]!;\n grid.append(text);\n });\n canvas.append(grid);\n\n // X labels, thinned to what fits.\n const xAxis = svg('g', { 'data-mk-part': 'x-axis' });\n const longest = Math.max(...model.labels.map((label) => label.length));\n const every = Math.max(1, Math.ceil((n * (longest * 6.5 + 16)) / plotW));\n model.labels.forEach((label, i) => {\n if (i % every) return;\n const anchor = bar || n === 1 ? 'middle' : i === 0 ? 'start' : 'middle';\n const text = svg('text', { x: round(xs[i]!), y: height - 8, 'text-anchor': anchor });\n text.textContent = label;\n xAxis.append(text);\n });\n canvas.append(xAxis);\n\n band = null;\n if (bar) {\n band = svg('rect', { 'data-mk-part': 'band', y: top, height: plotH, rx: 12 });\n band.style.display = 'none';\n canvas.append(band);\n }\n\n const marks = svg('g', { 'data-mk-part': 'series' });\n const defs = svg('defs');\n if (bar) {\n const groups = stacked() ? 1 : model.series.length;\n const barWidth = Math.max(2, Math.min(BAR_MAX, (slot * 0.62 - GAP * (groups - 1)) / groups));\n const totalsLayer = svg('g', { 'data-mk-part': 'totals' });\n model.labels.forEach((_, i) => {\n if (stacked()) {\n let up = 0;\n let down = 0;\n const outer = { up: -1, down: -1 };\n values.forEach((list, k) => {\n const value = list[i];\n if (finite(value) && value > 0) outer.up = k;\n if (finite(value) && value < 0) outer.down = k;\n });\n values.forEach((list, k) => {\n const value = list[i];\n if (!finite(value) || value === 0) return;\n const from = value > 0 ? up : down;\n const to = from + value;\n if (value > 0) up = to;\n else down = to;\n // A 2 px surface gap between touching segments.\n const start = y(from) + (from !== 0 ? (value > 0 ? -GAP : GAP) : 0);\n const end = y(to);\n if ((value > 0 && end >= start) || (value < 0 && end <= start)) return;\n const path = svg('path', { d: barPath(xs[i]! - barWidth / 2, barWidth, start, end, k === (value > 0 ? outer.up : outer.down)), 'data-mk-index': i, 'data-mk-series': k });\n path.style.fill = model.series[k]!.color;\n marks.append(path);\n });\n // The stack total above it, when the columns have room.\n if (slot >= 22 && up > 0) {\n const total = totals(i);\n const text = svg('text', { x: round(xs[i]!), y: round(y(up) - 6), 'text-anchor': 'middle', 'data-mk-part': 'total' });\n text.textContent = format(total.up + total.down);\n totalsLayer.append(text);\n }\n } else {\n const groupWidth = groups * barWidth + GAP * (groups - 1);\n values.forEach((list, k) => {\n const value = list[i];\n if (!finite(value) || value === 0) return;\n const x = xs[i]! - groupWidth / 2 + k * (barWidth + GAP);\n const path = svg('path', { d: barPath(x, barWidth, base, y(value), true), 'data-mk-index': i, 'data-mk-series': k });\n path.style.fill = model.series[k]!.color;\n marks.append(path);\n });\n }\n });\n if (totalsLayer.childNodes.length) canvas.append(totalsLayer);\n } else {\n values.forEach((list, k) => {\n const series = model.series[k]!;\n const runs: Array<Array<[number, number]>> = [];\n let run: Array<[number, number]> = [];\n list.forEach((value, i) => {\n if (finite(value)) run.push([xs[i]!, y(value)]);\n else if (run.length) {\n runs.push(run);\n run = [];\n }\n });\n if (run.length) runs.push(run);\n if (type() === 'area') {\n const gradient = svg('linearGradient', { id: `${uid}-fill-${k}`, x1: 0, x2: 0, y1: 0, y2: 1 });\n const stop = (offset: string, opacity: string) => {\n const element = svg('stop', { offset });\n element.style.stopColor = series.color;\n element.style.stopOpacity = opacity;\n return element;\n };\n gradient.append(stop('0', '0.25'), stop('1', '0'));\n defs.append(gradient);\n for (const points of runs) {\n if (points.length < 2) continue;\n const d = `M${points.map(([px, py]) => `${round(px)},${round(py)}`).join('L')}L${round(points[points.length - 1]![0])},${round(base)}L${round(points[0]![0])},${round(base)}Z`;\n const area = svg('path', { d, 'data-mk-part': 'area' });\n area.style.fill = `url(#${uid}-fill-${k})`;\n marks.append(area);\n }\n }\n for (const points of runs) {\n if (points.length === 1) {\n // A lone point has no line: a marker shows it.\n const dot = svg('circle', { cx: round(points[0]![0]), cy: round(points[0]![1]), r: 4, 'data-mk-part': 'dot' });\n dot.style.fill = series.color;\n marks.append(dot);\n continue;\n }\n const line = svg('path', { d: `M${points.map(([px, py]) => `${round(px)},${round(py)}`).join('L')}`, 'data-mk-part': 'line' });\n line.style.stroke = series.color;\n // Dotted patterns (a first dash of 1 or less) draw round dots; dashes stay thin.\n const dotted = Boolean(series.dash) && Number(series.dash!.trim().split(/[\\s,]+/)[0]) <= 1;\n line.style.strokeWidth = dotted ? '2.5' : series.dash ? '1.5' : k === 0 ? '2.5' : '2';\n if (series.dash) line.style.strokeDasharray = series.dash;\n marks.append(line);\n }\n });\n // The last value of the first series: a ringed point and its pill.\n const last = lastPoint(values[0]);\n if (last >= 0 && !model.series[0]!.dash) {\n const point = svg('circle', { cx: round(xs[last]!), cy: round(y(values[0]![last]!)), r: 5, 'data-mk-part': 'end' });\n point.style.fill = model.series[0]!.color;\n marks.append(point);\n }\n }\n if (defs.childNodes.length) canvas.append(defs);\n canvas.append(marks);\n cursor = svg('g', { 'data-mk-part': 'cursor' });\n canvas.append(cursor);\n\n const last = withEnd ? lastPoint(values[0]) : -1;\n pill.hidden = last < 0;\n if (last >= 0) {\n pill.textContent = format(values[0]![last]!);\n const pillH = pill.offsetHeight || 22;\n pill.style.left = `${round(width - right + 10)}px`;\n pill.style.top = `${round(y(values[0]![last]!) - pillH / 2)}px`;\n }\n };\n\n let markerIndex: number | null = null;\n /** Where the selection points, in plot px (for mk:select). */\n let anchor = { x: 0, y: 0 };\n const paintSelection = (announce: boolean) => {\n if (!cursor) return;\n cursor.replaceChildren();\n if (band) band.style.display = 'none';\n for (const mark of canvas.querySelectorAll('[data-mk-index]')) mark.removeAttribute('data-mk-dim');\n if (selected === null || !hasData()) {\n if (!tooltip.hidden && !reduced()) {\n gsap.killTweensOf(tooltip, 'opacity,scale');\n keep(gsap.to(tooltip, { opacity: 0, scale: 0.94, duration: 0.15, ease: 'power2.in', onComplete: () => {\n tooltip.hidden = true;\n } }));\n } else tooltip.hidden = true;\n markerIndex = null;\n return;\n }\n const i = selected;\n const x = geometry.xs[i]!;\n const bar = type() === 'bar';\n const fresh = markerIndex !== i;\n markerIndex = i;\n let anchorY = geometry.bottom;\n if (bar && band) {\n const slot = (geometry.right - geometry.left) / model.labels.length;\n band.setAttribute('x', String(round(x - slot / 2 + 2)));\n band.setAttribute('width', String(round(Math.max(0, slot - 4))));\n band.style.display = '';\n for (const mark of canvas.querySelectorAll<SVGElement>('[data-mk-index]')) if (mark.getAttribute('data-mk-index') !== String(i)) mark.setAttribute('data-mk-dim', '');\n const { up, down } = totals(i);\n anchorY = stacked() ? geometry.y(up || down) : Math.min(...model.series.map((series) => (finite(series.values[i]) ? geometry.y(series.values[i]!) : geometry.bottom)));\n } else {\n cursor.append(svg('line', { x1: round(x), x2: round(x), y1: geometry.top, y2: geometry.bottom, 'data-mk-part': 'guide' }));\n model.series.forEach((series) => {\n const value = series.values[i];\n if (!finite(value)) return;\n const cy = geometry.y(value);\n anchorY = Math.min(anchorY, cy);\n const dot = svg('circle', { cx: round(x), cy: round(cy), r: 5, 'data-mk-part': 'marker' });\n dot.style.fill = series.color;\n cursor!.append(dot);\n if (fresh && !reduced()) keep(gsap.fromTo(dot, { attr: { r: 0 } }, { attr: { r: 5 }, duration: 0.3, ease: EASE.pop }));\n });\n }\n // Tooltip: label, one row per series (text in text colours, a swatch for identity).\n tooltip.replaceChildren();\n const title = document.createElement('strong');\n title.textContent = model.labels[i]!;\n tooltip.append(title);\n const rows: string[] = [];\n const shownSeries = model.series.filter((series) => finite(series.values[i]));\n for (const series of shownSeries.length ? shownSeries : model.series) {\n const value = series.values[i];\n const row = document.createElement('span');\n row.dataset.mkChartRow = '';\n const swatch = document.createElement('i');\n // Text-coloured series would vanish on the inverse glass: they show as a line in its ink.\n if (/--mk-(text|chart-mono|muted)\b/.test(series.color)) swatch.dataset.mkMono = '';\n else swatch.style.background = series.color;\n if (series.dash) swatch.dataset.mkDash = '';\n const name = document.createElement('span');\n name.textContent = series.name;\n const amount = document.createElement('b');\n amount.textContent = finite(value) ? format(value) : '—';\n row.append(swatch, name, amount);\n tooltip.append(row);\n rows.push(`${series.name ? `${series.name}: ` : ''}${finite(value) ? format(value) : 'sin dato'}`);\n }\n if (stacked()) {\n const { up, down } = totals(i);\n const row = document.createElement('span');\n row.dataset.mkChartRow = 'total';\n const name = document.createElement('span');\n name.textContent = 'Total';\n const amount = document.createElement('b');\n amount.textContent = format(up + down);\n row.append(document.createElement('i'), name, amount);\n tooltip.append(row);\n rows.push(`Total: ${format(up + down)}`);\n }\n anchor = { x: round(x), y: round(anchorY) };\n if (options.tooltip === false) {\n tooltip.hidden = true;\n if (announce) live.textContent = `${model.labels[i]}. ${rows.join('. ')}`;\n return;\n }\n const appearing = tooltip.hidden;\n tooltip.hidden = false;\n // Beside the point, towards the middle of the plot, inside it.\n const tipW = tooltip.offsetWidth || 160;\n const tipH = tooltip.offsetHeight || 60;\n const towardsLeft = x > geometry.width / 2;\n const left = round(Math.max(0, Math.min(geometry.width - tipW, towardsLeft ? x - 16 - tipW : x + 16)));\n const top = round(Math.max(0, Math.min(geometry.height - tipH, anchorY - tipH - 12)));\n if (appearing || reduced()) {\n gsap.killTweensOf(tooltip);\n gsap.set(tooltip, { x: left, y: top });\n if (!reduced()) keep(gsap.fromTo(tooltip, { opacity: 0, scale: 0.9 }, { opacity: 1, scale: 1, duration: 0.25, ease: EASE.pop }));\n else gsap.set(tooltip, { opacity: 1, scale: 1 });\n } else {\n gsap.killTweensOf(tooltip, 'opacity,scale');\n gsap.set(tooltip, { opacity: 1, scale: 1 });\n keep(gsap.to(tooltip, { x: left, y: top, duration: 0.25, ease: 'power3.out', overwrite: 'auto' }));\n }\n if (announce) live.textContent = `${model.labels[i]}. ${rows.join('. ')}`;\n };\n\n /** A resize while gliding waits for the glide to end. */\n let resized = false;\n const settle = () => {\n if (!resized || scope.disposed) return;\n resized = false;\n draw(false);\n };\n\n /** Rebuild everything for the model; `animate` glides from what is drawn. */\n const draw = (animate: boolean) => {\n glide?.kill();\n canvas.setAttribute('aria-label', describe());\n scope.attr(root, 'data-mk-chart-type', type());\n renderTable();\n renderLegend();\n const ok = hasData();\n empty.hidden = ok;\n empty.textContent = options.emptyLabel ?? 'Sin datos para mostrar';\n plot.hidden = !ok;\n if (!ok) {\n canvas.replaceChildren();\n cursor = null;\n tooltip.hidden = true;\n pill.hidden = true;\n selected = null;\n shown = null;\n return;\n }\n if (selected !== null && selected >= model.labels.length) selected = null;\n const target = targetValues();\n const domain = domainOf(target);\n const finish = () => {\n shown = { values: target, lo: domain.lo, hi: domain.hi, type: type(), stacked: stacked() };\n paint(target, domain.lo, domain.hi, domain.step);\n paintSelection(false);\n };\n if (!animate || reduced()) return finish();\n const comparable = shown && shown.type === type() && shown.stacked === stacked() && shown.values.length === target.length && shown.values.every((list, k) => list.length === target[k]!.length);\n if (comparable) {\n // New data: values and scale glide from what is drawn.\n const from = shown!;\n const state = { t: 0 };\n glide = gsap.to(state, {\n t: 1,\n duration: 0.6,\n ease: type() === 'bar' ? EASE.swatch : 'power3.out',\n onUpdate: () => {\n const t = state.t;\n const values = target.map((list, k) => list.map((value, i) => {\n const before = from.values[k]![i];\n return finite(value) && finite(before) ? before + (value - before) * t : value;\n }));\n paint(values, from.lo + (domain.lo - from.lo) * t, from.hi + (domain.hi - from.hi) * t, domain.step);\n paintSelection(false);\n },\n onComplete: () => {\n finish();\n settle();\n },\n });\n return;\n }\n // First appearance: bars grow from the baseline, lines wipe in from the left.\n finish();\n if (type() === 'bar') {\n const state = { t: 0 };\n glide = gsap.to(state, {\n t: 1,\n duration: 0.7,\n ease: EASE.swatch,\n onUpdate: () => paint(target.map((list) => list.map((value) => (finite(value) ? value * state.t : value))), domain.lo, domain.hi, domain.step),\n onComplete: () => {\n finish();\n settle();\n },\n });\n return;\n }\n const clip = svg('clipPath', { id: `${uid}-wipe` });\n const rect = svg('rect', { x: 0, y: 0, width: 0, height: geometry.height });\n clip.append(rect);\n canvas.prepend(clip);\n const series = canvas.querySelector('[data-mk-part=\"series\"]');\n series?.setAttribute('clip-path', `url(#${uid}-wipe)`);\n pill.style.opacity = '0';\n glide = gsap.to(rect, {\n attr: { width: geometry.width },\n duration: 0.7,\n ease: EASE.wipe,\n onComplete: () => {\n series?.removeAttribute('clip-path');\n clip.remove();\n keep(gsap.fromTo(pill, { opacity: 0, x: -6 }, { opacity: 1, x: 0, duration: 0.3, ease: EASE.pop, clearProps: 'opacity,transform' }));\n settle();\n },\n onInterrupt: () => {\n pill.style.removeProperty('opacity');\n },\n });\n };\n\n const select = (index: number | null, announce = false) => {\n if (scope.disposed) return;\n const next = index === null || !hasData() ? null : Math.max(0, Math.min(model.labels.length - 1, Math.round(index)));\n const changed = next !== selected;\n selected = next;\n paintSelection(announce);\n if (!changed) return;\n options.onSelect?.(selected);\n root.dispatchEvent(\n new CustomEvent('mk:select', {\n bubbles: true,\n detail: {\n index: selected,\n label: selected === null ? null : model.labels[selected],\n values: selected === null ? [] : model.series.map((series) => series.values[selected!]),\n // Where the selection points (plot px) and each series there, for chart-tooltip.\n x: selected === null ? null : anchor.x,\n y: selected === null ? null : anchor.y,\n series:\n selected === null\n ? []\n : model.series.map((series) => ({ name: series.name, color: series.color, value: series.values[selected!], previous: selected! > 0 ? series.values[selected! - 1] : null })),\n },\n }),\n );\n };\n\n const indexAt = (clientX: number) => {\n const box = canvas.getBoundingClientRect();\n const scale = box.width ? geometry.width / box.width : 1;\n const x = (clientX - box.left) * scale;\n let best = 0;\n geometry.xs.forEach((candidate, i) => {\n if (Math.abs(candidate - x) < Math.abs(geometry.xs[best]! - x)) best = i;\n });\n return best;\n };\n scope.on(canvas, 'pointermove', (event) => select(indexAt((event as PointerEvent).clientX)));\n scope.on(canvas, 'pointerdown', (event) => select(indexAt((event as PointerEvent).clientX)));\n // Touch keeps its selection when the finger lifts; a mouse leaving clears it.\n scope.on(canvas, 'pointerleave', (event) => {\n if ((event as PointerEvent).pointerType === 'mouse') select(null);\n });\n scope.on(canvas, 'focus', () => {\n if (selected === null && hasData()) select(0, true);\n });\n scope.on(canvas, 'blur', () => select(null));\n scope.on(canvas, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const last = model.labels.length - 1;\n const moves: Record<string, number | null> = {\n ArrowRight: Math.min(last, (selected ?? -1) + 1),\n ArrowUp: Math.min(last, (selected ?? -1) + 1),\n ArrowLeft: Math.max(0, (selected ?? 1) - 1),\n ArrowDown: Math.max(0, (selected ?? 1) - 1),\n Home: 0,\n End: last,\n Escape: null,\n };\n if (!(key in moves) || !hasData()) return;\n event.preventDefault();\n select(moves[key]!, true);\n });\n\n if (typeof ResizeObserver === 'function') {\n let width = 0;\n let cancel = () => {};\n const observer = scope.observe(\n new ResizeObserver(() => {\n const next = Math.round(plot.clientWidth || root.clientWidth);\n if (!next || next === width) return;\n width = next;\n if (next === geometry.width) return;\n if (glide?.isActive()) {\n resized = true;\n return;\n }\n cancel();\n cancel = requestFrame(() => draw(false));\n }),\n );\n observer.observe(root);\n scope.add(() => cancel());\n }\n draw(true);\n\n return {\n update(next) {\n if (scope.disposed) return;\n options = { ...options, ...next };\n model = modelOf(options);\n draw(true);\n },\n select: (index) => select(index),\n get selected() {\n return selected;\n },\n destroy: () => scope.dispose(),\n };\n}\n","/*\n * Card number helpers (pure): brand by prefix, grouping, Luhn, expiry and CVC\n * length. They validate format only; payment checks belong to the app's processor.\n */\n\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'discover' | 'unknown';\n\n/** Text shown on the card for each brand (no logos). */\nexport const BRAND_LABELS: Record<CardBrand, string> = { visa: 'VISA', mastercard: 'Mastercard', amex: 'AMEX', discover: 'Discover', unknown: '' };\n\nconst only = (text: string) => String(text ?? '').replace(/\\D/g, '');\n\nexport function detectBrand(number: string): CardBrand {\n const digits = only(number);\n if (/^4/.test(digits)) return 'visa';\n if (/^3[47]/.test(digits)) return 'amex';\n if (/^(6011|65|64[4-9])/.test(digits)) return 'discover';\n const two = Number(digits.slice(0, 2));\n const four = Number(digits.slice(0, 4));\n if ((two >= 51 && two <= 55) || (digits.length >= 4 && four >= 2221 && four <= 2720)) return 'mastercard';\n return 'unknown';\n}\n\n/** Digit groups of a brand: Amex 4-6-5, the rest 4-4-4-4. */\nexport const cardGroups = (brand: CardBrand) => (brand === 'amex' ? [4, 6, 5] : [4, 4, 4, 4]);\nexport const cardLength = (brand: CardBrand) => cardGroups(brand).reduce((sum, n) => sum + n, 0);\nexport const cvcLength = (brand: CardBrand) => (brand === 'amex' ? 4 : 3);\n\n/** Digits with a space between groups. */\nexport function formatNumber(number: string, brand = detectBrand(number)) {\n const digits = only(number).slice(0, cardLength(brand));\n const parts: string[] = [];\n let at = 0;\n for (const size of cardGroups(brand)) {\n if (at >= digits.length) break;\n parts.push(digits.slice(at, at + size));\n at += size;\n }\n return parts.join(' ');\n}\n\nexport function luhn(number: string) {\n const digits = only(number);\n if (digits.length < 12) return false;\n let sum = 0;\n for (let i = 0; i < digits.length; i++) {\n let n = Number(digits[digits.length - 1 - i]);\n if (i % 2 === 1) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n }\n return sum % 10 === 0;\n}\n\nexport interface Expiry {\n month: number;\n year: number;\n /** MM/YY as typed so far. */\n text: string;\n valid: boolean;\n}\n\n/** MM/YY from what was typed; valid when complete and not before the current month. */\nexport function parseExpiry(text: string, now = new Date()): Expiry {\n const digits = only(text).slice(0, 4);\n let formatted = digits;\n // A first digit above 1 is a month on its own: 4 → 04.\n if (/^[2-9]$/.test(digits)) formatted = `0${digits}`;\n if (formatted.length >= 2) formatted = `${formatted.slice(0, 2)}/${formatted.slice(2)}`;\n const month = Number(formatted.slice(0, 2));\n const year = formatted.length === 5 ? 2000 + Number(formatted.slice(3, 5)) : NaN;\n const end = new Date(year, month, 1);\n const valid = formatted.length === 5 && month >= 1 && month <= 12 && end > new Date(now.getFullYear(), now.getMonth(), 1);\n return { month, year, text: formatted, valid };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { blurIn, shake } from '../../motion/micro';\nimport { BRAND_LABELS, cardGroups, cardLength, cvcLength, detectBrand, formatNumber, luhn, parseExpiry, type CardBrand } from './card';\n\n/*\n * Credit card: native fields (cc-number, cc-name, cc-exp, cc-csc autocomplete)\n * beside a dark card that fills in as you type. Each new character rolls into\n * its slot (y 100 % → 0 out of a blur); a frame glides to the part of the card\n * being edited; the brand appears by prefix (as text, no logos); the CVC field\n * turns the card around in 3D (0.8 s, Melonmind's swing) and leaving it turns it\n * back. A fine pointer tilts the card a little. Fields validate on blur (Luhn,\n * a future expiry, CVC length) and shake when wrong. Nothing is charged: the\n * app reads the form. Events carry no card data: mk:change {brand, complete, valid}, mk:complete.\n */\n\nexport type CreditCardField = 'number' | 'name' | 'expiry' | 'cvc';\n\nexport interface CreditCardLabels {\n number?: string;\n name?: string;\n expiry?: string;\n cvc?: string;\n namePlaceholder?: string;\n invalidNumber?: string;\n invalidExpiry?: string;\n invalidCvc?: string;\n}\n\nexport interface CreditCardOptions {\n labels?: CreditCardLabels;\n /** Form names of the fields (default cc-number, cc-name, cc-exp, cc-csc). */\n names?: Partial<Record<CreditCardField, string>>;\n /** Tilt the card with a fine pointer (default true). */\n tilt?: boolean;\n onChange?: (state: { brand: CardBrand; complete: boolean; valid: boolean }) => void;\n onComplete?: () => void;\n}\n\nexport interface CreditCardValues {\n number: string;\n name: string;\n expiry: string;\n cvc: string;\n}\n\nexport interface CreditCardInstance extends Instance {\n readonly values: CreditCardValues;\n readonly brand: CardBrand;\n readonly valid: boolean;\n focus(field: CreditCardField): void;\n /** Turn the card (true: the back). */\n flip(back?: boolean): void;\n}\n\nconst LABELS: Required<CreditCardLabels> = {\n number: 'Número de tarjeta',\n name: 'Titular',\n expiry: 'Caducidad',\n cvc: 'CVC',\n namePlaceholder: 'NOMBRE APELLIDO',\n invalidNumber: 'Revisa el número de la tarjeta.',\n invalidExpiry: 'La fecha de caducidad no es válida.',\n invalidCvc: 'El CVC está incompleto.',\n};\n\nconst FIELDS: CreditCardField[] = ['number', 'name', 'expiry', 'cvc'];\nconst NAMES: Record<CreditCardField, string> = { number: 'cc-number', name: 'cc-name', expiry: 'cc-exp', cvc: 'cc-csc' };\nlet sequence = 0;\n\nconst el = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs: Record<string, string> = {}, text?: string) => {\n const element = document.createElement(tag);\n for (const [name, value] of Object.entries(attrs)) element.setAttribute(name, value);\n if (text !== undefined) element.textContent = text;\n return element;\n};\n\nexport function createCreditCard(root: HTMLElement | null, options: CreditCardOptions = {}): CreditCardInstance {\n if (!root) return inert({ values: { number: '', name: '', expiry: '', cvc: '' }, brand: 'unknown', valid: false, focus() {}, flip() {} });\n registerMotion();\n const scope = createScope();\n const labels = { ...LABELS, ...options.labels };\n const uid = `mk-card-${++sequence}`;\n const made: HTMLElement[] = [];\n const own = <T extends HTMLElement>(element: T) => {\n made.push(element);\n return element;\n };\n scope.add(() => made.forEach((element) => element.remove()));\n\n // The card (decorative: the fields are the accessible control).\n const visual = own(el('div', { 'data-mk-card-visual': '', 'aria-hidden': 'true' }));\n const inner = el('div', { 'data-mk-card-inner': '' });\n const front = el('div', { 'data-mk-card-face': 'front' });\n const back = el('div', { 'data-mk-card-face': 'back' });\n const chip = el('span', { 'data-mk-card-chip': '' });\n const brand = el('span', { 'data-mk-card-brand': '' });\n const number = el('span', { 'data-mk-card-number': '' });\n const name = el('span', { 'data-mk-card-name': '' });\n const expiry = el('span', { 'data-mk-card-expiry': '' });\n const holderLabel = el('span', { 'data-mk-card-caption': '' }, labels.name);\n const expiryLabel = el('span', { 'data-mk-card-caption': '' }, labels.expiry);\n const holder = el('span', { 'data-mk-card-region': 'name' });\n holder.append(holderLabel, name);\n const valid = el('span', { 'data-mk-card-region': 'expiry' });\n valid.append(expiryLabel, expiry);\n const frame = el('span', { 'data-mk-card-frame': '' });\n const numberRegion = el('span', { 'data-mk-card-region': 'number' });\n numberRegion.append(number);\n front.append(chip, brand, numberRegion, holder, valid, frame);\n const stripe = el('span', { 'data-mk-card-stripe': '' });\n const signature = el('span', { 'data-mk-card-signature': '' });\n const cvc = el('span', { 'data-mk-card-cvc': '' });\n signature.append(cvc);\n const backBrand = el('span', { 'data-mk-card-brand': '' });\n back.append(stripe, signature, backBrand);\n inner.append(front, back);\n visual.append(inner);\n\n // The fields: authored ones are used as they are; missing ones are made.\n const fields = {} as Record<CreditCardField, HTMLInputElement>;\n const errors = {} as Record<CreditCardField, HTMLElement | null>;\n let grid = root.querySelector<HTMLElement>('[data-mk-card-fields]');\n if (!grid) grid = own(el('div', { 'data-mk-card-fields': '' }));\n for (const field of FIELDS) {\n let input = root.querySelector<HTMLInputElement>(`input[data-mk-card-field=\"${field}\"]`);\n if (!input) {\n const label = el('label', { 'data-mk-card-label': field });\n label.append(el('span', {}, labels[field]));\n input = el('input', { 'data-mk-card-field': field });\n label.append(input);\n const error = el('span', { 'data-mk-card-error': '', id: `${uid}-${field}-error` });\n label.append(error);\n grid.append(label);\n }\n fields[field] = input;\n errors[field] = input.closest('label')?.querySelector<HTMLElement>('[data-mk-card-error]') ?? null;\n }\n root.prepend(visual);\n if (!grid.isConnected) root.append(grid);\n\n const attrs: Record<CreditCardField, Record<string, string>> = {\n number: { inputmode: 'numeric', autocomplete: 'cc-number', placeholder: '0000 0000 0000 0000' },\n name: { autocomplete: 'cc-name', placeholder: labels.namePlaceholder, autocapitalize: 'characters', spellcheck: 'false' },\n expiry: { inputmode: 'numeric', autocomplete: 'cc-exp', placeholder: 'MM/AA', maxlength: '5' },\n cvc: { inputmode: 'numeric', autocomplete: 'cc-csc', placeholder: '•••', maxlength: '4' },\n };\n for (const field of FIELDS) {\n const input = fields[field];\n scope.attr(input, 'type', 'text');\n for (const [key, value] of Object.entries(attrs[field])) if (!input.hasAttribute(key)) scope.attr(input, key, value);\n if (!input.name) scope.attr(input, 'name', options.names?.[field] ?? NAMES[field]);\n if (errors[field]?.id) scope.attr(input, 'aria-describedby', errors[field]!.id);\n }\n scope.attr(root, 'data-mk-ready', '');\n\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null | undefined) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([inner, visual, frame]);\n });\n\n /** Write text into `target` one span per character; changed characters roll in. */\n const chars = (target: HTMLElement, text: string, placeholder: string) => {\n const shown = text || placeholder;\n const empty = !text;\n target.toggleAttribute('data-mk-empty', empty);\n const current = [...target.children] as HTMLElement[];\n for (let i = 0; i < Math.max(current.length, shown.length); i++) {\n const char = shown[i];\n const span = current[i];\n if (char === undefined) {\n span?.remove();\n continue;\n }\n if (span && span.textContent === char && span.hasAttribute('data-mk-placeholder') === (empty || char === '•')) continue;\n const next = el('span', {}, char);\n next.toggleAttribute('data-mk-placeholder', empty || char === '•');\n if (char === ' ') next.dataset.mkSpace = '';\n if (span) span.replaceWith(next);\n else target.append(next);\n if (!empty && char !== '•' && char !== ' ' && !reduced()) keep(gsap.fromTo(next, { yPercent: 70, opacity: 0, filter: 'blur(4px)' }, { yPercent: 0, opacity: 1, filter: 'blur(0px)', duration: 0.35, ease: EASE.signature, clearProps: 'all' }));\n }\n };\n\n const state = { number: '', name: '', expiry: '', cvc: '', brand: 'unknown' as CardBrand };\n let flipped = false;\n let lastComplete = false;\n let lastSignature = '';\n\n const numberMask = (brand: CardBrand, digits: string) => {\n const groups = cardGroups(brand);\n const parts: string[] = [];\n let at = 0;\n for (const size of groups) {\n parts.push(Array.from({ length: size }, (_, i) => digits[at + i] ?? '•').join(''));\n at += size;\n }\n return parts.join(' ');\n };\n\n const checks = () => {\n const expiryState = parseExpiry(state.expiry);\n return {\n number: state.number.length === cardLength(state.brand) && luhn(state.number),\n name: state.name.trim().length > 1,\n expiry: expiryState.valid,\n cvc: state.cvc.length === cvcLength(state.brand),\n };\n };\n\n const render = () => {\n chars(number, numberMask(state.brand, state.number), '');\n number.toggleAttribute('data-mk-empty', !state.number);\n chars(name, state.name.toUpperCase(), labels.namePlaceholder);\n chars(expiry, state.expiry, 'MM/AA');\n chars(cvc, state.cvc, '•'.repeat(cvcLength(state.brand)));\n const label = BRAND_LABELS[state.brand];\n if (brand.textContent !== label) {\n brand.textContent = label;\n backBrand.textContent = label;\n keep(blurIn(label ? [brand] : null, { from: 'pop' }));\n }\n scope.attr(root, 'data-mk-brand', state.brand);\n fields.cvc.maxLength = cvcLength(state.brand);\n };\n\n const emit = () => {\n const ok = checks();\n const complete = FIELDS.every((field) => (field === 'number' ? state.number.length === cardLength(state.brand) : field === 'expiry' ? state.expiry.length === 5 : field === 'cvc' ? state.cvc.length === cvcLength(state.brand) : state.name.trim().length > 0));\n const allValid = Object.values(ok).every(Boolean);\n const signature = `${state.brand}|${complete}|${allValid}`;\n if (signature !== lastSignature) {\n lastSignature = signature;\n const detail = { brand: state.brand, complete, valid: allValid };\n options.onChange?.(detail);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail }));\n }\n if (allValid && !lastComplete) {\n options.onComplete?.();\n root.dispatchEvent(new CustomEvent('mk:complete', { bubbles: true }));\n }\n lastComplete = allValid;\n };\n\n const setInvalid = (field: CreditCardField, message: string | null) => {\n scope.attr(fields[field], 'aria-invalid', message ? 'true' : null);\n if (errors[field]) errors[field]!.textContent = message ?? '';\n };\n\n const flip = (toBack = !flipped) => {\n if (scope.disposed || toBack === flipped) return;\n flipped = toBack;\n scope.attr(root, 'data-mk-flipped', flipped ? '' : null);\n gsap.killTweensOf(inner, 'rotationY');\n if (reduced()) gsap.set(inner, { rotationY: flipped ? 180 : 0 });\n else keep(gsap.to(inner, { rotationY: flipped ? 180 : 0, duration: 0.8, ease: EASE.swatch }));\n };\n\n /** The frame glides to the region of the card being edited. */\n const regions: Record<CreditCardField, HTMLElement | null> = { number: numberRegion, name: holder, expiry: valid, cvc: null };\n const moveFrame = (field: CreditCardField | null) => {\n const target = field ? regions[field] : null;\n if (!target) {\n keep(gsap.to(frame, { opacity: 0, duration: 0.2, overwrite: 'auto' }));\n return;\n }\n const box = { x: target.offsetLeft - 8, y: target.offsetTop - 6, width: target.offsetWidth + 16, height: target.offsetHeight + 12 };\n const visible = Number(gsap.getProperty(frame, 'opacity')) > 0.5;\n if (!visible || reduced()) gsap.set(frame, { ...box, opacity: reduced() ? 1 : 0 });\n if (!reduced()) keep(gsap.to(frame, { ...box, opacity: 1, duration: 0.5, ease: EASE.swatch, overwrite: 'auto' }));\n };\n\n // Typing: keep the field formatted and the caret after the same digits.\n const caretDigits = (input: HTMLInputElement) => (input.value.slice(0, input.selectionStart ?? input.value.length).match(/\\d/g) ?? []).length;\n const placeCaret = (input: HTMLInputElement, digits: number) => {\n let seen = 0;\n let at = 0;\n while (at < input.value.length && seen < digits) {\n if (/\\d/.test(input.value[at]!)) seen += 1;\n at += 1;\n }\n if (document.activeElement === input) input.setSelectionRange(at, at);\n };\n\n const read = (field: CreditCardField, fromInput: boolean) => {\n const input = fields[field];\n if (field === 'number') {\n const caret = caretDigits(input);\n const digits = input.value.replace(/\\D/g, '');\n state.brand = detectBrand(digits);\n state.number = digits.slice(0, cardLength(state.brand));\n input.value = formatNumber(state.number, state.brand);\n if (fromInput) placeCaret(input, caret);\n } else if (field === 'expiry') {\n const parsed = parseExpiry(input.value);\n state.expiry = parsed.text;\n // Deleting the slash deletes the month digit before it.\n input.value = parsed.text;\n } else if (field === 'cvc') {\n state.cvc = input.value.replace(/\\D/g, '').slice(0, cvcLength(state.brand));\n input.value = state.cvc;\n } else state.name = input.value.replace(/\\s+/g, ' ').trimStart().slice(0, 26);\n };\n\n const validate = (field: CreditCardField) => {\n const ok = checks();\n const filled = field === 'number' ? state.number : field === 'expiry' ? state.expiry : field === 'cvc' ? state.cvc : state.name;\n const message = !filled || ok[field] ? null : field === 'number' ? labels.invalidNumber : field === 'expiry' ? labels.invalidExpiry : field === 'cvc' ? labels.invalidCvc : null;\n setInvalid(field, message);\n if (message) {\n keep(shake(fields[field].closest('label') ?? fields[field]));\n keep(shake(visual, 6));\n }\n };\n\n let leaving: ReturnType<typeof setTimeout> | undefined;\n scope.add(() => clearTimeout(leaving));\n for (const field of FIELDS) {\n const input = fields[field];\n read(field, false);\n scope.on(input, 'input', () => {\n read(field, true);\n if (fields[field].getAttribute('aria-invalid') === 'true' && checks()[field]) setInvalid(field, null);\n render();\n emit();\n });\n scope.on(input, 'focus', () => {\n root.dataset.mkActive = field;\n if (field === 'cvc') flip(true);\n else flip(false);\n moveFrame(field);\n });\n scope.on(input, 'blur', () => {\n validate(field);\n // Leaving the form: the card faces front again.\n clearTimeout(leaving);\n leaving = setTimeout(() => {\n if (scope.disposed) return;\n const active = document.activeElement;\n if (!FIELDS.some((name) => fields[name] === active)) {\n delete root.dataset.mkActive;\n flip(false);\n moveFrame(null);\n }\n }, 0);\n });\n }\n scope.add(() => delete root.dataset.mkActive);\n // Expiry: a backspace right after the slash also removes the month's second digit.\n scope.on(fields.expiry, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const input = fields.expiry;\n if (key.key === 'Backspace' && input.selectionStart === input.value.length && input.value.endsWith('/')) {\n key.preventDefault();\n input.value = input.value.slice(0, 1);\n read('expiry', true);\n render();\n emit();\n }\n });\n\n // A fine pointer tilts the card.\n if (options.tilt !== false && typeof matchMedia === 'function' && matchMedia('(pointer: fine)').matches) {\n scope.on(visual, 'pointermove', (event) => {\n if (reduced()) return;\n const box = visual.getBoundingClientRect();\n const x = ((event as PointerEvent).clientX - box.left) / box.width - 0.5;\n const y = ((event as PointerEvent).clientY - box.top) / box.height - 0.5;\n gsap.to(visual, { rotationY: x * 12, rotationX: -y * 10, duration: 0.5, ease: 'power3.out', overwrite: 'auto' });\n });\n scope.on(visual, 'pointerleave', () => {\n gsap.to(visual, { rotationY: 0, rotationX: 0, duration: 0.7, ease: EASE.swatch, overwrite: 'auto' });\n });\n }\n // A click on the card focuses its part.\n scope.on(visual, 'click', (event) => {\n const region = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-card-region]')?.dataset.mkCardRegion as CreditCardField | undefined;\n fields[flipped ? 'cvc' : region ?? 'number'].focus();\n });\n render();\n lastSignature = '';\n lastComplete = Object.values(checks()).every(Boolean);\n\n return {\n get values() {\n return { number: state.number, name: state.name, expiry: state.expiry, cvc: state.cvc };\n },\n get brand() {\n return state.brand;\n },\n get valid() {\n return Object.values(checks()).every(Boolean);\n },\n focus(field) {\n fields[field]?.focus();\n },\n flip: (toBack) => flip(toBack ?? !flipped),\n destroy: () => scope.dispose(),\n };\n}\n","/*\n * Fuzzy matching for the command search: the query's letters must appear in\n * order (case and accents ignored). Word starts and runs of consecutive letters\n * score higher; gaps cost. Returns the matched ranges for highlighting.\n */\n\nexport interface Match {\n score: number;\n /** [start, end) ranges in the original text. */\n ranges: Array<[number, number]>;\n}\n\nconst fold = (text: string) => text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n\nexport function matchScore(query: string, text: string): Match | null {\n const needle = fold(query.trim());\n if (!needle) return { score: 0, ranges: [] };\n // Folding removes combining marks, so map folded positions back to the original text.\n const map: number[] = [];\n let hay = '';\n for (let i = 0; i < text.length; i++) {\n const folded = fold(text[i]!);\n for (const char of folded) {\n hay += char;\n map.push(i);\n }\n }\n // A plain substring wins outright (best at a word start).\n const direct = hay.indexOf(needle);\n if (direct >= 0) {\n const start = direct === 0 || /[\\s\\-_/.]/.test(hay[direct - 1]!) ? 30 : 15;\n return { score: 100 + start - direct * 0.5, ranges: [[map[direct]!, map[direct + needle.length - 1]! + 1]] };\n }\n let score = 0;\n let at = 0;\n let previous = -2;\n const ranges: Array<[number, number]> = [];\n for (const char of needle) {\n if (char === ' ') continue;\n const found = hay.indexOf(char, at);\n if (found < 0) return null;\n const wordStart = found === 0 || /[\\s\\-_/.]/.test(hay[found - 1]!);\n score += wordStart ? 8 : found === previous + 1 ? 5 : 1;\n score -= Math.min(4, (found - at) * 0.2);\n const original = map[found]!;\n const last = ranges[ranges.length - 1];\n if (last && last[1] === original) last[1] = original + 1;\n else ranges.push([original, original + 1]);\n previous = found;\n at = found + 1;\n }\n return { score, ranges };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { blurIn } from '../../motion/micro';\nimport { morphClose, morphOpen, releaseShared, showOrigin } from '../../motion/morph';\nimport { fadeBackdrop, openModal } from '../../motion/surface';\nimport { matchScore } from './match';\n\n/*\n * Command search: a command palette in a modal <dialog> on Melonmind's dark\n * glass. ⌘K / Ctrl+K or a [data-mk-command-open] button opens it; it grows out\n * of the button that opened it (motion/morph.ts container transform: the\n * button's colour fades into the panel, the shape travels .7 s) and folds back\n * into it on close. Typing filters by fuzzy\n * match with the letters marked (as text); results are grouped. A pill glides\n * under the active result on the swing curve; arrows, Home and End move it,\n * Enter picks it (onSelect, mk:select; an href navigates), Escape closes and\n * focus goes back. Combobox + listbox semantics with aria-activedescendant.\n */\n\nexport interface CommandItem {\n id: string;\n label: string;\n /** Section title (e.g. 'Páginas'). */\n group?: string;\n /** Extra words that also match. */\n keywords?: string[];\n /** Small text on the right (a shortcut, a path). */\n hint?: string;\n /** Navigate here when chosen (unless mk:select is cancelled). */\n href?: string;\n /** A short glyph shown before the label (default →). */\n icon?: string;\n}\n\nexport interface CommandSearchOptions {\n items?: CommandItem[];\n placeholder?: string;\n emptyLabel?: string;\n /** Accessible name of the palette. */\n label?: string;\n /** ⌘K / Ctrl+K opens it (default true). */\n shortcut?: boolean;\n /** Most results shown (default 50). */\n limit?: number;\n onSelect?: (item: CommandItem) => void;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface CommandSearchInstance extends Instance {\n /** `origin`: the control it grows from; omitted, the clicked or on-screen trigger; null, none (scale-in). */\n open(origin?: HTMLElement | null): void;\n close(): void;\n setItems(items: CommandItem[]): void;\n readonly isOpen: boolean;\n}\n\nconst SEARCH_ICON =\n '<svg aria-hidden=\"true\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"6.5\"/><path d=\"M16 16l4 4\"/></svg>';\nlet sequence = 0;\n\nconst el = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs: Record<string, string> = {}, text?: string) => {\n const element = document.createElement(tag);\n for (const [name, value] of Object.entries(attrs)) element.setAttribute(name, value);\n if (text !== undefined) element.textContent = text;\n return element;\n};\n\n/** `text` with the ranges wrapped in <mark>, built as text nodes. */\nfunction marked(text: string, ranges: Array<[number, number]>) {\n const fragment = document.createDocumentFragment();\n let at = 0;\n for (const [start, end] of ranges) {\n if (start > at) fragment.append(text.slice(at, start));\n fragment.append(el('mark', {}, text.slice(start, end)));\n at = end;\n }\n if (at < text.length) fragment.append(text.slice(at));\n return fragment;\n}\n\nexport function createCommandSearch(root: HTMLElement | null, options: CommandSearchOptions = {}): CommandSearchInstance {\n if (!root) return inert({ open() {}, close() {}, setItems() {}, isOpen: false });\n registerMotion();\n const scope = createScope();\n const uid = `mk-command-${++sequence}`;\n let items = [...(options.items ?? [])];\n const limit = Number.isFinite(options.limit) && options.limit! > 0 ? Math.floor(options.limit!) : 50;\n\n const dialog = el('dialog', { 'data-mk-command': '', 'aria-label': options.label ?? 'Buscar' }) as HTMLDialogElement;\n const panel = el('div', { 'data-mk-command-panel': '' });\n const field = el('div', { 'data-mk-command-field': '' });\n const glass = el('span', { 'data-mk-command-icon': '', 'aria-hidden': 'true' });\n glass.innerHTML = SEARCH_ICON;\n const input = el('input', {\n type: 'text',\n role: 'combobox',\n 'aria-expanded': 'true',\n 'aria-controls': `${uid}-list`,\n 'aria-autocomplete': 'list',\n autocomplete: 'off',\n spellcheck: 'false',\n placeholder: options.placeholder ?? 'Buscar…',\n 'aria-label': options.label ?? 'Buscar',\n });\n field.append(glass, input);\n const list = el('div', { 'data-mk-command-list': '', role: 'listbox', id: `${uid}-list`, 'aria-label': 'Resultados' });\n const pill = el('span', { 'data-mk-command-pill': '', 'aria-hidden': 'true' });\n const empty = el('p', { 'data-mk-command-empty': '' }, options.emptyLabel ?? 'Sin resultados');\n empty.hidden = true;\n const live = el('span', { class: 'mk-sr-only', role: 'status' });\n const footer = el('footer', { 'data-mk-command-footer': '', 'aria-hidden': 'true' });\n footer.append(el('kbd', {}, '↑'), el('kbd', {}, '↓'), el('span', {}, 'Navegar'), el('kbd', {}, '↵'), el('span', {}, 'Seleccionar'));\n const scroller = el('div', { 'data-mk-command-scroll': '' });\n scroller.append(pill, list, empty);\n panel.append(field, scroller, footer, live);\n dialog.append(panel);\n root.append(dialog);\n scope.add(() => dialog.remove());\n scope.attr(root, 'data-mk-ready', '');\n\n let isOpen = false;\n let opener: HTMLElement | null = null;\n /** The control the panel grows from and folds back into. */\n let from: HTMLElement | null = null;\n let closing = false;\n let backdropOut: Animation | null = null;\n const onScreen = (element: HTMLElement) => {\n const box = element.getBoundingClientRect();\n return box.width > 0 && box.height > 0 && box.bottom > 0 && box.right > 0 && box.top < innerHeight && box.left < innerWidth;\n };\n const originFor = (given: HTMLElement | null | undefined) => {\n if (given !== undefined) return given;\n const trigger = root.querySelector<HTMLElement>('[data-mk-command-open]');\n return trigger && onScreen(trigger) ? trigger : null;\n };\n let shown: CommandItem[] = [];\n let active = -1;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf(pill);\n });\n\n const options_ = () => [...list.querySelectorAll<HTMLElement>('[role=\"option\"]')];\n const movePill = (animate: boolean) => {\n const option = options_()[active];\n if (!option) {\n pill.style.opacity = '0';\n return;\n }\n const box = { y: option.offsetTop, height: option.offsetHeight, width: option.offsetWidth, x: option.offsetLeft };\n if (!animate || reduced() || pill.style.opacity === '0') {\n gsap.set(pill, box);\n pill.style.opacity = '1';\n return;\n }\n keep(gsap.to(pill, { ...box, duration: 0.3, ease: EASE.swatch, overwrite: 'auto' }));\n };\n\n const setActive = (index: number, animate = true) => {\n const all = options_();\n if (!all.length) {\n active = -1;\n input.removeAttribute('aria-activedescendant');\n movePill(false);\n return;\n }\n active = (index + all.length) % all.length;\n all.forEach((option, i) => option.setAttribute('aria-selected', String(i === active)));\n input.setAttribute('aria-activedescendant', all[active]!.id);\n all[active]!.scrollIntoView?.({ block: 'nearest' });\n movePill(animate);\n };\n\n const render = (animate: boolean) => {\n const query = input.value;\n const scored = items\n .map((item, order) => {\n const own = matchScore(query, item.label);\n const extra = own ? null : [item.group ?? '', ...(item.keywords ?? [])].map((word) => matchScore(query, word)).find(Boolean);\n const result = own ?? (extra ? { score: extra.score - 20, ranges: [] as Array<[number, number]> } : null);\n return result ? { item, order, ...result } : null;\n })\n .filter((entry): entry is NonNullable<typeof entry> => Boolean(entry));\n if (query.trim()) scored.sort((a, b) => b.score - a.score || a.order - b.order);\n const top = scored.slice(0, limit);\n shown = top.map((entry) => entry.item);\n list.replaceChildren();\n const groups = new Map<string, HTMLElement>();\n top.forEach((entry, i) => {\n const name = entry.item.group ?? '';\n let group = groups.get(name);\n if (!group) {\n group = el('div', { role: 'group', 'data-mk-command-group': '' });\n if (name) {\n const title = el('div', { 'data-mk-command-group-label': '', id: `${uid}-g${groups.size}` }, name);\n group.setAttribute('aria-labelledby', title.id);\n group.append(title);\n }\n groups.set(name, group);\n list.append(group);\n }\n const option = el('div', { role: 'option', id: `${uid}-o${i}`, 'data-mk-command-item': '', 'data-mk-index': String(i), 'aria-selected': 'false' });\n option.append(el('span', { 'data-mk-command-arrow': '', 'aria-hidden': 'true' }, entry.item.icon ?? '→'));\n const label = el('span', { 'data-mk-command-label': '' });\n label.append(marked(entry.item.label, entry.ranges));\n option.append(label);\n if (entry.item.hint) option.append(el('span', { 'data-mk-command-hint': '' }, entry.item.hint));\n group.append(option);\n });\n // Options were built in score order but sit under their group: index them in document order.\n shown = options_().map((option, i) => {\n const item = top[Number(option.dataset.mkIndex)]!.item;\n option.dataset.mkIndex = String(i);\n option.id = `${uid}-o${i}`;\n return item;\n });\n empty.hidden = top.length > 0;\n live.textContent = top.length ? `${top.length} ${top.length === 1 ? 'resultado' : 'resultados'}` : (options.emptyLabel ?? 'Sin resultados');\n setActive(0, false);\n if (animate) keep(blurIn(options_().slice(0, 12), { stagger: 0.025, duration: 0.35 }));\n };\n\n const finish = () => {\n backdropOut?.cancel();\n backdropOut = null;\n if (dialog.open) dialog.close();\n showOrigin(from);\n releaseShared(from);\n from = null;\n closing = false;\n isOpen = false;\n options.onOpenChange?.(false);\n root.dispatchEvent(new CustomEvent('mk:close', { bubbles: true }));\n if (opener?.isConnected) opener.focus({ preventScroll: true });\n opener = null;\n };\n\n const open = (origin?: HTMLElement | null) => {\n if (scope.disposed || isOpen) return;\n const focused = document.activeElement;\n opener = focused instanceof HTMLElement && focused !== document.body ? focused : null;\n from = originFor(origin);\n isOpen = true;\n input.value = '';\n openModal(dialog);\n // The rows grow with the panel: no entrance of their own on open.\n render(false);\n input.focus();\n void fadeBackdrop(dialog, 'in');\n morphOpen(panel, from, { hideOrigin: true });\n options.onOpenChange?.(true);\n root.dispatchEvent(new CustomEvent('mk:open', { bubbles: true, detail: { origin: from } }));\n };\n\n const close = () => {\n if (!isOpen || closing) return;\n closing = true;\n // The backdrop fades with the fold; finish() drops this animation once the dialog is closed.\n if (!reduced() && typeof dialog.animate === 'function') {\n try {\n backdropOut = dialog.animate([{ opacity: 1 }, { opacity: 0 }], { duration: 300, easing: 'linear', fill: 'forwards', pseudoElement: '::backdrop' });\n } catch {\n backdropOut = null;\n }\n }\n morphClose(panel, from, finish);\n };\n\n const choose = (index: number) => {\n const item = shown[index];\n if (!item) return;\n const event = new CustomEvent('mk:select', { bubbles: true, cancelable: true, detail: { item } });\n options.onSelect?.(item);\n const go = root.dispatchEvent(event) && item.href;\n close();\n if (go) location.assign(item.href!);\n };\n\n scope.on(input, 'input', () => render(false));\n scope.on(input, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const count = options_().length;\n const moves: Record<string, number> = { ArrowDown: active + 1, ArrowUp: active - 1, Home: 0, End: count - 1 };\n if (key in moves && count) {\n event.preventDefault();\n setActive(moves[key]!);\n } else if (key === 'Enter') {\n event.preventDefault();\n choose(active);\n }\n });\n scope.on(list, 'pointermove', (event) => {\n const option = (event.target as Element | null)?.closest<HTMLElement>('[role=\"option\"]');\n if (option) {\n const index = Number(option.dataset.mkIndex);\n if (index !== active) setActive(index);\n }\n });\n scope.on(list, 'click', (event) => {\n const option = (event.target as Element | null)?.closest<HTMLElement>('[role=\"option\"]');\n if (option) choose(Number(option.dataset.mkIndex));\n });\n scope.on(dialog, 'cancel', (event) => {\n event.preventDefault();\n close();\n });\n scope.on(dialog, 'click', (event) => {\n if (event.target === dialog) close();\n });\n scope.on(root, 'click', (event) => {\n const trigger = (event.target as Element | null)?.closest('[data-mk-command-open]');\n if (trigger && root.contains(trigger)) {\n event.preventDefault();\n open(trigger as HTMLElement);\n }\n });\n if (options.shortcut !== false) {\n scope.on(document, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if ((key.metaKey || key.ctrlKey) && key.key.toLowerCase() === 'k') {\n key.preventDefault();\n if (isOpen) close();\n else open();\n }\n });\n }\n scope.add(() => {\n backdropOut?.cancel();\n showOrigin(from);\n releaseShared(from);\n if (dialog.open) dialog.close();\n });\n\n return {\n open,\n close,\n setItems(next) {\n items = [...next];\n if (isOpen) render(false);\n },\n get isOpen() {\n return isOpen;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { burst, press } from '../../motion/micro';\n\n/*\n * Hold to confirm: the same button is held (pointer, Space or Enter) while a\n * fill runs across it for `duration`; the button presses in a little and its\n * label changes with a blur. Letting go early springs the fill back. Holding\n * to the end confirms: a press bounce, a check that draws itself, a ring of\n * particles, onConfirm / mk:confirm, and the button returns after `resetAfter`.\n * The hint (\"Mantén pulsado para confirmar\") is the button's description.\n */\n\nexport interface HoldConfirmOptions {\n /** Hold time in ms (default 1200). */\n duration?: number;\n /** Back to the start after confirming, in ms (default 1800; 0 keeps it confirmed). */\n resetAfter?: number;\n holdingLabel?: string;\n doneLabel?: string;\n hint?: string;\n disabled?: boolean;\n onConfirm?: () => void;\n}\n\nexport interface HoldConfirmInstance extends Instance {\n reset(): void;\n readonly confirmed: boolean;\n}\n\nconst CHECK = '<svg aria-hidden=\"true\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12.5l4.5 4.5L19 7.5\" pathLength=\"1\"/></svg>';\nlet sequence = 0;\n\nexport function createHoldConfirm(root: HTMLElement | null, options: HoldConfirmOptions = {}): HoldConfirmInstance {\n const button = root ? ((root.matches('button') ? root : root.querySelector('button')) as HTMLButtonElement | null) : null;\n if (!root || !button) return inert({ reset() {}, confirmed: false });\n registerMotion();\n const scope = createScope();\n const duration = Number.isFinite(options.duration) && options.duration! > 0 ? options.duration! : 1200;\n const resetAfter = Number.isFinite(options.resetAfter) ? Math.max(0, options.resetAfter!) : 1800;\n const made: Element[] = [];\n const add = <T extends Element>(parent: Element, element: T, first = false) => {\n if (first) parent.prepend(element);\n else parent.append(element);\n made.push(element);\n return element;\n };\n scope.add(() => made.forEach((element) => element.remove()));\n\n // The label: the authored text, kept in a span that swaps with a blur.\n const authored = [...button.childNodes];\n const label = document.createElement('span');\n label.dataset.mkHoldLabel = '';\n label.append(...authored);\n button.append(label);\n scope.add(() => {\n label.remove();\n button.append(...authored);\n });\n const fill = add(button, document.createElement('span'), true);\n fill.dataset.mkHoldFill = '';\n fill.setAttribute('aria-hidden', 'true');\n const check = add(button, document.createElement('span'));\n check.dataset.mkHoldCheck = '';\n check.innerHTML = CHECK;\n const hint = add(root === button ? button : root, document.createElement('span'));\n hint.className = 'mk-sr-only';\n hint.id = `mk-hold-${++sequence}`;\n hint.textContent = options.hint ?? 'Mantén pulsado para confirmar';\n const live = add(root === button ? button : root, document.createElement('span'));\n live.className = 'mk-sr-only';\n live.setAttribute('role', 'status');\n\n scope.attr(button, 'type', button.getAttribute('type') ?? 'button');\n scope.attr(button, 'aria-describedby', [button.getAttribute('aria-describedby'), hint.id].filter(Boolean).join(' '));\n scope.attr(button, 'data-mk-hold', '');\n scope.attr(button, 'style', button.getAttribute('style'));\n if (options.disabled) scope.attr(button, 'disabled', '');\n scope.attr(root, 'data-mk-ready', '');\n\n let holding = false;\n let confirmed = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let back: ReturnType<typeof setTimeout> | undefined;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n clearTimeout(timer);\n clearTimeout(back);\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([fill, button, label, check]);\n });\n\n /** Show `text`, or the authored content again with null. */\n let showing: string | null = null;\n const write = (text: string | null) => {\n showing = text;\n if (text === null) label.replaceChildren(...authored);\n else label.textContent = text;\n };\n const swap = (text: string | null) => {\n if (showing === text) return;\n if (reduced()) {\n write(text);\n return;\n }\n gsap.killTweensOf(label);\n keep(\n gsap\n .timeline()\n .to(label, { opacity: 0, filter: 'blur(6px)', y: -4, duration: 0.12, ease: 'power2.in' })\n .call(() => write(text))\n .fromTo(label, { opacity: 0, filter: 'blur(6px)', y: 4 }, { opacity: 1, filter: 'blur(0px)', y: 0, duration: 0.25, ease: EASE.pop, clearProps: 'all' }),\n );\n };\n\n const setProgress = (value: number, seconds: number, ease: string) => {\n gsap.killTweensOf(fill, 'scaleX');\n if (reduced() || seconds === 0) gsap.set(fill, { scaleX: value });\n else keep(gsap.to(fill, { scaleX: value, duration: seconds, ease }));\n };\n\n const start = () => {\n if (holding || confirmed || button.disabled || scope.disposed) return;\n holding = true;\n scope.attr(button, 'data-mk-holding', '');\n swap(options.holdingLabel ?? 'Mantén pulsado…');\n setProgress(1, duration / 1000, 'power1.in');\n if (!reduced()) keep(gsap.to(button, { scale: 0.96, duration: duration / 1000, ease: 'power1.out' }));\n clearTimeout(timer);\n timer = setTimeout(confirm, duration);\n };\n\n const cancel = () => {\n if (!holding) return;\n holding = false;\n clearTimeout(timer);\n scope.attr(button, 'data-mk-holding', null);\n swap(null);\n setProgress(0, 0.5, EASE.swatch);\n if (!reduced()) keep(gsap.to(button, { scale: 1, duration: 0.5, ease: EASE.click, clearProps: 'scale,transform' }));\n };\n\n const reset = () => {\n if (scope.disposed) return;\n clearTimeout(back);\n confirmed = false;\n holding = false;\n scope.attr(button, 'data-mk-confirmed', null);\n scope.attr(button, 'data-mk-holding', null);\n swap(null);\n setProgress(0, 0.4, 'power2.out');\n };\n\n function confirm() {\n if (!holding || scope.disposed) return;\n holding = false;\n confirmed = true;\n scope.attr(button!, 'data-mk-holding', null);\n scope.attr(button!, 'data-mk-confirmed', '');\n setProgress(1, 0, 'none');\n gsap.killTweensOf(button, 'scale');\n gsap.set(button, { clearProps: 'scale,transform' });\n keep(press(button));\n swap(options.doneLabel ?? 'Confirmado');\n const path = check.querySelector('path');\n if (path && !reduced()) keep(gsap.fromTo(path, { strokeDasharray: 1, strokeDashoffset: 1 }, { strokeDashoffset: 0, duration: 0.45, delay: 0.1, ease: 'power2.out' }));\n keep(burst(button, { count: 8, distance: 34, colors: ['currentColor'] }));\n live.textContent = options.doneLabel ?? 'Confirmado';\n options.onConfirm?.();\n root!.dispatchEvent(new CustomEvent('mk:confirm', { bubbles: true }));\n if (resetAfter) back = setTimeout(reset, resetAfter);\n }\n\n scope.on(button, 'pointerdown', (event) => {\n const pointer = event as PointerEvent;\n if (pointer.button !== 0) return;\n pointer.preventDefault();\n button.focus({ preventScroll: true });\n start();\n });\n for (const type of ['pointerup', 'pointerleave', 'pointercancel']) scope.on(button, type, cancel);\n scope.on(button, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if (key.key !== ' ' && key.key !== 'Enter') return;\n key.preventDefault();\n if (!key.repeat) start();\n });\n scope.on(button, 'keyup', (event) => {\n const key = (event as KeyboardEvent).key;\n if (key === ' ' || key === 'Enter') cancel();\n });\n scope.on(button, 'blur', cancel);\n // A plain click (no hold) must not submit a form or act.\n scope.on(button, 'click', (event) => event.preventDefault());\n scope.on(button, 'contextmenu', (event) => {\n if (holding) event.preventDefault();\n });\n gsap.set(fill, { scaleX: 0 });\n\n return {\n reset,\n get confirmed() {\n return confirmed;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { rollDigits } from '../../motion/micro';\n\n/*\n * Image preview: thumbnails ([data-mk-image]) open a modal <dialog> where the\n * picture grows out of its thumbnail (0.7 s on the signature curve, the\n * thumbnail's radius easing to 24 px) over a blurred backdrop. Previous/next\n * (buttons, arrow keys, a swipe) slide the next picture in out of a blur; the\n * counter rolls. A double click or tap zooms ×2 where you point and a drag pans\n * it. Dragging down, Escape or the close button send the picture back to its\n * thumbnail, and focus returns to it.\n */\n\nexport interface ImagePreviewOptions {\n labels?: { close?: string; prev?: string; next?: string; dialog?: string };\n /** Loop from the last picture to the first (default true). */\n loop?: boolean;\n onChange?: (index: number) => void;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface ImagePreviewInstance extends Instance {\n open(index?: number): void;\n close(): void;\n next(): void;\n prev(): void;\n readonly isOpen: boolean;\n readonly index: number;\n}\n\ninterface Picture {\n thumb: HTMLElement;\n src: string;\n alt: string;\n caption: string;\n}\n\nconst button = (part: string, label: string, path: string) => {\n const element = document.createElement('button');\n element.type = 'button';\n element.dataset.mkLightbox = part;\n element.setAttribute('aria-label', label);\n element.innerHTML = `<svg aria-hidden=\"true\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"${path}\"/></svg>`;\n return element;\n};\n\nexport function createImagePreview(root: HTMLElement | null, options: ImagePreviewOptions = {}): ImagePreviewInstance {\n if (!root) return inert({ open() {}, close() {}, next() {}, prev() {}, isOpen: false, index: -1 });\n registerMotion();\n const scope = createScope();\n const loop = options.loop ?? true;\n const labels = { close: 'Cerrar', prev: 'Imagen anterior', next: 'Imagen siguiente', dialog: 'Vista de imagen', ...options.labels };\n\n const pictures = (): Picture[] =>\n [...root.querySelectorAll<HTMLElement>('[data-mk-image]')].map((thumb) => {\n const img = thumb.matches('img') ? (thumb as HTMLImageElement) : thumb.querySelector('img');\n return {\n thumb,\n src: thumb.dataset.mkSrc || thumb.getAttribute('href') || img?.getAttribute('src') || img?.currentSrc || '',\n alt: img?.alt ?? thumb.getAttribute('aria-label') ?? '',\n caption: thumb.dataset.mkCaption ?? '',\n };\n });\n\n const dialog = document.createElement('dialog');\n dialog.dataset.mkLightboxDialog = '';\n dialog.setAttribute('aria-label', labels.dialog);\n const backdrop = document.createElement('div');\n backdrop.dataset.mkLightbox = 'backdrop';\n const stage = document.createElement('figure');\n stage.dataset.mkLightbox = 'stage';\n const image = document.createElement('img');\n image.dataset.mkLightbox = 'image';\n image.draggable = false;\n const caption = document.createElement('figcaption');\n caption.dataset.mkLightbox = 'caption';\n stage.append(image, caption);\n const close = button('close', labels.close, 'M6 6l12 12M18 6L6 18');\n const prev = button('prev', labels.prev, 'M15 5l-7 7 7 7');\n const next = button('next', labels.next, 'M9 5l7 7-7 7');\n const counter = document.createElement('span');\n counter.dataset.mkLightbox = 'count';\n counter.setAttribute('aria-live', 'polite');\n dialog.append(backdrop, stage, prev, next, close, counter);\n root.append(dialog);\n scope.add(() => dialog.remove());\n scope.attr(root, 'data-mk-ready', '');\n for (const { thumb } of pictures()) {\n if (thumb.matches('button, a[href]') || thumb.tabIndex >= 0) continue;\n scope.attr(thumb, 'tabindex', '0');\n scope.attr(thumb, 'role', 'button');\n }\n\n let isOpen = false;\n let index = -1;\n let zoomed = false;\n let list: Picture[] = [];\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n const thumbImg = (picture?: Picture) => (picture ? (picture.thumb.matches('img') ? picture.thumb : picture.thumb.querySelector('img') ?? picture.thumb) : null);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([image, backdrop, stage]);\n for (const picture of list) thumbImg(picture)?.style.removeProperty('visibility');\n if (dialog.open) dialog.close();\n });\n\n const write = (i: number) => {\n const picture = list[i]!;\n image.src = picture.src;\n image.alt = picture.alt;\n caption.textContent = picture.caption;\n caption.hidden = !picture.caption;\n const text = `${i + 1} / ${list.length}`;\n if (counter.textContent && !reduced()) keep(rollDigits(counter, text, i >= index ? 1 : -1, 0.35));\n else counter.textContent = text;\n prev.disabled = !loop && i === 0;\n next.disabled = !loop && i === list.length - 1;\n prev.hidden = next.hidden = list.length < 2;\n };\n\n /** Transform that puts the big image over the thumbnail. */\n const fromThumb = (picture: Picture) => {\n const small = thumbImg(picture)!.getBoundingClientRect();\n const big = image.getBoundingClientRect();\n if (!small.width || !big.width) return null;\n const radius = parseFloat(getComputedStyle(thumbImg(picture)!).borderRadius) || 0;\n return {\n x: small.left + small.width / 2 - (big.left + big.width / 2),\n y: small.top + small.height / 2 - (big.top + big.height / 2),\n scaleX: small.width / big.width,\n scaleY: small.height / big.height,\n borderRadius: radius / (small.width / big.width),\n };\n };\n\n const unzoom = () => {\n zoomed = false;\n dialog.removeAttribute('data-mk-zoomed');\n keep(gsap.to(image, { scale: 1, x: 0, y: 0, duration: reduced() ? 0 : 0.4, ease: EASE.signature }));\n };\n\n const open = (at = 0) => {\n if (scope.disposed) return;\n list = pictures();\n if (!list.length) return;\n const target = Math.max(0, Math.min(list.length - 1, Math.round(at)));\n if (isOpen) return go(target);\n isOpen = true;\n index = target;\n counter.textContent = '';\n write(target);\n if (typeof dialog.showModal === 'function') dialog.showModal();\n else dialog.setAttribute('open', '');\n close.focus({ preventScroll: true });\n const picture = list[target]!;\n options.onOpenChange?.(true);\n root.dispatchEvent(new CustomEvent('mk:open', { bubbles: true, detail: { index } }));\n if (reduced()) return;\n keep(gsap.fromTo(backdrop, { opacity: 0 }, { opacity: 1, duration: 0.4, ease: 'power2.out', clearProps: 'opacity' }));\n keep(gsap.fromTo([prev, next, close, counter, caption], { opacity: 0 }, { opacity: 1, duration: 0.3, delay: 0.3, clearProps: 'opacity' }));\n const grow = () => {\n const start = fromThumb(picture);\n if (!start) return void keep(gsap.fromTo(image, { opacity: 0, scale: 0.92 }, { opacity: 1, scale: 1, duration: 0.35, ease: EASE.pop, clearProps: 'opacity,scale,transform' }));\n thumbImg(picture)!.style.visibility = 'hidden';\n keep(gsap.fromTo(image, start, { x: 0, y: 0, scaleX: 1, scaleY: 1, borderRadius: 24, duration: 0.7, ease: EASE.signature, clearProps: 'transform,borderRadius', onComplete: () => {\n thumbImg(picture)?.style.removeProperty('visibility');\n } }));\n };\n if (image.complete && image.naturalWidth) grow();\n else image.addEventListener('load', grow, { once: true });\n };\n\n const finish = () => {\n if (dialog.open) dialog.close();\n gsap.set([image, backdrop], { clearProps: 'all' });\n const picture = list[index];\n if (picture) thumbImg(picture)?.style.removeProperty('visibility');\n isOpen = false;\n zoomed = false;\n dialog.removeAttribute('data-mk-zoomed');\n options.onOpenChange?.(false);\n root.dispatchEvent(new CustomEvent('mk:close', { bubbles: true, detail: { index } }));\n picture?.thumb.focus({ preventScroll: true });\n };\n\n const shut = () => {\n if (!isOpen) return;\n const picture = list[index];\n if (reduced() || !picture) return finish();\n gsap.killTweensOf(image);\n gsap.set(image, { scale: 1, x: 0, y: 0 });\n const end = fromThumb(picture);\n keep(gsap.to(backdrop, { opacity: 0, duration: 0.35, ease: 'power2.in' }));\n keep(gsap.to([prev, next, close, counter, caption], { opacity: 0, duration: 0.15 }));\n if (!end) return void keep(gsap.to(image, { opacity: 0, scale: 0.92, duration: 0.25, ease: 'power2.in', onComplete: finish }));\n thumbImg(picture)!.style.visibility = 'hidden';\n keep(gsap.to(image, { ...end, duration: 0.5, ease: EASE.signature, onComplete: () => {\n gsap.set([prev, next, close, counter, caption], { clearProps: 'opacity' });\n finish();\n } }));\n };\n\n function go(to: number) {\n if (!isOpen || list.length < 2) return;\n let target = to;\n if (loop) target = (to + list.length) % list.length;\n else if (to < 0 || to >= list.length) return;\n if (target === index) return;\n const direction = to > index ? 1 : -1;\n if (zoomed) unzoom();\n const before = index;\n index = target;\n options.onChange?.(index);\n root!.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { index, previous: before } }));\n if (reduced()) return write(target);\n gsap.killTweensOf(image);\n keep(\n gsap\n .timeline()\n .to(image, { x: -60 * direction, opacity: 0, filter: 'blur(12px)', duration: 0.18, ease: 'power2.in' })\n .call(() => write(target))\n .fromTo(image, { x: 60 * direction, opacity: 0, filter: 'blur(12px)' }, { x: 0, opacity: 1, filter: 'blur(0px)', duration: 0.4, ease: EASE.signature, clearProps: 'transform,opacity,filter' }),\n );\n }\n\n scope.on(root, 'click', (event) => {\n const thumb = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-image]');\n if (!thumb || !root.contains(thumb) || dialog.contains(thumb)) return;\n event.preventDefault();\n open(pictures().findIndex((picture) => picture.thumb === thumb));\n });\n scope.on(root, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const thumb = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-image]');\n if (thumb && !dialog.contains(thumb) && (key === 'Enter' || key === ' ') && !thumb.matches('button, a[href]')) {\n event.preventDefault();\n open(pictures().findIndex((picture) => picture.thumb === thumb));\n }\n });\n scope.on(dialog, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n if (key === 'ArrowRight') go(index + 1);\n else if (key === 'ArrowLeft') go(index - 1);\n else return;\n event.preventDefault();\n });\n scope.on(dialog, 'cancel', (event) => {\n event.preventDefault();\n shut();\n });\n scope.on(close, 'click', shut);\n scope.on(prev, 'click', () => go(index - 1));\n scope.on(next, 'click', () => go(index + 1));\n scope.on(backdrop, 'click', shut);\n\n // Double click / tap zooms where you point; drag pans the zoom, swipes, or drags down to close.\n scope.on(image, 'dblclick', (event) => {\n const mouse = event as MouseEvent;\n if (zoomed) return unzoom();\n const box = image.getBoundingClientRect();\n zoomed = true;\n dialog.setAttribute('data-mk-zoomed', '');\n const x = (box.left + box.width / 2 - mouse.clientX) || 0;\n const y = (box.top + box.height / 2 - mouse.clientY) || 0;\n keep(gsap.to(image, { scale: 2, x, y, duration: reduced() ? 0 : 0.45, ease: EASE.signature }));\n });\n let drag: { x: number; y: number; startX: number; startY: number; id: number } | null = null;\n scope.on(image, 'pointerdown', (event) => {\n const pointer = event as PointerEvent;\n if (pointer.button !== 0) return;\n drag = { x: pointer.clientX, y: pointer.clientY, startX: Number(gsap.getProperty(image, 'x')) || 0, startY: Number(gsap.getProperty(image, 'y')) || 0, id: pointer.pointerId };\n image.setPointerCapture?.(pointer.pointerId);\n });\n scope.on(image, 'pointermove', (event) => {\n const pointer = event as PointerEvent;\n if (!drag || pointer.pointerId !== drag.id) return;\n const dx = pointer.clientX - drag.x;\n const dy = pointer.clientY - drag.y;\n if (zoomed) gsap.set(image, { x: drag.startX + dx, y: drag.startY + dy });\n else if (!reduced()) {\n gsap.set(image, { x: dx * 0.6, y: Math.max(0, dy) });\n gsap.set(backdrop, { opacity: 1 - Math.min(0.6, Math.max(0, dy) / 400) });\n }\n });\n const release = (event: Event) => {\n const pointer = event as PointerEvent;\n if (!drag || pointer.pointerId !== drag.id) return;\n const dx = pointer.clientX - drag.x;\n const dy = pointer.clientY - drag.y;\n drag = null;\n if (zoomed) return;\n if (dy > 120) return shut();\n if (Math.abs(dx) > 70 && Math.abs(dx) > Math.abs(dy)) return go(index + (dx < 0 ? 1 : -1));\n if (!reduced()) {\n keep(gsap.to(image, { x: 0, y: 0, duration: 0.45, ease: EASE.swatch, clearProps: 'transform' }));\n keep(gsap.to(backdrop, { opacity: 1, duration: 0.3, clearProps: 'opacity' }));\n }\n };\n scope.on(image, 'pointerup', release);\n scope.on(image, 'pointercancel', release);\n\n return {\n open,\n close: shut,\n next: () => go(index + 1),\n prev: () => go(index - 1),\n get isOpen() {\n return isOpen;\n },\n get index() {\n return index;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, ELASTIC, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { numberFormat } from '../../core/dates';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { burst, rollDigits } from '../../motion/micro';\n\n/*\n * Like button: a heart and a count on a toggle button (aria-pressed). Liking it\n * squeezes the heart, fills it from the centre and springs it to 1.25 and back\n * (elastic), a ring and seven pairs of particles fly out, and the count rolls up.\n * Unliking empties the heart with a small dip and rolls the count down.\n */\n\nexport interface LikeButtonOptions {\n liked?: boolean;\n count?: number;\n /** Accessible name (default 'Me gusta'). */\n label?: string;\n /** Hide the count. */\n hideCount?: boolean;\n onChange?: (liked: boolean, count: number) => void;\n}\n\nexport interface LikeButtonInstance extends Instance {\n setLiked(liked: boolean, notify?: boolean): void;\n setCount(count: number): void;\n readonly liked: boolean;\n readonly count: number;\n}\n\nconst SVG = 'http://www.w3.org/2000/svg';\nconst HEART = 'M12 20.5s-7.5-4.6-7.5-10.1A4.4 4.4 0 0 1 12 7.6a4.4 4.4 0 0 1 7.5 2.8c0 5.5-7.5 10.1-7.5 10.1z';\n\nexport function createLikeButton(root: HTMLElement | null, options: LikeButtonOptions = {}): LikeButtonInstance {\n const button = root ? ((root.matches('button') ? root : root.querySelector('button')) as HTMLButtonElement | null) : null;\n if (!root || !button) return inert({ setLiked() {}, setCount() {}, liked: false, count: 0 });\n registerMotion();\n const scope = createScope();\n let liked = Boolean(options.liked);\n let count = Math.max(0, Math.round(Number.isFinite(options.count) ? options.count! : 0));\n const format = (n: number) => numberFormat(root, { notation: n >= 10000 ? 'compact' : 'standard' }).format(n);\n\n const made: Element[] = [];\n scope.add(() => made.forEach((element) => element.remove()));\n const icon = document.createElementNS(SVG, 'svg');\n icon.setAttribute('viewBox', '0 0 24 24');\n icon.setAttribute('aria-hidden', 'true');\n icon.dataset.mkLikeIcon = '';\n const outline = document.createElementNS(SVG, 'path');\n outline.setAttribute('d', HEART);\n outline.dataset.mkPart = 'outline';\n const fill = document.createElementNS(SVG, 'path');\n fill.setAttribute('d', HEART);\n fill.dataset.mkPart = 'fill';\n icon.append(outline, fill);\n const name = document.createElement('span');\n name.className = 'mk-sr-only';\n name.textContent = options.label ?? 'Me gusta';\n const counter = document.createElement('span');\n counter.dataset.mkLikeCount = '';\n counter.hidden = Boolean(options.hideCount);\n button.prepend(icon);\n button.append(name, counter);\n made.push(icon, name, counter);\n\n scope.attr(button, 'type', button.getAttribute('type') ?? 'button');\n scope.attr(button, 'data-mk-like', '');\n scope.attr(root, 'data-mk-ready', '');\n\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([icon, fill]);\n });\n\n const paint = () => {\n scope.attr(button, 'aria-pressed', String(liked));\n gsap.set(fill, { scale: liked ? 1 : 0, transformOrigin: '50% 55%' });\n counter.textContent = format(count);\n };\n\n const animate = (on: boolean, previous: number) => {\n keep(rollDigits(counter, format(count), count >= previous ? 1 : -1, 0.4));\n if (reduced()) return;\n gsap.killTweensOf([icon, fill]);\n if (on) {\n keep(\n gsap\n .timeline()\n .to(icon, { scale: 0.7, duration: 0.12, ease: 'power2.in' })\n .fromTo(fill, { scale: 0 }, { scale: 1, duration: 0.3, ease: EASE.pop, transformOrigin: '50% 55%' }, '<0.05')\n .to(icon, { scale: 1, duration: 0.9, ease: ELASTIC, clearProps: 'scale,transform' }, '<'),\n );\n keep(burst(button, { count: 7, distance: 30, colors: ['var(--mk-like-color)', 'var(--mk-like-color-2)'] }));\n } else {\n keep(\n gsap\n .timeline()\n .to(fill, { scale: 0, duration: 0.25, ease: 'power2.in', transformOrigin: '50% 55%' })\n .fromTo(icon, { scale: 0.85 }, { scale: 1, duration: 0.5, ease: EASE.click, clearProps: 'scale,transform' }, 0),\n );\n }\n };\n\n const setLiked = (next: boolean, notify = true) => {\n if (scope.disposed || next === liked) return;\n const previous = count;\n liked = next;\n count = Math.max(0, count + (next ? 1 : -1));\n scope.attr(button, 'aria-pressed', String(liked));\n animate(liked, previous);\n if (reduced()) paint();\n if (!notify) return;\n options.onChange?.(liked, count);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { liked, count } }));\n };\n\n scope.on(button, 'click', () => setLiked(!liked));\n paint();\n\n return {\n setLiked,\n setCount(next) {\n if (scope.disposed || !Number.isFinite(next)) return;\n const previous = count;\n count = Math.max(0, Math.round(next));\n if (count !== previous) keep(rollDigits(counter, format(count), count >= previous ? 1 : -1, 0.4));\n },\n get liked() {\n return liked;\n },\n get count() {\n return count;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, ELASTIC, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { blurIn, blurOut, rollDigits } from '../../motion/micro';\n\n/*\n * Notification bell: a bell with a badge on a button. notify() rings it — the\n * bell swings from its top in a damped arc (±18°) with the clapper a beat\n * behind, waves ripple out, the badge pops in elastically (or its number rolls\n * up), and an optional message rises beside it for a few seconds. The button's\n * name carries the count and a polite status announces new ones.\n */\n\nexport interface NotificationBellOptions {\n count?: number;\n /** Accessible name before the count (default 'Notificaciones'). */\n label?: string;\n /** How long a message stays, in ms (default 3200). */\n messageDuration?: number;\n /** Above this the badge reads n+ (default 99). */\n max?: number;\n onOpen?: () => void;\n}\n\nexport interface NotificationBellInstance extends Instance {\n /** Ring with a new notification (and show `message`, as text). */\n notify(message?: string): void;\n setCount(count: number): void;\n clear(): void;\n readonly count: number;\n}\n\nconst SVG = 'http://www.w3.org/2000/svg';\nconst BODY = 'M6 16.5V11a6 6 0 0 1 12 0v5.5l1.5 2H4.5z';\n\nexport function createNotificationBell(root: HTMLElement | null, options: NotificationBellOptions = {}): NotificationBellInstance {\n const button = root ? ((root.matches('button') ? root : root.querySelector('button')) as HTMLButtonElement | null) : null;\n if (!root || !button) return inert({ notify() {}, setCount() {}, clear() {}, count: 0 });\n registerMotion();\n const scope = createScope();\n const max = Number.isFinite(options.max) && options.max! > 0 ? Math.floor(options.max!) : 99;\n const label = options.label ?? 'Notificaciones';\n const stay = Number.isFinite(options.messageDuration) ? Math.max(0, options.messageDuration!) : 3200;\n let count = Math.max(0, Math.round(Number.isFinite(options.count) ? options.count! : 0));\n\n const made: Element[] = [];\n scope.add(() => made.forEach((element) => element.remove()));\n const icon = document.createElementNS(SVG, 'svg');\n icon.setAttribute('viewBox', '0 0 24 24');\n icon.setAttribute('aria-hidden', 'true');\n icon.dataset.mkBellIcon = '';\n const bell = document.createElementNS(SVG, 'g');\n bell.dataset.mkPart = 'bell';\n const body = document.createElementNS(SVG, 'path');\n body.setAttribute('d', BODY);\n const top = document.createElementNS(SVG, 'path');\n top.setAttribute('d', 'M12 3v2');\n bell.append(body, top);\n const clapper = document.createElementNS(SVG, 'path');\n clapper.setAttribute('d', 'M10 20.5a2 2 0 0 0 4 0');\n clapper.dataset.mkPart = 'clapper';\n icon.append(bell, clapper);\n const waves = document.createElement('span');\n waves.dataset.mkBellWaves = '';\n waves.setAttribute('aria-hidden', 'true');\n const badge = document.createElement('span');\n badge.dataset.mkBellBadge = '';\n badge.setAttribute('aria-hidden', 'true');\n button.prepend(waves, icon);\n button.append(badge);\n const bubble = document.createElement('span');\n bubble.dataset.mkBellMessage = '';\n bubble.setAttribute('aria-hidden', 'true');\n bubble.hidden = true;\n const live = document.createElement('span');\n live.className = 'mk-sr-only';\n live.setAttribute('role', 'status');\n (root === button ? button : root).append(bubble, live);\n made.push(waves, icon, badge, bubble, live);\n\n scope.attr(button, 'type', button.getAttribute('type') ?? 'button');\n scope.attr(button, 'data-mk-bell', '');\n scope.attr(root, 'data-mk-ready', '');\n\n let hideTimer: ReturnType<typeof setTimeout> | undefined;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n clearTimeout(hideTimer);\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([bell, clapper, badge, bubble]);\n });\n\n const text = (n: number) => (n > max ? `${max}+` : String(n));\n const name = () => (count ? `${label}, ${count} sin leer` : label);\n const paint = () => {\n scope.attr(button, 'aria-label', name());\n badge.hidden = count === 0;\n };\n\n const showBadge = (previous: number) => {\n if (count === 0) {\n if (reduced() || previous === 0) {\n badge.hidden = true;\n return;\n }\n keep(gsap.to(badge, { scale: 0, duration: 0.2, ease: 'power2.in', onComplete: () => void (badge.hidden = true), clearProps: 'scale,transform' }));\n return;\n }\n if (previous === 0) {\n badge.textContent = text(count);\n badge.hidden = false;\n if (!reduced()) keep(gsap.fromTo(badge, { scale: 0 }, { scale: 1, duration: 0.8, ease: ELASTIC, clearProps: 'scale,transform' }));\n } else keep(rollDigits(badge, text(count), count >= previous ? 1 : -1, 0.4));\n };\n\n const ring = () => {\n if (reduced()) return;\n gsap.killTweensOf([bell, clapper]);\n keep(gsap.fromTo(bell, { rotation: 0 }, { keyframes: { rotation: [18, -14, 10, -6, 3, 0] }, duration: 1, ease: 'power1.out', svgOrigin: '12 4', clearProps: 'rotation,transform' }));\n keep(gsap.fromTo(clapper, { x: 0 }, { keyframes: { x: [0, -2.5, 2, -1.4, 0.8, 0] }, duration: 1, delay: 0.06, ease: 'power1.out', clearProps: 'x,transform' }));\n for (let i = 0; i < 2; i++) {\n const wave = document.createElement('i');\n waves.append(wave);\n keep(gsap.fromTo(wave, { scale: 0.6, opacity: 0.55 }, { scale: 1.9, opacity: 0, duration: 0.8, delay: i * 0.18, ease: 'power2.out', onComplete: () => wave.remove() }));\n }\n };\n\n // The message rises on the side with room inside the bell's container (and the window), so a bell at the\n // right edge of a card speaks to its left instead of running over the next thing.\n const place = () => {\n bubble.style.maxWidth = '';\n const box = root.getBoundingClientRect();\n const frame = root.parentElement?.getBoundingClientRect();\n const right = Math.min(frame?.right ?? innerWidth, innerWidth) - box.right;\n const left = box.left - Math.max(frame?.left ?? 0, 0);\n const side = right >= bubble.offsetWidth + 12 || right >= left ? 'right' : 'left';\n bubble.dataset.mkSide = side;\n bubble.style.maxWidth = `min(16rem, ${Math.max(140, (side === 'right' ? right : left) - 12)}px)`;\n };\n\n const say = (message: string) => {\n clearTimeout(hideTimer);\n gsap.killTweensOf(bubble);\n bubble.textContent = message;\n bubble.hidden = false;\n place();\n keep(blurIn(bubble, { from: 'pop' }));\n hideTimer = setTimeout(() => {\n if (scope.disposed) return;\n const out = blurOut(bubble, {\n to: 'up',\n onComplete: () => {\n bubble.hidden = true;\n gsap.set(bubble, { clearProps: 'all' });\n },\n });\n keep(out);\n }, stay);\n };\n\n const setCount = (next: number, announce = false) => {\n if (scope.disposed || !Number.isFinite(next)) return;\n const previous = count;\n count = Math.max(0, Math.round(next));\n if (count === previous) return;\n paint();\n showBadge(previous);\n if (announce) live.textContent = name();\n root.dispatchEvent(new CustomEvent('mk:count', { bubbles: true, detail: { count } }));\n };\n\n scope.on(button, 'click', () => {\n options.onOpen?.();\n root.dispatchEvent(new CustomEvent('mk:open', { bubbles: true, detail: { count } }));\n });\n badge.textContent = text(count);\n paint();\n\n return {\n notify(message) {\n if (scope.disposed) return;\n setCount(count + 1, true);\n ring();\n if (message) say(String(message));\n if (message) live.textContent = `${name()}. ${message}`;\n },\n setCount: (next) => setCount(next),\n clear: () => setCount(0),\n get count() {\n return count;\n },\n destroy: () => scope.dispose(),\n };\n}\n","/*\n * Password strength (pure): length and variety raise the score, common\n * passwords, runs (abc, 123) and repeats (aaa) lower it. 0–4, a label and the\n * checks met. A heuristic for feedback, not a security guarantee: the server\n * decides what it accepts.\n */\n\nexport interface PasswordChecks {\n length: boolean;\n lower: boolean;\n upper: boolean;\n number: boolean;\n symbol: boolean;\n}\n\nexport interface PasswordScore {\n score: 0 | 1 | 2 | 3 | 4;\n label: string;\n checks: PasswordChecks;\n}\n\nexport const STRENGTH_LABELS = ['Muy débil', 'Débil', 'Aceptable', 'Fuerte', 'Muy fuerte'] as const;\n\nconst COMMON = new Set(\n 'password password1 123456 1234567 12345678 123456789 1234567890 qwerty qwerty123 abc123 111111 000000 iloveyou admin welcome letmein monkey dragon contraseña contrasena secreto hola123 football baseball sunshine princess'.split(' '),\n);\n\nconst runs = (value: string) => {\n const text = value.toLowerCase();\n for (let i = 0; i + 2 < text.length; i++) {\n const [a, b, c] = [text.charCodeAt(i), text.charCodeAt(i + 1), text.charCodeAt(i + 2)];\n if ((b - a === 1 && c - b === 1) || (a - b === 1 && b - c === 1)) return true;\n }\n return false;\n};\n\nexport function scorePassword(value: string, minLength = 8): PasswordScore {\n const text = String(value ?? '');\n const checks: PasswordChecks = {\n length: text.length >= minLength,\n lower: /[a-zà-ÿ]/.test(text),\n upper: /[A-ZÀ-Þ]/.test(text),\n number: /\\d/.test(text),\n symbol: /[^\\p{L}\\p{N}\\s]/u.test(text),\n };\n if (!text) return { score: 0, label: '', checks };\n const variety = [checks.lower, checks.upper, checks.number, checks.symbol].filter(Boolean).length;\n let points = 0;\n if (text.length >= minLength) points += 1;\n if (text.length >= minLength + 4) points += 1;\n if (text.length >= minLength + 8) points += 1;\n if (variety >= 3) points += 1;\n if (variety === 4) points += 1;\n // Penalties count after the cap: a long, varied password with a pattern is not the best.\n points = Math.min(4, points);\n if (/(.)\\1\\1/.test(text)) points -= 1;\n if (runs(text)) points -= 1;\n if (text.length < minLength) points = Math.min(points, 1);\n if (COMMON.has(text.toLowerCase())) points = 0;\n const score = Math.max(0, Math.min(4, points)) as PasswordScore['score'];\n return { score, label: STRENGTH_LABELS[score], checks };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { scorePassword, type PasswordChecks, type PasswordScore } from './score';\n\n/*\n * Password strength: a native password field with a show/hide toggle (the eye\n * swaps with a blur), a four-segment meter whose segments light up one after\n * another and change colour by level (error → warning → good → strong), a label\n * that changes with a blur and a list of requirements whose checks draw\n * themselves. A polite status announces the level once typing pauses.\n */\n\nexport interface PasswordStrengthOptions {\n minLength?: number;\n /** Replace the built-in scoring. */\n score?: (value: string) => PasswordScore;\n /** Below this score the field reports itself invalid (setCustomValidity). */\n requireScore?: number;\n labels?: { show?: string; hide?: string; invalid?: string; checks?: Partial<Record<keyof PasswordChecks, string>> };\n onChange?: (result: PasswordScore) => void;\n}\n\nexport interface PasswordStrengthInstance extends Instance {\n readonly score: number;\n readonly value: string;\n}\n\nconst EYE = 'M2.5 12s3.5-6.5 9.5-6.5 9.5 6.5 9.5 6.5-3.5 6.5-9.5 6.5S2.5 12 2.5 12z';\nconst PUPIL = 'M12 9.2a2.8 2.8 0 1 0 0 5.6 2.8 2.8 0 0 0 0-5.6z';\nconst SLASH = 'M4 4l16 16';\nconst CHECK = 'M5 12.5l4.5 4.5L19 7.5';\nconst ORDER: Array<keyof PasswordChecks> = ['length', 'lower', 'upper', 'number', 'symbol'];\nlet sequence = 0;\n\nconst icon = (paths: string[], part: string) => {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('aria-hidden', 'true');\n svg.dataset.mkPart = part;\n for (const d of paths) {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('d', d);\n path.setAttribute('pathLength', '1');\n svg.append(path);\n }\n return svg;\n};\n\nexport function createPasswordStrength(root: HTMLElement | null, options: PasswordStrengthOptions = {}): PasswordStrengthInstance {\n if (!root) return inert({ score: 0, value: '' });\n registerMotion();\n const scope = createScope();\n const uid = `mk-password-${++sequence}`;\n const minLength = Number.isFinite(options.minLength) && options.minLength! > 0 ? Math.floor(options.minLength!) : 8;\n const score = options.score ?? ((value: string) => scorePassword(value, minLength));\n const labels = {\n show: 'Mostrar contraseña',\n hide: 'Ocultar contraseña',\n invalid: 'Elige una contraseña más fuerte.',\n ...options.labels,\n checks: { length: `Al menos ${minLength} caracteres`, lower: 'Una minúscula', upper: 'Una mayúscula', number: 'Un número', symbol: 'Un símbolo', ...options.labels?.checks },\n };\n const made: Element[] = [];\n scope.add(() => made.forEach((element) => element.remove()));\n\n let input = root.querySelector<HTMLInputElement>('input[type=\"password\"], input[data-mk-password]');\n if (!input) {\n input = document.createElement('input');\n input.autocomplete = 'new-password';\n input.setAttribute('aria-label', 'Contraseña');\n root.append(input);\n made.push(input);\n }\n scope.attr(input, 'type', 'password');\n scope.attr(input, 'data-mk-password', '');\n const field = document.createElement('span');\n field.dataset.mkPasswordField = '';\n input.replaceWith(field);\n field.append(input);\n scope.add(() => field.replaceWith(input!));\n const toggle = document.createElement('button');\n toggle.type = 'button';\n toggle.dataset.mkPasswordToggle = '';\n toggle.setAttribute('aria-pressed', 'false');\n toggle.setAttribute('aria-label', labels.show);\n if (input.id) toggle.setAttribute('aria-controls', input.id);\n const eye = icon([EYE, PUPIL, SLASH], 'eye');\n toggle.append(eye);\n field.append(toggle);\n\n const meter = document.createElement('div');\n meter.dataset.mkPasswordMeter = '';\n meter.setAttribute('aria-hidden', 'true');\n const segments = Array.from({ length: 4 }, () => {\n const segment = document.createElement('span');\n segment.append(document.createElement('i'));\n meter.append(segment);\n return segment;\n });\n const label = document.createElement('span');\n label.dataset.mkPasswordLabel = '';\n meter.append(label);\n const list = document.createElement('ul');\n list.dataset.mkPasswordChecks = '';\n list.id = `${uid}-checks`;\n const items = ORDER.map((key) => {\n const item = document.createElement('li');\n item.dataset.mkCheck = key;\n item.append(icon([CHECK], 'check'), labels.checks[key] ?? key);\n list.append(item);\n return item;\n });\n const live = document.createElement('span');\n live.className = 'mk-sr-only';\n live.setAttribute('role', 'status');\n root.append(meter, list, live);\n made.push(meter, list, live);\n scope.attr(input, 'aria-describedby', [input.getAttribute('aria-describedby'), list.id].filter(Boolean).join(' '));\n scope.attr(root, 'data-mk-ready', '');\n\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n let announce: ReturnType<typeof setTimeout> | undefined;\n scope.add(() => {\n clearTimeout(announce);\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n\n let result = score(input.value);\n let lit = 0;\n const paint = (animate: boolean) => {\n const previous = lit;\n const level = input!.value ? Math.max(1, result.score) : 0;\n lit = level;\n scope.attr(root, 'data-mk-score', input!.value ? String(result.score) : null);\n const bars = segments.map((segment) => segment.firstElementChild as HTMLElement);\n if (!animate || reduced()) gsap.set(bars, { scaleX: (i: number) => (i < level ? 1 : 0) });\n else if (level > previous) keep(gsap.fromTo(bars.slice(previous, level), { scaleX: 0 }, { scaleX: 1, duration: 0.35, ease: EASE.swatch, stagger: 0.07 }));\n else if (level < previous) keep(gsap.to(bars.slice(level, previous).reverse(), { scaleX: 0, duration: 0.2, ease: 'power2.in', stagger: 0.04 }));\n if (label.textContent !== result.label) {\n if (!animate || reduced()) label.textContent = result.label;\n else {\n gsap.killTweensOf(label);\n keep(\n gsap\n .timeline()\n .to(label, { opacity: 0, filter: 'blur(4px)', y: -3, duration: 0.12 })\n .call(() => {\n label.textContent = result.label;\n })\n .fromTo(label, { opacity: 0, filter: 'blur(4px)', y: 3 }, { opacity: 1, filter: 'blur(0px)', y: 0, duration: 0.25, ease: EASE.pop, clearProps: 'all' }),\n );\n }\n }\n items.forEach((item, i) => {\n const met = result.checks[ORDER[i]!];\n if (item.hasAttribute('data-mk-met') === met) return;\n item.toggleAttribute('data-mk-met', met);\n const path = item.querySelector('path');\n if (met && path && animate && !reduced()) keep(gsap.fromTo(path, { strokeDashoffset: 1 }, { strokeDashoffset: 0, duration: 0.35, ease: 'power2.out' }));\n });\n if (Number.isFinite(options.requireScore)) input!.setCustomValidity(input!.value && result.score < options.requireScore! ? labels.invalid : '');\n };\n\n const update = () => {\n result = score(input!.value);\n paint(true);\n options.onChange?.(result);\n root.dispatchEvent(new CustomEvent('mk:strength', { bubbles: true, detail: { score: result.score, label: result.label, met: result.checks } }));\n clearTimeout(announce);\n announce = setTimeout(() => {\n if (!scope.disposed) live.textContent = input!.value ? `Fortaleza: ${result.label}` : '';\n }, 700);\n };\n\n scope.on(input, 'input', update);\n scope.on(toggle, 'click', () => {\n const show = input!.type === 'password';\n input!.type = show ? 'text' : 'password';\n toggle.setAttribute('aria-pressed', String(show));\n toggle.setAttribute('aria-label', show ? labels.hide : labels.show);\n root.toggleAttribute('data-mk-visible', show);\n const slash = eye.querySelectorAll('path')[2];\n if (!reduced()) {\n keep(gsap.fromTo(eye, { scale: 0.7, filter: 'blur(3px)' }, { scale: 1, filter: 'blur(0px)', duration: 0.35, ease: EASE.click, clearProps: 'all' }));\n if (slash) keep(gsap.fromTo(slash, { strokeDashoffset: show ? 1 : 0 }, { strokeDashoffset: show ? 0 : 1, duration: 0.3, ease: 'power2.out' }));\n } else if (slash) gsap.set(slash, { strokeDashoffset: show ? 0 : 1 });\n });\n scope.add(() => root.removeAttribute('data-mk-visible'));\n scope.add(() => input!.setCustomValidity(''));\n gsap.set(eye.querySelectorAll('path')[2]!, { strokeDasharray: 1, strokeDashoffset: 1 });\n for (const item of items) gsap.set(item.querySelector('path')!, { strokeDasharray: 1, strokeDashoffset: 0 });\n paint(false);\n\n return {\n get score() {\n return result.score;\n },\n get value() {\n return input!.value;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { confetti } from '../../motion/confetti';\nimport { blurIn } from '../../motion/micro';\n\n/*\n * Scratch card: real HTML content (a coupon) under a metallic cover drawn on a\n * canvas with a sheen and \"Rasca aquí\". The pointer scratches it with a round\n * brush; progress is measured by sampling the cover. Past the threshold the\n * rest dissolves with a blur, the content pops in and confetti flies. While\n * covered the content is inert; a \"Revelar\" button is the way in for the\n * keyboard and screen readers, and the reveal is announced. Without a 2D\n * canvas the cover is plain CSS and the button reveals it.\n */\n\nexport interface ScratchCardOptions {\n /** Share of the cover to scratch before it reveals itself (default .5). */\n threshold?: number;\n /** Brush radius in px (default 22). */\n brush?: number;\n coverLabel?: string;\n revealLabel?: string;\n revealedLabel?: string;\n /** Confetti on reveal (default true). */\n celebrate?: boolean;\n onProgress?: (progress: number) => void;\n onReveal?: () => void;\n}\n\nexport interface ScratchCardInstance extends Instance {\n reveal(): void;\n reset(): void;\n readonly revealed: boolean;\n readonly progress: number;\n}\n\nexport function createScratchCard(root: HTMLElement | null, options: ScratchCardOptions = {}): ScratchCardInstance {\n if (!root) return inert({ reveal() {}, reset() {}, revealed: false, progress: 0 });\n registerMotion();\n const scope = createScope();\n const threshold = Number.isFinite(options.threshold) ? Math.min(0.95, Math.max(0.05, options.threshold!)) : 0.5;\n const brush = Number.isFinite(options.brush) && options.brush! > 2 ? options.brush! : 22;\n const coverText = options.coverLabel ?? 'Rasca aquí';\n\n let content = root.querySelector<HTMLElement>('[data-mk-scratch-content]');\n const made: Element[] = [];\n scope.add(() => made.forEach((element) => element.remove()));\n if (!content) {\n content = document.createElement('div');\n content.dataset.mkScratchContent = '';\n content.append(...root.childNodes);\n root.append(content);\n scope.add(() => {\n root.append(...content!.childNodes);\n content!.remove();\n });\n }\n const cover = document.createElement('div');\n cover.dataset.mkScratchCover = '';\n cover.setAttribute('aria-hidden', 'true');\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d', { willReadFrequently: true } as CanvasRenderingContext2DSettings);\n if (context) cover.append(canvas);\n else {\n cover.dataset.mkScratchFallback = '';\n cover.textContent = coverText;\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkScratchReveal = '';\n button.textContent = options.revealLabel ?? 'Revelar';\n const live = document.createElement('span');\n live.className = 'mk-sr-only';\n live.setAttribute('role', 'status');\n root.append(cover, button, live);\n made.push(cover, button, live);\n scope.attr(root, 'data-mk-ready', '');\n\n let revealed = false;\n let progress = 0;\n let size = { width: 0, height: 0, ratio: 1 };\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n let party: ReturnType<typeof confetti> | null = null;\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n party?.stop();\n });\n\n const cover_ = (covered: boolean) => {\n content!.inert = covered;\n if (covered) content!.setAttribute('aria-hidden', 'true');\n else content!.removeAttribute('aria-hidden');\n };\n scope.add(() => cover_(false));\n\n /** Paint the metallic cover with its sheen and label. */\n const paint = () => {\n if (!context) return;\n const box = root.getBoundingClientRect();\n const ratio = Math.min(2, globalThis.devicePixelRatio || 1);\n size = { width: Math.max(1, Math.round(box.width)), height: Math.max(1, Math.round(box.height)), ratio };\n canvas.width = size.width * ratio;\n canvas.height = size.height * ratio;\n context.setTransform(ratio, 0, 0, ratio, 0, 0);\n context.globalCompositeOperation = 'source-over';\n const base = context.createLinearGradient(0, 0, size.width, size.height);\n base.addColorStop(0, '#c9ccd2');\n base.addColorStop(0.45, '#eef0f3');\n base.addColorStop(0.55, '#d7dadf');\n base.addColorStop(1, '#a9adb5');\n context.fillStyle = base;\n context.fillRect(0, 0, size.width, size.height);\n // Fine grain, like foil.\n for (let i = 0; i < (size.width * size.height) / 60; i++) {\n context.fillStyle = Math.random() > 0.5 ? 'rgba(255,255,255,0.35)' : 'rgba(0,0,0,0.06)';\n context.fillRect(Math.random() * size.width, Math.random() * size.height, 1, 1);\n }\n context.fillStyle = 'rgba(40, 42, 48, 0.75)';\n // The cover speaks in the page's typeface.\n const family = getComputedStyle(root).fontFamily || 'system-ui, sans-serif';\n context.font = `600 ${Math.max(14, Math.min(22, size.width / 14))}px ${family}`;\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.fillText(coverText, size.width / 2, size.height / 2);\n };\n\n const measure = () => {\n if (!context || !size.width) return progress;\n const data = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const step = 8 * size.ratio;\n let clear = 0;\n let total = 0;\n for (let y = 0; y < canvas.height; y += step) {\n for (let x = 0; x < canvas.width; x += step) {\n total += 1;\n if (data[(Math.floor(y) * canvas.width + Math.floor(x)) * 4 + 3]! < 64) clear += 1;\n }\n }\n return total ? clear / total : 0;\n };\n\n const reveal = () => {\n if (scope.disposed || revealed) return;\n revealed = true;\n progress = 1;\n scope.attr(root, 'data-mk-revealed', '');\n cover_(false);\n button.hidden = true;\n live.textContent = options.revealedLabel ?? 'Premio revelado';\n const done = () => {\n cover.hidden = true;\n };\n if (reduced()) done();\n else {\n keep(gsap.to(cover, { opacity: 0, filter: 'blur(12px)', scale: 1.04, duration: 0.5, ease: 'power2.out', onComplete: done }));\n keep(blurIn(content, { from: 'pop', delay: 0.1 }));\n if (options.celebrate !== false) party = confetti(root, { count: 60 });\n }\n options.onReveal?.();\n root.dispatchEvent(new CustomEvent('mk:reveal', { bubbles: true }));\n };\n\n const reset = () => {\n if (scope.disposed) return;\n revealed = false;\n progress = 0;\n scope.attr(root, 'data-mk-revealed', null);\n gsap.killTweensOf(cover);\n gsap.set(cover, { clearProps: 'all' });\n cover.hidden = false;\n button.hidden = false;\n cover_(true);\n live.textContent = '';\n paint();\n };\n\n let drawing = false;\n let last: { x: number; y: number } | null = null;\n let moves = 0;\n const scratch = (event: PointerEvent) => {\n if (!context || revealed) return;\n const box = canvas.getBoundingClientRect();\n const point = { x: event.clientX - box.left, y: event.clientY - box.top };\n context.globalCompositeOperation = 'destination-out';\n context.lineCap = 'round';\n context.lineJoin = 'round';\n context.lineWidth = brush * 2;\n context.beginPath();\n context.moveTo(last?.x ?? point.x, last?.y ?? point.y);\n context.lineTo(point.x, point.y);\n context.stroke();\n last = point;\n // Sampling every move would be wasteful: every fifth is enough.\n if (++moves % 5) return;\n progress = measure();\n options.onProgress?.(progress);\n root.dispatchEvent(new CustomEvent('mk:progress', { bubbles: true, detail: { progress } }));\n if (progress >= threshold) reveal();\n };\n scope.on(canvas, 'pointerdown', (event) => {\n const pointer = event as PointerEvent;\n drawing = true;\n last = null;\n canvas.setPointerCapture?.(pointer.pointerId);\n scratch(pointer);\n });\n scope.on(canvas, 'pointermove', (event) => {\n if (drawing) scratch(event as PointerEvent);\n });\n const stop = () => {\n drawing = false;\n last = null;\n };\n scope.on(canvas, 'pointerup', stop);\n scope.on(canvas, 'pointercancel', stop);\n scope.on(button, 'click', reveal);\n if (typeof ResizeObserver === 'function' && context) {\n let width = 0;\n scope.observe(\n new ResizeObserver(() => {\n const next = Math.round(root.getBoundingClientRect().width);\n if (next === width || revealed) return;\n width = next;\n paint();\n }),\n ).observe(root);\n }\n cover_(true);\n paint();\n // A web font that arrives late repaints the untouched cover.\n let alive = true;\n scope.add(() => (alive = false));\n document.fonts?.ready.then(() => {\n if (alive && !revealed && progress === 0) paint();\n });\n\n return {\n reveal,\n reset,\n get revealed() {\n return revealed;\n },\n get progress() {\n return progress;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, ELASTIC, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { numberFormat } from '../../core/dates';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { burst } from '../../motion/micro';\n\n/*\n * Star rating on native radios (arrow keys and forms come from the platform).\n * Pointing previews the stars in a 20 ms cascade; choosing one springs it from\n * 1.4 (elastic), throws a small burst and the label (\"Excelente\") changes with\n * a blur. allowClear lets a click on the chosen star clear it. readonly draws a\n * value (fractions too) as an image with its value as the name.\n */\n\nexport interface StarRatingOptions {\n max?: number;\n value?: number;\n /** Form name (default 'rating'). */\n name?: string;\n /** Accessible name of the group (default 'Valoración'). */\n label?: string;\n /** One text per star, shown and read for the chosen value. */\n labels?: string[];\n readonly?: boolean;\n allowClear?: boolean;\n disabled?: boolean;\n onChange?: (value: number) => void;\n}\n\nexport interface StarRatingInstance extends Instance {\n setValue(value: number, notify?: boolean): void;\n readonly value: number;\n}\n\nconst STAR = 'M12 3.2l2.6 5.4 5.9.8-4.3 4.1 1 5.9L12 16.6l-5.2 2.8 1-5.9-4.3-4.1 5.9-.8z';\nconst LABELS = ['Mala', 'Regular', 'Buena', 'Muy buena', 'Excelente'];\nlet sequence = 0;\n\nconst star = () => {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('aria-hidden', 'true');\n const back = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n back.setAttribute('d', STAR);\n back.dataset.mkPart = 'empty';\n const front = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n front.setAttribute('d', STAR);\n front.dataset.mkPart = 'full';\n svg.append(back, front);\n return svg;\n};\n\nexport function createStarRating(root: HTMLElement | null, options: StarRatingOptions = {}): StarRatingInstance {\n if (!root) return inert({ setValue() {}, value: 0 });\n registerMotion();\n const scope = createScope();\n const max = Math.max(1, Math.min(10, Math.round(Number.isFinite(options.max) ? options.max! : 5)));\n const texts = options.labels ?? (max === 5 ? LABELS : []);\n const clamp = (n: number) => Math.max(0, Math.min(max, n));\n let value = clamp(Number.isFinite(options.value) ? options.value! : 0);\n const name = options.name ?? `rating-${++sequence}`;\n\n const group = document.createElement('div');\n group.dataset.mkStars = '';\n const caption = document.createElement('span');\n caption.dataset.mkStarLabel = '';\n root.append(group, caption);\n scope.add(() => {\n group.remove();\n caption.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n scope.attr(root, 'style', root.getAttribute('style'));\n\n const stars: HTMLElement[] = [];\n const inputs: HTMLInputElement[] = [];\n if (options.readonly) {\n group.setAttribute('role', 'img');\n for (let i = 1; i <= max; i++) {\n const item = document.createElement('span');\n item.dataset.mkStar = String(i);\n item.append(star());\n group.append(item);\n stars.push(item);\n }\n } else {\n group.setAttribute('role', 'radiogroup');\n group.setAttribute('aria-label', options.label ?? 'Valoración');\n for (let i = 1; i <= max; i++) {\n const item = document.createElement('label');\n item.dataset.mkStar = String(i);\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = name;\n input.value = String(i);\n input.className = 'mk-sr-only';\n input.disabled = Boolean(options.disabled);\n input.setAttribute('aria-label', texts[i - 1] ? `${i} de ${max}: ${texts[i - 1]}` : `${i} de ${max}`);\n item.append(input, star());\n group.append(item);\n stars.push(item);\n inputs.push(input);\n }\n }\n\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n\n const svgs = () => stars.map((item) => item.querySelector('svg')!);\n /** Light the stars up to `upto` (fractions fill the last one partly). */\n const light = (upto: number) => {\n stars.forEach((item, i) => {\n const fill = Math.max(0, Math.min(1, upto - i));\n item.style.setProperty('--mk-star-fill', `${(fill * 100).toFixed(1)}%`);\n item.toggleAttribute('data-mk-on', fill >= 1);\n });\n };\n const describe = () => {\n const text = value ? texts[Math.ceil(value) - 1] ?? '' : '';\n if (options.readonly) {\n const shown = numberFormat(root, { maximumFractionDigits: 1 }).format(value);\n group.setAttribute('aria-label', `${options.label ?? 'Valoración'}: ${shown} de ${max}`);\n caption.textContent = shown;\n return;\n }\n if (caption.textContent === text) return;\n if (reduced() || !caption.textContent) {\n caption.textContent = text;\n return;\n }\n gsap.killTweensOf(caption);\n keep(\n gsap\n .timeline()\n .to(caption, { opacity: 0, filter: 'blur(4px)', y: -3, duration: 0.12 })\n .call(() => {\n caption.textContent = text;\n })\n .fromTo(caption, { opacity: 0, filter: 'blur(4px)', y: 3 }, { opacity: 1, filter: 'blur(0px)', y: 0, duration: 0.25, clearProps: 'all' }),\n );\n };\n const paint = () => {\n inputs.forEach((input, i) => (input.checked = i + 1 === value));\n light(value);\n describe();\n };\n\n const choose = (next: number, notify: boolean, animate: boolean) => {\n if (scope.disposed) return;\n const target = clamp(Math.round(next));\n if (target === value) return;\n value = target;\n paint();\n if (animate && target && !reduced()) {\n const item = stars[target - 1]!;\n keep(gsap.fromTo(item.querySelector('svg'), { scale: 1.45, rotation: -12 }, { scale: 1, rotation: 0, duration: 0.8, ease: ELASTIC, clearProps: 'all' }));\n keep(gsap.fromTo(svgs().slice(0, target - 1), { scale: 0.8 }, { scale: 1, duration: 0.4, ease: 'back.out(3)', stagger: 0.03, clearProps: 'all' }));\n keep(burst(item, { count: 6, distance: 22, size: 5, colors: ['var(--mk-star-color)'] }));\n }\n if (!notify) return;\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value } }));\n };\n\n if (!options.readonly) {\n let preview = 0;\n scope.on(group, 'pointerover', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-star]');\n if (!item || options.disabled) return;\n const upto = Number(item.dataset.mkStar);\n if (upto === preview) return;\n const from = preview;\n preview = upto;\n scope.attr(root, 'data-mk-preview', String(upto));\n light(upto);\n if (!reduced() && upto > from) keep(gsap.fromTo(svgs().slice(from, upto), { scale: 0.85 }, { scale: 1, duration: 0.3, ease: 'back.out(3)', stagger: 0.02, clearProps: 'all' }));\n });\n scope.on(group, 'pointerleave', () => {\n preview = 0;\n scope.attr(root, 'data-mk-preview', null);\n light(value);\n });\n // A click on the chosen star (allowClear) clears it: radios cannot uncheck themselves.\n let before = 0;\n scope.on(group, 'pointerdown', () => {\n before = value;\n });\n scope.on(group, 'click', (event) => {\n const input = (event.target as Element | null)?.closest('input');\n if (!input || !options.allowClear) return;\n if (Number(input.value) === before && before === value) {\n before = -1;\n choose(0, true, false);\n }\n });\n for (const input of inputs) scope.on(input, 'change', () => choose(Number(input.value), true, true));\n }\n paint();\n\n return {\n setValue: (next, notify = false) => choose(next, notify, !notify),\n get value() {\n return value;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { press } from '../../motion/micro';\n\n/*\n * Swipe actions: a horizontal drag on a list row ([data-mk-swipe-row]) slides\n * its face ([data-mk-swipe-content]) aside and shows the actions behind it\n * ([data-mk-swipe-actions=\"left|right\"] with buttons [data-mk-swipe-action]).\n * The icons grow as the drag passes the opening point; letting go snaps the row\n * open or shut on the swing curve. A long swipe (60 %) runs the side's primary\n * action: the face slides out and, for [data-mk-swipe-remove] actions, the row\n * folds away (blur, height to 0) before mk:action fires so the app can drop it.\n * One row open at a time; Escape or a tap elsewhere shuts it. The actions are\n * real buttons: focusing one opens its row. Vertical scrolling stays native.\n */\n\nexport type SwipeSide = 'left' | 'right';\n\nexport interface SwipeActionsOptions {\n /** Share of the row width that runs the primary action (default .6; 0 turns it off). */\n fullSwipe?: number;\n onAction?: (action: string, row: HTMLElement) => void;\n}\n\nexport interface SwipeActionsInstance extends Instance {\n open(row: HTMLElement, side: SwipeSide): void;\n close(): void;\n readonly openRow: HTMLElement | null;\n}\n\nconst ROW = '[data-mk-swipe-row]';\nconst SLOP = 8;\n\nexport function createSwipeActions(root: HTMLElement | null, options: SwipeActionsOptions = {}): SwipeActionsInstance {\n if (!root) return inert({ open() {}, close() {}, openRow: null });\n registerMotion();\n const scope = createScope();\n const full = Number.isFinite(options.fullSwipe) ? Math.max(0, Math.min(0.95, options.fullSwipe!)) : 0.6;\n scope.attr(root, 'data-mk-ready', '');\n\n let current: { row: HTMLElement; side: SwipeSide } | null = null;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n const touched = new Set<HTMLElement>();\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n for (const element of touched) {\n gsap.set(element, { clearProps: 'transform,height,opacity,filter,marginTop,marginBottom,paddingTop,paddingBottom,overflow' });\n element.removeAttribute('data-mk-open');\n element.removeAttribute('data-mk-armed');\n element.style.removeProperty('--mk-swipe-reveal');\n if (element.getAttribute('style') === '') element.removeAttribute('style');\n }\n });\n\n const parts = (row: HTMLElement) => ({\n face: row.querySelector<HTMLElement>('[data-mk-swipe-content]'),\n left: row.querySelector<HTMLElement>('[data-mk-swipe-actions=\"left\"]'),\n right: row.querySelector<HTMLElement>('[data-mk-swipe-actions=\"right\"]'),\n });\n const widthOf = (actions: HTMLElement | null) => actions?.getBoundingClientRect().width || actions?.offsetWidth || 0;\n const primaryOf = (actions: HTMLElement | null) => actions?.querySelector<HTMLButtonElement>('[data-mk-swipe-primary]') ?? (actions?.dataset.mkSwipeActions === 'right' ? actions.querySelector<HTMLButtonElement>('[data-mk-swipe-action]:last-of-type') : actions?.querySelector<HTMLButtonElement>('[data-mk-swipe-action]')) ?? null;\n\n const move = (row: HTMLElement, x: number, animate: boolean) => {\n const { face } = parts(row);\n if (!face) return;\n touched.add(face);\n touched.add(row);\n if (!animate || reduced()) gsap.set(face, { x });\n else keep(gsap.to(face, { x, duration: 0.5, ease: EASE.swatch, overwrite: 'auto' }));\n };\n\n const close = (animate = true) => {\n if (!current) return;\n const { row } = current;\n current = null;\n row.removeAttribute('data-mk-open');\n row.removeAttribute('data-mk-armed');\n row.style.removeProperty('--mk-swipe-reveal');\n move(row, 0, animate);\n };\n\n const open = (row: HTMLElement, side: SwipeSide, animate = true) => {\n if (scope.disposed || !root.contains(row)) return;\n const actions = parts(row)[side];\n if (!actions) return;\n if (current && current.row !== row) close();\n current = { row, side };\n row.setAttribute('data-mk-open', side);\n row.style.setProperty('--mk-swipe-reveal', '1');\n touched.add(row);\n move(row, side === 'left' ? widthOf(actions) : -widthOf(actions), animate);\n root.dispatchEvent(new CustomEvent('mk:open', { bubbles: true, detail: { row, side } }));\n };\n\n /** Run an action: emit; a removing action folds the row away first. */\n const run = (button: HTMLButtonElement, row: HTMLElement, swiped: boolean) => {\n const action = button.dataset.mkSwipeAction ?? button.textContent?.trim() ?? '';\n const emit = () => {\n options.onAction?.(action, row);\n root.dispatchEvent(new CustomEvent('mk:action', { bubbles: true, detail: { action, row } }));\n };\n keep(press(button));\n if (!button.hasAttribute('data-mk-swipe-remove')) {\n if (current?.row === row) close();\n return emit();\n }\n current = null;\n row.removeAttribute('data-mk-open');\n touched.add(row);\n if (reduced()) {\n gsap.set(row, { height: 0, opacity: 0, overflow: 'hidden', paddingTop: 0, paddingBottom: 0, marginTop: 0, marginBottom: 0 });\n return emit();\n }\n const { face } = parts(row);\n const width = row.getBoundingClientRect().width || 400;\n const side = Number(gsap.getProperty(face, 'x')) >= 0 ? 1 : -1;\n keep(\n gsap\n .timeline({ onComplete: emit })\n .to(face, { x: side * width * (swiped ? 1.05 : 1), duration: 0.3, ease: 'power2.in' })\n .to(row, { height: 0, opacity: 0, filter: 'blur(16px)', paddingTop: 0, paddingBottom: 0, marginTop: 0, marginBottom: 0, overflow: 'hidden', duration: 0.25, ease: 'power2.in' }),\n );\n };\n\n // The drag.\n /** The click that ends a drag is not a tap. */\n let dragged = false;\n let drag: { row: HTMLElement; x0: number; y0: number; start: number; id: number; horizontal: boolean | null } | null = null;\n scope.on(root, 'pointerdown', (event) => {\n const pointer = event as PointerEvent;\n if (pointer.button !== 0) return;\n const target = pointer.target as Element | null;\n if (target?.closest('[data-mk-swipe-action], a, input, select, textarea')) return;\n const row = target?.closest<HTMLElement>(ROW);\n const face = row && parts(row).face;\n if (!row || !face || !root.contains(row)) return;\n gsap.killTweensOf(face, 'x');\n drag = { row, x0: pointer.clientX, y0: pointer.clientY, start: Number(gsap.getProperty(face, 'x')) || 0, id: pointer.pointerId, horizontal: null };\n });\n scope.on(root, 'pointermove', (event) => {\n const pointer = event as PointerEvent;\n if (!drag || pointer.pointerId !== drag.id) return;\n const dx = pointer.clientX - drag.x0;\n const dy = pointer.clientY - drag.y0;\n if (drag.horizontal === null) {\n if (Math.abs(dx) < SLOP && Math.abs(dy) < SLOP) return;\n drag.horizontal = Math.abs(dx) > Math.abs(dy);\n if (!drag.horizontal) {\n drag = null;\n return;\n }\n if (current && current.row !== drag.row) close();\n (pointer.target as Element).setPointerCapture?.(pointer.pointerId);\n drag.row.setAttribute('data-mk-dragging', '');\n }\n const { left, right } = parts(drag.row);\n let x = drag.start + dx;\n // No actions on a side: it resists.\n if ((x > 0 && !left) || (x < 0 && !right)) x *= 0.15;\n const actions = x > 0 ? left : right;\n const reach = widthOf(actions);\n const width = drag.row.getBoundingClientRect().width || 1;\n // Past the actions the drag slows down, unless a long swipe is on.\n if (reach && Math.abs(x) > reach && !full) x = Math.sign(x) * (reach + (Math.abs(x) - reach) * 0.3);\n drag.row.toggleAttribute('data-mk-armed', Boolean(full) && Math.abs(x) >= width * full);\n drag.row.style.setProperty('--mk-swipe-reveal', String(Math.min(1, reach ? Math.abs(x) / reach : 0)));\n touched.add(drag.row);\n move(drag.row, x, false);\n });\n const release = (event: Event) => {\n const pointer = event as PointerEvent;\n if (!drag || pointer.pointerId !== drag.id) return;\n const { row, horizontal } = drag;\n drag = null;\n row.removeAttribute('data-mk-dragging');\n if (!horizontal) return;\n dragged = true;\n setTimeout(() => (dragged = false), 0);\n const face = parts(row).face!;\n const x = Number(gsap.getProperty(face, 'x')) || 0;\n const side: SwipeSide = x > 0 ? 'left' : 'right';\n const actions = parts(row)[side];\n const width = row.getBoundingClientRect().width || 1;\n row.removeAttribute('data-mk-armed');\n const primary = primaryOf(actions);\n if (full && actions && primary && Math.abs(x) >= width * full) return run(primary, row, true);\n if (actions && Math.abs(x) > widthOf(actions) / 2) open(row, side);\n else {\n if (current?.row === row) current = null;\n row.removeAttribute('data-mk-open');\n row.style.removeProperty('--mk-swipe-reveal');\n move(row, 0, true);\n }\n };\n scope.on(root, 'pointerup', release);\n scope.on(root, 'pointercancel', release);\n // A click after a drag is not a tap on the row.\n scope.on(\n root,\n 'click',\n (event) => {\n if (dragged) {\n dragged = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const button = (event.target as Element | null)?.closest<HTMLButtonElement>('[data-mk-swipe-action]');\n const row = button?.closest<HTMLElement>(ROW);\n if (button && row && root.contains(row)) {\n run(button, row, false);\n return;\n }\n if (current && !(event.target as Element | null)?.closest('[data-mk-swipe-actions]')) {\n const inside = (event.target as Element | null)?.closest(ROW) === current.row;\n close();\n if (inside) event.preventDefault();\n }\n },\n true,\n );\n scope.on(document, 'pointerdown', (event) => {\n if (current && !current.row.contains(event.target as Node)) close();\n });\n scope.on(root, 'keydown', (event) => {\n if ((event as KeyboardEvent).key === 'Escape' && current) {\n const row = current.row;\n close();\n parts(row).face?.focus?.();\n }\n });\n // Keyboard: focusing an action opens its row.\n scope.on(root, 'focusin', (event) => {\n const actions = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-swipe-actions]');\n const row = actions?.closest<HTMLElement>(ROW);\n if (actions && row && current?.row !== row) open(row, actions.dataset.mkSwipeActions as SwipeSide);\n });\n scope.on(root, 'focusout', (event) => {\n const next = (event as FocusEvent).relatedTarget as Element | null;\n if (current && !current.row.contains(next)) close();\n });\n\n return {\n open: (row, side) => open(row, side),\n close: () => close(),\n get openRow() {\n return current?.row ?? null;\n },\n destroy: () => scope.dispose(),\n };\n}\n","/*\n * Colour model for the colour components. HSVA is the working space (h 0–360,\n * s and v 0–100, a 0–1): the saturation × brightness area and the hue slider\n * map onto it directly. Parses #rgb, #rgba, #rrggbb, #rrggbbaa, rgb()/rgba()\n * and hsl()/hsla() (comma or space syntax, optional \"/ alpha\"); formats hex,\n * rgb or hsl (alpha only when below 1). A grey keeps the hue it is given, so\n * dragging through grey never resets the hue.\n */\n\nexport interface Hsva {\n /** 0–360. */\n h: number;\n /** 0–100. */\n s: number;\n /** 0–100. */\n v: number;\n /** 0–1. */\n a: number;\n}\n\nexport interface Rgba {\n /** 0–255. */\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport interface Hsla {\n h: number;\n /** 0–100. */\n s: number;\n l: number;\n a: number;\n}\n\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl';\nexport type ColorChannel = 'hue' | 'saturation' | 'brightness' | 'lightness' | 'red' | 'green' | 'blue' | 'alpha';\n\nexport const CHANNEL_LABELS: Record<ColorChannel, string> = {\n hue: 'Tono',\n saturation: 'Saturación',\n brightness: 'Brillo',\n lightness: 'Luminosidad',\n red: 'Rojo',\n green: 'Verde',\n blue: 'Azul',\n alpha: 'Opacidad',\n};\n\nexport const CHANNEL_RANGE: Record<ColorChannel, [number, number]> = {\n hue: [0, 360],\n saturation: [0, 100],\n brightness: [0, 100],\n lightness: [0, 100],\n red: [0, 255],\n green: [0, 255],\n blue: [0, 255],\n alpha: [0, 1],\n};\n\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, Number.isFinite(n) ? n : min));\n/** Two decimals: enough for a lossless 8-bit round trip, without float noise (31.999…). */\nconst tidy = (n: number) => Math.round(n * 100) / 100;\nconst wrapHue = (h: number) => {\n const hue = ((h % 360) + 360) % 360;\n return hue === 0 && h > 0 ? 360 : hue;\n};\n\nconst hsva = (h: number, s: number, v: number, a: number): Hsva => ({\n h: tidy(clamp(h, 0, 360)),\n s: tidy(clamp(s, 0, 100)),\n v: tidy(clamp(v, 0, 100)),\n a: Math.round(clamp(a, 0, 1) * 1000) / 1000,\n});\n\n/** HSVA → RGBA (channels 0–255, unrounded). */\nexport function hsvToRgb({ h, s, v, a }: Hsva): Rgba {\n const sat = s / 100;\n const val = v / 100;\n const f = (n: number) => {\n const k = (n + (h % 360) / 60) % 6;\n return val - val * sat * Math.max(0, Math.min(k, 4 - k, 1));\n };\n return { r: f(5) * 255, g: f(3) * 255, b: f(1) * 255, a };\n}\n\n/** RGBA → HSVA; a grey keeps `hue` (and black keeps `saturation`) when given. */\nexport function rgbToHsv({ r, g, b, a }: Rgba, hue?: number, saturation?: number): Hsva {\n const [red, green, blue] = [r / 255, g / 255, b / 255];\n const max = Math.max(red, green, blue);\n const min = Math.min(red, green, blue);\n const delta = max - min;\n let h = hue ?? 0;\n if (delta > 0) {\n if (max === red) h = 60 * (((green - blue) / delta) % 6);\n else if (max === green) h = 60 * ((blue - red) / delta + 2);\n else h = 60 * ((red - green) / delta + 4);\n if (h < 0) h += 360;\n }\n const s = max === 0 ? (saturation ?? 0) : (delta / max) * 100;\n return hsva(h, s, max * 100, a);\n}\n\nexport function hsvToHsl({ h, s, v, a }: Hsva): Hsla {\n const sat = s / 100;\n const val = v / 100;\n const l = val * (1 - sat / 2);\n const sl = l === 0 || l === 1 ? 0 : (val - l) / Math.min(l, 1 - l);\n return { h, s: sl * 100, l: l * 100, a };\n}\n\nexport function hslToHsv({ h, s, l, a }: Hsla, saturation?: number): Hsva {\n const sat = s / 100;\n const light = l / 100;\n const v = light + sat * Math.min(light, 1 - light);\n const sv = v === 0 ? (saturation ?? 0) / 100 : 2 * (1 - light / v);\n return hsva(h, sv * 100, v * 100, a);\n}\n\nconst number = (text: string, scale: number) => {\n const value = Number.parseFloat(text);\n if (!Number.isFinite(value)) return Number.NaN;\n return text.trim().endsWith('%') ? (value / 100) * scale : value;\n};\n\nconst alphaOf = (text: string | undefined) => (text === undefined ? 1 : clamp(number(text, 1), 0, 1));\n\nconst angle = (text: string) => {\n const value = Number.parseFloat(text);\n if (!Number.isFinite(value)) return Number.NaN;\n if (/turn$/i.test(text)) return value * 360;\n if (/grad$/i.test(text)) return value * 0.9;\n if (/rad$/i.test(text)) return (value * 180) / Math.PI;\n return value;\n};\n\n/** \"rgb(1, 2, 3)\", \"rgb(1 2 3 / 50%)\" → its parts, or null. */\nfunction args(text: string, name: string): string[] | null {\n const match = new RegExp(`^${name}a?\\\\(\\\\s*([^)]*)\\\\)$`, 'i').exec(text);\n if (!match) return null;\n const body = match[1]!.trim();\n const [main, slash] = body.split('/');\n const parts = main!.includes(',') ? main!.split(',').map((part) => part.trim()) : main!.trim().split(/\\s+/);\n if (slash !== undefined) {\n if (main!.includes(',') || parts.length !== 3) return null;\n parts.push(slash.trim());\n }\n if (parts.length < 3 || parts.length > 4 || parts.some((part) => !part)) return null;\n return parts;\n}\n\n/**\n * Any colour the components accept, as HSVA; null when the text is not one.\n * `hue` is kept for greys (no hue of their own).\n */\nexport function parseColor(input: string | null | undefined, hue?: number): Hsva | null {\n const text = (input ?? '').trim().toLowerCase();\n if (!text) return null;\n const hex = /^#?([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.exec(text);\n if (hex) {\n let digits = hex[1]!;\n if (digits.length <= 4) digits = [...digits].map((c) => c + c).join('');\n const channel = (i: number) => Number.parseInt(digits.slice(i, i + 2), 16);\n return rgbToHsv({ r: channel(0), g: channel(2), b: channel(4), a: digits.length === 8 ? channel(6) / 255 : 1 }, hue);\n }\n const rgb = args(text, 'rgb');\n if (rgb) {\n const [r, g, b] = rgb.slice(0, 3).map((part) => number(part, 255));\n const a = alphaOf(rgb[3]);\n if (![r, g, b, a].every(Number.isFinite)) return null;\n return rgbToHsv({ r: clamp(r!, 0, 255), g: clamp(g!, 0, 255), b: clamp(b!, 0, 255), a }, hue);\n }\n const hsl = args(text, 'hsl');\n if (hsl) {\n const h = angle(hsl[0]!);\n const s = Number.parseFloat(hsl[1]!);\n const l = Number.parseFloat(hsl[2]!);\n const a = alphaOf(hsl[3]);\n if (![h, s, l, a].every(Number.isFinite)) return null;\n const color = hslToHsv({ h: wrapHue(h), s: clamp(s, 0, 100), l: clamp(l, 0, 100), a });\n return color.s === 0 && hue !== undefined ? { ...color, h: hue } : color;\n }\n return null;\n}\n\nconst DEFAULT: Hsva = { h: 0, s: 100, v: 100, a: 1 };\n\n/** A colour option (text or HSVA) as HSVA; `fallback` (default red) when it cannot be read. */\nexport function toHsva(input: string | Hsva | null | undefined, fallback: Hsva = DEFAULT): Hsva {\n if (input && typeof input === 'object') return hsva(input.h, input.s, input.v, input.a ?? 1);\n return parseColor(input, fallback.h) ?? { ...fallback };\n}\n\nconst byte = (n: number) => Math.round(clamp(n, 0, 255));\nconst hex2 = (n: number) => byte(n).toString(16).padStart(2, '0');\nconst short = (n: number) => String(Math.round(n * 100) / 100);\n\n/** #rrggbb, or #rrggbbaa when translucent. */\nexport function toHex(color: Hsva): string {\n const { r, g, b, a } = hsvToRgb(color);\n const alpha = byte(a * 255);\n return `#${hex2(r)}${hex2(g)}${hex2(b)}${alpha < 255 ? hex2(alpha) : ''}`;\n}\n\n/** The colour as CSS text: hex, \"rgb(255 136 0 / 0.5)\" or \"hsl(32 100% 50%)\". */\nexport function formatColor(color: Hsva, format: ColorFormat = 'hex'): string {\n if (format === 'rgb') {\n const { r, g, b, a } = hsvToRgb(color);\n return `rgb(${byte(r)} ${byte(g)} ${byte(b)}${a < 1 ? ` / ${short(a)}` : ''})`;\n }\n if (format === 'hsl') {\n const { h, s, l, a } = hsvToHsl(color);\n return `hsl(${Math.round(h) % 360} ${Math.round(s)}% ${Math.round(l)}%${a < 1 ? ` / ${short(a)}` : ''})`;\n }\n return toHex(color);\n}\n\n/** Same colour on screen (same 8-bit hex). */\nexport const sameColor = (a: Hsva, b: Hsva) => toHex(a) === toHex(b);\n\n/** Relative luminance (WCAG), 0–1, ignoring alpha. */\nexport function luminance(color: Hsva): number {\n const { r, g, b } = hsvToRgb(color);\n const linear = (n: number) => {\n const c = n / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * linear(r) + 0.7152 * linear(g) + 0.0722 * linear(b);\n}\n\n/** One channel's value in its own range (CHANNEL_RANGE). */\nexport function getChannel(color: Hsva, channel: ColorChannel): number {\n switch (channel) {\n case 'hue':\n return color.h;\n case 'saturation':\n return color.s;\n case 'brightness':\n return color.v;\n case 'alpha':\n return color.a;\n case 'lightness':\n return tidy(hsvToHsl(color).l);\n default: {\n const rgb = hsvToRgb(color);\n return byte(channel === 'red' ? rgb.r : channel === 'green' ? rgb.g : rgb.b);\n }\n }\n}\n\n/** A copy with one channel changed (clamped to its range); the hue survives greys. */\nexport function setChannel(color: Hsva, channel: ColorChannel, value: number): Hsva {\n const [min, max] = CHANNEL_RANGE[channel];\n const next = clamp(value, min, max);\n switch (channel) {\n case 'hue':\n return hsva(next, color.s, color.v, color.a);\n case 'saturation':\n return hsva(color.h, next, color.v, color.a);\n case 'brightness':\n return hsva(color.h, color.s, next, color.a);\n case 'alpha':\n return hsva(color.h, color.s, color.v, next);\n case 'lightness': {\n const hsl = hsvToHsl(color);\n return { ...hslToHsv({ ...hsl, l: next }, color.s), h: color.h };\n }\n default: {\n const rgb = hsvToRgb(color);\n const key = channel === 'red' ? 'r' : channel === 'green' ? 'g' : 'b';\n return rgbToHsv({ ...rgb, [key]: next }, color.h, color.s);\n }\n }\n}\n\n/** What a channel's value reads as: \"210°\", \"64 %\", \"136\". */\nexport function channelText(channel: ColorChannel, value: number, format?: Intl.NumberFormat): string {\n const shown = (n: number) => (format ? format.format(n) : String(Math.round(n)));\n if (channel === 'hue') return `${shown(value)}°`;\n if (channel === 'alpha') return `${shown(value * 100)} %`;\n if (channel === 'red' || channel === 'green' || channel === 'blue') return shown(value);\n return `${shown(value)} %`;\n}\n\nconst rgbText = (color: Hsva) => formatColor(color, 'rgb');\n\n/** A slider track for `channel` at `color`: the channel's whole range, the other channels fixed. */\nexport function channelGradient(color: Hsva, channel: ColorChannel, direction = 'to right'): string {\n const opaque = { ...color, a: 1 };\n let stops: string[];\n if (channel === 'hue') stops = [0, 60, 120, 180, 240, 300, 360].map((h) => rgbText({ h, s: 100, v: 100, a: 1 }));\n else if (channel === 'alpha') stops = [rgbText({ ...opaque, a: 0 }), rgbText(opaque)];\n else if (channel === 'lightness') stops = [0, 50, 100].map((l) => rgbText(setChannel(opaque, 'lightness', l)));\n else {\n const [min, max] = CHANNEL_RANGE[channel];\n stops = [setChannel(opaque, channel, min), setChannel(opaque, channel, max)].map(rgbText);\n }\n return `linear-gradient(${direction}, ${stops.join(', ')})`;\n}\n\n/** The saturation (x) × brightness (y) square at hue `h`. */\nexport const areaBackground = (h: number) =>\n `linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, hsl(${Math.round(h) % 360} 100% 50%))`;\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { numberFormat } from '../../core/dates';\nimport {\n CHANNEL_LABELS, CHANNEL_RANGE, channelGradient, channelText, formatColor, getChannel, sameColor, setChannel, toHex, toHsva,\n type ColorChannel, type Hsva,\n} from '../../core/color';\nimport { rollDigits } from '../../motion/micro';\n\n/*\n * Color slider: one channel of a colour on a native <input type=\"range\">\n * (keyboard, touch and forms from the platform; its thumb is transparent). The\n * engine paints the track (that channel's gradient at the current colour, alpha\n * over a checkerboard) and a round thumb filled with the colour, moved by a GSAP\n * proxy: tight while dragging (.1 s), Melonmind's swing for keys and setColor\n * (.35 s, .38,.49,0,1.5). Grabbing grows the thumb on the click curve and pops a\n * loupe with the colour above it. Parts: [data-mk-color-track],\n * input[data-mk-color-input], [data-mk-color-thumb] > [data-mk-color-loupe],\n * output[data-mk-color-output]. Vars: --mk-color-track, --mk-color-thumb, --mk-color-pos.\n */\n\nexport interface ColorSliderOptions {\n /** Channel this slider edits (default 'hue'). */\n channel?: ColorChannel;\n /** Any CSS colour parseColor reads, or HSVA (default 'hsl(0 100% 50%)'). */\n value?: string | Hsva;\n /** Accessible name (default: the channel's Spanish name). */\n label?: string;\n orientation?: 'horizontal' | 'vertical';\n /** Default 1 (alpha .01). */\n step?: number;\n /** Shows the value (\"210°\", \"64 %\") in an <output>. */\n showValue?: boolean;\n /** Form name: a hidden input submits the hex. */\n name?: string;\n disabled?: boolean;\n /** Every move. */\n onInput?: (value: string, color: Hsva) => void;\n /** Committed (release, key). */\n onChange?: (value: string, color: Hsva) => void;\n}\n\nexport interface ColorSliderInstance extends Instance {\n /** Another control changed the colour; `notify` false keeps callbacks quiet. */\n setColor(color: string | Hsva, notify?: boolean): void;\n /** Hex (#rrggbb, #rrggbbaa when translucent). */\n readonly value: string;\n readonly color: Hsva;\n}\n\nexport function createColorSlider(root: HTMLElement | null, options: ColorSliderOptions = {}): ColorSliderInstance {\n if (!root) return inert({ setColor() {}, value: '', color: { h: 0, s: 0, v: 0, a: 1 } });\n registerMotion();\n const scope = createScope();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n scope.attr(root, 'style', root.getAttribute('style'));\n\n const channel: ColorChannel = options.channel && options.channel in CHANNEL_RANGE ? options.channel : 'hue';\n const [min, max] = CHANNEL_RANGE[channel];\n const step = options.step && options.step > 0 ? options.step : channel === 'alpha' ? 0.01 : 1;\n const vertical = options.orientation === 'vertical';\n let color = toHsva(options.value ?? 'hsl(0 100% 50%)');\n const format = numberFormat(root, { maximumFractionDigits: 0 });\n\n const made: Element[] = [];\n const part = <T extends HTMLElement>(parent: HTMLElement, selector: string, create: () => T): T => {\n const found = parent.querySelector<T>(selector);\n if (found) return found;\n const element = create();\n made.push(element);\n return element;\n };\n const track = part(root, '[data-mk-color-track]', () => {\n const element = document.createElement('div');\n element.dataset.mkColorTrack = '';\n root.append(element);\n return element;\n });\n const input = part(track, 'input[data-mk-color-input]', () => {\n const element = document.createElement('input');\n element.type = 'range';\n element.dataset.mkColorInput = '';\n track.append(element);\n return element;\n });\n const thumb = part(track, '[data-mk-color-thumb]', () => {\n const element = document.createElement('span');\n element.dataset.mkColorThumb = '';\n element.setAttribute('aria-hidden', 'true');\n track.append(element);\n return element;\n });\n const loupe = part(thumb, '[data-mk-color-loupe]', () => {\n const element = document.createElement('span');\n element.dataset.mkColorLoupe = '';\n thumb.append(element);\n return element;\n });\n const output = options.showValue\n ? part(root, 'output[data-mk-color-output]', () => {\n const element = document.createElement('output');\n element.dataset.mkColorOutput = '';\n track.after(element);\n return element;\n })\n : null;\n const hidden = options.name\n ? (() => {\n const element = document.createElement('input');\n element.type = 'hidden';\n element.name = options.name!;\n root.append(element);\n made.push(element);\n return element;\n })()\n : null;\n scope.add(() => made.forEach((node) => node.remove()));\n // Authored parts keep their own text and value.\n const outputText = output?.textContent ?? '';\n const inputValue = input.value;\n scope.add(() => {\n if (output?.isConnected) output.textContent = outputText;\n if (input.isConnected) input.value = inputValue;\n });\n\n scope.attr(input, 'min', String(min));\n scope.attr(input, 'max', String(max));\n scope.attr(input, 'step', String(step));\n scope.attr(input, 'aria-label', options.label ?? CHANNEL_LABELS[channel]);\n scope.attr(input, 'aria-orientation', vertical ? 'vertical' : 'horizontal');\n scope.attr(input, 'aria-valuetext', null);\n if (options.disabled) scope.attr(input, 'disabled', '');\n scope.attr(root, 'data-mk-channel', channel);\n scope.attr(root, 'data-mk-orientation', vertical ? 'vertical' : 'horizontal');\n scope.attr(root, 'data-mk-grabbing', null);\n scope.attr(root, 'data-mk-ready', '');\n\n const shown = { pos: 0 };\n let glide: gsap.core.Tween | null = null;\n scope.add(() => {\n glide?.kill();\n gsap.killTweensOf([thumb, loupe]);\n });\n const place = () => root.style.setProperty('--mk-color-pos', String(Number(shown.pos.toFixed(4))));\n const paint = (mode: 'set' | 'drag' | 'glide') => {\n const value = getChannel(color, channel);\n const ratio = max > min ? (value - min) / (max - min) : 0;\n const text = channelText(channel, value, format);\n root.style.setProperty('--mk-color-track', channelGradient(color, channel, vertical ? 'to top' : 'to right'));\n root.style.setProperty('--mk-color-thumb', formatColor(color, 'rgb'));\n if (document.activeElement !== input || mode !== 'drag') input.value = String(Number(value.toFixed(2)));\n input.setAttribute('aria-valuetext', text);\n if (output) {\n if (mode === 'glide' && !reduced()) keep(rollDigits(output, text, ratio >= shown.pos ? 1 : -1, 0.28));\n else output.textContent = text;\n }\n if (hidden) hidden.value = toHex(color);\n glide?.kill();\n if (mode === 'set' || reduced()) {\n shown.pos = ratio;\n place();\n return;\n }\n glide = gsap.to(shown, { pos: ratio, duration: mode === 'drag' ? 0.1 : 0.35, ease: mode === 'drag' ? 'power3.out' : EASE.swatch, onUpdate: place });\n };\n\n const emit = (type: 'input' | 'change') => {\n const value = toHex(color);\n (type === 'input' ? options.onInput : options.onChange)?.(value, { ...color });\n root.dispatchEvent(new CustomEvent(`mk:${type}`, { bubbles: true, detail: { value, color: { ...color } } }));\n };\n\n let dragging = false;\n const grab = (on: boolean) => {\n if (dragging === on) return;\n dragging = on;\n root.toggleAttribute('data-mk-grabbing', on);\n if (reduced()) return;\n keep(gsap.to(thumb, { scale: on ? 1.2 : 1, duration: 0.25, ease: EASE.click }));\n if (on) keep(gsap.fromTo(loupe, { scale: 0.6, opacity: 0, filter: 'blur(6px)' }, { scale: 1, opacity: 1, filter: 'blur(0px)', duration: 0.3, ease: EASE.pop }));\n else keep(gsap.to(loupe, { scale: 0.8, opacity: 0, filter: 'blur(6px)', duration: 0.2, ease: 'power2.in' }));\n };\n\n scope.on(input, 'input', () => {\n color = setChannel(color, channel, Number(input.value));\n paint(dragging ? 'drag' : 'glide');\n emit('input');\n });\n scope.on(input, 'change', () => emit('change'));\n scope.on(input, 'pointerdown', () => {\n if (!input.disabled) grab(true);\n });\n scope.on(window, 'pointerup', () => grab(false));\n scope.on(window, 'pointercancel', () => grab(false));\n scope.on(input, 'blur', () => grab(false));\n scope.add(() => {\n gsap.set([thumb, loupe], { clearProps: 'scale,opacity,filter,transform' });\n });\n\n paint('set');\n\n return {\n setColor(next, notify = true) {\n if (scope.disposed) return;\n const target = toHsva(next, color);\n if (sameColor(target, color) && target.h === color.h) return;\n color = target;\n paint('glide');\n if (notify) {\n emit('input');\n emit('change');\n }\n },\n get value() {\n return toHex(color);\n },\n get color() {\n return { ...color };\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { numberFormat } from '../../core/dates';\nimport { CHANNEL_LABELS, areaBackground, channelText, formatColor, sameColor, toHex, toHsva, type Hsva } from '../../core/color';\n\n/*\n * Color area: the saturation (x) × brightness (y) square at the current hue.\n * Pressing jumps the thumb there (swing glide, .35 s), then it follows the\n * pointer tightly (.1 s); release commits. Two visually hidden range inputs\n * (Saturación, Brillo) carry the value for assistive tech and the keyboard:\n * ←/→ saturation, ↑/↓ brightness, Shift ×10, PageUp/PageDown brightness ±10,\n * Home/End saturation min/max. Grabbing grows the thumb (click curve) and pops\n * a loupe with the colour, like color-slider; near the top edge the loupe flips\n * below the thumb ([data-mk-loupe-below]), so a panel that clips its content\n * (the color-picker popover) never cuts it. Vars: --mk-color-area,\n * --mk-color-thumb, --mk-color-x, --mk-color-y.\n */\n\nexport interface ColorAreaOptions {\n value?: string | Hsva;\n /** Accessible name of the group (default 'Color'). */\n label?: string;\n /** Default 1. */\n step?: number;\n name?: string;\n disabled?: boolean;\n onInput?: (value: string, color: Hsva) => void;\n onChange?: (value: string, color: Hsva) => void;\n}\n\nexport interface ColorAreaInstance extends Instance {\n setColor(color: string | Hsva, notify?: boolean): void;\n readonly value: string;\n readonly color: Hsva;\n}\n\n/** Room the loupe needs above the thumb's centre (thumb half, gap, loupe), in px. */\nconst LOUPE_ROOM = 70;\n\nconst KEYS: Record<string, ['s' | 'v', number]> = {\n ArrowLeft: ['s', -1],\n ArrowRight: ['s', 1],\n ArrowUp: ['v', 1],\n ArrowDown: ['v', -1],\n PageUp: ['v', 10],\n PageDown: ['v', -10],\n Home: ['s', -Infinity],\n End: ['s', Infinity],\n};\n\nexport function createColorArea(root: HTMLElement | null, options: ColorAreaOptions = {}): ColorAreaInstance {\n if (!root) return inert({ setColor() {}, value: '', color: { h: 0, s: 0, v: 0, a: 1 } });\n registerMotion();\n const scope = createScope();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n scope.attr(root, 'style', root.getAttribute('style'));\n\n const step = options.step && options.step > 0 ? options.step : 1;\n let color = toHsva(options.value ?? 'hsl(0 100% 50%)');\n const format = numberFormat(root, { maximumFractionDigits: 0 });\n\n const made: Element[] = [];\n const surface = document.createElement('div');\n surface.dataset.mkColorAreaSurface = '';\n surface.setAttribute('role', 'group');\n surface.setAttribute('aria-label', options.label ?? 'Color');\n const thumb = document.createElement('span');\n thumb.dataset.mkColorThumb = '';\n thumb.setAttribute('aria-hidden', 'true');\n const loupe = document.createElement('span');\n loupe.dataset.mkColorLoupe = '';\n thumb.append(loupe);\n surface.append(thumb);\n const range = (axis: 'x' | 'y', label: string) => {\n const input = document.createElement('input');\n input.type = 'range';\n input.className = 'mk-sr-only';\n input.dataset.mkColorInput = axis;\n input.min = '0';\n input.max = '100';\n input.step = String(step);\n input.disabled = Boolean(options.disabled);\n input.setAttribute('aria-label', label);\n input.setAttribute('aria-roledescription', 'selector de color 2D');\n surface.append(input);\n return input;\n };\n const inputs = { x: range('x', CHANNEL_LABELS.saturation), y: range('y', CHANNEL_LABELS.brightness) };\n root.append(surface);\n made.push(surface);\n let hidden: HTMLInputElement | null = null;\n if (options.name) {\n hidden = document.createElement('input');\n hidden.type = 'hidden';\n hidden.name = options.name;\n root.append(hidden);\n made.push(hidden);\n }\n scope.add(() => made.forEach((node) => node.remove()));\n scope.attr(root, 'data-mk-grabbing', null);\n scope.attr(root, 'data-mk-loupe-below', null);\n scope.attr(root, 'data-mk-ready', '');\n\n const snap = (n: number) => Math.min(100, Math.max(0, Math.round(n / step) * step));\n const shown = { x: 0, y: 0 };\n let glide: gsap.core.Tween | null = null;\n scope.add(() => {\n glide?.kill();\n gsap.killTweensOf([thumb, loupe]);\n });\n const place = () => {\n root.style.setProperty('--mk-color-x', String(Number(shown.x.toFixed(4))));\n root.style.setProperty('--mk-color-y', String(Number(shown.y.toFixed(4))));\n };\n const paint = (mode: 'set' | 'drag' | 'glide') => {\n const text = `${CHANNEL_LABELS.saturation} ${channelText('saturation', color.s, format)}, ${CHANNEL_LABELS.brightness.toLowerCase()} ${channelText('brightness', color.v, format)}`;\n root.style.setProperty('--mk-color-area', areaBackground(color.h));\n root.style.setProperty('--mk-color-thumb', formatColor(color, 'rgb'));\n inputs.x.value = String(color.s);\n inputs.y.value = String(color.v);\n for (const input of [inputs.x, inputs.y]) input.setAttribute('aria-valuetext', text);\n if (hidden) hidden.value = toHex(color);\n const target = { x: color.s / 100, y: 1 - color.v / 100 };\n const height = surface.getBoundingClientRect().height;\n root.toggleAttribute('data-mk-loupe-below', height > 0 && target.y * height < LOUPE_ROOM);\n glide?.kill();\n if (mode === 'set' || reduced()) {\n Object.assign(shown, target);\n place();\n return;\n }\n glide = gsap.to(shown, { ...target, duration: mode === 'drag' ? 0.1 : 0.35, ease: mode === 'drag' ? 'power3.out' : EASE.swatch, onUpdate: place });\n };\n\n const emit = (type: 'input' | 'change') => {\n const value = toHex(color);\n (type === 'input' ? options.onInput : options.onChange)?.(value, { ...color });\n root.dispatchEvent(new CustomEvent(`mk:${type}`, { bubbles: true, detail: { value, color: { ...color } } }));\n };\n\n let grabbed = false;\n const grab = (on: boolean) => {\n if (grabbed === on) return;\n grabbed = on;\n root.toggleAttribute('data-mk-grabbing', on);\n if (reduced()) return;\n keep(gsap.to(thumb, { scale: on ? 1.25 : 1, duration: 0.25, ease: EASE.click }));\n if (on) keep(gsap.fromTo(loupe, { scale: 0.6, opacity: 0, filter: 'blur(6px)' }, { scale: 1, opacity: 1, filter: 'blur(0px)', duration: 0.3, ease: EASE.pop }));\n else keep(gsap.to(loupe, { scale: 0.8, opacity: 0, filter: 'blur(6px)', duration: 0.2, ease: 'power2.in' }));\n };\n\n const fromPoint = (event: PointerEvent) => {\n const rect = surface.getBoundingClientRect();\n if (!rect.width || !rect.height) return;\n const s = ((event.clientX - rect.left) / rect.width) * 100;\n const v = (1 - (event.clientY - rect.top) / rect.height) * 100;\n color = { ...color, s: snap(s), v: snap(v) };\n };\n let dragging = false;\n scope.on(surface, 'pointerdown', (event) => {\n const down = event as PointerEvent;\n if (options.disabled || down.button !== 0 || down.target instanceof HTMLInputElement) return;\n down.preventDefault();\n try {\n surface.setPointerCapture(down.pointerId);\n } catch {\n // jsdom and synthetic events have no active pointer to capture.\n }\n dragging = true;\n grab(true);\n fromPoint(down);\n paint('glide');\n emit('input');\n inputs.x.focus({ preventScroll: true });\n });\n scope.on(surface, 'pointermove', (event) => {\n if (!dragging) return;\n fromPoint(event as PointerEvent);\n paint('drag');\n emit('input');\n });\n const release = () => {\n if (!dragging) return;\n dragging = false;\n grab(false);\n emit('change');\n };\n for (const type of ['pointerup', 'pointercancel', 'lostpointercapture']) scope.on(surface, type, release);\n\n for (const input of [inputs.x, inputs.y]) {\n scope.on(input, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const move = KEYS[key.key];\n if (!move || options.disabled) return;\n key.preventDefault();\n const [axis, amount] = move;\n const delta = Number.isFinite(amount) ? amount * step * (key.shiftKey ? 10 : 1) : amount;\n color = { ...color, [axis]: snap(Math.min(100, Math.max(0, color[axis] + delta))) };\n paint('glide');\n emit('input');\n emit('change');\n });\n // Assistive tech can set a range's value directly.\n scope.on(input, 'input', () => {\n color = { ...color, s: snap(Number(inputs.x.value)), v: snap(Number(inputs.y.value)) };\n paint('glide');\n emit('input');\n });\n scope.on(input, 'change', () => emit('change'));\n }\n\n paint('set');\n\n return {\n setColor(next, notify = true) {\n if (scope.disposed) return;\n const target = toHsva(next, color);\n if (sameColor(target, color) && target.h === color.h) return;\n color = target;\n paint('glide');\n if (notify) {\n emit('input');\n emit('change');\n }\n },\n get value() {\n return toHex(color);\n },\n get color() {\n return { ...color };\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { formatColor, parseColor, sameColor, toHex, toHsva, type ColorFormat, type Hsva } from '../../core/color';\nimport { shake } from '../../motion/micro';\n\n/*\n * Color field: a text input that takes any colour parseColor reads (hex, rgb(),\n * hsl()) beside a swatch. While typing, a readable colour paints the swatch\n * (CSS transition .25 s). Enter or blur commits: a valid colour is rewritten in\n * `format` and the swatch pops (pop curve); an invalid or empty text shakes the\n * field, goes back to the last valid colour and a polite status says\n * \"Color no válido\". Escape puts the last colour back. Without `alpha`, colours\n * are committed opaque. Var: --mk-color-swatch.\n */\n\nexport interface ColorFieldOptions {\n value?: string | Hsva;\n format?: ColorFormat;\n /** Keep transparency (default false: committed colours are opaque). */\n alpha?: boolean;\n /** aria-label when the input has no label of its own (default 'Color'). */\n label?: string;\n name?: string;\n disabled?: boolean;\n readOnly?: boolean;\n onChange?: (value: string, color: Hsva) => void;\n}\n\nexport interface ColorFieldInstance extends Instance {\n setColor(color: string | Hsva, notify?: boolean): void;\n readonly value: string;\n readonly color: Hsva;\n}\n\nexport function createColorField(root: HTMLElement | null, options: ColorFieldOptions = {}): ColorFieldInstance {\n if (!root) return inert({ setColor() {}, value: '', color: { h: 0, s: 0, v: 0, a: 1 } });\n registerMotion();\n const scope = createScope();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n scope.attr(root, 'style', root.getAttribute('style'));\n\n const format: ColorFormat = options.format === 'rgb' || options.format === 'hsl' ? options.format : 'hex';\n const alpha = Boolean(options.alpha);\n\n let input = root.querySelector('input');\n if (!input) {\n input = document.createElement('input');\n input.type = 'text';\n root.append(input);\n const created = input;\n scope.add(() => created.remove());\n }\n const field = input;\n const original = field.value;\n scope.add(() => {\n field.value = original;\n });\n scope.attr(field, 'data-mk-color-text', '');\n scope.attr(field, 'autocomplete', 'off');\n scope.attr(field, 'spellcheck', 'false');\n scope.attr(field, 'autocapitalize', 'off');\n if (options.name) scope.attr(field, 'name', options.name);\n if (options.disabled) scope.attr(field, 'disabled', '');\n if (options.readOnly) scope.attr(field, 'readonly', '');\n const labelled = field.closest('label') || field.labels?.length || field.hasAttribute('aria-label') || field.hasAttribute('aria-labelledby');\n if (!labelled) scope.attr(field, 'aria-label', options.label ?? 'Color');\n\n const swatch = document.createElement('span');\n swatch.dataset.mkColorSwatch = '';\n swatch.setAttribute('aria-hidden', 'true');\n field.before(swatch);\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.dataset.mkColorStatus = '';\n status.setAttribute('role', 'status');\n root.append(status);\n scope.add(() => {\n swatch.remove();\n status.remove();\n gsap.killTweensOf(swatch);\n });\n scope.attr(root, 'data-mk-unparsed', null);\n scope.attr(root, 'data-mk-ready', '');\n\n const opaque = (color: Hsva) => (alpha ? color : { ...color, a: 1 });\n let color = opaque(toHsva(options.value ?? (field.value || undefined), { h: 0, s: 0, v: 0, a: 1 }));\n const text = () => formatColor(color, format);\n const paintSwatch = (shown: Hsva) => root.style.setProperty('--mk-color-swatch', formatColor(shown, 'rgb'));\n const pop = () => {\n if (!reduced()) keep(gsap.fromTo(swatch, { scale: 1.18 }, { scale: 1, duration: 0.3, ease: EASE.pop, clearProps: 'scale,transform' }));\n };\n const emit = () => {\n const value = toHex(color);\n options.onChange?.(value, { ...color });\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value, color: { ...color } } }));\n };\n\n field.value = text();\n paintSwatch(color);\n\n scope.on(field, 'input', () => {\n const parsed = parseColor(field.value, color.h);\n if (parsed) paintSwatch(opaque(parsed));\n root.toggleAttribute('data-mk-unparsed', !parsed && field.value.trim() !== '');\n });\n\n const commit = () => {\n const parsed = parseColor(field.value, color.h);\n root.removeAttribute('data-mk-unparsed');\n if (!parsed) {\n keep(shake(root));\n field.value = text();\n paintSwatch(color);\n status.textContent = 'Color no válido';\n return;\n }\n const next = opaque(parsed);\n const changed = !sameColor(next, color);\n color = next;\n field.value = text();\n paintSwatch(color);\n status.textContent = '';\n if (!changed) return;\n pop();\n emit();\n };\n scope.on(field, 'blur', commit);\n scope.on(field, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n if (key === 'Enter') {\n event.preventDefault();\n commit();\n } else if (key === 'Escape' && field.value !== text()) {\n event.preventDefault();\n field.value = text();\n paintSwatch(color);\n root.removeAttribute('data-mk-unparsed');\n }\n });\n\n return {\n setColor(next, notify = true) {\n if (scope.disposed) return;\n const target = opaque(toHsva(next, color));\n const changed = !sameColor(target, color);\n color = target;\n field.value = text();\n paintSwatch(color);\n root.removeAttribute('data-mk-unparsed');\n if (!changed) return;\n pop();\n if (notify) emit();\n },\n get value() {\n return toHex(color);\n },\n get color() {\n return { ...color };\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { formatColor, sameColor, toHex, toHsva, type ColorFormat, type Hsva } from '../../core/color';\nimport { press, ringPulse, rollDigits } from '../../motion/micro';\nimport { flowInMenu } from '../../motion/entrances';\nimport { createDialog } from '../dialog/engine';\nimport { createColorArea } from '../color-area/engine';\nimport { createColorSlider } from '../color-slider/engine';\nimport { createColorField } from '../color-field/engine';\n\n/*\n * Color picker: a swatch button that grows into a panel (an anchored dialog,\n * motion/morph.ts container transform; like a menu's options, its sections\n * flow in while the surface grows) holding a color-area, a hue slider, an\n * alpha slider (alpha: true), a color-field, preset swatches and an eyedropper\n * where the browser has one. `inline` puts the panel in place, without button.\n * One source of truth: whichever control changes, the others glide to the new\n * colour (setColor(…, false)); the trigger swatch follows live and its hex\n * label rolls on commit. Presets press, pop and mark themselves (aria-pressed).\n * The children's mk:input / mk:change stop at the panel: listeners on the\n * picker hear only the picker's own.\n */\n\nexport const DEFAULT_SWATCHES = ['#111111', '#6b7280', '#ef4444', '#f59e0b', '#22c55e', '#14b8a6', '#3b82f6', '#a855f7'];\n\nexport interface ColorPickerOptions {\n value?: string | Hsva;\n alpha?: boolean;\n format?: ColorFormat;\n swatches?: string[];\n /** Accessible name; the trigger reads \"<label>: <hex>\". */\n label?: string;\n name?: string;\n disabled?: boolean;\n /** The panel in place, without a button or popover. */\n inline?: boolean;\n /** Eyedropper button where the browser has the EyeDropper API (default true). */\n eyedropper?: boolean;\n onInput?: (value: string, color: Hsva) => void;\n onChange?: (value: string, color: Hsva) => void;\n}\n\nexport interface ColorPickerInstance extends Instance {\n open(): void;\n close(): void;\n setColor(color: string | Hsva, notify?: boolean): void;\n readonly value: string;\n readonly color: Hsva;\n readonly isOpen: boolean;\n}\n\nconst PIPETTE =\n '<svg aria-hidden=\"true\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14.5 4.5l5 5\"/><path d=\"M17 2.5a2.1 2.1 0 0 1 3 3l-3 3-3-3z\"/><path d=\"M14 6.5l-9.3 9.3a2 2 0 0 0-.5.9L3.5 20.5l3.8-.7a2 2 0 0 0 .9-.5L17.5 10\"/></svg>';\n\ninterface EyeDropperLike {\n open(): Promise<{ sRGBHex: string }>;\n}\n\nconst div = (attribute: string, className?: string) => {\n const element = document.createElement('div');\n element.setAttribute(attribute, '');\n if (className) element.className = className;\n return element;\n};\n\nexport function createColorPicker(root: HTMLElement | null, options: ColorPickerOptions = {}): ColorPickerInstance {\n if (!root) return inert({ open() {}, close() {}, setColor() {}, value: '', color: { h: 0, s: 0, v: 0, a: 1 }, isOpen: false });\n registerMotion();\n const scope = createScope();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n const alpha = Boolean(options.alpha);\n const format: ColorFormat = options.format === 'rgb' || options.format === 'hsl' ? options.format : 'hex';\n const label = options.label ?? 'Color';\n const inline = Boolean(options.inline);\n const swatches = options.swatches ?? DEFAULT_SWATCHES;\n const opaque = (color: Hsva) => (alpha ? { ...color } : { ...color, a: 1 });\n let current = opaque(toHsva(options.value ?? '#ff8800'));\n\n const made: Element[] = [];\n let trigger: HTMLButtonElement | null = null;\n let triggerSwatch: HTMLElement | null = null;\n let triggerLabel: HTMLElement | null = null;\n let dialogElement: HTMLDialogElement | null = null;\n if (!inline) {\n trigger = document.createElement('button');\n trigger.type = 'button';\n trigger.dataset.mkColorTrigger = '';\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.disabled = Boolean(options.disabled);\n triggerSwatch = document.createElement('span');\n triggerSwatch.dataset.mkColorSwatch = '';\n triggerSwatch.setAttribute('aria-hidden', 'true');\n triggerLabel = document.createElement('span');\n triggerLabel.dataset.mkColorTriggerLabel = '';\n triggerLabel.setAttribute('aria-hidden', 'true');\n trigger.append(triggerSwatch, triggerLabel);\n dialogElement = document.createElement('dialog');\n // A class, not only an attribute: the copy that folds back into the swatch on close keeps classes only.\n dialogElement.className = 'mk-dialog mk-color-panel';\n dialogElement.dataset.mkColorPanel = '';\n dialogElement.setAttribute('aria-label', label);\n root.append(trigger, dialogElement);\n made.push(trigger, dialogElement);\n }\n\n const body = div('data-mk-color-panel-body');\n const areaHost = div('data-mk-color-area-host', 'mk-color-area');\n const hueHost = div('data-mk-color-hue', 'mk-color-slider');\n const alphaHost = alpha ? div('data-mk-color-alpha', 'mk-color-slider') : null;\n const row = div('data-mk-color-row');\n const fieldHost = div('data-mk-color-field-host', 'mk-color-field');\n row.append(fieldHost);\n let eyedropper: HTMLButtonElement | null = null;\n const EyeDropper = typeof window !== 'undefined' ? (window as unknown as { EyeDropper?: new () => EyeDropperLike }).EyeDropper : undefined;\n if (options.eyedropper !== false && typeof EyeDropper === 'function') {\n eyedropper = document.createElement('button');\n eyedropper.type = 'button';\n eyedropper.dataset.mkColorEyedropper = '';\n eyedropper.setAttribute('aria-label', 'Tomar un color de la pantalla');\n eyedropper.innerHTML = PIPETTE;\n eyedropper.disabled = Boolean(options.disabled);\n row.append(eyedropper);\n }\n const presetsHost = div('data-mk-color-swatches');\n presetsHost.setAttribute('role', 'group');\n presetsHost.setAttribute('aria-label', 'Colores guardados');\n const presets = swatches.map((swatch, index) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkColorPreset = '';\n button.dataset.mkIndex = String(index);\n button.setAttribute('aria-label', swatch);\n button.setAttribute('aria-pressed', 'false');\n button.disabled = Boolean(options.disabled);\n button.style.setProperty('--mk-color-swatch', formatColor(toHsva(swatch), 'rgb'));\n presetsHost.append(button);\n return button;\n });\n body.append(areaHost, hueHost, ...(alphaHost ? [alphaHost] : []), row);\n if (presets.length) body.append(presetsHost);\n if (dialogElement) dialogElement.append(body);\n else {\n root.append(body);\n made.push(body);\n }\n let hidden: HTMLInputElement | null = null;\n if (options.name) {\n hidden = document.createElement('input');\n hidden.type = 'hidden';\n hidden.name = options.name;\n root.append(hidden);\n made.push(hidden);\n }\n scope.add(() => made.forEach((node) => node.remove()));\n if (inline) scope.attr(root, 'data-mk-inline', '');\n scope.attr(root, 'data-mk-ready', '');\n // Listeners on the picker hear the picker, not its parts.\n for (const type of ['mk:input', 'mk:change']) scope.on(body, type, (event) => event.stopPropagation());\n\n const emit = (type: 'input' | 'change') => {\n const value = toHex(current);\n (type === 'input' ? options.onInput : options.onChange)?.(value, { ...current });\n root.dispatchEvent(new CustomEvent(`mk:${type}`, { bubbles: true, detail: { value, color: { ...current } } }));\n };\n\n const paintTrigger = (commit: boolean) => {\n if (hidden) hidden.value = toHex(current);\n if (!trigger || !triggerSwatch || !triggerLabel) return;\n const hex = toHex(current);\n triggerSwatch.style.setProperty('--mk-color-swatch', formatColor(current, 'rgb'));\n trigger.setAttribute('aria-label', `${label}: ${hex}`);\n if (commit && !reduced() && triggerLabel.textContent) keep(rollDigits(triggerLabel, hex, 1, 0.28));\n else if (commit || !triggerLabel.textContent) triggerLabel.textContent = hex;\n };\n const markPresets = () => {\n for (const preset of presets) {\n const on = sameColor(opaque(toHsva(preset.getAttribute('aria-label'))), current);\n preset.setAttribute('aria-pressed', String(on));\n preset.toggleAttribute('data-mk-checked', on);\n }\n };\n\n type Child = { setColor(color: Hsva, notify?: boolean): void; destroy(): void };\n const children: Child[] = [];\n const update = (next: Hsva, source: Child | null, commit: boolean, notify = true) => {\n if (scope.disposed) return;\n current = opaque(next);\n for (const child of children) if (child !== source) child.setColor(current, false);\n paintTrigger(commit);\n markPresets();\n if (!notify) return;\n emit('input');\n if (commit) emit('change');\n };\n const area: Child = createColorArea(areaHost, {\n value: current,\n label,\n disabled: options.disabled,\n onInput: (_, color) => update(color, area, false),\n onChange: (_, color) => update(color, area, true),\n });\n const hue: Child = createColorSlider(hueHost, {\n channel: 'hue',\n value: current,\n disabled: options.disabled,\n onInput: (_, color) => update(color, hue, false),\n onChange: (_, color) => update(color, hue, true),\n });\n const opacity: Child | null = alphaHost\n ? createColorSlider(alphaHost, {\n channel: 'alpha',\n value: current,\n disabled: options.disabled,\n onInput: (_, color) => update(color, opacity, false),\n onChange: (_, color) => update(color, opacity, true),\n })\n : null;\n const field: Child = createColorField(fieldHost, {\n value: current,\n format,\n alpha,\n label: 'Código de color',\n disabled: options.disabled,\n onChange: (_, color) => update(color, field, true),\n });\n children.push(area, hue, ...(opacity ? [opacity] : []), field);\n scope.add(() => children.forEach((child) => child.destroy()));\n paintTrigger(true);\n markPresets();\n\n scope.on(presetsHost, 'click', (event) => {\n const preset = (event.target as Element | null)?.closest<HTMLButtonElement>('[data-mk-color-preset]');\n if (!preset || options.disabled) return;\n keep(press(preset));\n update(toHsva(preset.getAttribute('aria-label'), current), null, true);\n if (!reduced()) keep(gsap.fromTo(preset, { scale: 0.85 }, { scale: 1, duration: 0.3, ease: EASE.pop, clearProps: 'scale,transform' }));\n });\n\n if (eyedropper && EyeDropper) {\n scope.on(eyedropper, 'click', () => {\n keep(press(eyedropper));\n new EyeDropper()\n .open()\n .then(({ sRGBHex }) => {\n if (scope.disposed) return;\n update(toHsva(sRGBHex, current), null, true);\n keep(ringPulse(triggerSwatch ?? areaHost));\n })\n // Escape or a refused permission: nothing changes.\n .catch(() => {});\n });\n }\n\n const panel = dialogElement\n ? createDialog(dialogElement, {\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n triggers: false,\n animateContent: false,\n // Like a menu's options: the area, the sliders, the field and the swatches flow in while the surface grows.\n onOpen: () => keep(flowInMenu([...body.children])),\n onClose: () => trigger?.setAttribute('aria-expanded', 'false'),\n })\n : null;\n if (panel) scope.add(() => panel.destroy());\n const open = () => {\n if (!panel || !trigger || options.disabled || panel.isOpen) return;\n panel.open(trigger);\n trigger.setAttribute('aria-expanded', 'true');\n };\n if (trigger && panel) {\n scope.on(trigger, 'click', () => {\n if (panel.isOpen) panel.close();\n else open();\n });\n }\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf(presets);\n });\n\n return {\n open,\n close: () => panel?.close(),\n setColor(next, notify = true) {\n const target = opaque(toHsva(next, current));\n if (sameColor(target, current) && target.h === current.h) return;\n update(target, null, true, notify);\n },\n get value() {\n return toHex(current);\n },\n get color() {\n return { ...current };\n },\n get isOpen() {\n return panel?.isOpen ?? false;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { safeFormat } from './dates';\n\n/*\n * Segmented date and time input, the pure part: which segments a locale shows\n * and in what order, for a date, a time or both (es: dd/mm/aaaa, 24 h and\n * \"dd/mm/aaaa, HH:MM\"; en-US: mm/dd/yyyy and 12 h with\n * AM/PM), each segment's limits, stepping with wrap, typing digit by digit, and\n * time values (\"HH:MM[:SS]\", always 24 h). core/segment-field.ts puts it on screen.\n */\n\nexport type SegmentType = 'day' | 'month' | 'year' | 'hour' | 'minute' | 'second' | 'dayPeriod';\nexport type SegmentValues = Partial<Record<SegmentType, number | null>>;\nexport type SegmentPart = { type: SegmentType } | { literal: string };\n\nexport interface TimeValue {\n hour: number;\n minute: number;\n second: number;\n}\n\n/** 0 = a.m., 1 = p.m. */\nexport type DayPeriod = 0 | 1;\n\n/** Whether the locale writes 12-hour times. */\nexport function defaultHour12(locale: string): boolean {\n const options = safeFormat(locale, { hour: 'numeric' }).resolvedOptions() as Intl.ResolvedDateTimeFormatOptions & { hourCycle?: string };\n if (options.hourCycle) return options.hourCycle === 'h11' || options.hourCycle === 'h12';\n return Boolean(options.hour12);\n}\n\nconst KNOWN = new Set<string>(['day', 'month', 'year', 'hour', 'minute', 'second', 'dayPeriod']);\n\n/** Segments and the text between them, in the locale's order. */\nexport function segmentLayout(kind: 'date' | 'time' | 'datetime', locale: string, { hour12, seconds = false }: { hour12?: boolean; seconds?: boolean } = {}): SegmentPart[] {\n const twelve = hour12 ?? defaultHour12(locale);\n const date: Intl.DateTimeFormatOptions = { day: '2-digit', month: '2-digit', year: 'numeric' };\n const time: Intl.DateTimeFormatOptions = { hour: '2-digit', minute: '2-digit', ...(seconds ? { second: '2-digit' } : {}), hourCycle: twelve ? 'h12' : 'h23' };\n // Date and time together: the locale's own order and joint (\"23/11/2026, 13:05\").\n const format = safeFormat(locale, kind === 'date' ? date : kind === 'time' ? time : { ...date, ...time });\n const parts: SegmentPart[] = [];\n for (const part of format.formatToParts(new Date(2026, 10, 23, 13, 5, 9))) {\n if (KNOWN.has(part.type)) parts.push({ type: part.type as SegmentType });\n else if (part.type === 'literal') {\n // Some engines spell a narrow no-break space before AM/PM; a plain space reads the same.\n const literal = part.value.replace(/[ ]/g, ' ');\n const last = parts[parts.length - 1];\n if (last && 'literal' in last) last.literal += literal;\n else parts.push({ literal });\n }\n }\n // Leading or trailing text (a comma, a space) belongs to no segment.\n while (parts.length && 'literal' in parts[0]!) parts.shift();\n while (parts.length && 'literal' in parts[parts.length - 1]!) parts.pop();\n return parts;\n}\n\n/** The locale's words for a.m. and p.m. */\nexport function dayPeriods(locale: string): [string, string] {\n const format = safeFormat(locale, { hour: 'numeric', hourCycle: 'h12' });\n const read = (hour: number) =>\n format.formatToParts(new Date(2026, 0, 1, hour)).find((part) => part.type === 'dayPeriod')?.value.replace(/[ ]/g, ' ') ?? (hour < 12 ? 'AM' : 'PM');\n return [read(1), read(13)];\n}\n\nexport const daysIn = (year: number, month: number) => {\n const date = new Date(2000, 0, 1);\n date.setFullYear(year, month, 0);\n return date.getDate();\n};\n\n/** [min, max] of a segment. */\nexport function segmentLimits(type: SegmentType, hour12 = false): [number, number] {\n switch (type) {\n case 'day':\n return [1, 31];\n case 'month':\n return [1, 12];\n case 'year':\n return [1, 9999];\n case 'hour':\n return hour12 ? [1, 12] : [0, 23];\n case 'minute':\n case 'second':\n return [0, 59];\n default:\n return [0, 1];\n }\n}\n\n/** A bigger jump for PageUp / PageDown. */\nexport const BIG_STEP: Record<SegmentType, number> = { day: 7, month: 3, year: 5, hour: 3, minute: 15, second: 15, dayPeriod: 1 };\n\n/**\n * `value` moved by `delta` with wrap. Steps above 1 land on multiples of the\n * step (09:32 + 15 → 09:45). An empty segment starts at its minimum (or its\n * maximum when going down).\n */\nexport function stepSegment(value: number | null, delta: number, [min, max]: [number, number], step = 1): number {\n if (value === null) return delta >= 0 ? min : max - ((max - min) % Math.max(1, step));\n const size = max - min + 1;\n let next: number;\n if (step > 1 && Math.abs(delta) === step && (value - min) % step !== 0) {\n next = delta > 0 ? Math.ceil((value - min) / step) * step + min : Math.floor((value - min) / step) * step + min;\n } else next = value + delta;\n return ((((next - min) % size) + size) % size) + min;\n}\n\nexport interface Typed {\n /** Digits kept for the next key ('' when the segment is done). */\n buffer: string;\n /** The value to show, or null while the digits typed so far are below the minimum (a leading 0). */\n value: number | null;\n /** The segment is full: focus moves on. */\n done: boolean;\n}\n\n/** One digit typed into a segment that already holds `buffer`. */\nexport function typeDigit(buffer: string, digit: string, [min, max]: [number, number]): Typed {\n const width = String(max).length;\n let text = buffer + digit;\n if (Number(text) > max || text.length > width) text = digit;\n const value = Number(text);\n const done = text.length >= width || value * 10 > max;\n return { buffer: done ? '' : text, value: value < min ? null : value, done };\n}\n\nexport function formatSegment(type: SegmentType, value: number, periods: [string, string] = ['AM', 'PM']): string {\n if (type === 'dayPeriod') return periods[value ? 1 : 0];\n return String(value).padStart(type === 'year' ? 4 : 2, '0');\n}\n\n/** \"09:30\", \"9:30:15\" → the time; null when it is not one. */\nexport function parseTime(text: string | null | undefined): TimeValue | null {\n const match = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/.exec((text ?? '').trim());\n if (!match) return null;\n const [hour, minute, second] = [Number(match[1]), Number(match[2]), Number(match[3] ?? 0)];\n if (hour > 23 || minute > 59 || second > 59) return null;\n return { hour, minute, second };\n}\n\nconst two = (n: number) => String(n).padStart(2, '0');\n\n/** \"HH:MM\", or \"HH:MM:SS\" with `seconds`. */\nexport const formatTime = (time: TimeValue, seconds = false) => `${two(time.hour)}:${two(time.minute)}${seconds ? `:${two(time.second)}` : ''}`;\n\n/** Minutes since midnight (seconds as a fraction), to compare times. */\nexport const timeMinutes = (time: TimeValue) => time.hour * 60 + time.minute + time.second / 60;\n\n/** 24 h → 12 h with its period (0 → 12 a.m., 13 → 1 p.m.). */\nexport const to12 = (hour: number): { hour: number; period: DayPeriod } => ({ hour: hour % 12 || 12, period: hour >= 12 ? 1 : 0 });\n\n/** 12 h and its period → 24 h. */\nexport const to24 = (hour: number, period: number) => (hour % 12) + (period ? 12 : 0);\n","import { gsap, EASE, registerMotion } from './gsap';\nimport { reduced } from './reduced';\nimport { createScope } from './scope';\nimport { rollDigits, shake } from '../motion/micro';\nimport {\n BIG_STEP, dayPeriods, defaultHour12, formatSegment, segmentLayout, segmentLimits, stepSegment, typeDigit,\n type SegmentType, type SegmentValues,\n} from './segments';\n\nexport type { SegmentValues } from './segments';\n\n/*\n * Segmented field controller (time-field, date-range-picker): one\n * role=\"spinbutton\" per segment in the locale's order, inside a group it\n * appends to `root`. Segments are contenteditable with inputmode=\"numeric\" so\n * phones open the number pad, but every edit is intercepted (keydown on\n * desktop, beforeinput on phones) and the controller writes the text. Arrows\n * step with wrap and the digits roll in the direction of the change; typing\n * fills a segment and moves to the next; Backspace erases, then moves back; a\n * pill glides behind the focused segment (swing curve).\n */\n\nexport interface SegmentFieldOptions {\n kind: 'date' | 'time' | 'datetime';\n locale: string;\n /** Time and datetime; default: the locale's. */\n hour12?: boolean;\n seconds?: boolean;\n /** Arrow step per segment (default 1). */\n steps?: Partial<Record<SegmentType, number>>;\n /** Accessible names of the segments. */\n labels?: Partial<Record<SegmentType, string>>;\n disabled?: boolean;\n readOnly?: boolean;\n /** Any value changed (by the person or by setValues with notify). */\n onChange?: (values: SegmentValues) => void;\n}\n\nexport interface SegmentField {\n /** The group: [data-mk-segments] role=\"group\". */\n readonly element: HTMLElement;\n values(): SegmentValues;\n /** Keys the field does not have are ignored; null empties a segment. No onChange. */\n setValues(values: SegmentValues, animate?: boolean): void;\n /** aria-invalid on the group; `shakeIt` shakes it once. */\n invalid(on: boolean, shakeIt?: boolean): void;\n focus(which?: 'first' | 'last'): void;\n destroy(): void;\n}\n\nconst LABELS: Record<SegmentType, string> = {\n day: 'día',\n month: 'mes',\n year: 'año',\n hour: 'hora',\n minute: 'minutos',\n second: 'segundos',\n dayPeriod: 'a. m./p. m.',\n};\n\nconst placeholder = (type: SegmentType, language: string) => {\n if (type === 'year') return language === 'es' ? 'aaaa' : 'yyyy';\n if (type === 'day') return 'dd';\n if (type === 'month') return 'mm';\n return '––';\n};\n\ninterface Segment {\n type: SegmentType;\n element: HTMLElement;\n limits: [number, number];\n step: number;\n value: number | null;\n}\n\nexport function createSegmentField(root: HTMLElement, options: SegmentFieldOptions): SegmentField {\n registerMotion();\n const scope = createScope();\n const language = options.locale.split('-')[0]!.toLowerCase();\n const hour12 = options.kind === 'date' ? false : (options.hour12 ?? defaultHour12(options.locale));\n const periods = dayPeriods(options.locale);\n const layout = segmentLayout(options.kind, options.locale, { hour12, seconds: options.seconds });\n const editable = !options.disabled && !options.readOnly;\n\n const group = document.createElement('div');\n group.dataset.mkSegments = '';\n group.setAttribute('role', 'group');\n if (options.disabled) group.setAttribute('aria-disabled', 'true');\n const pill = document.createElement('span');\n pill.dataset.mkSegmentFocus = '';\n pill.setAttribute('aria-hidden', 'true');\n group.append(pill);\n\n const segments: Segment[] = [];\n for (const part of layout) {\n if ('literal' in part) {\n const literal = document.createElement('span');\n literal.dataset.mkSegmentLiteral = '';\n literal.setAttribute('aria-hidden', 'true');\n literal.textContent = part.literal;\n group.append(literal);\n continue;\n }\n const { type } = part;\n const element = document.createElement('span');\n element.dataset.mkSegment = type;\n element.setAttribute('role', 'spinbutton');\n element.setAttribute('aria-label', options.labels?.[type] ?? LABELS[type]);\n element.setAttribute('tabindex', options.disabled ? '-1' : '0');\n element.setAttribute('spellcheck', 'false');\n element.setAttribute('autocorrect', 'off');\n element.setAttribute('autocapitalize', 'off');\n element.setAttribute('enterkeyhint', 'next');\n element.setAttribute('inputmode', type === 'dayPeriod' ? 'text' : 'numeric');\n if (editable) element.setAttribute('contenteditable', 'true');\n if (options.disabled) element.setAttribute('aria-disabled', 'true');\n if (options.readOnly) element.setAttribute('aria-readonly', 'true');\n const limits = segmentLimits(type, hour12);\n element.setAttribute('aria-valuemin', String(limits[0]));\n element.setAttribute('aria-valuemax', String(limits[1]));\n group.append(element);\n const step = Math.max(1, Math.round(options.steps?.[type] ?? 1));\n segments.push({ type, element, limits, step, value: null });\n }\n root.append(group);\n scope.add(() => group.remove());\n\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([pill, group]);\n });\n\n /** Typing in progress: the segment and the digits typed so far. */\n let typing: { segment: Segment; buffer: string } | null = null;\n const partialYear = (segment: Segment) => segment.type === 'year' && typing?.segment === segment && typing.buffer !== '';\n\n const text = (segment: Segment) => {\n if (partialYear(segment)) return typing!.buffer;\n return segment.value === null ? placeholder(segment.type, language) : formatSegment(segment.type, segment.value, periods);\n };\n const paint = (segment: Segment, direction: 1 | -1 | 0 = 0) => {\n const shown = text(segment);\n const { element } = segment;\n if (direction && !reduced() && segment.value !== null && element.textContent) keep(rollDigits(element, shown, direction, 0.28));\n else element.textContent = shown;\n element.toggleAttribute('data-mk-empty', segment.value === null && !partialYear(segment));\n if (segment.value === null) {\n element.removeAttribute('aria-valuenow');\n element.setAttribute('aria-valuetext', 'Vacío');\n } else {\n element.setAttribute('aria-valuenow', String(segment.value));\n element.setAttribute('aria-valuetext', shown);\n }\n };\n segments.forEach((segment) => paint(segment));\n\n const values = (): SegmentValues => {\n const out: SegmentValues = {};\n for (const segment of segments) out[segment.type] = partialYear(segment) ? null : segment.value;\n return out;\n };\n let last = JSON.stringify(values());\n const notify = () => {\n const now = JSON.stringify(values());\n if (now === last) return;\n last = now;\n options.onChange?.(values());\n };\n\n const set = (segment: Segment, value: number | null, direction: 1 | -1 | 0 = 0) => {\n segment.value = value;\n paint(segment, direction);\n };\n\n const indexOf = (element: Element | null) => segments.findIndex((segment) => segment.element === element);\n const focusAt = (index: number) => segments[index]?.element.focus();\n\n /** Leaving a segment ends its typing; a partial year is taken as typed. */\n const endTyping = () => {\n if (!typing) return;\n const { segment, buffer } = typing;\n typing = null;\n if (segment.type === 'year' && buffer) {\n const year = Number(buffer);\n set(segment, year >= segment.limits[0] ? year : segment.value);\n } else paint(segment);\n notify();\n };\n\n // The focus pill glides behind the focused segment.\n let pillShown = false;\n const movePill = (segment: Segment) => {\n const box = { x: segment.element.offsetLeft, width: segment.element.offsetWidth };\n if (!pillShown || reduced()) {\n gsap.set(pill, box);\n if (!reduced()) keep(gsap.to(pill, { opacity: 1, duration: 0.15, ease: 'power2.out' }));\n } else keep(gsap.to(pill, { ...box, opacity: 1, duration: 0.35, ease: EASE.swatch, overwrite: 'auto' }));\n pillShown = true;\n };\n\n const typeInto = (segment: Segment, digit: string) => {\n const index = segments.indexOf(segment);\n const buffer = typing?.segment === segment ? typing.buffer : '';\n const result = typeDigit(buffer, digit, segment.limits);\n typing = result.buffer ? { segment, buffer: result.buffer } : null;\n if (result.value !== null) set(segment, result.value);\n else if (segment.type === 'year') paint(segment);\n else if (typing) segment.element.textContent = result.buffer.padStart(2, '0');\n notify();\n if (result.done && index < segments.length - 1) focusAt(index + 1);\n };\n\n const erase = (segment: Segment) => {\n const index = segments.indexOf(segment);\n if (segment.value === null && !partialYear(segment)) {\n if (index > 0) focusAt(index - 1);\n return;\n }\n typing = null;\n set(segment, null);\n notify();\n };\n\n const stepBy = (segment: Segment, delta: number, step: number) => {\n typing = null;\n const before = segment.value;\n const next = stepSegment(before, delta, segment.limits, step);\n if (next === before) return;\n const wrapped = before !== null && (delta > 0 ? next < before : next > before);\n const direction = (delta > 0) !== wrapped ? 1 : -1;\n set(segment, next, before === null ? 0 : direction);\n notify();\n };\n\n scope.on(group, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const index = indexOf(key.target as Element);\n const segment = segments[index];\n if (!segment) return;\n if (key.metaKey || key.ctrlKey || key.altKey) return;\n if (key.key === 'Tab') return;\n if (key.key === 'ArrowLeft' || key.key === 'ArrowRight') {\n key.preventDefault();\n focusAt(index + (key.key === 'ArrowLeft' ? -1 : 1));\n return;\n }\n if (key.key === 'Enter') return;\n // Everything else is ours: contenteditable must not write by itself.\n if (key.key.length === 1 || ['Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End'].includes(key.key)) key.preventDefault();\n if (!editable) return;\n const { type, step } = segment;\n switch (key.key) {\n case 'ArrowUp':\n return stepBy(segment, step, step);\n case 'ArrowDown':\n return stepBy(segment, -step, step);\n case 'PageUp':\n return stepBy(segment, Math.max(step, BIG_STEP[type]), step);\n case 'PageDown':\n return stepBy(segment, -Math.max(step, BIG_STEP[type]), step);\n case 'Home':\n case 'End': {\n typing = null;\n const target = key.key === 'Home' ? segment.limits[0] : segment.limits[1];\n if (target !== segment.value) {\n set(segment, target, segment.value === null ? 0 : target > segment.value ? 1 : -1);\n notify();\n }\n return;\n }\n case 'Backspace':\n case 'Delete':\n return erase(segment);\n }\n if (type === 'dayPeriod') {\n const letter = key.key.toLowerCase();\n const match = periods.findIndex((period) => period.toLowerCase().replace(/[^\\p{L}]/gu, '').startsWith(letter));\n if (match >= 0 && /\\p{L}/u.test(letter)) {\n if (segment.value !== match) {\n set(segment, match, match ? 1 : -1);\n notify();\n }\n if (index < segments.length - 1) focusAt(index + 1);\n }\n return;\n }\n if (/^\\d$/.test(key.key)) typeInto(segment, key.key);\n });\n\n // Phones send beforeinput instead of key codes: read what they meant, write nothing.\n scope.on(group, 'beforeinput', (event) => {\n const input = event as InputEvent;\n const segment = segments[indexOf(input.target as Element)];\n if (!segment) return;\n input.preventDefault();\n if (!editable) return;\n if (input.inputType.startsWith('delete')) return erase(segment);\n for (const character of input.data ?? '') {\n const current = segments[indexOf(document.activeElement)] ?? segment;\n if (/\\d/.test(character) && current.type !== 'dayPeriod') typeInto(current, character);\n else if (current.type === 'dayPeriod') {\n const match = periods.findIndex((period) => period.toLowerCase().startsWith(character.toLowerCase()));\n if (match >= 0) {\n set(current, match);\n notify();\n }\n }\n }\n });\n // Paste, drop and IME composition must not leave stray text either.\n scope.on(group, 'paste', (event) => event.preventDefault());\n scope.on(group, 'drop', (event) => event.preventDefault());\n\n scope.on(group, 'focusin', (event) => {\n const segment = segments[indexOf(event.target as Element)];\n if (!segment) return;\n if (typing && typing.segment !== segment) endTyping();\n typing = null;\n movePill(segment);\n // The caret is hidden; select the text so the whole segment reads as active.\n const selection = typeof getSelection === 'function' ? getSelection() : null;\n try {\n selection?.selectAllChildren(segment.element);\n selection?.collapseToEnd();\n } catch {\n // jsdom without a full selection model.\n }\n });\n scope.on(group, 'focusout', (event) => {\n const next = (event as FocusEvent).relatedTarget as Node | null;\n const leaving = segments[indexOf(event.target as Element)];\n if (leaving && typing?.segment === leaving) endTyping();\n if (next && group.contains(next)) return;\n pillShown = false;\n if (reduced()) gsap.set(pill, { opacity: 0 });\n else keep(gsap.to(pill, { opacity: 0, duration: 0.15, ease: 'power2.in' }));\n });\n\n return {\n element: group,\n values,\n setValues(next, animate = false) {\n typing = null;\n for (const segment of segments) {\n if (!(segment.type in next)) continue;\n const raw = next[segment.type];\n const value = raw === null || raw === undefined ? null : Math.min(segment.limits[1], Math.max(segment.limits[0], Math.round(raw)));\n if (value === segment.value) continue;\n const direction = !animate || value === null || segment.value === null ? 0 : value > segment.value ? 1 : -1;\n set(segment, value, direction);\n }\n last = JSON.stringify(values());\n },\n invalid(on, shakeIt = false) {\n if (on) group.setAttribute('aria-invalid', 'true');\n else group.removeAttribute('aria-invalid');\n if (on && shakeIt) keep(shake(group));\n },\n focus(which = 'first') {\n const target = which === 'last' ? segments[segments.length - 1] : segments[0];\n target?.element.focus();\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { createScope } from '../../core/scope';\nimport { registerMotion } from '../../core/gsap';\nimport { inert, type Instance } from '../../core/types';\nimport { formatTime, parseTime, timeMinutes, to12, to24 } from '../../core/segments';\nimport { createSegmentField, type SegmentValues } from '../../core/segment-field';\n\n/*\n * Time field: hour, minute (and second) segments in the locale's order, with\n * a.m./p.m. where the locale writes 12 hours. The value is always 24 h text\n * (\"13:05\"). Arrows step with wrap and the digits roll; typing fills and moves\n * on; a pill glides to the focused segment (core/segment-field.ts). min/max\n * mark the group invalid (one shake when it becomes invalid) but the value is\n * still reported, like a native input.\n */\n\nexport interface TimeFieldOptions {\n /** 'HH:MM' or 'HH:MM:SS' (24 h). */\n value?: string | null;\n locale?: string;\n /** 12 or 24; default: the locale's. */\n hourCycle?: 12 | 24;\n seconds?: boolean;\n /** Arrow step of the minutes (and seconds). */\n minuteStep?: number;\n min?: string;\n max?: string;\n /** Accessible name of the group (default 'Hora'). */\n label?: string;\n /** Hidden input with the 24 h text. */\n name?: string;\n disabled?: boolean;\n readOnly?: boolean;\n onChange?: (value: string | null) => void;\n}\n\nexport interface TimeFieldInstance extends Instance {\n setValue(value: string | null, animate?: boolean): void;\n focus(): void;\n readonly value: string | null;\n}\n\nexport function createTimeField(root: HTMLElement | null, options: TimeFieldOptions = {}): TimeFieldInstance {\n if (!root) return inert({ setValue() {}, focus() {}, value: null });\n registerMotion();\n const scope = createScope();\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n const seconds = Boolean(options.seconds);\n const step = options.minuteStep && options.minuteStep > 0 ? Math.round(options.minuteStep) : 1;\n const min = parseTime(options.min);\n const max = parseTime(options.max);\n let value: string | null = null;\n let invalid = false;\n\n const hidden = options.name ? document.createElement('input') : null;\n const field = createSegmentField(root, {\n kind: 'time',\n locale,\n hour12: options.hourCycle ? options.hourCycle === 12 : undefined,\n seconds,\n steps: { minute: step, second: step },\n disabled: options.disabled,\n readOnly: options.readOnly,\n onChange: (values) => {\n update(values);\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value } }));\n },\n });\n scope.add(() => field.destroy());\n field.element.setAttribute('aria-label', options.label ?? 'Hora');\n if (hidden) {\n hidden.type = 'hidden';\n hidden.name = options.name!;\n root.append(hidden);\n scope.add(() => hidden.remove());\n }\n scope.attr(root, 'data-mk-ready', '');\n const twelve = field.element.querySelector('[data-mk-segment=\"dayPeriod\"]') !== null;\n\n const update = (values: SegmentValues, initial = false) => {\n const complete = values.hour != null && values.minute != null && (!seconds || values.second != null) && (!twelve || values.dayPeriod != null);\n const time = complete ? { hour: twelve ? to24(values.hour!, values.dayPeriod!) : values.hour!, minute: values.minute!, second: values.second ?? 0 } : null;\n value = time ? formatTime(time, seconds) : null;\n if (hidden) hidden.value = value ?? '';\n const out = !!time && ((!!min && timeMinutes(time) < timeMinutes(min)) || (!!max && timeMinutes(time) > timeMinutes(max)));\n field.invalid(out, out && !invalid && !initial);\n invalid = out;\n };\n\n const setValue = (next: string | null, animate = true) => {\n if (scope.disposed) return;\n const time = parseTime(next);\n if (!time) field.setValues({ hour: null, minute: null, second: null, dayPeriod: null }, animate);\n else if (twelve) {\n const { hour, period } = to12(time.hour);\n field.setValues({ hour, dayPeriod: period, minute: time.minute, second: time.second }, animate);\n } else field.setValues({ hour: time.hour, minute: time.minute, second: time.second }, animate);\n update(field.values(), true);\n };\n setValue(options.value ?? null, false);\n\n return {\n setValue,\n focus: () => field.focus('first'),\n get value() {\n return value;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { addDays, dayKey, sameDay, toDate, type DateInput } from './dates';\n\n/*\n * Date ranges on local days (range-calendar, date-range-picker): reading a\n * {start, end} option, the day rules (min, max, unavailable days) and the\n * two-click pick — the first click fixes an anchor, the second closes the\n * range in either direction; crossing an unavailable day restarts at the\n * clicked day.\n */\n\nexport interface DateRange {\n start: Date;\n end: Date;\n}\n\nexport interface DayRules {\n min?: Date | null;\n max?: Date | null;\n isUnavailable?: (day: Date) => boolean;\n}\n\nconst valid = (input: DateInput | null | undefined) => {\n if (input === null || input === undefined || input === '') return null;\n const date = toDate(input, new Date(Number.NaN));\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\n/** An ordered range from {start, end} (Dates or 'YYYY-MM-DD'); null when either end is missing or unreadable. */\nexport function toRange(value: { start?: DateInput | null; end?: DateInput | null } | null | undefined): DateRange | null {\n if (!value) return null;\n const start = valid(value.start);\n const end = valid(value.end);\n if (!start || !end) return null;\n return start <= end ? { start, end } : { start: end, end: start };\n}\n\nexport const rangeKeys = (range: DateRange) => ({ start: dayKey(range.start), end: dayKey(range.end) });\n\nexport const inRange = (day: Date, range: DateRange | null | undefined) => !!range && day >= range.start && day <= range.end;\n\n/** Days from start to end, both included. */\nexport const rangeLength = (range: DateRange) =>\n Math.round((Date.UTC(range.end.getFullYear(), range.end.getMonth(), range.end.getDate()) - Date.UTC(range.start.getFullYear(), range.start.getMonth(), range.start.getDate())) / 86400000) + 1;\n\nexport function isPickable(day: Date, rules: DayRules = {}): boolean {\n if (rules.min && day < rules.min) return false;\n if (rules.max && day > rules.max) return false;\n return !rules.isUnavailable?.(day);\n}\n\n/** Every day of the range can be picked. */\nexport function rangeIsPickable(range: DateRange, rules: DayRules = {}): boolean {\n for (let day = range.start; day <= range.end; day = addDays(day, 1)) if (!isPickable(day, rules)) return false;\n return true;\n}\n\n/**\n * One click. Without an anchor, `day` becomes it. With one, the range closes\n * (ordered); if it would cross a day that cannot be picked, `day` becomes the\n * new anchor instead. Clicking the anchor again makes a one-day range.\n */\nexport function pickDay(anchor: Date | null, day: Date, rules: DayRules = {}): { anchor: Date | null; range: DateRange | null } {\n if (!anchor) return { anchor: day, range: null };\n const range = anchor <= day ? { start: anchor, end: day } : { start: day, end: anchor };\n if (!sameDay(anchor, day) && !rangeIsPickable(range, rules)) return { anchor: day, range: null };\n return { anchor: null, range };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport {\n addDays, addMonths, capitalize, clampFirstDay, dayKey, monthWeeks, safeFormat, sameDay, sameMonth, startOfMonth, startOfWeek, toDate, weekdayNames,\n type DateInput,\n} from '../../core/dates';\nimport { inRange, isPickable, pickDay, rangeKeys, rangeLength, toRange, type DateRange, type DayRules } from '../../core/date-range';\nimport { blurIn, press, ringPulse, shake } from '../../motion/micro';\n\n/*\n * Range calendar: one or two month grids (role=\"grid\") with one tabbable day\n * (roving tabindex). The first click (or Enter) fixes an anchor that pops; while\n * choosing the end, pointing previews the range as a lighter band; the second\n * click closes it and its band wipes in from the anchor to the end (EASE.wipe,\n * 12 ms apart, .35 s at most), then the end pops. Days that cannot be picked\n * (min, max, unavailable) are aria-disabled; a range may not cross one. Months\n * slide like the calendar component (old grid out 30 px in .12 s, new in from\n * the other side .25 s). Keyboard: arrows ±1/±7 days, Home/End week, PageUp/\n * PageDown month (Shift: year), Enter/Space pick.\n */\n\nexport interface RangeCalendarOptions {\n value?: { start: DateInput; end: DateInput } | null;\n /** First visible month (default: the value's start, else today). */\n month?: DateInput;\n visibleMonths?: 1 | 2;\n /** 0 = Sunday … 6 = Saturday (default 1, Monday). */\n firstDay?: number;\n min?: DateInput | null;\n max?: DateInput | null;\n /** 'YYYY-MM-DD' keys or a test. */\n unavailable?: string[] | ((day: Date) => boolean);\n locale?: string;\n /** Override \"today\" (demos, tests). */\n today?: DateInput;\n labels?: { prev?: string; next?: string };\n /** 'range' (default): two clicks; 'single': one click picks a day (date-time-picker). */\n selection?: 'range' | 'single';\n onChange?: (range: DateRange) => void;\n}\n\nexport interface RangeCalendarInstance extends Instance {\n setValue(range: { start: DateInput; end: DateInput } | null, animate?: boolean): void;\n next(): void;\n prev(): void;\n /** Move the focus to `day`, changing month if needed (`animate` false: no slide). */\n focusDay(day: DateInput, animate?: boolean): void;\n readonly value: DateRange | null;\n readonly month: Date;\n}\n\n/** The band of a finished range: each day draws in .22 s, 12 ms after the one before, the run within .35 s. */\nconst BAND = { day: 0.22, gap: 0.012, spread: 0.35 };\nconst bandGap = (days: number) => Math.min(BAND.gap, BAND.spread / Math.max(1, days));\n\n/** Seconds a finished range of `days` takes to settle: its band draws in while its end day pops (.3 s). */\nexport const bandDuration = (days: number) => Math.max(0.3, BAND.day + bandGap(days) * Math.max(0, days - 1));\n\nconst chevron = (path: string) =>\n `<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=\"${path}\"/></svg>`;\n\nconst el = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs: Record<string, string> = {}, text?: string) => {\n const element = document.createElement(tag);\n for (const [name, value] of Object.entries(attrs)) element.setAttribute(name, value);\n if (text !== undefined) element.textContent = text;\n return element;\n};\n\nexport function createRangeCalendar(root: HTMLElement | null, options: RangeCalendarOptions = {}): RangeCalendarInstance {\n if (!root) return inert({ setValue() {}, next() {}, prev() {}, focusDay() {}, value: null, month: startOfMonth(new Date()) });\n registerMotion();\n const scope = createScope();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n const firstDay = options.firstDay === undefined ? 1 : clampFirstDay(options.firstDay);\n const count = options.visibleMonths === 2 ? 2 : 1;\n const today = toDate(options.today ?? new Date());\n const unavailable = options.unavailable;\n const rules: DayRules = {\n min: options.min ? toDate(options.min) : null,\n max: options.max ? toDate(options.max) : null,\n isUnavailable: typeof unavailable === 'function' ? unavailable : Array.isArray(unavailable) ? (day) => unavailable.includes(dayKey(day)) : undefined,\n };\n let range: DateRange | null = toRange(options.value);\n let anchor: Date | null = null;\n let hover: Date | null = null;\n let month = startOfMonth(toDate(options.month ?? range?.start ?? today));\n let focused: Date = range?.start && sameMonth(range.start, month) ? range.start : sameMonth(today, month) ? today : month;\n const monthYear = safeFormat(locale, { month: 'long', year: 'numeric' });\n const fullDate = safeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' });\n const lastVisible = () => addDays(startOfMonth(addMonths(month, count)), -1);\n const visible = (day: Date) => day >= month && day <= lastVisible();\n\n const header = el('header', { 'data-mk-range-header': '' });\n const prevButton = el('button', { type: 'button', 'data-mk-range-prev': '', 'aria-label': options.labels?.prev ?? 'Mes anterior' });\n prevButton.innerHTML = chevron('M15 6l-6 6 6 6');\n const titleEl = el('h3', { 'data-mk-range-title': '', 'aria-live': 'polite' });\n const nextButton = el('button', { type: 'button', 'data-mk-range-next': '', 'aria-label': options.labels?.next ?? 'Mes siguiente' });\n nextButton.innerHTML = chevron('M9 6l6 6-6 6');\n header.append(prevButton, titleEl, nextButton);\n const months = el('div', { 'data-mk-range-months': '' });\n root.append(header, months);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([months, titleEl]);\n header.remove();\n months.remove();\n });\n scope.attr(root, 'data-mk-months', String(count));\n const single = options.selection === 'single';\n if (single) scope.attr(root, 'data-mk-selection', 'single');\n scope.attr(root, 'data-mk-ready', '');\n\n const title = () => capitalize(count > 1 && typeof monthYear.formatRange === 'function' ? monthYear.formatRange(month, lastVisible()) : monthYear.format(month));\n\n const buttons = () => [...months.querySelectorAll<HTMLButtonElement>('button[data-mk-day]')];\n const buttonOf = (day: Date) => months.querySelector<HTMLButtonElement>(`button[data-mk-day=\"${dayKey(day)}\"]`);\n const dayOf = (button: Element) => toDate((button as HTMLElement).dataset.mkDay!);\n\n const build = () => {\n const short = weekdayNames(locale, firstDay, 'narrow');\n const long = weekdayNames(locale, firstDay, 'long');\n const grids: HTMLElement[] = [];\n for (let i = 0; i < count; i++) {\n const shown = addMonths(month, i);\n const grid = el('div', { role: 'grid', 'data-mk-range-month': '', 'aria-label': monthYear.format(shown) });\n const head = el('div', { role: 'row', 'data-mk-range-weekdays': '' });\n short.forEach((name, j) => head.append(el('span', { role: 'columnheader', 'data-mk-range-weekday': '', 'aria-label': long[j]! }, name.toLocaleUpperCase(locale))));\n grid.append(head);\n for (const week of monthWeeks(shown, firstDay)) {\n const row = el('div', { role: 'row', 'data-mk-range-week': '' });\n for (const day of week) {\n const cell = el('div', { role: 'gridcell', 'data-mk-range-cell': '' });\n if (!sameMonth(day, shown)) cell.setAttribute('data-mk-outside', '');\n else {\n cell.append(\n el('span', { 'data-mk-day-band': '', 'aria-hidden': 'true' }),\n el('button', { type: 'button', 'data-mk-day': dayKey(day), tabindex: '-1', 'aria-label': fullDate.format(day) }, String(day.getDate())),\n );\n }\n row.append(cell);\n }\n grid.append(row);\n }\n grids.push(grid);\n }\n months.replaceChildren(...grids);\n paint();\n };\n\n const ordered = (a: Date, b: Date): DateRange => (a <= b ? { start: a, end: b } : { start: b, end: a });\n\n const paint = () => {\n const shown = anchor ? null : range;\n const preview = anchor && hover ? ordered(anchor, hover) : null;\n const all = buttons();\n const target = visible(focused) ? dayKey(focused) : dayKey(all.map(dayOf).find((day) => isPickable(day, rules)) ?? month);\n for (const button of all) {\n const day = dayOf(button);\n const cell = button.parentElement!;\n const selected = inRange(day, shown);\n button.toggleAttribute('data-mk-today', sameDay(day, today));\n button.toggleAttribute('data-mk-anchor', sameDay(day, anchor));\n button.toggleAttribute('data-mk-in-range', selected);\n button.toggleAttribute('data-mk-range-start', !!shown && sameDay(day, shown.start));\n button.toggleAttribute('data-mk-range-end', !!shown && sameDay(day, shown.end));\n button.toggleAttribute('data-mk-preview', inRange(day, preview));\n button.toggleAttribute('data-mk-preview-start', !!preview && sameDay(day, preview.start));\n button.toggleAttribute('data-mk-preview-end', !!preview && sameDay(day, preview.end));\n if (isPickable(day, rules)) button.removeAttribute('aria-disabled');\n else button.setAttribute('aria-disabled', 'true');\n if (selected) cell.setAttribute('aria-selected', 'true');\n else cell.removeAttribute('aria-selected');\n button.setAttribute('tabindex', button.dataset.mkDay === target ? '0' : '-1');\n }\n };\n\n const go = (next: Date, direction: 1 | -1, after?: () => void, animate = true) => {\n month = startOfMonth(next);\n gsap.killTweensOf([months, titleEl]);\n if (reduced() || !animate) {\n build();\n titleEl.textContent = title();\n after?.();\n return;\n }\n keep(\n gsap.to(months, {\n x: -direction * 30,\n opacity: 0,\n duration: 0.12,\n ease: 'power2.in',\n onComplete: () => {\n build();\n titleEl.textContent = title();\n keep(blurIn(titleEl, { from: 'soft', duration: 0.3 }));\n keep(gsap.fromTo(months, { x: direction * 30, opacity: 0 }, { x: 0, opacity: 1, duration: 0.25, ease: 'power2.out', clearProps: 'x,opacity,transform' }));\n after?.();\n },\n }),\n );\n };\n\n const focusDay = (input: DateInput, animate = true) => {\n focused = toDate(input);\n if (anchor) hover = focused;\n if (visible(focused)) {\n paint();\n buttonOf(focused)?.focus();\n return;\n }\n const before = focused < month;\n go(before ? startOfMonth(focused) : startOfMonth(addMonths(focused, -(count - 1))), before ? -1 : 1, () => buttonOf(focused)?.focus(), animate);\n };\n\n const pop = (button: HTMLElement | null) => {\n if (button && !reduced()) keep(gsap.fromTo(button, { scale: 0.6 }, { scale: 1, duration: 0.3, ease: EASE.pop, clearProps: 'scale,transform' }));\n };\n\n /** The band of the finished range draws itself from the anchor to the end. */\n const wipe = (forward: boolean, last: Date | null) => {\n if (reduced() || !range) return;\n const bands = buttons()\n .filter((button) => button.hasAttribute('data-mk-in-range'))\n .map((button) => button.previousElementSibling as HTMLElement);\n if (!forward) bands.reverse();\n if (bands.length) {\n keep(\n gsap.fromTo(\n bands,\n { scaleX: 0 },\n {\n scaleX: 1,\n duration: BAND.day,\n ease: EASE.wipe,\n stagger: bandGap(bands.length),\n transformOrigin: forward ? '0% 50%' : '100% 50%',\n clearProps: 'scale,transform,transformOrigin',\n },\n ),\n );\n }\n pop(last ? buttonOf(last) : null);\n };\n\n const emit = () => {\n if (!range) return;\n options.onChange?.({ ...range });\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { ...rangeKeys(range), length: rangeLength(range) } }));\n };\n\n const pick = (day: Date) => {\n const button = buttonOf(day);\n if (!isPickable(day, rules)) {\n if (button) keep(shake(button, 3));\n return;\n }\n if (single) {\n // One click, one day: it pops and the change is reported.\n range = { start: day, end: day };\n anchor = null;\n hover = null;\n paint();\n pop(button);\n emit();\n return;\n }\n const wasAnchor = anchor;\n const next = pickDay(anchor, day, rules);\n anchor = next.anchor;\n hover = anchor;\n if (!next.range) {\n paint();\n if (anchor && button && !reduced()) {\n pop(button);\n keep(ringPulse(button));\n }\n return;\n }\n range = next.range;\n paint();\n wipe(wasAnchor !== null && wasAnchor <= day, day);\n emit();\n };\n\n const KEYS: Record<string, (day: Date, shift: boolean) => Date> = {\n ArrowLeft: (day) => addDays(day, -1),\n ArrowRight: (day) => addDays(day, 1),\n ArrowUp: (day) => addDays(day, -7),\n ArrowDown: (day) => addDays(day, 7),\n Home: (day) => startOfWeek(day, firstDay),\n End: (day) => addDays(startOfWeek(day, firstDay), 6),\n PageUp: (day, shift) => addMonths(day, shift ? -12 : -1),\n PageDown: (day, shift) => addMonths(day, shift ? 12 : 1),\n };\n scope.on(months, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const button = (key.target as Element | null)?.closest('button[data-mk-day]');\n if (!button) return;\n const move = KEYS[key.key];\n if (move) {\n key.preventDefault();\n focusDay(move(dayOf(button), key.shiftKey));\n } else if (key.key === 'Enter' || key.key === ' ') {\n key.preventDefault();\n focused = dayOf(button);\n pick(focused);\n }\n });\n scope.on(months, 'click', (event) => {\n const button = (event.target as Element | null)?.closest<HTMLButtonElement>('button[data-mk-day]');\n if (!button) return;\n focused = dayOf(button);\n pick(focused);\n });\n scope.on(months, 'pointerover', (event) => {\n if (!anchor) return;\n const button = (event.target as Element | null)?.closest('button[data-mk-day]');\n if (!button) return;\n const day = dayOf(button);\n if (hover && sameDay(hover, day)) return;\n hover = day;\n paint();\n });\n scope.on(months, 'pointerleave', () => {\n if (!anchor || !hover) return;\n hover = anchor;\n paint();\n });\n const step = (direction: 1 | -1) => {\n // The focused day follows so that the tabbable day stays in view.\n focused = addMonths(focused, direction);\n go(addMonths(month, direction), direction);\n };\n scope.on(prevButton, 'click', () => {\n keep(press(prevButton));\n step(-1);\n });\n scope.on(nextButton, 'click', () => {\n keep(press(nextButton));\n step(1);\n });\n\n titleEl.textContent = title();\n build();\n\n return {\n setValue(next, animate = true) {\n if (scope.disposed) return;\n range = toRange(next);\n anchor = null;\n hover = null;\n if (range && !visible(range.start)) {\n focused = range.start;\n go(\n startOfMonth(range.start),\n range.start < month ? -1 : 1,\n () => {\n if (animate) wipe(true, null);\n },\n animate,\n );\n return;\n }\n if (range) focused = range.start;\n paint();\n if (animate) wipe(true, null);\n },\n next: () => step(1),\n prev: () => step(-1),\n focusDay,\n get value() {\n return range ? { ...range } : null;\n },\n get month() {\n return new Date(month);\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { dayKey, toDate, type DateInput } from '../../core/dates';\nimport { daysIn } from '../../core/segments';\nimport { createSegmentField, type SegmentValues } from '../../core/segment-field';\nimport { isPickable, rangeIsPickable, rangeKeys, rangeLength, toRange, type DateRange, type DayRules } from '../../core/date-range';\nimport { press, shake } from '../../motion/micro';\nimport { flowInMenu } from '../../motion/entrances';\nimport { createDialog } from '../dialog/engine';\nimport { bandDuration, createRangeCalendar } from '../range-calendar/engine';\n\n/*\n * Date range picker: a field group with two segmented dates (start – end, the\n * locale's order: dd/mm/aaaa in Spanish) and a calendar button. The button\n * opens a range-calendar in an anchored dialog that grows out of it (two months\n * from 680 px, one below), with optional preset chips above; like a menu's\n * options, its content flows in while the surface grows. Typing two\n * complete dates validates them: an end before the start, a day out of\n * min/max or a range crossing an unavailable day marks the field invalid,\n * explains why under it and shakes once when focus leaves. Picking in the\n * calendar fills both fields (the digits roll), keeps the popover while the\n * band draws and the end day pops, plus a moment to see them (SETTLE), then\n * folds it back into the button, which gets the focus back; touching the\n * calendar meanwhile keeps it open. onChange only reports valid ranges.\n */\n\nexport interface DateRangePreset {\n label: string;\n start: DateInput;\n end: DateInput;\n}\n\nexport interface DateRangePickerOptions {\n value?: { start: DateInput; end: DateInput } | null;\n min?: DateInput | null;\n max?: DateInput | null;\n unavailable?: string[] | ((day: Date) => boolean);\n firstDay?: number;\n locale?: string;\n today?: DateInput;\n /** Accessible name of the field (default 'Fechas'). */\n label?: string;\n /** Hidden inputs name[start] and name[end] (YYYY-MM-DD). */\n name?: string;\n presets?: DateRangePreset[];\n disabled?: boolean;\n onChange?: (range: DateRange | null) => void;\n}\n\nexport interface DateRangePickerInstance extends Instance {\n open(): void;\n close(): void;\n setValue(range: { start: DateInput; end: DateInput } | null): void;\n readonly value: DateRange | null;\n readonly isOpen: boolean;\n}\n\nconst CALENDAR_ICON =\n '<svg aria-hidden=\"true\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3.5\" y=\"5\" width=\"17\" height=\"15.5\" rx=\"3\"/><path d=\"M3.5 10h17M8 3v4M16 3v4\"/></svg>';\n\nconst ERRORS = {\n order: 'La fecha de fin es anterior a la de inicio',\n bounds: 'Fecha fuera del rango permitido',\n blocked: 'El rango incluye días no disponibles',\n} as const;\n\nlet sequence = 0;\n/** Seconds the picked range stays in view after its band has drawn, before the popover folds back. */\nconst SETTLE = 0.35;\n\n/** A complete date from the segments, or null; years 0–99 stay years 0–99 (setFullYear). */\nconst dateOf = (values: SegmentValues): Date | null => {\n const { day, month, year } = values;\n if (day == null || month == null || year == null || day > daysIn(year, month)) return null;\n const date = new Date(2000, 0, 1);\n date.setFullYear(year, month - 1, day);\n return date;\n};\n\nconst segmentsOf = (date: Date | null) => (date ? { day: date.getDate(), month: date.getMonth() + 1, year: date.getFullYear() } : { day: null, month: null, year: null });\n\nexport function createDateRangePicker(root: HTMLElement | null, options: DateRangePickerOptions = {}): DateRangePickerInstance {\n if (!root) return inert({ open() {}, close() {}, setValue() {}, value: null, isOpen: false });\n registerMotion();\n const scope = createScope();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n const uid = `mk-range-${++sequence}`;\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n const unavailable = options.unavailable;\n const rules: DayRules = {\n min: options.min ? toDate(options.min) : null,\n max: options.max ? toDate(options.max) : null,\n isUnavailable: typeof unavailable === 'function' ? unavailable : Array.isArray(unavailable) ? (day) => unavailable.includes(dayKey(day)) : undefined,\n };\n const presets = options.presets ?? [];\n let value: DateRange | null = toRange(options.value);\n\n const made: Element[] = [];\n const field = document.createElement('div');\n field.dataset.mkRangeField = '';\n field.setAttribute('role', 'group');\n field.setAttribute('aria-label', options.label ?? 'Fechas');\n field.setAttribute('aria-describedby', `${uid}-error`);\n root.append(field);\n made.push(field);\n\n const which = (suffix: string) => ({ day: `día ${suffix}`, month: `mes ${suffix}`, year: `año ${suffix}` });\n const startField = createSegmentField(field, { kind: 'date', locale, labels: which('de inicio'), disabled: options.disabled, onChange: () => typed() });\n startField.element.setAttribute('data-mk-range-start', '');\n startField.element.setAttribute('aria-label', 'Fecha de inicio');\n const dash = document.createElement('span');\n dash.dataset.mkRangeDash = '';\n dash.setAttribute('aria-hidden', 'true');\n dash.textContent = '–';\n field.append(dash);\n const endField = createSegmentField(field, { kind: 'date', locale, labels: which('de fin'), disabled: options.disabled, onChange: () => typed() });\n endField.element.setAttribute('data-mk-range-end', '');\n endField.element.setAttribute('aria-label', 'Fecha de fin');\n scope.add(() => {\n startField.destroy();\n endField.destroy();\n });\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkRangeButton = '';\n button.setAttribute('aria-label', 'Abrir calendario');\n button.setAttribute('aria-haspopup', 'dialog');\n button.setAttribute('aria-expanded', 'false');\n button.disabled = Boolean(options.disabled);\n button.innerHTML = CALENDAR_ICON;\n field.append(button);\n\n const error = document.createElement('p');\n error.dataset.mkRangeError = '';\n error.id = `${uid}-error`;\n error.setAttribute('aria-live', 'polite');\n error.hidden = true;\n root.append(error);\n made.push(error);\n\n const dialogElement = document.createElement('dialog');\n // A class, not only an attribute: the copy that folds back into the button on close keeps classes only.\n dialogElement.className = 'mk-dialog mk-range-popover';\n dialogElement.dataset.mkRangePopover = '';\n dialogElement.setAttribute('aria-label', 'Elegir fechas');\n const presetsHost = document.createElement('div');\n presetsHost.dataset.mkRangePresets = '';\n presetsHost.setAttribute('role', 'group');\n presetsHost.setAttribute('aria-label', 'Atajos');\n presets.forEach((preset, index) => {\n const chip = document.createElement('button');\n chip.type = 'button';\n chip.dataset.mkRangePreset = '';\n chip.dataset.mkIndex = String(index);\n chip.textContent = preset.label;\n presetsHost.append(chip);\n });\n const calendarHost = document.createElement('div');\n calendarHost.className = 'mk-range-calendar';\n if (presets.length) dialogElement.append(presetsHost);\n dialogElement.append(calendarHost);\n root.append(dialogElement);\n made.push(dialogElement);\n\n let hiddenStart: HTMLInputElement | null = null;\n let hiddenEnd: HTMLInputElement | null = null;\n if (options.name) {\n const hiddenInput = (key: 'start' | 'end') => {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = `${options.name}[${key}]`;\n root.append(input);\n made.push(input);\n return input;\n };\n hiddenStart = hiddenInput('start');\n hiddenEnd = hiddenInput('end');\n }\n scope.add(() => made.forEach((node) => node.remove()));\n // Listeners on the picker hear the picker, not the calendar inside its popover.\n scope.on(dialogElement, 'mk:change', (event) => event.stopPropagation());\n scope.attr(root, 'data-mk-ready', '');\n\n const showError = (code: keyof typeof ERRORS | null) => {\n error.textContent = code ? ERRORS[code] : '';\n error.hidden = !code;\n if (code) field.setAttribute('aria-invalid', 'true');\n else field.removeAttribute('aria-invalid');\n };\n\n const check = (range: DateRange): keyof typeof ERRORS | null => {\n if (range.end < range.start) return 'order';\n const bounds = { min: rules.min, max: rules.max };\n if (!isPickable(range.start, bounds) || !isPickable(range.end, bounds)) return 'bounds';\n if (!rangeIsPickable(range, rules)) return 'blocked';\n return null;\n };\n\n const writeHidden = () => {\n if (hiddenStart) hiddenStart.value = value ? dayKey(value.start) : '';\n if (hiddenEnd) hiddenEnd.value = value ? dayKey(value.end) : '';\n };\n\n let calendarReady = false;\n const commit = (range: DateRange | null, fill: boolean) => {\n const same = range && value ? dayKey(range.start) === dayKey(value.start) && dayKey(range.end) === dayKey(value.end) : range === value;\n value = range;\n if (fill) {\n startField.setValues(segmentsOf(range?.start ?? null), true);\n endField.setValues(segmentsOf(range?.end ?? null), true);\n showError(null);\n }\n writeHidden();\n if (same) return;\n if (calendarReady) calendar.setValue(range ? rangeKeys(range) : null, false);\n options.onChange?.(range ? { ...range } : null);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: range ? { ...rangeKeys(range), length: rangeLength(range) } : null }));\n };\n\n // Typing: validate as soon as both dates are complete; report only a new valid range.\n const typed = () => {\n const start = dateOf(startField.values());\n const end = dateOf(endField.values());\n if (!start || !end) return showError(null);\n const range = { start, end };\n const code = check(range);\n showError(code);\n if (code) return;\n commit(range, false);\n };\n // The shake waits until focus leaves the field, so it never fires mid-typing.\n scope.on(field, 'focusout', (event) => {\n if (!field.contains((event as FocusEvent).relatedTarget as Node | null) && field.hasAttribute('aria-invalid')) keep(shake(field));\n });\n\n const wide = typeof matchMedia === 'function' && matchMedia('(min-width: 680px)').matches;\n const calendar = createRangeCalendar(calendarHost, {\n value: value ? rangeKeys(value) : null,\n visibleMonths: wide ? 2 : 1,\n firstDay: options.firstDay,\n min: options.min,\n max: options.max,\n unavailable: options.unavailable,\n locale,\n today: options.today,\n onChange: (range) => {\n commit(range, true);\n cancelClose();\n if (reduced()) return popover.close();\n // The band draws and the end day pops; the range stays in view a moment, then the panel folds back.\n closing = setTimeout(() => {\n closing = undefined;\n popover.close();\n }, (bandDuration(rangeLength(range)) + SETTLE) * 1000);\n },\n });\n calendarReady = true;\n scope.add(() => calendar.destroy());\n\n let closing: ReturnType<typeof setTimeout> | undefined;\n const cancelClose = () => {\n clearTimeout(closing);\n closing = undefined;\n };\n scope.add(cancelClose);\n // Touching the calendar again while a picked range settles keeps the popover open (capture: before a pick).\n scope.on(dialogElement, 'pointerdown', cancelClose, true);\n scope.on(dialogElement, 'keydown', cancelClose, true);\n const startDay = () => value?.start ?? options.today ?? new Date();\n\n const popover = createDialog(dialogElement, {\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n triggers: false,\n animateContent: false,\n onOpen: () => {\n calendar.focusDay(startDay(), false);\n // Like a menu's options: the presets, the header and the months flow in while the surface grows.\n keep(flowInMenu([...dialogElement.querySelectorAll<HTMLElement>('[data-mk-range-presets], [data-mk-range-header], [data-mk-range-month]')]));\n },\n onClose: () => {\n cancelClose();\n button.setAttribute('aria-expanded', 'false');\n },\n });\n scope.add(() => popover.destroy());\n\n const open = () => {\n if (options.disabled || popover.isOpen) return;\n // The calendar shows the range (or today) before the panel is measured and placed; a half-picked range is dropped.\n calendar.setValue(value ? rangeKeys(value) : null, false);\n calendar.focusDay(startDay(), false);\n popover.open(button);\n button.setAttribute('aria-expanded', 'true');\n };\n scope.on(button, 'click', () => {\n keep(press(button));\n if (popover.isOpen) popover.close();\n else open();\n });\n // Presets: commit, show it in the calendar, close.\n scope.on(presetsHost, 'click', (event) => {\n const chip = (event.target as Element | null)?.closest<HTMLButtonElement>('[data-mk-range-preset]');\n if (!chip) return;\n const chosen = toRange(presets[Number(chip.dataset.mkIndex)]);\n if (!chosen) return;\n keep(press(chip));\n commit(chosen, true);\n popover.close();\n });\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n\n startField.setValues(segmentsOf(value?.start ?? null));\n endField.setValues(segmentsOf(value?.end ?? null));\n writeHidden();\n\n return {\n open,\n close: () => popover.close(),\n setValue(next) {\n if (scope.disposed) return;\n const range = toRange(next);\n const same = range && value ? dayKey(range.start) === dayKey(value.start) && dayKey(range.end) === dayKey(value.end) : range === value;\n value = range;\n startField.setValues(segmentsOf(range?.start ?? null), true);\n endField.setValues(segmentsOf(range?.end ?? null), true);\n showError(null);\n writeHidden();\n if (!same) calendar.setValue(range ? rangeKeys(range) : null, false);\n },\n get value() {\n return value ? { ...value } : null;\n },\n get isOpen() {\n return popover.isOpen;\n },\n destroy: () => scope.dispose(),\n };\n}\n","/*\n * Floating placement (tooltip, chart-tooltip, listboxes): a box of `size` goes\n * next to `anchor` on the preferred side, flips to the opposite side when its\n * own has no room and the other has more ('auto' takes the roomiest side),\n * slides along the edge to stay `edge` px inside the viewport, and reports\n * where an arrow should point (the anchor's centre, kept off the corners).\n * Pure: the callers measure and write the result.\n */\n\nexport type Side = 'top' | 'bottom' | 'left' | 'right';\nexport type Placement = Side | 'auto';\n\nexport interface Box {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport interface PlaceOptions {\n placement?: Placement;\n /** Space between anchor and box (default 8). */\n gap?: number;\n /** Distance kept from the viewport edges (default 8). */\n edge?: number;\n /** Along the edge: centred on the anchor (default) or flush with its start or end. */\n align?: 'center' | 'start' | 'end';\n /** The arrow stays this far from the box's corners (default 12). */\n arrowPad?: number;\n viewport?: { width: number; height: number };\n}\n\nexport interface Placed {\n side: Side;\n /** Viewport coordinates of the box's top-left corner. */\n x: number;\n y: number;\n /** Arrow position along the box's edge facing the anchor, in px from its start. */\n arrow: number;\n}\n\nexport const OPPOSITE: Record<Side, Side> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(value, max));\nconst round = (n: number) => Math.round(n * 100) / 100;\n\nexport function place(anchor: Box, size: { width: number; height: number }, options: PlaceOptions = {}): Placed {\n const { placement = 'top', gap = 8, edge = 8, align = 'center', arrowPad = 12 } = options;\n const view = options.viewport ?? { width: innerWidth, height: innerHeight };\n const room: Record<Side, number> = {\n top: anchor.top - gap - edge,\n bottom: view.height - (anchor.top + anchor.height) - gap - edge,\n left: anchor.left - gap - edge,\n right: view.width - (anchor.left + anchor.width) - gap - edge,\n };\n const need = (side: Side) => (side === 'top' || side === 'bottom' ? size.height : size.width);\n let side: Side;\n if (placement === 'auto') {\n const order: Side[] = ['top', 'bottom', 'right', 'left'];\n side = order.find((candidate) => room[candidate] >= need(candidate)) ?? order.reduce((best, candidate) => (room[candidate] - need(candidate) > room[best] - need(best) ? candidate : best));\n } else {\n side = placement;\n if (room[side] < need(side) && room[OPPOSITE[side]] > room[side]) side = OPPOSITE[side];\n }\n const vertical = side === 'top' || side === 'bottom';\n let x: number;\n let y: number;\n if (vertical) {\n y = side === 'top' ? anchor.top - gap - size.height : anchor.top + anchor.height + gap;\n x = align === 'start' ? anchor.left : align === 'end' ? anchor.left + anchor.width - size.width : anchor.left + anchor.width / 2 - size.width / 2;\n x = clamp(x, edge, view.width - edge - size.width);\n } else {\n x = side === 'left' ? anchor.left - gap - size.width : anchor.left + anchor.width + gap;\n y = align === 'start' ? anchor.top : align === 'end' ? anchor.top + anchor.height - size.height : anchor.top + anchor.height / 2 - size.height / 2;\n y = clamp(y, edge, view.height - edge - size.height);\n }\n const length = vertical ? size.width : size.height;\n const centre = vertical ? anchor.left + anchor.width / 2 - x : anchor.top + anchor.height / 2 - y;\n const pad = Math.min(arrowPad, length / 2);\n return { side, x: round(x), y: round(y), arrow: round(clamp(centre, pad, length - pad)) };\n}\n\n/** The point the box should grow from: its edge facing the anchor, at the arrow. */\nexport function originOf({ side, arrow }: Placed): string {\n if (side === 'top') return `${arrow}px 100%`;\n if (side === 'bottom') return `${arrow}px 0%`;\n if (side === 'left') return `100% ${arrow}px`;\n return `0% ${arrow}px`;\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { requestFrame } from '../../core/frame';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { originOf, place, type Placement } from '../../core/position';\n\n/*\n * Tooltip: a short description beside its trigger, shown when the pointer\n * rests on it (400 ms), when keyboard focus reaches it (at once) or on a long\n * press (500 ms, touch). It takes the preferred side, flips when that side has\n * no room, stays inside the viewport and points an arrow at the trigger's\n * centre; it lives in the top layer (popover API) so no overflow clips it.\n * Motion (Melon Mind): it pops from the arrow (scale .85, 4 px toward the\n * trigger, blur 4 → 0, .22 s, pop curve) and fades out in .12 s; moving to\n * another tooltip within .4 s shows it at once with a plain fade (warm), and\n * new text cross-fades. Escape hides it (WCAG 1.4.13); with `interactive` the\n * pointer can move onto it. The trigger is described by it (aria-describedby).\n */\n\nexport interface TooltipOptions {\n /** Text of the bubble (default: the trigger's title, which is removed so the browser's own does not show). */\n content?: string;\n /** Preferred side (default 'top'); 'auto' takes the roomiest. */\n placement?: Placement;\n /** Hover delay in ms (default 400). Focus shows it at once. */\n openDelay?: number;\n /** Delay before hiding when the pointer leaves, in ms (default 100). */\n closeDelay?: number;\n /** The pointer can move onto the bubble (links, selectable text). */\n interactive?: boolean;\n /** Arrow pointing at the trigger (default true). */\n arrow?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface TooltipInstance extends Instance {\n open(): void;\n close(): void;\n /** New text; an open tooltip cross-fades to it. Empty text hides it. */\n setContent(text: string): void;\n readonly isOpen: boolean;\n}\n\nconst FOCUSABLE = 'a[href], button, input, select, textarea, summary, [tabindex]:not([tabindex=\"-1\"]), [contenteditable=\"true\"]';\n/** A tooltip shown within this long after another one hid skips the delay and the pop. */\nconst WARM = 400;\nlet sequence = 0;\nlet current: { hide(instant: boolean): void } | null = null;\nlet lastHidden = -Infinity;\nconst now = () => (typeof performance !== 'undefined' ? performance.now() : Date.now());\n\nexport function createTooltip(root: HTMLElement | null, options: TooltipOptions = {}): TooltipInstance {\n if (!root) return inert({ open() {}, close() {}, setContent() {}, isOpen: false });\n registerMotion();\n const scope = createScope();\n const trigger = root.querySelector<HTMLElement>('[data-mk-tooltip-trigger]') ?? (root.matches(FOCUSABLE) ? root : root.querySelector<HTMLElement>(FOCUSABLE)) ?? root;\n const title = trigger.getAttribute('title');\n if (title !== null) scope.attr(trigger, 'title', null);\n let text = options.content ?? title ?? '';\n // Keyboard users must be able to reach what the tooltip describes.\n if (!trigger.matches(FOCUSABLE)) scope.attr(trigger, 'tabindex', '0');\n const openDelay = Number.isFinite(options.openDelay) ? Math.max(0, options.openDelay!) : 400;\n const closeDelay = Number.isFinite(options.closeDelay) ? Math.max(0, options.closeDelay!) : 100;\n const placement = options.placement ?? 'top';\n const withArrow = options.arrow !== false;\n\n const bubble = document.createElement('div');\n bubble.dataset.mkTooltipBubble = '';\n bubble.setAttribute('role', 'tooltip');\n bubble.id = `mk-tooltip-${++sequence}`;\n if (options.interactive) bubble.dataset.mkInteractive = '';\n const label = document.createElement('span');\n label.dataset.mkTooltipText = '';\n label.textContent = text;\n bubble.append(label);\n if (withArrow) {\n const arrow = document.createElement('span');\n arrow.dataset.mkTooltipArrow = '';\n arrow.setAttribute('aria-hidden', 'true');\n bubble.append(arrow);\n }\n // The top layer (popover API) escapes every overflow; without it the bubble hangs from <body>.\n const topLayer = typeof bubble.showPopover === 'function';\n if (topLayer) {\n bubble.setAttribute('popover', 'manual');\n root.append(bubble);\n } else {\n bubble.hidden = true;\n document.body.append(bubble);\n }\n scope.add(() => bubble.remove());\n scope.attr(trigger, 'aria-describedby', [trigger.getAttribute('aria-describedby'), bubble.id].filter(Boolean).join(' '));\n scope.attr(root, 'data-mk-open', null);\n scope.attr(root, 'data-mk-ready', '');\n\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n let motion: gsap.core.Animation | null = null;\n scope.add(() => {\n motion?.kill();\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n\n let isOpen = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cancel = () => {\n clearTimeout(timer);\n timer = undefined;\n };\n const later = (fn: () => void, ms: number) => {\n cancel();\n timer = setTimeout(fn, ms);\n };\n scope.add(cancel);\n\n const shown = () => (topLayer ? bubble.matches(':popover-open') : !bubble.hidden);\n const reveal = () => {\n if (shown()) return;\n if (topLayer) bubble.showPopover();\n else bubble.hidden = false;\n };\n const conceal = () => {\n if (!shown()) return;\n if (topLayer) bubble.hidePopover();\n else bubble.hidden = true;\n };\n\n const position = () => {\n const anchor = trigger.getBoundingClientRect();\n const box = bubble.getBoundingClientRect();\n const placed = place(anchor, { width: box.width, height: box.height }, { placement, gap: withArrow ? 10 : 6 });\n bubble.style.left = `${placed.x}px`;\n bubble.style.top = `${placed.y}px`;\n bubble.dataset.mkSide = placed.side;\n bubble.style.setProperty('--mk-tooltip-arrow', `${placed.arrow}px`);\n return placed;\n };\n let pending: (() => void) | null = null;\n const follow = () => {\n if (!isOpen || pending) return;\n pending = requestFrame(() => {\n pending = null;\n if (isOpen) position();\n });\n };\n scope.add(() => pending?.());\n\n const announce = (open: boolean) => {\n if (open) root.setAttribute('data-mk-open', '');\n else root.removeAttribute('data-mk-open');\n options.onOpenChange?.(open);\n root.dispatchEvent(new CustomEvent('mk:open-change', { bubbles: true, detail: { open } }));\n };\n\n const controller = {\n hide: (instant: boolean) => hide(instant),\n };\n\n const show = () => {\n cancel();\n if (isOpen || scope.disposed || !text) return;\n const warm = current !== null || now() - lastHidden < WARM;\n if (current && current !== controller) current.hide(true);\n current = controller;\n isOpen = true;\n motion?.kill();\n reveal();\n const placed = position();\n if (!reduced()) {\n if (warm) motion = gsap.fromTo(bubble, { opacity: 0 }, { opacity: 1, duration: 0.1, ease: 'power1.out', clearProps: 'opacity' });\n else {\n const toward = 4;\n const offset = placed.side === 'top' ? { x: 0, y: toward } : placed.side === 'bottom' ? { x: 0, y: -toward } : placed.side === 'left' ? { x: toward, y: 0 } : { x: -toward, y: 0 };\n gsap.set(bubble, { transformOrigin: originOf(placed) });\n motion = gsap.fromTo(\n bubble,\n { opacity: 0, scale: 0.85, filter: 'blur(4px)', ...offset },\n { opacity: 1, scale: 1, filter: 'blur(0px)', x: 0, y: 0, duration: 0.22, ease: EASE.pop, clearProps: 'opacity,scale,filter,transform,transformOrigin' },\n );\n }\n }\n announce(true);\n };\n\n const hide = (instant = false) => {\n cancel();\n if (!isOpen) return;\n isOpen = false;\n if (current === controller) current = null;\n lastHidden = now();\n motion?.kill();\n const finish = () => {\n conceal();\n gsap.set(bubble, { clearProps: 'opacity,scale,filter,transform,transformOrigin' });\n };\n if (instant || reduced()) finish();\n else motion = gsap.to(bubble, { opacity: 0, scale: 0.96, duration: 0.12, ease: 'power2.in', onComplete: finish });\n announce(false);\n };\n scope.add(() => {\n if (current === controller) current = null;\n });\n\n /** The last input: focus after a click is not keyboard focus. */\n let pointerInput = false;\n scope.on(document, 'pointerdown', () => (pointerInput = true), true);\n scope.on(document, 'keydown', () => (pointerInput = false), true);\n\n scope.on(trigger, 'pointerenter', (event) => {\n if ((event as PointerEvent).pointerType === 'touch') return;\n later(show, current || now() - lastHidden < WARM ? 0 : openDelay);\n });\n scope.on(trigger, 'pointerleave', (event) => {\n if ((event as PointerEvent).pointerType === 'touch') return;\n later(() => hide(), closeDelay);\n });\n // Touch: a long press shows it for a moment.\n scope.on(trigger, 'pointerdown', (event) => {\n if ((event as PointerEvent).pointerType === 'touch') later(show, 500);\n });\n for (const type of ['pointerup', 'pointercancel']) {\n scope.on(trigger, type, (event) => {\n if ((event as PointerEvent).pointerType !== 'touch') return;\n if (isOpen) later(() => hide(), 1500);\n else cancel();\n });\n }\n if (options.interactive) {\n scope.on(bubble, 'pointerenter', cancel);\n scope.on(bubble, 'pointerleave', () => later(() => hide(), closeDelay));\n }\n scope.on(trigger, 'focusin', () => {\n if (!pointerInput) show();\n });\n scope.on(trigger, 'focusout', (event) => {\n if (options.interactive && bubble.contains((event as FocusEvent).relatedTarget as Node | null)) return;\n hide();\n });\n scope.on(document, 'keydown', (event) => {\n if ((event as KeyboardEvent).key === 'Escape' && isOpen) hide();\n });\n scope.on(window, 'resize', follow);\n scope.on(window, 'scroll', follow, { capture: true, passive: true });\n scope.add(() => {\n if (isOpen) conceal();\n });\n\n return {\n open: show,\n close: () => hide(),\n setContent(next) {\n if (scope.disposed) return;\n text = next;\n if (!text) {\n label.textContent = '';\n hide();\n return;\n }\n if (!isOpen || reduced() || label.textContent === text) {\n label.textContent = text;\n if (isOpen) position();\n return;\n }\n gsap.killTweensOf(label);\n keep(\n gsap\n .timeline()\n .to(label, { opacity: 0, filter: 'blur(3px)', duration: 0.1, ease: 'power1.in' })\n .call(() => {\n label.textContent = text;\n if (isOpen) position();\n })\n .to(label, { opacity: 1, filter: 'blur(0px)', duration: 0.16, ease: 'power1.out', clearProps: 'opacity,filter' }),\n );\n },\n get isOpen() {\n return isOpen;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { flowInMenu } from '../../motion/entrances';\nimport { createDialog } from '../dialog/engine';\n\n/*\n * Popover: an interactive panel anchored to its trigger, on the same anchored\n * dialog surface as menu and color-picker. It grows out of the trigger\n * (motion/morph.ts container transform) while its content flows in like a\n * menu's options (from 90 % out of a 4 px blur, 40 ms apart), folds back into\n * the trigger on close, closes with Escape, a click outside or any\n * [data-mk-close] inside, and gives the focus back to the trigger. A\n * dialog[data-mk-popover-panel] is used as it is; [data-mk-popover-content] is\n * moved into a dialog the engine creates and put back on destroy.\n */\n\nexport interface PopoverOptions {\n /** Accessible name of the panel (default: the trigger's text). */\n label?: string;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface PopoverInstance extends Instance {\n open(): void;\n close(): void;\n toggle(): void;\n readonly isOpen: boolean;\n /** The panel (a <dialog>). */\n readonly panel: HTMLElement | null;\n}\n\nlet sequence = 0;\n\nexport function createPopover(root: HTMLElement | null, options: PopoverOptions = {}): PopoverInstance {\n const inertInstance = inert<PopoverInstance>({ open() {}, close() {}, toggle() {}, isOpen: false, panel: null });\n if (!root) return inertInstance;\n let dialog = root.querySelector<HTMLDialogElement>('dialog[data-mk-popover-panel]');\n const content = dialog ? null : root.querySelector<HTMLElement>('[data-mk-popover-content]');\n const trigger =\n root.querySelector<HTMLElement>('[data-mk-popover-trigger]') ??\n [...root.querySelectorAll<HTMLElement>('button, a[href], [role=\"button\"]')].find((element) => !dialog?.contains(element) && !content?.contains(element)) ??\n null;\n if (!trigger || (!dialog && !content)) return inertInstance;\n const scope = createScope();\n\n if (!dialog) {\n // The authored content moves into a dialog in its place, and back on destroy.\n const created = document.createElement('dialog');\n const anchor = content!.nextSibling;\n const parent = content!.parentNode!;\n parent.insertBefore(created, content);\n created.append(content!);\n dialog = created;\n scope.add(() => {\n if (content!.isConnected || created.isConnected) parent.insertBefore(content!, created.isConnected ? created : anchor);\n created.remove();\n });\n }\n const panel = dialog;\n // Classes, not only attributes: the copy that folds back into the trigger on close keeps classes only.\n scope.attr(panel, 'class', [panel.getAttribute('class'), 'mk-dialog', 'mk-popover-panel'].filter(Boolean).join(' '));\n if (!panel.id) scope.attr(panel, 'id', `mk-popover-${++sequence}`);\n if (!panel.hasAttribute('aria-label') && !panel.hasAttribute('aria-labelledby')) scope.attr(panel, 'aria-label', options.label ?? trigger.textContent?.trim() ?? 'Panel');\n scope.attr(trigger, 'aria-haspopup', 'dialog');\n scope.attr(trigger, 'aria-expanded', 'false');\n scope.attr(trigger, 'aria-controls', panel.id);\n scope.attr(root, 'data-mk-ready', '');\n\n const announce = (open: boolean) => {\n trigger.setAttribute('aria-expanded', String(open));\n options.onOpenChange?.(open);\n root.dispatchEvent(new CustomEvent('mk:open-change', { bubbles: true, detail: { open } }));\n };\n let flow: ReturnType<typeof flowInMenu> = null;\n const surface = createDialog(panel, {\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n triggers: false,\n animateContent: false,\n // Like a menu's options: the content flows in while the surface grows out of the trigger.\n onOpen: () => {\n flow?.kill();\n flow = flowInMenu([...panel.children].filter((child) => !child.classList.contains('mk-morph-face')));\n announce(true);\n },\n onClose: () => announce(false),\n });\n scope.add(() => {\n flow?.kill();\n surface.destroy();\n });\n\n const open = () => {\n if (!surface.isOpen) surface.open(trigger);\n };\n scope.on(trigger, 'click', (event) => {\n event.preventDefault();\n if (surface.isOpen) surface.close();\n else open();\n });\n\n return {\n open,\n close: () => surface.close(),\n toggle: () => (surface.isOpen ? surface.close() : open()),\n get isOpen() {\n return surface.isOpen;\n },\n panel,\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { press, shake } from '../../motion/micro';\n\n/*\n * Loading button: a button that shows its work. Pressed (or run()), it gives\n * Melon Mind's press, its label blurs out and a spinner draws in while the\n * button glides to its new width (.4 s, swing); success turns it to the\n * success colour with a check that draws itself (.35 s) and pops; error turns\n * it to the error colour, shakes it and draws a cross; after `resetAfter` it\n * glides back to its label. `compact` (default) shows only the icon while\n * working; otherwise the state's text sits beside it. While loading it stays\n * focusable but inert (aria-disabled, aria-busy) and a polite status beside it\n * says what happened. data-mk-state carries the state for CSS.\n */\n\nexport type LoadingState = 'idle' | 'loading' | 'success' | 'error';\n\nexport interface LoadingButtonOptions {\n /** Runs on click; its promise drives the states (resolve → success, reject → error). */\n action?: () => unknown;\n /** Texts for the states (announced; shown beside the icon when not compact). */\n labels?: { loading?: string; success?: string; error?: string };\n /** Icon only while working (default true). */\n compact?: boolean;\n /** ms in success or error before going back to the label (default 1800; 0 stays). */\n resetAfter?: number;\n onStateChange?: (state: LoadingState) => void;\n}\n\nexport interface LoadingButtonInstance extends Instance {\n setState(state: LoadingState): void;\n /** Runs `action` (or the option) and walks the states; resolves true on success. */\n run(action?: () => unknown): Promise<boolean>;\n readonly state: LoadingState;\n}\n\nconst LABELS = { loading: 'Cargando…', success: 'Listo', error: 'Error' };\nconst SVG = 'http://www.w3.org/2000/svg';\nconst ICONS: Record<Exclude<LoadingState, 'idle'>, string> = {\n loading: '<circle cx=\"12\" cy=\"12\" r=\"8.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-dasharray=\"40 14\" data-mk-loading-spinner/>',\n success: '<path d=\"M6 12.5l4 4L18 8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" data-mk-loading-draw/>',\n error: '<path d=\"M7.5 7.5l9 9M16.5 7.5l-9 9\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" data-mk-loading-draw/>',\n};\n\nexport function createLoadingButton(root: HTMLElement | null, options: LoadingButtonOptions = {}): LoadingButtonInstance {\n const button = root ? (root.matches('button') ? root : root.querySelector<HTMLElement>('button')) : null;\n if (!root || !button) return inert({ setState() {}, run: async () => false, state: 'idle' });\n registerMotion();\n const scope = createScope();\n const labels = { ...LABELS, ...options.labels };\n const compact = options.compact !== false;\n const resetAfter = Number.isFinite(options.resetAfter) ? Math.max(0, options.resetAfter!) : 1800;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n\n // The authored content becomes the label (an authored [data-mk-loading-label] is used as it is: React owns its\n // children); the icon and the state's text sit beside it.\n const authored = button.querySelector<HTMLElement>(':scope > [data-mk-loading-label]');\n const label = authored ?? document.createElement('span');\n label.dataset.mkLoadingLabel = '';\n const original = authored ? [] : [...button.childNodes];\n label.append(...original);\n const icon = document.createElement('span');\n icon.dataset.mkLoadingIcon = '';\n icon.setAttribute('aria-hidden', 'true');\n icon.hidden = true;\n const text = document.createElement('span');\n text.dataset.mkLoadingText = '';\n text.setAttribute('aria-hidden', 'true');\n text.hidden = true;\n if (authored) button.prepend(icon, text);\n else button.append(icon, text, label);\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.dataset.mkLoadingStatus = '';\n status.setAttribute('role', 'status');\n button.after(status);\n scope.add(() => {\n gsap.killTweensOf([button, label, icon, text]);\n status.remove();\n icon.remove();\n text.remove();\n if (authored) {\n label.hidden = false;\n return;\n }\n label.remove();\n button.append(...original);\n });\n scope.attr(button, 'style', button.getAttribute('style'));\n scope.attr(button, 'data-mk-state', 'idle');\n scope.attr(button, 'aria-busy', null);\n scope.attr(button, 'aria-disabled', button.getAttribute('aria-disabled'));\n scope.attr(root, 'data-mk-ready', '');\n\n let state: LoadingState = 'idle';\n let timer: ReturnType<typeof setTimeout> | undefined;\n scope.add(() => clearTimeout(timer));\n\n const drawIcon = (next: Exclude<LoadingState, 'idle'>) => {\n const svg = document.createElementNS(SVG, 'svg');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('width', '20');\n svg.setAttribute('height', '20');\n svg.innerHTML = ICONS[next];\n icon.replaceChildren(svg);\n if (reduced()) return;\n keep(gsap.fromTo(icon, { scale: 0.6, opacity: 0, filter: 'blur(4px)' }, { scale: 1, opacity: 1, filter: 'blur(0px)', duration: 0.3, ease: EASE.pop, clearProps: 'scale,opacity,filter,transform' }));\n const path = svg.querySelector<SVGGeometryElement>('[data-mk-loading-draw]');\n if (path) {\n const length = typeof path.getTotalLength === 'function' ? path.getTotalLength() || 20 : 20;\n keep(gsap.fromTo(path, { strokeDasharray: length, strokeDashoffset: length }, { strokeDashoffset: 0, duration: 0.35, delay: 0.05, ease: EASE.wipe }));\n }\n };\n\n const setState = (next: LoadingState) => {\n if (scope.disposed || next === state) return;\n clearTimeout(timer);\n const from = button.offsetWidth;\n state = next;\n button.setAttribute('data-mk-state', next);\n if (next === 'loading') {\n button.setAttribute('aria-busy', 'true');\n button.setAttribute('aria-disabled', 'true');\n } else {\n button.removeAttribute('aria-busy');\n button.removeAttribute('aria-disabled');\n }\n status.textContent = next === 'idle' ? '' : labels[next];\n const working = next !== 'idle';\n // Content: the label for idle; the icon (and the state's text unless compact) otherwise.\n label.hidden = working;\n icon.hidden = !working;\n text.hidden = !working || compact;\n text.textContent = working ? labels[next] : '';\n if (working) drawIcon(next);\n else icon.replaceChildren();\n // The width glides from the old content's to the new one's.\n if (!reduced() && from > 0) {\n gsap.killTweensOf(button, 'width');\n button.style.width = '';\n const to = button.offsetWidth;\n if (Math.abs(to - from) > 1) keep(gsap.fromTo(button, { width: from }, { width: to, duration: 0.4, ease: EASE.swatch, clearProps: 'width' }));\n const entering = working ? (compact ? [icon] : [icon, text]) : [label];\n keep(gsap.fromTo(entering.filter((part) => part !== icon), { opacity: 0, filter: 'blur(6px)', y: 4 }, { opacity: 1, filter: 'blur(0px)', y: 0, duration: 0.25, ease: 'power2.out', clearProps: 'opacity,filter,transform' }));\n }\n if (next === 'error') keep(shake(button));\n if (next === 'success' || next === 'error') {\n if (resetAfter) timer = setTimeout(() => setState('idle'), resetAfter);\n }\n options.onStateChange?.(next);\n root.dispatchEvent(new CustomEvent('mk:state-change', { bubbles: true, detail: { state: next } }));\n };\n\n const run = async (action = options.action) => {\n if (state === 'loading' || scope.disposed) return false;\n setState('loading');\n try {\n await action?.();\n if (scope.disposed) return true;\n setState('success');\n return true;\n } catch {\n if (scope.disposed) return false;\n setState('error');\n return false;\n }\n };\n\n scope.on(button, 'click', (event) => {\n if (state === 'loading') {\n // Inert while working, but still focusable (aria-disabled, not disabled).\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n keep(press(button));\n if (options.action) void run();\n });\n\n return {\n setState,\n run,\n get state() {\n return state;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, Flip, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, type Instance } from '../../core/types';\n\n/*\n * Breadcrumb: the path to the current page as an ordered list in a\n * <nav aria-label>; the last item is the page itself (aria-current=\"page\").\n * When the items do not fit (or pass maxItems) the middle ones fold into a\n * \"…\" button; pressing it shows them in place, flowing in from the left\n * (blur 16 → 0, 40 ms apart) while the rest glides to make room. setItems()\n * keeps the shared start of the path: the items that stay glide to their new\n * place (layout reflow), new ones grow in, and the old current page turns into\n * a link. Links underline from the left on hover; activating one emits a\n * cancelable mk:navigate (onNavigate) before the browser follows it.\n */\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbOptions {\n /** The path; without it, the authored <ol> or <a>/<span> children are read. */\n items?: BreadcrumbItem[];\n /** Accessible name of the navigation (default 'Ruta de navegación'). */\n label?: string;\n /** 'auto' (default) folds the middle when it does not fit; a number keeps at most that many items. */\n maxItems?: number | 'auto';\n /** Called before following a link; event.preventDefault() keeps the browser where it is (SPA routing). */\n onNavigate?: (item: BreadcrumbItem, index: number, event: Event) => void;\n}\n\nexport interface BreadcrumbInstance extends Instance {\n setItems(items: BreadcrumbItem[]): void;\n readonly items: BreadcrumbItem[];\n}\n\nconst readAuthored = (root: HTMLElement): BreadcrumbItem[] =>\n [...root.querySelectorAll<HTMLElement>('li, :scope > a, :scope > span')]\n .map((element) => {\n const link = element.matches('a') ? (element as HTMLAnchorElement) : element.querySelector<HTMLAnchorElement>('a');\n return { label: (link ?? element).textContent?.trim() ?? '', href: link?.getAttribute('href') ?? undefined };\n })\n .filter((item) => item.label);\n\n/** A crumb is the same one at the same place with the same label (a current page that turns into a link stays). */\nconst key = (item: BreadcrumbItem, index: number) => `${index}:${item.label}`;\n\nexport function createBreadcrumb(root: HTMLElement | null, options: BreadcrumbOptions = {}): BreadcrumbInstance {\n if (!root) return inert({ setItems() {}, items: [] });\n registerMotion();\n const scope = createScope();\n let items = (options.items ?? readAuthored(root)).map((item) => ({ ...item }));\n const maxItems = typeof options.maxItems === 'number' && options.maxItems >= 2 ? Math.floor(options.maxItems) : 'auto';\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n // Authored markup stays in the DOM but out of sight; the engine draws its own list.\n const authored = [...root.childNodes];\n const holder = document.createElement('div');\n holder.hidden = true;\n holder.append(...authored);\n const nav = document.createElement('nav');\n nav.dataset.mkBreadcrumbNav = '';\n nav.setAttribute('aria-label', options.label ?? 'Ruta de navegación');\n const list = document.createElement('ol');\n list.dataset.mkBreadcrumbList = '';\n nav.append(list);\n root.append(nav);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n nav.remove();\n root.append(...holder.childNodes);\n });\n scope.attr(root, 'data-mk-ready', '');\n\n /**\n * The items that stay glide to their new place (layout reflow spring); the new ones come in from the side of\n * travel out of a blur (from the left when the folded middle opens, from the right when the path grows).\n */\n const reflow = (change: () => void, from: 'left' | 'right') => {\n const crumbs = () => [...list.querySelectorAll<HTMLElement>('[data-mk-crumb]')];\n if (reduced()) return change();\n const state = Flip.getState(crumbs());\n change();\n keep(\n Flip.from(state, {\n targets: crumbs(),\n duration: TIMING.layoutTravel,\n ease: EASE.layoutReflow,\n onEnter: (entering) =>\n gsap.fromTo(\n entering,\n { opacity: 0, x: from === 'left' ? -12 : 12, filter: 'blur(8px)' },\n { opacity: 1, x: 0, filter: 'blur(0px)', duration: 0.35, stagger: 0.04, ease: 'power2.out', clearProps: 'opacity,transform,filter' },\n ),\n }),\n );\n };\n\n /** Fold the middle when collapsed: which indexes are hidden. */\n let expanded = false;\n let hidden: number[] = [];\n\n const crumb = (item: BreadcrumbItem, index: number) => {\n const li = document.createElement('li');\n li.dataset.mkCrumb = '';\n li.dataset.flipId = key(item, index);\n const last = index === items.length - 1;\n if (last) {\n const span = document.createElement('span');\n span.dataset.mkCrumbCurrent = '';\n span.setAttribute('aria-current', 'page');\n span.textContent = item.label;\n li.append(span);\n } else if (item.href !== undefined) {\n const link = document.createElement('a');\n link.dataset.mkCrumbLink = '';\n link.href = item.href;\n link.dataset.mkIndex = String(index);\n link.textContent = item.label;\n li.append(link);\n } else {\n const span = document.createElement('span');\n span.dataset.mkCrumbText = '';\n span.textContent = item.label;\n li.append(span);\n }\n return li;\n };\n\n const more = () => {\n const li = document.createElement('li');\n li.dataset.mkCrumb = '';\n li.dataset.flipId = 'more';\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkCrumbMore = '';\n button.setAttribute('aria-expanded', 'false');\n button.setAttribute('aria-label', hidden.length === 1 ? 'Mostrar 1 nivel oculto' : `Mostrar ${hidden.length} niveles ocultos`);\n button.textContent = '…';\n li.append(button);\n return li;\n };\n\n const render = () => {\n const nodes: HTMLElement[] = [];\n items.forEach((item, index) => {\n if (hidden.includes(index)) {\n if (index === hidden[0]) nodes.push(more());\n return;\n }\n nodes.push(crumb(item, index));\n });\n list.replaceChildren(...nodes);\n nav.toggleAttribute('data-mk-expanded', expanded);\n };\n\n /** The middle indexes to fold, keeping the first item and the last `keepEnd`. */\n const fold = (keepEnd: number) => {\n const end = Math.max(1, items.length - keepEnd);\n return Array.from({ length: Math.max(0, end - 1) }, (_, i) => i + 1);\n };\n\n const fits = () => list.scrollWidth <= list.clientWidth + 1;\n\n const layout = () => {\n if (expanded || items.length <= 2) {\n hidden = [];\n render();\n return;\n }\n if (maxItems !== 'auto') {\n hidden = items.length > maxItems ? fold(maxItems - 1) : [];\n render();\n return;\n }\n // Fold from the middle until the row fits with the current page whole (jsdom has no layout: it always fits);\n // only when even the shortest fold is too long does the current page ellipsize.\n nav.setAttribute('data-mk-measuring', '');\n hidden = [];\n render();\n for (let keepEnd = items.length - 2; keepEnd >= 1 && !fits(); keepEnd--) {\n hidden = fold(keepEnd);\n render();\n }\n nav.removeAttribute('data-mk-measuring');\n };\n\n scope.on(list, 'click', (event) => {\n const target = event.target as Element | null;\n if (target?.closest('[data-mk-crumb-more]')) {\n const shown = hidden.map((index) => key(items[index]!, index));\n reflow(() => {\n expanded = true;\n hidden = [];\n render();\n }, 'left');\n // The button is gone: the focus moves to the first level it revealed.\n const first = [...list.querySelectorAll<HTMLElement>('[data-mk-crumb]')].find((li) => shown.includes(li.dataset.flipId ?? ''));\n first?.querySelector<HTMLElement>('a')?.focus();\n return;\n }\n const link = target?.closest<HTMLAnchorElement>('a[data-mk-crumb-link]');\n if (!link) return;\n const index = Number(link.dataset.mkIndex);\n const item = items[index]!;\n options.onNavigate?.(item, index, event);\n const navigate = new CustomEvent('mk:navigate', { bubbles: true, cancelable: true, detail: { item, index } });\n if (!root.dispatchEvent(navigate)) event.preventDefault();\n });\n\n if (typeof ResizeObserver === 'function') {\n let width = 0;\n scope.observe(\n new ResizeObserver(() => {\n const next = nav.clientWidth;\n if (Math.abs(next - width) < 1) return;\n width = next;\n if (!expanded) layout();\n }),\n ).observe(nav);\n }\n\n layout();\n\n return {\n setItems(next) {\n if (scope.disposed) return;\n reflow(() => {\n items = next.map((item) => ({ ...item }));\n expanded = false;\n layout();\n }, 'right');\n },\n get items() {\n return items.map((item) => ({ ...item }));\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { press } from '../../motion/micro';\n\n/*\n * Empty state: an illustration, a title, a line of help and actions for a\n * place with nothing in it yet (no results, an empty inbox, an error). The\n * illustrations are inline SVG on the theme's colours. When it scrolls into\n * view the illustration pops in (scale .85, blur 12 → 0, .6 s, pop curve) and\n * the text and actions flow in after it (12 px, blur 8, 60 ms apart); then a\n * gentle idle motion runs (the envelope floats, the magnifier circles, the page\n * peeks out of the folder, the warning breathes, the sparkles twinkle), paused\n * while it is off screen. update() swaps the content with a blur cross-fade.\n * Authored content is kept; the illustration is added before it.\n */\n\nexport type EmptyIllustration = 'inbox' | 'search' | 'folder' | 'error' | 'success' | 'none';\n\nexport interface EmptyAction {\n id: string;\n label: string;\n /** primary (default for the first) or secondary. */\n variant?: 'primary' | 'secondary';\n /** A link instead of a button. */\n href?: string;\n}\n\nexport interface EmptyStateOptions {\n illustration?: EmptyIllustration;\n title?: string;\n description?: string;\n actions?: EmptyAction[];\n /** The illustration's idle motion (default true). */\n loop?: boolean;\n onAction?: (id: string, event: MouseEvent) => void;\n}\n\nexport interface EmptyStateInstance extends Instance {\n update(next: Pick<EmptyStateOptions, 'illustration' | 'title' | 'description' | 'actions'>): void;\n}\n\nconst INK = 'stroke=\"var(--mk-empty-ink)\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"';\n\nconst ART: Record<Exclude<EmptyIllustration, 'none'>, string> = {\n inbox: `<ellipse data-mk-part=\"shadow\" cx=\"80\" cy=\"108\" rx=\"40\" ry=\"5\" fill=\"var(--mk-empty-shadow)\"/>\n<path d=\"M36 66h22l6 10h32l6-10h22v24a8 8 0 0 1-8 8H44a8 8 0 0 1-8-8z\" fill=\"var(--mk-empty-fill)\" ${INK}/>\n<g data-mk-part=\"float\"><rect x=\"55\" y=\"22\" width=\"50\" height=\"36\" rx=\"7\" fill=\"var(--mk-empty-card)\" ${INK}/><path d=\"M58 27l22 16 22-16\" fill=\"none\" stroke=\"var(--mk-empty-accent)\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g>\n<g data-mk-part=\"twinkle\" fill=\"var(--mk-empty-accent)\"><path d=\"M122 20l2 5 5 2-5 2-2 5-2-5-5-2 5-2z\"/><circle cx=\"38\" cy=\"40\" r=\"3\"/><circle cx=\"128\" cy=\"52\" r=\"2\"/></g>`,\n search: `<ellipse data-mk-part=\"shadow\" cx=\"80\" cy=\"108\" rx=\"40\" ry=\"5\" fill=\"var(--mk-empty-shadow)\"/>\n<rect x=\"44\" y=\"18\" width=\"62\" height=\"80\" rx=\"9\" fill=\"var(--mk-empty-card)\" ${INK}/>\n<path d=\"M56 36h38M56 48h30M56 60h34M56 72h22\" fill=\"none\" stroke=\"var(--mk-empty-fill-ink)\" stroke-width=\"4\" stroke-linecap=\"round\"/>\n<g data-mk-part=\"orbit\"><circle cx=\"100\" cy=\"66\" r=\"15\" fill=\"var(--mk-empty-soft)\" ${INK}/><path d=\"M111 77l13 13\" fill=\"none\" ${INK} stroke-width=\"5\"/></g>\n<g data-mk-part=\"twinkle\" fill=\"var(--mk-empty-accent)\"><path d=\"M30 30l2 5 5 2-5 2-2 5-2-5-5-2 5-2z\"/><circle cx=\"130\" cy=\"34\" r=\"2.5\"/></g>`,\n folder: `<ellipse data-mk-part=\"shadow\" cx=\"80\" cy=\"108\" rx=\"44\" ry=\"5\" fill=\"var(--mk-empty-shadow)\"/>\n<path d=\"M34 40a8 8 0 0 1 8-8h22l8 8h46a8 8 0 0 1 8 8v42a8 8 0 0 1-8 8H42a8 8 0 0 1-8-8z\" fill=\"var(--mk-empty-fill)\" ${INK}/>\n<g data-mk-part=\"peek\"><rect x=\"52\" y=\"30\" width=\"56\" height=\"44\" rx=\"5\" fill=\"var(--mk-empty-card)\" ${INK}/><path d=\"M62 44h30M62 54h20\" fill=\"none\" stroke=\"var(--mk-empty-accent)\" stroke-width=\"3\" stroke-linecap=\"round\"/></g>\n<path d=\"M34 58h92v32a8 8 0 0 1-8 8H42a8 8 0 0 1-8-8z\" fill=\"var(--mk-empty-soft)\" ${INK}/>\n<g data-mk-part=\"twinkle\" fill=\"var(--mk-empty-accent)\"><path d=\"M130 24l2 5 5 2-5 2-2 5-2-5-5-2 5-2z\"/><circle cx=\"28\" cy=\"30\" r=\"2.5\"/></g>`,\n error: `<ellipse data-mk-part=\"shadow\" cx=\"80\" cy=\"108\" rx=\"40\" ry=\"5\" fill=\"var(--mk-empty-shadow)\"/>\n<path d=\"M50 30h40l18 18v42a8 8 0 0 1-8 8H50a8 8 0 0 1-8-8V38a8 8 0 0 1 8-8z\" fill=\"var(--mk-empty-card)\" ${INK}/>\n<path d=\"M90 30v12a6 6 0 0 0 6 6h12\" fill=\"none\" ${INK}/>\n<g data-mk-part=\"pulse\"><circle cx=\"76\" cy=\"70\" r=\"16\" fill=\"var(--mk-empty-alert-soft)\" stroke=\"var(--mk-empty-alert)\" stroke-width=\"2.5\"/><path d=\"M76 62v9M76 78v.5\" fill=\"none\" stroke=\"var(--mk-empty-alert)\" stroke-width=\"3.5\" stroke-linecap=\"round\"/></g>`,\n success: `<ellipse data-mk-part=\"shadow\" cx=\"80\" cy=\"108\" rx=\"36\" ry=\"5\" fill=\"var(--mk-empty-shadow)\"/>\n<circle cx=\"80\" cy=\"60\" r=\"34\" fill=\"var(--mk-empty-soft)\" ${INK}/>\n<path data-mk-part=\"draw\" d=\"M64 61l11 11 22-24\" fill=\"none\" stroke=\"var(--mk-empty-accent)\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n<g data-mk-part=\"twinkle\" fill=\"var(--mk-empty-accent)\"><path d=\"M126 26l2 5 5 2-5 2-2 5-2-5-5-2 5-2z\"/><circle cx=\"34\" cy=\"34\" r=\"3\"/><circle cx=\"130\" cy=\"84\" r=\"2.5\"/><path d=\"M30 80l1.5 3.5 3.5 1.5-3.5 1.5-1.5 3.5-1.5-3.5-3.5-1.5 3.5-1.5z\"/></g>`,\n};\n\n/** The idle motion of each moving part; repeat forever, back and forth. */\nfunction idle(svg: SVGSVGElement) {\n const timeline = gsap.timeline({ repeat: -1, yoyo: true, defaults: { ease: 'sine.inOut' } });\n const part = (name: string) => svg.querySelector<SVGGElement>(`[data-mk-part=\"${name}\"]`);\n const float = part('float');\n if (float) timeline.to(float, { y: -6, duration: 1.8 }, 0).to(part('shadow'), { scaleX: 0.86, transformOrigin: '50% 50%', duration: 1.8 }, 0);\n const orbit = part('orbit');\n if (orbit) timeline.to(orbit, { keyframes: { x: [0, -8, -4, 0], y: [0, -4, -10, 0] }, duration: 3.2, ease: 'sine.inOut' }, 0);\n const peek = part('peek');\n if (peek) timeline.to(peek, { y: -7, duration: 1.6 }, 0);\n const pulse = part('pulse');\n if (pulse) timeline.to(pulse, { scale: 1.07, transformOrigin: '50% 50%', duration: 1.1 }, 0);\n const twinkle = part('twinkle');\n if (twinkle) timeline.to(twinkle.children, { opacity: 0.25, scale: 0.7, transformOrigin: '50% 50%', duration: 0.9, stagger: 0.3 }, 0);\n return timeline;\n}\n\nexport function createEmptyState(root: HTMLElement | null, options: EmptyStateOptions = {}): EmptyStateInstance {\n if (!root) return inert({ update() {} });\n registerMotion();\n const scope = createScope();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n let loop: gsap.core.Timeline | null = null;\n scope.add(() => {\n loop?.kill();\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n scope.attr(root, 'role', root.getAttribute('role') ?? 'status');\n scope.attr(root, 'data-mk-ready', '');\n\n const authored = root.childNodes.length > 0 && !options.title && !options.description;\n // The entrance writes inline styles: authored children get theirs back on destroy.\n for (const child of root.children) scope.attr(child, 'style', child.getAttribute('style'));\n const made: Element[] = [];\n scope.add(() => made.forEach((node) => node.remove()));\n\n const art = document.createElement('div');\n art.dataset.mkEmptyIllustration = '';\n art.setAttribute('aria-hidden', 'true');\n root.prepend(art);\n made.push(art);\n const drawArt = (name: EmptyIllustration | undefined) => {\n loop?.kill();\n loop = null;\n const kind = name ?? 'inbox';\n art.hidden = kind === 'none';\n if (kind === 'none') return art.replaceChildren();\n art.innerHTML = `<svg viewBox=\"0 0 160 120\" width=\"160\" height=\"120\">${ART[kind]}</svg>`;\n };\n\n // Built content (or the authored one, kept as it is).\n const title = document.createElement('h3');\n title.dataset.mkEmptyTitle = '';\n const description = document.createElement('p');\n description.dataset.mkEmptyDescription = '';\n const actions = document.createElement('div');\n actions.dataset.mkEmptyActions = '';\n const fill = (next: Pick<EmptyStateOptions, 'title' | 'description' | 'actions'>) => {\n title.textContent = next.title ?? '';\n title.hidden = !next.title;\n description.textContent = next.description ?? '';\n description.hidden = !next.description;\n actions.replaceChildren(\n ...(next.actions ?? []).map((action, i) => {\n const element = document.createElement(action.href ? 'a' : 'button');\n if (element instanceof HTMLAnchorElement) element.href = action.href!;\n else element.type = 'button';\n const variant = action.variant ?? (i === 0 ? 'primary' : 'secondary');\n element.className = `mk-button ${variant === 'primary' ? 'mk-button--primary' : 'mk-button--tonal'}`;\n element.dataset.mkAction = action.id;\n element.textContent = action.label;\n return element;\n }),\n );\n actions.hidden = !next.actions?.length;\n };\n if (!authored) {\n root.append(title, description, actions);\n made.push(title, description, actions);\n fill(options);\n }\n drawArt(options.illustration);\n\n const parts = () => [...root.children].filter((child) => child !== art && !(child as HTMLElement).hidden) as HTMLElement[];\n\n const startLoop = () => {\n const svg = art.querySelector('svg');\n if (!svg || options.loop === false || reduced() || loop) return;\n loop = idle(svg);\n };\n\n /** The entrance: illustration first, then the text and the actions. */\n const enter = () => {\n const svg = art.querySelector('svg');\n if (reduced()) return;\n if (svg) {\n keep(gsap.fromTo(art, { opacity: 0, scale: 0.85, filter: 'blur(12px)' }, { opacity: 1, scale: 1, filter: 'blur(0px)', duration: 0.6, ease: EASE.pop, clearProps: 'opacity,transform,filter' }));\n const draw = svg.querySelector<SVGGeometryElement>('[data-mk-part=\"draw\"]');\n if (draw) keep(gsap.fromTo(draw, { strokeDasharray: 60, strokeDashoffset: 60 }, { strokeDashoffset: 0, duration: 0.5, delay: 0.3, ease: EASE.wipe }));\n }\n keep(gsap.fromTo(parts(), { opacity: 0, y: 12, filter: 'blur(8px)' }, { opacity: 1, y: 0, filter: 'blur(0px)', duration: 0.45, delay: svg ? 0.15 : 0, stagger: 0.06, ease: 'power2.out', clearProps: 'opacity,transform,filter' }));\n };\n\n let entered = false;\n let visible = true;\n if (typeof IntersectionObserver === 'function') {\n // Before it is seen, everything waits hidden; afterwards the loop only runs on screen.\n if (!reduced()) gsap.set([art, ...parts()], { opacity: 0 });\n scope.observe(\n new IntersectionObserver((entries) => {\n visible = entries.some((entry) => entry.isIntersecting);\n if (visible && !entered) {\n entered = true;\n enter();\n startLoop();\n }\n if (visible) loop?.play();\n else loop?.pause();\n }),\n ).observe(root);\n } else {\n entered = true;\n enter();\n startLoop();\n }\n\n scope.on(root, 'click', (event) => {\n const action = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-action]');\n if (!action || !root.contains(action)) return;\n keep(press(action));\n options.onAction?.(action.dataset.mkAction!, event as MouseEvent);\n root.dispatchEvent(new CustomEvent('mk:action', { bubbles: true, detail: { id: action.dataset.mkAction } }));\n });\n\n return {\n update(next) {\n if (scope.disposed) return;\n const swap = () => {\n if (next.illustration !== undefined) {\n options = { ...options, illustration: next.illustration };\n drawArt(next.illustration);\n }\n if (!authored) fill({ title: next.title ?? options.title, description: next.description ?? options.description, actions: next.actions ?? options.actions });\n options = { ...options, ...next };\n if (entered) {\n enter();\n if (visible) startLoop();\n }\n };\n if (reduced() || !entered) return swap();\n keep(gsap.to([art, ...parts()], { opacity: 0, filter: 'blur(8px)', duration: 0.15, ease: 'power1.in', onComplete: swap }));\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { countTo } from '../../motion/count';\nimport { rollDigits } from '../../motion/micro';\n\n/*\n * Stat card: a KPI with its trend. The figure (Intl format of the page: money,\n * percent, compact) counts up when the card comes into view (.9 s, flow); the\n * change from `previous` sits in a badge (▲ / ▼ and the percentage, green when\n * it moves the good way — `positive` says which — red when not, neutral when\n * flat) that pops in after it while its arrow nudges; a sparkline of `series`\n * draws itself (.9 s, wipe) with a soft area and an end dot that pops; a\n * `target` fills a bar. update() counts from the shown figure to the new one,\n * rolls the badge's digits, turns the arrow when the trend flips and morphs the\n * sparkline to the new points. The visual figure is aria-hidden: a sentence\n * with the final values speaks for it.\n */\n\nexport interface StatCardOptions {\n label?: string;\n value?: number;\n /** The value it is compared with (the previous period). */\n previous?: number;\n /** Intl.NumberFormat options (e.g. { style: 'currency', currency: 'MXN' }) or a formatter. */\n format?: Intl.NumberFormatOptions | ((value: number) => string);\n /** Locale for the numbers (default: the page's language). */\n locale?: string;\n /** Which way is good (default 'up'; 'down' for costs, churn, latency). */\n positive?: 'up' | 'down';\n /** What the change compares with (default 'vs. periodo anterior'). */\n comparison?: string;\n /** Values for the sparkline (two or more). */\n series?: number[];\n /** A goal: a bar shows how far the value is. */\n target?: number;\n /** Count when it comes into view (default true); false shows the figure at once. */\n countOnView?: boolean;\n}\n\nexport interface StatCardInstance extends Instance {\n update(next: Omit<StatCardOptions, 'countOnView' | 'locale'>): void;\n}\n\ntype Trend = 'up' | 'down' | 'flat';\nconst SVG = 'http://www.w3.org/2000/svg';\nconst ARROW = '<svg aria-hidden=\"true\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 19V5M6 11l6-6 6 6\"/></svg>';\n\n/** Sparkline points in a 100 × 32 box (2 px of air top and bottom). */\nconst pointsOf = (series: number[]) => {\n const lo = Math.min(...series);\n const hi = Math.max(...series);\n const span = hi - lo || 1;\n return series.map((value, i) => [series.length === 1 ? 50 : (i / (series.length - 1)) * 100, 30 - ((value - lo) / span) * 28] as [number, number]);\n};\nconst pathOf = (points: Array<[number, number]>) => `M${points.map(([x, y]) => `${x.toFixed(2)},${y.toFixed(2)}`).join('L')}`;\n\nexport function createStatCard(root: HTMLElement | null, initial: StatCardOptions = {}): StatCardInstance {\n if (!root) return inert({ update() {} });\n registerMotion();\n const scope = createScope();\n let options: StatCardOptions = { ...initial };\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? undefined;\n const formatter = () => {\n if (typeof options.format === 'function') return options.format;\n let intl: Intl.NumberFormat;\n try {\n intl = new Intl.NumberFormat(locale, { maximumFractionDigits: 1, ...options.format });\n } catch {\n intl = new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 });\n }\n return (value: number) => intl.format(value);\n };\n const percent = new Intl.NumberFormat(locale, { maximumFractionDigits: 1, minimumFractionDigits: 1 });\n\n const el = <K extends keyof HTMLElementTagNameMap>(tag: K, attribute: string) => {\n const element = document.createElement(tag);\n element.setAttribute(attribute, '');\n return element;\n };\n const labelEl = el('span', 'data-mk-stat-label');\n const row = el('div', 'data-mk-stat-row');\n const valueEl = el('strong', 'data-mk-stat-value');\n valueEl.setAttribute('aria-hidden', 'true');\n const badge = el('span', 'data-mk-stat-delta');\n badge.setAttribute('aria-hidden', 'true');\n const arrow = el('span', 'data-mk-stat-arrow');\n arrow.innerHTML = ARROW;\n const deltaText = el('span', 'data-mk-stat-delta-text');\n badge.append(arrow, deltaText);\n row.append(valueEl, badge);\n const comparisonEl = el('p', 'data-mk-stat-comparison');\n comparisonEl.setAttribute('aria-hidden', 'true');\n const sparkHost = el('div', 'data-mk-stat-spark');\n sparkHost.setAttribute('aria-hidden', 'true');\n const svg = document.createElementNS(SVG, 'svg');\n svg.setAttribute('viewBox', '0 0 100 32');\n svg.setAttribute('preserveAspectRatio', 'none');\n const area = document.createElementNS(SVG, 'path');\n area.setAttribute('data-mk-stat-area', '');\n const line = document.createElementNS(SVG, 'path');\n line.setAttribute('data-mk-stat-line', '');\n line.setAttribute('vector-effect', 'non-scaling-stroke');\n line.setAttribute('pathLength', '1');\n svg.append(area, line);\n const dot = el('span', 'data-mk-stat-dot');\n sparkHost.append(svg, dot);\n const target = el('div', 'data-mk-stat-target');\n const targetBar = el('span', 'data-mk-stat-target-bar');\n const targetFill = el('span', 'data-mk-stat-target-fill');\n targetBar.append(targetFill);\n const targetText = el('span', 'data-mk-stat-target-text');\n target.append(targetBar, targetText);\n const summary = el('span', 'data-mk-stat-summary');\n summary.className = 'mk-sr-only';\n root.append(labelEl, row, comparisonEl, sparkHost, target, summary);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([valueEl, badge, arrow, line, area, dot, targetFill]);\n for (const part of [labelEl, row, comparisonEl, sparkHost, target, summary]) part.remove();\n });\n scope.attr(root, 'role', 'group');\n scope.attr(root, 'aria-label', options.label ?? null);\n scope.attr(root, 'data-mk-trend', null);\n scope.attr(root, 'data-mk-good', null);\n scope.attr(root, 'data-mk-ready', '');\n\n const trendOf = (): { trend: Trend; change: number | null } => {\n const { value, previous } = options;\n if (typeof value !== 'number' || typeof previous !== 'number' || !Number.isFinite(value) || !Number.isFinite(previous) || previous === 0) return { trend: 'flat', change: null };\n const change = ((value - previous) / Math.abs(previous)) * 100;\n return { trend: Math.abs(change) < 0.05 ? 'flat' : change > 0 ? 'up' : 'down', change };\n };\n\n let shownPoints: Array<[number, number]> | null = null;\n const drawSpark = (points: Array<[number, number]>) => {\n line.setAttribute('d', pathOf(points));\n area.setAttribute('d', `${pathOf(points)}L100,32L0,32Z`);\n const [x, y] = points[points.length - 1]!;\n dot.style.left = `${x}%`;\n dot.style.top = `${(y / 32) * 100}%`;\n };\n\n /** Write everything but the figure; `animate` runs the update motion. */\n const paint = (animate: boolean, previousTrend: Trend | null) => {\n const format = formatter();\n labelEl.textContent = options.label ?? '';\n labelEl.hidden = !options.label;\n if (options.label) root.setAttribute('aria-label', options.label);\n else root.removeAttribute('aria-label');\n const { trend, change } = trendOf();\n const good = trend === 'flat' ? 'neutral' : (trend === 'up') === ((options.positive ?? 'up') === 'up') ? 'good' : 'bad';\n root.setAttribute('data-mk-trend', trend);\n root.setAttribute('data-mk-good', good);\n badge.hidden = change === null;\n const text = change === null ? '' : `${trend === 'flat' ? '' : trend === 'up' ? '+' : '−'}${percent.format(Math.abs(change))} %`;\n if (animate && !reduced() && deltaText.textContent && deltaText.textContent !== text) keep(rollDigits(deltaText, text, trend === 'down' ? -1 : 1, 0.3));\n else deltaText.textContent = text;\n if (animate && previousTrend && previousTrend !== trend && !reduced()) keep(gsap.fromTo(arrow, { scale: 0.6 }, { scale: 1, duration: 0.35, ease: EASE.click, clearProps: 'scale' }));\n const comparison = options.comparison ?? 'vs. periodo anterior';\n comparisonEl.textContent = typeof options.previous === 'number' ? `${comparison} (${format(options.previous)})` : '';\n comparisonEl.hidden = typeof options.previous !== 'number';\n // Sparkline: draw, or morph from the shown points.\n const series = (options.series ?? []).filter((value) => Number.isFinite(value));\n sparkHost.hidden = series.length < 2;\n if (series.length >= 2) {\n const next = pointsOf(series);\n if (animate && shownPoints && shownPoints.length === next.length && !reduced()) {\n const from = shownPoints.map((point) => [...point]) as Array<[number, number]>;\n const state = { t: 0 };\n keep(\n gsap.to(state, {\n t: 1,\n duration: 0.6,\n ease: EASE.swatch,\n onUpdate: () => drawSpark(from.map(([x, y], i) => [x + (next[i]![0] - x) * state.t, y + (next[i]![1] - y) * state.t])),\n }),\n );\n } else drawSpark(next);\n shownPoints = next;\n } else shownPoints = null;\n // Target bar.\n const goal = options.target;\n const hasTarget = typeof goal === 'number' && goal > 0 && typeof options.value === 'number';\n target.hidden = !hasTarget;\n if (hasTarget) {\n const ratio = Math.max(0, Math.min(1, options.value! / goal!));\n targetText.textContent = `${percent.format(ratio * 100)} % de la meta (${format(goal!)})`;\n if (animate && !reduced()) keep(gsap.to(targetFill, { scaleX: ratio, duration: 0.6, ease: EASE.wipe }));\n else gsap.set(targetFill, { scaleX: ratio });\n }\n // The sentence that speaks for the figure.\n const value = typeof options.value === 'number' ? format(options.value) : '—';\n const said = change === null ? '' : trend === 'flat' ? ` Sin cambio ${comparison}.` : ` ${trend === 'up' ? 'Sube' : 'Baja'} ${percent.format(Math.abs(change))} % ${comparison}.`;\n summary.textContent = `${options.label ? `${options.label}: ` : ''}${value}.${said}`;\n };\n\n /** The figure: counted (from `from`) or written. */\n const figure = (from: number | null) => {\n const value = options.value;\n if (typeof value !== 'number') {\n valueEl.textContent = '—';\n return;\n }\n if (from === null || reduced()) {\n countTo(valueEl, value, { from: value, format: formatter() });\n return;\n }\n keep(countTo(valueEl, value, { from, duration: 0.9, format: formatter() }));\n };\n\n /** The first appearance: figure counts, badge pops, sparkline draws, target fills. */\n const enter = () => {\n paint(false, null);\n if (reduced() || options.countOnView === false) {\n figure(null);\n return;\n }\n figure(0);\n if (!badge.hidden) {\n keep(gsap.fromTo(badge, { opacity: 0, scale: 0.6, filter: 'blur(4px)' }, { opacity: 1, scale: 1, filter: 'blur(0px)', duration: 0.35, delay: 0.45, ease: EASE.pop, clearProps: 'opacity,transform,filter' }));\n keep(gsap.fromTo(arrow, { y: root.dataset.mkTrend === 'down' ? -4 : 4 }, { y: 0, duration: 0.45, delay: 0.6, ease: EASE.click, clearProps: 'transform' }));\n }\n if (!sparkHost.hidden) {\n keep(gsap.fromTo(line, { strokeDasharray: 1, strokeDashoffset: 1 }, { strokeDashoffset: 0, duration: 0.9, ease: EASE.wipe, clearProps: 'strokeDasharray,strokeDashoffset' }));\n keep(gsap.fromTo(area, { opacity: 0 }, { opacity: 1, duration: 0.5, delay: 0.4, ease: 'power1.out', clearProps: 'opacity' }));\n keep(gsap.fromTo(dot, { scale: 0 }, { scale: 1, duration: 0.3, delay: 0.85, ease: EASE.pop, clearProps: 'scale' }));\n }\n if (!target.hidden) {\n const ratio = gsap.getProperty(targetFill, 'scaleX') as number;\n keep(gsap.fromTo(targetFill, { scaleX: 0 }, { scaleX: ratio, duration: 0.8, delay: 0.2, ease: EASE.wipe }));\n }\n };\n\n let entered = false;\n if (typeof IntersectionObserver === 'function' && options.countOnView !== false && !reduced()) {\n paint(false, null);\n valueEl.textContent = formatter()(0);\n gsap.set([badge, dot], { opacity: 0 });\n const observer = scope.observe(\n new IntersectionObserver((entries) => {\n if (entered || !entries.some((entry) => entry.isIntersecting)) return;\n entered = true;\n gsap.set([badge, dot], { clearProps: 'opacity' });\n observer.disconnect();\n enter();\n }, { threshold: 0.4 }),\n );\n observer.observe(root);\n } else {\n entered = true;\n paint(false, null);\n figure(null);\n }\n\n return {\n update(next) {\n if (scope.disposed) return;\n const previousTrend = (root.dataset.mkTrend as Trend | undefined) ?? null;\n options = { ...options, ...next };\n if (!entered) {\n paint(false, null);\n return;\n }\n paint(true, previousTrend);\n const value = options.value;\n if (typeof value !== 'number') valueEl.textContent = '—';\n // countTo carries on from the figure it last wrote.\n else if (reduced()) countTo(valueEl, value, { from: value, format: formatter() });\n else keep(countTo(valueEl, value, { duration: 0.9, format: formatter() }));\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { numberFormat } from '../../core/dates';\nimport { rollDigits } from '../../motion/micro';\n\n/*\n * Chart tooltip: an advanced card for charts. Over the kit's chart (created\n * with tooltip: false) it follows the chart's selection — mk:select brings the\n * point, each series and its previous value — and leaves the guide and markers\n * to the chart. Over any other chart it tracks the pointer itself across\n * `labels` (edge to edge for lines, slot centres for bars, inside `inset`),\n * drawing a dotted guide and, with `min`/`max`, a marker per series; the\n * keyboard moves it too (arrows, Home, End, Escape). The card is Melon Mind's\n * inverse glass: the label, one row per series with its value, the change from\n * the previous point (▲ ▼ %) and optionally its share, a total, rows sorted by\n * value on request. It pops in (.25 s, pop), glides between points (.25 s,\n * power3.out) on the side with room, and changed values roll in their\n * direction. A click pins it: it stays when the pointer leaves (the pin pops\n * in); another click or Escape releases it.\n */\n\nexport interface ChartTooltipSeries {\n name: string;\n values: Array<number | null>;\n /** Any CSS colour (default: the --mk-chart-N slot). */\n color?: string;\n}\n\nexport interface ChartTooltipOptions {\n /** Standalone: the x labels, one per point. */\n labels?: string[];\n series?: ChartTooltipSeries[];\n /** Standalone: points edge to edge (lines, default) or at slot centres (bars). */\n align?: 'edge' | 'center';\n /** Standalone: the plot inside the root, in px from each side (default 0). */\n inset?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Standalone: the y scale; with it a marker sits on each series. */\n min?: number;\n max?: number;\n formatValue?: (value: number) => string;\n /** The change from the previous point (default true). */\n delta?: boolean;\n /** Each row's share of the total (default false). */\n share?: boolean;\n /** A total row (default: two or more series). */\n total?: boolean;\n /** Rows by value, largest first (default false). */\n sort?: boolean;\n /** A click pins the card (default true). */\n pin?: boolean;\n /** Standalone: accessible name of the focusable plot. */\n label?: string;\n onIndexChange?: (index: number | null) => void;\n}\n\nexport interface ChartTooltipInstance extends Instance {\n show(index: number): void;\n hide(): void;\n update(options: ChartTooltipOptions): void;\n readonly index: number | null;\n readonly pinned: boolean;\n}\n\ninterface Row {\n name: string;\n color: string;\n value: number | null;\n previous: number | null;\n}\n\nconst finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\nconst PIN = '<svg aria-hidden=\"true\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 4h6l-1 6 3 3H7l3-3z\"/><path d=\"M12 13v7\"/></svg>';\n\nexport function createChartTooltip(root: HTMLElement | null, initial: ChartTooltipOptions = {}): ChartTooltipInstance {\n if (!root) return inert({ show() {}, hide() {}, update() {}, index: null, pinned: false });\n registerMotion();\n const scope = createScope();\n let options: ChartTooltipOptions = { ...initial };\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n const number = numberFormat(root, { maximumFractionDigits: 2 });\n const percent = numberFormat(root, { maximumFractionDigits: 1, minimumFractionDigits: 1 });\n const format = (value: number) => (options.formatValue ? options.formatValue(value) : number.format(value));\n\n const layer = document.createElement('div');\n layer.dataset.mkCtLayer = '';\n layer.setAttribute('aria-hidden', 'true');\n const guide = document.createElement('span');\n guide.dataset.mkCtGuide = '';\n guide.hidden = true;\n const markers = document.createElement('span');\n markers.dataset.mkCtMarkers = '';\n const card = document.createElement('div');\n card.dataset.mkCtCard = '';\n card.hidden = true;\n const head = document.createElement('div');\n head.dataset.mkCtHead = '';\n const title = document.createElement('strong');\n title.dataset.mkCtTitle = '';\n const pin = document.createElement('span');\n pin.dataset.mkCtPin = '';\n pin.innerHTML = PIN;\n pin.hidden = true;\n head.append(title, pin);\n const rowsHost = document.createElement('div');\n rowsHost.dataset.mkCtRows = '';\n card.append(head, rowsHost);\n layer.append(guide, markers, card);\n const live = document.createElement('span');\n live.className = 'mk-sr-only';\n live.setAttribute('role', 'status');\n root.append(layer, live);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([card, guide]);\n layer.remove();\n live.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n\n /** A kit chart inside: follow its selection instead of tracking the pointer. */\n const linked = () => root.querySelector<HTMLElement>('[data-mk-chart-plot]');\n if (!linked() && !root.matches('a[href], button, [tabindex]')) {\n scope.attr(root, 'tabindex', '0');\n scope.attr(root, 'role', 'group');\n scope.attr(root, 'aria-label', options.label ?? 'Gráfica');\n }\n\n let index: number | null = null;\n let pinned = false;\n let rows: Row[] = [];\n let label = '';\n\n const plot = () => {\n const width = root.clientWidth;\n const height = root.clientHeight;\n const inset = options.inset ?? {};\n return { left: inset.left ?? 0, right: width - (inset.right ?? 0), top: inset.top ?? 0, bottom: height - (inset.bottom ?? 0), width, height };\n };\n const count = () => Math.max(options.labels?.length ?? 0, ...(options.series ?? []).map((series) => series.values.length), 0);\n const xOf = (i: number) => {\n const box = plot();\n const n = count();\n if (options.align === 'center') return box.left + ((i + 0.5) * (box.right - box.left)) / Math.max(1, n);\n return n <= 1 ? (box.left + box.right) / 2 : box.left + (i * (box.right - box.left)) / (n - 1);\n };\n const scaled = () => finite(options.min) && finite(options.max) && options.max! > options.min!;\n const yOf = (value: number) => {\n const box = plot();\n return box.top + (1 - (value - options.min!) / (options.max! - options.min!)) * (box.bottom - box.top);\n };\n const rowsAt = (i: number): Row[] =>\n (options.series ?? []).map((series, k) => ({\n name: series.name,\n color: series.color ?? `var(--mk-chart-${(k % 8) + 1})`,\n value: finite(series.values[i]) ? series.values[i]! : null,\n previous: i > 0 && finite(series.values[i - 1]) ? series.values[i - 1]! : null,\n }));\n\n const deltaOf = (row: Row) => {\n if (row.value === null || row.previous === null || row.previous === 0) return null;\n return ((row.value - row.previous) / Math.abs(row.previous)) * 100;\n };\n\n /**\n * A colour as the chart draws it: variables (the --mk-chart-N slots) resolve where the chart defines them, so a\n * chart recoloured by its own CSS shows the same colours in the card.\n */\n const resolveColor = (color: string) => {\n if (!color.includes('var(')) return color;\n const probe = document.createElement('span');\n probe.style.color = color;\n (linked() ?? root).append(probe);\n const value = getComputedStyle(probe).color;\n probe.remove();\n return value && !value.includes('var(') ? value : color;\n };\n\n /** Write the card's rows, rolling values that changed. */\n const paintRows = () => {\n const showTotal = options.total ?? rows.length > 1;\n const total = rows.reduce((sum, row) => sum + (row.value ?? 0), 0);\n const ordered = options.sort ? [...rows].sort((a, b) => (b.value ?? -Infinity) - (a.value ?? -Infinity)) : rows;\n const existing = [...rowsHost.querySelectorAll<HTMLElement>('[data-mk-ct-row]:not([data-mk-ct-row=\"total\"])')];\n const reuse = existing.length === ordered.length && existing.every((element, k) => element.dataset.mkName === ordered[k]!.name);\n const lines: string[] = [];\n const write = (element: HTMLElement, text: string, value: number | null) => {\n const before = Number(element.dataset.mkValue);\n element.dataset.mkValue = value === null ? '' : String(value);\n if (reuse && !reduced() && element.textContent !== text && value !== null && Number.isFinite(before)) keep(rollDigits(element, text, value >= before ? 1 : -1, 0.28));\n else element.textContent = text;\n };\n const elements = ordered.map((row, k) => {\n const element = reuse ? existing[k]! : document.createElement('div');\n if (!reuse) {\n element.dataset.mkCtRow = '';\n element.dataset.mkName = row.name;\n const swatch = document.createElement('i');\n swatch.dataset.mkCtSwatch = '';\n const name = document.createElement('span');\n name.dataset.mkCtName = '';\n name.textContent = row.name;\n const value = document.createElement('b');\n value.dataset.mkCtValue = '';\n const delta = document.createElement('span');\n delta.dataset.mkCtDelta = '';\n element.append(swatch, name, value, delta);\n }\n // Text-coloured series would vanish on the inverse glass: they show as a line in its ink.\n const swatch = element.querySelector<HTMLElement>('[data-mk-ct-swatch]')!;\n if (/--mk-(text|chart-mono|muted)/.test(row.color)) swatch.dataset.mkMono = '';\n else swatch.style.background = resolveColor(row.color);\n write(element.querySelector<HTMLElement>('[data-mk-ct-value]')!, row.value === null ? '—' : format(row.value), row.value);\n const deltaElement = element.querySelector<HTMLElement>('[data-mk-ct-delta]')!;\n const change = options.delta === false ? null : deltaOf(row);\n const parts: string[] = [];\n if (change !== null) {\n const trend = Math.abs(change) < 0.05 ? 'flat' : change > 0 ? 'up' : 'down';\n deltaElement.dataset.mkTrend = trend;\n parts.push(`${trend === 'up' ? '▲' : trend === 'down' ? '▼' : '='} ${percent.format(Math.abs(change))} %`);\n }\n if (options.share && row.value !== null && total) parts.push(`${percent.format((row.value / total) * 100)} % del total`);\n deltaElement.textContent = parts.join(' · ');\n deltaElement.hidden = !parts.length;\n lines.push(`${row.name ? `${row.name}: ` : ''}${row.value === null ? 'sin dato' : format(row.value)}${change !== null ? `, ${change >= 0 ? 'sube' : 'baja'} ${percent.format(Math.abs(change))} %` : ''}`);\n return element;\n });\n let totalElement = rowsHost.querySelector<HTMLElement>('[data-mk-ct-row=\"total\"]');\n if (showTotal) {\n if (!totalElement) {\n totalElement = document.createElement('div');\n totalElement.dataset.mkCtRow = 'total';\n const name = document.createElement('span');\n name.dataset.mkCtName = '';\n name.textContent = 'Total';\n const value = document.createElement('b');\n value.dataset.mkCtValue = '';\n totalElement.append(document.createElement('i'), name, value);\n }\n write(totalElement.querySelector<HTMLElement>('[data-mk-ct-value]')!, format(total), total);\n lines.push(`Total: ${format(total)}`);\n }\n rowsHost.replaceChildren(...elements, ...(showTotal && totalElement ? [totalElement] : []));\n return lines;\n };\n\n /** Place the card beside x, towards the middle, above the highest point, inside the root. */\n const placeCard = (x: number, anchorY: number, appearing: boolean) => {\n const width = root.clientWidth;\n const height = root.clientHeight;\n const cardW = card.offsetWidth || 180;\n const cardH = card.offsetHeight || 80;\n const towardsLeft = x > width / 2;\n const left = Math.round(Math.max(0, Math.min(width - cardW, towardsLeft ? x - 16 - cardW : x + 16)));\n const top = Math.round(Math.max(0, Math.min(height - cardH, anchorY - cardH - 12)));\n if (appearing || reduced()) {\n gsap.killTweensOf(card);\n gsap.set(card, { x: left, y: top, transformOrigin: towardsLeft ? '100% 100%' : '0% 100%' });\n if (!reduced()) keep(gsap.fromTo(card, { opacity: 0, scale: 0.9, filter: 'blur(6px)' }, { opacity: 1, scale: 1, filter: 'blur(0px)', duration: 0.25, ease: EASE.pop }));\n else gsap.set(card, { opacity: 1, scale: 1 });\n } else {\n gsap.killTweensOf(card, 'opacity,scale,filter');\n gsap.set(card, { opacity: 1, scale: 1, filter: 'blur(0px)' });\n keep(gsap.to(card, { x: left, y: top, duration: 0.25, ease: 'power3.out', overwrite: 'auto' }));\n }\n };\n\n /** Standalone: the dotted guide and a marker per series. */\n const paintGuide = (x: number, appearing: boolean) => {\n const box = plot();\n guide.hidden = false;\n gsap.set(guide, { top: box.top, height: Math.max(0, box.bottom - box.top) });\n if (appearing || reduced()) gsap.set(guide, { x });\n else keep(gsap.to(guide, { x, duration: 0.25, ease: 'power3.out', overwrite: 'auto' }));\n if (!scaled()) {\n markers.replaceChildren();\n return box.top + 8 + (card.offsetHeight || 80) + 12;\n }\n const fresh = markers.children.length !== rows.length;\n if (fresh) {\n markers.replaceChildren(\n ...rows.map((row) => {\n const dot = document.createElement('span');\n dot.dataset.mkCtMarker = '';\n dot.style.background = row.color;\n return dot;\n }),\n );\n }\n let highest = box.bottom;\n rows.forEach((row, k) => {\n const dot = markers.children[k] as HTMLElement;\n dot.hidden = row.value === null;\n if (row.value === null) return;\n const y = yOf(row.value);\n highest = Math.min(highest, y);\n if (appearing || fresh || reduced()) {\n gsap.set(dot, { x, y });\n if (!reduced()) keep(gsap.fromTo(dot, { scale: 0 }, { scale: 1, duration: 0.3, ease: EASE.pop }));\n } else keep(gsap.to(dot, { x, y, duration: 0.25, ease: 'power3.out', overwrite: 'auto' }));\n });\n return highest;\n };\n\n const emit = () => {\n options.onIndexChange?.(index);\n root.dispatchEvent(new CustomEvent('mk:index-change', { bubbles: true, detail: { index, pinned } }));\n };\n\n /** Show the card for point `i`: x and anchorY in root px. */\n const present = (i: number, x: number, anchorY: number | null, announce: boolean) => {\n const appearing = card.hidden;\n const changed = i !== index;\n index = i;\n title.textContent = label;\n const lines = paintRows();\n card.hidden = false;\n const top = anchorY ?? paintGuide(x, appearing);\n placeCard(x, top, appearing);\n if (announce) live.textContent = `${label}. ${lines.join('. ')}`;\n if (changed) emit();\n };\n\n const hide = (force = false) => {\n if (pinned && !force) return;\n if (force) setPinned(false);\n if (index === null && card.hidden) return;\n index = null;\n guide.hidden = true;\n markers.replaceChildren();\n if (!card.hidden && !reduced()) {\n gsap.killTweensOf(card, 'opacity,scale,filter');\n keep(gsap.to(card, { opacity: 0, scale: 0.94, duration: 0.15, ease: 'power2.in', onComplete: () => void (card.hidden = true) }));\n } else card.hidden = true;\n emit();\n };\n\n const setPinned = (next: boolean) => {\n if (pinned === next) return;\n pinned = next;\n root.toggleAttribute('data-mk-pinned', pinned);\n pin.hidden = !pinned;\n if (pinned && !reduced()) keep(gsap.fromTo(pin, { scale: 0.4, rotation: -30 }, { scale: 1, rotation: 0, duration: 0.35, ease: EASE.click, clearProps: 'transform' }));\n root.dispatchEvent(new CustomEvent('mk:index-change', { bubbles: true, detail: { index, pinned } }));\n };\n scope.attr(root, 'data-mk-pinned', null);\n\n /** Standalone: show point i from the options' data. */\n const showStandalone = (i: number, announce = false) => {\n const n = count();\n if (!n) return;\n const clamped = Math.max(0, Math.min(n - 1, Math.round(i)));\n rows = rowsAt(clamped);\n label = options.labels?.[clamped] ?? String(clamped + 1);\n present(clamped, xOf(clamped), null, announce);\n };\n\n const indexAt = (clientX: number) => {\n const rect = root.getBoundingClientRect();\n const x = clientX - rect.left;\n let best = 0;\n for (let i = 1; i < count(); i++) if (Math.abs(xOf(i) - x) < Math.abs(xOf(best) - x)) best = i;\n return best;\n };\n\n // Linked: the kit chart tells where its selection is.\n scope.on(root, 'mk:select', (event) => {\n const plotElement = linked();\n if (!plotElement || event.target === root) return;\n const detail = (event as CustomEvent<{ index: number | null; label: string | null; x: number | null; y: number | null; series?: Array<{ name: string; color: string; value: number | null; previous: number | null }> }>).detail;\n if (detail.index === null || detail.x === null || detail.y === null) return hide();\n const rootBox = root.getBoundingClientRect();\n const plotBox = plotElement.getBoundingClientRect();\n rows = (detail.series ?? []).map((row) => ({ name: row.name, color: row.color, value: finite(row.value) ? row.value : null, previous: finite(row.previous) ? row.previous : null }));\n label = detail.label ?? '';\n present(detail.index, plotBox.left - rootBox.left + detail.x, plotBox.top - rootBox.top + detail.y, false);\n });\n\n scope.on(root, 'pointermove', (event) => {\n if (linked()) return;\n showStandalone(indexAt((event as PointerEvent).clientX));\n });\n scope.on(root, 'pointerleave', (event) => {\n if (linked() || (event as PointerEvent).pointerType === 'touch') return;\n hide();\n });\n scope.on(root, 'click', (event) => {\n if (options.pin === false || card.hidden) return;\n const target = event.target as Element | null;\n if (target?.closest('a, button, input, select, textarea')) return;\n setPinned(!pinned);\n });\n scope.on(root, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n if (key === 'Escape') {\n if (index !== null || pinned) {\n event.preventDefault();\n hide(true);\n }\n return;\n }\n if (linked()) return;\n const last = count() - 1;\n const moves: Record<string, number> = { ArrowRight: Math.min(last, (index ?? -1) + 1), ArrowLeft: Math.max(0, (index ?? 1) - 1), Home: 0, End: last };\n if (!(key in moves) || last < 0) return;\n event.preventDefault();\n showStandalone(moves[key]!, true);\n });\n scope.on(root, 'focus', () => {\n if (!linked() && index === null && count()) showStandalone(0, true);\n });\n scope.on(root, 'blur', () => {\n if (!linked()) hide();\n });\n\n return {\n show(i) {\n if (!linked()) showStandalone(i, true);\n },\n hide: () => hide(true),\n update(next) {\n if (scope.disposed) return;\n options = { ...options, ...next };\n if (index !== null && !linked()) showStandalone(index);\n },\n get index() {\n return index;\n },\n get pinned() {\n return pinned;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, Flip, registerMotion } from './gsap';\nimport { reduced } from './reduced';\nimport { createScope } from './scope';\nimport { TIMING } from './timing';\nimport { ringPulse, shake } from '../motion/micro';\n\n/*\n * Chips (multi-select, tag-input): removable chips in a list. A chip that\n * arrives pops in (scale .6 → 1, blur 6 → 0, pop curve) while the others glide\n * to make room (Flip, layout spring); one that leaves folds away (its width,\n * padding and margin to 0 out of a blur, .22 s) and the rest close the gap.\n * Keyboard: from the field, ← reaches the last chip; ← / → move between chips,\n * Delete or Backspace removes the focused one, → past the last returns to the\n * field. arm() rings a chip that the next Backspace will remove; flash()\n * shakes and rings one (a duplicate, a value already chosen).\n */\n\nexport interface ChipItem {\n value: string;\n label: string;\n}\n\nexport interface ChipsOptions {\n /** A chip's remove button wants out. */\n onRemove: (value: string) => void;\n /** The keyboard left the chips towards the field. */\n onExit?: () => void;\n /** Accessible name of a chip's remove button (default 'Quitar <label>'). */\n removeLabel?: (item: ChipItem) => string;\n disabled?: boolean;\n}\n\nexport interface Chips {\n readonly element: HTMLUListElement;\n /** Show these chips in this order; arrivals pop in and departures fold away when `animate`. */\n set(items: ChipItem[], animate?: boolean): void;\n /** Ring a chip as the next to go (null: none). */\n arm(value: string | null): void;\n readonly armed: string | null;\n /** Shake and ring a chip. */\n flash(value: string): void;\n /** Focus the last chip (from the field). False when there are none. */\n focusLast(): boolean;\n destroy(): void;\n}\n\nconst CLOSE = '<svg aria-hidden=\"true\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><path d=\"M7 7l10 10M17 7L7 17\"/></svg>';\n\nexport function createChips(options: ChipsOptions): Chips {\n registerMotion();\n const scope = createScope();\n const list = document.createElement('ul');\n list.dataset.mkChips = '';\n list.setAttribute('role', 'list');\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n list.remove();\n });\n let armed: string | null = null;\n\n const chipOf = (value: string) => [...list.querySelectorAll<HTMLElement>('[data-mk-chip]')].find((chip) => chip.dataset.value === value && !chip.hasAttribute('data-mk-leaving')) ?? null;\n const present = () => [...list.querySelectorAll<HTMLElement>('[data-mk-chip]:not([data-mk-leaving])')];\n\n const make = (item: ChipItem) => {\n const chip = document.createElement('li');\n chip.dataset.mkChip = '';\n chip.dataset.value = item.value;\n chip.tabIndex = -1;\n const label = document.createElement('span');\n label.dataset.mkChipLabel = '';\n label.textContent = item.label;\n chip.append(label);\n if (!options.disabled) {\n const remove = document.createElement('button');\n remove.type = 'button';\n remove.tabIndex = -1;\n remove.dataset.mkChipRemove = '';\n remove.setAttribute('aria-label', options.removeLabel ? options.removeLabel(item) : `Quitar ${item.label}`);\n remove.innerHTML = CLOSE;\n chip.append(remove);\n }\n return chip;\n };\n\n const leave = (chip: HTMLElement, animate: boolean) => {\n chip.setAttribute('data-mk-leaving', '');\n if (!animate || reduced()) return chip.remove();\n gsap.killTweensOf(chip);\n keep(\n gsap.to(chip, {\n width: 0,\n paddingLeft: 0,\n paddingRight: 0,\n marginLeft: 0,\n marginRight: 0,\n opacity: 0,\n scale: 0.8,\n filter: 'blur(6px)',\n duration: 0.22,\n ease: 'power2.in',\n onComplete: () => chip.remove(),\n }),\n );\n };\n\n const set = (items: ChipItem[], animate = true) => {\n const wanted = new Set(items.map((item) => item.value));\n const staying = present().filter((chip) => wanted.has(chip.dataset.value!));\n const state = animate && !reduced() && staying.length ? Flip.getState(staying) : null;\n for (const chip of present()) if (!wanted.has(chip.dataset.value!)) leave(chip, animate);\n const arriving: HTMLElement[] = [];\n let previous: HTMLElement | null = null;\n for (const item of items) {\n let chip = chipOf(item.value);\n if (!chip) {\n chip = make(item);\n arriving.push(chip);\n } else chip.querySelector<HTMLElement>('[data-mk-chip-label]')!.textContent = item.label;\n // Keep the given order; leaving chips stay where they were while they fold.\n if (previous) previous.after(chip);\n else list.prepend(chip);\n previous = chip;\n }\n if (armed && !wanted.has(armed)) armed = null;\n if (state) keep(Flip.from(state, { targets: staying, duration: TIMING.layoutTravel, ease: EASE.layoutReflow }));\n if (animate && arriving.length && !reduced()) {\n keep(gsap.fromTo(arriving, { scale: 0.6, opacity: 0, filter: 'blur(6px)' }, { scale: 1, opacity: 1, filter: 'blur(0px)', duration: 0.3, stagger: 0.04, ease: EASE.pop, clearProps: 'scale,opacity,filter,transform' }));\n }\n };\n\n const arm = (value: string | null) => {\n armed = value;\n for (const chip of present()) chip.toggleAttribute('data-mk-armed', chip.dataset.value === value);\n const chip = value ? chipOf(value) : null;\n if (chip && !reduced()) keep(gsap.fromTo(chip, { scale: 1.08 }, { scale: 1, duration: 0.3, ease: EASE.click, clearProps: 'scale' }));\n };\n\n scope.on(list, 'click', (event) => {\n const remove = (event.target as Element | null)?.closest('[data-mk-chip-remove]');\n const chip = remove?.closest<HTMLElement>('[data-mk-chip]');\n if (chip && !chip.hasAttribute('data-mk-leaving')) options.onRemove(chip.dataset.value!);\n });\n scope.on(list, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const chip = (key.target as Element | null)?.closest<HTMLElement>('[data-mk-chip]');\n if (!chip) return;\n const chips = present();\n const index = chips.indexOf(chip);\n if (key.key === 'ArrowLeft') {\n key.preventDefault();\n chips[Math.max(0, index - 1)]?.focus();\n } else if (key.key === 'ArrowRight') {\n key.preventDefault();\n if (index >= chips.length - 1) options.onExit?.();\n else chips[index + 1]?.focus();\n } else if ((key.key === 'Delete' || key.key === 'Backspace') && !options.disabled) {\n key.preventDefault();\n const next = chips[index + 1] ?? chips[index - 1] ?? null;\n options.onRemove(chip.dataset.value!);\n if (next && next !== chip && next.isConnected && !next.hasAttribute('data-mk-leaving')) next.focus();\n else options.onExit?.();\n } else if (key.key === 'Escape' || key.key === 'Tab') {\n if (key.key === 'Escape') key.preventDefault();\n if (key.key === 'Escape') options.onExit?.();\n }\n });\n\n return {\n element: list,\n set,\n arm,\n get armed() {\n return armed;\n },\n flash(value) {\n const chip = chipOf(value);\n if (!chip) return;\n keep(shake(chip, 3));\n keep(ringPulse(chip));\n },\n focusLast() {\n const chips = present();\n chips[chips.length - 1]?.focus();\n return chips.length > 0;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from './gsap';\nimport { requestFrame } from './frame';\nimport { reduced } from './reduced';\nimport { createScope } from './scope';\nimport { place } from './position';\nimport { matchScore } from '../components/command-search/match';\n\n/*\n * Listbox (multi-select, tag-input): the options under a combobox field, in\n * the top layer (popover API) so no overflow clips them, as wide as the field,\n * below it or above when there is no room. It opens out of the field (from 96 %\n * and a 6 px blur, .22 s, pop curve) while its first options flow in (20 ms\n * apart); a pill glides behind the active option (.3 s, swing) as the arrows or\n * the pointer move it; the letters that match the query are marked (as text);\n * chosen options show a check that draws itself. The component keeps the\n * keyboard: it calls move(), pick() and hide().\n */\n\nexport interface ListboxOption {\n value: string;\n label: string;\n group?: string;\n hint?: string;\n disabled?: boolean;\n}\n\nexport interface ListboxOptions {\n /** The combobox input: it gets aria-controls and aria-activedescendant. */\n input: HTMLInputElement;\n /** The box the list hangs from (the field). */\n anchor: HTMLElement;\n /** Where the list element lives in the DOM (it is shown in the top layer). */\n host: HTMLElement;\n multiselectable?: boolean;\n label?: string;\n emptyLabel?: string;\n /** Chosen options (a check and aria-selected). */\n isSelected?: (value: string) => boolean;\n onPick: (option: ListboxOption) => void;\n}\n\nexport interface Listbox {\n readonly element: HTMLElement;\n /** Show these options with `query`'s letters marked; opens it. */\n show(options: ListboxOption[], query?: string): void;\n hide(): void;\n readonly isOpen: boolean;\n /** Move the active option (wraps); 'first' / 'last' jump. */\n move(delta: number | 'first' | 'last'): void;\n /** Choose the active option; false when there is none. */\n pick(): boolean;\n readonly active: ListboxOption | null;\n /** Re-mark the chosen options (after the value changed). */\n refresh(): void;\n destroy(): void;\n}\n\nconst CHECK = '<svg aria-hidden=\"true\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12.5l4.5 4.5L19 7.5\" pathLength=\"1\"/></svg>';\nlet sequence = 0;\n\n/** `text` with the matched ranges in <mark>, built as text nodes. */\nfunction marked(text: string, query: string) {\n const fragment = document.createDocumentFragment();\n const match = query.trim() ? matchScore(query, text) : null;\n let at = 0;\n for (const [start, end] of match?.ranges ?? []) {\n if (start > at) fragment.append(text.slice(at, start));\n const mark = document.createElement('mark');\n mark.textContent = text.slice(start, end);\n fragment.append(mark);\n at = end;\n }\n if (at < text.length) fragment.append(text.slice(at));\n return fragment;\n}\n\n/** Options that match `query` (fuzzy, accents ignored), best first; all of them, in order, without a query. */\nexport function filterOptions<T extends ListboxOption>(options: T[], query: string): T[] {\n if (!query.trim()) return [...options];\n return options\n .map((option, order) => ({ option, order, match: matchScore(query, option.label) ?? (option.hint ? matchScore(query, option.hint) : null) }))\n .filter((entry) => entry.match)\n .sort((a, b) => b.match!.score - a.match!.score || a.order - b.order)\n .map((entry) => entry.option);\n}\n\nexport function createListbox(options: ListboxOptions): Listbox {\n registerMotion();\n const scope = createScope();\n const uid = `mk-listbox-${++sequence}`;\n const list = document.createElement('div');\n list.id = uid;\n list.dataset.mkListbox = '';\n list.setAttribute('role', 'listbox');\n if (options.multiselectable) list.setAttribute('aria-multiselectable', 'true');\n if (options.label) list.setAttribute('aria-label', options.label);\n const pill = document.createElement('span');\n pill.dataset.mkListboxPill = '';\n pill.setAttribute('aria-hidden', 'true');\n const items = document.createElement('div');\n items.dataset.mkListboxItems = '';\n list.append(pill, items);\n const topLayer = typeof list.showPopover === 'function';\n if (topLayer) list.setAttribute('popover', 'manual');\n else list.hidden = true;\n options.host.append(list);\n scope.attr(options.input, 'aria-controls', uid);\n scope.attr(options.input, 'aria-expanded', 'false');\n scope.attr(options.input, 'aria-activedescendant', null);\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([list, pill]);\n list.remove();\n });\n\n let isOpen = false;\n let shown: ListboxOption[] = [];\n let active = -1;\n\n const optionEls = () => [...items.querySelectorAll<HTMLElement>('[role=\"option\"]')];\n const shownNow = () => (topLayer ? list.matches(':popover-open') : !list.hidden);\n\n const position = () => {\n const anchor = options.anchor.getBoundingClientRect();\n list.style.width = `${Math.round(anchor.width)}px`;\n const box = list.getBoundingClientRect();\n const placed = place(anchor, { width: anchor.width, height: box.height }, { placement: 'bottom', align: 'start', gap: 6 });\n list.style.left = `${placed.x}px`;\n list.style.top = `${placed.y}px`;\n list.dataset.mkSide = placed.side;\n return placed;\n };\n let pending: (() => void) | null = null;\n const follow = () => {\n if (!isOpen || pending) return;\n pending = requestFrame(() => {\n pending = null;\n if (isOpen) position();\n });\n };\n scope.add(() => pending?.());\n scope.on(window, 'resize', follow);\n scope.on(window, 'scroll', follow, { capture: true, passive: true });\n\n const movePill = (animate: boolean) => {\n const option = optionEls()[active];\n if (!option) {\n pill.style.opacity = '0';\n return;\n }\n const box = { y: option.offsetTop, height: option.offsetHeight };\n if (!animate || reduced() || pill.style.opacity === '0') {\n gsap.set(pill, box);\n pill.style.opacity = '1';\n return;\n }\n keep(gsap.to(pill, { ...box, duration: 0.3, ease: EASE.swatch, overwrite: 'auto' }));\n };\n\n const setActive = (index: number, animate = true) => {\n const all = optionEls();\n const enabled = all.map((option, i) => (option.getAttribute('aria-disabled') === 'true' ? -1 : i)).filter((i) => i >= 0);\n if (!enabled.length) {\n active = -1;\n options.input.removeAttribute('aria-activedescendant');\n movePill(false);\n return;\n }\n active = index;\n all.forEach((option, i) => option.toggleAttribute('data-mk-active', i === active));\n const option = all[active];\n if (option) {\n options.input.setAttribute('aria-activedescendant', option.id);\n option.scrollIntoView?.({ block: 'nearest' });\n } else options.input.removeAttribute('aria-activedescendant');\n movePill(animate);\n };\n\n const mark = () => {\n for (const option of optionEls()) {\n const selected = Boolean(options.isSelected?.(option.dataset.value!));\n const was = option.getAttribute('aria-selected') === 'true';\n option.setAttribute('aria-selected', String(selected));\n if (selected && !was && !reduced()) {\n const path = option.querySelector<SVGPathElement>('[data-mk-option-check] path');\n if (path) keep(gsap.fromTo(path, { strokeDasharray: 1, strokeDashoffset: 1 }, { strokeDashoffset: 0, duration: 0.3, ease: EASE.wipe, clearProps: 'strokeDasharray,strokeDashoffset' }));\n }\n }\n };\n\n const render = (query: string) => {\n items.replaceChildren();\n let group: string | undefined;\n shown.forEach((option, i) => {\n if (option.group && option.group !== group) {\n group = option.group;\n const heading = document.createElement('div');\n heading.dataset.mkListboxGroup = '';\n heading.setAttribute('role', 'presentation');\n heading.textContent = option.group;\n items.append(heading);\n }\n const element = document.createElement('div');\n element.id = `${uid}-${i}`;\n element.dataset.mkOption = '';\n element.dataset.value = option.value;\n element.dataset.mkIndex = String(i);\n element.setAttribute('role', 'option');\n element.setAttribute('aria-selected', 'false');\n if (option.disabled) element.setAttribute('aria-disabled', 'true');\n if (options.multiselectable) {\n const check = document.createElement('span');\n check.dataset.mkOptionCheck = '';\n check.innerHTML = CHECK;\n element.append(check);\n }\n const label = document.createElement('span');\n label.dataset.mkOptionLabel = '';\n label.append(marked(option.label, query));\n element.append(label);\n if (option.hint) {\n const hint = document.createElement('span');\n hint.dataset.mkOptionHint = '';\n hint.textContent = option.hint;\n element.append(hint);\n }\n items.append(element);\n });\n if (!shown.length) {\n const empty = document.createElement('div');\n empty.dataset.mkListboxEmpty = '';\n empty.textContent = options.emptyLabel ?? 'Sin coincidencias';\n items.append(empty);\n }\n // Without the transition into the new marks: only real changes draw their check.\n for (const option of optionEls()) option.setAttribute('aria-selected', String(Boolean(options.isSelected?.(option.dataset.value!))));\n };\n\n const show = (next: ListboxOption[], query = '') => {\n const opening = !isOpen;\n shown = next;\n render(query);\n if (opening) {\n isOpen = true;\n if (topLayer) {\n if (!shownNow()) list.showPopover();\n } else list.hidden = false;\n options.input.setAttribute('aria-expanded', 'true');\n }\n const placed = position();\n const first = shown.findIndex((option) => !option.disabled);\n pill.style.opacity = '0';\n setActive(query.trim() ? first : -1, false);\n if (opening && !reduced()) {\n gsap.killTweensOf(list);\n gsap.set(list, { transformOrigin: placed.side === 'top' ? '50% 100%' : '50% 0%' });\n keep(gsap.fromTo(list, { opacity: 0, scaleY: 0.96, filter: 'blur(6px)' }, { opacity: 1, scaleY: 1, filter: 'blur(0px)', duration: 0.22, ease: EASE.pop, clearProps: 'opacity,transform,filter' }));\n const firstOptions = optionEls().slice(0, 10);\n if (firstOptions.length) keep(gsap.fromTo(firstOptions, { opacity: 0, y: -4 }, { opacity: 1, y: 0, duration: 0.25, stagger: 0.02, ease: 'power2.out', clearProps: 'opacity,transform' }));\n }\n };\n\n const hide = () => {\n if (!isOpen) return;\n isOpen = false;\n active = -1;\n options.input.setAttribute('aria-expanded', 'false');\n options.input.removeAttribute('aria-activedescendant');\n const finish = () => {\n if (topLayer) {\n if (shownNow()) list.hidePopover();\n } else list.hidden = true;\n gsap.set(list, { clearProps: 'opacity,transform,filter' });\n };\n if (reduced()) return finish();\n gsap.killTweensOf(list);\n keep(gsap.to(list, { opacity: 0, scaleY: 0.97, duration: 0.12, ease: 'power2.in', onComplete: finish }));\n };\n\n scope.on(items, 'pointermove', (event) => {\n const option = (event.target as Element | null)?.closest<HTMLElement>('[role=\"option\"]');\n if (!option || option.getAttribute('aria-disabled') === 'true') return;\n const index = Number(option.dataset.mkIndex);\n if (index !== active) setActive(index);\n });\n // The pointer must not take the focus from the field.\n scope.on(list, 'pointerdown', (event) => event.preventDefault());\n scope.on(items, 'click', (event) => {\n const option = (event.target as Element | null)?.closest<HTMLElement>('[role=\"option\"]');\n if (!option || option.getAttribute('aria-disabled') === 'true') return;\n options.onPick(shown[Number(option.dataset.mkIndex)]!);\n });\n\n return {\n element: list,\n show,\n hide,\n get isOpen() {\n return isOpen;\n },\n move(delta) {\n if (!isOpen) return;\n const all = optionEls();\n const enabled = all.map((option, i) => (option.getAttribute('aria-disabled') === 'true' ? -1 : i)).filter((i) => i >= 0);\n if (!enabled.length) return;\n if (delta === 'first') return setActive(enabled[0]!);\n if (delta === 'last') return setActive(enabled[enabled.length - 1]!);\n const at = enabled.indexOf(active);\n const next = at < 0 ? (delta > 0 ? 0 : enabled.length - 1) : (at + delta + enabled.length) % enabled.length;\n setActive(enabled[next]!);\n },\n pick() {\n const option = shown[active];\n if (!option || option.disabled) return false;\n options.onPick(option);\n return true;\n },\n get active() {\n return shown[active] ?? null;\n },\n refresh: mark,\n destroy: () => scope.dispose(),\n };\n}\n","import { registerMotion } from '../../core/gsap';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { createChips, type ChipItem } from '../../core/chips';\nimport { createListbox, filterOptions, type ListboxOption } from '../../core/listbox';\nimport { press, shake } from '../../motion/micro';\n\n/*\n * Multi select: a combobox field holding the chosen options as chips and a\n * search input. Typing filters the options (letters in order, accents\n * ignored, the matches marked); the list opens out of the field and its active\n * option is a pill that glides (core/listbox.ts). Enter or a click toggles an\n * option (its check draws itself); chips pop in and fold away\n * (core/chips.ts). Backspace in an empty search arms the last chip (a ring),\n * then removes it; ← reaches the chips. `max` stops further choices (the\n * field shakes and the rest of the options turn off). An authored\n * <select multiple> gives the options and stays in sync, so forms post as\n * usual; otherwise `name` adds hidden inputs.\n */\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n group?: string;\n hint?: string;\n disabled?: boolean;\n}\n\nexport interface MultiSelectOptions {\n /** The options; without them, an authored <select multiple> gives them. */\n options?: MultiSelectOption[];\n value?: string[];\n /** Search placeholder (default 'Buscar…'). */\n placeholder?: string;\n /** Accessible name (default: the authored <label>, else 'Selección'). */\n label?: string;\n /** Hidden inputs name[] (when there is no authored select). */\n name?: string;\n /** At most this many choices. */\n max?: number;\n /** Close the list after each choice (default false). */\n closeOnSelect?: boolean;\n disabled?: boolean;\n onChange?: (values: string[]) => void;\n}\n\nexport interface MultiSelectInstance extends Instance {\n setValue(values: string[], notify?: boolean): void;\n setOptions(options: MultiSelectOption[]): void;\n open(): void;\n close(): void;\n readonly value: string[];\n}\n\nconst 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>';\nconst 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>';\n\nconst readSelect = (select: HTMLSelectElement): MultiSelectOption[] =>\n [...select.options].map((option) => ({\n value: option.value,\n label: option.label || option.textContent?.trim() || option.value,\n group: option.parentElement instanceof HTMLOptGroupElement ? option.parentElement.label : undefined,\n disabled: option.disabled,\n }));\n\nexport function createMultiSelect(root: HTMLElement | null, settings: MultiSelectOptions = {}): MultiSelectInstance {\n if (!root) return inert({ setValue() {}, setOptions() {}, open() {}, close() {}, value: [] });\n registerMotion();\n const scope = createScope();\n const select = root.querySelector<HTMLSelectElement>('select[multiple]');\n let all: MultiSelectOption[] = settings.options ?? (select ? readSelect(select) : []);\n const max = Number.isFinite(settings.max) && settings.max! > 0 ? Math.floor(settings.max!) : Infinity;\n const known = (value: string) => all.some((option) => option.value === value);\n let value: string[] = (settings.value ?? (select ? [...select.selectedOptions].map((option) => option.value) : [])).filter(known).slice(0, max);\n const labelText = settings.label ?? root.querySelector('label')?.textContent?.trim() ?? select?.getAttribute('aria-label') ?? 'Selección';\n\n if (select) {\n // The native select keeps posting the value; it is synced and out of sight.\n const before = [...select.options].map((option) => option.selected);\n scope.attr(select, 'hidden', '');\n scope.attr(select, 'aria-hidden', 'true');\n scope.attr(select, 'tabindex', '-1');\n scope.add(() => [...select.options].forEach((option, i) => (option.selected = before[i] ?? false)));\n }\n\n const field = document.createElement('div');\n field.dataset.mkMsField = '';\n const chips = createChips({\n disabled: settings.disabled,\n onRemove: (removed) => toggle(removed, false),\n onExit: () => input.focus(),\n });\n scope.add(() => chips.destroy());\n const input = document.createElement('input');\n input.type = 'text';\n input.dataset.mkMsInput = '';\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-label', labelText);\n input.autocomplete = 'off';\n input.spellcheck = false;\n input.placeholder = settings.placeholder ?? 'Buscar…';\n input.disabled = Boolean(settings.disabled);\n const clear = document.createElement('button');\n clear.type = 'button';\n clear.dataset.mkMsClear = '';\n clear.setAttribute('aria-label', 'Quitar todo');\n clear.innerHTML = CLEAR;\n clear.disabled = Boolean(settings.disabled);\n const chevron = document.createElement('span');\n chevron.dataset.mkMsChevron = '';\n chevron.innerHTML = CHEVRON;\n field.append(chips.element, input, clear, chevron);\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n const hiddenHost = document.createElement('span');\n hiddenHost.hidden = true;\n root.append(field, status, hiddenHost);\n scope.add(() => {\n field.remove();\n status.remove();\n hiddenHost.remove();\n });\n scope.attr(root, 'data-mk-open', null);\n scope.attr(root, 'data-mk-has-value', null);\n scope.attr(root, 'data-mk-ready', '');\n\n const listbox = createListbox({\n input,\n anchor: field,\n host: root,\n multiselectable: true,\n label: labelText,\n isSelected: (option) => value.includes(option),\n onPick: (option) => toggle(option.value, !value.includes(option.value), true),\n });\n scope.add(() => listbox.destroy());\n\n const labelOf = (option: string) => all.find((entry) => entry.value === option)?.label ?? option;\n const listed = (): ListboxOption[] => {\n const full = value.length >= max;\n return filterOptions(all, input.value).map((option) => ({ ...option, disabled: option.disabled || (full && !value.includes(option.value)) }));\n };\n\n const sync = (animate: boolean) => {\n chips.set(value.map((option): ChipItem => ({ value: option, label: labelOf(option) })), animate);\n root.toggleAttribute('data-mk-has-value', value.length > 0);\n input.placeholder = value.length ? '' : (settings.placeholder ?? 'Buscar…');\n if (select) for (const option of select.options) option.selected = value.includes(option.value);\n else if (settings.name) {\n hiddenHost.replaceChildren(\n ...value.map((option) => {\n const hidden = document.createElement('input');\n hidden.type = 'hidden';\n hidden.name = `${settings.name}[]`;\n hidden.value = option;\n return hidden;\n }),\n );\n }\n if (listbox.isOpen) listbox.show(listed(), input.value);\n };\n\n const emit = () => {\n settings.onChange?.([...value]);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value: [...value] } }));\n };\n\n const toggle = (option: string, on: boolean, fromList = false) => {\n if (settings.disabled || on === value.includes(option)) return;\n if (on && value.length >= max) {\n shake(field);\n status.textContent = `Máximo ${max} ${max === 1 ? 'opción' : 'opciones'}`;\n return;\n }\n value = on ? [...value, option] : value.filter((entry) => entry !== option);\n chips.arm(null);\n sync(true);\n status.textContent = `${labelOf(option)} ${on ? 'añadida' : 'quitada'}. ${value.length} ${value.length === 1 ? 'seleccionada' : 'seleccionadas'}.`;\n if (fromList && input.value) {\n input.value = '';\n listbox.show(listed(), '');\n }\n if (fromList && settings.closeOnSelect) listbox.hide();\n emit();\n };\n\n const open = () => {\n if (settings.disabled || listbox.isOpen) return;\n root.setAttribute('data-mk-open', '');\n listbox.show(listed(), input.value);\n };\n const close = () => {\n root.removeAttribute('data-mk-open');\n listbox.hide();\n };\n\n scope.on(field, 'pointerdown', (event) => {\n const target = event.target as Element | null;\n if (target?.closest('[data-mk-chip-remove], [data-mk-ms-clear]')) return;\n if (target !== input) event.preventDefault();\n input.focus();\n if (listbox.isOpen && target?.closest('[data-mk-ms-chevron]')) close();\n else open();\n });\n scope.on(input, 'input', () => {\n chips.arm(null);\n open();\n listbox.show(listed(), input.value);\n });\n scope.on(input, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n switch (key.key) {\n case 'ArrowDown':\n key.preventDefault();\n if (!listbox.isOpen) open();\n listbox.move(1);\n return;\n case 'ArrowUp':\n key.preventDefault();\n if (!listbox.isOpen) open();\n listbox.move(-1);\n return;\n case 'Home':\n case 'End':\n if (!listbox.isOpen || input.value) return;\n key.preventDefault();\n listbox.move(key.key === 'Home' ? 'first' : 'last');\n return;\n case 'Enter':\n if (listbox.isOpen && listbox.pick()) key.preventDefault();\n return;\n case 'Escape':\n if (listbox.isOpen) {\n key.preventDefault();\n close();\n } else if (input.value) input.value = '';\n return;\n case 'Backspace':\n if (input.value || !value.length) return;\n key.preventDefault();\n if (chips.armed) toggle(chips.armed, false);\n else chips.arm(value[value.length - 1]!);\n return;\n case 'ArrowLeft':\n if (input.selectionStart === 0 && input.selectionEnd === 0 && chips.focusLast()) {\n key.preventDefault();\n close();\n }\n return;\n case 'Tab':\n close();\n return;\n }\n });\n scope.on(input, 'blur', () => {\n chips.arm(null);\n // A click on an option keeps the focus (pointerdown is cancelled there); anything else closes.\n close();\n });\n scope.on(clear, 'click', () => {\n if (!value.length) return;\n press(clear);\n value = [];\n sync(true);\n status.textContent = 'Selección vacía';\n input.focus();\n emit();\n });\n\n sync(false);\n\n return {\n setValue(next, notify = false) {\n if (scope.disposed) return;\n value = next.filter(known).slice(0, max);\n sync(true);\n if (notify) emit();\n },\n setOptions(next) {\n if (scope.disposed) return;\n all = [...next];\n value = value.filter(known);\n sync(false);\n },\n open,\n close,\n get value() {\n return [...value];\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { registerMotion } from '../../core/gsap';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { createChips } from '../../core/chips';\nimport { createListbox, filterOptions } from '../../core/listbox';\nimport { shake } from '../../motion/micro';\n\n/*\n * Tag input: free tags as chips, with suggestions. Enter or a comma adds what\n * was typed (or the highlighted suggestion); pasting \"a, b; c\" adds each, one\n * after another. New chips pop in and removed ones fold away\n * (core/chips.ts); the suggestions open out of the field with a gliding\n * active pill and the typed letters marked (core/listbox.ts). A duplicate\n * rings the chip that already has it; a tag that `validate`, `restrict` or\n * `max` refuses shakes the field and says why under it (aria-invalid, the\n * message described by the input). Backspace in an empty input arms the last\n * chip, then removes it; ← reaches the chips.\n */\n\nexport interface TagInputOptions {\n value?: string[];\n /** Offered while typing (fuzzy, accents ignored). */\n suggestions?: string[];\n placeholder?: string;\n /** Accessible name (default: the authored <label>, else 'Etiquetas'). */\n label?: string;\n /** Hidden inputs name[] for forms. */\n name?: string;\n max?: number;\n /** Only tags from the suggestions. */\n restrict?: boolean;\n allowDuplicates?: boolean;\n /** Return a message to refuse a tag. */\n validate?: (tag: string, tags: string[]) => string | null | undefined | void;\n /** Clean a tag before adding it (default: trim and collapse spaces). */\n transform?: (tag: string) => string;\n disabled?: boolean;\n onChange?: (tags: string[]) => void;\n}\n\nexport interface TagInputInstance extends Instance {\n setValue(tags: string[], notify?: boolean): void;\n /** Add a tag as if typed; false when refused. */\n add(tag: string): boolean;\n remove(tag: string): void;\n setSuggestions(suggestions: string[]): void;\n readonly value: string[];\n}\n\nconst fold = (text: string) => text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\nconst SEPARATORS = /[,;\\n]+/;\nlet sequence = 0;\n\nexport function createTagInput(root: HTMLElement | null, settings: TagInputOptions = {}): TagInputInstance {\n if (!root) return inert({ setValue() {}, add: () => false, remove() {}, setSuggestions() {}, value: [] });\n registerMotion();\n const scope = createScope();\n const uid = `mk-tags-${++sequence}`;\n const max = Number.isFinite(settings.max) && settings.max! > 0 ? Math.floor(settings.max!) : Infinity;\n const clean = settings.transform ?? ((tag: string) => tag.replace(/\\s+/g, ' ').trim());\n let suggestions = [...(settings.suggestions ?? [])];\n let tags: string[] = [];\n const labelText = settings.label ?? root.querySelector('label')?.textContent?.trim() ?? 'Etiquetas';\n\n const field = document.createElement('div');\n field.dataset.mkTagField = '';\n const chips = createChips({ disabled: settings.disabled, onRemove: (tag) => remove(tag, true), onExit: () => input.focus() });\n scope.add(() => chips.destroy());\n const input = document.createElement('input');\n input.type = 'text';\n input.dataset.mkTagInput = '';\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-label', labelText);\n input.setAttribute('aria-describedby', `${uid}-error`);\n input.autocomplete = 'off';\n input.spellcheck = false;\n input.enterKeyHint = 'enter';\n input.disabled = Boolean(settings.disabled);\n field.append(chips.element, input);\n const error = document.createElement('p');\n error.id = `${uid}-error`;\n error.dataset.mkTagError = '';\n error.hidden = true;\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n const hiddenHost = document.createElement('span');\n hiddenHost.hidden = true;\n root.append(field, error, status, hiddenHost);\n scope.add(() => {\n field.remove();\n error.remove();\n status.remove();\n hiddenHost.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n\n const listbox = createListbox({\n input,\n anchor: field,\n host: root,\n label: 'Sugerencias',\n emptyLabel: 'Sin sugerencias',\n onPick: (option) => {\n if (add(option.value, true)) {\n input.value = '';\n listbox.hide();\n }\n },\n });\n scope.add(() => listbox.destroy());\n\n const placeholder = () => {\n input.placeholder = tags.length >= max ? '' : (settings.placeholder ?? 'Añadir etiqueta…');\n };\n const showError = (message: string | null) => {\n error.textContent = message ?? '';\n error.hidden = !message;\n if (message) input.setAttribute('aria-invalid', 'true');\n else input.removeAttribute('aria-invalid');\n };\n const sync = (animate: boolean) => {\n chips.set(tags.map((tag) => ({ value: tag, label: tag })), animate);\n placeholder();\n if (settings.name) {\n hiddenHost.replaceChildren(\n ...tags.map((tag) => {\n const hidden = document.createElement('input');\n hidden.type = 'hidden';\n hidden.name = `${settings.name}[]`;\n hidden.value = tag;\n return hidden;\n }),\n );\n }\n };\n const emit = () => {\n settings.onChange?.([...tags]);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value: [...tags] } }));\n };\n\n /** The suggestions not chosen yet that match the typed text (all of them for an empty query). */\n const available = (query: string) => {\n const chosen = new Set(tags.map(fold));\n return filterOptions(\n suggestions.filter((tag) => !chosen.has(fold(tag))).map((tag) => ({ value: tag, label: tag })),\n query,\n ).slice(0, 50);\n };\n /** While typing: matching suggestions, or none (a new tag needs no empty list). */\n const offer = () => {\n const query = input.value;\n const matches = query.trim() && suggestions.length ? available(query) : [];\n if (!matches.length) return listbox.hide();\n listbox.show(matches, query);\n };\n\n /** Add one tag; false (and why, shaken) when refused. */\n const add = (raw: string, animate: boolean, notify = true) => {\n const tag = clean(raw);\n if (!tag || settings.disabled) return false;\n const refuse = (message: string) => {\n showError(message);\n shake(field);\n return false;\n };\n const twin = tags.find((existing) => fold(existing) === fold(tag));\n if (twin && !settings.allowDuplicates) {\n chips.flash(twin);\n status.textContent = `Ya existe «${twin}»`;\n return false;\n }\n if (tags.length >= max) return refuse(`Máximo ${max} ${max === 1 ? 'etiqueta' : 'etiquetas'}`);\n const known = suggestions.find((suggestion) => fold(suggestion) === fold(tag));\n if (settings.restrict && !known) return refuse(`«${tag}» no está en la lista`);\n const message = settings.validate?.(known ?? tag, [...tags]);\n if (message) return refuse(message);\n tags = [...tags, known ?? tag];\n showError(null);\n chips.arm(null);\n sync(animate);\n status.textContent = `${known ?? tag} añadida`;\n if (notify) emit();\n return true;\n };\n\n const remove = (tag: string, notify: boolean) => {\n if (!tags.includes(tag) || settings.disabled) return;\n tags = tags.filter((existing) => existing !== tag);\n chips.arm(null);\n sync(true);\n status.textContent = `${tag} quitada`;\n if (notify) emit();\n };\n\n const commit = () => {\n if (!input.value.trim()) return false;\n if (add(input.value, true)) {\n input.value = '';\n listbox.hide();\n return true;\n }\n return false;\n };\n\n scope.on(field, 'pointerdown', (event) => {\n const target = event.target as Element | null;\n if (target?.closest('[data-mk-chip-remove]')) return;\n if (target !== input) event.preventDefault();\n input.focus();\n });\n scope.on(input, 'input', () => {\n showError(null);\n chips.arm(null);\n // A typed separator (mobile keyboards have no key events for it) commits what came before.\n if (SEPARATORS.test(input.value)) {\n const parts = input.value.split(SEPARATORS);\n const rest = parts.pop() ?? '';\n for (const part of parts) add(part, true);\n input.value = rest;\n }\n offer();\n });\n scope.on(input, 'paste', (event) => {\n const text = (event as ClipboardEvent).clipboardData?.getData('text') ?? '';\n if (!SEPARATORS.test(text)) return;\n event.preventDefault();\n const parts = text.split(SEPARATORS).map(clean).filter(Boolean);\n let added = 0;\n for (const part of parts) if (add(part, true, false)) added++;\n if (added) emit();\n });\n scope.on(input, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n switch (key.key) {\n case 'Enter':\n if (listbox.isOpen && listbox.active) {\n key.preventDefault();\n listbox.pick();\n } else if (input.value.trim()) {\n key.preventDefault();\n commit();\n }\n return;\n case ',':\n case ';':\n key.preventDefault();\n commit();\n return;\n case 'ArrowDown':\n case 'ArrowUp':\n if (!suggestions.length) return;\n key.preventDefault();\n if (!listbox.isOpen) listbox.show(available(input.value), input.value);\n listbox.move(key.key === 'ArrowDown' ? 1 : -1);\n return;\n case 'Escape':\n if (listbox.isOpen) {\n key.preventDefault();\n listbox.hide();\n }\n return;\n case 'Backspace':\n if (input.value || !tags.length) return;\n key.preventDefault();\n if (chips.armed) remove(chips.armed, true);\n else chips.arm(tags[tags.length - 1]!);\n return;\n case 'ArrowLeft':\n if (input.selectionStart === 0 && input.selectionEnd === 0 && chips.focusLast()) {\n key.preventDefault();\n listbox.hide();\n }\n return;\n case 'Tab':\n listbox.hide();\n return;\n }\n });\n scope.on(input, 'blur', () => {\n chips.arm(null);\n listbox.hide();\n });\n\n for (const tag of settings.value ?? []) add(tag, false, false);\n sync(false);\n\n return {\n setValue(next, notify = false) {\n if (scope.disposed) return;\n tags = [];\n for (const tag of next) {\n const cleaned = clean(tag);\n if (cleaned && (settings.allowDuplicates || !tags.some((existing) => fold(existing) === fold(cleaned)))) tags.push(cleaned);\n }\n tags = tags.slice(0, max);\n showError(null);\n sync(true);\n if (notify) emit();\n },\n add: (tag) => add(tag, true),\n remove: (tag) => remove(tag, true),\n setSuggestions(next) {\n suggestions = [...next];\n if (listbox.isOpen) offer();\n },\n get value() {\n return [...tags];\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { dayKey, toDate, type DateInput } from '../../core/dates';\nimport { daysIn, formatTime, to12, to24 } from '../../core/segments';\nimport { createSegmentField, type SegmentValues } from '../../core/segment-field';\nimport { isPickable, type DayRules } from '../../core/date-range';\nimport { press, shake } from '../../motion/micro';\nimport { flowInMenu } from '../../motion/entrances';\nimport { createDialog } from '../dialog/engine';\nimport { createRangeCalendar } from '../range-calendar/engine';\nimport { createTimeField } from '../time-field/engine';\n\n/*\n * Date-time picker: date and time in one segmented field, in the locale's\n * order and joint (\"23/11/2026, 13:05\" in Spanish; 12 h with AM/PM where the\n * locale writes it). The calendar button grows a panel out of itself (an\n * anchored dialog, like menu) whose content flows in like a menu's options: a\n * one-day calendar (range-calendar, selection: 'single'), a time field and\n * \"Ahora\" / \"Listo\". Picking a day keeps the time; changing the time keeps the\n * day; every change rolls the field's digits. Typing a complete date and time\n * checks min, max and unavailable days: out of bounds marks the field invalid,\n * says why under it and shakes once when focus leaves. onChange reports valid\n * values (and null when the field is emptied).\n */\n\nexport interface DateTimePickerOptions {\n /** A Date or 'YYYY-MM-DDTHH:MM' (local). */\n value?: DateInput | null;\n min?: DateInput | null;\n max?: DateInput | null;\n locale?: string;\n hourCycle?: 12 | 24;\n /** Arrow step of the minutes (default 5). */\n minuteStep?: number;\n firstDay?: number;\n unavailable?: string[] | ((day: Date) => boolean);\n /** Override \"today\" (demos, tests). */\n today?: DateInput;\n /** Accessible name of the field (default 'Fecha y hora'). */\n label?: string;\n /** Hidden input with 'YYYY-MM-DDTHH:MM'. */\n name?: string;\n disabled?: boolean;\n onChange?: (value: Date | null) => void;\n}\n\nexport interface DateTimePickerInstance extends Instance {\n open(): void;\n close(): void;\n setValue(value: DateInput | null): void;\n readonly value: Date | null;\n readonly isOpen: boolean;\n}\n\nconst CALENDAR_ICON =\n '<svg aria-hidden=\"true\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3.5\" y=\"5\" width=\"17\" height=\"15.5\" rx=\"3\"/><path d=\"M3.5 10h17M8 3v4M16 3v4\"/><path d=\"M12 13.5v2.5l1.6 1\"/></svg>';\nlet sequence = 0;\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** A local date-time from a Date or 'YYYY-MM-DD[T ]HH:MM[:SS]'; null when unreadable. */\nexport function toDateTimeValue(input: DateInput | null | undefined): Date | null {\n if (input === null || input === undefined || input === '') return null;\n if (input instanceof Date) return Number.isNaN(input.getTime()) ? null : new Date(input.getTime());\n if (typeof input === 'string') {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2}))?)?$/.exec(input.trim());\n if (match) {\n const date = new Date(2000, 0, 1);\n date.setFullYear(Number(match[1]), Number(match[2]) - 1, Number(match[3]));\n date.setHours(Number(match[4] ?? 0), Number(match[5] ?? 0), Number(match[6] ?? 0), 0);\n return date;\n }\n }\n const parsed = new Date(input);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\n/** 'YYYY-MM-DDTHH:MM' of a local date-time (what <input type=\"datetime-local\"> posts). */\nexport const dateTimeKey = (date: Date) => `${dayKey(date)}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\n\nexport function createDateTimePicker(root: HTMLElement | null, options: DateTimePickerOptions = {}): DateTimePickerInstance {\n if (!root) return inert({ open() {}, close() {}, setValue() {}, value: null, isOpen: false });\n registerMotion();\n const scope = createScope();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n });\n const uid = `mk-datetime-${++sequence}`;\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n const step = options.minuteStep && options.minuteStep > 0 ? Math.round(options.minuteStep) : 5;\n const min = toDateTimeValue(options.min);\n const max = toDateTimeValue(options.max);\n const unavailable = options.unavailable;\n const rules: DayRules = {\n isUnavailable: typeof unavailable === 'function' ? unavailable : Array.isArray(unavailable) ? (day) => unavailable.includes(dayKey(day)) : undefined,\n };\n let value: Date | null = toDateTimeValue(options.value);\n\n const made: Element[] = [];\n const box = document.createElement('div');\n box.dataset.mkDtField = '';\n root.append(box);\n made.push(box);\n const field = createSegmentField(box, {\n kind: 'datetime',\n locale,\n hour12: options.hourCycle ? options.hourCycle === 12 : undefined,\n steps: { minute: step },\n disabled: options.disabled,\n onChange: () => typed(),\n });\n scope.add(() => field.destroy());\n field.element.setAttribute('aria-label', options.label ?? 'Fecha y hora');\n field.element.setAttribute('aria-describedby', `${uid}-error`);\n const twelve = field.element.querySelector('[data-mk-segment=\"dayPeriod\"]') !== null;\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkDtButton = '';\n button.setAttribute('aria-label', 'Abrir calendario');\n button.setAttribute('aria-haspopup', 'dialog');\n button.setAttribute('aria-expanded', 'false');\n button.disabled = Boolean(options.disabled);\n button.innerHTML = CALENDAR_ICON;\n box.append(button);\n const error = document.createElement('p');\n error.id = `${uid}-error`;\n error.dataset.mkDtError = '';\n error.setAttribute('aria-live', 'polite');\n error.hidden = true;\n root.append(error);\n made.push(error);\n\n const dialogElement = document.createElement('dialog');\n // A class, not only an attribute: the copy that folds back into the button on close keeps classes only.\n dialogElement.className = 'mk-dialog mk-dt-popover';\n dialogElement.dataset.mkDtPopover = '';\n dialogElement.setAttribute('aria-label', 'Elegir fecha y hora');\n const calendarHost = document.createElement('div');\n calendarHost.className = 'mk-range-calendar';\n const timeRow = document.createElement('div');\n timeRow.dataset.mkDtTimeRow = '';\n const timeLabel = document.createElement('span');\n timeLabel.dataset.mkDtTimeLabel = '';\n timeLabel.textContent = 'Hora';\n const timeHost = document.createElement('div');\n timeHost.className = 'mk-time-field';\n timeRow.append(timeLabel, timeHost);\n const footer = document.createElement('div');\n footer.dataset.mkDtFooter = '';\n const now = document.createElement('button');\n now.type = 'button';\n now.dataset.mkDtNow = '';\n now.textContent = 'Ahora';\n const done = document.createElement('button');\n done.type = 'button';\n done.dataset.mkDtDone = '';\n done.dataset.mkClose = '';\n done.textContent = 'Listo';\n footer.append(now, done);\n dialogElement.append(calendarHost, timeRow, footer);\n root.append(dialogElement);\n made.push(dialogElement);\n let hidden: HTMLInputElement | null = null;\n if (options.name) {\n hidden = document.createElement('input');\n hidden.type = 'hidden';\n hidden.name = options.name;\n root.append(hidden);\n made.push(hidden);\n }\n scope.add(() => made.forEach((node) => node.remove()));\n // Listeners on the picker hear the picker, not the calendar and time field inside its panel.\n scope.on(dialogElement, 'mk:change', (event) => event.stopPropagation());\n scope.attr(root, 'data-mk-ready', '');\n\n const segmentsOf = (date: Date | null): SegmentValues => {\n if (!date) return { day: null, month: null, year: null, hour: null, minute: null, dayPeriod: null };\n const hour = date.getHours();\n const clock = twelve ? to12(hour) : { hour, period: null };\n return { day: date.getDate(), month: date.getMonth() + 1, year: date.getFullYear(), hour: clock.hour, minute: date.getMinutes(), dayPeriod: clock.period };\n };\n const dateOf = (values: SegmentValues): Date | null => {\n const { day, month, year, hour, minute } = values;\n if (day == null || month == null || year == null || hour == null || minute == null || (twelve && values.dayPeriod == null)) return null;\n if (day > daysIn(year, month)) return null;\n const date = new Date(2000, 0, 1);\n date.setFullYear(year, month - 1, day);\n date.setHours(twelve ? to24(hour, values.dayPeriod!) : hour, minute, 0, 0);\n return date;\n };\n const empty = (values: SegmentValues) => Object.values(values).every((part) => part == null);\n\n const showError = (message: string | null) => {\n error.textContent = message ?? '';\n error.hidden = !message;\n field.invalid(Boolean(message));\n };\n const problem = (date: Date) => {\n if ((min && date < min) || (max && date > max)) return 'Fuera del rango permitido';\n if (!isPickable(toDate(date), rules)) return 'Ese día no está disponible';\n return null;\n };\n\n let calendarReady = false;\n /** Make `next` the value: the field (rolling), the calendar, the time field, the form; report it. */\n const commit = (next: Date | null, fill: boolean, notify = true) => {\n const same = next && value ? next.getTime() === value.getTime() : next === value;\n value = next;\n if (fill) field.setValues(segmentsOf(next), true);\n showError(null);\n if (hidden) hidden.value = next ? dateTimeKey(next) : '';\n if (calendarReady) {\n calendar.setValue(next ? { start: dayKey(next), end: dayKey(next) } : null, false);\n timeField.setValue(next ? formatTime({ hour: next.getHours(), minute: next.getMinutes(), second: 0 }) : null, true);\n }\n if (same || !notify) return;\n options.onChange?.(next ? new Date(next.getTime()) : null);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value: next ? dateTimeKey(next) : null } }));\n };\n\n // Typing: a complete, allowed date-time becomes the value; an emptied field reports null.\n const typed = () => {\n const values = field.values();\n if (empty(values)) return commit(null, false);\n const date = dateOf(values);\n if (!date) return showError(null);\n const why = problem(date);\n if (why) return showError(why);\n commit(date, false);\n };\n scope.on(box, 'focusout', (event) => {\n if (!box.contains((event as FocusEvent).relatedTarget as Node | null) && field.element.hasAttribute('aria-invalid')) keep(shake(box));\n });\n\n /** The time of day to keep when only the day is picked: the value's, else the time field's, else now (on the step). */\n const rounded = (date: Date) => {\n const result = new Date(date.getTime());\n result.setSeconds(0, 0);\n result.setMinutes(Math.round(result.getMinutes() / step) * step);\n return result;\n };\n /** Inside min and max (a day picked in the panel keeps its time unless that falls outside). */\n const clamp = (date: Date) => (min && date < min ? new Date(min.getTime()) : max && date > max ? new Date(max.getTime()) : date);\n const timeOfDay = () => {\n if (value) return { hour: value.getHours(), minute: value.getMinutes() };\n const time = timeField.value?.split(':').map(Number);\n if (time && time.length >= 2) return { hour: time[0]!, minute: time[1]! };\n const current = rounded(new Date());\n return { hour: current.getHours(), minute: current.getMinutes() };\n };\n\n const calendar = createRangeCalendar(calendarHost, {\n selection: 'single',\n value: value ? { start: dayKey(value), end: dayKey(value) } : null,\n firstDay: options.firstDay,\n min: min ? dayKey(min) : null,\n max: max ? dayKey(max) : null,\n unavailable: options.unavailable,\n locale,\n today: options.today,\n onChange: (range) => {\n const { hour, minute } = timeOfDay();\n const next = new Date(range.start.getTime());\n next.setHours(hour, minute, 0, 0);\n commit(clamp(next), true);\n },\n });\n scope.add(() => calendar.destroy());\n const timeField = createTimeField(timeHost, {\n value: value ? formatTime({ hour: value.getHours(), minute: value.getMinutes(), second: 0 }) : null,\n locale,\n hourCycle: options.hourCycle,\n minuteStep: step,\n label: 'Hora',\n onChange: (time) => {\n if (!time) return;\n const [hour, minute] = time.split(':').map(Number);\n const base = value ?? toDate(options.today ?? new Date());\n const next = new Date(base.getTime());\n next.setHours(hour!, minute!, 0, 0);\n commit(clamp(next), true);\n },\n });\n scope.add(() => timeField.destroy());\n calendarReady = true;\n\n const startDay = () => value ?? toDate(options.today ?? new Date());\n const popover = createDialog(dialogElement, {\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n triggers: false,\n animateContent: false,\n onOpen: () => {\n calendar.focusDay(startDay(), false);\n // Like a menu's options: the calendar, the time and the buttons flow in while the surface grows.\n keep(flowInMenu([...dialogElement.querySelectorAll<HTMLElement>('[data-mk-range-header], [data-mk-range-month], [data-mk-dt-time-row], [data-mk-dt-footer]')]));\n },\n onClose: () => button.setAttribute('aria-expanded', 'false'),\n });\n scope.add(() => popover.destroy());\n\n const open = () => {\n if (options.disabled || popover.isOpen) return;\n // The calendar shows the value's month before the panel is measured and placed.\n calendar.setValue(value ? { start: dayKey(value), end: dayKey(value) } : null, false);\n calendar.focusDay(startDay(), false);\n popover.open(button);\n button.setAttribute('aria-expanded', 'true');\n };\n scope.on(button, 'click', () => {\n keep(press(button));\n if (popover.isOpen) popover.close();\n else open();\n });\n scope.on(now, 'click', () => {\n keep(press(now));\n const current = rounded(new Date());\n commit(problem(current) ? value : current, true);\n calendar.focusDay(current, false);\n });\n\n field.setValues(segmentsOf(value));\n if (hidden) hidden.value = value ? dateTimeKey(value) : '';\n\n return {\n open,\n close: () => popover.close(),\n setValue(next) {\n if (scope.disposed) return;\n commit(toDateTimeValue(next), true, false);\n },\n get value() {\n return value ? new Date(value.getTime()) : null;\n },\n get isOpen() {\n return popover.isOpen;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { toDate } from './dates';\n\n/*\n * Filters (filter-builder, data-table): groups of conditions combined with\n * AND / OR, nested. Each field has a type; each type its operators, with\n * Spanish labels and how many values they take. matchesFilter() tests a\n * record (text ignores case and accents; dates compare whole days; incomplete\n * conditions do not filter); describeFilter() writes the filter as a sentence\n * (\"Estado es Activo y (Monto mayor que 100 o País es México)\").\n */\n\nexport type FilterFieldType = 'text' | 'number' | 'date' | 'select' | 'boolean';\n\nexport interface FilterField {\n key: string;\n label: string;\n type?: FilterFieldType;\n /** 'select' fields: the values to choose from. */\n options?: Array<{ value: string; label: string }>;\n}\n\nexport type FilterValue = string | number | null | [string | number | null, string | number | null];\n\nexport interface FilterRule {\n id: string;\n field: string;\n operator: string;\n value?: FilterValue;\n}\n\nexport interface FilterGroup {\n id: string;\n combinator: 'and' | 'or';\n rules: FilterNode[];\n}\n\nexport type FilterNode = FilterRule | FilterGroup;\n\nexport interface OperatorDef {\n id: string;\n label: string;\n /** How many values it takes. */\n arity: 0 | 1 | 2;\n}\n\nexport const OPERATORS: Record<FilterFieldType, OperatorDef[]> = {\n text: [\n { id: 'contains', label: 'contiene', arity: 1 },\n { id: 'not_contains', label: 'no contiene', arity: 1 },\n { id: 'equals', label: 'es', arity: 1 },\n { id: 'not_equals', label: 'no es', arity: 1 },\n { id: 'starts', label: 'empieza por', arity: 1 },\n { id: 'ends', label: 'termina en', arity: 1 },\n { id: 'empty', label: 'está vacío', arity: 0 },\n { id: 'not_empty', label: 'no está vacío', arity: 0 },\n ],\n number: [\n { id: 'eq', label: 'igual a', arity: 1 },\n { id: 'neq', label: 'distinto de', arity: 1 },\n { id: 'gt', label: 'mayor que', arity: 1 },\n { id: 'gte', label: 'mayor o igual que', arity: 1 },\n { id: 'lt', label: 'menor que', arity: 1 },\n { id: 'lte', label: 'menor o igual que', arity: 1 },\n { id: 'between', label: 'entre', arity: 2 },\n { id: 'empty', label: 'está vacío', arity: 0 },\n { id: 'not_empty', label: 'no está vacío', arity: 0 },\n ],\n date: [\n { id: 'on', label: 'es el', arity: 1 },\n { id: 'before', label: 'antes del', arity: 1 },\n { id: 'after', label: 'después del', arity: 1 },\n { id: 'between', label: 'entre', arity: 2 },\n { id: 'empty', label: 'está vacío', arity: 0 },\n { id: 'not_empty', label: 'no está vacío', arity: 0 },\n ],\n select: [\n { id: 'is', label: 'es', arity: 1 },\n { id: 'is_not', label: 'no es', arity: 1 },\n { id: 'empty', label: 'está vacío', arity: 0 },\n { id: 'not_empty', label: 'no está vacío', arity: 0 },\n ],\n boolean: [\n { id: 'true', label: 'es sí', arity: 0 },\n { id: 'false', label: 'es no', arity: 0 },\n ],\n};\n\nlet sequence = 0;\nexport const filterId = () => `f${(++sequence).toString(36)}${Math.random().toString(36).slice(2, 6)}`;\n\nexport const isGroup = (node: FilterNode): node is FilterGroup => 'rules' in node && Array.isArray((node as FilterGroup).rules);\n\nexport const emptyFilter = (combinator: 'and' | 'or' = 'and'): FilterGroup => ({ id: filterId(), combinator, rules: [] });\n\nexport const typeOf = (field: FilterField | undefined): FilterFieldType => field?.type ?? 'text';\n\nexport const operatorsFor = (field: FilterField | undefined) => OPERATORS[typeOf(field)];\n\nexport const operatorOf = (field: FilterField | undefined, id: string) => operatorsFor(field).find((operator) => operator.id === id) ?? operatorsFor(field)[0]!;\n\n/** A new condition on `field`: its type's first operator, no value yet. */\nexport function newRule(field: FilterField): FilterRule {\n const operator = operatorsFor(field)[0]!;\n return { id: filterId(), field: field.key, operator: operator.id, value: operator.arity === 2 ? [null, null] : null };\n}\n\nconst blank = (value: unknown) => value === null || value === undefined || (typeof value === 'string' && value.trim() === '');\n\n/** The condition has every value its operator needs. */\nexport function isComplete(rule: FilterRule, fields: FilterField[]): boolean {\n const field = fields.find((candidate) => candidate.key === rule.field);\n if (!field) return false;\n const { arity } = operatorOf(field, rule.operator);\n if (arity === 0) return true;\n if (arity === 1) return !blank(rule.value);\n return Array.isArray(rule.value) && !blank(rule.value[0]) && !blank(rule.value[1]);\n}\n\nconst fold = (value: unknown) => String(value ?? '').normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase().trim();\nconst day = (value: unknown) => {\n if (blank(value)) return null;\n const date = toDate(value as string, new Date(Number.NaN));\n return Number.isNaN(date.getTime()) ? null : date.getTime();\n};\n\nfunction testRule(record: Record<string, unknown>, rule: FilterRule, field: FilterField): boolean {\n const raw = record[field.key];\n const type = typeOf(field);\n const { id } = operatorOf(field, rule.operator);\n if (id === 'empty') return blank(raw);\n if (id === 'not_empty') return !blank(raw);\n const [a, b] = Array.isArray(rule.value) ? rule.value : [rule.value, null];\n switch (type) {\n case 'number': {\n const n = Number(raw);\n const x = Number(a);\n const y = Number(b);\n if (blank(raw) || Number.isNaN(n)) return false;\n if (id === 'eq') return n === x;\n if (id === 'neq') return n !== x;\n if (id === 'gt') return n > x;\n if (id === 'gte') return n >= x;\n if (id === 'lt') return n < x;\n if (id === 'lte') return n <= x;\n return n >= Math.min(x, y) && n <= Math.max(x, y);\n }\n case 'date': {\n const n = day(raw);\n const x = day(a);\n const y = day(b);\n if (n === null || x === null) return false;\n if (id === 'on') return n === x;\n if (id === 'before') return n < x;\n if (id === 'after') return n > x;\n return y !== null && n >= Math.min(x, y) && n <= Math.max(x, y);\n }\n case 'boolean':\n return id === 'true' ? Boolean(raw) : !raw;\n case 'select':\n return id === 'is' ? String(raw) === String(a) : String(raw) !== String(a);\n default: {\n const text = fold(raw);\n const needle = fold(a);\n if (id === 'contains') return text.includes(needle);\n if (id === 'not_contains') return !text.includes(needle);\n if (id === 'equals') return text === needle;\n if (id === 'not_equals') return text !== needle;\n if (id === 'starts') return text.startsWith(needle);\n return text.endsWith(needle);\n }\n }\n}\n\n/** Whether `record` passes `filter`; incomplete conditions (and empty groups) do not filter. */\nexport function matchesFilter(record: Record<string, unknown>, filter: FilterGroup, fields: FilterField[]): boolean {\n const results: boolean[] = [];\n for (const node of filter.rules) {\n if (isGroup(node)) {\n if (!hasConditions(node, fields)) continue;\n results.push(matchesFilter(record, node, fields));\n continue;\n }\n const field = fields.find((candidate) => candidate.key === node.field);\n if (!field || !isComplete(node, fields)) continue;\n results.push(testRule(record, node, field));\n }\n if (!results.length) return true;\n return filter.combinator === 'and' ? results.every(Boolean) : results.some(Boolean);\n}\n\n/** The group holds at least one complete condition (at any depth). */\nexport function hasConditions(filter: FilterGroup, fields: FilterField[]): boolean {\n return filter.rules.some((node) => (isGroup(node) ? hasConditions(node, fields) : isComplete(node, fields)));\n}\n\nconst shown = (field: FilterField, value: unknown) => {\n if (blank(value)) return '…';\n if (typeOf(field) === 'select') return field.options?.find((option) => option.value === String(value))?.label ?? String(value);\n if (typeOf(field) === 'date') {\n const date = toDate(value as string, new Date(Number.NaN));\n if (!Number.isNaN(date.getTime())) return new Intl.DateTimeFormat('es', { day: 'numeric', month: 'short', year: 'numeric' }).format(date);\n }\n return String(value);\n};\n\n/** The filter as a sentence; incomplete conditions are left out. Empty: ''. */\nexport function describeFilter(filter: FilterGroup, fields: FilterField[], nested = false): string {\n const joiner = filter.combinator === 'and' ? ' y ' : ' o ';\n const parts: string[] = [];\n for (const node of filter.rules) {\n if (isGroup(node)) {\n const inner = describeFilter(node, fields, true);\n if (inner) parts.push(inner);\n continue;\n }\n const field = fields.find((candidate) => candidate.key === node.field);\n if (!field || !isComplete(node, fields)) continue;\n const operator = operatorOf(field, node.operator);\n const [a, b] = Array.isArray(node.value) ? node.value : [node.value, null];\n const values = operator.arity === 0 ? '' : operator.arity === 1 ? ` ${shown(field, a)}` : ` ${shown(field, a)} y ${shown(field, b)}`;\n parts.push(`${field.label} ${operator.label}${values}`);\n }\n if (!parts.length) return '';\n const text = parts.join(joiner);\n return nested && parts.length > 1 ? `(${text})` : text;\n}\n\n/** A deep copy (callbacks get their own). */\nexport const cloneFilter = (filter: FilterGroup): FilterGroup => JSON.parse(JSON.stringify(filter)) as FilterGroup;\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport {\n cloneFilter, describeFilter, emptyFilter, filterId, isGroup, newRule, operatorOf, operatorsFor, typeOf,\n type FilterField, type FilterGroup, type FilterNode, type FilterRule,\n} from '../../core/filter';\nimport { blurIn, collapse, press, rollDigits, shake } from '../../motion/micro';\nimport { slideIndicator } from '../../motion/indicator';\n\n/*\n * Filter builder: conditions (field · operator · value) in groups combined\n * with Y (all) or O (any), nested up to maxDepth. The Y/O switch is a\n * segmented control whose indicator slides (.45 s, signature) while the\n * connectors between the conditions roll to the new letter; a new condition or\n * group drops in out of a blur (y −20, blur 16) with its field focused; a\n * removed one folds away (height to 0, blur). The value control follows the\n * field's type (text, number, date, a list, yes/no) and the operator's arity\n * (\"entre\" takes two); a number that is not one shakes. Every change reports\n * a copy of the filter (onChange) and the sentence that reads it.\n */\n\nexport interface FilterBuilderOptions {\n /** The fields to filter by (without them the builder stays inert). */\n fields?: FilterField[];\n value?: FilterGroup;\n /** Levels of groups (default 2: groups inside the main one). */\n maxDepth?: number;\n /** Accessible name (default 'Filtros'). */\n label?: string;\n /** The sentence under the builder (default true). */\n summary?: boolean;\n onChange?: (filter: FilterGroup) => void;\n}\n\nexport interface FilterBuilderInstance extends Instance {\n setValue(filter: FilterGroup): void;\n clear(): void;\n readonly value: FilterGroup;\n readonly summary: string;\n}\n\nconst CLOSE = '<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>';\nconst COMBINATOR = { and: { short: 'Y', long: 'todas las condiciones', connector: 'y' }, or: { short: 'O', long: 'alguna condición', connector: 'o' } } as const;\n\nconst el = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs: Record<string, string> = {}, text?: string) => {\n const element = document.createElement(tag);\n for (const [name, value] of Object.entries(attrs)) element.setAttribute(name, value);\n if (text !== undefined) element.textContent = text;\n return element;\n};\n\nexport function createFilterBuilder(root: HTMLElement | null, options: FilterBuilderOptions = {}): FilterBuilderInstance {\n if (!root || !options.fields?.length) return inert({ setValue() {}, clear() {}, value: emptyFilter(), summary: '' });\n registerMotion();\n const scope = createScope();\n const fields = options.fields;\n const maxDepth = Number.isFinite(options.maxDepth) && options.maxDepth! >= 1 ? Math.floor(options.maxDepth!) : 2;\n let model: FilterGroup = options.value ? cloneFilter(options.value) : emptyFilter();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n const tree = el('div', { 'data-mk-fb-tree': '', role: 'group', 'aria-label': options.label ?? 'Filtros' });\n const summary = el('p', { 'data-mk-fb-summary': '', 'aria-live': 'polite' });\n summary.hidden = options.summary === false;\n root.append(tree, summary);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n tree.remove();\n summary.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n\n const fieldOf = (key: string) => fields.find((field) => field.key === key);\n /** The node with `id` and the group holding it. */\n const find = (id: string, group: FilterGroup = model, parent: FilterGroup | null = null): { node: FilterNode; parent: FilterGroup | null } | null => {\n if (group.id === id) return { node: group, parent };\n for (const node of group.rules) {\n if (node.id === id) return { node, parent: group };\n if (isGroup(node)) {\n const found = find(id, node, group);\n if (found) return found;\n }\n }\n return null;\n };\n\n const describe = () => {\n const text = describeFilter(model, fields);\n summary.textContent = text ? `Mostrar donde ${text}.` : 'Sin filtros: se muestra todo.';\n };\n const emit = () => {\n describe();\n options.onChange?.(cloneFilter(model));\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value: cloneFilter(model), summary: describeFilter(model, fields) } }));\n };\n\n // ── Value controls ───────────────────────────────────────────────────────\n const valueControl = (rule: FilterRule, index: 0 | 1) => {\n const field = fieldOf(rule.field);\n const type = typeOf(field);\n const current = Array.isArray(rule.value) ? rule.value[index] : rule.value;\n let control: HTMLInputElement | HTMLSelectElement;\n if (type === 'select') {\n control = el('select');\n control.append(el('option', { value: '' }, 'Elige…'), ...(field?.options ?? []).map((option) => el('option', { value: option.value }, option.label)));\n } else {\n control = el('input');\n control.type = type === 'number' ? 'text' : type === 'date' ? 'date' : 'text';\n if (type === 'number') control.inputMode = 'decimal';\n control.placeholder = type === 'number' ? '0' : 'Valor';\n }\n control.dataset.mkFbValue = String(index);\n control.setAttribute('aria-label', index === 1 ? 'Hasta' : operatorOf(field, rule.operator).arity === 2 ? 'Desde' : 'Valor');\n control.value = current === null || current === undefined ? '' : String(current);\n return control;\n };\n\n const fillValues = (row: HTMLElement, rule: FilterRule) => {\n const host = row.querySelector<HTMLElement>('[data-mk-fb-values]')!;\n const { arity } = operatorOf(fieldOf(rule.field), rule.operator);\n host.replaceChildren();\n if (arity === 0) return;\n host.append(valueControl(rule, 0));\n if (arity === 2) host.append(el('span', { 'data-mk-fb-and': '', 'aria-hidden': 'true' }, 'y'), valueControl(rule, 1));\n };\n\n const fillOperators = (row: HTMLElement, rule: FilterRule) => {\n const select = row.querySelector<HTMLSelectElement>('[data-mk-fb-operator]')!;\n select.replaceChildren(...operatorsFor(fieldOf(rule.field)).map((operator) => el('option', { value: operator.id }, operator.label)));\n select.value = rule.operator;\n };\n\n const ruleRow = (rule: FilterRule) => {\n const row = el('div', { 'data-mk-fb-rule': '', 'data-id': rule.id, role: 'group', 'aria-label': 'Condición' });\n const field = el('select', { 'data-mk-fb-field': '', 'aria-label': 'Campo' });\n field.append(...fields.map((candidate) => el('option', { value: candidate.key }, candidate.label)));\n field.value = rule.field;\n const operator = el('select', { 'data-mk-fb-operator': '', 'aria-label': 'Operador' });\n const values = el('span', { 'data-mk-fb-values': '' });\n const remove = el('button', { type: 'button', 'data-mk-fb-remove': '', 'aria-label': 'Quitar condición' });\n remove.innerHTML = CLOSE;\n row.append(field, operator, values, remove);\n fillOperators(row, rule);\n fillValues(row, rule);\n return row;\n };\n\n const connector = (group: FilterGroup) => el('span', { 'data-mk-fb-connector': '', 'aria-hidden': 'true' }, COMBINATOR[group.combinator].connector);\n\n const groupBox = (group: FilterGroup, depth: number): HTMLElement => {\n const box = el('div', { 'data-mk-fb-group': '', 'data-id': group.id, 'data-depth': String(depth), role: 'group', 'aria-label': depth ? 'Grupo de condiciones' : 'Condiciones' });\n const head = el('div', { 'data-mk-fb-head': '' });\n const switcher = el('div', { 'data-mk-fb-combinator': '', role: 'radiogroup', 'aria-label': 'Cumplir' });\n const indicator = el('span', { 'data-mk-fb-indicator': '', 'aria-hidden': 'true' });\n switcher.append(indicator);\n for (const kind of ['and', 'or'] as const) {\n const option = el('button', { type: 'button', role: 'radio', 'data-combinator': kind, 'aria-checked': String(group.combinator === kind), 'aria-label': COMBINATOR[kind].long }, COMBINATOR[kind].short);\n option.tabIndex = group.combinator === kind ? 0 : -1;\n switcher.append(option);\n }\n const caption = el('span', { 'data-mk-fb-caption': '' }, `Cumplir ${COMBINATOR[group.combinator].long}`);\n head.append(switcher, caption);\n if (depth > 0) {\n const removeGroup = el('button', { type: 'button', 'data-mk-fb-remove-group': '', 'aria-label': 'Quitar grupo' });\n removeGroup.innerHTML = CLOSE;\n head.append(removeGroup);\n }\n const rules = el('div', { 'data-mk-fb-rules': '' });\n group.rules.forEach((node, i) => {\n if (i) rules.append(connector(group));\n rules.append(isGroup(node) ? groupBox(node, depth + 1) : ruleRow(node));\n });\n const actions = el('div', { 'data-mk-fb-actions': '' });\n actions.append(el('button', { type: 'button', 'data-mk-fb-add-rule': '' }, '+ Condición'));\n // A group at depth d holds another while it stays within maxDepth levels.\n if (depth + 1 < maxDepth) actions.append(el('button', { type: 'button', 'data-mk-fb-add-group': '' }, '+ Grupo'));\n box.append(head, rules, actions);\n return box;\n };\n\n /** The indicator of every switch sits under its chosen option. */\n const placeIndicators = (immediate: boolean) => {\n for (const switcher of tree.querySelectorAll<HTMLElement>('[data-mk-fb-combinator]')) {\n const chosen = switcher.querySelector<HTMLElement>('[aria-checked=\"true\"]');\n keep(slideIndicator(switcher.querySelector<HTMLElement>('[data-mk-fb-indicator]')!, chosen, { immediate }));\n }\n };\n\n const render = () => {\n tree.replaceChildren(groupBox(model, 0));\n placeIndicators(true);\n describe();\n };\n\n const boxOf = (id: string) => tree.querySelector<HTMLElement>(`[data-mk-fb-group][data-id=\"${id}\"]`);\n const rowOf = (id: string) => tree.querySelector<HTMLElement>(`[data-mk-fb-rule][data-id=\"${id}\"]`);\n const ruleOf = (element: Element) => find(element.closest<HTMLElement>('[data-mk-fb-rule]')!.dataset.id!)!.node as FilterRule;\n\n const add = (group: FilterGroup, node: FilterNode) => {\n const box = boxOf(group.id)!;\n const rules = box.querySelector<HTMLElement>(':scope > [data-mk-fb-rules]')!;\n group.rules.push(node);\n const depth = Number(box.dataset.depth);\n const element = isGroup(node) ? groupBox(node, depth + 1) : ruleRow(node);\n const parts: HTMLElement[] = [];\n if (group.rules.length > 1) {\n const link = connector(group);\n rules.append(link);\n parts.push(link);\n }\n rules.append(element);\n parts.push(element);\n if (isGroup(node)) placeIndicators(true);\n keep(blurIn(parts, { from: 'rise', stagger: 0.04 }));\n element.querySelector<HTMLElement>('select, input')?.focus();\n emit();\n };\n\n const removeNode = (id: string) => {\n const found = find(id);\n if (!found?.parent) return;\n const { parent } = found;\n const element = tree.querySelector<HTMLElement>(`[data-id=\"${id}\"]`)!;\n const index = parent.rules.findIndex((node) => node.id === id);\n parent.rules.splice(index, 1);\n // The connector before it (or after it, for the first) goes too.\n const link = (element.previousElementSibling?.matches('[data-mk-fb-connector]') ? element.previousElementSibling : element.nextElementSibling?.matches('[data-mk-fb-connector]') ? element.nextElementSibling : null) as HTMLElement | null;\n const box = boxOf(parent.id)!;\n const focusAfter = box.querySelector<HTMLElement>(':scope > [data-mk-fb-actions] button');\n const gone = () => {\n element.remove();\n link?.remove();\n };\n if (reduced()) gone();\n else {\n keep(collapse(element, { onComplete: gone }));\n if (link) keep(collapse(link));\n }\n focusAfter?.focus();\n emit();\n };\n\n const setCombinator = (group: FilterGroup, kind: 'and' | 'or') => {\n if (group.combinator === kind) return;\n group.combinator = kind;\n const box = boxOf(group.id)!;\n const switcher = box.querySelector<HTMLElement>(':scope > [data-mk-fb-head] [data-mk-fb-combinator]')!;\n for (const option of switcher.querySelectorAll<HTMLElement>('[role=\"radio\"]')) {\n const on = option.dataset.combinator === kind;\n option.setAttribute('aria-checked', String(on));\n option.tabIndex = on ? 0 : -1;\n }\n keep(slideIndicator(switcher.querySelector<HTMLElement>('[data-mk-fb-indicator]')!, switcher.querySelector<HTMLElement>('[aria-checked=\"true\"]')));\n box.querySelector<HTMLElement>(':scope > [data-mk-fb-head] [data-mk-fb-caption]')!.textContent = `Cumplir ${COMBINATOR[kind].long}`;\n const links = [...box.querySelectorAll<HTMLElement>(':scope > [data-mk-fb-rules] > [data-mk-fb-connector]')];\n links.forEach((link, i) => {\n if (reduced()) link.textContent = COMBINATOR[kind].connector;\n else keep(gsap.delayedCall(i * 0.03, () => keep(rollDigits(link, COMBINATOR[kind].connector, kind === 'or' ? 1 : -1, 0.3))));\n });\n emit();\n };\n\n scope.on(tree, 'click', (event) => {\n const target = event.target as Element | null;\n const button = target?.closest<HTMLElement>('button');\n if (!button || !tree.contains(button)) return;\n const box = button.closest<HTMLElement>('[data-mk-fb-group]')!;\n const group = find(box.dataset.id!)!.node as FilterGroup;\n if (button.matches('[data-combinator]')) return setCombinator(group, button.dataset.combinator as 'and' | 'or');\n keep(press(button));\n if (button.matches('[data-mk-fb-add-rule]')) add(group, newRule(fields[0]!));\n else if (button.matches('[data-mk-fb-add-group]')) add(group, { id: filterId(), combinator: 'and', rules: [newRule(fields[0]!)] });\n else if (button.matches('[data-mk-fb-remove]')) removeNode(button.closest<HTMLElement>('[data-mk-fb-rule]')!.dataset.id!);\n else if (button.matches('[data-mk-fb-remove-group]')) removeNode(box.dataset.id!);\n });\n // Arrows move the Y/O choice, like radios.\n scope.on(tree, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const option = (key.target as Element | null)?.closest<HTMLElement>('[data-combinator]');\n if (!option || !['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(key.key)) return;\n key.preventDefault();\n const group = find(option.closest<HTMLElement>('[data-mk-fb-group]')!.dataset.id!)!.node as FilterGroup;\n const next = group.combinator === 'and' ? 'or' : 'and';\n setCombinator(group, next);\n option.parentElement!.querySelector<HTMLElement>(`[data-combinator=\"${next}\"]`)!.focus();\n });\n scope.on(tree, 'change', (event) => {\n const target = event.target as HTMLElement;\n const row = target.closest<HTMLElement>('[data-mk-fb-rule]');\n if (!row) return;\n const rule = ruleOf(row);\n if (target.matches('[data-mk-fb-field]')) {\n const fresh = newRule(fieldOf((target as HTMLSelectElement).value)!);\n rule.field = fresh.field;\n rule.operator = fresh.operator;\n rule.value = fresh.value;\n fillOperators(row, rule);\n fillValues(row, rule);\n const values = row.querySelector<HTMLElement>('[data-mk-fb-values]')!;\n if (values.children.length && !reduced()) keep(blurIn([...values.children], { from: 'soft', stagger: 0.03 }));\n } else if (target.matches('[data-mk-fb-operator]')) {\n const before = operatorOf(fieldOf(rule.field), rule.operator).arity;\n rule.operator = (target as HTMLSelectElement).value;\n const after = operatorOf(fieldOf(rule.field), rule.operator).arity;\n if (before !== after) {\n rule.value = after === 2 ? [Array.isArray(rule.value) ? rule.value[0] : (rule.value ?? null), null] : after === 1 ? (Array.isArray(rule.value) ? rule.value[0] : (rule.value ?? null)) : null;\n fillValues(row, rule);\n const values = row.querySelector<HTMLElement>('[data-mk-fb-values]')!;\n if (values.children.length && !reduced()) keep(blurIn([...values.children], { from: 'soft', stagger: 0.03 }));\n }\n } else if (target.matches('[data-mk-fb-value]') && target instanceof HTMLSelectElement) {\n rule.value = target.value || null;\n } else return;\n emit();\n });\n scope.on(tree, 'input', (event) => {\n const target = event.target as HTMLElement;\n if (!(target instanceof HTMLInputElement) || !target.matches('[data-mk-fb-value]')) return;\n const rule = ruleOf(target);\n const field = fieldOf(rule.field);\n const text = target.value;\n const number = typeOf(field) === 'number';\n const parsed = number ? (text.trim() === '' ? null : Number(text.replace(',', '.'))) : text;\n if (number && parsed !== null && Number.isNaN(parsed)) target.setAttribute('aria-invalid', 'true');\n else target.removeAttribute('aria-invalid');\n const value = number && (parsed === null || Number.isNaN(parsed as number)) ? null : (parsed as string | number | null);\n if (Array.isArray(rule.value)) rule.value[target.dataset.mkFbValue === '1' ? 1 : 0] = value;\n else rule.value = value;\n emit();\n });\n scope.on(tree, 'focusout', (event) => {\n const target = event.target as HTMLElement;\n if (target.getAttribute('aria-invalid') === 'true') keep(shake(target));\n });\n\n render();\n\n return {\n setValue(next) {\n if (scope.disposed) return;\n model = cloneFilter(next);\n render();\n },\n clear() {\n model = emptyFilter(model.combinator);\n render();\n emit();\n },\n get value() {\n return cloneFilter(model);\n },\n get summary() {\n return describeFilter(model, fields);\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { capitalize, safeFormat, startOfDay } from './dates';\n\n/*\n * Relative times for timelines and feeds: \"ahora\", \"hace 5 min\", \"hace 2 h\",\n * \"ayer\", \"hace 3 días\", then the date (\"12 nov.\"; with the year when it is\n * another one). dayLabel() heads groups of a day: \"Hoy\", \"Ayer\",\n * \"Lunes, 12 de noviembre\". everyMinute() shares one timer between every\n * component that refreshes its times.\n */\n\nexport type TimeInput = Date | string | number;\n\n/** A date from a Date, an ISO string or a timestamp; null when unreadable. */\nexport function toTime(input: TimeInput | null | undefined): Date | null {\n if (input === null || input === undefined || input === '') return null;\n if (input instanceof Date) return Number.isNaN(input.getTime()) ? null : input;\n if (typeof input === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(input.trim())) {\n const [y, m, d] = input.trim().split('-').map(Number);\n return new Date(y!, m! - 1, d!);\n }\n const date = new Date(input);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/** Short for minutes and hours (\"hace 5 min\", \"hace 2 h\"), long for days (\"hace 3 días\", \"ayer\"). */\nconst relative = (locale: string, style: 'short' | 'long' = 'short') => {\n try {\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto', style });\n } catch {\n return new Intl.RelativeTimeFormat(undefined, { numeric: 'auto', style });\n }\n};\n\nconst daysBetween = (a: Date, b: Date) => Math.round((startOfDay(a).getTime() - startOfDay(b).getTime()) / 86_400_000);\n\n/** \"ahora\", \"hace 5 min\", \"hace 2 h\", \"ayer\", \"hace 3 días\", then \"12 nov.\" (with the year when it differs). */\nexport function relativeTime(date: Date, now: Date = new Date(), locale = 'es'): string {\n const seconds = Math.round((date.getTime() - now.getTime()) / 1000);\n const abs = Math.abs(seconds);\n const format = relative(locale);\n if (abs < 45) return locale.startsWith('es') ? 'ahora' : format.format(0, 'second');\n if (abs < 3600) return format.format(Math.round(seconds / 60), 'minute');\n const days = daysBetween(date, now);\n if (days === 0) return format.format(Math.round(seconds / 3600), 'hour');\n if (Math.abs(days) < 7) return relative(locale, 'long').format(days, 'day');\n const sameYear = date.getFullYear() === now.getFullYear();\n return safeFormat(locale, { day: 'numeric', month: 'short', ...(sameYear ? {} : { year: 'numeric' }) }).format(date);\n}\n\n/** The full date and time, for a title or a screen reader. */\nexport function fullTime(date: Date, locale = 'es'): string {\n return safeFormat(locale, { dateStyle: 'full', timeStyle: 'short' }).format(date);\n}\n\n/** \"Hoy\", \"Ayer\", \"Mañana\", else \"Lunes, 12 de noviembre\" (with the year when it differs). */\nexport function dayLabel(date: Date, now: Date = new Date(), locale = 'es'): string {\n const days = daysBetween(date, now);\n if (Math.abs(days) <= 1) return capitalize(relative(locale, 'long').format(days, 'day'));\n const sameYear = date.getFullYear() === now.getFullYear();\n return capitalize(safeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', ...(sameYear ? {} : { year: 'numeric' }) }).format(date));\n}\n\nconst listeners = new Set<() => void>();\nlet timer: ReturnType<typeof setInterval> | undefined;\n\n/** Call `fn` every minute (one shared timer); returns the function that stops it. */\nexport function everyMinute(fn: () => void): () => void {\n listeners.add(fn);\n timer ??= setInterval(() => listeners.forEach((listener) => listener()), 60_000);\n return () => {\n listeners.delete(fn);\n if (!listeners.size && timer !== undefined) {\n clearInterval(timer);\n timer = undefined;\n }\n };\n}\n","import { gsap, EASE, Flip, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { TIMING } from '../../core/timing';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { dayKey, fromJson } from '../../core/dates';\nimport { dayLabel, everyMinute, fullTime, relativeTime, toTime, type TimeInput } from '../../core/relative-time';\nimport { blurIn, collapse } from '../../motion/micro';\n\n/*\n * Timeline: events in order along a rail — dots with an icon or a state, a\n * time (\"hace 2 h\", the full date in its title; refreshed every minute), a\n * title, a description and small meta. When it comes into view the rail draws\n * itself from the first dot (.8 s, wipe) and the events cascade in out of a\n * blur (60 ms apart); the done stretch of the rail is filled in the accent up\n * to the current event, whose dot breathes. add() drops an event in at the\n * start or the end: the others glide to make room (layout reflow, the rail\n * following), it comes in out of a blur, its dot pops and a soft highlight\n * fades behind it; update() changes one in place (a new state pops its dot);\n * remove() folds one away. 'alternate' puts the events on both sides of the\n * rail when there is room; `group` heads each day with a chip on the rail.\n */\n\nexport type TimelineStatus = 'done' | 'current' | 'upcoming' | 'error';\n\nexport interface TimelineEvent {\n id: string;\n title: string;\n description?: string;\n time?: TimeInput;\n status?: TimelineStatus;\n /** A short glyph in the dot (an emoji or one or two letters). */\n icon?: string;\n /** Small text under it (an author, a place). */\n meta?: string;\n}\n\nexport interface TimelineOptions {\n events?: TimelineEvent[];\n /** 'start' (default): the rail on the left; 'alternate': both sides on wide screens. */\n layout?: 'start' | 'alternate';\n /** A heading for each day (default false). */\n group?: boolean;\n /** Times as \"hace 2 h\", refreshed every minute (default true); false shows the date and time. */\n relative?: boolean;\n locale?: string;\n /** Accessible name of the list (default 'Historial'). */\n label?: string;\n}\n\nexport interface TimelineInstance extends Instance {\n add(event: TimelineEvent, at?: 'start' | 'end'): void;\n update(id: string, patch: Partial<Omit<TimelineEvent, 'id'>>): void;\n remove(id: string): void;\n setEvents(events: TimelineEvent[]): void;\n readonly events: TimelineEvent[];\n}\n\nconst STATUS_LABEL: Record<TimelineStatus, string> = { done: 'Hecho', current: 'En curso', upcoming: 'Pendiente', error: 'Con error' };\n\n/** Events written as <li data-status data-time data-icon>Title<p>description</p></li>. */\nconst readAuthored = (root: HTMLElement): TimelineEvent[] =>\n [...root.querySelectorAll<HTMLElement>(':scope > ol > li, :scope > ul > li')].map((item, i) => {\n const description = item.querySelector('p')?.textContent?.trim();\n const title = [...item.childNodes].filter((node) => node.nodeType === Node.TEXT_NODE || (node instanceof HTMLElement && node.tagName !== 'P')).map((node) => node.textContent).join('').trim();\n return {\n id: item.id || `e${i}`,\n title,\n description,\n time: item.dataset.time,\n status: item.dataset.status as TimelineStatus | undefined,\n icon: item.dataset.icon,\n meta: item.dataset.meta,\n };\n });\n\nexport function createTimeline(root: HTMLElement | null, options: TimelineOptions = {}): TimelineInstance {\n if (!root) return inert({ add() {}, update() {}, remove() {}, setEvents() {}, events: [] });\n registerMotion();\n const scope = createScope();\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n const relative = options.relative !== false;\n // JSON text too (data-mk-events through autoInit).\n let events = (fromJson(options.events) ?? readAuthored(root)).map((event) => ({ ...event }));\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n // Authored markup stays, out of sight; the engine draws its own list.\n const holder = document.createElement('div');\n holder.hidden = true;\n holder.append(...root.childNodes);\n const list = document.createElement('ol');\n list.dataset.mkTimelineList = '';\n list.setAttribute('aria-label', options.label ?? 'Historial');\n const rail = document.createElement('span');\n rail.dataset.mkTlRail = '';\n rail.setAttribute('aria-hidden', 'true');\n const progress = document.createElement('span');\n progress.dataset.mkTlProgress = '';\n rail.append(progress);\n const wrap = document.createElement('div');\n wrap.dataset.mkTlWrap = '';\n wrap.append(rail, list);\n root.append(wrap);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n wrap.remove();\n root.append(...holder.childNodes);\n });\n scope.attr(root, 'data-mk-layout', options.layout === 'alternate' ? 'alternate' : 'start');\n scope.attr(root, 'data-mk-ready', '');\n\n const timeText = (date: Date) => (relative ? relativeTime(date, new Date(), locale) : fullTime(date, locale));\n\n const item = (event: TimelineEvent) => {\n const li = document.createElement('li');\n li.dataset.mkTlItem = '';\n li.dataset.id = event.id;\n li.dataset.status = event.status ?? 'done';\n const dot = document.createElement('span');\n dot.dataset.mkTlDot = '';\n dot.setAttribute('aria-hidden', 'true');\n dot.textContent = event.icon ?? '';\n const body = document.createElement('div');\n body.dataset.mkTlBody = '';\n const date = toTime(event.time);\n if (date) {\n const time = document.createElement('time');\n time.dataset.mkTlTime = '';\n time.dateTime = date.toISOString();\n time.title = fullTime(date, locale);\n time.textContent = timeText(date);\n body.append(time);\n }\n const title = document.createElement('strong');\n title.dataset.mkTlTitle = '';\n title.textContent = event.title;\n body.append(title);\n if (event.status && event.status !== 'done') {\n const state = document.createElement('span');\n state.className = 'mk-sr-only';\n state.textContent = ` (${STATUS_LABEL[event.status]})`;\n title.append(state);\n }\n if (event.description) {\n const description = document.createElement('p');\n description.dataset.mkTlDescription = '';\n description.textContent = event.description;\n body.append(description);\n }\n if (event.meta) {\n const meta = document.createElement('span');\n meta.dataset.mkTlMeta = '';\n meta.textContent = event.meta;\n body.append(meta);\n }\n li.append(dot, body);\n return li;\n };\n\n const heading = (date: Date) => {\n const li = document.createElement('li');\n li.dataset.mkTlDay = '';\n li.dataset.day = dayKey(date);\n li.setAttribute('role', 'presentation');\n li.dataset.flipId = `day-${li.dataset.day}`;\n li.textContent = dayLabel(date, new Date(), locale);\n return li;\n };\n\n /** The rail runs from the first dot to the last; its filled part reaches the current (or last done) event. */\n const measureRail = () => {\n const dots = [...list.querySelectorAll<HTMLElement>('[data-mk-tl-dot]')];\n if (!dots.length) {\n rail.hidden = true;\n return;\n }\n rail.hidden = false;\n // Centres measured against the wrapper, whatever positions the items.\n const base = wrap.getBoundingClientRect().top;\n const centre = (dot: HTMLElement) => {\n const box = dot.getBoundingClientRect();\n return box.top - base + box.height / 2;\n };\n const top = centre(dots[0]!);\n const bottom = centre(dots[dots.length - 1]!);\n rail.style.top = `${top}px`;\n rail.style.height = `${Math.max(0, bottom - top)}px`;\n const reached = [...list.querySelectorAll<HTMLElement>('[data-mk-tl-item]')].filter((li) => li.dataset.status === 'done' || li.dataset.status === 'current');\n const last = reached[reached.length - 1]?.querySelector<HTMLElement>('[data-mk-tl-dot]');\n progress.style.height = `${last ? Math.max(0, centre(last) - top) : 0}px`;\n };\n const itemOf = (id: string) => [...list.querySelectorAll<HTMLElement>('[data-mk-tl-item]')].find((li) => li.dataset.id === id) ?? null;\n\n const render = () => {\n const nodes: HTMLElement[] = [];\n let day = '';\n events.forEach((event, i) => {\n const date = toTime(event.time);\n if (options.group && date && dayKey(date) !== day) {\n day = dayKey(date);\n nodes.push(heading(date));\n }\n const element = item(event);\n // 'alternate': the events take turns on each side of the rail.\n element.dataset.side = i % 2 ? 'end' : 'start';\n element.dataset.flipId = event.id;\n nodes.push(element);\n });\n list.replaceChildren(...nodes);\n measureRail();\n };\n\n const refreshTimes = () => {\n for (const time of list.querySelectorAll<HTMLTimeElement>('[data-mk-tl-time]')) time.textContent = timeText(new Date(time.dateTime));\n if (options.group) for (const day of list.querySelectorAll<HTMLElement>('[data-mk-tl-day]')) day.textContent = dayLabel(toTime(day.dataset.day!)!, new Date(), locale);\n };\n if (relative) scope.add(everyMinute(refreshTimes));\n if (typeof ResizeObserver === 'function') scope.observe(new ResizeObserver(() => measureRail())).observe(list);\n\n /** The entrance: the rail draws, the events cascade in. */\n const enter = () => {\n if (reduced()) return;\n keep(gsap.fromTo(rail, { scaleY: 0 }, { scaleY: 1, transformOrigin: '50% 0%', duration: 0.8, ease: EASE.wipe, clearProps: 'transform' }));\n keep(blurIn([...list.children], { from: 'rise', stagger: 0.06 }));\n };\n\n render();\n if (typeof IntersectionObserver === 'function' && !reduced()) {\n gsap.set([rail, ...list.children], { opacity: 0 });\n const observer = scope.observe(\n new IntersectionObserver((entries) => {\n if (!entries.some((entry) => entry.isIntersecting)) return;\n observer.disconnect();\n gsap.set([rail, ...list.children], { clearProps: 'opacity' });\n enter();\n }, { threshold: 0.15 }),\n );\n observer.observe(root);\n }\n\n return {\n add(event, at = 'end') {\n if (scope.disposed) return;\n // What is there glides to make room (the rail follows); the new event and a new day come in.\n const state = reduced() ? null : Flip.getState([...list.children]);\n events = at === 'start' ? [{ ...event }, ...events] : [...events, { ...event }];\n render();\n const added = itemOf(event.id);\n if (!added || !state) return;\n added.setAttribute('data-mk-tl-fresh', '');\n scope.timeout(() => added.removeAttribute('data-mk-tl-fresh'), 1800);\n keep(\n Flip.from(state, {\n targets: [...list.children],\n duration: TIMING.layoutTravel,\n ease: EASE.layoutReflow,\n onUpdate: measureRail,\n onComplete: measureRail,\n onEnter: (entering) =>\n gsap.fromTo(entering, { opacity: 0, y: at === 'start' ? -16 : 16, filter: 'blur(10px)' }, { opacity: 1, y: 0, filter: 'blur(0px)', duration: 0.45, ease: 'power2.out', clearProps: 'opacity,transform,filter' }),\n }),\n );\n const dot = added.querySelector<HTMLElement>('[data-mk-tl-dot]')!;\n keep(gsap.fromTo(dot, { scale: 0 }, { scale: 1, duration: 0.4, delay: 0.12, ease: EASE.pop, clearProps: 'transform' }));\n },\n update(id, patch) {\n const event = events.find((entry) => entry.id === id);\n if (!event || scope.disposed) return;\n const statusChanged = patch.status && patch.status !== event.status;\n Object.assign(event, patch);\n render();\n const dot = itemOf(id)?.querySelector<HTMLElement>('[data-mk-tl-dot]');\n if (statusChanged && dot && !reduced()) keep(gsap.fromTo(dot, { scale: 0.6 }, { scale: 1, duration: 0.4, ease: EASE.pop, clearProps: 'transform' }));\n },\n remove(id) {\n const element = itemOf(id);\n events = events.filter((event) => event.id !== id);\n if (!element) return render();\n if (reduced()) return render();\n keep(collapse(element, { onComplete: render }));\n },\n setEvents(next) {\n if (scope.disposed) return;\n events = next.map((event) => ({ ...event }));\n render();\n if (!reduced()) keep(blurIn([...list.children], { from: 'rise', stagger: 0.04 }));\n },\n get events() {\n return events.map((event) => ({ ...event }));\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, Flip, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, type Instance } from '../../core/types';\nimport { dayKey, fromJson } from '../../core/dates';\nimport { dayLabel, everyMinute, fullTime, relativeTime, toTime, type TimeInput } from '../../core/relative-time';\nimport { blurIn, press, rollDigits } from '../../motion/micro';\n\n/*\n * Activity feed: what people did, newest first, under day headings (\"Hoy\",\n * \"Ayer\", \"Lunes, 12 de noviembre\"). Each entry has an avatar (a picture, or\n * initials on a colour from the name) with a badge for the kind of action,\n * \"<b>Ana</b> comentó en <a>Tarea 12</a>\", a time (\"hace 5 min\", refreshed\n * every minute) and an optional quote. New activity (prepend()) comes in at the\n * top: the entries below glide down (layout spring) while the new ones drop in\n * out of a blur and keep a soft highlight that fades. If the reader has\n * scrolled down, a \"3 novedades\" pill pops in at the top instead (its count\n * rolls); pressing it scrolls up and brings them in. \"Cargar más\" at the end\n * asks onLoadMore() for older entries (working while it waits) and flows them in.\n */\n\nexport interface ActivityActor {\n name: string;\n /** A picture URL; without it, the initials. */\n avatar?: string;\n}\n\nexport type ActivityKind = 'comment' | 'create' | 'update' | 'delete' | 'upload' | 'complete' | 'mention';\n\nexport interface ActivityItem {\n id: string;\n actor: ActivityActor | string;\n /** The verb: \"comentó en\", \"cerró\", \"subió\". */\n action: string;\n /** What it was done to. */\n target?: string;\n /** A link for the target. */\n href?: string;\n time: TimeInput;\n /** A quote under it (the comment). */\n detail?: string;\n kind?: ActivityKind;\n}\n\nexport interface ActivityFeedOptions {\n items?: ActivityItem[];\n locale?: string;\n /** Accessible name (default 'Actividad'). */\n label?: string;\n /** Older entries for \"Cargar más\": resolve with them, or with [] when there are no more. */\n onLoadMore?: () => Promise<ActivityItem[]> | ActivityItem[];\n emptyLabel?: string;\n}\n\nexport interface ActivityFeedInstance extends Instance {\n /** New activity on top (or behind the \"novedades\" pill when the reader is scrolled down). */\n prepend(items: ActivityItem[]): void;\n append(items: ActivityItem[]): void;\n setItems(items: ActivityItem[]): void;\n readonly items: ActivityItem[];\n}\n\nconst SVG = (path: string) => `<svg aria-hidden=\"true\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"${path}\"/></svg>`;\nconst KIND_ICON: Record<ActivityKind, string> = {\n comment: SVG('M5 6h14v9H9l-4 4z'),\n create: SVG('M12 5v14M5 12h14'),\n update: SVG('M5 19l1-4L16 5l3 3L9 18z'),\n delete: SVG('M6 7h12M9 7V5h6v2M8 7l1 12h6l1-12'),\n upload: SVG('M12 19V6M6 12l6-6 6 6'),\n complete: SVG('M5 12.5l4.5 4.5L19 7.5'),\n mention: SVG('M16 12a4 4 0 1 1-1.2-2.8M16 9v4a2 2 0 0 0 4 0v-1a8 8 0 1 0-3 6.2'),\n};\n\nconst nameOf = (actor: ActivityActor | string) => (typeof actor === 'string' ? actor : actor.name);\nconst initials = (name: string) =>\n name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]!.toLocaleUpperCase())\n .join('');\n/** A hue from the name, so a person keeps their colour. */\nconst hueOf = (name: string) => [...name].reduce((hash, char) => (hash * 31 + char.charCodeAt(0)) % 360, 7);\n\nexport function createActivityFeed(root: HTMLElement | null, options: ActivityFeedOptions = {}): ActivityFeedInstance {\n if (!root) return inert({ prepend() {}, append() {}, setItems() {}, items: [] });\n registerMotion();\n const scope = createScope();\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n // JSON text too (data-mk-items through autoInit).\n let items = [...(fromJson(options.items) ?? [])];\n let waiting: ActivityItem[] = [];\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n const pill = document.createElement('button');\n pill.type = 'button';\n pill.dataset.mkAfNew = '';\n pill.hidden = true;\n const pillCount = document.createElement('span');\n pillCount.dataset.mkAfNewCount = '';\n const pillText = document.createElement('span');\n pill.append('↑ ', pillCount, pillText);\n const feed = document.createElement('div');\n feed.dataset.mkAfFeed = '';\n feed.setAttribute('role', 'feed');\n feed.setAttribute('aria-label', options.label ?? 'Actividad');\n const empty = document.createElement('p');\n empty.dataset.mkAfEmpty = '';\n empty.textContent = options.emptyLabel ?? 'Sin actividad todavía';\n const more = document.createElement('button');\n more.type = 'button';\n more.dataset.mkAfMore = '';\n more.textContent = 'Cargar más';\n more.hidden = !options.onLoadMore;\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n root.append(pill, feed, empty, more, status);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n for (const part of [pill, feed, empty, more, status]) part.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n\n const entry = (item: ActivityItem) => {\n const li = document.createElement('li');\n li.dataset.mkAfItem = '';\n li.dataset.id = item.id;\n li.setAttribute('role', 'article');\n li.tabIndex = -1;\n const name = nameOf(item.actor);\n const avatar = document.createElement('span');\n avatar.dataset.mkAfAvatar = '';\n avatar.setAttribute('aria-hidden', 'true');\n avatar.style.setProperty('--mk-af-hue', String(hueOf(name)));\n const picture = typeof item.actor === 'string' ? undefined : item.actor.avatar;\n if (picture) {\n const img = document.createElement('img');\n img.src = picture;\n img.alt = '';\n img.loading = 'lazy';\n avatar.append(img);\n } else avatar.textContent = initials(name);\n if (item.kind) {\n const badge = document.createElement('span');\n badge.dataset.mkAfBadge = item.kind;\n badge.innerHTML = KIND_ICON[item.kind];\n avatar.append(badge);\n }\n const body = document.createElement('div');\n body.dataset.mkAfBody = '';\n const line = document.createElement('p');\n line.dataset.mkAfLine = '';\n const who = document.createElement('b');\n who.textContent = name;\n line.append(who, ` ${item.action}`);\n if (item.target) {\n line.append(' ');\n const target = document.createElement(item.href ? 'a' : 'span');\n target.dataset.mkAfTarget = '';\n if (target instanceof HTMLAnchorElement) target.href = item.href!;\n target.textContent = item.target;\n line.append(target);\n }\n body.append(line);\n if (item.detail) {\n const quote = document.createElement('blockquote');\n quote.dataset.mkAfDetail = '';\n quote.textContent = item.detail;\n body.append(quote);\n }\n const date = toTime(item.time);\n if (date) {\n const time = document.createElement('time');\n time.dataset.mkAfTime = '';\n time.dateTime = date.toISOString();\n time.title = fullTime(date, locale);\n time.textContent = relativeTime(date, new Date(), locale);\n body.append(time);\n }\n li.append(avatar, body);\n return li;\n };\n\n const render = () => {\n const days = new Map<string, { date: Date | null; list: HTMLUListElement }>();\n const sections: HTMLElement[] = [];\n for (const item of items) {\n const date = toTime(item.time);\n const key = date ? dayKey(date) : '';\n let group = days.get(key);\n if (!group) {\n const section = document.createElement('section');\n section.dataset.mkAfDay = key;\n const heading = document.createElement('h3');\n heading.dataset.mkAfHeading = '';\n heading.textContent = date ? dayLabel(date, new Date(), locale) : 'Sin fecha';\n const list = document.createElement('ul');\n section.append(heading, list);\n sections.push(section);\n group = { date, list };\n days.set(key, group);\n }\n group.list.append(entry(item));\n }\n feed.replaceChildren(...sections);\n empty.hidden = items.length > 0;\n };\n\n const refreshTimes = () => {\n for (const time of feed.querySelectorAll<HTMLTimeElement>('[data-mk-af-time]')) time.textContent = relativeTime(new Date(time.dateTime), new Date(), locale);\n for (const section of feed.querySelectorAll<HTMLElement>('[data-mk-af-day]')) {\n const key = section.dataset.mkAfDay!;\n if (key) section.querySelector('h3')!.textContent = dayLabel(toTime(key)!, new Date(), locale);\n }\n };\n scope.add(everyMinute(refreshTimes));\n\n /** Re-render with `change`; what stays glides (Flip), the given new ids come in from `from`. */\n const reflow = (change: () => void, fresh: Set<string>, from: 'top' | 'bottom') => {\n const all = () => [...feed.querySelectorAll<HTMLElement>('[data-mk-af-item], [data-mk-af-heading]')];\n for (const element of all()) element.dataset.flipId = element.dataset.id ?? `day-${element.closest<HTMLElement>('[data-mk-af-day]')!.dataset.mkAfDay}`;\n const state = reduced() ? null : Flip.getState(all());\n change();\n for (const element of all()) element.dataset.flipId = element.dataset.id ?? `day-${element.closest<HTMLElement>('[data-mk-af-day]')!.dataset.mkAfDay}`;\n const arriving = [...feed.querySelectorAll<HTMLElement>('[data-mk-af-item]')].filter((li) => fresh.has(li.dataset.id!));\n for (const li of arriving) if (from === 'top') li.setAttribute('data-mk-fresh', '');\n if (!state) return;\n keep(\n Flip.from(state, {\n targets: all(),\n duration: TIMING.layoutTravel,\n ease: EASE.layoutReflow,\n onEnter: (entering) => gsap.fromTo(entering, { opacity: 0, y: from === 'top' ? -14 : 14, filter: 'blur(10px)' }, { opacity: 1, y: 0, filter: 'blur(0px)', duration: 0.45, stagger: 0.05, ease: 'power2.out', clearProps: 'opacity,transform,filter' }),\n }),\n );\n };\n\n const showPill = () => {\n const count = waiting.length;\n const text = String(count);\n pillText.textContent = count === 1 ? ' novedad' : ' novedades';\n status.textContent = `${count} ${count === 1 ? 'novedad' : 'novedades'}`;\n if (pill.hidden) {\n pill.hidden = false;\n pillCount.textContent = text;\n if (!reduced()) keep(gsap.fromTo(pill, { opacity: 0, y: -10, scale: 0.85, filter: 'blur(6px)' }, { opacity: 1, y: 0, scale: 1, filter: 'blur(0px)', duration: 0.35, ease: EASE.pop, clearProps: 'opacity,transform,filter' }));\n } else keep(rollDigits(pillCount, text, 1, 0.3));\n };\n\n const bringIn = (fresh: ActivityItem[]) => {\n const ids = new Set(fresh.map((item) => item.id));\n reflow(() => {\n items = [...fresh, ...items.filter((item) => !ids.has(item.id))];\n render();\n }, ids, 'top');\n };\n\n scope.on(pill, 'click', () => {\n const fresh = waiting;\n waiting = [];\n const finish = () => {\n pill.hidden = true;\n bringIn(fresh);\n feed.querySelector<HTMLElement>('[data-mk-af-item]')?.focus({ preventScroll: true });\n };\n if (reduced() || root.scrollTop === 0) {\n root.scrollTop = 0;\n return finish();\n }\n keep(gsap.to(root, { scrollTop: 0, duration: 0.5, ease: EASE.signature, onComplete: finish }));\n });\n\n scope.on(more, 'click', async () => {\n if (!options.onLoadMore || more.getAttribute('aria-busy') === 'true') return;\n keep(press(more));\n more.setAttribute('aria-busy', 'true');\n more.textContent = 'Cargando…';\n let older: ActivityItem[] = [];\n try {\n older = await options.onLoadMore();\n } catch {\n more.textContent = 'Reintentar';\n more.removeAttribute('aria-busy');\n return;\n }\n if (scope.disposed) return;\n more.removeAttribute('aria-busy');\n if (!older.length) {\n more.hidden = true;\n status.textContent = 'No hay más actividad';\n const end = document.createElement('p');\n end.dataset.mkAfEnd = '';\n end.textContent = 'No hay más actividad';\n more.after(end);\n scope.add(() => end.remove());\n return;\n }\n more.textContent = 'Cargar más';\n const known = new Set(items.map((item) => item.id));\n const added = older.filter((item) => !known.has(item.id));\n items = [...items, ...added];\n render();\n const arriving = [...feed.querySelectorAll<HTMLElement>('[data-mk-af-item]')].filter((li) => added.some((item) => item.id === li.dataset.id));\n keep(blurIn(arriving, { from: 'rise', stagger: 0.04 }));\n status.textContent = `${added.length} más`;\n });\n\n render();\n\n return {\n prepend(fresh) {\n if (scope.disposed || !fresh.length) return;\n if (root.scrollTop > 24) {\n const ids = new Set(fresh.map((item) => item.id));\n waiting = [...fresh, ...waiting.filter((item) => !ids.has(item.id))];\n showPill();\n return;\n }\n bringIn(fresh);\n status.textContent = fresh.length === 1 ? `${nameOf(fresh[0]!.actor)} ${fresh[0]!.action}${fresh[0]!.target ? ` ${fresh[0]!.target}` : ''}` : `${fresh.length} novedades`;\n },\n append(older) {\n if (scope.disposed) return;\n const ids = new Set(older.map((item) => item.id));\n reflow(() => {\n items = [...items.filter((item) => !ids.has(item.id)), ...older];\n render();\n }, ids, 'bottom');\n },\n setItems(next) {\n if (scope.disposed) return;\n items = [...next];\n waiting = [];\n pill.hidden = true;\n render();\n },\n get items() {\n return [...items];\n },\n destroy: () => scope.dispose(),\n };\n}\n","/*\n * Marking matches (tree-view, json-viewer, data-table): text folded for\n * comparing (accents and case ignored), and text with the matches of a query\n * wrapped in <mark>.\n */\n\n/** Lower case without accents (\"Canción\" → \"cancion\"); lengths stay the same for precomposed text. */\nexport const foldText = (text: string) => text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n\n/** `text` with the folded matches of `query` in <mark> (accents and case ignored). */\nexport function markText(text: string, query: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const needle = foldText(query.trim());\n if (!needle) {\n fragment.append(text);\n return fragment;\n }\n const hay = foldText(text);\n let at = 0;\n for (let found = hay.indexOf(needle); found >= 0; found = hay.indexOf(needle, found + needle.length)) {\n if (found > at) fragment.append(text.slice(at, found));\n const mark = document.createElement('mark');\n mark.textContent = text.slice(found, found + needle.length);\n fragment.append(mark);\n at = found + needle.length;\n }\n if (at < text.length) fragment.append(text.slice(at));\n return fragment;\n}\n","import { foldText } from './mark';\n\n/*\n * Trees (tree-view, file-explorer, json-viewer), the pure part: finding a node\n * and its path, three-state checks (a branch is checked when every child is,\n * mixed when some are; checking a branch checks everything under it, except\n * disabled nodes, which keep their state and do not count for their branch)\n * and searching (the matches, the ancestors that keep them visible and open;\n * accents and case ignored).\n */\n\nexport interface TreeNode {\n id: string;\n label: string;\n children?: TreeNode[];\n /** A short glyph before the label. */\n icon?: string;\n disabled?: boolean;\n /** Has children that loadChildren() will bring. */\n hasChildren?: boolean;\n /** Anything the app wants to keep with the node. */\n data?: unknown;\n}\n\nexport type CheckState = 'true' | 'false' | 'mixed';\n\nexport const isBranch = (node: TreeNode) => Boolean(node.children?.length || node.hasChildren);\n\n/** Every node, depth first, with its depth and parent. */\nexport function walk(nodes: TreeNode[], visit: (node: TreeNode, depth: number, parent: TreeNode | null) => void, depth = 0, parent: TreeNode | null = null) {\n for (const node of nodes) {\n visit(node, depth, parent);\n if (node.children) walk(node.children, visit, depth + 1, node);\n }\n}\n\n/** The node with `id` and the path from the top to it (it included). */\nexport function findNode(nodes: TreeNode[], id: string): { node: TreeNode; path: TreeNode[] } | null {\n for (const node of nodes) {\n if (node.id === id) return { node, path: [node] };\n if (node.children) {\n const found = findNode(node.children, id);\n if (found) return { node: found.node, path: [node, ...found.path] };\n }\n }\n return null;\n}\n\n/** Each node's state: leaves from `checked`, branches from their children (the enabled ones, when there are). */\nexport function checkStates(nodes: TreeNode[], checked: Set<string>): Map<string, CheckState> {\n const states = new Map<string, CheckState>();\n const visit = (node: TreeNode): CheckState => {\n let state: CheckState;\n if (!node.children?.length) state = checked.has(node.id) ? 'true' : 'false';\n else {\n const all = node.children.map(visit);\n const enabled = all.filter((_, i) => !node.children![i]!.disabled);\n const children = enabled.length ? enabled : all;\n state = children.every((child) => child === 'true') ? 'true' : children.every((child) => child === 'false') ? 'false' : 'mixed';\n }\n states.set(node.id, state);\n return state;\n };\n nodes.forEach(visit);\n return states;\n}\n\n/** Check or uncheck `id` and everything under it but disabled nodes; returns the new set (branches follow their children). */\nexport function toggleCheck(nodes: TreeNode[], checked: Set<string>, id: string, value?: boolean): Set<string> {\n const found = findNode(nodes, id);\n if (!found) return new Set(checked);\n const states = checkStates(nodes, checked);\n const on = value ?? states.get(id) !== 'true';\n const next = new Set(checked);\n const set = (node: TreeNode) => {\n if (on) next.add(node.id);\n else next.delete(node.id);\n for (const child of node.children ?? []) if (!child.disabled) set(child);\n };\n set(found.node);\n // Branches mirror their children.\n const after = checkStates(nodes, next);\n walk(nodes, (node) => {\n if (!node.children?.length) return;\n if (after.get(node.id) === 'true') next.add(node.id);\n else next.delete(node.id);\n });\n return next;\n}\n\nconst fold = foldText;\n\n/**\n * The nodes whose text has `query` (accents and case ignored), the ancestors\n * that keep them visible, and the branches to open to show them.\n */\nexport function searchTree(nodes: TreeNode[], query: string, text: (node: TreeNode) => string = (node) => node.label) {\n const needle = fold(query.trim());\n const matches = new Set<string>();\n const visible = new Set<string>();\n const open = new Set<string>();\n if (!needle) return { matches, visible, open, active: false };\n const visit = (node: TreeNode, ancestors: TreeNode[]) => {\n if (fold(text(node)).includes(needle)) {\n matches.add(node.id);\n visible.add(node.id);\n for (const ancestor of ancestors) {\n visible.add(ancestor.id);\n open.add(ancestor.id);\n }\n }\n for (const child of node.children ?? []) visit(child, [...ancestors, node]);\n };\n for (const node of nodes) visit(node, []);\n return { matches, visible, open, active: true };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { requestFrame } from '../../core/frame';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { fromJson } from '../../core/dates';\nimport { checkStates, findNode, isBranch, searchTree, toggleCheck, walk, type CheckState, type TreeNode } from '../../core/tree';\nimport { foldText, markText } from '../../core/mark';\n\n/*\n * Tree view (WAI-ARIA tree): nodes that open and close, three-state\n * checkboxes and a search. A branch opens by its height (.32 s, signature)\n * while its children slide in out of a blur (25 ms apart) and its chevron\n * turns (.3 s, swing); it closes the same way back. The selected row sits on a\n * pill that glides to each new choice (.3 s, swing). A check draws itself and\n * its box pops; a branch with some children checked shows a dash. The search\n * marks the letters that match, opens the branches that hold them and hides\n * the rest; clearing it puts back what was open. loadChildren() fills a branch\n * the first time it opens (a spinner row meanwhile). Keyboard: ↑ ↓ move, → opens\n * or enters, ← closes or goes up, Home, End, * opens the siblings, Enter\n * selects, Space checks (or selects), and typing jumps to a label.\n */\n\nexport type { TreeNode } from '../../core/tree';\n\nexport interface TreeViewOptions {\n nodes?: TreeNode[];\n /** Three-state checkboxes (default false). */\n checkable?: boolean;\n checked?: string[];\n /** Open at the start: ids, or true for every branch. */\n expanded?: string[] | boolean;\n selected?: string | null;\n /** A search field above the tree: true, or its placeholder. */\n search?: boolean | string;\n /** Accessible name (default 'Árbol'). */\n label?: string;\n /** Children of a branch with hasChildren, the first time it opens. */\n loadChildren?: (node: TreeNode) => Promise<TreeNode[]> | TreeNode[];\n /** Draw a label yourself (json-viewer, file-explorer); `query` is the search, for marking. */\n renderLabel?: (node: TreeNode, element: HTMLElement, query: string) => void;\n /** The text the search looks in (default: the label). */\n searchText?: (node: TreeNode) => string;\n onSelect?: (node: TreeNode) => void;\n onCheck?: (checked: string[]) => void;\n onExpand?: (node: TreeNode, expanded: boolean) => void;\n}\n\nexport interface TreeViewInstance extends Instance {\n expand(id: string, animate?: boolean): void;\n collapse(id: string, animate?: boolean): void;\n toggle(id: string): void;\n expandAll(): void;\n collapseAll(): void;\n /** Open the branches above it and bring it into view. */\n reveal(id: string): void;\n select(id: string | null, notify?: boolean): void;\n setChecked(ids: string[]): void;\n filter(query: string): void;\n setNodes(nodes: TreeNode[]): void;\n focusItem(id: string): void;\n readonly selected: string | null;\n readonly checked: string[];\n readonly expanded: string[];\n /** The tree element (role=\"tree\"). */\n readonly element: HTMLElement;\n}\n\nconst CHEVRON = '<svg aria-hidden=\"true\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 6l6 6-6 6\"/></svg>';\nconst CHECK = '<svg aria-hidden=\"true\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path data-mk-tree-tick d=\"M5 12.5l4.5 4.5L19 7.5\" pathLength=\"1\"/><path data-mk-tree-dash d=\"M6 12h12\"/></svg>';\nlet sequence = 0;\n\nconst fold = foldText;\n\n// Kept here too for code that imported it from the tree.\nexport { markText };\n\nexport function createTreeView(root: HTMLElement | null, options: TreeViewOptions = {}): TreeViewInstance {\n if (!root) return inert({ expand() {}, collapse() {}, toggle() {}, expandAll() {}, collapseAll() {}, reveal() {}, select() {}, setChecked() {}, filter() {}, setNodes() {}, focusItem() {}, selected: null, checked: [], expanded: [], element: null as unknown as HTMLElement });\n registerMotion();\n const scope = createScope();\n const uid = `mk-tree-${++sequence}`;\n // JSON text too (data-mk-nodes through autoInit).\n let nodes: TreeNode[] = fromJson(options.nodes) ?? [];\n const expanded = new Set<string>();\n if (options.expanded === true) walk(nodes, (node) => isBranch(node) && expanded.add(node.id));\n else for (const id of options.expanded || []) expanded.add(id);\n /** Every given id checked with what lies under it; branches follow their children. */\n const normalised = (ids: string[]) => ids.reduce((set, id) => toggleCheck(nodes, set, id, true), new Set<string>());\n let checked = normalised(fromJson(options.checked) ?? []);\n let selected: string | null = options.selected ?? null;\n let focused: string | null = selected;\n let query = '';\n let beforeSearch: Set<string> | null = null;\n const loading = new Set<string>();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n let searchInput: HTMLInputElement | null = null;\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n if (options.search) {\n searchInput = document.createElement('input');\n searchInput.type = 'search';\n searchInput.dataset.mkTreeSearch = '';\n searchInput.placeholder = typeof options.search === 'string' ? options.search : 'Buscar…';\n searchInput.setAttribute('aria-label', 'Buscar en el árbol');\n searchInput.setAttribute('aria-controls', uid);\n }\n const box = document.createElement('div');\n box.dataset.mkTreeBox = '';\n const pill = document.createElement('span');\n pill.dataset.mkTreePill = '';\n pill.setAttribute('aria-hidden', 'true');\n const tree = document.createElement('ul');\n tree.id = uid;\n tree.dataset.mkTree = '';\n tree.setAttribute('role', 'tree');\n tree.setAttribute('aria-label', options.label ?? 'Árbol');\n if (options.checkable) tree.setAttribute('aria-multiselectable', 'true');\n box.append(pill, tree);\n const empty = document.createElement('p');\n empty.dataset.mkTreeEmpty = '';\n empty.textContent = 'Sin coincidencias';\n empty.hidden = true;\n if (searchInput) root.append(searchInput);\n root.append(box, empty, status);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf(pill);\n searchInput?.remove();\n box.remove();\n empty.remove();\n status.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n\n const itemOf = (id: string) => [...tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')].find((item) => item.dataset.id === id) ?? null;\n const nodeOf = (id: string) => findNode(nodes, id)?.node ?? null;\n /** Items a reader can reach now: not inside a closed branch, not hidden by the search. */\n const visibleItems = () =>\n [...tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')].filter((item) => !item.hidden && !item.closest('[role=\"group\"][hidden], [role=\"treeitem\"][hidden]'));\n\n const paintChecks = (animate: boolean) => {\n if (!options.checkable) return;\n const states = checkStates(nodes, checked);\n for (const item of tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')) {\n const state = states.get(item.dataset.id!) ?? 'false';\n const before = item.getAttribute('aria-checked') as CheckState | null;\n item.setAttribute('aria-checked', state);\n if (!animate || before === state || reduced()) continue;\n const box = item.querySelector<HTMLElement>(':scope > [data-mk-tree-row] [data-mk-tree-check]');\n if (!box) continue;\n keep(gsap.fromTo(box, { scale: 0.8 }, { scale: 1, duration: 0.35, ease: EASE.click, clearProps: 'transform' }));\n const path = box.querySelector<SVGPathElement>(state === 'true' ? '[data-mk-tree-tick]' : '[data-mk-tree-dash]');\n if (path && state !== 'false') keep(gsap.fromTo(path, { strokeDasharray: state === 'true' ? 1 : 12, strokeDashoffset: state === 'true' ? 1 : 12 }, { strokeDashoffset: 0, duration: 0.3, ease: EASE.wipe, clearProps: 'strokeDasharray,strokeDashoffset' }));\n }\n };\n\n const fillLabel = (node: TreeNode, label: HTMLElement) => {\n label.replaceChildren();\n if (options.renderLabel) options.renderLabel(node, label, query);\n else label.append(markText(node.label, query));\n };\n\n const row = (node: TreeNode, depth: number, index: number, count: number): HTMLElement => {\n const item = document.createElement('li');\n item.dataset.id = node.id;\n item.setAttribute('role', 'treeitem');\n item.setAttribute('aria-level', String(depth + 1));\n item.setAttribute('aria-setsize', String(count));\n item.setAttribute('aria-posinset', String(index + 1));\n item.tabIndex = -1;\n if (node.disabled) item.setAttribute('aria-disabled', 'true');\n const branch = isBranch(node);\n if (branch) item.setAttribute('aria-expanded', String(expanded.has(node.id)));\n if (!options.checkable && selected === node.id) item.setAttribute('aria-selected', 'true');\n const line = document.createElement('div');\n line.dataset.mkTreeRow = '';\n line.style.setProperty('--mk-tree-depth', String(depth));\n const chevron = document.createElement('span');\n chevron.dataset.mkTreeChevron = '';\n if (branch) chevron.innerHTML = CHEVRON;\n line.append(chevron);\n if (options.checkable) {\n const check = document.createElement('span');\n check.dataset.mkTreeCheck = '';\n check.innerHTML = CHECK;\n line.append(check);\n }\n if (node.icon) {\n const icon = document.createElement('span');\n icon.dataset.mkTreeIcon = '';\n icon.setAttribute('aria-hidden', 'true');\n icon.textContent = node.icon;\n line.append(icon);\n }\n const label = document.createElement('span');\n label.dataset.mkTreeLabel = '';\n fillLabel(node, label);\n line.append(label);\n item.append(line);\n if (branch) {\n const group = document.createElement('ul');\n group.setAttribute('role', 'group');\n group.hidden = !expanded.has(node.id);\n (node.children ?? []).forEach((child, i, all) => group.append(row(child, depth + 1, i, all.length)));\n item.append(group);\n }\n return item;\n };\n\n /** The pill under the selected row (or under nothing). */\n const placePill = (animate: boolean) => {\n const item = selected ? itemOf(selected) : null;\n const line = item && visibleItems().includes(item) ? item.querySelector<HTMLElement>(':scope > [data-mk-tree-row]') : null;\n if (!line) {\n gsap.killTweensOf(pill);\n pill.style.opacity = '0';\n return;\n }\n const base = box.getBoundingClientRect();\n const rect = line.getBoundingClientRect();\n const target = { y: rect.top - base.top + box.scrollTop, height: rect.height };\n if (!animate || reduced() || pill.style.opacity !== '1') {\n gsap.killTweensOf(pill);\n gsap.set(pill, target);\n pill.style.opacity = '1';\n return;\n }\n keep(gsap.to(pill, { ...target, duration: 0.3, ease: EASE.swatch, overwrite: 'auto' }));\n };\n\n const roving = () => {\n const items = visibleItems();\n const target = (focused && items.find((item) => item.dataset.id === focused)) || (selected && items.find((item) => item.dataset.id === selected)) || items[0];\n for (const item of tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')) item.tabIndex = item === target ? 0 : -1;\n };\n\n const render = () => {\n tree.replaceChildren(...nodes.map((node, i) => row(node, 0, i, nodes.length)));\n paintChecks(false);\n applySearch(false);\n roving();\n placePill(false);\n };\n\n // ── Opening and closing ──────────────────────────────────────────────────\n const animateGroup = (group: HTMLElement, open: boolean) => {\n if (reduced()) {\n group.hidden = !open;\n return placePill(false);\n }\n gsap.killTweensOf(group);\n if (open) {\n group.hidden = false;\n const height = group.scrollHeight;\n keep(gsap.fromTo(group, { height: 0, opacity: 0.5, overflow: 'hidden' }, { height, opacity: 1, duration: 0.32, ease: EASE.signature, clearProps: 'height,opacity,overflow', onUpdate: () => placePill(false) }));\n const rows = [...group.children].slice(0, 14);\n keep(gsap.fromTo(rows, { opacity: 0, x: -6, filter: 'blur(4px)' }, { opacity: 1, x: 0, filter: 'blur(0px)', duration: 0.3, stagger: 0.025, ease: 'power2.out', clearProps: 'opacity,transform,filter' }));\n } else {\n keep(\n gsap.to(group, {\n height: 0,\n opacity: 0,\n overflow: 'hidden',\n duration: 0.24,\n ease: 'power2.in',\n onUpdate: () => placePill(false),\n onComplete: () => {\n group.hidden = true;\n gsap.set(group, { clearProps: 'height,opacity,overflow' });\n placePill(false);\n },\n }),\n );\n }\n };\n\n const setOpen = async (id: string, open: boolean, animate = true) => {\n const node = nodeOf(id);\n const item = itemOf(id);\n if (!node || !item || !isBranch(node) || expanded.has(id) === open) return;\n if (open) expanded.add(id);\n else expanded.delete(id);\n item.setAttribute('aria-expanded', String(open));\n const group = item.querySelector<HTMLElement>(':scope > [role=\"group\"]')!;\n // A branch whose children come later: a spinner row, then them.\n if (open && node.hasChildren && !node.children?.length && options.loadChildren && !loading.has(id)) {\n loading.add(id);\n const spinner = document.createElement('li');\n spinner.dataset.mkTreeLoading = '';\n spinner.setAttribute('role', 'none');\n spinner.textContent = 'Cargando…';\n spinner.style.setProperty('--mk-tree-depth', String(Number(item.getAttribute('aria-level'))));\n group.replaceChildren(spinner);\n group.hidden = false;\n item.setAttribute('aria-busy', 'true');\n try {\n node.children = await options.loadChildren(node);\n } catch {\n node.children = [];\n }\n loading.delete(id);\n if (scope.disposed) return;\n item.removeAttribute('aria-busy');\n const depth = Number(item.getAttribute('aria-level'));\n group.replaceChildren(...(node.children ?? []).map((child, i, all) => row(child, depth, i, all.length)));\n paintChecks(false);\n if (!node.children?.length) {\n item.removeAttribute('aria-expanded');\n group.remove();\n return;\n }\n if (animate) animateGroup(group, true);\n } else if (animate) animateGroup(group, open);\n else {\n group.hidden = !open;\n placePill(false);\n }\n roving();\n options.onExpand?.(node, open);\n root.dispatchEvent(new CustomEvent('mk:expand', { bubbles: true, detail: { id, expanded: open } }));\n };\n\n // ── Selecting and checking ───────────────────────────────────────────────\n const select = (id: string | null, notify: boolean) => {\n if (id && (nodeOf(id)?.disabled || !itemOf(id))) return;\n const changed = id !== selected;\n selected = id;\n if (!options.checkable) for (const item of tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')) {\n if (item.dataset.id === id) item.setAttribute('aria-selected', 'true');\n else item.removeAttribute('aria-selected');\n }\n if (id) focused = id;\n roving();\n placePill(true);\n if (!changed || !notify || !id) return;\n const node = nodeOf(id)!;\n options.onSelect?.(node);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { id, node } }));\n };\n\n const check = (id: string) => {\n if (!options.checkable || nodeOf(id)?.disabled) return;\n checked = toggleCheck(nodes, checked, id);\n paintChecks(true);\n const list = [...checked];\n const state = checkStates(nodes, checked).get(id);\n status.textContent = `${nodeOf(id)?.label ?? ''} ${state === 'true' ? 'marcado' : 'desmarcado'}`;\n options.onCheck?.(list);\n root.dispatchEvent(new CustomEvent('mk:check', { bubbles: true, detail: { checked: list } }));\n };\n\n // ── Search ───────────────────────────────────────────────────────────────\n const applySearch = (announce: boolean) => {\n const result = searchTree(nodes, query, options.searchText);\n if (result.active) {\n beforeSearch ??= new Set(expanded);\n for (const id of result.open) expanded.add(id);\n } else if (beforeSearch) {\n expanded.clear();\n for (const id of beforeSearch) expanded.add(id);\n beforeSearch = null;\n }\n for (const item of tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')) {\n const id = item.dataset.id!;\n item.hidden = result.active && !result.visible.has(id);\n if (item.hasAttribute('aria-expanded')) {\n const open = expanded.has(id);\n item.setAttribute('aria-expanded', String(open));\n const group = item.querySelector<HTMLElement>(':scope > [role=\"group\"]');\n if (group) group.hidden = !open;\n }\n const node = nodeOf(id);\n const label = item.querySelector<HTMLElement>(':scope > [data-mk-tree-row] [data-mk-tree-label]');\n if (node && label) fillLabel(node, label);\n }\n empty.hidden = !result.active || result.matches.size > 0;\n if (announce) status.textContent = !result.active ? '' : result.matches.size ? `${result.matches.size} ${result.matches.size === 1 ? 'coincidencia' : 'coincidencias'}` : 'Sin coincidencias';\n roving();\n placePill(false);\n };\n if (searchInput) {\n scope.on(searchInput, 'input', () => {\n query = searchInput!.value;\n applySearch(true);\n });\n scope.on(searchInput, 'keydown', (event) => {\n if ((event as KeyboardEvent).key === 'ArrowDown') {\n event.preventDefault();\n visibleItems()[0]?.focus();\n }\n });\n }\n\n // ── Pointer and keyboard ─────────────────────────────────────────────────\n scope.on(tree, 'click', (event) => {\n const target = event.target as Element | null;\n const item = target?.closest<HTMLElement>('[role=\"treeitem\"]');\n if (!item || !tree.contains(item) || item.getAttribute('aria-disabled') === 'true') return;\n const id = item.dataset.id!;\n focused = id;\n if (target?.closest('[data-mk-tree-chevron]') && item.hasAttribute('aria-expanded')) {\n void setOpen(id, item.getAttribute('aria-expanded') !== 'true');\n item.focus();\n return;\n }\n if (options.checkable && target?.closest('[data-mk-tree-check]')) check(id);\n else if (options.checkable) check(id);\n else select(id, true);\n item.focus();\n });\n scope.on(tree, 'dblclick', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>('[role=\"treeitem\"]');\n if (item?.hasAttribute('aria-expanded') && !(event.target as Element).closest('[data-mk-tree-chevron]')) void setOpen(item.dataset.id!, item.getAttribute('aria-expanded') !== 'true');\n });\n scope.on(tree, 'focusin', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>('[role=\"treeitem\"]');\n if (!item) return;\n focused = item.dataset.id!;\n roving();\n });\n let typed = '';\n let typedAt = 0;\n scope.on(tree, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const item = (key.target as Element | null)?.closest<HTMLElement>('[role=\"treeitem\"]');\n if (!item || key.ctrlKey || key.metaKey || key.altKey) return;\n const items = visibleItems();\n const index = items.indexOf(item);\n const id = item.dataset.id!;\n const go = (target: HTMLElement | undefined) => {\n if (!target) return;\n key.preventDefault();\n target.focus();\n target.scrollIntoView?.({ block: 'nearest' });\n };\n switch (key.key) {\n case 'ArrowDown':\n return go(items[index + 1]);\n case 'ArrowUp':\n return go(items[index - 1]);\n case 'Home':\n return go(items[0]);\n case 'End':\n return go(items[items.length - 1]);\n case 'ArrowRight':\n key.preventDefault();\n if (item.getAttribute('aria-expanded') === 'false') void setOpen(id, true);\n else if (item.getAttribute('aria-expanded') === 'true') go(item.querySelector<HTMLElement>(':scope > [role=\"group\"] > [role=\"treeitem\"]:not([hidden])') ?? undefined);\n return;\n case 'ArrowLeft':\n key.preventDefault();\n if (item.getAttribute('aria-expanded') === 'true') void setOpen(id, false);\n else go(item.parentElement?.closest<HTMLElement>('[role=\"treeitem\"]') ?? undefined);\n return;\n case 'Enter':\n key.preventDefault();\n if (options.checkable) check(id);\n else select(id, true);\n return;\n case ' ':\n key.preventDefault();\n if (options.checkable) check(id);\n else select(id, true);\n return;\n case '*': {\n key.preventDefault();\n const siblings = [...(item.parentElement?.children ?? [])].filter((sibling) => sibling.getAttribute('aria-expanded') === 'false') as HTMLElement[];\n for (const sibling of siblings) void setOpen(sibling.dataset.id!, true);\n return;\n }\n }\n // Typing jumps to the next label that starts with what was typed.\n if (key.key.length === 1 && /\\S/.test(key.key)) {\n const now = Date.now();\n typed = now - typedAt > 600 ? key.key : typed + key.key;\n typedAt = now;\n const needle = fold(typed);\n const order = [...items.slice(index + (typed.length === 1 ? 1 : 0)), ...items.slice(0, index + (typed.length === 1 ? 1 : 0))];\n const match = order.find((candidate) => fold(nodeOf(candidate.dataset.id!)?.label ?? '').startsWith(needle));\n if (match) go(match);\n }\n });\n\n if (typeof ResizeObserver === 'function') {\n let pending: (() => void) | null = null;\n scope.observe(\n new ResizeObserver(() => {\n if (pending) return;\n pending = requestFrame(() => {\n pending = null;\n placePill(false);\n });\n }),\n ).observe(box);\n scope.add(() => pending?.());\n }\n\n render();\n\n return {\n expand: (id, animate = true) => void setOpen(id, true, animate),\n collapse: (id, animate = true) => void setOpen(id, false, animate),\n toggle: (id) => void setOpen(id, !expanded.has(id)),\n expandAll() {\n walk(nodes, (node) => {\n if (node.children?.length) expanded.add(node.id);\n });\n render();\n },\n collapseAll() {\n expanded.clear();\n render();\n },\n reveal(id) {\n const found = findNode(nodes, id);\n if (!found) return;\n for (const ancestor of found.path.slice(0, -1)) expanded.add(ancestor.id);\n for (const ancestor of found.path.slice(0, -1)) {\n const item = itemOf(ancestor.id);\n if (!item) continue;\n item.setAttribute('aria-expanded', 'true');\n const group = item.querySelector<HTMLElement>(':scope > [role=\"group\"]');\n if (group) group.hidden = false;\n }\n roving();\n placePill(false);\n itemOf(id)?.scrollIntoView?.({ block: 'nearest' });\n },\n select: (id, notify = false) => select(id, notify),\n setChecked(ids) {\n checked = normalised(ids);\n paintChecks(false);\n },\n filter(next) {\n query = next;\n if (searchInput) searchInput.value = next;\n applySearch(true);\n },\n setNodes(next) {\n if (scope.disposed) return;\n nodes = next;\n render();\n },\n focusItem(id) {\n itemOf(id)?.focus();\n },\n get selected() {\n return selected;\n },\n get checked() {\n return [...checked];\n },\n get expanded() {\n return [...expanded];\n },\n element: tree,\n destroy: () => scope.dispose(),\n };\n}\n","import { toTime, type TimeInput } from './relative-time';\n\n/*\n * Files (file-explorer), the pure part: what is a folder, the family an\n * extension belongs to (its colour), sizes in KB and MB, a free name in a\n * folder (\"Nueva carpeta (2)\") and the order of a folder's content (folders\n * first, then by name, size or date; numbers in names in their natural order).\n */\n\nexport interface FileEntry {\n id: string;\n name: string;\n /** 'folder' or 'file'; without it, an entry with children is a folder. */\n kind?: 'folder' | 'file';\n children?: FileEntry[];\n /** Bytes. */\n size?: number;\n modified?: TimeInput;\n}\n\nexport type FileFamily = 'folder' | 'image' | 'pdf' | 'doc' | 'sheet' | 'slides' | 'code' | 'archive' | 'media' | 'other';\nexport type FileSort = 'name' | 'size' | 'modified';\n\nexport const isFolder = (entry: FileEntry) => (entry.kind ? entry.kind === 'folder' : Array.isArray(entry.children));\n\n/** \"pdf\" for \"Informe.PDF\"; '' without one (\".gitignore\" has none). */\nexport function extensionOf(name: string): string {\n const dot = name.lastIndexOf('.');\n return dot > 0 && dot < name.length - 1 ? name.slice(dot + 1).toLowerCase() : '';\n}\n\nconst FAMILIES: Record<Exclude<FileFamily, 'folder' | 'other'>, string[]> = {\n image: ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif', 'heic', 'bmp', 'ico', 'fig', 'psd', 'ai', 'sketch'],\n pdf: ['pdf'],\n doc: ['doc', 'docx', 'txt', 'md', 'rtf', 'odt', 'pages'],\n sheet: ['xls', 'xlsx', 'csv', 'numbers', 'ods'],\n slides: ['ppt', 'pptx', 'key', 'odp'],\n code: ['js', 'mjs', 'cjs', 'ts', 'tsx', 'jsx', 'json', 'css', 'scss', 'html', 'astro', 'vue', 'svelte', 'py', 'rb', 'go', 'rs', 'java', 'c', 'cpp', 'h', 'php', 'sh', 'sql', 'xml', 'yml', 'yaml', 'toml'],\n archive: ['zip', 'rar', '7z', 'tar', 'gz', 'tgz', 'bz2'],\n media: ['mp3', 'wav', 'ogg', 'flac', 'm4a', 'mp4', 'mov', 'avi', 'mkv', 'webm'],\n};\n\nexport function fileFamily(entry: FileEntry): FileFamily {\n if (isFolder(entry)) return 'folder';\n const extension = extensionOf(entry.name);\n for (const [family, extensions] of Object.entries(FAMILIES)) if (extensions.includes(extension)) return family as FileFamily;\n return 'other';\n}\n\n/** \"820 B\", \"12 KB\", \"3,4 MB\" (in the given language). */\nexport function formatSize(bytes: number, locale = 'es'): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let value = Math.max(0, bytes);\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit++;\n }\n let format: Intl.NumberFormat;\n try {\n format = new Intl.NumberFormat(locale, { maximumFractionDigits: unit && value < 10 ? 1 : 0 });\n } catch {\n format = new Intl.NumberFormat(undefined, { maximumFractionDigits: unit && value < 10 ? 1 : 0 });\n }\n return `${format.format(value)} ${units[unit]}`;\n}\n\nconst same = (a: string, b: string) => a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;\n\n/** Does a sibling (other than `except`) already have this name? Case does not count (\"foto\" is \"Foto\"); accents do. */\nexport const nameTaken = (name: string, siblings: FileEntry[], except?: string) => siblings.some((sibling) => sibling.id !== except && same(sibling.name, name));\n\n/** `name`, or \"name (2)\", \"name (3)\"… (before the extension for files) when a sibling has it; `except` is the entry being renamed. */\nexport function uniqueName(name: string, siblings: FileEntry[], except?: string): string {\n if (!nameTaken(name, siblings, except)) return name;\n const extension = extensionOf(name);\n const base = extension ? name.slice(0, -extension.length - 1) : name;\n for (let n = 2; ; n++) {\n const candidate = extension ? `${base} (${n}).${extension}` : `${base} (${n})`;\n if (!nameTaken(candidate, siblings, except)) return candidate;\n }\n}\n\n/** Folders first; then by `key` (names in natural order: \"Foto 2\" before \"Foto 10\"). */\nexport function sortEntries(entries: FileEntry[], key: FileSort = 'name', direction: 1 | -1 = 1, locale = 'es'): FileEntry[] {\n let collator: Intl.Collator;\n try {\n collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n } catch {\n collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\n }\n const time = (entry: FileEntry) => toTime(entry.modified)?.getTime() ?? 0;\n return [...entries].sort((a, b) => {\n const folderA = isFolder(a);\n if (folderA !== isFolder(b)) return folderA ? -1 : 1;\n let diff = 0;\n // Folders have no size of their own: by name, as file managers do.\n if (key === 'size' && !folderA) diff = (a.size ?? 0) - (b.size ?? 0);\n else if (key === 'modified') diff = time(a) - time(b);\n if (!diff) diff = collator.compare(a.name, b.name);\n return diff * direction;\n });\n}\n\n/** A deep copy of entries (dates and other values are kept as they are). */\nexport const cloneEntries = (entries: FileEntry[]): FileEntry[] =>\n entries.map((entry) => (entry.children ? { ...entry, children: cloneEntries(entry.children) } : { ...entry }));\n","import { gsap, EASE, Flip, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, type Instance } from '../../core/types';\nimport { fromJson, safeFormat } from '../../core/dates';\nimport { toTime } from '../../core/relative-time';\nimport { cloneEntries, extensionOf, fileFamily, formatSize, isFolder, nameTaken, sortEntries, uniqueName, type FileEntry, type FileSort } from '../../core/files';\nimport type { TreeNode } from '../../core/tree';\nimport { blurIn, press, ringPulse, shake } from '../../motion/micro';\nimport { slideIndicator } from '../../motion/indicator';\nimport { createBreadcrumb } from '../breadcrumb/engine';\nimport { createTreeView } from '../tree-view/engine';\n\n/*\n * File explorer: folders and files with the folder tree on the side, the path\n * as a breadcrumb and the folder's content as a list (name, size, date;\n * sortable) or a grid of big icons. Opening a folder pushes the content aside:\n * the old one slides out blurring while the new one slides in from the other\n * side (.34 s; back goes the other way), and the tree and the breadcrumb\n * follow. Switching between list and grid flies every icon to its new place\n * (Flip, .5 s). Items select with a click (Ctrl/⌘ adds, Shift takes a range)\n * on a soft accent; sorting glides them to their new order (layout reflow). A\n * new folder grows in and asks for its name at once; renaming happens in place\n * (a wrong name shakes); deleted items shrink out while the rest close the gap.\n * Dragging items lifts a card with their count that follows the pointer and\n * tilts with its speed; a folder under it (in the content, the tree or the\n * breadcrumb) opens its lid, tree branches open after a moment, and dropping\n * flies the card into it (on touch screens, after a long press). Keyboard:\n * arrows (Shift extends), Ctrl/⌘+A, Enter opens, Backspace goes up, F2\n * renames, Supr deletes, Ctrl/⌘+X and Ctrl/⌘+V move.\n */\n\nexport type { FileEntry, FileSort } from '../../core/files';\nexport type FileView = 'list' | 'grid';\n\nexport type FileChange =\n | { type: 'create'; id: string; parent: string }\n | { type: 'rename'; id: string; name: string }\n | { type: 'delete'; ids: string[] }\n | { type: 'move'; ids: string[]; to: string };\n\nexport interface FileExplorerOptions {\n /** What the top folder holds. */\n files?: FileEntry[];\n /** Name of the top folder (default 'Inicio'). */\n rootLabel?: string;\n /** The folder open at the start (default: the top one, '/'). */\n folder?: string;\n view?: FileView;\n /** The folder tree beside the content (default true; it hides on narrow widths). */\n tree?: boolean;\n /** No new folders, renaming, deleting or moving (default false). */\n readOnly?: boolean;\n locale?: string;\n /** Accessible name (default 'Explorador de archivos'). */\n label?: string;\n /** A file was opened (double click or Enter). */\n onOpen?: (entry: FileEntry) => void;\n onNavigate?: (folder: FileEntry) => void;\n onSelectionChange?: (ids: string[]) => void;\n onViewChange?: (view: FileView) => void;\n /** After every change (new folder, rename, delete, move), with all the files. */\n onChange?: (files: FileEntry[], change: FileChange) => void;\n}\n\nexport interface FileExplorerInstance extends Instance {\n /** Open a folder, or a file (its folder opens and onOpen is called). */\n open(id: string): void;\n up(): void;\n setView(view: FileView): void;\n select(ids: string[]): void;\n /** A new folder in the open one; its name is asked for in place. Returns its id. */\n createFolder(name?: string): string | null;\n /** With a name, renames at once; without one, asks for it in place. */\n rename(id: string, name?: string): void;\n /** Deletes these entries (default: the selection). */\n remove(ids?: string[]): void;\n move(ids: string[], folder: string): void;\n setFiles(files: FileEntry[]): void;\n readonly files: FileEntry[];\n /** The open folder's id ('/' for the top one). */\n readonly folder: string;\n readonly selection: string[];\n readonly view: FileView;\n}\n\nexport const ROOT_FOLDER = '/';\n\nconst SVG = (paths: string) =>\n `<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\">${paths}</svg>`;\nconst ICONS = {\n up: SVG('<path d=\"M12 19V5M6 11l6-6 6 6\"/>'),\n newFolder: SVG('<path d=\"M3 7.5A2.5 2.5 0 0 1 5.5 5h3.7l2 2h7.3A2.5 2.5 0 0 1 21 9.5v8a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 17.5z\"/><path d=\"M12 11v5M9.5 13.5h5\"/>'),\n rename: SVG('<path d=\"M4 20h4L18.5 9.5a2.1 2.1 0 0 0-3-3L5 17v3\"/><path d=\"M14 7l3 3\"/>'),\n remove: SVG('<path d=\"M5 7h14M10 7V5h4v2M7 7l1 12h8l1-12\"/>'),\n list: SVG('<path d=\"M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01\"/>'),\n grid: SVG('<rect x=\"4\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.5\"/><rect x=\"13.5\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.5\"/><rect x=\"4\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.5\"/><rect x=\"13.5\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.5\"/>'),\n};\nconst ARROW = '<svg aria-hidden=\"true\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 19V5M6 11l6-6 6 6\"/></svg>';\nconst FOLDER =\n '<svg aria-hidden=\"true\" viewBox=\"0 0 48 40\"><path data-mk-fx-folder-back d=\"M2 6a4 4 0 0 1 4-4h11.6a4 4 0 0 1 2.9 1.2L23.4 6H42a4 4 0 0 1 4 4v24a4 4 0 0 1-4 4H6a4 4 0 0 1-4-4z\"/><path data-mk-fx-folder-front d=\"M2 14a4 4 0 0 1 4-4h36a4 4 0 0 1 4 4v20a4 4 0 0 1-4 4H6a4 4 0 0 1-4-4z\"/></svg>';\nconst PAGE =\n '<svg aria-hidden=\"true\" viewBox=\"0 0 40 48\"><path data-mk-fx-page d=\"M7 2h18.5L37 13.5V42a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V6a4 4 0 0 1 4-4z\"/><path data-mk-fx-fold d=\"M25.5 2v8.5a3 3 0 0 0 3 3H37z\"/></svg>';\nconst SORT_LABEL: Record<FileSort, string> = { name: 'Nombre', size: 'Tamaño', modified: 'Modificado' };\nconst plural = (n: number, one: string, many: string) => `${n} ${n === 1 ? one : many}`;\nlet sequence = 0;\n\n/** A drawn icon: a folder in the accent, or a page tinted by the file's family with its extension on a tag. */\nfunction iconOf(entry: FileEntry) {\n const icon = document.createElement('span');\n icon.dataset.mkFxIcon = '';\n icon.dataset.family = fileFamily(entry);\n icon.innerHTML = isFolder(entry) ? FOLDER : PAGE;\n const extension = isFolder(entry) ? '' : extensionOf(entry.name);\n if (extension) {\n const tag = document.createElement('span');\n tag.dataset.mkFxExt = '';\n tag.setAttribute('aria-hidden', 'true');\n tag.textContent = extension.slice(0, 4).toUpperCase();\n icon.append(tag);\n }\n return icon;\n}\n\ninterface Located {\n entry: FileEntry;\n parent: FileEntry | null;\n /** From the top folder to the entry, both included. */\n path: FileEntry[];\n}\n\ninterface DropTarget {\n id: string;\n where: 'pane' | 'tree' | 'crumbs';\n element: HTMLElement;\n}\n\ninterface Drag {\n ids: string[];\n origin: HTMLElement;\n pointerId: number;\n startX: number;\n startY: number;\n lastX: number;\n touch: boolean;\n /** Touch: the long press is over, the drag may start. */\n armed: boolean;\n started: boolean;\n ghost: HTMLElement | null;\n target: DropTarget | null;\n follow: { x: (value: number) => void; y: (value: number) => void; tilt: (value: number) => void } | null;\n timers: ReturnType<typeof setTimeout>[];\n}\n\nexport function createFileExplorer(root: HTMLElement | null, options: FileExplorerOptions = {}): FileExplorerInstance {\n if (!root) {\n return inert({\n open() {}, up() {}, setView() {}, select() {}, createFolder: () => null, rename() {}, remove() {}, move() {}, setFiles() {},\n files: [], folder: ROOT_FOLDER, selection: [], view: 'list' as FileView,\n });\n }\n registerMotion();\n const scope = createScope();\n const uid = `mk-fx-${++sequence}`;\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n const readOnly = Boolean(options.readOnly);\n const top: FileEntry = { id: ROOT_FOLDER, name: options.rootLabel ?? 'Inicio', kind: 'folder', children: cloneEntries(fromJson(options.files) ?? []) };\n let located = new Map<string, Located>();\n const reindex = () => {\n located = new Map();\n const visit = (entry: FileEntry, parent: FileEntry | null, path: FileEntry[]) => {\n const here = [...path, entry];\n located.set(entry.id, { entry, parent, path: here });\n for (const child of entry.children ?? []) visit(child, entry, here);\n };\n visit(top, null, []);\n };\n reindex();\n const folderOf = (id: string | null | undefined) => {\n const found = id ? located.get(id) : undefined;\n return found && isFolder(found.entry) ? found.entry : null;\n };\n let current = folderOf(options.folder) ?? top;\n let view: FileView = options.view === 'grid' ? 'grid' : 'list';\n let sort: { key: FileSort; direction: 1 | -1 } = { key: 'name', direction: 1 };\n let selection = new Set<string>();\n let anchor: string | null = null;\n let focusId: string | null = null;\n let cut: string[] = [];\n let renaming: { id: string; finish: (save: boolean) => boolean } | null = null;\n let renders = 0;\n let created = 0;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n // ── The parts ────────────────────────────────────────────────────────────\n const bar = document.createElement('div');\n bar.dataset.mkFxBar = '';\n const crumbsHost = document.createElement('div');\n crumbsHost.className = 'mk-breadcrumb';\n crumbsHost.dataset.mkFxCrumbs = '';\n const tools = document.createElement('div');\n tools.dataset.mkFxTools = '';\n const tool = (name: string, label: string, icon: string, text?: string) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkFxTool = name;\n button.setAttribute('aria-label', label);\n button.title = label;\n button.innerHTML = icon;\n if (text) {\n const span = document.createElement('span');\n span.textContent = text;\n button.append(span);\n }\n return button;\n };\n const upButton = tool('up', 'Subir un nivel', ICONS.up);\n const newButton = tool('new', 'Nueva carpeta', ICONS.newFolder, 'Nueva carpeta');\n const renameButton = tool('rename', 'Renombrar (F2)', ICONS.rename);\n const removeButton = tool('remove', 'Eliminar (Supr)', ICONS.remove);\n const views = document.createElement('div');\n views.dataset.mkFxViews = '';\n views.setAttribute('role', 'radiogroup');\n views.setAttribute('aria-label', 'Vista');\n const indicator = document.createElement('span');\n indicator.dataset.mkFxViewIndicator = '';\n indicator.setAttribute('aria-hidden', 'true');\n const viewButton = (name: FileView, label: string, icon: string) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.view = name;\n button.setAttribute('role', 'radio');\n button.setAttribute('aria-label', label);\n button.title = label;\n button.innerHTML = icon;\n return button;\n };\n const listButton = viewButton('list', 'Lista', ICONS.list);\n const gridButton = viewButton('grid', 'Cuadrícula', ICONS.grid);\n views.append(indicator, listButton, gridButton);\n tools.append(upButton);\n if (!readOnly) tools.append(newButton, renameButton, removeButton);\n tools.append(views);\n bar.append(crumbsHost, tools);\n\n const body = document.createElement('div');\n body.dataset.mkFxBody = '';\n const side = document.createElement('div');\n side.className = 'mk-tree-view';\n side.dataset.mkFxSide = '';\n const main = document.createElement('div');\n main.dataset.mkFxMain = '';\n const head = document.createElement('div');\n head.dataset.mkFxHead = '';\n head.setAttribute('role', 'group');\n head.setAttribute('aria-label', 'Ordenar');\n head.append(document.createElement('span'));\n const sortButtons = (['name', 'size', 'modified'] as FileSort[]).map((key) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.sort = key;\n const text = document.createElement('span');\n text.textContent = SORT_LABEL[key];\n button.append(text);\n button.insertAdjacentHTML('beforeend', ARROW);\n head.append(button);\n return button;\n });\n const pane = document.createElement('div');\n pane.dataset.mkFxPane = '';\n const list = document.createElement('div');\n list.id = `${uid}-items`;\n list.dataset.mkFxItems = '';\n list.setAttribute('role', 'listbox');\n list.setAttribute('aria-multiselectable', 'true');\n const empty = document.createElement('p');\n empty.dataset.mkFxEmpty = '';\n empty.textContent = 'Esta carpeta está vacía';\n pane.append(list, empty);\n main.append(head, pane);\n if (options.tree !== false) body.append(side);\n body.append(main);\n const footer = document.createElement('div');\n footer.dataset.mkFxStatus = '';\n const count = document.createElement('span');\n count.dataset.mkFxCount = '';\n const note = document.createElement('span');\n note.id = `${uid}-note`;\n note.dataset.mkFxNote = '';\n footer.append(count, note);\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n root.append(bar, body, footer, status);\n const leavingCopies = new Set<HTMLElement>();\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n for (const copy of leavingCopies) copy.remove();\n bar.remove();\n body.remove();\n footer.remove();\n status.remove();\n });\n scope.attr(root, 'data-mk-ready', '');\n scope.attr(root, 'data-mk-view', view);\n scope.attr(root, 'role', 'region');\n scope.attr(root, 'aria-label', options.label ?? 'Explorador de archivos');\n if (options.tree !== false) scope.attr(root, 'data-mk-fx-tree', '');\n if (readOnly) scope.attr(root, 'data-mk-readonly', '');\n\n // ── The breadcrumb and the folder tree ───────────────────────────────────\n const pathOf = (folder: FileEntry) => located.get(folder.id)?.path ?? [top];\n const crumbItems = () => pathOf(current).map((folder, i, path) => ({ label: folder.name, href: i < path.length - 1 ? '#' : undefined }));\n const crumbs = createBreadcrumb(crumbsHost, {\n items: crumbItems(),\n label: 'Ruta de la carpeta',\n onNavigate: (_item, index, event) => {\n event.preventDefault();\n const target = pathOf(current)[index];\n if (target) navigate(target.id, { from: pathOf(current)[index + 1]?.id });\n },\n });\n // Listeners on the explorer hear its own events, not those of its parts.\n scope.on(crumbsHost, 'mk:navigate', (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n let shownCrumbs = JSON.stringify(crumbItems());\n const paintCrumbs = () => {\n const items = crumbItems();\n const next = JSON.stringify(items);\n if (next === shownCrumbs) return;\n shownCrumbs = next;\n crumbs.setItems(items);\n };\n\n let collator: Intl.Collator;\n try {\n collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n } catch {\n collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\n }\n const treeNodes = (): TreeNode[] => {\n const toNode = (folder: FileEntry): TreeNode => ({\n id: folder.id,\n label: folder.name,\n children: (folder.children ?? [])\n .filter(isFolder)\n .sort((a, b) => collator.compare(a.name, b.name))\n .map(toNode),\n });\n return [toNode(top)];\n };\n const tree =\n options.tree === false\n ? null\n : createTreeView(side, {\n nodes: treeNodes(),\n expanded: pathOf(current).map((folder) => folder.id),\n selected: current.id,\n label: 'Carpetas',\n renderLabel: (node, element) => {\n const name = document.createElement('span');\n name.dataset.mkFxTreeName = '';\n name.textContent = node.label;\n element.append(iconOf({ id: node.id, name: node.label, kind: 'folder' }), name);\n },\n onSelect: (node) => navigate(node.id),\n });\n for (const type of ['mk:select', 'mk:expand', 'mk:check']) scope.on(side, type, (event) => event.stopPropagation());\n scope.add(() => {\n tree?.destroy();\n crumbs.destroy();\n });\n const paintTree = (nodes: boolean) => {\n if (!tree) return;\n if (nodes) tree.setNodes(treeNodes());\n for (const folder of pathOf(current).slice(0, -1)) if (!tree.expanded.includes(folder.id)) tree.expand(folder.id);\n tree.select(current.id);\n };\n\n // ── Drawing the content ──────────────────────────────────────────────────\n const dateFormat = safeFormat(locale, { day: 'numeric', month: 'short', year: 'numeric' });\n const countText = (n: number) => (n ? plural(n, 'elemento', 'elementos') : 'Vacía');\n const items = () => [...list.querySelectorAll<HTMLElement>(':scope > [data-mk-fx-item]')];\n const itemOf = (id: string) => items().find((item) => item.dataset.id === id) ?? null;\n const inCurrent = (id: string) => located.get(id)?.parent === current;\n\n const itemElement = (entry: FileEntry) => {\n const folder = isFolder(entry);\n const item = document.createElement('div');\n item.dataset.mkFxItem = '';\n item.dataset.id = entry.id;\n item.dataset.kind = folder ? 'folder' : 'file';\n item.setAttribute('role', 'option');\n item.setAttribute('aria-selected', String(selection.has(entry.id)));\n item.tabIndex = -1;\n if (cut.includes(entry.id)) item.setAttribute('data-mk-fx-cut', '');\n const name = document.createElement('span');\n name.dataset.mkFxName = '';\n name.textContent = entry.name;\n name.title = entry.name;\n const size = document.createElement('span');\n size.dataset.mkFxSize = '';\n size.textContent = folder ? countText(entry.children?.length ?? 0) : entry.size === undefined ? '—' : formatSize(entry.size, locale);\n const date = toTime(entry.modified);\n const modified = document.createElement('span');\n modified.dataset.mkFxDate = '';\n modified.textContent = date ? dateFormat.format(date) : '—';\n item.setAttribute('aria-label', [entry.name, folder ? `carpeta, ${size.textContent.toLowerCase()}` : size.textContent, date ? modified.textContent : ''].filter((part) => part && part !== '—').join(', '));\n item.append(iconOf(entry), name, size, modified);\n return item;\n };\n\n const paintTools = () => {\n upButton.disabled = current === top;\n renameButton.disabled = selection.size !== 1;\n removeButton.disabled = selection.size === 0;\n };\n let error: string | null = null;\n const paintStatus = () => {\n count.textContent = plural(current.children?.length ?? 0, 'elemento', 'elementos');\n note.toggleAttribute('data-mk-fx-error', Boolean(error));\n if (error) {\n note.textContent = error;\n return;\n }\n const chosen = [...selection].map((id) => located.get(id)?.entry).filter((entry): entry is FileEntry => Boolean(entry));\n const bytes = chosen.reduce((sum, entry) => sum + (isFolder(entry) ? 0 : entry.size ?? 0), 0);\n note.textContent = chosen.length\n ? `${plural(chosen.length, 'seleccionado', 'seleccionados')}${bytes ? ` · ${formatSize(bytes, locale)}` : ''}`\n : cut.length\n ? `${plural(cut.length, 'cortado', 'cortados')} · pega con Ctrl+V en otra carpeta`\n : '';\n };\n const paintSort = () => {\n for (const button of sortButtons) {\n const key = button.dataset.sort as FileSort;\n const active = key === sort.key;\n button.toggleAttribute('data-active', active);\n button.dataset.direction = active && sort.direction === -1 ? 'desc' : 'asc';\n button.setAttribute('aria-label', active ? `${SORT_LABEL[key]}, orden ${sort.direction === 1 ? 'ascendente' : 'descendente'}` : `Ordenar por ${SORT_LABEL[key].toLowerCase()}`);\n }\n };\n\n /** One item can take the focus (Tab): the focused one, else the first selected, else the first. */\n const roving = () => {\n const all = items();\n const target = (focusId && all.find((item) => item.dataset.id === focusId)) || all.find((item) => selection.has(item.dataset.id!)) || all[0];\n for (const item of all) item.tabIndex = item === target ? 0 : -1;\n // An empty folder still takes the focus, so the keyboard can go up or make a folder.\n list.tabIndex = all.length ? -1 : 0;\n };\n\n const renderPane = () => {\n renders++;\n renaming?.finish(false);\n const active = document.activeElement;\n const hadFocus = Boolean(active && (list === active || list.contains(active)));\n for (const id of selection) if (!inCurrent(id)) selection.delete(id);\n list.replaceChildren(...sortEntries(current.children ?? [], sort.key, sort.direction, locale).map(itemElement));\n list.setAttribute('aria-label', `Contenido de ${current.name}`);\n empty.hidden = (current.children?.length ?? 0) > 0;\n roving();\n paintStatus();\n paintTools();\n if (hadFocus && !list.contains(document.activeElement)) (items().find((item) => item.tabIndex === 0) ?? list).focus({ preventScroll: true });\n };\n\n /** Redraw with `change`: what stays glides to its new place, the `entering` ids grow in. */\n const reflow = (change: () => void, entering: string[] = []) => {\n const before = items();\n for (const item of before) item.dataset.flipId = item.dataset.id;\n const state = reduced() || !before.length || before.length > 240 ? null : Flip.getState(before);\n change();\n const after = items();\n for (const item of after) item.dataset.flipId = item.dataset.id;\n if (!state) {\n if (!reduced()) keep(blurIn(after.filter((item) => entering.includes(item.dataset.id!)), { from: 'pop', stagger: 0.04 }));\n return;\n }\n keep(\n Flip.from(state, {\n targets: after,\n duration: TIMING.layoutTravel,\n ease: EASE.layoutReflow,\n // A beat late: the others make room first.\n onEnter: (arriving) =>\n gsap.fromTo(arriving, { opacity: 0, scale: 0.8, filter: 'blur(8px)' }, { opacity: 1, scale: 1, filter: 'blur(0px)', duration: 0.42, delay: 0.1, stagger: 0.04, ease: EASE.pop, clearProps: 'opacity,transform,filter' }),\n }),\n );\n };\n\n // ── Selection ────────────────────────────────────────────────────────────\n const sameIds = (a: Iterable<string>, b: Set<string>) => {\n const list = [...a];\n return list.length === b.size && list.every((id) => b.has(id));\n };\n const announceSelection = () => {\n const ids = [...selection];\n options.onSelectionChange?.(ids);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { ids } }));\n };\n const setSelection = (ids: Iterable<string>, notify = true) => {\n const next = new Set([...ids].filter(inCurrent));\n const changed = !sameIds(next, selection);\n selection = next;\n for (const item of items()) item.setAttribute('aria-selected', String(selection.has(item.dataset.id!)));\n paintStatus();\n paintTools();\n if (changed && notify) announceSelection();\n };\n const selectRange = (from: string, to: string, add: boolean) => {\n const order = items().map((item) => item.dataset.id!);\n const a = order.indexOf(from);\n const b = order.indexOf(to);\n if (a < 0 || b < 0) return setSelection([to]);\n const range = order.slice(Math.min(a, b), Math.max(a, b) + 1);\n setSelection(add ? [...selection, ...range] : range);\n };\n /** Scroll the content (up and down only: an item still sliding in must not scroll it sideways) to show `item`. */\n const revealItem = (item: HTMLElement | null) => {\n if (!item) return;\n const top = item.offsetTop;\n const bottom = top + item.offsetHeight;\n if (top < pane.scrollTop) pane.scrollTop = Math.max(0, top - 6);\n else if (bottom > pane.scrollTop + pane.clientHeight) pane.scrollTop = bottom - pane.clientHeight + 6;\n };\n const focusItem = (id: string | null) => {\n focusId = id;\n roving();\n const item = id ? itemOf(id) : null;\n item?.focus({ preventScroll: true });\n revealItem(item);\n };\n\n // ── Going places ─────────────────────────────────────────────────────────\n const navigate = (id: string, { from, focus = false }: { from?: string; focus?: boolean } = {}) => {\n const folder = folderOf(id);\n if (!folder || folder === current) return;\n renaming?.finish(false);\n const forward = pathOf(folder).length >= pathOf(current).length;\n const active = document.activeElement;\n const focusInside = focus || Boolean(active && (list === active || list.contains(active)));\n // The old content leaves as a copy while the new one comes in from the other side.\n let copy: HTMLElement | null = null;\n if (!reduced() && list.childElementCount && list.childElementCount <= 240) {\n copy = list.cloneNode(true) as HTMLElement;\n copy.removeAttribute('id');\n copy.removeAttribute('role');\n copy.setAttribute('aria-hidden', 'true');\n copy.inert = true;\n copy.dataset.mkFxLeaving = '';\n copy.style.top = `${list.offsetTop - pane.scrollTop}px`;\n copy.style.left = `${list.offsetLeft}px`;\n copy.style.width = `${list.offsetWidth}px`;\n }\n current = folder;\n const back = from && inCurrent(from) ? from : null;\n const before = [...selection];\n selection = new Set(back ? [back] : []);\n anchor = back;\n focusId = back;\n cut = cut.filter((cutId) => located.has(cutId));\n error = null;\n renderPane();\n pane.scrollTop = 0;\n if (copy) {\n pane.append(copy);\n leavingCopies.add(copy);\n const gone = copy;\n // The old content fades fast while it slides away; the new one follows a beat later.\n keep(\n gsap\n .timeline({\n onComplete: () => {\n gone.remove();\n leavingCopies.delete(gone);\n },\n })\n .to(gone, { x: forward ? -32 : 32, duration: 0.26, ease: 'power2.in' }, 0)\n .to(gone, { opacity: 0, filter: 'blur(6px)', duration: 0.16, ease: 'power1.out' }, 0),\n );\n keep(gsap.fromTo(list, { x: forward ? 32 : -32, opacity: 0, filter: 'blur(6px)' }, { x: 0, opacity: 1, filter: 'blur(0px)', duration: 0.34, delay: 0.07, ease: EASE.signature, clearProps: 'transform,opacity,filter' }));\n } else if (!reduced()) keep(blurIn(items().slice(0, 24), { from: 'soft', stagger: 0.02, duration: 0.3 }));\n paintCrumbs();\n paintTree(false);\n if (focusInside) focusItem(back ?? items()[0]?.dataset.id ?? null);\n if (focusInside && !items().length) list.focus({ preventScroll: true });\n status.textContent = `${folder.name}: ${countText(folder.children?.length ?? 0).toLowerCase()}`;\n if (back) revealItem(itemOf(back));\n options.onNavigate?.(folder);\n root.dispatchEvent(new CustomEvent('mk:navigate', { bubbles: true, detail: { id: folder.id, folder } }));\n if (!sameIds(before, selection)) announceSelection();\n };\n const goUp = (focus = false) => {\n const parent = located.get(current.id)?.parent;\n if (parent) navigate(parent.id, { from: current.id, focus });\n };\n\n const openEntry = (id: string, focus = false) => {\n const found = located.get(id);\n if (!found) return;\n if (isFolder(found.entry)) return navigate(id, { focus });\n keep(press(itemOf(id)?.querySelector('[data-mk-fx-icon]')));\n const entry = { ...found.entry };\n options.onOpen?.(entry);\n root.dispatchEvent(new CustomEvent('mk:open', { bubbles: true, detail: { id, entry } }));\n };\n\n // ── Changing the files ───────────────────────────────────────────────────\n /** After the data changed: redraw (the `leaving` items shrink out first), update the tree and tell the app. */\n const commit = (change: FileChange, { leaving = [], entering = [] }: { leaving?: string[]; entering?: string[] } = {}) => {\n reindex();\n cut = cut.filter((id) => located.has(id));\n const gone = leaving.map(itemOf).filter((item): item is HTMLElement => Boolean(item));\n const redraw = () => reflow(renderPane, entering);\n if (gone.length && !reduced()) {\n const at = renders;\n for (const item of gone) item.setAttribute('data-mk-fx-gone', '');\n keep(\n gsap.to(gone, {\n opacity: 0,\n scale: 0.85,\n filter: 'blur(6px)',\n duration: 0.22,\n ease: 'power2.in',\n // Unless something else drew the content meanwhile.\n onComplete: () => (renders === at && !scope.disposed ? redraw() : undefined),\n }),\n );\n paintStatus();\n paintTools();\n } else redraw();\n paintCrumbs();\n paintTree(true);\n const files = cloneEntries(top.children ?? []);\n options.onChange?.(files, change);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { files, change } }));\n };\n\n const createFolder = (name = 'Nueva carpeta') => {\n if (readOnly || scope.disposed) return null;\n renaming?.finish(true);\n const entry: FileEntry = { id: `${uid}-${Date.now().toString(36)}-${++created}`, name: uniqueName(name, current.children ?? []), kind: 'folder', children: [], modified: new Date().toISOString() };\n (current.children ??= []).push(entry);\n reindex();\n selection = new Set([entry.id]);\n anchor = entry.id;\n focusId = entry.id;\n status.textContent = `Carpeta «${entry.name}» creada`;\n commit({ type: 'create', id: entry.id, parent: current.id }, { entering: [entry.id] });\n revealItem(itemOf(entry.id));\n startRename(entry.id);\n return entry.id;\n };\n\n const problemWith = (name: string, entry: FileEntry) => {\n const parent = located.get(entry.id)?.parent;\n if (!name) return 'Escribe un nombre';\n if (/[\\\\/]/.test(name)) return 'El nombre no puede llevar / ni \\\\';\n if (parent && nameTaken(name, parent.children ?? [], entry.id)) return `Ya existe «${name}» en esta carpeta`;\n return null;\n };\n const applyName = (entry: FileEntry, name: string) => {\n entry.name = name;\n status.textContent = `Renombrado a «${name}»`;\n commit({ type: 'rename', id: entry.id, name });\n const renamed = itemOf(entry.id);\n if (renamed && !reduced()) keep(blurIn(renamed.querySelector('[data-mk-fx-name]'), { from: 'soft', duration: 0.35 }));\n };\n\n const startRename = (id: string) => {\n if (readOnly) return;\n renaming?.finish(true);\n const entry = located.get(id)?.entry;\n const item = itemOf(id);\n if (!entry || !item || entry === top) return;\n const name = item.querySelector<HTMLElement>('[data-mk-fx-name]')!;\n const input = document.createElement('input');\n input.type = 'text';\n input.dataset.mkFxRename = '';\n input.value = entry.name;\n input.spellcheck = false;\n input.setAttribute('aria-label', `Nuevo nombre de ${entry.name}`);\n input.setAttribute('aria-describedby', note.id);\n name.hidden = true;\n name.after(input);\n item.setAttribute('data-mk-fx-renaming', '');\n input.focus();\n // The name without its extension is what people change.\n const dot = isFolder(entry) ? -1 : entry.name.lastIndexOf('.');\n input.setSelectionRange(0, dot > 0 ? dot : entry.name.length);\n const finish = (save: boolean) => {\n if (renaming?.id !== id) return true;\n // Redrawn under it: nothing to keep.\n if (!input.isConnected) {\n renaming = null;\n error = null;\n return true;\n }\n const next = input.value.trim();\n if (save && next !== entry.name) {\n const problem = problemWith(next, entry);\n if (problem) {\n error = problem;\n paintStatus();\n status.textContent = problem;\n input.setAttribute('aria-invalid', 'true');\n keep(shake(input));\n return false;\n }\n }\n renaming = null;\n error = null;\n input.remove();\n name.hidden = false;\n item.removeAttribute('data-mk-fx-renaming');\n paintStatus();\n if (save && next !== entry.name) applyName(entry, next);\n focusItem(id);\n return true;\n };\n renaming = { id, finish };\n input.addEventListener('keydown', (event) => {\n event.stopPropagation();\n if (event.key === 'Enter') {\n event.preventDefault();\n finish(true);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n finish(false);\n }\n });\n input.addEventListener('input', () => {\n if (!error) return;\n error = null;\n input.removeAttribute('aria-invalid');\n paintStatus();\n });\n // Leaving the field keeps a good name and drops a wrong one.\n input.addEventListener('blur', () => {\n if (!finish(true)) finish(false);\n });\n for (const type of ['click', 'dblclick', 'pointerdown']) input.addEventListener(type, (event) => event.stopPropagation());\n };\n\n const removeEntries = (ids: string[]) => {\n if (readOnly) return;\n renaming?.finish(false);\n const found = [...new Set(ids)].map((id) => located.get(id)).filter((entry): entry is Located => Boolean(entry?.parent));\n if (!found.length) return;\n const order = items().map((item) => item.dataset.id!);\n const firstGone = Math.min(...found.map(({ entry }) => order.indexOf(entry.id)).filter((i) => i >= 0));\n for (const { entry, parent } of found) parent!.children = (parent!.children ?? []).filter((child) => child !== entry);\n const removed = found.map(({ entry }) => entry.id);\n reindex();\n // The open folder went with them: the closest folder left opens.\n if (!located.has(current.id)) {\n const survivor = [...pathOf(current)].reverse().find((folder) => located.has(folder.id)) ?? top;\n current = survivor;\n }\n // The focus goes to what takes the place of the first one deleted.\n const left = order.filter((id) => !removed.includes(id));\n focusId = Number.isFinite(firstGone) ? (left[Math.min(firstGone, left.length - 1)] ?? null) : focusId;\n const hadSelection = selection.size > 0;\n selection = new Set();\n status.textContent = found.length === 1 ? `«${found[0]!.entry.name}» eliminado` : `${found.length} elementos eliminados`;\n commit({ type: 'delete', ids: removed }, { leaving: removed });\n if (hadSelection) announceSelection();\n };\n\n /** Can `ids` go into `folderId`? Not into themselves, not into their own insides, not where they are. */\n const canMove = (ids: string[], folderId: string) => {\n if (readOnly || !ids.length) return false;\n const folder = folderOf(folderId);\n if (!folder) return false;\n const path = pathOf(folder).map((entry) => entry.id);\n return ids.every((id) => {\n const found = located.get(id);\n return Boolean(found?.parent) && !path.includes(id) && found!.parent!.id !== folderId;\n });\n };\n const moveEntries = (ids: string[], folderId: string) => {\n if (!canMove(ids, folderId)) return false;\n renaming?.finish(false);\n const folder = folderOf(folderId)!;\n const leaving = ids.filter(inCurrent);\n for (const id of ids) {\n const { entry, parent } = located.get(id)!;\n parent!.children = (parent!.children ?? []).filter((child) => child !== entry);\n entry.name = uniqueName(entry.name, folder.children ?? []);\n (folder.children ??= []).push(entry);\n }\n cut = cut.filter((id) => !ids.includes(id));\n const arriving = folder === current;\n const before = [...selection];\n if (arriving) {\n selection = new Set(ids);\n anchor = ids[0] ?? null;\n focusId = anchor;\n } else selection = new Set([...selection].filter((id) => !ids.includes(id)));\n const names = ids.map((id) => located.get(id)!.entry.name);\n status.textContent = ids.length === 1 ? `«${names[0]}» movido a «${folder.name}»` : `${ids.length} elementos movidos a «${folder.name}»`;\n commit({ type: 'move', ids: [...ids], to: folderId }, { leaving, entering: arriving ? ids : [] });\n if (arriving) focusItem(anchor);\n if (!sameIds(before, selection)) announceSelection();\n return true;\n };\n\n // ── Pointer: select, open, drag ──────────────────────────────────────────\n let suppressClick = false;\n scope.on(pane, 'click', (event) => {\n if (suppressClick) return;\n const mouse = event as MouseEvent;\n const item = (mouse.target as Element | null)?.closest<HTMLElement>('[data-mk-fx-item]');\n if (!item || !list.contains(item)) {\n if (selection.size && !mouse.ctrlKey && !mouse.metaKey) setSelection([]);\n return;\n }\n const id = item.dataset.id!;\n if (mouse.shiftKey && anchor) selectRange(anchor, id, mouse.ctrlKey || mouse.metaKey);\n else if (mouse.ctrlKey || mouse.metaKey) {\n setSelection(selection.has(id) ? [...selection].filter((chosen) => chosen !== id) : [...selection, id]);\n anchor = id;\n } else {\n const fresh = !selection.has(id);\n setSelection([id]);\n anchor = id;\n if (fresh && !reduced()) keep(gsap.fromTo(item, { scale: 0.97 }, { scale: 1, duration: 0.35, ease: EASE.click, clearProps: 'transform' }));\n }\n focusItem(id);\n });\n scope.on(list, 'dblclick', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-fx-item]');\n if (item) openEntry(item.dataset.id!, true);\n });\n\n let drag: Drag | null = null;\n const dropTargetAt = (x: number, y: number, ids: string[]): DropTarget | null => {\n const under = document.elementFromPoint?.(x, y) ?? null;\n if (!under) return null;\n let target: DropTarget | null = null;\n const paneFolder = under.closest<HTMLElement>('[data-mk-fx-item][data-kind=\"folder\"]');\n if (paneFolder && list.contains(paneFolder)) target = { id: paneFolder.dataset.id!, where: 'pane', element: paneFolder };\n const treeItem = !target && tree ? under.closest<HTMLElement>('[role=\"treeitem\"]') : null;\n if (treeItem && side.contains(treeItem)) target = { id: treeItem.dataset.id!, where: 'tree', element: treeItem.querySelector<HTMLElement>(':scope > [data-mk-tree-row]') ?? treeItem };\n const link = !target ? under.closest<HTMLElement>('a[data-mk-crumb-link]') : null;\n if (link && crumbsHost.contains(link)) {\n const folder = pathOf(current)[Number(link.dataset.mkIndex)];\n if (folder) target = { id: folder.id, where: 'crumbs', element: link };\n }\n return target && canMove(ids, target.id) ? target : null;\n };\n /** The element a drop target is drawn by now (the content and the tree are redrawn by a move). */\n const elementFor = (target: DropTarget) => {\n if (target.where === 'pane') return itemOf(target.id);\n if (target.where === 'tree') return [...side.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')].find((item) => item.dataset.id === target.id)?.querySelector<HTMLElement>(':scope > [data-mk-tree-row]') ?? null;\n return target.element.isConnected ? target.element : null;\n };\n\n const lift = (x: number, y: number) => {\n if (!drag) return;\n drag.started = true;\n if (!selection.has(drag.ids[0]!) || drag.ids.length === 1) setSelection(drag.ids);\n const first = located.get(drag.ids[0]!)!.entry;\n const ghost = document.createElement('div');\n ghost.dataset.mkFxGhost = '';\n ghost.setAttribute('aria-hidden', 'true');\n const name = document.createElement('span');\n name.textContent = drag.ids.length === 1 ? first.name : `${first.name} y ${plural(drag.ids.length - 1, 'más', 'más')}`;\n ghost.append(iconOf(first), name);\n if (drag.ids.length > 1) {\n const badge = document.createElement('span');\n badge.dataset.mkFxGhostCount = '';\n badge.textContent = String(drag.ids.length);\n ghost.append(badge);\n }\n root.append(ghost);\n // In the top layer when it can be, so no transform or overflow around the explorer moves or clips it.\n if (typeof ghost.showPopover === 'function') {\n ghost.popover = 'manual';\n try {\n ghost.showPopover();\n } catch {\n // Not connected or not supported: it stays a fixed element.\n }\n }\n drag.ghost = ghost;\n gsap.set(ghost, { x: x + 14, y: y + 12 });\n if (reduced()) drag.follow = { x: (value) => gsap.set(ghost, { x: value }), y: (value) => gsap.set(ghost, { y: value }), tilt: () => {} };\n else {\n keep(gsap.fromTo(ghost, { opacity: 0, scale: 0.85 }, { opacity: 1, scale: 1, duration: 0.18, ease: 'power2.out' }));\n drag.follow = {\n x: gsap.quickTo(ghost, 'x', { duration: 0.28, ease: 'power3.out' }),\n y: gsap.quickTo(ghost, 'y', { duration: 0.28, ease: 'power3.out' }),\n tilt: gsap.quickTo(ghost, 'rotation', { duration: 0.4, ease: 'power2.out' }),\n };\n }\n for (const id of drag.ids) itemOf(id)?.setAttribute('data-mk-fx-dragging', '');\n root.setAttribute('data-mk-fx-dnd', '');\n status.textContent = `${plural(drag.ids.length, 'elemento', 'elementos')} en arrastre. Suelta sobre una carpeta; Escape cancela.`;\n };\n\n const hover = (x: number, y: number) => {\n if (!drag) return;\n const target = dropTargetAt(x, y, drag.ids);\n if (target?.element === drag.target?.element) return;\n drag.target?.element.removeAttribute('data-mk-fx-drop');\n drag.target = target;\n if (!target) return;\n target.element.setAttribute('data-mk-fx-drop', '');\n // A closed branch of the tree opens after a moment under the card.\n const item = target.where === 'tree' ? target.element.closest<HTMLElement>('[role=\"treeitem\"]') : null;\n if (item?.getAttribute('aria-expanded') === 'false') {\n const id = target.id;\n drag.timers.push(setTimeout(() => (drag?.target?.id === id ? tree?.expand(id) : undefined), 700));\n }\n };\n\n const autoScroll = (y: number) => {\n const box = pane.getBoundingClientRect();\n if (y < box.top + 36) pane.scrollTop -= 12;\n else if (y > box.bottom - 36) pane.scrollTop += 12;\n };\n\n const stopListening = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onKey, true);\n };\n /** The drag ends: the card flies into its folder, or back where it came from. */\n const land = (dropped: boolean) => {\n const state = drag;\n drag = null;\n stopListening();\n if (!state) return;\n for (const timer of state.timers) clearTimeout(timer);\n if (!state.started) return;\n // The click that follows the release is not a selection.\n suppressClick = true;\n setTimeout(() => (suppressClick = false), 0);\n root.removeAttribute('data-mk-fx-dnd');\n for (const item of items()) item.removeAttribute('data-mk-fx-dragging');\n const target = dropped ? state.target : null;\n target?.element.removeAttribute('data-mk-fx-drop');\n const ghost = state.ghost!;\n const finish = () => ghost.remove();\n if (target && moveEntries(state.ids, target.id)) {\n const element = elementFor(target) ?? target.element;\n const box = element.getBoundingClientRect();\n const card = ghost.getBoundingClientRect();\n if (reduced()) finish();\n else keep(gsap.to(ghost, { x: box.left + box.width / 2 - card.width / 2, y: box.top + box.height / 2 - card.height / 2, scale: 0.2, rotation: 0, opacity: 0, duration: 0.3, ease: 'power2.in', onComplete: finish }));\n if (element.isConnected) {\n keep(ringPulse(element));\n const icon = element.querySelector<HTMLElement>('[data-mk-fx-icon]');\n if (icon && !reduced()) keep(gsap.fromTo(icon, { scale: 1.2 }, { scale: 1, duration: 0.45, delay: 0.2, ease: EASE.pop, clearProps: 'transform' }));\n }\n return;\n }\n status.textContent = 'Movimiento cancelado';\n const home = itemOf(state.ids[0]!) ?? state.origin;\n const box = home.getBoundingClientRect();\n if (reduced() || !home.isConnected) finish();\n else keep(gsap.to(ghost, { x: box.left, y: box.top, rotation: 0, scale: 0.9, opacity: 0, duration: 0.35, ease: EASE.swatch, onComplete: finish }));\n };\n const onMove = (event: PointerEvent) => {\n if (!drag || event.pointerId !== drag.pointerId) return;\n const dx = event.clientX - drag.startX;\n const dy = event.clientY - drag.startY;\n if (!drag.started) {\n // On touch, moving before the long press is a scroll.\n if (drag.touch && !drag.armed) {\n if (Math.hypot(dx, dy) > 8) land(false);\n return;\n }\n if (Math.hypot(dx, dy) < 6) return;\n lift(event.clientX, event.clientY);\n }\n event.preventDefault();\n const speed = event.clientX - drag.lastX;\n drag.lastX = event.clientX;\n drag.follow?.x(event.clientX + 14);\n drag.follow?.y(event.clientY + 12);\n drag.follow?.tilt(Math.max(-12, Math.min(12, speed * 0.8)));\n hover(event.clientX, event.clientY);\n autoScroll(event.clientY);\n };\n const onUp = (event: PointerEvent) => {\n if (drag && event.pointerId === drag.pointerId) land(true);\n };\n const onCancel = (event: PointerEvent) => {\n if (drag && event.pointerId === drag.pointerId) land(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !drag?.started) return;\n event.preventDefault();\n event.stopPropagation();\n land(false);\n };\n scope.add(() => {\n stopListening();\n for (const timer of drag?.timers ?? []) clearTimeout(timer);\n drag?.ghost?.remove();\n drag = null;\n });\n\n scope.on(list, 'pointerdown', (event) => {\n const pointer = event as PointerEvent;\n if (readOnly || pointer.button !== 0 || drag || renaming) return;\n const item = (pointer.target as Element | null)?.closest<HTMLElement>('[data-mk-fx-item]');\n if (!item || item.hasAttribute('data-mk-fx-gone')) return;\n const id = item.dataset.id!;\n const touch = pointer.pointerType === 'touch';\n drag = {\n ids: selection.has(id) ? [...selection] : [id],\n origin: item,\n pointerId: pointer.pointerId,\n startX: pointer.clientX,\n startY: pointer.clientY,\n lastX: pointer.clientX,\n touch,\n armed: !touch,\n started: false,\n ghost: null,\n target: null,\n follow: null,\n timers: [],\n };\n if (touch) {\n const pending = drag;\n pending.timers.push(\n setTimeout(() => {\n if (drag !== pending) return;\n pending.armed = true;\n lift(pending.startX, pending.startY);\n }, 450),\n );\n }\n window.addEventListener('pointermove', onMove, { passive: false });\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onKey, true);\n });\n // A touch drag keeps the page from scrolling under it, and the long press from opening the system menu.\n scope.on(pane, 'touchmove', (event) => {\n if (drag?.started) event.preventDefault();\n }, { passive: false });\n scope.on(list, 'contextmenu', (event) => {\n if (drag?.touch) event.preventDefault();\n });\n\n // ── Keyboard ─────────────────────────────────────────────────────────────\n /** Items in the first row of the grid. */\n const columns = (all: HTMLElement[]) => {\n if (view === 'list' || !all.length) return 1;\n const first = all[0]!.offsetTop;\n const row = all.findIndex((item) => item.offsetTop !== first);\n return row < 0 ? all.length : Math.max(1, row);\n };\n let typed = '';\n let typedAt = 0;\n scope.on(list, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if ((key.target as Element | null)?.closest('[data-mk-fx-rename]')) return;\n const all = items();\n const item = (key.target as Element | null)?.closest<HTMLElement>('[data-mk-fx-item]') ?? null;\n const index = item ? all.indexOf(item) : -1;\n const id = item?.dataset.id ?? null;\n const command = key.ctrlKey || key.metaKey;\n const step = columns(all);\n const go = (next: number) => {\n key.preventDefault();\n const target = all[Math.max(0, Math.min(all.length - 1, next))];\n if (!target) return;\n const targetId = target.dataset.id!;\n if (key.shiftKey) selectRange(anchor ?? id ?? targetId, targetId, command);\n else if (!command) {\n setSelection([targetId]);\n anchor = targetId;\n }\n focusItem(targetId);\n };\n switch (key.key) {\n case 'ArrowDown':\n return go(index < 0 ? 0 : index + step);\n case 'ArrowUp':\n if (key.altKey) {\n key.preventDefault();\n return goUp(true);\n }\n return go(index < 0 ? 0 : index - step);\n case 'ArrowRight':\n if (view === 'grid') go(index + 1);\n return;\n case 'ArrowLeft':\n if (view === 'grid') go(index - 1);\n return;\n case 'Home':\n return go(0);\n case 'End':\n return go(all.length - 1);\n case 'Enter':\n if (id) {\n key.preventDefault();\n openEntry(id, true);\n }\n return;\n case 'Backspace':\n key.preventDefault();\n return goUp(true);\n case 'F2':\n if (id && !readOnly) {\n key.preventDefault();\n startRename(id);\n }\n return;\n case 'Delete':\n if (selection.size && !readOnly) {\n key.preventDefault();\n removeEntries([...selection]);\n }\n return;\n case 'Escape':\n if (cut.length) {\n cut = [];\n for (const each of all) each.removeAttribute('data-mk-fx-cut');\n paintStatus();\n } else if (selection.size) setSelection([]);\n return;\n case ' ':\n if (!id) return;\n key.preventDefault();\n if (command) setSelection(selection.has(id) ? [...selection].filter((chosen) => chosen !== id) : [...selection, id]);\n else setSelection([id]);\n anchor = id;\n return;\n }\n const letter = key.key.toLowerCase();\n if (command && letter === 'a') {\n key.preventDefault();\n setSelection(all.map((each) => each.dataset.id!));\n return;\n }\n if (command && letter === 'x' && selection.size && !readOnly) {\n key.preventDefault();\n cut = [...selection];\n for (const each of all) each.toggleAttribute('data-mk-fx-cut', cut.includes(each.dataset.id!));\n status.textContent = `${plural(cut.length, 'elemento cortado', 'elementos cortados')}. Abre otra carpeta y pega con Ctrl+V.`;\n paintStatus();\n return;\n }\n if (command && letter === 'v' && cut.length && !readOnly) {\n key.preventDefault();\n if (!moveEntries(cut, current.id)) {\n status.textContent = 'No se puede pegar aquí';\n keep(shake(list, 3));\n }\n return;\n }\n // Typing jumps to the next name that starts with what was typed.\n if (!command && !key.altKey && key.key.length === 1 && /\\S/.test(key.key)) {\n const now = Date.now();\n typed = now - typedAt > 600 ? letter : typed + letter;\n typedAt = now;\n const start = index + (typed.length === 1 ? 1 : 0);\n const order = [...all.slice(start), ...all.slice(0, start)];\n const match = order.find((each) => (located.get(each.dataset.id!)?.entry.name ?? '').toLowerCase().startsWith(typed));\n if (match) go(all.indexOf(match));\n }\n });\n scope.on(list, 'focusin', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-fx-item]');\n if (!item) return;\n focusId = item.dataset.id!;\n roving();\n });\n\n // ── The bar ──────────────────────────────────────────────────────────────\n const paintViews = (animate: boolean) => {\n root.setAttribute('data-mk-view', view);\n for (const button of [listButton, gridButton]) {\n const on = button.dataset.view === view;\n button.setAttribute('aria-checked', String(on));\n button.tabIndex = on ? 0 : -1;\n }\n head.hidden = view !== 'list';\n keep(slideIndicator(indicator, view === 'list' ? listButton : gridButton, { immediate: !animate }));\n };\n const setView = (next: FileView) => {\n if (next === view || scope.disposed) return;\n // Every icon flies from its row to its tile (or back) while the texts fade in again.\n const icons = [...list.querySelectorAll<HTMLElement>('[data-mk-fx-icon]')];\n const state = !reduced() && icons.length && icons.length <= 160 ? Flip.getState(icons) : null;\n view = next;\n paintViews(true);\n if (state) {\n keep(Flip.from(state, { duration: 0.5, ease: EASE.layoutReflow, scale: true }));\n keep(gsap.fromTo(list.querySelectorAll('[data-mk-fx-name], [data-mk-fx-size], [data-mk-fx-date]'), { opacity: 0 }, { opacity: 1, duration: 0.3, delay: 0.12, ease: 'power1.out', clearProps: 'opacity' }));\n }\n status.textContent = next === 'grid' ? 'Vista de cuadrícula' : 'Vista de lista';\n options.onViewChange?.(next);\n };\n scope.on(views, 'click', (event) => {\n const button = (event.target as Element | null)?.closest<HTMLButtonElement>('[data-view]');\n if (button) setView(button.dataset.view as FileView);\n });\n scope.on(views, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(key)) return;\n event.preventDefault();\n setView(view === 'list' ? 'grid' : 'list');\n (view === 'list' ? listButton : gridButton).focus();\n });\n scope.on(head, 'click', (event) => {\n const button = (event.target as Element | null)?.closest<HTMLButtonElement>('[data-sort]');\n if (!button) return;\n const key = button.dataset.sort as FileSort;\n sort = { key, direction: sort.key === key && sort.direction === 1 ? -1 : 1 };\n paintSort();\n reflow(renderPane);\n status.textContent = `Ordenado por ${SORT_LABEL[key].toLowerCase()}, ${sort.direction === 1 ? 'ascendente' : 'descendente'}`;\n });\n scope.on(upButton, 'click', () => goUp(false));\n scope.on(newButton, 'click', () => {\n keep(press(newButton));\n createFolder();\n });\n scope.on(renameButton, 'click', () => {\n const [id] = [...selection];\n if (id && selection.size === 1) startRename(id);\n });\n scope.on(removeButton, 'click', () => {\n keep(press(removeButton));\n removeEntries([...selection]);\n });\n\n if (typeof ResizeObserver === 'function') scope.observe(new ResizeObserver(() => paintViews(false))).observe(views);\n\n paintSort();\n renderPane();\n paintViews(false);\n\n return {\n open(id) {\n const found = located.get(id);\n if (!found) return;\n if (isFolder(found.entry)) return navigate(id);\n if (found.parent && found.parent !== current) navigate(found.parent.id);\n setSelection([id], false);\n anchor = id;\n focusId = id;\n roving();\n openEntry(id);\n },\n up: () => goUp(false),\n setView,\n select(ids) {\n setSelection(ids, false);\n anchor = [...selection][0] ?? null;\n },\n createFolder,\n rename(id, name) {\n if (name === undefined) return startRename(id);\n const entry = located.get(id)?.entry;\n const next = name.trim();\n if (readOnly || !entry || entry === top || next === entry.name || problemWith(next, entry)) return;\n applyName(entry, next);\n },\n remove: (ids) => removeEntries(ids ?? [...selection]),\n move: (ids, folder) => void moveEntries(ids, folder),\n setFiles(files) {\n if (scope.disposed) return;\n renaming?.finish(false);\n top.children = cloneEntries(files);\n reindex();\n current = folderOf(current.id) ?? top;\n cut = cut.filter((id) => located.has(id));\n renderPane();\n paintCrumbs();\n paintTree(true);\n },\n get files() {\n return cloneEntries(top.children ?? []);\n },\n get folder() {\n return current.id;\n },\n get selection() {\n return [...selection];\n },\n get view() {\n return view;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { walk, type TreeNode } from '../../core/tree';\nimport { press } from '../../motion/micro';\nimport { markText } from '../../core/mark';\nimport { createTreeView } from '../tree-view/engine';\n\n/*\n * JSON viewer: any JSON value as a tree (tree-view underneath): keys, values\n * coloured by type (strings, numbers, booleans, null; colours with a swatch),\n * objects and lists summed up (\"4 claves\", \"3 elementos\") and opened by levels\n * with the tree's own motion (height .32 s, children out of a blur, the\n * chevron turning). Each row has a copy button that turns into a check with a\n * pop; Ctrl/⌘+C copies the focused value. The search marks keys and values and\n * opens what holds them. setData() keeps what was open and flashes the values\n * that changed (and the keys that are new) in the accent for a moment. The\n * selected row's path ($.user.roles[0]) shows below, ready to copy.\n */\n\nexport type JsonType = 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null';\n\nexport interface JsonViewerOptions {\n /** The value; without it, the JSON written inside the root (as text or in a <script type=\"application/json\">). */\n data?: unknown;\n /** Levels open at the start: 1 shows the top keys closed, 2 opens them… (default 1; Infinity opens all). */\n expandDepth?: number;\n /** A row for the value itself with this name; without it the top keys are the first rows. */\n rootName?: string;\n /** A search field: true, or its placeholder (default false). */\n search?: boolean | string;\n /** The bar with expand, collapse and copy (default true). */\n toolbar?: boolean;\n /** Keys in alphabetical order (default false: as they come). */\n sortKeys?: boolean;\n /** Accessible name (default 'Datos JSON'). */\n label?: string;\n onSelect?: (path: string, value: unknown) => void;\n onCopy?: (text: string, path: string) => void;\n}\n\nexport interface JsonViewerInstance extends Instance {\n setData(data: unknown): void;\n expandAll(): void;\n collapseAll(): void;\n /** Open the rows down to this path ($.user.roles) and show it. */\n reveal(path: string): void;\n filter(query: string): void;\n /** Copy a value (default: all of it) as text. */\n copy(path?: string): Promise<boolean>;\n readonly data: unknown;\n}\n\ninterface JsonMeta {\n key: string | number | null;\n value: unknown;\n type: JsonType;\n path: string;\n /** Keys or items, for objects and lists. */\n size: number;\n}\n\nconst COPY = '<svg aria-hidden=\"true\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2.5\"/><path d=\"M16 8V6.5A2.5 2.5 0 0 0 13.5 4h-7A2.5 2.5 0 0 0 4 6.5v7A2.5 2.5 0 0 0 6.5 16H8\"/></svg>';\nconst CHECK = '<svg aria-hidden=\"true\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"/></svg>';\nconst SVG = (paths: string) => `<svg aria-hidden=\"true\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths}</svg>`;\nconst EXPAND = SVG('<path d=\"M7 9l5-5 5 5M7 15l5 5 5-5\"/>');\nconst COLLAPSE = SVG('<path d=\"M7 4l5 5 5-5M7 20l5-5 5 5\"/>');\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\nconst COLOR = /^(#(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})|(?:rgb|hsl|oklch|oklab)a?\\([^)]*\\))$/i;\n\nexport function typeOfJson(value: unknown): JsonType {\n if (value === null || value === undefined) return 'null';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'object') return 'object';\n if (typeof value === 'number' || typeof value === 'bigint') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n return 'string';\n}\n\n/** $.user, $.items[0], $[\"con espacios\"]. */\nexport const jsonPath = (parent: string, key: string | number) =>\n typeof key === 'number' ? `${parent}[${key}]` : IDENTIFIER.test(key) ? `${parent}.${key}` : `${parent}[${JSON.stringify(key)}]`;\n\n/** How a value reads in its row: strings quoted, the rest as JSON. */\nconst shown = (meta: JsonMeta) =>\n meta.type === 'string' ? JSON.stringify(String(meta.value)) : meta.type === 'null' ? 'null' : typeof meta.value === 'bigint' ? meta.value.toString() : String(meta.value);\nconst plural = (n: number, one: string, many: string) => `${n} ${n === 1 ? one : many}`;\nconst summary = (meta: JsonMeta) => (meta.type === 'array' ? (meta.size ? plural(meta.size, 'elemento', 'elementos') : 'vacía') : meta.size ? plural(meta.size, 'clave', 'claves') : 'vacío');\n/** What copying a value gives: a string as it is, anything else as indented JSON. */\nconst textOf = (value: unknown) =>\n typeof value === 'string' ? value : JSON.stringify(value, (_key, item: unknown) => (typeof item === 'bigint' ? item.toString() : item), 2) ?? String(value);\n\nasync function writeClipboard(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // Not allowed (no focus, no permission): the old way below.\n }\n try {\n const area = document.createElement('textarea');\n area.value = text;\n area.setAttribute('readonly', '');\n area.style.cssText = 'position:fixed;top:0;left:0;opacity:0;pointer-events:none';\n document.body.append(area);\n area.select();\n const done = typeof document.execCommand === 'function' && document.execCommand('copy');\n area.remove();\n return Boolean(done);\n } catch {\n return false;\n }\n}\n\nexport function createJsonViewer(root: HTMLElement | null, options: JsonViewerOptions = {}): JsonViewerInstance {\n if (!root) return inert({ setData() {}, expandAll() {}, collapseAll() {}, reveal() {}, filter() {}, copy: () => Promise.resolve(false), data: undefined });\n registerMotion();\n const scope = createScope();\n // JSON written inside the root stays there, out of sight.\n const authored = root.querySelector('script[type=\"application/json\"]')?.textContent ?? root.textContent ?? '';\n let data: unknown = options.data;\n // JSON text from an attribute (data-mk-data through autoInit) is read as JSON.\n if (typeof data === 'string' && /^\\s*[[{]/.test(data)) {\n try {\n data = JSON.parse(data);\n } catch {\n // Not JSON after all: shown as the string it is.\n }\n }\n if (data === undefined) {\n try {\n data = authored.trim() ? JSON.parse(authored) : null;\n } catch {\n data = null;\n }\n }\n const holder = document.createElement('div');\n holder.hidden = true;\n holder.append(...root.childNodes);\n const depthOpen = options.expandDepth ?? 1;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n // ── The value as tree nodes ──────────────────────────────────────────────\n const metas = new Map<string, JsonMeta>();\n const depths = new Map<string, number>();\n const build = (value: unknown, key: string | number | null, path: string, depth: number): TreeNode => {\n const type = typeOfJson(value);\n let children: TreeNode[] | undefined;\n if (type === 'object') {\n const entries = Object.entries(value as Record<string, unknown>).filter(([, item]) => item !== undefined && typeof item !== 'function');\n if (options.sortKeys) entries.sort(([a], [b]) => a.localeCompare(b));\n children = entries.map(([name, item]) => build(item, name, jsonPath(path, name), depth + 1));\n } else if (type === 'array') children = (value as unknown[]).map((item, i) => build(item, i, jsonPath(path, i), depth + 1));\n const meta: JsonMeta = { key, value, type, path, size: children?.length ?? 0 };\n metas.set(path, meta);\n depths.set(path, depth);\n return { id: path, label: key === null ? '' : String(key), children, data: meta };\n };\n const nodesOf = (value: unknown): TreeNode[] => {\n metas.clear();\n depths.clear();\n const type = typeOfJson(value);\n if (options.rootName !== undefined || (type !== 'object' && type !== 'array')) return [build(value, options.rootName ?? 'valor', '$', 0)];\n const top = build(value, null, '$', 0);\n return top.children ?? [];\n };\n /** Leaves as path → text, to tell what changed. */\n const leaves = () => {\n const values = new Map<string, string>();\n for (const [path, meta] of metas) if (meta.type !== 'object' && meta.type !== 'array') values.set(path, shown(meta));\n return values;\n };\n let nodes = nodesOf(data);\n const openAtStart = () => {\n const ids: string[] = [];\n walk(nodes, (node) => {\n if (node.children?.length && (depths.get(node.id) ?? 0) < depthOpen) ids.push(node.id);\n });\n return ids;\n };\n\n // ── The parts ────────────────────────────────────────────────────────────\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n let bar: HTMLElement | null = null;\n let searchInput: HTMLInputElement | null = null;\n const barButton = (name: string, label: string, icon: string) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkJvTool = name;\n button.setAttribute('aria-label', label);\n button.title = label;\n button.innerHTML = icon;\n return button;\n };\n const copyAll = barButton('copy', 'Copiar JSON', COPY);\n if (options.toolbar !== false || options.search) {\n bar = document.createElement('div');\n bar.dataset.mkJvBar = '';\n if (options.search) {\n searchInput = document.createElement('input');\n searchInput.type = 'search';\n searchInput.dataset.mkJvSearch = '';\n searchInput.placeholder = typeof options.search === 'string' ? options.search : 'Buscar clave o valor…';\n searchInput.setAttribute('aria-label', 'Buscar en el JSON');\n bar.append(searchInput);\n }\n if (options.toolbar !== false) {\n const tools = document.createElement('div');\n tools.dataset.mkJvTools = '';\n tools.append(barButton('expand', 'Expandir todo', EXPAND), barButton('collapse', 'Contraer todo', COLLAPSE), copyAll);\n bar.append(tools);\n }\n }\n const host = document.createElement('div');\n host.className = 'mk-tree-view';\n host.dataset.mkJvTree = '';\n const foot = document.createElement('div');\n foot.dataset.mkJvFoot = '';\n foot.hidden = true;\n const pathText = document.createElement('code');\n pathText.dataset.mkJvPath = '';\n const copyPath = barButton('copy-path', 'Copiar ruta', COPY);\n foot.append(pathText, copyPath);\n if (bar) root.append(bar);\n root.append(host, foot, status);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n bar?.remove();\n host.remove();\n foot.remove();\n status.remove();\n root.append(...holder.childNodes);\n });\n scope.attr(root, 'data-mk-ready', '');\n\n // ── Copying, with a check that pops ──────────────────────────────────────\n const copied = (button: HTMLElement | null) => {\n if (!button) return;\n button.innerHTML = CHECK;\n button.setAttribute('data-mk-copied', '');\n if (!reduced()) keep(gsap.fromTo(button.firstElementChild, { scale: 0.3, rotation: -25 }, { scale: 1, rotation: 0, duration: 0.42, ease: EASE.pop, transformOrigin: '50% 50%', clearProps: 'transform' }));\n scope.timeout(() => {\n button.innerHTML = COPY;\n button.removeAttribute('data-mk-copied');\n }, 1200);\n };\n const copyValue = async (path: string, button: HTMLElement | null) => {\n const meta = metas.get(path);\n const value = path === '$' ? data : meta?.value;\n if (path !== '$' && !meta) return false;\n const text = textOf(value);\n keep(press(button));\n const done = await writeClipboard(text);\n if (scope.disposed) return done;\n status.textContent = done ? `Copiado ${path === '$' ? 'el JSON' : path}` : 'No se pudo copiar';\n if (done) {\n copied(button);\n options.onCopy?.(text, path);\n root.dispatchEvent(new CustomEvent('mk:copy', { bubbles: true, detail: { text, path } }));\n }\n return done;\n };\n\n // ── Rows ─────────────────────────────────────────────────────────────────\n const renderLabel = (node: TreeNode, element: HTMLElement, query: string) => {\n const meta = node.data as JsonMeta;\n element.dataset.type = meta.type;\n if (meta.key !== null) {\n const key = document.createElement('span');\n key.dataset.mkJvKey = typeof meta.key === 'number' ? 'index' : 'name';\n key.append(markText(String(meta.key), query));\n const colon = document.createElement('span');\n colon.dataset.mkJvColon = '';\n colon.textContent = ':';\n element.append(key, colon);\n }\n if (meta.type === 'object' || meta.type === 'array') {\n const brackets = document.createElement('span');\n brackets.dataset.mkJvBrackets = '';\n brackets.textContent = meta.type === 'array' ? '[ ]' : '{ }';\n const count = document.createElement('span');\n count.dataset.mkJvSummary = '';\n count.textContent = summary(meta);\n element.append(brackets, count);\n } else {\n const value = document.createElement('span');\n value.dataset.mkJvValue = meta.type;\n const text = shown(meta);\n value.title = meta.type === 'string' ? String(meta.value) : text;\n if (meta.type === 'string' && COLOR.test(String(meta.value).trim())) {\n const swatch = document.createElement('span');\n swatch.dataset.mkJvSwatch = '';\n swatch.setAttribute('aria-hidden', 'true');\n swatch.style.background = String(meta.value).trim();\n value.append(swatch);\n }\n value.append(markText(text, query));\n element.append(value);\n }\n const copy = document.createElement('button');\n copy.type = 'button';\n copy.tabIndex = -1;\n copy.dataset.mkJvCopy = '';\n copy.setAttribute('aria-label', `Copiar ${meta.path}`);\n copy.title = 'Copiar';\n copy.innerHTML = COPY;\n // The row does not select or open under the button.\n copy.addEventListener('click', (event) => {\n event.stopPropagation();\n void copyValue(meta.path, copy);\n });\n copy.addEventListener('dblclick', (event) => event.stopPropagation());\n element.append(copy);\n };\n\n const tree = createTreeView(host, {\n nodes,\n expanded: openAtStart(),\n label: options.label ?? 'Datos JSON',\n renderLabel,\n searchText: (node) => {\n const meta = node.data as JsonMeta;\n return `${meta.key ?? ''} ${meta.type === 'object' || meta.type === 'array' ? '' : shown(meta)}`;\n },\n onSelect: (node) => {\n const meta = node.data as JsonMeta;\n foot.hidden = false;\n pathText.textContent = meta.path;\n options.onSelect?.(meta.path, meta.value);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { path: meta.path, value: meta.value } }));\n },\n });\n // Listeners on the viewer hear its own events, not those of the tree inside.\n for (const type of ['mk:select', 'mk:expand', 'mk:check']) scope.on(host, type, (event) => event.stopPropagation());\n scope.add(() => tree.destroy());\n\n const itemOf = (path: string) => [...tree.element.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')].find((item) => item.dataset.id === path) ?? null;\n\n scope.on(tree.element, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if (!(key.ctrlKey || key.metaKey) || key.key.toLowerCase() !== 'c' || window.getSelection?.()?.toString()) return;\n const item = (key.target as Element | null)?.closest<HTMLElement>('[role=\"treeitem\"]');\n if (!item) return;\n key.preventDefault();\n void copyValue(item.dataset.id!, item.querySelector<HTMLElement>(':scope > [data-mk-tree-row] [data-mk-jv-copy]'));\n });\n if (searchInput) {\n const input = searchInput;\n scope.on(input, 'input', () => tree.filter(input.value));\n scope.on(input, 'keydown', (event) => {\n if ((event as KeyboardEvent).key !== 'ArrowDown') return;\n event.preventDefault();\n tree.element.querySelector<HTMLElement>('[role=\"treeitem\"]:not([hidden])')?.focus();\n });\n }\n if (bar) {\n scope.on(bar, 'click', (event) => {\n const button = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-jv-tool]');\n if (!button) return;\n const name = button.dataset.mkJvTool;\n if (name === 'expand' || name === 'collapse') {\n keep(press(button));\n if (name === 'expand') tree.expandAll();\n else tree.collapseAll();\n status.textContent = name === 'expand' ? 'Todo expandido' : 'Todo contraído';\n if (name === 'expand' && !reduced()) {\n const rows = [...tree.element.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')].filter((item) => !item.closest('[role=\"group\"][hidden]')).slice(0, 40);\n keep(gsap.fromTo(rows, { opacity: 0, x: -6 }, { opacity: 1, x: 0, duration: 0.3, stagger: 0.012, ease: 'power2.out', clearProps: 'opacity,transform' }));\n }\n } else if (name === 'copy') void copyValue('$', button);\n });\n }\n scope.on(copyPath, 'click', async () => {\n const text = pathText.textContent ?? '';\n keep(press(copyPath));\n if (await writeClipboard(text)) {\n copied(copyPath);\n status.textContent = `Ruta copiada: ${text}`;\n }\n });\n\n return {\n setData(next) {\n if (scope.disposed) return;\n const before = leaves();\n const known = new Set(metas.keys());\n data = next;\n nodes = nodesOf(next);\n tree.setNodes(nodes);\n if (!foot.hidden && !metas.has(pathText.textContent ?? '')) foot.hidden = true;\n // What changed flashes for a moment; what is new comes in out of a blur.\n const after = leaves();\n let changes = 0;\n for (const [path, text] of after) {\n const item = itemOf(path);\n const value = item?.querySelector<HTMLElement>(':scope > [data-mk-tree-row] [data-mk-jv-value]');\n if (!value) continue;\n if (before.has(path) && before.get(path) !== text) {\n changes++;\n value.setAttribute('data-mk-jv-changed', '');\n }\n }\n const added = [...metas.keys()].filter((path) => !known.has(path));\n for (const path of added) itemOf(path)?.querySelector<HTMLElement>(':scope > [data-mk-tree-row]')?.setAttribute('data-mk-jv-added', '');\n if (changes || added.length) status.textContent = [changes ? plural(changes, 'valor cambió', 'valores cambiaron') : '', added.length ? plural(added.length, 'clave nueva', 'claves nuevas') : ''].filter(Boolean).join(', ');\n },\n expandAll: () => tree.expandAll(),\n collapseAll: () => tree.collapseAll(),\n reveal(path) {\n tree.reveal(path);\n tree.select(path);\n const meta = metas.get(path);\n if (meta) {\n foot.hidden = false;\n pathText.textContent = meta.path;\n }\n },\n filter(query) {\n if (searchInput) searchInput.value = query;\n tree.filter(query);\n },\n copy: (path = '$') => copyValue(path, path === '$' ? copyAll : (itemOf(path)?.querySelector<HTMLElement>(':scope > [data-mk-tree-row] [data-mk-jv-copy]') ?? null)),\n get data() {\n return data;\n },\n destroy: () => scope.dispose(),\n };\n}\n","/*\n * Windowing (virtual-list), the pure part: the top of each row from their\n * heights (one fixed height, or measured ones with an estimate for the rest),\n * the total height, and which rows a scroll position shows. The running sums\n * are filled lazily from the first changed row, and finding the row at a\n * position is a binary search over them (about 17 steps for 100 000 rows).\n */\n\nexport interface VirtualRange {\n /** First row drawn. */\n start: number;\n /** One past the last row drawn. */\n end: number;\n}\n\nexport interface VirtualSizes {\n readonly count: number;\n get(index: number): number;\n /** A row's height; true when it changed. */\n set(index: number, height: number): boolean;\n /** The top of a row (the sum of the heights before it). */\n offset(index: number): number;\n total(): number;\n /** The row at a vertical position (clamped to the list). */\n indexAt(y: number): number;\n /** The rows that cover y … y + height, with `overscan` more on each side. */\n range(y: number, height: number, overscan?: number): VirtualRange;\n}\n\nexport function createSizes(heights: number[]): VirtualSizes {\n const sizes = heights.map((height) => (Number.isFinite(height) && height > 0 ? height : 0));\n const count = sizes.length;\n const sums = new Float64Array(count + 1);\n // sums[0..valid] are right.\n let valid = 0;\n const ensure = (index: number) => {\n for (let i = valid; i < index; i++) sums[i + 1] = sums[i]! + sizes[i]!;\n if (index > valid) valid = index;\n };\n const indexAt = (y: number) => {\n if (!count) return 0;\n ensure(count);\n let low = 0;\n let high = count - 1;\n // The last row whose top is at or above y.\n while (low < high) {\n const middle = (low + high + 1) >> 1;\n if (sums[middle]! <= y) low = middle;\n else high = middle - 1;\n }\n return low;\n };\n return {\n count,\n get: (index) => sizes[index] ?? 0,\n set(index, height) {\n if (index < 0 || index >= count || !Number.isFinite(height) || height < 0 || sizes[index] === height) return false;\n sizes[index] = height;\n if (valid > index) valid = index;\n return true;\n },\n offset(index) {\n const at = Math.max(0, Math.min(count, index));\n ensure(at);\n return sums[at]!;\n },\n total() {\n ensure(count);\n return sums[count]!;\n },\n indexAt,\n range(y, height, overscan = 0) {\n if (!count) return { start: 0, end: 0 };\n const start = indexAt(Math.max(0, y));\n const last = indexAt(Math.max(0, y + Math.max(0, height) - 0.5));\n return { start: Math.max(0, start - overscan), end: Math.min(count, last + 1 + overscan) };\n },\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { requestFrame } from '../../core/frame';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { fromJson } from '../../core/dates';\nimport { createSizes, type VirtualRange } from '../../core/virtual';\nimport { blurIn } from '../../motion/micro';\n\n/*\n * Virtual list: thousands of rows with only those in view (and a few around\n * them) in the page. Rows are recycled as they scroll; their heights are one\n * fixed value or measured as they show (an estimate for the rest), and the\n * scroll stays put when a measured row above changes size. While scrolling, a\n * pill rides the right edge with the position (\"1 240 de 10 000\") and slips\n * away out of a blur when the scroll stops. scrollToIndex() glides there\n * (.6 s, signature; a long way jumps most of it first) and flashes the row.\n * Selectable lists are a listbox: a ring glides between rows with the\n * keyboard (↑ ↓, Re Pág / Av Pág, Inicio, Fin, typing jumps), and a chosen\n * row's check pops. onEndReached() brings more rows at the end (a loading row\n * meanwhile, \"No hay más elementos\" when it answers with none). The first rows\n * come in out of a blur; new data flows in softly.\n */\n\nexport type VirtualKey = string | number;\n\nexport interface VirtualListOptions<T = unknown> {\n items?: T[];\n /** Every row this tall (fastest); without it rows are measured. */\n itemHeight?: number;\n /** Height of a row not measured yet (default: itemHeight, else 48). */\n estimatedHeight?: number;\n /** Rows drawn beyond each edge (default 6). */\n overscan?: number;\n /** Draw a row into its element (recycled: draw all of it every time). Default: its text. */\n renderItem?: (item: T, index: number, element: HTMLElement) => void;\n /** A row's text: the default drawing, typing to jump and announcements (default: label, title, name or the value). */\n itemText?: (item: T) => string;\n /** A stable key for a row (default: its id, else its index). */\n getKey?: (item: T, index: number) => VirtualKey;\n /** Rows can be chosen: true or 'single', or 'multiple' (default false). */\n selectable?: boolean | 'single' | 'multiple';\n selected?: VirtualKey[];\n /** Accessible name (default 'Lista'). */\n label?: string;\n emptyLabel?: string;\n locale?: string;\n onSelect?: (keys: VirtualKey[], items: T[]) => void;\n /** Enter or a double click on a row. */\n onActivate?: (item: T, index: number) => void;\n /** More rows at the end: resolve with them, with [] when there are no more, or with nothing when you add them yourself (setItems). */\n onEndReached?: () => Promise<T[] | void> | T[] | void;\n /** Draw the rows yourself (frameworks): told which ones; put them in `container` as [data-mk-vl-item][data-index] and call refresh(). */\n onRange?: (range: VirtualRange) => void;\n}\n\nexport interface VirtualScrollOptions {\n align?: 'auto' | 'start' | 'center' | 'end';\n animate?: boolean;\n}\n\nexport interface VirtualListInstance<T = unknown> extends Instance {\n setItems(items: T[]): void;\n /** Add rows at the end. */\n append(items: T[]): void;\n scrollToIndex(index: number, options?: VirtualScrollOptions): void;\n /** Position and measure the drawn rows again (after drawing them yourself, or when their content changed). */\n refresh(): void;\n select(keys: VirtualKey[]): void;\n /** Change how rows are drawn (vanilla). */\n setRenderer(renderItem: (item: T, index: number, element: HTMLElement) => void): void;\n readonly items: T[];\n readonly range: VirtualRange;\n readonly selected: VirtualKey[];\n /** Where the rows live. */\n readonly container: HTMLElement;\n}\n\nconst FOOT_HEIGHT = 48;\nlet sequence = 0;\n\n/** label, title, name or text of an object; the value itself otherwise. */\nconst defaultText = (item: unknown): string => {\n if (item === null || item === undefined) return '';\n if (typeof item !== 'object') return String(item);\n const record = item as Record<string, unknown>;\n const text = record.label ?? record.title ?? record.name ?? record.text;\n return text === undefined ? JSON.stringify(item) : String(text);\n};\n\nexport function createVirtualList<T = unknown>(root: HTMLElement | null, options: VirtualListOptions<T> = {}): VirtualListInstance<T> {\n if (!root) {\n return inert({\n setItems() {}, append() {}, scrollToIndex() {}, refresh() {}, select() {}, setRenderer() {},\n items: [] as T[], range: { start: 0, end: 0 }, selected: [], container: null as unknown as HTMLElement,\n });\n }\n registerMotion();\n const scope = createScope();\n const uid = `mk-vl-${++sequence}`;\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n // A framework may render the viewport and the spacer itself (and the rows inside, see onRange).\n const adopted = root.querySelector<HTMLElement>(':scope > [data-mk-vl-viewport]');\n // Rows written as a list inside the root are its text rows.\n const authored = [...root.querySelectorAll(':scope > ul > li, :scope > ol > li')].map((li) => li.textContent?.trim() ?? '') as T[];\n // JSON text too (data-mk-items through autoInit).\n let items: T[] = [...(fromJson(options.items) ?? authored)];\n const fixed = options.itemHeight && options.itemHeight > 0 ? options.itemHeight : null;\n const estimate = options.estimatedHeight ?? fixed ?? 48;\n const overscan = Math.max(0, options.overscan ?? 6);\n let renderItem = options.renderItem;\n const external = Boolean(options.onRange) && !renderItem;\n const selectable = options.selectable === true ? 'single' : options.selectable || null;\n const keyOf = (item: T, index: number): VirtualKey => {\n if (options.getKey) return options.getKey(item, index);\n const id = item && typeof item === 'object' ? (item as { id?: unknown }).id : undefined;\n return typeof id === 'string' || typeof id === 'number' ? id : index;\n };\n const textOf = (item: T) => options.itemText?.(item) ?? defaultText(item);\n const measured = new Map<VirtualKey, number>();\n const heights = () => items.map((item, i) => fixed ?? measured.get(keyOf(item, i)) ?? estimate);\n let sizes = createSizes(heights());\n let selected = new Set<VirtualKey>(fromJson(options.selected) ?? []);\n let active = -1;\n let anchor = -1;\n let range: VirtualRange = { start: 0, end: 0 };\n let number: Intl.NumberFormat;\n try {\n number = new Intl.NumberFormat(locale);\n } catch {\n number = new Intl.NumberFormat();\n }\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n // ── The parts ────────────────────────────────────────────────────────────\n const holder = document.createElement('div');\n holder.hidden = true;\n holder.append(...[...root.childNodes].filter((node) => node !== adopted));\n const viewport = adopted ?? document.createElement('div');\n viewport.dataset.mkVlViewport = '';\n scope.attr(viewport, 'tabindex', '0');\n scope.attr(viewport, 'role', selectable ? 'listbox' : 'list');\n scope.attr(viewport, 'aria-label', options.label ?? 'Lista');\n if (selectable === 'multiple') scope.attr(viewport, 'aria-multiselectable', 'true');\n const spacer = viewport.querySelector<HTMLElement>(':scope > [data-mk-vl-spacer]') ?? document.createElement('div');\n spacer.dataset.mkVlSpacer = '';\n const spacerStyle = spacer.getAttribute('style');\n const cursor = document.createElement('span');\n cursor.dataset.mkVlCursor = '';\n cursor.setAttribute('aria-hidden', 'true');\n const foot = document.createElement('div');\n foot.dataset.mkVlFoot = '';\n foot.setAttribute('role', 'presentation');\n foot.hidden = true;\n spacer.prepend(cursor);\n spacer.append(foot);\n if (!spacer.parentElement) viewport.append(spacer);\n const empty = document.createElement('p');\n empty.dataset.mkVlEmpty = '';\n empty.textContent = options.emptyLabel ?? 'Sin elementos';\n const pill = document.createElement('div');\n pill.dataset.mkVlPill = '';\n pill.setAttribute('aria-hidden', 'true');\n pill.hidden = true;\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n if (!adopted) root.append(viewport);\n root.append(empty, pill, status);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n gsap.killTweensOf([viewport, cursor, pill]);\n for (const element of drawn.values()) element.remove();\n for (const part of [cursor, foot, empty, pill, status]) part.remove();\n // What the framework rendered stays; only what the engine put on it goes.\n if (adopted) {\n viewport.removeAttribute('aria-activedescendant');\n if (spacerStyle === null) spacer.removeAttribute('style');\n else spacer.setAttribute('style', spacerStyle);\n } else viewport.remove();\n root.append(...holder.childNodes);\n });\n scope.attr(root, 'data-mk-ready', '');\n\n // ── Drawing ──────────────────────────────────────────────────────────────\n const drawn = new Map<number, HTMLElement>();\n const pool: HTMLElement[] = [];\n const shows = new WeakMap<HTMLElement, T>();\n const observed = new WeakSet<HTMLElement>();\n let refill = false;\n let firstPaint = true;\n let tweening = false;\n let flashIndex = -1;\n\n const fill = (element: HTMLElement, item: T, index: number) => {\n element.replaceChildren();\n if (renderItem) renderItem(item, index, element);\n else element.textContent = textOf(item);\n };\n const rows = () => [...spacer.querySelectorAll<HTMLElement>(':scope > [data-mk-vl-item]')];\n\n let told: VirtualRange | null = null;\n /** Vanilla: recycle the elements of the rows that left for the rows that came. Frameworks: tell them which rows. */\n const draw = () => {\n if (external) {\n if (told?.start === range.start && told.end === range.end) return;\n told = { ...range };\n options.onRange?.({ ...range });\n return;\n }\n for (const [index, element] of drawn) {\n if (index >= range.start && index < range.end && index < items.length) continue;\n drawn.delete(index);\n element.remove();\n pool.push(element);\n }\n for (let index = range.start; index < range.end; index++) {\n const item = items[index]!;\n let element = drawn.get(index);\n if (!element) {\n element = pool.pop() ?? document.createElement('div');\n element.dataset.mkVlItem = '';\n drawn.set(index, element);\n spacer.append(element);\n }\n if (refill || element.dataset.index !== String(index) || shows.get(element) !== item) {\n element.dataset.index = String(index);\n shows.set(element, item);\n fill(element, item, index);\n }\n }\n refill = false;\n };\n\n let resizeObserver: ResizeObserver | null = null;\n /** Place the drawn rows, give them their roles and states, and measure them. */\n const paint = () => {\n let changed = false;\n for (const element of rows()) {\n const index = Number(element.dataset.index);\n if (!Number.isInteger(index) || index < 0 || index >= items.length) continue;\n const item = items[index]!;\n element.id = `${uid}-${index}`;\n element.setAttribute('role', selectable ? 'option' : 'listitem');\n element.setAttribute('aria-setsize', String(items.length));\n element.setAttribute('aria-posinset', String(index + 1));\n if (selectable) element.setAttribute('aria-selected', String(selected.has(keyOf(item, index))));\n element.toggleAttribute('data-mk-vl-active', index === active);\n if (index !== flashIndex) element.removeAttribute('data-mk-vl-flash');\n if (fixed) element.style.height = `${fixed}px`;\n else {\n if (resizeObserver && !observed.has(element)) {\n observed.add(element);\n resizeObserver.observe(element);\n }\n const height = element.getBoundingClientRect().height;\n if (height > 0 && sizes.set(index, height)) {\n measured.set(keyOf(item, index), height);\n changed = true;\n }\n }\n }\n // Placed with top: transforms stay free for the rows' own motion (entrances clear them).\n for (const element of rows()) {\n const index = Number(element.dataset.index);\n if (Number.isInteger(index) && index < items.length) element.style.top = `${sizes.offset(index)}px`;\n }\n return changed;\n };\n\n const viewHeight = () => viewport.clientHeight || estimate * 10;\n const layoutSpacer = () => {\n const total = sizes.total();\n spacer.style.height = `${total + (foot.hidden ? 0 : FOOT_HEIGHT)}px`;\n foot.style.top = `${total}px`;\n empty.hidden = items.length > 0 || !foot.hidden;\n };\n\n const update = (force = false) => {\n if (scope.disposed) return;\n // Measuring rows above the first one in view must not move what is in view.\n const top = viewport.scrollTop;\n const first = sizes.indexAt(top);\n const within = top - sizes.offset(first);\n const next = sizes.range(top, viewHeight(), overscan);\n if (force || next.start !== range.start || next.end !== range.end) {\n range = next;\n draw();\n }\n const changed = paint();\n layoutSpacer();\n if (changed) {\n if (!tweening && items.length && Math.abs(sizes.offset(first) + within - viewport.scrollTop) > 0.5) viewport.scrollTop = sizes.offset(first) + within;\n // Measured rows may change what is in view.\n const after = sizes.range(viewport.scrollTop, viewHeight(), overscan);\n if (after.start !== range.start || after.end !== range.end) {\n range = after;\n draw();\n paint();\n layoutSpacer();\n }\n }\n placeCursor(false);\n if (active >= 0) {\n const element = rows().find((row) => Number(row.dataset.index) === active);\n if (element) viewport.setAttribute('aria-activedescendant', element.id);\n else viewport.removeAttribute('aria-activedescendant');\n }\n if (firstPaint && rows().length) {\n firstPaint = false;\n if (!reduced()) keep(blurIn(rows().slice(0, 16), { from: 'rise', stagger: 0.025, duration: 0.4 }));\n }\n reachEnd();\n };\n let pending: (() => void) | null = null;\n const schedule = () => {\n if (pending) return;\n pending = requestFrame(() => {\n pending = null;\n update();\n });\n };\n scope.add(() => pending?.());\n\n if (typeof ResizeObserver === 'function') {\n resizeObserver = scope.observe(new ResizeObserver(() => schedule()));\n resizeObserver.observe(viewport);\n }\n\n // ── The position pill ────────────────────────────────────────────────────\n let pillTimer: ReturnType<typeof setTimeout> | undefined;\n const hidePill = () => {\n if (pill.hidden) return;\n if (reduced()) {\n pill.hidden = true;\n return;\n }\n keep(gsap.to(pill, { opacity: 0, x: 8, filter: 'blur(6px)', duration: 0.3, ease: 'power2.in', onComplete: () => void (pill.hidden = true) }));\n };\n const showPill = () => {\n if (items.length < 40 || viewport.scrollHeight <= viewport.clientHeight + 1) return;\n const first = Math.min(items.length - 1, sizes.indexAt(viewport.scrollTop + 1));\n pill.textContent = `${number.format(first + 1)} de ${number.format(items.length)}`;\n const wasHidden = pill.hidden;\n pill.hidden = false;\n const max = viewport.scrollHeight - viewport.clientHeight;\n const room = Math.max(0, viewport.clientHeight - pill.offsetHeight - 16);\n pill.style.top = `${viewport.offsetTop + 8 + (max > 0 ? viewport.scrollTop / max : 0) * room}px`;\n if (wasHidden && !reduced()) {\n gsap.killTweensOf(pill);\n keep(gsap.fromTo(pill, { opacity: 0, x: 8, filter: 'blur(6px)' }, { opacity: 1, x: 0, filter: 'blur(0px)', duration: 0.25, ease: 'power2.out', clearProps: 'filter' }));\n } else if (wasHidden) gsap.set(pill, { opacity: 1, x: 0 });\n else if (Number(gsap.getProperty(pill, 'opacity')) < 1) {\n gsap.killTweensOf(pill);\n gsap.set(pill, { opacity: 1, x: 0, filter: 'none' });\n }\n clearTimeout(pillTimer);\n pillTimer = setTimeout(hidePill, 900);\n };\n scope.add(() => clearTimeout(pillTimer));\n scope.on(viewport, 'scroll', () => {\n schedule();\n showPill();\n }, { passive: true });\n\n // ── Going to a row ───────────────────────────────────────────────────────\n const flash = (index: number) => {\n flashIndex = index;\n const element = rows().find((row) => Number(row.dataset.index) === index);\n if (!element) return;\n element.removeAttribute('data-mk-vl-flash');\n // Restart the highlight.\n void element.offsetWidth;\n element.setAttribute('data-mk-vl-flash', '');\n scope.timeout(() => {\n if (flashIndex === index) flashIndex = -1;\n element.removeAttribute('data-mk-vl-flash');\n }, 1300);\n };\n const targetTop = (index: number, align: VirtualScrollOptions['align']) => {\n const top = sizes.offset(index);\n const height = sizes.get(index);\n const view = viewport.clientHeight;\n const max = Math.max(0, sizes.total() + (foot.hidden ? 0 : FOOT_HEIGHT) - view);\n let target: number;\n if (align === 'start') target = top;\n else if (align === 'end') target = top + height - view;\n else if (align === 'center') target = top + height / 2 - view / 2;\n else if (top < viewport.scrollTop) target = top;\n else if (top + height > viewport.scrollTop + view) target = top + height - view;\n else target = viewport.scrollTop;\n return Math.max(0, Math.min(max, target));\n };\n const scrollToIndex = (index: number, { align = 'auto', animate = true }: VirtualScrollOptions = {}) => {\n if (!items.length || scope.disposed) return;\n const at = Math.max(0, Math.min(items.length - 1, Math.round(index)));\n gsap.killTweensOf(viewport);\n tweening = false;\n const target = targetTop(at, align);\n const distance = target - viewport.scrollTop;\n if (!animate || reduced() || Math.abs(distance) < 2) {\n viewport.scrollTop = target;\n update();\n flash(at);\n return;\n }\n // A long way: most of it at once, the last screens gliding.\n const screen = viewport.clientHeight || estimate * 10;\n if (Math.abs(distance) > screen * 3) {\n viewport.scrollTop = target - Math.sign(distance) * screen * 2;\n update();\n }\n tweening = true;\n keep(\n gsap.to(viewport, {\n scrollTop: target,\n duration: 0.6,\n ease: EASE.signature,\n onComplete: () => {\n tweening = false;\n // Rows measured on the way may have moved it.\n const settled = targetTop(at, align);\n if (Math.abs(settled - viewport.scrollTop) > 1) viewport.scrollTop = settled;\n update();\n flash(at);\n },\n }),\n );\n };\n\n // ── Choosing ─────────────────────────────────────────────────────────────\n const placeCursor = (animate: boolean) => {\n if (!selectable || active < 0 || active >= items.length) {\n cursor.style.opacity = '0';\n return;\n }\n const target = { y: sizes.offset(active), height: sizes.get(active) };\n cursor.style.opacity = '';\n if (animate && !reduced()) {\n keep(gsap.to(cursor, { ...target, duration: 0.25, ease: EASE.swatch, overwrite: 'auto' }));\n return;\n }\n // A glide on its way ends where it should.\n if (gsap.isTweening(cursor)) return;\n gsap.set(cursor, target);\n };\n const announce = () => {\n const keys = [...selected];\n const chosen = items.filter((item, i) => selected.has(keyOf(item, i)));\n options.onSelect?.(keys, chosen);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { keys, items: chosen } }));\n };\n const choose = (index: number, mode: 'only' | 'toggle' | 'range') => {\n if (!selectable || index < 0 || index >= items.length) return;\n const key = keyOf(items[index]!, index);\n const before = selected.has(key);\n const previous = selected;\n if (selectable === 'single' || mode === 'only') selected = new Set([key]);\n else if (mode === 'toggle') {\n selected = new Set(selected);\n if (before) selected.delete(key);\n else selected.add(key);\n } else {\n const from = anchor < 0 ? index : anchor;\n selected = new Set(selected);\n for (let i = Math.min(from, index); i <= Math.max(from, index); i++) selected.add(keyOf(items[i]!, i));\n }\n if (mode !== 'range') anchor = index;\n paint();\n const element = rows().find((row) => Number(row.dataset.index) === index);\n // The check pops on the row that was just chosen.\n if (element && selected.has(key) && !before) {\n element.removeAttribute('data-mk-vl-just');\n void element.offsetWidth;\n element.setAttribute('data-mk-vl-just', '');\n scope.timeout(() => element.removeAttribute('data-mk-vl-just'), 500);\n }\n status.textContent = `${textOf(items[index]!)} ${selected.has(key) ? 'seleccionado' : 'sin seleccionar'}`;\n if (previous.size !== selected.size || [...selected].some((each) => !previous.has(each))) announce();\n };\n const setActive = (index: number, animate: boolean) => {\n if (!items.length) return;\n const at = Math.max(0, Math.min(items.length - 1, index));\n const far = active < 0 || Math.abs(at - active) > 1;\n active = at;\n // The ring lives among the rows, so scrolling does not move it: it can glide first.\n placeCursor(animate && !far);\n // Keep it in view (no glide: the keyboard repeats fast).\n const target = targetTop(at, 'auto');\n if (Math.abs(target - viewport.scrollTop) > 0.5) viewport.scrollTop = target;\n update();\n };\n\n scope.on(viewport, 'click', (event) => {\n const mouse = event as MouseEvent;\n const element = (mouse.target as Element | null)?.closest<HTMLElement>('[data-mk-vl-item]');\n if (!element || !spacer.contains(element) || !selectable) return;\n const index = Number(element.dataset.index);\n active = index;\n placeCursor(true);\n if (selectable === 'multiple' && mouse.shiftKey) choose(index, 'range');\n else choose(index, selectable === 'multiple' ? 'toggle' : 'only');\n update();\n });\n scope.on(viewport, 'dblclick', (event) => {\n const element = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-vl-item]');\n if (!element || !spacer.contains(element)) return;\n const index = Number(element.dataset.index);\n options.onActivate?.(items[index]!, index);\n });\n\n let typed = '';\n let typedAt = 0;\n scope.on(viewport, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if (!selectable || !items.length || key.altKey || key.ctrlKey || key.metaKey) return;\n const page = Math.max(1, Math.floor(viewHeight() / estimate) - 1);\n const from = active < 0 ? Math.min(items.length - 1, sizes.indexAt(viewport.scrollTop + 1)) : active;\n let next: number | null = null;\n switch (key.key) {\n case 'ArrowDown':\n next = active < 0 ? from : from + 1;\n break;\n case 'ArrowUp':\n next = active < 0 ? from : from - 1;\n break;\n case 'PageDown':\n next = from + page;\n break;\n case 'PageUp':\n next = from - page;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = items.length - 1;\n break;\n case 'Enter':\n if (active < 0) return;\n key.preventDefault();\n choose(active, selectable === 'multiple' ? 'toggle' : 'only');\n options.onActivate?.(items[active]!, active);\n return;\n case ' ':\n if (active < 0) return;\n key.preventDefault();\n choose(active, selectable === 'multiple' ? 'toggle' : 'only');\n return;\n }\n if (next !== null) {\n key.preventDefault();\n setActive(next, true);\n if (key.shiftKey && selectable === 'multiple') choose(active, 'range');\n return;\n }\n // Typing jumps to the next row that starts with what was typed.\n if (key.key.length === 1 && /\\S/.test(key.key)) {\n const now = Date.now();\n typed = now - typedAt > 600 ? key.key.toLowerCase() : typed + key.key.toLowerCase();\n typedAt = now;\n const start = Math.max(0, active) + (typed.length === 1 ? 1 : 0);\n for (let step = 0; step < items.length; step++) {\n const index = (start + step) % items.length;\n if (textOf(items[index]!).toLowerCase().startsWith(typed)) {\n setActive(index, false);\n break;\n }\n }\n }\n });\n\n // ── More at the end ──────────────────────────────────────────────────────\n let loadingMore = false;\n let finished = false;\n const append = (more: T[]) => {\n if (!more.length) return;\n const before = items.length;\n items = [...items, ...more];\n sizes = createSizes(heights());\n update(true);\n if (!reduced()) keep(blurIn(rows().filter((row) => Number(row.dataset.index) >= before), { from: 'rise', stagger: 0.03, duration: 0.4 }));\n };\n const reachEnd = () => {\n if (!options.onEndReached || loadingMore || finished || range.end < items.length - Math.max(2, overscan)) return;\n loadingMore = true;\n foot.hidden = false;\n foot.removeAttribute('data-mk-vl-end');\n foot.setAttribute('aria-busy', 'true');\n foot.textContent = 'Cargando…';\n layoutSpacer();\n Promise.resolve()\n .then(() => options.onEndReached!())\n .then((more) => {\n if (scope.disposed) return;\n loadingMore = false;\n foot.removeAttribute('aria-busy');\n // The app added them itself (setItems).\n if (!more) {\n foot.hidden = true;\n layoutSpacer();\n return;\n }\n if (!more.length) {\n finished = true;\n foot.setAttribute('data-mk-vl-end', '');\n foot.textContent = items.length ? 'No hay más elementos' : '';\n foot.hidden = !items.length;\n status.textContent = 'No hay más elementos';\n layoutSpacer();\n return;\n }\n foot.hidden = true;\n status.textContent = `${number.format(more.length)} más`;\n append(more);\n })\n .catch(() => {\n if (scope.disposed) return;\n loadingMore = false;\n finished = true;\n foot.removeAttribute('aria-busy');\n foot.textContent = 'No se pudo cargar';\n });\n };\n\n update(true);\n\n return {\n setItems(next) {\n if (scope.disposed) return;\n const changed = next !== items;\n items = [...next];\n sizes = createSizes(heights());\n if (active >= items.length) active = items.length - 1;\n finished = false;\n if (!loadingMore) foot.hidden = true;\n refill = true;\n update(true);\n if (changed && !reduced()) keep(blurIn(rows().slice(0, 12), { from: 'soft', stagger: 0.015, duration: 0.3 }));\n },\n append(more) {\n if (!scope.disposed) append(more);\n },\n scrollToIndex,\n refresh() {\n if (scope.disposed) return;\n refill = true;\n update(!external);\n },\n select(keys) {\n selected = new Set(keys);\n paint();\n },\n setRenderer(next) {\n renderItem = next;\n refill = true;\n update(true);\n },\n get items() {\n return [...items];\n },\n get range() {\n return { ...range };\n },\n get selected() {\n return [...selected];\n },\n container: spacer,\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { fromJson } from '../../core/dates';\nimport { requestFrame } from '../../core/frame';\n\n/*\n * Resizable panels: panels side by side (or stacked) with a separator between\n * each pair that drags (mouse, pen, touch) and moves with the keyboard (the\n * WAI-ARIA window splitter). A separator is a hairline with a grip that grows\n * in the accent on hover and while dragging, and a bubble shows the two sizes\n * (\"32 % · 68 %\") while it moves. Past a panel's limit the drag gives a quarter\n * of the way (rubber band) and springs back on release (.45 s, swing). A\n * collapsible panel dragged well under its minimum snaps shut (.3 s, swing)\n * and opens again when dragged back out, with Enter on its separator, or with\n * the separator's buttons (handleButtons). A double click on a separator puts\n * the first sizes back (.45 s, signature). Sizes can be remembered.\n */\n\nexport type PanelOrientation = 'horizontal' | 'vertical';\n\nexport interface ResizablePanelOptions {\n /** 'horizontal' (default): side by side; 'vertical': stacked. */\n orientation?: PanelOrientation;\n /** Sizes in percent, one per panel (default: data-size on the panels, else equal). */\n sizes?: number[];\n /** Smallest size of a panel in percent (default 10; data-min on a panel wins). */\n min?: number;\n /** Largest size of a panel in percent (default 100; data-max on a panel wins). */\n max?: number;\n /** Panels (indexes) that snap shut when dragged well under their minimum; data-collapsible on a panel too. */\n collapsible?: number[];\n /** Panels that start shut. */\n collapsed?: number[];\n /** Arrow keys move this many percent (default 5; Shift: four times). */\n step?: number;\n /** Remember sizes in localStorage under this key. */\n storageKey?: string;\n /** Buttons on each separator to shut and open the panels beside it. */\n handleButtons?: boolean;\n /** Names of the panels, for the separators' labels (default: data-label, else \"panel 1\"…). */\n labels?: string[];\n /** While it moves (once a frame). */\n onResize?: (sizes: number[]) => void;\n /** When a drag, a key or an animation ends. */\n onResizeEnd?: (sizes: number[]) => void;\n onCollapse?: (index: number, collapsed: boolean) => void;\n}\n\nexport interface ResizablePanelInstance extends Instance {\n setSizes(sizes: number[], animate?: boolean): void;\n collapse(index: number): void;\n expand(index: number): void;\n toggle(index: number): void;\n /** The first sizes again. */\n reset(): void;\n setOrientation(orientation: PanelOrientation): void;\n readonly sizes: number[];\n readonly collapsed: number[];\n readonly orientation: PanelOrientation;\n}\n\nconst CHEVRON = (path: string) => `<svg aria-hidden=\"true\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"${path}\"/></svg>`;\nconst ARROWS = { left: CHEVRON('M15 6l-6 6 6 6'), right: CHEVRON('M9 6l6 6-6 6'), up: CHEVRON('M6 15l6-6 6 6'), down: CHEVRON('M6 9l6 6 6-6') };\nlet sequence = 0;\n\nconst round = (n: number) => Math.round(n * 10) / 10;\n\n/** Sizes that add up to 100: missing ones share what is left, then all scale to 100 (all missing: equal). */\nexport function normaliseSizes(sizes: Array<number | undefined>, count: number): number[] {\n const given = Array.from({ length: count }, (_, i) => {\n const size = sizes[i];\n return typeof size === 'number' && Number.isFinite(size) && size >= 0 ? size : null;\n });\n const known = given.reduce<number>((sum, size) => sum + (size ?? 0), 0);\n const missing = given.filter((size) => size === null).length;\n const share = missing ? Math.max(0, 100 - known) / missing : 0;\n const list = given.map((size) => size ?? share);\n const total = list.reduce((sum, size) => sum + size, 0);\n if (!total) return Array.from({ length: count }, () => 100 / count);\n return list.map((size) => (size / total) * 100);\n}\n\nexport function createResizablePanel(root: HTMLElement | null, options: ResizablePanelOptions = {}): ResizablePanelInstance {\n if (!root) {\n return inert({ setSizes() {}, collapse() {}, expand() {}, toggle() {}, reset() {}, setOrientation() {}, sizes: [], collapsed: [], orientation: 'horizontal' as PanelOrientation });\n }\n registerMotion();\n const scope = createScope();\n const uid = `mk-rp-${++sequence}`;\n const panels = [...root.children].filter((child): child is HTMLElement => child instanceof HTMLElement && !child.hasAttribute('data-mk-resize-handle'));\n const count = panels.length;\n let orientation: PanelOrientation = options.orientation === 'vertical' ? 'vertical' : 'horizontal';\n const step = options.step && options.step > 0 ? options.step : 5;\n const number = (value: string | undefined) => (value !== undefined && value !== '' && Number.isFinite(Number(value)) ? Number(value) : undefined);\n const mins = panels.map((panel) => Math.max(0, number(panel.dataset.min) ?? options.min ?? 10));\n const maxs = panels.map((panel) => Math.min(100, number(panel.dataset.max) ?? options.max ?? 100));\n const collapsibleList = fromJson(options.collapsible) ?? [];\n const canCollapse = panels.map((panel, i) => panel.hasAttribute('data-collapsible') || collapsibleList.includes(i));\n const names = panels.map((panel, i) => options.labels?.[i] ?? panel.dataset.label ?? panel.getAttribute('aria-label') ?? `panel ${i + 1}`);\n const initial = normaliseSizes(fromJson(options.sizes) ?? panels.map((panel) => number(panel.dataset.size)), count);\n let sizes = [...initial];\n const collapsed = new Set<number>((fromJson(options.collapsed) ?? []).filter((i) => canCollapse[i]));\n /** What a panel had before it shut, to open back to. */\n const before = new Map<number, number>();\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n // Remembered sizes win over the given ones.\n const storage = (() => {\n try {\n return options.storageKey ? window.localStorage : null;\n } catch {\n return null;\n }\n })();\n if (storage && options.storageKey) {\n try {\n const saved = JSON.parse(storage.getItem(options.storageKey) ?? 'null') as { sizes?: number[]; collapsed?: number[] } | null;\n if (saved?.sizes?.length === count) {\n sizes = normaliseSizes(saved.sizes, count);\n collapsed.clear();\n for (const i of saved.collapsed ?? []) if (canCollapse[i]) collapsed.add(i);\n }\n } catch {\n // Unreadable: the given sizes stand.\n }\n }\n // A shut panel gives its room to its neighbour; it opens back to what it had.\n for (const i of collapsed) {\n if (sizes[i]! > 0) {\n before.set(i, sizes[i]!);\n const neighbour = i + 1 < count ? i + 1 : i - 1;\n if (neighbour >= 0) sizes[neighbour]! += sizes[i]!;\n sizes[i] = 0;\n }\n }\n\n // ── The parts ────────────────────────────────────────────────────────────\n scope.attr(root, 'data-mk-ready', '');\n scope.attr(root, 'data-mk-orientation', orientation);\n panels.forEach((panel, i) => {\n scope.attr(panel, 'data-mk-panel', '');\n if (!panel.id) scope.attr(panel, 'id', `${uid}-panel-${i}`);\n scope.attr(panel, 'style', panel.getAttribute('style'));\n });\n const bubble = document.createElement('span');\n bubble.dataset.mkResizeBubble = '';\n bubble.setAttribute('aria-hidden', 'true');\n bubble.hidden = true;\n const handles = panels.slice(0, -1).map((panel, i) => {\n const handle = document.createElement('div');\n handle.dataset.mkResizeHandle = '';\n handle.dataset.index = String(i);\n handle.setAttribute('role', 'separator');\n handle.tabIndex = 0;\n handle.setAttribute('aria-controls', panel.id);\n handle.setAttribute('aria-label', `Redimensionar ${names[i]} y ${names[i + 1]}`);\n const grip = document.createElement('span');\n grip.dataset.mkResizeGrip = '';\n grip.setAttribute('aria-hidden', 'true');\n handle.append(grip);\n if (options.handleButtons) {\n for (const [side, target] of [['start', i], ['end', i + 1]] as const) {\n if (!canCollapse[target]) continue;\n const button = document.createElement('button');\n button.type = 'button';\n button.tabIndex = -1;\n button.dataset.mkResizeButton = side;\n handle.append(button);\n }\n }\n panel.after(handle);\n return handle;\n });\n root.append(bubble);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n for (const handle of handles) handle.remove();\n bubble.remove();\n for (const panel of panels) panel.removeAttribute('data-mk-collapsed');\n });\n\n // ── Drawing the sizes ────────────────────────────────────────────────────\n const horizontal = () => orientation === 'horizontal';\n const apply = (next: number[]) => {\n panels.forEach((panel, i) => {\n const size = Math.max(0, next[i]!);\n panel.style.flex = `${round(size * 100) / 100} 1 0px`;\n panel.toggleAttribute('data-mk-collapsed', collapsed.has(i) && size < 0.5);\n });\n handles.forEach((handle, i) => {\n // A separator pushed to an edge by a shut panel keeps its buttons inside.\n const edge = i === count - 2 && collapsed.has(i + 1) && next[i + 1]! < 0.5 ? 'end' : i === 0 && collapsed.has(0) && next[0]! < 0.5 ? 'start' : null;\n if (edge) handle.dataset.edge = edge;\n else delete handle.dataset.edge;\n handle.setAttribute('aria-valuenow', String(Math.round(Math.max(0, next[i]!))));\n handle.setAttribute('aria-valuemin', String(canCollapse[i] ? 0 : Math.round(mins[i]!)));\n handle.setAttribute('aria-valuemax', String(Math.round(Math.min(maxs[i]!, 100 - (canCollapse[i + 1] ? 0 : mins[i + 1]!)))));\n handle.setAttribute('aria-valuetext', `${Math.round(Math.max(0, next[i]!))} %${collapsed.has(i) ? ', cerrado' : ''}`);\n for (const button of handle.querySelectorAll<HTMLButtonElement>('[data-mk-resize-button]')) {\n const start = button.dataset.mkResizeButton === 'start';\n const index = start ? i : i + 1;\n const shut = collapsed.has(index);\n // The arrow points where the panel goes: toward its edge to shut it, away to open it.\n button.innerHTML = horizontal() ? (start === !shut ? ARROWS.left : ARROWS.right) : start === !shut ? ARROWS.up : ARROWS.down;\n const label = `${shut ? 'Abrir' : 'Cerrar'} ${names[index]}`;\n button.setAttribute('aria-label', label);\n button.title = label;\n }\n });\n };\n const paintOrientation = () => {\n root.setAttribute('data-mk-orientation', orientation);\n for (const handle of handles) handle.setAttribute('aria-orientation', horizontal() ? 'vertical' : 'horizontal');\n };\n paintOrientation();\n apply(sizes);\n\n const save = () => {\n if (!storage || !options.storageKey) return;\n try {\n storage.setItem(options.storageKey, JSON.stringify({ sizes: sizes.map(round), collapsed: [...collapsed] }));\n } catch {\n // Full or blocked: not remembered.\n }\n };\n let pendingNotify: (() => void) | null = null;\n const notify = () => {\n if (pendingNotify || !options.onResize) return;\n pendingNotify = requestFrame(() => {\n pendingNotify = null;\n options.onResize?.(sizes.map(round));\n });\n };\n scope.add(() => pendingNotify?.());\n const settle = () => {\n save();\n options.onResizeEnd?.(sizes.map(round));\n root.dispatchEvent(new CustomEvent('mk:resize', { bubbles: true, detail: { sizes: sizes.map(round) } }));\n };\n\n let tween: gsap.core.Tween | null = null;\n /** Glide to `target` (a spring by default). */\n const animateTo = (target: number[], { duration = 0.45, ease = EASE.signature, done }: { duration?: number; ease?: string; done?: () => void } = {}) => {\n tween?.kill();\n if (reduced()) {\n sizes = target;\n apply(sizes);\n done?.();\n return;\n }\n const from = [...sizes];\n const progress = { t: 0 };\n tween = gsap.to(progress, {\n t: 1,\n duration,\n ease,\n onUpdate: () => {\n sizes = from.map((size, i) => Math.max(0, size + (target[i]! - size) * progress.t));\n apply(sizes);\n notify();\n },\n onComplete: () => {\n sizes = [...target];\n apply(sizes);\n tween = null;\n done?.();\n },\n });\n keep(tween);\n };\n\n // ── Limits ───────────────────────────────────────────────────────────────\n const lowest = (i: number) => (collapsed.has(i) ? 0 : mins[i]!);\n /** How far the separator `i` may move (in percent) from `start` sizes: [most negative, most positive]. */\n const room = (i: number, start: number[]) => {\n const a = start[i]!;\n const b = start[i + 1]!;\n const down = Math.max(lowest(i) - a, b - maxs[i + 1]!);\n const up = Math.min(maxs[i]! - a, b - lowest(i + 1));\n return [Math.min(0, down), Math.max(0, up)] as const;\n };\n\n const setCollapsed = (index: number, shut: boolean, animate = true) => {\n if (!canCollapse[index] || collapsed.has(index) === shut) return;\n // The neighbour that gives or takes the room: the next panel, or the one before the last.\n const neighbour = index + 1 < count ? index + 1 : index - 1;\n const target = [...sizes];\n if (shut) {\n before.set(index, sizes[index]! > 0.5 ? sizes[index]! : before.get(index) ?? initial[index]!);\n target[neighbour] = sizes[neighbour]! + sizes[index]!;\n target[index] = 0;\n collapsed.add(index);\n } else {\n collapsed.delete(index);\n const wanted = Math.max(mins[index]!, before.get(index) ?? initial[index]!);\n const give = Math.min(wanted, Math.max(0, sizes[neighbour]! - mins[neighbour]!));\n target[index] = give;\n target[neighbour] = sizes[neighbour]! - give;\n }\n const finish = () => {\n settle();\n options.onCollapse?.(index, shut);\n root.dispatchEvent(new CustomEvent('mk:collapse', { bubbles: true, detail: { index, collapsed: shut } }));\n };\n status.textContent = `${names[index]} ${shut ? 'cerrado' : 'abierto'}`;\n if (animate) animateTo(target, { duration: 0.3, ease: EASE.swatch, done: finish });\n else {\n sizes = target;\n apply(sizes);\n finish();\n }\n };\n\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n root.append(status);\n scope.add(() => status.remove());\n\n // ── Dragging ─────────────────────────────────────────────────────────────\n interface Drag {\n index: number;\n pointerId: number;\n start: number[];\n origin: number;\n /** Pixels the panels share (the root without its separators). */\n space: number;\n moved: boolean;\n }\n let drag: Drag | null = null;\n const spaceOf = () => {\n const box = root.getBoundingClientRect();\n const handlesSize = handles.reduce((sum, handle) => sum + (horizontal() ? handle.offsetWidth : handle.offsetHeight), 0);\n return Math.max(1, (horizontal() ? box.width : box.height) - handlesSize);\n };\n const showBubble = (i: number, at: number) => {\n bubble.hidden = false;\n bubble.textContent = `${Math.round(sizes[i]!)} % · ${Math.round(sizes[i + 1]!)} %`;\n const handle = handles[i]!;\n const box = handle.getBoundingClientRect();\n const rootBox = root.getBoundingClientRect();\n if (horizontal()) {\n bubble.style.left = `${box.left - rootBox.left + box.width / 2}px`;\n bubble.style.top = `${Math.max(16, Math.min(rootBox.height - 16, at - rootBox.top))}px`;\n } else {\n bubble.style.top = `${box.top - rootBox.top + box.height / 2}px`;\n bubble.style.left = `${Math.max(40, Math.min(rootBox.width - 40, at - rootBox.left))}px`;\n }\n };\n const hideBubble = () => {\n if (bubble.hidden) return;\n if (reduced()) {\n bubble.hidden = true;\n return;\n }\n // Opacity only: the bubble is centred with CSS translate, which transforms would reset.\n keep(gsap.to(bubble, { opacity: 0, duration: 0.18, ease: 'power1.in', onComplete: () => {\n bubble.hidden = true;\n gsap.set(bubble, { clearProps: 'opacity' });\n } }));\n };\n\n const move = (event: PointerEvent) => {\n if (!drag || event.pointerId !== drag.pointerId) return;\n event.preventDefault();\n const i = drag.index;\n const position = horizontal() ? event.clientX : event.clientY;\n const wanted = ((position - drag.origin) / drag.space) * 100;\n if (!drag.moved && Math.abs(wanted) > 0.2) {\n drag.moved = true;\n handles[i]!.setAttribute('data-mk-dragging', '');\n if (!reduced()) keep(gsap.fromTo(bubble, { opacity: 0 }, { opacity: 1, duration: 0.2, ease: 'power1.out', clearProps: 'opacity' }));\n }\n // A collapsible panel dragged well under its minimum snaps shut; dragged back out, it opens.\n for (const [index, sign] of [[i, 1], [i + 1, -1]] as const) {\n if (!canCollapse[index]) continue;\n const size = drag.start[index]! + sign * wanted;\n const threshold = mins[index]! / 2;\n if (!collapsed.has(index) && size < threshold) {\n collapsed.add(index);\n before.set(index, drag.start[index]! > 0.5 ? drag.start[index]! : before.get(index) ?? initial[index]!);\n const target = [...drag.start];\n target[index] = 0;\n target[index === i ? i + 1 : i] = drag.start[i]! + drag.start[i + 1]!;\n // If the drag is over when it lands, it settles then.\n animateTo(target, { duration: 0.3, ease: EASE.swatch, done: () => (drag ? undefined : settle()) });\n status.textContent = `${names[index]} cerrado`;\n options.onCollapse?.(index, true);\n return;\n }\n if (collapsed.has(index)) {\n // Still shut while the pointer stays near it.\n if (size <= threshold) return;\n collapsed.delete(index);\n status.textContent = `${names[index]} abierto`;\n options.onCollapse?.(index, false);\n }\n }\n if (tween) return;\n const [down, up] = room(i, drag.start);\n // Past a limit the panel gives a quarter of the way (rubber band).\n const delta = wanted < down ? down + (wanted - down) / 4 : wanted > up ? up + (wanted - up) / 4 : wanted;\n const next = [...drag.start];\n next[i] = Math.max(0, drag.start[i]! + delta);\n next[i + 1] = Math.max(0, drag.start[i + 1]! - delta);\n sizes = next;\n apply(sizes);\n showBubble(i, horizontal() ? event.clientY : event.clientX);\n notify();\n };\n const end = (event: PointerEvent) => {\n if (!drag || event.pointerId !== drag.pointerId) return;\n const { index } = drag;\n const moved = drag.moved;\n drag = null;\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', end);\n window.removeEventListener('pointercancel', end);\n handles[index]!.removeAttribute('data-mk-dragging');\n root.removeAttribute('data-mk-resizing');\n hideBubble();\n // A snap on its way settles when it lands.\n if (!moved || tween) return;\n // Back inside the limits with a spring, if the drag went past them.\n const clamped = [...sizes];\n for (const i of [index, index + 1]) {\n if (collapsed.has(i)) continue;\n const fixed = Math.min(maxs[i]!, Math.max(mins[i]!, clamped[i]!));\n const other = i === index ? index + 1 : index;\n clamped[other] = clamped[other]! + clamped[i]! - fixed;\n clamped[i] = fixed;\n }\n if (clamped.some((size, i) => Math.abs(size - sizes[i]!) > 0.05)) animateTo(clamped, { duration: 0.45, ease: EASE.swatch, done: settle });\n else settle();\n // The grip settles with a little pop.\n const grip = handles[index]!.querySelector('[data-mk-resize-grip]');\n if (grip && !reduced()) keep(gsap.fromTo(grip, { scale: 1.25 }, { scale: 1, duration: 0.4, ease: EASE.pop, clearProps: 'transform' }));\n };\n scope.add(() => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', end);\n window.removeEventListener('pointercancel', end);\n });\n\n handles.forEach((handle, i) => {\n scope.on(handle, 'pointerdown', (event) => {\n const pointer = event as PointerEvent;\n if (pointer.button !== 0 || (pointer.target as Element).closest('[data-mk-resize-button]')) return;\n pointer.preventDefault();\n handle.focus({ preventScroll: true });\n tween?.kill();\n tween = null;\n drag = { index: i, pointerId: pointer.pointerId, start: [...sizes], origin: horizontal() ? pointer.clientX : pointer.clientY, space: spaceOf(), moved: false };\n root.setAttribute('data-mk-resizing', '');\n window.addEventListener('pointermove', move, { passive: false });\n window.addEventListener('pointerup', end);\n window.addEventListener('pointercancel', end);\n });\n scope.on(handle, 'dblclick', (event) => {\n if ((event.target as Element).closest('[data-mk-resize-button]')) return;\n collapsed.clear();\n status.textContent = 'Tamaños iniciales';\n animateTo([...initial], { done: settle });\n });\n scope.on(handle, 'click', (event) => {\n const button = (event.target as Element).closest<HTMLElement>('[data-mk-resize-button]');\n if (!button) return;\n const index = button.dataset.mkResizeButton === 'start' ? i : i + 1;\n setCollapsed(index, !collapsed.has(index));\n });\n scope.on(handle, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const less = horizontal() ? 'ArrowLeft' : 'ArrowUp';\n const more = horizontal() ? 'ArrowRight' : 'ArrowDown';\n let delta: number | null = null;\n const [down, up] = room(i, sizes);\n if (key.key === less) delta = -step * (key.shiftKey ? 4 : 1);\n else if (key.key === more) delta = step * (key.shiftKey ? 4 : 1);\n else if (key.key === 'Home') delta = down;\n else if (key.key === 'End') delta = up;\n else if (key.key === 'Enter') {\n key.preventDefault();\n // The panel before it shuts or opens (or the one after, when only that one can).\n const index = canCollapse[i] ? i : canCollapse[i + 1] ? i + 1 : -1;\n if (index >= 0) setCollapsed(index, !collapsed.has(index));\n return;\n }\n if (delta === null) return;\n key.preventDefault();\n const moveBy = Math.max(down, Math.min(up, delta));\n if (Math.abs(moveBy) < 0.01) {\n // At the limit: a nudge says so.\n if (!reduced()) keep(gsap.fromTo(handle.querySelector('[data-mk-resize-grip]'), { [horizontal() ? 'x' : 'y']: Math.sign(delta) * 3 }, { [horizontal() ? 'x' : 'y']: 0, duration: 0.4, ease: EASE.pop, clearProps: 'transform' }));\n return;\n }\n const target = [...sizes];\n target[i] = sizes[i]! + moveBy;\n target[i + 1] = sizes[i + 1]! - moveBy;\n animateTo(target, { duration: 0.2, ease: 'power2.out', done: settle });\n });\n });\n\n return {\n setSizes(next, animate = true) {\n if (scope.disposed) return;\n const target = normaliseSizes(next, count);\n collapsed.clear();\n target.forEach((size, i) => {\n if (size < 0.5 && canCollapse[i]) collapsed.add(i);\n });\n if (animate) animateTo(target, { done: settle });\n else {\n tween?.kill();\n sizes = target;\n apply(sizes);\n }\n },\n collapse: (index) => setCollapsed(index, true),\n expand: (index) => setCollapsed(index, false),\n toggle: (index) => setCollapsed(index, !collapsed.has(index)),\n reset() {\n collapsed.clear();\n animateTo([...initial], { done: settle });\n },\n setOrientation(next) {\n if (next === orientation || scope.disposed) return;\n orientation = next;\n paintOrientation();\n apply(sizes);\n },\n get sizes() {\n return sizes.map(round);\n },\n get collapsed() {\n return [...collapsed];\n },\n get orientation() {\n return orientation;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { registerMotion } from '../../core/gsap';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { createResizablePanel, type PanelOrientation } from '../resizable-panel/engine';\n\n/*\n * Split view: two areas side by side (or one over the other) with\n * resizable-panel's separator between them: it drags with a rubber band at the\n * limits, keys, snaps a side shut when dragged well past its minimum, and a\n * double click centres it back. Its buttons shut either side and open it\n * again (.3 s, swing). setRatio() glides to a split (.45 s, signature). Under\n * `stackBelow` pixels of width the areas stack, the separator turning with\n * them. The split can be remembered (storageKey).\n */\n\nexport type SplitSide = 'start' | 'end';\n\nexport interface SplitViewOptions {\n /** 'horizontal' (default): side by side; 'vertical': one over the other. */\n orientation?: PanelOrientation;\n /** The first area's share, 0–1 (default .5). */\n ratio?: number;\n /** Smallest share of an area in percent (default 15). */\n min?: number;\n /** Which sides can shut: true (default) both, 'start', 'end' or false. */\n collapsible?: boolean | SplitSide;\n /** Stack the areas when the view is narrower than this many pixels (default 0: never). */\n stackBelow?: number;\n storageKey?: string;\n /** Names of the two areas (default 'Primera área', 'Segunda área'; or their data-label). */\n labels?: [string, string];\n /** After a change of the split ends. */\n onChange?: (ratio: number) => void;\n onCollapse?: (side: SplitSide | null) => void;\n}\n\nexport interface SplitViewInstance extends Instance {\n setRatio(ratio: number, animate?: boolean): void;\n collapse(side: SplitSide): void;\n /** Open the side that is shut. */\n expand(): void;\n toggle(side: SplitSide): void;\n readonly ratio: number;\n readonly collapsed: SplitSide | null;\n readonly orientation: PanelOrientation;\n}\n\nexport function createSplitView(root: HTMLElement | null, options: SplitViewOptions = {}): SplitViewInstance {\n const areas = root ? [...root.children].filter((child): child is HTMLElement => child instanceof HTMLElement) : [];\n if (!root || areas.length !== 2) {\n return inert({ setRatio() {}, collapse() {}, expand() {}, toggle() {}, ratio: 0.5, collapsed: null, orientation: 'horizontal' as PanelOrientation });\n }\n registerMotion();\n const scope = createScope();\n const ratio = Math.min(1, Math.max(0, Number.isFinite(options.ratio) ? options.ratio! : 0.5));\n const sides = options.collapsible === false ? [] : options.collapsible === 'start' ? [0] : options.collapsible === 'end' ? [1] : [0, 1];\n const preferred: PanelOrientation = options.orientation === 'vertical' ? 'vertical' : 'horizontal';\n const sideOf = (index: number): SplitSide => (index === 0 ? 'start' : 'end');\n scope.attr(root, 'data-mk-split', '');\n const panel = createResizablePanel(root, {\n orientation: preferred,\n sizes: [ratio * 100, (1 - ratio) * 100],\n min: options.min ?? 15,\n collapsible: sides,\n handleButtons: sides.length > 0,\n storageKey: options.storageKey,\n labels: options.labels ?? [areas[0]!.dataset.label ?? 'Primera área', areas[1]!.dataset.label ?? 'Segunda área'],\n onResizeEnd: (sizes) => options.onChange?.(Math.round(sizes[0]! * 10) / 1000),\n onCollapse: (index, shut) => options.onCollapse?.(shut ? sideOf(index) : null),\n });\n scope.add(() => panel.destroy());\n\n // Narrow: stacked.\n if (options.stackBelow && options.stackBelow > 0 && typeof ResizeObserver === 'function') {\n const limit = options.stackBelow;\n scope.observe(\n new ResizeObserver(() => {\n const width = root.getBoundingClientRect().width;\n panel.setOrientation(width && width < limit ? 'vertical' : preferred);\n }),\n ).observe(root);\n }\n\n const collapsedSide = () => (panel.collapsed.includes(0) ? 'start' : panel.collapsed.includes(1) ? 'end' : null);\n return {\n setRatio(next, animate = true) {\n const share = Math.min(1, Math.max(0, next));\n panel.setSizes([share * 100, (1 - share) * 100], animate);\n },\n collapse(side) {\n const other = side === 'start' ? 1 : 0;\n if (panel.collapsed.includes(other)) panel.expand(other);\n panel.collapse(side === 'start' ? 0 : 1);\n },\n expand() {\n for (const index of panel.collapsed) panel.expand(index);\n },\n toggle(side) {\n const index = side === 'start' ? 0 : 1;\n if (panel.collapsed.includes(index)) panel.expand(index);\n else this.collapse(side);\n },\n get ratio() {\n return Math.round(panel.sizes[0]! * 10) / 1000;\n },\n get collapsed() {\n return collapsedSide();\n },\n get orientation() {\n return panel.orientation;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, Flip, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, type Instance } from '../../core/types';\nimport { fromJson, safeFormat } from '../../core/dates';\nimport { toTime } from '../../core/relative-time';\nimport { foldText, markText } from '../../core/mark';\nimport { cloneFilter, describeFilter, emptyFilter, hasConditions, matchesFilter, type FilterField, type FilterGroup } from '../../core/filter';\nimport { flowInMenu } from '../../motion/entrances';\nimport { press, rollDigits } from '../../motion/micro';\nimport { createDialog } from '../dialog/engine';\nimport { createMenu } from '../menu/engine';\nimport { createEmptyState } from '../empty-state/engine';\nimport { createFilterBuilder } from '../filter-builder/engine';\n\n/*\n * Data table: rows and columns with sorting, a search, filters, selection,\n * pagination, row actions and columns to show or hide. Sorting glides the rows\n * to their new order (layout reflow, .62 s) while the header's arrow turns;\n * the search marks what matches and the rows that stay glide together; filters\n * come from filter-builder in a panel that grows out of its button (the table\n * follows live, a sentence says what is filtered). Checks draw themselves and\n * pop; the header box goes mixed; a bar with the count (rolling) and the bulk\n * actions slides up out of a blur when something is chosen. A page change\n * slides the rows in from the side it goes to. Rows taken away slide out and\n * the rest close the gap. While loading, shimmering bones stand in; with\n * nothing to show, an empty state says why and offers to clear the filters.\n */\n\nexport type DataColumnType = 'text' | 'number' | 'date' | 'boolean' | 'select';\nexport type DataRow = Record<string, unknown>;\nexport type RowId = string | number;\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface DataSort {\n key: string;\n direction: SortDirection;\n}\n\nexport interface DataColumn<T extends DataRow = DataRow> {\n key: string;\n label: string;\n /** For sorting, filtering and the default text (default 'text'). */\n type?: DataColumnType;\n /** The choices of a 'select' column (its text and its filter). */\n options?: Array<{ value: string; label: string }>;\n sortable?: boolean;\n filterable?: boolean;\n searchable?: boolean;\n /** Starts hidden (it can be shown from \"Columnas\"). */\n hidden?: boolean;\n /** Can be hidden from \"Columnas\" (default true). */\n hideable?: boolean;\n align?: 'start' | 'center' | 'end';\n width?: string;\n /** The cell's text (default: numbers and dates in the page's language, Sí/No, the choice's label). */\n format?: (value: unknown, row: T) => string;\n /** Draw the cell yourself (vanilla). */\n render?: (value: unknown, row: T, cell: HTMLTableCellElement) => void;\n /** The value to sort, filter and search by (default row[key]). */\n value?: (row: T) => unknown;\n}\n\nexport interface DataAction {\n id: string;\n label: string;\n danger?: boolean;\n}\n\nexport interface DataTableOptions<T extends DataRow = DataRow> {\n columns?: DataColumn<T>[];\n rows?: T[];\n /** The rows' id: a key (default 'id') or a function. */\n rowKey?: string | ((row: T) => RowId);\n /** Accessible name (default 'Tabla'). */\n caption?: string;\n /** Rows a page (default 10; 0: all of them). */\n pageSize?: number;\n pageSizes?: number[];\n selectable?: boolean;\n /** A search field: true, or its placeholder (default true). */\n search?: boolean | string;\n /** A \"Filtros\" button with filter-builder (default true). */\n filters?: boolean;\n filter?: FilterGroup;\n /** A \"Columnas\" button to show and hide columns (default true). */\n columnsMenu?: boolean;\n /** A menu on each row. */\n actions?: DataAction[];\n /** Buttons in the bar of the chosen rows. */\n bulkActions?: DataAction[];\n sort?: DataSort | null;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n locale?: string;\n onSortChange?: (sort: DataSort | null) => void;\n onSelectionChange?: (ids: RowId[], rows: T[]) => void;\n onAction?: (action: string, row: T) => void;\n onBulkAction?: (action: string, rows: T[]) => void;\n onPageChange?: (page: number) => void;\n onFilterChange?: (filter: FilterGroup, query: string) => void;\n /** After the rows are drawn (editable-table decorates them). */\n onRender?: (body: HTMLTableSectionElement) => void;\n}\n\nexport interface DataTableInstance<T extends DataRow = DataRow> extends Instance {\n setRows(rows: T[]): void;\n updateRow(id: RowId, patch: Partial<T>): void;\n /** Rows slide out and the rest close the gap. */\n removeRows(ids: RowId[]): void;\n setLoading(loading: boolean): void;\n sortBy(key: string | null, direction?: SortDirection): void;\n setPage(page: number): void;\n setPageSize(size: number): void;\n setQuery(query: string): void;\n setFilter(filter: FilterGroup): void;\n setColumnVisible(key: string, visible: boolean): void;\n select(ids: RowId[]): void;\n rowOf(id: RowId): HTMLTableRowElement | null;\n cellOf(id: RowId, key: string): HTMLTableCellElement | null;\n /** Draw the rows again (after changing them in place). */\n refresh(): void;\n idOf(row: T): RowId;\n readonly rows: T[];\n /** The rows the search and the filters leave, in order. */\n readonly results: T[];\n readonly page: number;\n readonly pageCount: number;\n readonly selection: RowId[];\n readonly sort: DataSort | null;\n readonly query: string;\n readonly filter: FilterGroup;\n readonly columns: DataColumn<T>[];\n readonly body: HTMLTableSectionElement;\n}\n\nconst SVG = (paths: string, size = 16) =>\n `<svg aria-hidden=\"true\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths}</svg>`;\nconst ICONS = {\n search: SVG('<circle cx=\"11\" cy=\"11\" r=\"6.5\"/><path d=\"M20 20l-4.2-4.2\"/>'),\n filter: SVG('<path d=\"M4 6h16M7 12h10M10 18h4\"/>'),\n columns: SVG('<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2.5\"/><path d=\"M9.5 4.5v15M14.5 4.5v15\"/>'),\n more: SVG('<circle cx=\"5.5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"18.5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\"/>', 18),\n previous: SVG('<path d=\"M15 6l-6 6 6 6\"/>'),\n next: SVG('<path d=\"M9 6l6 6-6 6\"/>'),\n close: SVG('<path d=\"M7 7l10 10M17 7L7 17\"/>', 14),\n arrow: SVG('<path d=\"M12 19V5M6 11l6-6 6 6\"/>', 12),\n};\nconst CHECK =\n '<svg aria-hidden=\"true\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path data-mk-dt-tick d=\"M5 12.5l4.5 4.5L19 7.5\" pathLength=\"1\"/><path data-mk-dt-dash d=\"M6 12h12\"/></svg>';\nconst plural = (n: number, one: string, many: string) => `${n} ${n === 1 ? one : many}`;\nlet sequence = 0;\n\nexport function createDataTable<T extends DataRow = DataRow>(root: HTMLElement | null, options: DataTableOptions<T> = {}): DataTableInstance<T> {\n if (!root) {\n return inert({\n setRows() {}, updateRow() {}, removeRows() {}, setLoading() {}, sortBy() {}, setPage() {}, setPageSize() {}, setQuery() {}, setFilter() {}, setColumnVisible() {}, select() {},\n rowOf: () => null, cellOf: () => null, refresh() {}, idOf: () => '',\n rows: [], results: [], page: 0, pageCount: 0, selection: [], sort: null, query: '', filter: emptyFilter(), columns: [], body: null as unknown as HTMLTableSectionElement,\n });\n }\n registerMotion();\n const scope = createScope();\n const uid = `mk-dt-${++sequence}`;\n const locale = options.locale ?? root.closest('[lang]')?.getAttribute('lang') ?? 'es';\n // JSON text too (data-mk-* through autoInit).\n const columns: DataColumn<T>[] = (fromJson(options.columns) ?? []).map((column) => ({ ...column }));\n let rows: T[] = [...(fromJson(options.rows) ?? [])];\n const hidden = new Set(columns.filter((column) => column.hidden).map((column) => column.key));\n let sort: DataSort | null = options.sort ?? null;\n let query = '';\n let filter: FilterGroup = options.filter ? cloneFilter(options.filter) : emptyFilter();\n let pageSize = Number.isFinite(options.pageSize) ? Math.max(0, Math.floor(options.pageSize!)) : 10;\n const pageSizes = options.pageSizes ?? [10, 25, 50];\n let page = 0;\n let selection = new Set<RowId>();\n let anchor: RowId | null = null;\n let loading = Boolean(options.loading);\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n // ── Rows and values ──────────────────────────────────────────────────────\n const generated = new WeakMap<object, string>();\n let made = 0;\n const idOf = (row: T): RowId => {\n if (typeof options.rowKey === 'function') return options.rowKey(row);\n const id = row[options.rowKey ?? 'id'];\n if (typeof id === 'string' || typeof id === 'number') return id;\n let given = generated.get(row);\n if (!given) generated.set(row, (given = `${uid}-row-${++made}`));\n return given;\n };\n const visibleColumns = () => columns.filter((column) => !hidden.has(column.key));\n const valueOf = (row: T, column: DataColumn<T>) => (column.value ? column.value(row) : row[column.key]);\n let number: Intl.NumberFormat;\n try {\n number = new Intl.NumberFormat(locale);\n } catch {\n number = new Intl.NumberFormat();\n }\n const dateFormat = safeFormat(locale, { day: 'numeric', month: 'short', year: 'numeric' });\n const textOf = (row: T, column: DataColumn<T>): string => {\n const value = valueOf(row, column);\n if (column.format) return column.format(value, row);\n if (value === null || value === undefined || value === '') return '';\n switch (column.type) {\n case 'number':\n return typeof value === 'number' ? number.format(value) : String(value);\n case 'date': {\n const date = toTime(value as string | number | Date);\n return date ? dateFormat.format(date) : String(value);\n }\n case 'boolean':\n return value ? 'Sí' : 'No';\n case 'select':\n return column.options?.find((option) => option.value === String(value))?.label ?? String(value);\n default:\n return String(value);\n }\n };\n let collator: Intl.Collator;\n try {\n collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n } catch {\n collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\n }\n const compare = (a: unknown, b: unknown, column: DataColumn<T>) => {\n const empty = (value: unknown) => value === null || value === undefined || value === '';\n // Empty cells go last whichever way.\n if (empty(a) || empty(b)) return empty(a) === empty(b) ? 0 : empty(a) ? 1 : -1;\n if (column.type === 'number') return Number(a) - Number(b);\n if (column.type === 'date') return (toTime(a as string)?.getTime() ?? 0) - (toTime(b as string)?.getTime() ?? 0);\n if (column.type === 'boolean') return Number(Boolean(a)) - Number(Boolean(b));\n return collator.compare(String(a), String(b));\n };\n const fields = (): FilterField[] =>\n columns\n .filter((column) => column.filterable !== false)\n .map((column) => ({ key: column.key, label: column.label, type: column.type ?? 'text', options: column.options }));\n const results = (): T[] => {\n const needle = foldText(query.trim());\n const known = fields();\n const filtering = hasConditions(filter, known);\n let list = rows.filter((row) => {\n if (filtering) {\n const record: Record<string, unknown> = {};\n for (const column of columns) record[column.key] = valueOf(row, column);\n if (!matchesFilter(record, filter, known)) return false;\n }\n return !needle || visibleColumns().some((column) => column.searchable !== false && foldText(textOf(row, column)).includes(needle));\n });\n const column = sort ? columns.find((each) => each.key === sort!.key) : undefined;\n if (sort && column) {\n const direction = sort.direction === 'asc' ? 1 : -1;\n const empty = (value: unknown) => value === null || value === undefined || value === '';\n list = [...list].sort((a, b) => {\n const va = valueOf(a, column);\n const vb = valueOf(b, column);\n // Empty cells stay at the end in both directions.\n if (empty(va) || empty(vb)) return compare(va, vb, column);\n return compare(va, vb, column) * direction;\n });\n }\n return list;\n };\n let shown: T[] = [];\n const pageCount = (count: number) => (pageSize ? Math.max(1, Math.ceil(count / pageSize)) : 1);\n\n // ── The parts ────────────────────────────────────────────────────────────\n const el = <K extends keyof HTMLElementTagNameMap>(tag: K, data?: string, text?: string) => {\n const element = document.createElement(tag);\n if (data) element.setAttribute(data, '');\n if (text !== undefined) element.textContent = text;\n return element;\n };\n const toolButton = (data: string, label: string, icon: string, text?: string) => {\n const button = el('button', data);\n button.type = 'button';\n button.dataset.mkDtTool = '';\n button.innerHTML = icon;\n if (text) {\n const span = el('span', undefined, text);\n button.append(span);\n } else button.setAttribute('aria-label', label);\n return button;\n };\n\n const bar = el('div', 'data-mk-dt-bar');\n let searchInput: HTMLInputElement | null = null;\n if (options.search !== false) {\n const field = el('label', 'data-mk-dt-search');\n field.insertAdjacentHTML('beforeend', ICONS.search);\n searchInput = el('input');\n searchInput.type = 'search';\n searchInput.placeholder = typeof options.search === 'string' ? options.search : 'Buscar…';\n searchInput.setAttribute('aria-label', 'Buscar en la tabla');\n field.append(searchInput);\n bar.append(field);\n }\n const tools = el('div', 'data-mk-dt-tools');\n const filtersButton = options.filters !== false && fields().length ? toolButton('data-mk-dt-filters', 'Filtros', ICONS.filter, 'Filtros') : null;\n const filterCount = el('span', 'data-mk-dt-count');\n filterCount.hidden = true;\n filtersButton?.append(filterCount);\n const columnsButton = options.columnsMenu !== false && columns.some((column) => column.hideable !== false) ? toolButton('data-mk-dt-columns', 'Columnas', ICONS.columns, 'Columnas') : null;\n for (const button of [filtersButton, columnsButton]) if (button) tools.append(button);\n bar.append(tools);\n\n const active = el('div', 'data-mk-dt-active');\n active.hidden = true;\n const activeText = el('span');\n const clearButton = el('button', 'data-mk-dt-clear');\n clearButton.type = 'button';\n clearButton.innerHTML = ICONS.close;\n clearButton.append(el('span', undefined, 'Quitar filtros'));\n active.append(activeText, clearButton);\n\n const scroll = el('div', 'data-mk-dt-scroll');\n const table = el('table', 'data-mk-dt-table');\n table.id = `${uid}-table`;\n const caption = el('caption', undefined, options.caption ?? 'Tabla');\n caption.className = 'mk-sr-only';\n const head = el('thead');\n const headRow = el('tr');\n head.append(headRow);\n const body = el('tbody');\n table.append(caption, head, body);\n scroll.append(table);\n // A region the keyboard can scroll when the table is wider than it.\n scroll.setAttribute('role', 'region');\n scroll.setAttribute('aria-label', `${options.caption ?? 'Tabla'} (desplazable)`);\n scroll.tabIndex = 0;\n const emptyHost = el('div', 'data-mk-dt-empty');\n emptyHost.className = 'mk-empty-state';\n emptyHost.hidden = true;\n\n const foot = el('div', 'data-mk-dt-foot');\n const range = el('span', 'data-mk-dt-range');\n const sizeField = el('label', 'data-mk-dt-size');\n sizeField.append(el('span', undefined, 'Filas'));\n const sizeSelect = el('select');\n for (const size of pageSizes) {\n const option = el('option', undefined, String(size));\n option.value = String(size);\n sizeSelect.append(option);\n }\n if (!pageSizes.includes(pageSize) && pageSize) {\n const option = el('option', undefined, String(pageSize));\n option.value = String(pageSize);\n sizeSelect.prepend(option);\n }\n sizeSelect.value = String(pageSize);\n sizeField.append(sizeSelect);\n const pager = el('nav', 'data-mk-dt-pager');\n pager.setAttribute('aria-label', 'Páginas');\n const previous = el('button', 'data-mk-dt-previous');\n previous.type = 'button';\n previous.innerHTML = ICONS.previous;\n previous.setAttribute('aria-label', 'Página anterior');\n const pageLabel = el('span', 'data-mk-dt-page');\n const next = el('button', 'data-mk-dt-next');\n next.type = 'button';\n next.innerHTML = ICONS.next;\n next.setAttribute('aria-label', 'Página siguiente');\n pager.append(previous, pageLabel, next);\n foot.append(range, sizeField, pager);\n\n const bulk = el('div', 'data-mk-dt-bulk');\n bulk.setAttribute('role', 'toolbar');\n bulk.setAttribute('aria-label', 'Acciones de la selección');\n bulk.hidden = true;\n const bulkCount = el('span', 'data-mk-dt-bulk-count');\n const bulkText = el('span');\n const bulkAll = el('button', 'data-mk-dt-select-all');\n bulkAll.type = 'button';\n bulkAll.hidden = true;\n const bulkActions = el('div', 'data-mk-dt-bulk-actions');\n for (const action of options.bulkActions ?? []) {\n const button = el('button', undefined, action.label);\n button.type = 'button';\n button.dataset.action = action.id;\n if (action.danger) button.dataset.danger = '';\n bulkActions.append(button);\n }\n const bulkClose = el('button', 'data-mk-dt-bulk-close');\n bulkClose.type = 'button';\n bulkClose.innerHTML = ICONS.close;\n bulkClose.setAttribute('aria-label', 'Quitar la selección');\n const bulkLabel = el('span', 'data-mk-dt-bulk-label');\n bulkLabel.append(bulkCount, bulkText);\n bulk.append(bulkLabel, bulkAll, bulkActions, bulkClose);\n\n const status = el('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n root.append(bar, active, scroll, emptyHost, foot, bulk, status);\n scope.attr(root, 'data-mk-ready', '');\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n for (const part of [bar, active, scroll, emptyHost, foot, bulk, status]) part.remove();\n });\n\n // ── Checkboxes that draw themselves ──────────────────────────────────────\n const checkbox = (label: string) => {\n const box = el('span', 'data-mk-dt-check');\n const input = el('input');\n input.type = 'checkbox';\n input.setAttribute('aria-label', label);\n box.append(input);\n box.insertAdjacentHTML('beforeend', CHECK);\n return { box, input };\n };\n const paintCheck = (box: HTMLElement, state: 'true' | 'false' | 'mixed', animate: boolean) => {\n const input = box.querySelector('input')!;\n const before = box.dataset.state;\n box.dataset.state = state;\n input.checked = state === 'true';\n input.indeterminate = state === 'mixed';\n if (!animate || before === state || state === 'false' || reduced()) return;\n keep(gsap.fromTo(box, { scale: 0.8 }, { scale: 1, duration: 0.35, ease: EASE.click, clearProps: 'transform' }));\n const path = box.querySelector<SVGPathElement>(state === 'true' ? '[data-mk-dt-tick]' : '[data-mk-dt-dash]');\n if (path) keep(gsap.fromTo(path, { strokeDasharray: state === 'true' ? 1 : 12, strokeDashoffset: state === 'true' ? 1 : 12 }, { strokeDashoffset: 0, duration: 0.3, ease: EASE.wipe, clearProps: 'strokeDasharray,strokeDashoffset' }));\n };\n\n // ── The header ───────────────────────────────────────────────────────────\n let headCheck: HTMLElement | null = null;\n const buildHead = () => {\n headRow.replaceChildren();\n headCheck = null;\n if (options.selectable) {\n const th = el('th', 'data-mk-dt-select');\n th.scope = 'col';\n const { box } = checkbox('Seleccionar la página');\n headCheck = box;\n th.append(box);\n headRow.append(th);\n }\n for (const column of visibleColumns()) {\n const th = el('th');\n th.scope = 'col';\n th.dataset.key = column.key;\n th.dataset.align = column.align ?? (column.type === 'number' ? 'end' : 'start');\n if (column.width) th.style.width = column.width;\n if (column.sortable !== false) {\n const button = el('button', 'data-mk-dt-sort');\n button.type = 'button';\n button.append(el('span', undefined, column.label));\n button.insertAdjacentHTML('beforeend', ICONS.arrow);\n th.append(button);\n } else th.textContent = column.label;\n headRow.append(th);\n }\n if (options.actions?.length) {\n const th = el('th', 'data-mk-dt-actions');\n th.scope = 'col';\n th.append(Object.assign(el('span', undefined, 'Acciones'), { className: 'mk-sr-only' }));\n headRow.append(th);\n }\n paintHead();\n };\n const paintHead = () => {\n for (const th of headRow.querySelectorAll<HTMLElement>('th[data-key]')) {\n const key = th.dataset.key!;\n const on = sort?.key === key;\n if (th.querySelector('[data-mk-dt-sort]')) th.setAttribute('aria-sort', on ? (sort!.direction === 'asc' ? 'ascending' : 'descending') : 'none');\n th.dataset.direction = on ? sort!.direction : '';\n }\n };\n\n // ── The rows ─────────────────────────────────────────────────────────────\n const rowOf = (id: RowId) => [...body.rows].find((tr) => tr.dataset.id === String(id)) ?? null;\n const fillCell = (cell: HTMLTableCellElement, row: T, column: DataColumn<T>) => {\n cell.replaceChildren();\n if (column.render) column.render(valueOf(row, column), row, cell);\n else if (column.type === 'boolean') {\n const pill = el('span', 'data-mk-dt-bool', textOf(row, column));\n pill.dataset.value = String(Boolean(valueOf(row, column)));\n cell.append(pill);\n } else cell.append(markText(textOf(row, column), column.searchable === false ? '' : query));\n };\n const rowElement = (row: T, index: number) => {\n const id = idOf(row);\n const tr = el('tr');\n tr.dataset.id = String(id);\n tr.dataset.flipId = String(id);\n const chosen = selection.has(id);\n tr.toggleAttribute('data-selected', chosen);\n const first = visibleColumns()[0];\n const name = first ? textOf(row, first) : `fila ${index + 1}`;\n if (options.selectable) {\n const td = el('td', 'data-mk-dt-select');\n const { box } = checkbox(`Seleccionar ${name}`);\n paintCheck(box, chosen ? 'true' : 'false', false);\n td.append(box);\n tr.append(td);\n }\n for (const column of visibleColumns()) {\n const td = el('td');\n td.dataset.key = column.key;\n td.dataset.align = column.align ?? (column.type === 'number' ? 'end' : 'start');\n fillCell(td, row, column);\n tr.append(td);\n }\n if (options.actions?.length) {\n const td = el('td', 'data-mk-dt-actions');\n const button = el('button', 'data-mk-dt-row-menu');\n button.type = 'button';\n button.innerHTML = ICONS.more;\n button.setAttribute('aria-label', `Acciones de ${name}`);\n button.setAttribute('aria-haspopup', 'menu');\n td.append(button);\n tr.append(td);\n }\n return tr;\n };\n const bones = () => {\n const count = pageSize || 6;\n const width = visibleColumns().length + (options.selectable ? 1 : 0) + (options.actions?.length ? 1 : 0);\n return Array.from({ length: Math.min(count, 12) }, (_, r) => {\n const tr = el('tr', 'data-mk-dt-loading');\n for (let c = 0; c < width; c++) {\n const td = el('td');\n const bone = el('span', 'data-mk-dt-bone');\n bone.style.width = `${45 + ((r * 7 + c * 13) % 45)}%`;\n td.append(bone);\n tr.append(td);\n }\n return tr;\n });\n };\n\n let empty: ReturnType<typeof createEmptyState> | null = null;\n const paintEmpty = (count: number) => {\n const none = !loading && !count;\n emptyHost.hidden = !none;\n table.toggleAttribute('data-mk-dt-empty-table', none);\n if (!none) return;\n const searching = rows.length > 0;\n const next = {\n illustration: searching ? ('search' as const) : ('inbox' as const),\n title: searching ? 'Sin resultados' : (options.emptyTitle ?? 'Sin datos todavía'),\n description: searching ? 'Prueba con otra búsqueda o quita los filtros.' : (options.emptyDescription ?? 'Cuando haya filas, aparecerán aquí.'),\n actions: searching ? [{ id: 'clear', label: 'Limpiar búsqueda y filtros' }] : [],\n };\n if (empty) empty.update(next);\n else empty = createEmptyState(emptyHost, { ...next, onAction: (id) => id === 'clear' && clearAll() });\n };\n scope.add(() => empty?.destroy());\n scope.on(emptyHost, 'mk:action', (event) => event.stopPropagation());\n\n const paintFoot = (count: number) => {\n const pages = pageCount(count);\n page = Math.min(page, pages - 1);\n const from = count ? page * (pageSize || count) + 1 : 0;\n const to = pageSize ? Math.min(count, (page + 1) * pageSize) : count;\n const text = count ? `${number.format(from)}–${number.format(to)} de ${number.format(count)}` : '0 resultados';\n if (range.textContent !== text) range.textContent = text;\n pageLabel.textContent = `${number.format(page + 1)} / ${number.format(pages)}`;\n previous.disabled = page === 0;\n next.disabled = page >= pages - 1;\n pager.hidden = !pageSize || pages <= 1;\n sizeField.hidden = !pageSize;\n };\n\n const paintSelection = (animate: boolean) => {\n for (const tr of body.rows) {\n const id = tr.dataset.id;\n if (id === undefined || tr.hasAttribute('data-mk-dt-loading')) continue;\n const row = shown.find((each) => String(idOf(each)) === id);\n const chosen = row ? selection.has(idOf(row)) : false;\n tr.toggleAttribute('data-selected', chosen);\n const box = tr.querySelector<HTMLElement>('[data-mk-dt-check]');\n if (box) paintCheck(box, chosen ? 'true' : 'false', animate);\n }\n if (headCheck) {\n const onPage = shown.map(idOf);\n const count = onPage.filter((id) => selection.has(id)).length;\n paintCheck(headCheck, count && count === onPage.length ? 'true' : count ? 'mixed' : 'false', animate);\n }\n paintBulk(animate);\n };\n\n let bulkShown = false;\n const paintBulk = (animate: boolean) => {\n const count = selection.size;\n const show = count > 0;\n const text = String(count);\n if (show) {\n const same = bulkCount.textContent === text;\n if (!same && bulkShown && animate && !reduced()) keep(rollDigits(bulkCount, text, Number(text) > Number(bulkCount.textContent || 0) ? 1 : -1, 0.3));\n else bulkCount.textContent = text;\n bulkText.textContent = count === 1 ? ' seleccionada' : ' seleccionadas';\n // The whole page chosen and more beyond it: offer them all.\n const total = results().length;\n const pageIds = shown.map(idOf);\n const pageFull = pageIds.length > 0 && pageIds.every((id) => selection.has(id));\n bulkAll.hidden = !(pageFull && total > count);\n bulkAll.textContent = `Seleccionar las ${number.format(total)}`;\n }\n if (show === bulkShown) return;\n bulkShown = show;\n gsap.killTweensOf(bulk);\n if (show) {\n bulk.hidden = false;\n if (animate && !reduced()) keep(gsap.fromTo(bulk, { opacity: 0, y: 16, filter: 'blur(8px)' }, { opacity: 1, y: 0, filter: 'blur(0px)', duration: 0.35, ease: EASE.pop, clearProps: 'opacity,transform,filter' }));\n } else if (animate && !reduced()) {\n keep(gsap.to(bulk, { opacity: 0, y: 16, filter: 'blur(6px)', duration: 0.22, ease: 'power2.in', onComplete: () => {\n bulk.hidden = true;\n gsap.set(bulk, { clearProps: 'opacity,transform,filter' });\n } }));\n } else bulk.hidden = true;\n };\n\n /** Draw the page; `motion`: how the rows change (glide, slide from a side, or nothing). */\n const render = (motion: 'reflow' | 'forward' | 'back' | 'none' = 'none') => {\n const all = loading ? [] : results();\n const pages = pageCount(all.length);\n page = Math.max(0, Math.min(page, pages - 1));\n shown = loading ? [] : pageSize ? all.slice(page * pageSize, (page + 1) * pageSize) : all;\n const before = motion === 'reflow' && !reduced() ? [...body.rows].filter((tr) => !tr.hasAttribute('data-mk-dt-loading')) : [];\n const state = before.length && before.length <= 80 ? Flip.getState(before) : null;\n const wasLoading = body.querySelector('[data-mk-dt-loading]') !== null;\n body.replaceChildren(...(loading ? bones() : shown.map(rowElement)));\n table.setAttribute('aria-busy', String(loading));\n paintEmpty(all.length);\n paintFoot(all.length);\n paintSelection(false);\n const fresh = [...body.rows];\n if (!reduced() && !loading && fresh.length) {\n if (state) {\n keep(\n Flip.from(state, {\n targets: fresh,\n duration: TIMING.layoutTravel,\n ease: EASE.layoutReflow,\n onEnter: (entering) => gsap.fromTo(entering, { opacity: 0 }, { opacity: 1, duration: 0.3, delay: 0.1, ease: 'power1.out', clearProps: 'opacity' }),\n }),\n );\n } else if (motion === 'forward' || motion === 'back') {\n keep(gsap.fromTo(fresh, { opacity: 0, x: motion === 'forward' ? 24 : -24 }, { opacity: 1, x: 0, duration: 0.32, stagger: 0.015, ease: 'power2.out', clearProps: 'opacity,transform' }));\n } else if (wasLoading) keep(gsap.fromTo(fresh, { opacity: 0, y: 6 }, { opacity: 1, y: 0, duration: 0.35, stagger: 0.025, ease: 'power2.out', clearProps: 'opacity,transform' }));\n }\n options.onRender?.(body);\n };\n\n // ── Changes ──────────────────────────────────────────────────────────────\n const notifySelection = () => {\n const ids = [...selection];\n const chosen = rows.filter((row) => selection.has(idOf(row)));\n options.onSelectionChange?.(ids, chosen);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { ids, rows: chosen } }));\n };\n const setSelection = (ids: Iterable<RowId>, notify = true) => {\n const next = new Set(ids);\n const same = next.size === selection.size && [...next].every((id) => selection.has(id));\n selection = next;\n paintSelection(true);\n if (!same) {\n status.textContent = selection.size ? plural(selection.size, 'fila seleccionada', 'filas seleccionadas') : 'Sin selección';\n if (notify) notifySelection();\n }\n };\n const announceResults = () => {\n const count = results().length;\n status.textContent = plural(count, 'resultado', 'resultados');\n };\n const filtersChanged = (notify = true) => {\n page = 0;\n const known = fields();\n const conditions = hasConditions(filter, known);\n const sentence = conditions ? describeFilter(filter, known) : '';\n const wasHidden = active.hidden;\n active.hidden = !conditions;\n activeText.textContent = sentence;\n if (conditions && wasHidden && !reduced()) keep(gsap.fromTo(active, { opacity: 0, y: -6, filter: 'blur(6px)' }, { opacity: 1, y: 0, filter: 'blur(0px)', duration: 0.3, ease: 'power2.out', clearProps: 'opacity,transform,filter' }));\n const ruleCount = countRules(filter, known);\n filterCount.hidden = !ruleCount;\n if (ruleCount && filterCount.textContent !== String(ruleCount) && !reduced()) keep(gsap.fromTo(filterCount, { scale: 0.5 }, { scale: 1, duration: 0.35, ease: EASE.pop, clearProps: 'transform' }));\n filterCount.textContent = String(ruleCount);\n render('reflow');\n if (!notify) return;\n announceResults();\n options.onFilterChange?.(cloneFilter(filter), query);\n root.dispatchEvent(new CustomEvent('mk:filter', { bubbles: true, detail: { filter: cloneFilter(filter), query } }));\n };\n const countRules = (group: FilterGroup, known: FilterField[]): number =>\n group.rules.reduce((sum, node) => sum + ('rules' in node ? countRules(node as FilterGroup, known) : hasConditions({ id: 'x', combinator: 'and', rules: [node] }, known) ? 1 : 0), 0);\n const clearAll = () => {\n query = '';\n if (searchInput) searchInput.value = '';\n filter = emptyFilter();\n builder?.setValue(filter);\n filtersChanged();\n };\n\n const sortBy = (key: string | null, direction?: SortDirection) => {\n const column = key ? columns.find((each) => each.key === key) : undefined;\n sort = column ? { key: column.key, direction: direction ?? 'asc' } : null;\n paintHead();\n render('reflow');\n status.textContent = sort ? `Ordenado por ${column!.label}, ${sort.direction === 'asc' ? 'ascendente' : 'descendente'}` : 'Sin orden';\n options.onSortChange?.(sort ? { ...sort } : null);\n root.dispatchEvent(new CustomEvent('mk:sort', { bubbles: true, detail: { sort: sort ? { ...sort } : null } }));\n };\n const setPage = (next: number) => {\n const pages = pageCount(results().length);\n const target = Math.max(0, Math.min(pages - 1, next));\n if (target === page) return;\n const forward = target > page;\n page = target;\n render(forward ? 'forward' : 'back');\n status.textContent = `Página ${page + 1} de ${pages}`;\n options.onPageChange?.(page);\n root.dispatchEvent(new CustomEvent('mk:page', { bubbles: true, detail: { page } }));\n };\n\n // ── Pointer and keyboard ─────────────────────────────────────────────────\n scope.on(head, 'click', (event) => {\n const button = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-dt-sort]');\n if (!button) return;\n const key = button.closest<HTMLElement>('th')!.dataset.key!;\n // Ascending, descending, then no order.\n if (sort?.key !== key) sortBy(key, 'asc');\n else if (sort.direction === 'asc') sortBy(key, 'desc');\n else sortBy(null);\n });\n scope.on(head, 'change', (event) => {\n if (!(event.target as Element).closest('[data-mk-dt-check]')) return;\n const ids = shown.map(idOf);\n const all = ids.every((id) => selection.has(id));\n setSelection(all ? [...selection].filter((id) => !ids.includes(id)) : [...selection, ...ids]);\n });\n scope.on(body, 'click', (event) => {\n const target = event.target as Element | null;\n const input = target?.closest('[data-mk-dt-check] input');\n if (input) {\n const tr = input.closest<HTMLElement>('tr')!;\n const row = shown.find((each) => String(idOf(each)) === tr.dataset.id);\n if (!row) return;\n const id = idOf(row);\n const mouse = event as MouseEvent;\n if (mouse.shiftKey && anchor !== null) {\n const order = shown.map(idOf);\n const a = order.indexOf(anchor);\n const b = order.indexOf(id);\n if (a >= 0 && b >= 0) {\n const span = order.slice(Math.min(a, b), Math.max(a, b) + 1);\n const on = !selection.has(id);\n const next = new Set(selection);\n for (const each of span) {\n if (on) next.add(each);\n else next.delete(each);\n }\n anchor = id;\n return setSelection(next);\n }\n }\n anchor = id;\n const next = new Set(selection);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelection(next);\n return;\n }\n const menuButton = target?.closest<HTMLElement>('[data-mk-dt-row-menu]');\n if (menuButton) openRowMenu(menuButton);\n });\n // Changes of the boxes are handled on click (it knows about Shift); keep the box in step.\n scope.on(body, 'change', (event) => {\n const box = (event.target as Element).closest<HTMLElement>('[data-mk-dt-check]');\n if (box) paintSelection(false);\n });\n if (searchInput) {\n const input = searchInput;\n scope.on(input, 'input', () => {\n query = input.value;\n filtersChanged();\n });\n }\n scope.on(previous, 'click', () => {\n keep(press(previous));\n setPage(page - 1);\n });\n scope.on(next, 'click', () => {\n keep(press(next));\n setPage(page + 1);\n });\n scope.on(sizeSelect, 'change', () => {\n pageSize = Number(sizeSelect.value) || 0;\n page = 0;\n render('reflow');\n });\n scope.on(clearButton, 'click', clearAll);\n scope.on(bulkClose, 'click', () => setSelection([]));\n scope.on(bulkAll, 'click', () => setSelection(results().map(idOf)));\n scope.on(bulkActions, 'click', (event) => {\n const button = (event.target as Element | null)?.closest<HTMLElement>('[data-action]');\n if (!button) return;\n keep(press(button));\n const chosen = rows.filter((row) => selection.has(idOf(row)));\n options.onBulkAction?.(button.dataset.action!, chosen);\n root.dispatchEvent(new CustomEvent('mk:bulk-action', { bubbles: true, detail: { action: button.dataset.action, rows: chosen } }));\n });\n\n // ── Panels: row menu, columns, filters ───────────────────────────────────\n const panelDialog = (name: string, label: string) => {\n const dialog = el('dialog');\n dialog.className = 'mk-dialog mk-dt-panel';\n dialog.dataset.mkDtPanel = name;\n dialog.setAttribute('aria-label', label);\n root.append(dialog);\n scope.add(() => dialog.remove());\n return dialog;\n };\n\n let rowMenu: ReturnType<typeof createMenu> | null = null;\n let menuRow: T | null = null;\n if (options.actions?.length) {\n const dialog = panelDialog('menu', 'Acciones de la fila');\n dialog.className = 'mk-dialog mk-menu mk-dt-menu';\n for (const action of options.actions) {\n const item = el('button', 'data-mk-item', action.label);\n item.type = 'button';\n item.dataset.mkValue = action.id;\n if (action.danger) item.dataset.danger = '';\n dialog.append(item);\n }\n rowMenu = createMenu(dialog, {\n triggers: false,\n onClose: () => {\n for (const button of body.querySelectorAll('[data-mk-dt-row-menu][aria-expanded=\"true\"]')) button.setAttribute('aria-expanded', 'false');\n },\n onSelect: (value) => {\n const row = menuRow;\n if (!row) return;\n options.onAction?.(value, row);\n root.dispatchEvent(new CustomEvent('mk:action', { bubbles: true, detail: { action: value, row } }));\n },\n });\n // The menu's own events stay inside: listeners on the table hear the table's.\n scope.on(dialog, 'mk:select', (event) => event.stopPropagation());\n scope.add(() => rowMenu?.destroy());\n }\n const openRowMenu = (button: HTMLElement) => {\n const tr = button.closest<HTMLElement>('tr');\n menuRow = shown.find((each) => String(idOf(each)) === tr?.dataset.id) ?? null;\n if (!menuRow || !rowMenu) return;\n button.setAttribute('aria-expanded', 'true');\n rowMenu.open(button);\n };\n\n let columnsPanel: ReturnType<typeof createDialog> | null = null;\n if (columnsButton) {\n const dialog = panelDialog('columns', 'Columnas');\n const title = el('p', 'data-mk-dt-panel-title', 'Columnas visibles');\n const list = el('div', 'data-mk-dt-column-list');\n dialog.append(title, list);\n const fill = () => {\n list.replaceChildren(\n ...columns\n .filter((column) => column.hideable !== false)\n .map((column) => {\n const label = el('label', 'data-mk-dt-column');\n const { box, input } = checkbox(column.label);\n paintCheck(box, hidden.has(column.key) ? 'false' : 'true', false);\n input.dataset.key = column.key;\n label.append(box, el('span', undefined, column.label));\n return label;\n }),\n );\n };\n columnsPanel = createDialog(dialog, {\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n triggers: false,\n animateContent: false,\n onOpen: () => {\n fill();\n keep(flowInMenu([title, ...list.children]));\n list.querySelector<HTMLInputElement>('input')?.focus({ preventScroll: true });\n },\n });\n scope.add(() => columnsPanel?.destroy());\n scope.on(list, 'change', (event) => {\n const input = event.target as HTMLInputElement;\n const key = input.dataset.key;\n if (!key) return;\n // At least one column stays.\n if (!input.checked && visibleColumns().length <= 1) {\n input.checked = true;\n return;\n }\n paintCheck(input.closest<HTMLElement>('[data-mk-dt-check]')!, input.checked ? 'true' : 'false', true);\n setColumnVisible(key, input.checked);\n });\n scope.on(columnsButton, 'click', () => {\n keep(press(columnsButton));\n columnsPanel?.open(columnsButton);\n });\n }\n\n let filtersPanel: ReturnType<typeof createDialog> | null = null;\n let builder: ReturnType<typeof createFilterBuilder> | null = null;\n if (filtersButton) {\n const dialog = panelDialog('filters', 'Filtros');\n dialog.classList.add('mk-dt-filters');\n const holder = el('div', 'data-mk-dt-builder');\n holder.className = 'mk-filter-builder';\n dialog.append(holder);\n builder = createFilterBuilder(holder, {\n fields: fields(),\n value: filter,\n onChange: (next) => {\n filter = next;\n filtersChanged();\n },\n });\n // The builder's own events stay inside the panel.\n scope.on(dialog, 'mk:change', (event) => event.stopPropagation());\n filtersPanel = createDialog(dialog, {\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n triggers: false,\n animateContent: false,\n onOpen: () => keep(flowInMenu([...holder.children])),\n });\n scope.add(() => {\n builder?.destroy();\n filtersPanel?.destroy();\n });\n scope.on(filtersButton, 'click', () => {\n keep(press(filtersButton));\n filtersPanel?.open(filtersButton);\n });\n }\n\n const setColumnVisible = (key: string, visible: boolean) => {\n if (!columns.some((column) => column.key === key) || hidden.has(key) === !visible) return;\n if (visible) hidden.delete(key);\n else hidden.add(key);\n buildHead();\n render();\n // The column that comes in fades in; the table settles out of a light blur.\n if (!reduced()) {\n const cells = [...table.querySelectorAll<HTMLElement>('[data-key]')].filter((cell) => cell.dataset.key === key);\n if (visible && cells.length) keep(gsap.fromTo(cells, { opacity: 0, y: -4 }, { opacity: 1, y: 0, duration: 0.3, stagger: 0.01, ease: 'power2.out', clearProps: 'opacity,transform' }));\n else keep(gsap.fromTo(table, { opacity: 0.6, filter: 'blur(2px)' }, { opacity: 1, filter: 'blur(0px)', duration: 0.3, ease: 'power1.out', clearProps: 'opacity,filter' }));\n }\n const column = columns.find((each) => each.key === key)!;\n status.textContent = `Columna ${column.label} ${visible ? 'visible' : 'oculta'}`;\n };\n\n buildHead();\n filtersChanged(false);\n\n return {\n setRows(next) {\n if (scope.disposed) return;\n rows = [...next];\n const ids = new Set(rows.map(idOf));\n const kept = [...selection].filter((id) => ids.has(id));\n const lost = kept.length !== selection.size;\n selection = new Set(kept);\n loading = false;\n render('reflow');\n if (lost) notifySelection();\n },\n updateRow(id, patch) {\n const index = rows.findIndex((row) => idOf(row) === id);\n if (index < 0) return;\n rows[index] = { ...rows[index]!, ...patch };\n render();\n },\n removeRows(ids) {\n const gone = new Set(ids);\n const leaving = [...body.rows].filter((tr) => [...gone].some((id) => String(id) === tr.dataset.id));\n const apply = () => {\n rows = rows.filter((row) => !gone.has(idOf(row)));\n const had = selection.size;\n selection = new Set([...selection].filter((id) => !gone.has(id)));\n render('reflow');\n if (had !== selection.size) notifySelection();\n status.textContent = plural(ids.length, 'fila eliminada', 'filas eliminadas');\n };\n if (!leaving.length || reduced()) return apply();\n keep(gsap.to(leaving, { opacity: 0, x: -24, duration: 0.22, ease: 'power2.in', onComplete: apply }));\n },\n setLoading(next) {\n if (loading === next) return;\n loading = next;\n render();\n },\n sortBy,\n setPage,\n setPageSize(size) {\n pageSize = Math.max(0, Math.floor(size));\n sizeSelect.value = String(pageSize);\n page = 0;\n render('reflow');\n },\n setQuery(next) {\n query = next;\n if (searchInput) searchInput.value = next;\n filtersChanged();\n },\n setFilter(next) {\n filter = cloneFilter(next);\n builder?.setValue(filter);\n filtersChanged();\n },\n setColumnVisible,\n select: (ids) => setSelection(ids, false),\n rowOf: (id) => rowOf(id) as HTMLTableRowElement | null,\n cellOf: (id, key) => [...(rowOf(id)?.cells ?? [])].find((cell) => cell.dataset.key === key) ?? null,\n refresh: () => render(),\n idOf,\n get rows() {\n return [...rows];\n },\n get results() {\n return results();\n },\n get page() {\n return page;\n },\n get pageCount() {\n return pageCount(results().length);\n },\n get selection() {\n return [...selection];\n },\n get sort() {\n return sort ? { ...sort } : null;\n },\n get query() {\n return query;\n },\n get filter() {\n return cloneFilter(filter);\n },\n get columns() {\n return columns.map((column) => ({ ...column, hidden: hidden.has(column.key) }));\n },\n body,\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { fromJson } from '../../core/dates';\nimport { toTime } from '../../core/relative-time';\nimport { press, rollDigits, shake } from '../../motion/micro';\nimport { createDataTable, type DataColumn, type DataRow, type DataTableInstance, type DataTableOptions, type RowId } from '../data-table/engine';\n\n/*\n * Editable table: data-table with cells that edit in place. A ring glides from\n * cell to cell with the arrows (.22 s, swing); Enter, F2 or simply typing\n * opens the cell's editor (text, number, date, a choice or a check) with a\n * small pop; Enter keeps it and goes down, Tab goes to the side, Escape lets\n * it be. A value that does not pass shakes and says why. Changed cells keep a\n * dot that pops in and a soft tint; a bar with the count (rolling) folds open\n * above the table with Descartar and Guardar (Ctrl/⌘+S). Saving waits on\n * onSave(): the button spins, then the saved cells flash and their marks fade,\n * or the bar shakes and the changes stay. New rows come in at the top with\n * their first cell open.\n */\n\nexport type EditorKind = 'text' | 'number' | 'date' | 'select' | 'checkbox';\n\nexport interface EditableColumn<T extends DataRow = DataRow> extends DataColumn<T> {\n /** Can be edited (default true). */\n editable?: boolean;\n /** The editor (default: from the column's type). */\n editor?: EditorKind;\n required?: boolean;\n min?: number;\n max?: number;\n /** An error message, or nothing when the value is fine. */\n validate?: (value: unknown, row: T) => string | null | undefined | void;\n}\n\nexport interface RowChange<T extends DataRow = DataRow> {\n id: RowId;\n /** The row as it is now (as it was, for a removed one). */\n row: T;\n /** The values that changed (all of them for a new row). */\n changes: Partial<T>;\n isNew?: boolean;\n removed?: boolean;\n}\n\nexport interface EditableTableOptions<T extends DataRow = DataRow> extends Omit<DataTableOptions<T>, 'columns'> {\n columns?: EditableColumn<T>[];\n /** Keep the changes: resolve when they are saved; reject (or throw) to keep them pending. */\n onSave?: (changes: RowChange<T>[], rows: T[]) => Promise<void> | void;\n /** After every edit. */\n onChange?: (changes: RowChange<T>[]) => void;\n /** A new row's values: shows \"Agregar fila\". */\n newRow?: () => Partial<T>;\n}\n\nexport interface EditableTableInstance<T extends DataRow = DataRow> extends Instance {\n /** Open a cell's editor. */\n edit(id: RowId, key: string): void;\n setValue(id: RowId, key: string, value: unknown): boolean;\n addRow(values?: Partial<T>): RowId;\n removeRows(ids: RowId[]): void;\n save(): Promise<boolean>;\n discard(): void;\n setRows(rows: T[]): void;\n readonly changes: RowChange<T>[];\n readonly dirty: boolean;\n readonly rows: T[];\n readonly table: DataTableInstance<T>;\n}\n\nconst plural = (n: number, one: string, many: string) => `${n} ${n === 1 ? one : many}`;\nlet sequence = 0;\n\nconst sameValue = (a: unknown, b: unknown) => (a === b || ((a === null || a === undefined || a === '') && (b === null || b === undefined || b === '')));\n\nexport function createEditableTable<T extends DataRow = DataRow>(root: HTMLElement | null, options: EditableTableOptions<T> = {}): EditableTableInstance<T> {\n if (!root) {\n return inert({\n edit() {}, setValue: () => false, addRow: () => '', removeRows() {}, save: () => Promise.resolve(false), discard() {}, setRows() {},\n changes: [], dirty: false, rows: [], table: null as unknown as DataTableInstance<T>,\n });\n }\n registerMotion();\n const scope = createScope();\n const uid = `mk-et-${++sequence}`;\n const columns: EditableColumn<T>[] = (fromJson(options.columns) ?? []).map((column) => ({ ...column }));\n const rowKey = options.rowKey ?? 'id';\n const idOf = (row: T): RowId => (typeof rowKey === 'function' ? rowKey(row) : (row[rowKey] as RowId));\n /** The rows as last saved. */\n let base: T[] = [...(fromJson(options.rows) ?? [])];\n const edits = new Map<RowId, Partial<T>>();\n let added: T[] = [];\n const removed = new Map<RowId, T>();\n const errors = new Map<string, string>();\n let made = 0;\n let active: { id: RowId; key: string } | null = null;\n let editing: { id: RowId; key: string; editor: HTMLElement; cell: HTMLTableCellElement; done: (save: boolean, move?: 'down' | 'right' | 'left' | null) => boolean } | null = null;\n let saving = false;\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n\n const isEditable = (column: EditableColumn<T> | undefined) => Boolean(column && column.editable !== false && !column.render);\n const columnOf = (key: string) => columns.find((column) => column.key === key);\n const kindOf = (column: EditableColumn<T>): EditorKind =>\n column.editor ?? (column.type === 'number' ? 'number' : column.type === 'date' ? 'date' : column.type === 'select' ? 'select' : column.type === 'boolean' ? 'checkbox' : 'text');\n const cellKey = (id: RowId, key: string) => `${id}\\u0000${key}`;\n const merged = (row: T): T => {\n const patch = edits.get(idOf(row));\n return patch ? { ...row, ...patch } : row;\n };\n const display = () => [...added.map(merged), ...base.filter((row) => !removed.has(idOf(row))).map(merged)];\n const originalOf = (id: RowId) => base.find((row) => idOf(row) === id) ?? null;\n const isNew = (id: RowId) => added.some((row) => idOf(row) === id);\n\n const changes = (): RowChange<T>[] => {\n const list: RowChange<T>[] = [];\n for (const row of added) list.push({ id: idOf(row), row: merged(row), changes: { ...merged(row) }, isNew: true });\n for (const row of base) {\n const id = idOf(row);\n if (removed.has(id)) {\n list.push({ id, row, changes: {}, removed: true });\n continue;\n }\n const patch = edits.get(id);\n if (patch && Object.keys(patch).length) list.push({ id, row: merged(row), changes: { ...patch } });\n }\n return list;\n };\n const dirtyCount = () => changes().reduce((sum, change) => sum + (change.isNew || change.removed ? 1 : Object.keys(change.changes).length), 0);\n\n // ── The table underneath ─────────────────────────────────────────────────\n const userRender = options.onRender;\n // The table draws once while it is made, before the cells can be decorated: that first time is done below.\n let ready = false;\n const table = createDataTable<T>(root, {\n ...options,\n columns,\n rows: display(),\n rowKey,\n onRender: (body) => {\n if (ready) decorate(body);\n userRender?.(body);\n },\n });\n scope.add(() => table.destroy());\n const tableElement = table.body.closest('table')!;\n const scroll = root.querySelector<HTMLElement>('[data-mk-dt-scroll]')!;\n scope.attr(tableElement, 'role', 'grid');\n scope.attr(root, 'data-mk-editable', '');\n\n // The ring that glides between cells.\n const ring = document.createElement('span');\n ring.dataset.mkEtRing = '';\n ring.setAttribute('aria-hidden', 'true');\n scroll.append(ring);\n\n // The bar of pending changes, folded until there are some.\n const bar = document.createElement('div');\n bar.dataset.mkEtSave = '';\n bar.hidden = true;\n const barText = document.createElement('span');\n barText.dataset.mkEtSaveText = '';\n const barCount = document.createElement('span');\n barCount.dataset.mkEtSaveCount = '';\n const barLabel = document.createElement('span');\n barText.append(barCount, barLabel);\n const barError = document.createElement('span');\n barError.dataset.mkEtError = '';\n barError.setAttribute('role', 'alert');\n const discardButton = document.createElement('button');\n discardButton.type = 'button';\n discardButton.dataset.mkEtDiscard = '';\n discardButton.textContent = 'Descartar';\n const saveButton = document.createElement('button');\n saveButton.type = 'button';\n saveButton.dataset.mkEtSaveButton = '';\n saveButton.textContent = 'Guardar';\n bar.append(barText, barError, discardButton, saveButton);\n scroll.before(bar);\n let addButton: HTMLButtonElement | null = null;\n if (options.newRow) {\n addButton = document.createElement('button');\n addButton.type = 'button';\n addButton.dataset.mkDtTool = '';\n addButton.dataset.mkEtAdd = '';\n addButton.innerHTML = '<svg aria-hidden=\"true\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg>';\n addButton.append(Object.assign(document.createElement('span'), { textContent: 'Agregar fila' }));\n root.querySelector('[data-mk-dt-tools]')?.prepend(addButton);\n }\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n root.append(status);\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n ring.remove();\n bar.remove();\n addButton?.remove();\n status.remove();\n });\n\n // ── Cells ────────────────────────────────────────────────────────────────\n const dataCells = (body: HTMLTableSectionElement = table.body) => [...body.querySelectorAll<HTMLTableCellElement>('td[data-key]')];\n const cellOf = (id: RowId, key: string) => table.cellOf(id, key);\n const positionOf = (cell: HTMLTableCellElement) => {\n const tr = cell.parentElement as HTMLTableRowElement;\n const rows = [...table.body.rows].filter((row) => row.dataset.id !== undefined);\n const cells = [...tr.cells].filter((each) => each.dataset.key !== undefined);\n return { row: rows.indexOf(tr), column: cells.indexOf(cell), rows, cells };\n };\n const idFromCell = (cell: HTMLTableCellElement): RowId | null => {\n const raw = (cell.parentElement as HTMLElement).dataset.id;\n if (raw === undefined) return null;\n const row = table.rows.find((each) => String(idOf(each)) === raw);\n return row ? idOf(row) : null;\n };\n\n let restoreFocus = false;\n /** Every time the rows are drawn: roles, the roving cell, marks of changes and errors. */\n const decorate = (body: HTMLTableSectionElement) => {\n for (const tr of body.rows) if (tr.dataset.id !== undefined) tr.setAttribute('aria-rowindex', String(tr.sectionRowIndex + 2));\n const cells = dataCells(body);\n for (const cell of cells) {\n const column = columnOf(cell.dataset.key!);\n const id = idFromCell(cell);\n cell.tabIndex = -1;\n cell.toggleAttribute('data-mk-et-editable', isEditable(column));\n if (isEditable(column)) cell.setAttribute('aria-readonly', 'false');\n else cell.setAttribute('aria-readonly', 'true');\n if (id === null || !column) continue;\n const original = originalOf(id);\n const current = table.rows.find((row) => idOf(row) === id);\n const dirty = isNew(id) || Boolean(original && current && !sameValue(original[column.key], current[column.key]));\n cell.toggleAttribute('data-mk-et-dirty', dirty);\n const error = errors.get(cellKey(id, column.key));\n cell.toggleAttribute('data-mk-et-invalid', Boolean(error));\n if (error) cell.title = error;\n else cell.removeAttribute('title');\n }\n for (const tr of body.rows) tr.toggleAttribute('data-mk-et-new', tr.dataset.id !== undefined && added.some((row) => String(idOf(row)) === tr.dataset.id));\n // The roving cell: the active one if it is on this page, else the first.\n let target = active ? (cellOf(active.id, active.key) ?? null) : null;\n if (!target) {\n target = cells[0] ?? null;\n if (target) {\n const id = idFromCell(target);\n active = id === null ? null : { id, key: target.dataset.key! };\n }\n }\n if (target) target.tabIndex = 0;\n if (restoreFocus && target) {\n restoreFocus = false;\n target.focus({ preventScroll: true });\n }\n placeRing(false);\n };\n\n const placeRing = (animate: boolean) => {\n const cell = active ? cellOf(active.id, active.key) : null;\n const focused = cell && (document.activeElement === cell || cell.contains(document.activeElement));\n if (!cell || !focused) {\n ring.style.opacity = '0';\n return;\n }\n // While rows glide (a transform on the row), the row becomes the cell's offset parent: measure through it.\n const row = cell.parentElement as HTMLElement;\n const inRow = cell.offsetParent === row;\n const target = {\n x: (inRow ? row.offsetLeft : 0) + cell.offsetLeft + tableElement.offsetLeft,\n y: (inRow ? row.offsetTop : 0) + cell.offsetTop + tableElement.offsetTop,\n width: cell.offsetWidth,\n height: cell.offsetHeight,\n };\n const shown = ring.style.opacity === '1';\n ring.style.opacity = '1';\n if (!animate || !shown || reduced()) {\n gsap.killTweensOf(ring);\n gsap.set(ring, target);\n return;\n }\n keep(gsap.to(ring, { ...target, duration: 0.22, ease: EASE.swatch, overwrite: 'auto' }));\n };\n\n const focusCell = (cell: HTMLTableCellElement | null | undefined, animate = true) => {\n if (!cell) return;\n const id = idFromCell(cell);\n if (id === null) return;\n for (const each of dataCells()) each.tabIndex = each === cell ? 0 : -1;\n active = { id, key: cell.dataset.key! };\n cell.focus({ preventScroll: true });\n cell.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n placeRing(animate);\n };\n\n // ── Values ───────────────────────────────────────────────────────────────\n const parse = (column: EditableColumn<T>, raw: unknown): unknown => {\n const kind = kindOf(column);\n if (kind === 'checkbox') return Boolean(raw);\n if (typeof raw !== 'string') return raw;\n const text = raw.trim();\n if (kind === 'number') {\n if (!text) return null;\n // \"1250,5\" and \"1,250.50\" both mean what they say.\n const normal = text.includes(',') && !text.includes('.') ? text.replace(',', '.') : text.replace(/,/g, '');\n const value = Number(normal);\n return Number.isFinite(value) ? value : NaN;\n }\n return text;\n };\n const problemWith = (column: EditableColumn<T>, value: unknown, row: T): string | null => {\n const empty = value === null || value === undefined || value === '';\n if (column.required && empty) return `${column.label}: escribe un valor`;\n if (kindOf(column) === 'number' && typeof value === 'number' && Number.isNaN(value)) return `${column.label}: escribe un número`;\n if (typeof value === 'number' && column.min !== undefined && value < column.min) return `${column.label}: el mínimo es ${column.min}`;\n if (typeof value === 'number' && column.max !== undefined && value > column.max) return `${column.label}: el máximo es ${column.max}`;\n if (kindOf(column) === 'date' && !empty && !toTime(value as string)) return `${column.label}: la fecha no es válida`;\n const custom = column.validate?.(value, row);\n return custom ? String(custom) : null;\n };\n\n const report = () => {\n const list = changes();\n options.onChange?.(list);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { changes: list } }));\n };\n\n /** A cell's new value comes in out of a light blur (no movement: it is a table cell). */\n const fadeCell = (cell: HTMLElement) => keep(gsap.fromTo(cell, { opacity: 0.4, filter: 'blur(4px)' }, { opacity: 1, filter: 'blur(0px)', duration: 0.3, ease: 'power1.out', clearProps: 'opacity,filter' }));\n /** Why a value cannot go in a cell (null when it can). */\n const check = (id: RowId, key: string, raw: unknown): string | null => {\n const column = columnOf(key);\n const current = table.rows.find((row) => idOf(row) === id);\n if (!column || !current) return 'Esa celda no existe';\n const value = parse(column, raw);\n return problemWith(column, value, { ...current, [key]: value } as T);\n };\n /** Put a value in a cell; false (and a reason) when it does not pass. */\n const setValue = (id: RowId, key: string, raw: unknown, animate = true): boolean => {\n const column = columnOf(key);\n const current = table.rows.find((row) => idOf(row) === id);\n if (!column || !current) return false;\n const value = parse(column, raw);\n const problem = problemWith(column, value, { ...current, [key]: value } as T);\n if (problem) {\n errors.set(cellKey(id, key), problem);\n barError.textContent = problem;\n paintBar(animate);\n return false;\n }\n errors.delete(cellKey(id, key));\n barError.textContent = [...errors.values()][0] ?? '';\n const original = originalOf(id);\n const patch = { ...(edits.get(id) ?? {}) } as Partial<T>;\n if (original && sameValue(original[key], value)) delete patch[key as keyof T];\n else (patch as Record<string, unknown>)[key] = value;\n if (Object.keys(patch).length) edits.set(id, patch);\n else edits.delete(id);\n const wasDirty = cellOf(id, key)?.hasAttribute('data-mk-et-dirty') ?? false;\n // Redrawn rows are new elements: the focus comes back to the active cell.\n const focused = document.activeElement;\n restoreFocus = Boolean(focused && table.body.contains(focused));\n table.setRows(display());\n const cell = cellOf(id, key);\n if (cell && animate && !reduced()) {\n fadeCell(cell);\n if (!wasDirty && cell.hasAttribute('data-mk-et-dirty')) cell.setAttribute('data-mk-et-pop', '');\n }\n paintBar(animate);\n report();\n return true;\n };\n\n // ── Editing ──────────────────────────────────────────────────────────────\n const startEdit = (cell: HTMLTableCellElement, typed?: string) => {\n if (saving) return;\n const column = columnOf(cell.dataset.key!);\n const id = idFromCell(cell);\n if (!isEditable(column) || id === null) {\n if (column && !isEditable(column)) keep(shake(cell, 3));\n return;\n }\n finishEdit(true);\n const row = table.rows.find((each) => idOf(each) === id)!;\n const value = row[column!.key];\n const kind = kindOf(column!);\n // A check flips at once: no editor.\n if (kind === 'checkbox') {\n setValue(id, column!.key, !value);\n return;\n }\n let editor: HTMLInputElement | HTMLSelectElement;\n if (kind === 'select') {\n const select = document.createElement('select');\n for (const option of column!.options ?? []) {\n const element = document.createElement('option');\n element.value = option.value;\n element.textContent = option.label;\n select.append(element);\n }\n select.value = String(value ?? '');\n editor = select;\n } else {\n const input = document.createElement('input');\n input.type = kind === 'number' ? 'text' : kind === 'date' ? 'date' : 'text';\n if (kind === 'number') input.inputMode = 'decimal';\n const date = kind === 'date' ? toTime(value as string) : null;\n input.value = typed ?? (date ? `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}` : value === null || value === undefined ? '' : String(value));\n editor = input;\n }\n editor.dataset.mkEtEditor = '';\n editor.setAttribute('aria-label', `${column!.label}, editar`);\n const previous = [...cell.childNodes];\n cell.replaceChildren(editor);\n cell.setAttribute('data-mk-et-editing', '');\n editor.focus();\n if (editor instanceof HTMLInputElement && editor.type === 'text') {\n if (typed === undefined) editor.select();\n else editor.setSelectionRange(editor.value.length, editor.value.length);\n }\n if (!reduced()) keep(gsap.fromTo(editor, { scale: 0.96, opacity: 0.4 }, { scale: 1, opacity: 1, duration: 0.25, ease: EASE.pop, clearProps: 'transform,opacity' }));\n const done = (save: boolean, move: 'down' | 'right' | 'left' | null = null) => {\n if (!editing || editing.editor !== editor) return true;\n if (save) {\n const problem = check(id, column!.key, editor.value);\n if (problem) {\n errors.set(cellKey(id, column!.key), problem);\n barError.textContent = problem;\n paintBar(true);\n editor.setAttribute('aria-invalid', 'true');\n keep(shake(editor));\n status.textContent = problem;\n return false;\n }\n }\n // Done before the table redraws (the editor goes with the old cell).\n editing = null;\n if (save) setValue(id, column!.key, editor.value);\n else {\n cell.replaceChildren(...previous);\n cell.removeAttribute('data-mk-et-editing');\n errors.delete(cellKey(id, column!.key));\n barError.textContent = [...errors.values()][0] ?? '';\n paintBar(true);\n }\n // After a save the table drew the row again: find the cell anew, then move.\n restoreFocus = false;\n const fresh = cellOf(id, column!.key);\n if (fresh) focusCell(fresh, false);\n if (move) moveFrom(fresh ?? cell, move);\n return true;\n };\n editing = { id, key: column!.key, editor, cell, done };\n editor.addEventListener('keydown', (event) => {\n const key = event as KeyboardEvent;\n key.stopPropagation();\n if (key.key === 'Enter') {\n key.preventDefault();\n done(true, 'down');\n } else if (key.key === 'Escape') {\n key.preventDefault();\n done(false);\n } else if (key.key === 'Tab') {\n key.preventDefault();\n done(true, key.shiftKey ? 'left' : 'right');\n }\n });\n editor.addEventListener('input', () => editor.removeAttribute('aria-invalid'));\n // Leaving the editor keeps a good value and drops a wrong one.\n editor.addEventListener('blur', () => {\n if (!done(true)) done(false);\n });\n };\n const finishEdit = (save: boolean) => editing?.done(save);\n\n const moveFrom = (cell: HTMLTableCellElement, move: 'down' | 'right' | 'left' | 'up') => {\n const { row, column, rows, cells } = positionOf(cell);\n if (move === 'right' || move === 'left') {\n const step = move === 'right' ? 1 : -1;\n const next = cells[column + step];\n if (next) return focusCell(next);\n // Past the end of a row: the next row's first cell (or the previous row's last).\n const otherRow = rows[row + step];\n const otherCells = otherRow ? [...otherRow.cells].filter((each) => each.dataset.key !== undefined) : [];\n return focusCell(move === 'right' ? otherCells[0] : otherCells[otherCells.length - 1]);\n }\n const otherRow = rows[row + (move === 'down' ? 1 : -1)];\n if (otherRow) focusCell([...otherRow.cells].filter((each) => each.dataset.key !== undefined)[column]);\n };\n\n // ── The bar ──────────────────────────────────────────────────────────────\n let barShown = false;\n const paintBar = (animate: boolean) => {\n const count = dirtyCount();\n const show = count > 0 || errors.size > 0;\n const text = String(count);\n if (barCount.textContent !== text) {\n if (barShown && animate && !reduced() && barCount.textContent) keep(rollDigits(barCount, text, count > Number(barCount.textContent) ? 1 : -1, 0.3));\n else barCount.textContent = text;\n }\n barLabel.textContent = count === 1 ? ' cambio sin guardar' : ' cambios sin guardar';\n saveButton.disabled = errors.size > 0 || !count || saving;\n discardButton.disabled = saving;\n barError.hidden = !barError.textContent;\n if (show === barShown) return;\n barShown = show;\n gsap.killTweensOf(bar);\n if (show) {\n bar.hidden = false;\n if (animate && !reduced()) keep(gsap.fromTo(bar, { height: 0, opacity: 0, filter: 'blur(6px)', overflow: 'hidden' }, { height: 'auto', opacity: 1, filter: 'blur(0px)', duration: 0.3, ease: EASE.signature, clearProps: 'height,opacity,filter,overflow' }));\n } else if (animate && !reduced()) {\n keep(gsap.to(bar, { height: 0, opacity: 0, overflow: 'hidden', duration: 0.24, ease: 'power2.in', onComplete: () => {\n bar.hidden = true;\n gsap.set(bar, { clearProps: 'height,opacity,overflow' });\n } }));\n } else bar.hidden = true;\n };\n\n const save = async (): Promise<boolean> => {\n finishEdit(true);\n if (saving || errors.size || !dirtyCount()) return false;\n saving = true;\n const list = changes();\n const rows = display();\n saveButton.setAttribute('aria-busy', 'true');\n saveButton.textContent = 'Guardando…';\n paintBar(true);\n keep(press(saveButton));\n try {\n await options.onSave?.(list, rows);\n } catch {\n if (scope.disposed) return false;\n saving = false;\n saveButton.removeAttribute('aria-busy');\n saveButton.textContent = 'Guardar';\n barError.textContent = 'No se pudo guardar: los cambios siguen aquí';\n paintBar(true);\n keep(shake(bar));\n status.textContent = barError.textContent;\n return false;\n }\n if (scope.disposed) return true;\n // What was saved is the new starting point.\n const flashed = dataCells().filter((cell) => cell.hasAttribute('data-mk-et-dirty'));\n base = rows.map((row) => ({ ...row }));\n added = [];\n edits.clear();\n removed.clear();\n saving = false;\n saveButton.removeAttribute('aria-busy');\n saveButton.textContent = 'Guardar';\n barError.textContent = '';\n status.textContent = plural(list.length, 'fila guardada', 'filas guardadas');\n const ids = flashed.map((cell) => `${(cell.parentElement as HTMLElement).dataset.id}\\u0000${cell.dataset.key}`);\n table.setRows(display());\n if (!reduced()) {\n for (const cell of dataCells()) {\n if (ids.includes(`${(cell.parentElement as HTMLElement).dataset.id}\\u0000${cell.dataset.key}`)) cell.setAttribute('data-mk-et-saved', '');\n }\n scope.timeout(() => dataCells().forEach((cell) => cell.removeAttribute('data-mk-et-saved')), 1400);\n }\n paintBar(true);\n report();\n root.dispatchEvent(new CustomEvent('mk:save', { bubbles: true, detail: { changes: list } }));\n return true;\n };\n\n const discard = () => {\n finishEdit(false);\n if (!dirtyCount() && !errors.size) return;\n const touched = dataCells().filter((cell) => cell.hasAttribute('data-mk-et-dirty')).map((cell) => `${(cell.parentElement as HTMLElement).dataset.id}\\u0000${cell.dataset.key}`);\n edits.clear();\n added = [];\n removed.clear();\n errors.clear();\n barError.textContent = '';\n table.setRows(display());\n if (!reduced()) for (const cell of dataCells()) if (touched.includes(`${(cell.parentElement as HTMLElement).dataset.id}\\u0000${cell.dataset.key}`)) fadeCell(cell);\n status.textContent = 'Cambios descartados';\n paintBar(true);\n report();\n };\n\n const addRow = (values?: Partial<T>): RowId => {\n finishEdit(true);\n const fresh = { ...(options.newRow?.() ?? {}), ...(values ?? {}) } as T;\n const key = typeof rowKey === 'string' ? rowKey : 'id';\n let id = idOf(fresh);\n if (id === undefined || id === null || id === '') {\n id = `${uid}-new-${++made}`;\n (fresh as Record<string, unknown>)[key] = id;\n }\n added = [fresh, ...added];\n table.sortBy(null);\n table.setQuery('');\n table.setPage(0);\n table.setRows(display());\n const tr = table.rowOf(id);\n if (tr && !reduced()) keep(gsap.fromTo(tr, { opacity: 0, y: -12 }, { opacity: 1, y: 0, duration: 0.35, ease: 'power2.out', clearProps: 'opacity,transform' }));\n paintBar(true);\n report();\n status.textContent = 'Fila nueva';\n const first = columns.find(isEditable);\n const cell = first ? cellOf(id, first.key) : null;\n if (cell) {\n focusCell(cell, false);\n startEdit(cell);\n }\n return id;\n };\n\n // ── Pointer and keyboard ─────────────────────────────────────────────────\n scope.on(table.body, 'click', (event) => {\n const cell = (event.target as Element | null)?.closest<HTMLTableCellElement>('td[data-key]');\n if (!cell || cell.hasAttribute('data-mk-et-editing')) return;\n focusCell(cell);\n });\n scope.on(table.body, 'dblclick', (event) => {\n const cell = (event.target as Element | null)?.closest<HTMLTableCellElement>('td[data-key]');\n if (cell && !cell.hasAttribute('data-mk-et-editing')) startEdit(cell);\n });\n scope.on(table.body, 'focusin', (event) => {\n const cell = (event.target as Element | null)?.closest<HTMLTableCellElement>('td[data-key]');\n if (!cell) return;\n const id = idFromCell(cell);\n if (id !== null) active = { id, key: cell.dataset.key! };\n placeRing(true);\n });\n scope.on(table.body, 'focusout', () => {\n scope.timeout(() => {\n if (!table.body.contains(document.activeElement)) ring.style.opacity = '0';\n }, 0);\n });\n scope.on(table.body, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const cell = (key.target as Element | null)?.closest<HTMLTableCellElement>('td[data-key]');\n if (!cell || cell !== key.target) return;\n const command = key.ctrlKey || key.metaKey;\n const { rows, cells } = positionOf(cell);\n switch (key.key) {\n case 'ArrowRight':\n key.preventDefault();\n return focusCell(cells[cells.indexOf(cell) + 1]);\n case 'ArrowLeft':\n key.preventDefault();\n return focusCell(cells[cells.indexOf(cell) - 1]);\n case 'ArrowDown':\n key.preventDefault();\n return moveFrom(cell, 'down');\n case 'ArrowUp':\n key.preventDefault();\n return moveFrom(cell, 'up');\n case 'Home': {\n key.preventDefault();\n const row = command ? rows[0] : (cell.parentElement as HTMLTableRowElement);\n return focusCell(row ? [...row.cells].find((each) => each.dataset.key !== undefined) : undefined);\n }\n case 'End': {\n key.preventDefault();\n const row = command ? rows[rows.length - 1] : (cell.parentElement as HTMLTableRowElement);\n const all = row ? [...row.cells].filter((each) => each.dataset.key !== undefined) : [];\n return focusCell(all[all.length - 1]);\n }\n case 'Enter':\n case 'F2':\n key.preventDefault();\n return startEdit(cell);\n case 'Delete':\n case 'Backspace': {\n key.preventDefault();\n const column = columnOf(cell.dataset.key!);\n const id = idFromCell(cell);\n if (id === null || !isEditable(column)) return;\n if (kindOf(column!) === 'checkbox') return;\n if (!setValue(id, column!.key, '')) {\n keep(shake(cell, 3));\n status.textContent = barError.textContent ?? '';\n }\n return;\n }\n case ' ': {\n const column = columnOf(cell.dataset.key!);\n if (column && kindOf(column) === 'checkbox') {\n key.preventDefault();\n startEdit(cell);\n }\n return;\n }\n }\n // Typing starts the editor with what was typed.\n if (!command && !key.altKey && key.key.length === 1) {\n const column = columnOf(cell.dataset.key!);\n if (column && isEditable(column) && ['text', 'number'].includes(kindOf(column))) {\n key.preventDefault();\n startEdit(cell, key.key);\n }\n }\n });\n scope.on(root, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if ((key.ctrlKey || key.metaKey) && key.key.toLowerCase() === 's') {\n key.preventDefault();\n void save();\n }\n });\n scope.on(saveButton, 'click', () => void save());\n scope.on(discardButton, 'click', discard);\n if (addButton) {\n const button = addButton;\n scope.on(button, 'click', () => {\n keep(press(button));\n addRow();\n });\n }\n\n ready = true;\n decorate(table.body);\n\n return {\n edit(id, key) {\n const cell = cellOf(id, key);\n if (!cell) return;\n focusCell(cell, false);\n startEdit(cell);\n },\n setValue: (id, key, value) => setValue(id, key, value),\n addRow,\n removeRows(ids) {\n finishEdit(false);\n for (const id of ids) {\n if (isNew(id)) added = added.filter((row) => idOf(row) !== id);\n else {\n const row = originalOf(id);\n if (row) removed.set(id, row);\n }\n edits.delete(id);\n for (const key of [...errors.keys()]) if (key.startsWith(`${id}\\u0000`)) errors.delete(key);\n }\n table.removeRows(ids);\n paintBar(true);\n report();\n },\n save,\n discard,\n setRows(rows) {\n if (scope.disposed) return;\n finishEdit(false);\n base = [...rows];\n edits.clear();\n added = [];\n removed.clear();\n errors.clear();\n barError.textContent = '';\n table.setRows(display());\n paintBar(false);\n },\n get changes() {\n return changes();\n },\n get dirty() {\n return dirtyCount() > 0;\n },\n get rows() {\n return display();\n },\n table,\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { press, shake } from '../../motion/micro';\n\n/*\n * Rich text editor: a writing area with a toolbar for bold, italic,\n * underline, strikethrough, headings, lists, quotes, code and links. Buttons\n * press with a bounce, and the formats under the caret light up as it moves\n * (their pill grows in). Shortcuts: Ctrl/⌘+B, I, U, K, Shift+X (strikethrough),\n * Ctrl/⌘+Z and Y. Markdown as you type: \"# \" and \"## \" make headings, \"- \" or\n * \"* \" a list, \"1. \" a numbered one, \"> \" a quote, **bold** and `code` inline.\n * Pasted text keeps only safe formatting (no styles, classes or scripts). The\n * link editor grows out of its button; the counter turns red and the area\n * shakes once when it passes maxLength. A hidden field carries the HTML for\n * forms; the placeholder fades.\n */\n\nexport type RichCommand = 'bold' | 'italic' | 'underline' | 'strike' | 'h2' | 'h3' | 'ul' | 'ol' | 'quote' | 'code' | 'link' | 'clear' | 'undo' | 'redo';\n\nexport interface RichTextEditorOptions {\n /** The first content, as HTML (cleaned like a paste). */\n value?: string;\n placeholder?: string;\n /** The buttons, in order; '|' separates groups (default: all). */\n toolbar?: Array<RichCommand | '|'>;\n /** Characters before the counter turns red (the text can go on). */\n maxLength?: number;\n /** 'words' (default), 'characters', or false. */\n counter?: 'words' | 'characters' | false;\n /** A hidden field with this name carries the HTML. */\n name?: string;\n /** Accessible name of the writing area (default 'Editor de texto'). */\n label?: string;\n readOnly?: boolean;\n /** Markdown shortcuts while typing (default true). */\n markdown?: boolean;\n onChange?: (html: string, text: string) => void;\n}\n\nexport interface RichTextEditorInstance extends Instance {\n setValue(html: string): void;\n focus(): void;\n exec(command: RichCommand, value?: string): void;\n readonly value: string;\n readonly text: string;\n readonly element: HTMLElement;\n}\n\nconst SVG = (paths: string) =>\n `<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\">${paths}</svg>`;\nconst BUTTONS: Record<RichCommand, { label: string; keys?: string; icon: string; toggle?: boolean }> = {\n bold: { label: 'Negrita', keys: 'Ctrl+B', toggle: true, icon: SVG('<path d=\"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z\"/>') },\n italic: { label: 'Cursiva', keys: 'Ctrl+I', toggle: true, icon: SVG('<path d=\"M14 5h-4M14 19h-4M14 5l-4 14\"/>') },\n underline: { label: 'Subrayado', keys: 'Ctrl+U', toggle: true, icon: SVG('<path d=\"M7 4v7a5 5 0 0 0 10 0V4M5 20h14\"/>') },\n strike: { label: 'Tachado', keys: 'Ctrl+Mayús+X', toggle: true, icon: SVG('<path d=\"M5 12h14M16 6.5A4 4 0 0 0 12.5 5h-1A3.5 3.5 0 0 0 8 8.5c0 1.5 1 2.6 2.6 3.1M8 17.5A4 4 0 0 0 11.5 19h1a3.5 3.5 0 0 0 3.5-3.5\"/>') },\n h2: { label: 'Título', toggle: true, icon: SVG('<path d=\"M4 6v12M12 6v12M4 12h8M16 10l3-2v10\"/>') },\n h3: { label: 'Subtítulo', toggle: true, icon: SVG('<path d=\"M4 6v12M12 6v12M4 12h8M16 8.5a2.5 2.5 0 1 1 2.5 3.5 2.5 2.5 0 1 1-2.5 3.5\"/>') },\n ul: { label: 'Lista', toggle: true, icon: SVG('<path d=\"M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01\"/>') },\n ol: { label: 'Lista numerada', toggle: true, icon: SVG('<path d=\"M10 6h10M10 12h10M10 18h10M4 5l1.5-1v5M3.5 13.5a1.5 1.5 0 0 1 3 .5c0 1-3 2-3 3h3\"/>') },\n quote: { label: 'Cita', toggle: true, icon: SVG('<path d=\"M7 7h4v6a4 4 0 0 1-4 4M15 7h4v6a4 4 0 0 1-4 4\"/>') },\n code: { label: 'Código', toggle: true, icon: SVG('<path d=\"M9 8l-4 4 4 4M15 8l4 4-4 4\"/>') },\n link: { label: 'Enlace', keys: 'Ctrl+K', toggle: true, icon: SVG('<path d=\"M10 14a4 4 0 0 0 5.66 0l3-3a4 4 0 0 0-5.66-5.66l-1 1M14 10a4 4 0 0 0-5.66 0l-3 3a4 4 0 0 0 5.66 5.66l1-1\"/>') },\n clear: { label: 'Quitar formato', icon: SVG('<path d=\"M6 5h12M12 5l-3 14M15.5 15.5l4 4M19.5 15.5l-4 4\"/>') },\n undo: { label: 'Deshacer', keys: 'Ctrl+Z', icon: SVG('<path d=\"M9 7L4 12l5 5M4 12h11a5 5 0 0 1 0 10h-2\"/>') },\n redo: { label: 'Rehacer', keys: 'Ctrl+Y', icon: SVG('<path d=\"M15 7l5 5-5 5M20 12H9a5 5 0 0 0 0 10h2\"/>') },\n};\nconst DEFAULT_TOOLBAR: Array<RichCommand | '|'> = ['bold', 'italic', 'underline', 'strike', '|', 'h2', 'h3', '|', 'ul', 'ol', 'quote', 'code', '|', 'link', 'clear', '|', 'undo', 'redo'];\nconst ZWSP = '';\n\n// ── Cleaning HTML ──────────────────────────────────────────────────────────\nconst KEEP: Record<string, string> = {\n p: 'p', div: 'p', br: 'br', strong: 'strong', b: 'strong', em: 'em', i: 'em', u: 'u', s: 's', strike: 's', del: 's',\n h1: 'h2', h2: 'h2', h3: 'h3', h4: 'h3', h5: 'h3', h6: 'h3', ul: 'ul', ol: 'ol', li: 'li', blockquote: 'blockquote', code: 'code', pre: 'pre', a: 'a',\n};\nconst DROP = new Set(['script', 'style', 'meta', 'link', 'iframe', 'object', 'embed', 'template', 'noscript', 'svg', 'math', 'head', 'title', 'form', 'input', 'button', 'select', 'textarea']);\nconst SAFE_URL = /^(https?:|mailto:|tel:|#|\\/|\\.{0,2}\\/)/i;\n\n/** HTML with only safe formatting: known tags (renamed to their kind), links with safe addresses, no attributes else. */\nexport function sanitizeHtml(html: string): string {\n if (typeof DOMParser === 'undefined') return '';\n const source = new DOMParser().parseFromString(`<body>${html}</body>`, 'text/html').body;\n const out = document.createElement('div');\n const copy = (from: Node, into: Node) => {\n for (const node of from.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n into.appendChild(document.createTextNode((node.textContent ?? '').replace(new RegExp(ZWSP, 'g'), '')));\n continue;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n const element = node as Element;\n const tag = element.tagName.toLowerCase();\n if (DROP.has(tag)) continue;\n const kind = KEEP[tag];\n // Unknown wrappers (span, font, section…) give their content.\n if (!kind) {\n copy(element, into);\n continue;\n }\n const made = document.createElement(kind);\n if (kind === 'a') {\n const href = element.getAttribute('href')?.trim() ?? '';\n if (!SAFE_URL.test(href)) {\n copy(element, into);\n continue;\n }\n made.setAttribute('href', href);\n if (/^https?:/i.test(href)) {\n made.setAttribute('target', '_blank');\n made.setAttribute('rel', 'noopener noreferrer');\n }\n }\n copy(element, made);\n into.appendChild(made);\n }\n };\n copy(source, out);\n return out.innerHTML;\n}\n\nconst escapeText = (text: string) => {\n const holder = document.createElement('div');\n holder.textContent = text;\n return holder.innerHTML;\n};\n/** Plain text as paragraphs (blank lines) and line breaks. */\nconst textToHtml = (text: string) =>\n text\n .replace(/\\r\\n?/g, '\\n')\n .split(/\\n{2,}/)\n .map((paragraph) => `<p>${escapeText(paragraph).replace(/\\n/g, '<br>')}</p>`)\n .join('');\n\nexport function createRichTextEditor(root: HTMLElement | null, options: RichTextEditorOptions = {}): RichTextEditorInstance {\n if (!root) return inert({ setValue() {}, focus() {}, exec() {}, value: '', text: '', element: null as unknown as HTMLElement });\n registerMotion();\n const scope = createScope();\n const markdown = options.markdown !== false;\n const counterMode = options.counter === false ? null : (options.counter ?? (options.maxLength ? 'characters' : 'words'));\n const effects = new Set<gsap.core.Animation>();\n const keep = (animation: gsap.core.Animation | null) => {\n if (!animation) return;\n effects.add(animation);\n // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.\n for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);\n };\n // What was written inside the root is the first content (unless `value` is given).\n const authored = root.innerHTML;\n const holder = document.createElement('div');\n holder.hidden = true;\n holder.append(...root.childNodes);\n\n // ── The parts ────────────────────────────────────────────────────────────\n const toolbar = document.createElement('div');\n toolbar.dataset.mkRteToolbar = '';\n toolbar.setAttribute('role', 'toolbar');\n toolbar.setAttribute('aria-label', 'Formato');\n const buttons = new Map<RichCommand, HTMLButtonElement>();\n let group = document.createElement('div');\n group.dataset.mkRteGroup = '';\n toolbar.append(group);\n for (const entry of options.toolbar ?? DEFAULT_TOOLBAR) {\n if (entry === '|') {\n group = document.createElement('div');\n group.dataset.mkRteGroup = '';\n toolbar.append(group);\n continue;\n }\n const spec = BUTTONS[entry];\n if (!spec) continue;\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.command = entry;\n const label = spec.keys ? `${spec.label} (${spec.keys})` : spec.label;\n button.setAttribute('aria-label', label);\n button.title = label;\n if (spec.toggle) button.setAttribute('aria-pressed', 'false');\n button.innerHTML = spec.icon;\n button.tabIndex = buttons.size ? -1 : 0;\n group.append(button);\n buttons.set(entry, button);\n }\n const content = document.createElement('div');\n content.dataset.mkRteContent = '';\n content.contentEditable = options.readOnly ? 'false' : 'true';\n content.setAttribute('role', 'textbox');\n content.setAttribute('aria-multiline', 'true');\n content.setAttribute('aria-label', options.label ?? 'Editor de texto');\n content.dataset.placeholder = options.placeholder ?? 'Escribe algo…';\n content.spellcheck = true;\n if (options.readOnly) content.setAttribute('aria-readonly', 'true');\n const foot = document.createElement('div');\n foot.dataset.mkRteFoot = '';\n const counter = document.createElement('span');\n counter.dataset.mkRteCounter = '';\n counter.setAttribute('aria-live', 'polite');\n foot.append(counter);\n foot.hidden = !counterMode;\n let hidden: HTMLInputElement | null = null;\n if (options.name) {\n hidden = document.createElement('input');\n hidden.type = 'hidden';\n hidden.name = options.name;\n foot.append(hidden);\n }\n // The link editor.\n const linkBox = document.createElement('div');\n linkBox.dataset.mkRteLink = '';\n linkBox.hidden = true;\n linkBox.setAttribute('role', 'group');\n linkBox.setAttribute('aria-label', 'Enlace');\n const linkInput = document.createElement('input');\n linkInput.type = 'url';\n linkInput.placeholder = 'https://…';\n linkInput.setAttribute('aria-label', 'Dirección del enlace');\n const linkApply = document.createElement('button');\n linkApply.type = 'button';\n linkApply.dataset.mkRteLinkApply = '';\n linkApply.textContent = 'Aplicar';\n const linkRemove = document.createElement('button');\n linkRemove.type = 'button';\n linkRemove.dataset.mkRteLinkRemove = '';\n linkRemove.textContent = 'Quitar';\n linkBox.append(linkInput, linkApply, linkRemove);\n const status = document.createElement('span');\n status.className = 'mk-sr-only';\n status.setAttribute('role', 'status');\n if (!options.readOnly) root.append(toolbar);\n root.append(content, linkBox, foot, status);\n scope.attr(root, 'data-mk-ready', '');\n if (options.readOnly) scope.attr(root, 'data-mk-readonly', '');\n scope.add(() => {\n for (const effect of effects) effect.kill();\n effects.clear();\n for (const part of [toolbar, content, linkBox, foot, status]) part.remove();\n root.append(...holder.childNodes);\n });\n\n const run = (name: string, value?: string) => {\n if (typeof document.execCommand !== 'function') return false;\n try {\n return document.execCommand(name, false, value);\n } catch {\n return false;\n }\n };\n try {\n document.execCommand?.('defaultParagraphSeparator', false, 'p');\n } catch {\n // Older engines: their default separator stands.\n }\n\n // ── Value ────────────────────────────────────────────────────────────────\n const cleanValue = () => sanitizeHtml(content.innerHTML).replace(/<p><br><\\/p>$/, '').replace(/^<p><\\/p>$/, '');\n const textValue = () => (content.innerText ?? content.textContent ?? '').replace(new RegExp(ZWSP, 'g'), '').replace(/\\n{3,}/g, '\\n\\n').trim();\n const BLOCKS = new Set(['P', 'H2', 'H3', 'UL', 'OL', 'BLOCKQUOTE', 'PRE']);\n const setContent = (html: string) => {\n const holder = document.createElement('div');\n holder.innerHTML = sanitizeHtml(html);\n // Blocks stay; runs of loose text and inline formatting at the top go in paragraphs; blank space between blocks goes.\n const out: Node[] = [];\n let paragraph: HTMLParagraphElement | null = null;\n for (const node of [...holder.childNodes]) {\n if (node.nodeType === Node.ELEMENT_NODE && BLOCKS.has((node as Element).tagName)) {\n paragraph = null;\n out.push(node);\n continue;\n }\n if (node.nodeType === Node.TEXT_NODE && !node.textContent?.trim() && !paragraph) continue;\n if (!paragraph) {\n paragraph = document.createElement('p');\n out.push(paragraph);\n }\n paragraph.append(node);\n }\n content.replaceChildren(...out);\n if (!content.firstChild) content.innerHTML = '<p><br></p>';\n };\n setContent(options.value ?? authored);\n\n let over = false;\n let lastValue = '';\n const paint = (notify: boolean) => {\n const text = textValue();\n content.toggleAttribute('data-empty', !text && !content.querySelector('li, img'));\n if (counterMode) {\n const characters = [...text].length;\n const words = text ? text.split(/\\s+/).filter(Boolean).length : 0;\n if (options.maxLength) {\n counter.textContent = `${characters} / ${options.maxLength}`;\n const now = characters > options.maxLength;\n if (now && !over) {\n keep(shake(content, 3));\n status.textContent = `Pasaste el límite de ${options.maxLength} caracteres`;\n }\n over = now;\n root.toggleAttribute('data-mk-over', now);\n content.setAttribute('aria-invalid', String(now));\n } else counter.textContent = counterMode === 'words' ? `${words} ${words === 1 ? 'palabra' : 'palabras'}` : `${characters} ${characters === 1 ? 'carácter' : 'caracteres'}`;\n }\n const html = cleanValue();\n if (hidden) hidden.value = html;\n if (notify && html !== lastValue) {\n lastValue = html;\n options.onChange?.(html, text);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { html, text } }));\n } else lastValue = html;\n };\n paint(false);\n\n // ── Where the caret is ───────────────────────────────────────────────────\n const selectionInside = () => {\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount) return null;\n const range = selection.getRangeAt(0);\n return content.contains(range.commonAncestorContainer) ? range : null;\n };\n const closest = (node: Node | null, selector: string) => {\n const element = node?.nodeType === Node.ELEMENT_NODE ? (node as Element) : (node?.parentElement ?? null);\n const found = element?.closest(selector);\n return found && content.contains(found) ? (found as HTMLElement) : null;\n };\n const block = (node: Node | null) => closest(node, 'p, h2, h3, li, blockquote, pre');\n const states = (): Partial<Record<RichCommand, boolean>> => {\n const range = selectionInside();\n if (!range) return {};\n const node = range.startContainer;\n const query = (name: string) => {\n try {\n return Boolean(document.queryCommandState?.(name));\n } catch {\n return false;\n }\n };\n return {\n bold: query('bold') || Boolean(closest(node, 'strong, b')),\n italic: query('italic') || Boolean(closest(node, 'em, i')),\n underline: query('underline') || Boolean(closest(node, 'u')),\n strike: query('strikeThrough') || Boolean(closest(node, 's, strike, del')),\n h2: Boolean(closest(node, 'h2')),\n h3: Boolean(closest(node, 'h3')),\n ul: Boolean(closest(node, 'ul')),\n ol: Boolean(closest(node, 'ol')),\n quote: Boolean(closest(node, 'blockquote')),\n code: Boolean(closest(node, 'code')),\n link: Boolean(closest(node, 'a')),\n };\n };\n const paintToolbar = () => {\n const now = states();\n for (const [command, button] of buttons) {\n if (!button.hasAttribute('aria-pressed')) continue;\n button.setAttribute('aria-pressed', String(Boolean(now[command])));\n }\n };\n scope.on(document, 'selectionchange', () => {\n if (selectionInside()) paintToolbar();\n });\n\n // ── Commands ─────────────────────────────────────────────────────────────\n const toggleBlock = (tag: 'h2' | 'h3' | 'blockquote') => {\n const range = selectionInside();\n const inside = range ? closest(range.startContainer, tag) : null;\n run('formatBlock', inside ? '<p>' : `<${tag}>`);\n };\n const toggleCode = () => {\n const range = selectionInside();\n if (!range) return;\n const code = closest(range.startContainer, 'code');\n if (code) {\n // Out of code: its text stays, plain.\n code.replaceWith(...code.childNodes);\n return;\n }\n if (range.collapsed) return;\n const element = document.createElement('code');\n element.textContent = range.toString();\n range.deleteContents();\n range.insertNode(element);\n const after = document.createTextNode(ZWSP);\n element.after(after);\n placeCaret(after, 1);\n };\n const placeCaret = (node: Node, offset: number) => {\n const selection = window.getSelection();\n if (!selection) return;\n const range = document.createRange();\n range.setStart(node, offset);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n };\n\n let savedRange: Range | null = null;\n const openLink = () => {\n const range = selectionInside();\n savedRange = range ? range.cloneRange() : null;\n const current = range ? closest(range.startContainer, 'a') : null;\n linkInput.value = current?.getAttribute('href') ?? '';\n linkRemove.hidden = !current;\n linkBox.hidden = false;\n // Under its button, inside the editor.\n const button = buttons.get('link');\n const rootBox = root.getBoundingClientRect();\n const anchor = button?.getBoundingClientRect();\n if (anchor) {\n linkBox.style.top = `${anchor.bottom - rootBox.top + 6}px`;\n linkBox.style.left = `${Math.max(0, Math.min(anchor.left - rootBox.left, rootBox.width - linkBox.offsetWidth))}px`;\n }\n if (!reduced()) keep(gsap.fromTo(linkBox, { opacity: 0, scale: 0.92, y: -6, filter: 'blur(6px)' }, { opacity: 1, scale: 1, y: 0, filter: 'blur(0px)', duration: 0.28, ease: EASE.pop, transformOrigin: '0% 0%', clearProps: 'opacity,transform,filter' }));\n linkInput.focus();\n linkInput.select();\n };\n const closeLink = (focusBack = true) => {\n if (linkBox.hidden) return;\n const finish = () => {\n linkBox.hidden = true;\n gsap.set(linkBox, { clearProps: 'opacity,transform,filter' });\n };\n if (reduced()) finish();\n else keep(gsap.to(linkBox, { opacity: 0, scale: 0.95, duration: 0.16, ease: 'power1.in', onComplete: finish }));\n if (focusBack) {\n content.focus({ preventScroll: true });\n if (savedRange) {\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(savedRange);\n }\n }\n };\n const applyLink = () => {\n const href = linkInput.value.trim();\n if (href && !SAFE_URL.test(href) && !/^[\\w.-]+\\.[a-z]{2,}/i.test(href)) {\n keep(shake(linkInput));\n status.textContent = 'La dirección no es válida';\n return;\n }\n const url = href && !SAFE_URL.test(href) ? `https://${href}` : href;\n closeLink();\n if (!url) return;\n run('createLink', url);\n // External links open apart and safely.\n if (/^https?:/i.test(url)) {\n for (const anchor of content.querySelectorAll<HTMLAnchorElement>('a[href]')) {\n if (anchor.getAttribute('href') !== url) continue;\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n }\n }\n status.textContent = 'Enlace aplicado';\n paint(true);\n };\n const removeLink = () => {\n closeLink();\n run('unlink');\n status.textContent = 'Enlace quitado';\n paint(true);\n };\n\n const exec = (command: RichCommand, value?: string) => {\n if (options.readOnly) return;\n if (command !== 'link' && !selectionInside()) content.focus({ preventScroll: true });\n switch (command) {\n case 'bold':\n case 'italic':\n case 'underline':\n run(command);\n break;\n case 'strike':\n run('strikeThrough');\n break;\n case 'h2':\n case 'h3':\n toggleBlock(command);\n break;\n case 'quote':\n toggleBlock('blockquote');\n break;\n case 'ul':\n run('insertUnorderedList');\n break;\n case 'ol':\n run('insertOrderedList');\n break;\n case 'code':\n toggleCode();\n break;\n case 'link':\n if (value !== undefined) {\n linkInput.value = value;\n savedRange = selectionInside()?.cloneRange() ?? null;\n applyLink();\n } else openLink();\n return;\n case 'clear':\n run('removeFormat');\n run('formatBlock', '<p>');\n break;\n case 'undo':\n case 'redo':\n run(command);\n break;\n }\n paintToolbar();\n paint(true);\n };\n\n // ── Toolbar: pointer and keyboard ────────────────────────────────────────\n // The editor keeps its selection while a button is pressed.\n scope.on(toolbar, 'mousedown', (event) => {\n if ((event.target as Element).closest('button')) event.preventDefault();\n });\n scope.on(toolbar, 'click', (event) => {\n const button = (event.target as Element | null)?.closest<HTMLButtonElement>('button[data-command]');\n if (!button) return;\n keep(press(button));\n exec(button.dataset.command as RichCommand);\n });\n scope.on(toolbar, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const list = [...buttons.values()];\n const at = list.indexOf(document.activeElement as HTMLButtonElement);\n const moves: Record<string, number> = { ArrowRight: at + 1, ArrowLeft: at - 1, Home: 0, End: list.length - 1 };\n if (!(key in moves) || at < 0) return;\n event.preventDefault();\n const next = list[(moves[key]! + list.length) % list.length]!;\n for (const button of list) button.tabIndex = button === next ? 0 : -1;\n next.focus();\n });\n\n // ── Writing ──────────────────────────────────────────────────────────────\n scope.on(content, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if (!(key.ctrlKey || key.metaKey) || key.altKey) return;\n const letter = key.key.toLowerCase();\n const shortcuts: Record<string, RichCommand> = { b: 'bold', i: 'italic', u: 'underline', k: 'link' };\n let command: RichCommand | undefined = shortcuts[letter];\n if (key.shiftKey && letter === 'x') command = 'strike';\n if (!command || key.shiftKey !== (command === 'strike')) return;\n key.preventDefault();\n const button = buttons.get(command);\n if (button) keep(press(button));\n exec(command);\n });\n\n /** Markdown at the start of a block (\"# \", \"- \", \"1. \", \"> \") and inline (**bold**, `code`). */\n const autoformat = (typed: string) => {\n const range = selectionInside();\n if (!range || !range.collapsed) return;\n const node = range.startContainer;\n if (typed === ' ') {\n const current = block(node);\n if (!current || current.tagName === 'LI' || current.tagName === 'PRE') return;\n // The text from the start of the block to the caret.\n const before = document.createRange();\n before.selectNodeContents(current);\n before.setEnd(range.startContainer, range.startOffset);\n const text = before.toString().replace(new RegExp(ZWSP, 'g'), '');\n const rules: Array<[RegExp, () => void]> = [\n [/^#\\s$/, () => run('formatBlock', '<h2>')],\n [/^##\\s$/, () => run('formatBlock', '<h3>')],\n [/^[-*]\\s$/, () => run('insertUnorderedList')],\n [/^1[.)]\\s$/, () => run('insertOrderedList')],\n [/^>\\s$/, () => run('formatBlock', '<blockquote>')],\n ];\n for (const [pattern, apply] of rules) {\n if (!pattern.test(text)) continue;\n // The marker goes; the format stays.\n before.deleteContents();\n apply();\n current.normalize();\n return true;\n }\n return;\n }\n if ((typed === '*' || typed === '`') && node.nodeType === Node.TEXT_NODE) {\n const text = (node.textContent ?? '').slice(0, range.startOffset);\n const match = typed === '*' ? /\\*\\*([^*]+)\\*\\*$/.exec(text) : /`([^`]+)`$/.exec(text);\n if (!match) return;\n const start = range.startOffset - match[0].length;\n const span = document.createRange();\n span.setStart(node, start);\n span.setEnd(node, range.startOffset);\n span.deleteContents();\n const element = document.createElement(typed === '*' ? 'strong' : 'code');\n element.textContent = match[1]!;\n span.insertNode(element);\n // The caret goes after it, outside of it.\n const after = document.createTextNode(ZWSP);\n element.after(after);\n placeCaret(after, 1);\n // A soft highlight says what just changed.\n if (!reduced()) {\n element.setAttribute('data-mk-rte-fresh', '');\n scope.timeout(() => element.removeAttribute('data-mk-rte-fresh'), 1000);\n }\n return true;\n }\n return;\n };\n\n scope.on(content, 'input', (event) => {\n const input = event as InputEvent;\n if (markdown && input.inputType === 'insertText' && input.data && autoformat(input.data.slice(-1))) {\n const fresh = selectionInside() ? block(selectionInside()!.startContainer) : null;\n if (fresh && !reduced()) keep(gsap.fromTo(fresh, { opacity: 0.4, filter: 'blur(4px)' }, { opacity: 1, filter: 'blur(0px)', duration: 0.3, ease: 'power1.out', clearProps: 'opacity,filter' }));\n status.textContent = 'Formato aplicado';\n }\n // An emptied area keeps a paragraph to write in.\n if (!content.firstElementChild) content.innerHTML = '<p><br></p>';\n paint(true);\n paintToolbar();\n });\n\n scope.on(content, 'paste', (event) => {\n if (options.readOnly) return;\n const clipboard = (event as ClipboardEvent).clipboardData;\n if (!clipboard) return;\n event.preventDefault();\n const html = clipboard.getData('text/html');\n const clean = html ? sanitizeHtml(html) : textToHtml(clipboard.getData('text/plain'));\n if (!run('insertHTML', clean)) {\n // No insertHTML: put it in by hand.\n const range = selectionInside();\n if (range) {\n range.deleteContents();\n const holder = document.createElement('div');\n holder.innerHTML = clean;\n const fragment = document.createDocumentFragment();\n fragment.append(...holder.childNodes);\n range.insertNode(fragment);\n }\n }\n paint(true);\n });\n\n scope.on(linkInput, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n if (key === 'Enter') {\n event.preventDefault();\n applyLink();\n } else if (key === 'Escape') {\n event.preventDefault();\n closeLink();\n }\n });\n scope.on(linkApply, 'click', applyLink);\n scope.on(linkRemove, 'click', removeLink);\n scope.on(document, 'pointerdown', (event) => {\n if (!linkBox.hidden && !linkBox.contains(event.target as Node) && !buttons.get('link')?.contains(event.target as Node)) closeLink(false);\n });\n scope.on(content, 'focus', () => root.setAttribute('data-mk-focused', ''));\n scope.on(content, 'blur', () => root.removeAttribute('data-mk-focused'));\n\n return {\n setValue(html) {\n if (scope.disposed) return;\n setContent(html);\n paint(false);\n },\n focus: () => content.focus(),\n exec,\n get value() {\n return cleanValue();\n },\n get text() {\n return textValue();\n },\n element: content,\n destroy: () => scope.dispose(),\n };\n}\n"],"mappings":"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","names":["time","key","gsap","time","now","running","el","part","id","key","spring","gsap","el","position","el","time","stop","idle","angle","stop","now","pointer","idle","key","PLACED","onMove","stop","now","live","svg","part","current","timer","radiusOf","part","window","list","timeline","list","key","el","STEP","clamp","marked","running","current","el","button","EDGE","GAP","timer","place","el","place","timer","el","day","now","list","day","key","inRange","button","time","number","shown","current","el","SLIDE","SLIDE_DURATION","time","el","button","list","key","current","list","el","angle","DEFAULT_LABELS","sequence","icon","list","button","placeholder","FIELDS","sequence","list","part","marked","place","button","current","key","timer","pointer","sequence","part","clamp","part","shown","finite","list","current","shown","part","same","SVG","GAP","sequence","finite","series","uid","live","shown","list","n","anchor","runs","stop","last","key","number","two","now","valid","FIELDS","sequence","uid","number","valid","key","placeholder","shown","current","brand","signature","name","sequence","el","uid","list","live","shown","key","sequence","button","live","timer","pointer","key","part","list","key","pointer","SVG","button","icon","SVG","button","icon","live","place","CHECK","sequence","part","svg","uid","list","key","live","button","live","pointer","stop","LABELS","sequence","svg","clamp","shown","SLOP","current","button","pointer","clamp","part","key","shown","part","shown","place","shown","place","key","color","shown","key","current","button","time","part","LABELS","part","shown","now","key","current","time","day","el","day","button","short","shown","KEYS","key","sequence","day","uid","button","key","same","clamp","round","place","side","pad","FOCUSABLE","sequence","current","timer","shown","position","place","sequence","open","LABELS","SVG","button","compact","icon","timer","svg","part","list","button","fold","shown","index","svg","part","SVG","el","svg","summary","part","value","finite","number","live","swatch","key","list","chip","key","CHECK","sequence","marked","uid","list","shown","position","place","option","CLEAR","value","chevron","key","fold","sequence","uid","placeholder","message","part","key","CALENDAR_ICON","sequence","pad","uid","day","button","now","segmentsOf","dateOf","part","same","clamp","time","current","sequence","fold","shown","CLOSE","el","summary","key","current","button","number","now","readAuthored","relative","list","time","day","SVG","part","time","key","list","fold","CHEVRON","CHECK","sequence","fold","uid","sequence","box","chevron","CHEVRON","check","CHECK","icon","list","key","now","fold","extension","key","time","SVG","ICONS","ARROW","sequence","icon","extension","uid","current","button","key","list","pathOf","items","part","top","onMove","timer","box","pointer","now","CHECK","SVG","key","shown","plural","textOf","icon","button","valid","sequence","uid","textOf","number","part","key","now","CHEVRON","sequence","round","list","uid","number","button","position","pointer","key","SVG","ICONS","CHECK","plural","sequence","uid","number","textOf","empty","list","column","shown","el","icon","button","part","key","next","same","plural","sequence","uid","key","list","current","shown","save","otherRow","button","SVG","button","part","holder","now","current","key","list"]}
|