@jirawatpyk/aura-react 5.19.0 → 5.21.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,17 @@ 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.21 — Chamber-OS addendum 21
190
+
191
+ - **Table `rowHeight="density"`** (item 117): every body row is at least the density's row height (48px; 40px compact; 48px on touch screens, as DataTable — unlike the 5.20 cell padding, which stays compact on touch), and its cells' vertical padding shrinks to fit a small Button (7.5px at 48px, 3.5px compact, at most 8px), as in DataTable's `rowHeight="auto"` — so a row with a `sm` Button, an IconButton, a pill or one line of text are all the same height. Content is centred on the row unless you pass `align="top"` (footer cells centre too, as with `align="middle"`). Rows whose text wraps still grow, with the smaller padding. Header and footer row heights, stacked rows and cards (`stackBelow`), and tables without the prop are unchanged.
192
+ - The CSS budget is 27 kB (was 26; 5.19–5.21 added read-only fields, the ActionBar start slot and even rows).
193
+
194
+ ## 5.20 — Chamber-OS addendum 20, items 115–116
195
+
196
+ - **Table follows the page's density** (item 115): without a `density` prop a Table takes the nearest AuraProvider's density, as its docs said — inside `AuraProvider density="compact"` the wrap carries `data-density="compact"` and cells get 8px vertical padding (were 12px). A `density` prop still wins. The padding comes from the nearest `data-density` (a provider, `<html>`, any element, or the table's own), so `comfortable` inside a compact page switches back as it does for fields. As before with an explicit `compact`, cells stay compact on touch screens. A visible change for Tables inside a compact provider or page.
197
+ - **ActionBar `start`** (item 116): buttons at the bar's start edge — Cancel in a wizard — outside the `status` live region. When the bar is 640px or wider (its own width — a bar in a narrow card or dialog counts as narrow) they sit flush with the start edge, the status (if any) next, `children` at the end; narrower, the status takes its own row and the start buttons sit before the actions. In the tab order they come before `children`. Hidden with the actions when a bulk bar is idle; an empty `start` renders nothing.
198
+ - **ActionBar in right-to-left pages**: the actions now sit at the end (left) edge — they used a physical `margin-left`, so a wrapped actions row landed next to the status. The bar is now `width: 100%` and a size container: give it no horizontal margins, and in a shrink-to-fit parent (inline-block, a grid `auto` track, a `max-content` popover) give the parent a width — otherwise the bar falls back to 20rem.
199
+
189
200
  ## 5.19 — Chamber-OS addendum 20
190
201
 
191
202
  - **Switch `readOnly`, `icon` and `aria-describedby`** (item 113): `readOnly` keeps a locked switch in the Tab order with `aria-readonly="true"`, so its name, state and notes are heard; click, Space, its label and its row change nothing. It keeps its colours (a locked "on" reads as on) and loses the pointer. `icon` puts an icon at the end of the row, the field icon's size, in fg-secondary (`icon={<IconLock />}`), hidden from screen readers. `aria-describedby` is merged with the description's id, as on TextField and Select. `disabled` wins over `readOnly`.
@@ -7164,6 +7164,9 @@ window.Aura = (() => {
7164
7164
  const bulk = props.selected != null;
7165
7165
  const idle = bulk && !props.selected;
7166
7166
  const count = bulk && props.selected ? t.selectedCount(props.selected) : null;
7167
+ const hasStart = React42.Children.toArray(props.start).some(function(c) {
7168
+ return c !== "";
7169
+ });
7167
7170
  const cameFrom = React42.useRef(null);
7168
7171
  const own = React42.useRef(null);
7169
7172
  function clear() {
@@ -7195,7 +7198,7 @@ window.Aura = (() => {
7195
7198
  props.className
7196
7199
  )
7197
7200
  },
7198
- /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__inner" }, /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__status", role: "status" }, count, count && props.status ? " \xB7 " : null, props.status), !idle ? /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__actions" }, count && props.onClearSelection ? /* @__PURE__ */ React42.createElement(Button, { variant: "ghost", size: "sm", onClick: clear }, t.clear()) : null, props.children) : null)
7201
+ /* @__PURE__ */ React42.createElement("div", { className: cx("aura-actionbar__inner", hasStart && "has-start") }, /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__status", role: "status" }, count, count && props.status ? " \xB7 " : null, props.status), !idle && hasStart ? /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__start" }, props.start) : null, !idle ? /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__actions" }, count && props.onClearSelection ? /* @__PURE__ */ React42.createElement(Button, { variant: "ghost", size: "sm", onClick: clear }, t.clear()) : null, props.children) : null)
7199
7202
  );
7200
7203
  });
7201
7204
 
@@ -7264,7 +7267,19 @@ window.Aura = (() => {
7264
7267
  return out;
7265
7268
  }
7266
7269
  var Table = React44.forwardRef(function Table2(props, ref) {
7267
- const { caption, captionHidden, density, stackBelow, align, bordered, stackStyle, className, children, ...rest } = props;
7270
+ const {
7271
+ caption,
7272
+ captionHidden,
7273
+ density,
7274
+ stackBelow,
7275
+ align,
7276
+ bordered,
7277
+ stackStyle,
7278
+ rowHeight,
7279
+ className,
7280
+ children,
7281
+ ...rest
7282
+ } = props;
7268
7283
  const cards = !!stackBelow && stackStyle === "cards";
7269
7284
  const labels = stackBelow ? headerLabels(children) : null;
7270
7285
  if (labels && !labels.length)
@@ -7273,6 +7288,7 @@ window.Aura = (() => {
7273
7288
  "Table stackBelow: no THead > Tr > Th found among its children, so cells have no labels. Pass `label` on each Td."
7274
7289
  );
7275
7290
  const outer = React44.useContext(StackLabels);
7291
+ const pageDensity = useDensity();
7276
7292
  const capId = uid();
7277
7293
  const wrap = React44.useRef(null);
7278
7294
  const sc = React44.useState(false), scrolls = sc[0];
@@ -7294,7 +7310,7 @@ window.Aura = (() => {
7294
7310
  {
7295
7311
  ref: wrap,
7296
7312
  className: cx("aura-tbl-wrap", stackBelow && "is-stackable", bordered === false && "is-flush"),
7297
- "data-density": density,
7313
+ "data-density": density || pageDensity,
7298
7314
  tabIndex: scrolls ? 0 : void 0,
7299
7315
  role: scrolls && (caption != null || rest["aria-label"]) ? "region" : void 0,
7300
7316
  "aria-labelledby": scrolls && caption != null ? capId : void 0,
@@ -7307,7 +7323,9 @@ window.Aura = (() => {
7307
7323
  className: cx(
7308
7324
  "aura-tbl",
7309
7325
  stackBelow && "aura-tbl--stack-" + stackBelow,
7310
- align === "middle" && "aura-tbl--middle",
7326
+ /* 5.21: even rows centre their content, as DataTable's auto rows do, unless `align="top"` is asked for. */
7327
+ (align === "middle" || rowHeight === "density" && align !== "top") && "aura-tbl--middle",
7328
+ rowHeight === "density" && "aura-tbl--row-density",
7311
7329
  cards && "aura-tbl--cards",
7312
7330
  className
7313
7331
  ),
@@ -7146,6 +7146,9 @@ var ActionBar = React42.forwardRef(function ActionBar2(props, ref) {
7146
7146
  const bulk = props.selected != null;
7147
7147
  const idle = bulk && !props.selected;
7148
7148
  const count = bulk && props.selected ? t.selectedCount(props.selected) : null;
7149
+ const hasStart = React42.Children.toArray(props.start).some(function(c) {
7150
+ return c !== "";
7151
+ });
7149
7152
  const cameFrom = React42.useRef(null);
7150
7153
  const own = React42.useRef(null);
7151
7154
  function clear() {
@@ -7177,7 +7180,7 @@ var ActionBar = React42.forwardRef(function ActionBar2(props, ref) {
7177
7180
  props.className
7178
7181
  )
7179
7182
  },
7180
- /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__inner" }, /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__status", role: "status" }, count, count && props.status ? " \xB7 " : null, props.status), !idle ? /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__actions" }, count && props.onClearSelection ? /* @__PURE__ */ React42.createElement(Button, { variant: "ghost", size: "sm", onClick: clear }, t.clear()) : null, props.children) : null)
7183
+ /* @__PURE__ */ React42.createElement("div", { className: cx("aura-actionbar__inner", hasStart && "has-start") }, /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__status", role: "status" }, count, count && props.status ? " \xB7 " : null, props.status), !idle && hasStart ? /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__start" }, props.start) : null, !idle ? /* @__PURE__ */ React42.createElement("div", { className: "aura-actionbar__actions" }, count && props.onClearSelection ? /* @__PURE__ */ React42.createElement(Button, { variant: "ghost", size: "sm", onClick: clear }, t.clear()) : null, props.children) : null)
7181
7184
  );
7182
7185
  });
7183
7186
 
@@ -7246,7 +7249,19 @@ function headerLabels(children) {
7246
7249
  return out;
7247
7250
  }
7248
7251
  var Table = React44.forwardRef(function Table2(props, ref) {
7249
- const { caption, captionHidden, density, stackBelow, align, bordered, stackStyle, className, children, ...rest } = props;
7252
+ const {
7253
+ caption,
7254
+ captionHidden,
7255
+ density,
7256
+ stackBelow,
7257
+ align,
7258
+ bordered,
7259
+ stackStyle,
7260
+ rowHeight,
7261
+ className,
7262
+ children,
7263
+ ...rest
7264
+ } = props;
7250
7265
  const cards = !!stackBelow && stackStyle === "cards";
7251
7266
  const labels = stackBelow ? headerLabels(children) : null;
7252
7267
  if (labels && !labels.length)
@@ -7255,6 +7270,7 @@ var Table = React44.forwardRef(function Table2(props, ref) {
7255
7270
  "Table stackBelow: no THead > Tr > Th found among its children, so cells have no labels. Pass `label` on each Td."
7256
7271
  );
7257
7272
  const outer = React44.useContext(StackLabels);
7273
+ const pageDensity = useDensity();
7258
7274
  const capId = uid();
7259
7275
  const wrap = React44.useRef(null);
7260
7276
  const sc = React44.useState(false), scrolls = sc[0];
@@ -7276,7 +7292,7 @@ var Table = React44.forwardRef(function Table2(props, ref) {
7276
7292
  {
7277
7293
  ref: wrap,
7278
7294
  className: cx("aura-tbl-wrap", stackBelow && "is-stackable", bordered === false && "is-flush"),
7279
- "data-density": density,
7295
+ "data-density": density || pageDensity,
7280
7296
  tabIndex: scrolls ? 0 : void 0,
7281
7297
  role: scrolls && (caption != null || rest["aria-label"]) ? "region" : void 0,
7282
7298
  "aria-labelledby": scrolls && caption != null ? capId : void 0,
@@ -7289,7 +7305,9 @@ var Table = React44.forwardRef(function Table2(props, ref) {
7289
7305
  className: cx(
7290
7306
  "aura-tbl",
7291
7307
  stackBelow && "aura-tbl--stack-" + stackBelow,
7292
- align === "middle" && "aura-tbl--middle",
7308
+ /* 5.21: even rows centre their content, as DataTable's auto rows do, unless `align="top"` is asked for. */
7309
+ (align === "middle" || rowHeight === "density" && align !== "top") && "aura-tbl--middle",
7310
+ rowHeight === "density" && "aura-tbl--row-density",
7293
7311
  cards && "aura-tbl--cards",
7294
7312
  className
7295
7313
  ),
@@ -8,6 +8,9 @@ const ActionBar = React.forwardRef(function ActionBar2(props, ref) {
8
8
  const bulk = props.selected != null;
9
9
  const idle = bulk && !props.selected;
10
10
  const count = bulk && props.selected ? t.selectedCount(props.selected) : null;
11
+ const hasStart = React.Children.toArray(props.start).some(function(c) {
12
+ return c !== "";
13
+ });
11
14
  const cameFrom = React.useRef(null);
12
15
  const own = React.useRef(null);
13
16
  function clear() {
@@ -39,7 +42,7 @@ const ActionBar = React.forwardRef(function ActionBar2(props, ref) {
39
42
  props.className
40
43
  )
41
44
  },
42
- /* @__PURE__ */ React.createElement("div", { className: "aura-actionbar__inner" }, /* @__PURE__ */ React.createElement("div", { className: "aura-actionbar__status", role: "status" }, count, count && props.status ? " \xB7 " : null, props.status), !idle ? /* @__PURE__ */ React.createElement("div", { className: "aura-actionbar__actions" }, count && props.onClearSelection ? /* @__PURE__ */ React.createElement(Button, { variant: "ghost", size: "sm", onClick: clear }, t.clear()) : null, props.children) : null)
45
+ /* @__PURE__ */ React.createElement("div", { className: cx("aura-actionbar__inner", hasStart && "has-start") }, /* @__PURE__ */ React.createElement("div", { className: "aura-actionbar__status", role: "status" }, count, count && props.status ? " \xB7 " : null, props.status), !idle && hasStart ? /* @__PURE__ */ React.createElement("div", { className: "aura-actionbar__start" }, props.start) : null, !idle ? /* @__PURE__ */ React.createElement("div", { className: "aura-actionbar__actions" }, count && props.onClearSelection ? /* @__PURE__ */ React.createElement(Button, { variant: "ghost", size: "sm", onClick: clear }, t.clear()) : null, props.children) : null)
43
46
  );
44
47
  });
45
48
  export {
package/dist/esm/Table.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import * as React from "react";
3
3
  import { cx, devWarnOnce, uid, useIsoLayoutEffect } from "./internal.js";
4
+ import { useDensity } from "./locale.js";
4
5
  const StackLabels = React.createContext(null);
5
6
  const ColumnIndex = React.createContext(-1);
6
7
  function flat(children) {
@@ -47,7 +48,19 @@ function headerLabels(children) {
47
48
  return out;
48
49
  }
49
50
  const Table = React.forwardRef(function Table2(props, ref) {
50
- const { caption, captionHidden, density, stackBelow, align, bordered, stackStyle, className, children, ...rest } = props;
51
+ const {
52
+ caption,
53
+ captionHidden,
54
+ density,
55
+ stackBelow,
56
+ align,
57
+ bordered,
58
+ stackStyle,
59
+ rowHeight,
60
+ className,
61
+ children,
62
+ ...rest
63
+ } = props;
51
64
  const cards = !!stackBelow && stackStyle === "cards";
52
65
  const labels = stackBelow ? headerLabels(children) : null;
53
66
  if (labels && !labels.length)
@@ -56,6 +69,7 @@ const Table = React.forwardRef(function Table2(props, ref) {
56
69
  "Table stackBelow: no THead > Tr > Th found among its children, so cells have no labels. Pass `label` on each Td."
57
70
  );
58
71
  const outer = React.useContext(StackLabels);
72
+ const pageDensity = useDensity();
59
73
  const capId = uid();
60
74
  const wrap = React.useRef(null);
61
75
  const sc = React.useState(false), scrolls = sc[0];
@@ -77,7 +91,7 @@ const Table = React.forwardRef(function Table2(props, ref) {
77
91
  {
78
92
  ref: wrap,
79
93
  className: cx("aura-tbl-wrap", stackBelow && "is-stackable", bordered === false && "is-flush"),
80
- "data-density": density,
94
+ "data-density": density || pageDensity,
81
95
  tabIndex: scrolls ? 0 : void 0,
82
96
  role: scrolls && (caption != null || rest["aria-label"]) ? "region" : void 0,
83
97
  "aria-labelledby": scrolls && caption != null ? capId : void 0,
@@ -90,7 +104,9 @@ const Table = React.forwardRef(function Table2(props, ref) {
90
104
  className: cx(
91
105
  "aura-tbl",
92
106
  stackBelow && "aura-tbl--stack-" + stackBelow,
93
- align === "middle" && "aura-tbl--middle",
107
+ /* 5.21: even rows centre their content, as DataTable's auto rows do, unless `align="top"` is asked for. */
108
+ (align === "middle" || rowHeight === "density" && align !== "top") && "aura-tbl--middle",
109
+ rowHeight === "density" && "aura-tbl--row-density",
94
110
  cards && "aura-tbl--cards",
95
111
  className
96
112
  ),
package/dist/index.d.cts CHANGED
@@ -1147,6 +1147,12 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
1147
1147
  * each row its own framed card, spaced like DataTable's cards, with no frame around them. From the `stackBelow`
1148
1148
  * width up the table is unchanged. The table then sits in one more `div` (`.aura-tbl-cards`). */
1149
1149
  stackStyle?: "list" | "cards" | undefined;
1150
+ /** `'density'` (5.21, Chamber-OS 117): every body row is at least the density's row height (48px, 40px compact,
1151
+ * 48px on touch screens, as DataTable) and its cells' vertical padding shrinks to fit a small Button — so a row with
1152
+ * a `sm` Button, an IconButton, a pill or one line of text are all the same height, as in DataTable's
1153
+ * `rowHeight="auto"`. Content is centred on the row unless `align="top"`. Rows whose text wraps still grow (with the
1154
+ * smaller padding). Header and footer rows, and stacked rows (`stackBelow`), are unchanged. */
1155
+ rowHeight?: "density" | undefined;
1150
1156
  className?: string | undefined;
1151
1157
  children?: React$1.ReactNode | undefined;
1152
1158
  }
@@ -1176,6 +1182,10 @@ export interface TableCellProps extends Omit<React$1.TdHTMLAttributes<HTMLTableC
1176
1182
  export interface ActionBarProps {
1177
1183
  /** Buttons, right-aligned (the primary one last). */
1178
1184
  children?: React$1.ReactNode | undefined;
1185
+ /** 5.20 (Chamber-OS 116): buttons at the start edge — Cancel in a wizard — outside the `status` live region. When
1186
+ * the bar itself is 640px or wider they sit flush with its start edge and `children` at its end; in a narrower bar a
1187
+ * status line takes its own row and they sit before the actions. In the tab order they come before `children`. */
1188
+ start?: React$1.ReactNode | undefined;
1179
1189
  /** A short line such as "Total 107,000.00 THB · due Oct 22, 2026" or "Unsaved changes". It sits in a polite live
1180
1190
  * region that is always in the page, so a change is announced. */
1181
1191
  status?: React$1.ReactNode | undefined;
package/dist/index.d.ts CHANGED
@@ -1147,6 +1147,12 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
1147
1147
  * each row its own framed card, spaced like DataTable's cards, with no frame around them. From the `stackBelow`
1148
1148
  * width up the table is unchanged. The table then sits in one more `div` (`.aura-tbl-cards`). */
1149
1149
  stackStyle?: "list" | "cards" | undefined;
1150
+ /** `'density'` (5.21, Chamber-OS 117): every body row is at least the density's row height (48px, 40px compact,
1151
+ * 48px on touch screens, as DataTable) and its cells' vertical padding shrinks to fit a small Button — so a row with
1152
+ * a `sm` Button, an IconButton, a pill or one line of text are all the same height, as in DataTable's
1153
+ * `rowHeight="auto"`. Content is centred on the row unless `align="top"`. Rows whose text wraps still grow (with the
1154
+ * smaller padding). Header and footer rows, and stacked rows (`stackBelow`), are unchanged. */
1155
+ rowHeight?: "density" | undefined;
1150
1156
  className?: string | undefined;
1151
1157
  children?: React$1.ReactNode | undefined;
1152
1158
  }
@@ -1176,6 +1182,10 @@ export interface TableCellProps extends Omit<React$1.TdHTMLAttributes<HTMLTableC
1176
1182
  export interface ActionBarProps {
1177
1183
  /** Buttons, right-aligned (the primary one last). */
1178
1184
  children?: React$1.ReactNode | undefined;
1185
+ /** 5.20 (Chamber-OS 116): buttons at the start edge — Cancel in a wizard — outside the `status` live region. When
1186
+ * the bar itself is 640px or wider they sit flush with its start edge and `children` at its end; in a narrower bar a
1187
+ * status line takes its own row and they sit before the actions. In the tab order they come before `children`. */
1188
+ start?: React$1.ReactNode | undefined;
1179
1189
  /** A short line such as "Total 107,000.00 THB · due Oct 22, 2026" or "Unsaved changes". It sits in a polite live
1180
1190
  * region that is always in the page, so a change is announced. */
1181
1191
  status?: React$1.ReactNode | undefined;
package/dist/styles.css CHANGED
@@ -1574,10 +1574,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1574
1574
  [data-density='compact'] {
1575
1575
  --aura-input-height: 36px; --aura-button-height: 36px; --aura-table-row-height: 40px;
1576
1576
  --aura-button-padding-x: var(--aura-space-4);
1577
+ /* 5.20 (Chamber-OS 115): a static Table's vertical cell padding, and its stacked cards', inherited from the nearest
1578
+ * density — a provider's wrapper, <html>, or the table's own wrap — so "comfortable" inside compact switches back. */
1579
+ --aura-tbl-cell-py: var(--aura-space-2); --aura-tbl-card-py: var(--aura-space-2);
1577
1580
  }
1578
1581
  [data-density='comfortable'] {
1579
1582
  --aura-input-height: 44px; --aura-button-height: 44px; --aura-table-row-height: 48px;
1580
1583
  --aura-button-padding-x: var(--aura-space-6);
1584
+ --aura-tbl-cell-py: var(--aura-space-3); --aura-tbl-card-py: var(--aura-space-4);
1581
1585
  }
1582
1586
  @media (pointer: coarse) {
1583
1587
  [data-density='compact'] { --aura-input-height: 44px; --aura-button-height: 44px; --aura-table-row-height: 48px; --aura-button-padding-x: var(--aura-space-6); }
@@ -1636,20 +1640,31 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1636
1640
 
1637
1641
  /* ---------- 4.19: ActionBar ---------- */
1638
1642
  /* Sticky, not fixed: it keeps its place at the end of its parent, so it never covers the last field. */
1639
- .aura-actionbar { position: sticky; z-index: var(--aura-z-bar); box-sizing: border-box; background: var(--aura-bg-surface); color: var(--aura-fg-primary); font-family: var(--font-sans); }
1643
+ .aura-actionbar { position: sticky; z-index: var(--aura-z-bar); box-sizing: border-box; width: 100%; container: aura-actionbar / inline-size; contain-intrinsic-inline-size: auto 20rem; /* 5.20: its own width decides its layout (a bar in a card or dialog); a size container can't size to its content, so in a shrink-to-fit parent it falls back to 20rem */ background: var(--aura-bg-surface); color: var(--aura-fg-primary); font-family: var(--font-sans); }
1640
1644
  .aura-actionbar--viewport {
1641
1645
  bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px)));
1642
1646
  margin-top: var(--aura-space-6);
1643
1647
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay);
1644
1648
  }
1645
1649
  .aura-actionbar--container { bottom: 0; border-top: 1px solid var(--aura-border-default); }
1646
- .aura-actionbar__inner { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2) var(--aura-space-3); min-height: 60px; box-sizing: border-box; padding: var(--aura-space-2) var(--aura-space-3) var(--aura-space-2) var(--aura-space-4); }
1650
+ .aura-actionbar__inner { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2) var(--aura-space-3); min-height: 60px; box-sizing: border-box; padding-block: var(--aura-space-2); padding-inline: var(--aura-space-4) var(--aura-space-3); }
1647
1651
  .aura-actionbar__status { flex: 1 1 8rem; min-width: 0; font-size: 14px; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; }
1648
1652
  .aura-actionbar__status:empty { flex-basis: 0; }
1649
- .aura-actionbar__actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--aura-space-2); margin-left: auto; }
1653
+ /* 5.20: an empty status leaves the row (it would still take a gap and push the start slot away from its edge) but
1654
+ * stays in the page as a live region, so the next status is announced. */
1655
+ .aura-actionbar__inner.has-start > .aura-actionbar__status:empty { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
1656
+ .aura-actionbar__actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--aura-space-2); margin-inline-start: auto; }
1650
1657
  /* Bulk bar with nothing selected: out of sight and out of the tab order, its live region still in the page. */
1651
1658
  .aura-actionbar.is-idle { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; box-shadow: none; }
1652
- .aura-actionbar--container > .aura-actionbar__inner { padding-left: 0; padding-right: 0; }
1659
+ .aura-actionbar--container > .aura-actionbar__inner { padding-inline: 0; }
1660
+ /* 5.20 (Chamber-OS 116): the start slot. After the status in the markup, so Tab reaches it before the actions (the
1661
+ * status is a live region, not focusable, so only reading order differs); when the bar is 640px or wider it moves to
1662
+ * the start edge, the status (if any) between. Narrower bars — a phone, a card, a dialog — put a status line on its own
1663
+ * row, so the start slot and the actions stay together on the next. */
1664
+ .aura-actionbar__start { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); }
1665
+ .aura-actionbar__start:empty { display: none; }
1666
+ @container aura-actionbar (min-width: 640px) { .aura-actionbar__start { order: -1; } }
1667
+ @container aura-actionbar (max-width: 639.98px) { .aura-actionbar__inner.has-start > .aura-actionbar__status:not(:empty) { flex-basis: 100%; } }
1653
1668
 
1654
1669
  /* ---------- 4.20: Separator ---------- */
1655
1670
  .aura-separator { flex: none; align-self: stretch; height: 1px; margin: var(--aura-separator-space, 0) 0; background: var(--aura-border-default); border: 0; }
@@ -1663,7 +1678,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1663
1678
  }
1664
1679
  .aura-tbl { width: 100%; border-collapse: collapse; border-spacing: 0; font-size: 13px; line-height: 20px; }
1665
1680
  .aura-tbl__caption { caption-side: top; padding: var(--aura-space-4) var(--aura-space-6) 0; text-align: left; font-size: 14px; font-weight: 600; }
1666
- .aura-tbl__th, .aura-tbl__td { padding: var(--aura-space-3) var(--aura-space-4); text-align: left; vertical-align: top; overflow-wrap: anywhere; }
1681
+ .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; }
1667
1682
  .aura-tbl__th:first-child, .aura-tbl__td:first-child { padding-left: var(--aura-space-6); }
1668
1683
  .aura-tbl__th:last-child, .aura-tbl__td:last-child { padding-right: var(--aura-space-6); }
1669
1684
  .aura-tbl__head .aura-tbl__th {
@@ -1678,11 +1693,18 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1678
1693
  .aura-tbl .is-end { text-align: right; }
1679
1694
  .aura-tbl .is-center { text-align: center; }
1680
1695
  .aura-tbl .is-numeric { font-variant-numeric: tabular-nums; white-space: nowrap; }
1681
- .aura-tbl-wrap[data-density='compact'] .aura-tbl__th, .aura-tbl-wrap[data-density='compact'] .aura-tbl__td { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1682
1696
  .aura-tbl-wrap:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; }
1683
1697
  /* 5.13 (Chamber-OS 81): align="middle" centres body and footer cells on their row; bordered={false} drops the frame and
1684
1698
  * the outer cells' side padding, so the table lines up with what's around it (a Card's heading). */
1685
1699
  .aura-tbl--middle > .aura-tbl__body > .aura-tbl__row > *, .aura-tbl--middle > .aura-tbl__foot > .aura-tbl__row > * { vertical-align: middle; }
1700
+ /* 5.21 (Chamber-OS 117) rowHeight="density": a body row is at least the density's row height (a table row's height is
1701
+ * a minimum), and its cells' padding shrinks so a 32px small Button still fits it — 7.5px above and below at 48px,
1702
+ * 3.5px compact, never more than 8px — as in DataTable's auto rows. Before the stacked rules, which undo it. */
1703
+ .aura-tbl--row-density > .aura-tbl__body > .aura-tbl__row { height: var(--aura-table-row-height); }
1704
+ .aura-tbl--row-density > .aura-tbl__body > .aura-tbl__row > * {
1705
+ --aura-tbl-row-py: clamp(0px, calc((var(--aura-table-row-height) - 1px - var(--aura-button-height-sm)) / 2), var(--aura-space-2));
1706
+ padding-top: var(--aura-tbl-row-py); padding-bottom: var(--aura-tbl-row-py);
1707
+ }
1686
1708
  .aura-tbl-wrap.is-flush { border: 0; border-radius: 0; background: transparent; }
1687
1709
  .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: 0; }
1688
1710
  .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: 0; }
@@ -1695,8 +1717,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1695
1717
  .aura-tbl--stack-md, .aura-tbl--stack-md > .aura-tbl__body, .aura-tbl--stack-md > .aura-tbl__foot, .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { display: block; }
1696
1718
  .aura-tbl--stack-md > .aura-tbl__head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
1697
1719
  .aura-tbl--stack-md > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) 0; }
1698
- .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { padding: var(--aura-space-3) var(--aura-space-4); }
1699
- .aura-tbl-wrap[data-density='compact'] > .aura-tbl--stack-md > * > .aura-tbl__row { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1720
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { height: auto; padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); }
1700
1721
  .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row + .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row:first-child { border-top: 1px solid var(--aura-border-default); }
1701
1722
  .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
1702
1723
  .aura-tbl--stack-md > * > .aura-tbl__row > * + * { margin-top: var(--aura-space-2); }
@@ -1718,8 +1739,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1718
1739
  .aura-tbl--stack-sm, .aura-tbl--stack-sm > .aura-tbl__body, .aura-tbl--stack-sm > .aura-tbl__foot, .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { display: block; }
1719
1740
  .aura-tbl--stack-sm > .aura-tbl__head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
1720
1741
  .aura-tbl--stack-sm > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) 0; }
1721
- .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { padding: var(--aura-space-3) var(--aura-space-4); }
1722
- .aura-tbl-wrap[data-density='compact'] > .aura-tbl--stack-sm > * > .aura-tbl__row { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1742
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { height: auto; padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); }
1723
1743
  .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row + .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row:first-child { border-top: 1px solid var(--aura-border-default); }
1724
1744
  .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
1725
1745
  .aura-tbl--stack-sm > * > .aura-tbl__row > * + * { margin-top: var(--aura-space-2); }
@@ -1745,24 +1765,22 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1745
1765
  .aura-tbl-cards--md > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1746
1766
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1747
1767
  .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 {
1748
- margin-bottom: var(--aura-space-2); padding: var(--aura-space-4);
1768
+ margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
1749
1769
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1750
1770
  }
1751
1771
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1752
1772
  .aura-tbl--cards.aura-tbl--stack-md > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1753
- .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); }
1754
1773
  .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1755
1774
  }
1756
1775
  @container aura-tbl (width < 640px) {
1757
1776
  .aura-tbl-cards--sm > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1758
1777
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1759
1778
  .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 {
1760
- margin-bottom: var(--aura-space-2); padding: var(--aura-space-4);
1779
+ margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
1761
1780
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1762
1781
  }
1763
1782
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1764
1783
  .aura-tbl--cards.aura-tbl--stack-sm > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1765
- .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); }
1766
1784
  .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1767
1785
  }
1768
1786
 
@@ -1576,10 +1576,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1576
1576
  [data-density='compact'] {
1577
1577
  --aura-input-height: 36px; --aura-button-height: 36px; --aura-table-row-height: 40px;
1578
1578
  --aura-button-padding-x: var(--aura-space-4);
1579
+ /* 5.20 (Chamber-OS 115): a static Table's vertical cell padding, and its stacked cards', inherited from the nearest
1580
+ * density — a provider's wrapper, <html>, or the table's own wrap — so "comfortable" inside compact switches back. */
1581
+ --aura-tbl-cell-py: var(--aura-space-2); --aura-tbl-card-py: var(--aura-space-2);
1579
1582
  }
1580
1583
  [data-density='comfortable'] {
1581
1584
  --aura-input-height: 44px; --aura-button-height: 44px; --aura-table-row-height: 48px;
1582
1585
  --aura-button-padding-x: var(--aura-space-6);
1586
+ --aura-tbl-cell-py: var(--aura-space-3); --aura-tbl-card-py: var(--aura-space-4);
1583
1587
  }
1584
1588
  @media (pointer: coarse) {
1585
1589
  [data-density='compact'] { --aura-input-height: 44px; --aura-button-height: 44px; --aura-table-row-height: 48px; --aura-button-padding-x: var(--aura-space-6); }
@@ -1638,20 +1642,31 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1638
1642
 
1639
1643
  /* ---------- 4.19: ActionBar ---------- */
1640
1644
  /* Sticky, not fixed: it keeps its place at the end of its parent, so it never covers the last field. */
1641
- .aura-actionbar { position: sticky; z-index: var(--aura-z-bar); box-sizing: border-box; background: var(--aura-bg-surface); color: var(--aura-fg-primary); font-family: var(--font-sans); }
1645
+ .aura-actionbar { position: sticky; z-index: var(--aura-z-bar); box-sizing: border-box; width: 100%; container: aura-actionbar / inline-size; contain-intrinsic-inline-size: auto 20rem; /* 5.20: its own width decides its layout (a bar in a card or dialog); a size container can't size to its content, so in a shrink-to-fit parent it falls back to 20rem */ background: var(--aura-bg-surface); color: var(--aura-fg-primary); font-family: var(--font-sans); }
1642
1646
  .aura-actionbar--viewport {
1643
1647
  bottom: calc(var(--aura-bottomnav-offset, 0px) + max(var(--aura-space-3), env(safe-area-inset-bottom, 0px)));
1644
1648
  margin-top: var(--aura-space-6);
1645
1649
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); box-shadow: var(--aura-shadow-overlay);
1646
1650
  }
1647
1651
  .aura-actionbar--container { bottom: 0; border-top: 1px solid var(--aura-border-default); }
1648
- .aura-actionbar__inner { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2) var(--aura-space-3); min-height: 60px; box-sizing: border-box; padding: var(--aura-space-2) var(--aura-space-3) var(--aura-space-2) var(--aura-space-4); }
1652
+ .aura-actionbar__inner { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2) var(--aura-space-3); min-height: 60px; box-sizing: border-box; padding-block: var(--aura-space-2); padding-inline: var(--aura-space-4) var(--aura-space-3); }
1649
1653
  .aura-actionbar__status { flex: 1 1 8rem; min-width: 0; font-size: 14px; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; }
1650
1654
  .aura-actionbar__status:empty { flex-basis: 0; }
1651
- .aura-actionbar__actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--aura-space-2); margin-left: auto; }
1655
+ /* 5.20: an empty status leaves the row (it would still take a gap and push the start slot away from its edge) but
1656
+ * stays in the page as a live region, so the next status is announced. */
1657
+ .aura-actionbar__inner.has-start > .aura-actionbar__status:empty { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
1658
+ .aura-actionbar__actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--aura-space-2); margin-inline-start: auto; }
1652
1659
  /* Bulk bar with nothing selected: out of sight and out of the tab order, its live region still in the page. */
1653
1660
  .aura-actionbar.is-idle { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; box-shadow: none; }
1654
- .aura-actionbar--container > .aura-actionbar__inner { padding-left: 0; padding-right: 0; }
1661
+ .aura-actionbar--container > .aura-actionbar__inner { padding-inline: 0; }
1662
+ /* 5.20 (Chamber-OS 116): the start slot. After the status in the markup, so Tab reaches it before the actions (the
1663
+ * status is a live region, not focusable, so only reading order differs); when the bar is 640px or wider it moves to
1664
+ * the start edge, the status (if any) between. Narrower bars — a phone, a card, a dialog — put a status line on its own
1665
+ * row, so the start slot and the actions stay together on the next. */
1666
+ .aura-actionbar__start { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); }
1667
+ .aura-actionbar__start:empty { display: none; }
1668
+ @container aura-actionbar (min-width: 640px) { .aura-actionbar__start { order: -1; } }
1669
+ @container aura-actionbar (max-width: 639.98px) { .aura-actionbar__inner.has-start > .aura-actionbar__status:not(:empty) { flex-basis: 100%; } }
1655
1670
 
1656
1671
  /* ---------- 4.20: Separator ---------- */
1657
1672
  .aura-separator { flex: none; align-self: stretch; height: 1px; margin: var(--aura-separator-space, 0) 0; background: var(--aura-border-default); border: 0; }
@@ -1665,7 +1680,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1665
1680
  }
1666
1681
  .aura-tbl { width: 100%; border-collapse: collapse; border-spacing: 0; font-size: 13px; line-height: 20px; }
1667
1682
  .aura-tbl__caption { caption-side: top; padding: var(--aura-space-4) var(--aura-space-6) 0; text-align: left; font-size: 14px; font-weight: 600; }
1668
- .aura-tbl__th, .aura-tbl__td { padding: var(--aura-space-3) var(--aura-space-4); text-align: left; vertical-align: top; overflow-wrap: anywhere; }
1683
+ .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; }
1669
1684
  .aura-tbl__th:first-child, .aura-tbl__td:first-child { padding-left: var(--aura-space-6); }
1670
1685
  .aura-tbl__th:last-child, .aura-tbl__td:last-child { padding-right: var(--aura-space-6); }
1671
1686
  .aura-tbl__head .aura-tbl__th {
@@ -1680,11 +1695,18 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1680
1695
  .aura-tbl .is-end { text-align: right; }
1681
1696
  .aura-tbl .is-center { text-align: center; }
1682
1697
  .aura-tbl .is-numeric { font-variant-numeric: tabular-nums; white-space: nowrap; }
1683
- .aura-tbl-wrap[data-density='compact'] .aura-tbl__th, .aura-tbl-wrap[data-density='compact'] .aura-tbl__td { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1684
1698
  .aura-tbl-wrap:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; }
1685
1699
  /* 5.13 (Chamber-OS 81): align="middle" centres body and footer cells on their row; bordered={false} drops the frame and
1686
1700
  * the outer cells' side padding, so the table lines up with what's around it (a Card's heading). */
1687
1701
  .aura-tbl--middle > .aura-tbl__body > .aura-tbl__row > *, .aura-tbl--middle > .aura-tbl__foot > .aura-tbl__row > * { vertical-align: middle; }
1702
+ /* 5.21 (Chamber-OS 117) rowHeight="density": a body row is at least the density's row height (a table row's height is
1703
+ * a minimum), and its cells' padding shrinks so a 32px small Button still fits it — 7.5px above and below at 48px,
1704
+ * 3.5px compact, never more than 8px — as in DataTable's auto rows. Before the stacked rules, which undo it. */
1705
+ .aura-tbl--row-density > .aura-tbl__body > .aura-tbl__row { height: var(--aura-table-row-height); }
1706
+ .aura-tbl--row-density > .aura-tbl__body > .aura-tbl__row > * {
1707
+ --aura-tbl-row-py: clamp(0px, calc((var(--aura-table-row-height) - 1px - var(--aura-button-height-sm)) / 2), var(--aura-space-2));
1708
+ padding-top: var(--aura-tbl-row-py); padding-bottom: var(--aura-tbl-row-py);
1709
+ }
1688
1710
  .aura-tbl-wrap.is-flush { border: 0; border-radius: 0; background: transparent; }
1689
1711
  .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: 0; }
1690
1712
  .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: 0; }
@@ -1697,8 +1719,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1697
1719
  .aura-tbl--stack-md, .aura-tbl--stack-md > .aura-tbl__body, .aura-tbl--stack-md > .aura-tbl__foot, .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { display: block; }
1698
1720
  .aura-tbl--stack-md > .aura-tbl__head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
1699
1721
  .aura-tbl--stack-md > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) 0; }
1700
- .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { padding: var(--aura-space-3) var(--aura-space-4); }
1701
- .aura-tbl-wrap[data-density='compact'] > .aura-tbl--stack-md > * > .aura-tbl__row { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1722
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { height: auto; padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); }
1702
1723
  .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row + .aura-tbl__row, .aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row:first-child { border-top: 1px solid var(--aura-border-default); }
1703
1724
  .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
1704
1725
  .aura-tbl--stack-md > * > .aura-tbl__row > * + * { margin-top: var(--aura-space-2); }
@@ -1720,8 +1741,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1720
1741
  .aura-tbl--stack-sm, .aura-tbl--stack-sm > .aura-tbl__body, .aura-tbl--stack-sm > .aura-tbl__foot, .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { display: block; }
1721
1742
  .aura-tbl--stack-sm > .aura-tbl__head { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
1722
1743
  .aura-tbl--stack-sm > .aura-tbl__caption { display: block; padding: var(--aura-space-4) var(--aura-space-4) 0; }
1723
- .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { padding: var(--aura-space-3) var(--aura-space-4); }
1724
- .aura-tbl-wrap[data-density='compact'] > .aura-tbl--stack-sm > * > .aura-tbl__row { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1744
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { height: auto; padding: var(--aura-tbl-cell-py, var(--aura-space-3)) var(--aura-space-4); }
1725
1745
  .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row + .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row:first-child { border-top: 1px solid var(--aura-border-default); }
1726
1746
  .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
1727
1747
  .aura-tbl--stack-sm > * > .aura-tbl__row > * + * { margin-top: var(--aura-space-2); }
@@ -1747,24 +1767,22 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1747
1767
  .aura-tbl-cards--md > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1748
1768
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1749
1769
  .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 {
1750
- margin-bottom: var(--aura-space-2); padding: var(--aura-space-4);
1770
+ margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
1751
1771
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1752
1772
  }
1753
1773
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1754
1774
  .aura-tbl--cards.aura-tbl--stack-md > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1755
- .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); }
1756
1775
  .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1757
1776
  }
1758
1777
  @container aura-tbl (width < 640px) {
1759
1778
  .aura-tbl-cards--sm > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1760
1779
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1761
1780
  .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 {
1762
- margin-bottom: var(--aura-space-2); padding: var(--aura-space-4);
1781
+ margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
1763
1782
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-radius-lg); background: var(--aura-bg-surface);
1764
1783
  }
1765
1784
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row { background: var(--aura-bg-canvas); }
1766
1785
  .aura-tbl--cards.aura-tbl--stack-sm > :last-child > .aura-tbl__row:last-child { margin-bottom: 0; }
1767
- .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); }
1768
1786
  .aura-tbl-wrap.is-flush > .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1769
1787
  }
1770
1788
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.19.0",
3
+ "version": "5.21.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",