@jirawatpyk/aura-react 5.60.0 → 5.62.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/README.md CHANGED
@@ -186,6 +186,14 @@ DataTable with sort and page in the URL (4.17): `onStateChange={({ sort, page })
186
186
  - **Time zone**: `timeZone` on AuraProvider, DatePicker, DateRangePicker and Calendar decides "today" (the marker, `min`/`max="today"`, the first month shown); or pass `today` as an ISO date. `todayIn('Asia/Bangkok')` is exported from the root and `/server`.
187
187
  - **Toasts** queue past three instead of dropping: six in a row all show, in order, three at a time.
188
188
 
189
+ ## 5.62 — Chamber-OS addendum 78 (#177)
190
+
191
+ - **PageHeader `meta` lays chips out as a row:** a `meta` made only of elements (Badges, a StatusPill — through Fragments and arrays) is now a wrapping row, 8px apart and vertically centred, as `eyebrow` — so chips no longer touch when the JSX has no space between them, and they wrap on a phone. Any text in it — a string `meta` ("128 members · updated 3 min ago"), or a sentence with a `<strong>`, `<time>`, a link or `{count}` — keeps it a text line, as before. Also from `/server`. Drop a `flex flex-wrap items-center gap-2` stand-in wrapper.
192
+
193
+ ## 5.61 — Chamber-OS addendum 77 (#176)
194
+
195
+ - **A visually hidden child of full-width header actions stays hidden:** below the `actionsFullWidthBelow` width every direct child of PageHeader's actions took a share of the row with `min-width: max-content` — including a visually hidden description beside a button (`aria-describedby` → a `.sr-only` / `.aura-sr-only` span), which grew to its text's width and scrolled the page sideways. The share rule — here and in the `actionsBarBelow` bar — now skips a visually hidden child: `.sr-only`, `.aura-sr-only`, `.visually-hidden`, `.screen-reader-text`, `[hidden]`, or one with an inline `position: absolute` (Radix and React Aria `VisuallyHidden`); the buttons share the row as before. Drop a `.sr-only { min-width: 0 }` stand-in. Another out-of-flow child styled by a class of your own (an absolutely positioned badge) needs `min-width: 0`, or put it inside the button.
196
+
189
197
  ## 5.60 — Chamber-OS addenda 74–76 (#173, #174, #175)
190
198
 
191
199
  - **`linkClass` lays a link out at every width:** a link with `touchHeight` — and any `<button>` or `<summary>` with the class — is now `inline-flex` with a mouse too, not only under the touch query: vertically centred, a 4px gap before an icon, `min-width: 0` and `max-width: 100%`, so `<a className={linkClass({ touchHeight: true })}><span className="truncate">…</span><Icon/></a>` truncates inside its parent with a visible gap, and a `<summary>` is as wide as its content (its marker is hidden; add your own chevron). Under the touch query it is still at least 44×44. A plain `<a>` without `touchHeight` stays inline, so it still wraps in a sentence; a `touchHeight` link whose label wraps now wraps inside its own box (its second line starts under the link, not at the line's start), as it already did on touch. The layout is one class strong, so it beats an element reset (`summary { display: list-item }`) and your own `hidden` / `block` class wins when it comes later (or in a later layer, e.g. with `styles.layer.css` under Tailwind v4). A link with an icon as a direct child is centred on the line (within 2px; an icon inside a wrapper span isn't detected). The `<button>` reset is one class strong too, so a margin, padding or font class of yours on the button wins when it comes later. In a DataTable grid cell a touch link stays inline (no icon gap) so the cell keeps its ellipsis; in DataTable cards it is laid out under the touch query.
@@ -7914,6 +7914,22 @@ window.Aura = (() => {
7914
7914
  // src/PageHeader.tsx
7915
7915
  var React43 = __toESM(require_react(), 1);
7916
7916
  var h8 = React43.createElement;
7917
+ function chipsOnly(node) {
7918
+ let el = 0;
7919
+ const walk = function(n3) {
7920
+ if (n3 == null || typeof n3 === "boolean") return true;
7921
+ if (typeof n3 === "string") return n3.trim() === "";
7922
+ if (typeof n3 === "number" || typeof n3 === "bigint") return false;
7923
+ if (Array.isArray(n3)) return n3.every(walk);
7924
+ if (React43.isValidElement(n3)) {
7925
+ if (n3.type === React43.Fragment) return walk(n3.props.children);
7926
+ el++;
7927
+ return true;
7928
+ }
7929
+ return false;
7930
+ };
7931
+ return walk(node) && el > 0;
7932
+ }
7917
7933
  var PageHeader = React43.forwardRef(function PageHeader2(props, ref) {
7918
7934
  const attrs2 = {};
7919
7935
  Object.keys(props).forEach(function(k) {
@@ -7930,6 +7946,7 @@ window.Aura = (() => {
7930
7946
  const size = props.size === "compact" || props.size === "hero" || props.size === "hero-lg" ? props.size : null;
7931
7947
  const eyebrow = props.eyebrow;
7932
7948
  const plainEyebrow = typeof eyebrow === "string" || typeof eyebrow === "number";
7949
+ const richMeta = chipsOnly(props.meta);
7933
7950
  const heading = h8(
7934
7951
  "h" + level,
7935
7952
  {
@@ -7971,7 +7988,7 @@ window.Aura = (() => {
7971
7988
  h8("div", { className: "aura-page-header__title-addon" }, props.titleAddon)
7972
7989
  ) : heading,
7973
7990
  shown(props.subtitle) ? h8("div", { className: "aura-page-header__subtitle" }, props.subtitle) : null,
7974
- props.meta != null && props.meta !== false ? h8("div", { className: "aura-page-header__meta" }, props.meta) : null
7991
+ props.meta != null && props.meta !== false ? h8("div", { className: cx("aura-page-header__meta", richMeta && "aura-page-header__meta--rich") }, props.meta) : null
7975
7992
  ),
7976
7993
  props.actions != null && props.actions !== false ? h8(
7977
7994
  "div",
@@ -7896,6 +7896,22 @@ var React44 = __toESM(require("react"), 1);
7896
7896
  // src/PageHeader.tsx
7897
7897
  var React43 = __toESM(require("react"), 1);
7898
7898
  var h8 = React43.createElement;
7899
+ function chipsOnly(node) {
7900
+ let el = 0;
7901
+ const walk = function(n3) {
7902
+ if (n3 == null || typeof n3 === "boolean") return true;
7903
+ if (typeof n3 === "string") return n3.trim() === "";
7904
+ if (typeof n3 === "number" || typeof n3 === "bigint") return false;
7905
+ if (Array.isArray(n3)) return n3.every(walk);
7906
+ if (React43.isValidElement(n3)) {
7907
+ if (n3.type === React43.Fragment) return walk(n3.props.children);
7908
+ el++;
7909
+ return true;
7910
+ }
7911
+ return false;
7912
+ };
7913
+ return walk(node) && el > 0;
7914
+ }
7899
7915
  var PageHeader = React43.forwardRef(function PageHeader2(props, ref) {
7900
7916
  const attrs2 = {};
7901
7917
  Object.keys(props).forEach(function(k) {
@@ -7912,6 +7928,7 @@ var PageHeader = React43.forwardRef(function PageHeader2(props, ref) {
7912
7928
  const size = props.size === "compact" || props.size === "hero" || props.size === "hero-lg" ? props.size : null;
7913
7929
  const eyebrow = props.eyebrow;
7914
7930
  const plainEyebrow = typeof eyebrow === "string" || typeof eyebrow === "number";
7931
+ const richMeta = chipsOnly(props.meta);
7915
7932
  const heading = h8(
7916
7933
  "h" + level,
7917
7934
  {
@@ -7953,7 +7970,7 @@ var PageHeader = React43.forwardRef(function PageHeader2(props, ref) {
7953
7970
  h8("div", { className: "aura-page-header__title-addon" }, props.titleAddon)
7954
7971
  ) : heading,
7955
7972
  shown(props.subtitle) ? h8("div", { className: "aura-page-header__subtitle" }, props.subtitle) : null,
7956
- props.meta != null && props.meta !== false ? h8("div", { className: "aura-page-header__meta" }, props.meta) : null
7973
+ props.meta != null && props.meta !== false ? h8("div", { className: cx("aura-page-header__meta", richMeta && "aura-page-header__meta--rich") }, props.meta) : null
7957
7974
  ),
7958
7975
  props.actions != null && props.actions !== false ? h8(
7959
7976
  "div",
@@ -2,6 +2,22 @@
2
2
  import * as React from "react";
3
3
  import { cx } from "./classes.js";
4
4
  const h = React.createElement;
5
+ function chipsOnly(node) {
6
+ let el = 0;
7
+ const walk = function(n) {
8
+ if (n == null || typeof n === "boolean") return true;
9
+ if (typeof n === "string") return n.trim() === "";
10
+ if (typeof n === "number" || typeof n === "bigint") return false;
11
+ if (Array.isArray(n)) return n.every(walk);
12
+ if (React.isValidElement(n)) {
13
+ if (n.type === React.Fragment) return walk(n.props.children);
14
+ el++;
15
+ return true;
16
+ }
17
+ return false;
18
+ };
19
+ return walk(node) && el > 0;
20
+ }
5
21
  const PageHeader = React.forwardRef(function PageHeader2(props, ref) {
6
22
  const attrs = {};
7
23
  Object.keys(props).forEach(function(k) {
@@ -18,6 +34,7 @@ const PageHeader = React.forwardRef(function PageHeader2(props, ref) {
18
34
  const size = props.size === "compact" || props.size === "hero" || props.size === "hero-lg" ? props.size : null;
19
35
  const eyebrow = props.eyebrow;
20
36
  const plainEyebrow = typeof eyebrow === "string" || typeof eyebrow === "number";
37
+ const richMeta = chipsOnly(props.meta);
21
38
  const heading = h(
22
39
  "h" + level,
23
40
  {
@@ -59,7 +76,7 @@ const PageHeader = React.forwardRef(function PageHeader2(props, ref) {
59
76
  h("div", { className: "aura-page-header__title-addon" }, props.titleAddon)
60
77
  ) : heading,
61
78
  shown(props.subtitle) ? h("div", { className: "aura-page-header__subtitle" }, props.subtitle) : null,
62
- props.meta != null && props.meta !== false ? h("div", { className: "aura-page-header__meta" }, props.meta) : null
79
+ props.meta != null && props.meta !== false ? h("div", { className: cx("aura-page-header__meta", richMeta && "aura-page-header__meta--rich") }, props.meta) : null
63
80
  ),
64
81
  props.actions != null && props.actions !== false ? h(
65
82
  "div",
package/dist/index.d.cts CHANGED
@@ -2072,7 +2072,8 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
2072
2072
  /** 5.46: `end` (default) lines the actions up with the bottom of the text; `start` with its top (the title, when
2073
2073
  * there is no breadcrumb or eyebrow). */
2074
2074
  actionsAlign?: "end" | "start" | undefined;
2075
- /** A line under the title — counts, last update, owner. */
2075
+ /** A line under the title — counts, last update, owner. 5.62 (Chamber-OS 177): made only of elements (Badges, a
2076
+ * StatusPill), it is laid out as a wrapping row, 8px apart; any text in it keeps it a line. */
2076
2077
  meta?: React$1.ReactNode | undefined;
2077
2078
  /** Buttons for the page, bottom-aligned at the end; they wrap below the text on a narrow screen. */
2078
2079
  actions?: React$1.ReactNode | undefined;
package/dist/index.d.ts CHANGED
@@ -2072,7 +2072,8 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
2072
2072
  /** 5.46: `end` (default) lines the actions up with the bottom of the text; `start` with its top (the title, when
2073
2073
  * there is no breadcrumb or eyebrow). */
2074
2074
  actionsAlign?: "end" | "start" | undefined;
2075
- /** A line under the title — counts, last update, owner. */
2075
+ /** A line under the title — counts, last update, owner. 5.62 (Chamber-OS 177): made only of elements (Badges, a
2076
+ * StatusPill), it is laid out as a wrapping row, 8px apart; any text in it keeps it a line. */
2076
2077
  meta?: React$1.ReactNode | undefined;
2077
2078
  /** Buttons for the page, bottom-aligned at the end; they wrap below the text on a narrow screen. */
2078
2079
  actions?: React$1.ReactNode | undefined;
@@ -1632,6 +1632,22 @@ function TableSkeleton(props) {
1632
1632
  // src/PageHeader.tsx
1633
1633
  var React6 = __toESM(require("react"), 1);
1634
1634
  var h5 = React6.createElement;
1635
+ function chipsOnly(node) {
1636
+ let el = 0;
1637
+ const walk = function(n3) {
1638
+ if (n3 == null || typeof n3 === "boolean") return true;
1639
+ if (typeof n3 === "string") return n3.trim() === "";
1640
+ if (typeof n3 === "number" || typeof n3 === "bigint") return false;
1641
+ if (Array.isArray(n3)) return n3.every(walk);
1642
+ if (React6.isValidElement(n3)) {
1643
+ if (n3.type === React6.Fragment) return walk(n3.props.children);
1644
+ el++;
1645
+ return true;
1646
+ }
1647
+ return false;
1648
+ };
1649
+ return walk(node) && el > 0;
1650
+ }
1635
1651
  var PageHeader = React6.forwardRef(function PageHeader2(props, ref) {
1636
1652
  const attrs2 = {};
1637
1653
  Object.keys(props).forEach(function(k) {
@@ -1648,6 +1664,7 @@ var PageHeader = React6.forwardRef(function PageHeader2(props, ref) {
1648
1664
  const size = props.size === "compact" || props.size === "hero" || props.size === "hero-lg" ? props.size : null;
1649
1665
  const eyebrow = props.eyebrow;
1650
1666
  const plainEyebrow = typeof eyebrow === "string" || typeof eyebrow === "number";
1667
+ const richMeta = chipsOnly(props.meta);
1651
1668
  const heading = h5(
1652
1669
  "h" + level,
1653
1670
  {
@@ -1689,7 +1706,7 @@ var PageHeader = React6.forwardRef(function PageHeader2(props, ref) {
1689
1706
  h5("div", { className: "aura-page-header__title-addon" }, props.titleAddon)
1690
1707
  ) : heading,
1691
1708
  shown(props.subtitle) ? h5("div", { className: "aura-page-header__subtitle" }, props.subtitle) : null,
1692
- props.meta != null && props.meta !== false ? h5("div", { className: "aura-page-header__meta" }, props.meta) : null
1709
+ props.meta != null && props.meta !== false ? h5("div", { className: cx("aura-page-header__meta", richMeta && "aura-page-header__meta--rich") }, props.meta) : null
1693
1710
  ),
1694
1711
  props.actions != null && props.actions !== false ? h5(
1695
1712
  "div",
@@ -582,7 +582,8 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
582
582
  /** 5.46: `end` (default) lines the actions up with the bottom of the text; `start` with its top (the title, when
583
583
  * there is no breadcrumb or eyebrow). */
584
584
  actionsAlign?: "end" | "start" | undefined;
585
- /** A line under the title — counts, last update, owner. */
585
+ /** A line under the title — counts, last update, owner. 5.62 (Chamber-OS 177): made only of elements (Badges, a
586
+ * StatusPill), it is laid out as a wrapping row, 8px apart; any text in it keeps it a line. */
586
587
  meta?: React$1.ReactNode | undefined;
587
588
  /** Buttons for the page, bottom-aligned at the end; they wrap below the text on a narrow screen. */
588
589
  actions?: React$1.ReactNode | undefined;
@@ -582,7 +582,8 @@ export interface PageHeaderProps extends Pick<React$1.HTMLAttributes<HTMLElement
582
582
  /** 5.46: `end` (default) lines the actions up with the bottom of the text; `start` with its top (the title, when
583
583
  * there is no breadcrumb or eyebrow). */
584
584
  actionsAlign?: "end" | "start" | undefined;
585
- /** A line under the title — counts, last update, owner. */
585
+ /** A line under the title — counts, last update, owner. 5.62 (Chamber-OS 177): made only of elements (Badges, a
586
+ * StatusPill), it is laid out as a wrapping row, 8px apart; any text in it keeps it a line. */
586
587
  meta?: React$1.ReactNode | undefined;
587
588
  /** Buttons for the page, bottom-aligned at the end; they wrap below the text on a narrow screen. */
588
589
  actions?: React$1.ReactNode | undefined;
@@ -1566,6 +1566,22 @@ function TableSkeleton(props) {
1566
1566
  // src/PageHeader.tsx
1567
1567
  import * as React6 from "react";
1568
1568
  var h5 = React6.createElement;
1569
+ function chipsOnly(node) {
1570
+ let el = 0;
1571
+ const walk = function(n3) {
1572
+ if (n3 == null || typeof n3 === "boolean") return true;
1573
+ if (typeof n3 === "string") return n3.trim() === "";
1574
+ if (typeof n3 === "number" || typeof n3 === "bigint") return false;
1575
+ if (Array.isArray(n3)) return n3.every(walk);
1576
+ if (React6.isValidElement(n3)) {
1577
+ if (n3.type === React6.Fragment) return walk(n3.props.children);
1578
+ el++;
1579
+ return true;
1580
+ }
1581
+ return false;
1582
+ };
1583
+ return walk(node) && el > 0;
1584
+ }
1569
1585
  var PageHeader = React6.forwardRef(function PageHeader2(props, ref) {
1570
1586
  const attrs2 = {};
1571
1587
  Object.keys(props).forEach(function(k) {
@@ -1582,6 +1598,7 @@ var PageHeader = React6.forwardRef(function PageHeader2(props, ref) {
1582
1598
  const size = props.size === "compact" || props.size === "hero" || props.size === "hero-lg" ? props.size : null;
1583
1599
  const eyebrow = props.eyebrow;
1584
1600
  const plainEyebrow = typeof eyebrow === "string" || typeof eyebrow === "number";
1601
+ const richMeta = chipsOnly(props.meta);
1585
1602
  const heading = h5(
1586
1603
  "h" + level,
1587
1604
  {
@@ -1623,7 +1640,7 @@ var PageHeader = React6.forwardRef(function PageHeader2(props, ref) {
1623
1640
  h5("div", { className: "aura-page-header__title-addon" }, props.titleAddon)
1624
1641
  ) : heading,
1625
1642
  shown(props.subtitle) ? h5("div", { className: "aura-page-header__subtitle" }, props.subtitle) : null,
1626
- props.meta != null && props.meta !== false ? h5("div", { className: "aura-page-header__meta" }, props.meta) : null
1643
+ props.meta != null && props.meta !== false ? h5("div", { className: cx("aura-page-header__meta", richMeta && "aura-page-header__meta--rich") }, props.meta) : null
1627
1644
  ),
1628
1645
  props.actions != null && props.actions !== false ? h5(
1629
1646
  "div",
package/dist/styles.css CHANGED
@@ -1271,9 +1271,13 @@ summary.aura-link::-webkit-details-marker { display: none; }
1271
1271
  * fills it, and icon buttons keep their size. The :has rule is alone so older browsers drop only it.
1272
1272
  * 5.44 (Chamber-OS 149): with an icon button among them (a ⋯ menu) the actions are one bar: the row never wraps,
1273
1273
  * the buttons share what the icon leaves and wrap their labels inside (never an ellipsis). */
1274
+ /* 5.61 (Chamber-OS 176): the share rule (here and in the actionsBarBelow bar) skips a visually hidden child (an
1275
+ * aria-describedby text beside a button) — a class (.sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text),
1276
+ * [hidden], or an inline position: absolute (Radix / React Aria VisuallyHidden): min-width: max-content made the 1px
1277
+ * span as wide as its text and the page scrolled sideways. :where keeps the selector's weight as before. */
1274
1278
  @media (max-width: 639.98px) {
1275
1279
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1276
- .aura-page-header--actions-full-below-sm > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
1280
+ .aura-page-header--actions-full-below-sm > .aura-page-header__actions > :where(:not(.sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"])) { flex: 1 1 0; min-width: max-content; }
1277
1281
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1278
1282
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1279
1283
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1284,7 +1288,7 @@ summary.aura-link::-webkit-details-marker { display: none; }
1284
1288
  }
1285
1289
  @media (max-width: 767.98px) {
1286
1290
  .aura-page-header--actions-full-below-md > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1287
- .aura-page-header--actions-full-below-md > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
1291
+ .aura-page-header--actions-full-below-md > .aura-page-header__actions > :where(:not(.sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"])) { flex: 1 1 0; min-width: max-content; }
1288
1292
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1289
1293
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1290
1294
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1295,7 +1299,7 @@ summary.aura-link::-webkit-details-marker { display: none; }
1295
1299
  }
1296
1300
  @media (max-width: 1023.98px) {
1297
1301
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1298
- .aura-page-header--actions-full-below-lg > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
1302
+ .aura-page-header--actions-full-below-lg > .aura-page-header__actions > :where(:not(.sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"])) { flex: 1 1 0; min-width: max-content; }
1299
1303
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1300
1304
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1301
1305
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1318,7 +1322,7 @@ summary.aura-link::-webkit-details-marker { display: none; }
1318
1322
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-icon-btn, .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > * > .aura-icon-btn:only-child { width: var(--aura-touch-target); height: var(--aura-touch-target); }
1319
1323
  .aura-page-header--actions-bar-below-sm.aura-page-header--actions-bar-floating > .aura-page-header__actions { left: var(--aura-space-4); right: var(--aura-space-4); bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px))); padding-bottom: var(--aura-space-2); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay); }
1320
1324
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__status { display: block; flex: 1 1 100%; min-width: 0; font-size: max(14px, .875rem); line-height: 1.5; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
1321
- .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :not(.aura-page-header__status) { flex: 1 1 0; min-width: max-content; }
1325
+ .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :not(.aura-page-header__status, .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"]) { flex: 1 1 0; min-width: max-content; }
1322
1326
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1323
1327
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1324
1328
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1339,7 +1343,7 @@ summary.aura-link::-webkit-details-marker { display: none; }
1339
1343
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-icon-btn, .aura-page-header--actions-bar-below-md > .aura-page-header__actions > * > .aura-icon-btn:only-child { width: var(--aura-touch-target); height: var(--aura-touch-target); }
1340
1344
  .aura-page-header--actions-bar-below-md.aura-page-header--actions-bar-floating > .aura-page-header__actions { left: var(--aura-space-4); right: var(--aura-space-4); bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px))); padding-bottom: var(--aura-space-2); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay); }
1341
1345
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__status { display: block; flex: 1 1 100%; min-width: 0; font-size: max(14px, .875rem); line-height: 1.5; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
1342
- .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :not(.aura-page-header__status) { flex: 1 1 0; min-width: max-content; }
1346
+ .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :not(.aura-page-header__status, .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"]) { flex: 1 1 0; min-width: max-content; }
1343
1347
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1344
1348
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1345
1349
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1361,6 +1365,8 @@ summary.aura-link::-webkit-details-marker { display: none; }
1361
1365
  .aura-page-header__title-row > .aura-page-header__title { min-width: 0; }
1362
1366
  .aura-page-header__title-addon { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); min-width: 0; }
1363
1367
  .aura-page-header__eyebrow--rich { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); font-family: var(--font-sans); line-height: 1.5; }
1368
+ /* 5.62 (Chamber-OS 177): a meta of chips only (no text) is a wrapping row, as the eyebrow — 8px apart, 4px under the title. */
1369
+ .aura-page-header__meta--rich { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); }
1364
1370
  .aura-page-header--hero, .aura-page-header--hero-lg { padding-top: var(--aura-page-header-hero-space, var(--aura-space-4)); }
1365
1371
  .aura-page-header--hero .aura-page-header__title { font-size: var(--aura-page-header-title-size, max(30px, 1.875rem)); line-height: var(--aura-page-header-title-line-height, 1.2); }
1366
1372
  /* 5.47 (Chamber-OS 152): compact — the staff boards' 26 / 32; hero steps to 36px from 1024px like hero-lg. */
@@ -1273,9 +1273,13 @@ summary.aura-link::-webkit-details-marker { display: none; }
1273
1273
  * fills it, and icon buttons keep their size. The :has rule is alone so older browsers drop only it.
1274
1274
  * 5.44 (Chamber-OS 149): with an icon button among them (a ⋯ menu) the actions are one bar: the row never wraps,
1275
1275
  * the buttons share what the icon leaves and wrap their labels inside (never an ellipsis). */
1276
+ /* 5.61 (Chamber-OS 176): the share rule (here and in the actionsBarBelow bar) skips a visually hidden child (an
1277
+ * aria-describedby text beside a button) — a class (.sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text),
1278
+ * [hidden], or an inline position: absolute (Radix / React Aria VisuallyHidden): min-width: max-content made the 1px
1279
+ * span as wide as its text and the page scrolled sideways. :where keeps the selector's weight as before. */
1276
1280
  @media (max-width: 639.98px) {
1277
1281
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1278
- .aura-page-header--actions-full-below-sm > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
1282
+ .aura-page-header--actions-full-below-sm > .aura-page-header__actions > :where(:not(.sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"])) { flex: 1 1 0; min-width: max-content; }
1279
1283
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1280
1284
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1281
1285
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1286,7 +1290,7 @@ summary.aura-link::-webkit-details-marker { display: none; }
1286
1290
  }
1287
1291
  @media (max-width: 767.98px) {
1288
1292
  .aura-page-header--actions-full-below-md > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1289
- .aura-page-header--actions-full-below-md > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
1293
+ .aura-page-header--actions-full-below-md > .aura-page-header__actions > :where(:not(.sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"])) { flex: 1 1 0; min-width: max-content; }
1290
1294
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1291
1295
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1292
1296
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1297,7 +1301,7 @@ summary.aura-link::-webkit-details-marker { display: none; }
1297
1301
  }
1298
1302
  @media (max-width: 1023.98px) {
1299
1303
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1300
- .aura-page-header--actions-full-below-lg > .aura-page-header__actions > * { flex: 1 1 0; min-width: max-content; }
1304
+ .aura-page-header--actions-full-below-lg > .aura-page-header__actions > :where(:not(.sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"])) { flex: 1 1 0; min-width: max-content; }
1301
1305
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1302
1306
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1303
1307
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1320,7 +1324,7 @@ summary.aura-link::-webkit-details-marker { display: none; }
1320
1324
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-icon-btn, .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > * > .aura-icon-btn:only-child { width: var(--aura-touch-target); height: var(--aura-touch-target); }
1321
1325
  .aura-page-header--actions-bar-below-sm.aura-page-header--actions-bar-floating > .aura-page-header__actions { left: var(--aura-space-4); right: var(--aura-space-4); bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px))); padding-bottom: var(--aura-space-2); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay); }
1322
1326
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-page-header__status { display: block; flex: 1 1 100%; min-width: 0; font-size: max(14px, .875rem); line-height: 1.5; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
1323
- .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :not(.aura-page-header__status) { flex: 1 1 0; min-width: max-content; }
1327
+ .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :not(.aura-page-header__status, .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"]) { flex: 1 1 0; min-width: max-content; }
1324
1328
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1325
1329
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1326
1330
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1341,7 +1345,7 @@ summary.aura-link::-webkit-details-marker { display: none; }
1341
1345
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-icon-btn, .aura-page-header--actions-bar-below-md > .aura-page-header__actions > * > .aura-icon-btn:only-child { width: var(--aura-touch-target); height: var(--aura-touch-target); }
1342
1346
  .aura-page-header--actions-bar-below-md.aura-page-header--actions-bar-floating > .aura-page-header__actions { left: var(--aura-space-4); right: var(--aura-space-4); bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px))); padding-bottom: var(--aura-space-2); border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay); }
1343
1347
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-page-header__status { display: block; flex: 1 1 100%; min-width: 0; font-size: max(14px, .875rem); line-height: 1.5; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
1344
- .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :not(.aura-page-header__status) { flex: 1 1 0; min-width: max-content; }
1348
+ .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :not(.aura-page-header__status, .sr-only, .aura-sr-only, .visually-hidden, .screen-reader-text, [hidden], [style*="position: absolute"], [style*="position:absolute"]) { flex: 1 1 0; min-width: max-content; }
1345
1349
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :is(.aura-dropdown, .aura-tooltip-anchor, .aura-popover-anchor) > * { flex: 1 1 auto; }
1346
1350
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1347
1351
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1363,6 +1367,8 @@ summary.aura-link::-webkit-details-marker { display: none; }
1363
1367
  .aura-page-header__title-row > .aura-page-header__title { min-width: 0; }
1364
1368
  .aura-page-header__title-addon { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); min-width: 0; }
1365
1369
  .aura-page-header__eyebrow--rich { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); font-family: var(--font-sans); line-height: 1.5; }
1370
+ /* 5.62 (Chamber-OS 177): a meta of chips only (no text) is a wrapping row, as the eyebrow — 8px apart, 4px under the title. */
1371
+ .aura-page-header__meta--rich { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); }
1366
1372
  .aura-page-header--hero, .aura-page-header--hero-lg { padding-top: var(--aura-page-header-hero-space, var(--aura-space-4)); }
1367
1373
  .aura-page-header--hero .aura-page-header__title { font-size: var(--aura-page-header-title-size, max(30px, 1.875rem)); line-height: var(--aura-page-header-title-line-height, 1.2); }
1368
1374
  /* 5.47 (Chamber-OS 152): compact — the staff boards' 26 / 32; hero steps to 36px from 1024px like hero-lg. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.60.0",
3
+ "version": "5.62.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",