@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/styles.css ADDED
@@ -0,0 +1,2313 @@
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 tokens {
4
+ :root {
5
+ color-scheme: light;
6
+
7
+ --sf-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
8
+ --sf-font-display: Fraunces, Georgia, "Times New Roman", serif;
9
+ --sf-font-mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
10
+
11
+ --sf-step--2: clamp(0.6944rem, 0.6866rem + 0.0348vw, 0.72rem);
12
+ --sf-step--1: clamp(0.8333rem, 0.8129rem + 0.0907vw, 0.9rem);
13
+ --sf-step-0: clamp(1rem, 0.9617rem + 0.1701vw, 1.125rem);
14
+ --sf-step-1: clamp(1.2rem, 1.1369rem + 0.2806vw, 1.4063rem);
15
+ --sf-step-2: clamp(1.44rem, 1.3427rem + 0.4324vw, 1.7578rem);
16
+ --sf-step-3: clamp(1.728rem, 1.5843rem + 0.6385vw, 2.1973rem);
17
+ --sf-step-4: clamp(2.0736rem, 1.8676rem + 0.9156vw, 2.7466rem);
18
+ --sf-step-5: clamp(2.4883rem, 2.1991rem + 1.2856vw, 3.4332rem);
19
+ --sf-step-6: clamp(2.986rem, 2.5863rem + 1.7763vw, 4.2915rem);
20
+ --sf-step-7: clamp(3.5832rem, 3.0379rem + 2.4235vw, 5.3644rem);
21
+ --sf-step-8: clamp(4.2998rem, 3.5634rem + 3.2731vw, 6.7055rem);
22
+ --sf-type-caption: var(--sf-step--1);
23
+ --sf-type-body: var(--sf-step-0);
24
+ --sf-type-lead: var(--sf-step-1);
25
+ --sf-type-h6: var(--sf-step-1);
26
+ --sf-type-h5: var(--sf-step-2);
27
+ --sf-type-h4: var(--sf-step-3);
28
+ --sf-type-h3: var(--sf-step-4);
29
+ --sf-type-h2: var(--sf-step-5);
30
+ --sf-type-h1: var(--sf-step-6);
31
+ --sf-type-title: var(--sf-step-4);
32
+ --sf-type-display: var(--sf-step-7);
33
+ --sf-line-height-tight: 1;
34
+ --sf-line-height-heading: 1.08;
35
+ --sf-line-height-body: 1.5;
36
+ --sf-line-height-loose: 1.7;
37
+
38
+ --sf-space-3xs: clamp(0.25rem, 0.2404rem + 0.0425vw, 0.2813rem);
39
+ --sf-space-2xs: clamp(0.5rem, 0.4809rem + 0.085vw, 0.5625rem);
40
+ --sf-space-xs: clamp(0.75rem, 0.7213rem + 0.1276vw, 0.8438rem);
41
+ --sf-space-s: clamp(1rem, 0.9617rem + 0.1701vw, 1.125rem);
42
+ --sf-space-m: clamp(1.5rem, 1.4426rem + 0.2551vw, 1.6875rem);
43
+ --sf-space-l: clamp(2rem, 1.9235rem + 0.3401vw, 2.25rem);
44
+ --sf-space-xl: clamp(3rem, 2.8852rem + 0.5102vw, 3.375rem);
45
+ --sf-space-2xl: clamp(4rem, 3.8469rem + 0.6803vw, 4.5rem);
46
+ --sf-space-3xl: clamp(6rem, 5.7704rem + 1.0204vw, 6.75rem);
47
+ --sf-space-4xl: clamp(8rem, 7.6939rem + 1.3605vw, 9rem);
48
+ --sf-space-3xs-2xs: clamp(0.25rem, 0.1543rem + 0.4252vw, 0.5625rem);
49
+ --sf-space-2xs-xs: clamp(0.5rem, 0.3948rem + 0.4677vw, 0.8438rem);
50
+ --sf-space-xs-s: clamp(0.75rem, 0.6352rem + 0.5102vw, 1.125rem);
51
+ --sf-space-s-m: clamp(1rem, 0.7895rem + 0.9354vw, 1.6875rem);
52
+ --sf-space-m-l: clamp(1.5rem, 1.2704rem + 1.0204vw, 2.25rem);
53
+ --sf-space-l-xl: clamp(2rem, 1.5791rem + 1.8707vw, 3.375rem);
54
+ --sf-space-xl-2xl: clamp(3rem, 2.5408rem + 2.0408vw, 4.5rem);
55
+ --sf-space-2xl-3xl: clamp(4rem, 3.1582rem + 3.7415vw, 6.75rem);
56
+ --sf-space-s-l: clamp(1rem, 0.6173rem + 1.7007vw, 2.25rem);
57
+ --sf-space-m-xl: clamp(1.5rem, 0.926rem + 2.551vw, 3.375rem);
58
+ --sf-space-l-2xl: clamp(2rem, 1.2347rem + 3.4014vw, 4.5rem);
59
+ --sf-gutter: var(--sf-space-s-l);
60
+ --sf-region: var(--sf-space-xl-2xl);
61
+ --sf-container-max: 90rem;
62
+ --sf-container-narrow: 48rem;
63
+ --sf-container-wide: 108rem;
64
+ --sf-grid-columns: 12;
65
+
66
+ --sf-radius-none: 0;
67
+ --sf-radius-xs: 0.25rem;
68
+ --sf-radius-sm: 0.375rem;
69
+ --sf-radius-md: 0.5rem;
70
+ --sf-radius-lg: 0.75rem;
71
+ --sf-radius-xl: 1rem;
72
+ --sf-radius-2xl: 1.25rem;
73
+ --sf-radius-3xl: 1.5rem;
74
+ --sf-radius-full: 999rem;
75
+ --sf-radius-control: var(--sf-radius-md);
76
+ --sf-radius-panel: var(--sf-radius-lg);
77
+
78
+ --sf-colour-neutral-0: oklch(100% 0 0);
79
+ --sf-colour-neutral-50: oklch(98.6% 0.006 80);
80
+ --sf-colour-neutral-100: oklch(96.4% 0.011 80);
81
+ --sf-colour-neutral-200: oklch(90.8% 0.014 78);
82
+ --sf-colour-neutral-300: oklch(82% 0.018 76);
83
+ --sf-colour-neutral-400: oklch(68% 0.018 246);
84
+ --sf-colour-neutral-500: oklch(53% 0.018 244);
85
+ --sf-colour-neutral-600: oklch(43% 0.02 244);
86
+ --sf-colour-neutral-700: oklch(34% 0.02 244);
87
+ --sf-colour-neutral-800: oklch(27% 0.022 246);
88
+ --sf-colour-neutral-850: oklch(22% 0.024 248);
89
+ --sf-colour-neutral-900: oklch(18% 0.026 250);
90
+ --sf-colour-neutral-950: oklch(13.5% 0.03 252);
91
+ --sf-colour-amber-500: oklch(78% 0.15 82);
92
+ --sf-colour-amber-700: oklch(54% 0.13 74);
93
+ --sf-colour-orange-500: oklch(74% 0.17 48);
94
+ --sf-colour-orange-600: oklch(68% 0.18 44);
95
+ --sf-colour-orange-700: oklch(58% 0.17 42);
96
+ --sf-colour-green-500: oklch(62% 0.13 150);
97
+ --sf-colour-green-600: oklch(54% 0.13 150);
98
+ --sf-colour-green-700: oklch(44% 0.12 150);
99
+ --sf-colour-cyan-500: oklch(70% 0.12 205);
100
+ --sf-colour-cyan-600: oklch(58% 0.12 210);
101
+ --sf-colour-blue-600: oklch(52% 0.14 250);
102
+ --sf-colour-red-600: oklch(56% 0.2 28);
103
+ --sf-colour-red-700: oklch(47% 0.19 28);
104
+ --sf-colour-background: var(--sf-colour-neutral-50);
105
+ --sf-colour-foreground: var(--sf-colour-neutral-900);
106
+ --sf-colour-muted: var(--sf-colour-neutral-700);
107
+ --sf-colour-subtle: var(--sf-colour-neutral-500);
108
+ --sf-colour-surface: var(--sf-colour-neutral-0);
109
+ --sf-colour-surface-alt: var(--sf-colour-neutral-100);
110
+ --sf-colour-surface-raised: var(--sf-colour-neutral-0);
111
+ --sf-colour-surface-inset: var(--sf-colour-neutral-100);
112
+ --sf-colour-border: oklch(18% 0.026 250 / 0.12);
113
+ --sf-colour-border-strong: oklch(18% 0.026 250 / 0.22);
114
+ --sf-colour-primary: var(--sf-colour-orange-600);
115
+ --sf-colour-primary-hover: var(--sf-colour-orange-700);
116
+ --sf-colour-primary-foreground: var(--sf-colour-neutral-0);
117
+ --sf-colour-primary-soft: oklch(68% 0.18 44 / 0.12);
118
+ --sf-colour-primary-soft-border: oklch(68% 0.18 44 / 0.28);
119
+ --sf-colour-link: var(--sf-colour-orange-700);
120
+ --sf-colour-link-hover: var(--sf-colour-orange-600);
121
+ --sf-colour-accent: var(--sf-colour-cyan-500);
122
+ --sf-colour-accent-foreground: var(--sf-colour-neutral-950);
123
+ --sf-colour-success: var(--sf-colour-green-500);
124
+ --sf-colour-success-foreground: var(--sf-colour-neutral-0);
125
+ --sf-colour-success-soft: oklch(62% 0.13 150 / 0.12);
126
+ --sf-colour-warning: var(--sf-colour-amber-500);
127
+ --sf-colour-warning-foreground: var(--sf-colour-neutral-950);
128
+ --sf-colour-warning-soft: oklch(78% 0.15 82 / 0.16);
129
+ --sf-colour-danger: var(--sf-colour-red-600);
130
+ --sf-colour-danger-foreground: var(--sf-colour-neutral-0);
131
+ --sf-colour-danger-soft: oklch(56% 0.2 28 / 0.12);
132
+ --sf-colour-info: var(--sf-colour-cyan-600);
133
+ --sf-colour-info-foreground: var(--sf-colour-neutral-0);
134
+ --sf-colour-info-soft: oklch(70% 0.12 205 / 0.14);
135
+ --sf-colour-ring: var(--sf-colour-orange-600);
136
+
137
+ --sf-shadow-sm: 0 0.125rem 0.375rem oklch(0% 0 0 / 0.08);
138
+ --sf-shadow-md: 0 0.75rem 1.75rem oklch(0% 0 0 / 0.12);
139
+ --sf-shadow-lg: 0 1.25rem 3rem oklch(0% 0 0 / 0.16);
140
+ --sf-shadow-xl: 0 1.75rem 4rem oklch(0% 0 0 / 0.18);
141
+ --sf-shadow-inset: inset 0 0 0 1px var(--sf-colour-border);
142
+ --sf-shadow-glow: 0 0 2rem oklch(68% 0.18 44 / 0.24);
143
+ --sf-duration-fast: 150ms;
144
+ --sf-duration-normal: 220ms;
145
+ --sf-duration-slow: 360ms;
146
+ --sf-ease-standard: cubic-bezier(.2, 0, 0, 1);
147
+ --sf-ease-emphasized: cubic-bezier(.16, 1, .3, 1);
148
+
149
+ --sf-button-radius: var(--sf-radius-md);
150
+ --sf-button-block-size: 2.75rem;
151
+ --sf-button-padding-inline: var(--sf-space-s);
152
+ --sf-card-radius: var(--sf-radius-lg);
153
+ --sf-card-padding: var(--sf-space-m-l);
154
+ --sf-input-radius: var(--sf-radius-md);
155
+ --sf-input-block-size: 2.75rem;
156
+ --sf-input-padding-inline: var(--sf-space-s);
157
+ --sf-input-border: var(--sf-colour-border);
158
+ --sf-input-bg: var(--sf-colour-surface);
159
+ --sf-alert-radius: var(--sf-radius-lg);
160
+ --sf-alert-padding: var(--sf-space-s-m);
161
+ --sf-nav-gap: var(--sf-space-xs-s);
162
+ --sf-nav-link-radius: var(--sf-radius-sm);
163
+ --sf-icon-size: 1em;
164
+ --sf-icon-stroke: 2;
165
+ }
166
+
167
+ :where(.sf-theme-light, [data-sf-theme="light"]) {
168
+ color-scheme: light;
169
+ --sf-colour-background: var(--sf-colour-neutral-50);
170
+ --sf-colour-foreground: var(--sf-colour-neutral-900);
171
+ --sf-colour-muted: var(--sf-colour-neutral-700);
172
+ --sf-colour-subtle: var(--sf-colour-neutral-500);
173
+ --sf-colour-surface: var(--sf-colour-neutral-0);
174
+ --sf-colour-surface-alt: var(--sf-colour-neutral-100);
175
+ --sf-colour-surface-raised: var(--sf-colour-neutral-0);
176
+ --sf-colour-surface-inset: var(--sf-colour-neutral-100);
177
+ --sf-colour-border: oklch(18% 0.026 250 / 0.12);
178
+ --sf-colour-border-strong: oklch(18% 0.026 250 / 0.22);
179
+ --sf-colour-link: var(--sf-colour-orange-700);
180
+ --sf-colour-link-hover: var(--sf-colour-orange-600);
181
+ }
182
+
183
+ :where(.sf-theme-dark, [data-sf-theme="dark"]) {
184
+ color-scheme: dark;
185
+ --sf-colour-background: var(--sf-colour-neutral-950);
186
+ --sf-colour-foreground: oklch(96% 0.008 86);
187
+ --sf-colour-muted: oklch(78% 0.012 86);
188
+ --sf-colour-subtle: oklch(64% 0.014 86);
189
+ --sf-colour-surface: var(--sf-colour-neutral-900);
190
+ --sf-colour-surface-alt: var(--sf-colour-neutral-850);
191
+ --sf-colour-surface-raised: var(--sf-colour-neutral-850);
192
+ --sf-colour-surface-inset: var(--sf-colour-neutral-950);
193
+ --sf-colour-border: oklch(100% 0 0 / 0.14);
194
+ --sf-colour-border-strong: oklch(100% 0 0 / 0.24);
195
+ --sf-colour-link: var(--sf-colour-orange-500);
196
+ --sf-colour-link-hover: oklch(80% 0.14 50);
197
+ }
198
+ }
199
+ @layer reset {
200
+ *, *::before, *::after { box-sizing: border-box; }
201
+ *:where(:not(dialog)) { margin: 0; }
202
+ html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
203
+ body { min-block-size: 100%; }
204
+ img, picture, video, canvas, svg { display: block; max-inline-size: 100%; }
205
+ img, video { block-size: auto; }
206
+ input, button, textarea, select { font: inherit; }
207
+ button, input:where([type="button"], [type="submit"], [type="reset"]) { appearance: button; }
208
+ [hidden]:where(:not([hidden="until-found"])) { display: none !important; }
209
+ }
210
+ @layer base {
211
+ html {
212
+ background: var(--sf-colour-background);
213
+ color: var(--sf-colour-foreground);
214
+ scroll-behavior: smooth;
215
+ }
216
+
217
+ body {
218
+ background: var(--sf-colour-background);
219
+ color: var(--sf-colour-foreground);
220
+ font-family: var(--sf-font-sans);
221
+ font-size: var(--sf-type-body);
222
+ line-height: var(--sf-line-height-body);
223
+ -webkit-font-smoothing: antialiased;
224
+ text-rendering: optimizeLegibility;
225
+ }
226
+
227
+ :where(h1, h2, h3, h4, h5, h6) {
228
+ color: inherit;
229
+ font-family: var(--sf-font-display);
230
+ font-weight: 700;
231
+ line-height: var(--sf-line-height-tight);
232
+ text-wrap: balance;
233
+ }
234
+
235
+ :where(h1) { font-size: var(--sf-type-h1); }
236
+ :where(h2) { font-size: var(--sf-type-h2); }
237
+ :where(h3) { font-size: var(--sf-type-h3); }
238
+ :where(h4) { font-size: var(--sf-type-h4); }
239
+ :where(h5) { font-size: var(--sf-type-h5); }
240
+ :where(h6) { font-size: var(--sf-type-h6); }
241
+ :where(p, li, dd, figcaption) { text-wrap: pretty; }
242
+ :where(a) {
243
+ color: var(--sf-colour-link);
244
+ text-decoration-color: color-mix(in oklch, currentColor 55%, transparent);
245
+ text-decoration-skip-ink: auto;
246
+ text-decoration-thickness: .08em;
247
+ text-underline-offset: .18em;
248
+ }
249
+ :where(a:hover) { color: var(--sf-colour-link-hover); }
250
+ :where(strong, b) { font-weight: 800; }
251
+ :where(small) { font-size: var(--sf-step--1); }
252
+ :where(code, kbd, samp, pre) { font-family: var(--sf-font-mono); }
253
+ :where(:not(pre) > code, kbd) {
254
+ background: var(--sf-colour-surface-alt);
255
+ border: 1px solid var(--sf-colour-border);
256
+ border-radius: var(--sf-radius-sm);
257
+ font-size: .9em;
258
+ padding: .1em .35em;
259
+ }
260
+ :where(pre) {
261
+ background: var(--sf-colour-surface-inset);
262
+ border: 1px solid var(--sf-colour-border);
263
+ border-radius: var(--sf-radius-panel);
264
+ overflow-x: auto;
265
+ padding: var(--sf-space-s);
266
+ }
267
+ :where(hr) {
268
+ border: 0;
269
+ border-block-start: 1px solid var(--sf-colour-border);
270
+ margin-block: var(--sf-space-l);
271
+ }
272
+ :where(blockquote) {
273
+ border-inline-start: 0.25rem solid var(--sf-colour-primary);
274
+ color: var(--sf-colour-muted);
275
+ padding-inline-start: var(--sf-space-s);
276
+ }
277
+ :where(label) { cursor: pointer; }
278
+ :where(input, textarea, select) { color: inherit; }
279
+ :where(textarea) { resize: vertical; }
280
+ :where(button:not(:disabled), [role="button"]:not(:disabled), a[href]) { cursor: pointer; }
281
+ :where(button:disabled, input:disabled, textarea:disabled, select:disabled, [aria-disabled="true"]) { cursor: not-allowed; }
282
+ :where(:focus-visible) { outline: 0.125rem solid var(--sf-colour-ring); outline-offset: .2rem; }
283
+ :where(:target) { scroll-margin-block: var(--sf-space-l); }
284
+ ::selection { background: color-mix(in oklch, var(--sf-colour-primary) 28%, transparent); }
285
+
286
+ @media (prefers-reduced-motion: reduce) {
287
+ html { scroll-behavior: auto; }
288
+ *, *::before, *::after {
289
+ animation-duration: 0.01ms !important;
290
+ animation-iteration-count: 1 !important;
291
+ scroll-behavior: auto !important;
292
+ transition-duration: 0.01ms !important;
293
+ }
294
+ }
295
+
296
+ @media (forced-colors: active) {
297
+ :where(:focus-visible) {
298
+ outline: 2px solid Highlight;
299
+ outline-offset: .2rem;
300
+ }
301
+
302
+ ::selection {
303
+ background: Highlight;
304
+ color: HighlightText;
305
+ }
306
+ }
307
+ }
308
+ @layer layout {
309
+ .sf-container {
310
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-container-max));
311
+ margin-inline: auto;
312
+ }
313
+
314
+ .sf-container--narrow { --sf-container-max: var(--sf-container-narrow); }
315
+ .sf-container--wide { --sf-container-max: var(--sf-container-wide); }
316
+ .sf-container--full { --sf-container-max: 100%; }
317
+
318
+ .sf-rail-shell {
319
+ --sf-rail-size: 4.25rem;
320
+ min-block-size: 100svh;
321
+ }
322
+
323
+ .sf-rail-shell__body {
324
+ min-inline-size: 0;
325
+ }
326
+
327
+ .sf-rail-shell__rail {
328
+ align-items: center;
329
+ background:
330
+ repeating-linear-gradient(-45deg, color-mix(in oklch, var(--sf-colour-foreground) 9%, transparent) 0 .0625rem, transparent .0625rem .4375rem),
331
+ color-mix(in oklch, var(--sf-colour-background) 92%, black);
332
+ border-inline-end: 1px solid var(--sf-colour-border);
333
+ display: none;
334
+ justify-items: center;
335
+ }
336
+
337
+ .sf-rail-shell__mark,
338
+ .sf-rail-shell__label {
339
+ color: var(--sf-colour-primary);
340
+ font-weight: 900;
341
+ }
342
+
343
+ .sf-rail-shell__label {
344
+ font-family: var(--sf-font-mono);
345
+ font-size: var(--sf-step--2);
346
+ letter-spacing: .18em;
347
+ text-transform: uppercase;
348
+ transform: rotate(-90deg);
349
+ white-space: nowrap;
350
+ }
351
+
352
+ .sf-rail-shell__label::before {
353
+ background: currentColor;
354
+ block-size: .25rem;
355
+ border-radius: var(--sf-radius-full);
356
+ box-shadow: 0 0 .875rem currentColor;
357
+ content: "";
358
+ display: inline-block;
359
+ inline-size: .25rem;
360
+ margin-inline-end: var(--sf-space-xs);
361
+ }
362
+
363
+ .sf-section { padding-block: var(--sf-section-space, var(--sf-region)); }
364
+ .sf-section--compact { --sf-section-space: var(--sf-space-l-xl); }
365
+ .sf-section--spacious { --sf-section-space: var(--sf-space-2xl-3xl); }
366
+
367
+ .sf-stack {
368
+ display: flex;
369
+ flex-direction: column;
370
+ gap: var(--sf-stack-space, var(--sf-space-s));
371
+ }
372
+
373
+ .sf-stack--tight { --sf-stack-space: var(--sf-space-2xs-xs); }
374
+ .sf-stack--loose { --sf-stack-space: var(--sf-space-m-xl); }
375
+
376
+ .sf-flow > * + * { margin-block-start: var(--sf-flow-space, var(--sf-space-s)); }
377
+
378
+ .sf-cluster {
379
+ align-items: var(--sf-cluster-align, center);
380
+ display: flex;
381
+ flex-wrap: wrap;
382
+ gap: var(--sf-cluster-space, var(--sf-space-s));
383
+ justify-content: var(--sf-cluster-justify, flex-start);
384
+ }
385
+
386
+ .sf-repel {
387
+ align-items: center;
388
+ display: flex;
389
+ flex-wrap: wrap;
390
+ gap: var(--sf-space-s);
391
+ justify-content: space-between;
392
+ }
393
+
394
+ .sf-toolbar {
395
+ align-items: center;
396
+ display: flex;
397
+ flex-wrap: wrap;
398
+ gap: var(--sf-space-s);
399
+ justify-content: space-between;
400
+ }
401
+
402
+ .sf-app-shell {
403
+ background: var(--sf-colour-background);
404
+ color: var(--sf-colour-foreground);
405
+ display: grid;
406
+ grid-template-columns: minmax(14rem, var(--sf-app-sidebar-width, 16rem)) minmax(0, 1fr);
407
+ min-block-size: 100dvh;
408
+ }
409
+
410
+ .sf-app-sidebar {
411
+ align-self: start;
412
+ background: var(--sf-colour-surface);
413
+ border-inline-end: 1px solid var(--sf-colour-border);
414
+ display: flex;
415
+ flex-direction: column;
416
+ gap: var(--sf-space-s);
417
+ max-block-size: 100dvh;
418
+ min-block-size: 100dvh;
419
+ overflow: auto;
420
+ padding: var(--sf-space-s);
421
+ position: sticky;
422
+ inset-block-start: 0;
423
+ }
424
+
425
+ .sf-app-sidebar__brand {
426
+ align-items: center;
427
+ display: flex;
428
+ gap: var(--sf-space-xs);
429
+ padding-block-end: var(--sf-space-s);
430
+ }
431
+
432
+ .sf-app-sidebar > footer {
433
+ border-block-start: 1px solid var(--sf-colour-border);
434
+ padding-block-start: var(--sf-space-s);
435
+ }
436
+
437
+ .sf-app-main {
438
+ min-inline-size: 0;
439
+ padding: var(--sf-app-main-padding, var(--sf-space-m-l));
440
+ }
441
+
442
+ .sf-grid {
443
+ display: grid;
444
+ gap: var(--sf-grid-gap, var(--sf-gutter));
445
+ grid-template-columns: repeat(var(--sf-grid-columns), minmax(0, 1fr));
446
+ }
447
+
448
+ .sf-grid--2 { --sf-grid-columns: 2; }
449
+ .sf-grid--3 { --sf-grid-columns: 3; }
450
+ .sf-grid--4 { --sf-grid-columns: 4; }
451
+
452
+ .sf-auto-grid {
453
+ display: grid;
454
+ gap: var(--sf-grid-gap, var(--sf-gutter));
455
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sf-auto-grid-min, 16rem)), 1fr));
456
+ }
457
+
458
+ .sf-auto-grid--xs { --sf-auto-grid-min: 8rem; }
459
+ .sf-auto-grid--sm { --sf-auto-grid-min: 12rem; }
460
+ .sf-auto-grid--lg { --sf-auto-grid-min: 20rem; }
461
+
462
+ .sf-split {
463
+ display: grid;
464
+ gap: var(--sf-split-gap, var(--sf-gutter));
465
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sf-split-min, 24rem)), 1fr));
466
+ }
467
+
468
+ .sf-split--reverse > :first-child { order: 2; }
469
+ .sf-split--reverse > :last-child { order: 1; }
470
+
471
+ .sf-centre {
472
+ box-sizing: content-box;
473
+ margin-inline: auto;
474
+ max-inline-size: var(--sf-centre-size, 65ch);
475
+ }
476
+
477
+ .sf-centre--narrow { --sf-centre-size: 48ch; }
478
+ .sf-centre--wide { --sf-centre-size: 80ch; }
479
+
480
+ .sf-sidebar {
481
+ display: flex;
482
+ flex-wrap: wrap;
483
+ gap: var(--sf-gutter);
484
+ }
485
+
486
+ .sf-sidebar > :first-child {
487
+ flex-basis: var(--sf-sidebar-width, 20rem);
488
+ flex-grow: 1;
489
+ }
490
+
491
+ .sf-sidebar > :last-child {
492
+ flex-basis: 0;
493
+ flex-grow: 999;
494
+ min-inline-size: min(100%, var(--sf-sidebar-content-min, 50%));
495
+ }
496
+
497
+ .sf-switcher {
498
+ display: flex;
499
+ flex-wrap: wrap;
500
+ gap: var(--sf-gutter);
501
+ }
502
+
503
+ .sf-switcher > * {
504
+ flex-basis: calc((var(--sf-switcher-threshold, 42rem) - 100%) * 999);
505
+ flex-grow: 1;
506
+ }
507
+
508
+ .sf-frame {
509
+ aspect-ratio: var(--sf-frame-ratio, 16 / 9);
510
+ overflow: hidden;
511
+ }
512
+
513
+ .sf-frame > :where(img, video, iframe) {
514
+ block-size: 100%;
515
+ inline-size: 100%;
516
+ object-fit: cover;
517
+ }
518
+
519
+ .sf-frame--square { --sf-frame-ratio: 1; }
520
+ .sf-frame--portrait { --sf-frame-ratio: 4 / 5; }
521
+ .sf-frame--wide { --sf-frame-ratio: 21 / 9; }
522
+
523
+ .sf-cover {
524
+ display: flex;
525
+ flex-direction: column;
526
+ min-block-size: var(--sf-cover-min, 100svh);
527
+ padding-block: var(--sf-region);
528
+ }
529
+
530
+ .sf-cover > :where(:first-child:not(.sf-cover__centre)) { margin-block-end: auto; }
531
+ .sf-cover > :where(:last-child:not(.sf-cover__centre)) { margin-block-start: auto; }
532
+
533
+ .sf-panel-grid {
534
+ container-type: inline-size;
535
+ display: grid;
536
+ gap: var(--sf-grid-gap, var(--sf-gutter));
537
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sf-panel-min, 18rem)), 1fr));
538
+ }
539
+
540
+ .sf-metric-grid,
541
+ .sf-pipeline {
542
+ display: grid;
543
+ gap: var(--sf-space-s);
544
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sf-panel-min, 11rem)), 1fr));
545
+ }
546
+
547
+ .sf-pipeline {
548
+ --sf-panel-min: 10rem;
549
+ }
550
+
551
+ .sf-scroll-viewport,
552
+ .sf-scroll-snap-y {
553
+ block-size: var(--sf-scroll-viewport-size, 100svh);
554
+ overflow-y: auto;
555
+ scroll-padding-block: var(--sf-scroll-padding, var(--sf-space-l));
556
+ scroll-snap-type: y proximity;
557
+ }
558
+
559
+ :where(.sf-scroll-viewport, .sf-scroll-snap-y)[data-snap="mandatory"] {
560
+ --sf-scroll-snap-stop: always;
561
+ scroll-snap-type: y mandatory;
562
+ }
563
+ .sf-scroll-viewport[data-size="preview"] {
564
+ --sf-scroll-margin: 0;
565
+ --sf-scroll-padding: 0;
566
+ --sf-scroll-viewport-size: min(32rem, 80svh);
567
+ --sf-scroll-panel-min: min(32rem, 80svh);
568
+ }
569
+
570
+ .sf-scroll-panel {
571
+ align-content: center;
572
+ display: grid;
573
+ min-block-size: var(--sf-scroll-panel-min, 100svh);
574
+ scroll-margin-block: var(--sf-scroll-margin, var(--sf-space-l));
575
+ scroll-snap-align: start;
576
+ scroll-snap-stop: var(--sf-scroll-snap-stop, normal);
577
+ }
578
+
579
+ .sf-sticky-top {
580
+ position: sticky;
581
+ inset-block-start: var(--sf-sticky-offset, 0);
582
+ z-index: var(--sf-sticky-z, 20);
583
+ }
584
+
585
+ .sf-media-object {
586
+ align-items: var(--sf-media-object-align, start);
587
+ display: grid;
588
+ gap: var(--sf-space-s-m);
589
+ grid-template-columns: auto minmax(0, 1fr);
590
+ }
591
+
592
+ .sf-aside-rail {
593
+ display: grid;
594
+ gap: var(--sf-gutter);
595
+ grid-template-columns: minmax(0, 1fr);
596
+ }
597
+
598
+ .sf-chapter {
599
+ align-items: var(--sf-chapter-align, center);
600
+ display: grid;
601
+ gap: var(--sf-chapter-gap, var(--sf-space-xl-2xl));
602
+ grid-template-columns: minmax(0, 1fr);
603
+ }
604
+
605
+ .sf-chapter__copy {
606
+ max-inline-size: var(--sf-chapter-copy, 24rem);
607
+ }
608
+
609
+ @media (min-width: 48rem) {
610
+ .sf-rail-shell {
611
+ display: grid;
612
+ grid-template-columns: var(--sf-rail-size) minmax(0, 1fr);
613
+ }
614
+
615
+ .sf-rail-shell__rail {
616
+ block-size: 100svh;
617
+ display: grid;
618
+ grid-template-rows: 3.5rem repeat(var(--sf-rail-items, 5), 1fr);
619
+ inset-block-start: 0;
620
+ position: sticky;
621
+ }
622
+
623
+ .sf-aside-rail {
624
+ grid-template-columns: minmax(0, 1fr) minmax(14rem, 22rem);
625
+ }
626
+
627
+ .sf-aside-rail[data-rail="start"] {
628
+ grid-template-columns: minmax(14rem, 22rem) minmax(0, 1fr);
629
+ }
630
+
631
+ .sf-chapter {
632
+ grid-template-columns: minmax(18rem, .42fr) minmax(0, 1fr);
633
+ }
634
+ }
635
+
636
+ @media (max-width: 56rem) {
637
+ .sf-app-shell {
638
+ grid-template-columns: 1fr;
639
+ }
640
+
641
+ .sf-app-main {
642
+ --sf-app-main-padding: var(--sf-space-s);
643
+ }
644
+
645
+ .sf-app-sidebar {
646
+ border-block-end: 1px solid var(--sf-colour-border);
647
+ border-inline-end: 0;
648
+ max-block-size: none;
649
+ min-block-size: auto;
650
+ position: static;
651
+ }
652
+
653
+ .sf-app-sidebar > footer {
654
+ margin-block-start: 0;
655
+ }
656
+ }
657
+
658
+ @supports (animation-timeline: view()) {
659
+ .sf-scroll-panel[data-view-progress] {
660
+ view-timeline-name: --sf-panel;
661
+ view-timeline-axis: block;
662
+ }
663
+ }
664
+
665
+ @container (min-width: 42rem) {
666
+ .sf-panel-grid[data-density="featured"] > :first-child {
667
+ grid-column: span 2;
668
+ }
669
+ }
670
+ }
671
+ @layer components {
672
+ .sf-button {
673
+ align-items: center;
674
+ background: var(--sf-button-bg, var(--sf-colour-primary));
675
+ border: 1px solid var(--sf-button-border, color-mix(in oklch, var(--sf-colour-primary) 84%, black));
676
+ border-radius: var(--sf-button-radius);
677
+ box-shadow: var(--sf-button-shadow, var(--sf-shadow-sm));
678
+ color: var(--sf-button-colour, var(--sf-colour-primary-foreground));
679
+ display: inline-flex;
680
+ font-size: var(--sf-step--1);
681
+ font-weight: 700;
682
+ gap: var(--sf-space-2xs);
683
+ justify-content: center;
684
+ min-block-size: var(--sf-button-block-size);
685
+ padding-block: .625rem;
686
+ padding-inline: var(--sf-button-padding-inline);
687
+ text-decoration: none;
688
+ 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);
689
+ white-space: nowrap;
690
+ }
691
+
692
+ .sf-button:hover {
693
+ background: var(--sf-button-bg-hover, var(--sf-colour-primary-hover));
694
+ transform: translateY(-0.0625rem);
695
+ }
696
+
697
+ .sf-button:disabled,
698
+ .sf-button[aria-disabled="true"] {
699
+ opacity: .55;
700
+ pointer-events: none;
701
+ }
702
+
703
+ :where(.sf-button, .sf-nav__link, .sf-card--interactive, .sf-price-card)[aria-disabled="true"],
704
+ :where(.sf-link, .sf-link-subtle, .sf-link-plain)[aria-disabled="true"] {
705
+ cursor: not-allowed;
706
+ opacity: .55;
707
+ pointer-events: none;
708
+ }
709
+
710
+ :where(.sf-button, .sf-nav__link)[aria-expanded="true"],
711
+ :where(.sf-button, .sf-nav__link)[aria-pressed="true"],
712
+ :where(.sf-button, .sf-nav__link)[aria-selected="true"],
713
+ :where(.sf-button, .sf-nav__link)[data-state="open"] {
714
+ background: var(--sf-colour-surface-alt);
715
+ border-color: color-mix(in oklch, var(--sf-colour-primary) 34%, var(--sf-colour-border));
716
+ color: var(--sf-colour-foreground);
717
+ }
718
+
719
+ .sf-button[aria-busy="true"],
720
+ .sf-button[data-loading="true"] {
721
+ cursor: progress;
722
+ opacity: .78;
723
+ pointer-events: none;
724
+ }
725
+
726
+ .sf-button:focus-visible {
727
+ box-shadow: 0 0 0 0.25rem color-mix(in oklch, var(--sf-colour-ring) 22%, transparent);
728
+ }
729
+
730
+ .sf-button--default,
731
+ .sf-button[data-variant="default"] {
732
+ --sf-button-bg: var(--sf-colour-primary);
733
+ --sf-button-bg-hover: var(--sf-colour-primary-hover);
734
+ --sf-button-border: color-mix(in oklch, var(--sf-colour-primary) 84%, black);
735
+ --sf-button-colour: var(--sf-colour-primary-foreground);
736
+ }
737
+
738
+ .sf-button--secondary,
739
+ .sf-button[data-variant="secondary"] {
740
+ --sf-button-bg: var(--sf-colour-surface-alt);
741
+ --sf-button-bg-hover: color-mix(in oklch, var(--sf-colour-surface-alt) 86%, var(--sf-colour-primary));
742
+ --sf-button-border: var(--sf-colour-border);
743
+ --sf-button-colour: var(--sf-colour-foreground);
744
+ }
745
+
746
+ .sf-button--outline,
747
+ .sf-button[data-variant="outline"] {
748
+ --sf-button-bg: transparent;
749
+ --sf-button-bg-hover: var(--sf-colour-surface-alt);
750
+ --sf-button-border: var(--sf-colour-border);
751
+ --sf-button-colour: var(--sf-colour-foreground);
752
+ --sf-button-shadow: none;
753
+ }
754
+
755
+ .sf-button--ghost,
756
+ .sf-button[data-variant="ghost"] {
757
+ --sf-button-bg: transparent;
758
+ --sf-button-bg-hover: var(--sf-colour-surface-alt);
759
+ --sf-button-border: transparent;
760
+ --sf-button-colour: var(--sf-colour-foreground);
761
+ --sf-button-shadow: none;
762
+ }
763
+
764
+ .sf-button--link,
765
+ .sf-button[data-variant="link"] {
766
+ --sf-button-bg: transparent;
767
+ --sf-button-bg-hover: transparent;
768
+ --sf-button-border: transparent;
769
+ --sf-button-colour: var(--sf-colour-primary);
770
+ --sf-button-shadow: none;
771
+ min-block-size: auto;
772
+ padding: 0;
773
+ text-decoration: underline;
774
+ text-underline-offset: .25em;
775
+ }
776
+
777
+ .sf-button--link:hover,
778
+ .sf-button[data-variant="link"]:hover {
779
+ transform: none;
780
+ }
781
+
782
+ .sf-button--destructive,
783
+ .sf-button[data-variant="destructive"] {
784
+ --sf-button-bg: var(--sf-colour-danger);
785
+ --sf-button-bg-hover: color-mix(in oklch, var(--sf-colour-danger) 86%, black);
786
+ --sf-button-border: color-mix(in oklch, var(--sf-colour-danger) 84%, black);
787
+ --sf-button-colour: var(--sf-colour-primary-foreground);
788
+ }
789
+
790
+ .sf-button--sm,
791
+ .sf-button[data-size="sm"] {
792
+ --sf-button-block-size: 2.25rem;
793
+ --sf-button-padding-inline: var(--sf-space-xs);
794
+ }
795
+
796
+ .sf-button--lg,
797
+ .sf-button[data-size="lg"] {
798
+ --sf-button-block-size: 3rem;
799
+ --sf-button-padding-inline: var(--sf-space-m);
800
+ }
801
+
802
+ .sf-button--icon,
803
+ .sf-icon-button,
804
+ .sf-button[data-size="icon"] {
805
+ --sf-button-block-size: 2.75rem;
806
+ inline-size: 2.75rem;
807
+ padding-inline: 0;
808
+ }
809
+
810
+ .sf-button--block,
811
+ .sf-button[data-width="block"] {
812
+ inline-size: 100%;
813
+ }
814
+
815
+ .sf-button-group {
816
+ align-items: center;
817
+ display: flex;
818
+ flex-wrap: wrap;
819
+ gap: var(--sf-space-2xs);
820
+ }
821
+
822
+ .sf-icon {
823
+ block-size: var(--sf-icon-size, 1em);
824
+ color: var(--sf-icon-colour, currentColor);
825
+ flex: 0 0 auto;
826
+ inline-size: var(--sf-icon-size, 1em);
827
+ stroke-width: var(--sf-icon-stroke, 2);
828
+ vertical-align: -0.125em;
829
+ }
830
+
831
+ .sf-icon--xs { --sf-icon-size: var(--sf-step--1); }
832
+ .sf-icon--sm { --sf-icon-size: var(--sf-step-0); }
833
+ .sf-icon--md { --sf-icon-size: var(--sf-step-1); }
834
+ .sf-icon--lg { --sf-icon-size: var(--sf-step-2); }
835
+ .sf-icon--xl { --sf-icon-size: var(--sf-step-3); }
836
+
837
+ .sf-card {
838
+ background: var(--sf-card-bg, var(--sf-colour-surface));
839
+ border: 1px solid var(--sf-card-border, var(--sf-colour-border));
840
+ border-radius: var(--sf-card-radius);
841
+ box-shadow: var(--sf-card-shadow, var(--sf-shadow-sm));
842
+ color: var(--sf-card-colour, var(--sf-colour-foreground));
843
+ padding: var(--sf-card-padding);
844
+ }
845
+
846
+ .sf-card--flat {
847
+ --sf-card-shadow: none;
848
+ }
849
+
850
+ .sf-card--raised {
851
+ --sf-card-bg: var(--sf-colour-surface-raised);
852
+ --sf-card-shadow: var(--sf-shadow-md);
853
+ }
854
+
855
+ .sf-card--compact {
856
+ --sf-card-padding: var(--sf-space-s);
857
+ }
858
+
859
+ .sf-card--glass,
860
+ .sf-card--technical {
861
+ --sf-card-bg:
862
+ linear-gradient(180deg, color-mix(in oklch, var(--sf-colour-foreground) 5%, transparent), transparent),
863
+ color-mix(in oklch, var(--sf-colour-surface) 84%, transparent);
864
+ --sf-card-border: var(--sf-colour-border-strong);
865
+ --sf-card-shadow: none;
866
+ backdrop-filter: blur(1.125rem);
867
+ }
868
+
869
+ .sf-card--accent {
870
+ --sf-card-border: color-mix(in oklch, var(--sf-colour-primary) 54%, var(--sf-colour-border));
871
+ --sf-card-shadow: 0 0 2rem color-mix(in oklch, var(--sf-colour-primary) 18%, transparent);
872
+ }
873
+
874
+ .sf-card--center {
875
+ align-items: center;
876
+ text-align: center;
877
+ }
878
+
879
+ .sf-card__header,
880
+ .sf-card__body,
881
+ .sf-card__footer {
882
+ display: grid;
883
+ gap: var(--sf-space-xs);
884
+ }
885
+
886
+ .sf-card__title {
887
+ font-family: var(--sf-font-display);
888
+ font-size: var(--sf-step-2);
889
+ font-weight: 700;
890
+ line-height: var(--sf-line-height-heading);
891
+ }
892
+
893
+ .sf-card__description {
894
+ color: var(--sf-colour-muted);
895
+ }
896
+
897
+ .sf-card--interactive {
898
+ 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);
899
+ }
900
+
901
+ .sf-card--interactive:hover {
902
+ border-color: color-mix(in oklch, var(--sf-colour-primary) 32%, var(--sf-colour-border));
903
+ box-shadow: var(--sf-shadow-md);
904
+ transform: translateY(-0.125rem);
905
+ }
906
+
907
+ .sf-surface {
908
+ background: var(--sf-surface-bg, var(--sf-colour-surface));
909
+ border: 1px solid var(--sf-surface-border, var(--sf-colour-border));
910
+ border-radius: var(--sf-surface-radius, var(--sf-radius-panel));
911
+ box-shadow: var(--sf-surface-shadow, none);
912
+ color: var(--sf-surface-colour, var(--sf-colour-foreground));
913
+ padding: var(--sf-surface-padding, var(--sf-space-m-l));
914
+ }
915
+
916
+ .sf-surface--alt {
917
+ --sf-surface-bg: var(--sf-colour-surface-alt);
918
+ }
919
+
920
+ .sf-surface--raised {
921
+ --sf-surface-bg: var(--sf-colour-surface-raised);
922
+ --sf-surface-shadow: var(--sf-shadow-md);
923
+ }
924
+
925
+ .sf-code-window {
926
+ background:
927
+ linear-gradient(180deg, color-mix(in oklch, var(--sf-colour-foreground) 5%, transparent), transparent),
928
+ color-mix(in oklch, var(--sf-colour-surface) 86%, transparent);
929
+ border: 1px solid var(--sf-code-window-border, color-mix(in oklch, var(--sf-colour-primary) 48%, var(--sf-colour-border)));
930
+ border-radius: var(--sf-radius-panel);
931
+ box-shadow: var(--sf-code-window-shadow, none);
932
+ color: var(--sf-colour-muted);
933
+ overflow: hidden;
934
+ }
935
+
936
+ .sf-code-window--glow,
937
+ .sf-code-window[data-emphasis="glow"] {
938
+ --sf-code-window-border: color-mix(in oklch, var(--sf-colour-primary) 62%, var(--sf-colour-border));
939
+ --sf-code-window-shadow: 0 0 2.5rem color-mix(in oklch, var(--sf-colour-primary) 16%, transparent);
940
+ }
941
+
942
+ .sf-code-window__bar {
943
+ align-items: center;
944
+ border-block-end: 1px solid var(--sf-colour-border);
945
+ color: var(--sf-colour-muted);
946
+ display: grid;
947
+ font-family: var(--sf-font-mono);
948
+ font-size: var(--sf-step--2);
949
+ gap: var(--sf-space-xs);
950
+ grid-template-columns: auto 1fr auto;
951
+ min-block-size: 2rem;
952
+ padding-inline: var(--sf-space-xs);
953
+ }
954
+
955
+ .sf-code-window__bar > :last-child {
956
+ justify-self: end;
957
+ }
958
+
959
+ .sf-window-dots {
960
+ background: var(--sf-colour-danger);
961
+ block-size: .42rem;
962
+ border-radius: var(--sf-radius-full);
963
+ box-shadow:
964
+ .68rem 0 0 var(--sf-colour-warning),
965
+ 1.36rem 0 0 var(--sf-colour-success);
966
+ display: inline-block;
967
+ inline-size: .42rem;
968
+ margin-inline-end: var(--sf-space-l);
969
+ }
970
+
971
+ .sf-code-lines {
972
+ color: var(--sf-colour-muted);
973
+ counter-reset: code;
974
+ font-family: var(--sf-font-mono);
975
+ font-size: var(--sf-code-font-size, clamp(.72rem, 1vw, .88rem));
976
+ line-height: 1.58;
977
+ list-style: none;
978
+ margin: 0;
979
+ padding: var(--sf-code-padding, var(--sf-space-s));
980
+ }
981
+
982
+ .sf-code-lines--compact {
983
+ --sf-code-font-size: var(--sf-step--2);
984
+ }
985
+
986
+ .sf-code-lines--lg {
987
+ --sf-code-font-size: var(--sf-step--1);
988
+ --sf-code-padding: var(--sf-space-s-m) var(--sf-space-m);
989
+ }
990
+
991
+ .sf-code-lines > li {
992
+ counter-increment: code;
993
+ display: grid;
994
+ gap: var(--sf-space-xs);
995
+ grid-template-columns: 2ch minmax(0, 1fr);
996
+ }
997
+
998
+ .sf-code-lines > li::before {
999
+ color: var(--sf-colour-subtle);
1000
+ content: counter(code);
1001
+ text-align: right;
1002
+ }
1003
+
1004
+ .sf-code-lines code,
1005
+ .sf-code-block code {
1006
+ background: transparent;
1007
+ border: 0;
1008
+ border-radius: 0;
1009
+ color: inherit;
1010
+ padding: 0;
1011
+ white-space: pre-wrap;
1012
+ }
1013
+
1014
+ .sf-code-lines > li:nth-child(4n + 1) code,
1015
+ .sf-code-lines > li:nth-child(4n + 2) code,
1016
+ .sf-command-list__prompt {
1017
+ color: var(--sf-colour-primary);
1018
+ }
1019
+
1020
+ .sf-code-token--punct { color: color-mix(in oklch, var(--sf-colour-muted) 84%, var(--sf-colour-foreground)); }
1021
+ .sf-code-token--tag { color: var(--sf-code-token-tag, oklch(78% 0.09 235)); }
1022
+ .sf-code-token--attr { color: color-mix(in oklch, var(--sf-colour-warning) 72%, var(--sf-colour-foreground)); }
1023
+ .sf-code-token--string { color: color-mix(in oklch, var(--sf-colour-success) 72%, var(--sf-colour-foreground)); }
1024
+ .sf-code-token--class { color: var(--sf-code-token-class, var(--sf-colour-primary-hover, var(--sf-colour-primary))); }
1025
+ .sf-code-token--property { color: var(--sf-code-token-property, var(--sf-colour-primary-hover, var(--sf-colour-primary))); }
1026
+ .sf-code-token--function { color: var(--sf-code-token-function, oklch(78% 0.09 235)); }
1027
+ .sf-code-token--number { color: var(--sf-code-token-number, oklch(83% 0.13 86)); }
1028
+ .sf-code-token--text { color: var(--sf-colour-foreground); }
1029
+ .sf-code-token--comment { color: var(--sf-colour-subtle); font-style: italic; }
1030
+
1031
+ .sf-token-strip {
1032
+ display: flex;
1033
+ flex-wrap: wrap;
1034
+ gap: var(--sf-space-xs);
1035
+ padding: var(--sf-space-s) var(--sf-space-s) 0;
1036
+ }
1037
+
1038
+ .sf-token-strip > * {
1039
+ background: var(--sf-token-colour, var(--sf-colour-primary));
1040
+ block-size: 1.25rem;
1041
+ border: 1px solid var(--sf-colour-border-strong);
1042
+ border-radius: var(--sf-radius-xs);
1043
+ inline-size: 2.8rem;
1044
+ }
1045
+
1046
+ .sf-token-strip > :nth-child(2) { --sf-token-colour: var(--sf-colour-accent); }
1047
+ .sf-token-strip > :nth-child(3) { --sf-token-colour: var(--sf-colour-warning); }
1048
+ .sf-token-strip > :nth-child(4) { --sf-token-colour: var(--sf-colour-success); }
1049
+ .sf-token-strip > :nth-child(5) { --sf-token-colour: var(--sf-colour-foreground); }
1050
+ .sf-token-strip > :nth-child(6) { --sf-token-colour: var(--sf-colour-info); }
1051
+
1052
+ .sf-token-strip[data-palette="hdr"] > :nth-child(1) { --sf-token-colour: oklch(69% 0.19 42); }
1053
+ .sf-token-strip[data-palette="hdr"] > :nth-child(2) { --sf-token-colour: oklch(84% 0.17 82); }
1054
+ .sf-token-strip[data-palette="hdr"] > :nth-child(3) { --sf-token-colour: oklch(78% 0.18 145); }
1055
+ .sf-token-strip[data-palette="hdr"] > :nth-child(4) { --sf-token-colour: oklch(78% 0.12 235); }
1056
+ .sf-token-strip[data-palette="hdr"] > :nth-child(5) { --sf-token-colour: oklch(76% 0.13 292); }
1057
+ .sf-token-strip[data-palette="hdr"] > :nth-child(6) { --sf-token-colour: oklch(98% 0.006 80); }
1058
+
1059
+ .sf-marquee {
1060
+ background: color-mix(in oklch, var(--sf-colour-surface) 78%, transparent);
1061
+ border-block: 1px solid var(--sf-colour-border);
1062
+ color: var(--sf-colour-muted);
1063
+ font-family: var(--sf-font-mono);
1064
+ font-size: var(--sf-step--2);
1065
+ font-weight: 800;
1066
+ letter-spacing: .12em;
1067
+ overflow: hidden;
1068
+ padding-block: var(--sf-marquee-padding-block, var(--sf-space-xs));
1069
+ text-transform: uppercase;
1070
+ }
1071
+
1072
+ .sf-marquee__track {
1073
+ align-items: center;
1074
+ animation: sf-marquee-scroll var(--sf-marquee-duration, 28s) linear infinite;
1075
+ display: flex;
1076
+ flex-wrap: nowrap;
1077
+ gap: var(--sf-marquee-gap, var(--sf-space-l));
1078
+ inline-size: max-content;
1079
+ min-inline-size: 100%;
1080
+ }
1081
+
1082
+ .sf-marquee__item {
1083
+ align-items: center;
1084
+ display: inline-flex;
1085
+ flex: 0 0 auto;
1086
+ gap: var(--sf-space-s);
1087
+ white-space: nowrap;
1088
+ }
1089
+
1090
+ .sf-marquee__item::before {
1091
+ background: var(--sf-colour-primary);
1092
+ block-size: .32rem;
1093
+ border-radius: var(--sf-radius-full);
1094
+ box-shadow: 0 0 .9rem var(--sf-colour-primary);
1095
+ content: "";
1096
+ inline-size: .32rem;
1097
+ }
1098
+
1099
+ @keyframes sf-marquee-scroll {
1100
+ to { transform: translateX(-50%); }
1101
+ }
1102
+
1103
+ .sf-command-list {
1104
+ display: grid;
1105
+ font-family: var(--sf-font-mono);
1106
+ font-size: var(--sf-step--1);
1107
+ gap: var(--sf-space-2xs);
1108
+ list-style: none;
1109
+ margin: 0;
1110
+ padding: var(--sf-space-s);
1111
+ }
1112
+
1113
+ .sf-command-list > li {
1114
+ display: flex;
1115
+ gap: var(--sf-space-xs);
1116
+ }
1117
+
1118
+ .sf-platform-card {
1119
+ align-items: center;
1120
+ display: grid;
1121
+ gap: var(--sf-space-xs);
1122
+ justify-items: center;
1123
+ min-block-size: var(--sf-platform-card-min, 11rem);
1124
+ text-align: center;
1125
+ }
1126
+
1127
+ .sf-platform-card__logo {
1128
+ block-size: clamp(2rem, 4vw, 2.85rem);
1129
+ filter: drop-shadow(0 0 1.125rem color-mix(in oklch, var(--sf-colour-foreground) 18%, transparent));
1130
+ inline-size: clamp(2rem, 4vw, 2.85rem);
1131
+ object-fit: contain;
1132
+ }
1133
+
1134
+ .sf-hero {
1135
+ align-items: center;
1136
+ display: grid;
1137
+ min-block-size: var(--sf-hero-min, min(42rem, 82svh));
1138
+ padding-block: var(--sf-space-2xl-3xl);
1139
+ }
1140
+
1141
+ .sf-logo-cloud {
1142
+ align-items: center;
1143
+ display: flex;
1144
+ flex-wrap: wrap;
1145
+ gap: var(--sf-space-s-m);
1146
+ justify-content: var(--sf-logo-cloud-justify, center);
1147
+ }
1148
+
1149
+ .sf-logo-cloud > * {
1150
+ color: var(--sf-colour-subtle);
1151
+ font-size: var(--sf-step--1);
1152
+ font-weight: 800;
1153
+ letter-spacing: .04em;
1154
+ text-transform: uppercase;
1155
+ }
1156
+
1157
+ .sf-feature {
1158
+ display: grid;
1159
+ gap: var(--sf-space-xs);
1160
+ }
1161
+
1162
+ .sf-feature__icon {
1163
+ align-items: center;
1164
+ background: var(--sf-colour-primary-soft);
1165
+ border: 1px solid var(--sf-colour-primary-soft-border);
1166
+ border-radius: var(--sf-radius-md);
1167
+ color: var(--sf-colour-primary);
1168
+ display: inline-flex;
1169
+ font-weight: 800;
1170
+ inline-size: var(--sf-feature-icon-size, 2.75rem);
1171
+ justify-content: center;
1172
+ min-block-size: var(--sf-feature-icon-size, 2.75rem);
1173
+ }
1174
+
1175
+ .sf-feature__title {
1176
+ font-family: var(--sf-font-display);
1177
+ font-size: var(--sf-step-2);
1178
+ font-weight: 700;
1179
+ line-height: var(--sf-line-height-heading);
1180
+ }
1181
+
1182
+ .sf-feature__text {
1183
+ color: var(--sf-colour-muted);
1184
+ }
1185
+
1186
+ .sf-stats {
1187
+ display: grid;
1188
+ gap: var(--sf-grid-gap, var(--sf-gutter));
1189
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sf-stat-min, 12rem)), 1fr));
1190
+ }
1191
+
1192
+ .sf-stat {
1193
+ border-block-start: 1px solid var(--sf-colour-border);
1194
+ display: grid;
1195
+ gap: var(--sf-space-2xs);
1196
+ padding-block-start: var(--sf-space-s);
1197
+ }
1198
+
1199
+ .sf-stat__value {
1200
+ font-family: var(--sf-font-display);
1201
+ font-size: var(--sf-step-4);
1202
+ font-weight: 700;
1203
+ line-height: var(--sf-line-height-tight);
1204
+ }
1205
+
1206
+ .sf-stat__label {
1207
+ color: var(--sf-colour-muted);
1208
+ font-size: var(--sf-step--1);
1209
+ font-weight: 700;
1210
+ }
1211
+
1212
+ .sf-testimonial {
1213
+ background: var(--sf-colour-surface);
1214
+ border: 1px solid var(--sf-colour-border);
1215
+ border-radius: var(--sf-radius-panel);
1216
+ box-shadow: var(--sf-shadow-sm);
1217
+ display: grid;
1218
+ gap: var(--sf-space-s);
1219
+ padding: var(--sf-space-m-l);
1220
+ }
1221
+
1222
+ .sf-testimonial__quote {
1223
+ font-family: var(--sf-font-display);
1224
+ font-size: var(--sf-step-2);
1225
+ font-weight: 700;
1226
+ line-height: var(--sf-line-height-heading);
1227
+ text-wrap: balance;
1228
+ }
1229
+
1230
+ .sf-testimonial__meta {
1231
+ color: var(--sf-colour-muted);
1232
+ font-size: var(--sf-step--1);
1233
+ font-weight: 700;
1234
+ }
1235
+
1236
+ .sf-pricing-grid {
1237
+ container-type: inline-size;
1238
+ display: grid;
1239
+ gap: var(--sf-grid-gap, var(--sf-gutter));
1240
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sf-pricing-min, 18rem)), 1fr));
1241
+ }
1242
+
1243
+ .sf-price-card {
1244
+ background: var(--sf-colour-surface);
1245
+ border: 1px solid var(--sf-price-card-border, var(--sf-colour-border));
1246
+ border-radius: var(--sf-radius-panel);
1247
+ box-shadow: var(--sf-price-card-shadow, var(--sf-shadow-sm));
1248
+ display: grid;
1249
+ gap: var(--sf-space-s);
1250
+ padding: var(--sf-space-m-l);
1251
+ }
1252
+
1253
+ .sf-price-card[data-featured="true"],
1254
+ .sf-price-card--featured {
1255
+ --sf-price-card-border: color-mix(in oklch, var(--sf-colour-primary) 44%, var(--sf-colour-border));
1256
+ --sf-price-card-shadow: var(--sf-shadow-md);
1257
+ }
1258
+
1259
+ .sf-price {
1260
+ align-items: baseline;
1261
+ display: flex;
1262
+ flex-wrap: wrap;
1263
+ gap: var(--sf-space-2xs);
1264
+ }
1265
+
1266
+ .sf-price__value {
1267
+ font-family: var(--sf-font-display);
1268
+ font-size: var(--sf-step-5);
1269
+ font-weight: 700;
1270
+ line-height: var(--sf-line-height-tight);
1271
+ }
1272
+
1273
+ .sf-price__interval {
1274
+ color: var(--sf-colour-muted);
1275
+ font-size: var(--sf-step--1);
1276
+ font-weight: 700;
1277
+ }
1278
+
1279
+ .sf-faq {
1280
+ display: grid;
1281
+ gap: var(--sf-space-xs);
1282
+ }
1283
+
1284
+ .sf-faq__item {
1285
+ background: var(--sf-colour-surface);
1286
+ border: 1px solid var(--sf-colour-border);
1287
+ border-radius: var(--sf-radius-lg);
1288
+ padding: var(--sf-space-s);
1289
+ }
1290
+
1291
+ .sf-faq__item[open] {
1292
+ border-color: color-mix(in oklch, var(--sf-colour-primary) 30%, var(--sf-colour-border));
1293
+ box-shadow: var(--sf-shadow-sm);
1294
+ }
1295
+
1296
+ .sf-faq__item > summary {
1297
+ cursor: pointer;
1298
+ font-weight: 800;
1299
+ }
1300
+
1301
+ .sf-faq__item > summary:focus-visible {
1302
+ border-radius: var(--sf-radius-sm);
1303
+ outline: 0.125rem solid var(--sf-colour-ring);
1304
+ outline-offset: .2rem;
1305
+ }
1306
+
1307
+ .sf-faq__item > :where(p, ul, ol) {
1308
+ color: var(--sf-colour-muted);
1309
+ margin-block-start: var(--sf-space-xs);
1310
+ }
1311
+
1312
+ .sf-cta {
1313
+ align-items: center;
1314
+ background: var(--sf-colour-surface);
1315
+ border: 1px solid var(--sf-colour-border);
1316
+ border-radius: var(--sf-radius-panel);
1317
+ box-shadow: var(--sf-shadow-md);
1318
+ display: grid;
1319
+ gap: var(--sf-space-s-m);
1320
+ padding: var(--sf-space-l-xl);
1321
+ }
1322
+
1323
+ @container (min-width: 48rem) {
1324
+ .sf-cta[data-layout="split"] {
1325
+ grid-template-columns: minmax(0, 1fr) auto;
1326
+ }
1327
+ }
1328
+
1329
+ .sf-footer {
1330
+ border-block-start: 1px solid var(--sf-colour-border);
1331
+ color: var(--sf-colour-muted);
1332
+ padding-block: var(--sf-space-l-xl);
1333
+ }
1334
+
1335
+ .sf-section-header {
1336
+ display: grid;
1337
+ gap: var(--sf-space-xs);
1338
+ max-inline-size: var(--sf-section-header-width, 54rem);
1339
+ }
1340
+
1341
+ .sf-section-header[data-align="center"] {
1342
+ margin-inline: auto;
1343
+ text-align: center;
1344
+ }
1345
+
1346
+ .sf-kicker {
1347
+ color: var(--sf-colour-primary);
1348
+ font-size: var(--sf-step--1);
1349
+ font-weight: 800;
1350
+ letter-spacing: 0.08em;
1351
+ text-transform: uppercase;
1352
+ }
1353
+
1354
+ .sf-badge {
1355
+ align-items: center;
1356
+ background: color-mix(in oklch, var(--sf-colour-primary) 12%, transparent);
1357
+ border: 1px solid color-mix(in oklch, var(--sf-colour-primary) 24%, transparent);
1358
+ border-radius: var(--sf-radius-full);
1359
+ color: var(--sf-colour-primary);
1360
+ display: inline-flex;
1361
+ font-size: var(--sf-step--1);
1362
+ font-weight: 700;
1363
+ gap: var(--sf-space-3xs);
1364
+ line-height: 1;
1365
+ padding: .45em .75em;
1366
+ }
1367
+
1368
+ .sf-avatar {
1369
+ align-items: center;
1370
+ aspect-ratio: 1;
1371
+ background: color-mix(in oklch, var(--sf-colour-primary) 14%, transparent);
1372
+ border: 1px solid color-mix(in oklch, var(--sf-colour-primary) 28%, transparent);
1373
+ border-radius: var(--sf-radius-full);
1374
+ color: var(--sf-colour-primary);
1375
+ display: inline-flex;
1376
+ flex: 0 0 auto;
1377
+ font-size: var(--sf-step--1);
1378
+ font-weight: 800;
1379
+ inline-size: var(--sf-avatar-size, 2.25rem);
1380
+ justify-content: center;
1381
+ line-height: 1;
1382
+ }
1383
+
1384
+ .sf-chart {
1385
+ --sf-chart-accent: var(--sf-colour-primary);
1386
+ }
1387
+
1388
+ .sf-chart__plot {
1389
+ background: color-mix(in oklch, var(--sf-colour-surface-alt) 72%, transparent);
1390
+ border: 1px solid var(--sf-colour-border);
1391
+ border-radius: var(--sf-radius-lg);
1392
+ overflow: hidden;
1393
+ padding: var(--sf-space-xs);
1394
+ }
1395
+
1396
+ .sf-chart--wide {
1397
+ --sf-chart-block-size: 14rem;
1398
+ }
1399
+
1400
+ .sf-chart__svg {
1401
+ block-size: var(--sf-chart-block-size, 12rem);
1402
+ display: block;
1403
+ inline-size: 100%;
1404
+ }
1405
+
1406
+ .sf-chart__grid,
1407
+ .sf-chart__axis {
1408
+ fill: none;
1409
+ stroke: var(--sf-colour-border);
1410
+ stroke-width: 1;
1411
+ vector-effect: non-scaling-stroke;
1412
+ }
1413
+
1414
+ .sf-chart__area {
1415
+ fill: color-mix(in oklch, var(--sf-chart-accent) 18%, transparent);
1416
+ }
1417
+
1418
+ .sf-chart__line {
1419
+ fill: none;
1420
+ stroke: var(--sf-chart-accent);
1421
+ stroke-linecap: round;
1422
+ stroke-linejoin: round;
1423
+ stroke-width: 3;
1424
+ vector-effect: non-scaling-stroke;
1425
+ }
1426
+
1427
+ .sf-chart__point {
1428
+ fill: var(--sf-chart-accent);
1429
+ stroke: var(--sf-colour-surface);
1430
+ stroke-width: 2;
1431
+ }
1432
+
1433
+ .sf-chart__legend {
1434
+ align-items: center;
1435
+ display: flex;
1436
+ flex-wrap: wrap;
1437
+ gap: var(--sf-space-xs);
1438
+ }
1439
+
1440
+ .sf-chart__legend-item {
1441
+ align-items: center;
1442
+ color: var(--sf-colour-muted);
1443
+ display: inline-flex;
1444
+ gap: var(--sf-space-3xs);
1445
+ }
1446
+
1447
+ .sf-chart__swatch {
1448
+ aspect-ratio: 1;
1449
+ background: var(--sf-chart-accent);
1450
+ border-radius: var(--sf-radius-full);
1451
+ display: inline-block;
1452
+ inline-size: .75rem;
1453
+ }
1454
+
1455
+ .sf-meter-list {
1456
+ display: grid;
1457
+ gap: var(--sf-space-xs);
1458
+ }
1459
+
1460
+ .sf-meter-row {
1461
+ display: grid;
1462
+ gap: var(--sf-space-3xs);
1463
+ }
1464
+
1465
+ .sf-meter {
1466
+ accent-color: var(--sf-chart-accent, var(--sf-colour-primary));
1467
+ block-size: .625rem;
1468
+ border-radius: var(--sf-radius-full);
1469
+ inline-size: 100%;
1470
+ overflow: hidden;
1471
+ }
1472
+
1473
+ .sf-nav {
1474
+ align-items: center;
1475
+ display: flex;
1476
+ flex-wrap: wrap;
1477
+ gap: var(--sf-nav-gap);
1478
+ justify-content: space-between;
1479
+ }
1480
+
1481
+ .sf-nav__list {
1482
+ align-items: center;
1483
+ display: flex;
1484
+ flex-wrap: wrap;
1485
+ gap: var(--sf-nav-gap);
1486
+ list-style: none;
1487
+ padding-inline-start: 0;
1488
+ }
1489
+
1490
+ .sf-nav__link {
1491
+ border-radius: var(--sf-nav-link-radius);
1492
+ color: var(--sf-colour-muted);
1493
+ display: inline-flex;
1494
+ align-items: center;
1495
+ font-size: var(--sf-step--1);
1496
+ font-weight: 700;
1497
+ gap: var(--sf-space-2xs);
1498
+ padding-block: var(--sf-space-3xs);
1499
+ padding-inline: var(--sf-space-2xs);
1500
+ text-decoration: none;
1501
+ transition: background-color var(--sf-duration-fast) var(--sf-ease-standard), color var(--sf-duration-fast) var(--sf-ease-standard);
1502
+ }
1503
+
1504
+ .sf-nav__link:hover,
1505
+ .sf-nav__link[aria-current="page"],
1506
+ .sf-nav__link[aria-current="true"],
1507
+ .sf-nav__link[aria-selected="true"] {
1508
+ background: var(--sf-colour-surface-alt);
1509
+ color: var(--sf-colour-foreground);
1510
+ }
1511
+
1512
+ .sf-app-sidebar .sf-kicker {
1513
+ inline-size: 100%;
1514
+ text-align: start;
1515
+ }
1516
+
1517
+ .sf-app-sidebar .sf-nav {
1518
+ align-items: stretch;
1519
+ flex-direction: column;
1520
+ justify-content: flex-start;
1521
+ }
1522
+
1523
+ .sf-app-sidebar .sf-nav__list {
1524
+ align-items: stretch;
1525
+ flex-direction: column;
1526
+ inline-size: 100%;
1527
+ margin-block: 0;
1528
+ padding-inline-start: var(--sf-space-2xs);
1529
+ }
1530
+
1531
+ .sf-app-sidebar .sf-nav__list > li {
1532
+ inline-size: 100%;
1533
+ }
1534
+
1535
+ .sf-app-sidebar .sf-nav__link {
1536
+ --sf-icon-size: var(--sf-step-0);
1537
+ gap: var(--sf-space-xs);
1538
+ inline-size: 100%;
1539
+ justify-content: flex-start;
1540
+ min-block-size: 2.5rem;
1541
+ padding-block: var(--sf-space-2xs);
1542
+ padding-inline: var(--sf-space-xs);
1543
+ text-align: start;
1544
+ }
1545
+
1546
+ .sf-form {
1547
+ display: grid;
1548
+ gap: var(--sf-form-gap, var(--sf-space-s-m));
1549
+ }
1550
+
1551
+ .sf-fieldset {
1552
+ border: 1px solid var(--sf-colour-border);
1553
+ border-radius: var(--sf-radius-panel);
1554
+ display: grid;
1555
+ gap: var(--sf-space-s);
1556
+ padding: var(--sf-space-s-m);
1557
+ }
1558
+
1559
+ .sf-fieldset > legend {
1560
+ color: var(--sf-colour-foreground);
1561
+ font-weight: 800;
1562
+ padding-inline: var(--sf-space-2xs);
1563
+ }
1564
+
1565
+ .sf-field {
1566
+ display: grid;
1567
+ gap: var(--sf-space-2xs);
1568
+ }
1569
+
1570
+ .sf-label,
1571
+ .sf-field > label {
1572
+ color: var(--sf-colour-muted);
1573
+ font-size: var(--sf-step--1);
1574
+ font-weight: 700;
1575
+ }
1576
+
1577
+ .sf-required,
1578
+ .sf-label[aria-required="true"],
1579
+ .sf-field > label:has(+ :required) {
1580
+ color: var(--sf-colour-foreground);
1581
+ }
1582
+
1583
+ .sf-required::after,
1584
+ .sf-label[aria-required="true"]::after,
1585
+ .sf-field > label:has(+ :required)::after {
1586
+ color: var(--sf-colour-danger);
1587
+ content: " *";
1588
+ }
1589
+
1590
+ .sf-help {
1591
+ color: var(--sf-colour-subtle);
1592
+ font-size: var(--sf-step--1);
1593
+ line-height: 1.4;
1594
+ }
1595
+
1596
+ .sf-error {
1597
+ color: var(--sf-colour-danger);
1598
+ font-size: var(--sf-step--1);
1599
+ font-weight: 700;
1600
+ line-height: 1.4;
1601
+ }
1602
+
1603
+ .sf-input,
1604
+ .sf-select,
1605
+ .sf-textarea {
1606
+ background: var(--sf-input-bg);
1607
+ border: 1px solid var(--sf-input-border);
1608
+ border-radius: var(--sf-input-radius);
1609
+ color: var(--sf-colour-foreground);
1610
+ inline-size: 100%;
1611
+ min-block-size: var(--sf-input-block-size);
1612
+ padding-inline: var(--sf-input-padding-inline);
1613
+ 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);
1614
+ }
1615
+
1616
+ .sf-textarea {
1617
+ min-block-size: var(--sf-textarea-block-size, 8rem);
1618
+ padding-block: var(--sf-space-xs);
1619
+ }
1620
+
1621
+ .sf-select {
1622
+ appearance: none;
1623
+ background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);
1624
+ background-position: calc(100% - 1rem) 50%, calc(100% - .7rem) 50%;
1625
+ background-repeat: no-repeat;
1626
+ background-size: .35rem .35rem, .35rem .35rem;
1627
+ padding-inline-end: var(--sf-space-l);
1628
+ }
1629
+
1630
+ :where(.sf-input, .sf-select, .sf-textarea)::placeholder {
1631
+ color: var(--sf-colour-subtle);
1632
+ }
1633
+
1634
+ :where(.sf-input, .sf-select, .sf-textarea):hover {
1635
+ border-color: var(--sf-colour-border-strong);
1636
+ }
1637
+
1638
+ :where(.sf-input, .sf-select, .sf-textarea):focus-visible {
1639
+ border-color: var(--sf-colour-ring);
1640
+ box-shadow: 0 0 0 0.25rem color-mix(in oklch, var(--sf-colour-ring) 18%, transparent);
1641
+ outline: 0.125rem solid color-mix(in oklch, var(--sf-colour-ring) 24%, transparent);
1642
+ outline-offset: 0;
1643
+ }
1644
+
1645
+ :where(.sf-input, .sf-select, .sf-textarea)[aria-invalid="true"],
1646
+ .sf-field[data-invalid="true"] :where(.sf-input, .sf-select, .sf-textarea) {
1647
+ --sf-input-border: var(--sf-colour-danger);
1648
+ border-color: var(--sf-colour-danger);
1649
+ box-shadow: 0 0 0 0.25rem var(--sf-colour-danger-soft);
1650
+ }
1651
+
1652
+ .sf-field[data-invalid="true"] :where(.sf-label, label),
1653
+ .sf-field[data-invalid="true"] .sf-help {
1654
+ color: var(--sf-colour-danger);
1655
+ }
1656
+
1657
+ :where(.sf-input, .sf-select, .sf-textarea):disabled {
1658
+ background: var(--sf-colour-surface-alt);
1659
+ color: var(--sf-colour-subtle);
1660
+ opacity: .72;
1661
+ }
1662
+
1663
+ :where(.sf-input, .sf-select, .sf-textarea)[aria-busy="true"],
1664
+ :where(.sf-input, .sf-select, .sf-textarea)[data-loading="true"] {
1665
+ cursor: progress;
1666
+ opacity: .78;
1667
+ }
1668
+
1669
+ .sf-check {
1670
+ align-items: start;
1671
+ display: grid;
1672
+ gap: var(--sf-space-2xs);
1673
+ grid-template-columns: auto 1fr;
1674
+ }
1675
+
1676
+ .sf-check > :where(input[type="checkbox"], input[type="radio"]) {
1677
+ accent-color: var(--sf-colour-primary);
1678
+ block-size: 1.1em;
1679
+ inline-size: 1.1em;
1680
+ margin-block-start: .2em;
1681
+ }
1682
+
1683
+ .sf-alert {
1684
+ background: var(--sf-alert-bg, var(--sf-colour-info-soft));
1685
+ border: 1px solid var(--sf-alert-border, color-mix(in oklch, var(--sf-colour-info) 32%, transparent));
1686
+ border-radius: var(--sf-alert-radius);
1687
+ color: var(--sf-alert-colour, var(--sf-colour-foreground));
1688
+ display: grid;
1689
+ gap: var(--sf-space-2xs);
1690
+ padding: var(--sf-alert-padding);
1691
+ }
1692
+
1693
+ .sf-alert__title {
1694
+ font-weight: 800;
1695
+ }
1696
+
1697
+ .sf-alert--info,
1698
+ .sf-alert[data-variant="info"] {
1699
+ --sf-alert-bg: var(--sf-colour-info-soft);
1700
+ --sf-alert-border: color-mix(in oklch, var(--sf-colour-info) 32%, transparent);
1701
+ }
1702
+
1703
+ .sf-alert--success,
1704
+ .sf-alert[data-variant="success"] {
1705
+ --sf-alert-bg: var(--sf-colour-success-soft);
1706
+ --sf-alert-border: color-mix(in oklch, var(--sf-colour-success) 32%, transparent);
1707
+ }
1708
+
1709
+ .sf-alert--warning,
1710
+ .sf-alert[data-variant="warning"] {
1711
+ --sf-alert-bg: var(--sf-colour-warning-soft);
1712
+ --sf-alert-border: color-mix(in oklch, var(--sf-colour-warning) 38%, transparent);
1713
+ }
1714
+
1715
+ .sf-alert--danger,
1716
+ .sf-alert[data-variant="danger"] {
1717
+ --sf-alert-bg: var(--sf-colour-danger-soft);
1718
+ --sf-alert-border: color-mix(in oklch, var(--sf-colour-danger) 34%, transparent);
1719
+ }
1720
+
1721
+ .sf-dialog {
1722
+ background: var(--sf-colour-surface);
1723
+ border: 1px solid var(--sf-colour-border);
1724
+ border-radius: var(--sf-radius-panel);
1725
+ box-shadow: var(--sf-shadow-xl);
1726
+ color: var(--sf-colour-foreground);
1727
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-dialog-width, 42rem));
1728
+ max-block-size: min(100% - (var(--sf-gutter) * 2), 42rem);
1729
+ overflow: auto;
1730
+ padding: 0;
1731
+ }
1732
+
1733
+ .sf-dialog::backdrop,
1734
+ .sf-popover::backdrop,
1735
+ .sf-drawer::backdrop {
1736
+ background: oklch(0% 0 0 / 0.48);
1737
+ }
1738
+
1739
+ .sf-dialog__header,
1740
+ .sf-dialog__body,
1741
+ .sf-dialog__footer {
1742
+ padding: var(--sf-space-s-m);
1743
+ }
1744
+
1745
+ .sf-dialog__header,
1746
+ .sf-dialog__footer {
1747
+ display: flex;
1748
+ flex-wrap: wrap;
1749
+ gap: var(--sf-space-s);
1750
+ justify-content: space-between;
1751
+ }
1752
+
1753
+ .sf-dialog__header {
1754
+ border-block-end: 1px solid var(--sf-colour-border);
1755
+ }
1756
+
1757
+ .sf-dialog__footer {
1758
+ border-block-start: 1px solid var(--sf-colour-border);
1759
+ justify-content: flex-end;
1760
+ }
1761
+
1762
+ .sf-popover,
1763
+ .sf-menu-popover,
1764
+ .sf-tooltip,
1765
+ .sf-toast,
1766
+ .sf-banner,
1767
+ .sf-drawer {
1768
+ background: var(--sf-colour-surface);
1769
+ border: 1px solid var(--sf-colour-border);
1770
+ border-radius: var(--sf-radius-panel);
1771
+ box-shadow: var(--sf-shadow-lg);
1772
+ color: var(--sf-colour-foreground);
1773
+ inset: unset;
1774
+ margin: 0;
1775
+ max-block-size: calc(100dvh - (var(--sf-space-s) * 2));
1776
+ overflow: auto;
1777
+ padding: var(--sf-space-s);
1778
+ }
1779
+
1780
+ :where(.sf-popover, .sf-menu-popover, .sf-tooltip, .sf-toast, .sf-banner, .sf-drawer)[popover] {
1781
+ display: none;
1782
+ }
1783
+
1784
+ :where(.sf-popover, .sf-menu-popover, .sf-tooltip, .sf-toast, .sf-banner, .sf-drawer):popover-open {
1785
+ display: grid;
1786
+ gap: var(--sf-space-xs);
1787
+ }
1788
+
1789
+ .sf-popover {
1790
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-popover-width, 22rem));
1791
+ }
1792
+
1793
+ .sf-menu-popover,
1794
+ .sf-menu {
1795
+ display: grid;
1796
+ gap: var(--sf-space-2xs);
1797
+ min-inline-size: var(--sf-menu-min, 12rem);
1798
+ }
1799
+
1800
+ .sf-menu :where(a, button),
1801
+ .sf-menu-popover :where(a, button) {
1802
+ border-radius: var(--sf-radius-sm);
1803
+ color: inherit;
1804
+ padding-block: var(--sf-space-3xs);
1805
+ padding-inline: var(--sf-space-2xs);
1806
+ text-align: start;
1807
+ text-decoration: none;
1808
+ }
1809
+
1810
+ .sf-menu :where(a, button):hover,
1811
+ .sf-menu-popover :where(a, button):hover {
1812
+ background: var(--sf-colour-surface-alt);
1813
+ }
1814
+
1815
+ .sf-tooltip {
1816
+ border-radius: var(--sf-radius-md);
1817
+ box-shadow: var(--sf-shadow-md);
1818
+ font-size: var(--sf-step--1);
1819
+ inline-size: max-content;
1820
+ max-inline-size: min(22rem, calc(100vw - (var(--sf-gutter) * 2)));
1821
+ padding-block: var(--sf-space-2xs);
1822
+ padding-inline: var(--sf-space-xs);
1823
+ }
1824
+
1825
+ .sf-tooltip-trigger {
1826
+ border-block-end: 0.08em dotted currentColor;
1827
+ cursor: help;
1828
+ text-decoration: none;
1829
+ }
1830
+
1831
+ .sf-toast {
1832
+ block-size: auto;
1833
+ bottom: auto;
1834
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-toast-width, 24rem));
1835
+ left: auto;
1836
+ position: fixed;
1837
+ right: var(--sf-space-s);
1838
+ top: var(--sf-space-s);
1839
+ }
1840
+
1841
+ .sf-banner {
1842
+ block-size: auto;
1843
+ border-radius: var(--sf-radius-lg);
1844
+ bottom: auto;
1845
+ inline-size: min(100% - (var(--sf-gutter) * 2), var(--sf-banner-width, 64rem));
1846
+ left: var(--sf-space-s);
1847
+ margin-inline: auto;
1848
+ position: fixed;
1849
+ right: var(--sf-space-s);
1850
+ top: var(--sf-space-s);
1851
+ }
1852
+
1853
+ .sf-drawer {
1854
+ block-size: 100dvh;
1855
+ border-radius: 0;
1856
+ inline-size: min(100%, var(--sf-drawer-width, 24rem));
1857
+ max-block-size: 100dvh;
1858
+ overflow: auto;
1859
+ position: fixed;
1860
+ top: 0;
1861
+ bottom: 0;
1862
+ }
1863
+
1864
+ .sf-drawer--left {
1865
+ left: 0;
1866
+ right: auto;
1867
+ }
1868
+
1869
+ .sf-drawer--right {
1870
+ left: auto;
1871
+ right: 0;
1872
+ }
1873
+
1874
+ .sf-drawer--bottom {
1875
+ block-size: auto;
1876
+ border-start-start-radius: var(--sf-radius-panel);
1877
+ border-start-end-radius: var(--sf-radius-panel);
1878
+ inline-size: 100%;
1879
+ left: 0;
1880
+ right: 0;
1881
+ top: auto;
1882
+ bottom: 0;
1883
+ max-block-size: min(80dvh, 42rem);
1884
+ }
1885
+
1886
+ .sf-drawer--stack {
1887
+ flex-direction: column;
1888
+ gap: var(--sf-space-s);
1889
+ }
1890
+
1891
+ .sf-drawer--stack:not([popover]),
1892
+ .sf-drawer--stack:popover-open {
1893
+ display: flex;
1894
+ }
1895
+
1896
+ @supports (anchor-name: --sf-anchor) {
1897
+ .sf-tooltip-trigger,
1898
+ [data-sf-anchor] {
1899
+ anchor-name: var(--sf-anchor-name, --sf-anchor);
1900
+ }
1901
+
1902
+ .sf-tooltip,
1903
+ .sf-popover,
1904
+ .sf-menu-popover {
1905
+ position-anchor: var(--sf-anchor-name, --sf-anchor);
1906
+ position-area: block-end span-inline-end;
1907
+ position-try-fallbacks: flip-block, flip-inline;
1908
+ }
1909
+ }
1910
+
1911
+ .sf-disclosure,
1912
+ .sf-accordion {
1913
+ display: grid;
1914
+ gap: var(--sf-space-xs);
1915
+ }
1916
+
1917
+ .sf-disclosure > details,
1918
+ details.sf-disclosure,
1919
+ .sf-accordion > details {
1920
+ background: var(--sf-colour-surface);
1921
+ border: 1px solid var(--sf-colour-border);
1922
+ border-radius: var(--sf-radius-lg);
1923
+ padding: var(--sf-space-s);
1924
+ }
1925
+
1926
+ .sf-disclosure summary,
1927
+ .sf-accordion summary {
1928
+ cursor: pointer;
1929
+ font-weight: 800;
1930
+ }
1931
+
1932
+ .sf-disclosure :where(details[open]),
1933
+ details.sf-disclosure[open],
1934
+ .sf-accordion details[open] {
1935
+ border-color: color-mix(in oklch, var(--sf-colour-primary) 30%, var(--sf-colour-border));
1936
+ box-shadow: var(--sf-shadow-sm);
1937
+ }
1938
+
1939
+ .sf-tabs {
1940
+ display: grid;
1941
+ gap: var(--sf-space-s);
1942
+ }
1943
+
1944
+ .sf-tab-list {
1945
+ align-items: center;
1946
+ border-block-end: 1px solid var(--sf-colour-border);
1947
+ display: flex;
1948
+ flex-wrap: wrap;
1949
+ gap: var(--sf-space-2xs);
1950
+ }
1951
+
1952
+ .sf-tab {
1953
+ border-block-end: 0.125rem solid transparent;
1954
+ color: var(--sf-colour-muted);
1955
+ display: inline-flex;
1956
+ font-weight: 800;
1957
+ padding-block: var(--sf-space-xs);
1958
+ padding-inline: var(--sf-space-s);
1959
+ text-decoration: none;
1960
+ }
1961
+
1962
+ .sf-tab:hover,
1963
+ .sf-tab[aria-selected="true"],
1964
+ .sf-tab[data-state="active"] {
1965
+ border-block-end-color: var(--sf-colour-primary);
1966
+ color: var(--sf-colour-foreground);
1967
+ }
1968
+
1969
+ .sf-tab-panel {
1970
+ background: var(--sf-colour-surface);
1971
+ border: 1px solid var(--sf-colour-border);
1972
+ border-radius: var(--sf-radius-panel);
1973
+ padding: var(--sf-space-s-m);
1974
+ }
1975
+
1976
+ .sf-tabs > input[type="radio"] {
1977
+ position: absolute;
1978
+ opacity: 0;
1979
+ pointer-events: none;
1980
+ }
1981
+
1982
+ .sf-tabs > input[type="radio"] ~ .sf-tab-panels > .sf-tab-panel {
1983
+ display: none;
1984
+ }
1985
+
1986
+ .sf-tabs > input[type="radio"]:nth-of-type(1):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(1),
1987
+ .sf-tabs > input[type="radio"]:nth-of-type(2):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(2),
1988
+ .sf-tabs > input[type="radio"]:nth-of-type(3):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(3),
1989
+ .sf-tabs > input[type="radio"]:nth-of-type(4):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(4),
1990
+ .sf-tabs > input[type="radio"]:nth-of-type(5):checked ~ .sf-tab-panels > .sf-tab-panel:nth-child(5) {
1991
+ display: block;
1992
+ }
1993
+
1994
+ .sf-nav--mobile {
1995
+ align-items: center;
1996
+ display: flex;
1997
+ gap: var(--sf-space-s);
1998
+ justify-content: space-between;
1999
+ }
2000
+
2001
+ .sf-breadcrumb,
2002
+ .sf-pagination {
2003
+ align-items: center;
2004
+ display: flex;
2005
+ flex-wrap: wrap;
2006
+ gap: var(--sf-space-2xs);
2007
+ list-style: none;
2008
+ padding-inline-start: 0;
2009
+ }
2010
+
2011
+ .sf-breadcrumb a,
2012
+ .sf-pagination a,
2013
+ .sf-pagination [aria-current="page"] {
2014
+ border-radius: var(--sf-radius-sm);
2015
+ color: var(--sf-colour-muted);
2016
+ display: inline-flex;
2017
+ font-size: var(--sf-step--1);
2018
+ font-weight: 700;
2019
+ padding-block: var(--sf-space-3xs);
2020
+ padding-inline: var(--sf-space-2xs);
2021
+ text-decoration: none;
2022
+ }
2023
+
2024
+ .sf-breadcrumb li + li::before {
2025
+ color: var(--sf-colour-subtle);
2026
+ content: "/";
2027
+ margin-inline-end: var(--sf-space-2xs);
2028
+ }
2029
+
2030
+ .sf-pagination a:hover,
2031
+ .sf-pagination [aria-current="page"] {
2032
+ background: var(--sf-colour-surface-alt);
2033
+ color: var(--sf-colour-foreground);
2034
+ }
2035
+
2036
+ @media (forced-colors: active) {
2037
+ :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) {
2038
+ border-color: ButtonText;
2039
+ forced-color-adjust: auto;
2040
+ }
2041
+
2042
+ .sf-button {
2043
+ background: ButtonFace;
2044
+ color: ButtonText;
2045
+ }
2046
+
2047
+ .sf-button--default,
2048
+ .sf-button[data-variant="default"] {
2049
+ background: Highlight;
2050
+ border-color: Highlight;
2051
+ color: HighlightText;
2052
+ }
2053
+
2054
+ :where(.sf-input, .sf-select, .sf-textarea)[aria-invalid="true"],
2055
+ .sf-field[data-invalid="true"] :where(.sf-input, .sf-select, .sf-textarea) {
2056
+ border-color: Mark;
2057
+ box-shadow: none;
2058
+ }
2059
+ }
2060
+ }
2061
+ @layer utilities {
2062
+ .sf-text-caption { font-size: var(--sf-step--1); line-height: 1.35; }
2063
+ .sf-text-body { font-size: var(--sf-step-0); line-height: 1.5; }
2064
+ .sf-text-lead { font-size: var(--sf-step-1); line-height: 1.45; }
2065
+ .sf-text-h4 { font-size: var(--sf-step-3); line-height: 1.1; }
2066
+ .sf-text-h3 { font-size: var(--sf-step-4); line-height: 1.05; }
2067
+ .sf-text-h2 { font-size: var(--sf-step-5); line-height: 1; }
2068
+ .sf-text-h1 { font-size: var(--sf-step-6); line-height: 1; }
2069
+ .sf-text-display { font-size: var(--sf-step-7); line-height: .95; }
2070
+
2071
+ .sf-text-balance { text-wrap: balance; }
2072
+ .sf-text-pretty { text-wrap: pretty; }
2073
+ .sf-text-muted { color: var(--sf-colour-muted); }
2074
+ .sf-text-subtle { color: var(--sf-colour-subtle); }
2075
+ .sf-text-primary { color: var(--sf-colour-primary); }
2076
+ .sf-text-success { color: var(--sf-colour-success); }
2077
+ .sf-text-warning { color: var(--sf-colour-warning); }
2078
+ .sf-text-danger { color: var(--sf-colour-danger); }
2079
+
2080
+ .sf-font-sans { font-family: var(--sf-font-sans); }
2081
+ .sf-font-display { font-family: var(--sf-font-display); }
2082
+ .sf-font-mono { font-family: var(--sf-font-mono); }
2083
+
2084
+ .sf-bg-background { background: var(--sf-colour-background); }
2085
+ .sf-bg-surface { background: var(--sf-colour-surface); }
2086
+ .sf-bg-surface-alt { background: var(--sf-colour-surface-alt); }
2087
+ .sf-bg-primary-soft { background: var(--sf-colour-primary-soft); }
2088
+ .sf-bg-success-soft { background: var(--sf-colour-success-soft); }
2089
+ .sf-bg-warning-soft { background: var(--sf-colour-warning-soft); }
2090
+ .sf-bg-danger-soft { background: var(--sf-colour-danger-soft); }
2091
+
2092
+ .sf-border { border: 1px solid var(--sf-colour-border); }
2093
+ .sf-border-strong { border: 1px solid var(--sf-colour-border-strong); }
2094
+ .sf-rounded { border-radius: var(--sf-radius-md); }
2095
+ .sf-rounded-panel { border-radius: var(--sf-radius-panel); }
2096
+ .sf-rounded-full { border-radius: var(--sf-radius-full); }
2097
+ .sf-shadow-sm { box-shadow: var(--sf-shadow-sm); }
2098
+ .sf-shadow-md { box-shadow: var(--sf-shadow-md); }
2099
+ .sf-shadow-lg { box-shadow: var(--sf-shadow-lg); }
2100
+ .sf-shadow-none { box-shadow: none; }
2101
+
2102
+ .sf-push-block-end { margin-block-start: auto; }
2103
+ .sf-push-block-start { margin-block-end: auto; }
2104
+ .sf-push-inline-end { margin-inline-start: auto; }
2105
+ .sf-push-inline-start { margin-inline-end: auto; }
2106
+
2107
+ .sf-prose {
2108
+ max-inline-size: var(--sf-prose-width, 68ch);
2109
+ }
2110
+
2111
+ .sf-prose--blog { --sf-prose-width: 72ch; }
2112
+ .sf-prose--legal { --sf-prose-width: 80ch; }
2113
+
2114
+ :where(.sf-prose--blog, .sf-prose--legal) > * + * {
2115
+ margin-block-start: var(--sf-space-s);
2116
+ }
2117
+
2118
+ :where(.sf-prose--blog, .sf-prose--legal) :where(h2, h3) {
2119
+ margin-block-start: var(--sf-space-l);
2120
+ }
2121
+
2122
+ .sf-meta {
2123
+ align-items: center;
2124
+ color: var(--sf-colour-muted);
2125
+ display: flex;
2126
+ flex-wrap: wrap;
2127
+ font-size: var(--sf-step--1);
2128
+ font-weight: 700;
2129
+ gap: var(--sf-space-2xs);
2130
+ }
2131
+
2132
+ .sf-figure {
2133
+ display: grid;
2134
+ gap: var(--sf-space-xs);
2135
+ }
2136
+
2137
+ .sf-caption {
2138
+ color: var(--sf-colour-muted);
2139
+ font-size: var(--sf-step--1);
2140
+ }
2141
+
2142
+ .sf-table-wrap {
2143
+ border: 1px solid var(--sf-colour-border);
2144
+ border-radius: var(--sf-radius-panel);
2145
+ overflow-x: auto;
2146
+ }
2147
+
2148
+ .sf-table-wrap table {
2149
+ border-collapse: collapse;
2150
+ inline-size: 100%;
2151
+ min-inline-size: var(--sf-table-min, 42rem);
2152
+ }
2153
+
2154
+ .sf-table-wrap :where(th, td) {
2155
+ border-block-end: 1px solid var(--sf-colour-border);
2156
+ padding: var(--sf-space-xs);
2157
+ text-align: start;
2158
+ }
2159
+
2160
+ .sf-table-wrap :where(th) {
2161
+ background: var(--sf-colour-surface-alt);
2162
+ font-weight: 800;
2163
+ }
2164
+
2165
+ :where(.sf-visually-hidden, .sr-only) {
2166
+ block-size: 0.0625rem;
2167
+ border: 0;
2168
+ clip: rect(0 0 0 0);
2169
+ clip-path: inset(50%);
2170
+ inline-size: 0.0625rem;
2171
+ margin: -0.0625rem;
2172
+ overflow: hidden;
2173
+ padding: 0;
2174
+ position: absolute;
2175
+ white-space: nowrap;
2176
+ }
2177
+
2178
+ :where(.sf-not-visually-hidden, .not-sr-only) {
2179
+ block-size: auto;
2180
+ clip: auto;
2181
+ clip-path: none;
2182
+ inline-size: auto;
2183
+ margin: 0;
2184
+ overflow: visible;
2185
+ padding: 0;
2186
+ position: static;
2187
+ white-space: normal;
2188
+ }
2189
+
2190
+ .sf-skip-link {
2191
+ background: var(--sf-colour-primary);
2192
+ border-radius: var(--sf-radius-md);
2193
+ box-shadow: var(--sf-shadow-md);
2194
+ color: var(--sf-colour-primary-foreground);
2195
+ inset-block-start: var(--sf-space-s);
2196
+ inset-inline-start: var(--sf-space-s);
2197
+ opacity: 0;
2198
+ padding-block: var(--sf-space-2xs);
2199
+ padding-inline: var(--sf-space-s);
2200
+ pointer-events: none;
2201
+ position: fixed;
2202
+ text-decoration: none;
2203
+ transform: translateY(calc(-100% - var(--sf-space-m)));
2204
+ transition: opacity var(--sf-duration-fast) var(--sf-ease-standard), transform var(--sf-duration-fast) var(--sf-ease-standard);
2205
+ z-index: 999;
2206
+ }
2207
+
2208
+ .sf-skip-link:focus-visible {
2209
+ opacity: 1;
2210
+ pointer-events: auto;
2211
+ transform: translateY(0);
2212
+ }
2213
+
2214
+ .sf-focus-ring:focus-visible {
2215
+ outline: 0.125rem solid var(--sf-colour-ring);
2216
+ outline-offset: .2rem;
2217
+ }
2218
+
2219
+ .sf-focus-ring-inset:focus-visible {
2220
+ outline: 0.125rem solid var(--sf-colour-ring);
2221
+ outline-offset: -0.125rem;
2222
+ }
2223
+
2224
+ .sf-touch-target {
2225
+ min-block-size: 2.75rem;
2226
+ min-inline-size: 2.75rem;
2227
+ }
2228
+
2229
+ .sf-list-reset {
2230
+ list-style: none;
2231
+ padding-inline-start: 0;
2232
+ }
2233
+
2234
+ .sf-list-disc {
2235
+ list-style: disc;
2236
+ padding-inline-start: var(--sf-space-m);
2237
+ }
2238
+
2239
+ .sf-list-decimal {
2240
+ list-style: decimal;
2241
+ padding-inline-start: var(--sf-space-m);
2242
+ }
2243
+
2244
+ :where(.sf-link, .sf-link-subtle) {
2245
+ text-decoration: underline;
2246
+ text-decoration-color: color-mix(in oklch, currentColor 45%, transparent);
2247
+ text-decoration-skip-ink: auto;
2248
+ text-decoration-thickness: .08em;
2249
+ text-underline-offset: .18em;
2250
+ }
2251
+
2252
+ .sf-link { color: var(--sf-colour-primary); }
2253
+
2254
+ .sf-link:hover,
2255
+ .sf-link-subtle:hover {
2256
+ text-decoration-color: currentColor;
2257
+ }
2258
+
2259
+ .sf-link-plain {
2260
+ color: inherit;
2261
+ text-decoration: none;
2262
+ }
2263
+
2264
+ .sf-full-bleed {
2265
+ inline-size: 100vw;
2266
+ margin-inline-start: 50%;
2267
+ transform: translateX(-50%);
2268
+ }
2269
+
2270
+ .sf-animate-fade,
2271
+ .sf-animate-rise,
2272
+ .sf-animate-scale,
2273
+ .sf-animate-slide {
2274
+ animation-duration: var(--sf-motion-duration, var(--sf-duration-slow));
2275
+ animation-fill-mode: both;
2276
+ animation-timing-function: var(--sf-motion-ease, var(--sf-ease-emphasized));
2277
+ }
2278
+
2279
+ .sf-animate-fade { animation-name: sf-fade; }
2280
+ .sf-animate-rise { animation-name: sf-rise; }
2281
+ .sf-animate-scale { animation-name: sf-scale; }
2282
+ .sf-animate-slide { animation-name: sf-slide; }
2283
+
2284
+ .sf-animate-stagger > * {
2285
+ animation-delay: calc(var(--sf-stagger-index, 0) * var(--sf-stagger-step, 80ms));
2286
+ }
2287
+
2288
+ @keyframes sf-fade {
2289
+ from { opacity: 0; }
2290
+ to { opacity: 1; }
2291
+ }
2292
+
2293
+ @keyframes sf-rise {
2294
+ from { opacity: 0; transform: translateY(var(--sf-motion-distance, var(--sf-space-s))); }
2295
+ to { opacity: 1; transform: translateY(0); }
2296
+ }
2297
+
2298
+ @keyframes sf-scale {
2299
+ from { opacity: 0; transform: scale(.96); }
2300
+ to { opacity: 1; transform: scale(1); }
2301
+ }
2302
+
2303
+ @keyframes sf-slide {
2304
+ from { opacity: 0; transform: translateX(var(--sf-motion-distance, var(--sf-space-s))); }
2305
+ to { opacity: 1; transform: translateX(0); }
2306
+ }
2307
+
2308
+ @media (prefers-reduced-motion: reduce) {
2309
+ :where(.sf-animate-fade, .sf-animate-rise, .sf-animate-scale, .sf-animate-slide) {
2310
+ animation: none;
2311
+ }
2312
+ }
2313
+ }