kuinetic 0.2.1 → 0.2.3

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 (64) hide show
  1. package/README.md +15 -8
  2. package/dist/esm/advanced/index.mjs +5 -5
  3. package/dist/esm/{chunk-U43BX5O2.mjs → chunk-FASAEQDR.mjs} +54 -7
  4. package/dist/esm/{chunk-BN2Y4UKB.mjs → chunk-FYMZW5N2.mjs} +2373 -541
  5. package/dist/esm/{chunk-RVTYN6NZ.mjs → chunk-MZQG2VMG.mjs} +208 -2
  6. package/dist/esm/core/index.mjs +21 -3
  7. package/dist/esm/effects/index.mjs +2 -2
  8. package/dist/esm/index.mjs +35 -4
  9. package/dist/esm/notes/index.mjs +1075 -0
  10. package/dist/kuinetic.advanced.js +63 -25
  11. package/dist/kuinetic.advanced.min.js +3 -3
  12. package/dist/kuinetic.all.js +2658 -538
  13. package/dist/kuinetic.all.min.js +2 -2
  14. package/dist/kuinetic.css +238 -65
  15. package/dist/kuinetic.js +2657 -537
  16. package/dist/kuinetic.min.css +1 -1
  17. package/dist/kuinetic.min.js +2 -2
  18. package/dist/kuinetic.notes.js +1 -0
  19. package/dist/types/3d/flattening.d.ts +8 -7
  20. package/dist/types/advanced/camera-3d.d.ts +0 -4
  21. package/dist/types/advanced/fluid-cursor.d.ts +0 -4
  22. package/dist/types/advanced/particles.d.ts +0 -4
  23. package/dist/types/advanced/scenes.d.ts +0 -4
  24. package/dist/types/browser/boot.d.ts +9 -4
  25. package/dist/types/core/activation.d.ts +11 -0
  26. package/dist/types/core/compile.d.ts +7 -0
  27. package/dist/types/core/deck-viewer.d.ts +87 -0
  28. package/dist/types/core/derived/types.d.ts +0 -1
  29. package/dist/types/core/describe.d.ts +174 -0
  30. package/dist/types/core/gesture.d.ts +16 -1
  31. package/dist/types/core/index.d.ts +6 -2
  32. package/dist/types/core/stagger.d.ts +1 -1
  33. package/dist/types/core/target.d.ts +28 -0
  34. package/dist/types/core/timing-contract.d.ts +61 -0
  35. package/dist/types/core/types.d.ts +59 -0
  36. package/dist/types/effects/auto-motion.d.ts +169 -0
  37. package/dist/types/effects/carousel/deck.d.ts +170 -0
  38. package/dist/types/effects/carousel/drag.d.ts +6 -0
  39. package/dist/types/effects/carousel/fit.d.ts +130 -0
  40. package/dist/types/effects/carousel/index.d.ts +6 -23
  41. package/dist/types/effects/carousel/stack.d.ts +77 -0
  42. package/dist/types/effects/catalog/interaction-reveal.d.ts +69 -9
  43. package/dist/types/effects/forms/primitives.d.ts +1 -2
  44. package/dist/types/effects/gestures/index.d.ts +3 -4
  45. package/dist/types/effects/shared.d.ts +3 -30
  46. package/dist/types/effects/step-index.d.ts +48 -10
  47. package/dist/types/effects/swipe-event.d.ts +75 -0
  48. package/dist/types/index.d.ts +26 -0
  49. package/dist/types/notes/catalog-core.d.ts +3 -0
  50. package/dist/types/notes/catalog.d.ts +3 -0
  51. package/dist/types/notes/index.d.ts +13 -0
  52. package/dist/types/notes/interaction-reveal.d.ts +3 -0
  53. package/dist/types/notes/interaction.d.ts +6 -0
  54. package/dist/types/notes/keys.d.ts +7 -0
  55. package/dist/types/notes/mechanics.d.ts +7 -0
  56. package/dist/types/notes/scroll-nav-forms.d.ts +6 -0
  57. package/dist/types/notes/shared.d.ts +6 -0
  58. package/dist/types/notes/showcase.d.ts +7 -0
  59. package/dist/types/notes/text.d.ts +3 -0
  60. package/dist/types/showcase/compare.d.ts +9 -0
  61. package/dist/types/showcase/index.d.ts +3 -0
  62. package/dist/types/showcase/lightbox.d.ts +23 -1
  63. package/dist/types/showcase/modal-shell.d.ts +11 -0
  64. package/package.json +10 -4
@@ -0,0 +1,1075 @@
1
+ // src/notes/catalog.ts
2
+ var CATALOG_NOTES = {
3
+ "ambient-float.duration": "How long one full up-and-down drift takes, repeating forever.",
4
+ "ambient-float.distance": "How far the element drifts up and down.",
5
+ "ambient-gradient.duration": "How long one full colour drift takes, repeating forever.",
6
+ "ambient-gradient.from": {
7
+ why: "The first colour of the gradient.",
8
+ whenOmitted: "Uses the effect\u2019s built-in colours."
9
+ },
10
+ "ambient-gradient.to": {
11
+ why: "The second colour of the gradient.",
12
+ whenOmitted: "Uses the effect\u2019s built-in colours."
13
+ },
14
+ "ambient-gradient-ring.duration": "How long the colours take to travel once around the edge.",
15
+ "ambient-gradient-ring.from": {
16
+ why: "The first colour of the glowing edge.",
17
+ whenOmitted: "Uses the effect\u2019s built-in colours."
18
+ },
19
+ "ambient-gradient-ring.to": {
20
+ why: "The second colour of the glowing edge.",
21
+ whenOmitted: "Uses the effect\u2019s built-in colours."
22
+ },
23
+ "ambient-orbit.duration": "How long one full turn takes, repeating forever.",
24
+ "ambient-orbit.angle": "How far it turns each cycle; 360deg is one full circle.",
25
+ "ambient-pulse.duration": "How long one swell-and-shrink beat takes, repeating forever.",
26
+ "ambient-pulse.scale": "How big it swells at the peak; 1.15 is 15% larger.",
27
+ "ambient-tint.duration": "How long one full drift of the pattern takes, repeating forever.",
28
+ "ambient-tint.from": {
29
+ why: "The colour of the pattern or glow.",
30
+ whenOmitted: "Uses the effect\u2019s built-in colour, or the text colour."
31
+ },
32
+ "background-media.src": {
33
+ why: "The picture or video file to fill the background with.",
34
+ required: true
35
+ },
36
+ "background-media.poster": {
37
+ why: "A still picture shown while the video loads, so the background is never blank.",
38
+ whenOmitted: "The background stays empty until the first video frame arrives."
39
+ },
40
+ "background-media.fit": "Cover crops the media to fill the box; contain shows all of it.",
41
+ "background-media.focus": "Which part of the picture stays visible when it gets cropped.",
42
+ "background-media.overlay": {
43
+ why: "A colour laid over the media, so text on top stays readable.",
44
+ whenOmitted: "No overlay; the media shows at full strength."
45
+ },
46
+ "background-media.overlay-opacity": "How strongly the overlay colour covers the media.",
47
+ "background-media.autoplay": {
48
+ why: "When a video plays: only while on screen, always, or never."
49
+ },
50
+ "background-media.rate": "Video speed; 1 is normal, 0.5 is half speed, up to 4.",
51
+ "background-media.loop": "Whether the video starts over when it ends.",
52
+ "glass.blur": "How much the content behind the panel is blurred.",
53
+ "glass.saturate": "How vivid the colours behind the panel look; 1 leaves them unchanged.",
54
+ "glass.opacity": "How strongly the panel\u2019s tint shows over the blurred background.",
55
+ "glass.tint": {
56
+ why: "The colour of the frosted glass itself.",
57
+ whenOmitted: "White-ish glass that follows the page\u2019s colour scheme."
58
+ },
59
+ "glass.rim": {
60
+ why: "The colour of the thin edge line, which also colours the top highlight.",
61
+ whenOmitted: "A faint white edge."
62
+ },
63
+ "glass.rim-width": "How thick the thin edge line is.",
64
+ "glass.sheen": "How bright the soft highlight across the top is; 0 removes it.",
65
+ "glass.radius": {
66
+ why: "How rounded the corners are; a very large value makes a pill.",
67
+ whenOmitted: "Rounded corners of 16px, unless the page sets its own."
68
+ },
69
+ "media-blur-up.distance": "How far the image rises into place as it sharpens.",
70
+ "media-blur-up.blur": "How blurry the image starts before it sharpens.",
71
+ "media-ken-burns.distance": "How far the image pans while it zooms, right and a little up; negative pans the other way.",
72
+ "media-ken-burns.scale": "How far the image zooms; 1.12 is 12% bigger at the zoomed-in end.",
73
+ "media-lightbox.scale": "The size it starts at before growing to full size.",
74
+ "media-parallax-frame.distance": "How far the image shifts as the page scrolls.",
75
+ "rotate-static.angle": {
76
+ why: "How far to tilt the element, held still.",
77
+ whenOmitted: "No tilt; the element keeps its own rotation."
78
+ },
79
+ "slat-assemble.slats": "How many strips the picture is cut into, from 2 to 24.",
80
+ "slat-assemble.axis": "Cut the picture into vertical or horizontal strips.",
81
+ "slat-assemble.angle": {
82
+ why: "Cut the strips at any angle instead; 0deg is vertical, 90deg is horizontal.",
83
+ whenOmitted: "Follows the axis setting."
84
+ },
85
+ "slat-assemble.from": {
86
+ why: "Which strips land first: alternating ends, start, end, outside-in, or scattered."
87
+ },
88
+ "slat-assemble.fold": {
89
+ why: "Strips flip in like hinged panels instead of sliding in.",
90
+ whenOmitted: "Off: strips slide in."
91
+ },
92
+ "slat-assemble.duration": "How long each strip takes to land, not the whole run.",
93
+ "view-morph.name": {
94
+ why: "The shared name that pairs this element with its twin on the other view.",
95
+ whenOmitted: "Uses the element\u2019s own id, so it needs one."
96
+ },
97
+ "view-swap.controls": {
98
+ why: "Which element this control opens and closes, by selector like #panel.",
99
+ whenOmitted: "Uses the element named by the control\u2019s aria-controls."
100
+ },
101
+ "view-swap.attribute": {
102
+ why: "The marker added or removed on that element each time the control is clicked.",
103
+ whenOmitted: "Uses data-open."
104
+ },
105
+ "view-swap.type": {
106
+ why: "Names the transition motion to run, like kui-page-slide; a browser without that feature cross-fades.",
107
+ whenOmitted: "The browser\u2019s default cross-fade, or an instant swap where view transitions are missing."
108
+ }
109
+ };
110
+
111
+ // src/notes/catalog-core.ts
112
+ var SCROLL_LINKED = [
113
+ "desaturate",
114
+ "parallax",
115
+ "parallax-rotate",
116
+ "parallax-scale",
117
+ "progress",
118
+ "progress-stroke",
119
+ "scroll-fade",
120
+ "skew"
121
+ ];
122
+ var SCROLL_LINKED_TIMING = Object.fromEntries(
123
+ SCROLL_LINKED.flatMap((id) => [
124
+ [`${id}.duration`, "Scrolling sets the pace; this counts only next to delay, or as a clock where scroll-linking isn't supported."],
125
+ [`${id}.delay`, "Not a clock wait: it starts the motion later in the scroll range, in proportion to duration."],
126
+ [`${id}.stagger`, {
127
+ why: "Starts each item a little later in the scroll range, so a group moves one after another.",
128
+ whenOmitted: "Every item moves together, unless a parent sets a stagger."
129
+ }]
130
+ ])
131
+ );
132
+ var CATALOG_CORE_NOTES = {
133
+ ...SCROLL_LINKED_TIMING,
134
+ "desaturate.from": "How grey the element is at the start of the scroll range.",
135
+ "desaturate.to": "How grey the element is at the end of the scroll range.",
136
+ "feedback-burst.scale": "How much the element swells at the peak of the pop.",
137
+ "feedback-burst.distance": "How far the confetti flies, as a size or a share of the element.",
138
+ "feedback-burst.fan": "How wide the confetti spreads sideways; 0 is a narrow fountain.",
139
+ "feedback-burst.size": "How big each confetti speck is.",
140
+ "feedback-burst.spill": "How far past the element the confetti is allowed to show.",
141
+ "feedback-burst.color1": { why: "Colour of the first confetti speck.", whenOmitted: "The page's own --kui-c1 if set, else a pink-red." },
142
+ "feedback-burst.color2": { why: "Colour of the second confetti speck.", whenOmitted: "The page's own --kui-c2 if set, else amber." },
143
+ "feedback-burst.color3": { why: "Colour of the third confetti speck.", whenOmitted: "The page's own --kui-c3 if set, else green." },
144
+ "feedback-burst.color4": { why: "Colour of the fourth confetti speck.", whenOmitted: "The page's own --kui-c4 if set, else blue." },
145
+ "feedback-burst.color5": { why: "Colour of the fifth confetti speck.", whenOmitted: "The page's own --kui-c5 if set, else purple." },
146
+ "feedback-confirm.duration": "How long the confirmation takes in total, fade in, hold and fade out.",
147
+ "feedback-dot-pulse.duration": "How long one full pulse of the dots takes, repeating forever.",
148
+ "feedback-dot-pulse.dotSize": "How big each of the three dots is.",
149
+ "feedback-heart-burst.scale": "How much the heart swells at the peak of the pop.",
150
+ "feedback-pop.scale": "How much the element swells at the peak of the pop.",
151
+ "feedback-progress-track.duration": "How long the bar takes to sweep across once, repeating forever.",
152
+ "feedback-pull.distance": "How far the element is pulled down before it springs back.",
153
+ "feedback-ripple.extent": "How many times larger the ripple grows than the element.",
154
+ "feedback-ripple.color": { why: "Colour of the ripple disc.", whenOmitted: "Uses the element's own text colour." },
155
+ "feedback-ripple.strength": "How solid the ripple looks at its brightest, from 0 to 1.",
156
+ "feedback-ripple.startScale": "How big the ripple begins, as a share of the element.",
157
+ "feedback-shimmer.duration": "How long one sweep of light takes, repeating forever.",
158
+ "feedback-spin.duration": "How long one full turn takes, repeating forever.",
159
+ "feedback-toast.distance": "How far the toast slides as it enters or leaves.",
160
+ "flip-3d.angle": "How far turned away the element starts, before it flips flat.",
161
+ "flip-3d.perspective": "How strong the 3D depth looks; smaller is more dramatic.",
162
+ "parallax.distance": "How far the element drifts against the scroll.",
163
+ "parallax-rotate.angle": "How far the element has turned by the end of the scroll range.",
164
+ "parallax-rotate.from": "How far turned the element is at the start of the scroll range.",
165
+ "parallax-scale.scale": "How big the element is at the end of the scroll range.",
166
+ "parallax-scale.from": "How big the element is at the start of the scroll range.",
167
+ "progress-stroke.length": {
168
+ why: "The total length of the line being drawn, so it draws exactly to the end.",
169
+ whenOmitted: "Assumes a path length of 100."
170
+ },
171
+ "reveal.distance": "How far the element travels while it appears.",
172
+ "reveal.opacity": "How see-through the element is when it starts; 0 is invisible.",
173
+ "reveal-blur.distance": "How far the element travels while it appears.",
174
+ "reveal-blur.opacity": "How see-through the element is when it starts; 0 is invisible.",
175
+ "reveal-blur.blur": "How blurry the element is when it starts.",
176
+ "roll.distance": "How far the element travels while it rolls in.",
177
+ "roll.angle": "How far turned the element starts before it rolls upright.",
178
+ "scale-move.distance": "How far the element travels while it grows in.",
179
+ "scale-move.scale": "How small the element starts before it grows to full size.",
180
+ "scroll-fade.opacity": "How see-through the element is at the start of the scroll range."
181
+ };
182
+
183
+ // src/notes/interaction.ts
184
+ var INTERACTION_NOTES = {
185
+ "anchored-preview.distance": "How far the preview travels as it pops in.",
186
+ "anchored-preview.gap": "How much space is left between the preview and what it points at.",
187
+ "anchored-preview.scale": "How small the preview starts before it grows to full size.",
188
+ "anchored-preview.color": {
189
+ why: "Text colour of the preview.",
190
+ whenOmitted: "Keeps the surrounding text colour."
191
+ },
192
+ "anchored-preview.bg-color": {
193
+ why: "Background colour of the preview.",
194
+ whenOmitted: "No background, so a picture or your own styling shows as it is."
195
+ },
196
+ "anchored-preview.radius": {
197
+ why: "How rounded the preview corners are.",
198
+ whenOmitted: "Square corners."
199
+ },
200
+ "anchored-preview.place": {
201
+ why: "Which side the preview sits on, or auto to flip to the other side when there is no room."
202
+ },
203
+ "anchored-preview.tease": {
204
+ why: "Show the preview once by itself on arrival, so people know it is there.",
205
+ whenOmitted: "Off: the preview only shows on hover or focus."
206
+ },
207
+ "anchored-preview.target": {
208
+ why: "Which child is the preview, when it is not marked with data-kui-preview.",
209
+ whenOmitted: "Uses the child marked data-kui-preview."
210
+ },
211
+ "beam-border.duration": "How long one full lap of the light around the border takes.",
212
+ "beam-border.delay": "How long the pointer waits before the light starts circling.",
213
+ "beam-border.color": {
214
+ why: "Colour of the travelling light.",
215
+ whenOmitted: "A four-colour rainbow."
216
+ },
217
+ "beam-border.outset": {
218
+ why: "Pushes the ring outward, to sit over a border the element already has.",
219
+ whenOmitted: "The ring sits just inside any existing border."
220
+ },
221
+ "beam-border.arc": "How much of the ring is lit: a short dash or a nearly full ring.",
222
+ "beam-border.softness": "How gradually the light fades in at its leading edge.",
223
+ "beam-border-auto.duration": "How long one full lap of the light around the border takes.",
224
+ "beam-border-auto.color": {
225
+ why: "Colour of the travelling light.",
226
+ whenOmitted: "A four-colour rainbow."
227
+ },
228
+ "beam-border-auto.outset": {
229
+ why: "Pushes the ring outward, to sit over a border the element already has.",
230
+ whenOmitted: "The ring sits just inside any existing border."
231
+ },
232
+ "beam-border-auto.arc": "How much of the ring is lit: a short dash or a nearly full ring.",
233
+ "beam-border-auto.softness": "How gradually the light fades in at its leading edge.",
234
+ "border-draw.color": {
235
+ why: "Colour of the border that draws itself.",
236
+ whenOmitted: "Uses the page accent colour."
237
+ },
238
+ "border-draw.width": "How thick the drawn border is.",
239
+ "border-draw.outset": {
240
+ why: "Pushes the drawn border outward, to sit over a border the element already has.",
241
+ whenOmitted: "0px: the line sits at the element edge."
242
+ },
243
+ "border-glow.color": {
244
+ why: "Colour of the glowing outline.",
245
+ whenOmitted: "Uses the page accent colour."
246
+ },
247
+ "cursor-follow.stiffness": "Higher snaps the dot to the pointer faster; lower feels looser.",
248
+ "cursor-follow.damping": "Higher stops the dot wobbling sooner; lower lets it overshoot.",
249
+ "cursor-follow.mass": "Higher makes the dot feel heavier and slower to start and stop.",
250
+ "cursor-follow.label": {
251
+ why: "Text shown inside the dot that follows the pointer.",
252
+ whenOmitted: "The dot has no text."
253
+ },
254
+ "cursor-invert.stiffness": "Higher snaps the dot to the pointer faster; lower feels looser.",
255
+ "cursor-invert.damping": "Higher stops the dot wobbling sooner; lower lets it overshoot.",
256
+ "cursor-invert.mass": "Higher makes the dot feel heavier and slower to start and stop.",
257
+ "cursor-invert.label": {
258
+ why: "Text shown inside the dot that follows the pointer.",
259
+ whenOmitted: "The dot has no text."
260
+ },
261
+ "cursor-label.stiffness": "Higher snaps the dot to the pointer faster; lower feels looser.",
262
+ "cursor-label.damping": "Higher stops the dot wobbling sooner; lower lets it overshoot.",
263
+ "cursor-label.mass": "Higher makes the dot feel heavier and slower to start and stop.",
264
+ "cursor-label.label": {
265
+ why: "Text shown inside the dot that follows the pointer.",
266
+ whenOmitted: "The dot has no text."
267
+ },
268
+ "cursor-lag.stiffness": "Higher snaps the dot to the pointer faster; lower feels looser.",
269
+ "cursor-lag.damping": "Higher stops the dot wobbling sooner; lower lets it overshoot.",
270
+ "cursor-lag.mass": "Higher makes the dot feel heavier and slower to start and stop.",
271
+ "cursor-lag.label": {
272
+ why: "Text shown inside the dot that follows the pointer.",
273
+ whenOmitted: "The dot has no text."
274
+ },
275
+ "group-dim.delay": "How long the pointer rests before the others dim, so passing over does not flicker.",
276
+ "group-dim.opacity": "How faded the other items get; lower is dimmer.",
277
+ "icon-spin.duration": "How long one full turn of the icon takes.",
278
+ "label-swap.distance": {
279
+ why: "How far each label slides as it swaps; 100% is a full label height."
280
+ },
281
+ "lift.distance": "How far the element rises on hover.",
282
+ "lift-shadow.distance": "How far the element rises on hover.",
283
+ "pop.scale": "How much bigger the element grows on hover; 1 is no change.",
284
+ "press.delay": "How long to hold before the press shows.",
285
+ "press.scale": "How small the element shrinks while pressed; 1 is no change.",
286
+ "press.depth": "How far the shadow sinks in while pressed, to look pushed down.",
287
+ "press.color": {
288
+ why: "Colour of the shadow that shows while pressed.",
289
+ whenOmitted: "A soft dark shadow."
290
+ },
291
+ "proximity-glow.color": {
292
+ why: "Colour of the glow on the edge nearest the pointer.",
293
+ whenOmitted: "Uses the page accent colour."
294
+ },
295
+ "proximity-glow.radius": "How far from the pointer the glow reaches before it fades out.",
296
+ "proximity-glow.width": "How thick the glowing edge line is.",
297
+ "proximity-glow.outset": {
298
+ why: "Pushes the glowing edge outward, to sit over a border the element already has.",
299
+ whenOmitted: "0px: the line sits at the element edge."
300
+ },
301
+ "search-expand.collapsed": "How wide the search box is while resting.",
302
+ "search-expand.width": "How wide the search box grows to when opened.",
303
+ "shine-sweep.color": {
304
+ why: "Colour of the shiny band that sweeps across.",
305
+ whenOmitted: "A soft translucent white."
306
+ },
307
+ "shine-sweep.angle": "The tilt of the shiny band as it crosses.",
308
+ "shine-sweep.width": "How wide the shiny band is, as a share of the element.",
309
+ "tilt-3d.maxAngle": "The most it tilts, in degrees, with the pointer at its edge; mouse or trackpad only.",
310
+ "tilt-3d.perspective": "How strong the 3D depth looks; a smaller distance looks more dramatic.",
311
+ "tilt-parallax.strength": 'Pixels a data-depth="1" layer shifts with the pointer at the edge; other depths scale it.',
312
+ "underline-center.color": {
313
+ why: "Colour of the underline.",
314
+ whenOmitted: "Uses the text colour."
315
+ },
316
+ "underline-slide.color": {
317
+ why: "Colour of the underline.",
318
+ whenOmitted: "Uses the text colour."
319
+ }
320
+ };
321
+
322
+ // src/notes/interaction-reveal.ts
323
+ var INTERACTION_REVEAL_NOTES = {
324
+ "hover-intent.duration": "How long the hint takes to fade in once it shows.",
325
+ "hover-intent.delay": "How long the pointer must rest first, so a mouse just passing over doesn't pop the hint.",
326
+ "hover-intent.ease": "The speed curve of the hint fading in.",
327
+ "hover-intent.distance": "How far the hint rises as it appears.",
328
+ "hover-intent.color": "Text colour of the hint card.",
329
+ "hover-intent.bg-color": "Background colour of the hint card.",
330
+ "hover-intent.radius": "How rounded the hint card corners are.",
331
+ "hover-intent.place": {
332
+ why: "Where the hint sits: above, below, or flip below when there is no room above."
333
+ },
334
+ "hover-intent.tease": {
335
+ why: "Show the hint once by itself on arrival, so people know it is there.",
336
+ whenOmitted: "Off: the hint only shows on hover or focus."
337
+ },
338
+ "hover-intent.target": {
339
+ why: "Which child is the hint, when it is not marked with data-kui-hint.",
340
+ whenOmitted: "Uses the child marked data-kui-hint."
341
+ }
342
+ };
343
+
344
+ // src/notes/keys.ts
345
+ var KEY_NOTES = {
346
+ "data-kui.on": {
347
+ why: "What starts it: scrolling into view, a hover, a click, or any event name.",
348
+ whenOmitted: "Each effect picks: most start in view, hover and drag ones are ready on load."
349
+ },
350
+ "data-kui.actions": {
351
+ why: "What to do each time it scrolls in, out, back in and back out.",
352
+ whenOmitted: "It plays on the way in and nothing else."
353
+ },
354
+ "data-kui.timeline": {
355
+ why: "What drives it: the clock, or the scroll position so it moves as you scroll.",
356
+ whenOmitted: "It plays over time, at its own speed."
357
+ },
358
+ "data-kui.threshold": {
359
+ why: "How much of the element must be in view before it starts.",
360
+ whenOmitted: "It starts as soon as any part of it shows."
361
+ },
362
+ "data-kui.cascade": {
363
+ why: "Extra wait for each child, so they arrive one after another.",
364
+ whenOmitted: "The children all start together."
365
+ },
366
+ "data-kui.spread": {
367
+ why: "Total time for all children to start, however many there are.",
368
+ whenOmitted: "The children all start together, unless cascade sets a step."
369
+ },
370
+ "data-kui.order": {
371
+ why: "Which child goes first: start, end, center, edges, random or a position.",
372
+ whenOmitted: "The first child goes first."
373
+ },
374
+ "data-kui.cols": {
375
+ why: "How many columns the children sit in, so order can mean a cell in a grid.",
376
+ whenOmitted: "The children are treated as one line, in page order."
377
+ },
378
+ "data-kui.along": {
379
+ why: "Keep a grid stagger to one direction: across (x) or down (y).",
380
+ whenOmitted: "The wave spreads both ways."
381
+ },
382
+ "data-kui.rm": {
383
+ why: "What to do for visitors who ask for less motion: shorten, fade, or skip it.",
384
+ whenOmitted: "The effects choose, and the strictest choice wins."
385
+ },
386
+ "data-kui.func": {
387
+ why: "The name of a page function to call when the effects finish.",
388
+ whenOmitted: "Nothing is called."
389
+ },
390
+ "data-kui.at": {
391
+ why: "Start this step relative to the one before: with it, after it, or a time off.",
392
+ whenOmitted: "It starts at the same moment as the other steps."
393
+ },
394
+ "data-kui.above": {
395
+ why: "Only run this step when the screen is at least this wide.",
396
+ whenOmitted: "It runs at every screen width."
397
+ },
398
+ "data-kui.below": {
399
+ why: "Only run this step when the screen is narrower than this.",
400
+ whenOmitted: "It runs at every screen width."
401
+ },
402
+ "data-kui.wide": {
403
+ why: "Only run this step when its container is at least this wide.",
404
+ whenOmitted: "It runs at every container width."
405
+ },
406
+ "data-kui.narrow": {
407
+ why: "Only run this step when its container is narrower than this.",
408
+ whenOmitted: "It runs at every container width."
409
+ },
410
+ "data-kui.repeat": {
411
+ why: "How many times this step plays, or infinite to keep going.",
412
+ whenOmitted: "It plays once."
413
+ },
414
+ "data-kui.yoyo": {
415
+ why: "Play every other repeat backwards, so it swings back and forth.",
416
+ whenOmitted: "Every repeat plays forwards."
417
+ }
418
+ };
419
+
420
+ // src/notes/mechanics.ts
421
+ var MECHANICS_NOTES = {
422
+ "auto-height.attribute": {
423
+ why: "Which attribute changing tells the panel it opened or closed, so it can animate its height.",
424
+ whenOmitted: "Watches data-open."
425
+ },
426
+ "bar.from": "How wide the bar starts, growing from its left edge: 0 is empty, 1 is full width.",
427
+ "bar-grow.from": "How short the bar starts, growing up from its base: 0 is flat, 1 is full height.",
428
+ "blur.blur": "How blurry it is at its blurriest, before sharpening or after fading out.",
429
+ "card-toggle.delay": "Wait this long before turning to the back; turning back to the front is never delayed.",
430
+ "card-toggle.perspective": "How deep the 3D looks as the card turns; smaller is more dramatic.",
431
+ "card-toggle.trigger": {
432
+ why: "What turns the card: a click, a hover, a hover that stays turned, or a hover that flips each time.",
433
+ whenOmitted: "Click."
434
+ },
435
+ "draggable.stiffness": "How firmly it springs toward where it is headed; higher snaps harder.",
436
+ "draggable.damping": "How quickly the spring wobble dies out; lower wobbles longer.",
437
+ "draggable.mass": "How heavy it feels; higher is slower and swingier.",
438
+ "draggable.axis": "Limit dragging to sideways only, up and down only, or both.",
439
+ "draggable.bounds": {
440
+ why: "The furthest, in pixels, it can be pulled from its start; it gets stiffer near the limit.",
441
+ whenOmitted: "No limit."
442
+ },
443
+ "draggable.return": {
444
+ why: "Spring back to the starting spot when you let go.",
445
+ whenOmitted: "Off: it stays where you drop it."
446
+ },
447
+ "draggable.inertia": {
448
+ why: "Keep gliding after you let go, carrying the speed of your flick.",
449
+ whenOmitted: "Off: it stops exactly where you released it."
450
+ },
451
+ "draggable.resistance": "How stiff it feels near the limit, from 0 to 1; lower is harder to stretch. Needs bounds.",
452
+ "draggable.momentum": "How far a flick carries it past the release point. Needs inertia, and does nothing with return.",
453
+ "flip-container.scale": {
454
+ why: "Also stretch items that change size as they move, instead of only sliding them.",
455
+ whenOmitted: "Off: items only slide into place."
456
+ },
457
+ "grid-to-list.scale": {
458
+ why: "Also stretch items that change size as they move, instead of only sliding them.",
459
+ whenOmitted: "On for this name, since every item changes shape between grid and list."
460
+ },
461
+ "expand-to-modal.scale": {
462
+ why: "Also stretch items that change size as they move, instead of only sliding them.",
463
+ whenOmitted: "On for this name, since the item grows into the modal."
464
+ },
465
+ "flip-face.angle": "How far the face turns, in degrees; 180deg is a full flip.",
466
+ "flip-face.perspective": "How deep the 3D looks while turning; smaller is more dramatic.",
467
+ "flip-indicator.follow": {
468
+ why: "Which element the indicator slides to, such as the active tab; the first match on the page.",
469
+ whenOmitted: "Nothing to follow, so the indicator stays put.",
470
+ required: true
471
+ },
472
+ "flip-indicator.attribute": {
473
+ why: "Which attribute changing tells it the active item has moved.",
474
+ whenOmitted: "Watches aria-selected."
475
+ },
476
+ "icon-toggle.delay": "Wait this long before opening; closing is never delayed.",
477
+ "magnetic.stiffness": "How firmly it springs toward the pointer; higher follows tighter.",
478
+ "magnetic.damping": "How quickly the spring wobble dies out; lower wobbles longer.",
479
+ "magnetic.mass": "How heavy it feels; higher is slower and swingier.",
480
+ "magnetic.radius": "How close the pointer must come, in pixels, before it starts drifting toward it.",
481
+ "magnetic.strength": "How much of the pointer distance it follows; higher drifts further.",
482
+ "motion-path.path": {
483
+ why: "The route it travels, drawn as SVG path data.",
484
+ whenOmitted: "The name's own route; plain motion-path uses a straight 120 pixel line to the right."
485
+ },
486
+ "motion-path.rotate": {
487
+ why: "Turn to face the way it travels (auto), the reverse way, or hold a fixed angle.",
488
+ whenOmitted: "Keeps its own orientation."
489
+ },
490
+ "motion-path.anchor": {
491
+ why: "Which point of the element rides the path; use center when it turns to follow.",
492
+ whenOmitted: "Its top-left corner."
493
+ },
494
+ "motion-path.from": "Where along the path it starts, as a percentage of the length.",
495
+ "motion-path.to": "Where along the path it stops, as a percentage of the length.",
496
+ "page-reveal.distance": "How far the page slides as it fades in. Only the slide version moves.",
497
+ "page-fade.distance": "Does nothing here: page-fade only fades. Use page-slide to move as well.",
498
+ "path-draw.length": {
499
+ why: "The total length of the line, so it draws fully; match it to your shape.",
500
+ whenOmitted: "Assumes 100."
501
+ },
502
+ "path-morph.from": {
503
+ why: "The starting shape, as SVG path data.",
504
+ whenOmitted: "Uses the path's own shape."
505
+ },
506
+ "path-morph.to": {
507
+ why: "The shape it morphs into, as SVG path data.",
508
+ whenOmitted: "Nothing to morph into: a warning, and the shape never changes.",
509
+ required: true
510
+ },
511
+ "path-morph.delay": "Wait this long after the pointer arrives before morphing; moving away is never delayed.",
512
+ "pressable.duration": "How long you must hold before it counts as a press.",
513
+ "rotate.angle": "How far it is turned at the start, before straightening up.",
514
+ "scale.scale": "How small it starts before growing to full size; 1 means no size change.",
515
+ "skew.from": "The tilt at the start of the scroll range.",
516
+ "skew.to": "The tilt at the end of the scroll range.",
517
+ "swipeable.axis": "Only count sideways swipes, only up and down swipes, or both.",
518
+ "swipeable.velocity": "How fast a flick must be, in pixels per second, to count as a swipe.",
519
+ "tween.x": "How far it slides sideways by the end; a quoted list like x:'0,100,40' passes through each.",
520
+ "tween.y": "How far it slides up or down by the end; a quoted list like y:'0,-60,0' passes through each.",
521
+ "tween.z": "How far it moves toward or away from you by the end.",
522
+ "tween.rotate": "How far it has turned by the end; a quoted list like rotate:'0,90,45' passes through each.",
523
+ "tween.scale": "How big it is by the end; 2 is double. A quoted list like scale:'1,1.2,1' passes through each.",
524
+ "tween.scale-x": "How wide it is by the end, separate from its height.",
525
+ "tween.scale-y": "How tall it is by the end, separate from its width.",
526
+ "tween.opacity": "How see-through it is by the end; 0 is invisible. A quoted list like opacity:'1,0,1' steps through each.",
527
+ "tween.blur": "How blurry it is by the end.",
528
+ "tween.brightness": "How bright it is by the end; 1 is normal, 0 is black.",
529
+ "tween.saturate": "How vivid the colours are by the end; 0 is grey.",
530
+ "tween.grayscale": "How grey it is by the end; 1 is fully black and white.",
531
+ "tween.contrast": "How strong the light and dark difference is by the end.",
532
+ "tween.hue-rotate": "How far its colours have shifted around the colour wheel by the end.",
533
+ "tween.invert": "How inverted its colours are by the end; 1 is fully flipped.",
534
+ "tween.sepia": "How much of an old-photo brown tone it has by the end.",
535
+ "tween.color": "The text colour it fades to.",
536
+ "tween.background-color": "The background colour it fades to.",
537
+ "tween.translate-ease": {
538
+ why: "Speed curve for just the sliding part.",
539
+ whenOmitted: "Uses the main speed curve."
540
+ },
541
+ "tween.rotate-ease": {
542
+ why: "Speed curve for just the turning part.",
543
+ whenOmitted: "Uses the main speed curve."
544
+ },
545
+ "tween.scale-ease": {
546
+ why: "Speed curve for just the resizing part.",
547
+ whenOmitted: "Uses the main speed curve."
548
+ },
549
+ "tween.opacity-ease": {
550
+ why: "Speed curve for just the fading part.",
551
+ whenOmitted: "Uses the main speed curve."
552
+ },
553
+ "tween.filter-ease": {
554
+ why: "Speed curve for just the blur and colour-effect part.",
555
+ whenOmitted: "Uses the main speed curve."
556
+ },
557
+ "tween.color-ease": {
558
+ why: "Speed curve for just the text colour change.",
559
+ whenOmitted: "Uses the main speed curve."
560
+ },
561
+ "tween.background-ease": {
562
+ why: "Speed curve for just the background colour change.",
563
+ whenOmitted: "Uses the main speed curve."
564
+ },
565
+ "tween-from.x": "How far sideways it starts, then slides back; a quoted list like x:'80,-20,0' passes through each.",
566
+ "tween-from.y": "How far up or down it starts, then slides back; a quoted list like y:'40,-10,0' passes through each.",
567
+ "tween-from.z": "How far toward or away from you it starts, then settles back.",
568
+ "tween-from.rotate": "How far it is turned at the start, before straightening up.",
569
+ "tween-from.scale": "How big it starts; 0.5 is half size, growing to normal.",
570
+ "tween-from.scale-x": "How wide it starts, separate from its height.",
571
+ "tween-from.scale-y": "How tall it starts, separate from its width.",
572
+ "tween-from.opacity": "How see-through it starts; 0 is invisible, fading in.",
573
+ "tween-from.blur": "How blurry it starts, sharpening to normal.",
574
+ "tween-from.brightness": "How bright it starts; 1 is normal, 0 is black.",
575
+ "tween-from.saturate": "How vivid the colours start; 0 is grey.",
576
+ "tween-from.grayscale": "How grey it starts; 1 is fully black and white.",
577
+ "tween-from.contrast": "How strong the light and dark difference starts.",
578
+ "tween-from.hue-rotate": "How far its colours start shifted around the colour wheel.",
579
+ "tween-from.invert": "How inverted its colours start; 1 is fully flipped.",
580
+ "tween-from.sepia": "How much of an old-photo brown tone it starts with.",
581
+ "tween-from.color": "The text colour it starts as, fading to its normal colour.",
582
+ "tween-from.background-color": "The background colour it starts as, fading to its normal one.",
583
+ "tween-from.translate-ease": {
584
+ why: "Speed curve for just the sliding part.",
585
+ whenOmitted: "Uses the main speed curve."
586
+ },
587
+ "tween-from.rotate-ease": {
588
+ why: "Speed curve for just the turning part.",
589
+ whenOmitted: "Uses the main speed curve."
590
+ },
591
+ "tween-from.scale-ease": {
592
+ why: "Speed curve for just the resizing part.",
593
+ whenOmitted: "Uses the main speed curve."
594
+ },
595
+ "tween-from.opacity-ease": {
596
+ why: "Speed curve for just the fading part.",
597
+ whenOmitted: "Uses the main speed curve."
598
+ },
599
+ "tween-from.filter-ease": {
600
+ why: "Speed curve for just the blur and colour-effect part.",
601
+ whenOmitted: "Uses the main speed curve."
602
+ },
603
+ "tween-from.color-ease": {
604
+ why: "Speed curve for just the text colour change.",
605
+ whenOmitted: "Uses the main speed curve."
606
+ },
607
+ "tween-from.background-ease": {
608
+ why: "Speed curve for just the background colour change.",
609
+ whenOmitted: "Uses the main speed curve."
610
+ }
611
+ };
612
+
613
+ // src/notes/scroll-nav-forms.ts
614
+ var SCROLL_NAV_FORMS_NOTES = {
615
+ "back-to-top-fade.offset": "How far down the page you scroll, in pixels, before the button appears.",
616
+ "header-hide-on-scroll.offset": {
617
+ why: "Smallest scroll movement that counts, so tiny jitters do not hide or show the header."
618
+ },
619
+ "header-shrink.offset": "How far down the page you scroll, in pixels, before the header is fully shrunk.",
620
+ "horizontal-track.distance": "How much vertical scrolling it takes to slide the row all the way across.",
621
+ "horizontal-track.travel": {
622
+ why: "How far the row slides sideways in total, if you do not want it measured.",
623
+ whenOmitted: "Measured from how much wider the row is than its window."
624
+ },
625
+ "horizontal-track.target": {
626
+ why: "Which element is the sliding row; naming it lets the effect build the pinned window for you.",
627
+ whenOmitted: "The element itself is the row, and you provide the pinned window."
628
+ },
629
+ "horizontal-track.scope": {
630
+ why: "Whether the row is looked for only inside this element or anywhere on the page.",
631
+ whenOmitted: "Looks only inside this element."
632
+ },
633
+ "horizontal-track.offset-top": {
634
+ why: "Gap left at the top while the row is held, such as for a fixed header. Only works with target.",
635
+ whenOmitted: "Uses the page-wide pin gap, or none."
636
+ },
637
+ "media-scrub.distance": "How much scrolling it takes to play the frames or video from start to end.",
638
+ "media-scrub.offset-top": {
639
+ why: "Gap left at the top while the media is held, such as for a fixed header. Only works with spacer.",
640
+ whenOmitted: "Uses the page-wide pin gap, or none."
641
+ },
642
+ "media-scrub.spacer": {
643
+ why: "Let the effect hold the media in place and reserve the scroll room, so no wrapper is needed.",
644
+ whenOmitted: "Off: your page positions the media and provides the scroll room."
645
+ },
646
+ "media-scrub.frames": {
647
+ why: "How many numbered images the picture sequence has.",
648
+ whenOmitted: "Counts as one frame. Ignored when target is set."
649
+ },
650
+ "media-scrub.src": {
651
+ why: "Address of the numbered images, with {i} standing in for the frame number.",
652
+ whenOmitted: "No images are swapped; a video still plays with scroll."
653
+ },
654
+ "media-scrub.target": {
655
+ why: "Which elements are the frames, shown one at a time as you scroll.",
656
+ whenOmitted: "Swaps the picture address (src) or scrubs this element if it is a video."
657
+ },
658
+ "media-scrub.scope": {
659
+ why: "Whether the frames are looked for only inside this element or anywhere on the page.",
660
+ whenOmitted: "Looks anywhere on the page."
661
+ },
662
+ "pin.distance": "How much scrolling the element stays held in place for.",
663
+ "pin.offset-top": {
664
+ why: "Gap left above the held element, such as for a fixed header.",
665
+ whenOmitted: "Uses the page-wide pin gap, or none."
666
+ },
667
+ "pin.spacer": {
668
+ why: "Add blank scroll room under the element so it can stay held for the full distance.",
669
+ whenOmitted: "Off: it only holds while its own parent is still on screen."
670
+ },
671
+ "radio-fill.scale": "Makes the filled dot inside the radio button bigger or smaller.",
672
+ "range-fill.duration": "No visible effect; the fill timing is fixed in the stylesheet.",
673
+ "range-fill.delay": "No visible effect; the fill timing is fixed in the stylesheet.",
674
+ "range-fill.ease": "No visible effect; the fill timing is fixed in the stylesheet.",
675
+ "scroll-progress.distance": "How much scrolling it takes to go from 0 to 100 percent.",
676
+ "scroll-progress.steps": {
677
+ why: "Split the scroll into this many numbered steps your styles can react to.",
678
+ whenOmitted: "0: only a smooth progress value is published, no steps."
679
+ },
680
+ "scroll-progress.target": {
681
+ why: "Which elements get marked as before, active or after as the steps advance. Needs steps.",
682
+ whenOmitted: "No elements are marked; only the step number is published."
683
+ },
684
+ "scroll-progress.scope": {
685
+ why: "Whether the marked elements are looked for only inside this element or anywhere on the page.",
686
+ whenOmitted: "Looks anywhere on the page."
687
+ },
688
+ "scroll-snap.axis": "Whether scrolling snaps sideways (x) or up and down (y).",
689
+ "scroll-snap.strictness": "Whether it always snaps (mandatory) or only when you stop close to an item.",
690
+ "scroll-snap.align": "Which edge of each item lines up with the scroll area when it snaps.",
691
+ "scroll-snap.target": {
692
+ why: "Which elements are the snap items; naming them also makes this element the scroll area.",
693
+ whenOmitted: "Uses its direct children and leaves the scrolling to your page."
694
+ },
695
+ "scroll-snap.scope": {
696
+ why: "Whether the snap items are looked for only inside this element or anywhere on the page.",
697
+ whenOmitted: "Looks only inside this element."
698
+ },
699
+ "scroll-spy.distance": {
700
+ why: "How much scrolling this section counts as being the current one.",
701
+ whenOmitted: "One screen height. Ignored when sections is set."
702
+ },
703
+ "scroll-spy.target": {
704
+ why: "Which menu link to highlight; with sections, each link is matched to a section by its #href.",
705
+ whenOmitted: "No link is highlighted."
706
+ },
707
+ "scroll-spy.scope": {
708
+ why: "Whether the links are looked for only inside this element or anywhere on the page.",
709
+ whenOmitted: "Anywhere on the page for one section, inside this element when sections is set."
710
+ },
711
+ "scroll-spy.sections": {
712
+ why: "Which elements are the sections, so one setup on a shared parent can track them all.",
713
+ whenOmitted: "Each section carries its own setup instead."
714
+ },
715
+ "scroll-spy.offset-top": {
716
+ why: "Gap at the top of the screen, such as a fixed header, before a section counts as current.",
717
+ whenOmitted: "None. Only works when sections is set."
718
+ },
719
+ "smooth-scroll.behavior": "Whether jumping to a link glides (smooth) or lands instantly (auto).",
720
+ "strength-meter.duration": "No visible effect; the meter fade timing is fixed in the stylesheet.",
721
+ "strength-meter.delay": "No visible effect; the meter fade timing is fixed in the stylesheet.",
722
+ "strength-meter.ease": "No visible effect; the meter fade timing is fixed in the stylesheet.",
723
+ "submit-flow.duration": "No visible effect; the stage timing is set by load and hold instead.",
724
+ "submit-flow.delay": "No visible effect; the stage timing is set by load and hold instead.",
725
+ "submit-flow.ease": "No visible effect; the stage timing is set by load and hold instead.",
726
+ "submit-flow.load": "How long the spinner shows after a click, before the button shows done.",
727
+ "submit-flow.hold": "How long the done state stays before the button goes back to normal.",
728
+ "toggle-morph.scale": "Makes the whole toggle switch bigger or smaller."
729
+ };
730
+
731
+ // src/notes/shared.ts
732
+ var SHARED_NOTES = {
733
+ "*.duration": "How long the motion takes from start to finish.",
734
+ "*.delay": "Wait this long after the trigger before starting.",
735
+ "*.ease": "The speed curve: slow start, slow finish, or a bounce.",
736
+ "*.stagger": {
737
+ why: "Extra wait per item, so a group arrives one after another.",
738
+ whenOmitted: "Every item starts at once, unless a parent sets a stagger."
739
+ }
740
+ };
741
+
742
+ // src/notes/showcase.ts
743
+ var SHOWCASE_NOTES = {
744
+ "compare.position": "Where the divider starts between two images, as a share of the width.",
745
+ "compare.positions": {
746
+ why: "Where each divider starts when comparing three or more images, as one quoted list.",
747
+ whenOmitted: "Dividers are spaced evenly."
748
+ },
749
+ "compare.axis": "Whether the divider moves left-right or up-down.",
750
+ "compare.autoplay": {
751
+ why: "Makes the divider sweep back and forth by itself, until someone grabs it.",
752
+ whenOmitted: "Never: the divider stays put until dragged."
753
+ },
754
+ "compare.duration": "How long one sweep of the divider takes, edge to edge. Only used with autoplay.",
755
+ "compare.reverse": "Start the sweep toward the other edge first. Only used with autoplay.",
756
+ "compare.loop": {
757
+ why: "Keep sweeping back and forth until someone takes the handle. Only used with autoplay.",
758
+ whenOmitted: "Off: it sweeps once and stops."
759
+ },
760
+ "device-frame.kind": "Which device the content is framed in: browser window, phone, tablet or laptop.",
761
+ "device-frame.color": "Colour of the device body around the screen.",
762
+ "device-frame.radius": {
763
+ why: "How rounded the outer corners of the device are.",
764
+ whenOmitted: "Each device keeps its own natural corner size."
765
+ },
766
+ "device-frame.screen-radius": {
767
+ why: "How rounded the corners of the screen inside the device are.",
768
+ whenOmitted: "The screen follows the outer corners, less the bezel, and is always at least a little rounded."
769
+ },
770
+ "hotspots.target": {
771
+ why: "Which elements are the notes, one marker each.",
772
+ whenOmitted: "Uses the items of the list directly inside it."
773
+ },
774
+ "hotspots.marker": "Whether each marker shows its number or is a plain dot.",
775
+ "hotspots.scope": {
776
+ why: "Whether the notes are looked for inside this element or anywhere on the page.",
777
+ whenOmitted: "Looks only inside this element."
778
+ },
779
+ "lightbox.media": "What opens in the viewer: pictures, videos, or a mix of both.",
780
+ "lightbox.target": {
781
+ why: "Which elements open the viewer when clicked.",
782
+ whenOmitted: "Uses the links (and pictures) inside it."
783
+ },
784
+ "lightbox.scope": {
785
+ why: "Whether the clickable items are looked for inside this element or anywhere on the page.",
786
+ whenOmitted: "Looks only inside this element."
787
+ },
788
+ "lightbox.scale": "How small the picture starts as it grows into the viewer; 1 means no zoom.",
789
+ "lightbox.loop": {
790
+ why: "Whether the arrows wrap from the last item back to the first.",
791
+ whenOmitted: "On: it wraps around."
792
+ },
793
+ "lightbox.aspect": {
794
+ why: "Forces the video frame to a wide, tall or square shape.",
795
+ whenOmitted: "Tall for a YouTube Shorts link, wide for every other video."
796
+ },
797
+ "lightbox.caption": "Where the line under each item comes from, or none to hide it.",
798
+ "scroll-story.target": {
799
+ why: "Which elements are the pictures or clips that change as you scroll.",
800
+ whenOmitted: "Uses the children of its first child."
801
+ },
802
+ "scroll-story.sections": {
803
+ why: "Which elements are the text steps you scroll through.",
804
+ whenOmitted: "Uses the children of its last child."
805
+ },
806
+ "scroll-story.offset-top": "How far down the screen a step must reach before it counts as current.",
807
+ "scroll-story.side": "Which side of the screen the pinned pictures sit on.",
808
+ "slideshow.target": {
809
+ why: "Which elements are the slides.",
810
+ whenOmitted: "Uses the items of the list directly inside it."
811
+ },
812
+ "slideshow.scope": {
813
+ why: "Whether the slides are looked for inside this element or anywhere on the page.",
814
+ whenOmitted: "Looks only inside this element."
815
+ },
816
+ "slideshow.next": {
817
+ why: "Your own next button, looked for inside first, then on the page. Replaces the built-in controls.",
818
+ whenOmitted: "Uses the built-in controls instead."
819
+ },
820
+ "slideshow.prev": {
821
+ why: "Your own previous button, looked for inside first, then on the page. Replaces the built-in controls.",
822
+ whenOmitted: "Uses the built-in controls instead."
823
+ },
824
+ "slideshow.jump": {
825
+ why: "Your own buttons, each jumping to the slide at its position. Replaces the built-in controls.",
826
+ whenOmitted: "Uses the built-in controls instead."
827
+ },
828
+ "slideshow.controls": "Which built-in controls appear: dots, arrows, both, or none. Ignored once next, prev or jump is set.",
829
+ "slideshow.autoplay": {
830
+ why: "How long each slide shows before moving on by itself; 2s at least.",
831
+ whenOmitted: "Off. It also stays off with controls:none or your own next, prev or jump buttons."
832
+ },
833
+ "slideshow.transition": "Whether slides cross-fade or slide sideways.",
834
+ "slideshow.swipe": "Whether a left or right swipe changes the slide.",
835
+ "slideshow.mute": {
836
+ why: "Your own button, inside the slideshow, that mutes and unmutes the video on the current slide.",
837
+ whenOmitted: "No mute button."
838
+ },
839
+ "slow-mo.rate": "How slow motion runs; 0.25 plays at a quarter of normal speed.",
840
+ "slow-mo.controls": "Whether a toggle button is added, or slow motion is just always on.",
841
+ "spatial-ring.grab": "Whether people can drag the ring with a finger or mouse.",
842
+ "spatial-ring.travel": "How many pixels of dragging move the ring by one card.",
843
+ "spatial-ring.target": {
844
+ why: "Which elements are the cards.",
845
+ whenOmitted: "Uses its direct children."
846
+ },
847
+ "spatial-ring.next": {
848
+ why: "Your own button that turns the ring to the next card, looked for inside first, then on the page.",
849
+ whenOmitted: "No button; use drag, keys or autoplay."
850
+ },
851
+ "spatial-ring.prev": {
852
+ why: "Your own button that turns the ring back a card, looked for inside first, then on the page.",
853
+ whenOmitted: "No button; use drag, keys or autoplay."
854
+ },
855
+ "spatial-ring.jump": {
856
+ why: "Your own buttons, each turning the ring to the card at its position; inside first, then the page.",
857
+ whenOmitted: "No jump buttons."
858
+ },
859
+ "spatial-ring.pause": {
860
+ why: "Your own button that pauses and resumes spin or autoplay, looked for inside first, then the page.",
861
+ whenOmitted: "No pause button; hovering still pauses."
862
+ },
863
+ "spatial-ring.hover": {
864
+ why: "Whether resting the mouse on the ring pauses spin or autoplay. none keeps it moving.",
865
+ whenOmitted: "Hovering pauses it. Keyboard focus and the pause button always pause."
866
+ },
867
+ "spatial-ring.spin": {
868
+ why: "Turns the ring slowly all the time; this is the time for one full turn.",
869
+ whenOmitted: "Off: the ring moves only when asked. A negative time turns it backwards."
870
+ },
871
+ "spatial-ring.autoplay": {
872
+ why: "How long the ring rests on each card before turning to the next; 2s at least.",
873
+ whenOmitted: "Off. If spin is also set, spin wins."
874
+ },
875
+ "spatial-ring.lightbox": {
876
+ why: "Clicking a card opens all the cards in a full-screen viewer.",
877
+ whenOmitted: "Off: clicks do nothing special."
878
+ },
879
+ "spatial-ring.scope": {
880
+ why: "Whether the cards are looked for inside this element or anywhere on the page.",
881
+ whenOmitted: "Looks only inside this element."
882
+ },
883
+ "spatial-ring.tilt": "How far the camera looks down on the ring; negative looks up from below.",
884
+ "spatial-ring.arc": "How much of a full circle the cards spread over; less makes a curved slice.",
885
+ "spatial-ring.radius": {
886
+ why: "How wide the ring is; a bigger ring spaces cards further apart.",
887
+ whenOmitted: "Sized from the card width so neighbours just fit. Shrinks if it would overflow the page."
888
+ },
889
+ "spatial-ring.gap": "Breathing room between neighbouring cards when the ring size is worked out for you.",
890
+ "spatial-ring.perspective": "How close the camera is; smaller values make the 3D look more dramatic.",
891
+ "spatial-ring.facing": "Whether cards turn outward with the ring or always face you so text stays readable.",
892
+ "spatial-ring.plane": "Whether the ring turns toward you in depth, or lies flat like a clock face.",
893
+ "spatial-stack.grab": "Whether people can drag the stack with a finger or mouse.",
894
+ "spatial-stack.travel": "How many pixels of dragging move the stack by one card.",
895
+ "spatial-stack.target": {
896
+ why: "Which elements are the cards.",
897
+ whenOmitted: "Uses its direct children."
898
+ },
899
+ "spatial-stack.next": {
900
+ why: "Your own button that brings up the next card, looked for inside first, then on the page.",
901
+ whenOmitted: "No button; use drag, keys or autoplay."
902
+ },
903
+ "spatial-stack.prev": {
904
+ why: "Your own button that brings back the previous card, looked for inside first, then on the page.",
905
+ whenOmitted: "No button; use drag, keys or autoplay."
906
+ },
907
+ "spatial-stack.jump": {
908
+ why: "Your own buttons, each bringing up the card at its position; inside first, then the page.",
909
+ whenOmitted: "No jump buttons."
910
+ },
911
+ "spatial-stack.pause": {
912
+ why: "Your own button that pauses and resumes spin or autoplay, looked for inside first, then the page.",
913
+ whenOmitted: "No pause button; hovering still pauses."
914
+ },
915
+ "spatial-stack.hover": {
916
+ why: "Whether resting the mouse on the stack pauses spin or autoplay. none keeps it moving.",
917
+ whenOmitted: "Hovering pauses it. Keyboard focus and the pause button always pause."
918
+ },
919
+ "spatial-stack.spin": {
920
+ why: "Cycles the cards slowly all the time; this is the time for one full pass.",
921
+ whenOmitted: "Off: the stack moves only when asked. A negative time runs it backwards."
922
+ },
923
+ "spatial-stack.autoplay": {
924
+ why: "How long the front card rests before the next comes up; 2s at least.",
925
+ whenOmitted: "Off. If spin is also set, spin wins."
926
+ },
927
+ "spatial-stack.lightbox": {
928
+ why: "Clicking a card opens all the cards in a full-screen viewer.",
929
+ whenOmitted: "Off: clicks do nothing special."
930
+ },
931
+ "spatial-stack.scope": {
932
+ why: "Whether the cards are looked for inside this element or anywhere on the page.",
933
+ whenOmitted: "Looks only inside this element."
934
+ },
935
+ "spatial-stack.shift": "How far each card behind steps sideways; negative steps left.",
936
+ "spatial-stack.rise": "How far each card behind steps up; negative steps down.",
937
+ "spatial-stack.shrink": "How much smaller each card behind gets, per place back.",
938
+ "spatial-stack.blur": "How much blurrier each card behind gets, per place back.",
939
+ "spatial-stack.fade": "How much fainter each card behind gets, per place back.",
940
+ "spatial-stack.depth": "How many cards show behind the front one; the rest wait hidden.",
941
+ "step-progress.duration": "Passed to your slide styles; autoplay also waits this long after someone moves it.",
942
+ "step-progress.delay": "Passed to your slide styles to use as a start wait; the library adds no pause itself.",
943
+ "step-progress.ease": "Passed to your slide styles to use as their speed curve.",
944
+ "step-progress.steps": {
945
+ why: "The number of steps, for when the elements cannot tell it.",
946
+ whenOmitted: "Counts the step elements itself."
947
+ },
948
+ "step-progress.target": {
949
+ why: "Which elements are the steps.",
950
+ whenOmitted: "Uses its direct children."
951
+ },
952
+ "step-progress.next": {
953
+ why: "Your own button that moves to the next step, looked for inside first, then on the page.",
954
+ whenOmitted: "With no next, prev, jump or pause, a click on it moves on, unless lightbox is on."
955
+ },
956
+ "step-progress.prev": {
957
+ why: "Your own button that moves to the previous step, looked for inside first, then on the page.",
958
+ whenOmitted: "With no next, prev, jump or pause, a click on it moves on, unless lightbox is on."
959
+ },
960
+ "step-progress.jump": {
961
+ why: "Your own buttons, each moving to the step at its position; inside first, then the page.",
962
+ whenOmitted: "With no next, prev, jump or pause, a click on it moves on, unless lightbox is on."
963
+ },
964
+ "step-progress.peek": "How far, as a share of a slide, your slide styles push neighbours sideways.",
965
+ "step-progress.rest": "How large your slide styles draw the non-current slides, where 1 is full size.",
966
+ "step-progress.main": "How large your slide styles draw the current slide, where 1 is full size.",
967
+ "step-progress.autoplay": {
968
+ why: "How long each step shows before moving on by itself; 2s at least.",
969
+ whenOmitted: "Off: steps change only when someone asks."
970
+ },
971
+ "step-progress.pause": {
972
+ why: "Your own button that pauses and resumes autoplay, looked for inside first, then on the page.",
973
+ whenOmitted: "No pause button; hovering still pauses."
974
+ },
975
+ "step-progress.hover": {
976
+ why: "Whether resting the mouse on the deck pauses autoplay. none keeps it moving.",
977
+ whenOmitted: "Hovering pauses it. Keyboard focus and the pause button always pause."
978
+ },
979
+ "step-progress.lightbox": {
980
+ why: "Clicking a slide opens all the slides in a full-screen viewer.",
981
+ whenOmitted: "Off: clicking a slide moves to the next one."
982
+ },
983
+ "step-progress.scope": {
984
+ why: "Whether the steps named by target are looked for inside this element or anywhere on the page.",
985
+ whenOmitted: "Looks anywhere on the page, except under the carousel name, which looks inside."
986
+ }
987
+ };
988
+
989
+ // src/notes/text.ts
990
+ var TEXT_NOTES = {
991
+ "count.from": "The number the counter starts at.",
992
+ "count.to": "The number the counter ends on.",
993
+ "count.decimals": "How many digits to show after the decimal point; ignored by compact, which shows at most one.",
994
+ "count.format": {
995
+ why: "How the number is written: plain, as money, as a percent, or shortened like 1.2K.",
996
+ whenOmitted: "Plain number. Percent expects a fraction, so 0.82 shows 82%."
997
+ },
998
+ "count.currency": {
999
+ why: "The three-letter currency code used when the format is currency.",
1000
+ whenOmitted: "US dollars."
1001
+ },
1002
+ "count-odometer.from": "The number the rolling digits start at; whole numbers from 0 up, so -5 counts as 0.",
1003
+ "count-odometer.to": "The number the rolling digits land on; whole numbers from 0 up, so 2.5 rounds to 3.",
1004
+ "drop-open.distance": "How far the element drops down into place as it opens.",
1005
+ "meter-bar.from": {
1006
+ why: "How full the bar is when it starts, from 0 (empty) to 1 (full).",
1007
+ whenOmitted: "Starts empty and grows to its full width."
1008
+ },
1009
+ "pop-open.scale": "How small the element starts, where 1 is full size.",
1010
+ "scale-open.scale": "How small the element starts, where 1 is full size.",
1011
+ "scramble-text.step": {
1012
+ why: "How long each scramble flicker lasts; ignored when a total duration is given.",
1013
+ whenOmitted: "40ms per flicker, so longer text takes longer to resolve."
1014
+ },
1015
+ "scramble-text.revealEvery": "How many flickers pass before the next letter locks in.",
1016
+ "scramble-text.charset": "Which characters the unsolved letters flicker through.",
1017
+ "slide-open-down.distance": "How far the element slides in from above.",
1018
+ "slide-open-up.distance": "How far the element slides in from below.",
1019
+ "split-text.stagger": "Wait between each piece, so letters or words arrive one by one.",
1020
+ "split-text.unit": "What the text is cut into: single letters, whole words, or lines.",
1021
+ "split-text.direction": "How each piece arrives: fade, slide up, slide down, or rise from a mask.",
1022
+ "split-text-motion.stagger": "Offset between neighbouring letters, which shapes the wave or jitter.",
1023
+ "split-text-motion.motion": "The style of letter movement: a smooth wave or a nervous jitter.",
1024
+ "text-3d-extrude.angle": "How far the text is turned at the start before it straightens; negative turns it anticlockwise.",
1025
+ "text-3d-extrude.distance": "How far below its place the text starts before it rises in.",
1026
+ "text-gradient-sweep.color": {
1027
+ why: "The colour of the glowing band that sweeps across the text.",
1028
+ whenOmitted: "Uses the text's own colour."
1029
+ },
1030
+ "text-marquee.duration": "How long one full trip of the scrolling text takes; longer is slower.",
1031
+ "text-shimmer.duration": "How long one shimmer pass takes before the next one starts.",
1032
+ "text-sweep.color": {
1033
+ why: "The colour of the highlight bar or underline.",
1034
+ whenOmitted: "Uses the text's own colour; the highlight preset uses gold."
1035
+ },
1036
+ "typewriter.step": "How long each typed letter takes; ignored when a total duration is given.",
1037
+ "typewriter.loop": {
1038
+ why: "Delete the text and type it again, over and over.",
1039
+ whenOmitted: "Off: it types once and stops."
1040
+ },
1041
+ "var-axis.axis": {
1042
+ why: "The four-character name of the font setting to animate, letters or digits, case exact: wght, GRAD.",
1043
+ whenOmitted: "Animates weight (wght); a font without that setting does not move."
1044
+ },
1045
+ "var-axis.from": "The value of the font setting at the start.",
1046
+ "var-axis.to": "The value of the font setting at the end.",
1047
+ "var-slant.from": "How far the letters lean at the start.",
1048
+ "var-slant.to": "How far the letters lean at the end.",
1049
+ "var-weight.from": "How bold the text is at the start, from thin (100) up.",
1050
+ "var-weight.to": "How bold the text is at the end, up to extra heavy (900).",
1051
+ "var-width.from": "How wide the letters are at the start; 100% is normal.",
1052
+ "var-width.to": "How wide the letters are at the end; 100% is normal.",
1053
+ "word-cycler.words": {
1054
+ why: 'The words to cycle through, separated by | and quoted, like "fast|simple|bold".',
1055
+ required: true
1056
+ },
1057
+ "word-cycler.interval": "How long each word stays before the next one swaps in."
1058
+ };
1059
+
1060
+ // src/notes/index.ts
1061
+ var PARAM_NOTES = {
1062
+ ...SHARED_NOTES,
1063
+ ...CATALOG_CORE_NOTES,
1064
+ ...CATALOG_NOTES,
1065
+ ...INTERACTION_NOTES,
1066
+ ...INTERACTION_REVEAL_NOTES,
1067
+ ...TEXT_NOTES,
1068
+ ...SCROLL_NAV_FORMS_NOTES,
1069
+ ...MECHANICS_NOTES,
1070
+ ...SHOWCASE_NOTES,
1071
+ ...KEY_NOTES
1072
+ };
1073
+ export {
1074
+ PARAM_NOTES
1075
+ };