@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.
- package/CHANGELOG.md +31 -1
- package/LICENSE +661 -21
- package/README.md +3 -1
- package/docs/en/squad-dashboard.md +372 -0
- package/docs/openclaw-bridge.md +308 -0
- package/docs/pt/agentes.md +124 -10
- package/docs/pt/cenarios.md +46 -2
- package/docs/pt/comandos-cli.md +60 -1
- package/docs/pt/inicio-rapido.md +18 -2
- package/docs/pt/squad-dashboard.md +373 -0
- package/docs/testing/genome-2.0-matrix.md +5 -5
- package/docs/testing/genome-2.0-rollout.md +9 -9
- package/package.json +2 -2
- package/src/backup-local.js +74 -0
- package/src/cli.js +98 -0
- package/src/commands/backup-local-cmd.js +25 -0
- package/src/commands/runtime.js +242 -0
- package/src/commands/setup-context.js +7 -2
- package/src/commands/squad-daemon.js +209 -0
- package/src/commands/squad-dashboard.js +39 -0
- package/src/commands/squad-deploy.js +64 -0
- package/src/commands/squad-doctor.js +52 -0
- package/src/commands/squad-mcp.js +270 -0
- package/src/commands/squad-processes.js +56 -0
- package/src/commands/squad-recovery.js +42 -0
- package/src/commands/squad-roi.js +291 -0
- package/src/commands/squad-score.js +250 -0
- package/src/commands/squad-status.js +37 -1
- package/src/commands/squad-validate.js +62 -1
- package/src/commands/squad-webhook.js +160 -0
- package/src/commands/squad-worker.js +191 -0
- package/src/commands/squad-worktrees.js +75 -0
- package/src/commands/web-map.js +70 -0
- package/src/commands/web-scrape.js +71 -0
- package/src/constants.js +8 -0
- package/src/context-writer.js +45 -1
- package/src/i18n/messages/en.js +127 -1
- package/src/i18n/messages/es.js +117 -0
- package/src/i18n/messages/fr.js +117 -0
- package/src/i18n/messages/pt-BR.js +126 -1
- package/src/lib/webhook-server.js +328 -0
- package/src/mcp-connectors/registry.js +602 -0
- package/src/runtime-store.js +259 -2
- package/src/squad/external-session.js +180 -0
- package/src/squad/inter-squad.js +74 -0
- package/src/squad/recovery-context.js +201 -0
- package/src/squad/worktree-manager.js +114 -0
- package/src/squad-daemon.js +490 -0
- package/src/squad-dashboard/api.js +223 -0
- package/src/squad-dashboard/attachment-handler.js +93 -0
- package/src/squad-dashboard/context-monitor.js +157 -0
- package/src/squad-dashboard/execution-logs.js +115 -0
- package/src/squad-dashboard/hunk-review.js +209 -0
- package/src/squad-dashboard/metrics.js +133 -0
- package/src/squad-dashboard/process-monitor.js +125 -0
- package/src/squad-dashboard/renderer.js +858 -0
- package/src/squad-dashboard/server.js +232 -0
- package/src/squad-dashboard/styles.js +525 -0
- package/src/squad-dashboard/token-tracker.js +99 -0
- package/src/web.js +284 -0
- package/src/worker-runner.js +339 -0
- package/template/.aioson/agents/analyst.md +4 -0
- package/template/.aioson/agents/architect.md +4 -0
- package/template/.aioson/agents/dev.md +120 -11
- package/template/.aioson/agents/deyvin.md +8 -0
- package/template/.aioson/agents/neo.md +152 -0
- package/template/.aioson/agents/orache.md +17 -0
- package/template/.aioson/agents/orchestrator.md +26 -0
- package/template/.aioson/agents/product.md +60 -12
- package/template/.aioson/agents/qa.md +1 -0
- package/template/.aioson/agents/setup.md +63 -19
- package/template/.aioson/agents/sheldon.md +603 -0
- package/template/.aioson/agents/squad.md +191 -0
- package/template/.aioson/agents/tester.md +254 -0
- package/template/.aioson/agents/ux-ui.md +12 -0
- package/template/.aioson/config.md +6 -0
- package/template/.aioson/locales/en/agents/analyst.md +8 -0
- package/template/.aioson/locales/en/agents/architect.md +8 -0
- package/template/.aioson/locales/en/agents/dev.md +66 -7
- package/template/.aioson/locales/en/agents/deyvin.md +8 -0
- package/template/.aioson/locales/en/agents/neo.md +8 -0
- package/template/.aioson/locales/en/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/en/agents/qa.md +49 -0
- package/template/.aioson/locales/en/agents/setup.md +2 -1
- package/template/.aioson/locales/en/agents/sheldon.md +340 -0
- package/template/.aioson/locales/en/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/es/agents/analyst.md +8 -0
- package/template/.aioson/locales/es/agents/architect.md +8 -0
- package/template/.aioson/locales/es/agents/dev.md +66 -7
- package/template/.aioson/locales/es/agents/deyvin.md +8 -0
- package/template/.aioson/locales/es/agents/neo.md +48 -0
- package/template/.aioson/locales/es/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/es/agents/qa.md +26 -0
- package/template/.aioson/locales/es/agents/setup.md +2 -1
- package/template/.aioson/locales/es/agents/sheldon.md +192 -0
- package/template/.aioson/locales/es/agents/squad.md +63 -0
- package/template/.aioson/locales/es/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/fr/agents/analyst.md +8 -0
- package/template/.aioson/locales/fr/agents/architect.md +8 -0
- package/template/.aioson/locales/fr/agents/dev.md +66 -7
- package/template/.aioson/locales/fr/agents/deyvin.md +8 -0
- package/template/.aioson/locales/fr/agents/neo.md +48 -0
- package/template/.aioson/locales/fr/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/fr/agents/qa.md +26 -0
- package/template/.aioson/locales/fr/agents/setup.md +2 -1
- package/template/.aioson/locales/fr/agents/sheldon.md +192 -0
- package/template/.aioson/locales/fr/agents/squad.md +63 -0
- package/template/.aioson/locales/fr/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/pt-BR/agents/analyst.md +19 -0
- package/template/.aioson/locales/pt-BR/agents/architect.md +19 -0
- package/template/.aioson/locales/pt-BR/agents/dev.md +75 -12
- package/template/.aioson/locales/pt-BR/agents/deyvin.md +8 -0
- package/template/.aioson/locales/pt-BR/agents/neo.md +147 -0
- package/template/.aioson/locales/pt-BR/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/pt-BR/agents/product.md +8 -3
- package/template/.aioson/locales/pt-BR/agents/qa.md +60 -0
- package/template/.aioson/locales/pt-BR/agents/setup.md +2 -1
- package/template/.aioson/locales/pt-BR/agents/sheldon.md +192 -0
- package/template/.aioson/locales/pt-BR/agents/squad.md +105 -0
- package/template/.aioson/locales/pt-BR/agents/ux-ui.md +8 -0
- package/template/.aioson/schemas/squad-blueprint.schema.json +21 -0
- package/template/.aioson/schemas/squad-manifest.schema.json +178 -1
- package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +205 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -0
- package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +210 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -0
- package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +55 -9
- package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +1 -1
- package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +100 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +43 -9
- package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +40 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +1 -1
- package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +99 -12
- package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +209 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -0
- package/template/.aioson/skills/premium-visual-design/SKILL.md +83 -0
- package/template/.aioson/skills/premium-visual-design/components/agent-badge.md +92 -0
- package/template/.aioson/skills/premium-visual-design/components/dependency-node.md +102 -0
- package/template/.aioson/skills/premium-visual-design/components/mention-autocomplete.md +136 -0
- package/template/.aioson/skills/premium-visual-design/components/notification-center.md +136 -0
- package/template/.aioson/skills/premium-visual-design/components/review-action-bar.md +188 -0
- package/template/.aioson/skills/premium-visual-design/components/team-switcher.md +131 -0
- package/template/.aioson/skills/premium-visual-design/patterns/agent-message-thread.md +198 -0
- package/template/.aioson/skills/premium-visual-design/patterns/notification-panel.md +275 -0
- package/template/.aioson/skills/premium-visual-design/patterns/review-workflow-ui.md +234 -0
- package/template/.aioson/skills/premium-visual-design/patterns/task-dependency-graph.md +147 -0
- package/template/.aioson/skills/premium-visual-design/tokens/status-extended.md +142 -0
- package/template/.aioson/skills/squad/formats/catalog.json +15 -0
- package/template/.aioson/skills/squad/formats/content/blog-post.md +47 -0
- package/template/.aioson/skills/squad/formats/content/newsletter.md +47 -0
- package/template/.aioson/skills/squad/formats/creative/podcast-script.md +43 -0
- package/template/.aioson/skills/squad/formats/creative/video-script.md +41 -0
- package/template/.aioson/skills/squad/formats/social/instagram-feed.md +42 -0
- package/template/.aioson/skills/squad/formats/social/linkedin-post.md +42 -0
- package/template/.aioson/skills/squad/formats/social/tiktok.md +39 -0
- package/template/.aioson/skills/squad/formats/social/twitter-thread.md +39 -0
- package/template/.aioson/skills/squad/formats/social/youtube-long.md +47 -0
- package/template/.aioson/skills/squad/formats/social/youtube-shorts.md +39 -0
- package/template/.aioson/skills/squad/patterns/multi-platform-pattern.md +108 -0
- package/template/.aioson/skills/squad/patterns/persona-based-pattern.md +98 -0
- package/template/.aioson/skills/squad/patterns/pipeline-pattern.md +106 -0
- package/template/.aioson/skills/squad/patterns/review-loop-pattern.md +81 -0
- package/template/.aioson/skills/squad/references/checklist-templates.md +122 -0
- package/template/.aioson/skills/squad/references/executor-archetypes.md +123 -0
- package/template/.aioson/skills/squad/references/workflow-templates.md +169 -0
- package/template/.aioson/skills/static/debugging-protocol.md +42 -0
- package/template/.aioson/skills/static/git-worktrees.md +36 -0
- package/template/.aioson/tasks/implementation-plan.md +19 -0
- package/template/.aioson/tasks/squad-design.md +28 -0
- package/template/.aioson/tasks/squad-profile.md +48 -0
- package/template/.aioson/tasks/squad-review.md +61 -0
- package/template/.aioson/tasks/squad-task-decompose.md +66 -0
- package/template/.claude/commands/aioson/agent/neo.md +5 -0
- package/template/.claude/commands/aioson/agent/tester.md +5 -0
- package/template/.gemini/GEMINI.md +1 -0
- package/template/.gemini/commands/aios-neo.toml +4 -0
- package/template/.gemini/commands/aios-tester.toml +6 -0
- package/template/AGENTS.md +3 -0
- package/template/CLAUDE.md +5 -2
- 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.
|