@jaimevalasek/aioson 1.4.0 → 1.5.1

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 (199) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/LICENSE +661 -21
  3. package/README.md +3 -1
  4. package/docs/en/squad-dashboard.md +372 -0
  5. package/docs/openclaw-bridge.md +308 -0
  6. package/docs/pt/agentes.md +124 -10
  7. package/docs/pt/cenarios.md +46 -2
  8. package/docs/pt/comandos-cli.md +60 -1
  9. package/docs/pt/inicio-rapido.md +18 -2
  10. package/docs/pt/squad-dashboard.md +373 -0
  11. package/docs/testing/genome-2.0-matrix.md +5 -5
  12. package/docs/testing/genome-2.0-rollout.md +9 -9
  13. package/package.json +2 -2
  14. package/src/backup-local.js +74 -0
  15. package/src/cli.js +98 -0
  16. package/src/commands/backup-local-cmd.js +25 -0
  17. package/src/commands/runtime.js +242 -0
  18. package/src/commands/setup-context.js +7 -2
  19. package/src/commands/squad-daemon.js +209 -0
  20. package/src/commands/squad-dashboard.js +39 -0
  21. package/src/commands/squad-deploy.js +64 -0
  22. package/src/commands/squad-doctor.js +52 -0
  23. package/src/commands/squad-mcp.js +270 -0
  24. package/src/commands/squad-processes.js +56 -0
  25. package/src/commands/squad-recovery.js +42 -0
  26. package/src/commands/squad-roi.js +291 -0
  27. package/src/commands/squad-score.js +250 -0
  28. package/src/commands/squad-status.js +37 -1
  29. package/src/commands/squad-validate.js +62 -1
  30. package/src/commands/squad-webhook.js +160 -0
  31. package/src/commands/squad-worker.js +191 -0
  32. package/src/commands/squad-worktrees.js +75 -0
  33. package/src/commands/web-map.js +70 -0
  34. package/src/commands/web-scrape.js +71 -0
  35. package/src/constants.js +8 -0
  36. package/src/context-writer.js +45 -1
  37. package/src/i18n/messages/en.js +127 -1
  38. package/src/i18n/messages/es.js +117 -0
  39. package/src/i18n/messages/fr.js +117 -0
  40. package/src/i18n/messages/pt-BR.js +126 -1
  41. package/src/lib/webhook-server.js +328 -0
  42. package/src/mcp-connectors/registry.js +602 -0
  43. package/src/runtime-store.js +259 -2
  44. package/src/squad/external-session.js +180 -0
  45. package/src/squad/inter-squad.js +74 -0
  46. package/src/squad/recovery-context.js +201 -0
  47. package/src/squad/worktree-manager.js +114 -0
  48. package/src/squad-daemon.js +490 -0
  49. package/src/squad-dashboard/api.js +223 -0
  50. package/src/squad-dashboard/attachment-handler.js +93 -0
  51. package/src/squad-dashboard/context-monitor.js +157 -0
  52. package/src/squad-dashboard/execution-logs.js +115 -0
  53. package/src/squad-dashboard/hunk-review.js +209 -0
  54. package/src/squad-dashboard/metrics.js +133 -0
  55. package/src/squad-dashboard/process-monitor.js +125 -0
  56. package/src/squad-dashboard/renderer.js +858 -0
  57. package/src/squad-dashboard/server.js +232 -0
  58. package/src/squad-dashboard/styles.js +525 -0
  59. package/src/squad-dashboard/token-tracker.js +99 -0
  60. package/src/web.js +284 -0
  61. package/src/worker-runner.js +339 -0
  62. package/template/.aioson/agents/analyst.md +4 -0
  63. package/template/.aioson/agents/architect.md +4 -0
  64. package/template/.aioson/agents/dev.md +120 -11
  65. package/template/.aioson/agents/deyvin.md +8 -0
  66. package/template/.aioson/agents/neo.md +152 -0
  67. package/template/.aioson/agents/orache.md +17 -0
  68. package/template/.aioson/agents/orchestrator.md +26 -0
  69. package/template/.aioson/agents/product.md +60 -12
  70. package/template/.aioson/agents/qa.md +1 -0
  71. package/template/.aioson/agents/setup.md +63 -19
  72. package/template/.aioson/agents/sheldon.md +603 -0
  73. package/template/.aioson/agents/squad.md +191 -0
  74. package/template/.aioson/agents/tester.md +254 -0
  75. package/template/.aioson/agents/ux-ui.md +12 -0
  76. package/template/.aioson/config.md +6 -0
  77. package/template/.aioson/locales/en/agents/analyst.md +8 -0
  78. package/template/.aioson/locales/en/agents/architect.md +8 -0
  79. package/template/.aioson/locales/en/agents/dev.md +66 -7
  80. package/template/.aioson/locales/en/agents/deyvin.md +8 -0
  81. package/template/.aioson/locales/en/agents/neo.md +8 -0
  82. package/template/.aioson/locales/en/agents/orchestrator.md +26 -0
  83. package/template/.aioson/locales/en/agents/qa.md +49 -0
  84. package/template/.aioson/locales/en/agents/setup.md +2 -1
  85. package/template/.aioson/locales/en/agents/sheldon.md +340 -0
  86. package/template/.aioson/locales/en/agents/ux-ui.md +8 -0
  87. package/template/.aioson/locales/es/agents/analyst.md +8 -0
  88. package/template/.aioson/locales/es/agents/architect.md +8 -0
  89. package/template/.aioson/locales/es/agents/dev.md +66 -7
  90. package/template/.aioson/locales/es/agents/deyvin.md +8 -0
  91. package/template/.aioson/locales/es/agents/neo.md +48 -0
  92. package/template/.aioson/locales/es/agents/orchestrator.md +26 -0
  93. package/template/.aioson/locales/es/agents/qa.md +26 -0
  94. package/template/.aioson/locales/es/agents/setup.md +2 -1
  95. package/template/.aioson/locales/es/agents/sheldon.md +192 -0
  96. package/template/.aioson/locales/es/agents/squad.md +63 -0
  97. package/template/.aioson/locales/es/agents/ux-ui.md +8 -0
  98. package/template/.aioson/locales/fr/agents/analyst.md +8 -0
  99. package/template/.aioson/locales/fr/agents/architect.md +8 -0
  100. package/template/.aioson/locales/fr/agents/dev.md +66 -7
  101. package/template/.aioson/locales/fr/agents/deyvin.md +8 -0
  102. package/template/.aioson/locales/fr/agents/neo.md +48 -0
  103. package/template/.aioson/locales/fr/agents/orchestrator.md +26 -0
  104. package/template/.aioson/locales/fr/agents/qa.md +26 -0
  105. package/template/.aioson/locales/fr/agents/setup.md +2 -1
  106. package/template/.aioson/locales/fr/agents/sheldon.md +192 -0
  107. package/template/.aioson/locales/fr/agents/squad.md +63 -0
  108. package/template/.aioson/locales/fr/agents/ux-ui.md +8 -0
  109. package/template/.aioson/locales/pt-BR/agents/analyst.md +19 -0
  110. package/template/.aioson/locales/pt-BR/agents/architect.md +19 -0
  111. package/template/.aioson/locales/pt-BR/agents/dev.md +75 -12
  112. package/template/.aioson/locales/pt-BR/agents/deyvin.md +8 -0
  113. package/template/.aioson/locales/pt-BR/agents/neo.md +147 -0
  114. package/template/.aioson/locales/pt-BR/agents/orchestrator.md +26 -0
  115. package/template/.aioson/locales/pt-BR/agents/product.md +8 -3
  116. package/template/.aioson/locales/pt-BR/agents/qa.md +60 -0
  117. package/template/.aioson/locales/pt-BR/agents/setup.md +2 -1
  118. package/template/.aioson/locales/pt-BR/agents/sheldon.md +192 -0
  119. package/template/.aioson/locales/pt-BR/agents/squad.md +105 -0
  120. package/template/.aioson/locales/pt-BR/agents/ux-ui.md +8 -0
  121. package/template/.aioson/schemas/squad-blueprint.schema.json +21 -0
  122. package/template/.aioson/schemas/squad-manifest.schema.json +178 -1
  123. package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +205 -0
  124. package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -0
  125. package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -0
  126. package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -0
  127. package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -0
  128. package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -0
  129. package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -0
  130. package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -0
  131. package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +210 -0
  132. package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -0
  133. package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -0
  134. package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -0
  135. package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -0
  136. package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -0
  137. package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -0
  138. package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -0
  139. package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +55 -9
  140. package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -0
  141. package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +1 -1
  142. package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +100 -0
  143. package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +43 -9
  144. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +40 -0
  145. package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +1 -1
  146. package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +99 -12
  147. package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +209 -0
  148. package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -0
  149. package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -0
  150. package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -0
  151. package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -0
  152. package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -0
  153. package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -0
  154. package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -0
  155. package/template/.aioson/skills/premium-visual-design/SKILL.md +83 -0
  156. package/template/.aioson/skills/premium-visual-design/components/agent-badge.md +92 -0
  157. package/template/.aioson/skills/premium-visual-design/components/dependency-node.md +102 -0
  158. package/template/.aioson/skills/premium-visual-design/components/mention-autocomplete.md +136 -0
  159. package/template/.aioson/skills/premium-visual-design/components/notification-center.md +136 -0
  160. package/template/.aioson/skills/premium-visual-design/components/review-action-bar.md +188 -0
  161. package/template/.aioson/skills/premium-visual-design/components/team-switcher.md +131 -0
  162. package/template/.aioson/skills/premium-visual-design/patterns/agent-message-thread.md +198 -0
  163. package/template/.aioson/skills/premium-visual-design/patterns/notification-panel.md +275 -0
  164. package/template/.aioson/skills/premium-visual-design/patterns/review-workflow-ui.md +234 -0
  165. package/template/.aioson/skills/premium-visual-design/patterns/task-dependency-graph.md +147 -0
  166. package/template/.aioson/skills/premium-visual-design/tokens/status-extended.md +142 -0
  167. package/template/.aioson/skills/squad/formats/catalog.json +15 -0
  168. package/template/.aioson/skills/squad/formats/content/blog-post.md +47 -0
  169. package/template/.aioson/skills/squad/formats/content/newsletter.md +47 -0
  170. package/template/.aioson/skills/squad/formats/creative/podcast-script.md +43 -0
  171. package/template/.aioson/skills/squad/formats/creative/video-script.md +41 -0
  172. package/template/.aioson/skills/squad/formats/social/instagram-feed.md +42 -0
  173. package/template/.aioson/skills/squad/formats/social/linkedin-post.md +42 -0
  174. package/template/.aioson/skills/squad/formats/social/tiktok.md +39 -0
  175. package/template/.aioson/skills/squad/formats/social/twitter-thread.md +39 -0
  176. package/template/.aioson/skills/squad/formats/social/youtube-long.md +47 -0
  177. package/template/.aioson/skills/squad/formats/social/youtube-shorts.md +39 -0
  178. package/template/.aioson/skills/squad/patterns/multi-platform-pattern.md +108 -0
  179. package/template/.aioson/skills/squad/patterns/persona-based-pattern.md +98 -0
  180. package/template/.aioson/skills/squad/patterns/pipeline-pattern.md +106 -0
  181. package/template/.aioson/skills/squad/patterns/review-loop-pattern.md +81 -0
  182. package/template/.aioson/skills/squad/references/checklist-templates.md +122 -0
  183. package/template/.aioson/skills/squad/references/executor-archetypes.md +123 -0
  184. package/template/.aioson/skills/squad/references/workflow-templates.md +169 -0
  185. package/template/.aioson/skills/static/debugging-protocol.md +42 -0
  186. package/template/.aioson/skills/static/git-worktrees.md +36 -0
  187. package/template/.aioson/tasks/implementation-plan.md +19 -0
  188. package/template/.aioson/tasks/squad-design.md +28 -0
  189. package/template/.aioson/tasks/squad-profile.md +48 -0
  190. package/template/.aioson/tasks/squad-review.md +61 -0
  191. package/template/.aioson/tasks/squad-task-decompose.md +66 -0
  192. package/template/.claude/commands/aioson/agent/neo.md +5 -0
  193. package/template/.claude/commands/aioson/agent/tester.md +5 -0
  194. package/template/.gemini/GEMINI.md +1 -0
  195. package/template/.gemini/commands/aios-neo.toml +4 -0
  196. package/template/.gemini/commands/aios-tester.toml +6 -0
  197. package/template/AGENTS.md +3 -0
  198. package/template/CLAUDE.md +5 -2
  199. package/template/OPENCODE.md +2 -0
@@ -0,0 +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.