@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
|
@@ -3,25 +3,21 @@ import {
|
|
|
3
3
|
Flip,
|
|
4
4
|
bezier,
|
|
5
5
|
channels,
|
|
6
|
-
clearStyles,
|
|
7
6
|
easeInCubic,
|
|
8
7
|
easeOut,
|
|
9
8
|
easeOutCubic,
|
|
10
9
|
eased,
|
|
11
10
|
flowIn,
|
|
12
11
|
flowInPalette,
|
|
13
|
-
flowOut,
|
|
14
12
|
gsap,
|
|
15
13
|
motionSpring,
|
|
16
|
-
nextFrame,
|
|
17
14
|
registerMotion,
|
|
18
|
-
revealCounter,
|
|
19
15
|
revealFrom,
|
|
20
16
|
splitGraphemes,
|
|
21
17
|
splitWords,
|
|
22
18
|
spring,
|
|
23
19
|
springEase
|
|
24
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-CU6SXW3E.js";
|
|
25
21
|
import {
|
|
26
22
|
THEMES,
|
|
27
23
|
THEME_EVENT,
|
|
@@ -688,85 +684,6 @@ function createToaster(host, options = {}) {
|
|
|
688
684
|
};
|
|
689
685
|
}
|
|
690
686
|
|
|
691
|
-
// src/components/chat-background/engine.ts
|
|
692
|
-
var VARS = ["--mk-chat-orbit-1", "--mk-chat-orbit-2", "--mk-chat-blob-opacity", "--mk-chat-scale"];
|
|
693
|
-
var instances = /* @__PURE__ */ new WeakMap();
|
|
694
|
-
var chatBackgroundOf = (el) => el ? instances.get(el) ?? null : null;
|
|
695
|
-
function createChatBackground(root, options = {}) {
|
|
696
|
-
if (!root) {
|
|
697
|
-
warnOnce("chat-background: missing root");
|
|
698
|
-
return inert({ setEnergy() {
|
|
699
|
-
}, setScale() {
|
|
700
|
-
}, busy() {
|
|
701
|
-
}, energy: 0, scale: 1 });
|
|
702
|
-
}
|
|
703
|
-
registerMotion();
|
|
704
|
-
const scope = createScope();
|
|
705
|
-
const state = { energy: options.energy ?? 0, scale: options.scale ?? 1 };
|
|
706
|
-
let noise = root.querySelector(":scope > .mk-chat-background__noise");
|
|
707
|
-
if (!noise) {
|
|
708
|
-
noise = document.createElement("div");
|
|
709
|
-
noise.className = "mk-chat-background__noise";
|
|
710
|
-
noise.setAttribute("aria-hidden", "true");
|
|
711
|
-
root.append(noise);
|
|
712
|
-
const created = noise;
|
|
713
|
-
scope.add(() => created.remove());
|
|
714
|
-
}
|
|
715
|
-
scope.attr(root, "aria-hidden", "true");
|
|
716
|
-
const paint = () => {
|
|
717
|
-
const e = Math.max(0, state.energy);
|
|
718
|
-
root.style.setProperty("--mk-chat-orbit-1", `${Math.max(1, 10 - 3.5 * e).toFixed(3)}s`);
|
|
719
|
-
root.style.setProperty("--mk-chat-orbit-2", `${Math.max(1, 15 - 4.5 * e).toFixed(3)}s`);
|
|
720
|
-
root.style.setProperty("--mk-chat-blob-opacity", (0.5 + 0.15 * e).toFixed(3));
|
|
721
|
-
root.style.setProperty("--mk-chat-scale", ((1 + 0.1 * e) * state.scale).toFixed(3));
|
|
722
|
-
};
|
|
723
|
-
scope.add(() => {
|
|
724
|
-
gsap.killTweensOf(state);
|
|
725
|
-
for (const name of VARS) root.style.removeProperty(name);
|
|
726
|
-
if (root.getAttribute("style") === "") root.removeAttribute("style");
|
|
727
|
-
});
|
|
728
|
-
paint();
|
|
729
|
-
const instance = {
|
|
730
|
-
setEnergy(energy) {
|
|
731
|
-
state.energy = Number.isFinite(energy) ? energy : 0;
|
|
732
|
-
paint();
|
|
733
|
-
},
|
|
734
|
-
setScale(scale) {
|
|
735
|
-
state.scale = Number.isFinite(scale) ? scale : 1;
|
|
736
|
-
paint();
|
|
737
|
-
},
|
|
738
|
-
busy(on) {
|
|
739
|
-
const to = on ? { energy: 1.6, scale: 1.8 } : { energy: 0, scale: 1 };
|
|
740
|
-
gsap.killTweensOf(state);
|
|
741
|
-
if (reduced()) {
|
|
742
|
-
Object.assign(state, to);
|
|
743
|
-
paint();
|
|
744
|
-
return;
|
|
745
|
-
}
|
|
746
|
-
gsap.to(state, {
|
|
747
|
-
...to,
|
|
748
|
-
duration: on ? TIMING.onboarding.busy : TIMING.onboarding.idle,
|
|
749
|
-
ease: on ? "power2.out" : "power2.inOut",
|
|
750
|
-
onUpdate: paint
|
|
751
|
-
});
|
|
752
|
-
},
|
|
753
|
-
get energy() {
|
|
754
|
-
return state.energy;
|
|
755
|
-
},
|
|
756
|
-
get scale() {
|
|
757
|
-
return state.scale;
|
|
758
|
-
},
|
|
759
|
-
destroy() {
|
|
760
|
-
instances.delete(root);
|
|
761
|
-
scope.dispose();
|
|
762
|
-
delete root.dataset.mkReady;
|
|
763
|
-
}
|
|
764
|
-
};
|
|
765
|
-
instances.set(root, instance);
|
|
766
|
-
root.dataset.mkReady = "";
|
|
767
|
-
return instance;
|
|
768
|
-
}
|
|
769
|
-
|
|
770
687
|
// src/components/chat/engine.ts
|
|
771
688
|
var MESSAGE = "[data-mk-message]";
|
|
772
689
|
var PENDING_ID = "mk-chat-pending";
|
|
@@ -1109,136 +1026,6 @@ function createNav(root, options = {}) {
|
|
|
1109
1026
|
};
|
|
1110
1027
|
}
|
|
1111
1028
|
|
|
1112
|
-
// src/components/steps/engine.ts
|
|
1113
|
-
var STEP = "[data-mk-step]";
|
|
1114
|
-
var ITEM_STYLES = ["transform", "translate", "rotate", "scale", "filter", "opacity", "visibility"];
|
|
1115
|
-
function createSteps(root, options = {}) {
|
|
1116
|
-
const steps = root ? [...root.querySelectorAll(STEP)].filter((step) => {
|
|
1117
|
-
const outer = step.parentElement?.closest(STEP);
|
|
1118
|
-
return !outer || !root.contains(outer);
|
|
1119
|
-
}) : [];
|
|
1120
|
-
if (!root || !steps.length) {
|
|
1121
|
-
warnOnce("steps: needs [data-mk-step] children");
|
|
1122
|
-
return inert({ next: async () => {
|
|
1123
|
-
}, prev: async () => {
|
|
1124
|
-
}, goTo: async () => {
|
|
1125
|
-
}, busy() {
|
|
1126
|
-
}, index: -1, count: 0, steps: [] });
|
|
1127
|
-
}
|
|
1128
|
-
registerMotion();
|
|
1129
|
-
const scope = createScope();
|
|
1130
|
-
const { duration = TIMING.onboarding.step, animateFirst = true, target = "[data-mk-flow-item]" } = options;
|
|
1131
|
-
const clamp = (value) => Math.min(steps.length - 1, Math.max(0, Math.round(value)));
|
|
1132
|
-
const marked = steps.findIndex((step) => step.hasAttribute("data-mk-current"));
|
|
1133
|
-
let index = clamp(options.index ?? (marked >= 0 ? marked : 0));
|
|
1134
|
-
let wanted = index;
|
|
1135
|
-
let running2 = null;
|
|
1136
|
-
let stopCounter = () => {
|
|
1137
|
-
};
|
|
1138
|
-
const itemsOf = (step) => {
|
|
1139
|
-
const marked2 = [...step.querySelectorAll(target)];
|
|
1140
|
-
return marked2.length ? marked2 : [...step.children];
|
|
1141
|
-
};
|
|
1142
|
-
const show2 = (current) => {
|
|
1143
|
-
steps.forEach((step, i) => {
|
|
1144
|
-
scope.attr(step, "hidden", i === current ? null : "");
|
|
1145
|
-
scope.attr(step, "data-mk-current", i === current ? "" : null);
|
|
1146
|
-
});
|
|
1147
|
-
};
|
|
1148
|
-
const counter = () => {
|
|
1149
|
-
const el = root.querySelector("[data-mk-counter]");
|
|
1150
|
-
if (!el) return;
|
|
1151
|
-
stopCounter();
|
|
1152
|
-
stopCounter = revealCounter(el, index + 1, { duration: TIMING.onboarding.counter });
|
|
1153
|
-
};
|
|
1154
|
-
const focusTitle = (step) => {
|
|
1155
|
-
const title = step.querySelector("[data-mk-step-title]") ?? step.querySelector("h1, h2, h3, h4, h5, h6");
|
|
1156
|
-
if (!title) return;
|
|
1157
|
-
if (!title.hasAttribute("tabindex") && title.tabIndex < 0) scope.attr(title, "tabindex", "-1");
|
|
1158
|
-
title.focus({ preventScroll: true });
|
|
1159
|
-
};
|
|
1160
|
-
const change = async () => {
|
|
1161
|
-
try {
|
|
1162
|
-
while (wanted !== index && !scope.disposed) {
|
|
1163
|
-
const previous = index;
|
|
1164
|
-
const next = wanted;
|
|
1165
|
-
const out = reduced() ? null : flowOut(itemsOf(steps[previous]), { duration });
|
|
1166
|
-
if (out) await out;
|
|
1167
|
-
if (scope.disposed) return;
|
|
1168
|
-
index = next;
|
|
1169
|
-
show2(index);
|
|
1170
|
-
const step = steps[index];
|
|
1171
|
-
await nextFrame();
|
|
1172
|
-
if (scope.disposed) return;
|
|
1173
|
-
const items2 = itemsOf(step);
|
|
1174
|
-
clearStyles(items2, ["visibility"]);
|
|
1175
|
-
flowIn(items2, { duration, autoAlpha: false });
|
|
1176
|
-
counter();
|
|
1177
|
-
focusTitle(step);
|
|
1178
|
-
root.dispatchEvent(new CustomEvent("mk:step", { bubbles: true, detail: { index, previous, step } }));
|
|
1179
|
-
options.onChange?.(index, previous);
|
|
1180
|
-
}
|
|
1181
|
-
} finally {
|
|
1182
|
-
running2 = null;
|
|
1183
|
-
}
|
|
1184
|
-
};
|
|
1185
|
-
const goTo = (to) => {
|
|
1186
|
-
wanted = clamp(to);
|
|
1187
|
-
if (wanted === index && !running2) return Promise.resolve();
|
|
1188
|
-
running2 ??= change();
|
|
1189
|
-
return running2;
|
|
1190
|
-
};
|
|
1191
|
-
show2(index);
|
|
1192
|
-
scope.add(() => {
|
|
1193
|
-
stopCounter();
|
|
1194
|
-
for (const step of steps) {
|
|
1195
|
-
const items2 = itemsOf(step);
|
|
1196
|
-
gsap.killTweensOf(items2);
|
|
1197
|
-
clearStyles(items2, ITEM_STYLES);
|
|
1198
|
-
}
|
|
1199
|
-
});
|
|
1200
|
-
scope.on(root, "click", (event) => {
|
|
1201
|
-
const trigger = event.target?.closest("[data-mk-step-next], [data-mk-step-prev], [data-mk-step-goto]");
|
|
1202
|
-
if (!trigger || !root.contains(trigger)) return;
|
|
1203
|
-
if (trigger.hasAttribute("data-mk-step-next")) void goTo(wanted + 1);
|
|
1204
|
-
else if (trigger.hasAttribute("data-mk-step-prev")) void goTo(wanted - 1);
|
|
1205
|
-
else void goTo(Number(trigger.dataset.mkStepGoto) - 1);
|
|
1206
|
-
});
|
|
1207
|
-
const counterEl = root.querySelector("[data-mk-counter]");
|
|
1208
|
-
if (counterEl) {
|
|
1209
|
-
const text = counterEl.textContent;
|
|
1210
|
-
counterEl.textContent = String(index + 1);
|
|
1211
|
-
scope.add(() => {
|
|
1212
|
-
counterEl.textContent = text;
|
|
1213
|
-
});
|
|
1214
|
-
}
|
|
1215
|
-
if (animateFirst && entrances()) flowIn(itemsOf(steps[index]), { duration });
|
|
1216
|
-
root.dataset.mkReady = "";
|
|
1217
|
-
return {
|
|
1218
|
-
next: () => goTo(wanted + 1),
|
|
1219
|
-
prev: () => goTo(wanted - 1),
|
|
1220
|
-
goTo,
|
|
1221
|
-
busy(on) {
|
|
1222
|
-
scope.attr(root, "aria-busy", on ? "true" : null);
|
|
1223
|
-
const background = root.querySelector(".mk-chat-background, mk-chat-background");
|
|
1224
|
-
chatBackgroundOf(background)?.busy(on);
|
|
1225
|
-
},
|
|
1226
|
-
get index() {
|
|
1227
|
-
return index;
|
|
1228
|
-
},
|
|
1229
|
-
get count() {
|
|
1230
|
-
return steps.length;
|
|
1231
|
-
},
|
|
1232
|
-
get steps() {
|
|
1233
|
-
return steps;
|
|
1234
|
-
},
|
|
1235
|
-
destroy() {
|
|
1236
|
-
scope.dispose();
|
|
1237
|
-
delete root.dataset.mkReady;
|
|
1238
|
-
}
|
|
1239
|
-
};
|
|
1240
|
-
}
|
|
1241
|
-
|
|
1242
1029
|
// src/components/cursor/engine.ts
|
|
1243
1030
|
var svg = (extra = "") => `<svg aria-hidden="true" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"${extra}><path d="${ICON_PATHS.send}"/></svg>`;
|
|
1244
1031
|
function backgroundTone(el) {
|
|
@@ -1600,8 +1387,6 @@ export {
|
|
|
1600
1387
|
toast,
|
|
1601
1388
|
toastTimers,
|
|
1602
1389
|
createToaster,
|
|
1603
|
-
chatBackgroundOf,
|
|
1604
|
-
createChatBackground,
|
|
1605
1390
|
PENDING_ID,
|
|
1606
1391
|
capturePending,
|
|
1607
1392
|
morphPendingToReply,
|
|
@@ -1610,8 +1395,7 @@ export {
|
|
|
1610
1395
|
NAV_STYLES,
|
|
1611
1396
|
revealShell,
|
|
1612
1397
|
createNav,
|
|
1613
|
-
createSteps,
|
|
1614
1398
|
createCursor,
|
|
1615
1399
|
createIsland
|
|
1616
1400
|
};
|
|
1617
|
-
//# sourceMappingURL=chunk-
|
|
1401
|
+
//# sourceMappingURL=chunk-6P4P7NU6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/motion/chat.ts","../src/components/theme-picker/engine.ts","../src/components/toast/store.ts","../src/components/icons.ts","../src/components/toast/engine.ts","../src/components/chat/engine.ts","../src/components/nav/engine.ts","../src/components/cursor/engine.ts","../src/components/island/engine.ts"],"sourcesContent":["import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { splitWords } from '../core/split';\n\n/*\n * chat (PrettyChat): new bubbles grow from their speaker's side\n * (scale .5, 24 px blur, 0.7 s, 60 ms apart) while their words rise into place\n * (16 px, 6 px blur, 0.25 s, 50 ms apart, back.out). Words are split only for\n * the animation; tables and code stay whole; if splitting would reflow the text\n * by more than half a line, the text block moves as one.\n */\n\nexport interface EnterMessagesOptions {\n /** Text inside each bubble whose words rise. */\n textSelector?: string;\n}\n\nconst isUser = (bubble: HTMLElement) => bubble.dataset.mkRole === 'user' || bubble.classList.contains('user');\n\nexport function enterMessages(bubbles: HTMLElement[], { textSelector = '[data-mk-text], .message-text' }: EnterMessagesOptions = {}) {\n if (!bubbles.length || reduced()) return null;\n registerMotion();\n const reverts: Array<() => void> = [];\n const cleanup = () => {\n for (const revert of reverts.splice(0)) revert();\n };\n const timeline = gsap.timeline({ onComplete: cleanup, onInterrupt: cleanup });\n bubbles.forEach((bubble, index) => {\n gsap.set(bubble, { transformOrigin: isUser(bubble) ? '100% 50%' : '0% 50%' });\n timeline.fromTo(\n bubble,\n { scale: 0.5, autoAlpha: 0, filter: 'blur(24px)' },\n { scale: 1, autoAlpha: 1, filter: 'blur(0px)', duration: TIMING.bubble, ease: EASE.signature, clearProps: 'transform,opacity,visibility,filter' },\n index * TIMING.bubbleStagger,\n );\n const text = bubble.querySelector<HTMLElement>(textSelector);\n if (!text) return;\n const before = text.offsetHeight;\n const split = splitWords(text);\n const lineHeight = parseFloat(getComputedStyle(text).lineHeight) || 0;\n let targets: HTMLElement[] = split.parts;\n if (!split.parts.length || text.offsetHeight - before > lineHeight / 2) {\n split.revert();\n targets = [text];\n } else reverts.push(() => split.revert());\n timeline.fromTo(\n targets,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.wordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n },\n index * TIMING.bubbleStagger,\n );\n });\n return timeline;\n}\n\n/** A message box grows or shrinks to its text (0.18 s, power2.out), from `min` px. */\nexport function fitComposer(field: HTMLTextAreaElement, min = 64) {\n const from = field.offsetHeight;\n field.style.height = 'auto';\n const to = Math.max(min, field.scrollHeight);\n field.style.height = `${from}px`;\n if (from === to || reduced()) {\n field.style.height = `${to}px`;\n return null;\n }\n registerMotion();\n return gsap.to(field, { height: to, duration: TIMING.composer, ease: 'power2.out', overwrite: 'auto' });\n}\n\n/** Scroll a conversation to its newest message. */\nexport function scrollToLatest(scroller: HTMLElement) {\n const top = scroller.scrollHeight - scroller.clientHeight;\n if (reduced()) {\n scroller.scrollTop = top;\n return null;\n }\n registerMotion();\n const state = { top: scroller.scrollTop };\n return gsap.to(state, {\n top,\n duration: TIMING.chatScroll,\n ease: EASE.chatScroll,\n overwrite: 'auto',\n onUpdate: () => {\n scroller.scrollTop = state.top;\n },\n });\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { flowInPalette } from '../../motion/entrances';\nimport { THEMES } from '../../theme/presets';\nimport { THEME_EVENT, getTheme, setTheme } from '../../theme/theme';\n\n/*\n * theme picker: colour balls pop in (scale .5, blur 4, 10 ms apart);\n * a ball rounds into a squircle on hover and into a rounded square when chosen\n * (0.5 s, cubic(.38,.49,0,1.5)), with two blurred lights drifting inside.\n * Clicking one applies the theme (setTheme); external changes keep it in sync.\n */\n\nexport interface ThemePickerOptions {\n /** Theme ids to show, in order. Default: visible presets, or all with showHidden. */\n themes?: string[];\n showHidden?: boolean;\n labels?: { group?: string };\n onChange?: (id: string) => void;\n}\n\nexport interface ThemePickerInstance extends Instance {\n select(id: string): void;\n}\n\nexport function createThemePicker(root: HTMLElement | null, options: ThemePickerOptions = {}): ThemePickerInstance {\n if (!root) {\n warnOnce('theme-picker: missing root');\n return inert({ select() {} });\n }\n registerMotion();\n const scope = createScope();\n const ctx = gsap.context(() => {});\n const generated: HTMLElement[] = [];\n\n let swatches = [...root.querySelectorAll<HTMLElement>('[data-mk-swatch]')];\n if (!swatches.length) {\n const byId = new Map(THEMES.map((theme) => [theme.id as string, theme]));\n const ids = options.themes ?? THEMES.filter((theme) => options.showHidden || !theme.hidden).map((theme) => theme.id);\n for (const id of ids) {\n const theme = byId.get(id);\n if (!theme) {\n warnOnce(`theme-picker: unknown theme \"${id}\"`);\n continue;\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'mk-swatch';\n button.dataset.mkSwatch = theme.id;\n button.title = theme.name;\n button.setAttribute('aria-label', theme.name);\n button.style.setProperty('--mk-swatch', theme.seed);\n root.append(button);\n generated.push(button);\n }\n swatches = generated;\n }\n\n scope.attr(root, 'role', 'group');\n if (!root.hasAttribute('aria-label')) scope.attr(root, 'aria-label', options.labels?.group ?? 'Tema');\n\n const sync = () => {\n const current = getTheme().id;\n for (const swatch of swatches) scope.attr(swatch, 'aria-pressed', String(swatch.dataset.mkSwatch === current));\n };\n const select = (id: string) => {\n setTheme(id);\n options.onChange?.(id);\n };\n\n scope.on(root, 'click', (event) => {\n const swatch = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-swatch]');\n if (swatch && root.contains(swatch) && swatch.dataset.mkSwatch) select(swatch.dataset.mkSwatch);\n });\n scope.on(document, THEME_EVENT, sync);\n sync();\n if (entrances()) ctx.add(() => flowInPalette(swatches));\n root.dataset.mkReady = '';\n\n return {\n select,\n destroy() {\n scope.dispose();\n ctx.revert();\n for (const button of generated.splice(0)) button.remove();\n delete root.dataset.mkReady;\n },\n };\n}\n","/*\n * The toasts on screen and their timers. Framework-agnostic: any number of toasters (vanilla, element, React)\n * render the same list. A timer pauses while the deck is open and resumes with\n * what was left. Never put a secret in a message: toasts confirm an action.\n */\n\nexport type ToastTone = 'success' | 'error' | 'info' | 'neutral';\n\nexport interface ToastAction {\n label: string;\n onClick: () => void;\n}\n\nexport interface ToastOptions {\n /** The control the toast grows out of. */\n origin?: HTMLElement | null;\n /** ms on screen; 0 keeps it until dismissed. */\n duration?: number;\n tone?: ToastTone;\n action?: ToastAction;\n /** Show the tone's icon (default). */\n icon?: boolean;\n}\n\nexport interface ToastItem {\n id: number;\n message: string;\n origin: HTMLElement | null;\n duration: number;\n tone: ToastTone;\n action: ToastAction | null;\n icon: boolean;\n closing: boolean;\n}\n\n/** At most this many live toasts; older ones leave to make room. */\nexport const TOAST_LIMIT = 5;\n\nlet items: ToastItem[] = [];\nlet nextId = 1;\nconst listeners = new Set<() => void>();\nconst emit = () => {\n for (const listener of listeners) listener();\n};\n\nexport const getToasts = () => items;\n\nexport function subscribeToasts(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction show(message: string, { origin = null, duration = 4000, tone = 'success', action, icon = true }: ToastOptions = {}) {\n const id = nextId++;\n const live = items.filter((item) => !item.closing);\n const extra = new Set(live.slice(0, Math.max(0, live.length - TOAST_LIMIT + 1)).map((item) => item.id));\n items = [\n ...items.map((item) => (extra.has(item.id) ? { ...item, closing: true } : item)),\n { id, message, origin, duration, tone, action: action ?? null, icon, closing: false },\n ];\n emit();\n return id;\n}\n\n/** Start the closing animation of a toast. */\nexport function dismissToast(id: number) {\n const item = items.find((entry) => entry.id === id);\n if (!item || item.closing) return;\n items = items.map((entry) => (entry.id === id ? { ...entry, closing: true } : entry));\n emit();\n}\n\n/** Take a toast out of the list (after its exit animation). */\nexport function removeToast(id: number) {\n toastTimers.clear(id);\n items = items.filter((entry) => entry.id !== id);\n emit();\n}\n\n/** Remove every toast at once (no animation). */\nexport function clearToasts() {\n for (const item of items) toastTimers.clear(item.id);\n items = [];\n emit();\n}\n\n/** Show a toast: `toast('Copiado', { origin: button })`. Returns its id. */\nexport const toast = Object.assign(show, { dismiss: dismissToast, clear: clearToasts });\n\nconst running = new Map<number, { handle: ReturnType<typeof setTimeout> | null; remaining: number; started: number }>();\n\nexport const toastTimers = {\n start(id: number, duration: number) {\n if (duration <= 0 || running.has(id)) return;\n running.set(id, { handle: setTimeout(() => dismissToast(id), duration), remaining: duration, started: Date.now() });\n },\n pause(id: number) {\n const timer = running.get(id);\n if (!timer?.handle) return;\n clearTimeout(timer.handle);\n timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.started));\n timer.handle = null;\n },\n resume(id: number) {\n const timer = running.get(id);\n if (!timer || timer.handle) return;\n if (timer.remaining <= 0) {\n dismissToast(id);\n return;\n }\n timer.started = Date.now();\n timer.handle = setTimeout(() => dismissToast(id), timer.remaining);\n },\n clear(id: number) {\n const timer = running.get(id);\n if (timer?.handle) clearTimeout(timer.handle);\n running.delete(id);\n },\n};\n","/*\n * The few icons the components draw themselves (close, float, dock, tones), as\n * 24 × 24 stroke paths, so no component depends on the Material Symbols font.\n */\n\nexport const ICON_PATHS = {\n close: 'M6 6l12 12M18 6L6 18',\n expand: 'M14 4h6v6M10 20H4v-6M20 4l-7 7M4 20l7-7',\n shrink: 'M4 14h6v6M20 10h-6V4M10 14l-7 7M14 10l7-7',\n check: 'M5 12.5l4.5 4.5L19 7.5',\n alert: 'M12 8v5M12 16.5v.01M10.3 3.9L2.6 17.3a2 2 0 001.7 3h15.4a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z',\n info: 'M12 11v6M12 7.5v.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z',\n send: 'M12 19V5M5.5 11.5L12 5l6.5 6.5',\n mic: 'M12 3a3 3 0 00-3 3v6a3 3 0 006 0V6a3 3 0 00-3-3zM5.5 11a6.5 6.5 0 0013 0M12 17.5V21',\n sparkle: 'M12 3l1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9z',\n grip: 'M9 6h.01M15 6h.01M9 12h.01M15 12h.01M9 18h.01M15 18h.01',\n} as const;\n\nexport type IconName = keyof typeof ICON_PATHS;\n\n/** An inline SVG string (aria-hidden), for vanilla engines and custom elements. */\nexport function iconSvg(name: IconName, size = 20) {\n return `<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\"><path d=\"${ICON_PATHS[name]}\"/></svg>`;\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { bezier, channels, easeInCubic, easeOut, easeOutCubic, eased, spring, springEase } from '../../core/channels';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { splitGraphemes } from '../../core/split';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { iconSvg, type IconName } from '../icons';\nimport { dismissToast, getToasts, removeToast, subscribeToasts, toastTimers, type ToastItem, type ToastTone } from './store';\n\n/*\n * toast deck:\n * - toasts stack at the top; older ones peek out 16 px below, 5 % smaller each,\n * three drawn; hovering opens the deck (spring .55, 60 ms cascade) and pauses\n * the timers, leaving closes it after 150 ms;\n * - a toast with an origin grows out of that control (spring travel 144/14 with\n * a 2400 px/s kick, size 0.32 s, content zooming in from twice its size);\n * otherwise it slides in 12 px out of a 6 px blur; its letters rise one by one;\n * - it leaves 24 px up into a 4 px blur (0.3 s) and can be swiped up (48 px) or\n * wheeled away (80 px).\n */\n\nconst STACK = { peek: 16, scaleStep: 0.05, minScale: 0.7, maxVisible: 3, gap: 8, baseZ: 1000 };\nconst DISTANCE = { enter: 12, enterBlur: 6, exit: 24, exitBlur: 4, fade: 120 };\nconst GESTURE = { swipe: 48, wheel: 80, expandDrag: 24, resistance: 0.15, wheelEndMs: 140 };\nconst TONE_ICONS: Record<ToastTone, IconName | null> = { success: 'check', error: 'alert', info: 'info', neutral: null };\n\nexport interface ToasterLabels {\n dismiss?: string;\n}\n\nexport interface ToasterOptions {\n labels?: ToasterLabels;\n}\n\nexport type ToasterInstance = Instance;\n\ninterface Card {\n card: HTMLElement;\n shell: HTMLElement;\n body: HTMLElement;\n message: HTMLElement;\n}\n\n/** Where each live toast rests: index 0 is the newest, on top. */\nfunction layout(count: number, expanded: boolean, heights: number[]) {\n let offset = 0;\n return Array.from({ length: count }, (_, index) => {\n if (expanded) {\n const slot = { y: offset, scale: 1, opacity: 1, visible: true, zIndex: STACK.baseZ - index };\n offset += (heights[index] ?? 0) + STACK.gap;\n return slot;\n }\n const visible = index < STACK.maxVisible;\n return {\n y: index * STACK.peek,\n scale: Math.max(STACK.minScale, 1 - index * STACK.scaleStep),\n opacity: visible ? 1 : 0,\n visible,\n zIndex: STACK.baseZ - index,\n };\n });\n}\n\n/** A message's letters rise into place (graphemes, words kept together, at most 64). */\nfunction revealLetters(element: HTMLElement) {\n const text = element.textContent ?? '';\n const T = TIMING.toast;\n if (!text || text.length > 64 || reduced()) return;\n const letters = splitGraphemes(text, 64);\n const original = element.innerHTML;\n const width = element.getBoundingClientRect().width;\n const fragment = document.createDocumentFragment();\n const chars: HTMLSpanElement[] = [];\n let word: HTMLSpanElement | null = null;\n for (const letter of letters) {\n if (!letter.trim()) {\n word = null;\n fragment.append(document.createTextNode(letter));\n continue;\n }\n if (!word) {\n word = document.createElement('span');\n word.style.display = 'inline-block';\n word.style.whiteSpace = 'nowrap';\n fragment.append(word);\n }\n const char = document.createElement('span');\n char.textContent = letter;\n char.style.display = 'inline-block';\n word.append(char);\n chars.push(char);\n }\n if (width) element.style.width = `${width}px`;\n element.textContent = '';\n element.append(fragment);\n gsap.fromTo(\n chars,\n { opacity: 0, yPercent: 40, filter: 'blur(4px)' },\n {\n opacity: 1,\n yPercent: 0,\n filter: 'blur(0px)',\n duration: T.chars,\n ease: easeOutCubic,\n delay: (index: number) => T.charsDelay + index * T.charsStagger,\n onComplete: () => {\n element.innerHTML = original;\n element.style.width = '';\n },\n },\n );\n}\n\n/** Grow a toast's shell out of `origin`. Returns a function that settles it now. */\nfunction morphFrom(card: HTMLElement, shell: HTMLElement, body: HTMLElement, origin: HTMLElement) {\n const T = TIMING.toast;\n const box = shell.getBoundingClientRect();\n const start = origin.getBoundingClientRect();\n const look = getComputedStyle(origin);\n const own = getComputedStyle(shell);\n const endRadius = parseFloat(own.borderTopLeftRadius) || 20;\n const startRadius = Math.min(parseFloat(look.borderTopLeftRadius) || 0, start.height / 2);\n card.style.width = `${box.width}px`;\n card.style.height = `${box.height}px`;\n body.style.width = `${body.getBoundingClientRect().width}px`;\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 const offset = { x: start.left - box.left, y: start.top - box.top };\n Object.assign(shell.style, {\n position: 'absolute',\n top: '0px',\n left: '0px',\n width: `${start.width}px`,\n height: `${start.height}px`,\n borderRadius: `${startRadius}px`,\n background: look.backgroundColor,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n transition: 'none',\n });\n Object.assign(body.style, { transform: 'scale(2)', transformOrigin: 'center center', filter: 'blur(8px)', opacity: '0' });\n // The control steps aside while its toast leaves it.\n origin.style.transition = 'opacity 160ms ease';\n origin.style.opacity = '0';\n void shell.offsetWidth;\n shell.style.transition = `background ${T.morphColor}s ease-out ${T.morphColorDelay}s, box-shadow ${T.morphShadow}s ease-out ${T.morphShadowDelay}s`;\n shell.style.background = '';\n body.style.transition = `opacity ${T.morphColor}s ease-out ${T.morphColorDelay}s`;\n body.style.opacity = '1';\n const motion = channels(\n { x: offset.x, y: offset.y, width: start.width, height: start.height, radius: startRadius, scale: 2, blur: 8 },\n (name, value) => {\n if (name === 'x') offset.x = value;\n else if (name === 'y') offset.y = value;\n else if (name === 'width') shell.style.width = `${value}px`;\n else if (name === 'height') shell.style.height = `${value}px`;\n else if (name === 'radius') shell.style.borderRadius = `${value}px`;\n else if (name === 'scale') body.style.transform = `scale(${value})`;\n else if (name === 'blur') body.style.filter = `blur(${value}px)`;\n if (name === 'x' || name === 'y') shell.style.transform = `translate(${offset.x}px, ${offset.y}px)`;\n },\n );\n void motion.animate(\n { x: 0, y: 0, width: box.width, height: box.height, radius: endRadius, scale: 1, blur: 0 },\n {\n x: spring(144, 14, { velocity: 2400, direction: towardX }),\n y: spring(144, 14, { velocity: 2400, direction: towardY }),\n width: eased(T.morphSize, bezier(0.8, 0.3, 0.5, 0.8)),\n height: eased(T.morphSize, bezier(0.8, 0.3, 0.5, 0.8)),\n radius: eased(T.morphRadius, easeOut),\n scale: eased(T.morphContent, easeOut),\n blur: eased(T.morphContent, easeOut),\n },\n );\n let settled = false;\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n motion.stop();\n for (const name of ['position', 'top', 'left', 'width', 'height', 'border-radius', 'background', 'transform', 'transition']) shell.style.removeProperty(name);\n card.style.removeProperty('width');\n card.style.removeProperty('height');\n for (const name of ['transform', 'transform-origin', 'filter', 'opacity', 'width', 'transition']) body.style.removeProperty(name);\n origin.style.transition = 'opacity 300ms ease';\n origin.style.opacity = '';\n setTimeout(() => {\n origin.style.transition = '';\n }, 320);\n };\n const timer = setTimeout(settle, T.safetyMs);\n return settle;\n}\n\nfunction buildCard(item: ToastItem, dismissLabel: string): Card {\n const card = document.createElement('div');\n card.className = 'mk-toast';\n card.dataset.mkToast = String(item.id);\n card.dataset.mkTone = item.tone;\n const shell = document.createElement('div');\n shell.className = 'mk-toast__shell';\n const body = document.createElement('div');\n body.className = 'mk-toast__body';\n const icon = item.icon ? TONE_ICONS[item.tone] : null;\n if (icon) {\n const holder = document.createElement('span');\n holder.className = 'mk-toast__icon';\n holder.innerHTML = iconSvg(icon, 18);\n body.append(holder);\n }\n const message = document.createElement('span');\n message.className = 'mk-toast__message';\n message.textContent = item.message;\n body.append(message);\n if (item.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.className = 'mk-toast__action';\n action.dataset.mkToastAction = '';\n action.textContent = item.action.label;\n body.append(action);\n }\n const dismiss = document.createElement('button');\n dismiss.type = 'button';\n dismiss.className = 'mk-toast__dismiss';\n dismiss.dataset.mkToastDismiss = '';\n dismiss.setAttribute('aria-label', dismissLabel);\n dismiss.innerHTML = iconSvg('close', 14);\n body.append(dismiss);\n shell.append(body);\n card.append(shell);\n return { card, shell, body, message };\n}\n\n/** Render the toast list into `host` (a fixed layer at the top of the screen). */\nexport function createToaster(host: HTMLElement | null, options: ToasterOptions = {}): ToasterInstance {\n if (!host) {\n warnOnce('toaster: missing host');\n return inert();\n }\n registerMotion();\n const dismissLabel = options.labels?.dismiss ?? 'Cerrar';\n const scope = createScope();\n const cards = new Map<number, Card>();\n const entered = new Set<number>();\n const leaving = new Set<number>();\n const dragging = new Set<number>();\n const settles = new Map<number, () => void>();\n let expanded = false;\n let collapse: ReturnType<typeof setTimeout> | undefined;\n const popover = typeof host.showPopover === 'function';\n\n scope.attr(host, 'role', 'status');\n scope.attr(host, 'aria-live', 'polite');\n if (popover) scope.attr(host, 'popover', 'manual');\n\n const live = () =>\n getToasts()\n .filter((item) => !item.closing)\n .reverse()\n .map((item) => ({ item, entry: cards.get(item.id) }))\n .filter((pair): pair is { item: ToastItem; entry: Card } => pair.entry !== undefined);\n\n const slotsFor = () => {\n const entries = live();\n return { entries, slots: layout(entries.length, expanded, entries.map(({ entry }) => entry.card.offsetHeight)) };\n };\n\n const relayout = (duration: number = TIMING.toast.relayout, ease: gsap.EaseFunction = easeOutCubic, stagger = 0) => {\n const { entries, slots } = slotsFor();\n entries.forEach(({ item, entry }, index) => {\n const slot = slots[index];\n if (!slot) return;\n entry.card.style.zIndex = String(slot.zIndex);\n entry.card.style.pointerEvents = slot.visible ? 'auto' : 'none';\n entry.card.setAttribute('aria-hidden', slot.visible ? 'false' : 'true');\n if (dragging.has(item.id) || !entered.has(item.id)) return;\n gsap.to(entry.card, {\n xPercent: -50,\n y: slot.y,\n scale: slot.scale,\n opacity: slot.opacity,\n duration: reduced() ? 0 : duration,\n ease,\n delay: stagger * index,\n overwrite: 'auto',\n });\n });\n };\n const restingY = (id: number) => {\n const { entries, slots } = slotsFor();\n return slots[entries.findIndex(({ item }) => item.id === id)]?.y ?? 0;\n };\n\n const openDeck = () => {\n clearTimeout(collapse);\n if (expanded) return;\n expanded = true;\n for (const { item } of live()) toastTimers.pause(item.id);\n relayout(TIMING.toast.expand, springEase(0.55), TIMING.toast.expandStagger);\n };\n const closeDeck = () => {\n clearTimeout(collapse);\n collapse = setTimeout(() => {\n if (!expanded) return;\n expanded = false;\n for (const { item } of live()) toastTimers.resume(item.id);\n relayout(TIMING.toast.expand, springEase(0.55), TIMING.toast.expandStagger);\n }, TIMING.toast.collapseDelayMs);\n };\n\n const showLayer = (visible: boolean) => {\n if (!popover) return;\n try {\n if (host.matches(':popover-open')) host.hidePopover();\n if (visible) host.showPopover();\n } catch {\n // :popover-open unsupported (no popover API): nothing to toggle.\n }\n };\n\n const attachGestures = (item: ToastItem, card: HTMLElement) => {\n let start: { y: number; type: string } | null = null;\n let wheel: { offset: number; end: ReturnType<typeof setTimeout> | undefined } | null = null;\n const move = (offset: number) => gsap.set(card, { y: restingY(item.id) + offset, opacity: Math.max(0, 1 + Math.min(0, offset) / DISTANCE.fade) });\n const cancel = () => {\n dragging.delete(item.id);\n gsap.to(card, { y: restingY(item.id), opacity: 1, duration: 0.25, ease: easeOutCubic });\n if (!expanded) toastTimers.resume(item.id);\n };\n card.addEventListener('mouseenter', openDeck);\n card.addEventListener('mouseleave', closeDeck);\n card.addEventListener('pointerdown', (event) => {\n if (event.button !== 0 || (event.target as Element).closest('button, a, input, textarea, select, [role=\"button\"]')) return;\n start = { y: event.clientY, type: event.pointerType };\n card.setPointerCapture?.(event.pointerId);\n dragging.add(item.id);\n gsap.killTweensOf(card);\n toastTimers.pause(item.id);\n });\n card.addEventListener('pointermove', (event) => {\n if (!start) return;\n const dy = event.clientY - start.y;\n move(dy < 0 ? dy : start.type === 'touch' ? dy * GESTURE.resistance : 0);\n });\n const up = (event: PointerEvent) => {\n if (!start) return;\n const dy = event.clientY - start.y;\n const type = start.type;\n start = null;\n if (dy < -GESTURE.swipe) {\n dragging.delete(item.id);\n dismissToast(item.id);\n } else if (type === 'touch' && dy > GESTURE.expandDrag) {\n cancel();\n if (expanded) closeDeck();\n else openDeck();\n } else cancel();\n };\n card.addEventListener('pointerup', up);\n card.addEventListener('pointercancel', up);\n card.addEventListener(\n 'wheel',\n (event) => {\n const delta = event.deltaMode === 1 ? event.deltaY * 16 : event.deltaMode === 2 ? event.deltaY * innerHeight : event.deltaY;\n if (!wheel) {\n wheel = { offset: 0, end: undefined };\n dragging.add(item.id);\n toastTimers.pause(item.id);\n }\n wheel.offset = Math.min(0, wheel.offset - delta);\n move(wheel.offset);\n clearTimeout(wheel.end);\n wheel.end = setTimeout(() => {\n const offset = wheel?.offset ?? 0;\n wheel = null;\n if (offset < -GESTURE.wheel) {\n dragging.delete(item.id);\n dismissToast(item.id);\n } else cancel();\n }, GESTURE.wheelEndMs);\n },\n { passive: true },\n );\n card.addEventListener('click', (event) => {\n const target = event.target as Element;\n if (target.closest('[data-mk-toast-dismiss]')) dismissToast(item.id);\n else if (target.closest('[data-mk-toast-action]')) {\n item.action?.onClick();\n dismissToast(item.id);\n }\n });\n };\n\n const finishCard = (id: number) => {\n settles.get(id)?.();\n settles.delete(id);\n const entry = cards.get(id);\n if (entry) {\n gsap.killTweensOf(entry.card);\n entry.card.remove();\n }\n cards.delete(id);\n entered.delete(id);\n leaving.delete(id);\n dragging.delete(id);\n };\n\n const render = () => {\n const list = getToasts();\n const ids = new Set(list.map((item) => item.id));\n for (const id of [...cards.keys()]) if (!ids.has(id)) finishCard(id);\n for (const item of list) {\n if (!cards.has(item.id) && !item.closing) {\n const entry = buildCard(item, dismissLabel);\n cards.set(item.id, entry);\n host.append(entry.card);\n gsap.set(entry.card, { xPercent: -50 });\n attachGestures(item, entry.card);\n }\n }\n showLayer(list.some((item) => !item.closing) || leaving.size > 0);\n for (const item of list) {\n const entry = cards.get(item.id);\n if (!entry) continue;\n if (!entered.has(item.id) && !item.closing) {\n entered.add(item.id);\n toastTimers.start(item.id, item.duration);\n relayout();\n gsap.killTweensOf(entry.card);\n gsap.set(entry.card, { xPercent: -50, y: restingY(item.id), scale: 1, opacity: 1 });\n if (expanded) toastTimers.pause(item.id);\n revealLetters(entry.message);\n if (reduced()) continue;\n if (item.origin?.isConnected) settles.set(item.id, morphFrom(entry.card, entry.shell, entry.body, item.origin));\n else {\n const y = restingY(item.id);\n gsap.fromTo(\n entry.card,\n { y: y - DISTANCE.enter, opacity: 0, filter: `blur(${DISTANCE.enterBlur}px)` },\n { y, opacity: 1, filter: 'blur(0px)', duration: TIMING.toast.enter, ease: springEase(0.58, -3.5), clearProps: 'filter' },\n );\n }\n }\n if (item.closing && !leaving.has(item.id)) {\n leaving.add(item.id);\n toastTimers.clear(item.id);\n entry.card.style.zIndex = String(STACK.baseZ + 1);\n const done = () => {\n finishCard(item.id);\n removeToast(item.id);\n };\n if (reduced()) done();\n else {\n gsap.to(entry.card, {\n y: Number(gsap.getProperty(entry.card, 'y')) - DISTANCE.exit,\n opacity: 0,\n filter: `blur(${DISTANCE.exitBlur}px)`,\n duration: TIMING.toast.exit,\n ease: easeInCubic,\n overwrite: 'auto',\n onComplete: done,\n });\n }\n relayout();\n }\n }\n };\n\n scope.add(subscribeToasts(render));\n render();\n host.dataset.mkReady = '';\n\n return {\n destroy() {\n clearTimeout(collapse);\n for (const id of [...cards.keys()]) finishCard(id);\n showLayer(false);\n scope.dispose();\n delete host.dataset.mkReady;\n },\n };\n}\n","import { gsap, Flip, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { splitWords } from '../../core/split';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { enterMessages, fitComposer, scrollToLatest } from '../../motion/chat';\nimport { flowIn } from '../../motion/flow';\nimport { iconSvg } from '../icons';\n\n/*\n * Chat: new bubbles grow from their speaker's side while their\n * words rise (enterMessages); the conversation scrolls to the newest one\n * (0.35 s). A \"Pensando…\" placeholder shows only if the answer takes more than\n * 500 ms, and then morphs (Flip, 0.7 s, no scaling of the text) into the reply.\n * The composer grows with its text (0.18 s, from 64 px); Enter sends.\n * Parts: [data-mk-part] messages, composer, input, mic, send.\n * Messages: [data-mk-message] with data-mk-role=\"user|assistant|system\" and a [data-mk-text].\n */\n\nexport type ChatRole = 'user' | 'assistant' | 'system';\n\nexport interface ChatLabels {\n thinking?: string;\n}\n\nexport interface ChatOptions {\n /** Animate the messages already there when the chat starts (default: no, history stays still). */\n animateExisting?: boolean;\n /** Clear the input after sending (default). */\n clearOnSend?: boolean;\n labels?: ChatLabels;\n onSend?: (text: string) => void;\n}\n\nexport interface ChatInstance extends Instance {\n /** Append a plain-text message (vanilla convenience); it enters on its own. */\n add(role: ChatRole, text: string): HTMLElement;\n /** Show the thinking placeholder after 500 ms (a fast answer never shows it). */\n pending(): void;\n /** Add the answer: it morphs out of the placeholder if that was showing, else it enters. */\n reply(message: HTMLElement | string): HTMLElement;\n /** A confirmation bar flows in and its words rise. */\n confirm(bar: HTMLElement): void;\n setRecording(on: boolean): void;\n scrollToLatest(): void;\n /** Mark a message as already shown (a framework animates it itself). */\n adopt(message: Element): void;\n readonly messages: HTMLElement;\n}\n\nconst MESSAGE = '[data-mk-message]';\n/** data-flip-id of the thinking placeholder; a framework's own placeholder must carry it. */\nexport const PENDING_ID = 'mk-chat-pending';\nconst part = (root: HTMLElement, name: string) => root.querySelector<HTMLElement>(`[data-mk-part=\"${name}\"]`);\n\n/** The thinking placeholder's geometry, taken before the DOM changes (for frameworks). */\nexport const capturePending = (placeholder: Element | null) => {\n registerMotion();\n return placeholder ? Flip.getState(placeholder) : null;\n};\n\n/** Morph a captured placeholder into the reply (after the DOM shows the reply). */\nexport function morphPendingToReply(state: ReturnType<typeof Flip.getState> | null, reply: HTMLElement, scroller?: HTMLElement | null) {\n registerMotion();\n if (!state || reduced()) {\n if (!reduced()) enterMessages([reply]);\n return null;\n }\n const text = reply.querySelector<HTMLElement>('[data-mk-text], .message-text');\n if (text) text.style.width = `${text.getBoundingClientRect().width}px`;\n // Flip pairs the reply with the placeholder by this id (the placeholder carries it too).\n reply.setAttribute('data-flip-id', PENDING_ID);\n const words = text && !text.querySelector('table, pre') ? splitWords(text) : null;\n if (words?.parts.length) {\n gsap.fromTo(\n words.parts,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.wordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n onComplete: () => words.revert(),\n },\n );\n }\n return Flip.from(state, {\n targets: reply,\n duration: TIMING.bubble,\n scale: false,\n ease: EASE.signature,\n onUpdate: () => {\n if (scroller) scroller.scrollTop = scroller.scrollHeight;\n },\n onComplete: () => {\n reply.removeAttribute('data-flip-id');\n if (text) text.style.width = '';\n },\n });\n}\n\n/** A message bubble element (plain text). */\nexport function chatMessage(role: ChatRole, text: string) {\n const message = document.createElement('div');\n message.dataset.mkMessage = '';\n message.dataset.mkRole = role;\n const body = document.createElement('span');\n body.dataset.mkText = '';\n body.textContent = text;\n message.append(body);\n return message;\n}\n\nexport function createChat(root: HTMLElement | null, options: ChatOptions = {}): ChatInstance {\n const messages = root ? part(root, 'messages') : null;\n if (!root || !messages) {\n warnOnce('chat: needs a [data-mk-part=\"messages\"] container');\n return inert({\n add: () => document.createElement('div'),\n pending() {},\n reply: () => document.createElement('div'),\n confirm() {},\n setRecording() {},\n scrollToLatest() {},\n adopt() {},\n messages: null as unknown as HTMLElement,\n });\n }\n registerMotion();\n const { clearOnSend = true } = options;\n const thinking = options.labels?.thinking ?? 'Pensando...';\n const scope = createScope();\n const composer = part(root, 'composer');\n const input = composer?.querySelector<HTMLTextAreaElement>('[data-mk-part=\"input\"], textarea') ?? null;\n const mic = part(root, 'mic');\n const seen = new WeakSet<Element>();\n let placeholder: HTMLElement | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | undefined;\n let waiting = false;\n\n scope.attr(messages, 'role', 'log');\n scope.attr(messages, 'aria-live', 'polite');\n const existing = [...messages.querySelectorAll<HTMLElement>(MESSAGE)];\n if (options.animateExisting) enterMessages(existing);\n for (const message of existing) seen.add(message);\n\n // New bubbles (from the app, a framework or add()) enter on their own.\n const observer = scope.observe(\n new MutationObserver((records) => {\n const fresh: HTMLElement[] = [];\n for (const record of records) {\n for (const node of record.addedNodes) {\n if (!(node instanceof HTMLElement) || !node.matches(MESSAGE) || seen.has(node)) continue;\n seen.add(node);\n fresh.push(node);\n }\n }\n if (!fresh.length) return;\n enterMessages(fresh);\n scrollToLatest(messages);\n }),\n );\n observer.observe(messages, { childList: true });\n\n const clearPending = () => {\n clearTimeout(pendingTimer);\n pendingTimer = undefined;\n waiting = false;\n };\n\n const add = (role: ChatRole, text: string) => {\n const message = chatMessage(role, text);\n messages.append(message);\n return message;\n };\n\n const pending = () => {\n clearPending();\n waiting = true;\n pendingTimer = setTimeout(() => {\n pendingTimer = undefined;\n if (!waiting || placeholder) return;\n placeholder = document.createElement('div');\n placeholder.dataset.mkMessage = '';\n placeholder.dataset.mkRole = 'assistant';\n placeholder.dataset.mkPending = '';\n placeholder.setAttribute('data-flip-id', PENDING_ID);\n placeholder.innerHTML = `<span class=\"mk-chat__thinking\">${iconSvg('sparkle', 18)}<span></span></span>`;\n placeholder.querySelector('span span')!.textContent = thinking;\n seen.add(placeholder);\n messages.append(placeholder);\n enterMessages([placeholder]);\n scrollToLatest(messages);\n }, TIMING.chat.pendingDelayMs);\n };\n\n const reply = (content: HTMLElement | string) => {\n const message = typeof content === 'string' ? chatMessage('assistant', content) : content;\n clearPending();\n seen.add(message);\n const was = placeholder;\n placeholder = null;\n if (was?.isConnected) {\n const state = capturePending(was);\n was.replaceWith(message);\n morphPendingToReply(state, message, messages);\n } else {\n if (!message.isConnected) messages.append(message);\n enterMessages([message]);\n scrollToLatest(messages);\n }\n return message;\n };\n\n const confirm = (bar: HTMLElement) => {\n if (reduced()) return;\n flowIn(bar);\n const words = splitWords(bar);\n if (!words.parts.length) return;\n gsap.fromTo(\n words.parts,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.chat.confirmWordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n onComplete: () => words.revert(),\n },\n );\n };\n\n const send = () => {\n if (!input) return;\n const text = input.value.trim();\n if (!text) return;\n const allowed = root.dispatchEvent(new CustomEvent('mk:send', { bubbles: true, cancelable: true, detail: { text } }));\n if (!allowed) return;\n options.onSend?.(text);\n if (clearOnSend) {\n input.value = '';\n fitComposer(input);\n }\n };\n\n if (input) {\n scope.on(input, 'input', () => fitComposer(input));\n scope.on(input, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if (key.key !== 'Enter' || key.shiftKey || key.isComposing) return;\n event.preventDefault();\n send();\n });\n }\n if (composer) {\n scope.on(composer, 'submit', (event) => {\n event.preventDefault();\n send();\n });\n const sendButton = part(root, 'send');\n if (sendButton && !composer.matches('form')) scope.on(sendButton, 'click', send);\n }\n scope.add(() => {\n clearPending();\n placeholder?.remove();\n placeholder = null;\n });\n if (input) fitComposer(input);\n root.dataset.mkReady = '';\n\n return {\n add,\n pending,\n reply,\n confirm,\n setRecording(on: boolean) {\n if (mic) scope.attr(mic, 'data-mk-recording', on ? '' : null);\n },\n scrollToLatest: () => scrollToLatest(messages),\n adopt: (message: Element) => seen.add(message),\n messages,\n destroy() {\n scope.dispose();\n if (input) input.style.removeProperty('height');\n delete root.dataset.mkReady;\n },\n };\n}\n","import { entrances } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { revealFrom, type RevealHandle } from '../../motion/reveal';\n\n/*\n * navigation: seven desktop styles (Clásica, Bonita, Dock, Guapa,\n * Tasks, Melon, Tunnel) and one glass bar on phones, all in CSS (nav.css). The\n * engine marks the current page (aria-current=\"page\"), switches styles (and can\n * remember the choice), and on start can reveal the\n * app shell from the first button.\n * Parts: .mk-nav__buttons .mk-nav__button (data-mk-value or href), .mk-nav__button--first.\n */\n\nexport const NAV_STYLES = ['clasica', 'bonita', 'dock', 'guapa', 'tasks', 'melon', 'tunnel'] as const;\nexport type NavStyle = (typeof NAV_STYLES)[number];\n\nexport interface NavOptions {\n /** Default: the saved one (storageKey), else the mk-nav--<style> class in the markup, else 'bonita' (Money's default). */\n style?: NavStyle;\n /** The accent variant: the current page in primary-container. */\n accent?: boolean;\n /** Reveal the shell from the first button when the nav starts (off by default). */\n reveal?: boolean;\n /** Remember the chosen style in localStorage under this key. */\n storageKey?: string;\n labels?: { nav?: string };\n onSelect?: (index: number, value: string | undefined, item: HTMLElement) => void;\n}\n\nexport interface NavInstance extends Instance {\n /** Mark a page as current, by index or value (silent: no event). */\n select(target: number | string): void;\n setStyle(style: NavStyle): void;\n setAccent(on: boolean): void;\n readonly index: number;\n readonly style: NavStyle;\n readonly items: HTMLElement[];\n}\n\nexport interface NavigateDetail {\n index: number;\n value: string | undefined;\n item: HTMLElement;\n /** The click: call its preventDefault() to stop a link (single-page apps). */\n originalEvent: MouseEvent;\n}\n\nconst ITEM = '.mk-nav__buttons .mk-nav__button';\nconst isStyle = (value: unknown): value is NavStyle => NAV_STYLES.includes(value as NavStyle);\nconst valueOf = (item: HTMLElement) => item.dataset.mkValue ?? item.getAttribute('href') ?? undefined;\n\nconst read = (key: string) => {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n};\nconst write = (key: string, value: string) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n // Private mode or blocked storage: the style still changes for this page.\n }\n};\n\n/** nav entrance: the app shell is uncovered from the nav's first button. */\nexport function revealShell(nav: HTMLElement): RevealHandle | null {\n if (!entrances()) return null;\n const shell = nav.closest<HTMLElement>('.mk-shell') ?? nav.parentElement;\n if (!shell) return null;\n const origin = nav.querySelector<HTMLElement>('.mk-nav__button--first') ?? nav.querySelector<HTMLElement>(ITEM) ?? nav;\n return revealFrom(shell, { origin });\n}\n\nexport function createNav(root: HTMLElement | null, options: NavOptions = {}): NavInstance {\n if (!root) {\n warnOnce('nav: missing root');\n return inert({ select() {}, setStyle() {}, setAccent() {}, index: -1, style: 'bonita', items: [] });\n }\n const scope = createScope();\n const items = () => [...root.querySelectorAll<HTMLElement>(ITEM)];\n const fromClass = NAV_STYLES.find((name) => root.classList.contains(`mk-nav--${name}`));\n const saved = options.storageKey ? read(options.storageKey) : null;\n let style: NavStyle = options.style ?? (isStyle(saved) ? saved : undefined) ?? fromClass ?? 'bonita';\n\n const paint = (accent: boolean) => {\n const classes = new Set(root.classList);\n for (const name of NAV_STYLES) classes.delete(`mk-nav--${name}`);\n classes.add('mk-nav');\n classes.add(`mk-nav--${style}`);\n if (accent) classes.add('mk-nav--accent');\n else classes.delete('mk-nav--accent');\n scope.attr(root, 'class', [...classes].join(' '));\n };\n let accent = options.accent ?? root.classList.contains('mk-nav--accent');\n paint(accent);\n\n if (root.localName !== 'nav') scope.attr(root, 'role', 'navigation');\n if (!root.hasAttribute('aria-label') && !root.hasAttribute('aria-labelledby')) scope.attr(root, 'aria-label', options.labels?.nav ?? 'Principal');\n\n const mark = (current: HTMLElement | undefined) => {\n for (const item of items()) scope.attr(item, 'aria-current', item === current ? 'page' : null);\n };\n const find = (target: number | string) => {\n const list = items();\n return typeof target === 'number' ? list[target] : list.find((item) => valueOf(item) === target);\n };\n\n scope.on(root, 'click', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);\n if (!item || !root.contains(item)) return;\n const index = items().indexOf(item);\n const value = valueOf(item);\n const detail: NavigateDetail = { index, value, item, originalEvent: event as MouseEvent };\n if (!root.dispatchEvent(new CustomEvent('mk:navigate', { bubbles: true, cancelable: true, detail }))) {\n event.preventDefault();\n return;\n }\n mark(item);\n options.onSelect?.(index, value, item);\n });\n\n let reveal: RevealHandle | null = null;\n if (options.reveal) reveal = revealShell(root);\n root.dataset.mkReady = '';\n\n return {\n select(target) {\n const item = find(target);\n if (!item) warnOnce(`nav: no item ${JSON.stringify(target)}`);\n else mark(item);\n },\n setStyle(next) {\n if (!isStyle(next)) {\n warnOnce(`nav: unknown style \"${String(next)}\" (use ${NAV_STYLES.join(', ')})`);\n return;\n }\n style = next;\n paint(accent);\n if (options.storageKey) write(options.storageKey, next);\n },\n setAccent(on) {\n accent = on;\n paint(accent);\n },\n get index() {\n return items().findIndex((item) => item.getAttribute('aria-current') === 'page');\n },\n get style() {\n return style;\n },\n get items() {\n return items();\n },\n destroy() {\n reveal?.cancel();\n reveal = null;\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { subscribe } from '../../core/loop';\nimport { motionSpring } from '../../core/physics-spring';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { ICON_PATHS } from '../icons';\n\n/*\n * Two cursors.\n * chip: the system cursor stays; over [data-mk-cursor=\"Label\"] a glass\n * chip with the label follows the pointer on a Motion 800/35 spring, popping in\n * from scale .8 (500/30); data-mk-cursor-shape=\"circle\" makes it a 96 px disc;\n * it stays 10 px inside the window; its ink is the accent on light backgrounds\n * and white on dark ones.\n * dot: inside its zone a disc replaces the cursor and eases after it\n * (lerp .2 a frame) with a word (data-mk-cursor or `text`); pressing shrinks it\n * to .7, drops the word and slides two arrows in; [data-mk-cursor-hide] hides it.\n * Off on touch screens and with reduced motion.\n */\n\nexport type CursorVariant = 'chip' | 'dot';\n\nexport interface CursorOptions {\n variant?: CursorVariant;\n /** Where it works. chip: the document; dot: the host's parent. */\n zone?: Element | null;\n /** dot: the word when nothing under the pointer gives one. */\n text?: string;\n /** dot: arrows shown while pressed. */\n arrows?: 'x' | 'y' | 'none';\n}\n\nexport interface CursorInstance extends Instance {\n readonly visible: boolean;\n readonly label: string;\n readonly position: { x: number; y: number };\n readonly tone: 'light' | 'dark';\n /** One frame (dt = 1 at 60 Hz); the shared ticker calls it. */\n update(dt?: number): void;\n}\n\nconst svg = (extra = '') =>\n `<svg aria-hidden=\"true\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${extra}><path d=\"${ICON_PATHS.send}\"/></svg>`;\n\n/** the first background with alpha > .1 up the tree; light when (299R + 587G + 114B) / 1000 > 180. */\nfunction backgroundTone(el: Element | null): 'light' | 'dark' {\n if (!el) return 'light';\n if (el.closest('img, video, picture, canvas')) return 'dark';\n for (let node: Element | null = el; node; node = node.parentElement) {\n const match = getComputedStyle(node).backgroundColor.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/);\n if (!match) continue;\n const alpha = match[4] === undefined ? 1 : parseFloat(match[4]);\n if (alpha <= 0.1) continue;\n const luminance = (Number(match[1]) * 299 + Number(match[2]) * 587 + Number(match[3]) * 114) / 1000;\n return luminance > TIMING.cursor.light ? 'light' : 'dark';\n }\n return 'light';\n}\n\nexport function createCursor(host: HTMLElement | null, options: CursorOptions = {}): CursorInstance {\n const variant = options.variant ?? 'chip';\n const idle = inert<CursorInstance>({ visible: false, label: '', position: { x: 0, y: 0 }, tone: 'light', update() {} });\n if (!host) {\n warnOnce('cursor: missing element');\n return idle;\n }\n const coarse = typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches;\n if (coarse || reduced()) return idle;\n registerMotion();\n const scope = createScope();\n const t = TIMING.cursor;\n const zone = options.zone ?? (variant === 'dot' ? (host.parentElement ?? document.body) : document.documentElement);\n scope.attr(host, 'class', [host.getAttribute('class'), 'mk-cursor', `mk-cursor--${variant}`].filter(Boolean).join(' '));\n scope.attr(host, 'aria-hidden', 'true');\n\n const pointer = { x: -100, y: -100, placed: false };\n const position = { x: -100, y: -100 };\n const velocity = { x: 0, y: 0 };\n let visible = false;\n let label = '';\n let tone: 'light' | 'dark' = 'light';\n const made: Element[] = [];\n\n // ── Markup ────────────────────────────────────────────────────────────────\n let chip: HTMLElement | null = null;\n let chipLabel: HTMLElement | null = null;\n let chipIcon: HTMLElement | null = null;\n let word: HTMLElement | null = null;\n const size = { width: 0, height: 0 };\n if (variant === 'chip') {\n chip = document.createElement('span');\n chip.className = 'mk-cursor__chip mk-glass';\n chip.innerHTML =\n '<span class=\"mk-glass__shadow\" aria-hidden=\"true\"></span><span class=\"mk-cursor__icon mk-icon\"></span><span class=\"mk-cursor__label\"></span>';\n chipIcon = chip.querySelector('.mk-cursor__icon');\n chipLabel = chip.querySelector('.mk-cursor__label');\n host.append(chip);\n made.push(chip);\n gsap.set(chip, { autoAlpha: 0, scale: 0.8 });\n } else {\n const arrows = options.arrows ?? 'y';\n scope.attr(host, 'data-mk-arrows', arrows);\n scope.attr(zone, 'data-mk-cursor-zone', '');\n const dot = document.createElement('span');\n dot.className = 'mk-cursor__dot';\n dot.innerHTML =\n arrows === 'none'\n ? '<span class=\"mk-cursor__circle\"></span><span class=\"mk-cursor__text\"><span class=\"mk-cursor__word\"></span></span>'\n : `<span class=\"mk-cursor__circle\"></span><span class=\"mk-cursor__arrow mk-cursor__arrow--start\">${svg()}</span><span class=\"mk-cursor__text\"><span class=\"mk-cursor__word\"></span></span><span class=\"mk-cursor__arrow mk-cursor__arrow--end\">${svg()}</span>`;\n word = dot.querySelector('.mk-cursor__word');\n if (word) word.textContent = options.text ?? '';\n host.append(dot);\n made.push(dot);\n scope.attr(host, 'data-mk-hidden', '');\n }\n\n // ── Chip ──────────────────────────────────────────────────────────────────\n const appear = motionSpring(...TIMING.springs.cursorAppear);\n const showChip = (next: HTMLElement | null) => {\n if (!chip || !chipLabel || !chipIcon) return;\n const text = next?.dataset.mkCursor ?? '';\n if (text) {\n label = text;\n chipLabel.textContent = text;\n chipIcon.textContent = next?.dataset.mkCursorIcon ?? '';\n chip.classList.toggle('mk-cursor__chip--circle', next?.dataset.mkCursorShape === 'circle');\n const box = chip.getBoundingClientRect();\n size.width = box.width;\n size.height = box.height;\n }\n if (Boolean(text) === visible) return;\n visible = Boolean(text);\n if (!visible) label = '';\n gsap.to(chip, {\n autoAlpha: visible ? 1 : 0,\n scale: visible ? 1 : 0.8,\n duration: appear.duration,\n ease: appear.ease,\n overwrite: 'auto',\n });\n };\n\n // ── Dot ───────────────────────────────────────────────────────────────────\n let inZone = false;\n let overHide = false;\n const syncDot = () => scope.attr(host, 'data-mk-hidden', inZone && !overHide ? null : '');\n const wordFor = (target: Element | null) => {\n if (!word) return;\n const source = target?.closest<HTMLElement>('[data-mk-cursor]');\n word.textContent = source && zone.contains(source) ? (source.dataset.mkCursor ?? '') : (options.text ?? '');\n };\n\n // ── Events ────────────────────────────────────────────────────────────────\n const place = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n pointer.x = event.clientX;\n pointer.y = event.clientY;\n if (!pointer.placed) {\n pointer.placed = true;\n if (variant === 'dot') {\n position.x = pointer.x;\n position.y = pointer.y;\n }\n }\n };\n scope.on(window, 'pointermove', (event) => place(event as PointerEvent), { passive: true });\n const overTarget = variant === 'chip' ? document : zone;\n scope.on(overTarget, 'pointerover', (event) => {\n const target = event.target as Element | null;\n if (variant === 'chip') {\n const source = target?.closest<HTMLElement>('[data-mk-cursor]') ?? null;\n showChip(source && zone.contains(source) ? source : null);\n return;\n }\n overHide = Boolean(target?.closest('[data-mk-cursor-hide]'));\n wordFor(target);\n syncDot();\n });\n if (variant === 'dot') {\n scope.on(zone, 'pointerenter', (event) => {\n place(event as PointerEvent);\n inZone = true;\n visible = true;\n syncDot();\n });\n scope.on(zone, 'pointerleave', () => {\n inZone = false;\n visible = false;\n scope.attr(host, 'data-mk-pressed', null);\n syncDot();\n });\n scope.on(zone, 'pointerdown', () => scope.attr(host, 'data-mk-pressed', ''));\n scope.on(window, 'pointerup', () => scope.attr(host, 'data-mk-pressed', null));\n }\n\n // ── Frame ─────────────────────────────────────────────────────────────────\n const [stiffness, damping] = TIMING.springs.cursorFollow;\n const update = (dt = 1) => {\n if (variant === 'chip') {\n // Keeps the chip inside the window, 10 px from its edges.\n const halfW = size.width / 2 + t.gutter;\n const halfH = size.height / 2 + t.gutter;\n const tx = size.width ? Math.min(Math.max(pointer.x, halfW), innerWidth - halfW) : pointer.x;\n const ty = size.height ? Math.min(Math.max(pointer.y, halfH), innerHeight - halfH) : pointer.y;\n // Motion's spring, integrated in small steps.\n const steps = Math.max(1, Math.ceil(dt * 4));\n const h = dt / 60 / steps;\n for (let i = 0; i < steps; i++) {\n velocity.x += (stiffness * (tx - position.x) - damping * velocity.x) * h;\n velocity.y += (stiffness * (ty - position.y) - damping * velocity.y) * h;\n position.x += velocity.x * h;\n position.y += velocity.y * h;\n }\n if (visible && typeof document.elementFromPoint === 'function') {\n tone = backgroundTone(document.elementFromPoint(pointer.x, pointer.y));\n if (chip && chip.dataset.mkTone !== tone) chip.dataset.mkTone = tone;\n }\n } else {\n const step = 1 - Math.pow(1 - t.dotLerp, dt);\n position.x += (pointer.x - position.x) * step;\n position.y += (pointer.y - position.y) * step;\n }\n host.style.transform = `translate3d(${position.x.toFixed(2)}px, ${position.y.toFixed(2)}px, 0) translate(-50%, -50%)`;\n };\n scope.add(subscribe(update));\n update(0);\n host.dataset.mkReady = '';\n\n return {\n get visible() {\n return visible;\n },\n get label() {\n return label;\n },\n get position() {\n return { ...position };\n },\n get tone() {\n return tone;\n },\n update,\n destroy() {\n if (chip) gsap.killTweensOf(chip);\n scope.dispose();\n for (const node of made.splice(0)) node.remove();\n host.style.removeProperty('transform');\n if (host.getAttribute('style') === '') host.removeAttribute('style');\n delete host.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { entrances, 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 * floating navbar: a frosted glass pill centred at the top that grows\n * into a rounded panel (CSS grid rows 0fr → 1fr, 0.6 s cubic-bezier(.625,.05,0,1),\n * 0.125 s late; radius 3em → 2em) while the page behind darkens to .4 and the\n * panel's rows rise in 0.15 s + 0.025 s apart. Several triggers share the shell:\n * the same one closes, another switches straight to its panel. Escape, the\n * backdrop, a link inside and scrolling after a wheel/touch close it. On load it\n * drops in from −300 % over 1.8 s.\n *\n * Markup: [data-mk-island-toggle=\"name\"] buttons, [data-mk-island-panel=\"name\"]\n * sections, [data-mk-island-item] rows, [data-mk-island-close] backdrop,\n * .mk-island__shell and .mk-island__cta (hidden while open).\n */\n\nexport interface IslandOptions {\n /** Drop in from above on load (true), wait for ready() ('manual') or not at all. */\n entrance?: boolean | 'manual';\n /** Close when the page scrolls after a wheel or touch. */\n closeOnScroll?: boolean;\n /** Close when a link inside a panel is followed. */\n closeOnNavigate?: boolean;\n /** Focus the first control of the panel that opens. */\n focusOnOpen?: boolean;\n /** The open panel's name, or null when it closes. */\n onChange?: (active: string | null) => void;\n}\n\nexport interface IslandInstance extends Instance {\n open(name?: string): void;\n close(returnFocus?: boolean): void;\n toggle(name?: string): void;\n /** Play the entrance (entrance: 'manual'). */\n ready(): void;\n readonly active: string | null;\n}\n\nlet sequence = 0;\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nexport function createIsland(root: HTMLElement | null, options: IslandOptions = {}): IslandInstance {\n const shell = root?.querySelector<HTMLElement>('.mk-island__shell') ?? null;\n const panels = root ? [...root.querySelectorAll<HTMLElement>('[data-mk-island-panel]')] : [];\n if (!root || !shell || !panels.length) {\n warnOnce('island: needs .mk-island__shell and at least one [data-mk-island-panel]');\n return inert({ open() {}, close() {}, toggle() {}, ready() {}, active: null });\n }\n const t = TIMING.island;\n const { entrance = true, closeOnScroll = true, closeOnNavigate = true, focusOnOpen = true, onChange } = options;\n registerMotion();\n const scope = createScope();\n const toggles = [...root.querySelectorAll<HTMLElement>('[data-mk-island-toggle]')];\n const cta = root.querySelector<HTMLElement>('.mk-island__cta');\n const backdrops = [...root.querySelectorAll<HTMLElement>('[data-mk-island-close]')];\n let active: string | null = null;\n let trigger: HTMLElement | null = null;\n let scrollStart = 0;\n let armed = false;\n let focusTimer: ReturnType<typeof setTimeout> | undefined;\n let entered = false;\n let entry: gsap.core.Tween | null = null;\n\n const flag = (el: Element | null, name: string, on: boolean) => {\n if (el) scope.attr(el, name, on ? '' : null);\n };\n const sync = () => {\n for (const panel of panels) {\n const on = panel.dataset.mkIslandPanel === active;\n // A closing panel stays in the collapsing grid for its exit.\n if (active) flag(panel, 'hidden', !on);\n scope.attr(panel, 'aria-hidden', String(!on));\n flag(panel, 'inert', !on);\n }\n for (const button of toggles) scope.attr(button, 'aria-expanded', String(button.dataset.mkIslandToggle === active));\n flag(cta, 'inert', Boolean(active));\n for (const backdrop of backdrops) {\n flag(backdrop, 'inert', !active);\n scope.attr(backdrop, 'aria-hidden', String(!active));\n }\n flag(root, 'data-mk-open', Boolean(active));\n scope.attr(root, 'data-mk-active', active);\n };\n const stagger = (opening: boolean) => {\n root.querySelectorAll<HTMLElement>('[data-mk-island-item]').forEach((item, index) => {\n // Saves the original style once, so destroy() puts it back.\n scope.attr(item, 'style', item.getAttribute('style'));\n item.style.setProperty('--mk-island-delay', opening ? `${Number((t.delay + index * t.step).toFixed(3))}s` : '0s');\n });\n };\n\n const close = (returnFocus = true) => {\n if (scope.disposed || !active) return;\n clearTimeout(focusTimer);\n active = null;\n stagger(false);\n sync();\n onChange?.(null);\n if (returnFocus && trigger?.isConnected) trigger.focus({ preventScroll: true });\n };\n const open = (name = panels[0]!.dataset.mkIslandPanel!, source?: HTMLElement) => {\n if (scope.disposed) return;\n const panel = panels.find((el) => el.dataset.mkIslandPanel === name);\n if (!panel) return;\n const wasClosed = !active;\n clearTimeout(focusTimer);\n active = name;\n trigger = source ?? toggles.find((el) => el.dataset.mkIslandToggle === name) ?? trigger;\n if (wasClosed) {\n scrollStart = window.scrollY;\n armed = false;\n stagger(true);\n }\n sync();\n onChange?.(name);\n if (focusOnOpen)\n focusTimer = setTimeout(\n () => {\n if (active !== name) return;\n const first = [...panel.querySelectorAll<HTMLElement>(FOCUSABLE)].find((el) => !el.closest('[hidden], [inert]'));\n (first ?? panel).focus({ preventScroll: true });\n },\n reduced() ? 0 : t.focus,\n );\n };\n const toggle = (name = panels[0]!.dataset.mkIslandPanel!, source?: HTMLElement) => (active === name ? close(false) : open(name, source));\n\n for (const panel of panels) {\n if (!panel.id) scope.attr(panel, 'id', `mk-island-panel-${++sequence}`);\n if (!panel.hasAttribute('tabindex')) scope.attr(panel, 'tabindex', '-1');\n if (!panel.hasAttribute('role')) scope.attr(panel, 'role', 'region');\n }\n for (const button of toggles) {\n const panel = panels.find((el) => el.dataset.mkIslandPanel === button.dataset.mkIslandToggle);\n if (panel) scope.attr(button, 'aria-controls', panel.id);\n scope.on(button, 'click', () => toggle(button.dataset.mkIslandToggle, button));\n }\n for (const backdrop of backdrops) scope.on(backdrop, 'click', () => close(true));\n scope.on(document, 'keydown', (event) => {\n if (active && (event as KeyboardEvent).key === 'Escape') {\n event.preventDefault();\n close(true);\n }\n });\n if (closeOnNavigate)\n scope.on(root, 'click', (event) => {\n const link = (event.target as Element | null)?.closest?.('a[href]');\n if (active && link?.closest('[data-mk-island-panel]')) close(false);\n });\n if (closeOnScroll) {\n const arm = () => {\n if (active) armed = true;\n };\n scope.on(window, 'wheel', arm, { passive: true });\n scope.on(window, 'touchmove', arm, { passive: true });\n scope.on(\n window,\n 'scroll',\n () => {\n if (active && armed && Math.abs(window.scrollY - scrollStart) > 1) close(false);\n },\n { passive: true },\n );\n }\n scope.add(() => clearTimeout(focusTimer));\n\n // The entrance uses GSAP's default ease (power1.out).\n const moving = entrance !== false && entrances();\n if (moving) gsap.set(shell, { yPercent: t.offset });\n const ready = () => {\n if (scope.disposed || entered || !moving) return;\n entered = true;\n entry = gsap.to(shell, { yPercent: 0, duration: t.entrance });\n };\n scope.add(() => {\n entry?.kill();\n if (moving) gsap.set(shell, { clearProps: 'transform,translate' });\n if (shell.getAttribute('style') === '') shell.removeAttribute('style');\n });\n\n sync();\n if (entrance === true) ready();\n scope.attr(root, 'data-mk-ready', '');\n\n return {\n open: (name?: string) => open(name),\n close,\n toggle: (name?: string) => toggle(name),\n ready,\n get active() {\n return active;\n },\n destroy: () => scope.dispose(),\n };\n}\n"],"mappings":"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","names":["items","accent"]}
|