@devslab/dds-css 0.29.1 → 0.29.2

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.
@@ -1,7 +1,8 @@
1
1
  .dds-choice {display:flex;flex-direction:column;gap:var(--dds-space-4);position:relative;min-inline-size:0;font-family:var(--dds-font-family-sans);font-size:var(--dds-typo-body-2-font-size);color:var(--dds-color-text-primary);}
2
2
  .dds-choice-label {font-size:var(--dds-typo-label-font-size);line-height:var(--dds-typo-label-line-height);font-weight:var(--dds-typo-label-font-weight);}
3
3
  .dds-choice-control {position:relative;display:flex;align-items:center;inline-size:100%;min-block-size:var(--dds-space-40);border:1px solid var(--dds-color-border-strong);border-radius:var(--dds-radius-md);background:var(--dds-color-bg-default);}
4
- .dds-choice-control:focus-within {outline:var(--dds-space-2) solid var(--dds-color-border-focus);}
4
+ .dds-choice-control:focus-within {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:calc(var(--dds-space-2) * -1);}
5
+ .dds-choice-control[data-invalid]:focus-within {outline-offset:calc(var(--dds-space-2) * -1.5);}
5
6
  /* The control owns the 40px height (border included, like Input and DatePicker); parts stretch inside it. */
6
7
  .dds-choice-input,.dds-choice-trigger {box-sizing:border-box;align-self:stretch;min-inline-size:0;min-block-size:0;border:0;background:transparent;color:inherit;font:inherit;padding-inline:var(--dds-space-12);}
7
8
  .dds-choice-input {flex:1;inline-size:100%;outline:none;}
@@ -13,14 +13,15 @@
13
13
  .dds-date-picker-table [data-outside-range] {color:var(--dds-color-text-secondary);}
14
14
  .dds-date-picker-table [data-part="table-cell-trigger"][data-selected] {background:var(--dds-color-bg-brand);color:var(--dds-color-text-on-brand);}
15
15
  .dds-date-picker-table [data-today]:not([data-selected]) {text-decoration:underline;text-underline-offset:var(--dds-space-4);}
16
- .dds-date-picker-content :focus-visible {outline:var(--dds-space-2) solid var(--dds-color-text-brand);outline-offset:var(--dds-space-2);}
16
+ .dds-date-picker-content :focus-visible {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:var(--dds-space-2);}
17
17
  .dds-date-picker-footer {display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--dds-space-12);margin-top:var(--dds-space-12);padding-top:var(--dds-space-12);border-top:calc(var(--dds-space-2) / 2) solid var(--dds-color-border-default);}
18
18
 
19
19
  /* Text box shared by DatePicker, MonthPicker and the DateRangePicker pair: same var(--dds-space-40) DDS input look. */
20
20
  .dds-date-picker-control > input,.dds-date-range-box {box-sizing:border-box;flex:1;min-inline-size:0;block-size:var(--dds-space-40);border:calc(var(--dds-space-2) / 2) solid var(--dds-color-border-strong);border-radius:var(--dds-radius-md);background:var(--dds-color-bg-default);color:var(--dds-color-text-primary);font-family:inherit;font-size:var(--dds-typo-body-2-font-size);font-variant-numeric:tabular-nums;}
21
21
  .dds-date-picker-control > input {padding-inline:var(--dds-space-12);}
22
- .dds-date-picker-control > input:focus-visible,.dds-date-range-box:focus-within {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:0;}
22
+ .dds-date-picker-control > input:focus-visible,.dds-date-range-box:focus-within {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:calc(var(--dds-space-2) * -1);}
23
23
  .dds-date-picker-control > input[aria-invalid="true"],.dds-date-range-box[data-invalid] {border-color:var(--dds-color-status-danger);}
24
+ .dds-date-picker-control > input[aria-invalid="true"]:focus-visible,.dds-date-range-box[data-invalid]:focus-within {outline-offset:calc(var(--dds-space-2) * -1.5);}
24
25
  .dds-date-picker-control > input:disabled,.dds-date-range-box[data-disabled] {opacity:.45;cursor:not-allowed;background:var(--dds-color-bg-subtle);}
25
26
  .dds-date-picker-control > input::placeholder,.dds-date-range-input::placeholder {color:var(--dds-color-text-muted);}
26
27
  .dds-date-range-box {display:flex;align-items:center;gap:var(--dds-space-8);padding-inline:var(--dds-space-12);}
@@ -3,8 +3,9 @@
3
3
  .dds-input__label {font-size:var(--dds-typo-label-font-size);line-height:var(--dds-typo-label-line-height);font-weight:var(--dds-typo-label-font-weight);}
4
4
  .dds-input__control {box-sizing:border-box;inline-size:100%;min-inline-size:0;block-size:var(--dds-space-40);padding-inline:var(--dds-space-12);font:inherit;background:var(--dds-color-bg-default);color:var(--dds-color-text-primary);border:1px solid var(--dds-color-border-strong);border-radius:var(--dds-radius-md);}
5
5
  .dds-input__control::placeholder {color:var(--dds-color-text-muted);}
6
- .dds-input__control:focus-visible {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:0;}
6
+ .dds-input__control:focus-visible {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:calc(var(--dds-space-2) * -1);}
7
7
  .dds-input__control[aria-invalid="true"] {border-color:var(--dds-color-status-danger);}
8
+ .dds-input__control[aria-invalid="true"]:focus-visible {outline-offset:calc(var(--dds-space-2) * -1.5);}
8
9
  .dds-input:has(.dds-input__search) .dds-input__control {padding-inline-start:var(--dds-space-40);}
9
10
  .dds-input__search {position:absolute;inset-inline-start:var(--dds-space-12);inset-block-end:var(--dds-space-12);color:var(--dds-color-text-secondary);pointer-events:none;}
10
11
  .dds-input[data-label-placement="inside"]:has(.dds-input__search) .dds-input__label {inset-inline-start:var(--dds-space-40);}
@@ -47,10 +47,14 @@
47
47
  }
48
48
  .dds-number-input__control:focus-within {
49
49
  outline: var(--dds-space-2) solid var(--dds-color-border-focus);
50
+ outline-offset: calc(var(--dds-space-2) * -1);
50
51
  }
51
52
  .dds-number-input__control[data-invalid] {
52
53
  border-color: var(--dds-color-status-danger);
53
54
  }
55
+ .dds-number-input__control[data-invalid]:focus-within {
56
+ outline-offset: calc(var(--dds-space-2) * -1.5);
57
+ }
54
58
 
55
59
  .dds-number-input__field {
56
60
  flex: 1 1 auto;
@@ -33,7 +33,7 @@
33
33
 
34
34
  .dds-select__input:focus-visible {
35
35
  outline: var(--dds-space-2) solid var(--dds-color-border-focus);
36
- outline-offset: 0;
36
+ outline-offset: calc(var(--dds-space-2) * -1);
37
37
  border-color: transparent;
38
38
  }
39
39
 
@@ -48,6 +48,10 @@
48
48
  .dds-select__input[aria-invalid="true"] {
49
49
  border-color: var(--dds-color-status-danger);
50
50
  }
51
+ .dds-field--error .dds-select__input:focus-visible,
52
+ .dds-select__input[aria-invalid="true"]:focus-visible {
53
+ outline-offset: calc(var(--dds-space-2) * -1.5);
54
+ }
51
55
 
52
56
  /* Chevron glyph geometry (8px box, 1.6px stroke) is drawn, not spaced — the
53
57
  * same allowance as the 6px badge dot. translateY(-70%) centers the drawn
@@ -25,7 +25,7 @@
25
25
 
26
26
  .dds-textarea:focus-visible {
27
27
  outline: var(--dds-space-2) solid var(--dds-color-border-focus);
28
- outline-offset: 0;
28
+ outline-offset: calc(var(--dds-space-2) * -1);
29
29
  border-color: transparent;
30
30
  }
31
31
 
@@ -40,3 +40,7 @@
40
40
  .dds-textarea[aria-invalid="true"] {
41
41
  border-color: var(--dds-color-status-danger);
42
42
  }
43
+ .dds-field--error .dds-textarea:focus-visible,
44
+ .dds-textarea[aria-invalid="true"]:focus-visible {
45
+ outline-offset: calc(var(--dds-space-2) * -1.5);
46
+ }
@@ -36,7 +36,7 @@
36
36
 
37
37
  .dds-input:focus-visible {
38
38
  outline: var(--dds-space-2) solid var(--dds-color-border-focus);
39
- outline-offset: 0;
39
+ outline-offset: calc(var(--dds-space-2) * -1);
40
40
  border-color: transparent;
41
41
  }
42
42
 
@@ -58,6 +58,10 @@
58
58
  .dds-input[aria-invalid="true"] {
59
59
  border-color: var(--dds-color-status-danger);
60
60
  }
61
+ .dds-field--error .dds-input:focus-visible,
62
+ .dds-input[aria-invalid="true"]:focus-visible {
63
+ outline-offset: calc(var(--dds-space-2) * -1.5);
64
+ }
61
65
  .dds-field--error .dds-field__help {
62
66
  color: var(--dds-color-status-danger);
63
67
  }
package/dist/dds.css CHANGED
@@ -331,7 +331,7 @@
331
331
 
332
332
  .dds-input:focus-visible {
333
333
  outline: var(--dds-space-2) solid var(--dds-color-border-focus);
334
- outline-offset: 0;
334
+ outline-offset: calc(var(--dds-space-2) * -1);
335
335
  border-color: transparent;
336
336
  }
337
337
 
@@ -353,6 +353,10 @@
353
353
  .dds-input[aria-invalid="true"] {
354
354
  border-color: var(--dds-color-status-danger);
355
355
  }
356
+ .dds-field--error .dds-input:focus-visible,
357
+ .dds-input[aria-invalid="true"]:focus-visible {
358
+ outline-offset: calc(var(--dds-space-2) * -1.5);
359
+ }
356
360
  .dds-field--error .dds-field__help {
357
361
  color: var(--dds-color-status-danger);
358
362
  }
@@ -362,8 +366,9 @@
362
366
  .dds-input__label {font-size:var(--dds-typo-label-font-size);line-height:var(--dds-typo-label-line-height);font-weight:var(--dds-typo-label-font-weight);}
363
367
  .dds-input__control {box-sizing:border-box;inline-size:100%;min-inline-size:0;block-size:var(--dds-space-40);padding-inline:var(--dds-space-12);font:inherit;background:var(--dds-color-bg-default);color:var(--dds-color-text-primary);border:1px solid var(--dds-color-border-strong);border-radius:var(--dds-radius-md);}
364
368
  .dds-input__control::placeholder {color:var(--dds-color-text-muted);}
365
- .dds-input__control:focus-visible {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:0;}
369
+ .dds-input__control:focus-visible {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:calc(var(--dds-space-2) * -1);}
366
370
  .dds-input__control[aria-invalid="true"] {border-color:var(--dds-color-status-danger);}
371
+ .dds-input__control[aria-invalid="true"]:focus-visible {outline-offset:calc(var(--dds-space-2) * -1.5);}
367
372
  .dds-input:has(.dds-input__search) .dds-input__control {padding-inline-start:var(--dds-space-40);}
368
373
  .dds-input__search {position:absolute;inset-inline-start:var(--dds-space-12);inset-block-end:var(--dds-space-12);color:var(--dds-color-text-secondary);pointer-events:none;}
369
374
  .dds-input[data-label-placement="inside"]:has(.dds-input__search) .dds-input__label {inset-inline-start:var(--dds-space-40);}
@@ -413,7 +418,7 @@
413
418
 
414
419
  .dds-textarea:focus-visible {
415
420
  outline: var(--dds-space-2) solid var(--dds-color-border-focus);
416
- outline-offset: 0;
421
+ outline-offset: calc(var(--dds-space-2) * -1);
417
422
  border-color: transparent;
418
423
  }
419
424
 
@@ -428,6 +433,10 @@
428
433
  .dds-textarea[aria-invalid="true"] {
429
434
  border-color: var(--dds-color-status-danger);
430
435
  }
436
+ .dds-field--error .dds-textarea:focus-visible,
437
+ .dds-textarea[aria-invalid="true"]:focus-visible {
438
+ outline-offset: calc(var(--dds-space-2) * -1.5);
439
+ }
431
440
 
432
441
  /* Select — native <select> with the native arrow replaced. Leaving the OS
433
442
  * arrow in place is a rejection criterion in this house: the same control
@@ -464,7 +473,7 @@
464
473
 
465
474
  .dds-select__input:focus-visible {
466
475
  outline: var(--dds-space-2) solid var(--dds-color-border-focus);
467
- outline-offset: 0;
476
+ outline-offset: calc(var(--dds-space-2) * -1);
468
477
  border-color: transparent;
469
478
  }
470
479
 
@@ -479,6 +488,10 @@
479
488
  .dds-select__input[aria-invalid="true"] {
480
489
  border-color: var(--dds-color-status-danger);
481
490
  }
491
+ .dds-field--error .dds-select__input:focus-visible,
492
+ .dds-select__input[aria-invalid="true"]:focus-visible {
493
+ outline-offset: calc(var(--dds-space-2) * -1.5);
494
+ }
482
495
 
483
496
  /* Chevron glyph geometry (8px box, 1.6px stroke) is drawn, not spaced — the
484
497
  * same allowance as the 6px badge dot. translateY(-70%) centers the drawn
@@ -499,7 +512,8 @@
499
512
  .dds-choice {display:flex;flex-direction:column;gap:var(--dds-space-4);position:relative;min-inline-size:0;font-family:var(--dds-font-family-sans);font-size:var(--dds-typo-body-2-font-size);color:var(--dds-color-text-primary);}
500
513
  .dds-choice-label {font-size:var(--dds-typo-label-font-size);line-height:var(--dds-typo-label-line-height);font-weight:var(--dds-typo-label-font-weight);}
501
514
  .dds-choice-control {position:relative;display:flex;align-items:center;inline-size:100%;min-block-size:var(--dds-space-40);border:1px solid var(--dds-color-border-strong);border-radius:var(--dds-radius-md);background:var(--dds-color-bg-default);}
502
- .dds-choice-control:focus-within {outline:var(--dds-space-2) solid var(--dds-color-border-focus);}
515
+ .dds-choice-control:focus-within {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:calc(var(--dds-space-2) * -1);}
516
+ .dds-choice-control[data-invalid]:focus-within {outline-offset:calc(var(--dds-space-2) * -1.5);}
503
517
  /* The control owns the 40px height (border included, like Input and DatePicker); parts stretch inside it. */
504
518
  .dds-choice-input,.dds-choice-trigger {box-sizing:border-box;align-self:stretch;min-inline-size:0;min-block-size:0;border:0;background:transparent;color:inherit;font:inherit;padding-inline:var(--dds-space-12);}
505
519
  .dds-choice-input {flex:1;inline-size:100%;outline:none;}
@@ -549,14 +563,15 @@
549
563
  .dds-date-picker-table [data-outside-range] {color:var(--dds-color-text-secondary);}
550
564
  .dds-date-picker-table [data-part="table-cell-trigger"][data-selected] {background:var(--dds-color-bg-brand);color:var(--dds-color-text-on-brand);}
551
565
  .dds-date-picker-table [data-today]:not([data-selected]) {text-decoration:underline;text-underline-offset:var(--dds-space-4);}
552
- .dds-date-picker-content :focus-visible {outline:var(--dds-space-2) solid var(--dds-color-text-brand);outline-offset:var(--dds-space-2);}
566
+ .dds-date-picker-content :focus-visible {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:var(--dds-space-2);}
553
567
  .dds-date-picker-footer {display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--dds-space-12);margin-top:var(--dds-space-12);padding-top:var(--dds-space-12);border-top:calc(var(--dds-space-2) / 2) solid var(--dds-color-border-default);}
554
568
 
555
569
  /* Text box shared by DatePicker, MonthPicker and the DateRangePicker pair: same var(--dds-space-40) DDS input look. */
556
570
  .dds-date-picker-control > input,.dds-date-range-box {box-sizing:border-box;flex:1;min-inline-size:0;block-size:var(--dds-space-40);border:calc(var(--dds-space-2) / 2) solid var(--dds-color-border-strong);border-radius:var(--dds-radius-md);background:var(--dds-color-bg-default);color:var(--dds-color-text-primary);font-family:inherit;font-size:var(--dds-typo-body-2-font-size);font-variant-numeric:tabular-nums;}
557
571
  .dds-date-picker-control > input {padding-inline:var(--dds-space-12);}
558
- .dds-date-picker-control > input:focus-visible,.dds-date-range-box:focus-within {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:0;}
572
+ .dds-date-picker-control > input:focus-visible,.dds-date-range-box:focus-within {outline:var(--dds-space-2) solid var(--dds-color-border-focus);outline-offset:calc(var(--dds-space-2) * -1);}
559
573
  .dds-date-picker-control > input[aria-invalid="true"],.dds-date-range-box[data-invalid] {border-color:var(--dds-color-status-danger);}
574
+ .dds-date-picker-control > input[aria-invalid="true"]:focus-visible,.dds-date-range-box[data-invalid]:focus-within {outline-offset:calc(var(--dds-space-2) * -1.5);}
560
575
  .dds-date-picker-control > input:disabled,.dds-date-range-box[data-disabled] {opacity:.45;cursor:not-allowed;background:var(--dds-color-bg-subtle);}
561
576
  .dds-date-picker-control > input::placeholder,.dds-date-range-input::placeholder {color:var(--dds-color-text-muted);}
562
577
  .dds-date-range-box {display:flex;align-items:center;gap:var(--dds-space-8);padding-inline:var(--dds-space-12);}
@@ -647,10 +662,14 @@
647
662
  }
648
663
  .dds-number-input__control:focus-within {
649
664
  outline: var(--dds-space-2) solid var(--dds-color-border-focus);
665
+ outline-offset: calc(var(--dds-space-2) * -1);
650
666
  }
651
667
  .dds-number-input__control[data-invalid] {
652
668
  border-color: var(--dds-color-status-danger);
653
669
  }
670
+ .dds-number-input__control[data-invalid]:focus-within {
671
+ outline-offset: calc(var(--dds-space-2) * -1.5);
672
+ }
654
673
 
655
674
  .dds-number-input__field {
656
675
  flex: 1 1 auto;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devslab/dds-css",
3
- "version": "0.29.1",
3
+ "version": "0.29.2",
4
4
  "description": "DDS CSS component layer — class-based, framework-neutral, semantic-token-only (spec §4.3 v1 inventory, 20 components)",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",