@shift-css/core 0.6.0 → 0.7.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/dist/shift.css CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  -webkit-font-smoothing: antialiased;
19
19
  -moz-osx-font-smoothing: grayscale;
20
- text-rendering: optimizeLegibility;
20
+ text-rendering: optimizelegibility;
21
21
  }
22
22
 
23
23
  body {
@@ -367,7 +367,10 @@
367
367
  container: surface / inline-size;
368
368
 
369
369
  @supports (color: oklch(from red l c h)) {
370
- color: oklch(from var(--_surface-bg) clamp(.15, calc((.55 - l) * 1000 + .15), .95) 0 0);
370
+ color: oklch(from var(--_surface-bg)
371
+ /* If L < 0.55, use light text (0.95); otherwise dark text (0.15)
372
+ Threshold 0.55 ensures 4.5:1 contrast per WCAG 2.1 AA */
373
+ clamp(.15, calc((.55 - l) * 1000 + .15), .95) 0 0);
371
374
  }
372
375
 
373
376
  @supports (color: contrast-color(red)) {
@@ -404,7 +407,8 @@
404
407
 
405
408
  [s-surface][s-interactive] {
406
409
  cursor: pointer;
407
- transition: transform var(--s-duration-150) var(--s-ease-out), box-shadow var(--s-duration-150) var(--s-ease-out);
410
+ transition: transform var(--s-duration-150) var(--s-ease-out),
411
+ box-shadow var(--s-duration-150) var(--s-ease-out);
408
412
 
409
413
  &:hover {
410
414
  box-shadow: var(--s-shadow-lg);
@@ -448,7 +452,7 @@
448
452
  background-color: #d4edda;
449
453
  background-color: var(--_surface-bg);
450
454
  border-left: 4px solid var(--s-state-success);
451
- color: #1a1a1a;
455
+ color: light-dark(#1a1a1a, #e5e5e5);
452
456
  }
453
457
 
454
458
  [s-surface="warning"] {
@@ -456,7 +460,7 @@
456
460
  background-color: #fff3cd;
457
461
  background-color: var(--_surface-bg);
458
462
  border-left: 4px solid var(--s-state-warning);
459
- color: #1a1a1a;
463
+ color: light-dark(#1a1a1a, #e5e5e5);
460
464
  }
461
465
 
462
466
  [s-surface="danger"] {
@@ -464,7 +468,7 @@
464
468
  background-color: #f8d7da;
465
469
  background-color: var(--_surface-bg);
466
470
  border-left: 4px solid var(--s-state-danger);
467
- color: #1a1a1a;
471
+ color: light-dark(#1a1a1a, #e5e5e5);
468
472
  }
469
473
 
470
474
  @container (width <= 20rem) {
@@ -505,7 +509,9 @@
505
509
  color: contrast-color(var(--_btn-bg));
506
510
  }
507
511
 
508
- transition: background-color var(--s-duration-150) var(--s-ease-out), border-color var(--s-duration-150) var(--s-ease-out), transform var(--s-duration-100) var(--s-ease-out);
512
+ transition: background-color var(--s-duration-150) var(--s-ease-out),
513
+ border-color var(--s-duration-150) var(--s-ease-out),
514
+ transform var(--s-duration-100) var(--s-ease-out);
509
515
  cursor: pointer;
510
516
  user-select: none;
511
517
 
@@ -625,7 +631,7 @@
625
631
  }
626
632
 
627
633
  [s-btn][s-loading] {
628
- color: var(--_btn-bg);
634
+ color: #0000;
629
635
  pointer-events: none;
630
636
  position: relative;
631
637
 
@@ -753,6 +759,12 @@
753
759
  color: var(--s-text-secondary);
754
760
  }
755
761
 
762
+ [s-card-actions] {
763
+ gap: var(--s-space-2);
764
+ margin-top: var(--s-space-4);
765
+ display: flex;
766
+ }
767
+
756
768
  [s-card="flat"] {
757
769
  --_card-shadow: none;
758
770
  --_card-border: var(--s-border-default);
@@ -776,7 +788,9 @@
776
788
 
777
789
  [s-card][s-interactive] {
778
790
  cursor: pointer;
779
- transition: transform var(--s-duration-200) var(--s-ease-out), box-shadow var(--s-duration-200) var(--s-ease-out), border-color var(--s-duration-200) var(--s-ease-out);
791
+ transition: transform var(--s-duration-200) var(--s-ease-out),
792
+ box-shadow var(--s-duration-200) var(--s-ease-out),
793
+ border-color var(--s-duration-200) var(--s-ease-out);
780
794
 
781
795
  &:hover {
782
796
  --_card-shadow: var(--s-shadow-xl);
@@ -880,6 +894,32 @@
880
894
  }
881
895
  }
882
896
 
897
+ @supports selector(:scope) {
898
+ @scope ([s-card]) to ([s-card]) {
899
+ [s-card-header] {
900
+ border-bottom: 1px solid var(--_card-border, var(--s-border-muted));
901
+ }
902
+
903
+ [s-card-footer] {
904
+ border-top: 1px solid var(--_card-border, var(--s-border-muted));
905
+ }
906
+
907
+ [s-card-title] {
908
+ color: inherit;
909
+ }
910
+
911
+ [s-card-subtitle] {
912
+ color: var(--s-text-secondary);
913
+ }
914
+
915
+ [s-card-actions] {
916
+ gap: var(--s-space-2);
917
+ margin-top: var(--s-space-4);
918
+ display: flex;
919
+ }
920
+ }
921
+ }
922
+
883
923
  :where([s-input]) {
884
924
  --_input-bg: var(--s-surface-base);
885
925
  --_input-border: var(--s-border-default);
@@ -895,7 +935,8 @@
895
935
  color: var(--_input-text);
896
936
  font-size: var(--s-text-sm);
897
937
  line-height: var(--s-leading-normal);
898
- transition: border-color var(--s-duration-150) var(--s-ease-out), box-shadow var(--s-duration-150) var(--s-ease-out);
938
+ transition: border-color var(--s-duration-150) var(--s-ease-out),
939
+ box-shadow var(--s-duration-150) var(--s-ease-out);
899
940
  display: block;
900
941
 
901
942
  &::placeholder {
@@ -946,6 +987,16 @@
946
987
  min-height: 6rem;
947
988
  }
948
989
 
990
+ textarea[s-input][s-autosize] {
991
+ resize: none;
992
+
993
+ @supports (field-sizing: content) {
994
+ field-sizing: content;
995
+ min-height: 3lh;
996
+ max-height: 20lh;
997
+ }
998
+ }
999
+
949
1000
  select[s-input] {
950
1001
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
951
1002
  background-repeat: no-repeat;
@@ -1027,7 +1078,8 @@
1027
1078
  cursor: pointer;
1028
1079
  width: 1.25rem;
1029
1080
  height: 1.25rem;
1030
- transition: background-color var(--s-duration-150) var(--s-ease-out), border-color var(--s-duration-150) var(--s-ease-out);
1081
+ transition: background-color var(--s-duration-150) var(--s-ease-out),
1082
+ border-color var(--s-duration-150) var(--s-ease-out);
1031
1083
 
1032
1084
  &:checked {
1033
1085
  background-color: var(--s-interactive-primary);
@@ -1151,6 +1203,176 @@
1151
1203
  }
1152
1204
  }
1153
1205
 
1206
+ @supports (appearance: base-select) {
1207
+ [s-select], [s-select]::picker(select) {
1208
+ appearance: base-select;
1209
+ }
1210
+
1211
+ :where([s-select]) {
1212
+ --_select-bg: var(--s-surface-base);
1213
+ --_select-border: var(--s-border-default);
1214
+ --_select-text: var(--s-text-primary);
1215
+ --_select-radius: var(--s-radius-md);
1216
+ align-items: center;
1217
+ gap: var(--s-space-2);
1218
+ min-width: 10rem;
1219
+ padding: var(--s-space-2) var(--s-space-3);
1220
+ background-color: var(--_select-bg);
1221
+ border: 2px solid var(--_select-border);
1222
+ border-radius: var(--_select-radius);
1223
+ color: var(--_select-text);
1224
+ font-size: var(--s-text-sm);
1225
+ line-height: var(--s-leading-normal);
1226
+ cursor: pointer;
1227
+ transition: border-color var(--s-duration-150) var(--s-ease-out),
1228
+ box-shadow var(--s-duration-150) var(--s-ease-out);
1229
+ display: inline-flex;
1230
+
1231
+ &:hover:not(:disabled) {
1232
+ --_select-border: var(--s-border-strong);
1233
+ }
1234
+
1235
+ &:open {
1236
+ --_select-border: var(--s-interactive-primary);
1237
+ }
1238
+
1239
+ &:focus-visible {
1240
+ --_select-border: var(--s-interactive-primary);
1241
+ outline: 2px solid var(--s-focus-ring);
1242
+ outline-offset: 2px;
1243
+
1244
+ @supports (color: oklch(from red l c h)) {
1245
+ outline-color: oklch(from var(--s-interactive-primary) l c h / .3);
1246
+ }
1247
+ }
1248
+
1249
+ &:disabled {
1250
+ opacity: .5;
1251
+ cursor: not-allowed;
1252
+ background-color: var(--s-surface-sunken);
1253
+ }
1254
+ }
1255
+
1256
+ [s-select]::picker-icon {
1257
+ color: var(--s-text-tertiary);
1258
+ transition: rotate var(--s-duration-200) var(--s-ease-out);
1259
+ }
1260
+
1261
+ [s-select]:open::picker-icon {
1262
+ rotate: 180deg;
1263
+ }
1264
+
1265
+ [s-select]::picker(select) {
1266
+ background: var(--s-surface-base);
1267
+ border: 2px solid var(--s-border-default);
1268
+ border-radius: var(--s-radius-md);
1269
+ box-shadow: var(--s-shadow-lg);
1270
+ padding: var(--s-space-1);
1271
+ inset: auto;
1272
+ top: anchor(bottom);
1273
+ left: anchor(left);
1274
+ min-width: anchor-size(width);
1275
+ }
1276
+
1277
+ [s-select] option {
1278
+ align-items: center;
1279
+ gap: var(--s-space-2);
1280
+ padding: var(--s-space-2) var(--s-space-3);
1281
+ border-radius: var(--s-radius-sm);
1282
+ color: var(--s-text-primary);
1283
+ cursor: pointer;
1284
+ transition: background-color var(--s-duration-150) var(--s-ease-out);
1285
+ display: flex;
1286
+
1287
+ &:hover {
1288
+ background-color: var(--s-surface-hover);
1289
+ }
1290
+
1291
+ &:checked {
1292
+ background-color: var(--s-interactive-primary);
1293
+ color: var(--s-text-on-primary);
1294
+ }
1295
+ }
1296
+
1297
+ [s-select] option::checkmark {
1298
+ opacity: 0;
1299
+ order: 1;
1300
+ margin-left: auto;
1301
+ }
1302
+
1303
+ [s-select] option:checked::checkmark {
1304
+ opacity: 1;
1305
+ }
1306
+
1307
+ [s-select][s-size="sm"] {
1308
+ padding: var(--s-space-1) var(--s-space-2);
1309
+ font-size: var(--s-text-xs);
1310
+ min-width: 8rem;
1311
+ }
1312
+
1313
+ [s-select][s-size="lg"] {
1314
+ padding: var(--s-space-3) var(--s-space-4);
1315
+ font-size: var(--s-text-base);
1316
+ min-width: 12rem;
1317
+ }
1318
+
1319
+ @container surface style(--_surface-depth: 1) {
1320
+ :where([s-select]) {
1321
+ --_select-bg: var(--s-surface-sunken);
1322
+ }
1323
+ }
1324
+
1325
+ @container surface style(--_surface-depth: 2) {
1326
+ :where([s-select]) {
1327
+ --_select-bg: var(--s-surface-sunken);
1328
+ --_select-border: var(--s-border-strong);
1329
+ }
1330
+ }
1331
+
1332
+ @container surface style(--_surface-depth: -1) {
1333
+ :where([s-select]) {
1334
+ --_select-bg: var(--s-surface-raised);
1335
+ --_select-border: var(--s-border-muted);
1336
+ }
1337
+ }
1338
+ }
1339
+
1340
+ @supports not (appearance: base-select) {
1341
+ [s-select] {
1342
+ appearance: none;
1343
+ width: 100%;
1344
+ padding: var(--s-space-2) var(--s-space-3);
1345
+ padding-right: var(--s-space-10);
1346
+ background-color: var(--s-surface-base);
1347
+ border: 2px solid var(--s-border-default);
1348
+ border-radius: var(--s-radius-md);
1349
+ color: var(--s-text-primary);
1350
+ font-size: var(--s-text-sm);
1351
+ line-height: var(--s-leading-normal);
1352
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
1353
+ background-repeat: no-repeat;
1354
+ background-position: right var(--s-space-3) center;
1355
+ transition: border-color var(--s-duration-150) var(--s-ease-out),
1356
+ box-shadow var(--s-duration-150) var(--s-ease-out);
1357
+ display: block;
1358
+
1359
+ &:hover:not(:disabled) {
1360
+ border-color: var(--s-border-strong);
1361
+ }
1362
+
1363
+ &:focus-visible {
1364
+ border-color: var(--s-interactive-primary);
1365
+ outline: 2px solid var(--s-focus-ring);
1366
+ outline-offset: 2px;
1367
+ }
1368
+
1369
+ &:disabled {
1370
+ opacity: .5;
1371
+ cursor: not-allowed;
1372
+ }
1373
+ }
1374
+ }
1375
+
1154
1376
  dialog[s-modal]:not([open]) {
1155
1377
  display: none;
1156
1378
  }
@@ -1181,29 +1403,50 @@
1181
1403
  }
1182
1404
 
1183
1405
  dialog[s-modal][open] {
1184
- animation: s-modal-scale-in var(--s-duration-200) var(--s-ease-out);
1185
- }
1186
-
1187
- dialog[s-modal]:focus-visible {
1188
- outline: 2px solid var(--s-focus-ring);
1189
- outline-offset: 2px;
1406
+ opacity: 1;
1407
+ transition: opacity var(--s-duration-200) var(--s-ease-out),
1408
+ transform var(--s-duration-200) var(--s-ease-out),
1409
+ overlay var(--s-duration-200) var(--s-ease-out) allow-discrete,
1410
+ display var(--s-duration-200) var(--s-ease-out) allow-discrete;
1411
+ transform: scale(1)translateY(0);
1190
1412
  }
1191
1413
 
1192
- @keyframes s-modal-scale-in {
1193
- from {
1414
+ @starting-style {
1415
+ dialog[s-modal][open] {
1194
1416
  opacity: 0;
1195
1417
  transform: scale(.95)translateY(-10px);
1196
1418
  }
1419
+ }
1197
1420
 
1198
- to {
1199
- opacity: 1;
1200
- transform: scale(1)translateY(0);
1421
+ @supports not (transition-behavior: allow-discrete) {
1422
+ dialog[s-modal][open] {
1423
+ animation: s-modal-scale-in var(--s-duration-200) var(--s-ease-out);
1201
1424
  }
1425
+
1426
+ @keyframes s-modal-scale-in {
1427
+ from {
1428
+ opacity: 0;
1429
+ transform: scale(.95)translateY(-10px);
1430
+ }
1431
+
1432
+ to {
1433
+ opacity: 1;
1434
+ transform: scale(1)translateY(0);
1435
+ }
1436
+ }
1437
+ }
1438
+
1439
+ dialog[s-modal]:focus-visible {
1440
+ outline: 2px solid var(--s-focus-ring);
1441
+ outline-offset: 2px;
1202
1442
  }
1203
1443
 
1204
1444
  dialog[s-modal]::backdrop {
1205
1445
  backdrop-filter: blur(4px);
1206
- animation: s-modal-backdrop-in var(--s-duration-200) var(--s-ease-out);
1446
+ opacity: 1;
1447
+ transition: opacity var(--s-duration-200) var(--s-ease-out),
1448
+ overlay var(--s-duration-200) var(--s-ease-out) allow-discrete,
1449
+ display var(--s-duration-200) var(--s-ease-out) allow-discrete;
1207
1450
  background: oklch(0% 0 0 / .5);
1208
1451
 
1209
1452
  @supports (color: oklch(from red l c h)) {
@@ -1211,13 +1454,25 @@
1211
1454
  }
1212
1455
  }
1213
1456
 
1214
- @keyframes s-modal-backdrop-in {
1215
- from {
1457
+ @starting-style {
1458
+ dialog[s-modal]::backdrop {
1216
1459
  opacity: 0;
1217
1460
  }
1461
+ }
1218
1462
 
1219
- to {
1220
- opacity: 1;
1463
+ @supports not (transition-behavior: allow-discrete) {
1464
+ dialog[s-modal]::backdrop {
1465
+ animation: s-modal-backdrop-in var(--s-duration-200) var(--s-ease-out);
1466
+ }
1467
+
1468
+ @keyframes s-modal-backdrop-in {
1469
+ from {
1470
+ opacity: 0;
1471
+ }
1472
+
1473
+ to {
1474
+ opacity: 1;
1475
+ }
1221
1476
  }
1222
1477
  }
1223
1478
 
@@ -1313,7 +1568,8 @@
1313
1568
  min-height: 2.75rem;
1314
1569
  font-size: var(--s-text-xl);
1315
1570
  color: var(--s-text-secondary);
1316
- transition: background-color var(--s-duration-150) var(--s-ease-out), color var(--s-duration-150) var(--s-ease-out);
1571
+ transition: background-color var(--s-duration-150) var(--s-ease-out),
1572
+ color var(--s-duration-150) var(--s-ease-out);
1317
1573
  background: none;
1318
1574
  border: none;
1319
1575
  justify-content: center;
@@ -1337,6 +1593,17 @@
1337
1593
  }
1338
1594
  }
1339
1595
 
1596
+ @media (prefers-reduced-motion: reduce) {
1597
+ dialog[s-modal][open] {
1598
+ transition: none;
1599
+ transform: none;
1600
+ }
1601
+
1602
+ dialog[s-modal]::backdrop {
1603
+ transition: none;
1604
+ }
1605
+ }
1606
+
1340
1607
  @media (forced-colors: active) {
1341
1608
  dialog[s-modal] {
1342
1609
  border: 2px solid canvastext;
@@ -1637,7 +1904,8 @@
1637
1904
  border-radius: var(--_skip-radius);
1638
1905
  box-shadow: var(--_skip-shadow);
1639
1906
  white-space: nowrap;
1640
- transition: top var(--s-duration-200) var(--s-ease-out), opacity var(--s-duration-200) var(--s-ease-out);
1907
+ transition: top var(--s-duration-200) var(--s-ease-out),
1908
+ opacity var(--s-duration-200) var(--s-ease-out);
1641
1909
  opacity: 0;
1642
1910
  text-decoration: none;
1643
1911
  display: inline-flex;
@@ -1650,7 +1918,9 @@
1650
1918
  [s-skip-link]:focus, [s-skip-link]:focus-visible {
1651
1919
  top: var(--s-space-4);
1652
1920
  opacity: 1;
1653
- box-shadow: var(--_skip-shadow), 0 0 0 3px white, 0 0 0 5px var(--_skip-bg);
1921
+ box-shadow: var(--_skip-shadow),
1922
+ 0 0 0 3px white,
1923
+ 0 0 0 5px var(--_skip-bg);
1654
1924
  outline: none;
1655
1925
  }
1656
1926
 
@@ -1699,7 +1969,9 @@
1699
1969
  }
1700
1970
 
1701
1971
  [s-skip-link]:focus, [s-skip-link]:focus-visible {
1702
- box-shadow: var(--_skip-shadow), 0 0 0 3px var(--s-neutral-900), 0 0 0 5px var(--_skip-bg);
1972
+ box-shadow: var(--_skip-shadow),
1973
+ 0 0 0 3px var(--s-neutral-900),
1974
+ 0 0 0 5px var(--_skip-bg);
1703
1975
  }
1704
1976
  }
1705
1977
 
@@ -1899,7 +2171,8 @@
1899
2171
  transform: translateX(-50%)translateY(4px);
1900
2172
 
1901
2173
  @supports (color: oklch(from red l c h)) {
1902
- border: 1px solid oklch(from var(--_tooltip-bg) max(calc(l - .1), .05) c h);
2174
+ border: 1px solid
2175
+ oklch(from var(--_tooltip-bg) max(calc(l - .1), .05) c h);
1903
2176
  }
1904
2177
 
1905
2178
  font-size: var(--s-text-xs);
@@ -1907,10 +2180,13 @@
1907
2180
  line-height: var(--s-leading-tight);
1908
2181
  text-align: center;
1909
2182
  text-wrap: balance;
1910
- min-width: min(100%, var(--_tooltip-max-width));
2183
+ min-width: min(100%,
2184
+ var(--_tooltip-max-width));
1911
2185
  max-width: var(--_tooltip-max-width);
1912
2186
  pointer-events: none;
1913
- transition: opacity var(--s-duration-150) var(--s-ease-out), visibility var(--s-duration-150) var(--s-ease-out), transform var(--s-duration-150) var(--s-ease-out);
2187
+ transition: opacity var(--s-duration-150) var(--s-ease-out),
2188
+ visibility var(--s-duration-150) var(--s-ease-out),
2189
+ transform var(--s-duration-150) var(--s-ease-out);
1914
2190
  }
1915
2191
 
1916
2192
  :where([s-tooltip]):before {
@@ -1918,12 +2194,14 @@
1918
2194
  visibility: hidden;
1919
2195
  opacity: 0;
1920
2196
  z-index: 9999;
1921
- margin-bottom: calc(var(--_tooltip-offset) - var(--_tooltip-arrow-size));
2197
+ margin-bottom: calc(var(--_tooltip-offset) - var(--_tooltip-arrow-size));
1922
2198
  border-left: var(--_tooltip-arrow-size) solid transparent;
1923
2199
  border-right: var(--_tooltip-arrow-size) solid transparent;
1924
2200
  border-top: var(--_tooltip-arrow-size) solid var(--_tooltip-bg);
1925
2201
  pointer-events: none;
1926
- transition: opacity var(--s-duration-150) var(--s-ease-out), visibility var(--s-duration-150) var(--s-ease-out), transform var(--s-duration-150) var(--s-ease-out);
2202
+ transition: opacity var(--s-duration-150) var(--s-ease-out),
2203
+ visibility var(--s-duration-150) var(--s-ease-out),
2204
+ transform var(--s-duration-150) var(--s-ease-out);
1927
2205
  position: absolute;
1928
2206
  bottom: 100%;
1929
2207
  left: 50%;
@@ -1946,7 +2224,7 @@
1946
2224
 
1947
2225
  [s-tooltip-pos="bottom"]:before {
1948
2226
  margin-bottom: 0;
1949
- margin-top: calc(var(--_tooltip-offset) - var(--_tooltip-arrow-size));
2227
+ margin-top: calc(var(--_tooltip-offset) - var(--_tooltip-arrow-size));
1950
2228
  border-top: none;
1951
2229
  border-bottom: var(--_tooltip-arrow-size) solid var(--_tooltip-bg);
1952
2230
  top: 100%;
@@ -1967,7 +2245,7 @@
1967
2245
 
1968
2246
  [s-tooltip-pos="left"]:before {
1969
2247
  margin-bottom: 0;
1970
- margin-right: calc(var(--_tooltip-offset) - var(--_tooltip-arrow-size));
2248
+ margin-right: calc(var(--_tooltip-offset) - var(--_tooltip-arrow-size));
1971
2249
  border-top: var(--_tooltip-arrow-size) solid transparent;
1972
2250
  border-bottom: var(--_tooltip-arrow-size) solid transparent;
1973
2251
  border-left: var(--_tooltip-arrow-size) solid var(--_tooltip-bg);
@@ -1991,7 +2269,7 @@
1991
2269
 
1992
2270
  [s-tooltip-pos="right"]:before {
1993
2271
  margin-bottom: 0;
1994
- margin-left: calc(var(--_tooltip-offset) - var(--_tooltip-arrow-size));
2272
+ margin-left: calc(var(--_tooltip-offset) - var(--_tooltip-arrow-size));
1995
2273
  border-top: var(--_tooltip-arrow-size) solid transparent;
1996
2274
  border-bottom: var(--_tooltip-arrow-size) solid transparent;
1997
2275
  border-right: var(--_tooltip-arrow-size) solid var(--_tooltip-bg);
@@ -2071,7 +2349,9 @@
2071
2349
  color: var(--s-text-primary);
2072
2350
  opacity: 0;
2073
2351
  visibility: hidden;
2074
- transition: opacity var(--s-duration-150) var(--s-ease-out), transform var(--s-duration-150) var(--s-ease-out), visibility var(--s-duration-150);
2352
+ transition: opacity var(--s-duration-150) var(--s-ease-out),
2353
+ transform var(--s-duration-150) var(--s-ease-out),
2354
+ visibility var(--s-duration-150);
2075
2355
  flex-direction: column;
2076
2356
  display: flex;
2077
2357
  position: absolute;
@@ -4065,4 +4345,342 @@
4065
4345
  .s-opacity-100 {
4066
4346
  opacity: 1;
4067
4347
  }
4348
+
4349
+ [s-scroll-progress] {
4350
+ --_scroll-progress-z: var(--s-scroll-progress-z, 1000);
4351
+ height: 3px;
4352
+ z-index: var(--_scroll-progress-z);
4353
+ background: var(--s-interactive-primary);
4354
+ transform-origin: 0;
4355
+ position: fixed;
4356
+ top: 0;
4357
+ left: 0;
4358
+ right: 0;
4359
+ transform: scaleX(0);
4360
+ }
4361
+
4362
+ @supports (animation-timeline: scroll()) {
4363
+ [s-scroll-progress] {
4364
+ animation-name: s-scroll-progress-grow;
4365
+ animation-duration: 1ms;
4366
+ animation-timing-function: linear;
4367
+ animation-fill-mode: both;
4368
+ animation-timeline: scroll();
4369
+ }
4370
+
4371
+ @keyframes s-scroll-progress-grow {
4372
+ from {
4373
+ transform: scaleX(0);
4374
+ }
4375
+
4376
+ to {
4377
+ transform: scaleX(1);
4378
+ }
4379
+ }
4380
+ }
4381
+
4382
+ [s-scroll-progress="secondary"] {
4383
+ background: var(--s-secondary-500);
4384
+ }
4385
+
4386
+ [s-scroll-progress="accent"] {
4387
+ background: var(--s-accent-500);
4388
+ }
4389
+
4390
+ [s-scroll-progress="gradient"] {
4391
+ background: linear-gradient(90deg,
4392
+ var(--s-primary-500),
4393
+ var(--s-secondary-500),
4394
+ var(--s-accent-500));
4395
+ }
4396
+
4397
+ [s-scroll-reveal] {
4398
+ opacity: 1;
4399
+ }
4400
+
4401
+ @supports (animation-timeline: view()) {
4402
+ [s-scroll-reveal] {
4403
+ animation: linear both s-scroll-fade-in view();
4404
+ animation-range: entry;
4405
+ }
4406
+
4407
+ @keyframes s-scroll-fade-in {
4408
+ from {
4409
+ opacity: 0;
4410
+ }
4411
+
4412
+ to {
4413
+ opacity: 1;
4414
+ }
4415
+ }
4416
+
4417
+ [s-scroll-reveal="slide-up"] {
4418
+ animation-name: s-scroll-slide-up;
4419
+ }
4420
+
4421
+ @keyframes s-scroll-slide-up {
4422
+ from {
4423
+ opacity: 0;
4424
+ transform: translateY(2rem);
4425
+ }
4426
+
4427
+ to {
4428
+ opacity: 1;
4429
+ transform: translateY(0);
4430
+ }
4431
+ }
4432
+
4433
+ [s-scroll-reveal="slide-down"] {
4434
+ animation-name: s-scroll-slide-down;
4435
+ }
4436
+
4437
+ @keyframes s-scroll-slide-down {
4438
+ from {
4439
+ opacity: 0;
4440
+ transform: translateY(-2rem);
4441
+ }
4442
+
4443
+ to {
4444
+ opacity: 1;
4445
+ transform: translateY(0);
4446
+ }
4447
+ }
4448
+
4449
+ [s-scroll-reveal="slide-left"] {
4450
+ animation-name: s-scroll-slide-left;
4451
+ }
4452
+
4453
+ @keyframes s-scroll-slide-left {
4454
+ from {
4455
+ opacity: 0;
4456
+ transform: translateX(2rem);
4457
+ }
4458
+
4459
+ to {
4460
+ opacity: 1;
4461
+ transform: translateX(0);
4462
+ }
4463
+ }
4464
+
4465
+ [s-scroll-reveal="slide-right"] {
4466
+ animation-name: s-scroll-slide-right;
4467
+ }
4468
+
4469
+ @keyframes s-scroll-slide-right {
4470
+ from {
4471
+ opacity: 0;
4472
+ transform: translateX(-2rem);
4473
+ }
4474
+
4475
+ to {
4476
+ opacity: 1;
4477
+ transform: translateX(0);
4478
+ }
4479
+ }
4480
+
4481
+ [s-scroll-reveal="scale"] {
4482
+ animation-name: s-scroll-scale-up;
4483
+ }
4484
+
4485
+ @keyframes s-scroll-scale-up {
4486
+ from {
4487
+ opacity: 0;
4488
+ transform: scale(.9);
4489
+ }
4490
+
4491
+ to {
4492
+ opacity: 1;
4493
+ transform: scale(1);
4494
+ }
4495
+ }
4496
+ }
4497
+
4498
+ @supports (animation-timeline: scroll()) {
4499
+ [s-scroll-parallax] {
4500
+ animation: linear s-scroll-parallax-slow scroll();
4501
+ }
4502
+
4503
+ @keyframes s-scroll-parallax-slow {
4504
+ from {
4505
+ transform: translateY(0);
4506
+ }
4507
+
4508
+ to {
4509
+ transform: translateY(-10%);
4510
+ }
4511
+ }
4512
+
4513
+ [s-scroll-parallax="fast"] {
4514
+ animation-name: s-scroll-parallax-fast;
4515
+ }
4516
+
4517
+ @keyframes s-scroll-parallax-fast {
4518
+ from {
4519
+ transform: translateY(0);
4520
+ }
4521
+
4522
+ to {
4523
+ transform: translateY(-25%);
4524
+ }
4525
+ }
4526
+
4527
+ [s-scroll-parallax="reverse"] {
4528
+ animation-name: s-scroll-parallax-reverse;
4529
+ }
4530
+
4531
+ @keyframes s-scroll-parallax-reverse {
4532
+ from {
4533
+ transform: translateY(0);
4534
+ }
4535
+
4536
+ to {
4537
+ transform: translateY(10%);
4538
+ }
4539
+ }
4540
+
4541
+ [s-scroll-rotate] {
4542
+ animation: linear s-scroll-rotate scroll();
4543
+ }
4544
+
4545
+ @keyframes s-scroll-rotate {
4546
+ from {
4547
+ transform: rotate(0);
4548
+ }
4549
+
4550
+ to {
4551
+ transform: rotate(360deg);
4552
+ }
4553
+ }
4554
+
4555
+ [s-scroll-rotate="reverse"] {
4556
+ animation-name: s-scroll-rotate-reverse;
4557
+ }
4558
+
4559
+ @keyframes s-scroll-rotate-reverse {
4560
+ from {
4561
+ transform: rotate(0);
4562
+ }
4563
+
4564
+ to {
4565
+ transform: rotate(-360deg);
4566
+ }
4567
+ }
4568
+ }
4569
+
4570
+ @media (prefers-reduced-motion: reduce) {
4571
+ [s-scroll-reveal], [s-scroll-parallax], [s-scroll-rotate] {
4572
+ opacity: 1 !important;
4573
+ animation: none !important;
4574
+ transform: none !important;
4575
+ }
4576
+
4577
+ [s-scroll-progress] {
4578
+ transform: scaleX(1);
4579
+ animation: none !important;
4580
+ }
4581
+ }
4582
+
4583
+ @function --s-alpha(--color, --opacity) {
4584
+ result: oklch(from var(--color) l c h / var(--opacity));
4585
+ }
4586
+
4587
+ @function --s-lighten(--color, --amount) {
4588
+ result: oklch(from var(--color) calc(l + var(--amount)) c h);
4589
+ }
4590
+
4591
+ @function --s-darken(--color, --amount) {
4592
+ result: oklch(from var(--color) calc(l - var(--amount)) c h);
4593
+ }
4594
+
4595
+ @function --s-saturate(--color, --amount) {
4596
+ result: oklch(from var(--color) l calc(c + var(--amount)) h);
4597
+ }
4598
+
4599
+ @function --s-desaturate(--color, --amount) {
4600
+ result: oklch(from var(--color) l calc(c - var(--amount)) h);
4601
+ }
4602
+
4603
+ @function --s-hue-rotate(--color, --degrees) {
4604
+ result: oklch(from var(--color) l c calc(h + var(--degrees)));
4605
+ }
4606
+
4607
+ @function --s-complement(--color) {
4608
+ result: oklch(from var(--color) l c calc(h + 180));
4609
+ }
4610
+
4611
+ @function --s-glow(--color, --intensity) {
4612
+ result: 0 0 calc(var(--intensity) * 10px) oklch(from var(--color) l c h / .5),
4613
+ 0 0 calc(var(--intensity) * 20px) oklch(from var(--color) l c h / .3),
4614
+ 0 0 calc(var(--intensity) * 30px) oklch(from var(--color) l c h / .1);
4615
+ }
4616
+
4617
+ @function --s-text-shadow-glow(--color, --intensity) {
4618
+ result: 0 0 calc(var(--intensity) * 5px) oklch(from var(--color) l c h / .8),
4619
+ 0 0 calc(var(--intensity) * 10px) oklch(from var(--color) l c h / .5);
4620
+ }
4621
+
4622
+ @function --s-contrast-text(--bg) {
4623
+ result: oklch(from var(--bg) clamp(.15, calc((.6 - l) * 1000 + .15), .95) 0 0);
4624
+ }
4625
+
4626
+ @function --s-readable-on(--bg, --text) {
4627
+ /* Mix text with inverted bg lightness (achromatic) to push toward contrast */
4628
+ /* Dark bg (l≈0) → mix with light (1-l≈1), Light bg (l≈1) → mix with dark (1-l≈0) */
4629
+ result: color-mix(in oklch,
4630
+ var(--text) 60%,
4631
+ oklch(from var(--bg) clamp(.2, calc(1 - l), .9) 0 0));
4632
+ }
4633
+
4634
+ @function --s-fluid(--min, --max) {
4635
+ result: clamp(var(--min),
4636
+ calc(var(--min) + (var(--max) - var(--min)) * ((100vw - 320px) / (1200px - 320px))),
4637
+ var(--max));
4638
+ }
4639
+
4640
+ @function --s-space-scale(--base, --factor) {
4641
+ result: calc(var(--base) * var(--factor));
4642
+ }
4643
+
4644
+ [s-card][s-auto-contrast] {
4645
+ color: if(supports(color: oklch(62.7955% .257683 29.2339)):
4646
+ --s-contrast-text(var(--_card-bg));
4647
+ else: var(--s-text-primary););
4648
+ }
4649
+
4650
+ [s-responsive-padding] {
4651
+ padding: var(--s-space-4);
4652
+ padding: if(media(width < 640px): var(--s-space-2);
4653
+ media(width < 1024px): var(--s-space-4);
4654
+ else: var(--s-space-6););
4655
+ }
4656
+
4657
+ [s-motion-safe] {
4658
+ transition-duration: var(--s-duration-200);
4659
+ transition-duration: if(media(prefers-reduced-motion: reduce): 0s;
4660
+ else: var(--s-duration-200););
4661
+ }
4662
+
4663
+ [s-dark-aware] {
4664
+ --_bg: if(media(prefers-color-scheme: dark): var(--s-surface-sunken);
4665
+ else: var(--s-surface-raised););
4666
+ background-color: var(--_bg);
4667
+ background-color: var(--_bg);
4668
+ }
4669
+
4670
+ [s-size-aware] {
4671
+ padding: var(--s-space-4);
4672
+ font-size: var(--s-text-base);
4673
+ padding: if(style(--size: sm): var(--s-space-2);
4674
+ style(--size: lg): var(--s-space-6);
4675
+ else: var(--s-space-4););
4676
+ font-size: if(style(--size: sm): var(--s-text-sm);
4677
+ style(--size: lg): var(--s-text-lg);
4678
+ else: var(--s-text-base););
4679
+ }
4680
+
4681
+ @media (prefers-reduced-motion: reduce) {
4682
+ [s-motion-safe] {
4683
+ transition-duration: 0s !important;
4684
+ }
4685
+ }
4068
4686
  }