@jirawatpyk/aura-react 5.26.0 → 5.27.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,12 @@ 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.27 — Chamber-OS addenda 33–34
190
+
191
+ - **`bleed` reaches through your own wrappers** (item 130): a bleeding DataTable or Table now spans the Card from anywhere in its content — inside a `flex flex-col gap-4` column, a container-query `div`, a `role="tabpanel"` — as long as those wrappers add no padding or frame and don't clip or scroll (`overflow` other than `visible`): a padded wrapper leaves the table short of the card's edge by that padding, and a clipping or scrolling one cuts it off or adds scrollbars. A nested Card resets the reach to its own padding. The last-content rule is unchanged: only a table that is the Card content's direct, last child drops its bottom rule automatically; inside wrappers pass **`bleedEnd`** when nothing follows the table in the card (and the Card has no `footer`), and the card's radius closes it. Without `bleedEnd`, a pager or link after the table keeps the rule; don't pass `bleedEnd` then, or what follows is pulled up over the table. Still nothing below `flushBelow` or outside a Card.
192
+ - **`Container` from `/server`** (item 131): it is stateless, so `@jirawatpyk/aura-react/server` exports it next to Card and EmptyState, and a Server Component can render the page column without becoming a client reference. Same HTML as the root export.
193
+ - **The override guarantee covers padding** (item 131): with `styles.layer.css`, utilities that set a Container's `padding` (e.g. your own gutter, `px-[var(--page-padding-x)]`) win as well as `max-width` and `margin`, also directly inside a padded AppShell where AURA zeroes the side padding. `check:tailwind4` tests it at 700px, between AURA's 640 and 1024px steps.
194
+
189
195
  ## 5.26 — Chamber-OS addenda 28–32
190
196
 
191
197
  One release: everything below shipped together in 5.26.0.
@@ -202,7 +208,7 @@ One release: everything below shipped together in 5.26.0.
202
208
 
203
209
  ### `bleed` (addendum 30)
204
210
 
205
- - **`bleed` on DataTable and Table** (item 127): edge to edge inside a Card — a list card with its filters in the card's padding and the table across its full inner width (Polaris IndexTable, GitHub issues). As a direct child of the Card's content the table loses its side borders and radius and is pulled out by the card's padding; its header band and top rule stay, and cell text stays level with the card's content (DataTable's 24px gutter, Table's 24px outer cells). When it is the card's last content (no Card `footer`, nothing after it) the bottom rule goes too and the card's radius closes it; a pager or footer after it keeps the rule. Below the Card's `flushBelow` width, and outside a Card, it does nothing; stacked rows inside a framed Card keep its padding. Wrap nothing between the Card and the table, or it won't bleed. The reach is the Card's padding token: change a Card's padding with `--aura-card-padding` (with a unit, `0px`), not a padding utility, or the table overshoots or falls short; `flushBelow` with `max-sm:p-0` is fine. On phones (<640px) a Card without `flushBelow` has 16px padding while DataTable's gutter stays 24px, so its text sits 8px in from the card's content there; Table's outer cells stay 24px too.
211
+ - **`bleed` on DataTable and Table** (item 127): edge to edge inside a Card — a list card with its filters in the card's padding and the table across its full inner width (Polaris IndexTable, GitHub issues). As a direct child of the Card's content the table loses its side borders and radius and is pulled out by the card's padding; its header band and top rule stay, and cell text stays level with the card's content (DataTable's 24px gutter, Table's 24px outer cells). When it is the card's last content (no Card `footer`, nothing after it) the bottom rule goes too and the card's radius closes it; a pager or footer after it keeps the rule. Below the Card's `flushBelow` width, and outside a Card, it does nothing; stacked rows inside a framed Card keep its padding. In 5.26 it needed to be the Card content's direct child; since 5.27 it also reaches through unpadded wrappers. The reach is the Card's padding token: change a Card's padding with `--aura-card-padding` (with a unit, `0px`), not a padding utility, or the table overshoots or falls short; `flushBelow` with `max-sm:p-0` is fine. On phones (<640px) a Card without `flushBelow` has 16px padding while DataTable's gutter stays 24px, so its text sits 8px in from the card's content there; Table's outer cells stay 24px too.
206
212
  - **DataTable `bordered={false}`**: drops the frame (border and radius) and keeps the header band and the 24px gutter, for a table in a section that doesn't bleed. Table's `bordered={false}` is unchanged.
207
213
  - Budgets raised on purpose: the whole library and the `window.Aura` bundle 62 → 64 kB.
208
214
 
@@ -212,7 +218,7 @@ One release: everything below shipped together in 5.26.0.
212
218
 
213
219
  ### Container (addendum 29)
214
220
 
215
- - **Overriding a Container's width and margin is supported** (item 126): with `styles.layer.css`, utilities that set `max-width` or `margin` on a `Container` (`max-w-[672px]`, `mx-0`, `ms-0`) win over `.aura-container`, and that is now a guarantee rather than a side effect. AURA keeps every `.aura-container` rule in `@layer aura`, never uses `!important` on it and never adds an unlayered rule for it; `npm run check:tailwind4` fails if a 672px column, centred or at the start edge, stops working at a 1400px page. With the unlayered `styles.css` the component wins instead (as for every component), so use `size` / `align` or the layered stylesheet. The side padding (16 / 24 / 32px at <640 / ≥640 / ≥1024) and its removal directly inside a padded `AppShell` are unchanged.
221
+ - **Overriding a Container's width and margin is supported** (item 126; padding too since 5.27): with `styles.layer.css`, utilities that set `max-width` or `margin` on a `Container` (`max-w-[672px]`, `mx-0`, `ms-0`) win over `.aura-container`, and that is now a guarantee rather than a side effect. AURA keeps every `.aura-container` rule in `@layer aura`, never uses `!important` on it and never adds an unlayered rule for it; `npm run check:tailwind4` fails if a 672px column, centred or at the start edge, stops working at a 1400px page. With the unlayered `styles.css` the component wins instead (as for every component), so use `size` / `align` or the layered stylesheet. The side padding (16 / 24 / 32px at <640 / ≥640 / ≥1024) and its removal directly inside a padded `AppShell` are unchanged.
216
222
  - **`align="start"`**: the column sits at the start edge (left; right in right-to-left) instead of being centred — a form board beside the page's start. Default `center`.
217
223
  - **Attributes reach the element**: `id`, `lang`, `dir`, `aria-*` and `data-*` (e.g. `data-slot="layout-container" data-variant="form"`), so an app's layout checks can read a Container. Other props are still not passed.
218
224
  - Budget raised on purpose: styles.css 27 → 28 kB.
@@ -6507,6 +6507,7 @@ window.Aura = (() => {
6507
6507
  /* 5.26 (Chamber-OS 127): bleed and bordered={false}; the outermost element carries aura-bleed. */
6508
6508
  props.bleed && "aura-bleed-frame",
6509
6509
  props.bleed && !levels.length && "aura-bleed",
6510
+ props.bleed && props.bleedEnd && !levels.length && "aura-bleed-end",
6510
6511
  props.bordered === false && "aura-table--borderless",
6511
6512
  stacked && "aura-table--stacked",
6512
6513
  noCardSel && "aura-table--cards-nosel",
@@ -6605,7 +6606,19 @@ window.Aura = (() => {
6605
6606
  out
6606
6607
  );
6607
6608
  }
6608
- return /* @__PURE__ */ React32.createElement("div", { ref, className: cx("aura-table-box", props.bleed && "aura-bleed", props.className) }, out);
6609
+ return /* @__PURE__ */ React32.createElement(
6610
+ "div",
6611
+ {
6612
+ ref,
6613
+ className: cx(
6614
+ "aura-table-box",
6615
+ props.bleed && "aura-bleed",
6616
+ props.bleed && props.bleedEnd && "aura-bleed-end",
6617
+ props.className
6618
+ )
6619
+ },
6620
+ out
6621
+ );
6609
6622
  });
6610
6623
  var DataTable2 = DataTableImpl;
6611
6624
 
@@ -7477,6 +7490,7 @@ window.Aura = (() => {
7477
7490
  align,
7478
7491
  bordered,
7479
7492
  bleed,
7493
+ bleedEnd,
7480
7494
  stickyHeader,
7481
7495
  maxHeight,
7482
7496
  stackStyle,
@@ -7530,6 +7544,7 @@ window.Aura = (() => {
7530
7544
  /* 5.26 (Chamber-OS 127): the frame that bleeds; the outermost element carries aura-bleed. */
7531
7545
  bleed && "aura-bleed-frame",
7532
7546
  bleed && !cards && "aura-bleed",
7547
+ bleed && bleedEnd && !cards && "aura-bleed-end",
7533
7548
  /* 5.26 (Chamber-OS 129): stickyHeader pins to the page, or inside the box when it has a maxHeight. */
7534
7549
  stickyHeader && (maxHeight != null ? "is-sticky-box" : "is-sticky-page"),
7535
7550
  maxHeight != null && "has-max",
@@ -7562,7 +7577,17 @@ window.Aura = (() => {
7562
7577
  labels ? /* @__PURE__ */ React45.createElement(StackLabels.Provider, { value: labels }, children) : outer ? /* @__PURE__ */ React45.createElement(StackLabels.Provider, { value: null }, children) : children
7563
7578
  )
7564
7579
  );
7565
- return cards ? /* @__PURE__ */ React45.createElement("div", { className: cx("aura-tbl-cards aura-tbl-cards--" + stackBelow, bleed && "aura-bleed") }, table) : table;
7580
+ return cards ? /* @__PURE__ */ React45.createElement(
7581
+ "div",
7582
+ {
7583
+ className: cx(
7584
+ "aura-tbl-cards aura-tbl-cards--" + stackBelow,
7585
+ bleed && "aura-bleed",
7586
+ bleed && bleedEnd && "aura-bleed-end"
7587
+ )
7588
+ },
7589
+ table
7590
+ ) : table;
7566
7591
  });
7567
7592
  function section(tag, cls) {
7568
7593
  const C = React45.forwardRef(function TableSection(props, ref) {
@@ -6489,6 +6489,7 @@ var DataTableImpl = React32.forwardRef(function DataTable(props, ref) {
6489
6489
  /* 5.26 (Chamber-OS 127): bleed and bordered={false}; the outermost element carries aura-bleed. */
6490
6490
  props.bleed && "aura-bleed-frame",
6491
6491
  props.bleed && !levels.length && "aura-bleed",
6492
+ props.bleed && props.bleedEnd && !levels.length && "aura-bleed-end",
6492
6493
  props.bordered === false && "aura-table--borderless",
6493
6494
  stacked && "aura-table--stacked",
6494
6495
  noCardSel && "aura-table--cards-nosel",
@@ -6587,7 +6588,19 @@ var DataTableImpl = React32.forwardRef(function DataTable(props, ref) {
6587
6588
  out
6588
6589
  );
6589
6590
  }
6590
- return /* @__PURE__ */ React32.createElement("div", { ref, className: cx("aura-table-box", props.bleed && "aura-bleed", props.className) }, out);
6591
+ return /* @__PURE__ */ React32.createElement(
6592
+ "div",
6593
+ {
6594
+ ref,
6595
+ className: cx(
6596
+ "aura-table-box",
6597
+ props.bleed && "aura-bleed",
6598
+ props.bleed && props.bleedEnd && "aura-bleed-end",
6599
+ props.className
6600
+ )
6601
+ },
6602
+ out
6603
+ );
6591
6604
  });
6592
6605
  var DataTable2 = DataTableImpl;
6593
6606
 
@@ -7459,6 +7472,7 @@ var Table = React45.forwardRef(function Table2(props, ref) {
7459
7472
  align,
7460
7473
  bordered,
7461
7474
  bleed,
7475
+ bleedEnd,
7462
7476
  stickyHeader,
7463
7477
  maxHeight,
7464
7478
  stackStyle,
@@ -7512,6 +7526,7 @@ var Table = React45.forwardRef(function Table2(props, ref) {
7512
7526
  /* 5.26 (Chamber-OS 127): the frame that bleeds; the outermost element carries aura-bleed. */
7513
7527
  bleed && "aura-bleed-frame",
7514
7528
  bleed && !cards && "aura-bleed",
7529
+ bleed && bleedEnd && !cards && "aura-bleed-end",
7515
7530
  /* 5.26 (Chamber-OS 129): stickyHeader pins to the page, or inside the box when it has a maxHeight. */
7516
7531
  stickyHeader && (maxHeight != null ? "is-sticky-box" : "is-sticky-page"),
7517
7532
  maxHeight != null && "has-max",
@@ -7544,7 +7559,17 @@ var Table = React45.forwardRef(function Table2(props, ref) {
7544
7559
  labels ? /* @__PURE__ */ React45.createElement(StackLabels.Provider, { value: labels }, children) : outer ? /* @__PURE__ */ React45.createElement(StackLabels.Provider, { value: null }, children) : children
7545
7560
  )
7546
7561
  );
7547
- return cards ? /* @__PURE__ */ React45.createElement("div", { className: cx("aura-tbl-cards aura-tbl-cards--" + stackBelow, bleed && "aura-bleed") }, table) : table;
7562
+ return cards ? /* @__PURE__ */ React45.createElement(
7563
+ "div",
7564
+ {
7565
+ className: cx(
7566
+ "aura-tbl-cards aura-tbl-cards--" + stackBelow,
7567
+ bleed && "aura-bleed",
7568
+ bleed && bleedEnd && "aura-bleed-end"
7569
+ )
7570
+ },
7571
+ table
7572
+ ) : table;
7548
7573
  });
7549
7574
  function section(tag, cls) {
7550
7575
  const C = React45.forwardRef(function TableSection(props, ref) {
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import * as React from "react";
3
- import { cx } from "./internal.js";
3
+ import { cx } from "./classes.js";
4
4
  const h = React.createElement;
5
5
  const Container = React.forwardRef(function Container2(props, ref) {
6
6
  const attrs = {};
@@ -1321,6 +1321,7 @@ const DataTableImpl = React.forwardRef(function DataTable(props, ref) {
1321
1321
  /* 5.26 (Chamber-OS 127): bleed and bordered={false}; the outermost element carries aura-bleed. */
1322
1322
  props.bleed && "aura-bleed-frame",
1323
1323
  props.bleed && !levels.length && "aura-bleed",
1324
+ props.bleed && props.bleedEnd && !levels.length && "aura-bleed-end",
1324
1325
  props.bordered === false && "aura-table--borderless",
1325
1326
  stacked && "aura-table--stacked",
1326
1327
  noCardSel && "aura-table--cards-nosel",
@@ -1419,7 +1420,19 @@ const DataTableImpl = React.forwardRef(function DataTable(props, ref) {
1419
1420
  out
1420
1421
  );
1421
1422
  }
1422
- return /* @__PURE__ */ React.createElement("div", { ref, className: cx("aura-table-box", props.bleed && "aura-bleed", props.className) }, out);
1423
+ return /* @__PURE__ */ React.createElement(
1424
+ "div",
1425
+ {
1426
+ ref,
1427
+ className: cx(
1428
+ "aura-table-box",
1429
+ props.bleed && "aura-bleed",
1430
+ props.bleed && props.bleedEnd && "aura-bleed-end",
1431
+ props.className
1432
+ )
1433
+ },
1434
+ out
1435
+ );
1423
1436
  });
1424
1437
  const DataTable2 = DataTableImpl;
1425
1438
  export {
package/dist/esm/Table.js CHANGED
@@ -56,6 +56,7 @@ const Table = React.forwardRef(function Table2(props, ref) {
56
56
  align,
57
57
  bordered,
58
58
  bleed,
59
+ bleedEnd,
59
60
  stickyHeader,
60
61
  maxHeight,
61
62
  stackStyle,
@@ -109,6 +110,7 @@ const Table = React.forwardRef(function Table2(props, ref) {
109
110
  /* 5.26 (Chamber-OS 127): the frame that bleeds; the outermost element carries aura-bleed. */
110
111
  bleed && "aura-bleed-frame",
111
112
  bleed && !cards && "aura-bleed",
113
+ bleed && bleedEnd && !cards && "aura-bleed-end",
112
114
  /* 5.26 (Chamber-OS 129): stickyHeader pins to the page, or inside the box when it has a maxHeight. */
113
115
  stickyHeader && (maxHeight != null ? "is-sticky-box" : "is-sticky-page"),
114
116
  maxHeight != null && "has-max",
@@ -141,7 +143,17 @@ const Table = React.forwardRef(function Table2(props, ref) {
141
143
  labels ? /* @__PURE__ */ React.createElement(StackLabels.Provider, { value: labels }, children) : outer ? /* @__PURE__ */ React.createElement(StackLabels.Provider, { value: null }, children) : children
142
144
  )
143
145
  );
144
- return cards ? /* @__PURE__ */ React.createElement("div", { className: cx("aura-tbl-cards aura-tbl-cards--" + stackBelow, bleed && "aura-bleed") }, table) : table;
146
+ return cards ? /* @__PURE__ */ React.createElement(
147
+ "div",
148
+ {
149
+ className: cx(
150
+ "aura-tbl-cards aura-tbl-cards--" + stackBelow,
151
+ bleed && "aura-bleed",
152
+ bleed && bleedEnd && "aura-bleed-end"
153
+ )
154
+ },
155
+ table
156
+ ) : table;
145
157
  });
146
158
  function section(tag, cls) {
147
159
  const C = React.forwardRef(function TableSection(props, ref) {
package/dist/index.d.cts CHANGED
@@ -236,11 +236,15 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
236
236
  density?: "comfortable" | "compact" | undefined;
237
237
  /** Table width in px below which rows render as stacked cards (phones). Try 640. It follows the table's own width, not the window. Since 4.20 the cards are the same markup as the grid, laid out by a container query, so any width is right before hydration and each row is in the HTML once. With `height` (virtual rows) the server can only send the first screenful; the rest of the cards arrive on hydration. */
238
238
  stackBelow?: number | undefined;
239
- /** Edge to edge inside a Card (5.26, Chamber-OS 127): as a direct child of a Card's content, the table spans the
240
- * card's full inner width — no side borders, no radius — keeping its header band and top rule; as the card's last
241
- * content (no footer, nothing after it) it drops its bottom rule and the card's radius closes it. Below the Card's
239
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): anywhere in a Card's content — also inside your own wrappers,
240
+ * as long as they add no padding or frame and don't clip or scroll (5.27, 130) — the table spans the card's full inner width, no side borders
241
+ * or radius, keeping its header band and top rule. As a direct child that is the card's last content (no footer,
242
+ * nothing after it), or with `bleedEnd`, it drops its bottom rule and the card's radius closes it. Below the Card's
242
243
  * `flushBelow` width, and outside a Card, it does nothing. */
243
244
  bleed?: boolean | undefined;
245
+ /** With `bleed`: the table ends the card even though it sits inside your wrappers — no bottom rule, the card's radius
246
+ * closes it. Only when nothing follows it in the card and the Card has no `footer` (5.27). */
247
+ bleedEnd?: boolean | undefined;
244
248
  /** `false` drops the frame — border and radius — keeping the header band and the 24px gutter, for a table that sits
245
249
  * in a section without bleeding (5.26). Default `true`. */
246
250
  bordered?: boolean | undefined;
@@ -1195,12 +1199,16 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
1195
1199
  /** `false` (5.13) drops the frame — border, radius, background — and the outer cells' side padding, so the table
1196
1200
  * lines up with the content around it, e.g. flush inside a Card under its heading. Default `true`. */
1197
1201
  bordered?: boolean | undefined;
1198
- /** Edge to edge inside a Card (5.26, Chamber-OS 127): as a direct child of a Card's content, the table spans the
1199
- * card's full inner width — no side borders, no radius — keeping its header band and top rule, and its outer
1200
- * cells' 24px padding keeps the text level with the card's content. As the card's last content it drops its
1201
- * bottom rule and the card's radius closes it. Below the Card's `flushBelow` width, and outside a Card, it does
1202
- * nothing. With `bordered={false}` too, the outer cells take the card's padding while it bleeds. */
1202
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): anywhere in a Card's content — also inside your own wrappers,
1203
+ * as long as they add no padding or frame and don't clip or scroll (5.27, 130) — the table spans the card's full inner width, no side borders
1204
+ * or radius, keeping its header band and top rule, and its 24px outer cells keep the text level with the card's
1205
+ * content. As a direct child that is the card's last content, or with `bleedEnd`, it drops its bottom rule and the
1206
+ * card's radius closes it. Below the Card's `flushBelow` width, and outside a Card, it does nothing. With
1207
+ * `bordered={false}` too, the outer cells take the card's padding while it bleeds. */
1203
1208
  bleed?: boolean | undefined;
1209
+ /** With `bleed`: the table ends the card even though it sits inside your wrappers — only when nothing follows it in
1210
+ * the card and the Card has no `footer` (5.27). */
1211
+ bleedEnd?: boolean | undefined;
1204
1212
  /** Keep the header row in view while the rows scroll (5.26, Chamber-OS 129), with its band, its bottom rule and
1205
1213
  * above the body. Without `maxHeight` it pins to the page's scroll, under an AppShell's top bar
1206
1214
  * (`--aura-shell-bar-height`; set `--aura-table-sticky-top` for another offset). A table wider than its box
@@ -1720,8 +1728,9 @@ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>
1720
1728
  * the page's start (5.26, Chamber-OS 126). Default `center`. */
1721
1729
  align?: "center" | "start" | undefined;
1722
1730
  as?: keyof React$1.JSX.IntrinsicElements | undefined;
1723
- /** Utilities that set `max-width` or `margin` (e.g. `max-w-[672px] mx-0`) are supported with `styles.layer.css`,
1724
- * where a utility beats `.aura-container` (5.26). */
1731
+ /** Utilities that set `max-width`, `margin` or `padding` (e.g. `max-w-[672px] mx-0`, your own gutter) are supported
1732
+ * with `styles.layer.css`, where a utility beats `.aura-container` (5.26; padding 5.27). Also exported from
1733
+ * `/server` for Server Components (5.27). */
1725
1734
  className?: string | undefined;
1726
1735
  style?: React$1.CSSProperties | undefined;
1727
1736
  children?: React$1.ReactNode | undefined;
package/dist/index.d.ts CHANGED
@@ -236,11 +236,15 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
236
236
  density?: "comfortable" | "compact" | undefined;
237
237
  /** Table width in px below which rows render as stacked cards (phones). Try 640. It follows the table's own width, not the window. Since 4.20 the cards are the same markup as the grid, laid out by a container query, so any width is right before hydration and each row is in the HTML once. With `height` (virtual rows) the server can only send the first screenful; the rest of the cards arrive on hydration. */
238
238
  stackBelow?: number | undefined;
239
- /** Edge to edge inside a Card (5.26, Chamber-OS 127): as a direct child of a Card's content, the table spans the
240
- * card's full inner width — no side borders, no radius — keeping its header band and top rule; as the card's last
241
- * content (no footer, nothing after it) it drops its bottom rule and the card's radius closes it. Below the Card's
239
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): anywhere in a Card's content — also inside your own wrappers,
240
+ * as long as they add no padding or frame and don't clip or scroll (5.27, 130) — the table spans the card's full inner width, no side borders
241
+ * or radius, keeping its header band and top rule. As a direct child that is the card's last content (no footer,
242
+ * nothing after it), or with `bleedEnd`, it drops its bottom rule and the card's radius closes it. Below the Card's
242
243
  * `flushBelow` width, and outside a Card, it does nothing. */
243
244
  bleed?: boolean | undefined;
245
+ /** With `bleed`: the table ends the card even though it sits inside your wrappers — no bottom rule, the card's radius
246
+ * closes it. Only when nothing follows it in the card and the Card has no `footer` (5.27). */
247
+ bleedEnd?: boolean | undefined;
244
248
  /** `false` drops the frame — border and radius — keeping the header band and the 24px gutter, for a table that sits
245
249
  * in a section without bleeding (5.26). Default `true`. */
246
250
  bordered?: boolean | undefined;
@@ -1195,12 +1199,16 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
1195
1199
  /** `false` (5.13) drops the frame — border, radius, background — and the outer cells' side padding, so the table
1196
1200
  * lines up with the content around it, e.g. flush inside a Card under its heading. Default `true`. */
1197
1201
  bordered?: boolean | undefined;
1198
- /** Edge to edge inside a Card (5.26, Chamber-OS 127): as a direct child of a Card's content, the table spans the
1199
- * card's full inner width — no side borders, no radius — keeping its header band and top rule, and its outer
1200
- * cells' 24px padding keeps the text level with the card's content. As the card's last content it drops its
1201
- * bottom rule and the card's radius closes it. Below the Card's `flushBelow` width, and outside a Card, it does
1202
- * nothing. With `bordered={false}` too, the outer cells take the card's padding while it bleeds. */
1202
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): anywhere in a Card's content — also inside your own wrappers,
1203
+ * as long as they add no padding or frame and don't clip or scroll (5.27, 130) — the table spans the card's full inner width, no side borders
1204
+ * or radius, keeping its header band and top rule, and its 24px outer cells keep the text level with the card's
1205
+ * content. As a direct child that is the card's last content, or with `bleedEnd`, it drops its bottom rule and the
1206
+ * card's radius closes it. Below the Card's `flushBelow` width, and outside a Card, it does nothing. With
1207
+ * `bordered={false}` too, the outer cells take the card's padding while it bleeds. */
1203
1208
  bleed?: boolean | undefined;
1209
+ /** With `bleed`: the table ends the card even though it sits inside your wrappers — only when nothing follows it in
1210
+ * the card and the Card has no `footer` (5.27). */
1211
+ bleedEnd?: boolean | undefined;
1204
1212
  /** Keep the header row in view while the rows scroll (5.26, Chamber-OS 129), with its band, its bottom rule and
1205
1213
  * above the body. Without `maxHeight` it pins to the page's scroll, under an AppShell's top bar
1206
1214
  * (`--aura-shell-bar-height`; set `--aura-table-sticky-top` for another offset). A table wider than its box
@@ -1720,8 +1728,9 @@ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>
1720
1728
  * the page's start (5.26, Chamber-OS 126). Default `center`. */
1721
1729
  align?: "center" | "start" | undefined;
1722
1730
  as?: keyof React$1.JSX.IntrinsicElements | undefined;
1723
- /** Utilities that set `max-width` or `margin` (e.g. `max-w-[672px] mx-0`) are supported with `styles.layer.css`,
1724
- * where a utility beats `.aura-container` (5.26). */
1731
+ /** Utilities that set `max-width`, `margin` or `padding` (e.g. `max-w-[672px] mx-0`, your own gutter) are supported
1732
+ * with `styles.layer.css`, where a utility beats `.aura-container` (5.26; padding 5.27). Also exported from
1733
+ * `/server` for Server Components (5.27). */
1725
1734
  className?: string | undefined;
1726
1735
  style?: React$1.CSSProperties | undefined;
1727
1736
  children?: React$1.ReactNode | undefined;
@@ -34,6 +34,7 @@ __export(server_exports, {
34
34
  Avatar: () => ServerAvatar,
35
35
  Badge: () => ServerBadge,
36
36
  Card: () => ServerCard,
37
+ Container: () => Container,
37
38
  EmptyState: () => ServerEmptyState,
38
39
  Icon: () => Icon,
39
40
  STRINGS: () => STRINGS,
@@ -605,14 +606,14 @@ var STRINGS = {
605
606
 
606
607
  // src/theme.ts
607
608
  function hexToRgb(hex) {
608
- let h3 = String(hex).trim().replace("#", "");
609
- if (h3.length === 3)
610
- h3 = h3.split("").map(function(c) {
609
+ let h4 = String(hex).trim().replace("#", "");
610
+ if (h4.length === 3)
611
+ h4 = h4.split("").map(function(c) {
611
612
  return c + c;
612
613
  }).join("");
613
- if (!/^[0-9a-f]{6}$/i.test(h3)) throw new Error('createTheme: "' + hex + '" is not a #rgb or #rrggbb colour');
614
+ if (!/^[0-9a-f]{6}$/i.test(h4)) throw new Error('createTheme: "' + hex + '" is not a #rgb or #rrggbb colour');
614
615
  return [0, 2, 4].map(function(i) {
615
- return parseInt(h3.slice(i, i + 2), 16) / 255;
616
+ return parseInt(h4.slice(i, i + 2), 16) / 255;
616
617
  });
617
618
  }
618
619
  function rgbToHex(rgb) {
@@ -1318,3 +1319,28 @@ function ServerStat(props) {
1318
1319
  function ServerAvatar(props) {
1319
1320
  return avatarElement(props, void 0, null, void 0);
1320
1321
  }
1322
+
1323
+ // src/Container.tsx
1324
+ var React4 = __toESM(require("react"), 1);
1325
+ var h3 = React4.createElement;
1326
+ var Container = React4.forwardRef(function Container2(props, ref) {
1327
+ const attrs = {};
1328
+ Object.keys(props).forEach(function(k) {
1329
+ if (k === "id" || k === "lang" || k === "dir" || /^(aria|data)-/.test(k))
1330
+ attrs[k] = props[k];
1331
+ });
1332
+ return h3(
1333
+ props.as || "div",
1334
+ Object.assign(attrs, {
1335
+ ref,
1336
+ className: cx(
1337
+ "aura-container",
1338
+ props.size === "narrow" && "is-narrow",
1339
+ props.align === "start" && "is-start",
1340
+ props.className
1341
+ ),
1342
+ style: props.style
1343
+ }),
1344
+ props.children
1345
+ );
1346
+ });
@@ -386,6 +386,24 @@ declare function ServerAvatar(props: AvatarProps): React$1.ReactElement;
386
386
  * render names with `/server`'s Icon (the two entries keep separate registries). */
387
387
  export declare function registerIcons(icons: readonly AuraIcon[]): void;
388
388
  export declare const Icon: React$1.ForwardRefExoticComponent<IconProps & React$1.RefAttributes<SVGSVGElement>>;
389
+ /** Centred page column. To name it (`aria-label`), render a landmark with `as="section"` (or `main`, `nav`): a
390
+ * plain `div` may not carry a name. */
391
+ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id" | "lang" | "dir">, React$1.AriaAttributes, DataAttributes {
392
+ /** `narrow` caps it at aura-container-narrow (720px). Default `default` (1280px). */
393
+ size?: "default" | "narrow" | undefined;
394
+ /** `start` puts the column at the start edge (left; right in RTL) instead of centring it — a form board beside
395
+ * the page's start (5.26, Chamber-OS 126). Default `center`. */
396
+ align?: "center" | "start" | undefined;
397
+ as?: keyof React$1.JSX.IntrinsicElements | undefined;
398
+ /** Utilities that set `max-width`, `margin` or `padding` (e.g. `max-w-[672px] mx-0`, your own gutter) are supported
399
+ * with `styles.layer.css`, where a utility beats `.aura-container` (5.26; padding 5.27). Also exported from
400
+ * `/server` for Server Components (5.27). */
401
+ className?: string | undefined;
402
+ style?: React$1.CSSProperties | undefined;
403
+ children?: React$1.ReactNode | undefined;
404
+ }
405
+ /** Container — centres content up to aura-container-max (1280px) with responsive side padding. */
406
+ export declare const Container: React$1.ForwardRefExoticComponent<ContainerProps & React$1.RefAttributes<HTMLElement>>;
389
407
 
390
408
  export {
391
409
  ServerAlert as Alert,
@@ -386,6 +386,24 @@ declare function ServerAvatar(props: AvatarProps): React$1.ReactElement;
386
386
  * render names with `/server`'s Icon (the two entries keep separate registries). */
387
387
  export declare function registerIcons(icons: readonly AuraIcon[]): void;
388
388
  export declare const Icon: React$1.ForwardRefExoticComponent<IconProps & React$1.RefAttributes<SVGSVGElement>>;
389
+ /** Centred page column. To name it (`aria-label`), render a landmark with `as="section"` (or `main`, `nav`): a
390
+ * plain `div` may not carry a name. */
391
+ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id" | "lang" | "dir">, React$1.AriaAttributes, DataAttributes {
392
+ /** `narrow` caps it at aura-container-narrow (720px). Default `default` (1280px). */
393
+ size?: "default" | "narrow" | undefined;
394
+ /** `start` puts the column at the start edge (left; right in RTL) instead of centring it — a form board beside
395
+ * the page's start (5.26, Chamber-OS 126). Default `center`. */
396
+ align?: "center" | "start" | undefined;
397
+ as?: keyof React$1.JSX.IntrinsicElements | undefined;
398
+ /** Utilities that set `max-width`, `margin` or `padding` (e.g. `max-w-[672px] mx-0`, your own gutter) are supported
399
+ * with `styles.layer.css`, where a utility beats `.aura-container` (5.26; padding 5.27). Also exported from
400
+ * `/server` for Server Components (5.27). */
401
+ className?: string | undefined;
402
+ style?: React$1.CSSProperties | undefined;
403
+ children?: React$1.ReactNode | undefined;
404
+ }
405
+ /** Container — centres content up to aura-container-max (1280px) with responsive side padding. */
406
+ export declare const Container: React$1.ForwardRefExoticComponent<ContainerProps & React$1.RefAttributes<HTMLElement>>;
389
407
 
390
408
  export {
391
409
  ServerAlert as Alert,
@@ -546,14 +546,14 @@ var STRINGS = {
546
546
 
547
547
  // src/theme.ts
548
548
  function hexToRgb(hex) {
549
- let h3 = String(hex).trim().replace("#", "");
550
- if (h3.length === 3)
551
- h3 = h3.split("").map(function(c) {
549
+ let h4 = String(hex).trim().replace("#", "");
550
+ if (h4.length === 3)
551
+ h4 = h4.split("").map(function(c) {
552
552
  return c + c;
553
553
  }).join("");
554
- if (!/^[0-9a-f]{6}$/i.test(h3)) throw new Error('createTheme: "' + hex + '" is not a #rgb or #rrggbb colour');
554
+ if (!/^[0-9a-f]{6}$/i.test(h4)) throw new Error('createTheme: "' + hex + '" is not a #rgb or #rrggbb colour');
555
555
  return [0, 2, 4].map(function(i) {
556
- return parseInt(h3.slice(i, i + 2), 16) / 255;
556
+ return parseInt(h4.slice(i, i + 2), 16) / 255;
557
557
  });
558
558
  }
559
559
  function rgbToHex(rgb) {
@@ -1259,11 +1259,37 @@ function ServerStat(props) {
1259
1259
  function ServerAvatar(props) {
1260
1260
  return avatarElement(props, void 0, null, void 0);
1261
1261
  }
1262
+
1263
+ // src/Container.tsx
1264
+ import * as React4 from "react";
1265
+ var h3 = React4.createElement;
1266
+ var Container = React4.forwardRef(function Container2(props, ref) {
1267
+ const attrs = {};
1268
+ Object.keys(props).forEach(function(k) {
1269
+ if (k === "id" || k === "lang" || k === "dir" || /^(aria|data)-/.test(k))
1270
+ attrs[k] = props[k];
1271
+ });
1272
+ return h3(
1273
+ props.as || "div",
1274
+ Object.assign(attrs, {
1275
+ ref,
1276
+ className: cx(
1277
+ "aura-container",
1278
+ props.size === "narrow" && "is-narrow",
1279
+ props.align === "start" && "is-start",
1280
+ props.className
1281
+ ),
1282
+ style: props.style
1283
+ }),
1284
+ props.children
1285
+ );
1286
+ });
1262
1287
  export {
1263
1288
  ServerAlert as Alert,
1264
1289
  ServerAvatar as Avatar,
1265
1290
  ServerBadge as Badge,
1266
1291
  ServerCard as Card,
1292
+ Container,
1267
1293
  ServerEmptyState as EmptyState,
1268
1294
  Icon,
1269
1295
  STRINGS,
package/dist/styles.css CHANGED
@@ -662,21 +662,22 @@ a.aura-icon-btn { text-decoration: none; }
662
662
  @media (max-width: 639.98px) { .aura-card.aura-card--flush-below-sm, .aura-card.aura-card--flush-below-sm:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
663
663
  @media (max-width: 767.98px) { .aura-card.aura-card--flush-below-md, .aura-card.aura-card--flush-below-md:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
664
664
  @media (max-width: 1023.98px) { .aura-card.aura-card--flush-below-lg, .aura-card.aura-card--flush-below-lg:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
665
- /* 5.26 (Chamber-OS 127): bleed — a table that is a direct child of a Card's content spans its inner width; the side
665
+ /* 5.26 (Chamber-OS 127): bleed — a table anywhere in a Card's content (5.27, 130: through the app's own unpadded
666
+ * wrappers; a nested Card resets the reach) spans its inner width; the side
666
667
  * borders and radius go (a 0px bleed — a flush card — keeps them: 1px - min(1px, 0) = 1px). As the card's last content
667
668
  * it also drops its bottom rule and the card's radius closes it. */
668
669
  /* Two classes deep so it beats a stackable Table's width: 100%. `* 1000` turns any bleed into a 0 radius; 0 keeps it. */
669
- .aura-card .aura-card__body > .aura-bleed { margin-inline: calc(-1 * var(--aura-card-bleed)); width: auto; }
670
+ .aura-card .aura-card__body .aura-bleed { margin-inline: calc(-1 * var(--aura-card-bleed)); width: auto; }
670
671
  /* A Table with bordered={false} too: its outer cells take the bleed (0 where the card is flush, as before). */
671
- .aura-card__body > .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child,
672
- .aura-card__body > .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: var(--aura-card-bleed); }
673
- .aura-card__body > .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child,
674
- .aura-card__body > .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: var(--aura-card-bleed); }
675
- .aura-card__body > .aura-bleed.aura-bleed-frame, .aura-card__body > .aura-bleed .aura-bleed-frame {
672
+ .aura-card__body .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child,
673
+ .aura-card__body .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: var(--aura-card-bleed); }
674
+ .aura-card__body .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child,
675
+ .aura-card__body .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: var(--aura-card-bleed); }
676
+ .aura-card__body .aura-bleed.aura-bleed-frame, .aura-card__body .aura-bleed .aura-bleed-frame {
676
677
  border-inline-width: calc(1px - min(1px, var(--aura-card-bleed))); border-radius: max(0px, var(--aura-card-radius) - var(--aura-card-bleed) * 1000);
677
678
  }
678
- .aura-card__body:last-child > .aura-bleed:last-child { margin-bottom: calc(-1 * var(--aura-card-bleed)); }
679
- .aura-card__body:last-child > .aura-bleed:last-child.aura-bleed-frame, .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame {
679
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) { margin-bottom: calc(-1 * var(--aura-card-bleed)); }
680
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end).aura-bleed-frame, :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) .aura-bleed-frame {
680
681
  border-bottom-width: calc(1px - min(1px, var(--aura-card-bleed)));
681
682
  border-bottom-left-radius: calc(var(--aura-card-radius) - min(1px, var(--aura-card-bleed)));
682
683
  border-bottom-right-radius: calc(var(--aura-card-radius) - min(1px, var(--aura-card-bleed)));
@@ -1788,7 +1789,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1788
1789
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
1789
1790
  }
1790
1791
  /* 5.26: a bleeding list keeps its rows' text level with the Card's content (16px where it doesn't bleed). */
1791
- .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1792
+ .aura-card__body .aura-bleed.aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1792
1793
  }
1793
1794
  @container aura-tbl (width < 640px) {
1794
1795
  .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; }
@@ -1812,7 +1813,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1812
1813
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
1813
1814
  }
1814
1815
  /* 5.26: a bleeding list keeps its rows' text level with the Card's content (16px where it doesn't bleed). */
1815
- .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1816
+ .aura-card__body .aura-bleed.aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1816
1817
  }
1817
1818
 
1818
1819
  /* 5.15 (Chamber-OS 85): stackStyle="cards" — each stacked row its own card (DataTable's card spacing), no outer frame.
@@ -1820,8 +1821,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1820
1821
  .aura-tbl-cards { container: aura-tbl / inline-size; width: 100%; }
1821
1822
  @container aura-tbl (width < 768px) {
1822
1823
  .aura-tbl-cards--md > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1823
- .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-inline: var(--aura-card-bleed); }
1824
- .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-bottom: var(--aura-card-bleed); }
1824
+ .aura-card__body .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md, .aura-card__body .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-inline: var(--aura-card-bleed); }
1825
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-bottom: var(--aura-card-bleed); }
1825
1826
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1826
1827
  .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 {
1827
1828
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
@@ -1833,8 +1834,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1833
1834
  }
1834
1835
  @container aura-tbl (width < 640px) {
1835
1836
  .aura-tbl-cards--sm > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1836
- .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-inline: var(--aura-card-bleed); }
1837
- .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-bottom: var(--aura-card-bleed); }
1837
+ .aura-card__body .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm, .aura-card__body .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-inline: var(--aura-card-bleed); }
1838
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-bottom: var(--aura-card-bleed); }
1838
1839
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1839
1840
  .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 {
1840
1841
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
@@ -1865,8 +1866,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1865
1866
  @container aura-stack (width < 9999.5px) {
1866
1867
  .aura-table { background: transparent; border: 0; border-radius: 0; overflow: visible; }
1867
1868
  /* 5.26: stacked cards inside a framed Card keep its padding (0 where the Card is flush). */
1868
- .aura-card__body > .aura-bleed .aura-bleed-frame { padding-inline: var(--aura-card-bleed); }
1869
- .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame { padding-bottom: var(--aura-card-bleed); }
1869
+ .aura-card__body .aura-bleed .aura-bleed-frame { padding-inline: var(--aura-card-bleed); }
1870
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) .aura-bleed-frame { padding-bottom: var(--aura-card-bleed); }
1870
1871
  .aura-table__scroll { overflow: visible; height: auto; }
1871
1872
  .aura-table__busy-bar { top: 0; }
1872
1873
  .aura-table__picker { display: none; }
@@ -664,21 +664,22 @@ a.aura-icon-btn { text-decoration: none; }
664
664
  @media (max-width: 639.98px) { .aura-card.aura-card--flush-below-sm, .aura-card.aura-card--flush-below-sm:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
665
665
  @media (max-width: 767.98px) { .aura-card.aura-card--flush-below-md, .aura-card.aura-card--flush-below-md:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
666
666
  @media (max-width: 1023.98px) { .aura-card.aura-card--flush-below-lg, .aura-card.aura-card--flush-below-lg:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
667
- /* 5.26 (Chamber-OS 127): bleed — a table that is a direct child of a Card's content spans its inner width; the side
667
+ /* 5.26 (Chamber-OS 127): bleed — a table anywhere in a Card's content (5.27, 130: through the app's own unpadded
668
+ * wrappers; a nested Card resets the reach) spans its inner width; the side
668
669
  * borders and radius go (a 0px bleed — a flush card — keeps them: 1px - min(1px, 0) = 1px). As the card's last content
669
670
  * it also drops its bottom rule and the card's radius closes it. */
670
671
  /* Two classes deep so it beats a stackable Table's width: 100%. `* 1000` turns any bleed into a 0 radius; 0 keeps it. */
671
- .aura-card .aura-card__body > .aura-bleed { margin-inline: calc(-1 * var(--aura-card-bleed)); width: auto; }
672
+ .aura-card .aura-card__body .aura-bleed { margin-inline: calc(-1 * var(--aura-card-bleed)); width: auto; }
672
673
  /* A Table with bordered={false} too: its outer cells take the bleed (0 where the card is flush, as before). */
673
- .aura-card__body > .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child,
674
- .aura-card__body > .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: var(--aura-card-bleed); }
675
- .aura-card__body > .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child,
676
- .aura-card__body > .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: var(--aura-card-bleed); }
677
- .aura-card__body > .aura-bleed.aura-bleed-frame, .aura-card__body > .aura-bleed .aura-bleed-frame {
674
+ .aura-card__body .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child,
675
+ .aura-card__body .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: var(--aura-card-bleed); }
676
+ .aura-card__body .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child,
677
+ .aura-card__body .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: var(--aura-card-bleed); }
678
+ .aura-card__body .aura-bleed.aura-bleed-frame, .aura-card__body .aura-bleed .aura-bleed-frame {
678
679
  border-inline-width: calc(1px - min(1px, var(--aura-card-bleed))); border-radius: max(0px, var(--aura-card-radius) - var(--aura-card-bleed) * 1000);
679
680
  }
680
- .aura-card__body:last-child > .aura-bleed:last-child { margin-bottom: calc(-1 * var(--aura-card-bleed)); }
681
- .aura-card__body:last-child > .aura-bleed:last-child.aura-bleed-frame, .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame {
681
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) { margin-bottom: calc(-1 * var(--aura-card-bleed)); }
682
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end).aura-bleed-frame, :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) .aura-bleed-frame {
682
683
  border-bottom-width: calc(1px - min(1px, var(--aura-card-bleed)));
683
684
  border-bottom-left-radius: calc(var(--aura-card-radius) - min(1px, var(--aura-card-bleed)));
684
685
  border-bottom-right-radius: calc(var(--aura-card-radius) - min(1px, var(--aura-card-bleed)));
@@ -1790,7 +1791,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1790
1791
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
1791
1792
  }
1792
1793
  /* 5.26: a bleeding list keeps its rows' text level with the Card's content (16px where it doesn't bleed). */
1793
- .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1794
+ .aura-card__body .aura-bleed.aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1794
1795
  }
1795
1796
  @container aura-tbl (width < 640px) {
1796
1797
  .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; }
@@ -1814,7 +1815,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1814
1815
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
1815
1816
  }
1816
1817
  /* 5.26: a bleeding list keeps its rows' text level with the Card's content (16px where it doesn't bleed). */
1817
- .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1818
+ .aura-card__body .aura-bleed.aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1818
1819
  }
1819
1820
 
1820
1821
  /* 5.15 (Chamber-OS 85): stackStyle="cards" — each stacked row its own card (DataTable's card spacing), no outer frame.
@@ -1822,8 +1823,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1822
1823
  .aura-tbl-cards { container: aura-tbl / inline-size; width: 100%; }
1823
1824
  @container aura-tbl (width < 768px) {
1824
1825
  .aura-tbl-cards--md > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1825
- .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-inline: var(--aura-card-bleed); }
1826
- .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-bottom: var(--aura-card-bleed); }
1826
+ .aura-card__body .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md, .aura-card__body .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-inline: var(--aura-card-bleed); }
1827
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-bottom: var(--aura-card-bleed); }
1827
1828
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1828
1829
  .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 {
1829
1830
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
@@ -1835,8 +1836,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1835
1836
  }
1836
1837
  @container aura-tbl (width < 640px) {
1837
1838
  .aura-tbl-cards--sm > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1838
- .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-inline: var(--aura-card-bleed); }
1839
- .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-bottom: var(--aura-card-bleed); }
1839
+ .aura-card__body .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm, .aura-card__body .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-inline: var(--aura-card-bleed); }
1840
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-bottom: var(--aura-card-bleed); }
1840
1841
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1841
1842
  .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 {
1842
1843
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
@@ -1867,8 +1868,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1867
1868
  @container aura-stack (width < 9999.5px) {
1868
1869
  .aura-table { background: transparent; border: 0; border-radius: 0; overflow: visible; }
1869
1870
  /* 5.26: stacked cards inside a framed Card keep its padding (0 where the Card is flush). */
1870
- .aura-card__body > .aura-bleed .aura-bleed-frame { padding-inline: var(--aura-card-bleed); }
1871
- .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame { padding-bottom: var(--aura-card-bleed); }
1871
+ .aura-card__body .aura-bleed .aura-bleed-frame { padding-inline: var(--aura-card-bleed); }
1872
+ :is(.aura-card__body:last-child > .aura-bleed:last-child, .aura-card__body:last-child .aura-bleed.aura-bleed-end) .aura-bleed-frame { padding-bottom: var(--aura-card-bleed); }
1872
1873
  .aura-table__scroll { overflow: visible; height: auto; }
1873
1874
  .aura-table__busy-bar { top: 0; }
1874
1875
  .aura-table__picker { display: none; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.26.0",
3
+ "version": "5.27.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",