@syncedco/flow 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/styles.css CHANGED
@@ -21,6 +21,7 @@
21
21
  --sf-type-caption-sm: var(--sf-step--2);
22
22
  --sf-type-caption: var(--sf-step--1);
23
23
  --sf-type-body: var(--sf-step-0);
24
+ --sf-text-base: var(--sf-type-body);
24
25
  --sf-type-lead: var(--sf-step-1);
25
26
  --sf-type-h6: var(--sf-step-1);
26
27
  --sf-type-h5: var(--sf-step-2);
@@ -93,6 +94,8 @@
93
94
  --sf-colour-orange-500: oklch(74% 0.17 48);
94
95
  --sf-colour-orange-600: oklch(68% 0.18 44);
95
96
  --sf-colour-orange-700: oklch(58% 0.17 42);
97
+ --sf-colour-orange-800: oklch(50% 0.16 40);
98
+ --sf-colour-orange-900: oklch(44% 0.14 40);
96
99
  --sf-colour-green-500: oklch(62% 0.13 150);
97
100
  --sf-colour-green-600: oklch(54% 0.13 150);
98
101
  --sf-colour-green-700: oklch(44% 0.12 150);
@@ -115,13 +118,13 @@
115
118
  --sf-colour-border: oklch(18% 0.026 250 / 0.12);
116
119
  --sf-colour-border-strong: oklch(18% 0.026 250 / 0.22);
117
120
  --sf-colour-backdrop: oklch(0% 0 0 / 0.48);
118
- --sf-colour-primary: var(--sf-colour-orange-600);
119
- --sf-colour-primary-hover: var(--sf-colour-orange-700);
121
+ --sf-colour-primary: var(--sf-colour-orange-800);
122
+ --sf-colour-primary-hover: var(--sf-colour-orange-900);
120
123
  --sf-colour-primary-foreground: var(--sf-colour-neutral-0);
121
- --sf-colour-primary-soft: oklch(68% 0.18 44 / 0.12);
122
- --sf-colour-primary-soft-border: oklch(68% 0.18 44 / 0.28);
123
- --sf-colour-link: var(--sf-colour-orange-700);
124
- --sf-colour-link-hover: var(--sf-colour-orange-600);
124
+ --sf-colour-primary-soft: oklch(50% 0.16 40 / 0.12);
125
+ --sf-colour-primary-soft-border: oklch(50% 0.16 40 / 0.28);
126
+ --sf-colour-link: var(--sf-colour-orange-800);
127
+ --sf-colour-link-hover: var(--sf-colour-orange-900);
125
128
  --sf-colour-accent: var(--sf-colour-cyan-500);
126
129
  --sf-colour-accent-foreground: var(--sf-colour-neutral-950);
127
130
  --sf-colour-success: var(--sf-colour-green-500);
@@ -130,7 +133,7 @@
130
133
  --sf-colour-warning: var(--sf-colour-amber-500);
131
134
  --sf-colour-warning-foreground: var(--sf-colour-neutral-950);
132
135
  --sf-colour-warning-soft: oklch(78% 0.15 82 / 0.16);
133
- --sf-colour-danger: var(--sf-colour-red-600);
136
+ --sf-colour-danger: var(--sf-colour-red-700);
134
137
  --sf-colour-danger-foreground: var(--sf-colour-neutral-0);
135
138
  --sf-colour-danger-soft: oklch(56% 0.2 28 / 0.12);
136
139
  --sf-colour-info: var(--sf-colour-cyan-600);
@@ -142,7 +145,7 @@
142
145
  --sf-colour-categorical-4: var(--sf-colour-orange-600);
143
146
  --sf-colour-categorical-5: var(--sf-colour-red-600);
144
147
  --sf-colour-categorical-6: oklch(58% 0.15 292);
145
- --sf-colour-ring: var(--sf-colour-orange-600);
148
+ --sf-colour-ring: var(--sf-colour-orange-800);
146
149
 
147
150
  --sf-shadow-sm: 0 0.125rem 0.375rem oklch(0% 0 0 / 0.08);
148
151
  --sf-shadow-md: 0 0.75rem 1.75rem oklch(0% 0 0 / 0.12);
@@ -197,8 +200,8 @@
197
200
  --sf-colour-border: oklch(18% 0.026 250 / 0.12);
198
201
  --sf-colour-border-strong: oklch(18% 0.026 250 / 0.22);
199
202
  --sf-colour-backdrop: oklch(0% 0 0 / 0.48);
200
- --sf-colour-link: var(--sf-colour-orange-700);
201
- --sf-colour-link-hover: var(--sf-colour-orange-600);
203
+ --sf-colour-link: var(--sf-colour-orange-800);
204
+ --sf-colour-link-hover: var(--sf-colour-orange-900);
202
205
  }
203
206
 
204
207
  .sf-theme-dark, [data-sf-theme="dark"] {
@@ -242,7 +245,7 @@
242
245
  @layer reset {
243
246
  *, *::before, *::after { box-sizing: border-box; }
244
247
  *:where(:not(dialog)) { margin: 0; }
245
- html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
248
+ html { font-size: 100%; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
246
249
  body { min-block-size: 100%; }
247
250
  img, picture, video, canvas, svg { display: block; max-inline-size: 100%; }
248
251
  img, video { block-size: auto; }
@@ -254,6 +257,7 @@
254
257
  html {
255
258
  background: var(--sf-colour-background);
256
259
  color: var(--sf-colour-foreground);
260
+ font-size: 100%;
257
261
  scroll-behavior: smooth;
258
262
  }
259
263
 
@@ -261,7 +265,7 @@
261
265
  background: var(--sf-colour-background);
262
266
  color: var(--sf-colour-foreground);
263
267
  font-family: var(--sf-font-sans);
264
- font-size: var(--sf-type-body);
268
+ font-size: var(--sf-text-base);
265
269
  line-height: var(--sf-line-height-body);
266
270
  -webkit-font-smoothing: antialiased;
267
271
  text-rendering: optimizeLegibility;
@@ -952,6 +956,24 @@
952
956
  gap: var(--sf-space-2xs);
953
957
  }
954
958
 
959
+ .sf-spinner {
960
+ animation: sf-spinner-rotate .75s linear infinite;
961
+ block-size: var(--sf-spinner-size, 1em);
962
+ border: .125em solid color-mix(in oklch, currentColor 28%, transparent);
963
+ border-block-start-color: currentColor;
964
+ border-radius: var(--sf-radius-full);
965
+ display: inline-block;
966
+ flex: 0 0 auto;
967
+ inline-size: var(--sf-spinner-size, 1em);
968
+ }
969
+
970
+ .sf-spinner[data-size="sm"] { --sf-spinner-size: .875em; }
971
+ .sf-spinner[data-size="lg"] { --sf-spinner-size: 1.5em; }
972
+
973
+ @keyframes sf-spinner-rotate {
974
+ to { transform: rotate(1turn); }
975
+ }
976
+
955
977
  .sf-icon {
956
978
  block-size: var(--sf-icon-size, 1em);
957
979
  color: var(--sf-icon-colour, currentColor);
@@ -1698,6 +1720,8 @@
1698
1720
 
1699
1721
  .sf-data-table :where(th button, .sf-table-sort) {
1700
1722
  align-items: center;
1723
+ background: transparent;
1724
+ border: 0;
1701
1725
  color: inherit;
1702
1726
  display: inline-flex;
1703
1727
  font: inherit;
@@ -1706,14 +1730,14 @@
1706
1730
  padding: 0;
1707
1731
  }
1708
1732
 
1709
- .sf-data-table :where(th button, .sf-table-sort)[aria-sort]::after {
1733
+ .sf-data-table th[aria-sort] :where(button, .sf-table-sort)::after {
1710
1734
  color: var(--sf-colour-subtle);
1711
1735
  content: "\2195";
1712
1736
  font-size: var(--sf-step--2);
1713
1737
  }
1714
1738
 
1715
- .sf-data-table :where(th button, .sf-table-sort)[aria-sort="ascending"]::after { content: "\2191"; }
1716
- .sf-data-table :where(th button, .sf-table-sort)[aria-sort="descending"]::after { content: "\2193"; }
1739
+ .sf-data-table th[aria-sort="ascending"] :where(button, .sf-table-sort)::after { content: "\2191"; }
1740
+ .sf-data-table th[aria-sort="descending"] :where(button, .sf-table-sort)::after { content: "\2193"; }
1717
1741
 
1718
1742
  .sf-data-table tr[data-clickable="true"] {
1719
1743
  cursor: pointer;
@@ -1788,7 +1812,7 @@
1788
1812
  }
1789
1813
 
1790
1814
  .sf-status::before {
1791
- background: currentColor;
1815
+ background: var(--sf-status-dot, currentColor);
1792
1816
  block-size: .42em;
1793
1817
  border-radius: var(--sf-radius-full);
1794
1818
  content: "";
@@ -1802,25 +1826,29 @@
1802
1826
  .sf-status[data-tone="success"] {
1803
1827
  --sf-status-bg: var(--sf-colour-success-soft);
1804
1828
  --sf-status-border: color-mix(in oklch, var(--sf-colour-success) 34%, transparent);
1805
- --sf-status-colour: color-mix(in oklch, var(--sf-colour-success) 76%, var(--sf-colour-foreground));
1829
+ --sf-status-colour: var(--sf-colour-foreground);
1830
+ --sf-status-dot: var(--sf-colour-success);
1806
1831
  }
1807
1832
 
1808
1833
  .sf-status[data-tone="warning"] {
1809
1834
  --sf-status-bg: var(--sf-colour-warning-soft);
1810
1835
  --sf-status-border: color-mix(in oklch, var(--sf-colour-warning) 38%, transparent);
1811
- --sf-status-colour: color-mix(in oklch, var(--sf-colour-warning) 70%, var(--sf-colour-foreground));
1836
+ --sf-status-colour: var(--sf-colour-foreground);
1837
+ --sf-status-dot: color-mix(in oklch, var(--sf-colour-warning) 60%, var(--sf-colour-foreground));
1812
1838
  }
1813
1839
 
1814
1840
  .sf-status[data-tone="danger"] {
1815
1841
  --sf-status-bg: var(--sf-colour-danger-soft);
1816
1842
  --sf-status-border: color-mix(in oklch, var(--sf-colour-danger) 34%, transparent);
1817
- --sf-status-colour: color-mix(in oklch, var(--sf-colour-danger) 76%, var(--sf-colour-foreground));
1843
+ --sf-status-colour: var(--sf-colour-foreground);
1844
+ --sf-status-dot: var(--sf-colour-danger);
1818
1845
  }
1819
1846
 
1820
1847
  .sf-status[data-tone="info"] {
1821
1848
  --sf-status-bg: var(--sf-colour-info-soft);
1822
1849
  --sf-status-border: color-mix(in oklch, var(--sf-colour-info) 34%, transparent);
1823
- --sf-status-colour: color-mix(in oklch, var(--sf-colour-info) 76%, var(--sf-colour-foreground));
1850
+ --sf-status-colour: var(--sf-colour-foreground);
1851
+ --sf-status-dot: color-mix(in oklch, var(--sf-colour-info) 68%, var(--sf-colour-foreground));
1824
1852
  }
1825
1853
 
1826
1854
  .sf-data-list {
@@ -1944,6 +1972,7 @@
1944
1972
  .sf-form {
1945
1973
  display: grid;
1946
1974
  gap: var(--sf-form-gap, var(--sf-space-s-m));
1975
+ grid-template-columns: minmax(0, 1fr);
1947
1976
  }
1948
1977
 
1949
1978
  .sf-form[data-density="compact"],
@@ -1970,6 +1999,7 @@
1970
1999
  .sf-field {
1971
2000
  display: grid;
1972
2001
  gap: var(--sf-space-2xs);
2002
+ grid-template-columns: minmax(0, 1fr);
1973
2003
  }
1974
2004
 
1975
2005
  .sf-label,
@@ -2052,6 +2082,140 @@
2052
2082
  padding-inline-start: var(--sf-space-l);
2053
2083
  }
2054
2084
 
2085
+ .sf-input-group {
2086
+ align-items: stretch;
2087
+ background: var(--sf-input-bg);
2088
+ border: 1px solid var(--sf-input-border);
2089
+ border-radius: var(--sf-input-radius);
2090
+ display: flex;
2091
+ inline-size: 100%;
2092
+ min-block-size: var(--sf-input-block-size);
2093
+ overflow: clip;
2094
+ 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);
2095
+ }
2096
+
2097
+ .sf-input-group:focus-within {
2098
+ border-color: var(--sf-colour-ring);
2099
+ box-shadow: 0 0 0 .25rem color-mix(in oklch, var(--sf-colour-ring) 18%, transparent);
2100
+ outline: .125rem solid color-mix(in oklch, var(--sf-colour-ring) 24%, transparent);
2101
+ outline-offset: 0;
2102
+ }
2103
+
2104
+ .sf-input-group > :where(.sf-input, .sf-select) {
2105
+ background: transparent;
2106
+ border: 0;
2107
+ border-radius: 0;
2108
+ box-shadow: none;
2109
+ flex: 1 1 0%;
2110
+ inline-size: auto;
2111
+ min-inline-size: 0;
2112
+ outline: 0;
2113
+ }
2114
+
2115
+ .sf-input-group > :where(.sf-input, .sf-select):focus-visible {
2116
+ box-shadow: none;
2117
+ outline: 0;
2118
+ }
2119
+
2120
+ .sf-input-group__leading,
2121
+ .sf-input-group__trailing {
2122
+ align-items: center;
2123
+ color: var(--sf-colour-muted);
2124
+ display: inline-flex;
2125
+ flex: 0 0 auto;
2126
+ padding-inline: var(--sf-space-xs);
2127
+ white-space: nowrap;
2128
+ }
2129
+
2130
+ .sf-input-group__leading { border-inline-end: 1px solid var(--sf-colour-border-subtle); }
2131
+ .sf-input-group__trailing { border-inline-start: 1px solid var(--sf-colour-border-subtle); }
2132
+
2133
+ .sf-input-group__action {
2134
+ align-items: center;
2135
+ background: transparent;
2136
+ border: 0;
2137
+ border-inline-start: 1px solid var(--sf-colour-border-subtle);
2138
+ color: var(--sf-colour-foreground);
2139
+ display: inline-flex;
2140
+ flex: 0 0 auto;
2141
+ font-weight: 700;
2142
+ justify-content: center;
2143
+ padding-inline: var(--sf-space-xs);
2144
+ }
2145
+
2146
+ .sf-input-group__action:hover { background: var(--sf-colour-surface-hover); }
2147
+
2148
+ .sf-input-group[data-invalid="true"],
2149
+ .sf-field[data-invalid="true"] .sf-input-group {
2150
+ border-color: var(--sf-colour-danger);
2151
+ box-shadow: 0 0 0 .25rem var(--sf-colour-danger-soft);
2152
+ }
2153
+
2154
+ .sf-input-group:has(:disabled) {
2155
+ background: var(--sf-colour-surface-alt);
2156
+ color: var(--sf-colour-subtle);
2157
+ opacity: .72;
2158
+ }
2159
+
2160
+ .sf-file-input {
2161
+ background: var(--sf-input-bg);
2162
+ border: 1px solid var(--sf-input-border);
2163
+ border-radius: var(--sf-input-radius);
2164
+ color: var(--sf-colour-muted);
2165
+ inline-size: 100%;
2166
+ min-block-size: var(--sf-input-block-size);
2167
+ padding: var(--sf-space-3xs);
2168
+ }
2169
+
2170
+ .sf-file-input::file-selector-button {
2171
+ background: var(--sf-colour-surface-alt);
2172
+ border: 1px solid var(--sf-colour-border);
2173
+ border-radius: calc(var(--sf-input-radius) - .125rem);
2174
+ color: var(--sf-colour-foreground);
2175
+ font: inherit;
2176
+ font-weight: 700;
2177
+ margin-inline-end: var(--sf-space-xs);
2178
+ min-block-size: calc(var(--sf-input-block-size) - var(--sf-space-2xs));
2179
+ padding-inline: var(--sf-space-xs);
2180
+ }
2181
+
2182
+ .sf-file-input:hover { border-color: var(--sf-colour-border-strong); }
2183
+ .sf-file-input:hover::file-selector-button { background: var(--sf-colour-surface-hover); }
2184
+
2185
+ .sf-file-input:focus-visible {
2186
+ border-color: var(--sf-colour-ring);
2187
+ box-shadow: 0 0 0 .25rem color-mix(in oklch, var(--sf-colour-ring) 18%, transparent);
2188
+ outline: .125rem solid color-mix(in oklch, var(--sf-colour-ring) 24%, transparent);
2189
+ outline-offset: 0;
2190
+ }
2191
+
2192
+ .sf-file-input[aria-invalid="true"],
2193
+ .sf-field[data-invalid="true"] .sf-file-input {
2194
+ border-color: var(--sf-colour-danger);
2195
+ box-shadow: 0 0 0 .25rem var(--sf-colour-danger-soft);
2196
+ }
2197
+
2198
+ .sf-file-input:disabled { background: var(--sf-colour-surface-alt); opacity: .72; }
2199
+
2200
+ .sf-range {
2201
+ accent-color: var(--sf-colour-primary);
2202
+ inline-size: 100%;
2203
+ min-block-size: var(--sf-input-block-size);
2204
+ }
2205
+
2206
+ .sf-range:focus-visible {
2207
+ outline: .125rem solid var(--sf-colour-ring);
2208
+ outline-offset: .2rem;
2209
+ }
2210
+
2211
+ .sf-range[aria-invalid="true"],
2212
+ .sf-field[data-invalid="true"] .sf-range {
2213
+ accent-color: var(--sf-colour-danger);
2214
+ outline-color: var(--sf-colour-danger);
2215
+ }
2216
+
2217
+ .sf-range:disabled { opacity: .55; }
2218
+
2055
2219
  .sf-help[data-density="compact"],
2056
2220
  .sf-error[data-density="compact"] {
2057
2221
  font-size: var(--sf-step--2);
@@ -2093,6 +2257,11 @@
2093
2257
  box-shadow: 0 0 0 0.25rem var(--sf-colour-danger-soft);
2094
2258
  }
2095
2259
 
2260
+ .sf-field[data-invalid="true"] .sf-input-group > :where(.sf-input, .sf-select) {
2261
+ border: 0;
2262
+ box-shadow: none;
2263
+ }
2264
+
2096
2265
  .sf-field[data-invalid="true"] :where(.sf-label, label),
2097
2266
  .sf-field[data-invalid="true"] .sf-help {
2098
2267
  color: var(--sf-colour-danger);
@@ -2124,6 +2293,206 @@
2124
2293
  margin-block-start: .2em;
2125
2294
  }
2126
2295
 
2296
+ .sf-switch {
2297
+ align-items: center;
2298
+ display: inline-grid;
2299
+ gap: var(--sf-space-xs);
2300
+ grid-template-columns: auto 1fr;
2301
+ position: relative;
2302
+ }
2303
+
2304
+ .sf-switch > input[type="checkbox"] {
2305
+ block-size: .0625rem;
2306
+ clip: rect(0 0 0 0);
2307
+ clip-path: inset(50%);
2308
+ inline-size: .0625rem;
2309
+ overflow: hidden;
2310
+ position: absolute;
2311
+ white-space: nowrap;
2312
+ }
2313
+
2314
+ .sf-switch__control {
2315
+ background: var(--sf-colour-surface-inset);
2316
+ border: 1px solid var(--sf-colour-border-strong);
2317
+ border-radius: var(--sf-radius-full);
2318
+ block-size: 1.5rem;
2319
+ display: inline-flex;
2320
+ inline-size: 2.75rem;
2321
+ padding: .1875rem;
2322
+ transition: background-color var(--sf-duration-fast) var(--sf-ease-standard), border-color var(--sf-duration-fast) var(--sf-ease-standard);
2323
+ }
2324
+
2325
+ .sf-switch__control::before {
2326
+ background: var(--sf-colour-foreground);
2327
+ border-radius: var(--sf-radius-full);
2328
+ box-shadow: var(--sf-shadow-sm);
2329
+ content: "";
2330
+ inline-size: 1rem;
2331
+ transform: translateX(0);
2332
+ transition: transform var(--sf-duration-fast) var(--sf-ease-standard);
2333
+ }
2334
+
2335
+ .sf-switch > input[type="checkbox"]:checked + .sf-switch__control {
2336
+ background: var(--sf-colour-primary);
2337
+ border-color: var(--sf-colour-primary);
2338
+ }
2339
+
2340
+ .sf-switch > input[type="checkbox"]:checked + .sf-switch__control::before {
2341
+ background: var(--sf-colour-primary-foreground);
2342
+ transform: translateX(1.1875rem);
2343
+ }
2344
+
2345
+ .sf-switch > input[type="checkbox"]:focus-visible + .sf-switch__control {
2346
+ box-shadow: 0 0 0 .25rem color-mix(in oklch, var(--sf-colour-ring) 20%, transparent);
2347
+ outline: .125rem solid var(--sf-colour-ring);
2348
+ outline-offset: .125rem;
2349
+ }
2350
+
2351
+ .sf-switch__label { color: var(--sf-colour-foreground); font-weight: 700; }
2352
+
2353
+ .sf-switch:has(input:disabled),
2354
+ .sf-switch[aria-disabled="true"] { cursor: not-allowed; opacity: .55; }
2355
+
2356
+ .sf-segmented-control {
2357
+ background: var(--sf-colour-surface-alt);
2358
+ border: 1px solid var(--sf-colour-border);
2359
+ border-radius: var(--sf-radius-control);
2360
+ display: inline-flex;
2361
+ flex-wrap: wrap;
2362
+ gap: var(--sf-space-3xs);
2363
+ padding: var(--sf-space-3xs);
2364
+ }
2365
+
2366
+ fieldset.sf-segmented-control { margin: 0; }
2367
+
2368
+ .sf-segmented-control__option {
2369
+ cursor: pointer;
2370
+ position: relative;
2371
+ }
2372
+
2373
+ .sf-segmented-control__option > input[type="radio"] {
2374
+ block-size: .0625rem;
2375
+ clip: rect(0 0 0 0);
2376
+ clip-path: inset(50%);
2377
+ inline-size: .0625rem;
2378
+ overflow: hidden;
2379
+ position: absolute;
2380
+ white-space: nowrap;
2381
+ }
2382
+
2383
+ .sf-segmented-control__label {
2384
+ align-items: center;
2385
+ border: 1px solid transparent;
2386
+ border-radius: calc(var(--sf-radius-control) - .125rem);
2387
+ color: var(--sf-colour-muted);
2388
+ display: inline-flex;
2389
+ font-size: var(--sf-step--1);
2390
+ font-weight: 700;
2391
+ justify-content: center;
2392
+ min-block-size: 2.25rem;
2393
+ padding-inline: var(--sf-space-xs);
2394
+ }
2395
+
2396
+ .sf-segmented-control__option > input[type="radio"]:checked + .sf-segmented-control__label {
2397
+ background: var(--sf-colour-surface);
2398
+ border-color: var(--sf-colour-border);
2399
+ box-shadow: var(--sf-shadow-sm);
2400
+ color: var(--sf-colour-foreground);
2401
+ }
2402
+
2403
+ .sf-segmented-control__option > input[type="radio"]:focus + .sf-segmented-control__label {
2404
+ outline: .125rem solid var(--sf-colour-ring);
2405
+ outline-offset: .125rem;
2406
+ }
2407
+
2408
+ .sf-segmented-control__option:has(input:disabled) { cursor: not-allowed; opacity: .55; }
2409
+
2410
+ .sf-combobox { position: relative; }
2411
+
2412
+ .sf-combobox__listbox {
2413
+ background: var(--sf-colour-surface-raised);
2414
+ border: 1px solid var(--sf-colour-border);
2415
+ border-radius: var(--sf-radius-control);
2416
+ box-shadow: var(--sf-shadow-lg);
2417
+ display: grid;
2418
+ gap: var(--sf-space-3xs);
2419
+ inset-block-start: calc(100% + var(--sf-space-3xs));
2420
+ inset-inline: 0;
2421
+ list-style: none;
2422
+ max-block-size: min(18rem, 50dvh);
2423
+ overflow: auto;
2424
+ padding: var(--sf-space-2xs);
2425
+ position: absolute;
2426
+ z-index: var(--sf-z-overlay);
2427
+ }
2428
+
2429
+ .sf-combobox__option {
2430
+ border-radius: var(--sf-radius-sm);
2431
+ color: var(--sf-colour-foreground);
2432
+ cursor: pointer;
2433
+ padding-block: var(--sf-space-2xs);
2434
+ padding-inline: var(--sf-space-xs);
2435
+ }
2436
+
2437
+ .sf-combobox__option:hover,
2438
+ .sf-combobox__option[aria-selected="true"],
2439
+ .sf-combobox__option[data-active="true"] { background: var(--sf-colour-surface-hover); }
2440
+
2441
+ .sf-combobox__empty { color: var(--sf-colour-subtle); padding: var(--sf-space-xs); }
2442
+
2443
+ .sf-bulk-actions {
2444
+ align-items: center;
2445
+ background: var(--sf-colour-primary-soft);
2446
+ border: 1px solid var(--sf-colour-primary-soft-border);
2447
+ border-radius: var(--sf-radius-control);
2448
+ display: flex;
2449
+ flex-wrap: wrap;
2450
+ gap: var(--sf-space-xs);
2451
+ justify-content: space-between;
2452
+ padding: var(--sf-space-xs);
2453
+ }
2454
+
2455
+ .sf-bulk-actions__count { font-size: var(--sf-step--1); font-weight: 800; }
2456
+ .sf-bulk-actions__controls { align-items: center; display: flex; flex-wrap: wrap; gap: var(--sf-space-2xs); }
2457
+
2458
+ .sf-stepper {
2459
+ counter-reset: sf-step;
2460
+ display: grid;
2461
+ gap: var(--sf-space-xs);
2462
+ list-style: none;
2463
+ padding-inline-start: 0;
2464
+ }
2465
+
2466
+ .sf-stepper__step {
2467
+ align-items: center;
2468
+ color: var(--sf-colour-subtle);
2469
+ counter-increment: sf-step;
2470
+ display: grid;
2471
+ gap: var(--sf-space-xs);
2472
+ grid-template-columns: auto 1fr;
2473
+ }
2474
+
2475
+ .sf-stepper__marker {
2476
+ align-items: center;
2477
+ border: 1px solid var(--sf-colour-border-strong);
2478
+ border-radius: var(--sf-radius-full);
2479
+ block-size: 2rem;
2480
+ display: inline-flex;
2481
+ font-size: var(--sf-step--1);
2482
+ font-weight: 800;
2483
+ inline-size: 2rem;
2484
+ justify-content: center;
2485
+ }
2486
+
2487
+ .sf-stepper__marker:empty::before { content: counter(sf-step); }
2488
+
2489
+ .sf-stepper__step[aria-current="step"] { color: var(--sf-colour-foreground); }
2490
+ .sf-stepper__step[aria-current="step"] .sf-stepper__marker { background: var(--sf-colour-primary); border-color: var(--sf-colour-primary); color: var(--sf-colour-primary-foreground); }
2491
+ .sf-stepper__step[data-complete="true"] { color: var(--sf-colour-muted); }
2492
+ .sf-stepper__step[data-complete="true"] .sf-stepper__marker { background: var(--sf-colour-success-soft); border-color: var(--sf-colour-success); color: var(--sf-colour-success); }
2493
+ .sf-stepper__label { font-weight: 700; }
2494
+ .sf-wizard-actions { align-items: center; display: flex; flex-wrap: wrap; gap: var(--sf-space-xs); justify-content: space-between; }
2495
+
2127
2496
  .sf-alert {
2128
2497
  background: var(--sf-alert-bg, var(--sf-colour-info-soft));
2129
2498
  border: 1px solid var(--sf-alert-border, color-mix(in oklch, var(--sf-colour-info) 32%, transparent));
@@ -2249,8 +2618,11 @@
2249
2618
 
2250
2619
  .sf-menu :where(a, button),
2251
2620
  .sf-menu-popover :where(a, button) {
2621
+ background: transparent;
2622
+ border: 0;
2252
2623
  border-radius: var(--sf-radius-sm);
2253
2624
  color: inherit;
2625
+ font: inherit;
2254
2626
  padding-block: var(--sf-space-3xs);
2255
2627
  padding-inline: var(--sf-space-2xs);
2256
2628
  text-align: start;
@@ -2439,6 +2811,7 @@
2439
2811
 
2440
2812
  .sf-tab:hover,
2441
2813
  .sf-tab[aria-selected="true"],
2814
+ .sf-tab[aria-current="page"],
2442
2815
  .sf-tab[data-state="active"] {
2443
2816
  border-block-end-color: var(--sf-colour-primary);
2444
2817
  color: var(--sf-colour-foreground);
@@ -2446,6 +2819,7 @@
2446
2819
 
2447
2820
  .sf-tab[data-variant="pill"]:hover,
2448
2821
  .sf-tab[data-variant="pill"][aria-selected="true"],
2822
+ .sf-tab[data-variant="pill"][aria-current="page"],
2449
2823
  .sf-tab[data-variant="pill"][data-state="active"] {
2450
2824
  background: var(--sf-colour-primary-soft);
2451
2825
  border-color: var(--sf-colour-primary-soft-border);
@@ -2529,8 +2903,37 @@
2529
2903
  color: var(--sf-colour-foreground);
2530
2904
  }
2531
2905
 
2906
+ .sf-pagination[data-layout="complete"] {
2907
+ justify-content: space-between;
2908
+ row-gap: var(--sf-space-xs);
2909
+ }
2910
+
2911
+ .sf-pagination__summary {
2912
+ color: var(--sf-colour-muted);
2913
+ font-size: var(--sf-step--1);
2914
+ }
2915
+
2916
+ .sf-pagination__controls,
2917
+ .sf-pagination__pages,
2918
+ .sf-pagination__jump {
2919
+ align-items: center;
2920
+ display: flex;
2921
+ flex-wrap: wrap;
2922
+ gap: var(--sf-space-2xs);
2923
+ }
2924
+
2925
+ .sf-pagination__jump { color: var(--sf-colour-muted); font-size: var(--sf-step--1); }
2926
+ .sf-pagination__jump .sf-input { inline-size: 5rem; }
2927
+ .sf-pagination__jump .sf-select { inline-size: auto; }
2928
+
2929
+ @media (prefers-reduced-motion: reduce) {
2930
+ .sf-spinner { animation: none; border-color: currentColor; border-inline-end-color: transparent; }
2931
+ .sf-switch__control,
2932
+ .sf-switch__control::before { transition: none; }
2933
+ }
2934
+
2532
2935
  @media (forced-colors: active) {
2533
- :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) {
2936
+ :where(.sf-button, .sf-card, .sf-surface, .sf-alert, .sf-price-card, .sf-testimonial, .sf-faq__item, .sf-input, .sf-select, .sf-textarea, .sf-input-group, .sf-file-input, .sf-dialog, .sf-popover, .sf-tooltip, .sf-toast, .sf-banner, .sf-drawer, .sf-disclosure > details, details.sf-disclosure, .sf-accordion > details, .sf-tab-panel, .sf-combobox__listbox, .sf-bulk-actions) {
2534
2937
  border-color: ButtonText;
2535
2938
  forced-color-adjust: auto;
2536
2939
  }
@@ -2547,6 +2950,38 @@
2547
2950
  color: HighlightText;
2548
2951
  }
2549
2952
 
2953
+ .sf-switch__control,
2954
+ .sf-segmented-control__label,
2955
+ .sf-stepper__marker {
2956
+ background: Canvas;
2957
+ border-color: ButtonText;
2958
+ color: ButtonText;
2959
+ forced-color-adjust: none;
2960
+ }
2961
+
2962
+ .sf-switch > input[type="checkbox"]:focus-visible + .sf-switch__control,
2963
+ .sf-segmented-control__option > input[type="radio"]:focus + .sf-segmented-control__label {
2964
+ outline: .125rem solid Highlight;
2965
+ outline-offset: .125rem;
2966
+ }
2967
+
2968
+ .sf-switch > input[type="checkbox"]:checked + .sf-switch__control,
2969
+ .sf-segmented-control__option > input[type="radio"]:checked + .sf-segmented-control__label,
2970
+ .sf-stepper__step[aria-current="step"] .sf-stepper__marker {
2971
+ background: Highlight;
2972
+ border-color: Highlight;
2973
+ color: HighlightText;
2974
+ }
2975
+
2976
+ .sf-switch__control::before { background: ButtonText; }
2977
+ .sf-switch > input[type="checkbox"]:checked + .sf-switch__control::before { background: HighlightText; }
2978
+
2979
+ .sf-stepper__step[data-complete="true"] .sf-stepper__marker {
2980
+ background: Canvas;
2981
+ border-color: LinkText;
2982
+ color: LinkText;
2983
+ }
2984
+
2550
2985
  :where(.sf-input, .sf-select, .sf-textarea)[aria-invalid="true"],
2551
2986
  .sf-field[data-invalid="true"] :where(.sf-input, .sf-select, .sf-textarea) {
2552
2987
  border-color: Mark;