@jirawatpyk/aura-react 5.29.0 → 5.30.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.
@@ -14,7 +14,7 @@
14
14
  border: 0;
15
15
  background: transparent;
16
16
  color: inherit;
17
- font-family: inherit;
17
+ font-family: var(--font-sans); /* 5.30: not inherit — a trigger outside a styled root fell back to Arial */
18
18
  font-size: 13px;
19
19
  font-weight: 500;
20
20
  line-height: 1;
@@ -46,6 +46,19 @@ button.aura-btn--secondary[aria-disabled='true']:hover, button.aura-btn--ghost[a
46
46
  button.aura-btn--danger-secondary[aria-disabled='true']:hover { background: transparent; }
47
47
  button.aura-btn--danger[aria-disabled='true']:hover { background: var(--aura-button-danger-bg); }
48
48
  button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-shadow-creative); transform: none; }
49
+ /* 5.30: a disabled filled button (primary, danger, creative) is a quiet grey fill with muted text, not a faded copy of
50
+ * itself — faded ink read as a separate grey button, faded red as pink. Outline and ghost buttons keep the fade. */
51
+ .aura-btn:is(.aura-btn--primary, .aura-btn--danger, .aura-btn--creative):is(:disabled, [aria-disabled='true']:not(.is-loading)),
52
+ .aura-btn:is(.aura-btn--primary, .aura-btn--danger, .aura-btn--creative):is(:disabled, [aria-disabled='true']:not(.is-loading)):hover {
53
+ opacity: 1; background: var(--aura-button-disabled-bg); color: var(--aura-button-disabled-fg); border-color: transparent; box-shadow: none;
54
+ }
55
+ /* Forced colours drop the fills: filled buttons get a 1px edge (as outline buttons have), and a disabled or gated one
56
+ * (still focusable) shows GrayText and keeps the fade, without changing size. */
57
+ @media (forced-colors: active) {
58
+ .aura-btn:is(.aura-btn--primary, .aura-btn--danger) { border: 1px solid ButtonText; }
59
+ .aura-btn.aura-btn:is(:disabled, [aria-disabled='true']:not(.is-loading)),
60
+ .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); }
61
+ }
49
62
  .aura-btn.is-loading:active { transform: none; }
50
63
 
51
64
  /* Focus — ADDED: the source defines none. Solid 2px ring, 2px offset, on every interactive element. */
@@ -95,10 +108,17 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
95
108
  color: var(--aura-fg-primary);
96
109
  }
97
110
  .aura-table__scroll { position: relative; overflow: auto; overscroll-behavior: contain; height: var(--aura-table-h, auto); }
111
+ /* 5.30: more columns past the end edge — a soft shadow over the grid's end edge (not over its scrollbars, its footer
112
+ * or the column button), so it reads as scrolling sideways. JavaScript places it (top, height, scrollbar inset). */
113
+ .aura-table__edge {
114
+ 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);
115
+ width: 16px; pointer-events: none; background: linear-gradient(to left, var(--aura-scroll-shadow), transparent);
116
+ }
117
+ .aura-table__edge:dir(rtl) { background: linear-gradient(to right, var(--aura-scroll-shadow), transparent); }
98
118
  .aura-table__head {
99
119
  position: sticky; top: 0; z-index: 3; box-sizing: border-box; /* the hairline is inside the row height */
100
120
  display: flex; height: var(--aura-table-row-height); min-width: var(--aura-row-min, 0);
101
- background: var(--aura-bg-canvas);
121
+ background: var(--aura-table-head-bg);
102
122
  border-bottom: 1px solid var(--aura-border-default);
103
123
  font-family: var(--font-mono); font-size: 12px; color: var(--aura-fg-secondary);
104
124
  }
@@ -171,7 +191,7 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
171
191
  .aura-table__gutter--end { position: static; }
172
192
  .aura-table__picker {
173
193
  position: absolute; top: 0; right: 0; z-index: 5; width: var(--aura-space-12); height: calc(var(--aura-table-row-height) - 1px);
174
- display: flex; align-items: center; justify-content: center; background: var(--aura-bg-canvas); border-top-right-radius: calc(var(--aura-card-radius) - 1px);
194
+ display: flex; align-items: center; justify-content: center; background: var(--aura-table-head-bg); border-top-right-radius: calc(var(--aura-card-radius) - 1px);
175
195
  }
176
196
  .aura-table__gutter--end.has-picker {
177
197
  width: var(--aura-space-12); position: sticky; left: auto; right: 0;
@@ -272,7 +292,7 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
272
292
  display: inline-flex; align-items: center; justify-content: center;
273
293
  border: 1.5px solid var(--aura-border-control); border-radius: var(--aura-radius-xs);
274
294
  }
275
- .aura-menu__check.is-on { background: var(--aura-button-primary-bg); border-color: var(--aura-button-primary-bg); color: var(--aura-button-primary-fg); }
295
+ .aura-menu__check.is-on { background: var(--aura-control-checked-bg); border-color: var(--aura-control-checked-bg); color: var(--aura-control-checked-fg); }
276
296
  .aura-menu__check.is-on .aura-icon { color: inherit; }
277
297
  .aura-menu__item--danger, .aura-menu__item--danger .aura-icon { color: var(--aura-fg-danger); }
278
298
  .aura-menu__item--danger:hover, .aura-menu__item--danger:focus { background: var(--aura-alert-danger-bg); color: var(--aura-alert-danger-fg); }
@@ -282,8 +302,8 @@ a.aura-menu__item { text-decoration: none; box-sizing: border-box; }
282
302
  flex: none; box-sizing: border-box; width: 16px; height: 16px; border-radius: var(--aura-radius-full);
283
303
  border: 1px solid var(--aura-border-control); display: inline-flex; align-items: center; justify-content: center;
284
304
  }
285
- .aura-menu__radio.is-on { border-color: var(--aura-button-primary-bg); }
286
- .aura-menu__radio.is-on::after { content: ''; width: 8px; height: 8px; border-radius: var(--aura-radius-full); background: var(--aura-button-primary-bg); }
305
+ .aura-menu__radio.is-on { border-color: var(--aura-control-checked-bg); }
306
+ .aura-menu__radio.is-on::after { content: ''; width: 8px; height: 8px; border-radius: var(--aura-radius-full); background: var(--aura-control-checked-bg); }
287
307
  /* 5.7: a header above the items (who is signed in), set off by a hairline like a separator. */
288
308
  .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; }
289
309
  .aura-menu__header > * { margin: 0; }
@@ -343,7 +363,7 @@ a.aura-icon-btn { text-decoration: none; }
343
363
  /* 5.29 (Chamber-OS 134): a DataTable skeleton row stands in for the real one — text lines (skeletonLines) on the 20px
344
364
  * line, and a button-height bar where row actions go: 32px, or 44px under the touchHeight rule with the column's
345
365
  * skeletonTouch; full width in a card footer. */
346
- .aura-skel--action { flex: none; width: var(--aura-button-height-sm); height: var(--aura-button-height-sm); border-radius: var(--aura-radius-md); }
366
+ .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 */
347
367
  .aura-skel--action.is-footer { width: 100%; }
348
368
  .aura-table__td.is-end > .aura-skel-lines { align-items: flex-end; }
349
369
  @media (max-width: 639.98px), (pointer: coarse) {
@@ -375,12 +395,12 @@ a.aura-icon-btn { text-decoration: none; }
375
395
  box-sizing: border-box; width: 100%; height: 100%;
376
396
  display: inline-flex; align-items: center; justify-content: center;
377
397
  border: 1.5px solid var(--aura-border-control); border-radius: var(--aura-radius-xs);
378
- background: var(--aura-bg-surface); color: var(--aura-button-primary-fg);
398
+ background: var(--aura-bg-surface); color: var(--aura-control-checked-fg);
379
399
  transition: background var(--aura-duration-fast) var(--aura-ease), border-color var(--aura-duration-fast) var(--aura-ease);
380
400
  pointer-events: none;
381
401
  }
382
402
  .aura-check__input:checked + .aura-check__box,
383
- .aura-check__input:indeterminate + .aura-check__box { background: var(--aura-button-primary-bg); border-color: var(--aura-button-primary-bg); }
403
+ .aura-check__input:indeterminate + .aura-check__box { background: var(--aura-control-checked-bg); border-color: var(--aura-control-checked-bg); }
384
404
  .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); }
385
405
  .aura-table__mono { font-family: var(--font-mono); }
386
406
 
@@ -393,6 +413,7 @@ a.aura-icon-btn { text-decoration: none; }
393
413
  border-radius: var(--aura-radius-full);
394
414
  padding: 2px var(--aura-space-2) 2px 6px;
395
415
  font-size: 11px;
416
+ font-weight: 500; /* 5.30 (Chamber-OS 137): medium everywhere, not the parent's weight; Badge stays 600 */
396
417
  line-height: 16px;
397
418
  white-space: nowrap;
398
419
  background: var(--aura-status-neutral-bg);
@@ -523,30 +544,31 @@ a.aura-icon-btn { text-decoration: none; }
523
544
  border: 1.5px solid var(--aura-border-control); background: var(--aura-bg-input); cursor: inherit;
524
545
  transition: border-width var(--aura-duration-fast) var(--aura-ease);
525
546
  }
526
- .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); }
527
548
  .aura-radio:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
528
549
  .aura-radio-group.is-invalid .aura-radio:not(:checked) { border-color: var(--aura-border-danger); }
529
550
 
530
551
  .aura-switch-row { display: flex; align-items: flex-start; gap: var(--aura-space-3); font-family: var(--font-sans); }
531
552
  /* 5.10.1: disabled rows, on or off, are treated alike and stay readable — the label turns secondary, the description
532
- * 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),
533
554
  * ≥3:1 apart in both themes, so "locked on" never looks like "off". */
534
555
  .aura-switch-row.is-disabled { cursor: not-allowed; }
535
556
  .aura-switch-row.is-disabled .aura-choice__label { color: var(--aura-fg-secondary); cursor: not-allowed; }
536
557
  .aura-switch:disabled { opacity: var(--aura-disabled-opacity); }
537
- .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 */
538
560
  .aura-switch {
539
561
  position: relative; flex: none; box-sizing: border-box; margin: 0; padding: 0;
540
562
  width: var(--aura-switch-width); height: var(--aura-switch-height); border-radius: var(--aura-radius-full);
541
563
  border: 0; background: var(--aura-border-control); cursor: pointer;
542
564
  transition: background var(--aura-duration-fast) var(--aura-ease);
543
565
  }
544
- .aura-switch.is-on { background: var(--aura-button-primary-bg); }
566
+ .aura-switch.is-on { background: var(--aura-control-checked-bg); }
545
567
  .aura-switch__thumb {
546
568
  position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: var(--aura-radius-full);
547
569
  background: var(--aura-bg-surface); transition: transform var(--aura-duration-fast) var(--aura-ease);
548
570
  }
549
- .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); }
550
572
  .aura-switch:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
551
573
  .aura-switch:disabled { cursor: not-allowed; }
552
574
  /* 5.19 (Chamber-OS 113): a read-only switch keeps its colours (a locked "on" reads as on at full contrast) and stays
@@ -719,7 +741,7 @@ a.aura-icon-btn { text-decoration: none; }
719
741
  transition: color var(--aura-duration-fast) var(--aura-ease), border-color var(--aura-duration-fast) var(--aura-ease);
720
742
  }
721
743
  .aura-tab:hover { color: var(--aura-fg-primary); }
722
- .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); }
723
745
  .aura-tab:disabled, .aura-tab.is-disabled { opacity: var(--aura-disabled-opacity); cursor: not-allowed; }
724
746
  a.aura-tab { text-decoration: none; }
725
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); }
@@ -926,7 +948,7 @@ a.aura-tab { text-decoration: none; }
926
948
  .aura-cal__day:hover { background: var(--aura-bg-surface-hover); }
927
949
  .aura-cal__day.is-outside { color: var(--aura-fg-tertiary); }
928
950
  .aura-cal__day.is-today { box-shadow: inset 0 0 0 1px var(--aura-border-control); font-weight: 600; }
929
- .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; }
930
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; }
931
953
  .aura-cal__day:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; }
932
954
  .aura-cal__grid td.is-in-range { background: var(--aura-bg-selected); }
@@ -939,7 +961,7 @@ a.aura-tab { text-decoration: none; }
939
961
  font: inherit; font-size: 13px; font-variant-numeric: tabular-nums; cursor: pointer;
940
962
  }
941
963
  .aura-cal__year:hover { background: var(--aura-bg-surface-hover); }
942
- .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); }
943
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); }
944
966
  .aura-cal__link {
945
967
  height: var(--aura-control-sm); padding: 0 var(--aura-space-2); border: 0; border-radius: var(--aura-radius-sm);
@@ -1053,8 +1075,10 @@ a.aura-tab { text-decoration: none; }
1053
1075
  .aura-shell__content:not(.is-flush) > .aura-container { padding-left: 0; padding-right: 0; }
1054
1076
 
1055
1077
  /* Totals row (4.19): under the body, a strong top edge; sticky at the bottom of a `height` table with stickyFooter. */
1056
- .aura-table__total { background: var(--aura-bg-canvas); border-top: 1px solid var(--aura-border-strong); font-weight: 600; }
1057
- .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); }
1058
1082
  .aura-table__total .aura-table__td.is-end { font-variant-numeric: tabular-nums; }
1059
1083
  .aura-tooltip--above { transform: translateY(-100%); max-width: min(var(--aura-tooltip-max), 90vw); white-space: normal; }
1060
1084
 
@@ -1147,7 +1171,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1147
1171
  .aura-badge {
1148
1172
  display: inline-flex; align-items: center; gap: 4px; height: 20px; padding: 0 var(--aura-space-2); box-sizing: border-box;
1149
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;
1150
- 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 */
1151
1175
  }
1152
1176
  .aura-badge--accent { background: var(--aura-alert-info-bg); color: var(--aura-alert-info-fg); }
1153
1177
  .aura-badge--success { background: var(--aura-alert-success-bg); color: var(--aura-alert-success-fg); }
@@ -1210,7 +1234,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1210
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); }
1211
1235
  .aura-empty.is-sm { padding: var(--aura-space-6) var(--aura-space-4); }
1212
1236
  .aura-empty.is-bordered { border: 1px dashed var(--aura-border-control); border-radius: var(--aura-radius-lg); }
1213
- .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); }
1214
1238
  .aura-empty.is-sm .aura-empty__icon { width: 36px; height: 36px; }
1215
1239
  .aura-empty__title { margin: 0; font-size: 16px; line-height: 1.5; font-weight: 600; }
1216
1240
  .aura-empty__text { margin: 0; max-width: 44ch; font-size: 14px; line-height: 1.6; color: var(--aura-fg-secondary); }
@@ -1228,7 +1252,7 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1228
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;
1229
1253
  }
1230
1254
  .aura-page:hover { background: var(--aura-bg-surface-hover); }
1231
- .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; }
1232
1256
  .aura-page:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
1233
1257
  .aura-pagination__gap { min-width: 24px; text-align: center; color: var(--aura-fg-secondary); }
1234
1258
  .aura-pagination__compact { display: none; padding: 0 var(--aura-space-2); color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; }
@@ -1322,7 +1346,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1322
1346
  color: var(--aura-fg-secondary); font-size: 13px; font-weight: 600; font-variant-numeric: tabular-nums;
1323
1347
  }
1324
1348
  .aura-stepper__marker .aura-icon { width: 16px; height: 16px; }
1325
- .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); }
1326
1350
  .aura-stepper__item.is-current .aura-stepper__marker { border: 2px solid var(--aura-fg-accent); color: var(--aura-fg-accent); }
1327
1351
  .aura-stepper__text { display: flex; flex-direction: column; min-width: 0; padding-top: 4px; }
1328
1352
  .aura-stepper__label { font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--aura-fg-secondary); }
@@ -1335,12 +1359,12 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1335
1359
  }
1336
1360
  .aura-stepper--horizontal .aura-stepper__step { flex-direction: column; gap: var(--aura-space-2); }
1337
1361
  .aura-stepper--horizontal .aura-stepper__text { padding-top: 0; }
1338
- .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); }
1339
1363
  .aura-stepper--vertical .aura-stepper__item { flex: none; padding-bottom: var(--aura-space-5); }
1340
1364
  .aura-stepper--vertical .aura-stepper__item:not(:last-child)::after {
1341
1365
  content: ""; position: absolute; left: 14px; top: 32px; bottom: 4px; width: 1px; background: var(--aura-border-control);
1342
1366
  }
1343
- .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); }
1344
1368
  .aura-stepper__compact { display: none; margin: var(--aura-space-2) 0 0; font-size: 13px; }
1345
1369
  .aura-stepper__count { color: var(--aura-fg-secondary); margin-right: var(--aura-space-2); }
1346
1370
  .aura-stepper__compact-label { font-weight: 600; }
@@ -1359,15 +1383,16 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1359
1383
  .aura-segmented.is-full { display: flex; width: 100%; }
1360
1384
  .aura-segmented__option {
1361
1385
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
1362
- 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;
1363
1388
  border: 0; border-radius: var(--aura-radius-full); background: transparent; color: var(--aura-fg-secondary);
1364
1389
  font: inherit; font-size: 13px; font-weight: 500; white-space: nowrap; cursor: pointer;
1365
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);
1366
1391
  }
1367
1392
  .aura-segmented.is-full .aura-segmented__option { flex: 1 1 0; min-width: 0; }
1368
- .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 */
1369
1394
  .aura-segmented__option:hover:not(:disabled):not(.is-selected) { color: var(--aura-fg-primary); }
1370
- .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 */
1371
1396
  .aura-segmented__option:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; }
1372
1397
  .aura-segmented__option:disabled { opacity: var(--aura-disabled-opacity); cursor: default; }
1373
1398
  .aura-segmented--sm .aura-segmented__option { height: 24px; padding: 0 var(--aura-space-3); font-size: 12px; }
@@ -1465,11 +1490,33 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1465
1490
  .aura-check--labelled .aura-check__input { top: calc((var(--aura-touch-target) - 20px) / 2 + 3px); }
1466
1491
  .aura-switch-row:not(.is-disabled):not(.is-readonly) { cursor: pointer; }
1467
1492
  .aura-radio-group__list { gap: 0; }
1468
- .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; }
1469
1513
  }
1470
1514
 
1471
1515
  /* PasswordField: the show/hide IconButton sits in the suffix slot, 6px from the edge */
1472
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); }
1473
1520
 
1474
1521
  /* FormErrorSummary: a danger alert whose items link to their fields */
1475
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); }
@@ -1562,6 +1609,12 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1562
1609
  .aura-filterselect__name { flex: none; white-space: nowrap; color: var(--aura-fg-secondary); }
1563
1610
  .aura-filterselect__value { min-width: 0; font-weight: 500; overflow-wrap: anywhere; }
1564
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
+ }
1565
1618
  .aura-filterselect.is-open .aura-filterselect__chevron { transform: rotate(180deg); }
1566
1619
  .aura-filterselect__face:focus-visible, .aura-filterselect:has(.aura-filterselect__native:focus-visible) .aura-filterselect__face {
1567
1620
  outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; border-color: var(--aura-border-strong);
@@ -1731,21 +1784,35 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1731
1784
  /* DataTable's grid look — mono header band, hairlines, 20px outer radius — on plain <table> markup, with wrapping text. */
1732
1785
  .aura-tbl-wrap {
1733
1786
  overflow-x: auto; border: 1px solid var(--aura-border-default); border-radius: var(--aura-card-radius);
1734
- 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));
1735
1797
  }
1736
1798
  .aura-tbl { width: 100%; border-collapse: collapse; border-spacing: 0; font-size: 13px; line-height: 20px; }
1737
- .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. */
1738
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; } }
1739
1804
  .aura-tbl__th:first-child, .aura-tbl__td:first-child { padding-left: var(--aura-space-6); }
1740
1805
  .aura-tbl__th:last-child, .aura-tbl__td:last-child { padding-right: var(--aura-space-6); }
1741
1806
  .aura-tbl__head .aura-tbl__th {
1742
- 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);
1743
1808
  font-family: var(--font-mono); font-size: 12px; font-weight: 400; color: var(--aura-fg-secondary); white-space: nowrap;
1744
1809
  }
1745
1810
  .aura-tbl__body .aura-tbl__row + .aura-tbl__row > * { border-top: 1px solid var(--aura-border-default); }
1746
1811
  .aura-tbl__body .aura-tbl__th { font-weight: 500; }
1747
- .aura-tbl__foot > .aura-tbl__row > * { background: var(--aura-bg-canvas); font-weight: 600; }
1748
- .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; }
1749
1816
  .aura-tbl__foot > .aura-tbl__row + .aura-tbl__row > * { border-top: 1px solid var(--aura-border-default); }
1750
1817
  .aura-tbl .is-end { text-align: right; }
1751
1818
  .aura-tbl .is-center { text-align: center; }
@@ -1789,7 +1856,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1789
1856
  @container aura-tbl (width < 768px) {
1790
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; }
1791
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; }
1792
- .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); }
1793
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); }
1794
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); }
1795
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; }
@@ -1813,7 +1880,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1813
1880
  @container aura-tbl (width < 640px) {
1814
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; }
1815
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; }
1816
- .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); }
1817
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); }
1818
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); }
1819
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; }
@@ -1847,7 +1914,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1847
1914
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
1848
1915
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1849
1916
  }
1850
- .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); }
1851
1918
  .aura-tbl--cards.aura-tbl--stack-md > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1852
1919
  .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1853
1920
  }
@@ -1860,7 +1927,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1860
1927
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
1861
1928
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1862
1929
  }
1863
- .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); }
1864
1931
  .aura-tbl--cards.aura-tbl--stack-sm > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1865
1932
  .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1866
1933
  }
@@ -1970,7 +2037,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1970
2037
  .aura-table__row--skeleton .aura-table__td > .aura-skel:not(.aura-skel--pill):not(.aura-skel--action) { margin: 5px 0; }
1971
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; }
1972
2039
  .aura-table__row--skeleton .aura-table__td > .aura-skel-lines { align-items: flex-start; }
1973
- .aura-table__total { background: var(--aura-bg-canvas); }
2040
+ .aura-table__total { background: var(--aura-table-head-bg); }
1974
2041
  .aura-table__total > .is-blank { display: none; }
1975
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); }
1976
2043
  .aura-table__empty { background: var(--aura-bg-surface); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); }
@@ -2001,4 +2068,26 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
2001
2068
  .aura-tabs--segmented .aura-tab.aura-segmented__option:focus-visible { outline: 2px dashed CanvasText; outline-offset: -5px; }
2002
2069
  }
2003
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) { 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
+ }
2092
+
2004
2093
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.29.0",
3
+ "version": "5.30.0",
4
4
  "description": "AURA Design System — React components (Enterprise Standard, Human Creative). Thai-first: Buddhist-era dates, Thai collation.",
5
5
  "license": "MIT",
6
6
  "type": "module",