@digiko-npm/designsystem 0.3.33 → 0.3.34

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/README.md CHANGED
@@ -43,7 +43,7 @@ npm install @digiko-npm/designsystem
43
43
  <span class="ds-badge ds-badge--success">Active</span>
44
44
  ```
45
45
 
46
- ## Components (28)
46
+ ## Components (32)
47
47
 
48
48
  | Core | Essential | Common | Advanced |
49
49
  |------|-----------|--------|----------|
@@ -54,7 +54,10 @@ npm install @digiko-npm/designsystem
54
54
  | Nav | Tooltip | Accordion | Command |
55
55
  | Modal | Avatar | Drawer | |
56
56
  | Toast | Skeleton | Progress | |
57
- | Table | Empty State | | |
57
+ | Table | Empty State | Datepicker | |
58
+ | | | Drop Zone | |
59
+ | | | Custom Select | |
60
+ | | | Sortable | |
58
61
 
59
62
  All components use `ds-` prefix with BEM naming: `.ds-btn`, `.ds-btn--secondary`, `.ds-card__body`.
60
63
 
@@ -1,4 +1,4 @@
1
- /* @ds/designsystem v0.3.32 */
1
+ /* @ds/designsystem v0.3.34 */
2
2
  /* ==========================================================================
3
3
  @digiko-npm/designsystem
4
4
 
@@ -361,10 +361,39 @@
361
361
  --ds-ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
362
362
  --ds-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
363
363
 
364
+ /* --- Backdrop Blur --- */
365
+ --ds-blur-sm: 4px;
366
+ --ds-blur-md: 12px;
367
+ --ds-blur-lg: 20px;
368
+
369
+ /* --- Indicator Sizes --- */
370
+ --ds-dot-size: 6px;
371
+
372
+ /* --- Accent Border --- */
373
+ --ds-accent-border-width: 3px;
374
+
375
+ /* --- Popover/Tooltip Offset --- */
376
+ --ds-offset-sm: 4px;
377
+ --ds-offset-md: 8px;
378
+
364
379
  /* --- Opacity --- */
365
380
  --ds-opacity-disabled: 0.5;
366
381
  }
367
382
 
383
+ /* --- Reduced Motion ---
384
+ Zero out duration tokens so every component that uses
385
+ var(--ds-duration-*) transitions instantly.
386
+ Keyframe animations are handled per-component.
387
+ -------------------------------------------------------- */
388
+ @media (prefers-reduced-motion: reduce) {
389
+ :root {
390
+ --ds-duration-fast: 0s;
391
+ --ds-duration-normal: 0s;
392
+ --ds-duration-slow: 0s;
393
+ --ds-duration-slower: 0s;
394
+ }
395
+ }
396
+
368
397
 
369
398
  /* ==========================================================================
370
399
  Base: Reset
@@ -470,14 +499,11 @@ input[type="number"]::-webkit-inner-spin-button {
470
499
  .ds-no-scrollbar::-webkit-scrollbar { display: none; }
471
500
  .ds-no-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
472
501
 
473
- /* Reduce motion */
502
+ /* Reduce motion — scroll only.
503
+ Transitions are handled via --ds-duration-* tokens in shadows.css.
504
+ Keyframe animations are handled per-component. */
474
505
  @media (prefers-reduced-motion: reduce) {
475
- *, *::before, *::after {
476
- animation-duration: 0.01ms !important;
477
- animation-iteration-count: 1 !important;
478
- transition-duration: 0.01ms !important;
479
- scroll-behavior: auto !important;
480
- }
506
+ html { scroll-behavior: auto !important; }
481
507
  }
482
508
 
483
509
  /* ==========================================================================
@@ -842,6 +868,10 @@ hr {
842
868
  to { transform: rotate(360deg); }
843
869
  }
844
870
 
871
+ @media (prefers-reduced-motion: reduce) {
872
+ .ds-btn--loading::after { animation: none; opacity: 0.6; }
873
+ }
874
+
845
875
  /* ==========================================================================
846
876
  Component: Card
847
877
  Surface + border, hover with shadow lift, rounded-xl.
@@ -864,6 +894,10 @@ hr {
864
894
  box-shadow: var(--ds-shadow-lg);
865
895
  transform: translateY(-4px);
866
896
  }
897
+ .ds-card--interactive:focus-visible {
898
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
899
+ outline-offset: var(--ds-ring-offset);
900
+ }
867
901
 
868
902
  /* Elevated card — visible shadow */
869
903
  .ds-card--elevated {
@@ -989,7 +1023,11 @@ hr {
989
1023
  background-color: var(--ds-color-surface);
990
1024
  border: 1px solid var(--ds-color-border);
991
1025
  border-radius: var(--ds-radius-lg);
992
- transition: all var(--ds-duration-fast) var(--ds-ease-default);
1026
+ outline: none;
1027
+ transition:
1028
+ border-color var(--ds-duration-fast) var(--ds-ease-default),
1029
+ box-shadow var(--ds-duration-fast) var(--ds-ease-default),
1030
+ background-color var(--ds-duration-fast) var(--ds-ease-default);
993
1031
  }
994
1032
 
995
1033
  .ds-input,
@@ -997,18 +1035,22 @@ hr {
997
1035
  height: var(--ds-size-3);
998
1036
  }
999
1037
 
1038
+ /* Hover */
1000
1039
  .ds-input:hover,
1001
1040
  .ds-textarea:hover,
1002
1041
  .ds-select:hover {
1003
1042
  border-color: var(--ds-color-border-hover);
1004
1043
  }
1005
1044
 
1006
- .ds-input:focus,
1007
- .ds-textarea:focus,
1008
- .ds-select:focus {
1009
- border-color: var(--ds-color-border-active);
1010
- box-shadow: inset 0 0 0 1px var(--ds-color-border-active);
1011
- outline: none;
1045
+ /* Focus — box-shadow ring instead of outline.
1046
+ Inputs always trigger :focus-visible (browser heuristic for text entry),
1047
+ so outline creates unavoidable double-border with offset.
1048
+ box-shadow follows border-radius perfectly and has no gap. */
1049
+ .ds-input:focus-visible,
1050
+ .ds-textarea:focus-visible,
1051
+ .ds-select:focus-visible {
1052
+ border-color: var(--ds-ring-color);
1053
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
1012
1054
  }
1013
1055
 
1014
1056
  .ds-input::placeholder,
@@ -1016,19 +1058,32 @@ hr {
1016
1058
  color: var(--ds-color-text-tertiary);
1017
1059
  }
1018
1060
 
1019
- /* States */
1061
+ /* States — error: border + ring match the semantic color */
1020
1062
  .ds-input--error,
1021
1063
  .ds-textarea--error {
1022
1064
  border-color: var(--ds-color-error);
1023
1065
  }
1024
- .ds-input--error:focus,
1025
- .ds-textarea--error:focus {
1026
- box-shadow: inset 0 0 0 1px var(--ds-color-error);
1066
+ .ds-input--error:hover,
1067
+ .ds-textarea--error:hover {
1068
+ border-color: var(--ds-color-error);
1069
+ }
1070
+ .ds-input--error:focus-visible,
1071
+ .ds-textarea--error:focus-visible {
1072
+ border-color: var(--ds-color-error);
1073
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-error);
1027
1074
  }
1028
1075
 
1076
+ /* States — success: border + ring match the semantic color */
1029
1077
  .ds-input--success {
1030
1078
  border-color: var(--ds-color-success);
1031
1079
  }
1080
+ .ds-input--success:hover {
1081
+ border-color: var(--ds-color-success);
1082
+ }
1083
+ .ds-input--success:focus-visible {
1084
+ border-color: var(--ds-color-success);
1085
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-success);
1086
+ }
1032
1087
 
1033
1088
  /* Sizes */
1034
1089
  .ds-input--xs,
@@ -1205,8 +1260,8 @@ hr {
1205
1260
  /* Dot indicator */
1206
1261
  .ds-badge--dot::before {
1207
1262
  content: '';
1208
- width: 6px;
1209
- height: 6px;
1263
+ width: var(--ds-dot-size);
1264
+ height: var(--ds-dot-size);
1210
1265
  border-radius: var(--ds-radius-full);
1211
1266
  background-color: currentColor;
1212
1267
  }
@@ -1236,8 +1291,8 @@ hr {
1236
1291
  height: 4rem;
1237
1292
  background-color: var(--ds-color-nav-bg);
1238
1293
  border-bottom: 1px solid var(--ds-color-nav-border);
1239
- backdrop-filter: blur(20px) saturate(1.5);
1240
- -webkit-backdrop-filter: blur(20px) saturate(1.5);
1294
+ backdrop-filter: blur(var(--ds-blur-lg)) saturate(1.5);
1295
+ -webkit-backdrop-filter: blur(var(--ds-blur-lg)) saturate(1.5);
1241
1296
  }
1242
1297
 
1243
1298
  .ds-nav--static {
@@ -1280,6 +1335,11 @@ hr {
1280
1335
  }
1281
1336
  }
1282
1337
 
1338
+ .ds-nav__link:focus-visible {
1339
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
1340
+ outline-offset: var(--ds-ring-offset);
1341
+ }
1342
+
1283
1343
  .ds-nav__link--active {
1284
1344
  color: var(--ds-color-text);
1285
1345
  }
@@ -1309,13 +1369,18 @@ hr {
1309
1369
  }
1310
1370
  }
1311
1371
 
1372
+ .ds-nav__icon-btn:focus-visible {
1373
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
1374
+ outline-offset: var(--ds-ring-offset);
1375
+ }
1376
+
1312
1377
  /* --- Mobile nav overlay --- */
1313
1378
  .ds-nav__mobile {
1314
1379
  overflow: hidden;
1315
1380
  max-height: 0;
1316
1381
  border-bottom: 0 solid var(--ds-color-nav-border);
1317
1382
  background-color: var(--ds-color-nav-bg);
1318
- backdrop-filter: blur(20px);
1383
+ backdrop-filter: blur(var(--ds-blur-lg));
1319
1384
  transition: all var(--ds-duration-slow) var(--ds-ease-out-expo);
1320
1385
  }
1321
1386
 
@@ -1383,6 +1448,11 @@ hr {
1383
1448
  }
1384
1449
  }
1385
1450
 
1451
+ .ds-sidebar__link:focus-visible {
1452
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
1453
+ outline-offset: calc(-1 * var(--ds-ring-offset));
1454
+ }
1455
+
1386
1456
  .ds-sidebar__link--active {
1387
1457
  color: var(--ds-color-text);
1388
1458
  background-color: var(--ds-color-bg-elevated);
@@ -1402,8 +1472,8 @@ hr {
1402
1472
  justify-content: center;
1403
1473
  padding: var(--ds-space-4);
1404
1474
  background-color: var(--ds-color-overlay);
1405
- backdrop-filter: blur(4px);
1406
- -webkit-backdrop-filter: blur(4px);
1475
+ backdrop-filter: blur(var(--ds-blur-sm));
1476
+ -webkit-backdrop-filter: blur(var(--ds-blur-sm));
1407
1477
  opacity: 0;
1408
1478
  visibility: hidden;
1409
1479
  transition:
@@ -1472,6 +1542,10 @@ hr {
1472
1542
  .ds-modal__close:hover {
1473
1543
  color: var(--ds-color-text);
1474
1544
  }
1545
+ .ds-modal__close:focus-visible {
1546
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
1547
+ outline-offset: var(--ds-ring-offset);
1548
+ }
1475
1549
 
1476
1550
  .ds-modal__body {
1477
1551
  padding: var(--ds-space-5);
@@ -1529,10 +1603,10 @@ hr {
1529
1603
  animation: ds-toast-in var(--ds-duration-slow) var(--ds-ease-out-expo) forwards;
1530
1604
  }
1531
1605
 
1532
- .ds-toast--info { border-left: 3px solid var(--ds-color-info); }
1533
- .ds-toast--success { border-left: 3px solid var(--ds-color-success); }
1534
- .ds-toast--warning { border-left: 3px solid var(--ds-color-warning); }
1535
- .ds-toast--error { border-left: 3px solid var(--ds-color-error); }
1606
+ .ds-toast--info { border-left: var(--ds-accent-border-width) solid var(--ds-color-info); }
1607
+ .ds-toast--success { border-left: var(--ds-accent-border-width) solid var(--ds-color-success); }
1608
+ .ds-toast--warning { border-left: var(--ds-accent-border-width) solid var(--ds-color-warning); }
1609
+ .ds-toast--error { border-left: var(--ds-accent-border-width) solid var(--ds-color-error); }
1536
1610
 
1537
1611
  .ds-toast__message {
1538
1612
  flex: 1;
@@ -1549,6 +1623,10 @@ hr {
1549
1623
  .ds-toast__close:hover {
1550
1624
  color: var(--ds-color-text);
1551
1625
  }
1626
+ .ds-toast__close:focus-visible {
1627
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
1628
+ outline-offset: var(--ds-ring-offset);
1629
+ }
1552
1630
 
1553
1631
  @keyframes ds-toast-in {
1554
1632
  from { opacity: 0; transform: translateY(-8px); }
@@ -1563,6 +1641,11 @@ hr {
1563
1641
  to { opacity: 0; transform: translateX(100%); }
1564
1642
  }
1565
1643
 
1644
+ @media (prefers-reduced-motion: reduce) {
1645
+ .ds-toast { animation: none; }
1646
+ .ds-toast--exit { animation: none; opacity: 0; }
1647
+ }
1648
+
1566
1649
  /* ==========================================================================
1567
1650
  Component: Table
1568
1651
  ========================================================================== */
@@ -1792,7 +1875,7 @@ hr {
1792
1875
  border: 1px solid var(--ds-color-border);
1793
1876
  border-radius: var(--ds-radius-lg);
1794
1877
  background-color: var(--ds-color-surface);
1795
- border-left: 3px solid var(--ds-color-border);
1878
+ border-left: var(--ds-accent-border-width) solid var(--ds-color-border);
1796
1879
  }
1797
1880
 
1798
1881
  /* --- Semantic Variants --- */
@@ -2083,6 +2166,10 @@ hr {
2083
2166
  background-color: var(--ds-color-bg-elevated);
2084
2167
  color: var(--ds-color-text);
2085
2168
  }
2169
+ .ds-dropdown__item:focus-visible {
2170
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
2171
+ outline-offset: calc(-1 * var(--ds-ring-offset));
2172
+ }
2086
2173
 
2087
2174
  .ds-dropdown__item--active {
2088
2175
  background-color: var(--ds-color-bg-elevated);
@@ -2200,7 +2287,7 @@ hr {
2200
2287
 
2201
2288
  .ds-tooltip .ds-tooltip__content,
2202
2289
  .ds-tooltip--top .ds-tooltip__content {
2203
- bottom: calc(100% + 8px);
2290
+ bottom: calc(100% + var(--ds-offset-md));
2204
2291
  left: 50%;
2205
2292
  transform: translateX(-50%) translateY(4px);
2206
2293
  }
@@ -2224,7 +2311,7 @@ hr {
2224
2311
  ============================================= */
2225
2312
 
2226
2313
  .ds-tooltip--bottom .ds-tooltip__content {
2227
- top: calc(100% + 8px);
2314
+ top: calc(100% + var(--ds-offset-md));
2228
2315
  bottom: auto;
2229
2316
  left: 50%;
2230
2317
  transform: translateX(-50%) translateY(-4px);
@@ -2249,7 +2336,7 @@ hr {
2249
2336
  ============================================= */
2250
2337
 
2251
2338
  .ds-tooltip--left .ds-tooltip__content {
2252
- right: calc(100% + 8px);
2339
+ right: calc(100% + var(--ds-offset-md));
2253
2340
  left: auto;
2254
2341
  bottom: auto;
2255
2342
  top: 50%;
@@ -2276,7 +2363,7 @@ hr {
2276
2363
  ============================================= */
2277
2364
 
2278
2365
  .ds-tooltip--right .ds-tooltip__content {
2279
- left: calc(100% + 8px);
2366
+ left: calc(100% + var(--ds-offset-md));
2280
2367
  right: auto;
2281
2368
  bottom: auto;
2282
2369
  top: 50%;
@@ -2505,6 +2592,10 @@ hr {
2505
2592
  }
2506
2593
  }
2507
2594
 
2595
+ @media (prefers-reduced-motion: reduce) {
2596
+ .ds-skeleton { animation: none; }
2597
+ }
2598
+
2508
2599
  /* ==========================================================================
2509
2600
  Component: Empty State
2510
2601
  Centered message for when there's no data to display.
@@ -2636,11 +2727,16 @@ hr {
2636
2727
  line-height: 1;
2637
2728
  }
2638
2729
 
2730
+ .ds-datepicker__trigger:focus-visible {
2731
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
2732
+ outline-offset: var(--ds-ring-offset);
2733
+ }
2734
+
2639
2735
  /* Calendar panel */
2640
2736
  .ds-datepicker__panel {
2641
2737
  position: absolute;
2642
2738
  z-index: var(--ds-z-dropdown);
2643
- top: calc(100% + 4px);
2739
+ top: calc(100% + var(--ds-offset-sm));
2644
2740
  left: 0;
2645
2741
  background-color: var(--ds-color-surface);
2646
2742
  border: 1px solid var(--ds-color-border);
@@ -2652,8 +2748,8 @@ hr {
2652
2748
  visibility: hidden;
2653
2749
  transform: scale(0.96);
2654
2750
  transition:
2655
- opacity var(--ds-duration-fast) var(--ds-ease),
2656
- visibility var(--ds-duration-fast) var(--ds-ease),
2751
+ opacity var(--ds-duration-fast) var(--ds-ease-default),
2752
+ visibility var(--ds-duration-fast) var(--ds-ease-default),
2657
2753
  transform var(--ds-duration-fast) var(--ds-ease-out-expo);
2658
2754
  }
2659
2755
 
@@ -2674,7 +2770,7 @@ hr {
2674
2770
 
2675
2771
  .ds-datepicker__title {
2676
2772
  font-size: var(--ds-text-sm);
2677
- font-weight: 600;
2773
+ font-weight: var(--ds-weight-semibold);
2678
2774
  color: var(--ds-color-text);
2679
2775
  user-select: none;
2680
2776
  }
@@ -2691,13 +2787,17 @@ hr {
2691
2787
  color: var(--ds-color-text-secondary);
2692
2788
  cursor: pointer;
2693
2789
  font-size: var(--ds-text-base);
2694
- transition: all var(--ds-duration-fast) var(--ds-ease);
2790
+ transition: all var(--ds-duration-fast) var(--ds-ease-default);
2695
2791
  }
2696
2792
 
2697
2793
  .ds-datepicker__nav:hover {
2698
2794
  background-color: var(--ds-color-bg-elevated);
2699
2795
  color: var(--ds-color-text);
2700
2796
  }
2797
+ .ds-datepicker__nav:focus-visible {
2798
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
2799
+ outline-offset: calc(-1 * var(--ds-ring-offset));
2800
+ }
2701
2801
 
2702
2802
  /* Weekday header row */
2703
2803
  .ds-datepicker__weekdays {
@@ -2712,7 +2812,7 @@ hr {
2712
2812
  text-align: center;
2713
2813
  padding: var(--ds-space-1) 0;
2714
2814
  user-select: none;
2715
- font-weight: 500;
2815
+ font-weight: var(--ds-weight-medium);
2716
2816
  }
2717
2817
 
2718
2818
  /* Day grid */
@@ -2734,7 +2834,7 @@ hr {
2734
2834
  font-size: var(--ds-text-sm);
2735
2835
  color: var(--ds-color-text);
2736
2836
  cursor: pointer;
2737
- transition: all var(--ds-duration-fast) var(--ds-ease);
2837
+ transition: all var(--ds-duration-fast) var(--ds-ease-default);
2738
2838
  padding: 0;
2739
2839
  line-height: 1;
2740
2840
  user-select: none;
@@ -2743,18 +2843,22 @@ hr {
2743
2843
  .ds-datepicker__day:hover {
2744
2844
  background-color: var(--ds-color-bg-elevated);
2745
2845
  }
2846
+ .ds-datepicker__day:focus-visible {
2847
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
2848
+ outline-offset: calc(-1 * var(--ds-ring-offset));
2849
+ }
2746
2850
 
2747
2851
  /* Today — subtle ring */
2748
2852
  .ds-datepicker__day--today {
2749
2853
  box-shadow: inset 0 0 0 1px var(--ds-color-border-active);
2750
- font-weight: 600;
2854
+ font-weight: var(--ds-weight-semibold);
2751
2855
  }
2752
2856
 
2753
2857
  /* Selected — inverted fill */
2754
2858
  .ds-datepicker__day--selected {
2755
2859
  background-color: var(--ds-color-text);
2756
2860
  color: var(--ds-color-bg);
2757
- font-weight: 600;
2861
+ font-weight: var(--ds-weight-semibold);
2758
2862
  }
2759
2863
 
2760
2864
  .ds-datepicker__day--selected:hover {
@@ -2779,14 +2883,14 @@ hr {
2779
2883
 
2780
2884
  .ds-datepicker__today {
2781
2885
  font-size: var(--ds-text-xs);
2782
- font-weight: 500;
2886
+ font-weight: var(--ds-weight-medium);
2783
2887
  color: var(--ds-color-text-secondary);
2784
2888
  background: none;
2785
2889
  border: 1px solid var(--ds-color-border);
2786
2890
  border-radius: var(--ds-radius-full);
2787
2891
  padding: var(--ds-space-1) var(--ds-space-3);
2788
2892
  cursor: pointer;
2789
- transition: all var(--ds-duration-fast) var(--ds-ease);
2893
+ transition: all var(--ds-duration-fast) var(--ds-ease-default);
2790
2894
  }
2791
2895
 
2792
2896
  .ds-datepicker__today:hover {
@@ -2794,6 +2898,10 @@ hr {
2794
2898
  color: var(--ds-color-text);
2795
2899
  border-color: var(--ds-color-border-hover);
2796
2900
  }
2901
+ .ds-datepicker__today:focus-visible {
2902
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
2903
+ outline-offset: var(--ds-ring-offset);
2904
+ }
2797
2905
 
2798
2906
  /* Step arrows — prev/next day buttons beside the date text */
2799
2907
  .ds-datepicker__step {
@@ -2808,7 +2916,7 @@ hr {
2808
2916
  color: var(--ds-color-text-tertiary);
2809
2917
  cursor: pointer;
2810
2918
  font-size: var(--ds-text-xs);
2811
- transition: all var(--ds-duration-fast) var(--ds-ease);
2919
+ transition: all var(--ds-duration-fast) var(--ds-ease-default);
2812
2920
  padding: 0;
2813
2921
  flex-shrink: 0;
2814
2922
  }
@@ -2817,6 +2925,10 @@ hr {
2817
2925
  background-color: var(--ds-color-bg-elevated);
2818
2926
  color: var(--ds-color-text);
2819
2927
  }
2928
+ .ds-datepicker__step:focus-visible {
2929
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
2930
+ outline-offset: calc(-1 * var(--ds-ring-offset));
2931
+ }
2820
2932
 
2821
2933
  /* Compact mode — for inline table cells */
2822
2934
  .ds-datepicker--compact .ds-datepicker__panel {
@@ -2835,7 +2947,7 @@ hr {
2835
2947
  }
2836
2948
 
2837
2949
  .ds-datepicker--compact .ds-datepicker__weekday {
2838
- font-size: 0.625rem;
2950
+ font-size: var(--ds-text-2xs);
2839
2951
  }
2840
2952
 
2841
2953
  .ds-datepicker--compact .ds-datepicker__day {
@@ -2843,7 +2955,7 @@ hr {
2843
2955
  }
2844
2956
 
2845
2957
  .ds-datepicker--compact .ds-datepicker__today {
2846
- font-size: 0.625rem;
2958
+ font-size: var(--ds-text-2xs);
2847
2959
  padding: 2px var(--ds-space-2);
2848
2960
  }
2849
2961
 
@@ -3498,6 +3610,10 @@ button.ds-tag:focus-visible {
3498
3610
  .ds-accordion__trigger:hover {
3499
3611
  background-color: var(--ds-color-overlay);
3500
3612
  }
3613
+ .ds-accordion__trigger:focus-visible {
3614
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
3615
+ outline-offset: var(--ds-ring-offset);
3616
+ }
3501
3617
 
3502
3618
  /* Open state – rotate chevron */
3503
3619
  .ds-accordion__item--open .ds-accordion__trigger::after {
@@ -3758,6 +3874,10 @@ button.ds-tag:focus-visible {
3758
3874
  background-color: var(--ds-color-overlay);
3759
3875
  color: var(--ds-color-text);
3760
3876
  }
3877
+ .ds-drawer__close:focus-visible {
3878
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
3879
+ outline-offset: var(--ds-ring-offset);
3880
+ }
3761
3881
 
3762
3882
  /* ==========================================================================
3763
3883
  * Body
@@ -4042,6 +4162,10 @@ button.ds-tag:focus-visible {
4042
4162
  transition:
4043
4163
  background-color var(--ds-duration-fast) var(--ds-ease-default);
4044
4164
  }
4165
+ .ds-drop-zone:focus-visible {
4166
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
4167
+ outline-offset: var(--ds-ring-offset);
4168
+ }
4045
4169
 
4046
4170
  :root:not(.dark) .ds-drop-zone {
4047
4171
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25'%3E%3Crect x='1' y='1' width='99%25' height='99%25' rx='16' ry='16' fill='none' stroke='%23d4d4d8' stroke-width='2' stroke-dasharray='10 8'/%3E%3C/svg%3E");
@@ -4173,6 +4297,12 @@ button.ds-tag:focus-visible {
4173
4297
  border-color: var(--ds-color-border-hover);
4174
4298
  }
4175
4299
 
4300
+ .ds-custom-select__trigger:focus-visible {
4301
+ border-color: var(--ds-color-border-active);
4302
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
4303
+ outline-offset: -1px;
4304
+ }
4305
+
4176
4306
  .ds-custom-select__trigger--open {
4177
4307
  border-color: var(--ds-color-border-active);
4178
4308
  box-shadow: inset 0 0 0 1px var(--ds-color-border-active);
@@ -4336,6 +4466,10 @@ button.ds-tag:focus-visible {
4336
4466
  background-color: var(--ds-color-bg-elevated);
4337
4467
  color: var(--ds-color-text);
4338
4468
  }
4469
+ .ds-custom-select__option:focus-visible {
4470
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
4471
+ outline-offset: calc(-1 * var(--ds-ring-offset));
4472
+ }
4339
4473
 
4340
4474
  .ds-custom-select__option--selected {
4341
4475
  background-color: var(--ds-color-bg-elevated);
@@ -4445,6 +4579,15 @@ button.ds-tag:focus-visible {
4445
4579
  }
4446
4580
  }
4447
4581
 
4582
+ @media (prefers-reduced-motion: reduce) {
4583
+ .ds-custom-select__panel {
4584
+ animation: none;
4585
+ opacity: 1;
4586
+ transform: scale(1);
4587
+ }
4588
+ .ds-custom-select__backdrop { animation: none; opacity: 1; }
4589
+ }
4590
+
4448
4591
  /* ==========================================================================
4449
4592
  Component: Sortable
4450
4593
  Optional drag-to-reorder styles for table rows or list items.
@@ -4557,7 +4700,7 @@ tr:hover .ds-sortable__handle,
4557
4700
  /* Placement: bottom (default) */
4558
4701
  .ds-popover__content,
4559
4702
  .ds-popover--bottom .ds-popover__content {
4560
- top: calc(100% + 8px);
4703
+ top: calc(100% + var(--ds-offset-md));
4561
4704
  left: 50%;
4562
4705
  transform: translateX(-50%) scale(0.96);
4563
4706
  }
@@ -4569,7 +4712,7 @@ tr:hover .ds-sortable__handle,
4569
4712
 
4570
4713
  /* Placement: top */
4571
4714
  .ds-popover--top .ds-popover__content {
4572
- bottom: calc(100% + 8px);
4715
+ bottom: calc(100% + var(--ds-offset-md));
4573
4716
  top: auto;
4574
4717
  left: 50%;
4575
4718
  transform: translateX(-50%) scale(0.96);
@@ -4581,7 +4724,7 @@ tr:hover .ds-sortable__handle,
4581
4724
 
4582
4725
  /* Placement: left */
4583
4726
  .ds-popover--left .ds-popover__content {
4584
- right: calc(100% + 8px);
4727
+ right: calc(100% + var(--ds-offset-md));
4585
4728
  top: 50%;
4586
4729
  left: auto;
4587
4730
  transform: translateY(-50%) scale(0.96);
@@ -4593,7 +4736,7 @@ tr:hover .ds-sortable__handle,
4593
4736
 
4594
4737
  /* Placement: right */
4595
4738
  .ds-popover--right .ds-popover__content {
4596
- left: calc(100% + 8px);
4739
+ left: calc(100% + var(--ds-offset-md));
4597
4740
  top: 50%;
4598
4741
  transform: translateY(-50%) scale(0.96);
4599
4742
  }
@@ -5071,6 +5214,10 @@ tr:hover .ds-sortable__handle,
5071
5214
  background-color: var(--ds-color-bg-elevated);
5072
5215
  color: var(--ds-color-text);
5073
5216
  }
5217
+ .ds-command__item:focus-visible {
5218
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
5219
+ outline-offset: calc(-1 * var(--ds-ring-offset));
5220
+ }
5074
5221
 
5075
5222
  /* Item icon */
5076
5223
  .ds-command__item-icon {
@@ -5304,11 +5451,15 @@ tr:hover .ds-sortable__handle,
5304
5451
  .ds-z-60 { z-index: var(--ds-z-sticky); }
5305
5452
 
5306
5453
  /* --- Inset / Position Values --- */
5307
- .ds-inset-0 { inset: 0; }
5308
- .ds-top-0 { top: 0; }
5309
- .ds-right-0 { right: 0; }
5310
- .ds-bottom-0 { bottom: 0; }
5311
- .ds-left-0 { left: 0; }
5454
+ .ds-inset-0 { inset: 0; }
5455
+ .ds-inset-x-0 { left: 0; right: 0; }
5456
+ .ds-inset-y-0 { top: 0; bottom: 0; }
5457
+ .ds-top-0 { top: 0; }
5458
+ .ds-top-full { top: 100%; }
5459
+ .ds-right-0 { right: 0; }
5460
+ .ds-bottom-0 { bottom: 0; }
5461
+ .ds-bottom-full { bottom: 100%; }
5462
+ .ds-left-0 { left: 0; }
5312
5463
  .ds-top-2 { top: var(--ds-space-2); }
5313
5464
  .ds-right-2 { right: var(--ds-space-2); }
5314
5465
  .ds-left-2 { left: var(--ds-space-2); }