@yewdiel21/motion-kit 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +240 -222
  2. package/dist/auto/index.d.ts +4 -3
  3. package/dist/auto/index.js +5 -3
  4. package/dist/auto/index.js.map +1 -1
  5. package/dist/{chunk-QFBOHPWZ.js → chunk-CQP66AZK.js} +2 -2
  6. package/dist/{chunk-QP4QJOEN.js → chunk-H4STLMCM.js} +2 -2
  7. package/dist/{chunk-EDMXWUW3.js → chunk-KDIJX6G4.js} +3 -3
  8. package/dist/{chunk-DOOMULVV.js → chunk-OLT3CWDJ.js} +4 -2
  9. package/dist/chunk-OLT3CWDJ.js.map +1 -0
  10. package/dist/{chunk-AWDEKDEJ.js → chunk-PEDYJ2TV.js} +8 -22
  11. package/dist/chunk-PEDYJ2TV.js.map +1 -0
  12. package/dist/{chunk-Q7IW4FV3.js → chunk-Y4GIBTRG.js} +1422 -967
  13. package/dist/chunk-Y4GIBTRG.js.map +1 -0
  14. package/dist/css/components/code-block.css +267 -0
  15. package/dist/css/components/command-search.css +274 -2
  16. package/dist/css/components/dialog.css +264 -0
  17. package/dist/css/components/heatmap-chart.css +267 -1
  18. package/dist/css/components/scroll-area.css +261 -0
  19. package/dist/css/components/select.css +284 -4
  20. package/dist/elements/index.d.ts +15 -4
  21. package/dist/elements/index.js +36 -6
  22. package/dist/elements/index.js.map +1 -1
  23. package/dist/{engine-t8d7brjn.d.ts → engine-D6XV-WNt.d.ts} +50 -1
  24. package/dist/gl/index.js +2 -2
  25. package/dist/index.css +308 -7
  26. package/dist/index.d.ts +3 -3
  27. package/dist/index.js +7 -5
  28. package/dist/index.js.map +1 -1
  29. package/dist/react/index.d.ts +20 -7
  30. package/dist/react/index.js +56 -7
  31. package/dist/react/index.js.map +1 -1
  32. package/dist/{reduced-dPsZYqtI.d.ts → reduced-4croIXl-.d.ts} +1 -1
  33. package/dist/{store-6hZNKiee.d.ts → store-CAHWkurn.d.ts} +1 -1
  34. package/package.json +110 -110
  35. package/registry.json +1357 -1340
  36. package/src/auto/auto-init.ts +341 -339
  37. package/src/components/code-block/README.md +1 -1
  38. package/src/components/code-block/code-block.css +5 -0
  39. package/src/components/code-block/engine.ts +5 -0
  40. package/src/components/command-search/README.md +1 -1
  41. package/src/components/command-search/command-search.css +12 -2
  42. package/src/components/command-search/engine.ts +6 -0
  43. package/src/components/dialog/README.md +104 -103
  44. package/src/components/dialog/dialog.css +2 -0
  45. package/src/components/dialog/engine.ts +465 -449
  46. package/src/components/heatmap-chart/README.md +48 -48
  47. package/src/components/heatmap-chart/engine.ts +6 -1
  48. package/src/components/heatmap-chart/heatmap-chart.css +5 -1
  49. package/src/components/icons.ts +1 -0
  50. package/src/components/scroll-area/README.md +89 -0
  51. package/src/components/scroll-area/element.ts +35 -0
  52. package/src/components/scroll-area/engine.ts +528 -0
  53. package/src/components/scroll-area/react.tsx +67 -0
  54. package/src/components/scroll-area/scroll-area.css +260 -0
  55. package/src/components/select/README.md +1 -1
  56. package/src/components/select/engine.ts +16 -4
  57. package/src/components/select/select.css +22 -4
  58. package/src/core/timing.ts +2 -0
  59. package/src/elements/index.ts +321 -318
  60. package/src/index.ts +1 -0
  61. package/src/motion/morph.ts +5 -2
  62. package/src/react/index.ts +2 -1
  63. package/dist/chunk-AWDEKDEJ.js.map +0 -1
  64. package/dist/chunk-DOOMULVV.js.map +0 -1
  65. package/dist/chunk-Q7IW4FV3.js.map +0 -1
  66. /package/dist/{chunk-QFBOHPWZ.js.map → chunk-CQP66AZK.js.map} +0 -0
  67. /package/dist/{chunk-QP4QJOEN.js.map → chunk-H4STLMCM.js.map} +0 -0
  68. /package/dist/{chunk-EDMXWUW3.js.map → chunk-KDIJX6G4.js.map} +0 -0
@@ -1,339 +1,341 @@
1
- import { createNotFound } from '../components/not-found/engine';
2
- import { createMorphingPageDots } from '../components/morphing-page-dots/engine';
3
- import { createBadgeButton } from '../components/badge-button/engine';
4
- import { createMagnetizeButton } from '../components/magnetize-button/engine';
5
- import { createParticleButton } from '../components/particle-button/engine';
6
- import { createHandwritingText } from '../components/handwriting-text/engine';
7
- import { createStickyHeader } from '../components/sticky-header/engine';
8
- import { createScrollPreviewDock } from '../components/scroll-preview-dock/engine';
9
- import { createBentoGrid } from '../components/bento-grid/engine';
10
- import { createNotificationStack } from '../components/notification-stack/engine';
11
- import { createRatingScale } from '../components/rating-scale/engine';
12
- import { createTemperatureSlider } from '../components/temperature-slider/engine';
13
- import { createEqualizerSlider } from '../components/equalizer-slider/engine';
14
- import { createRadioGroup } from '../components/radio-group/engine';
15
- import { createStepper } from '../components/stepper/engine';
16
- import { createQuantity } from '../components/quantity/engine';
17
- import { createPagination } from '../components/pagination/engine';
18
- import { createHoverCard } from '../components/hover-card/engine';
19
- import { createInputOtp } from '../components/input-otp/engine';
20
- import { createJoinedCta } from '../recipes/joined-cta/create-joined-cta';
21
- import { createImageZoom } from '../recipes/image-zoom/create-image-zoom';
22
- import { createFontCycle } from '../recipes/font-cycle/create-font-cycle';
23
- import { createThumbnailNav } from '../recipes/thumbnail-nav/create-thumbnail-nav';
24
- import { createActionButton } from '../recipes/action-button/create-action-button';
25
- import { createFilmHero } from '../recipes/film-hero/create-film-hero';
26
- import { createEditorialReveal } from '../recipes/editorial-reveal/create-editorial-reveal';
27
- import { createStudioDock } from '../components/studio-dock/engine';
28
- import { createCalendar } from '../components/calendar/engine';
29
- import { createSlotPicker } from '../components/slot-picker/engine';
30
- import { createWeightHover } from '../recipes/weight-hover/create-weight-hover';
31
- import { createSticker } from '../recipes/sticker/create-sticker';
32
- import { createScrollDock } from '../recipes/scroll-dock/create-scroll-dock';
33
- import { createLocalClock } from '../recipes/local-clock/create-local-clock';
34
- import { createTrailer } from '../components/trailer/engine';
35
- import { createCreditCard } from '../components/credit-card/engine';
36
- import { createCommandSearch } from '../components/command-search/engine';
37
- import { createHoldConfirm } from '../components/hold-confirm/engine';
38
- import { createImagePreview } from '../components/image-preview/engine';
39
- import { createLikeButton } from '../components/like-button/engine';
40
- import { createNotificationBell } from '../components/notification-bell/engine';
41
- import { createPasswordStrength } from '../components/password-strength/engine';
42
- import { createScratchCard } from '../components/scratch-card/engine';
43
- import { createStarRating } from '../components/star-rating/engine';
44
- import { createSwipeActions } from '../components/swipe-actions/engine';
45
- import { createAttachment } from '../components/attachment/engine';
46
- import { createSkeleton } from '../components/skeleton/engine';
47
- import { createQuestionnaire } from '../components/questionnaire/engine';
48
- import { createCodeBlock } from '../components/code-block/engine';
49
- import { createContextMenu } from '../components/context-menu/engine';
50
- import { createDrawer } from '../components/drawer/engine';
51
- import { createLinkPreview } from '../components/link-preview/engine';
52
- import { createProgress } from '../components/progress/engine';
53
- import { createRangeSlider } from '../components/range-slider/engine';
54
- import { createChart } from '../components/chart/engine';
55
- import { createColorSlider } from '../components/color-slider/engine';
56
- import { createColorArea } from '../components/color-area/engine';
57
- import { createColorField } from '../components/color-field/engine';
58
- import { createColorPicker } from '../components/color-picker/engine';
59
- import { createTimeField } from '../components/time-field/engine';
60
- import { createRangeCalendar } from '../components/range-calendar/engine';
61
- import { createDateRangePicker } from '../components/date-range-picker/engine';
62
- import { createTooltip } from '../components/tooltip/engine';
63
- import { createPopover } from '../components/popover/engine';
64
- import { createLoadingButton } from '../components/loading-button/engine';
65
- import { createBreadcrumb } from '../components/breadcrumb/engine';
66
- import { createEmptyState } from '../components/empty-state/engine';
67
- import { createStatCard } from '../components/stat-card/engine';
68
- import { createChartTooltip } from '../components/chart-tooltip/engine';
69
- import { createMultiSelect } from '../components/multi-select/engine';
70
- import { createTagInput } from '../components/tag-input/engine';
71
- import { createDateTimePicker } from '../components/date-time-picker/engine';
72
- import { createFilterBuilder } from '../components/filter-builder/engine';
73
- import { createTimeline } from '../components/timeline/engine';
74
- import { createActivityFeed } from '../components/activity-feed/engine';
75
- import { createTreeView } from '../components/tree-view/engine';
76
- import { createFileExplorer } from '../components/file-explorer/engine';
77
- import { createJsonViewer } from '../components/json-viewer/engine';
78
- import { createVirtualList } from '../components/virtual-list/engine';
79
- import { createResizablePanel } from '../components/resizable-panel/engine';
80
- import { createSplitView } from '../components/split-view/engine';
81
- import { createDataTable } from '../components/data-table/engine';
82
- import { createEditableTable } from '../components/editable-table/engine';
83
- import { createRichTextEditor } from '../components/rich-text-editor/engine';
84
- import { createSelect } from '../components/select/engine';
85
- import { createAddToCart } from '../components/add-to-cart/engine';
86
- import { createScrollIsland } from '../components/scroll-island/engine';
87
- import { ScrollTrigger } from '../core/gsap';
88
- import { warnOnce, type Instance } from '../core/types';
89
- import { createSpringCards } from '../recipes/spring-cards/create-spring-cards';
90
- import { createCurvedCarousel } from '../recipes/curved-carousel/create-curved-carousel';
91
- import { createPile } from '../recipes/pile/create-pile';
92
- import { createWords } from '../recipes/words/create-words';
93
- import { createFlow } from '../recipes/flow/create-flow';
94
- import { createPop } from '../recipes/pop/create-pop';
95
- import { createFitText } from '../recipes/fit-text/create-fit-text';
96
- import { createStretchFooter } from '../recipes/stretch-footer/create-stretch-footer';
97
- import { createRadialMenu } from '../recipes/radial-menu/create-radial-menu';
98
- import { createTabs } from '../recipes/tabs/create-tabs';
99
- import { createCounter } from '../recipes/counter/create-counter';
100
- import { createDetails } from '../recipes/details/create-details';
101
- import { createReveal } from '../recipes/reveal/create-reveal';
102
- import { createReflow } from '../recipes/reflow/create-reflow';
103
- import { createSlotText } from '../recipes/slot-text/create-slot-text';
104
- import { createSortable } from '../recipes/sortable/create-sortable';
105
- import { createMaskText } from '../recipes/mask-text/create-mask-text';
106
- import { createCascade } from '../recipes/cascade/create-cascade';
107
- import { createTextRoll } from '../recipes/text-roll/create-text-roll';
108
- import { createLetters } from '../recipes/letters/create-letters';
109
- import { createParallax } from '../recipes/parallax/create-parallax';
110
- import { createDepthGrid } from '../recipes/depth-grid/create-depth-grid';
111
- import { createFrameZoom } from '../recipes/frame-zoom/create-frame-zoom';
112
- import { createContrast } from '../recipes/contrast/create-contrast';
113
- import { createMarquee } from '../recipes/marquee/create-marquee';
114
- import { createCardDock } from '../recipes/card-dock/create-card-dock';
115
- import { createSnapStrip } from '../recipes/snap-strip/create-snap-strip';
116
- import { createFillText } from '../recipes/fill-text/create-fill-text';
117
- import { parseOptions } from './parse-options';
118
- import { createTicketMenu } from '../recipes/ticket-menu/create-ticket-menu';
119
- import { createInfiniteReel } from '../recipes/infinite-reel/create-infinite-reel';
120
- import { createRepelBento } from '../recipes/repel-bento/create-repel-bento';
121
- import { createRotator } from '../recipes/rotator/create-rotator';
122
- import { createDragRuler } from '../recipes/drag-ruler/create-drag-ruler';
123
- import { createDockPill } from '../recipes/dock-pill/create-dock-pill';
124
-
125
- import { createSignaturePad } from '../components/signature-pad/engine';
126
-
127
- import { createWaveformPlayer } from '../components/waveform-player/engine';
128
-
129
- import { createVoiceMessageBubble } from '../components/voice-message-bubble/engine';
130
-
131
- import { createDrilldownMenu } from '../components/drilldown-menu/engine';
132
-
133
- import { createWheelPicker } from '../components/wheel-picker/engine';
134
-
135
- type Factory = (el: HTMLElement, options: Record<string, unknown>) => Instance;
136
-
137
- const factories = {
138
- 'stepper': createStepper,
139
- 'radio-group': createRadioGroup,
140
- 'equalizer-slider': createEqualizerSlider,
141
- 'temperature-slider': createTemperatureSlider,
142
- 'rating-scale': createRatingScale,
143
- 'notification-stack': createNotificationStack,
144
- 'bento-grid': createBentoGrid,
145
- 'scroll-preview-dock': createScrollPreviewDock,
146
- 'sticky-header': createStickyHeader,
147
- 'handwriting-text': createHandwritingText,
148
- 'particle-button': createParticleButton,
149
- 'magnetize-button': createMagnetizeButton,
150
- 'badge-button': createBadgeButton,
151
- 'morphing-page-dots': createMorphingPageDots,
152
- 'not-found': createNotFound,
153
-
154
- 'wheel-picker': createWheelPicker,
155
- 'drilldown-menu': createDrilldownMenu,
156
- 'voice-message-bubble': createVoiceMessageBubble,
157
- 'waveform-player': createWaveformPlayer,
158
- 'signature-pad': createSignaturePad,
159
- 'joined-cta': createJoinedCta,
160
- 'image-zoom': createImageZoom,
161
- 'font-cycle': createFontCycle,
162
- 'thumbnail-nav': createThumbnailNav,
163
- 'action-button': createActionButton,
164
- 'film-hero': createFilmHero,
165
- 'editorial-reveal': createEditorialReveal,
166
- 'studio-dock': createStudioDock,
167
- 'trailer': createTrailer,
168
- 'quantity': createQuantity,
169
- 'pagination': createPagination,
170
- 'hover-card': createHoverCard,
171
- 'input-otp': createInputOtp,
172
- 'calendar': createCalendar,
173
- 'slot-picker': createSlotPicker,
174
- 'credit-card': createCreditCard,
175
- 'command-search': createCommandSearch,
176
- 'hold-confirm': createHoldConfirm,
177
- 'image-preview': createImagePreview,
178
- 'like-button': createLikeButton,
179
- 'notification-bell': createNotificationBell,
180
- 'password-strength': createPasswordStrength,
181
- 'scratch-card': createScratchCard,
182
- 'star-rating': createStarRating,
183
- 'swipe-actions': createSwipeActions,
184
- 'attachment': createAttachment,
185
- 'skeleton': createSkeleton,
186
- 'questionnaire': createQuestionnaire,
187
- 'code-block': createCodeBlock,
188
- 'context-menu': createContextMenu,
189
- 'drawer': createDrawer,
190
- 'link-preview': createLinkPreview,
191
- 'progress': createProgress,
192
- 'range-slider': createRangeSlider,
193
- 'chart': createChart,
194
- 'color-slider': createColorSlider,
195
- 'color-area': createColorArea,
196
- 'color-field': createColorField,
197
- 'color-picker': createColorPicker,
198
- 'time-field': createTimeField,
199
- 'range-calendar': createRangeCalendar,
200
- 'date-range-picker': createDateRangePicker,
201
- 'tooltip': createTooltip,
202
- 'popover': createPopover,
203
- 'loading-button': createLoadingButton,
204
- 'breadcrumb': createBreadcrumb,
205
- 'empty-state': createEmptyState,
206
- 'stat-card': createStatCard,
207
- 'chart-tooltip': createChartTooltip,
208
- 'multi-select': createMultiSelect,
209
- 'tag-input': createTagInput,
210
- 'date-time-picker': createDateTimePicker,
211
- 'filter-builder': createFilterBuilder,
212
- 'timeline': createTimeline,
213
- 'activity-feed': createActivityFeed,
214
- 'tree-view': createTreeView,
215
- 'file-explorer': createFileExplorer,
216
- 'json-viewer': createJsonViewer,
217
- 'virtual-list': createVirtualList,
218
- 'resizable-panel': createResizablePanel,
219
- 'split-view': createSplitView,
220
- 'data-table': createDataTable,
221
- 'editable-table': createEditableTable,
222
- 'rich-text-editor': createRichTextEditor,
223
- 'select': createSelect,
224
- 'add-to-cart': createAddToCart,
225
- 'scroll-island': createScrollIsland,
226
- 'weight-hover': createWeightHover,
227
- 'sticker': createSticker,
228
- 'scroll-dock': createScrollDock,
229
- 'local-clock': createLocalClock,
230
- 'spring-cards': createSpringCards,
231
- 'curved-carousel': (el, options) =>
232
- createCurvedCarousel(el, {
233
- ...options,
234
- onSelect: (index, slide) => el.dispatchEvent(new CustomEvent('mk:select', { detail: { index, slide }, bubbles: true })),
235
- }),
236
- pile: createPile,
237
- words: createWords,
238
- flow: createFlow,
239
- pop: createPop,
240
- 'fit-text': createFitText,
241
- 'stretch-footer': createStretchFooter,
242
- 'radial-menu': createRadialMenu,
243
- tabs: createTabs,
244
- counter: createCounter,
245
- details: (el) => createDetails(el),
246
- reveal: createReveal,
247
- reflow: createReflow,
248
- 'slot-text': createSlotText,
249
- sortable: createSortable,
250
- 'mask-text': createMaskText,
251
- cascade: createCascade,
252
- 'text-roll': createTextRoll,
253
- letters: createLetters,
254
- parallax: createParallax,
255
- 'depth-grid': createDepthGrid,
256
- 'frame-zoom': createFrameZoom,
257
- contrast: createContrast,
258
- marquee: createMarquee,
259
- 'card-dock': createCardDock,
260
- 'snap-strip': createSnapStrip,
261
- 'fill-text': createFillText,
262
- 'ticket-menu': createTicketMenu,
263
- 'infinite-reel': createInfiniteReel,
264
- 'repel-bento': createRepelBento,
265
- 'rotator': createRotator,
266
- 'drag-ruler': createDragRuler,
267
- 'dock-pill': createDockPill,
268
- } satisfies Record<string, Factory>;
269
-
270
- export type RecipeName = keyof typeof factories;
271
- export const recipeNames = Object.keys(factories) as RecipeName[];
272
-
273
- /** Measured text: wait for web fonts, fit before splitting into words. */
274
- const AFTER_FONTS: RecipeName[] = ['fit-text', 'words', 'slot-text'];
275
-
276
- const instances = new WeakMap<HTMLElement, Map<RecipeName, Instance>>();
277
-
278
- export interface AutoInitOptions {
279
- /** Only start these recipes. */
280
- only?: RecipeName[];
281
- }
282
-
283
- /**
284
- * Start every `[data-mk]` recipe inside `root` (an element may list several:
285
- * `data-mk="fit-text words"`). Options come from `data-mk-*` attributes.
286
- * Returns a function that destroys what this call created. Safe to call again:
287
- * elements that already run a recipe are skipped.
288
- */
289
- export function autoInit(root: ParentNode = document, { only }: AutoInitOptions = {}): () => void {
290
- if (typeof window === 'undefined') return () => {};
291
- const created: Array<[HTMLElement, RecipeName, Instance]> = [];
292
- let cancelled = false;
293
-
294
- const elements = [...root.querySelectorAll<HTMLElement>('[data-mk]')];
295
- if (root instanceof HTMLElement && root.matches('[data-mk]')) elements.unshift(root);
296
-
297
- const start = (el: HTMLElement, name: RecipeName) => {
298
- if (cancelled) return;
299
- const running = instances.get(el) ?? new Map<RecipeName, Instance>();
300
- if (running.has(name)) return;
301
- const instance = (factories[name] as Factory)(el, parseOptions(el));
302
- running.set(name, instance);
303
- instances.set(el, running);
304
- created.push([el, name, instance]);
305
- };
306
-
307
- const now: Array<[HTMLElement, RecipeName]> = [];
308
- const later: Array<[HTMLElement, RecipeName]> = [];
309
- for (const el of elements) {
310
- for (const raw of (el.dataset.mk ?? '').split(/\s+/).filter(Boolean)) {
311
- if (!(raw in factories)) {
312
- warnOnce(`autoInit: unknown recipe "${raw}" (known: ${recipeNames.join(', ')})`);
313
- continue;
314
- }
315
- const name = raw as RecipeName;
316
- if (only && !only.includes(name)) continue;
317
- (AFTER_FONTS.includes(name) ? later : now).push([el, name]);
318
- }
319
- }
320
-
321
- now.forEach(([el, name]) => start(el, name));
322
- if (later.length) {
323
- later.sort((a, b) => AFTER_FONTS.indexOf(a[1]) - AFTER_FONTS.indexOf(b[1]));
324
- const fonts = document.fonts?.ready ?? Promise.resolve();
325
- void Promise.race([fonts, new Promise((resolve) => setTimeout(resolve, 1500))]).then(() => {
326
- later.forEach(([el, name]) => start(el, name));
327
- if (!cancelled) ScrollTrigger.refresh();
328
- });
329
- }
330
-
331
- return () => {
332
- cancelled = true;
333
- for (const [el, name, instance] of created.reverse()) {
334
- instance.destroy();
335
- instances.get(el)?.delete(name);
336
- }
337
- created.length = 0;
338
- };
339
- }
1
+ import { createNotFound } from '../components/not-found/engine';
2
+ import { createMorphingPageDots } from '../components/morphing-page-dots/engine';
3
+ import { createBadgeButton } from '../components/badge-button/engine';
4
+ import { createMagnetizeButton } from '../components/magnetize-button/engine';
5
+ import { createParticleButton } from '../components/particle-button/engine';
6
+ import { createHandwritingText } from '../components/handwriting-text/engine';
7
+ import { createStickyHeader } from '../components/sticky-header/engine';
8
+ import { createScrollPreviewDock } from '../components/scroll-preview-dock/engine';
9
+ import { createBentoGrid } from '../components/bento-grid/engine';
10
+ import { createNotificationStack } from '../components/notification-stack/engine';
11
+ import { createRatingScale } from '../components/rating-scale/engine';
12
+ import { createTemperatureSlider } from '../components/temperature-slider/engine';
13
+ import { createEqualizerSlider } from '../components/equalizer-slider/engine';
14
+ import { createRadioGroup } from '../components/radio-group/engine';
15
+ import { createStepper } from '../components/stepper/engine';
16
+ import { createQuantity } from '../components/quantity/engine';
17
+ import { createPagination } from '../components/pagination/engine';
18
+ import { createHoverCard } from '../components/hover-card/engine';
19
+ import { createInputOtp } from '../components/input-otp/engine';
20
+ import { createJoinedCta } from '../recipes/joined-cta/create-joined-cta';
21
+ import { createImageZoom } from '../recipes/image-zoom/create-image-zoom';
22
+ import { createFontCycle } from '../recipes/font-cycle/create-font-cycle';
23
+ import { createThumbnailNav } from '../recipes/thumbnail-nav/create-thumbnail-nav';
24
+ import { createActionButton } from '../recipes/action-button/create-action-button';
25
+ import { createFilmHero } from '../recipes/film-hero/create-film-hero';
26
+ import { createEditorialReveal } from '../recipes/editorial-reveal/create-editorial-reveal';
27
+ import { createStudioDock } from '../components/studio-dock/engine';
28
+ import { createCalendar } from '../components/calendar/engine';
29
+ import { createSlotPicker } from '../components/slot-picker/engine';
30
+ import { createWeightHover } from '../recipes/weight-hover/create-weight-hover';
31
+ import { createSticker } from '../recipes/sticker/create-sticker';
32
+ import { createScrollDock } from '../recipes/scroll-dock/create-scroll-dock';
33
+ import { createLocalClock } from '../recipes/local-clock/create-local-clock';
34
+ import { createTrailer } from '../components/trailer/engine';
35
+ import { createCreditCard } from '../components/credit-card/engine';
36
+ import { createCommandSearch } from '../components/command-search/engine';
37
+ import { createHoldConfirm } from '../components/hold-confirm/engine';
38
+ import { createImagePreview } from '../components/image-preview/engine';
39
+ import { createLikeButton } from '../components/like-button/engine';
40
+ import { createNotificationBell } from '../components/notification-bell/engine';
41
+ import { createPasswordStrength } from '../components/password-strength/engine';
42
+ import { createScratchCard } from '../components/scratch-card/engine';
43
+ import { createStarRating } from '../components/star-rating/engine';
44
+ import { createSwipeActions } from '../components/swipe-actions/engine';
45
+ import { createAttachment } from '../components/attachment/engine';
46
+ import { createSkeleton } from '../components/skeleton/engine';
47
+ import { createQuestionnaire } from '../components/questionnaire/engine';
48
+ import { createCodeBlock } from '../components/code-block/engine';
49
+ import { createContextMenu } from '../components/context-menu/engine';
50
+ import { createDrawer } from '../components/drawer/engine';
51
+ import { createLinkPreview } from '../components/link-preview/engine';
52
+ import { createProgress } from '../components/progress/engine';
53
+ import { createRangeSlider } from '../components/range-slider/engine';
54
+ import { createChart } from '../components/chart/engine';
55
+ import { createColorSlider } from '../components/color-slider/engine';
56
+ import { createColorArea } from '../components/color-area/engine';
57
+ import { createColorField } from '../components/color-field/engine';
58
+ import { createColorPicker } from '../components/color-picker/engine';
59
+ import { createTimeField } from '../components/time-field/engine';
60
+ import { createRangeCalendar } from '../components/range-calendar/engine';
61
+ import { createDateRangePicker } from '../components/date-range-picker/engine';
62
+ import { createTooltip } from '../components/tooltip/engine';
63
+ import { createPopover } from '../components/popover/engine';
64
+ import { createLoadingButton } from '../components/loading-button/engine';
65
+ import { createBreadcrumb } from '../components/breadcrumb/engine';
66
+ import { createEmptyState } from '../components/empty-state/engine';
67
+ import { createStatCard } from '../components/stat-card/engine';
68
+ import { createChartTooltip } from '../components/chart-tooltip/engine';
69
+ import { createMultiSelect } from '../components/multi-select/engine';
70
+ import { createTagInput } from '../components/tag-input/engine';
71
+ import { createDateTimePicker } from '../components/date-time-picker/engine';
72
+ import { createFilterBuilder } from '../components/filter-builder/engine';
73
+ import { createTimeline } from '../components/timeline/engine';
74
+ import { createActivityFeed } from '../components/activity-feed/engine';
75
+ import { createTreeView } from '../components/tree-view/engine';
76
+ import { createFileExplorer } from '../components/file-explorer/engine';
77
+ import { createJsonViewer } from '../components/json-viewer/engine';
78
+ import { createVirtualList } from '../components/virtual-list/engine';
79
+ import { createResizablePanel } from '../components/resizable-panel/engine';
80
+ import { createSplitView } from '../components/split-view/engine';
81
+ import { createDataTable } from '../components/data-table/engine';
82
+ import { createEditableTable } from '../components/editable-table/engine';
83
+ import { createRichTextEditor } from '../components/rich-text-editor/engine';
84
+ import { createSelect } from '../components/select/engine';
85
+ import { createAddToCart } from '../components/add-to-cart/engine';
86
+ import { createScrollIsland } from '../components/scroll-island/engine';
87
+ import { createScrollArea } from '../components/scroll-area/engine';
88
+ import { ScrollTrigger } from '../core/gsap';
89
+ import { warnOnce, type Instance } from '../core/types';
90
+ import { createSpringCards } from '../recipes/spring-cards/create-spring-cards';
91
+ import { createCurvedCarousel } from '../recipes/curved-carousel/create-curved-carousel';
92
+ import { createPile } from '../recipes/pile/create-pile';
93
+ import { createWords } from '../recipes/words/create-words';
94
+ import { createFlow } from '../recipes/flow/create-flow';
95
+ import { createPop } from '../recipes/pop/create-pop';
96
+ import { createFitText } from '../recipes/fit-text/create-fit-text';
97
+ import { createStretchFooter } from '../recipes/stretch-footer/create-stretch-footer';
98
+ import { createRadialMenu } from '../recipes/radial-menu/create-radial-menu';
99
+ import { createTabs } from '../recipes/tabs/create-tabs';
100
+ import { createCounter } from '../recipes/counter/create-counter';
101
+ import { createDetails } from '../recipes/details/create-details';
102
+ import { createReveal } from '../recipes/reveal/create-reveal';
103
+ import { createReflow } from '../recipes/reflow/create-reflow';
104
+ import { createSlotText } from '../recipes/slot-text/create-slot-text';
105
+ import { createSortable } from '../recipes/sortable/create-sortable';
106
+ import { createMaskText } from '../recipes/mask-text/create-mask-text';
107
+ import { createCascade } from '../recipes/cascade/create-cascade';
108
+ import { createTextRoll } from '../recipes/text-roll/create-text-roll';
109
+ import { createLetters } from '../recipes/letters/create-letters';
110
+ import { createParallax } from '../recipes/parallax/create-parallax';
111
+ import { createDepthGrid } from '../recipes/depth-grid/create-depth-grid';
112
+ import { createFrameZoom } from '../recipes/frame-zoom/create-frame-zoom';
113
+ import { createContrast } from '../recipes/contrast/create-contrast';
114
+ import { createMarquee } from '../recipes/marquee/create-marquee';
115
+ import { createCardDock } from '../recipes/card-dock/create-card-dock';
116
+ import { createSnapStrip } from '../recipes/snap-strip/create-snap-strip';
117
+ import { createFillText } from '../recipes/fill-text/create-fill-text';
118
+ import { parseOptions } from './parse-options';
119
+ import { createTicketMenu } from '../recipes/ticket-menu/create-ticket-menu';
120
+ import { createInfiniteReel } from '../recipes/infinite-reel/create-infinite-reel';
121
+ import { createRepelBento } from '../recipes/repel-bento/create-repel-bento';
122
+ import { createRotator } from '../recipes/rotator/create-rotator';
123
+ import { createDragRuler } from '../recipes/drag-ruler/create-drag-ruler';
124
+ import { createDockPill } from '../recipes/dock-pill/create-dock-pill';
125
+
126
+ import { createSignaturePad } from '../components/signature-pad/engine';
127
+
128
+ import { createWaveformPlayer } from '../components/waveform-player/engine';
129
+
130
+ import { createVoiceMessageBubble } from '../components/voice-message-bubble/engine';
131
+
132
+ import { createDrilldownMenu } from '../components/drilldown-menu/engine';
133
+
134
+ import { createWheelPicker } from '../components/wheel-picker/engine';
135
+
136
+ type Factory = (el: HTMLElement, options: Record<string, unknown>) => Instance;
137
+
138
+ const factories = {
139
+ 'stepper': createStepper,
140
+ 'radio-group': createRadioGroup,
141
+ 'equalizer-slider': createEqualizerSlider,
142
+ 'temperature-slider': createTemperatureSlider,
143
+ 'rating-scale': createRatingScale,
144
+ 'notification-stack': createNotificationStack,
145
+ 'bento-grid': createBentoGrid,
146
+ 'scroll-preview-dock': createScrollPreviewDock,
147
+ 'sticky-header': createStickyHeader,
148
+ 'handwriting-text': createHandwritingText,
149
+ 'particle-button': createParticleButton,
150
+ 'magnetize-button': createMagnetizeButton,
151
+ 'badge-button': createBadgeButton,
152
+ 'morphing-page-dots': createMorphingPageDots,
153
+ 'not-found': createNotFound,
154
+
155
+ 'wheel-picker': createWheelPicker,
156
+ 'drilldown-menu': createDrilldownMenu,
157
+ 'voice-message-bubble': createVoiceMessageBubble,
158
+ 'waveform-player': createWaveformPlayer,
159
+ 'signature-pad': createSignaturePad,
160
+ 'joined-cta': createJoinedCta,
161
+ 'image-zoom': createImageZoom,
162
+ 'font-cycle': createFontCycle,
163
+ 'thumbnail-nav': createThumbnailNav,
164
+ 'action-button': createActionButton,
165
+ 'film-hero': createFilmHero,
166
+ 'editorial-reveal': createEditorialReveal,
167
+ 'studio-dock': createStudioDock,
168
+ 'trailer': createTrailer,
169
+ 'quantity': createQuantity,
170
+ 'pagination': createPagination,
171
+ 'hover-card': createHoverCard,
172
+ 'input-otp': createInputOtp,
173
+ 'calendar': createCalendar,
174
+ 'slot-picker': createSlotPicker,
175
+ 'credit-card': createCreditCard,
176
+ 'command-search': createCommandSearch,
177
+ 'hold-confirm': createHoldConfirm,
178
+ 'image-preview': createImagePreview,
179
+ 'like-button': createLikeButton,
180
+ 'notification-bell': createNotificationBell,
181
+ 'password-strength': createPasswordStrength,
182
+ 'scratch-card': createScratchCard,
183
+ 'star-rating': createStarRating,
184
+ 'swipe-actions': createSwipeActions,
185
+ 'attachment': createAttachment,
186
+ 'skeleton': createSkeleton,
187
+ 'questionnaire': createQuestionnaire,
188
+ 'code-block': createCodeBlock,
189
+ 'context-menu': createContextMenu,
190
+ 'drawer': createDrawer,
191
+ 'link-preview': createLinkPreview,
192
+ 'progress': createProgress,
193
+ 'range-slider': createRangeSlider,
194
+ 'chart': createChart,
195
+ 'color-slider': createColorSlider,
196
+ 'color-area': createColorArea,
197
+ 'color-field': createColorField,
198
+ 'color-picker': createColorPicker,
199
+ 'time-field': createTimeField,
200
+ 'range-calendar': createRangeCalendar,
201
+ 'date-range-picker': createDateRangePicker,
202
+ 'tooltip': createTooltip,
203
+ 'popover': createPopover,
204
+ 'loading-button': createLoadingButton,
205
+ 'breadcrumb': createBreadcrumb,
206
+ 'empty-state': createEmptyState,
207
+ 'stat-card': createStatCard,
208
+ 'chart-tooltip': createChartTooltip,
209
+ 'multi-select': createMultiSelect,
210
+ 'tag-input': createTagInput,
211
+ 'date-time-picker': createDateTimePicker,
212
+ 'filter-builder': createFilterBuilder,
213
+ 'timeline': createTimeline,
214
+ 'activity-feed': createActivityFeed,
215
+ 'tree-view': createTreeView,
216
+ 'file-explorer': createFileExplorer,
217
+ 'json-viewer': createJsonViewer,
218
+ 'virtual-list': createVirtualList,
219
+ 'resizable-panel': createResizablePanel,
220
+ 'split-view': createSplitView,
221
+ 'data-table': createDataTable,
222
+ 'editable-table': createEditableTable,
223
+ 'rich-text-editor': createRichTextEditor,
224
+ 'select': createSelect,
225
+ 'add-to-cart': createAddToCart,
226
+ 'scroll-island': createScrollIsland,
227
+ 'scroll-area': createScrollArea,
228
+ 'weight-hover': createWeightHover,
229
+ 'sticker': createSticker,
230
+ 'scroll-dock': createScrollDock,
231
+ 'local-clock': createLocalClock,
232
+ 'spring-cards': createSpringCards,
233
+ 'curved-carousel': (el, options) =>
234
+ createCurvedCarousel(el, {
235
+ ...options,
236
+ onSelect: (index, slide) => el.dispatchEvent(new CustomEvent('mk:select', { detail: { index, slide }, bubbles: true })),
237
+ }),
238
+ pile: createPile,
239
+ words: createWords,
240
+ flow: createFlow,
241
+ pop: createPop,
242
+ 'fit-text': createFitText,
243
+ 'stretch-footer': createStretchFooter,
244
+ 'radial-menu': createRadialMenu,
245
+ tabs: createTabs,
246
+ counter: createCounter,
247
+ details: (el) => createDetails(el),
248
+ reveal: createReveal,
249
+ reflow: createReflow,
250
+ 'slot-text': createSlotText,
251
+ sortable: createSortable,
252
+ 'mask-text': createMaskText,
253
+ cascade: createCascade,
254
+ 'text-roll': createTextRoll,
255
+ letters: createLetters,
256
+ parallax: createParallax,
257
+ 'depth-grid': createDepthGrid,
258
+ 'frame-zoom': createFrameZoom,
259
+ contrast: createContrast,
260
+ marquee: createMarquee,
261
+ 'card-dock': createCardDock,
262
+ 'snap-strip': createSnapStrip,
263
+ 'fill-text': createFillText,
264
+ 'ticket-menu': createTicketMenu,
265
+ 'infinite-reel': createInfiniteReel,
266
+ 'repel-bento': createRepelBento,
267
+ 'rotator': createRotator,
268
+ 'drag-ruler': createDragRuler,
269
+ 'dock-pill': createDockPill,
270
+ } satisfies Record<string, Factory>;
271
+
272
+ export type RecipeName = keyof typeof factories;
273
+ export const recipeNames = Object.keys(factories) as RecipeName[];
274
+
275
+ /** Measured text: wait for web fonts, fit before splitting into words. */
276
+ const AFTER_FONTS: RecipeName[] = ['fit-text', 'words', 'slot-text'];
277
+
278
+ const instances = new WeakMap<HTMLElement, Map<RecipeName, Instance>>();
279
+
280
+ export interface AutoInitOptions {
281
+ /** Only start these recipes. */
282
+ only?: RecipeName[];
283
+ }
284
+
285
+ /**
286
+ * Start every `[data-mk]` recipe inside `root` (an element may list several:
287
+ * `data-mk="fit-text words"`). Options come from `data-mk-*` attributes.
288
+ * Returns a function that destroys what this call created. Safe to call again:
289
+ * elements that already run a recipe are skipped.
290
+ */
291
+ export function autoInit(root: ParentNode = document, { only }: AutoInitOptions = {}): () => void {
292
+ if (typeof window === 'undefined') return () => {};
293
+ const created: Array<[HTMLElement, RecipeName, Instance]> = [];
294
+ let cancelled = false;
295
+
296
+ const elements = [...root.querySelectorAll<HTMLElement>('[data-mk]')];
297
+ if (root instanceof HTMLElement && root.matches('[data-mk]')) elements.unshift(root);
298
+
299
+ const start = (el: HTMLElement, name: RecipeName) => {
300
+ if (cancelled) return;
301
+ const running = instances.get(el) ?? new Map<RecipeName, Instance>();
302
+ if (running.has(name)) return;
303
+ const instance = (factories[name] as Factory)(el, parseOptions(el));
304
+ running.set(name, instance);
305
+ instances.set(el, running);
306
+ created.push([el, name, instance]);
307
+ };
308
+
309
+ const now: Array<[HTMLElement, RecipeName]> = [];
310
+ const later: Array<[HTMLElement, RecipeName]> = [];
311
+ for (const el of elements) {
312
+ for (const raw of (el.dataset.mk ?? '').split(/\s+/).filter(Boolean)) {
313
+ if (!(raw in factories)) {
314
+ warnOnce(`autoInit: unknown recipe "${raw}" (known: ${recipeNames.join(', ')})`);
315
+ continue;
316
+ }
317
+ const name = raw as RecipeName;
318
+ if (only && !only.includes(name)) continue;
319
+ (AFTER_FONTS.includes(name) ? later : now).push([el, name]);
320
+ }
321
+ }
322
+
323
+ now.forEach(([el, name]) => start(el, name));
324
+ if (later.length) {
325
+ later.sort((a, b) => AFTER_FONTS.indexOf(a[1]) - AFTER_FONTS.indexOf(b[1]));
326
+ const fonts = document.fonts?.ready ?? Promise.resolve();
327
+ void Promise.race([fonts, new Promise((resolve) => setTimeout(resolve, 1500))]).then(() => {
328
+ later.forEach(([el, name]) => start(el, name));
329
+ if (!cancelled) ScrollTrigger.refresh();
330
+ });
331
+ }
332
+
333
+ return () => {
334
+ cancelled = true;
335
+ for (const [el, name, instance] of created.reverse()) {
336
+ instance.destroy();
337
+ instances.get(el)?.delete(name);
338
+ }
339
+ created.length = 0;
340
+ };
341
+ }