@jaimevalasek/aioson 1.30.1 → 1.30.2

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 (90) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/docs/design-previews/cognitive-core-ui-auth.html +95 -0
  3. package/docs/design-previews/cognitive-core-ui-kanban.html +231 -0
  4. package/docs/design-previews/cognitive-core-ui-list-detail.html +174 -0
  5. package/docs/design-previews/cognitive-core-ui-preview.css +1315 -0
  6. package/docs/design-previews/cognitive-core-ui-settings.html +142 -0
  7. package/docs/design-previews/cognitive-core-ui-website.html +190 -1009
  8. package/docs/design-previews/cognitive-core-ui.html +281 -463
  9. package/docs/design-previews/index.html +83 -31
  10. package/package.json +1 -1
  11. package/src/constants.js +567 -511
  12. package/template/.aioson/docs/play/README.md +2 -0
  13. package/template/.aioson/docs/play/agent-usage-guide.md +7 -1
  14. package/template/.aioson/docs/play/app-compatibility-guide.md +6 -1
  15. package/template/.aioson/docs/play/auth-services-and-testing.md +16 -1
  16. package/template/.aioson/docs/play/manifest-and-runtime.md +23 -0
  17. package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
  18. package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
  19. package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
  20. package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
  21. package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
  22. package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
  23. package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
  24. package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
  25. package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
  26. package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
  27. package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
  28. package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
  29. package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
  30. package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
  31. package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
  32. package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
  33. package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
  34. package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
  35. package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
  36. package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
  37. package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
  38. package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
  39. package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
  40. package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
  41. package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
  42. package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
  43. package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
  44. package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
  45. package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
  46. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
  47. package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
  48. package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
  49. package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
  50. package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
  51. package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
  52. package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
  53. package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
  54. package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
  55. package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
  56. package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
  57. package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
  58. package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
  59. package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
  60. package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
  61. package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
  62. package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
  63. package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
  64. package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
  65. package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
  66. package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
  67. package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
  68. package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
  69. package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
  70. package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
  71. package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
  72. package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
  73. package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
  74. package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
  75. package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
  76. package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
  77. package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
  78. package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
  79. package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
  80. package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
  81. package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
  82. package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
  83. package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
  84. package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
  85. package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
  86. package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
  87. package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
  88. package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
  89. package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
  90. package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -289
@@ -1,461 +1,461 @@
1
- # Motion — Bold Editorial UI
2
-
3
- Animation and transition specifications. Motion in Bold Editorial is **cinematic and controlled** — every animation should feel like a deliberate cut or a camera movement. Nothing bouncy, nothing playful, nothing soft.
4
-
5
- ---
6
-
7
- ## Motion Principles
8
-
9
- 1. **Cinematic, not lively.** Motion references film editing: cuts, wipes, slow reveals. The opposite of a bouncing spring or a playful wiggle.
10
- 2. **Controlled timing.** Precise durations, smooth deceleration curves. Every timing is intentional — never arbitrary millisecond values.
11
- 3. **Sequenced.** Elements enter in sequence, not all at once. Each element earns its moment.
12
- 4. **Scroll-driven.** Landing pages use scroll as the primary narrative driver. App interactions use near-instant feedback.
13
- 5. **Respect user preference.** Always implement `prefers-reduced-motion` — all animations reduce to opacity only or instant.
14
-
15
- ---
16
-
17
- ## Timing Tokens
18
-
19
- ```css
20
- --transition-fast: 100ms ease;
21
- --transition-base: 200ms ease;
22
- --transition-slow: 400ms cubic-bezier(0.16, 1, 0.3, 1); /* smooth deceleration */
23
- --transition-hero: 800ms cubic-bezier(0.16, 1, 0.3, 1); /* hero entrances */
24
- ```
25
-
26
- ---
27
-
28
- ## Easing Curves
29
-
30
- ```css
31
- /* Standard — most interactions */
32
- --ease-default: ease;
33
-
34
- /* Enter — elements appearing (deceleration) */
35
- --ease-enter: cubic-bezier(0.0, 0.0, 0.2, 1.0); /* ease-out */
36
-
37
- /* Exit — elements leaving (acceleration) */
38
- --ease-exit: cubic-bezier(0.4, 0.0, 1.0, 1.0); /* ease-in */
39
-
40
- /* Smooth deceleration — premium feel for reveals */
41
- --ease-decel: cubic-bezier(0.16, 1, 0.3, 1);
42
- ```
43
-
44
- Rules:
45
- - Never use `cubic-bezier` with overshoot (no spring/bounce) — that is Warm Craft territory.
46
- - Exit transitions are always faster than enter: rule is 60% of enter duration.
47
-
48
- ---
49
-
50
- ## Entrance Animations
51
-
52
- ### Fade In (default)
53
- ```css
54
- @keyframes editorial-fade-in {
55
- from { opacity: 0; }
56
- to { opacity: 1; }
57
- }
58
-
59
- .fade-in {
60
- animation: editorial-fade-in 300ms var(--ease-enter) both;
61
- }
62
- ```
63
-
64
- ### Fade Up (cards, sections)
65
- ```css
66
- @keyframes editorial-fade-up {
67
- from {
68
- opacity: 0;
69
- transform: translateY(24px);
70
- }
71
- to {
72
- opacity: 1;
73
- transform: translateY(0);
74
- }
75
- }
76
-
77
- .fade-up {
78
- animation: editorial-fade-up 500ms var(--ease-decel) both;
79
- }
80
- ```
81
-
82
- Note: 24px translate (larger than warm-craft's 12px) — more cinematic entrance distance.
83
-
84
- ### Reveal Slide (headlines, images — clip-path)
85
- ```css
86
- @keyframes editorial-reveal {
87
- from { clip-path: inset(0 0 100% 0); }
88
- to { clip-path: inset(0 0 0% 0); }
89
- }
90
-
91
- .reveal-slide {
92
- animation: editorial-reveal 600ms var(--ease-decel) both;
93
- }
94
- ```
95
-
96
- Use for: section headlines, large images, hero text. The content appears as if a curtain lifts.
97
-
98
- ### Scale Reveal (modals, product frames)
99
- ```css
100
- @keyframes editorial-scale-in {
101
- from {
102
- opacity: 0;
103
- transform: scale(0.92);
104
- }
105
- to {
106
- opacity: 1;
107
- transform: scale(1);
108
- }
109
- }
110
-
111
- .scale-in {
112
- animation: editorial-scale-in 350ms var(--ease-decel) both;
113
- }
114
- ```
115
-
116
- ### Slide In (drawers, side panels)
117
- ```css
118
- @keyframes editorial-slide-right {
119
- from {
120
- opacity: 0;
121
- transform: translateX(32px);
122
- }
123
- to {
124
- opacity: 1;
125
- transform: translateX(0);
126
- }
127
- }
128
-
129
- .slide-in-right {
130
- animation: editorial-slide-right 350ms var(--ease-decel) both;
131
- }
132
- ```
133
-
134
- ---
135
-
136
- ## Word-by-Word Reveal (Manifesto / Statement heroes)
137
-
138
- For large statement headlines where each word appears sequentially:
139
-
140
- ```javascript
141
- // Split headline into word spans, apply staggered delays
142
- function setupWordReveal(element) {
143
- const words = element.textContent.split(' ');
144
- element.innerHTML = words
145
- .map((word, i) => `<span class="word-reveal" style="animation-delay:${i * 40}ms">${word}</span>`)
146
- .join(' ');
147
- }
148
- ```
149
-
150
- ```css
151
- .word-reveal {
152
- display: inline-block;
153
- opacity: 0;
154
- transform: translateY(8px);
155
- animation: editorial-fade-up 400ms var(--ease-decel) both;
156
- }
157
- ```
158
-
159
- Rules:
160
- - 40ms per word (faster than character-by-character — more cinematic).
161
- - Max 12 words in a single animated headline — beyond this, split into two separate elements.
162
- - Only for headlines at `text-4xl` and above.
163
-
164
- ---
165
-
166
- ## Counter Roll (Stat Numbers)
167
-
168
- For metrics and KPI numbers that animate from 0 to their final value on scroll entry:
169
-
170
- ```javascript
171
- function animateCounter(element, target, duration = 1200) {
172
- const start = performance.now();
173
- const update = (now) => {
174
- const elapsed = now - start;
175
- const progress = Math.min(elapsed / duration, 1);
176
- // ease-out curve
177
- const eased = 1 - Math.pow(1 - progress, 3);
178
- element.textContent = Math.floor(eased * target).toLocaleString();
179
- if (progress < 1) requestAnimationFrame(update);
180
- };
181
- requestAnimationFrame(update);
182
- }
183
- ```
184
-
185
- Rules:
186
- - Duration: 1200ms (slow enough to feel intentional, fast enough to not frustrate).
187
- - Trigger: on first viewport entry via IntersectionObserver, threshold 0.3.
188
- - Never re-trigger: once counted, never reset on scroll back.
189
- - Format output to match final value (commas, currency symbol, % sign, etc.).
190
-
191
- ---
192
-
193
- ## Stagger Sequences
194
-
195
- For card grids and feature lists entering together:
196
-
197
- ```css
198
- .stagger-group > * {
199
- animation: editorial-fade-up 500ms var(--ease-decel) both;
200
- }
201
-
202
- .stagger-group > *:nth-child(1) { animation-delay: 0ms; }
203
- .stagger-group > *:nth-child(2) { animation-delay: 80ms; }
204
- .stagger-group > *:nth-child(3) { animation-delay: 160ms; }
205
- .stagger-group > *:nth-child(4) { animation-delay: 240ms; }
206
- .stagger-group > *:nth-child(5) { animation-delay: 320ms; }
207
- .stagger-group > *:nth-child(6) { animation-delay: 400ms; }
208
- ```
209
-
210
- Rules:
211
- - Stagger delay: 80ms per item (slower than clean-saas, more deliberate — feels authored).
212
- - Max 6 items staggered. After 6, start together.
213
- - Only stagger on first load or scroll entry. Never on re-render.
214
-
215
- ---
216
-
217
- ## Micro-Interactions
218
-
219
- ### Button Press
220
- ```css
221
- button:active {
222
- transform: scale(0.98);
223
- transition: transform 80ms ease;
224
- }
225
- ```
226
-
227
- ### Card Hover
228
- ```css
229
- .card-interactive {
230
- transition: transform var(--transition-slow),
231
- box-shadow var(--transition-slow);
232
- }
233
-
234
- .card-interactive:hover {
235
- transform: translateY(-4px);
236
- box-shadow: var(--shadow-md);
237
- }
238
- ```
239
-
240
- Note: -4px lift (larger than warm-craft's -2px) — more dramatic hover.
241
-
242
- ### Media Card Image Zoom
243
- ```css
244
- .card-media {
245
- overflow: hidden;
246
- }
247
-
248
- .card-media__image {
249
- transition: transform var(--transition-slow);
250
- }
251
-
252
- .card-media:hover .card-media__image {
253
- transform: scale(1.03);
254
- }
255
- ```
256
-
257
- ### Input Focus
258
- ```css
259
- .input {
260
- transition: border-color var(--transition-fast),
261
- box-shadow var(--transition-fast);
262
- }
263
-
264
- .input:focus {
265
- border-color: var(--accent);
266
- box-shadow: 0 0 0 3px var(--accent-dim);
267
- }
268
- ```
269
-
270
- ### Underline Link Animation
271
- ```css
272
- .link-editorial {
273
- position: relative;
274
- text-decoration: none;
275
- color: var(--text-heading);
276
- }
277
-
278
- .link-editorial::after {
279
- content: '';
280
- position: absolute;
281
- bottom: -2px;
282
- left: 0;
283
- width: 0;
284
- height: 1px;
285
- background: var(--accent);
286
- transition: width var(--transition-base) var(--ease-decel);
287
- }
288
-
289
- .link-editorial:hover::after {
290
- width: 100%;
291
- }
292
- ```
293
-
294
- ---
295
-
296
- ## Scroll Animations (websites only)
297
-
298
- Use for landing pages and marketing sections. **Never for app pages.**
299
-
300
- ### Section Reveal
301
- ```css
302
- .scroll-reveal {
303
- opacity: 0;
304
- transform: translateY(32px); /* larger offset than warm-craft — more cinematic */
305
- transition: opacity 600ms var(--ease-decel),
306
- transform 600ms var(--ease-decel);
307
- }
308
-
309
- .scroll-reveal.visible {
310
- opacity: 1;
311
- transform: translateY(0);
312
- }
313
- ```
314
-
315
- ```javascript
316
- const observer = new IntersectionObserver((entries) => {
317
- entries.forEach(entry => {
318
- if (entry.isIntersecting) {
319
- entry.target.classList.add('visible');
320
- observer.unobserve(entry.target); // trigger once
321
- }
322
- });
323
- }, { threshold: 0.10 }); /* 10% — earlier trigger than warm-craft's 15% */
324
-
325
- document.querySelectorAll('.scroll-reveal').forEach(el => observer.observe(el));
326
- ```
327
-
328
- ### Image Reveal (clip-path wipe)
329
- ```css
330
- .image-reveal {
331
- clip-path: inset(0 0 100% 0);
332
- transition: clip-path 800ms var(--ease-decel);
333
- }
334
-
335
- .image-reveal.visible {
336
- clip-path: inset(0 0 0% 0);
337
- }
338
- ```
339
-
340
- Use for: case study images, hero product shots, portfolio images. The image slides in from the bottom — cinematic.
341
-
342
- ### Parallax Depth
343
- ```javascript
344
- // Apply subtle parallax to background elements (decorative only — product frames, blobs)
345
- window.addEventListener('scroll', () => {
346
- const scrolled = window.scrollY;
347
- document.querySelectorAll('[data-parallax]').forEach(el => {
348
- const speed = parseFloat(el.dataset.parallax) || 0.3;
349
- el.style.transform = `translateY(${scrolled * speed}px)`;
350
- });
351
- });
352
- ```
353
-
354
- Rules:
355
- - Max parallax multiplier: 0.3 (subtle — not a parallax circus).
356
- - Apply only to decorative elements (backgrounds, product frames). Never to readable text.
357
- - Disable below 768px for performance.
358
-
359
- ---
360
-
361
- ## Page Transitions
362
-
363
- ### Content Area Change (tab switch, route change)
364
- ```css
365
- .page-content-enter {
366
- animation: editorial-fade-up 350ms var(--ease-decel) both;
367
- }
368
-
369
- .page-content-exit {
370
- animation: editorial-fade-in 150ms var(--ease-exit) reverse both;
371
- }
372
- ```
373
-
374
- Rule: exit is faster (150ms) than enter (350ms). Content leaves quickly, arrives with intention.
375
-
376
- ### Modal Enter/Exit
377
- ```css
378
- /* Backdrop */
379
- .modal-backdrop-enter {
380
- animation: editorial-fade-in 200ms ease both;
381
- }
382
-
383
- /* Modal content */
384
- .modal-enter {
385
- animation: editorial-scale-in 300ms var(--ease-decel) both;
386
- animation-delay: 50ms;
387
- }
388
-
389
- .modal-exit {
390
- animation: editorial-scale-in 180ms var(--ease-exit) reverse both;
391
- }
392
- ```
393
-
394
- ### Drawer Enter/Exit
395
- ```css
396
- .drawer-enter {
397
- animation: editorial-slide-right 350ms var(--ease-decel) both;
398
- }
399
-
400
- .drawer-exit {
401
- animation: editorial-slide-right 200ms var(--ease-exit) reverse both;
402
- }
403
- ```
404
-
405
- ---
406
-
407
- ## Loading States
408
-
409
- ### Skeleton Pulse
410
- ```css
411
- @keyframes editorial-pulse {
412
- 0%, 100% { opacity: 1; }
413
- 50% { opacity: 0.4; }
414
- }
415
-
416
- .skeleton {
417
- background: var(--bg-elevated);
418
- border-radius: var(--radius-md);
419
- animation: editorial-pulse 2s ease-in-out infinite;
420
- }
421
- ```
422
-
423
- ### Spinner
424
- ```css
425
- @keyframes editorial-spin {
426
- to { transform: rotate(360deg); }
427
- }
428
-
429
- .spinner {
430
- width: 20px;
431
- height: 20px;
432
- border: 2px solid var(--border-medium);
433
- border-top-color: var(--accent);
434
- border-radius: var(--radius-full);
435
- animation: editorial-spin 700ms linear infinite;
436
- }
437
- ```
438
-
439
- ### Progress Bar Fill
440
- ```css
441
- .progress-fill {
442
- transition: width 500ms var(--ease-decel);
443
- }
444
- ```
445
-
446
- ---
447
-
448
- ## Reduced Motion
449
-
450
- ```css
451
- @media (prefers-reduced-motion: reduce) {
452
- *, *::before, *::after {
453
- animation-duration: 0.01ms !important;
454
- animation-iteration-count: 1 !important;
455
- transition-duration: 0.01ms !important;
456
- scroll-behavior: auto !important;
457
- }
458
- }
459
- ```
460
-
461
- Non-negotiable. Always include this in the global stylesheet. Scroll animations, counter rolls, word reveals, and parallax are all disabled. Static state must be correct without animation.
1
+ # Motion — Bold Editorial UI
2
+
3
+ Animation and transition specifications. Motion in Bold Editorial is **cinematic and controlled** — every animation should feel like a deliberate cut or a camera movement. Nothing bouncy, nothing playful, nothing soft.
4
+
5
+ ---
6
+
7
+ ## Motion Principles
8
+
9
+ 1. **Cinematic, not lively.** Motion references film editing: cuts, wipes, slow reveals. The opposite of a bouncing spring or a playful wiggle.
10
+ 2. **Controlled timing.** Precise durations, smooth deceleration curves. Every timing is intentional — never arbitrary millisecond values.
11
+ 3. **Sequenced.** Elements enter in sequence, not all at once. Each element earns its moment.
12
+ 4. **Scroll-driven.** Landing pages use scroll as the primary narrative driver. App interactions use near-instant feedback.
13
+ 5. **Respect user preference.** Always implement `prefers-reduced-motion` — all animations reduce to opacity only or instant.
14
+
15
+ ---
16
+
17
+ ## Timing Tokens
18
+
19
+ ```css
20
+ --transition-fast: 100ms ease;
21
+ --transition-base: 200ms ease;
22
+ --transition-slow: 400ms cubic-bezier(0.16, 1, 0.3, 1); /* smooth deceleration */
23
+ --transition-hero: 800ms cubic-bezier(0.16, 1, 0.3, 1); /* hero entrances */
24
+ ```
25
+
26
+ ---
27
+
28
+ ## Easing Curves
29
+
30
+ ```css
31
+ /* Standard — most interactions */
32
+ --ease-default: ease;
33
+
34
+ /* Enter — elements appearing (deceleration) */
35
+ --ease-enter: cubic-bezier(0.0, 0.0, 0.2, 1.0); /* ease-out */
36
+
37
+ /* Exit — elements leaving (acceleration) */
38
+ --ease-exit: cubic-bezier(0.4, 0.0, 1.0, 1.0); /* ease-in */
39
+
40
+ /* Smooth deceleration — premium feel for reveals */
41
+ --ease-decel: cubic-bezier(0.16, 1, 0.3, 1);
42
+ ```
43
+
44
+ Rules:
45
+ - Never use `cubic-bezier` with overshoot (no spring/bounce) — that is Warm Craft territory.
46
+ - Exit transitions are always faster than enter: rule is 60% of enter duration.
47
+
48
+ ---
49
+
50
+ ## Entrance Animations
51
+
52
+ ### Fade In (default)
53
+ ```css
54
+ @keyframes editorial-fade-in {
55
+ from { opacity: 0; }
56
+ to { opacity: 1; }
57
+ }
58
+
59
+ .fade-in {
60
+ animation: editorial-fade-in 300ms var(--ease-enter) both;
61
+ }
62
+ ```
63
+
64
+ ### Fade Up (cards, sections)
65
+ ```css
66
+ @keyframes editorial-fade-up {
67
+ from {
68
+ opacity: 0;
69
+ transform: translateY(24px);
70
+ }
71
+ to {
72
+ opacity: 1;
73
+ transform: translateY(0);
74
+ }
75
+ }
76
+
77
+ .fade-up {
78
+ animation: editorial-fade-up 500ms var(--ease-decel) both;
79
+ }
80
+ ```
81
+
82
+ Note: 24px translate (larger than warm-craft's 12px) — more cinematic entrance distance.
83
+
84
+ ### Reveal Slide (headlines, images — clip-path)
85
+ ```css
86
+ @keyframes editorial-reveal {
87
+ from { clip-path: inset(0 0 100% 0); }
88
+ to { clip-path: inset(0 0 0% 0); }
89
+ }
90
+
91
+ .reveal-slide {
92
+ animation: editorial-reveal 600ms var(--ease-decel) both;
93
+ }
94
+ ```
95
+
96
+ Use for: section headlines, large images, hero text. The content appears as if a curtain lifts.
97
+
98
+ ### Scale Reveal (modals, product frames)
99
+ ```css
100
+ @keyframes editorial-scale-in {
101
+ from {
102
+ opacity: 0;
103
+ transform: scale(0.92);
104
+ }
105
+ to {
106
+ opacity: 1;
107
+ transform: scale(1);
108
+ }
109
+ }
110
+
111
+ .scale-in {
112
+ animation: editorial-scale-in 350ms var(--ease-decel) both;
113
+ }
114
+ ```
115
+
116
+ ### Slide In (drawers, side panels)
117
+ ```css
118
+ @keyframes editorial-slide-right {
119
+ from {
120
+ opacity: 0;
121
+ transform: translateX(32px);
122
+ }
123
+ to {
124
+ opacity: 1;
125
+ transform: translateX(0);
126
+ }
127
+ }
128
+
129
+ .slide-in-right {
130
+ animation: editorial-slide-right 350ms var(--ease-decel) both;
131
+ }
132
+ ```
133
+
134
+ ---
135
+
136
+ ## Word-by-Word Reveal (Manifesto / Statement heroes)
137
+
138
+ For large statement headlines where each word appears sequentially:
139
+
140
+ ```javascript
141
+ // Split headline into word spans, apply staggered delays
142
+ function setupWordReveal(element) {
143
+ const words = element.textContent.split(' ');
144
+ element.innerHTML = words
145
+ .map((word, i) => `<span class="word-reveal" style="animation-delay:${i * 40}ms">${word}</span>`)
146
+ .join(' ');
147
+ }
148
+ ```
149
+
150
+ ```css
151
+ .word-reveal {
152
+ display: inline-block;
153
+ opacity: 0;
154
+ transform: translateY(8px);
155
+ animation: editorial-fade-up 400ms var(--ease-decel) both;
156
+ }
157
+ ```
158
+
159
+ Rules:
160
+ - 40ms per word (faster than character-by-character — more cinematic).
161
+ - Max 12 words in a single animated headline — beyond this, split into two separate elements.
162
+ - Only for headlines at `text-4xl` and above.
163
+
164
+ ---
165
+
166
+ ## Counter Roll (Stat Numbers)
167
+
168
+ For metrics and KPI numbers that animate from 0 to their final value on scroll entry:
169
+
170
+ ```javascript
171
+ function animateCounter(element, target, duration = 1200) {
172
+ const start = performance.now();
173
+ const update = (now) => {
174
+ const elapsed = now - start;
175
+ const progress = Math.min(elapsed / duration, 1);
176
+ // ease-out curve
177
+ const eased = 1 - Math.pow(1 - progress, 3);
178
+ element.textContent = Math.floor(eased * target).toLocaleString();
179
+ if (progress < 1) requestAnimationFrame(update);
180
+ };
181
+ requestAnimationFrame(update);
182
+ }
183
+ ```
184
+
185
+ Rules:
186
+ - Duration: 1200ms (slow enough to feel intentional, fast enough to not frustrate).
187
+ - Trigger: on first viewport entry via IntersectionObserver, threshold 0.3.
188
+ - Never re-trigger: once counted, never reset on scroll back.
189
+ - Format output to match final value (commas, currency symbol, % sign, etc.).
190
+
191
+ ---
192
+
193
+ ## Stagger Sequences
194
+
195
+ For card grids and feature lists entering together:
196
+
197
+ ```css
198
+ .stagger-group > * {
199
+ animation: editorial-fade-up 500ms var(--ease-decel) both;
200
+ }
201
+
202
+ .stagger-group > *:nth-child(1) { animation-delay: 0ms; }
203
+ .stagger-group > *:nth-child(2) { animation-delay: 80ms; }
204
+ .stagger-group > *:nth-child(3) { animation-delay: 160ms; }
205
+ .stagger-group > *:nth-child(4) { animation-delay: 240ms; }
206
+ .stagger-group > *:nth-child(5) { animation-delay: 320ms; }
207
+ .stagger-group > *:nth-child(6) { animation-delay: 400ms; }
208
+ ```
209
+
210
+ Rules:
211
+ - Stagger delay: 80ms per item (slower than clean-saas, more deliberate — feels authored).
212
+ - Max 6 items staggered. After 6, start together.
213
+ - Only stagger on first load or scroll entry. Never on re-render.
214
+
215
+ ---
216
+
217
+ ## Micro-Interactions
218
+
219
+ ### Button Press
220
+ ```css
221
+ button:active {
222
+ transform: scale(0.98);
223
+ transition: transform 80ms ease;
224
+ }
225
+ ```
226
+
227
+ ### Card Hover
228
+ ```css
229
+ .card-interactive {
230
+ transition: transform var(--transition-slow),
231
+ box-shadow var(--transition-slow);
232
+ }
233
+
234
+ .card-interactive:hover {
235
+ transform: translateY(-4px);
236
+ box-shadow: var(--shadow-md);
237
+ }
238
+ ```
239
+
240
+ Note: -4px lift (larger than warm-craft's -2px) — more dramatic hover.
241
+
242
+ ### Media Card Image Zoom
243
+ ```css
244
+ .card-media {
245
+ overflow: hidden;
246
+ }
247
+
248
+ .card-media__image {
249
+ transition: transform var(--transition-slow);
250
+ }
251
+
252
+ .card-media:hover .card-media__image {
253
+ transform: scale(1.03);
254
+ }
255
+ ```
256
+
257
+ ### Input Focus
258
+ ```css
259
+ .input {
260
+ transition: border-color var(--transition-fast),
261
+ box-shadow var(--transition-fast);
262
+ }
263
+
264
+ .input:focus {
265
+ border-color: var(--accent);
266
+ box-shadow: 0 0 0 3px var(--accent-dim);
267
+ }
268
+ ```
269
+
270
+ ### Underline Link Animation
271
+ ```css
272
+ .link-editorial {
273
+ position: relative;
274
+ text-decoration: none;
275
+ color: var(--text-heading);
276
+ }
277
+
278
+ .link-editorial::after {
279
+ content: '';
280
+ position: absolute;
281
+ bottom: -2px;
282
+ left: 0;
283
+ width: 0;
284
+ height: 1px;
285
+ background: var(--accent);
286
+ transition: width var(--transition-base) var(--ease-decel);
287
+ }
288
+
289
+ .link-editorial:hover::after {
290
+ width: 100%;
291
+ }
292
+ ```
293
+
294
+ ---
295
+
296
+ ## Scroll Animations (websites only)
297
+
298
+ Use for landing pages and marketing sections. **Never for app pages.**
299
+
300
+ ### Section Reveal
301
+ ```css
302
+ .scroll-reveal {
303
+ opacity: 0;
304
+ transform: translateY(32px); /* larger offset than warm-craft — more cinematic */
305
+ transition: opacity 600ms var(--ease-decel),
306
+ transform 600ms var(--ease-decel);
307
+ }
308
+
309
+ .scroll-reveal.visible {
310
+ opacity: 1;
311
+ transform: translateY(0);
312
+ }
313
+ ```
314
+
315
+ ```javascript
316
+ const observer = new IntersectionObserver((entries) => {
317
+ entries.forEach(entry => {
318
+ if (entry.isIntersecting) {
319
+ entry.target.classList.add('visible');
320
+ observer.unobserve(entry.target); // trigger once
321
+ }
322
+ });
323
+ }, { threshold: 0.10 }); /* 10% — earlier trigger than warm-craft's 15% */
324
+
325
+ document.querySelectorAll('.scroll-reveal').forEach(el => observer.observe(el));
326
+ ```
327
+
328
+ ### Image Reveal (clip-path wipe)
329
+ ```css
330
+ .image-reveal {
331
+ clip-path: inset(0 0 100% 0);
332
+ transition: clip-path 800ms var(--ease-decel);
333
+ }
334
+
335
+ .image-reveal.visible {
336
+ clip-path: inset(0 0 0% 0);
337
+ }
338
+ ```
339
+
340
+ Use for: case study images, hero product shots, portfolio images. The image slides in from the bottom — cinematic.
341
+
342
+ ### Parallax Depth
343
+ ```javascript
344
+ // Apply subtle parallax to background elements (decorative only — product frames, oversized typographic masks)
345
+ window.addEventListener('scroll', () => {
346
+ const scrolled = window.scrollY;
347
+ document.querySelectorAll('[data-parallax]').forEach(el => {
348
+ const speed = parseFloat(el.dataset.parallax) || 0.3;
349
+ el.style.transform = `translateY(${scrolled * speed}px)`;
350
+ });
351
+ });
352
+ ```
353
+
354
+ Rules:
355
+ - Max parallax multiplier: 0.3 (subtle — not a parallax circus).
356
+ - Apply only to decorative elements (backgrounds, product frames). Never to readable text.
357
+ - Disable below 768px for performance.
358
+
359
+ ---
360
+
361
+ ## Page Transitions
362
+
363
+ ### Content Area Change (tab switch, route change)
364
+ ```css
365
+ .page-content-enter {
366
+ animation: editorial-fade-up 350ms var(--ease-decel) both;
367
+ }
368
+
369
+ .page-content-exit {
370
+ animation: editorial-fade-in 150ms var(--ease-exit) reverse both;
371
+ }
372
+ ```
373
+
374
+ Rule: exit is faster (150ms) than enter (350ms). Content leaves quickly, arrives with intention.
375
+
376
+ ### Modal Enter/Exit
377
+ ```css
378
+ /* Backdrop */
379
+ .modal-backdrop-enter {
380
+ animation: editorial-fade-in 200ms ease both;
381
+ }
382
+
383
+ /* Modal content */
384
+ .modal-enter {
385
+ animation: editorial-scale-in 300ms var(--ease-decel) both;
386
+ animation-delay: 50ms;
387
+ }
388
+
389
+ .modal-exit {
390
+ animation: editorial-scale-in 180ms var(--ease-exit) reverse both;
391
+ }
392
+ ```
393
+
394
+ ### Drawer Enter/Exit
395
+ ```css
396
+ .drawer-enter {
397
+ animation: editorial-slide-right 350ms var(--ease-decel) both;
398
+ }
399
+
400
+ .drawer-exit {
401
+ animation: editorial-slide-right 200ms var(--ease-exit) reverse both;
402
+ }
403
+ ```
404
+
405
+ ---
406
+
407
+ ## Loading States
408
+
409
+ ### Skeleton Pulse
410
+ ```css
411
+ @keyframes editorial-pulse {
412
+ 0%, 100% { opacity: 1; }
413
+ 50% { opacity: 0.4; }
414
+ }
415
+
416
+ .skeleton {
417
+ background: var(--bg-elevated);
418
+ border-radius: var(--radius-md);
419
+ animation: editorial-pulse 2s ease-in-out infinite;
420
+ }
421
+ ```
422
+
423
+ ### Spinner
424
+ ```css
425
+ @keyframes editorial-spin {
426
+ to { transform: rotate(360deg); }
427
+ }
428
+
429
+ .spinner {
430
+ width: 20px;
431
+ height: 20px;
432
+ border: 2px solid var(--border-medium);
433
+ border-top-color: var(--accent);
434
+ border-radius: var(--radius-full);
435
+ animation: editorial-spin 700ms linear infinite;
436
+ }
437
+ ```
438
+
439
+ ### Progress Bar Fill
440
+ ```css
441
+ .progress-fill {
442
+ transition: width 500ms var(--ease-decel);
443
+ }
444
+ ```
445
+
446
+ ---
447
+
448
+ ## Reduced Motion
449
+
450
+ ```css
451
+ @media (prefers-reduced-motion: reduce) {
452
+ *, *::before, *::after {
453
+ animation-duration: 0.01ms !important;
454
+ animation-iteration-count: 1 !important;
455
+ transition-duration: 0.01ms !important;
456
+ scroll-behavior: auto !important;
457
+ }
458
+ }
459
+ ```
460
+
461
+ Non-negotiable. Always include this in the global stylesheet. Scroll animations, counter rolls, word reveals, and parallax are all disabled. Static state must be correct without animation.