@syncedco/flow 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CODE_OF_CONDUCT.md +26 -0
  2. package/CONTRIBUTING.md +54 -0
  3. package/LICENSE +21 -0
  4. package/README.md +334 -0
  5. package/SECURITY.md +30 -0
  6. package/SUPPORT.md +32 -0
  7. package/TRADEMARKS.md +14 -0
  8. package/base.css +100 -0
  9. package/bin/synced-flow.mjs +4639 -0
  10. package/components.css +1392 -0
  11. package/defaults.css +26 -0
  12. package/dist/config.d.ts +94 -0
  13. package/dist/config.js +3 -0
  14. package/dist/index.d.ts +45 -0
  15. package/dist/index.js +67 -0
  16. package/docs/accessibility-css.md +133 -0
  17. package/docs/ai-usage.md +112 -0
  18. package/docs/api-contract.md +81 -0
  19. package/docs/base-styling.md +113 -0
  20. package/docs/build-a-site-walkthrough.md +122 -0
  21. package/docs/cli-reference.md +230 -0
  22. package/docs/config-reference.md +81 -0
  23. package/docs/css-optimisation.md +117 -0
  24. package/docs/migration-from-tailwind.md +60 -0
  25. package/docs/native-components.md +156 -0
  26. package/docs/patterns.md +32 -0
  27. package/docs/presets.md +60 -0
  28. package/docs/quick-start.md +252 -0
  29. package/docs/recipes.md +285 -0
  30. package/docs/release-readiness.md +63 -0
  31. package/docs/system-primitives.md +150 -0
  32. package/docs/tailwind-comparison.md +66 -0
  33. package/docs/tokens.md +79 -0
  34. package/docs/website-patterns.md +114 -0
  35. package/docs/why-synced-flow.md +99 -0
  36. package/docs/wordpress.md +66 -0
  37. package/examples/README.md +16 -0
  38. package/examples/astro/package.json +19 -0
  39. package/examples/astro/src/pages/index.astro +85 -0
  40. package/examples/astro/src/styles/synced-flow.css +2 -0
  41. package/examples/astro/src/styles/synced-flow.generated.css +206 -0
  42. package/examples/astro/synced-flow.config.mjs +9 -0
  43. package/examples/next/app/layout.tsx +14 -0
  44. package/examples/next/app/page.tsx +92 -0
  45. package/examples/next/app/synced-flow.css +2 -0
  46. package/examples/next/app/synced-flow.generated.css +205 -0
  47. package/examples/next/package.json +19 -0
  48. package/examples/next/synced-flow.config.mjs +9 -0
  49. package/examples/plain-html/index.html +384 -0
  50. package/examples/plain-html/package.json +15 -0
  51. package/examples/plain-html/synced-flow.config.mjs +9 -0
  52. package/examples/plain-html/synced-flow.css +2 -0
  53. package/examples/plain-html/synced-flow.generated.css +205 -0
  54. package/examples/templates/README.md +22 -0
  55. package/examples/templates/blog-index.html +41 -0
  56. package/examples/templates/coming-soon.html +27 -0
  57. package/examples/templates/portfolio-scroll.html +45 -0
  58. package/examples/templates/saas-dashboard.html +171 -0
  59. package/examples/templates/saas-landing.html +104 -0
  60. package/examples/vite/index.html +2 -0
  61. package/examples/vite/package.json +20 -0
  62. package/examples/vite/src/main.jsx +27 -0
  63. package/examples/vite/src/synced-flow.css +2 -0
  64. package/examples/vite/src/synced-flow.generated.css +205 -0
  65. package/examples/vite/synced-flow.config.mjs +9 -0
  66. package/examples/wordpress/assets/css/synced-flow.css +641 -0
  67. package/examples/wordpress/functions.php +13 -0
  68. package/examples/wordpress/package.json +15 -0
  69. package/examples/wordpress/parts/footer.html +12 -0
  70. package/examples/wordpress/parts/header.html +10 -0
  71. package/examples/wordpress/patterns/contact-cta.php +28 -0
  72. package/examples/wordpress/patterns/feature-grid.php +38 -0
  73. package/examples/wordpress/patterns/landing-hero.php +45 -0
  74. package/examples/wordpress/synced-flow.config.mjs +11 -0
  75. package/examples/wordpress/templates/front-page.html +11 -0
  76. package/examples/wordpress/templates/index.html +27 -0
  77. package/examples/wordpress/theme.json +19 -0
  78. package/layout.css +365 -0
  79. package/package.json +93 -0
  80. package/reset.css +13 -0
  81. package/skills/synced-flow/SKILL.md +151 -0
  82. package/src/config.ts +98 -0
  83. package/src/index.ts +75 -0
  84. package/src/presets.d.mts +21 -0
  85. package/src/presets.mjs +171 -0
  86. package/src/tokens.mjs +138 -0
  87. package/src/utility-tokens.mjs +47 -0
  88. package/styles.css +2313 -0
  89. package/tokens.css +198 -0
  90. package/utilities.css +255 -0
package/components.css ADDED
@@ -0,0 +1,1392 @@
1
+ /* Generated by @syncedco/flow. Edit src/tokens.mjs or scripts/build-css.mjs, then run pnpm build. */
2
+ @layer reset, tokens, base, app, layout, components, utilities;
3
+ @layer components {
4
+ .sf-button {
5
+ align-items: center;
6
+ background: var(--sf-button-bg, var(--sf-colour-primary));
7
+ border: 1px solid var(--sf-button-border, color-mix(in oklch, var(--sf-colour-primary) 84%, black));
8
+ border-radius: var(--sf-button-radius);
9
+ box-shadow: var(--sf-button-shadow, var(--sf-shadow-sm));
10
+ color: var(--sf-button-colour, var(--sf-colour-primary-foreground));
11
+ display: inline-flex;
12
+ font-size: var(--sf-step--1);
13
+ font-weight: 700;
14
+ gap: var(--sf-space-2xs);
15
+ justify-content: center;
16
+ min-block-size: var(--sf-button-block-size);
17
+ padding-block: .625rem;
18
+ padding-inline: var(--sf-button-padding-inline);
19
+ text-decoration: none;
20
+ transition: background-color var(--sf-duration-normal) var(--sf-ease-standard), border-color var(--sf-duration-normal) var(--sf-ease-standard), box-shadow var(--sf-duration-normal) var(--sf-ease-standard), color var(--sf-duration-normal) var(--sf-ease-standard), transform var(--sf-duration-normal) var(--sf-ease-standard);
21
+ white-space: nowrap;
22
+ }
23
+
24
+ .sf-button:hover {
25
+ background: var(--sf-button-bg-hover, var(--sf-colour-primary-hover));
26
+ transform: translateY(-0.0625rem);
27
+ }
28
+
29
+ .sf-button:disabled,
30
+ .sf-button[aria-disabled="true"] {
31
+ opacity: .55;
32
+ pointer-events: none;
33
+ }
34
+
35
+ :where(.sf-button, .sf-nav__link, .sf-card--interactive, .sf-price-card)[aria-disabled="true"],
36
+ :where(.sf-link, .sf-link-subtle, .sf-link-plain)[aria-disabled="true"] {
37
+ cursor: not-allowed;
38
+ opacity: .55;
39
+ pointer-events: none;
40
+ }
41
+
42
+ :where(.sf-button, .sf-nav__link)[aria-expanded="true"],
43
+ :where(.sf-button, .sf-nav__link)[aria-pressed="true"],
44
+ :where(.sf-button, .sf-nav__link)[aria-selected="true"],
45
+ :where(.sf-button, .sf-nav__link)[data-state="open"] {
46
+ background: var(--sf-colour-surface-alt);
47
+ border-color: color-mix(in oklch, var(--sf-colour-primary) 34%, var(--sf-colour-border));
48
+ color: var(--sf-colour-foreground);
49
+ }
50
+
51
+ .sf-button[aria-busy="true"],
52
+ .sf-button[data-loading="true"] {
53
+ cursor: progress;
54
+ opacity: .78;
55
+ pointer-events: none;
56
+ }
57
+
58
+ .sf-button:focus-visible {
59
+ box-shadow: 0 0 0 0.25rem color-mix(in oklch, var(--sf-colour-ring) 22%, transparent);
60
+ }
61
+
62
+ .sf-button--default,
63
+ .sf-button[data-variant="default"] {
64
+ --sf-button-bg: var(--sf-colour-primary);
65
+ --sf-button-bg-hover: var(--sf-colour-primary-hover);
66
+ --sf-button-border: color-mix(in oklch, var(--sf-colour-primary) 84%, black);
67
+ --sf-button-colour: var(--sf-colour-primary-foreground);
68
+ }
69
+
70
+ .sf-button--secondary,
71
+ .sf-button[data-variant="secondary"] {
72
+ --sf-button-bg: var(--sf-colour-surface-alt);
73
+ --sf-button-bg-hover: color-mix(in oklch, var(--sf-colour-surface-alt) 86%, var(--sf-colour-primary));
74
+ --sf-button-border: var(--sf-colour-border);
75
+ --sf-button-colour: var(--sf-colour-foreground);
76
+ }
77
+
78
+ .sf-button--outline,
79
+ .sf-button[data-variant="outline"] {
80
+ --sf-button-bg: transparent;
81
+ --sf-button-bg-hover: var(--sf-colour-surface-alt);
82
+ --sf-button-border: var(--sf-colour-border);
83
+ --sf-button-colour: var(--sf-colour-foreground);
84
+ --sf-button-shadow: none;
85
+ }
86
+
87
+ .sf-button--ghost,
88
+ .sf-button[data-variant="ghost"] {
89
+ --sf-button-bg: transparent;
90
+ --sf-button-bg-hover: var(--sf-colour-surface-alt);
91
+ --sf-button-border: transparent;
92
+ --sf-button-colour: var(--sf-colour-foreground);
93
+ --sf-button-shadow: none;
94
+ }
95
+
96
+ .sf-button--link,
97
+ .sf-button[data-variant="link"] {
98
+ --sf-button-bg: transparent;
99
+ --sf-button-bg-hover: transparent;
100
+ --sf-button-border: transparent;
101
+ --sf-button-colour: var(--sf-colour-primary);
102
+ --sf-button-shadow: none;
103
+ min-block-size: auto;
104
+ padding: 0;
105
+ text-decoration: underline;
106
+ text-underline-offset: .25em;
107
+ }
108
+
109
+ .sf-button--link:hover,
110
+ .sf-button[data-variant="link"]:hover {
111
+ transform: none;
112
+ }
113
+
114
+ .sf-button--destructive,
115
+ .sf-button[data-variant="destructive"] {
116
+ --sf-button-bg: var(--sf-colour-danger);
117
+ --sf-button-bg-hover: color-mix(in oklch, var(--sf-colour-danger) 86%, black);
118
+ --sf-button-border: color-mix(in oklch, var(--sf-colour-danger) 84%, black);
119
+ --sf-button-colour: var(--sf-colour-primary-foreground);
120
+ }
121
+
122
+ .sf-button--sm,
123
+ .sf-button[data-size="sm"] {
124
+ --sf-button-block-size: 2.25rem;
125
+ --sf-button-padding-inline: var(--sf-space-xs);
126
+ }
127
+
128
+ .sf-button--lg,
129
+ .sf-button[data-size="lg"] {
130
+ --sf-button-block-size: 3rem;
131
+ --sf-button-padding-inline: var(--sf-space-m);
132
+ }
133
+
134
+ .sf-button--icon,
135
+ .sf-icon-button,
136
+ .sf-button[data-size="icon"] {
137
+ --sf-button-block-size: 2.75rem;
138
+ inline-size: 2.75rem;
139
+ padding-inline: 0;
140
+ }
141
+
142
+ .sf-button--block,
143
+ .sf-button[data-width="block"] {
144
+ inline-size: 100%;
145
+ }
146
+
147
+ .sf-button-group {
148
+ align-items: center;
149
+ display: flex;
150
+ flex-wrap: wrap;
151
+ gap: var(--sf-space-2xs);
152
+ }
153
+
154
+ .sf-icon {
155
+ block-size: var(--sf-icon-size, 1em);
156
+ color: var(--sf-icon-colour, currentColor);
157
+ flex: 0 0 auto;
158
+ inline-size: var(--sf-icon-size, 1em);
159
+ stroke-width: var(--sf-icon-stroke, 2);
160
+ vertical-align: -0.125em;
161
+ }
162
+
163
+ .sf-icon--xs { --sf-icon-size: var(--sf-step--1); }
164
+ .sf-icon--sm { --sf-icon-size: var(--sf-step-0); }
165
+ .sf-icon--md { --sf-icon-size: var(--sf-step-1); }
166
+ .sf-icon--lg { --sf-icon-size: var(--sf-step-2); }
167
+ .sf-icon--xl { --sf-icon-size: var(--sf-step-3); }
168
+
169
+ .sf-card {
170
+ background: var(--sf-card-bg, var(--sf-colour-surface));
171
+ border: 1px solid var(--sf-card-border, var(--sf-colour-border));
172
+ border-radius: var(--sf-card-radius);
173
+ box-shadow: var(--sf-card-shadow, var(--sf-shadow-sm));
174
+ color: var(--sf-card-colour, var(--sf-colour-foreground));
175
+ padding: var(--sf-card-padding);
176
+ }
177
+
178
+ .sf-card--flat {
179
+ --sf-card-shadow: none;
180
+ }
181
+
182
+ .sf-card--raised {
183
+ --sf-card-bg: var(--sf-colour-surface-raised);
184
+ --sf-card-shadow: var(--sf-shadow-md);
185
+ }
186
+
187
+ .sf-card--compact {
188
+ --sf-card-padding: var(--sf-space-s);
189
+ }
190
+
191
+ .sf-card--glass,
192
+ .sf-card--technical {
193
+ --sf-card-bg:
194
+ linear-gradient(180deg, color-mix(in oklch, var(--sf-colour-foreground) 5%, transparent), transparent),
195
+ color-mix(in oklch, var(--sf-colour-surface) 84%, transparent);
196
+ --sf-card-border: var(--sf-colour-border-strong);
197
+ --sf-card-shadow: none;
198
+ backdrop-filter: blur(1.125rem);
199
+ }
200
+
201
+ .sf-card--accent {
202
+ --sf-card-border: color-mix(in oklch, var(--sf-colour-primary) 54%, var(--sf-colour-border));
203
+ --sf-card-shadow: 0 0 2rem color-mix(in oklch, var(--sf-colour-primary) 18%, transparent);
204
+ }
205
+
206
+ .sf-card--center {
207
+ align-items: center;
208
+ text-align: center;
209
+ }
210
+
211
+ .sf-card__header,
212
+ .sf-card__body,
213
+ .sf-card__footer {
214
+ display: grid;
215
+ gap: var(--sf-space-xs);
216
+ }
217
+
218
+ .sf-card__title {
219
+ font-family: var(--sf-font-display);
220
+ font-size: var(--sf-step-2);
221
+ font-weight: 700;
222
+ line-height: var(--sf-line-height-heading);
223
+ }
224
+
225
+ .sf-card__description {
226
+ color: var(--sf-colour-muted);
227
+ }
228
+
229
+ .sf-card--interactive {
230
+ transition: border-color var(--sf-duration-normal) var(--sf-ease-standard), box-shadow var(--sf-duration-normal) var(--sf-ease-standard), transform var(--sf-duration-normal) var(--sf-ease-standard);
231
+ }
232
+
233
+ .sf-card--interactive:hover {
234
+ border-color: color-mix(in oklch, var(--sf-colour-primary) 32%, var(--sf-colour-border));
235
+ box-shadow: var(--sf-shadow-md);
236
+ transform: translateY(-0.125rem);
237
+ }
238
+
239
+ .sf-surface {
240
+ background: var(--sf-surface-bg, var(--sf-colour-surface));
241
+ border: 1px solid var(--sf-surface-border, var(--sf-colour-border));
242
+ border-radius: var(--sf-surface-radius, var(--sf-radius-panel));
243
+ box-shadow: var(--sf-surface-shadow, none);
244
+ color: var(--sf-surface-colour, var(--sf-colour-foreground));
245
+ padding: var(--sf-surface-padding, var(--sf-space-m-l));
246
+ }
247
+
248
+ .sf-surface--alt {
249
+ --sf-surface-bg: var(--sf-colour-surface-alt);
250
+ }
251
+
252
+ .sf-surface--raised {
253
+ --sf-surface-bg: var(--sf-colour-surface-raised);
254
+ --sf-surface-shadow: var(--sf-shadow-md);
255
+ }
256
+
257
+ .sf-code-window {
258
+ background:
259
+ linear-gradient(180deg, color-mix(in oklch, var(--sf-colour-foreground) 5%, transparent), transparent),
260
+ color-mix(in oklch, var(--sf-colour-surface) 86%, transparent);
261
+ border: 1px solid var(--sf-code-window-border, color-mix(in oklch, var(--sf-colour-primary) 48%, var(--sf-colour-border)));
262
+ border-radius: var(--sf-radius-panel);
263
+ box-shadow: var(--sf-code-window-shadow, none);
264
+ color: var(--sf-colour-muted);
265
+ overflow: hidden;
266
+ }
267
+
268
+ .sf-code-window--glow,
269
+ .sf-code-window[data-emphasis="glow"] {
270
+ --sf-code-window-border: color-mix(in oklch, var(--sf-colour-primary) 62%, var(--sf-colour-border));
271
+ --sf-code-window-shadow: 0 0 2.5rem color-mix(in oklch, var(--sf-colour-primary) 16%, transparent);
272
+ }
273
+
274
+ .sf-code-window__bar {
275
+ align-items: center;
276
+ border-block-end: 1px solid var(--sf-colour-border);
277
+ color: var(--sf-colour-muted);
278
+ display: grid;
279
+ font-family: var(--sf-font-mono);
280
+ font-size: var(--sf-step--2);
281
+ gap: var(--sf-space-xs);
282
+ grid-template-columns: auto 1fr auto;
283
+ min-block-size: 2rem;
284
+ padding-inline: var(--sf-space-xs);
285
+ }
286
+
287
+ .sf-code-window__bar > :last-child {
288
+ justify-self: end;
289
+ }
290
+
291
+ .sf-window-dots {
292
+ background: var(--sf-colour-danger);
293
+ block-size: .42rem;
294
+ border-radius: var(--sf-radius-full);
295
+ box-shadow:
296
+ .68rem 0 0 var(--sf-colour-warning),
297
+ 1.36rem 0 0 var(--sf-colour-success);
298
+ display: inline-block;
299
+ inline-size: .42rem;
300
+ margin-inline-end: var(--sf-space-l);
301
+ }
302
+
303
+ .sf-code-lines {
304
+ color: var(--sf-colour-muted);
305
+ counter-reset: code;
306
+ font-family: var(--sf-font-mono);
307
+ font-size: var(--sf-code-font-size, clamp(.72rem, 1vw, .88rem));
308
+ line-height: 1.58;
309
+ list-style: none;
310
+ margin: 0;
311
+ padding: var(--sf-code-padding, var(--sf-space-s));
312
+ }
313
+
314
+ .sf-code-lines--compact {
315
+ --sf-code-font-size: var(--sf-step--2);
316
+ }
317
+
318
+ .sf-code-lines--lg {
319
+ --sf-code-font-size: var(--sf-step--1);
320
+ --sf-code-padding: var(--sf-space-s-m) var(--sf-space-m);
321
+ }
322
+
323
+ .sf-code-lines > li {
324
+ counter-increment: code;
325
+ display: grid;
326
+ gap: var(--sf-space-xs);
327
+ grid-template-columns: 2ch minmax(0, 1fr);
328
+ }
329
+
330
+ .sf-code-lines > li::before {
331
+ color: var(--sf-colour-subtle);
332
+ content: counter(code);
333
+ text-align: right;
334
+ }
335
+
336
+ .sf-code-lines code,
337
+ .sf-code-block code {
338
+ background: transparent;
339
+ border: 0;
340
+ border-radius: 0;
341
+ color: inherit;
342
+ padding: 0;
343
+ white-space: pre-wrap;
344
+ }
345
+
346
+ .sf-code-lines > li:nth-child(4n + 1) code,
347
+ .sf-code-lines > li:nth-child(4n + 2) code,
348
+ .sf-command-list__prompt {
349
+ color: var(--sf-colour-primary);
350
+ }
351
+
352
+ .sf-code-token--punct { color: color-mix(in oklch, var(--sf-colour-muted) 84%, var(--sf-colour-foreground)); }
353
+ .sf-code-token--tag { color: var(--sf-code-token-tag, oklch(78% 0.09 235)); }
354
+ .sf-code-token--attr { color: color-mix(in oklch, var(--sf-colour-warning) 72%, var(--sf-colour-foreground)); }
355
+ .sf-code-token--string { color: color-mix(in oklch, var(--sf-colour-success) 72%, var(--sf-colour-foreground)); }
356
+ .sf-code-token--class { color: var(--sf-code-token-class, var(--sf-colour-primary-hover, var(--sf-colour-primary))); }
357
+ .sf-code-token--property { color: var(--sf-code-token-property, var(--sf-colour-primary-hover, var(--sf-colour-primary))); }
358
+ .sf-code-token--function { color: var(--sf-code-token-function, oklch(78% 0.09 235)); }
359
+ .sf-code-token--number { color: var(--sf-code-token-number, oklch(83% 0.13 86)); }
360
+ .sf-code-token--text { color: var(--sf-colour-foreground); }
361
+ .sf-code-token--comment { color: var(--sf-colour-subtle); font-style: italic; }
362
+
363
+ .sf-token-strip {
364
+ display: flex;
365
+ flex-wrap: wrap;
366
+ gap: var(--sf-space-xs);
367
+ padding: var(--sf-space-s) var(--sf-space-s) 0;
368
+ }
369
+
370
+ .sf-token-strip > * {
371
+ background: var(--sf-token-colour, var(--sf-colour-primary));
372
+ block-size: 1.25rem;
373
+ border: 1px solid var(--sf-colour-border-strong);
374
+ border-radius: var(--sf-radius-xs);
375
+ inline-size: 2.8rem;
376
+ }
377
+
378
+ .sf-token-strip > :nth-child(2) { --sf-token-colour: var(--sf-colour-accent); }
379
+ .sf-token-strip > :nth-child(3) { --sf-token-colour: var(--sf-colour-warning); }
380
+ .sf-token-strip > :nth-child(4) { --sf-token-colour: var(--sf-colour-success); }
381
+ .sf-token-strip > :nth-child(5) { --sf-token-colour: var(--sf-colour-foreground); }
382
+ .sf-token-strip > :nth-child(6) { --sf-token-colour: var(--sf-colour-info); }
383
+
384
+ .sf-token-strip[data-palette="hdr"] > :nth-child(1) { --sf-token-colour: oklch(69% 0.19 42); }
385
+ .sf-token-strip[data-palette="hdr"] > :nth-child(2) { --sf-token-colour: oklch(84% 0.17 82); }
386
+ .sf-token-strip[data-palette="hdr"] > :nth-child(3) { --sf-token-colour: oklch(78% 0.18 145); }
387
+ .sf-token-strip[data-palette="hdr"] > :nth-child(4) { --sf-token-colour: oklch(78% 0.12 235); }
388
+ .sf-token-strip[data-palette="hdr"] > :nth-child(5) { --sf-token-colour: oklch(76% 0.13 292); }
389
+ .sf-token-strip[data-palette="hdr"] > :nth-child(6) { --sf-token-colour: oklch(98% 0.006 80); }
390
+
391
+ .sf-marquee {
392
+ background: color-mix(in oklch, var(--sf-colour-surface) 78%, transparent);
393
+ border-block: 1px solid var(--sf-colour-border);
394
+ color: var(--sf-colour-muted);
395
+ font-family: var(--sf-font-mono);
396
+ font-size: var(--sf-step--2);
397
+ font-weight: 800;
398
+ letter-spacing: .12em;
399
+ overflow: hidden;
400
+ padding-block: var(--sf-marquee-padding-block, var(--sf-space-xs));
401
+ text-transform: uppercase;
402
+ }
403
+
404
+ .sf-marquee__track {
405
+ align-items: center;
406
+ animation: sf-marquee-scroll var(--sf-marquee-duration, 28s) linear infinite;
407
+ display: flex;
408
+ flex-wrap: nowrap;
409
+ gap: var(--sf-marquee-gap, var(--sf-space-l));
410
+ inline-size: max-content;
411
+ min-inline-size: 100%;
412
+ }
413
+
414
+ .sf-marquee__item {
415
+ align-items: center;
416
+ display: inline-flex;
417
+ flex: 0 0 auto;
418
+ gap: var(--sf-space-s);
419
+ white-space: nowrap;
420
+ }
421
+
422
+ .sf-marquee__item::before {
423
+ background: var(--sf-colour-primary);
424
+ block-size: .32rem;
425
+ border-radius: var(--sf-radius-full);
426
+ box-shadow: 0 0 .9rem var(--sf-colour-primary);
427
+ content: "";
428
+ inline-size: .32rem;
429
+ }
430
+
431
+ @keyframes sf-marquee-scroll {
432
+ to { transform: translateX(-50%); }
433
+ }
434
+
435
+ .sf-command-list {
436
+ display: grid;
437
+ font-family: var(--sf-font-mono);
438
+ font-size: var(--sf-step--1);
439
+ gap: var(--sf-space-2xs);
440
+ list-style: none;
441
+ margin: 0;
442
+ padding: var(--sf-space-s);
443
+ }
444
+
445
+ .sf-command-list > li {
446
+ display: flex;
447
+ gap: var(--sf-space-xs);
448
+ }
449
+
450
+ .sf-platform-card {
451
+ align-items: center;
452
+ display: grid;
453
+ gap: var(--sf-space-xs);
454
+ justify-items: center;
455
+ min-block-size: var(--sf-platform-card-min, 11rem);
456
+ text-align: center;
457
+ }
458
+
459
+ .sf-platform-card__logo {
460
+ block-size: clamp(2rem, 4vw, 2.85rem);
461
+ filter: drop-shadow(0 0 1.125rem color-mix(in oklch, var(--sf-colour-foreground) 18%, transparent));
462
+ inline-size: clamp(2rem, 4vw, 2.85rem);
463
+ object-fit: contain;
464
+ }
465
+
466
+ .sf-hero {
467
+ align-items: center;
468
+ display: grid;
469
+ min-block-size: var(--sf-hero-min, min(42rem, 82svh));
470
+ padding-block: var(--sf-space-2xl-3xl);
471
+ }
472
+
473
+ .sf-logo-cloud {
474
+ align-items: center;
475
+ display: flex;
476
+ flex-wrap: wrap;
477
+ gap: var(--sf-space-s-m);
478
+ justify-content: var(--sf-logo-cloud-justify, center);
479
+ }
480
+
481
+ .sf-logo-cloud > * {
482
+ color: var(--sf-colour-subtle);
483
+ font-size: var(--sf-step--1);
484
+ font-weight: 800;
485
+ letter-spacing: .04em;
486
+ text-transform: uppercase;
487
+ }
488
+
489
+ .sf-feature {
490
+ display: grid;
491
+ gap: var(--sf-space-xs);
492
+ }
493
+
494
+ .sf-feature__icon {
495
+ align-items: center;
496
+ background: var(--sf-colour-primary-soft);
497
+ border: 1px solid var(--sf-colour-primary-soft-border);
498
+ border-radius: var(--sf-radius-md);
499
+ color: var(--sf-colour-primary);
500
+ display: inline-flex;
501
+ font-weight: 800;
502
+ inline-size: var(--sf-feature-icon-size, 2.75rem);
503
+ justify-content: center;
504
+ min-block-size: var(--sf-feature-icon-size, 2.75rem);
505
+ }
506
+
507
+ .sf-feature__title {
508
+ font-family: var(--sf-font-display);
509
+ font-size: var(--sf-step-2);
510
+ font-weight: 700;
511
+ line-height: var(--sf-line-height-heading);
512
+ }
513
+
514
+ .sf-feature__text {
515
+ color: var(--sf-colour-muted);
516
+ }
517
+
518
+ .sf-stats {
519
+ display: grid;
520
+ gap: var(--sf-grid-gap, var(--sf-gutter));
521
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sf-stat-min, 12rem)), 1fr));
522
+ }
523
+
524
+ .sf-stat {
525
+ border-block-start: 1px solid var(--sf-colour-border);
526
+ display: grid;
527
+ gap: var(--sf-space-2xs);
528
+ padding-block-start: var(--sf-space-s);
529
+ }
530
+
531
+ .sf-stat__value {
532
+ font-family: var(--sf-font-display);
533
+ font-size: var(--sf-step-4);
534
+ font-weight: 700;
535
+ line-height: var(--sf-line-height-tight);
536
+ }
537
+
538
+ .sf-stat__label {
539
+ color: var(--sf-colour-muted);
540
+ font-size: var(--sf-step--1);
541
+ font-weight: 700;
542
+ }
543
+
544
+ .sf-testimonial {
545
+ background: var(--sf-colour-surface);
546
+ border: 1px solid var(--sf-colour-border);
547
+ border-radius: var(--sf-radius-panel);
548
+ box-shadow: var(--sf-shadow-sm);
549
+ display: grid;
550
+ gap: var(--sf-space-s);
551
+ padding: var(--sf-space-m-l);
552
+ }
553
+
554
+ .sf-testimonial__quote {
555
+ font-family: var(--sf-font-display);
556
+ font-size: var(--sf-step-2);
557
+ font-weight: 700;
558
+ line-height: var(--sf-line-height-heading);
559
+ text-wrap: balance;
560
+ }
561
+
562
+ .sf-testimonial__meta {
563
+ color: var(--sf-colour-muted);
564
+ font-size: var(--sf-step--1);
565
+ font-weight: 700;
566
+ }
567
+
568
+ .sf-pricing-grid {
569
+ container-type: inline-size;
570
+ display: grid;
571
+ gap: var(--sf-grid-gap, var(--sf-gutter));
572
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sf-pricing-min, 18rem)), 1fr));
573
+ }
574
+
575
+ .sf-price-card {
576
+ background: var(--sf-colour-surface);
577
+ border: 1px solid var(--sf-price-card-border, var(--sf-colour-border));
578
+ border-radius: var(--sf-radius-panel);
579
+ box-shadow: var(--sf-price-card-shadow, var(--sf-shadow-sm));
580
+ display: grid;
581
+ gap: var(--sf-space-s);
582
+ padding: var(--sf-space-m-l);
583
+ }
584
+
585
+ .sf-price-card[data-featured="true"],
586
+ .sf-price-card--featured {
587
+ --sf-price-card-border: color-mix(in oklch, var(--sf-colour-primary) 44%, var(--sf-colour-border));
588
+ --sf-price-card-shadow: var(--sf-shadow-md);
589
+ }
590
+
591
+ .sf-price {
592
+ align-items: baseline;
593
+ display: flex;
594
+ flex-wrap: wrap;
595
+ gap: var(--sf-space-2xs);
596
+ }
597
+
598
+ .sf-price__value {
599
+ font-family: var(--sf-font-display);
600
+ font-size: var(--sf-step-5);
601
+ font-weight: 700;
602
+ line-height: var(--sf-line-height-tight);
603
+ }
604
+
605
+ .sf-price__interval {
606
+ color: var(--sf-colour-muted);
607
+ font-size: var(--sf-step--1);
608
+ font-weight: 700;
609
+ }
610
+
611
+ .sf-faq {
612
+ display: grid;
613
+ gap: var(--sf-space-xs);
614
+ }
615
+
616
+ .sf-faq__item {
617
+ background: var(--sf-colour-surface);
618
+ border: 1px solid var(--sf-colour-border);
619
+ border-radius: var(--sf-radius-lg);
620
+ padding: var(--sf-space-s);
621
+ }
622
+
623
+ .sf-faq__item[open] {
624
+ border-color: color-mix(in oklch, var(--sf-colour-primary) 30%, var(--sf-colour-border));
625
+ box-shadow: var(--sf-shadow-sm);
626
+ }
627
+
628
+ .sf-faq__item > summary {
629
+ cursor: pointer;
630
+ font-weight: 800;
631
+ }
632
+
633
+ .sf-faq__item > summary:focus-visible {
634
+ border-radius: var(--sf-radius-sm);
635
+ outline: 0.125rem solid var(--sf-colour-ring);
636
+ outline-offset: .2rem;
637
+ }
638
+
639
+ .sf-faq__item > :where(p, ul, ol) {
640
+ color: var(--sf-colour-muted);
641
+ margin-block-start: var(--sf-space-xs);
642
+ }
643
+
644
+ .sf-cta {
645
+ align-items: center;
646
+ background: var(--sf-colour-surface);
647
+ border: 1px solid var(--sf-colour-border);
648
+ border-radius: var(--sf-radius-panel);
649
+ box-shadow: var(--sf-shadow-md);
650
+ display: grid;
651
+ gap: var(--sf-space-s-m);
652
+ padding: var(--sf-space-l-xl);
653
+ }
654
+
655
+ @container (min-width: 48rem) {
656
+ .sf-cta[data-layout="split"] {
657
+ grid-template-columns: minmax(0, 1fr) auto;
658
+ }
659
+ }
660
+
661
+ .sf-footer {
662
+ border-block-start: 1px solid var(--sf-colour-border);
663
+ color: var(--sf-colour-muted);
664
+ padding-block: var(--sf-space-l-xl);
665
+ }
666
+
667
+ .sf-section-header {
668
+ display: grid;
669
+ gap: var(--sf-space-xs);
670
+ max-inline-size: var(--sf-section-header-width, 54rem);
671
+ }
672
+
673
+ .sf-section-header[data-align="center"] {
674
+ margin-inline: auto;
675
+ text-align: center;
676
+ }
677
+
678
+ .sf-kicker {
679
+ color: var(--sf-colour-primary);
680
+ font-size: var(--sf-step--1);
681
+ font-weight: 800;
682
+ letter-spacing: 0.08em;
683
+ text-transform: uppercase;
684
+ }
685
+
686
+ .sf-badge {
687
+ align-items: center;
688
+ background: color-mix(in oklch, var(--sf-colour-primary) 12%, transparent);
689
+ border: 1px solid color-mix(in oklch, var(--sf-colour-primary) 24%, transparent);
690
+ border-radius: var(--sf-radius-full);
691
+ color: var(--sf-colour-primary);
692
+ display: inline-flex;
693
+ font-size: var(--sf-step--1);
694
+ font-weight: 700;
695
+ gap: var(--sf-space-3xs);
696
+ line-height: 1;
697
+ padding: .45em .75em;
698
+ }
699
+
700
+ .sf-avatar {
701
+ align-items: center;
702
+ aspect-ratio: 1;
703
+ background: color-mix(in oklch, var(--sf-colour-primary) 14%, transparent);
704
+ border: 1px solid color-mix(in oklch, var(--sf-colour-primary) 28%, transparent);
705
+ border-radius: var(--sf-radius-full);
706
+ color: var(--sf-colour-primary);
707
+ display: inline-flex;
708
+ flex: 0 0 auto;
709
+ font-size: var(--sf-step--1);
710
+ font-weight: 800;
711
+ inline-size: var(--sf-avatar-size, 2.25rem);
712
+ justify-content: center;
713
+ line-height: 1;
714
+ }
715
+
716
+ .sf-chart {
717
+ --sf-chart-accent: var(--sf-colour-primary);
718
+ }
719
+
720
+ .sf-chart__plot {
721
+ background: color-mix(in oklch, var(--sf-colour-surface-alt) 72%, transparent);
722
+ border: 1px solid var(--sf-colour-border);
723
+ border-radius: var(--sf-radius-lg);
724
+ overflow: hidden;
725
+ padding: var(--sf-space-xs);
726
+ }
727
+
728
+ .sf-chart--wide {
729
+ --sf-chart-block-size: 14rem;
730
+ }
731
+
732
+ .sf-chart__svg {
733
+ block-size: var(--sf-chart-block-size, 12rem);
734
+ display: block;
735
+ inline-size: 100%;
736
+ }
737
+
738
+ .sf-chart__grid,
739
+ .sf-chart__axis {
740
+ fill: none;
741
+ stroke: var(--sf-colour-border);
742
+ stroke-width: 1;
743
+ vector-effect: non-scaling-stroke;
744
+ }
745
+
746
+ .sf-chart__area {
747
+ fill: color-mix(in oklch, var(--sf-chart-accent) 18%, transparent);
748
+ }
749
+
750
+ .sf-chart__line {
751
+ fill: none;
752
+ stroke: var(--sf-chart-accent);
753
+ stroke-linecap: round;
754
+ stroke-linejoin: round;
755
+ stroke-width: 3;
756
+ vector-effect: non-scaling-stroke;
757
+ }
758
+
759
+ .sf-chart__point {
760
+ fill: var(--sf-chart-accent);
761
+ stroke: var(--sf-colour-surface);
762
+ stroke-width: 2;
763
+ }
764
+
765
+ .sf-chart__legend {
766
+ align-items: center;
767
+ display: flex;
768
+ flex-wrap: wrap;
769
+ gap: var(--sf-space-xs);
770
+ }
771
+
772
+ .sf-chart__legend-item {
773
+ align-items: center;
774
+ color: var(--sf-colour-muted);
775
+ display: inline-flex;
776
+ gap: var(--sf-space-3xs);
777
+ }
778
+
779
+ .sf-chart__swatch {
780
+ aspect-ratio: 1;
781
+ background: var(--sf-chart-accent);
782
+ border-radius: var(--sf-radius-full);
783
+ display: inline-block;
784
+ inline-size: .75rem;
785
+ }
786
+
787
+ .sf-meter-list {
788
+ display: grid;
789
+ gap: var(--sf-space-xs);
790
+ }
791
+
792
+ .sf-meter-row {
793
+ display: grid;
794
+ gap: var(--sf-space-3xs);
795
+ }
796
+
797
+ .sf-meter {
798
+ accent-color: var(--sf-chart-accent, var(--sf-colour-primary));
799
+ block-size: .625rem;
800
+ border-radius: var(--sf-radius-full);
801
+ inline-size: 100%;
802
+ overflow: hidden;
803
+ }
804
+
805
+ .sf-nav {
806
+ align-items: center;
807
+ display: flex;
808
+ flex-wrap: wrap;
809
+ gap: var(--sf-nav-gap);
810
+ justify-content: space-between;
811
+ }
812
+
813
+ .sf-nav__list {
814
+ align-items: center;
815
+ display: flex;
816
+ flex-wrap: wrap;
817
+ gap: var(--sf-nav-gap);
818
+ list-style: none;
819
+ padding-inline-start: 0;
820
+ }
821
+
822
+ .sf-nav__link {
823
+ border-radius: var(--sf-nav-link-radius);
824
+ color: var(--sf-colour-muted);
825
+ display: inline-flex;
826
+ align-items: center;
827
+ font-size: var(--sf-step--1);
828
+ font-weight: 700;
829
+ gap: var(--sf-space-2xs);
830
+ padding-block: var(--sf-space-3xs);
831
+ padding-inline: var(--sf-space-2xs);
832
+ text-decoration: none;
833
+ transition: background-color var(--sf-duration-fast) var(--sf-ease-standard), color var(--sf-duration-fast) var(--sf-ease-standard);
834
+ }
835
+
836
+ .sf-nav__link:hover,
837
+ .sf-nav__link[aria-current="page"],
838
+ .sf-nav__link[aria-current="true"],
839
+ .sf-nav__link[aria-selected="true"] {
840
+ background: var(--sf-colour-surface-alt);
841
+ color: var(--sf-colour-foreground);
842
+ }
843
+
844
+ .sf-app-sidebar .sf-kicker {
845
+ inline-size: 100%;
846
+ text-align: start;
847
+ }
848
+
849
+ .sf-app-sidebar .sf-nav {
850
+ align-items: stretch;
851
+ flex-direction: column;
852
+ justify-content: flex-start;
853
+ }
854
+
855
+ .sf-app-sidebar .sf-nav__list {
856
+ align-items: stretch;
857
+ flex-direction: column;
858
+ inline-size: 100%;
859
+ margin-block: 0;
860
+ padding-inline-start: var(--sf-space-2xs);
861
+ }
862
+
863
+ .sf-app-sidebar .sf-nav__list > li {
864
+ inline-size: 100%;
865
+ }
866
+
867
+ .sf-app-sidebar .sf-nav__link {
868
+ --sf-icon-size: var(--sf-step-0);
869
+ gap: var(--sf-space-xs);
870
+ inline-size: 100%;
871
+ justify-content: flex-start;
872
+ min-block-size: 2.5rem;
873
+ padding-block: var(--sf-space-2xs);
874
+ padding-inline: var(--sf-space-xs);
875
+ text-align: start;
876
+ }
877
+
878
+ .sf-form {
879
+ display: grid;
880
+ gap: var(--sf-form-gap, var(--sf-space-s-m));
881
+ }
882
+
883
+ .sf-fieldset {
884
+ border: 1px solid var(--sf-colour-border);
885
+ border-radius: var(--sf-radius-panel);
886
+ display: grid;
887
+ gap: var(--sf-space-s);
888
+ padding: var(--sf-space-s-m);
889
+ }
890
+
891
+ .sf-fieldset > legend {
892
+ color: var(--sf-colour-foreground);
893
+ font-weight: 800;
894
+ padding-inline: var(--sf-space-2xs);
895
+ }
896
+
897
+ .sf-field {
898
+ display: grid;
899
+ gap: var(--sf-space-2xs);
900
+ }
901
+
902
+ .sf-label,
903
+ .sf-field > label {
904
+ color: var(--sf-colour-muted);
905
+ font-size: var(--sf-step--1);
906
+ font-weight: 700;
907
+ }
908
+
909
+ .sf-required,
910
+ .sf-label[aria-required="true"],
911
+ .sf-field > label:has(+ :required) {
912
+ color: var(--sf-colour-foreground);
913
+ }
914
+
915
+ .sf-required::after,
916
+ .sf-label[aria-required="true"]::after,
917
+ .sf-field > label:has(+ :required)::after {
918
+ color: var(--sf-colour-danger);
919
+ content: " *";
920
+ }
921
+
922
+ .sf-help {
923
+ color: var(--sf-colour-subtle);
924
+ font-size: var(--sf-step--1);
925
+ line-height: 1.4;
926
+ }
927
+
928
+ .sf-error {
929
+ color: var(--sf-colour-danger);
930
+ font-size: var(--sf-step--1);
931
+ font-weight: 700;
932
+ line-height: 1.4;
933
+ }
934
+
935
+ .sf-input,
936
+ .sf-select,
937
+ .sf-textarea {
938
+ background: var(--sf-input-bg);
939
+ border: 1px solid var(--sf-input-border);
940
+ border-radius: var(--sf-input-radius);
941
+ color: var(--sf-colour-foreground);
942
+ inline-size: 100%;
943
+ min-block-size: var(--sf-input-block-size);
944
+ padding-inline: var(--sf-input-padding-inline);
945
+ transition: background-color var(--sf-duration-fast) var(--sf-ease-standard), border-color var(--sf-duration-fast) var(--sf-ease-standard), box-shadow var(--sf-duration-fast) var(--sf-ease-standard);
946
+ }
947
+
948
+ .sf-textarea {
949
+ min-block-size: var(--sf-textarea-block-size, 8rem);
950
+ padding-block: var(--sf-space-xs);
951
+ }
952
+
953
+ .sf-select {
954
+ appearance: none;
955
+ background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);
956
+ background-position: calc(100% - 1rem) 50%, calc(100% - .7rem) 50%;
957
+ background-repeat: no-repeat;
958
+ background-size: .35rem .35rem, .35rem .35rem;
959
+ padding-inline-end: var(--sf-space-l);
960
+ }
961
+
962
+ :where(.sf-input, .sf-select, .sf-textarea)::placeholder {
963
+ color: var(--sf-colour-subtle);
964
+ }
965
+
966
+ :where(.sf-input, .sf-select, .sf-textarea):hover {
967
+ border-color: var(--sf-colour-border-strong);
968
+ }
969
+
970
+ :where(.sf-input, .sf-select, .sf-textarea):focus-visible {
971
+ border-color: var(--sf-colour-ring);
972
+ box-shadow: 0 0 0 0.25rem color-mix(in oklch, var(--sf-colour-ring) 18%, transparent);
973
+ outline: 0.125rem solid color-mix(in oklch, var(--sf-colour-ring) 24%, transparent);
974
+ outline-offset: 0;
975
+ }
976
+
977
+ :where(.sf-input, .sf-select, .sf-textarea)[aria-invalid="true"],
978
+ .sf-field[data-invalid="true"] :where(.sf-input, .sf-select, .sf-textarea) {
979
+ --sf-input-border: var(--sf-colour-danger);
980
+ border-color: var(--sf-colour-danger);
981
+ box-shadow: 0 0 0 0.25rem var(--sf-colour-danger-soft);
982
+ }
983
+
984
+ .sf-field[data-invalid="true"] :where(.sf-label, label),
985
+ .sf-field[data-invalid="true"] .sf-help {
986
+ color: var(--sf-colour-danger);
987
+ }
988
+
989
+ :where(.sf-input, .sf-select, .sf-textarea):disabled {
990
+ background: var(--sf-colour-surface-alt);
991
+ color: var(--sf-colour-subtle);
992
+ opacity: .72;
993
+ }
994
+
995
+ :where(.sf-input, .sf-select, .sf-textarea)[aria-busy="true"],
996
+ :where(.sf-input, .sf-select, .sf-textarea)[data-loading="true"] {
997
+ cursor: progress;
998
+ opacity: .78;
999
+ }
1000
+
1001
+ .sf-check {
1002
+ align-items: start;
1003
+ display: grid;
1004
+ gap: var(--sf-space-2xs);
1005
+ grid-template-columns: auto 1fr;
1006
+ }
1007
+
1008
+ .sf-check > :where(input[type="checkbox"], input[type="radio"]) {
1009
+ accent-color: var(--sf-colour-primary);
1010
+ block-size: 1.1em;
1011
+ inline-size: 1.1em;
1012
+ margin-block-start: .2em;
1013
+ }
1014
+
1015
+ .sf-alert {
1016
+ background: var(--sf-alert-bg, var(--sf-colour-info-soft));
1017
+ border: 1px solid var(--sf-alert-border, color-mix(in oklch, var(--sf-colour-info) 32%, transparent));
1018
+ border-radius: var(--sf-alert-radius);
1019
+ color: var(--sf-alert-colour, var(--sf-colour-foreground));
1020
+ display: grid;
1021
+ gap: var(--sf-space-2xs);
1022
+ padding: var(--sf-alert-padding);
1023
+ }
1024
+
1025
+ .sf-alert__title {
1026
+ font-weight: 800;
1027
+ }
1028
+
1029
+ .sf-alert--info,
1030
+ .sf-alert[data-variant="info"] {
1031
+ --sf-alert-bg: var(--sf-colour-info-soft);
1032
+ --sf-alert-border: color-mix(in oklch, var(--sf-colour-info) 32%, transparent);
1033
+ }
1034
+
1035
+ .sf-alert--success,
1036
+ .sf-alert[data-variant="success"] {
1037
+ --sf-alert-bg: var(--sf-colour-success-soft);
1038
+ --sf-alert-border: color-mix(in oklch, var(--sf-colour-success) 32%, transparent);
1039
+ }
1040
+
1041
+ .sf-alert--warning,
1042
+ .sf-alert[data-variant="warning"] {
1043
+ --sf-alert-bg: var(--sf-colour-warning-soft);
1044
+ --sf-alert-border: color-mix(in oklch, var(--sf-colour-warning) 38%, transparent);
1045
+ }
1046
+
1047
+ .sf-alert--danger,
1048
+ .sf-alert[data-variant="danger"] {
1049
+ --sf-alert-bg: var(--sf-colour-danger-soft);
1050
+ --sf-alert-border: color-mix(in oklch, var(--sf-colour-danger) 34%, transparent);
1051
+ }
1052
+
1053
+ .sf-dialog {
1054
+ background: var(--sf-colour-surface);
1055
+ border: 1px solid var(--sf-colour-border);
1056
+ border-radius: var(--sf-radius-panel);
1057
+ box-shadow: var(--sf-shadow-xl);
1058
+ color: var(--sf-colour-foreground);
1059
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-dialog-width, 42rem));
1060
+ max-block-size: min(100% - (var(--sf-gutter) * 2), 42rem);
1061
+ overflow: auto;
1062
+ padding: 0;
1063
+ }
1064
+
1065
+ .sf-dialog::backdrop,
1066
+ .sf-popover::backdrop,
1067
+ .sf-drawer::backdrop {
1068
+ background: oklch(0% 0 0 / 0.48);
1069
+ }
1070
+
1071
+ .sf-dialog__header,
1072
+ .sf-dialog__body,
1073
+ .sf-dialog__footer {
1074
+ padding: var(--sf-space-s-m);
1075
+ }
1076
+
1077
+ .sf-dialog__header,
1078
+ .sf-dialog__footer {
1079
+ display: flex;
1080
+ flex-wrap: wrap;
1081
+ gap: var(--sf-space-s);
1082
+ justify-content: space-between;
1083
+ }
1084
+
1085
+ .sf-dialog__header {
1086
+ border-block-end: 1px solid var(--sf-colour-border);
1087
+ }
1088
+
1089
+ .sf-dialog__footer {
1090
+ border-block-start: 1px solid var(--sf-colour-border);
1091
+ justify-content: flex-end;
1092
+ }
1093
+
1094
+ .sf-popover,
1095
+ .sf-menu-popover,
1096
+ .sf-tooltip,
1097
+ .sf-toast,
1098
+ .sf-banner,
1099
+ .sf-drawer {
1100
+ background: var(--sf-colour-surface);
1101
+ border: 1px solid var(--sf-colour-border);
1102
+ border-radius: var(--sf-radius-panel);
1103
+ box-shadow: var(--sf-shadow-lg);
1104
+ color: var(--sf-colour-foreground);
1105
+ inset: unset;
1106
+ margin: 0;
1107
+ max-block-size: calc(100dvh - (var(--sf-space-s) * 2));
1108
+ overflow: auto;
1109
+ padding: var(--sf-space-s);
1110
+ }
1111
+
1112
+ :where(.sf-popover, .sf-menu-popover, .sf-tooltip, .sf-toast, .sf-banner, .sf-drawer)[popover] {
1113
+ display: none;
1114
+ }
1115
+
1116
+ :where(.sf-popover, .sf-menu-popover, .sf-tooltip, .sf-toast, .sf-banner, .sf-drawer):popover-open {
1117
+ display: grid;
1118
+ gap: var(--sf-space-xs);
1119
+ }
1120
+
1121
+ .sf-popover {
1122
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-popover-width, 22rem));
1123
+ }
1124
+
1125
+ .sf-menu-popover,
1126
+ .sf-menu {
1127
+ display: grid;
1128
+ gap: var(--sf-space-2xs);
1129
+ min-inline-size: var(--sf-menu-min, 12rem);
1130
+ }
1131
+
1132
+ .sf-menu :where(a, button),
1133
+ .sf-menu-popover :where(a, button) {
1134
+ border-radius: var(--sf-radius-sm);
1135
+ color: inherit;
1136
+ padding-block: var(--sf-space-3xs);
1137
+ padding-inline: var(--sf-space-2xs);
1138
+ text-align: start;
1139
+ text-decoration: none;
1140
+ }
1141
+
1142
+ .sf-menu :where(a, button):hover,
1143
+ .sf-menu-popover :where(a, button):hover {
1144
+ background: var(--sf-colour-surface-alt);
1145
+ }
1146
+
1147
+ .sf-tooltip {
1148
+ border-radius: var(--sf-radius-md);
1149
+ box-shadow: var(--sf-shadow-md);
1150
+ font-size: var(--sf-step--1);
1151
+ inline-size: max-content;
1152
+ max-inline-size: min(22rem, calc(100vw - (var(--sf-gutter) * 2)));
1153
+ padding-block: var(--sf-space-2xs);
1154
+ padding-inline: var(--sf-space-xs);
1155
+ }
1156
+
1157
+ .sf-tooltip-trigger {
1158
+ border-block-end: 0.08em dotted currentColor;
1159
+ cursor: help;
1160
+ text-decoration: none;
1161
+ }
1162
+
1163
+ .sf-toast {
1164
+ block-size: auto;
1165
+ bottom: auto;
1166
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-toast-width, 24rem));
1167
+ left: auto;
1168
+ position: fixed;
1169
+ right: var(--sf-space-s);
1170
+ top: var(--sf-space-s);
1171
+ }
1172
+
1173
+ .sf-banner {
1174
+ block-size: auto;
1175
+ border-radius: var(--sf-radius-lg);
1176
+ bottom: auto;
1177
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-banner-width, 64rem));
1178
+ left: var(--sf-space-s);
1179
+ margin-inline: auto;
1180
+ position: fixed;
1181
+ right: var(--sf-space-s);
1182
+ top: var(--sf-space-s);
1183
+ }
1184
+
1185
+ .sf-drawer {
1186
+ block-size: 100dvh;
1187
+ border-radius: 0;
1188
+ inline-size: min(100%, var(--sf-drawer-width, 24rem));
1189
+ max-block-size: 100dvh;
1190
+ overflow: auto;
1191
+ position: fixed;
1192
+ top: 0;
1193
+ bottom: 0;
1194
+ }
1195
+
1196
+ .sf-drawer--left {
1197
+ left: 0;
1198
+ right: auto;
1199
+ }
1200
+
1201
+ .sf-drawer--right {
1202
+ left: auto;
1203
+ right: 0;
1204
+ }
1205
+
1206
+ .sf-drawer--bottom {
1207
+ block-size: auto;
1208
+ border-start-start-radius: var(--sf-radius-panel);
1209
+ border-start-end-radius: var(--sf-radius-panel);
1210
+ inline-size: 100%;
1211
+ left: 0;
1212
+ right: 0;
1213
+ top: auto;
1214
+ bottom: 0;
1215
+ max-block-size: min(80dvh, 42rem);
1216
+ }
1217
+
1218
+ .sf-drawer--stack {
1219
+ flex-direction: column;
1220
+ gap: var(--sf-space-s);
1221
+ }
1222
+
1223
+ .sf-drawer--stack:not([popover]),
1224
+ .sf-drawer--stack:popover-open {
1225
+ display: flex;
1226
+ }
1227
+
1228
+ @supports (anchor-name: --sf-anchor) {
1229
+ .sf-tooltip-trigger,
1230
+ [data-sf-anchor] {
1231
+ anchor-name: var(--sf-anchor-name, --sf-anchor);
1232
+ }
1233
+
1234
+ .sf-tooltip,
1235
+ .sf-popover,
1236
+ .sf-menu-popover {
1237
+ position-anchor: var(--sf-anchor-name, --sf-anchor);
1238
+ position-area: block-end span-inline-end;
1239
+ position-try-fallbacks: flip-block, flip-inline;
1240
+ }
1241
+ }
1242
+
1243
+ .sf-disclosure,
1244
+ .sf-accordion {
1245
+ display: grid;
1246
+ gap: var(--sf-space-xs);
1247
+ }
1248
+
1249
+ .sf-disclosure > details,
1250
+ details.sf-disclosure,
1251
+ .sf-accordion > details {
1252
+ background: var(--sf-colour-surface);
1253
+ border: 1px solid var(--sf-colour-border);
1254
+ border-radius: var(--sf-radius-lg);
1255
+ padding: var(--sf-space-s);
1256
+ }
1257
+
1258
+ .sf-disclosure summary,
1259
+ .sf-accordion summary {
1260
+ cursor: pointer;
1261
+ font-weight: 800;
1262
+ }
1263
+
1264
+ .sf-disclosure :where(details[open]),
1265
+ details.sf-disclosure[open],
1266
+ .sf-accordion details[open] {
1267
+ border-color: color-mix(in oklch, var(--sf-colour-primary) 30%, var(--sf-colour-border));
1268
+ box-shadow: var(--sf-shadow-sm);
1269
+ }
1270
+
1271
+ .sf-tabs {
1272
+ display: grid;
1273
+ gap: var(--sf-space-s);
1274
+ }
1275
+
1276
+ .sf-tab-list {
1277
+ align-items: center;
1278
+ border-block-end: 1px solid var(--sf-colour-border);
1279
+ display: flex;
1280
+ flex-wrap: wrap;
1281
+ gap: var(--sf-space-2xs);
1282
+ }
1283
+
1284
+ .sf-tab {
1285
+ border-block-end: 0.125rem solid transparent;
1286
+ color: var(--sf-colour-muted);
1287
+ display: inline-flex;
1288
+ font-weight: 800;
1289
+ padding-block: var(--sf-space-xs);
1290
+ padding-inline: var(--sf-space-s);
1291
+ text-decoration: none;
1292
+ }
1293
+
1294
+ .sf-tab:hover,
1295
+ .sf-tab[aria-selected="true"],
1296
+ .sf-tab[data-state="active"] {
1297
+ border-block-end-color: var(--sf-colour-primary);
1298
+ color: var(--sf-colour-foreground);
1299
+ }
1300
+
1301
+ .sf-tab-panel {
1302
+ background: var(--sf-colour-surface);
1303
+ border: 1px solid var(--sf-colour-border);
1304
+ border-radius: var(--sf-radius-panel);
1305
+ padding: var(--sf-space-s-m);
1306
+ }
1307
+
1308
+ .sf-tabs > input[type="radio"] {
1309
+ position: absolute;
1310
+ opacity: 0;
1311
+ pointer-events: none;
1312
+ }
1313
+
1314
+ .sf-tabs > input[type="radio"] ~ .sf-tab-panels > .sf-tab-panel {
1315
+ display: none;
1316
+ }
1317
+
1318
+ .sf-tabs > input[type="radio"]:nth-of-type(1):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(1),
1319
+ .sf-tabs > input[type="radio"]:nth-of-type(2):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(2),
1320
+ .sf-tabs > input[type="radio"]:nth-of-type(3):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(3),
1321
+ .sf-tabs > input[type="radio"]:nth-of-type(4):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(4),
1322
+ .sf-tabs > input[type="radio"]:nth-of-type(5):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(5) {
1323
+ display: block;
1324
+ }
1325
+
1326
+ .sf-nav--mobile {
1327
+ align-items: center;
1328
+ display: flex;
1329
+ gap: var(--sf-space-s);
1330
+ justify-content: space-between;
1331
+ }
1332
+
1333
+ .sf-breadcrumb,
1334
+ .sf-pagination {
1335
+ align-items: center;
1336
+ display: flex;
1337
+ flex-wrap: wrap;
1338
+ gap: var(--sf-space-2xs);
1339
+ list-style: none;
1340
+ padding-inline-start: 0;
1341
+ }
1342
+
1343
+ .sf-breadcrumb a,
1344
+ .sf-pagination a,
1345
+ .sf-pagination [aria-current="page"] {
1346
+ border-radius: var(--sf-radius-sm);
1347
+ color: var(--sf-colour-muted);
1348
+ display: inline-flex;
1349
+ font-size: var(--sf-step--1);
1350
+ font-weight: 700;
1351
+ padding-block: var(--sf-space-3xs);
1352
+ padding-inline: var(--sf-space-2xs);
1353
+ text-decoration: none;
1354
+ }
1355
+
1356
+ .sf-breadcrumb li + li::before {
1357
+ color: var(--sf-colour-subtle);
1358
+ content: "/";
1359
+ margin-inline-end: var(--sf-space-2xs);
1360
+ }
1361
+
1362
+ .sf-pagination a:hover,
1363
+ .sf-pagination [aria-current="page"] {
1364
+ background: var(--sf-colour-surface-alt);
1365
+ color: var(--sf-colour-foreground);
1366
+ }
1367
+
1368
+ @media (forced-colors: active) {
1369
+ :where(.sf-button, .sf-card, .sf-surface, .sf-alert, .sf-price-card, .sf-testimonial, .sf-faq__item, .sf-input, .sf-select, .sf-textarea, .sf-dialog, .sf-popover, .sf-tooltip, .sf-toast, .sf-banner, .sf-drawer, .sf-disclosure > details, details.sf-disclosure, .sf-accordion > details, .sf-tab-panel) {
1370
+ border-color: ButtonText;
1371
+ forced-color-adjust: auto;
1372
+ }
1373
+
1374
+ .sf-button {
1375
+ background: ButtonFace;
1376
+ color: ButtonText;
1377
+ }
1378
+
1379
+ .sf-button--default,
1380
+ .sf-button[data-variant="default"] {
1381
+ background: Highlight;
1382
+ border-color: Highlight;
1383
+ color: HighlightText;
1384
+ }
1385
+
1386
+ :where(.sf-input, .sf-select, .sf-textarea)[aria-invalid="true"],
1387
+ .sf-field[data-invalid="true"] :where(.sf-input, .sf-select, .sf-textarea) {
1388
+ border-color: Mark;
1389
+ box-shadow: none;
1390
+ }
1391
+ }
1392
+ }