@jaimevalasek/aioson 1.30.1 → 1.33.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 (136) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +19 -6
  3. package/docs/design-previews/cognitive-core-ui-auth.html +95 -0
  4. package/docs/design-previews/cognitive-core-ui-kanban.html +231 -0
  5. package/docs/design-previews/cognitive-core-ui-list-detail.html +174 -0
  6. package/docs/design-previews/cognitive-core-ui-preview.css +1315 -0
  7. package/docs/design-previews/cognitive-core-ui-settings.html +142 -0
  8. package/docs/design-previews/cognitive-core-ui-website.html +190 -1009
  9. package/docs/design-previews/cognitive-core-ui.html +281 -463
  10. package/docs/design-previews/index.html +83 -31
  11. package/docs/en/5-reference/cli-reference.md +1 -1
  12. package/docs/pt/5-referencia/comandos-cli.md +1 -1
  13. package/docs/pt/5-referencia/harness-retro.md +2 -1
  14. package/package.json +1 -1
  15. package/src/cli.js +38 -21
  16. package/src/commands/classify.js +389 -327
  17. package/src/commands/harness-retro-promote.js +387 -0
  18. package/src/commands/prototype-check.js +163 -0
  19. package/src/commands/verify-implementation.js +428 -0
  20. package/src/commands/workflow-next.js +222 -9
  21. package/src/constants.js +569 -511
  22. package/src/lib/retro/retro-render.js +10 -1
  23. package/src/lib/retro/retro-sources.js +45 -27
  24. package/src/lib/retro/verification-reports.js +230 -0
  25. package/src/runtime-store.js +13 -9
  26. package/src/verification/evidence-bundle.js +251 -0
  27. package/src/verification/ledger-store.js +221 -0
  28. package/src/verification/path-policy.js +74 -0
  29. package/src/verification/policy-engine.js +95 -0
  30. package/src/verification/prompt-package.js +314 -0
  31. package/src/verification/redaction.js +77 -0
  32. package/src/verification/report-parser.js +132 -0
  33. package/src/verification/report-store.js +97 -0
  34. package/src/verification/result.js +16 -0
  35. package/src/verification/runners/index.js +319 -0
  36. package/src/verification/runtime-telemetry.js +144 -0
  37. package/src/verification/schema.js +276 -0
  38. package/src/verification/source-discovery.js +153 -0
  39. package/template/.aioson/agents/analyst.md +9 -6
  40. package/template/.aioson/agents/briefing-refiner.md +22 -0
  41. package/template/.aioson/agents/briefing.md +69 -12
  42. package/template/.aioson/agents/design-hybrid-forge.md +18 -14
  43. package/template/.aioson/agents/dev.md +23 -10
  44. package/template/.aioson/agents/deyvin.md +3 -2
  45. package/template/.aioson/agents/product.md +15 -11
  46. package/template/.aioson/agents/qa.md +13 -4
  47. package/template/.aioson/agents/scope-check.md +19 -5
  48. package/template/.aioson/agents/sheldon.md +4 -3
  49. package/template/.aioson/agents/ux-ui.md +3 -2
  50. package/template/.aioson/docs/feature-expansion-taxonomy.md +31 -3
  51. package/template/.aioson/docs/play/README.md +2 -0
  52. package/template/.aioson/docs/play/agent-usage-guide.md +7 -1
  53. package/template/.aioson/docs/play/app-compatibility-guide.md +6 -1
  54. package/template/.aioson/docs/play/auth-services-and-testing.md +16 -1
  55. package/template/.aioson/docs/play/manifest-and-runtime.md +23 -0
  56. package/template/.aioson/docs/prototype-contract.md +81 -0
  57. package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
  58. package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
  59. package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
  60. package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
  61. package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
  62. package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
  63. package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
  64. package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
  65. package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
  66. package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
  67. package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
  68. package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
  69. package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
  70. package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
  71. package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
  72. package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
  73. package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
  74. package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
  75. package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
  76. package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
  77. package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
  78. package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
  79. package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
  80. package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
  81. package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
  82. package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
  83. package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
  84. package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
  85. package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
  86. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
  87. package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
  88. package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
  89. package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
  90. package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
  91. package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
  92. package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
  93. package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
  94. package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
  95. package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
  96. package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
  97. package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
  98. package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
  99. package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
  100. package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
  101. package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
  102. package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
  103. package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
  104. package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
  105. package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
  106. package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
  107. package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
  108. package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
  109. package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
  110. package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
  111. package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
  112. package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
  113. package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
  114. package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
  115. package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
  116. package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
  117. package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
  118. package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
  119. package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
  120. package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
  121. package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
  122. package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
  123. package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
  124. package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
  125. package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
  126. package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
  127. package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
  128. package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
  129. package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
  130. package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -289
  131. package/template/.aioson/skills/process/briefing-expansion-scout/SKILL.md +25 -3
  132. package/template/.aioson/skills/process/design-hybrid-forge/SKILL.md +5 -3
  133. package/template/.aioson/skills/process/design-hybrid-forge/references/external-source-ingestion.md +89 -0
  134. package/template/.aioson/skills/process/product-scope-expansion/SKILL.md +29 -2
  135. package/template/.aioson/skills/process/prototype-forge/SKILL.md +92 -0
  136. package/template/.aioson/skills/process/sheldon-expansion-audit/SKILL.md +23 -2
@@ -1,270 +1,270 @@
1
- # Motion — pt.squarespace.com
2
-
3
- ## Motion Philosophy
4
-
5
- CSS-first, no third-party animation libraries. All animations implemented via `@keyframes` + class toggling + `IntersectionObserver`. Fast micro-interactions (300–500ms), slow scroll reveals (800–1200ms). Easing is smooth deceleration (`cubic-bezier(0.23, 1, 0.32, 1)`) for reveals and power (`cubic-bezier(0.645, 0.045, 0.355, 1)`) for CTA interactions.
6
-
7
- **No GSAP. No Framer Motion. No AOS. No Lottie.** Pure CSS + vanilla JS.
8
-
9
- ---
10
-
11
- ## Timing Functions
12
-
13
- | Token | Value | Usage |
14
- |-------|-------|-------|
15
- | `--ease-default` | `cubic-bezier(0.455, 0.03, 0.515, 0.955)` | General transitions |
16
- | `--ease-sqsp-reveal` | `cubic-bezier(0.23, 1, 0.32, 1)` | Scroll reveals, stats (the Squarespace signature ease) |
17
- | `--ease-sqsp-cta` | `cubic-bezier(0.645, 0.045, 0.355, 1)` | CTA hover, mobile menu, dropdowns |
18
- | `--ease-sqsp-menu` | `cubic-bezier(0.165, 0.84, 0.44, 1)` | Mobile menu swipe, accordion |
19
- | `--ease-out` | `ease-out` | Exit animations |
20
-
21
- ## Durations
22
-
23
- | Token | Value | Usage |
24
- |-------|-------|-------|
25
- | `--transition-fast` | `100ms` | Micro color changes |
26
- | `--transition-base` | `200ms` | Standard hover |
27
- | `--transition-medium` | `300ms` | Nav dropdowns, CTA hover overlay |
28
- | `--transition-slow` | `400ms` | Layout transitions |
29
- | `--transition-reveal` | `800ms` | Scroll-triggered section reveals |
30
- | `--transition-reveal-slow` | `1200ms` | Stats card reveal |
31
-
32
- ---
33
-
34
- ## Extracted @keyframes (verbatim from pt.squarespace.com/css/index.css)
35
-
36
- ### fadeIn
37
- ```css
38
- @keyframes fadeIn {
39
- 0% { opacity: 0; }
40
- to { opacity: 1; }
41
- }
42
- ```
43
- **Used on:** `.stats__card` — `1.2s cubic-bezier(0.23, 1, 0.32, 1) forwards`
44
-
45
- ---
46
-
47
- ### ctaUnderlineSlideIn / ctaUnderlineSlideOut
48
- ```css
49
- @keyframes ctaUnderlineSlideIn {
50
- 0% { background-position: -200% 100%, -100% 100%; }
51
- to { background-position: 0 100%, 100% 100%; }
52
- }
53
- @keyframes ctaUnderlineSlideOut {
54
- 0% { background-position: 0 100%, 100% 100%; }
55
- to { background-position: 210% 100%, 300% 100%; }
56
- }
57
- ```
58
- **Used on:** `.cta--tertiary` (text links with sliding underline)
59
- - Rest state: `0.5s cubic-bezier(0.645, 0.045, 0.355, 1) forwards ctaUnderlineSlideOut`
60
- - Hover state: `0.5s cubic-bezier(0.645, 0.045, 0.355, 1) forwards ctaUnderlineSlideIn`
61
- - Requires `background-image: linear-gradient(currentColor, currentColor), linear-gradient(currentColor, currentColor)`
62
-
63
- ---
64
-
65
- ### swipeIn / swipeOut
66
- ```css
67
- @keyframes swipeIn {
68
- 0% { clip-path: polygon(101% 0%, 100% 0%, 101% 100%, 116% 100%); }
69
- to { clip-path: polygon(0% 0%, 101% 0%, 101% 101%, 0% 101%); }
70
- }
71
- @keyframes swipeOut {
72
- 0% { clip-path: polygon(0% 0%, 101% 0%, 101% 101%, 0% 101%); }
73
- to { clip-path: polygon(105% 0%, 100% 0%, 101% 100%, 100% 100%); }
74
- }
75
- ```
76
- **Used on:** `.global-navigation__mobile-menu`
77
- - Open: `0.6s cubic-bezier(0.165, 0.84, 0.44, 1) forwards swipeIn`
78
- - Close: `0.6s cubic-bezier(0.165, 0.84, 0.44, 1) forwards swipeOut`
79
- - **Signature effect:** The mobile drawer "wipes" in from the right using a clip-path polygon animation — not a `translateX` slide.
80
-
81
- ---
82
-
83
- ### rotateAnimation
84
- ```css
85
- @keyframes rotateAnimation {
86
- 0% { transform: rotate(0); }
87
- 22% { transform: rotate(240deg); }
88
- 44% { transform: rotate(480deg); }
89
- 66% { transform: rotate(720deg); }
90
- to { transform: rotate(720deg); }
91
- }
92
- ```
93
- **Used on:** `.ai-dots` — `14s cubic-bezier(0.645, 0.045, 0.355, 1) infinite`
94
- - Non-linear rotation: accelerates in bursts, pauses at multiples of 240°.
95
-
96
- ---
97
-
98
- ### scaleAnimationLarge / Medium / Small (AI dots morphing)
99
- ```css
100
- @keyframes scaleAnimationLarge {
101
- 0% { transform: var(--defaultTransform); }
102
- 11% { transform: scale(0.403) translate(-20%, -30%); }
103
- 22% { transform: scale(0.403) translate(-20%, -30%); }
104
- 33% { transform: scale(0.64) translate(40%, -45%); }
105
- 44% { transform: scale(0.64) translate(40%, -45%); }
106
- 55% { transform: var(--defaultTransform); }
107
- to { transform: var(--defaultTransform); }
108
- }
109
- @keyframes scaleAnimationMedium {
110
- 0% { transform: var(--defaultTransform); }
111
- 11% { transform: scale(1.56) translate(-10%, -33%); }
112
- 22% { transform: scale(1.56) translate(-10%, -33%); }
113
- 33% { transform: scale(0.63) translate(10%, -85%); }
114
- 44% { transform: scale(0.63) translate(10%, -85%); }
115
- 55% { transform: var(--defaultTransform); }
116
- to { transform: var(--defaultTransform); }
117
- }
118
- @keyframes scaleAnimationSmall {
119
- 0% { transform: var(--defaultTransform); }
120
- 11% { transform: scale(1.59) translate(-45%, -30%); }
121
- 22% { transform: scale(1.59) translate(-45%, -30%); }
122
- 33% { transform: scale(2.48) translate(5%, -15%); }
123
- 44% { transform: scale(2.48) translate(5%, -15%); }
124
- 55% { transform: var(--defaultTransform); }
125
- to { transform: var(--defaultTransform); }
126
- }
127
- ```
128
- **Used on:** `.ai-dots__dot--large/medium/small` — `var(--defaultTiming) linear infinite`
129
- - Three dots orbit and morph around each other using coordinated scale+translate.
130
- - `--defaultTransform` is the rest position (typically `scale(1) translate(0, 0)`).
131
-
132
- ---
133
-
134
- ### flip
135
- ```css
136
- @keyframes flip {
137
- 0% { transform: rotateY(0); }
138
- 12.5% { transform: rotateY(0); }
139
- 50% { transform: rotateY(180deg); }
140
- 62.5% { transform: rotateY(180deg); }
141
- to { transform: rotate(180deg); }
142
- }
143
- ```
144
- **Used on:** `.loader__square` — `1.6s cubic-bezier(0.66, 0, 0.34, 1) infinite`
145
- - Loading state animation.
146
-
147
- ---
148
-
149
- ### supportHoverArrow
150
- ```css
151
- @keyframes supportHoverArrow {
152
- 0% { transform: translate(0); }
153
- 20%, 30% { transform: translate(2px); }
154
- 70%, 80% { transform: translate(-2px); }
155
- to { transform: translate(0); }
156
- }
157
- ```
158
- **Used on:** `.support__links-cta-arrow--hovered` — `1.1s linear infinite`
159
- - Subtle shimmy/vibration on the support section arrow when hovered.
160
-
161
- ---
162
-
163
- ## CTA Hover Overlay Effect (not @keyframes — pure CSS)
164
-
165
- The primary and secondary CTA buttons use a `mix-blend-mode: difference` overlay that scales in on hover:
166
-
167
- ```css
168
- .cta--primary::after,
169
- .cta--secondary::after {
170
- content: '';
171
- mix-blend-mode: difference;
172
- background-color: white;
173
- transform-origin: 0;
174
- width: 100%;
175
- height: 100%;
176
- position: absolute;
177
- top: 0; left: 0;
178
- transform: scaleX(0);
179
- transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
180
- }
181
- .cta--primary:hover::after,
182
- .cta--secondary:hover::after {
183
- transform: scaleX(1);
184
- }
185
- ```
186
- **Effect:** The `mix-blend-mode: difference` + white fill creates an inversion effect rather than a simple color change — the button appears to "flip" colors on hover.
187
-
188
- ---
189
-
190
- ## Scroll Reveal Pattern
191
-
192
- No third-party library. IntersectionObserver adds `.in-view` class:
193
-
194
- ```typescript
195
- const observer = new IntersectionObserver(
196
- entries => entries.forEach(e => {
197
- if (e.isIntersecting) e.target.classList.add('in-view');
198
- }),
199
- { threshold: 0.15 }
200
- );
201
- document.querySelectorAll('.reveal, .reveal-stagger').forEach(el => observer.observe(el));
202
- ```
203
-
204
- CSS handles the animation:
205
- ```css
206
- .reveal {
207
- opacity: 0;
208
- transform: translateY(16px);
209
- transition: opacity 0.8s cubic-bezier(0.23, 1, 0.32, 1),
210
- transform 0.8s cubic-bezier(0.23, 1, 0.32, 1);
211
- }
212
- .reveal.in-view { opacity: 1; transform: translateY(0); }
213
- ```
214
-
215
- Stats cards use staggered delays (0.1s increments per child).
216
-
217
- ---
218
-
219
- ## Video Background Pattern
220
-
221
- Hero section uses `<video autoplay muted loop playsInline preload="auto">` with responsive sources:
222
-
223
- ```html
224
- <video autoplay muted loop playsinline preload="auto">
225
- <source src="video-desktop.webm" type="video/webm">
226
- <source src="video-desktop.mp4" type="video/mp4">
227
- </video>
228
- ```
229
-
230
- - Mobile: swap to `video-mobile.webm/mp4` (lighter, portrait-optimized)
231
- - Overlay: `rgba(0, 0, 0, 0.52)` dark layer over video
232
- - Card carousel videos: `preload="none"` (only hero is eager-loaded)
233
-
234
- ---
235
-
236
- ## Navigation Accordion (mobile)
237
-
238
- Mobile nav accordion uses CSS grid transition for smooth open/close:
239
-
240
- ```css
241
- .global-navigation__accordion-content {
242
- display: grid;
243
- grid-template-rows: 0fr;
244
- transition: grid-template-rows 0.7s cubic-bezier(0.165, 0.84, 0.44, 1),
245
- padding 0.7s cubic-bezier(0.165, 0.84, 0.44, 1);
246
- }
247
- .global-navigation__accordion-content--open {
248
- grid-template-rows: 1fr;
249
- }
250
- ```
251
-
252
- `grid-template-rows: 0fr → 1fr` is the modern CSS accordion technique (no JS height calculation needed).
253
-
254
- ---
255
-
256
- ## Reduced Motion
257
-
258
- All animations respect `prefers-reduced-motion`:
259
- ```css
260
- @media (prefers-reduced-motion: reduce) {
261
- *,
262
- *::before,
263
- *::after {
264
- animation-duration: 0.01ms !important;
265
- animation-iteration-count: 1 !important;
266
- transition-duration: 0.01ms !important;
267
- }
268
- }
269
- ```
270
- Mobile menu `.animation: none` override also applied explicitly.
1
+ # Motion — pt.squarespace.com
2
+
3
+ ## Motion Philosophy
4
+
5
+ CSS-first, no third-party animation libraries. All animations implemented via `@keyframes` + class toggling + `IntersectionObserver`. Fast micro-interactions (300–500ms), slow scroll reveals (800–1200ms). Easing is smooth deceleration (`cubic-bezier(0.23, 1, 0.32, 1)`) for reveals and power (`cubic-bezier(0.645, 0.045, 0.355, 1)`) for CTA interactions.
6
+
7
+ **No GSAP. No Framer Motion. No AOS. No Lottie.** Pure CSS + vanilla JS.
8
+
9
+ ---
10
+
11
+ ## Timing Functions
12
+
13
+ | Token | Value | Usage |
14
+ |-------|-------|-------|
15
+ | `--ease-default` | `cubic-bezier(0.455, 0.03, 0.515, 0.955)` | General transitions |
16
+ | `--ease-sqsp-reveal` | `cubic-bezier(0.23, 1, 0.32, 1)` | Scroll reveals, stats (the Squarespace signature ease) |
17
+ | `--ease-sqsp-cta` | `cubic-bezier(0.645, 0.045, 0.355, 1)` | CTA hover, mobile menu, dropdowns |
18
+ | `--ease-sqsp-menu` | `cubic-bezier(0.165, 0.84, 0.44, 1)` | Mobile menu swipe, accordion |
19
+ | `--ease-out` | `ease-out` | Exit animations |
20
+
21
+ ## Durations
22
+
23
+ | Token | Value | Usage |
24
+ |-------|-------|-------|
25
+ | `--transition-fast` | `100ms` | Micro color changes |
26
+ | `--transition-base` | `200ms` | Standard hover |
27
+ | `--transition-medium` | `300ms` | Nav dropdowns, CTA hover overlay |
28
+ | `--transition-slow` | `400ms` | Layout transitions |
29
+ | `--transition-reveal` | `800ms` | Scroll-triggered section reveals |
30
+ | `--transition-reveal-slow` | `1200ms` | Stats card reveal |
31
+
32
+ ---
33
+
34
+ ## Extracted @keyframes (verbatim from pt.squarespace.com/css/index.css)
35
+
36
+ ### fadeIn
37
+ ```css
38
+ @keyframes fadeIn {
39
+ 0% { opacity: 0; }
40
+ to { opacity: 1; }
41
+ }
42
+ ```
43
+ **Used on:** `.stats__card` — `1.2s cubic-bezier(0.23, 1, 0.32, 1) forwards`
44
+
45
+ ---
46
+
47
+ ### ctaUnderlineSlideIn / ctaUnderlineSlideOut
48
+ ```css
49
+ @keyframes ctaUnderlineSlideIn {
50
+ 0% { background-position: -200% 100%, -100% 100%; }
51
+ to { background-position: 0 100%, 100% 100%; }
52
+ }
53
+ @keyframes ctaUnderlineSlideOut {
54
+ 0% { background-position: 0 100%, 100% 100%; }
55
+ to { background-position: 210% 100%, 300% 100%; }
56
+ }
57
+ ```
58
+ **Used on:** `.cta--tertiary` (text links with sliding underline)
59
+ - Rest state: `0.5s cubic-bezier(0.645, 0.045, 0.355, 1) forwards ctaUnderlineSlideOut`
60
+ - Hover state: `0.5s cubic-bezier(0.645, 0.045, 0.355, 1) forwards ctaUnderlineSlideIn`
61
+ - Requires `background-image: linear-gradient(currentColor, currentColor), linear-gradient(currentColor, currentColor)`
62
+
63
+ ---
64
+
65
+ ### swipeIn / swipeOut
66
+ ```css
67
+ @keyframes swipeIn {
68
+ 0% { clip-path: polygon(101% 0%, 100% 0%, 101% 100%, 116% 100%); }
69
+ to { clip-path: polygon(0% 0%, 101% 0%, 101% 101%, 0% 101%); }
70
+ }
71
+ @keyframes swipeOut {
72
+ 0% { clip-path: polygon(0% 0%, 101% 0%, 101% 101%, 0% 101%); }
73
+ to { clip-path: polygon(105% 0%, 100% 0%, 101% 100%, 100% 100%); }
74
+ }
75
+ ```
76
+ **Used on:** `.global-navigation__mobile-menu`
77
+ - Open: `0.6s cubic-bezier(0.165, 0.84, 0.44, 1) forwards swipeIn`
78
+ - Close: `0.6s cubic-bezier(0.165, 0.84, 0.44, 1) forwards swipeOut`
79
+ - **Signature effect:** The mobile drawer "wipes" in from the right using a clip-path polygon animation — not a `translateX` slide.
80
+
81
+ ---
82
+
83
+ ### rotateAnimation
84
+ ```css
85
+ @keyframes rotateAnimation {
86
+ 0% { transform: rotate(0); }
87
+ 22% { transform: rotate(240deg); }
88
+ 44% { transform: rotate(480deg); }
89
+ 66% { transform: rotate(720deg); }
90
+ to { transform: rotate(720deg); }
91
+ }
92
+ ```
93
+ **Used on:** `.ai-dots` — `14s cubic-bezier(0.645, 0.045, 0.355, 1) infinite`
94
+ - Non-linear rotation: accelerates in bursts, pauses at multiples of 240°.
95
+
96
+ ---
97
+
98
+ ### scaleAnimationLarge / Medium / Small (AI dots morphing)
99
+ ```css
100
+ @keyframes scaleAnimationLarge {
101
+ 0% { transform: var(--defaultTransform); }
102
+ 11% { transform: scale(0.403) translate(-20%, -30%); }
103
+ 22% { transform: scale(0.403) translate(-20%, -30%); }
104
+ 33% { transform: scale(0.64) translate(40%, -45%); }
105
+ 44% { transform: scale(0.64) translate(40%, -45%); }
106
+ 55% { transform: var(--defaultTransform); }
107
+ to { transform: var(--defaultTransform); }
108
+ }
109
+ @keyframes scaleAnimationMedium {
110
+ 0% { transform: var(--defaultTransform); }
111
+ 11% { transform: scale(1.56) translate(-10%, -33%); }
112
+ 22% { transform: scale(1.56) translate(-10%, -33%); }
113
+ 33% { transform: scale(0.63) translate(10%, -85%); }
114
+ 44% { transform: scale(0.63) translate(10%, -85%); }
115
+ 55% { transform: var(--defaultTransform); }
116
+ to { transform: var(--defaultTransform); }
117
+ }
118
+ @keyframes scaleAnimationSmall {
119
+ 0% { transform: var(--defaultTransform); }
120
+ 11% { transform: scale(1.59) translate(-45%, -30%); }
121
+ 22% { transform: scale(1.59) translate(-45%, -30%); }
122
+ 33% { transform: scale(2.48) translate(5%, -15%); }
123
+ 44% { transform: scale(2.48) translate(5%, -15%); }
124
+ 55% { transform: var(--defaultTransform); }
125
+ to { transform: var(--defaultTransform); }
126
+ }
127
+ ```
128
+ **Used on:** `.ai-dots__dot--large/medium/small` — `var(--defaultTiming) linear infinite`
129
+ - Three dots orbit and morph around each other using coordinated scale+translate.
130
+ - `--defaultTransform` is the rest position (typically `scale(1) translate(0, 0)`).
131
+
132
+ ---
133
+
134
+ ### flip
135
+ ```css
136
+ @keyframes flip {
137
+ 0% { transform: rotateY(0); }
138
+ 12.5% { transform: rotateY(0); }
139
+ 50% { transform: rotateY(180deg); }
140
+ 62.5% { transform: rotateY(180deg); }
141
+ to { transform: rotate(180deg); }
142
+ }
143
+ ```
144
+ **Used on:** `.loader__square` — `1.6s cubic-bezier(0.66, 0, 0.34, 1) infinite`
145
+ - Loading state animation.
146
+
147
+ ---
148
+
149
+ ### supportHoverArrow
150
+ ```css
151
+ @keyframes supportHoverArrow {
152
+ 0% { transform: translate(0); }
153
+ 20%, 30% { transform: translate(2px); }
154
+ 70%, 80% { transform: translate(-2px); }
155
+ to { transform: translate(0); }
156
+ }
157
+ ```
158
+ **Used on:** `.support__links-cta-arrow--hovered` — `1.1s linear infinite`
159
+ - Subtle shimmy/vibration on the support section arrow when hovered.
160
+
161
+ ---
162
+
163
+ ## CTA Hover Overlay Effect (not @keyframes — pure CSS)
164
+
165
+ The primary and secondary CTA buttons use a `mix-blend-mode: difference` overlay that scales in on hover:
166
+
167
+ ```css
168
+ .cta--primary::after,
169
+ .cta--secondary::after {
170
+ content: '';
171
+ mix-blend-mode: difference;
172
+ background-color: white;
173
+ transform-origin: 0;
174
+ width: 100%;
175
+ height: 100%;
176
+ position: absolute;
177
+ top: 0; left: 0;
178
+ transform: scaleX(0);
179
+ transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
180
+ }
181
+ .cta--primary:hover::after,
182
+ .cta--secondary:hover::after {
183
+ transform: scaleX(1);
184
+ }
185
+ ```
186
+ **Effect:** The `mix-blend-mode: difference` + white fill creates an inversion effect rather than a simple color change — the button appears to "flip" colors on hover.
187
+
188
+ ---
189
+
190
+ ## Scroll Reveal Pattern
191
+
192
+ No third-party library. IntersectionObserver adds `.in-view` class:
193
+
194
+ ```typescript
195
+ const observer = new IntersectionObserver(
196
+ entries => entries.forEach(e => {
197
+ if (e.isIntersecting) e.target.classList.add('in-view');
198
+ }),
199
+ { threshold: 0.15 }
200
+ );
201
+ document.querySelectorAll('.reveal, .reveal-stagger').forEach(el => observer.observe(el));
202
+ ```
203
+
204
+ CSS handles the animation:
205
+ ```css
206
+ .reveal {
207
+ opacity: 0;
208
+ transform: translateY(16px);
209
+ transition: opacity 0.8s cubic-bezier(0.23, 1, 0.32, 1),
210
+ transform 0.8s cubic-bezier(0.23, 1, 0.32, 1);
211
+ }
212
+ .reveal.in-view { opacity: 1; transform: translateY(0); }
213
+ ```
214
+
215
+ Stats cards use staggered delays (0.1s increments per child).
216
+
217
+ ---
218
+
219
+ ## Video Background Pattern
220
+
221
+ Hero section uses `<video autoplay muted loop playsInline preload="auto">` with responsive sources:
222
+
223
+ ```html
224
+ <video autoplay muted loop playsinline preload="auto">
225
+ <source src="video-desktop.webm" type="video/webm">
226
+ <source src="video-desktop.mp4" type="video/mp4">
227
+ </video>
228
+ ```
229
+
230
+ - Mobile: swap to `video-mobile.webm/mp4` (lighter, portrait-optimized)
231
+ - Overlay: `rgba(0, 0, 0, 0.52)` dark layer over video
232
+ - Card carousel videos: `preload="none"` (only hero is eager-loaded)
233
+
234
+ ---
235
+
236
+ ## Navigation Accordion (mobile)
237
+
238
+ Mobile nav accordion uses CSS grid transition for smooth open/close:
239
+
240
+ ```css
241
+ .global-navigation__accordion-content {
242
+ display: grid;
243
+ grid-template-rows: 0fr;
244
+ transition: grid-template-rows 0.7s cubic-bezier(0.165, 0.84, 0.44, 1),
245
+ padding 0.7s cubic-bezier(0.165, 0.84, 0.44, 1);
246
+ }
247
+ .global-navigation__accordion-content--open {
248
+ grid-template-rows: 1fr;
249
+ }
250
+ ```
251
+
252
+ `grid-template-rows: 0fr → 1fr` is the modern CSS accordion technique (no JS height calculation needed).
253
+
254
+ ---
255
+
256
+ ## Reduced Motion
257
+
258
+ All animations respect `prefers-reduced-motion`:
259
+ ```css
260
+ @media (prefers-reduced-motion: reduce) {
261
+ *,
262
+ *::before,
263
+ *::after {
264
+ animation-duration: 0.01ms !important;
265
+ animation-iteration-count: 1 !important;
266
+ transition-duration: 0.01ms !important;
267
+ }
268
+ }
269
+ ```
270
+ Mobile menu `.animation: none` override also applied explicitly.