@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/tokens.css ADDED
@@ -0,0 +1,198 @@
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
+ }
package/utilities.css ADDED
@@ -0,0 +1,255 @@
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 utilities {
4
+ .sf-text-caption { font-size: var(--sf-step--1); line-height: 1.35; }
5
+ .sf-text-body { font-size: var(--sf-step-0); line-height: 1.5; }
6
+ .sf-text-lead { font-size: var(--sf-step-1); line-height: 1.45; }
7
+ .sf-text-h4 { font-size: var(--sf-step-3); line-height: 1.1; }
8
+ .sf-text-h3 { font-size: var(--sf-step-4); line-height: 1.05; }
9
+ .sf-text-h2 { font-size: var(--sf-step-5); line-height: 1; }
10
+ .sf-text-h1 { font-size: var(--sf-step-6); line-height: 1; }
11
+ .sf-text-display { font-size: var(--sf-step-7); line-height: .95; }
12
+
13
+ .sf-text-balance { text-wrap: balance; }
14
+ .sf-text-pretty { text-wrap: pretty; }
15
+ .sf-text-muted { color: var(--sf-colour-muted); }
16
+ .sf-text-subtle { color: var(--sf-colour-subtle); }
17
+ .sf-text-primary { color: var(--sf-colour-primary); }
18
+ .sf-text-success { color: var(--sf-colour-success); }
19
+ .sf-text-warning { color: var(--sf-colour-warning); }
20
+ .sf-text-danger { color: var(--sf-colour-danger); }
21
+
22
+ .sf-font-sans { font-family: var(--sf-font-sans); }
23
+ .sf-font-display { font-family: var(--sf-font-display); }
24
+ .sf-font-mono { font-family: var(--sf-font-mono); }
25
+
26
+ .sf-bg-background { background: var(--sf-colour-background); }
27
+ .sf-bg-surface { background: var(--sf-colour-surface); }
28
+ .sf-bg-surface-alt { background: var(--sf-colour-surface-alt); }
29
+ .sf-bg-primary-soft { background: var(--sf-colour-primary-soft); }
30
+ .sf-bg-success-soft { background: var(--sf-colour-success-soft); }
31
+ .sf-bg-warning-soft { background: var(--sf-colour-warning-soft); }
32
+ .sf-bg-danger-soft { background: var(--sf-colour-danger-soft); }
33
+
34
+ .sf-border { border: 1px solid var(--sf-colour-border); }
35
+ .sf-border-strong { border: 1px solid var(--sf-colour-border-strong); }
36
+ .sf-rounded { border-radius: var(--sf-radius-md); }
37
+ .sf-rounded-panel { border-radius: var(--sf-radius-panel); }
38
+ .sf-rounded-full { border-radius: var(--sf-radius-full); }
39
+ .sf-shadow-sm { box-shadow: var(--sf-shadow-sm); }
40
+ .sf-shadow-md { box-shadow: var(--sf-shadow-md); }
41
+ .sf-shadow-lg { box-shadow: var(--sf-shadow-lg); }
42
+ .sf-shadow-none { box-shadow: none; }
43
+
44
+ .sf-push-block-end { margin-block-start: auto; }
45
+ .sf-push-block-start { margin-block-end: auto; }
46
+ .sf-push-inline-end { margin-inline-start: auto; }
47
+ .sf-push-inline-start { margin-inline-end: auto; }
48
+
49
+ .sf-prose {
50
+ max-inline-size: var(--sf-prose-width, 68ch);
51
+ }
52
+
53
+ .sf-prose--blog { --sf-prose-width: 72ch; }
54
+ .sf-prose--legal { --sf-prose-width: 80ch; }
55
+
56
+ :where(.sf-prose--blog, .sf-prose--legal) > * + * {
57
+ margin-block-start: var(--sf-space-s);
58
+ }
59
+
60
+ :where(.sf-prose--blog, .sf-prose--legal) :where(h2, h3) {
61
+ margin-block-start: var(--sf-space-l);
62
+ }
63
+
64
+ .sf-meta {
65
+ align-items: center;
66
+ color: var(--sf-colour-muted);
67
+ display: flex;
68
+ flex-wrap: wrap;
69
+ font-size: var(--sf-step--1);
70
+ font-weight: 700;
71
+ gap: var(--sf-space-2xs);
72
+ }
73
+
74
+ .sf-figure {
75
+ display: grid;
76
+ gap: var(--sf-space-xs);
77
+ }
78
+
79
+ .sf-caption {
80
+ color: var(--sf-colour-muted);
81
+ font-size: var(--sf-step--1);
82
+ }
83
+
84
+ .sf-table-wrap {
85
+ border: 1px solid var(--sf-colour-border);
86
+ border-radius: var(--sf-radius-panel);
87
+ overflow-x: auto;
88
+ }
89
+
90
+ .sf-table-wrap table {
91
+ border-collapse: collapse;
92
+ inline-size: 100%;
93
+ min-inline-size: var(--sf-table-min, 42rem);
94
+ }
95
+
96
+ .sf-table-wrap :where(th, td) {
97
+ border-block-end: 1px solid var(--sf-colour-border);
98
+ padding: var(--sf-space-xs);
99
+ text-align: start;
100
+ }
101
+
102
+ .sf-table-wrap :where(th) {
103
+ background: var(--sf-colour-surface-alt);
104
+ font-weight: 800;
105
+ }
106
+
107
+ :where(.sf-visually-hidden, .sr-only) {
108
+ block-size: 0.0625rem;
109
+ border: 0;
110
+ clip: rect(0 0 0 0);
111
+ clip-path: inset(50%);
112
+ inline-size: 0.0625rem;
113
+ margin: -0.0625rem;
114
+ overflow: hidden;
115
+ padding: 0;
116
+ position: absolute;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ :where(.sf-not-visually-hidden, .not-sr-only) {
121
+ block-size: auto;
122
+ clip: auto;
123
+ clip-path: none;
124
+ inline-size: auto;
125
+ margin: 0;
126
+ overflow: visible;
127
+ padding: 0;
128
+ position: static;
129
+ white-space: normal;
130
+ }
131
+
132
+ .sf-skip-link {
133
+ background: var(--sf-colour-primary);
134
+ border-radius: var(--sf-radius-md);
135
+ box-shadow: var(--sf-shadow-md);
136
+ color: var(--sf-colour-primary-foreground);
137
+ inset-block-start: var(--sf-space-s);
138
+ inset-inline-start: var(--sf-space-s);
139
+ opacity: 0;
140
+ padding-block: var(--sf-space-2xs);
141
+ padding-inline: var(--sf-space-s);
142
+ pointer-events: none;
143
+ position: fixed;
144
+ text-decoration: none;
145
+ transform: translateY(calc(-100% - var(--sf-space-m)));
146
+ transition: opacity var(--sf-duration-fast) var(--sf-ease-standard), transform var(--sf-duration-fast) var(--sf-ease-standard);
147
+ z-index: 999;
148
+ }
149
+
150
+ .sf-skip-link:focus-visible {
151
+ opacity: 1;
152
+ pointer-events: auto;
153
+ transform: translateY(0);
154
+ }
155
+
156
+ .sf-focus-ring:focus-visible {
157
+ outline: 0.125rem solid var(--sf-colour-ring);
158
+ outline-offset: .2rem;
159
+ }
160
+
161
+ .sf-focus-ring-inset:focus-visible {
162
+ outline: 0.125rem solid var(--sf-colour-ring);
163
+ outline-offset: -0.125rem;
164
+ }
165
+
166
+ .sf-touch-target {
167
+ min-block-size: 2.75rem;
168
+ min-inline-size: 2.75rem;
169
+ }
170
+
171
+ .sf-list-reset {
172
+ list-style: none;
173
+ padding-inline-start: 0;
174
+ }
175
+
176
+ .sf-list-disc {
177
+ list-style: disc;
178
+ padding-inline-start: var(--sf-space-m);
179
+ }
180
+
181
+ .sf-list-decimal {
182
+ list-style: decimal;
183
+ padding-inline-start: var(--sf-space-m);
184
+ }
185
+
186
+ :where(.sf-link, .sf-link-subtle) {
187
+ text-decoration: underline;
188
+ text-decoration-color: color-mix(in oklch, currentColor 45%, transparent);
189
+ text-decoration-skip-ink: auto;
190
+ text-decoration-thickness: .08em;
191
+ text-underline-offset: .18em;
192
+ }
193
+
194
+ .sf-link { color: var(--sf-colour-primary); }
195
+
196
+ .sf-link:hover,
197
+ .sf-link-subtle:hover {
198
+ text-decoration-color: currentColor;
199
+ }
200
+
201
+ .sf-link-plain {
202
+ color: inherit;
203
+ text-decoration: none;
204
+ }
205
+
206
+ .sf-full-bleed {
207
+ inline-size: 100vw;
208
+ margin-inline-start: 50%;
209
+ transform: translateX(-50%);
210
+ }
211
+
212
+ .sf-animate-fade,
213
+ .sf-animate-rise,
214
+ .sf-animate-scale,
215
+ .sf-animate-slide {
216
+ animation-duration: var(--sf-motion-duration, var(--sf-duration-slow));
217
+ animation-fill-mode: both;
218
+ animation-timing-function: var(--sf-motion-ease, var(--sf-ease-emphasized));
219
+ }
220
+
221
+ .sf-animate-fade { animation-name: sf-fade; }
222
+ .sf-animate-rise { animation-name: sf-rise; }
223
+ .sf-animate-scale { animation-name: sf-scale; }
224
+ .sf-animate-slide { animation-name: sf-slide; }
225
+
226
+ .sf-animate-stagger > * {
227
+ animation-delay: calc(var(--sf-stagger-index, 0) * var(--sf-stagger-step, 80ms));
228
+ }
229
+
230
+ @keyframes sf-fade {
231
+ from { opacity: 0; }
232
+ to { opacity: 1; }
233
+ }
234
+
235
+ @keyframes sf-rise {
236
+ from { opacity: 0; transform: translateY(var(--sf-motion-distance, var(--sf-space-s))); }
237
+ to { opacity: 1; transform: translateY(0); }
238
+ }
239
+
240
+ @keyframes sf-scale {
241
+ from { opacity: 0; transform: scale(.96); }
242
+ to { opacity: 1; transform: scale(1); }
243
+ }
244
+
245
+ @keyframes sf-slide {
246
+ from { opacity: 0; transform: translateX(var(--sf-motion-distance, var(--sf-space-s))); }
247
+ to { opacity: 1; transform: translateX(0); }
248
+ }
249
+
250
+ @media (prefers-reduced-motion: reduce) {
251
+ :where(.sf-animate-fade, .sf-animate-rise, .sf-animate-scale, .sf-animate-slide) {
252
+ animation: none;
253
+ }
254
+ }
255
+ }