@syncedco/flow 0.3.2 → 0.5.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.
package/src/tokens.mjs CHANGED
@@ -36,6 +36,8 @@ export const primitiveTokens = {
36
36
  orange500: 'oklch(74% 0.17 48)',
37
37
  orange600: 'oklch(68% 0.18 44)',
38
38
  orange700: 'oklch(58% 0.17 42)',
39
+ orange800: 'oklch(50% 0.16 40)',
40
+ orange900: 'oklch(44% 0.14 40)',
39
41
  green500: 'oklch(62% 0.13 150)',
40
42
  green600: 'oklch(54% 0.13 150)',
41
43
  green700: 'oklch(44% 0.12 150)',
@@ -82,13 +84,13 @@ export const semanticTokens = {
82
84
  border: 'oklch(18% 0.026 250 / 0.12)',
83
85
  borderStrong: 'oklch(18% 0.026 250 / 0.22)',
84
86
  backdrop: 'oklch(0% 0 0 / 0.48)',
85
- primary: 'var(--sf-colour-orange-600)',
86
- primaryHover: 'var(--sf-colour-orange-700)',
87
+ primary: 'var(--sf-colour-orange-800)',
88
+ primaryHover: 'var(--sf-colour-orange-900)',
87
89
  primaryForeground: 'var(--sf-colour-neutral-0)',
88
- primarySoft: 'oklch(68% 0.18 44 / 0.12)',
89
- primarySoftBorder: 'oklch(68% 0.18 44 / 0.28)',
90
- link: 'var(--sf-colour-orange-700)',
91
- linkHover: 'var(--sf-colour-orange-600)',
90
+ primarySoft: 'oklch(50% 0.16 40 / 0.12)',
91
+ primarySoftBorder: 'oklch(50% 0.16 40 / 0.28)',
92
+ link: 'var(--sf-colour-orange-800)',
93
+ linkHover: 'var(--sf-colour-orange-900)',
92
94
  accent: 'var(--sf-colour-cyan-500)',
93
95
  accentForeground: 'var(--sf-colour-neutral-950)',
94
96
  success: 'var(--sf-colour-green-500)',
@@ -97,7 +99,7 @@ export const semanticTokens = {
97
99
  warning: 'var(--sf-colour-amber-500)',
98
100
  warningForeground: 'var(--sf-colour-neutral-950)',
99
101
  warningSoft: 'oklch(78% 0.15 82 / 0.16)',
100
- danger: 'var(--sf-colour-red-600)',
102
+ danger: 'var(--sf-colour-red-700)',
101
103
  dangerForeground: 'var(--sf-colour-neutral-0)',
102
104
  dangerSoft: 'oklch(56% 0.2 28 / 0.12)',
103
105
  info: 'var(--sf-colour-cyan-600)',
@@ -109,7 +111,7 @@ export const semanticTokens = {
109
111
  categorical4: 'var(--sf-colour-orange-600)',
110
112
  categorical5: 'var(--sf-colour-red-600)',
111
113
  categorical6: 'oklch(58% 0.15 292)',
112
- ring: 'var(--sf-colour-orange-600)',
114
+ ring: 'var(--sf-colour-orange-800)',
113
115
  },
114
116
  }
115
117
 
package/styles.css CHANGED
@@ -94,6 +94,8 @@
94
94
  --sf-colour-orange-500: oklch(74% 0.17 48);
95
95
  --sf-colour-orange-600: oklch(68% 0.18 44);
96
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);
97
99
  --sf-colour-green-500: oklch(62% 0.13 150);
98
100
  --sf-colour-green-600: oklch(54% 0.13 150);
99
101
  --sf-colour-green-700: oklch(44% 0.12 150);
@@ -116,13 +118,13 @@
116
118
  --sf-colour-border: oklch(18% 0.026 250 / 0.12);
117
119
  --sf-colour-border-strong: oklch(18% 0.026 250 / 0.22);
118
120
  --sf-colour-backdrop: oklch(0% 0 0 / 0.48);
119
- --sf-colour-primary: var(--sf-colour-orange-600);
120
- --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);
121
123
  --sf-colour-primary-foreground: var(--sf-colour-neutral-0);
122
- --sf-colour-primary-soft: oklch(68% 0.18 44 / 0.12);
123
- --sf-colour-primary-soft-border: oklch(68% 0.18 44 / 0.28);
124
- --sf-colour-link: var(--sf-colour-orange-700);
125
- --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);
126
128
  --sf-colour-accent: var(--sf-colour-cyan-500);
127
129
  --sf-colour-accent-foreground: var(--sf-colour-neutral-950);
128
130
  --sf-colour-success: var(--sf-colour-green-500);
@@ -131,7 +133,7 @@
131
133
  --sf-colour-warning: var(--sf-colour-amber-500);
132
134
  --sf-colour-warning-foreground: var(--sf-colour-neutral-950);
133
135
  --sf-colour-warning-soft: oklch(78% 0.15 82 / 0.16);
134
- --sf-colour-danger: var(--sf-colour-red-600);
136
+ --sf-colour-danger: var(--sf-colour-red-700);
135
137
  --sf-colour-danger-foreground: var(--sf-colour-neutral-0);
136
138
  --sf-colour-danger-soft: oklch(56% 0.2 28 / 0.12);
137
139
  --sf-colour-info: var(--sf-colour-cyan-600);
@@ -143,7 +145,7 @@
143
145
  --sf-colour-categorical-4: var(--sf-colour-orange-600);
144
146
  --sf-colour-categorical-5: var(--sf-colour-red-600);
145
147
  --sf-colour-categorical-6: oklch(58% 0.15 292);
146
- --sf-colour-ring: var(--sf-colour-orange-600);
148
+ --sf-colour-ring: var(--sf-colour-orange-800);
147
149
 
148
150
  --sf-shadow-sm: 0 0.125rem 0.375rem oklch(0% 0 0 / 0.08);
149
151
  --sf-shadow-md: 0 0.75rem 1.75rem oklch(0% 0 0 / 0.12);
@@ -198,8 +200,8 @@
198
200
  --sf-colour-border: oklch(18% 0.026 250 / 0.12);
199
201
  --sf-colour-border-strong: oklch(18% 0.026 250 / 0.22);
200
202
  --sf-colour-backdrop: oklch(0% 0 0 / 0.48);
201
- --sf-colour-link: var(--sf-colour-orange-700);
202
- --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);
203
205
  }
204
206
 
205
207
  .sf-theme-dark, [data-sf-theme="dark"] {
@@ -954,6 +956,24 @@
954
956
  gap: var(--sf-space-2xs);
955
957
  }
956
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
+
957
977
  .sf-icon {
958
978
  block-size: var(--sf-icon-size, 1em);
959
979
  color: var(--sf-icon-colour, currentColor);
@@ -1700,6 +1720,8 @@
1700
1720
 
1701
1721
  .sf-data-table :where(th button, .sf-table-sort) {
1702
1722
  align-items: center;
1723
+ background: transparent;
1724
+ border: 0;
1703
1725
  color: inherit;
1704
1726
  display: inline-flex;
1705
1727
  font: inherit;
@@ -1708,14 +1730,14 @@
1708
1730
  padding: 0;
1709
1731
  }
1710
1732
 
1711
- .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 {
1712
1734
  color: var(--sf-colour-subtle);
1713
1735
  content: "\2195";
1714
1736
  font-size: var(--sf-step--2);
1715
1737
  }
1716
1738
 
1717
- .sf-data-table :where(th button, .sf-table-sort)[aria-sort="ascending"]::after { content: "\2191"; }
1718
- .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"; }
1719
1741
 
1720
1742
  .sf-data-table tr[data-clickable="true"] {
1721
1743
  cursor: pointer;
@@ -1790,7 +1812,7 @@
1790
1812
  }
1791
1813
 
1792
1814
  .sf-status::before {
1793
- background: currentColor;
1815
+ background: var(--sf-status-dot, currentColor);
1794
1816
  block-size: .42em;
1795
1817
  border-radius: var(--sf-radius-full);
1796
1818
  content: "";
@@ -1804,25 +1826,29 @@
1804
1826
  .sf-status[data-tone="success"] {
1805
1827
  --sf-status-bg: var(--sf-colour-success-soft);
1806
1828
  --sf-status-border: color-mix(in oklch, var(--sf-colour-success) 34%, transparent);
1807
- --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);
1808
1831
  }
1809
1832
 
1810
1833
  .sf-status[data-tone="warning"] {
1811
1834
  --sf-status-bg: var(--sf-colour-warning-soft);
1812
1835
  --sf-status-border: color-mix(in oklch, var(--sf-colour-warning) 38%, transparent);
1813
- --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));
1814
1838
  }
1815
1839
 
1816
1840
  .sf-status[data-tone="danger"] {
1817
1841
  --sf-status-bg: var(--sf-colour-danger-soft);
1818
1842
  --sf-status-border: color-mix(in oklch, var(--sf-colour-danger) 34%, transparent);
1819
- --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);
1820
1845
  }
1821
1846
 
1822
1847
  .sf-status[data-tone="info"] {
1823
1848
  --sf-status-bg: var(--sf-colour-info-soft);
1824
1849
  --sf-status-border: color-mix(in oklch, var(--sf-colour-info) 34%, transparent);
1825
- --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));
1826
1852
  }
1827
1853
 
1828
1854
  .sf-data-list {
@@ -1946,6 +1972,7 @@
1946
1972
  .sf-form {
1947
1973
  display: grid;
1948
1974
  gap: var(--sf-form-gap, var(--sf-space-s-m));
1975
+ grid-template-columns: minmax(0, 1fr);
1949
1976
  }
1950
1977
 
1951
1978
  .sf-form[data-density="compact"],
@@ -1972,6 +1999,7 @@
1972
1999
  .sf-field {
1973
2000
  display: grid;
1974
2001
  gap: var(--sf-space-2xs);
2002
+ grid-template-columns: minmax(0, 1fr);
1975
2003
  }
1976
2004
 
1977
2005
  .sf-label,
@@ -2054,6 +2082,140 @@
2054
2082
  padding-inline-start: var(--sf-space-l);
2055
2083
  }
2056
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
+
2057
2219
  .sf-help[data-density="compact"],
2058
2220
  .sf-error[data-density="compact"] {
2059
2221
  font-size: var(--sf-step--2);
@@ -2095,6 +2257,11 @@
2095
2257
  box-shadow: 0 0 0 0.25rem var(--sf-colour-danger-soft);
2096
2258
  }
2097
2259
 
2260
+ .sf-field[data-invalid="true"] .sf-input-group > :where(.sf-input, .sf-select) {
2261
+ border: 0;
2262
+ box-shadow: none;
2263
+ }
2264
+
2098
2265
  .sf-field[data-invalid="true"] :where(.sf-label, label),
2099
2266
  .sf-field[data-invalid="true"] .sf-help {
2100
2267
  color: var(--sf-colour-danger);
@@ -2126,6 +2293,206 @@
2126
2293
  margin-block-start: .2em;
2127
2294
  }
2128
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
+
2129
2496
  .sf-alert {
2130
2497
  background: var(--sf-alert-bg, var(--sf-colour-info-soft));
2131
2498
  border: 1px solid var(--sf-alert-border, color-mix(in oklch, var(--sf-colour-info) 32%, transparent));
@@ -2251,8 +2618,11 @@
2251
2618
 
2252
2619
  .sf-menu :where(a, button),
2253
2620
  .sf-menu-popover :where(a, button) {
2621
+ background: transparent;
2622
+ border: 0;
2254
2623
  border-radius: var(--sf-radius-sm);
2255
2624
  color: inherit;
2625
+ font: inherit;
2256
2626
  padding-block: var(--sf-space-3xs);
2257
2627
  padding-inline: var(--sf-space-2xs);
2258
2628
  text-align: start;
@@ -2441,6 +2811,7 @@
2441
2811
 
2442
2812
  .sf-tab:hover,
2443
2813
  .sf-tab[aria-selected="true"],
2814
+ .sf-tab[aria-current="page"],
2444
2815
  .sf-tab[data-state="active"] {
2445
2816
  border-block-end-color: var(--sf-colour-primary);
2446
2817
  color: var(--sf-colour-foreground);
@@ -2448,6 +2819,7 @@
2448
2819
 
2449
2820
  .sf-tab[data-variant="pill"]:hover,
2450
2821
  .sf-tab[data-variant="pill"][aria-selected="true"],
2822
+ .sf-tab[data-variant="pill"][aria-current="page"],
2451
2823
  .sf-tab[data-variant="pill"][data-state="active"] {
2452
2824
  background: var(--sf-colour-primary-soft);
2453
2825
  border-color: var(--sf-colour-primary-soft-border);
@@ -2531,8 +2903,37 @@
2531
2903
  color: var(--sf-colour-foreground);
2532
2904
  }
2533
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
+
2534
2935
  @media (forced-colors: active) {
2535
- :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) {
2536
2937
  border-color: ButtonText;
2537
2938
  forced-color-adjust: auto;
2538
2939
  }
@@ -2549,6 +2950,38 @@
2549
2950
  color: HighlightText;
2550
2951
  }
2551
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
+
2552
2985
  :where(.sf-input, .sf-select, .sf-textarea)[aria-invalid="true"],
2553
2986
  .sf-field[data-invalid="true"] :where(.sf-input, .sf-select, .sf-textarea) {
2554
2987
  border-color: Mark;