@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.
- package/CHANGELOG.md +9 -0
- package/docs/design-previews/cognitive-core-ui-auth.html +95 -0
- package/docs/design-previews/cognitive-core-ui-kanban.html +231 -0
- package/docs/design-previews/cognitive-core-ui-list-detail.html +174 -0
- package/docs/design-previews/cognitive-core-ui-preview.css +1315 -0
- package/docs/design-previews/cognitive-core-ui-settings.html +142 -0
- package/docs/design-previews/cognitive-core-ui-website.html +190 -1009
- package/docs/design-previews/cognitive-core-ui.html +281 -463
- package/docs/design-previews/index.html +83 -31
- package/package.json +1 -1
- package/src/constants.js +567 -511
- package/template/.aioson/docs/play/README.md +2 -0
- package/template/.aioson/docs/play/agent-usage-guide.md +7 -1
- package/template/.aioson/docs/play/app-compatibility-guide.md +6 -1
- package/template/.aioson/docs/play/auth-services-and-testing.md +16 -1
- package/template/.aioson/docs/play/manifest-and-runtime.md +23 -0
- package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
- package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
- package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
- package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
- package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
- package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
- package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
- package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
- package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
- package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
- package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
- package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
- package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
- package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
- package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
- package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
- package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
- package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
- package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
- package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
- package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
- package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
- package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
- package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
- package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
- package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
- package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
- package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
- package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
- package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
- package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
- package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
- package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
- package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
- package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
- package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
- package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
- package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
- package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
- package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
- package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
- package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
- package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
- package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
- package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
- package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
- package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
- package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
- package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
- package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
- package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
- package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
- package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
- package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
- package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
- package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
- package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
- package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
- package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
- package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
- package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
- package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
- package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
- package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
- package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
- package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
- package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
- package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
- package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
- package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
- package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
- package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
- package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
- package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -289
|
@@ -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.
|