motionwind-core 2.1.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 (51) hide show
  1. package/README.md +44 -0
  2. package/dist/adapter.cjs +31 -0
  3. package/dist/adapter.cjs.map +1 -0
  4. package/dist/adapter.d.cts +14 -0
  5. package/dist/adapter.d.ts +14 -0
  6. package/dist/adapter.js +3 -0
  7. package/dist/adapter.js.map +1 -0
  8. package/dist/chunk-A7EAMXLY.js +1098 -0
  9. package/dist/chunk-A7EAMXLY.js.map +1 -0
  10. package/dist/chunk-IJZCYKTO.js +352 -0
  11. package/dist/chunk-IJZCYKTO.js.map +1 -0
  12. package/dist/chunk-P6FC2RDE.js +25 -0
  13. package/dist/chunk-P6FC2RDE.js.map +1 -0
  14. package/dist/chunk-ULRTFOGX.js +28 -0
  15. package/dist/chunk-ULRTFOGX.js.map +1 -0
  16. package/dist/chunk-Z5I36REG.js +411 -0
  17. package/dist/chunk-Z5I36REG.js.map +1 -0
  18. package/dist/config.cjs +30 -0
  19. package/dist/config.cjs.map +1 -0
  20. package/dist/config.d.cts +1 -0
  21. package/dist/config.d.ts +1 -0
  22. package/dist/config.js +3 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/index.cjs +1970 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +18 -0
  27. package/dist/index.d.ts +18 -0
  28. package/dist/index.js +60 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/parser.cjs +1690 -0
  31. package/dist/parser.cjs.map +1 -0
  32. package/dist/parser.d.cts +21 -0
  33. package/dist/parser.d.ts +21 -0
  34. package/dist/parser.js +6 -0
  35. package/dist/parser.js.map +1 -0
  36. package/dist/recipes.cjs +359 -0
  37. package/dist/recipes.cjs.map +1 -0
  38. package/dist/recipes.d.cts +19 -0
  39. package/dist/recipes.d.ts +19 -0
  40. package/dist/recipes.js +4 -0
  41. package/dist/recipes.js.map +1 -0
  42. package/dist/registry.cjs +421 -0
  43. package/dist/registry.cjs.map +1 -0
  44. package/dist/registry.d.cts +1 -0
  45. package/dist/registry.d.ts +1 -0
  46. package/dist/registry.js +3 -0
  47. package/dist/registry.js.map +1 -0
  48. package/dist/types-BYtWWSgh.d.cts +185 -0
  49. package/dist/types-BYtWWSgh.d.ts +185 -0
  50. package/llms.txt +77 -0
  51. package/package.json +96 -0
@@ -0,0 +1,359 @@
1
+ 'use strict';
2
+
3
+ // src/config.ts
4
+ function definePreset(preset) {
5
+ return preset;
6
+ }
7
+
8
+ // src/recipes.ts
9
+ var COMMUNITY_METADATA = {
10
+ maintainer: "motionwind/core",
11
+ version: "1.0.0",
12
+ compatibleCore: ">=2.0.0 <3",
13
+ bundleImpact: "Preset only; no runtime code added."
14
+ };
15
+ var source = (id) => `https://github.com/piyushzingade/motionwind/tree/main/registry/recipes/${id}.json`;
16
+ var MOTIONWIND_RECIPES = [
17
+ {
18
+ id: "button-press",
19
+ name: "Button press",
20
+ description: "A compact spring response for primary actions.",
21
+ category: "interaction",
22
+ classes: "animate-hover:scale-105 animate-tap:scale-95 animate-spring animate-stiffness-420 animate-damping-24",
23
+ accessibility: "Preserves keyboard focus and does not communicate state through motion alone.",
24
+ adapters: ["react", "vue", "vanilla", "react-native"],
25
+ ...COMMUNITY_METADATA,
26
+ source: source("button-press")
27
+ },
28
+ {
29
+ id: "dialog-enter",
30
+ name: "Dialog entrance",
31
+ description: "Fade and lift a dialog into place without excessive travel.",
32
+ category: "entrance",
33
+ classes: "animate-initial:opacity-0 animate-initial:y-12 animate-enter:opacity-100 animate-enter:y-0 animate-duration-240 animate-ease-out",
34
+ accessibility: "Pair with a focus trap and disable transform movement for reduced-motion users.",
35
+ adapters: ["react", "vue", "vanilla", "react-native"],
36
+ ...COMMUNITY_METADATA,
37
+ source: source("dialog-enter")
38
+ },
39
+ {
40
+ id: "list-stagger",
41
+ name: "List stagger",
42
+ description: "A restrained stagger for newly revealed collections.",
43
+ category: "entrance",
44
+ classes: "animate-stagger-55 animate-delay-children-40 animate-when-before",
45
+ accessibility: "Keep the list readable before and after animation; avoid repeated autoplay.",
46
+ adapters: ["react", "vue"],
47
+ ...COMMUNITY_METADATA,
48
+ source: source("list-stagger")
49
+ },
50
+ {
51
+ id: "page-reveal",
52
+ name: "Page reveal",
53
+ description: "A single-run opacity and vertical reveal for page sections.",
54
+ category: "scroll",
55
+ classes: "animate-initial:opacity-0 animate-initial:y-24 animate-inview:opacity-100 animate-inview:y-0 animate-once animate-duration-480 animate-ease-out",
56
+ accessibility: "Content remains in document order and visible when reduced motion is requested.",
57
+ adapters: ["react", "vue", "vanilla"],
58
+ ...COMMUNITY_METADATA,
59
+ source: source("page-reveal")
60
+ },
61
+ {
62
+ id: "loading-orbit",
63
+ name: "Loading orbit",
64
+ description: "A continuous linear rotation for non-blocking progress indicators.",
65
+ category: "loading",
66
+ classes: "animate-enter:rotate-360 animate-repeat-infinite animate-duration-900 animate-ease-linear",
67
+ accessibility: "Add an accessible status label and stop the loop when loading completes.",
68
+ adapters: ["react", "vue", "vanilla", "react-native"],
69
+ ...COMMUNITY_METADATA,
70
+ source: source("loading-orbit")
71
+ },
72
+ {
73
+ id: "menu-pop",
74
+ name: "Menu pop",
75
+ description: "A fast scale-and-fade entrance for contextual menus.",
76
+ category: "entrance",
77
+ classes: "animate-initial:opacity-0 animate-initial:scale-95 animate-enter:opacity-100 animate-enter:scale-100 animate-duration-160 animate-ease-out",
78
+ accessibility: "Move focus into the menu, return it on close, and preserve arrow-key navigation.",
79
+ adapters: ["react", "vue", "vanilla", "react-native"],
80
+ ...COMMUNITY_METADATA,
81
+ source: source("menu-pop")
82
+ },
83
+ {
84
+ id: "accordion-reveal",
85
+ name: "Accordion reveal",
86
+ description: "A layout-aware reveal for expandable disclosure content.",
87
+ category: "layout",
88
+ classes: "animate-layout-size animate-initial:opacity-0 animate-enter:opacity-100 animate-duration-220 animate-ease-out",
89
+ accessibility: "Use a native button with aria-expanded and keep content reachable without animation.",
90
+ adapters: ["react", "vue"],
91
+ ...COMMUNITY_METADATA,
92
+ source: source("accordion-reveal")
93
+ },
94
+ {
95
+ id: "tab-indicator",
96
+ name: "Tab indicator",
97
+ description: "A shared-layout spring for an active tab indicator.",
98
+ category: "layout",
99
+ classes: "animate-layout-id-active-tab animate-spring animate-stiffness-440 animate-damping-34",
100
+ accessibility: "Pair with tablist semantics, roving focus, and an independent selected-state cue.",
101
+ adapters: ["react", "vue"],
102
+ ...COMMUNITY_METADATA,
103
+ source: source("tab-indicator")
104
+ },
105
+ {
106
+ id: "toast-enter",
107
+ name: "Toast entrance",
108
+ description: "A short horizontal slide for non-blocking notifications.",
109
+ category: "entrance",
110
+ classes: "animate-initial:opacity-0 animate-initial:x-24 animate-enter:opacity-100 animate-enter:x-0 animate-duration-240 animate-ease-out",
111
+ accessibility: "Use an appropriate live region and provide enough time to read or dismiss the toast.",
112
+ adapters: ["react", "vue", "vanilla", "react-native"],
113
+ ...COMMUNITY_METADATA,
114
+ source: source("toast-enter")
115
+ },
116
+ {
117
+ id: "sortable-item",
118
+ name: "Sortable item",
119
+ description: "Layout animation and vertical drag feedback for reorderable lists.",
120
+ category: "interaction",
121
+ classes: "animate-layout-position animate-drag-y animate-drag-snap animate-drag:scale-103 animate-spring animate-stiffness-360 animate-damping-28",
122
+ accessibility: "Provide keyboard reordering controls and announce the new item position.",
123
+ adapters: ["react", "vue"],
124
+ ...COMMUNITY_METADATA,
125
+ source: source("sortable-item")
126
+ },
127
+ {
128
+ id: "svg-line-loader",
129
+ name: "SVG line loader",
130
+ description: "Draw and repeat an SVG path for compact progress feedback.",
131
+ category: "loading",
132
+ classes: "animate-initial:path-length-0 animate-enter:path-length-1 animate-duration-900 animate-ease-in-out animate-repeat-infinite animate-repeat-reverse",
133
+ accessibility: "Give the SVG a status label and stop repeating when the operation completes.",
134
+ adapters: ["react", "vue", "vanilla"],
135
+ ...COMMUNITY_METADATA,
136
+ source: source("svg-line-loader")
137
+ },
138
+ {
139
+ id: "scroll-progress",
140
+ name: "Scroll progress",
141
+ description: "Map page scroll progress to a horizontal scale indicator.",
142
+ category: "scroll",
143
+ classes: "animate-scroll:scaleX-[0,1] animate-scroll-container",
144
+ accessibility: "Treat the indicator as supplemental; expose document progress in text when it matters.",
145
+ adapters: ["react", "vanilla"],
146
+ ...COMMUNITY_METADATA,
147
+ source: source("scroll-progress")
148
+ },
149
+ {
150
+ id: "flip-card",
151
+ name: "Flip card",
152
+ description: "A 3-D card that rotates 180 degrees around the Y axis on hover.",
153
+ category: "interaction",
154
+ classes: "animate-hover:rotate-y-180 animate-duration-480 animate-ease-in-out",
155
+ accessibility: "Pair with a separate back face and keep both sides keyboard-accessible.",
156
+ adapters: ["react", "vue", "vanilla"],
157
+ ...COMMUNITY_METADATA,
158
+ source: source("flip-card")
159
+ },
160
+ {
161
+ id: "marquee",
162
+ name: "Marquee",
163
+ description: "A continuously looping horizontal scroll for text or image strips.",
164
+ category: "entrance",
165
+ classes: "animate-initial:x-100pct animate-enter:-x-100pct animate-repeat-infinite animate-ease-linear animate-duration-4000",
166
+ accessibility: "Pause the marquee on focus or hover; do not convey critical information through motion alone.",
167
+ adapters: ["react", "vue", "vanilla"],
168
+ ...COMMUNITY_METADATA,
169
+ source: source("marquee")
170
+ },
171
+ {
172
+ id: "magnetic-button",
173
+ name: "Magnetic button",
174
+ description: "A subtle spring scale that draws attention on hover without moving the element.",
175
+ category: "interaction",
176
+ classes: "animate-hover:scale-103 animate-spring animate-stiffness-280 animate-damping-22",
177
+ accessibility: "Do not use scale change as the only indicator of an interactive element.",
178
+ adapters: ["react", "vue", "vanilla"],
179
+ ...COMMUNITY_METADATA,
180
+ source: source("magnetic-button")
181
+ },
182
+ {
183
+ id: "drawer",
184
+ name: "Drawer",
185
+ description: "A side panel that slides in from the edge and returns on exit.",
186
+ category: "entrance",
187
+ classes: "animate-initial:x-100pct animate-enter:x-0 animate-exit:x-100pct animate-duration-320 animate-ease-out",
188
+ accessibility: "Trap focus inside the drawer, return focus on close, and support Escape to dismiss.",
189
+ adapters: ["react", "vue", "vanilla", "react-native"],
190
+ ...COMMUNITY_METADATA,
191
+ source: source("drawer")
192
+ },
193
+ {
194
+ id: "tooltip-pop",
195
+ name: "Tooltip pop",
196
+ description: "A small scale-and-fade entrance for contextual tooltips.",
197
+ category: "entrance",
198
+ classes: "animate-initial:opacity-0 animate-initial:scale-75 animate-enter:opacity-100 animate-enter:scale-100 animate-duration-160 animate-ease-back-out",
199
+ accessibility: "Use role='tooltip', aria-describedby, and ensure the tooltip is dismissible without a mouse.",
200
+ adapters: ["react", "vue", "vanilla", "react-native"],
201
+ ...COMMUNITY_METADATA,
202
+ source: source("tooltip-pop")
203
+ },
204
+ {
205
+ id: "skeleton-pulse",
206
+ name: "Skeleton pulse",
207
+ description: "A pulsing opacity loop for placeholder content while data loads.",
208
+ category: "loading",
209
+ classes: "animate-initial:opacity-100 animate-enter:opacity-40 animate-repeat-infinite animate-repeat-reverse animate-duration-800 animate-ease-in-out",
210
+ accessibility: "Announce loading state with aria-busy; remove skeleton when content arrives.",
211
+ adapters: ["react", "vue", "vanilla", "react-native"],
212
+ ...COMMUNITY_METADATA,
213
+ source: source("skeleton-pulse")
214
+ },
215
+ {
216
+ id: "shimmer-load",
217
+ name: "Shimmer load",
218
+ description: "A left-to-right gradient shimmer applied to a loading overlay.",
219
+ category: "loading",
220
+ classes: "animate-initial:-x-100pct animate-enter:x-100pct animate-repeat-infinite animate-duration-1200 animate-ease-in-out",
221
+ accessibility: "Place the shimmer on a decorative overlay; expose loading status through accessible text.",
222
+ adapters: ["react", "vue", "vanilla"],
223
+ ...COMMUNITY_METADATA,
224
+ source: source("shimmer-load")
225
+ },
226
+ {
227
+ id: "card-hover",
228
+ name: "Card hover",
229
+ description: "A spring lift and upward nudge for interactive cards on hover.",
230
+ category: "interaction",
231
+ classes: "animate-hover:scale-103 animate-hover:y--4 animate-spring animate-stiffness-380 animate-damping-26",
232
+ accessibility: "Ensure focus styles are visible and the hover state is not the only interactive cue.",
233
+ adapters: ["react", "vue", "vanilla"],
234
+ ...COMMUNITY_METADATA,
235
+ source: source("card-hover")
236
+ },
237
+ {
238
+ id: "number-counter",
239
+ name: "Number counter",
240
+ description: "A fade and rise entrance for statistic values triggered when they scroll into view.",
241
+ category: "scroll",
242
+ classes: "animate-initial:opacity-0 animate-initial:y-12 animate-inview:opacity-100 animate-inview:y-0 animate-once animate-duration-400 animate-ease-out",
243
+ accessibility: "Present the final value in document order and avoid conveying meaning through counting motion.",
244
+ adapters: ["react", "vue", "vanilla"],
245
+ ...COMMUNITY_METADATA,
246
+ source: source("number-counter")
247
+ },
248
+ {
249
+ id: "progress-bar",
250
+ name: "Progress bar",
251
+ description: "An animated width fill for a progress bar triggered on scroll into view.",
252
+ category: "scroll",
253
+ classes: "animate-initial:w-0 animate-inview:w-100pct animate-once animate-duration-800 animate-ease-out",
254
+ accessibility: "Use a native progress element or role='progressbar' with aria-valuenow to expose state.",
255
+ adapters: ["react", "vue", "vanilla"],
256
+ ...COMMUNITY_METADATA,
257
+ source: source("progress-bar")
258
+ },
259
+ {
260
+ id: "ripple",
261
+ name: "Ripple",
262
+ description: "A radial scale-and-fade burst that emanates from a tap point.",
263
+ category: "interaction",
264
+ classes: "animate-initial:scale-0 animate-initial:opacity-100 animate-enter:scale-400 animate-enter:opacity-0 animate-duration-500 animate-ease-out",
265
+ accessibility: "Use the ripple as a purely decorative effect and do not rely on it to communicate state.",
266
+ adapters: ["react", "vue", "vanilla"],
267
+ ...COMMUNITY_METADATA,
268
+ source: source("ripple")
269
+ },
270
+ {
271
+ id: "blob-morph",
272
+ name: "Blob morph",
273
+ description: "An organic border-radius keyframe loop for fluid decorative shapes.",
274
+ category: "loading",
275
+ classes: "animate-enter:rounded-[0,30,60,30,0] animate-repeat-infinite animate-duration-3000 animate-ease-in-out animate-repeat-reverse",
276
+ accessibility: "Use only for decorative elements; apply aria-hidden to prevent interference with screen readers.",
277
+ adapters: ["react", "vue", "vanilla"],
278
+ ...COMMUNITY_METADATA,
279
+ source: source("blob-morph")
280
+ },
281
+ {
282
+ id: "ticker",
283
+ name: "Ticker",
284
+ description: "A stock- or news-style ticker where items enter from the right and exit to the left.",
285
+ category: "entrance",
286
+ classes: "animate-initial:x-100pct animate-enter:x-0 animate-exit:-x-100pct animate-duration-500 animate-ease-out animate-stagger-150",
287
+ accessibility: "Provide a way to pause the ticker and make all content available in a static list.",
288
+ adapters: ["react", "vue", "vanilla"],
289
+ ...COMMUNITY_METADATA,
290
+ source: source("ticker")
291
+ },
292
+ {
293
+ id: "popover-reveal",
294
+ name: "Popover reveal",
295
+ description: "A short downward fade-in for anchored popovers and dropdowns.",
296
+ category: "entrance",
297
+ classes: "animate-initial:opacity-0 animate-initial:y--8 animate-enter:opacity-100 animate-enter:y-0 animate-duration-180 animate-ease-out",
298
+ accessibility: "Move focus into the popover on open and return it to the trigger on close.",
299
+ adapters: ["react", "vue", "vanilla", "react-native"],
300
+ ...COMMUNITY_METADATA,
301
+ source: source("popover-reveal")
302
+ },
303
+ {
304
+ id: "stepper",
305
+ name: "Stepper",
306
+ description: "Sequential staggered entrances for step-indicator items.",
307
+ category: "entrance",
308
+ classes: "animate-initial:opacity-0 animate-initial:scale-80 animate-enter:opacity-100 animate-enter:scale-100 animate-stagger-80 animate-delay-children-100 animate-duration-200 animate-ease-back-out",
309
+ accessibility: "Announce the current step and total steps; keep step content readable without animation.",
310
+ adapters: ["react", "vue", "vanilla", "react-native"],
311
+ ...COMMUNITY_METADATA,
312
+ source: source("stepper")
313
+ },
314
+ {
315
+ id: "notification-stack",
316
+ name: "Notification stack",
317
+ description: "Staggered upward entrances for stacked notification cards.",
318
+ category: "entrance",
319
+ classes: "animate-initial:opacity-0 animate-initial:y--20 animate-enter:opacity-100 animate-enter:y-0 animate-stagger-80 animate-duration-260 animate-ease-back-out",
320
+ accessibility: "Use a live region with aria-live='polite' and provide enough time to read each notification.",
321
+ adapters: ["react", "vue", "vanilla", "react-native"],
322
+ ...COMMUNITY_METADATA,
323
+ source: source("notification-stack")
324
+ },
325
+ {
326
+ id: "drag-reorder",
327
+ name: "Drag reorder",
328
+ description: "Vertical drag with layout animation for reorderable list items.",
329
+ category: "interaction",
330
+ classes: "animate-drag-y animate-layout-position animate-drag:scale-102 animate-spring animate-stiffness-320 animate-damping-30",
331
+ accessibility: "Provide keyboard controls for reordering and announce the new position after a drop.",
332
+ adapters: ["react", "vue"],
333
+ ...COMMUNITY_METADATA,
334
+ source: source("drag-reorder")
335
+ },
336
+ {
337
+ id: "parallax-scroll",
338
+ name: "Parallax scroll",
339
+ description: "Map scroll progress to a Y translation so a layer moves at a different speed.",
340
+ category: "scroll",
341
+ classes: "animate-scroll:y-[-50,50] animate-scroll-container",
342
+ accessibility: "Respect prefers-reduced-motion; parallax depth cues must not convey meaning exclusively.",
343
+ adapters: ["react", "vanilla"],
344
+ ...COMMUNITY_METADATA,
345
+ source: source("parallax-scroll")
346
+ }
347
+ ];
348
+ var BUILT_IN_PRESETS = Object.fromEntries(
349
+ MOTIONWIND_RECIPES.map((recipe) => [recipe.id, definePreset(recipe.classes)])
350
+ );
351
+ function getRecipe(id) {
352
+ return MOTIONWIND_RECIPES.find((recipe) => recipe.id === id);
353
+ }
354
+
355
+ exports.BUILT_IN_PRESETS = BUILT_IN_PRESETS;
356
+ exports.MOTIONWIND_RECIPES = MOTIONWIND_RECIPES;
357
+ exports.getRecipe = getRecipe;
358
+ //# sourceMappingURL=recipes.cjs.map
359
+ //# sourceMappingURL=recipes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/recipes.ts"],"names":[],"mappings":"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","file":"recipes.cjs","sourcesContent":["import type { ParsedResult } from \"./types.js\";\nimport type { SyntaxDefinition } from \"./registry.js\";\n\nexport type ReducedMotionPolicy = \"user\" | \"always\" | \"never\";\n\nexport interface SpringToken {\n stiffness?: number;\n damping?: number;\n bounce?: number;\n mass?: number;\n}\n\nexport interface MotionwindTokens {\n durations?: Record<string, number>;\n easings?: Record<string, string | number[]>;\n springs?: Record<string, SpringToken>;\n}\n\nexport interface MotionwindDiagnostic {\n code: string;\n message: string;\n severity: \"info\" | \"warning\" | \"error\";\n token?: string;\n plugin?: string;\n}\n\nexport interface MotionwindResultPatch {\n gestures?: ParsedResult[\"gestures\"];\n transition?: ParsedResult[\"transition\"];\n viewport?: ParsedResult[\"viewport\"];\n dragConfig?: ParsedResult[\"dragConfig\"];\n layoutConfig?: ParsedResult[\"layoutConfig\"];\n scroll?: Partial<ParsedResult[\"scroll\"]>;\n variants?: ParsedResult[\"variants\"];\n variantState?: ParsedResult[\"variantState\"];\n}\n\nexport interface MotionwindPluginContext {\n config: MotionwindConfig;\n}\n\nexport interface MotionwindPlugin {\n name: string;\n version: string;\n core?: string;\n presets?: Record<string, string | readonly string[]>;\n definitions?: readonly SyntaxDefinition[];\n transformToken?: (\n token: string,\n context: MotionwindPluginContext,\n ) => MotionwindResultPatch | null;\n diagnose?: (\n className: string,\n parsed: ParsedResult,\n context: MotionwindPluginContext,\n ) => readonly MotionwindDiagnostic[];\n}\n\nexport interface MotionwindConfig {\n adapter?: string;\n strict?: boolean;\n reducedMotion?: ReducedMotionPolicy;\n tokens?: MotionwindTokens;\n presets?: Record<string, string | readonly string[]>;\n plugins?: readonly MotionwindPlugin[];\n}\n\nexport function defineConfig<const T extends MotionwindConfig>(config: T): T {\n return config;\n}\n\nexport function defineMotionwindPlugin<const T extends MotionwindPlugin>(\n plugin: T,\n): T {\n if (!plugin.name.trim())\n throw new Error(\"[motionwind] Plugins require a name.\");\n if (!plugin.version.trim())\n throw new Error(\"[motionwind] Plugins require a version.\");\n return plugin;\n}\n\nexport function definePreset<const T extends string | readonly string[]>(\n preset: T,\n): T {\n return preset;\n}\n\nexport const DEFAULT_MOTIONWIND_CONFIG: Readonly<MotionwindConfig> =\n Object.freeze({\n strict: false,\n reducedMotion: \"user\",\n plugins: [],\n presets: {},\n tokens: {},\n });\n","import { definePreset } from \"./config.js\";\n\nexport interface MotionwindRecipe {\n id: string;\n name: string;\n description: string;\n category: \"interaction\" | \"entrance\" | \"layout\" | \"loading\" | \"scroll\";\n classes: string;\n accessibility: string;\n adapters: readonly (\"react\" | \"vue\" | \"vanilla\" | \"react-native\")[];\n maintainer: string;\n version: string;\n compatibleCore: string;\n bundleImpact: string;\n source: string;\n}\n\nconst COMMUNITY_METADATA = {\n maintainer: \"motionwind/core\",\n version: \"1.0.0\",\n compatibleCore: \">=2.0.0 <3\",\n bundleImpact: \"Preset only; no runtime code added.\",\n} as const;\n\nconst source = (id: string) =>\n `https://github.com/piyushzingade/motionwind/tree/main/registry/recipes/${id}.json`;\n\nexport const MOTIONWIND_RECIPES: readonly MotionwindRecipe[] = [\n {\n id: \"button-press\",\n name: \"Button press\",\n description: \"A compact spring response for primary actions.\",\n category: \"interaction\",\n classes:\n \"animate-hover:scale-105 animate-tap:scale-95 animate-spring animate-stiffness-420 animate-damping-24\",\n accessibility:\n \"Preserves keyboard focus and does not communicate state through motion alone.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"button-press\"),\n },\n {\n id: \"dialog-enter\",\n name: \"Dialog entrance\",\n description: \"Fade and lift a dialog into place without excessive travel.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y-12 animate-enter:opacity-100 animate-enter:y-0 animate-duration-240 animate-ease-out\",\n accessibility:\n \"Pair with a focus trap and disable transform movement for reduced-motion users.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"dialog-enter\"),\n },\n {\n id: \"list-stagger\",\n name: \"List stagger\",\n description: \"A restrained stagger for newly revealed collections.\",\n category: \"entrance\",\n classes: \"animate-stagger-55 animate-delay-children-40 animate-when-before\",\n accessibility:\n \"Keep the list readable before and after animation; avoid repeated autoplay.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"list-stagger\"),\n },\n {\n id: \"page-reveal\",\n name: \"Page reveal\",\n description: \"A single-run opacity and vertical reveal for page sections.\",\n category: \"scroll\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y-24 animate-inview:opacity-100 animate-inview:y-0 animate-once animate-duration-480 animate-ease-out\",\n accessibility:\n \"Content remains in document order and visible when reduced motion is requested.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"page-reveal\"),\n },\n {\n id: \"loading-orbit\",\n name: \"Loading orbit\",\n description:\n \"A continuous linear rotation for non-blocking progress indicators.\",\n category: \"loading\",\n classes:\n \"animate-enter:rotate-360 animate-repeat-infinite animate-duration-900 animate-ease-linear\",\n accessibility:\n \"Add an accessible status label and stop the loop when loading completes.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"loading-orbit\"),\n },\n {\n id: \"menu-pop\",\n name: \"Menu pop\",\n description: \"A fast scale-and-fade entrance for contextual menus.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:scale-95 animate-enter:opacity-100 animate-enter:scale-100 animate-duration-160 animate-ease-out\",\n accessibility:\n \"Move focus into the menu, return it on close, and preserve arrow-key navigation.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"menu-pop\"),\n },\n {\n id: \"accordion-reveal\",\n name: \"Accordion reveal\",\n description: \"A layout-aware reveal for expandable disclosure content.\",\n category: \"layout\",\n classes:\n \"animate-layout-size animate-initial:opacity-0 animate-enter:opacity-100 animate-duration-220 animate-ease-out\",\n accessibility:\n \"Use a native button with aria-expanded and keep content reachable without animation.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"accordion-reveal\"),\n },\n {\n id: \"tab-indicator\",\n name: \"Tab indicator\",\n description: \"A shared-layout spring for an active tab indicator.\",\n category: \"layout\",\n classes:\n \"animate-layout-id-active-tab animate-spring animate-stiffness-440 animate-damping-34\",\n accessibility:\n \"Pair with tablist semantics, roving focus, and an independent selected-state cue.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"tab-indicator\"),\n },\n {\n id: \"toast-enter\",\n name: \"Toast entrance\",\n description: \"A short horizontal slide for non-blocking notifications.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:x-24 animate-enter:opacity-100 animate-enter:x-0 animate-duration-240 animate-ease-out\",\n accessibility:\n \"Use an appropriate live region and provide enough time to read or dismiss the toast.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"toast-enter\"),\n },\n {\n id: \"sortable-item\",\n name: \"Sortable item\",\n description:\n \"Layout animation and vertical drag feedback for reorderable lists.\",\n category: \"interaction\",\n classes:\n \"animate-layout-position animate-drag-y animate-drag-snap animate-drag:scale-103 animate-spring animate-stiffness-360 animate-damping-28\",\n accessibility:\n \"Provide keyboard reordering controls and announce the new item position.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"sortable-item\"),\n },\n {\n id: \"svg-line-loader\",\n name: \"SVG line loader\",\n description: \"Draw and repeat an SVG path for compact progress feedback.\",\n category: \"loading\",\n classes:\n \"animate-initial:path-length-0 animate-enter:path-length-1 animate-duration-900 animate-ease-in-out animate-repeat-infinite animate-repeat-reverse\",\n accessibility:\n \"Give the SVG a status label and stop repeating when the operation completes.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"svg-line-loader\"),\n },\n {\n id: \"scroll-progress\",\n name: \"Scroll progress\",\n description: \"Map page scroll progress to a horizontal scale indicator.\",\n category: \"scroll\",\n classes: \"animate-scroll:scaleX-[0,1] animate-scroll-container\",\n accessibility:\n \"Treat the indicator as supplemental; expose document progress in text when it matters.\",\n adapters: [\"react\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"scroll-progress\"),\n },\n {\n id: \"flip-card\",\n name: \"Flip card\",\n description:\n \"A 3-D card that rotates 180 degrees around the Y axis on hover.\",\n category: \"interaction\",\n classes:\n \"animate-hover:rotate-y-180 animate-duration-480 animate-ease-in-out\",\n accessibility:\n \"Pair with a separate back face and keep both sides keyboard-accessible.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"flip-card\"),\n },\n {\n id: \"marquee\",\n name: \"Marquee\",\n description:\n \"A continuously looping horizontal scroll for text or image strips.\",\n category: \"entrance\",\n classes:\n \"animate-initial:x-100pct animate-enter:-x-100pct animate-repeat-infinite animate-ease-linear animate-duration-4000\",\n accessibility:\n \"Pause the marquee on focus or hover; do not convey critical information through motion alone.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"marquee\"),\n },\n {\n id: \"magnetic-button\",\n name: \"Magnetic button\",\n description:\n \"A subtle spring scale that draws attention on hover without moving the element.\",\n category: \"interaction\",\n classes:\n \"animate-hover:scale-103 animate-spring animate-stiffness-280 animate-damping-22\",\n accessibility:\n \"Do not use scale change as the only indicator of an interactive element.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"magnetic-button\"),\n },\n {\n id: \"drawer\",\n name: \"Drawer\",\n description:\n \"A side panel that slides in from the edge and returns on exit.\",\n category: \"entrance\",\n classes:\n \"animate-initial:x-100pct animate-enter:x-0 animate-exit:x-100pct animate-duration-320 animate-ease-out\",\n accessibility:\n \"Trap focus inside the drawer, return focus on close, and support Escape to dismiss.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"drawer\"),\n },\n {\n id: \"tooltip-pop\",\n name: \"Tooltip pop\",\n description: \"A small scale-and-fade entrance for contextual tooltips.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:scale-75 animate-enter:opacity-100 animate-enter:scale-100 animate-duration-160 animate-ease-back-out\",\n accessibility:\n \"Use role='tooltip', aria-describedby, and ensure the tooltip is dismissible without a mouse.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"tooltip-pop\"),\n },\n {\n id: \"skeleton-pulse\",\n name: \"Skeleton pulse\",\n description:\n \"A pulsing opacity loop for placeholder content while data loads.\",\n category: \"loading\",\n classes:\n \"animate-initial:opacity-100 animate-enter:opacity-40 animate-repeat-infinite animate-repeat-reverse animate-duration-800 animate-ease-in-out\",\n accessibility:\n \"Announce loading state with aria-busy; remove skeleton when content arrives.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"skeleton-pulse\"),\n },\n {\n id: \"shimmer-load\",\n name: \"Shimmer load\",\n description:\n \"A left-to-right gradient shimmer applied to a loading overlay.\",\n category: \"loading\",\n classes:\n \"animate-initial:-x-100pct animate-enter:x-100pct animate-repeat-infinite animate-duration-1200 animate-ease-in-out\",\n accessibility:\n \"Place the shimmer on a decorative overlay; expose loading status through accessible text.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"shimmer-load\"),\n },\n {\n id: \"card-hover\",\n name: \"Card hover\",\n description:\n \"A spring lift and upward nudge for interactive cards on hover.\",\n category: \"interaction\",\n classes:\n \"animate-hover:scale-103 animate-hover:y--4 animate-spring animate-stiffness-380 animate-damping-26\",\n accessibility:\n \"Ensure focus styles are visible and the hover state is not the only interactive cue.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"card-hover\"),\n },\n {\n id: \"number-counter\",\n name: \"Number counter\",\n description:\n \"A fade and rise entrance for statistic values triggered when they scroll into view.\",\n category: \"scroll\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y-12 animate-inview:opacity-100 animate-inview:y-0 animate-once animate-duration-400 animate-ease-out\",\n accessibility:\n \"Present the final value in document order and avoid conveying meaning through counting motion.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"number-counter\"),\n },\n {\n id: \"progress-bar\",\n name: \"Progress bar\",\n description:\n \"An animated width fill for a progress bar triggered on scroll into view.\",\n category: \"scroll\",\n classes:\n \"animate-initial:w-0 animate-inview:w-100pct animate-once animate-duration-800 animate-ease-out\",\n accessibility:\n \"Use a native progress element or role='progressbar' with aria-valuenow to expose state.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"progress-bar\"),\n },\n {\n id: \"ripple\",\n name: \"Ripple\",\n description:\n \"A radial scale-and-fade burst that emanates from a tap point.\",\n category: \"interaction\",\n classes:\n \"animate-initial:scale-0 animate-initial:opacity-100 animate-enter:scale-400 animate-enter:opacity-0 animate-duration-500 animate-ease-out\",\n accessibility:\n \"Use the ripple as a purely decorative effect and do not rely on it to communicate state.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"ripple\"),\n },\n {\n id: \"blob-morph\",\n name: \"Blob morph\",\n description:\n \"An organic border-radius keyframe loop for fluid decorative shapes.\",\n category: \"loading\",\n classes:\n \"animate-enter:rounded-[0,30,60,30,0] animate-repeat-infinite animate-duration-3000 animate-ease-in-out animate-repeat-reverse\",\n accessibility:\n \"Use only for decorative elements; apply aria-hidden to prevent interference with screen readers.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"blob-morph\"),\n },\n {\n id: \"ticker\",\n name: \"Ticker\",\n description:\n \"A stock- or news-style ticker where items enter from the right and exit to the left.\",\n category: \"entrance\",\n classes:\n \"animate-initial:x-100pct animate-enter:x-0 animate-exit:-x-100pct animate-duration-500 animate-ease-out animate-stagger-150\",\n accessibility:\n \"Provide a way to pause the ticker and make all content available in a static list.\",\n adapters: [\"react\", \"vue\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"ticker\"),\n },\n {\n id: \"popover-reveal\",\n name: \"Popover reveal\",\n description:\n \"A short downward fade-in for anchored popovers and dropdowns.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y--8 animate-enter:opacity-100 animate-enter:y-0 animate-duration-180 animate-ease-out\",\n accessibility:\n \"Move focus into the popover on open and return it to the trigger on close.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"popover-reveal\"),\n },\n {\n id: \"stepper\",\n name: \"Stepper\",\n description: \"Sequential staggered entrances for step-indicator items.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:scale-80 animate-enter:opacity-100 animate-enter:scale-100 animate-stagger-80 animate-delay-children-100 animate-duration-200 animate-ease-back-out\",\n accessibility:\n \"Announce the current step and total steps; keep step content readable without animation.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"stepper\"),\n },\n {\n id: \"notification-stack\",\n name: \"Notification stack\",\n description: \"Staggered upward entrances for stacked notification cards.\",\n category: \"entrance\",\n classes:\n \"animate-initial:opacity-0 animate-initial:y--20 animate-enter:opacity-100 animate-enter:y-0 animate-stagger-80 animate-duration-260 animate-ease-back-out\",\n accessibility:\n \"Use a live region with aria-live='polite' and provide enough time to read each notification.\",\n adapters: [\"react\", \"vue\", \"vanilla\", \"react-native\"],\n ...COMMUNITY_METADATA,\n source: source(\"notification-stack\"),\n },\n {\n id: \"drag-reorder\",\n name: \"Drag reorder\",\n description:\n \"Vertical drag with layout animation for reorderable list items.\",\n category: \"interaction\",\n classes:\n \"animate-drag-y animate-layout-position animate-drag:scale-102 animate-spring animate-stiffness-320 animate-damping-30\",\n accessibility:\n \"Provide keyboard controls for reordering and announce the new position after a drop.\",\n adapters: [\"react\", \"vue\"],\n ...COMMUNITY_METADATA,\n source: source(\"drag-reorder\"),\n },\n {\n id: \"parallax-scroll\",\n name: \"Parallax scroll\",\n description:\n \"Map scroll progress to a Y translation so a layer moves at a different speed.\",\n category: \"scroll\",\n classes: \"animate-scroll:y-[-50,50] animate-scroll-container\",\n accessibility:\n \"Respect prefers-reduced-motion; parallax depth cues must not convey meaning exclusively.\",\n adapters: [\"react\", \"vanilla\"],\n ...COMMUNITY_METADATA,\n source: source(\"parallax-scroll\"),\n },\n];\n\nexport const BUILT_IN_PRESETS = Object.fromEntries(\n MOTIONWIND_RECIPES.map((recipe) => [recipe.id, definePreset(recipe.classes)]),\n) as Record<string, string>;\n\nexport function getRecipe(id: string): MotionwindRecipe | undefined {\n return MOTIONWIND_RECIPES.find((recipe) => recipe.id === id);\n}\n"]}
@@ -0,0 +1,19 @@
1
+ interface MotionwindRecipe {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ category: "interaction" | "entrance" | "layout" | "loading" | "scroll";
6
+ classes: string;
7
+ accessibility: string;
8
+ adapters: readonly ("react" | "vue" | "vanilla" | "react-native")[];
9
+ maintainer: string;
10
+ version: string;
11
+ compatibleCore: string;
12
+ bundleImpact: string;
13
+ source: string;
14
+ }
15
+ declare const MOTIONWIND_RECIPES: readonly MotionwindRecipe[];
16
+ declare const BUILT_IN_PRESETS: Record<string, string>;
17
+ declare function getRecipe(id: string): MotionwindRecipe | undefined;
18
+
19
+ export { BUILT_IN_PRESETS, MOTIONWIND_RECIPES, type MotionwindRecipe, getRecipe };
@@ -0,0 +1,19 @@
1
+ interface MotionwindRecipe {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ category: "interaction" | "entrance" | "layout" | "loading" | "scroll";
6
+ classes: string;
7
+ accessibility: string;
8
+ adapters: readonly ("react" | "vue" | "vanilla" | "react-native")[];
9
+ maintainer: string;
10
+ version: string;
11
+ compatibleCore: string;
12
+ bundleImpact: string;
13
+ source: string;
14
+ }
15
+ declare const MOTIONWIND_RECIPES: readonly MotionwindRecipe[];
16
+ declare const BUILT_IN_PRESETS: Record<string, string>;
17
+ declare function getRecipe(id: string): MotionwindRecipe | undefined;
18
+
19
+ export { BUILT_IN_PRESETS, MOTIONWIND_RECIPES, type MotionwindRecipe, getRecipe };
@@ -0,0 +1,4 @@
1
+ export { BUILT_IN_PRESETS, MOTIONWIND_RECIPES, getRecipe } from './chunk-IJZCYKTO.js';
2
+ import './chunk-P6FC2RDE.js';
3
+ //# sourceMappingURL=recipes.js.map
4
+ //# sourceMappingURL=recipes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"recipes.js"}