@jirawatpyk/aura-react 5.59.0 → 5.61.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,19 @@ 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.61 — Chamber-OS addendum 77 (#176)
190
+
191
+ - **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.
192
+
193
+ ## 5.60 — Chamber-OS addenda 74–76 (#173, #174, #175)
194
+
195
+ - **`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.
196
+ - **Label at the start:** the 44px box keeps its label at the start (`justify-content: flex-start`, was centred), so a link stretched by a flex column or a grid cell no longer centres its text away from the column. A short label in its own 44px box sits at the box's start.
197
+ - **A type class on the link applies:** `font: inherit` and the other resets now apply to the `<button>` form only, so `<a className={linkClass() + ' aura-text-label'}>` keeps the label scale (13px/500). On a `<button>`, a type class of yours wins when it comes after AURA's styles (or in a later layer); otherwise put it on a child.
198
+ - Drop the hand-written `inline-flex items-center`, `min-w-0`, `self-start` / `justify-start` and `flex w-fit` added for 5.59.
199
+ - **Table cells wrap words whole** (#174): a static Table's cells use `overflow-wrap: break-word` instead of `anywhere`, which made every cell's min-content one character wide, so an auto-layout table squeezed a text column until "Diamond Partnership" broke inside a word. Words now wrap whole. **Change:** in a table a long unbroken string (an email, a URL) widens its column instead of breaking — the table then scrolls sideways in its box (in stacked cards it still breaks to fit). A `stickyHeader` table that starts scrolling sideways this way also stops pinning its header to the page (see #175). Give such a cell `wrap="anywhere"` (new on `Td` and `Th`) for the old behaviour, or `wrap="none"` to keep a cell on one line (a document number; stacked cards still wrap). Drop `[overflow-wrap:normal]` stand-ins.
200
+ - **A wide sticky header sits above the first row** (#175): with `stickyHeader`, a Table wider than its box (it scrolls sideways there) pinned its header to that box with the page's offset (`--aura-shell-bar-height`), so the header covered the first row. Such a table can't pin to the page anyway; its header now sits in flow above the first row.
201
+
189
202
  ## 5.59 — Chamber-OS addendum 73 (#172)
190
203
 
191
204
  - **`linkClass()` — a text link with the touch rule:** the class list for a link that reads as text, not a button, from the root and `/server` (as `buttonClass`): `<Link href={url} className={linkClass({ touchHeight: true })}>INV-2041</Link>`. `tone`: `accent` (default, the link colour) or `inherit`; `underline`: `always` (default) or `hover`; `className` is appended. With `touchHeight` the link is at least 44×44 below 640px or on a coarse pointer (`'always'`: at every width) — `inline-flex`, the label centred — with no fill, border or padding, so it looks the same; with a mouse from 640px its size and line height don't change. It works on a `<button>` too (an action that opens a modal rather than navigating): the button's chrome is reset — no fill, border or padding, the surrounding font and line height, a pointer — so a button and an `<a>` with the class look the same at rest, on hover (the underline thickens, or appears with `underline: 'hover'`) and on keyboard focus (Button's focus ring). The button form is for an action on its own line: a `<button>` never wraps mid-sentence the way an `<a>` does. In a DataTable's grid cells (any `rowHeight`) the row is the tap target and the cell truncates with an ellipsis, so there the link stays inline whatever `touchHeight` says (and a utility class can't override it); in its stacked cards (`stackBelow`) the 44px target applies again. Use it on a link that stands on its own line (a row title, a "View all"); in the middle of a sentence a 44px box would open up the line, so leave `touchHeight` off there. Drop hand-written `inline-flex items-center max-sm:min-h-11 pointer-coarse:min-h-11`.
@@ -9009,12 +9009,15 @@ window.Aura = (() => {
9009
9009
  align === "end" && "is-end",
9010
9010
  align === "center" && "is-center",
9011
9011
  p.numeric && "is-numeric",
9012
+ /* 5.60 (Chamber-OS 174) */
9013
+ p.wrap === "anywhere" && "is-wrap-anywhere",
9014
+ p.wrap === "none" && "is-nowrap",
9012
9015
  p.mono && "aura-table__mono",
9013
9016
  p.className
9014
9017
  );
9015
9018
  }
9016
9019
  var Th = React52.forwardRef(function Th2(props, ref) {
9017
- const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, ...rest } = props;
9020
+ const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, wrap, ...rest } = props;
9018
9021
  const stacked = React52.useContext(StackLabels) != null;
9019
9022
  return /* @__PURE__ */ React52.createElement(
9020
9023
  "th",
@@ -9029,7 +9032,7 @@ window.Aura = (() => {
9029
9032
  );
9030
9033
  });
9031
9034
  var Td = React52.forwardRef(function Td2(props, ref) {
9032
- const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, ...rest } = props;
9035
+ const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, wrap, ...rest } = props;
9033
9036
  const labels = React52.useContext(StackLabels), col = React52.useContext(ColumnIndex);
9034
9037
  const slot = labels && (card === "title" || card === "action") ? card : void 0;
9035
9038
  const shown = labels && !slot ? label != null ? label : col >= 0 ? labels[col] : void 0 : void 0;
@@ -8991,12 +8991,15 @@ function cellClass(base, p) {
8991
8991
  align === "end" && "is-end",
8992
8992
  align === "center" && "is-center",
8993
8993
  p.numeric && "is-numeric",
8994
+ /* 5.60 (Chamber-OS 174) */
8995
+ p.wrap === "anywhere" && "is-wrap-anywhere",
8996
+ p.wrap === "none" && "is-nowrap",
8994
8997
  p.mono && "aura-table__mono",
8995
8998
  p.className
8996
8999
  );
8997
9000
  }
8998
9001
  var Th = React52.forwardRef(function Th2(props, ref) {
8999
- const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, ...rest } = props;
9002
+ const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, wrap, ...rest } = props;
9000
9003
  const stacked = React52.useContext(StackLabels) != null;
9001
9004
  return /* @__PURE__ */ React52.createElement(
9002
9005
  "th",
@@ -9011,7 +9014,7 @@ var Th = React52.forwardRef(function Th2(props, ref) {
9011
9014
  );
9012
9015
  });
9013
9016
  var Td = React52.forwardRef(function Td2(props, ref) {
9014
- const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, ...rest } = props;
9017
+ const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, wrap, ...rest } = props;
9015
9018
  const labels = React52.useContext(StackLabels), col = React52.useContext(ColumnIndex);
9016
9019
  const slot = labels && (card === "title" || card === "action") ? card : void 0;
9017
9020
  const shown = labels && !slot ? label != null ? label : col >= 0 ? labels[col] : void 0 : void 0;
package/dist/esm/Table.js CHANGED
@@ -234,12 +234,15 @@ function cellClass(base, p) {
234
234
  align === "end" && "is-end",
235
235
  align === "center" && "is-center",
236
236
  p.numeric && "is-numeric",
237
+ /* 5.60 (Chamber-OS 174) */
238
+ p.wrap === "anywhere" && "is-wrap-anywhere",
239
+ p.wrap === "none" && "is-nowrap",
237
240
  p.mono && "aura-table__mono",
238
241
  p.className
239
242
  );
240
243
  }
241
244
  const Th = React.forwardRef(function Th2(props, ref) {
242
- const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, ...rest } = props;
245
+ const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, wrap, ...rest } = props;
243
246
  const stacked = React.useContext(StackLabels) != null;
244
247
  return /* @__PURE__ */ React.createElement(
245
248
  "th",
@@ -254,7 +257,7 @@ const Th = React.forwardRef(function Th2(props, ref) {
254
257
  );
255
258
  });
256
259
  const Td = React.forwardRef(function Td2(props, ref) {
257
- const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, ...rest } = props;
260
+ const { align, numeric, mono, className, scope, label, card, skeleton, skeletonWidth, wrap, ...rest } = props;
258
261
  const labels = React.useContext(StackLabels), col = React.useContext(ColumnIndex);
259
262
  const slot = labels && (card === "title" || card === "action") ? card : void 0;
260
263
  const shown = labels && !slot ? label != null ? label : col >= 0 ? labels[col] : void 0 : void 0;
package/dist/index.d.cts CHANGED
@@ -1435,6 +1435,11 @@ export interface TableCellProps extends Omit<React$1.TdHTMLAttributes<HTMLTableC
1435
1435
  numeric?: boolean | undefined;
1436
1436
  /** IDs and codes in the mono face. */
1437
1437
  mono?: boolean | undefined;
1438
+ /** How the cell's text wraps (5.60, Chamber-OS 174). Default `word` (`overflow-wrap: break-word`): between words; a
1439
+ * long unbroken string widens its column (the table then scrolls sideways; in stacked cards it breaks to fit).
1440
+ * `anywhere`: may break inside a word, so the column can shrink (URLs, emails; the rule before 5.60). `none`: on one
1441
+ * line (a document number); stacked cards still wrap. */
1442
+ wrap?: "word" | "anywhere" | "none" | undefined;
1438
1443
  /** Th only. Default `col`. */
1439
1444
  scope?: "col" | "row" | "colgroup" | "rowgroup" | undefined;
1440
1445
  /** The label this cell shows when its table is stacked (`stackBelow`, 5.8). Default: the matching header's text. */
@@ -1950,8 +1955,10 @@ export declare function buttonClass(opts?: {
1950
1955
  * `<a>` or `<Link>`, also in a Server Component: `<Link href={url} className={linkClass({ touchHeight: true })}>`.
1951
1956
  * `tone`: `accent` (default) or `inherit` (the surrounding colour). `underline`: `always` (default) or `hover`.
1952
1957
  * `touchHeight`: at least 44×44 below 640px or on a coarse pointer (`true`) or at every width (`'always'`), the label
1953
- * centred and its look unchanged — for a link on its own line, not mid-sentence. On a `<button>` (an action that
1954
- * opens something) the button's chrome is reset, so it looks like the link; hover and Button's focus ring included. */
1958
+ * at the start and its look unchanged — for a link on its own line, not mid-sentence. 5.60: with `touchHeight` (and
1959
+ * on a `<button>` or `<summary>`) it is `inline-flex` at every width — a 4px gap before an icon, `min-width: 0` so a
1960
+ * truncating child ends in an ellipsis. On a `<button>` (an action that opens something) the button's chrome is
1961
+ * reset, so it looks like the link; put a type class on a child there. Hover and Button's focus ring included. */
1955
1962
  export declare function linkClass(opts?: {
1956
1963
  tone?: "accent" | "inherit" | undefined;
1957
1964
  underline?: "always" | "hover" | undefined;
package/dist/index.d.ts CHANGED
@@ -1435,6 +1435,11 @@ export interface TableCellProps extends Omit<React$1.TdHTMLAttributes<HTMLTableC
1435
1435
  numeric?: boolean | undefined;
1436
1436
  /** IDs and codes in the mono face. */
1437
1437
  mono?: boolean | undefined;
1438
+ /** How the cell's text wraps (5.60, Chamber-OS 174). Default `word` (`overflow-wrap: break-word`): between words; a
1439
+ * long unbroken string widens its column (the table then scrolls sideways; in stacked cards it breaks to fit).
1440
+ * `anywhere`: may break inside a word, so the column can shrink (URLs, emails; the rule before 5.60). `none`: on one
1441
+ * line (a document number); stacked cards still wrap. */
1442
+ wrap?: "word" | "anywhere" | "none" | undefined;
1438
1443
  /** Th only. Default `col`. */
1439
1444
  scope?: "col" | "row" | "colgroup" | "rowgroup" | undefined;
1440
1445
  /** The label this cell shows when its table is stacked (`stackBelow`, 5.8). Default: the matching header's text. */
@@ -1950,8 +1955,10 @@ export declare function buttonClass(opts?: {
1950
1955
  * `<a>` or `<Link>`, also in a Server Component: `<Link href={url} className={linkClass({ touchHeight: true })}>`.
1951
1956
  * `tone`: `accent` (default) or `inherit` (the surrounding colour). `underline`: `always` (default) or `hover`.
1952
1957
  * `touchHeight`: at least 44×44 below 640px or on a coarse pointer (`true`) or at every width (`'always'`), the label
1953
- * centred and its look unchanged — for a link on its own line, not mid-sentence. On a `<button>` (an action that
1954
- * opens something) the button's chrome is reset, so it looks like the link; hover and Button's focus ring included. */
1958
+ * at the start and its look unchanged — for a link on its own line, not mid-sentence. 5.60: with `touchHeight` (and
1959
+ * on a `<button>` or `<summary>`) it is `inline-flex` at every width — a 4px gap before an icon, `min-width: 0` so a
1960
+ * truncating child ends in an ellipsis. On a `<button>` (an action that opens something) the button's chrome is
1961
+ * reset, so it looks like the link; put a type class on a child there. Hover and Button's focus ring included. */
1955
1962
  export declare function linkClass(opts?: {
1956
1963
  tone?: "accent" | "inherit" | undefined;
1957
1964
  underline?: "always" | "hover" | undefined;
@@ -500,8 +500,10 @@ export declare function buttonClass(opts?: {
500
500
  * `<a>` or `<Link>`, also in a Server Component: `<Link href={url} className={linkClass({ touchHeight: true })}>`.
501
501
  * `tone`: `accent` (default) or `inherit` (the surrounding colour). `underline`: `always` (default) or `hover`.
502
502
  * `touchHeight`: at least 44×44 below 640px or on a coarse pointer (`true`) or at every width (`'always'`), the label
503
- * centred and its look unchanged — for a link on its own line, not mid-sentence. On a `<button>` (an action that
504
- * opens something) the button's chrome is reset, so it looks like the link; hover and Button's focus ring included. */
503
+ * at the start and its look unchanged — for a link on its own line, not mid-sentence. 5.60: with `touchHeight` (and
504
+ * on a `<button>` or `<summary>`) it is `inline-flex` at every width — a 4px gap before an icon, `min-width: 0` so a
505
+ * truncating child ends in an ellipsis. On a `<button>` (an action that opens something) the button's chrome is
506
+ * reset, so it looks like the link; put a type class on a child there. Hover and Button's focus ring included. */
505
507
  export declare function linkClass(opts?: {
506
508
  tone?: "accent" | "inherit" | undefined;
507
509
  underline?: "always" | "hover" | undefined;
@@ -500,8 +500,10 @@ export declare function buttonClass(opts?: {
500
500
  * `<a>` or `<Link>`, also in a Server Component: `<Link href={url} className={linkClass({ touchHeight: true })}>`.
501
501
  * `tone`: `accent` (default) or `inherit` (the surrounding colour). `underline`: `always` (default) or `hover`.
502
502
  * `touchHeight`: at least 44×44 below 640px or on a coarse pointer (`true`) or at every width (`'always'`), the label
503
- * centred and its look unchanged — for a link on its own line, not mid-sentence. On a `<button>` (an action that
504
- * opens something) the button's chrome is reset, so it looks like the link; hover and Button's focus ring included. */
503
+ * at the start and its look unchanged — for a link on its own line, not mid-sentence. 5.60: with `touchHeight` (and
504
+ * on a `<button>` or `<summary>`) it is `inline-flex` at every width — a 4px gap before an icon, `min-width: 0` so a
505
+ * truncating child ends in an ellipsis. On a `<button>` (an action that opens something) the button's chrome is
506
+ * reset, so it looks like the link; put a type class on a child there. Hover and Button's focus ring included. */
505
507
  export declare function linkClass(opts?: {
506
508
  tone?: "accent" | "inherit" | undefined;
507
509
  underline?: "always" | "hover" | undefined;
package/dist/styles.css CHANGED
@@ -1101,19 +1101,37 @@ a.aura-tab { text-decoration: none; }
1101
1101
  .aura-actionbar__start > .aura-icon-btn, .aura-actionbar__start > * > .aura-icon-btn:only-child { width: var(--aura-touch-target); height: var(--aura-touch-target); }
1102
1102
  }
1103
1103
 
1104
- /* ---------- Text link (5.59, Chamber-OS 172) ---------- */
1105
- /* linkClass(): a link that reads as text — on an <a> or a <button> alike (a button's chrome is reset: no fill, border
1106
- * or padding, the surrounding font and line height, a pointer). accent (default) or inherit colour; underlined, or
1107
- * only on hover; hover thickens an underline that is always there. Focus is Button's ring. With touchHeight it is at
1108
- * least 44×44 below 640px or on a coarse pointer (or always), the text unchanged — the box grows around the label,
1109
- * centred. For a link on its own line (a row title, "+ Create new event"), not mid-sentence. */
1104
+ /* ---------- Text link (5.59, Chamber-OS 172; 5.60, 173) ---------- */
1105
+ /* linkClass(): a link that reads as text. accent (default) or inherit colour; underlined, or only on hover; hover
1106
+ * thickens an underline that is always there. Focus is Button's ring.
1107
+ * 5.60 (Chamber-OS 173): a link with touchHeight — and any <button> or <summary> with the class — is laid out at every
1108
+ * width, not only under the touch query: inline-flex, centred vertically, a 4px gap before an icon, label at the start,
1109
+ * and min-width 0 / max-width 100% so a truncating child ends in an ellipsis inside its parent. Under the touch query
1110
+ * (or always) it is at least 44×44; a box stretched by its parent keeps its label at the start. A plain <a> without
1111
+ * touchHeight stays inline, so it can wrap in a sentence. The type of an <a> is its own (a type class such as
1112
+ * aura-text-label on it applies); a <button> takes the surrounding font — put a type class on a child there. */
1110
1113
  .aura-link {
1111
- -webkit-appearance: none; appearance: none; margin: 0; padding: 0; border: 0; background: none;
1112
- font: inherit; line-height: inherit; letter-spacing: inherit; word-spacing: inherit; text-align: inherit;
1113
- text-transform: inherit; text-indent: inherit; text-shadow: inherit; cursor: pointer;
1114
1114
  color: var(--aura-fg-accent); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 2px;
1115
- border-radius: var(--aura-radius-xs);
1115
+ border-radius: var(--aura-radius-xs); cursor: pointer;
1116
1116
  }
1117
+ /* the <button> form: its chrome reset so it looks like the <a>. One class strong (0,1,0), so an app's own margin,
1118
+ * padding or font class on the button wins when it comes later. */
1119
+ .aura-link:where(button) {
1120
+ -webkit-appearance: none; appearance: none; margin: 0; padding: 0; border: 0; background: none;
1121
+ font: inherit; line-height: inherit; letter-spacing: inherit; word-spacing: inherit; text-align: inherit;
1122
+ text-transform: inherit; text-indent: inherit; text-shadow: inherit;
1123
+ }
1124
+ /* One class's worth of specificity (0,1,0): it beats an element reset (summary { display: list-item }) and ties with
1125
+ * an app's own class (hidden, block), which wins when it comes later or in a later layer. */
1126
+ .aura-link:where(.aura-link--touch, .aura-link--touch-always, button, summary) {
1127
+ display: inline-flex; align-items: center; justify-content: flex-start; gap: var(--aura-space-1);
1128
+ min-width: 0; max-width: 100%;
1129
+ }
1130
+ /* A leading icon would give the box its baseline (the icon's bottom); centre the box on the line instead (about 1px
1131
+ * either way at any line height). */
1132
+ .aura-link:where(.aura-link--touch, .aura-link--touch-always, button, summary):has(> svg:first-child) { vertical-align: middle; }
1133
+ summary.aura-link { list-style: none; }
1134
+ summary.aura-link::-webkit-details-marker { display: none; }
1117
1135
  .aura-link:hover { text-decoration-thickness: 2px; }
1118
1136
  .aura-link--inherit { color: inherit; }
1119
1137
  .aura-link--hover-underline { text-decoration: none; }
@@ -1126,9 +1144,9 @@ a.aura-tab { text-decoration: none; }
1126
1144
  .aura-link { color: LinkText; }
1127
1145
  .aura-link:is(:disabled, [aria-disabled="true"]) { color: GrayText; }
1128
1146
  }
1129
- .aura-link.aura-link--touch-always { display: inline-flex; align-items: center; justify-content: center; min-height: var(--aura-touch-target); min-width: var(--aura-touch-target); }
1147
+ .aura-link.aura-link--touch-always { min-height: var(--aura-touch-target); min-width: var(--aura-touch-target); }
1130
1148
  @media (max-width: 639.98px), (pointer: coarse) {
1131
- .aura-link.aura-link--touch { display: inline-flex; align-items: center; justify-content: center; min-height: var(--aura-touch-target); min-width: var(--aura-touch-target); }
1149
+ .aura-link.aura-link--touch { min-height: var(--aura-touch-target); min-width: var(--aura-touch-target); }
1132
1150
  }
1133
1151
  /* In a DataTable grid cell the row is the target and the cell clips with an ellipsis: the link stays inline there.
1134
1152
  * In DataTable's stacked cards nothing clips, so the 44px target comes back (container query: right before hydration). */
@@ -1253,9 +1271,13 @@ a.aura-tab { text-decoration: none; }
1253
1271
  * fills it, and icon buttons keep their size. The :has rule is alone so older browsers drop only it.
1254
1272
  * 5.44 (Chamber-OS 149): with an icon button among them (a ⋯ menu) the actions are one bar: the row never wraps,
1255
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. */
1256
1278
  @media (max-width: 639.98px) {
1257
1279
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1258
- .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; }
1259
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; }
1260
1282
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1261
1283
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1266,7 +1288,7 @@ a.aura-tab { text-decoration: none; }
1266
1288
  }
1267
1289
  @media (max-width: 767.98px) {
1268
1290
  .aura-page-header--actions-full-below-md > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1269
- .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; }
1270
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; }
1271
1293
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1272
1294
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1277,7 +1299,7 @@ a.aura-tab { text-decoration: none; }
1277
1299
  }
1278
1300
  @media (max-width: 1023.98px) {
1279
1301
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1280
- .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; }
1281
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; }
1282
1304
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1283
1305
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1300,7 +1322,7 @@ a.aura-tab { text-decoration: none; }
1300
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); }
1301
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); }
1302
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; }
1303
- .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; }
1304
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; }
1305
1327
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1306
1328
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1321,7 +1343,7 @@ a.aura-tab { text-decoration: none; }
1321
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); }
1322
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); }
1323
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; }
1324
- .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; }
1325
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; }
1326
1348
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1327
1349
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -2253,7 +2275,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
2253
2275
  .aura-tbl__caption { caption-side: top; padding: var(--aura-space-4) var(--aura-space-6) var(--aura-space-3); text-align: left; font-size: max(14px, .875rem); font-weight: 600; }
2254
2276
  /* 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
2255
2277
  * email, a URL) still breaks to fit instead of widening the table. Phones keep fitting the box: use stackBelow there. */
2256
- .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; }
2278
+ .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: break-word; }
2279
+ /* 5.60 (Chamber-OS 174): break-word, not anywhere — `anywhere` made every cell's min-content one character wide, so an
2280
+ * auto-layout table squeezed a text column until "Diamond Partnership" broke inside a word. With break-word words wrap
2281
+ * whole; a long unbroken string widens its column (the table scrolls sideways; stacked cards still break it). Td/Th
2282
+ * `wrap`: `anywhere` (the old rule, for URLs and emails that may shrink the column) or `none` (one line; stacked cards
2283
+ * wrap as usual). */
2284
+ .aura-tbl__th.is-wrap-anywhere, .aura-tbl__td.is-wrap-anywhere { overflow-wrap: anywhere; }
2285
+ .aura-tbl__th.is-nowrap, .aura-tbl__td.is-nowrap { white-space: nowrap; }
2257
2286
  @media (min-width: 640px) { .aura-tbl__th, .aura-tbl__td { min-width: 10ch; } }
2258
2287
  .aura-tbl__th:first-child, .aura-tbl__td:first-child { padding-left: var(--aura-space-6); }
2259
2288
  .aura-tbl__th:last-child, .aura-tbl__td:last-child { padding-right: var(--aura-space-6); }
@@ -2287,6 +2316,10 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
2287
2316
  }
2288
2317
  }
2289
2318
  .aura-tbl-wrap.is-sticky-box > .aura-tbl > .aura-tbl__head .aura-tbl__th { top: 0; }
2319
+ /* 5.60 (Chamber-OS 175): a table wider than its box scrolls sideways inside it, and that scroll box is what a sticky
2320
+ * header pins to — so the page offset (the shell bar) pushed the header down over the first row. Such a table can't
2321
+ * pin to the page: its header sits in flow (top 0 in a box that doesn't scroll down). */
2322
+ .aura-tbl-wrap.is-sticky-page.is-wide > .aura-tbl > .aura-tbl__head .aura-tbl__th { top: 0; }
2290
2323
  .aura-tbl-wrap:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; }
2291
2324
  /* 5.13 (Chamber-OS 81): align="middle" centres body and footer cells on their row; bordered={false} drops the frame and
2292
2325
  * the outer cells' side padding, so the table lines up with what's around it (a Card's heading). */
@@ -1103,19 +1103,37 @@ a.aura-tab { text-decoration: none; }
1103
1103
  .aura-actionbar__start > .aura-icon-btn, .aura-actionbar__start > * > .aura-icon-btn:only-child { width: var(--aura-touch-target); height: var(--aura-touch-target); }
1104
1104
  }
1105
1105
 
1106
- /* ---------- Text link (5.59, Chamber-OS 172) ---------- */
1107
- /* linkClass(): a link that reads as text — on an <a> or a <button> alike (a button's chrome is reset: no fill, border
1108
- * or padding, the surrounding font and line height, a pointer). accent (default) or inherit colour; underlined, or
1109
- * only on hover; hover thickens an underline that is always there. Focus is Button's ring. With touchHeight it is at
1110
- * least 44×44 below 640px or on a coarse pointer (or always), the text unchanged — the box grows around the label,
1111
- * centred. For a link on its own line (a row title, "+ Create new event"), not mid-sentence. */
1106
+ /* ---------- Text link (5.59, Chamber-OS 172; 5.60, 173) ---------- */
1107
+ /* linkClass(): a link that reads as text. accent (default) or inherit colour; underlined, or only on hover; hover
1108
+ * thickens an underline that is always there. Focus is Button's ring.
1109
+ * 5.60 (Chamber-OS 173): a link with touchHeight — and any <button> or <summary> with the class — is laid out at every
1110
+ * width, not only under the touch query: inline-flex, centred vertically, a 4px gap before an icon, label at the start,
1111
+ * and min-width 0 / max-width 100% so a truncating child ends in an ellipsis inside its parent. Under the touch query
1112
+ * (or always) it is at least 44×44; a box stretched by its parent keeps its label at the start. A plain <a> without
1113
+ * touchHeight stays inline, so it can wrap in a sentence. The type of an <a> is its own (a type class such as
1114
+ * aura-text-label on it applies); a <button> takes the surrounding font — put a type class on a child there. */
1112
1115
  .aura-link {
1113
- -webkit-appearance: none; appearance: none; margin: 0; padding: 0; border: 0; background: none;
1114
- font: inherit; line-height: inherit; letter-spacing: inherit; word-spacing: inherit; text-align: inherit;
1115
- text-transform: inherit; text-indent: inherit; text-shadow: inherit; cursor: pointer;
1116
1116
  color: var(--aura-fg-accent); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 2px;
1117
- border-radius: var(--aura-radius-xs);
1117
+ border-radius: var(--aura-radius-xs); cursor: pointer;
1118
1118
  }
1119
+ /* the <button> form: its chrome reset so it looks like the <a>. One class strong (0,1,0), so an app's own margin,
1120
+ * padding or font class on the button wins when it comes later. */
1121
+ .aura-link:where(button) {
1122
+ -webkit-appearance: none; appearance: none; margin: 0; padding: 0; border: 0; background: none;
1123
+ font: inherit; line-height: inherit; letter-spacing: inherit; word-spacing: inherit; text-align: inherit;
1124
+ text-transform: inherit; text-indent: inherit; text-shadow: inherit;
1125
+ }
1126
+ /* One class's worth of specificity (0,1,0): it beats an element reset (summary { display: list-item }) and ties with
1127
+ * an app's own class (hidden, block), which wins when it comes later or in a later layer. */
1128
+ .aura-link:where(.aura-link--touch, .aura-link--touch-always, button, summary) {
1129
+ display: inline-flex; align-items: center; justify-content: flex-start; gap: var(--aura-space-1);
1130
+ min-width: 0; max-width: 100%;
1131
+ }
1132
+ /* A leading icon would give the box its baseline (the icon's bottom); centre the box on the line instead (about 1px
1133
+ * either way at any line height). */
1134
+ .aura-link:where(.aura-link--touch, .aura-link--touch-always, button, summary):has(> svg:first-child) { vertical-align: middle; }
1135
+ summary.aura-link { list-style: none; }
1136
+ summary.aura-link::-webkit-details-marker { display: none; }
1119
1137
  .aura-link:hover { text-decoration-thickness: 2px; }
1120
1138
  .aura-link--inherit { color: inherit; }
1121
1139
  .aura-link--hover-underline { text-decoration: none; }
@@ -1128,9 +1146,9 @@ a.aura-tab { text-decoration: none; }
1128
1146
  .aura-link { color: LinkText; }
1129
1147
  .aura-link:is(:disabled, [aria-disabled="true"]) { color: GrayText; }
1130
1148
  }
1131
- .aura-link.aura-link--touch-always { display: inline-flex; align-items: center; justify-content: center; min-height: var(--aura-touch-target); min-width: var(--aura-touch-target); }
1149
+ .aura-link.aura-link--touch-always { min-height: var(--aura-touch-target); min-width: var(--aura-touch-target); }
1132
1150
  @media (max-width: 639.98px), (pointer: coarse) {
1133
- .aura-link.aura-link--touch { display: inline-flex; align-items: center; justify-content: center; min-height: var(--aura-touch-target); min-width: var(--aura-touch-target); }
1151
+ .aura-link.aura-link--touch { min-height: var(--aura-touch-target); min-width: var(--aura-touch-target); }
1134
1152
  }
1135
1153
  /* In a DataTable grid cell the row is the target and the cell clips with an ellipsis: the link stays inline there.
1136
1154
  * In DataTable's stacked cards nothing clips, so the 44px target comes back (container query: right before hydration). */
@@ -1255,9 +1273,13 @@ a.aura-tab { text-decoration: none; }
1255
1273
  * fills it, and icon buttons keep their size. The :has rule is alone so older browsers drop only it.
1256
1274
  * 5.44 (Chamber-OS 149): with an icon button among them (a ⋯ menu) the actions are one bar: the row never wraps,
1257
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. */
1258
1280
  @media (max-width: 639.98px) {
1259
1281
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1260
- .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; }
1261
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; }
1262
1284
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1263
1285
  .aura-page-header--actions-full-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1268,7 +1290,7 @@ a.aura-tab { text-decoration: none; }
1268
1290
  }
1269
1291
  @media (max-width: 767.98px) {
1270
1292
  .aura-page-header--actions-full-below-md > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1271
- .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; }
1272
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; }
1273
1295
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1274
1296
  .aura-page-header--actions-full-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1279,7 +1301,7 @@ a.aura-tab { text-decoration: none; }
1279
1301
  }
1280
1302
  @media (max-width: 1023.98px) {
1281
1303
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions { flex: 1 1 100%; gap: var(--aura-space-3); }
1282
- .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; }
1283
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; }
1284
1306
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1285
1307
  .aura-page-header--actions-full-below-lg > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1302,7 +1324,7 @@ a.aura-tab { text-decoration: none; }
1302
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); }
1303
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); }
1304
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; }
1305
- .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; }
1306
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; }
1307
1329
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1308
1330
  .aura-page-header--actions-bar-below-sm > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -1323,7 +1345,7 @@ a.aura-tab { text-decoration: none; }
1323
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); }
1324
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); }
1325
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; }
1326
- .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; }
1327
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; }
1328
1350
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > .aura-icon-btn { flex: none; }
1329
1351
  .aura-page-header--actions-bar-below-md > .aura-page-header__actions > :has(> .aura-icon-btn) { flex: none; }
@@ -2255,7 +2277,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
2255
2277
  .aura-tbl__caption { caption-side: top; padding: var(--aura-space-4) var(--aura-space-6) var(--aura-space-3); text-align: left; font-size: max(14px, .875rem); font-weight: 600; }
2256
2278
  /* 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
2257
2279
  * email, a URL) still breaks to fit instead of widening the table. Phones keep fitting the box: use stackBelow there. */
2258
- .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; }
2280
+ .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: break-word; }
2281
+ /* 5.60 (Chamber-OS 174): break-word, not anywhere — `anywhere` made every cell's min-content one character wide, so an
2282
+ * auto-layout table squeezed a text column until "Diamond Partnership" broke inside a word. With break-word words wrap
2283
+ * whole; a long unbroken string widens its column (the table scrolls sideways; stacked cards still break it). Td/Th
2284
+ * `wrap`: `anywhere` (the old rule, for URLs and emails that may shrink the column) or `none` (one line; stacked cards
2285
+ * wrap as usual). */
2286
+ .aura-tbl__th.is-wrap-anywhere, .aura-tbl__td.is-wrap-anywhere { overflow-wrap: anywhere; }
2287
+ .aura-tbl__th.is-nowrap, .aura-tbl__td.is-nowrap { white-space: nowrap; }
2259
2288
  @media (min-width: 640px) { .aura-tbl__th, .aura-tbl__td { min-width: 10ch; } }
2260
2289
  .aura-tbl__th:first-child, .aura-tbl__td:first-child { padding-left: var(--aura-space-6); }
2261
2290
  .aura-tbl__th:last-child, .aura-tbl__td:last-child { padding-right: var(--aura-space-6); }
@@ -2289,6 +2318,10 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
2289
2318
  }
2290
2319
  }
2291
2320
  .aura-tbl-wrap.is-sticky-box > .aura-tbl > .aura-tbl__head .aura-tbl__th { top: 0; }
2321
+ /* 5.60 (Chamber-OS 175): a table wider than its box scrolls sideways inside it, and that scroll box is what a sticky
2322
+ * header pins to — so the page offset (the shell bar) pushed the header down over the first row. Such a table can't
2323
+ * pin to the page: its header sits in flow (top 0 in a box that doesn't scroll down). */
2324
+ .aura-tbl-wrap.is-sticky-page.is-wide > .aura-tbl > .aura-tbl__head .aura-tbl__th { top: 0; }
2292
2325
  .aura-tbl-wrap:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; }
2293
2326
  /* 5.13 (Chamber-OS 81): align="middle" centres body and footer cells on their row; bordered={false} drops the frame and
2294
2327
  * the outer cells' side padding, so the table lines up with what's around it (a Card's heading). */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.59.0",
3
+ "version": "5.61.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",