@jirawatpyk/aura-react 5.29.0 → 5.31.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/styles.css CHANGED
@@ -12,7 +12,7 @@
12
12
  border: 0;
13
13
  background: transparent;
14
14
  color: inherit;
15
- font-family: inherit;
15
+ font-family: var(--font-sans); /* 5.30: not inherit — a trigger outside a styled root fell back to Arial */
16
16
  font-size: 13px;
17
17
  font-weight: 500;
18
18
  line-height: 1;
@@ -44,6 +44,19 @@ button.aura-btn--secondary[aria-disabled='true']:hover, button.aura-btn--ghost[a
44
44
  button.aura-btn--danger-secondary[aria-disabled='true']:hover { background: transparent; }
45
45
  button.aura-btn--danger[aria-disabled='true']:hover { background: var(--aura-button-danger-bg); }
46
46
  button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-shadow-creative); transform: none; }
47
+ /* 5.30: a disabled filled button (primary, danger, creative) is a quiet grey fill with muted text, not a faded copy of
48
+ * itself — faded ink read as a separate grey button, faded red as pink. Outline and ghost buttons keep the fade. */
49
+ .aura-btn:is(.aura-btn--primary, .aura-btn--danger, .aura-btn--creative):is(:disabled, [aria-disabled='true']:not(.is-loading)),
50
+ .aura-btn:is(.aura-btn--primary, .aura-btn--danger, .aura-btn--creative):is(:disabled, [aria-disabled='true']:not(.is-loading)):hover {
51
+ opacity: 1; background: var(--aura-button-disabled-bg); color: var(--aura-button-disabled-fg); border-color: transparent; box-shadow: none;
52
+ }
53
+ /* Forced colours drop the fills: filled buttons get a 1px edge (as outline buttons have), and a disabled or gated one
54
+ * (still focusable) shows GrayText and keeps the fade, without changing size. */
55
+ @media (forced-colors: active) {
56
+ .aura-btn:is(.aura-btn--primary, .aura-btn--danger) { border: 1px solid ButtonText; }
57
+ .aura-btn.aura-btn:is(:disabled, [aria-disabled='true']:not(.is-loading)),
58
+ .aura-btn.aura-btn.aura-btn:is(:disabled, [aria-disabled='true']:not(.is-loading)):hover { color: GrayText; border-color: GrayText; opacity: var(--aura-disabled-opacity); }
59
+ }
47
60
  .aura-btn.is-loading:active { transform: none; }
48
61
 
49
62
  /* Focus — ADDED: the source defines none. Solid 2px ring, 2px offset, on every interactive element. */
@@ -93,10 +106,17 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
93
106
  color: var(--aura-fg-primary);
94
107
  }
95
108
  .aura-table__scroll { position: relative; overflow: auto; overscroll-behavior: contain; height: var(--aura-table-h, auto); }
109
+ /* 5.30: more columns past the end edge — a soft shadow over the grid's end edge (not over its scrollbars, its footer
110
+ * or the column button), so it reads as scrolling sideways. JavaScript places it (top, height, scrollbar inset). */
111
+ .aura-table__edge {
112
+ position: absolute; z-index: 4; inset-inline-end: var(--aura-edge-sb, 0px); top: var(--aura-edge-top, 0px); height: var(--aura-edge-h, 0px);
113
+ width: 16px; pointer-events: none; background: linear-gradient(to left, var(--aura-scroll-shadow), transparent);
114
+ }
115
+ .aura-table__edge:dir(rtl) { background: linear-gradient(to right, var(--aura-scroll-shadow), transparent); }
96
116
  .aura-table__head {
97
117
  position: sticky; top: 0; z-index: 3; box-sizing: border-box; /* the hairline is inside the row height */
98
118
  display: flex; height: var(--aura-table-row-height); min-width: var(--aura-row-min, 0);
99
- background: var(--aura-bg-canvas);
119
+ background: var(--aura-table-head-bg);
100
120
  border-bottom: 1px solid var(--aura-border-default);
101
121
  font-family: var(--font-mono); font-size: 12px; color: var(--aura-fg-secondary);
102
122
  }
@@ -169,7 +189,7 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
169
189
  .aura-table__gutter--end { position: static; }
170
190
  .aura-table__picker {
171
191
  position: absolute; top: 0; right: 0; z-index: 5; width: var(--aura-space-12); height: calc(var(--aura-table-row-height) - 1px);
172
- display: flex; align-items: center; justify-content: center; background: var(--aura-bg-canvas); border-top-right-radius: calc(var(--aura-card-radius) - 1px);
192
+ display: flex; align-items: center; justify-content: center; background: var(--aura-table-head-bg); border-top-right-radius: calc(var(--aura-card-radius) - 1px);
173
193
  }
174
194
  .aura-table__gutter--end.has-picker {
175
195
  width: var(--aura-space-12); position: sticky; left: auto; right: 0;
@@ -270,7 +290,7 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
270
290
  display: inline-flex; align-items: center; justify-content: center;
271
291
  border: 1.5px solid var(--aura-border-control); border-radius: var(--aura-radius-xs);
272
292
  }
273
- .aura-menu__check.is-on { background: var(--aura-button-primary-bg); border-color: var(--aura-button-primary-bg); color: var(--aura-button-primary-fg); }
293
+ .aura-menu__check.is-on { background: var(--aura-control-checked-bg); border-color: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); }
274
294
  .aura-menu__check.is-on .aura-icon { color: inherit; }
275
295
  .aura-menu__item--danger, .aura-menu__item--danger .aura-icon { color: var(--aura-fg-danger); }
276
296
  .aura-menu__item--danger:hover, .aura-menu__item--danger:focus { background: var(--aura-alert-danger-bg); color: var(--aura-alert-danger-fg); }
@@ -280,8 +300,8 @@ a.aura-menu__item { text-decoration: none; box-sizing: border-box; }
280
300
  flex: none; box-sizing: border-box; width: 16px; height: 16px; border-radius: var(--aura-radius-full);
281
301
  border: 1px solid var(--aura-border-control); display: inline-flex; align-items: center; justify-content: center;
282
302
  }
283
- .aura-menu__radio.is-on { border-color: var(--aura-button-primary-bg); }
284
- .aura-menu__radio.is-on::after { content: ''; width: 8px; height: 8px; border-radius: var(--aura-radius-full); background: var(--aura-button-primary-bg); }
303
+ .aura-menu__radio.is-on { border-color: var(--aura-control-checked-bg); }
304
+ .aura-menu__radio.is-on::after { content: ''; width: 8px; height: 8px; border-radius: var(--aura-radius-full); background: var(--aura-control-checked-bg); }
285
305
  /* 5.7: a header above the items (who is signed in), set off by a hairline like a separator. */
286
306
  .aura-menu__header { margin: calc(-1 * var(--aura-space-1)) calc(-1 * var(--aura-space-1)) var(--aura-space-1); padding: var(--aura-space-3); border-bottom: 1px solid var(--aura-border-default); color: var(--aura-fg-secondary); font-size: 12px; line-height: 18px; overflow-wrap: anywhere; }
287
307
  .aura-menu__header > * { margin: 0; }
@@ -341,7 +361,7 @@ a.aura-icon-btn { text-decoration: none; }
341
361
  /* 5.29 (Chamber-OS 134): a DataTable skeleton row stands in for the real one — text lines (skeletonLines) on the 20px
342
362
  * line, and a button-height bar where row actions go: 32px, or 44px under the touchHeight rule with the column's
343
363
  * skeletonTouch; full width in a card footer. */
344
- .aura-skel--action { flex: none; width: var(--aura-button-height-sm); height: var(--aura-button-height-sm); border-radius: var(--aura-radius-md); }
364
+ .aura-skel--action { flex: none; width: var(--aura-button-height-sm); height: var(--aura-button-height-sm); border-radius: var(--aura-button-radius); } /* 5.30: the button's own shape */
345
365
  .aura-skel--action.is-footer { width: 100%; }
346
366
  .aura-table__td.is-end > .aura-skel-lines { align-items: flex-end; }
347
367
  @media (max-width: 639.98px), (pointer: coarse) {
@@ -373,12 +393,12 @@ a.aura-icon-btn { text-decoration: none; }
373
393
  box-sizing: border-box; width: 100%; height: 100%;
374
394
  display: inline-flex; align-items: center; justify-content: center;
375
395
  border: 1.5px solid var(--aura-border-control); border-radius: var(--aura-radius-xs);
376
- background: var(--aura-bg-surface); color: var(--aura-button-primary-fg);
396
+ background: var(--aura-bg-surface); color: var(--aura-control-checked-fg);
377
397
  transition: background var(--aura-duration-fast) var(--aura-ease), border-color var(--aura-duration-fast) var(--aura-ease);
378
398
  pointer-events: none;
379
399
  }
380
400
  .aura-check__input:checked + .aura-check__box,
381
- .aura-check__input:indeterminate + .aura-check__box { background: var(--aura-button-primary-bg); border-color: var(--aura-button-primary-bg); }
401
+ .aura-check__input:indeterminate + .aura-check__box { background: var(--aura-control-checked-bg); border-color: var(--aura-control-checked-bg); }
382
402
  .aura-check__input:focus-visible + .aura-check__box { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
383
403
  .aura-table__mono { font-family: var(--font-mono); }
384
404
 
@@ -391,6 +411,7 @@ a.aura-icon-btn { text-decoration: none; }
391
411
  border-radius: var(--aura-radius-full);
392
412
  padding: 2px var(--aura-space-2) 2px 6px;
393
413
  font-size: 11px;
414
+ font-weight: 500; /* 5.30 (Chamber-OS 137): medium everywhere, not the parent's weight; Badge stays 600 */
394
415
  line-height: 16px;
395
416
  white-space: nowrap;
396
417
  background: var(--aura-status-neutral-bg);
@@ -453,6 +474,8 @@ a.aura-icon-btn { text-decoration: none; }
453
474
  .aura-field__hint, .aura-field__error { display: flex; align-items: flex-start; gap: var(--aura-space-1); margin: 0; font-size: 12px; line-height: 1.5; color: var(--aura-fg-secondary); }
454
475
  .aura-field__error { color: var(--aura-fg-danger); }
455
476
  .aura-field__error .aura-icon { margin-top: 2px; }
477
+ /* 5.31 (Chamber-OS addendum 41): TextField/Textarea `labelAddon`, between the label and the box, in the field's gap. */
478
+ .aura-field__addon { min-width: 0; font-size: 13px; line-height: 1.5; color: var(--aura-fg-primary); }
456
479
  .aura-field.is-disabled .aura-field__label { color: var(--aura-fg-secondary); }
457
480
 
458
481
  .aura-input {
@@ -521,30 +544,31 @@ a.aura-icon-btn { text-decoration: none; }
521
544
  border: 1.5px solid var(--aura-border-control); background: var(--aura-bg-input); cursor: inherit;
522
545
  transition: border-width var(--aura-duration-fast) var(--aura-ease);
523
546
  }
524
- .aura-radio:checked { border: 5px solid var(--aura-button-primary-bg); background: var(--aura-button-primary-fg); }
547
+ .aura-radio:checked { border: 5px solid var(--aura-control-checked-bg); background: var(--aura-control-checked-fg); }
525
548
  .aura-radio:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
526
549
  .aura-radio-group.is-invalid .aura-radio:not(:checked) { border-color: var(--aura-border-danger); }
527
550
 
528
551
  .aura-switch-row { display: flex; align-items: flex-start; gap: var(--aura-space-3); font-family: var(--font-sans); }
529
552
  /* 5.10.1: disabled rows, on or off, are treated alike and stay readable — the label turns secondary, the description
530
- * keeps its colour (often the reason it's locked) — and only the switch fades: off to the disabled opacity, on to 0.75,
553
+ * keeps its colour (often the reason it's locked) — and only the switch fades: off to the disabled opacity, on keeps its track and fades its thumb (5.30: the violet track at 0.75 fell under 3:1),
531
554
  * ≥3:1 apart in both themes, so "locked on" never looks like "off". */
532
555
  .aura-switch-row.is-disabled { cursor: not-allowed; }
533
556
  .aura-switch-row.is-disabled .aura-choice__label { color: var(--aura-fg-secondary); cursor: not-allowed; }
534
557
  .aura-switch:disabled { opacity: var(--aura-disabled-opacity); }
535
- .aura-switch.is-on:disabled { opacity: 0.75; }
558
+ .aura-switch.is-on:disabled { opacity: 1; } /* 5.30: the violet track stays whole (faded, it fell under 3:1 from off)… */
559
+ .aura-switch.is-on:disabled .aura-switch__thumb { opacity: 0.6; } /* …and the thumb fades, so it doesn't look enabled */
536
560
  .aura-switch {
537
561
  position: relative; flex: none; box-sizing: border-box; margin: 0; padding: 0;
538
562
  width: var(--aura-switch-width); height: var(--aura-switch-height); border-radius: var(--aura-radius-full);
539
563
  border: 0; background: var(--aura-border-control); cursor: pointer;
540
564
  transition: background var(--aura-duration-fast) var(--aura-ease);
541
565
  }
542
- .aura-switch.is-on { background: var(--aura-button-primary-bg); }
566
+ .aura-switch.is-on { background: var(--aura-control-checked-bg); }
543
567
  .aura-switch__thumb {
544
568
  position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: var(--aura-radius-full);
545
569
  background: var(--aura-bg-surface); transition: transform var(--aura-duration-fast) var(--aura-ease);
546
570
  }
547
- .aura-switch.is-on .aura-switch__thumb { transform: translateX(16px); background: var(--aura-button-primary-fg); }
571
+ .aura-switch.is-on .aura-switch__thumb { transform: translateX(16px); background: var(--aura-control-checked-fg); }
548
572
  .aura-switch:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
549
573
  .aura-switch:disabled { cursor: not-allowed; }
550
574
  /* 5.19 (Chamber-OS 113): a read-only switch keeps its colours (a locked "on" reads as on at full contrast) and stays
@@ -717,7 +741,7 @@ a.aura-icon-btn { text-decoration: none; }
717
741
  transition: color var(--aura-duration-fast) var(--aura-ease), border-color var(--aura-duration-fast) var(--aura-ease);
718
742
  }
719
743
  .aura-tab:hover { color: var(--aura-fg-primary); }
720
- .aura-tab.is-active { color: var(--aura-fg-primary); border-bottom-color: var(--aura-fg-primary); }
744
+ .aura-tab.is-active { color: var(--aura-fg-primary); border-bottom-color: var(--aura-control-checked-bg); }
721
745
  .aura-tab:disabled, .aura-tab.is-disabled { opacity: var(--aura-disabled-opacity); cursor: not-allowed; }
722
746
  a.aura-tab { text-decoration: none; }
723
747
  .aura-tab:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: -4px; border-radius: var(--aura-radius-xs); }
@@ -924,7 +948,7 @@ a.aura-tab { text-decoration: none; }
924
948
  .aura-cal__day:hover { background: var(--aura-bg-surface-hover); }
925
949
  .aura-cal__day.is-outside { color: var(--aura-fg-tertiary); }
926
950
  .aura-cal__day.is-today { box-shadow: inset 0 0 0 1px var(--aura-border-control); font-weight: 600; }
927
- .aura-cal__day.is-selected { background: var(--aura-button-primary-bg); color: var(--aura-button-primary-fg); box-shadow: none; }
951
+ .aura-cal__day.is-selected { background: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); box-shadow: none; }
928
952
  .aura-cal__day:disabled, .aura-cal__day[aria-disabled='true'] { opacity: var(--aura-disabled-opacity); cursor: not-allowed; background: transparent; text-decoration: line-through; }
929
953
  .aura-cal__day:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; }
930
954
  .aura-cal__grid td.is-in-range { background: var(--aura-bg-selected); }
@@ -937,7 +961,7 @@ a.aura-tab { text-decoration: none; }
937
961
  font: inherit; font-size: 13px; font-variant-numeric: tabular-nums; cursor: pointer;
938
962
  }
939
963
  .aura-cal__year:hover { background: var(--aura-bg-surface-hover); }
940
- .aura-cal__year.is-selected { background: var(--aura-button-primary-bg); color: var(--aura-button-primary-fg); }
964
+ .aura-cal__year.is-selected { background: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); }
941
965
  .aura-cal__foot { display: flex; justify-content: space-between; margin-top: var(--aura-space-2); padding-top: var(--aura-space-2); border-top: 1px solid var(--aura-border-subtle); }
942
966
  .aura-cal__link {
943
967
  height: var(--aura-control-sm); padding: 0 var(--aura-space-2); border: 0; border-radius: var(--aura-radius-sm);
@@ -1051,8 +1075,10 @@ a.aura-tab { text-decoration: none; }
1051
1075
  .aura-shell__content:not(.is-flush) > .aura-container { padding-left: 0; padding-right: 0; }
1052
1076
 
1053
1077
  /* Totals row (4.19): under the body, a strong top edge; sticky at the bottom of a `height` table with stickyFooter. */
1054
- .aura-table__total { background: var(--aura-bg-canvas); border-top: 1px solid var(--aura-border-strong); font-weight: 600; }
1055
- .aura-table__total.is-sticky { position: sticky; bottom: 0; z-index: 3; }
1078
+ /* 5.30: a 2px hairline-colour rule over the totals (border-strong was a glaring white line in dark); a pinned totals row
1079
+ * casts a soft shadow over the rows scrolling under it. */
1080
+ .aura-table__total { background: var(--aura-table-head-bg); border-top: 2px solid var(--aura-border-default); font-weight: 600; }
1081
+ .aura-table__total.is-sticky { position: sticky; bottom: 0; z-index: 3; box-shadow: 0 -6px 8px -6px var(--aura-scroll-shadow); }
1056
1082
  .aura-table__total .aura-table__td.is-end { font-variant-numeric: tabular-nums; }
1057
1083
  .aura-tooltip--above { transform: translateY(-100%); max-width: min(var(--aura-tooltip-max), 90vw); white-space: normal; }
1058
1084
 
@@ -1145,7 +1171,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1145
1171
  .aura-badge {
1146
1172
  display: inline-flex; align-items: center; gap: 4px; height: 20px; padding: 0 var(--aura-space-2); box-sizing: border-box;
1147
1173
  border-radius: var(--aura-radius-full); border: 1px solid transparent; font-family: var(--font-sans); font-size: 11px; font-weight: 600; line-height: 1; white-space: nowrap; font-variant-numeric: tabular-nums;
1148
- background: var(--aura-bg-surface-hover); color: var(--aura-fg-secondary);
1174
+ background: var(--aura-status-neutral-bg); color: var(--aura-status-neutral-fg); /* 5.30: surface-hover vanished on the light canvas */
1149
1175
  }
1150
1176
  .aura-badge--accent { background: var(--aura-alert-info-bg); color: var(--aura-alert-info-fg); }
1151
1177
  .aura-badge--success { background: var(--aura-alert-success-bg); color: var(--aura-alert-success-fg); }
@@ -1208,7 +1234,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1208
1234
  .aura-empty { display: flex; flex-direction: column; align-items: center; text-align: center; gap: var(--aura-space-2); padding: var(--aura-space-12) var(--aura-space-6); font-family: var(--font-sans); color: var(--aura-fg-primary); }
1209
1235
  .aura-empty.is-sm { padding: var(--aura-space-6) var(--aura-space-4); }
1210
1236
  .aura-empty.is-bordered { border: 1px dashed var(--aura-border-control); border-radius: var(--aura-radius-lg); }
1211
- .aura-empty__icon { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; margin-bottom: var(--aura-space-2); border-radius: var(--aura-radius-full); background: var(--aura-bg-surface-hover); color: var(--aura-fg-secondary); }
1237
+ .aura-empty__icon { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; margin-bottom: var(--aura-space-2); border-radius: var(--aura-radius-full); background: var(--aura-status-neutral-bg); color: var(--aura-fg-secondary); }
1212
1238
  .aura-empty.is-sm .aura-empty__icon { width: 36px; height: 36px; }
1213
1239
  .aura-empty__title { margin: 0; font-size: 16px; line-height: 1.5; font-weight: 600; }
1214
1240
  .aura-empty__text { margin: 0; max-width: 44ch; font-size: 14px; line-height: 1.6; color: var(--aura-fg-secondary); }
@@ -1226,7 +1252,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1226
1252
  border: 0; border-radius: var(--aura-radius-full); background: transparent; color: var(--aura-fg-primary); font: inherit; font-variant-numeric: tabular-nums; text-decoration: none; cursor: pointer;
1227
1253
  }
1228
1254
  .aura-page:hover { background: var(--aura-bg-surface-hover); }
1229
- .aura-page.is-current { background: var(--aura-button-primary-bg); color: var(--aura-button-primary-fg); font-weight: 600; }
1255
+ .aura-page.is-current { background: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); font-weight: 600; }
1230
1256
  .aura-page:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
1231
1257
  .aura-pagination__gap { min-width: 24px; text-align: center; color: var(--aura-fg-secondary); }
1232
1258
  .aura-pagination__compact { display: none; padding: 0 var(--aura-space-2); color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; }
@@ -1320,7 +1346,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1320
1346
  color: var(--aura-fg-secondary); font-size: 13px; font-weight: 600; font-variant-numeric: tabular-nums;
1321
1347
  }
1322
1348
  .aura-stepper__marker .aura-icon { width: 16px; height: 16px; }
1323
- .aura-stepper__item.is-done .aura-stepper__marker { background: var(--aura-button-primary-bg); border-color: var(--aura-button-primary-bg); color: var(--aura-button-primary-fg); }
1349
+ .aura-stepper__item.is-done .aura-stepper__marker { background: var(--aura-control-checked-bg); border-color: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); }
1324
1350
  .aura-stepper__item.is-current .aura-stepper__marker { border: 2px solid var(--aura-fg-accent); color: var(--aura-fg-accent); }
1325
1351
  .aura-stepper__text { display: flex; flex-direction: column; min-width: 0; padding-top: 4px; }
1326
1352
  .aura-stepper__label { font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--aura-fg-secondary); }
@@ -1333,12 +1359,12 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1333
1359
  }
1334
1360
  .aura-stepper--horizontal .aura-stepper__step { flex-direction: column; gap: var(--aura-space-2); }
1335
1361
  .aura-stepper--horizontal .aura-stepper__text { padding-top: 0; }
1336
- .aura-stepper--horizontal .aura-stepper__item.is-done::after { background: var(--aura-button-primary-bg); }
1362
+ .aura-stepper--horizontal .aura-stepper__item.is-done::after { background: var(--aura-control-checked-bg); }
1337
1363
  .aura-stepper--vertical .aura-stepper__item { flex: none; padding-bottom: var(--aura-space-5); }
1338
1364
  .aura-stepper--vertical .aura-stepper__item:not(:last-child)::after {
1339
1365
  content: ""; position: absolute; left: 14px; top: 32px; bottom: 4px; width: 1px; background: var(--aura-border-control);
1340
1366
  }
1341
- .aura-stepper--vertical .aura-stepper__item.is-done::after { background: var(--aura-button-primary-bg); }
1367
+ .aura-stepper--vertical .aura-stepper__item.is-done::after { background: var(--aura-control-checked-bg); }
1342
1368
  .aura-stepper__compact { display: none; margin: var(--aura-space-2) 0 0; font-size: 13px; }
1343
1369
  .aura-stepper__count { color: var(--aura-fg-secondary); margin-right: var(--aura-space-2); }
1344
1370
  .aura-stepper__compact-label { font-weight: 600; }
@@ -1357,15 +1383,16 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1357
1383
  .aura-segmented.is-full { display: flex; width: 100%; }
1358
1384
  .aura-segmented__option {
1359
1385
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
1360
- height: 32px; padding: 0 var(--aura-space-4); box-sizing: border-box;
1386
+ height: calc(var(--aura-input-height) - 6px); /* 5.30: the control is as tall as a field beside it (2px padding, 1px edge) */
1387
+ padding: 0 var(--aura-space-4); box-sizing: border-box;
1361
1388
  border: 0; border-radius: var(--aura-radius-full); background: transparent; color: var(--aura-fg-secondary);
1362
1389
  font: inherit; font-size: 13px; font-weight: 500; white-space: nowrap; cursor: pointer;
1363
1390
  transition: background-color var(--aura-duration-fast) var(--aura-ease), color var(--aura-duration-fast) var(--aura-ease), box-shadow var(--aura-duration-fast) var(--aura-ease);
1364
1391
  }
1365
1392
  .aura-segmented.is-full .aura-segmented__option { flex: 1 1 0; min-width: 0; }
1366
- .aura-segmented__option.is-icon { padding: 0; width: 36px; }
1393
+ .aura-segmented__option.is-icon { padding: 0; width: calc(var(--aura-input-height) - 6px); } /* 5.30: square */
1367
1394
  .aura-segmented__option:hover:not(:disabled):not(.is-selected) { color: var(--aura-fg-primary); }
1368
- .aura-segmented__option.is-selected { background: var(--aura-bg-surface); color: var(--aura-fg-primary); box-shadow: inset 0 0 0 1px var(--aura-border-control), var(--aura-shadow-enterprise); } /* 5.2: the edge marks the choice at 3:1; the fill alone was 1.04:1 on the track */
1395
+ .aura-segmented__option.is-selected { background: var(--aura-segmented-thumb-bg); color: var(--aura-fg-primary); font-weight: 600; box-shadow: inset 0 0 0 1px var(--aura-border-control), var(--aura-shadow-enterprise); } /* 5.2: the edge marks the choice at 3:1; the fill alone was 1.04:1 on the track */
1369
1396
  .aura-segmented__option:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; }
1370
1397
  .aura-segmented__option:disabled { opacity: var(--aura-disabled-opacity); cursor: default; }
1371
1398
  .aura-segmented--sm .aura-segmented__option { height: 24px; padding: 0 var(--aura-space-3); font-size: 12px; }
@@ -1463,11 +1490,33 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1463
1490
  .aura-check--labelled .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
1464
1491
  .aura-switch-row:not(.is-disabled):not(.is-readonly) { cursor: pointer; }
1465
1492
  .aura-radio-group__list { gap: 0; }
1466
- .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); }
1493
+ .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
1494
+ }
1495
+ /* 5.30 (Chamber-OS 135): `touchHeight` on TextField, Textarea, Select, RadioGroup and Checkbox — 44px boxes and choice
1496
+ * rows (a one-line label centred), below 640px or on a coarse pointer (is-touch) or at every width (is-touch-always).
1497
+ * The field's own --aura-input-height wins over any density around it. */
1498
+ .aura-field.is-touch-always { --aura-input-height: var(--aura-touch-target); }
1499
+ .aura-radio-group.is-touch-always .aura-choice, .aura-check--labelled.is-touch-always {
1500
+ box-sizing: border-box; min-height: var(--aura-touch-target); padding-block: calc((var(--aura-touch-target) - 20px) / 2);
1501
+ }
1502
+ .aura-check--labelled.is-touch-always .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
1503
+ .aura-radio-group.is-touch-always .aura-radio-group__list { gap: 0; }
1504
+ .aura-radio-group.is-touch-always .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
1505
+ @media (max-width: 639.98px), (pointer: coarse) {
1506
+ .aura-field.is-touch { --aura-input-height: var(--aura-touch-target); }
1507
+ .aura-radio-group.is-touch .aura-choice, .aura-check--labelled.is-touch {
1508
+ box-sizing: border-box; min-height: var(--aura-touch-target); padding-block: calc((var(--aura-touch-target) - 20px) / 2);
1509
+ }
1510
+ .aura-check--labelled.is-touch .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
1511
+ .aura-radio-group.is-touch .aura-radio-group__list { gap: 0; }
1512
+ .aura-radio-group.is-touch .aura-radio-group__list.is-horizontal { gap: 0 var(--aura-space-6); align-items: flex-start; }
1467
1513
  }
1468
1514
 
1469
1515
  /* PasswordField: the show/hide IconButton sits in the suffix slot, 6px from the edge */
1470
1516
  .aura-password .aura-input__suffix { padding-right: 6px; display: flex; align-items: center; }
1517
+ /* 5.30: a button inside a field (show password) is as quiet as the field's other icons until hovered. */
1518
+ .aura-input .aura-icon-btn { color: var(--aura-fg-secondary); }
1519
+ .aura-input .aura-icon-btn:hover:not(:disabled) { color: var(--aura-fg-primary); }
1471
1520
 
1472
1521
  /* FormErrorSummary: a danger alert whose items link to their fields */
1473
1522
  .aura-error-summary:focus-visible, .aura-error-summary:focus { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
@@ -1560,6 +1609,12 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1560
1609
  .aura-filterselect__name { flex: none; white-space: nowrap; color: var(--aura-fg-secondary); }
1561
1610
  .aura-filterselect__value { min-width: 0; font-weight: 500; overflow-wrap: anywhere; }
1562
1611
  .aura-filterselect__chevron { flex: none; width: 14px; height: 14px; color: var(--aura-fg-secondary); }
1612
+ /* 5.30: from 640px the face has a field's inset and text size, like the search box beside it; phones keep the tight
1613
+ * face so three filters and a chip share one row. */
1614
+ @media (min-width: 640px) {
1615
+ .aura-filterselect__face { padding-inline: var(--aura-space-3) var(--aura-space-2); font-size: 14px; }
1616
+ .aura-filterselect__chevron { width: var(--aura-icon-sm); height: var(--aura-icon-sm); }
1617
+ }
1563
1618
  .aura-filterselect.is-open .aura-filterselect__chevron { transform: rotate(180deg); }
1564
1619
  .aura-filterselect__face:focus-visible, .aura-filterselect:has(.aura-filterselect__native:focus-visible) .aura-filterselect__face {
1565
1620
  outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; border-color: var(--aura-border-strong);
@@ -1729,21 +1784,35 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1729
1784
  /* DataTable's grid look — mono header band, hairlines, 20px outer radius — on plain <table> markup, with wrapping text. */
1730
1785
  .aura-tbl-wrap {
1731
1786
  overflow-x: auto; border: 1px solid var(--aura-border-default); border-radius: var(--aura-card-radius);
1732
- background: var(--aura-bg-surface); color: var(--aura-fg-primary); font-family: var(--font-sans);
1787
+ color: var(--aura-fg-primary); font-family: var(--font-sans);
1788
+ /* 5.30: a table wider than its box shows a soft shadow at the edge that has more to scroll to (CSS only: the covers
1789
+ * scroll with the content, the shadows stay with the box). Body rows show it; the header band and totals rows, with
1790
+ * their own fill, cover it. Set --aura-tbl-bg if you give the box another ground. A flush table has none. */
1791
+ background:
1792
+ linear-gradient(to right, var(--aura-tbl-bg, var(--aura-bg-surface)) 30%, transparent) left / 32px 100% no-repeat local,
1793
+ linear-gradient(to left, var(--aura-tbl-bg, var(--aura-bg-surface)) 30%, transparent) right / 32px 100% no-repeat local,
1794
+ linear-gradient(to right, var(--aura-scroll-shadow), transparent) left / 12px 100% no-repeat scroll,
1795
+ linear-gradient(to left, var(--aura-scroll-shadow), transparent) right / 12px 100% no-repeat scroll,
1796
+ var(--aura-tbl-bg, var(--aura-bg-surface));
1733
1797
  }
1734
1798
  .aura-tbl { width: 100%; border-collapse: collapse; border-spacing: 0; font-size: 13px; line-height: 20px; }
1735
- .aura-tbl__caption { caption-side: top; padding: var(--aura-space-4) var(--aura-space-6) 0; text-align: left; font-size: 14px; font-weight: 600; }
1799
+ .aura-tbl__caption { caption-side: top; padding: var(--aura-space-4) var(--aura-space-6) var(--aura-space-3); text-align: left; font-size: 14px; font-weight: 600; }
1800
+ /* 5.30: from 640px a cell is at least 10ch wide, so the table never squeezes a column to one letter; a longer word (an
1801
+ * email, a URL) still breaks to fit instead of widening the table. Phones keep fitting the box: use stackBelow there. */
1736
1802
  .aura-tbl__th, .aura-tbl__td { padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); text-align: left; vertical-align: top; overflow-wrap: anywhere; }
1803
+ @media (min-width: 640px) { .aura-tbl__th, .aura-tbl__td { min-width: 10ch; } }
1737
1804
  .aura-tbl__th:first-child, .aura-tbl__td:first-child { padding-left: var(--aura-space-6); }
1738
1805
  .aura-tbl__th:last-child, .aura-tbl__td:last-child { padding-right: var(--aura-space-6); }
1739
1806
  .aura-tbl__head .aura-tbl__th {
1740
- background: var(--aura-bg-canvas); border-bottom: 1px solid var(--aura-border-default);
1807
+ background: var(--aura-table-head-bg); border-bottom: 1px solid var(--aura-border-default);
1741
1808
  font-family: var(--font-mono); font-size: 12px; font-weight: 400; color: var(--aura-fg-secondary); white-space: nowrap;
1742
1809
  }
1743
1810
  .aura-tbl__body .aura-tbl__row + .aura-tbl__row > * { border-top: 1px solid var(--aura-border-default); }
1744
1811
  .aura-tbl__body .aura-tbl__th { font-weight: 500; }
1745
- .aura-tbl__foot > .aura-tbl__row > * { background: var(--aura-bg-canvas); font-weight: 600; }
1746
- .aura-tbl__foot > .aura-tbl__row:first-child > * { border-top: 1px solid var(--aura-border-strong); }
1812
+ .aura-tbl__foot > .aura-tbl__row > * { background: var(--aura-table-head-bg); font-weight: 600; }
1813
+ .aura-tbl__foot > .aura-tbl__row:first-child > * { border-top: 2px solid var(--aura-border-default); }
1814
+ /* 5.30: with several totals rows (Subtotal, VAT, Total) the last one reads as the total. */
1815
+ .aura-tbl__foot > .aura-tbl__row:last-child:not(:first-child) > * { font-size: 14px; font-weight: 700; }
1747
1816
  .aura-tbl__foot > .aura-tbl__row + .aura-tbl__row > * { border-top: 1px solid var(--aura-border-default); }
1748
1817
  .aura-tbl .is-end { text-align: right; }
1749
1818
  .aura-tbl .is-center { text-align: center; }
@@ -1787,7 +1856,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1787
1856
  @container aura-tbl (width < 768px) {
1788
1857
  .aura-tbl--stack-md, .aura-tbl--stack-md > .aura-tbl__body, .aura-tbl--stack-md > .aura-tbl__foot, .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { display: block; }
1789
1858
  .aura-tbl--stack-md > .aura-tbl__head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
1790
- .aura-tbl--stack-md > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) 0; }
1859
+ .aura-tbl--stack-md > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) var(--aura-space-3); }
1791
1860
  .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { height: auto; padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); }
1792
1861
  .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row + .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row:first-child { border-top: 1px solid var(--aura-border-default); }
1793
1862
  .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
@@ -1811,7 +1880,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1811
1880
  @container aura-tbl (width < 640px) {
1812
1881
  .aura-tbl--stack-sm, .aura-tbl--stack-sm > .aura-tbl__body, .aura-tbl--stack-sm > .aura-tbl__foot, .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { display: block; }
1813
1882
  .aura-tbl--stack-sm > .aura-tbl__head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
1814
- .aura-tbl--stack-sm > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) 0; }
1883
+ .aura-tbl--stack-sm > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) var(--aura-space-3); }
1815
1884
  .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { height: auto; padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); }
1816
1885
  .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row + .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row:first-child { border-top: 1px solid var(--aura-border-default); }
1817
1886
  .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
@@ -1845,7 +1914,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1845
1914
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
1846
1915
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1847
1916
  }
1848
- .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1917
+ .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-table-head-bg); }
1849
1918
  .aura-tbl--cards.aura-tbl--stack-md > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1850
1919
  .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1851
1920
  }
@@ -1858,7 +1927,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1858
1927
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
1859
1928
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1860
1929
  }
1861
- .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1930
+ .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-table-head-bg); }
1862
1931
  .aura-tbl--cards.aura-tbl--stack-sm > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1863
1932
  .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1864
1933
  }
@@ -1968,7 +2037,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1968
2037
  .aura-table__row--skeleton .aura-table__td > .aura-skel:not(.aura-skel--pill):not(.aura-skel--action) { margin: 5px 0; }
1969
2038
  .aura-table__row--skeleton .aura-table__td[data-label] .aura-skel:not(.aura-skel--pill):not(.aura-skel--action) { margin: 2.5px 0; margin: calc((1lh - 10px) / 2) 0; }
1970
2039
  .aura-table__row--skeleton .aura-table__td > .aura-skel-lines { align-items: flex-start; }
1971
- .aura-table__total { background: var(--aura-bg-canvas); }
2040
+ .aura-table__total { background: var(--aura-table-head-bg); }
1972
2041
  .aura-table__total > .is-blank { display: none; }
1973
2042
  .aura-table__foot { border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); margin-top: var(--aura-space-2); background: var(--aura-bg-surface); }
1974
2043
  .aura-table__empty { background: var(--aura-bg-surface); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); }
@@ -1998,3 +2067,25 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1998
2067
  .aura-tabs--segmented .aura-tab.aura-segmented__option.is-selected { outline: none; border: 2px solid Highlight; }
1999
2068
  .aura-tabs--segmented .aura-tab.aura-segmented__option:focus-visible { outline: 2px dashed CanvasText; outline-offset: -5px; }
2000
2069
  }
2070
+
2071
+ /* 5.30: Thai needs more room than Latin — tone marks and vowels stack above and below the line. Where the page or a
2072
+ * part of it is Thai (lang="th"), small labels are at least 12px and lines are taller. */
2073
+ .aura-pill:lang(th), .aura-badge:lang(th), .aura-tab__count:lang(th) { font-size: 12px; }
2074
+ .aura-pill:lang(th) { line-height: 18px; }
2075
+ .aura-skel--pill:lang(th) { height: 22px; } /* the loading pill stays as tall as the Thai one */
2076
+ .aura-bottomnav__item:lang(th) { font-size: 12px; line-height: 18px; }
2077
+ .aura-stepper__desc:lang(th) { font-size: 13px; line-height: 1.6; }
2078
+ .aura-nav__label:lang(th) { line-height: 22px; }
2079
+ /* 5.30 (audit D): field labels, hints and errors and choice descriptions get Thai line room; a stacked card's field
2080
+ * labels are 12px in the sans face (the mono face has no Thai), and a stacked DataTable card's values sit on a set
2081
+ * 1.6 line, so a loading card (its bars follow 1lh) is as tall as one with Thai text. */
2082
+ .aura-field__label:lang(th), .aura-field__hint:lang(th), .aura-field__error:lang(th), .aura-field__addon:lang(th) { line-height: 1.6; }
2083
+ .aura-choice__desc:lang(th), .aura-check__desc:lang(th) { font-size: 13px; line-height: 1.6; }
2084
+ .aura-tbl__row > .aura-tbl__td[data-label]:lang(th)::before, .aura-table__td[data-label]:lang(th)::before { font-family: var(--font-sans); font-size: 12px; line-height: 18px; }
2085
+ .aura-table--stacked .aura-table__td[data-label]:lang(th) { line-height: 1.6; }
2086
+
2087
+ /* 5.30: a plain link (no class) inside AURA's surfaces takes the accent colour instead of the browser's blue. Zero
2088
+ * specificity, so any rule of yours for links wins. */
2089
+ :where(.aura-card, .aura-stat, .aura-alert, .aura-empty, .aura-field, .aura-tabs__panel, .aura-shell__main, .aura-tbl, .aura-table, .aura-dialog) :where(a:not([class])) {
2090
+ color: var(--aura-fg-accent); text-underline-offset: 2px;
2091
+ }