@jirawatpyk/aura-react 5.26.0 → 5.28.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.
@@ -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/esm/Tag.js CHANGED
@@ -1,16 +1,20 @@
1
1
  'use client';
2
2
  import * as React from "react";
3
3
  import { Icon } from "./Icon.js";
4
- import { cx, devWarnOnce, omit } from "./internal.js";
4
+ import { cx, devWarnOnce, omit, useIsoLayoutEffect } from "./internal.js";
5
+ import { Tooltip } from "./Tooltip.js";
5
6
  import { useStrings } from "./locale.js";
6
7
  import { IconCheck, IconX } from "./icons.js";
7
- function textOf(node) {
8
+ function textOf(node, all) {
8
9
  if (node == null || typeof node === "boolean") return "";
9
10
  if (typeof node === "string" || typeof node === "number") return String(node);
10
- if (Array.isArray(node)) return node.map(textOf).join("");
11
+ if (Array.isArray(node))
12
+ return node.map(function(n) {
13
+ return textOf(n, all);
14
+ }).join("");
11
15
  if (React.isValidElement(node)) {
12
16
  const p = node.props;
13
- return p["aria-hidden"] === true || p["aria-hidden"] === "true" ? "" : textOf(p.children);
17
+ return !all && (p["aria-hidden"] === true || p["aria-hidden"] === "true") ? "" : textOf(p.children, all);
14
18
  }
15
19
  return "";
16
20
  }
@@ -27,9 +31,29 @@ const Tag = React.forwardRef(function Tag2(props, ref) {
27
31
  "removeLabel",
28
32
  "touchHeight"
29
33
  ]);
34
+ const textRef = React.useRef(null);
35
+ const cutState = React.useState(false), isCut = cutState[0];
36
+ const check = React.useCallback(function() {
37
+ const el = textRef.current;
38
+ if (el) cutState[1](el.scrollWidth > el.clientWidth + 1);
39
+ }, []);
40
+ useIsoLayoutEffect(check);
41
+ useIsoLayoutEffect(
42
+ function() {
43
+ const el = textRef.current;
44
+ if (!el || typeof ResizeObserver === "undefined") return;
45
+ const ro = new ResizeObserver(check);
46
+ ro.observe(el);
47
+ return function() {
48
+ ro.disconnect();
49
+ };
50
+ },
51
+ [check]
52
+ );
53
+ const fullText = isCut ? textOf(props.children, true).replace(/\s+/g, " ").trim() : "";
30
54
  const inner = [
31
55
  props.icon ? /* @__PURE__ */ React.createElement(Icon, { key: "i", name: props.icon, size: 14 }) : null,
32
- /* @__PURE__ */ React.createElement("span", { key: "t", className: "aura-tag__text" }, props.children)
56
+ /* @__PURE__ */ React.createElement("span", { key: "t", ref: textRef, className: "aura-tag__text", title: fullText || void 0 }, props.children)
33
57
  ];
34
58
  if (selectable) {
35
59
  return /* @__PURE__ */ React.createElement(
@@ -57,16 +81,19 @@ const Tag = React.forwardRef(function Tag2(props, ref) {
57
81
  "tag-remove-label",
58
82
  'Tag: the remove button has no name \u2014 its children have no text. Pass removeLabel (e.g. "Remove Acme AB").'
59
83
  );
60
- return /* @__PURE__ */ React.createElement("span", { ...rest, ref, className: cx("aura-tag", props.disabled && "is-disabled", props.className) }, inner, props.onRemove && !props.disabled ? /* @__PURE__ */ React.createElement(
61
- "button",
62
- {
63
- type: "button",
64
- className: "aura-tag__remove",
65
- "aria-label": props.removeLabel || t.remove(name),
66
- onClick: props.onRemove
67
- },
68
- /* @__PURE__ */ React.createElement(Icon, { name: /* @__PURE__ */ React.createElement(IconX, null), size: 12 })
69
- ) : null);
84
+ return /* @__PURE__ */ React.createElement("span", { ...rest, ref, className: cx("aura-tag", props.disabled && "is-disabled", props.className) }, inner, props.onRemove && !props.disabled ? function() {
85
+ const btn = /* @__PURE__ */ React.createElement(
86
+ "button",
87
+ {
88
+ type: "button",
89
+ className: "aura-tag__remove",
90
+ "aria-label": props.removeLabel || t.remove(name),
91
+ onClick: props.onRemove
92
+ },
93
+ /* @__PURE__ */ React.createElement(Icon, { name: /* @__PURE__ */ React.createElement(IconX, null), size: 12 })
94
+ );
95
+ return /* @__PURE__ */ React.createElement(Tooltip, { content: fullText, open: fullText ? void 0 : false }, btn);
96
+ }() : null);
70
97
  });
71
98
  export {
72
99
  Tag
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;
@@ -433,6 +437,8 @@ export interface FormErrorSummaryProps {
433
437
  /** An applied filter, shown as a removable chip. */
434
438
  export interface ActiveFilter {
435
439
  id: string;
440
+ /** The chip's text, "{filter}: {value}". It takes its own width in the chips row; only a chip wider than the row is
441
+ * cut, and then its full text shows on hover and on the remove button's focus (5.28). */
436
442
  label: React$1.ReactNode;
437
443
  onRemove: () => void;
438
444
  }
@@ -1195,12 +1201,16 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
1195
1201
  /** `false` (5.13) drops the frame — border, radius, background — and the outer cells' side padding, so the table
1196
1202
  * lines up with the content around it, e.g. flush inside a Card under its heading. Default `true`. */
1197
1203
  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. */
1204
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): anywhere in a Card's content — also inside your own wrappers,
1205
+ * 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
1206
+ * or radius, keeping its header band and top rule, and its 24px outer cells keep the text level with the card's
1207
+ * content. As a direct child that is the card's last content, or with `bleedEnd`, it drops its bottom rule and the
1208
+ * card's radius closes it. Below the Card's `flushBelow` width, and outside a Card, it does nothing. With
1209
+ * `bordered={false}` too, the outer cells take the card's padding while it bleeds. */
1203
1210
  bleed?: boolean | undefined;
1211
+ /** With `bleed`: the table ends the card even though it sits inside your wrappers — only when nothing follows it in
1212
+ * the card and the Card has no `footer` (5.27). */
1213
+ bleedEnd?: boolean | undefined;
1204
1214
  /** Keep the header row in view while the rows scroll (5.26, Chamber-OS 129), with its band, its bottom rule and
1205
1215
  * above the body. Without `maxHeight` it pins to the page's scroll, under an AppShell's top bar
1206
1216
  * (`--aura-shell-bar-height`; set `--aura-table-sticky-top` for another offset). A table wider than its box
@@ -1720,8 +1730,9 @@ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>
1720
1730
  * the page's start (5.26, Chamber-OS 126). Default `center`. */
1721
1731
  align?: "center" | "start" | undefined;
1722
1732
  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). */
1733
+ /** Utilities that set `max-width`, `margin` or `padding` (e.g. `max-w-[672px] mx-0`, your own gutter) are supported
1734
+ * with `styles.layer.css`, where a utility beats `.aura-container` (5.26; padding 5.27). Also exported from
1735
+ * `/server` for Server Components (5.27). */
1725
1736
  className?: string | undefined;
1726
1737
  style?: React$1.CSSProperties | undefined;
1727
1738
  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;
@@ -433,6 +437,8 @@ export interface FormErrorSummaryProps {
433
437
  /** An applied filter, shown as a removable chip. */
434
438
  export interface ActiveFilter {
435
439
  id: string;
440
+ /** The chip's text, "{filter}: {value}". It takes its own width in the chips row; only a chip wider than the row is
441
+ * cut, and then its full text shows on hover and on the remove button's focus (5.28). */
436
442
  label: React$1.ReactNode;
437
443
  onRemove: () => void;
438
444
  }
@@ -1195,12 +1201,16 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
1195
1201
  /** `false` (5.13) drops the frame — border, radius, background — and the outer cells' side padding, so the table
1196
1202
  * lines up with the content around it, e.g. flush inside a Card under its heading. Default `true`. */
1197
1203
  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. */
1204
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): anywhere in a Card's content — also inside your own wrappers,
1205
+ * 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
1206
+ * or radius, keeping its header band and top rule, and its 24px outer cells keep the text level with the card's
1207
+ * content. As a direct child that is the card's last content, or with `bleedEnd`, it drops its bottom rule and the
1208
+ * card's radius closes it. Below the Card's `flushBelow` width, and outside a Card, it does nothing. With
1209
+ * `bordered={false}` too, the outer cells take the card's padding while it bleeds. */
1203
1210
  bleed?: boolean | undefined;
1211
+ /** With `bleed`: the table ends the card even though it sits inside your wrappers — only when nothing follows it in
1212
+ * the card and the Card has no `footer` (5.27). */
1213
+ bleedEnd?: boolean | undefined;
1204
1214
  /** Keep the header row in view while the rows scroll (5.26, Chamber-OS 129), with its band, its bottom rule and
1205
1215
  * above the body. Without `maxHeight` it pins to the page's scroll, under an AppShell's top bar
1206
1216
  * (`--aura-shell-bar-height`; set `--aura-table-sticky-top` for another offset). A table wider than its box
@@ -1720,8 +1730,9 @@ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>
1720
1730
  * the page's start (5.26, Chamber-OS 126). Default `center`. */
1721
1731
  align?: "center" | "start" | undefined;
1722
1732
  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). */
1733
+ /** Utilities that set `max-width`, `margin` or `padding` (e.g. `max-w-[672px] mx-0`, your own gutter) are supported
1734
+ * with `styles.layer.css`, where a utility beats `.aura-container` (5.26; padding 5.27). Also exported from
1735
+ * `/server` for Server Components (5.27). */
1725
1736
  className?: string | undefined;
1726
1737
  style?: React$1.CSSProperties | undefined;
1727
1738
  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
@@ -321,6 +321,7 @@ a.aura-icon-btn { text-decoration: none; }
321
321
  .aura-btn.aura-btn--touch.aura-btn--full { height: auto; min-height: var(--aura-touch-target); }
322
322
  .aura-icon-btn.aura-icon-btn--touch { width: var(--aura-touch-target); height: var(--aura-touch-target); }
323
323
  .aura-tag.aura-tag--touch { min-height: var(--aura-touch-target); }
324
+ .aura-filterbar__clear { min-height: var(--aura-touch-target); } /* 5.28 (Chamber-OS 133) */
324
325
  }
325
326
  /* Touch: same 32px look, a 44px hit area around it (WCAG 2.5.5). */
326
327
  @media (pointer: coarse) {
@@ -662,21 +663,22 @@ a.aura-icon-btn { text-decoration: none; }
662
663
  @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
664
  @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
665
  @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
666
+ /* 5.26 (Chamber-OS 127): bleed — a table anywhere in a Card's content (5.27, 130: through the app's own unpadded
667
+ * wrappers; a nested Card resets the reach) spans its inner width; the side
666
668
  * borders and radius go (a 0px bleed — a flush card — keeps them: 1px - min(1px, 0) = 1px). As the card's last content
667
669
  * it also drops its bottom rule and the card's radius closes it. */
668
670
  /* 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; }
671
+ .aura-card .aura-card__body .aura-bleed { margin-inline: calc(-1 * var(--aura-card-bleed)); width: auto; }
670
672
  /* 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 {
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 {
676
678
  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
679
  }
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 {
680
+ :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)); }
681
+ :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
682
  border-bottom-width: calc(1px - min(1px, var(--aura-card-bleed)));
681
683
  border-bottom-left-radius: calc(var(--aura-card-radius) - min(1px, var(--aura-card-bleed)));
682
684
  border-bottom-right-radius: calc(var(--aura-card-radius) - min(1px, var(--aura-card-bleed)));
@@ -1502,6 +1504,12 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1502
1504
  .aura-filterbar__count { font-size: 13px; color: var(--aura-fg-secondary); font-variant-numeric: tabular-nums; white-space: nowrap; }
1503
1505
  .aura-filterbar__actions { display: flex; align-items: center; gap: var(--aura-space-2); }
1504
1506
  .aura-filterbar__chips { display: flex; flex-wrap: wrap; align-items: center; gap: var(--aura-space-2); }
1507
+ /* 5.28 (Chamber-OS 132): an applied-filter chip takes its text's width, cut only when it is wider than the row. */
1508
+ .aura-filterbar__chips > .aura-tag { max-width: 100%; min-width: 0; }
1509
+ /* A long chip mustn't widen the bar or anything around it: the row's width comes from the bar, never from its chips.
1510
+ * (So a FilterBar with only chips needs a width from its parent — it is full width in a block.) */
1511
+ .aura-filterbar__chips { contain: inline-size; }
1512
+ .aura-filterbar__chips > .aura-tag .aura-tag__text { max-width: none; min-width: 0; }
1505
1513
  .aura-filterbar__clear {
1506
1514
  border: 0; background: transparent; padding: 4px var(--aura-space-2); border-radius: var(--aura-radius-sm);
1507
1515
  font: inherit; font-size: 13px; font-weight: 500; color: var(--aura-fg-accent); cursor: pointer; text-decoration: underline; text-underline-offset: 2px;
@@ -1788,7 +1796,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1788
1796
  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
1797
  }
1790
1798
  /* 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); }
1799
+ .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
1800
  }
1793
1801
  @container aura-tbl (width < 640px) {
1794
1802
  .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 +1820,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1812
1820
  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
1821
  }
1814
1822
  /* 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); }
1823
+ .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
1824
  }
1817
1825
 
1818
1826
  /* 5.15 (Chamber-OS 85): stackStyle="cards" — each stacked row its own card (DataTable's card spacing), no outer frame.
@@ -1820,8 +1828,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1820
1828
  .aura-tbl-cards { container: aura-tbl / inline-size; width: 100%; }
1821
1829
  @container aura-tbl (width < 768px) {
1822
1830
  .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); }
1831
+ .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); }
1832
+ :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
1833
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1826
1834
  .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
1835
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
@@ -1833,8 +1841,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1833
1841
  }
1834
1842
  @container aura-tbl (width < 640px) {
1835
1843
  .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); }
1844
+ .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); }
1845
+ :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
1846
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1839
1847
  .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
1848
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
@@ -1865,8 +1873,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1865
1873
  @container aura-stack (width < 9999.5px) {
1866
1874
  .aura-table { background: transparent; border: 0; border-radius: 0; overflow: visible; }
1867
1875
  /* 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); }
1876
+ .aura-card__body .aura-bleed .aura-bleed-frame { padding-inline: var(--aura-card-bleed); }
1877
+ :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
1878
  .aura-table__scroll { overflow: visible; height: auto; }
1871
1879
  .aura-table__busy-bar { top: 0; }
1872
1880
  .aura-table__picker { display: none; }