@jirawatpyk/aura-react 5.13.0 → 5.15.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
@@ -34,6 +34,16 @@ a.aura-btn { text-decoration: none; }
34
34
  padding-block: var(--aura-space-2); line-height: 1.35; text-align: center; overflow-wrap: anywhere;
35
35
  }
36
36
  .aura-btn.is-loading { cursor: progress; }
37
+ /* 5.14: a button gated with aria-disabled looks unavailable but stays focusable (no pointer-events: none, so the
38
+ * not-allowed cursor and a tooltip still work). */
39
+ button.aura-btn[aria-disabled='true']:not(.is-loading) { opacity: var(--aura-disabled-opacity); cursor: not-allowed; }
40
+ button.aura-btn[aria-disabled='true']:active { transform: none; }
41
+ /* …and hovering it changes nothing: each variant keeps its resting look (the hover rules below are overridden). */
42
+ button.aura-btn--primary[aria-disabled='true']:hover { background: var(--aura-button-primary-bg); }
43
+ button.aura-btn--secondary[aria-disabled='true']:hover, button.aura-btn--ghost[aria-disabled='true']:hover,
44
+ button.aura-btn--danger-secondary[aria-disabled='true']:hover { background: transparent; }
45
+ button.aura-btn--danger[aria-disabled='true']:hover { background: var(--aura-button-danger-bg); }
46
+ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-shadow-creative); transform: none; }
37
47
  .aura-btn.is-loading:active { transform: none; }
38
48
 
39
49
  /* Focus — ADDED: the source defines none. Solid 2px ring, 2px offset, on every interactive element. */
@@ -302,6 +312,12 @@ a.aura-icon-btn { text-decoration: none; }
302
312
  .aura-icon-btn--danger:hover { background: var(--aura-alert-danger-bg); }
303
313
  .aura-icon-btn:disabled { opacity: var(--aura-disabled-opacity); pointer-events: none; }
304
314
  .aura-icon-btn:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
315
+ /* 5.15 (Chamber-OS 100): touchHeight — visibly 44px on phones, for buttons and icon buttons a phone design wants full size. */
316
+ @media (max-width: 639.98px) {
317
+ .aura-btn.aura-btn--touch { height: var(--aura-touch-target); }
318
+ .aura-btn.aura-btn--touch.aura-btn--full { height: auto; min-height: var(--aura-touch-target); }
319
+ .aura-icon-btn.aura-icon-btn--touch { width: var(--aura-touch-target); height: var(--aura-touch-target); }
320
+ }
305
321
  /* Touch: same 32px look, a 44px hit area around it (WCAG 2.5.5). */
306
322
  @media (pointer: coarse) {
307
323
  .aura-icon-btn { position: relative; }
@@ -335,6 +351,9 @@ a.aura-icon-btn { text-decoration: none; }
335
351
  /* Checkbox — 16px, 4px corners, ink when checked */
336
352
  .aura-check { position: relative; display: inline-flex; width: var(--aura-icon-sm); height: var(--aura-icon-sm); flex: none; cursor: pointer; }
337
353
  .aura-check__input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: pointer; }
354
+ /* 5.15 (Chamber-OS 99): hitArea — the input reaches past the box. */
355
+ .aura-check.has-hit { isolation: isolate; } /* the larger input stays inside the checkbox's own stacking */
356
+ .aura-check.has-hit .aura-check__input { inset: calc(-1 * var(--aura-check-hit-y)) calc(-1 * var(--aura-check-hit-x)); z-index: 1; }
338
357
  .aura-check__box {
339
358
  box-sizing: border-box; width: 100%; height: 100%;
340
359
  display: inline-flex; align-items: center; justify-content: center;
@@ -622,6 +641,10 @@ a.aura-icon-btn { text-decoration: none; }
622
641
  }
623
642
  .aura-card.is-interactive { cursor: pointer; transition: border-color var(--aura-duration-fast) var(--aura-ease); }
624
643
  .aura-card.is-interactive:hover { border-color: var(--aura-border-control); }
644
+ /* 5.15 (Chamber-OS 93): frameless below a width — the rows inside become cards of their own. */
645
+ @media (max-width: 639.98px) { .aura-card.aura-card--flush-below-sm, .aura-card.aura-card--flush-below-sm:hover { border-color: transparent; background: transparent; box-shadow: none; } }
646
+ @media (max-width: 767.98px) { .aura-card.aura-card--flush-below-md, .aura-card.aura-card--flush-below-md:hover { border-color: transparent; background: transparent; box-shadow: none; } }
647
+ @media (max-width: 1023.98px) { .aura-card.aura-card--flush-below-lg, .aura-card.aura-card--flush-below-lg:hover { border-color: transparent; background: transparent; box-shadow: none; } }
625
648
  .aura-card--creative { border: 2px solid var(--aura-border-strong); box-shadow: var(--aura-card-shadow-creative); }
626
649
  .aura-card__head { display: flex; align-items: flex-start; gap: var(--aura-space-3); }
627
650
  .aura-card__heading { flex: 1; min-width: 0; }
@@ -739,6 +762,21 @@ a.aura-tab { text-decoration: none; }
739
762
  /* 5.7: a segment with no page of its own — the links' colour, not interactive. */
740
763
  .aura-crumbs__text { color: var(--aura-fg-secondary); }
741
764
  .aura-crumbs__sep { color: var(--aura-fg-tertiary); }
765
+ /* 5.15 (Chamber-OS 94): first, "…", last below a width. */
766
+ .aura-crumbs li.aura-crumbs__more { display: none; }
767
+ /* "…" is the only way to the hidden items: a 24px target, 44px on touch screens. */
768
+ .aura-crumbs__more > button { position: relative; min-width: 24px; min-height: 24px; display: inline-flex; align-items: center; justify-content: center; }
769
+ @media (pointer: coarse) {
770
+ .aura-crumbs__more > button::after { content: ''; position: absolute; top: 50%; left: 50%; width: var(--aura-touch-target); height: var(--aura-touch-target); transform: translate(-50%, -50%); }
771
+ }
772
+ @media (max-width: 639.98px) {
773
+ .aura-crumbs--collapse-sm li.aura-crumbs__more { display: inline-flex; }
774
+ .aura-crumbs--collapse-sm .aura-crumbs__middle { display: none; }
775
+ }
776
+ @media (max-width: 767.98px) {
777
+ .aura-crumbs--collapse-md li.aura-crumbs__more { display: inline-flex; }
778
+ .aura-crumbs--collapse-md .aura-crumbs__middle { display: none; }
779
+ }
742
780
 
743
781
  /* ---------- Avatar ---------- */
744
782
  .aura-avatar {
@@ -868,7 +906,11 @@ a.aura-tab { text-decoration: none; }
868
906
  .aura-drawer--nav .aura-drawer__head { position: absolute; top: var(--aura-space-2); right: var(--aura-space-2); padding: 0; z-index: 1; }
869
907
  .aura-drawer__title { flex: 1; margin: 0; font-size: 16px; line-height: 1.5; font-weight: 600; }
870
908
  .aura-drawer__desc { margin: 0; padding: 0 var(--aura-space-6); font-size: 14px; line-height: 1.7; color: var(--aura-fg-secondary); }
871
- .aura-drawer__body { flex: 1; overflow-y: auto; padding: var(--aura-space-4) var(--aura-space-6); font-size: 14px; line-height: 1.7; }
909
+ .aura-drawer__body {
910
+ flex: 1; overflow-y: auto; padding: var(--aura-space-4) var(--aura-space-6); font-size: 14px; line-height: 1.7;
911
+ /* 5.14 (Chamber-OS 91): a field scrolled into view (focus, the phone keyboard) keeps clear of the head and foot. */
912
+ scroll-padding-block: var(--aura-space-4);
913
+ }
872
914
  .aura-drawer--nav .aura-drawer__body { padding: 0; }
873
915
  .aura-drawer--nav .aura-nav { width: 100%; border-right: 0; }
874
916
  .aura-drawer__foot { display: flex; justify-content: flex-end; flex-wrap: wrap; gap: var(--aura-space-3); padding: var(--aura-space-4) var(--aura-space-6); border-top: 1px solid var(--aura-border-default); }
@@ -913,12 +955,18 @@ a.aura-tab { text-decoration: none; }
913
955
  .aura-grid-layout.is-auto { grid-template-columns: unset; }
914
956
 
915
957
  /* ---------- AppShell ---------- */
916
- .aura-shell { display: flex; min-height: 100vh; min-height: 100dvh; background: var(--aura-bg-canvas); color: var(--aura-fg-primary); font-family: var(--font-sans); }
958
+ .aura-shell {
959
+ display: flex; min-height: 100vh; min-height: 100dvh; background: var(--aura-bg-canvas); color: var(--aura-fg-primary); font-family: var(--font-sans);
960
+ --aura-shell-bar-height: 56px; /* 5.14 (Chamber-OS 104): the top bar's height, for sticky offsets under it */
961
+ }
962
+ .aura-shell--no-bar { --aura-shell-bar-height: 0px; }
963
+ @media (min-width: 1024px) { .aura-shell--menu-bar { --aura-shell-bar-height: 0px; } }
917
964
  .aura-shell__nav { position: sticky; top: 0; height: 100vh; height: 100dvh; flex: none; }
918
965
  .aura-shell__main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
919
966
  .aura-shell__bar {
920
967
  position: sticky; top: 0; z-index: 10; display: flex; align-items: center; gap: var(--aura-space-2);
921
- min-height: 56px; padding: 0 var(--aura-space-6); background: var(--aura-bg-surface); border-bottom: 1px solid var(--aura-border-default);
968
+ box-sizing: border-box; min-height: 56px;
969
+ padding: 0 var(--aura-space-6); background: var(--aura-bg-surface); border-bottom: 1px solid var(--aura-border-default);
922
970
  }
923
971
  /* Responsive in CSS (4.16), so the server's HTML is already right on a phone: below lg the sidebar is hidden and the
924
972
  * menu button shows; from lg up the reverse. JavaScript only opens and closes the drawer. */
@@ -935,10 +983,11 @@ a.aura-tab { text-decoration: none; }
935
983
  .aura-shell__content { flex: 1; min-width: 0; padding: var(--aura-space-6) var(--aura-space-4); }
936
984
  /* 5.7: <main> takes focus (tabIndex -1) for skip links and "the row you acted on is gone"; a landmark gets no ring. */
937
985
  .aura-shell__content:focus { outline: none; }
986
+ .aura-shell__content.is-flush { padding: 0; } /* 5.14 (Chamber-OS 97): contentPadding={false} */
938
987
  @media (min-width: 640px) { .aura-shell__content { padding: var(--aura-space-6); } }
939
988
  @media (min-width: 1024px) { .aura-shell__content { padding: var(--aura-space-8); } }
940
989
  /* The shell already pads its content: a Container directly inside only caps the width. */
941
- .aura-shell__content > .aura-container { padding-left: 0; padding-right: 0; }
990
+ .aura-shell__content:not(.is-flush) > .aura-container { padding-left: 0; padding-right: 0; }
942
991
 
943
992
  /* Totals row (4.19): under the body, a strong top edge; sticky at the bottom of a `height` table with stickyFooter. */
944
993
  .aura-table__total { background: var(--aura-bg-canvas); border-top: 1px solid var(--aura-border-strong); font-weight: 600; }
@@ -958,7 +1007,7 @@ button.aura-stat { font: inherit; width: 100%; cursor: pointer; }
958
1007
  .aura-stat.is-interactive:hover { border-color: var(--aura-border-strong); }
959
1008
  .aura-stat.is-interactive:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
960
1009
  .aura-stat__head { display: flex; align-items: center; justify-content: space-between; gap: var(--aura-space-2); }
961
- .aura-stat__label { font-size: 13px; font-weight: 500; color: var(--aura-fg-secondary); }
1010
+ .aura-stat__label { margin: 0; font-size: 13px; font-weight: 500; color: var(--aura-fg-secondary); } /* 5.14: may be a heading */
962
1011
  .aura-stat__icon { display: inline-flex; color: var(--aura-fg-secondary); }
963
1012
  .aura-stat__value { display: flex; align-items: baseline; gap: var(--aura-space-1); font-size: 28px; line-height: 1.2; font-weight: 600; letter-spacing: -0.01em; min-height: 34px; }
964
1013
  .aura-stat__value.is-numeric { font-variant-numeric: tabular-nums; }
@@ -1062,6 +1111,12 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1062
1111
  .aura-progress--warning .aura-progress__bar { background: var(--aura-alert-warning-fg); }
1063
1112
  .aura-progress--danger .aura-progress__bar { background: var(--aura-fg-danger); }
1064
1113
  .aura-progress--neutral .aura-progress__bar { background: var(--aura-fg-secondary); }
1114
+ /* 5.15 (Chamber-OS 89): a reserved amount after the value — the same tone, striped, so it reads without colour. */
1115
+ .aura-progress__bar--reserved {
1116
+ transition: left var(--aura-duration-base) var(--aura-ease), width var(--aura-duration-base) var(--aura-ease);
1117
+ -webkit-mask-image: repeating-linear-gradient(135deg, currentColor 0 3px, transparent 3px 6px);
1118
+ mask-image: repeating-linear-gradient(135deg, currentColor 0 3px, transparent 3px 6px);
1119
+ }
1065
1120
  .aura-progress__track.is-indeterminate .aura-progress__bar { width: 35%; animation: aura-progress-slide var(--aura-duration-pulse) var(--aura-ease) infinite; }
1066
1121
  @keyframes aura-progress-slide { from { left: -35%; } to { left: 100%; } }
1067
1122
  @media (prefers-reduced-motion: reduce) { .aura-progress__track.is-indeterminate .aura-progress__bar { animation-duration: calc(var(--aura-duration-pulse) * 3); } }
@@ -1244,6 +1299,30 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1244
1299
  .aura-tabs--segmented .aura-tabs__list.aura-segmented { gap: 2px; }
1245
1300
  .aura-tabs--segmented .aura-tabs__list.aura-segmented.is-full .aura-tab { min-width: max-content; }
1246
1301
  .aura-tabs--segmented .aura-tab.aura-segmented__option { margin-bottom: 0; }
1302
+ /* 5.15 (Chamber-OS 90): underline tabs sharing the width, always or below a breakpoint; the segmented track below one. */
1303
+ .aura-tabs__list.is-fill { gap: 0; }
1304
+ .aura-tabs__list.is-fill > .aura-tab { flex: 1 1 0; min-width: max-content; justify-content: center; padding: 0 var(--aura-space-3); }
1305
+ @media (max-width: 639.98px) {
1306
+ .aura-tabs__list.is-fill-below-sm { gap: 0; }
1307
+ .aura-tabs__list.is-fill-below-sm > .aura-tab { flex: 1 1 0; min-width: max-content; justify-content: center; padding: 0 var(--aura-space-3); }
1308
+ .aura-segmented.is-full-below-sm { display: flex; width: 100%; }
1309
+ .aura-segmented.is-full-below-sm .aura-segmented__option { flex: 1 1 0; min-width: 0; }
1310
+ .aura-tabs--segmented .aura-segmented.is-full-below-sm .aura-tab { min-width: max-content; }
1311
+ }
1312
+ @media (max-width: 767.98px) {
1313
+ .aura-tabs__list.is-fill-below-md { gap: 0; }
1314
+ .aura-tabs__list.is-fill-below-md > .aura-tab { flex: 1 1 0; min-width: max-content; justify-content: center; padding: 0 var(--aura-space-3); }
1315
+ .aura-segmented.is-full-below-md { display: flex; width: 100%; }
1316
+ .aura-segmented.is-full-below-md .aura-segmented__option { flex: 1 1 0; min-width: 0; }
1317
+ .aura-tabs--segmented .aura-segmented.is-full-below-md .aura-tab { min-width: max-content; }
1318
+ }
1319
+ @media (max-width: 1023.98px) {
1320
+ .aura-tabs__list.is-fill-below-lg { gap: 0; }
1321
+ .aura-tabs__list.is-fill-below-lg > .aura-tab { flex: 1 1 0; min-width: max-content; justify-content: center; padding: 0 var(--aura-space-3); }
1322
+ .aura-segmented.is-full-below-lg { display: flex; width: 100%; }
1323
+ .aura-segmented.is-full-below-lg .aura-segmented__option { flex: 1 1 0; min-width: 0; }
1324
+ .aura-tabs--segmented .aura-segmented.is-full-below-lg .aura-tab { min-width: max-content; }
1325
+ }
1247
1326
  .aura-tabs--segmented .aura-tab.aura-segmented__option:focus-visible { border-radius: var(--aura-radius-full); outline-offset: calc(-1 * var(--aura-focus-ring-width)); }
1248
1327
  .aura-tabs--segmented .aura-tab.aura-segmented__option:disabled,
1249
1328
  .aura-tabs--segmented .aura-tab.aura-segmented__option.is-disabled { opacity: var(--aura-disabled-opacity); cursor: not-allowed; }
@@ -1370,6 +1449,16 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1370
1449
  /* 5.12 searchGrow: the search fills what the controls leave. */
1371
1450
  .aura-filterbar--grow .aura-filterbar__search { max-width: none; }
1372
1451
  .aura-filterbar--grow .aura-filterbar__search ~ .aura-filterbar__spacer { display: none; }
1452
+ /* 5.15 (Chamber-OS 92): the search on its own row up to 1024px; controls sharing their row in equal columns. */
1453
+ @media (max-width: 1023.98px) {
1454
+ .aura-filterbar--stack-lg .aura-filterbar__search { flex-basis: 100%; max-width: none; }
1455
+ .aura-filterbar--stack-lg .aura-filterbar__spacer { display: none; }
1456
+ }
1457
+ .aura-filterbar--fill .aura-filterbar__spacer { display: none; }
1458
+ .aura-filterbar--fill .aura-filterbar__controls { flex: 1 1 auto; min-width: 0; }
1459
+ .aura-filterbar--fill .aura-filterbar__controls > * { flex: 1 1 0; min-width: 120px; max-width: none; width: auto; }
1460
+ .aura-filterbar--fill .aura-filterbar__controls > .aura-filterselect .aura-filterselect__face { width: 100%; }
1461
+ .aura-filterbar--fill .aura-filterbar__controls > .aura-filterselect .aura-filterselect__chevron { margin-inline-start: auto; }
1373
1462
  /* Compact filters sit closer together than full fields. */
1374
1463
  .aura-filterbar__controls:has(> .aura-filterselect) { gap: var(--aura-space-2); }
1375
1464
 
@@ -1610,6 +1699,34 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1610
1699
  }
1611
1700
  }
1612
1701
 
1702
+ /* 5.15 (Chamber-OS 85): stackStyle="cards" — each stacked row its own card (DataTable's card spacing), no outer frame.
1703
+ * .aura-tbl-cards is the container here, so the wrap's own frame can be dropped while stacked. */
1704
+ .aura-tbl-cards { container: aura-tbl / inline-size; width: 100%; }
1705
+ @container aura-tbl (width < 768px) {
1706
+ .aura-tbl-cards--md > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1707
+ .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1708
+ .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row {
1709
+ margin-bottom: var(--aura-space-2); padding: var(--aura-space-4);
1710
+ border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1711
+ }
1712
+ .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1713
+ .aura-tbl--cards.aura-tbl--stack-md > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1714
+ .aura-tbl-wrap[data-density='compact'] > .aura-tbl--cards.aura-tbl--stack-md > * > .aura-tbl__row { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1715
+ .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1716
+ }
1717
+ @container aura-tbl (width < 640px) {
1718
+ .aura-tbl-cards--sm > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1719
+ .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1720
+ .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row {
1721
+ margin-bottom: var(--aura-space-2); padding: var(--aura-space-4);
1722
+ border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1723
+ }
1724
+ .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1725
+ .aura-tbl--cards.aura-tbl--stack-sm > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1726
+ .aura-tbl-wrap[data-density='compact'] > .aura-tbl--cards.aura-tbl--stack-sm > * > .aura-tbl__row { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1727
+ .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1728
+ }
1729
+
1613
1730
  /* ---------- 4.20: DataTable width queries and cards, one markup ---------- */
1614
1731
  /* Each .aura-table-q is the table's width × 10000 / its threshold (DataTable.tsx, Q), so `(width < 9999.5px)` is true
1615
1732
  * exactly when the table is narrower than stackBelow or a hideBelow width — before hydration, at any width. */
@@ -1660,6 +1777,9 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1660
1777
  .aura-table__td[data-card='hide'], .aura-table__head > .aura-table__th[data-card='hide'],
1661
1778
  .aura-table__row--skeleton .aura-table__td[data-card='hide'] { display: none; }
1662
1779
  .aura-table__td[data-card='field'] { order: var(--aura-card-order, 5); }
1780
+ /* 5.14 (Chamber-OS 108): in a card every field starts under its label; align: 'end' is for the grid (figures stay tabular). */
1781
+ .aura-table__td.is-end { text-align: start; }
1782
+ .aura-table__row--skeleton .aura-table__td.is-end { justify-content: flex-start; }
1663
1783
  /* hideSelectionInCards: no row boxes, no select-all line. */
1664
1784
  .aura-table--cards-nosel .aura-table__row > .aura-table__sel { display: none; }
1665
1785
  .aura-table--cards-nosel .aura-table__head { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); }
@@ -36,6 +36,16 @@ a.aura-btn { text-decoration: none; }
36
36
  padding-block: var(--aura-space-2); line-height: 1.35; text-align: center; overflow-wrap: anywhere;
37
37
  }
38
38
  .aura-btn.is-loading { cursor: progress; }
39
+ /* 5.14: a button gated with aria-disabled looks unavailable but stays focusable (no pointer-events: none, so the
40
+ * not-allowed cursor and a tooltip still work). */
41
+ button.aura-btn[aria-disabled='true']:not(.is-loading) { opacity: var(--aura-disabled-opacity); cursor: not-allowed; }
42
+ button.aura-btn[aria-disabled='true']:active { transform: none; }
43
+ /* …and hovering it changes nothing: each variant keeps its resting look (the hover rules below are overridden). */
44
+ button.aura-btn--primary[aria-disabled='true']:hover { background: var(--aura-button-primary-bg); }
45
+ button.aura-btn--secondary[aria-disabled='true']:hover, button.aura-btn--ghost[aria-disabled='true']:hover,
46
+ button.aura-btn--danger-secondary[aria-disabled='true']:hover { background: transparent; }
47
+ button.aura-btn--danger[aria-disabled='true']:hover { background: var(--aura-button-danger-bg); }
48
+ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-shadow-creative); transform: none; }
39
49
  .aura-btn.is-loading:active { transform: none; }
40
50
 
41
51
  /* Focus — ADDED: the source defines none. Solid 2px ring, 2px offset, on every interactive element. */
@@ -304,6 +314,12 @@ a.aura-icon-btn { text-decoration: none; }
304
314
  .aura-icon-btn--danger:hover { background: var(--aura-alert-danger-bg); }
305
315
  .aura-icon-btn:disabled { opacity: var(--aura-disabled-opacity); pointer-events: none; }
306
316
  .aura-icon-btn:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
317
+ /* 5.15 (Chamber-OS 100): touchHeight — visibly 44px on phones, for buttons and icon buttons a phone design wants full size. */
318
+ @media (max-width: 639.98px) {
319
+ .aura-btn.aura-btn--touch { height: var(--aura-touch-target); }
320
+ .aura-btn.aura-btn--touch.aura-btn--full { height: auto; min-height: var(--aura-touch-target); }
321
+ .aura-icon-btn.aura-icon-btn--touch { width: var(--aura-touch-target); height: var(--aura-touch-target); }
322
+ }
307
323
  /* Touch: same 32px look, a 44px hit area around it (WCAG 2.5.5). */
308
324
  @media (pointer: coarse) {
309
325
  .aura-icon-btn { position: relative; }
@@ -337,6 +353,9 @@ a.aura-icon-btn { text-decoration: none; }
337
353
  /* Checkbox — 16px, 4px corners, ink when checked */
338
354
  .aura-check { position: relative; display: inline-flex; width: var(--aura-icon-sm); height: var(--aura-icon-sm); flex: none; cursor: pointer; }
339
355
  .aura-check__input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: pointer; }
356
+ /* 5.15 (Chamber-OS 99): hitArea — the input reaches past the box. */
357
+ .aura-check.has-hit { isolation: isolate; } /* the larger input stays inside the checkbox's own stacking */
358
+ .aura-check.has-hit .aura-check__input { inset: calc(-1 * var(--aura-check-hit-y)) calc(-1 * var(--aura-check-hit-x)); z-index: 1; }
340
359
  .aura-check__box {
341
360
  box-sizing: border-box; width: 100%; height: 100%;
342
361
  display: inline-flex; align-items: center; justify-content: center;
@@ -624,6 +643,10 @@ a.aura-icon-btn { text-decoration: none; }
624
643
  }
625
644
  .aura-card.is-interactive { cursor: pointer; transition: border-color var(--aura-duration-fast) var(--aura-ease); }
626
645
  .aura-card.is-interactive:hover { border-color: var(--aura-border-control); }
646
+ /* 5.15 (Chamber-OS 93): frameless below a width — the rows inside become cards of their own. */
647
+ @media (max-width: 639.98px) { .aura-card.aura-card--flush-below-sm, .aura-card.aura-card--flush-below-sm:hover { border-color: transparent; background: transparent; box-shadow: none; } }
648
+ @media (max-width: 767.98px) { .aura-card.aura-card--flush-below-md, .aura-card.aura-card--flush-below-md:hover { border-color: transparent; background: transparent; box-shadow: none; } }
649
+ @media (max-width: 1023.98px) { .aura-card.aura-card--flush-below-lg, .aura-card.aura-card--flush-below-lg:hover { border-color: transparent; background: transparent; box-shadow: none; } }
627
650
  .aura-card--creative { border: 2px solid var(--aura-border-strong); box-shadow: var(--aura-card-shadow-creative); }
628
651
  .aura-card__head { display: flex; align-items: flex-start; gap: var(--aura-space-3); }
629
652
  .aura-card__heading { flex: 1; min-width: 0; }
@@ -741,6 +764,21 @@ a.aura-tab { text-decoration: none; }
741
764
  /* 5.7: a segment with no page of its own — the links' colour, not interactive. */
742
765
  .aura-crumbs__text { color: var(--aura-fg-secondary); }
743
766
  .aura-crumbs__sep { color: var(--aura-fg-tertiary); }
767
+ /* 5.15 (Chamber-OS 94): first, "…", last below a width. */
768
+ .aura-crumbs li.aura-crumbs__more { display: none; }
769
+ /* "…" is the only way to the hidden items: a 24px target, 44px on touch screens. */
770
+ .aura-crumbs__more > button { position: relative; min-width: 24px; min-height: 24px; display: inline-flex; align-items: center; justify-content: center; }
771
+ @media (pointer: coarse) {
772
+ .aura-crumbs__more > button::after { content: ''; position: absolute; top: 50%; left: 50%; width: var(--aura-touch-target); height: var(--aura-touch-target); transform: translate(-50%, -50%); }
773
+ }
774
+ @media (max-width: 639.98px) {
775
+ .aura-crumbs--collapse-sm li.aura-crumbs__more { display: inline-flex; }
776
+ .aura-crumbs--collapse-sm .aura-crumbs__middle { display: none; }
777
+ }
778
+ @media (max-width: 767.98px) {
779
+ .aura-crumbs--collapse-md li.aura-crumbs__more { display: inline-flex; }
780
+ .aura-crumbs--collapse-md .aura-crumbs__middle { display: none; }
781
+ }
744
782
 
745
783
  /* ---------- Avatar ---------- */
746
784
  .aura-avatar {
@@ -870,7 +908,11 @@ a.aura-tab { text-decoration: none; }
870
908
  .aura-drawer--nav .aura-drawer__head { position: absolute; top: var(--aura-space-2); right: var(--aura-space-2); padding: 0; z-index: 1; }
871
909
  .aura-drawer__title { flex: 1; margin: 0; font-size: 16px; line-height: 1.5; font-weight: 600; }
872
910
  .aura-drawer__desc { margin: 0; padding: 0 var(--aura-space-6); font-size: 14px; line-height: 1.7; color: var(--aura-fg-secondary); }
873
- .aura-drawer__body { flex: 1; overflow-y: auto; padding: var(--aura-space-4) var(--aura-space-6); font-size: 14px; line-height: 1.7; }
911
+ .aura-drawer__body {
912
+ flex: 1; overflow-y: auto; padding: var(--aura-space-4) var(--aura-space-6); font-size: 14px; line-height: 1.7;
913
+ /* 5.14 (Chamber-OS 91): a field scrolled into view (focus, the phone keyboard) keeps clear of the head and foot. */
914
+ scroll-padding-block: var(--aura-space-4);
915
+ }
874
916
  .aura-drawer--nav .aura-drawer__body { padding: 0; }
875
917
  .aura-drawer--nav .aura-nav { width: 100%; border-right: 0; }
876
918
  .aura-drawer__foot { display: flex; justify-content: flex-end; flex-wrap: wrap; gap: var(--aura-space-3); padding: var(--aura-space-4) var(--aura-space-6); border-top: 1px solid var(--aura-border-default); }
@@ -915,12 +957,18 @@ a.aura-tab { text-decoration: none; }
915
957
  .aura-grid-layout.is-auto { grid-template-columns: unset; }
916
958
 
917
959
  /* ---------- AppShell ---------- */
918
- .aura-shell { display: flex; min-height: 100vh; min-height: 100dvh; background: var(--aura-bg-canvas); color: var(--aura-fg-primary); font-family: var(--font-sans); }
960
+ .aura-shell {
961
+ display: flex; min-height: 100vh; min-height: 100dvh; background: var(--aura-bg-canvas); color: var(--aura-fg-primary); font-family: var(--font-sans);
962
+ --aura-shell-bar-height: 56px; /* 5.14 (Chamber-OS 104): the top bar's height, for sticky offsets under it */
963
+ }
964
+ .aura-shell--no-bar { --aura-shell-bar-height: 0px; }
965
+ @media (min-width: 1024px) { .aura-shell--menu-bar { --aura-shell-bar-height: 0px; } }
919
966
  .aura-shell__nav { position: sticky; top: 0; height: 100vh; height: 100dvh; flex: none; }
920
967
  .aura-shell__main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
921
968
  .aura-shell__bar {
922
969
  position: sticky; top: 0; z-index: 10; display: flex; align-items: center; gap: var(--aura-space-2);
923
- min-height: 56px; padding: 0 var(--aura-space-6); background: var(--aura-bg-surface); border-bottom: 1px solid var(--aura-border-default);
970
+ box-sizing: border-box; min-height: 56px;
971
+ padding: 0 var(--aura-space-6); background: var(--aura-bg-surface); border-bottom: 1px solid var(--aura-border-default);
924
972
  }
925
973
  /* Responsive in CSS (4.16), so the server's HTML is already right on a phone: below lg the sidebar is hidden and the
926
974
  * menu button shows; from lg up the reverse. JavaScript only opens and closes the drawer. */
@@ -937,10 +985,11 @@ a.aura-tab { text-decoration: none; }
937
985
  .aura-shell__content { flex: 1; min-width: 0; padding: var(--aura-space-6) var(--aura-space-4); }
938
986
  /* 5.7: <main> takes focus (tabIndex -1) for skip links and "the row you acted on is gone"; a landmark gets no ring. */
939
987
  .aura-shell__content:focus { outline: none; }
988
+ .aura-shell__content.is-flush { padding: 0; } /* 5.14 (Chamber-OS 97): contentPadding={false} */
940
989
  @media (min-width: 640px) { .aura-shell__content { padding: var(--aura-space-6); } }
941
990
  @media (min-width: 1024px) { .aura-shell__content { padding: var(--aura-space-8); } }
942
991
  /* The shell already pads its content: a Container directly inside only caps the width. */
943
- .aura-shell__content > .aura-container { padding-left: 0; padding-right: 0; }
992
+ .aura-shell__content:not(.is-flush) > .aura-container { padding-left: 0; padding-right: 0; }
944
993
 
945
994
  /* Totals row (4.19): under the body, a strong top edge; sticky at the bottom of a `height` table with stickyFooter. */
946
995
  .aura-table__total { background: var(--aura-bg-canvas); border-top: 1px solid var(--aura-border-strong); font-weight: 600; }
@@ -960,7 +1009,7 @@ button.aura-stat { font: inherit; width: 100%; cursor: pointer; }
960
1009
  .aura-stat.is-interactive:hover { border-color: var(--aura-border-strong); }
961
1010
  .aura-stat.is-interactive:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
962
1011
  .aura-stat__head { display: flex; align-items: center; justify-content: space-between; gap: var(--aura-space-2); }
963
- .aura-stat__label { font-size: 13px; font-weight: 500; color: var(--aura-fg-secondary); }
1012
+ .aura-stat__label { margin: 0; font-size: 13px; font-weight: 500; color: var(--aura-fg-secondary); } /* 5.14: may be a heading */
964
1013
  .aura-stat__icon { display: inline-flex; color: var(--aura-fg-secondary); }
965
1014
  .aura-stat__value { display: flex; align-items: baseline; gap: var(--aura-space-1); font-size: 28px; line-height: 1.2; font-weight: 600; letter-spacing: -0.01em; min-height: 34px; }
966
1015
  .aura-stat__value.is-numeric { font-variant-numeric: tabular-nums; }
@@ -1064,6 +1113,12 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1064
1113
  .aura-progress--warning .aura-progress__bar { background: var(--aura-alert-warning-fg); }
1065
1114
  .aura-progress--danger .aura-progress__bar { background: var(--aura-fg-danger); }
1066
1115
  .aura-progress--neutral .aura-progress__bar { background: var(--aura-fg-secondary); }
1116
+ /* 5.15 (Chamber-OS 89): a reserved amount after the value — the same tone, striped, so it reads without colour. */
1117
+ .aura-progress__bar--reserved {
1118
+ transition: left var(--aura-duration-base) var(--aura-ease), width var(--aura-duration-base) var(--aura-ease);
1119
+ -webkit-mask-image: repeating-linear-gradient(135deg, currentColor 0 3px, transparent 3px 6px);
1120
+ mask-image: repeating-linear-gradient(135deg, currentColor 0 3px, transparent 3px 6px);
1121
+ }
1067
1122
  .aura-progress__track.is-indeterminate .aura-progress__bar { width: 35%; animation: aura-progress-slide var(--aura-duration-pulse) var(--aura-ease) infinite; }
1068
1123
  @keyframes aura-progress-slide { from { left: -35%; } to { left: 100%; } }
1069
1124
  @media (prefers-reduced-motion: reduce) { .aura-progress__track.is-indeterminate .aura-progress__bar { animation-duration: calc(var(--aura-duration-pulse) * 3); } }
@@ -1246,6 +1301,30 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1246
1301
  .aura-tabs--segmented .aura-tabs__list.aura-segmented { gap: 2px; }
1247
1302
  .aura-tabs--segmented .aura-tabs__list.aura-segmented.is-full .aura-tab { min-width: max-content; }
1248
1303
  .aura-tabs--segmented .aura-tab.aura-segmented__option { margin-bottom: 0; }
1304
+ /* 5.15 (Chamber-OS 90): underline tabs sharing the width, always or below a breakpoint; the segmented track below one. */
1305
+ .aura-tabs__list.is-fill { gap: 0; }
1306
+ .aura-tabs__list.is-fill > .aura-tab { flex: 1 1 0; min-width: max-content; justify-content: center; padding: 0 var(--aura-space-3); }
1307
+ @media (max-width: 639.98px) {
1308
+ .aura-tabs__list.is-fill-below-sm { gap: 0; }
1309
+ .aura-tabs__list.is-fill-below-sm > .aura-tab { flex: 1 1 0; min-width: max-content; justify-content: center; padding: 0 var(--aura-space-3); }
1310
+ .aura-segmented.is-full-below-sm { display: flex; width: 100%; }
1311
+ .aura-segmented.is-full-below-sm .aura-segmented__option { flex: 1 1 0; min-width: 0; }
1312
+ .aura-tabs--segmented .aura-segmented.is-full-below-sm .aura-tab { min-width: max-content; }
1313
+ }
1314
+ @media (max-width: 767.98px) {
1315
+ .aura-tabs__list.is-fill-below-md { gap: 0; }
1316
+ .aura-tabs__list.is-fill-below-md > .aura-tab { flex: 1 1 0; min-width: max-content; justify-content: center; padding: 0 var(--aura-space-3); }
1317
+ .aura-segmented.is-full-below-md { display: flex; width: 100%; }
1318
+ .aura-segmented.is-full-below-md .aura-segmented__option { flex: 1 1 0; min-width: 0; }
1319
+ .aura-tabs--segmented .aura-segmented.is-full-below-md .aura-tab { min-width: max-content; }
1320
+ }
1321
+ @media (max-width: 1023.98px) {
1322
+ .aura-tabs__list.is-fill-below-lg { gap: 0; }
1323
+ .aura-tabs__list.is-fill-below-lg > .aura-tab { flex: 1 1 0; min-width: max-content; justify-content: center; padding: 0 var(--aura-space-3); }
1324
+ .aura-segmented.is-full-below-lg { display: flex; width: 100%; }
1325
+ .aura-segmented.is-full-below-lg .aura-segmented__option { flex: 1 1 0; min-width: 0; }
1326
+ .aura-tabs--segmented .aura-segmented.is-full-below-lg .aura-tab { min-width: max-content; }
1327
+ }
1249
1328
  .aura-tabs--segmented .aura-tab.aura-segmented__option:focus-visible { border-radius: var(--aura-radius-full); outline-offset: calc(-1 * var(--aura-focus-ring-width)); }
1250
1329
  .aura-tabs--segmented .aura-tab.aura-segmented__option:disabled,
1251
1330
  .aura-tabs--segmented .aura-tab.aura-segmented__option.is-disabled { opacity: var(--aura-disabled-opacity); cursor: not-allowed; }
@@ -1372,6 +1451,16 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1372
1451
  /* 5.12 searchGrow: the search fills what the controls leave. */
1373
1452
  .aura-filterbar--grow .aura-filterbar__search { max-width: none; }
1374
1453
  .aura-filterbar--grow .aura-filterbar__search ~ .aura-filterbar__spacer { display: none; }
1454
+ /* 5.15 (Chamber-OS 92): the search on its own row up to 1024px; controls sharing their row in equal columns. */
1455
+ @media (max-width: 1023.98px) {
1456
+ .aura-filterbar--stack-lg .aura-filterbar__search { flex-basis: 100%; max-width: none; }
1457
+ .aura-filterbar--stack-lg .aura-filterbar__spacer { display: none; }
1458
+ }
1459
+ .aura-filterbar--fill .aura-filterbar__spacer { display: none; }
1460
+ .aura-filterbar--fill .aura-filterbar__controls { flex: 1 1 auto; min-width: 0; }
1461
+ .aura-filterbar--fill .aura-filterbar__controls > * { flex: 1 1 0; min-width: 120px; max-width: none; width: auto; }
1462
+ .aura-filterbar--fill .aura-filterbar__controls > .aura-filterselect .aura-filterselect__face { width: 100%; }
1463
+ .aura-filterbar--fill .aura-filterbar__controls > .aura-filterselect .aura-filterselect__chevron { margin-inline-start: auto; }
1375
1464
  /* Compact filters sit closer together than full fields. */
1376
1465
  .aura-filterbar__controls:has(> .aura-filterselect) { gap: var(--aura-space-2); }
1377
1466
 
@@ -1612,6 +1701,34 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1612
1701
  }
1613
1702
  }
1614
1703
 
1704
+ /* 5.15 (Chamber-OS 85): stackStyle="cards" — each stacked row its own card (DataTable's card spacing), no outer frame.
1705
+ * .aura-tbl-cards is the container here, so the wrap's own frame can be dropped while stacked. */
1706
+ .aura-tbl-cards { container: aura-tbl / inline-size; width: 100%; }
1707
+ @container aura-tbl (width < 768px) {
1708
+ .aura-tbl-cards--md > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1709
+ .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1710
+ .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row {
1711
+ margin-bottom: var(--aura-space-2); padding: var(--aura-space-4);
1712
+ border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1713
+ }
1714
+ .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1715
+ .aura-tbl--cards.aura-tbl--stack-md > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1716
+ .aura-tbl-wrap[data-density='compact'] > .aura-tbl--cards.aura-tbl--stack-md > * > .aura-tbl__row { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1717
+ .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1718
+ }
1719
+ @container aura-tbl (width < 640px) {
1720
+ .aura-tbl-cards--sm > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1721
+ .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1722
+ .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row {
1723
+ margin-bottom: var(--aura-space-2); padding: var(--aura-space-4);
1724
+ border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1725
+ }
1726
+ .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1727
+ .aura-tbl--cards.aura-tbl--stack-sm > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1728
+ .aura-tbl-wrap[data-density='compact'] > .aura-tbl--cards.aura-tbl--stack-sm > * > .aura-tbl__row { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1729
+ .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1730
+ }
1731
+
1615
1732
  /* ---------- 4.20: DataTable width queries and cards, one markup ---------- */
1616
1733
  /* Each .aura-table-q is the table's width × 10000 / its threshold (DataTable.tsx, Q), so `(width < 9999.5px)` is true
1617
1734
  * exactly when the table is narrower than stackBelow or a hideBelow width — before hydration, at any width. */
@@ -1662,6 +1779,9 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1662
1779
  .aura-table__td[data-card='hide'], .aura-table__head > .aura-table__th[data-card='hide'],
1663
1780
  .aura-table__row--skeleton .aura-table__td[data-card='hide'] { display: none; }
1664
1781
  .aura-table__td[data-card='field'] { order: var(--aura-card-order, 5); }
1782
+ /* 5.14 (Chamber-OS 108): in a card every field starts under its label; align: 'end' is for the grid (figures stay tabular). */
1783
+ .aura-table__td.is-end { text-align: start; }
1784
+ .aura-table__row--skeleton .aura-table__td.is-end { justify-content: flex-start; }
1665
1785
  /* hideSelectionInCards: no row boxes, no select-all line. */
1666
1786
  .aura-table--cards-nosel .aura-table__row > .aura-table__sel { display: none; }
1667
1787
  .aura-table--cards-nosel .aura-table__head { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.13.0",
3
+ "version": "5.15.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",