@jirawatpyk/aura-react 5.51.0 → 5.52.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.
@@ -43,6 +43,7 @@ __export(server_exports, {
43
43
  Stat: () => ServerStat,
44
44
  StatusPill: () => ServerStatusPill,
45
45
  StatusTile: () => ServerStatusTile,
46
+ TableSkeleton: () => TableSkeleton,
46
47
  TileGrid: () => TileGrid,
47
48
  brandScale: () => scale,
48
49
  breakpoints: () => breakpoints,
@@ -640,14 +641,14 @@ var STRINGS = {
640
641
 
641
642
  // src/theme.ts
642
643
  function hexToRgb(hex) {
643
- let h6 = String(hex).trim().replace("#", "");
644
- if (h6.length === 3)
645
- h6 = h6.split("").map(function(c) {
644
+ let h7 = String(hex).trim().replace("#", "");
645
+ if (h7.length === 3)
646
+ h7 = h7.split("").map(function(c) {
646
647
  return c + c;
647
648
  }).join("");
648
- if (!/^[0-9a-f]{6}$/i.test(h6)) throw new Error('createTheme: "' + hex + '" is not a #rgb or #rrggbb colour');
649
+ if (!/^[0-9a-f]{6}$/i.test(h7)) throw new Error('createTheme: "' + hex + '" is not a #rgb or #rrggbb colour');
649
650
  return [0, 2, 4].map(function(i) {
650
- return parseInt(h6.slice(i, i + 2), 16) / 255;
651
+ return parseInt(h7.slice(i, i + 2), 16) / 255;
651
652
  });
652
653
  }
653
654
  function rgbToHex(rgb) {
@@ -1439,10 +1440,171 @@ var Container = React4.forwardRef(function Container2(props, ref) {
1439
1440
  );
1440
1441
  });
1441
1442
 
1442
- // src/PageHeader.tsx
1443
+ // src/TableSkeleton.tsx
1443
1444
  var React5 = __toESM(require("react"), 1);
1444
1445
  var h4 = React5.createElement;
1445
- var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
1446
+ function inertProps() {
1447
+ return { inert: parseInt(React5.version, 10) >= 19 ? true : "", "aria-hidden": true };
1448
+ }
1449
+ function widthOf(w) {
1450
+ return w == null || w === "" ? void 0 : typeof w === "number" ? w + "px" : w;
1451
+ }
1452
+ function skeletonColgroup(cols) {
1453
+ return h4(
1454
+ "colgroup",
1455
+ null,
1456
+ cols.map(function(c, i) {
1457
+ const w = widthOf(c.width);
1458
+ return h4("col", { key: i, style: w ? { width: w } : void 0 });
1459
+ })
1460
+ );
1461
+ }
1462
+ function placeholder(c) {
1463
+ const s = c.skeleton || {};
1464
+ if (s.kind === "pill") return h4("span", { className: "aura-skel aura-skel--pill" });
1465
+ if (s.kind === "action") return h4("span", { className: cx("aura-skel aura-skel--action", s.touch && "is-touch") });
1466
+ if (s.lines === 2)
1467
+ return h4(
1468
+ "span",
1469
+ { className: "aura-skel-lines" },
1470
+ h4("span", { className: "aura-skel aura-skel--text", style: { width: "100%" } }),
1471
+ h4("span", { className: "aura-skel aura-skel--text", style: { width: "60%" } })
1472
+ );
1473
+ return h4("span", { className: "aura-skel aura-skel--text", style: { width: "80%" } });
1474
+ }
1475
+ function cellCls(base, c) {
1476
+ const align = c.align || (c.numeric ? "end" : void 0);
1477
+ return cx(base, align === "end" && "is-end", align === "center" && "is-center", c.numeric && "is-numeric");
1478
+ }
1479
+ function skeletonBody(cols, n3, stacked) {
1480
+ const rows = [];
1481
+ for (let r2 = 0; r2 < n3; r2++)
1482
+ rows.push(
1483
+ h4(
1484
+ "tr",
1485
+ { key: r2, className: "aura-tbl__row aura-tbl__row--skeleton", role: stacked ? "row" : void 0 },
1486
+ cols.map(function(c, i) {
1487
+ const slot = stacked && (c.card === "title" || c.card === "action") ? c.card : void 0;
1488
+ return h4(
1489
+ "td",
1490
+ {
1491
+ key: i,
1492
+ className: cellCls("aura-tbl__td", c),
1493
+ role: stacked ? "cell" : void 0,
1494
+ "data-label": stacked && !slot && c.label ? c.label : void 0,
1495
+ "data-card": slot
1496
+ },
1497
+ placeholder(c)
1498
+ );
1499
+ })
1500
+ )
1501
+ );
1502
+ return h4(
1503
+ "tbody",
1504
+ { key: "aura-skeleton", className: "aura-tbl__body", role: stacked ? "rowgroup" : void 0 },
1505
+ rows
1506
+ );
1507
+ }
1508
+ function tableWrapClass(p) {
1509
+ return cx(
1510
+ "aura-tbl-wrap",
1511
+ p.stackBelow && "is-stackable",
1512
+ p.bordered === false && "is-flush",
1513
+ p.bleed && "aura-bleed-frame",
1514
+ p.bleed && !p.cards && "aura-bleed",
1515
+ p.bleed && p.bleedEnd && !p.cards && "aura-bleed-end"
1516
+ );
1517
+ }
1518
+ function tableClass(p) {
1519
+ return cx(
1520
+ "aura-tbl",
1521
+ p.stackBelow && "aura-tbl--stack-" + p.stackBelow,
1522
+ (p.align === "middle" || p.rowHeight === "density" && p.align !== "top") && "aura-tbl--middle",
1523
+ p.rowHeight === "density" && "aura-tbl--row-density",
1524
+ p.cards && "aura-tbl--cards",
1525
+ p.className
1526
+ );
1527
+ }
1528
+ function cardsFrame(el, p) {
1529
+ return p.cards ? h4(
1530
+ "div",
1531
+ {
1532
+ className: cx(
1533
+ "aura-tbl-cards aura-tbl-cards--" + p.stackBelow,
1534
+ p.bleed && "aura-bleed",
1535
+ p.bleed && p.bleedEnd && "aura-bleed-end"
1536
+ )
1537
+ },
1538
+ el
1539
+ ) : el;
1540
+ }
1541
+ function TableSkeleton(props) {
1542
+ const cols = props.columns || [];
1543
+ const n3 = props.rows != null ? Math.max(0, props.rows) : 5;
1544
+ const stacked = !!props.stackBelow;
1545
+ const cards = stacked && props.stackStyle === "cards";
1546
+ const head = h4(
1547
+ "thead",
1548
+ { className: "aura-tbl__head", role: stacked ? "rowgroup" : void 0 },
1549
+ h4(
1550
+ "tr",
1551
+ { className: "aura-tbl__row", role: stacked ? "row" : void 0 },
1552
+ cols.map(function(c, i) {
1553
+ return h4(
1554
+ "th",
1555
+ { key: i, scope: "col", className: cellCls("aura-tbl__th", c), role: stacked ? "columnheader" : void 0 },
1556
+ c.label
1557
+ );
1558
+ })
1559
+ )
1560
+ );
1561
+ const table = h4(
1562
+ "div",
1563
+ Object.assign(
1564
+ {
1565
+ className: tableWrapClass({
1566
+ stackBelow: props.stackBelow,
1567
+ bordered: props.bordered,
1568
+ bleed: props.bleed,
1569
+ bleedEnd: props.bleedEnd,
1570
+ cards
1571
+ }),
1572
+ "data-density": props.density || "comfortable"
1573
+ },
1574
+ inertProps()
1575
+ ),
1576
+ h4(
1577
+ "table",
1578
+ {
1579
+ className: cx(
1580
+ tableClass({
1581
+ stackBelow: props.stackBelow,
1582
+ align: props.align,
1583
+ rowHeight: props.rowHeight,
1584
+ cards,
1585
+ className: props.className
1586
+ }),
1587
+ "aura-tbl--skeleton"
1588
+ ),
1589
+ role: stacked ? "table" : void 0
1590
+ },
1591
+ skeletonColgroup(cols),
1592
+ head,
1593
+ skeletonBody(cols, n3, stacked)
1594
+ )
1595
+ );
1596
+ return cardsFrame(table, {
1597
+ stackBelow: props.stackBelow,
1598
+ bleed: props.bleed,
1599
+ bleedEnd: props.bleedEnd,
1600
+ cards
1601
+ });
1602
+ }
1603
+
1604
+ // src/PageHeader.tsx
1605
+ var React6 = __toESM(require("react"), 1);
1606
+ var h5 = React6.createElement;
1607
+ var PageHeader = React6.forwardRef(function PageHeader2(props, ref) {
1446
1608
  const attrs2 = {};
1447
1609
  Object.keys(props).forEach(function(k) {
1448
1610
  if (k === "id" || k === "lang" || k === "dir" || k === "role" || /^(aria|data)-/.test(k))
@@ -1458,7 +1620,7 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
1458
1620
  const size = props.size === "compact" || props.size === "hero" || props.size === "hero-lg" ? props.size : null;
1459
1621
  const eyebrow = props.eyebrow;
1460
1622
  const plainEyebrow = typeof eyebrow === "string" || typeof eyebrow === "number";
1461
- const heading = h4(
1623
+ const heading = h5(
1462
1624
  "h" + level,
1463
1625
  {
1464
1626
  className: "aura-page-header__title",
@@ -1470,7 +1632,7 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
1470
1632
  );
1471
1633
  const hasActions = props.actions != null && props.actions !== false;
1472
1634
  const bar = hasActions && (props.actionsBarBelow === "sm" || props.actionsBarBelow === "md") ? props.actionsBarBelow : null;
1473
- return h4(
1635
+ return h5(
1474
1636
  "div",
1475
1637
  Object.assign(attrs2, {
1476
1638
  ref,
@@ -1487,32 +1649,32 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
1487
1649
  ),
1488
1650
  style: props.style
1489
1651
  }),
1490
- h4(
1652
+ h5(
1491
1653
  "div",
1492
1654
  { className: "aura-page-header__text" },
1493
- props.breadcrumb != null && props.breadcrumb !== false ? h4("div", { className: "aura-page-header__breadcrumb" }, props.breadcrumb) : null,
1494
- shown(eyebrow) ? plainEyebrow ? h4("p", { className: "aura-page-header__eyebrow" }, eyebrow) : h4("div", { className: "aura-page-header__eyebrow aura-page-header__eyebrow--rich" }, eyebrow) : null,
1495
- shown(props.titleAddon) ? h4(
1655
+ props.breadcrumb != null && props.breadcrumb !== false ? h5("div", { className: "aura-page-header__breadcrumb" }, props.breadcrumb) : null,
1656
+ shown(eyebrow) ? plainEyebrow ? h5("p", { className: "aura-page-header__eyebrow" }, eyebrow) : h5("div", { className: "aura-page-header__eyebrow aura-page-header__eyebrow--rich" }, eyebrow) : null,
1657
+ shown(props.titleAddon) ? h5(
1496
1658
  "div",
1497
1659
  { className: "aura-page-header__title-row" },
1498
1660
  heading,
1499
- h4("div", { className: "aura-page-header__title-addon" }, props.titleAddon)
1661
+ h5("div", { className: "aura-page-header__title-addon" }, props.titleAddon)
1500
1662
  ) : heading,
1501
- shown(props.subtitle) ? h4("div", { className: "aura-page-header__subtitle" }, props.subtitle) : null,
1502
- props.meta != null && props.meta !== false ? h4("div", { className: "aura-page-header__meta" }, props.meta) : null
1663
+ shown(props.subtitle) ? h5("div", { className: "aura-page-header__subtitle" }, props.subtitle) : null,
1664
+ props.meta != null && props.meta !== false ? h5("div", { className: "aura-page-header__meta" }, props.meta) : null
1503
1665
  ),
1504
- props.actions != null && props.actions !== false ? h4(
1666
+ props.actions != null && props.actions !== false ? h5(
1505
1667
  "div",
1506
1668
  { className: "aura-page-header__actions" },
1507
- bar && props.actionsStatus != null && props.actionsStatus !== false ? h4("div", { className: "aura-page-header__status", role: "status" }, props.actionsStatus) : null,
1669
+ bar && props.actionsStatus != null && props.actionsStatus !== false ? h5("div", { className: "aura-page-header__status", role: "status" }, props.actionsStatus) : null,
1508
1670
  props.actions
1509
1671
  ) : null
1510
1672
  );
1511
1673
  });
1512
1674
 
1513
1675
  // src/tiles.tsx
1514
- var React6 = __toESM(require("react"), 1);
1515
- var h5 = React6.createElement;
1676
+ var React7 = __toESM(require("react"), 1);
1677
+ var h6 = React7.createElement;
1516
1678
  var STATUS_ICON = {
1517
1679
  down: IconCircleAlert,
1518
1680
  problem: IconTriangleAlert,
@@ -1545,7 +1707,7 @@ function attrs(props) {
1545
1707
  });
1546
1708
  return out;
1547
1709
  }
1548
- var comma = h5("span", { className: "aura-status-tile__sep" }, ",");
1710
+ var comma = h6("span", { className: "aura-status-tile__sep" }, ",");
1549
1711
  function statusTileElement(props, ref, Link, t, titleRef) {
1550
1712
  const status = STATUS_ICON[props.status] ? props.status : "unknown";
1551
1713
  if (status !== props.status)
@@ -1561,43 +1723,43 @@ function statusTileElement(props, ref, Link, t, titleRef) {
1561
1723
  };
1562
1724
  const hasValue = has(props.value), hasMeta = has(props.meta);
1563
1725
  const Tag = props.href ? Link : "div";
1564
- return h5(
1726
+ return h6(
1565
1727
  Tag,
1566
1728
  Object.assign(attrs(props), {
1567
1729
  ref,
1568
1730
  href: props.href,
1569
1731
  className: cx("aura-status-tile", "aura-status-tile--" + status, props.href && "is-interactive", props.className)
1570
1732
  }),
1571
- h5(
1733
+ h6(
1572
1734
  "span",
1573
1735
  { className: "aura-status-tile__head" },
1574
- h5(Icon, { name: h5(STATUS_ICON[status]), size: 16, className: "aura-status-tile__icon" }),
1575
- h5("span", { className: "aura-status-tile__title", ref: titleRef }, props.title, comma),
1576
- h5("span", { className: "aura-sr-only" }, word + (hasValue || hasMeta || markers.length ? "," : "")),
1577
- hasValue ? h5(
1736
+ h6(Icon, { name: h6(STATUS_ICON[status]), size: 16, className: "aura-status-tile__icon" }),
1737
+ h6("span", { className: "aura-status-tile__title", ref: titleRef }, props.title, comma),
1738
+ h6("span", { className: "aura-sr-only" }, word + (hasValue || hasMeta || markers.length ? "," : "")),
1739
+ hasValue ? h6(
1578
1740
  "span",
1579
1741
  { className: cx("aura-status-tile__value", "is-" + valueTone) },
1580
1742
  props.value,
1581
1743
  hasMeta || markers.length ? comma : null
1582
1744
  ) : null
1583
1745
  ),
1584
- hasMeta || markers.length ? h5(
1746
+ hasMeta || markers.length ? h6(
1585
1747
  "span",
1586
1748
  { className: "aura-status-tile__foot" },
1587
- hasMeta ? h5("span", { className: "aura-status-tile__meta" }, props.meta, markers.length ? comma : null) : null,
1588
- markers.length ? h5(
1749
+ hasMeta ? h6("span", { className: "aura-status-tile__meta" }, props.meta, markers.length ? comma : null) : null,
1750
+ markers.length ? h6(
1589
1751
  "span",
1590
1752
  { className: "aura-status-tile__markers" },
1591
1753
  markers.map(function(m, i) {
1592
- return h5(
1754
+ return h6(
1593
1755
  "span",
1594
1756
  {
1595
1757
  key: i,
1596
1758
  className: cx("aura-status-tile__marker", "is-" + (m.tone || "neutral")),
1597
1759
  "data-aura-tip": m.label
1598
1760
  },
1599
- h5(Icon, { name: m.icon, size: 14 }),
1600
- h5("span", { className: "aura-sr-only" }, m.label + (i < markers.length - 1 ? "," : ""))
1761
+ h6(Icon, { name: m.icon, size: 14 }),
1762
+ h6("span", { className: "aura-sr-only" }, m.label + (i < markers.length - 1 ? "," : ""))
1601
1763
  );
1602
1764
  })
1603
1765
  ) : null
@@ -1607,13 +1769,13 @@ function statusTileElement(props, ref, Link, t, titleRef) {
1607
1769
  function ServerStatusTile(props) {
1608
1770
  return statusTileElement(props, void 0, props.linkComponent || "a", STRINGS.en);
1609
1771
  }
1610
- var TileGrid = React6.forwardRef(function TileGrid2(props, ref) {
1772
+ var TileGrid = React7.forwardRef(function TileGrid2(props, ref) {
1611
1773
  const style = Object.assign(
1612
1774
  {},
1613
1775
  respVars("aura-grid-cols", props.columns == null ? { base: 2, md: 3 } : props.columns),
1614
1776
  props.style
1615
1777
  );
1616
- return h5(
1778
+ return h6(
1617
1779
  "ul",
1618
1780
  Object.assign(attrs(props), {
1619
1781
  ref,
@@ -1623,16 +1785,16 @@ var TileGrid = React6.forwardRef(function TileGrid2(props, ref) {
1623
1785
  }),
1624
1786
  /* toArray drops null and booleans and keys each element; a Fragment's children are items too. */
1625
1787
  flat(props.children).map(function(c, i) {
1626
- return h5("li", { key: React6.isValidElement(c) && c.key != null ? c.key : i }, c);
1788
+ return h6("li", { key: React7.isValidElement(c) && c.key != null ? c.key : i }, c);
1627
1789
  })
1628
1790
  );
1629
1791
  });
1630
1792
  function flat(children) {
1631
1793
  const out = [];
1632
- React6.Children.toArray(children).forEach(function(c) {
1633
- if (React6.isValidElement(c) && c.type === React6.Fragment)
1794
+ React7.Children.toArray(children).forEach(function(c) {
1795
+ if (React7.isValidElement(c) && c.type === React7.Fragment)
1634
1796
  flat(c.props.children).forEach(function(x) {
1635
- out.push(React6.isValidElement(x) ? React6.cloneElement(x, { key: String(c.key) + "/" + String(x.key) }) : x);
1797
+ out.push(React7.isValidElement(x) ? React7.cloneElement(x, { key: String(c.key) + "/" + String(x.key) }) : x);
1636
1798
  });
1637
1799
  else if (c !== "") out.push(c);
1638
1800
  });
@@ -1646,7 +1808,7 @@ function r(n3) {
1646
1808
  function num(v) {
1647
1809
  return typeof v === "number" && isFinite(v) ? v : null;
1648
1810
  }
1649
- var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
1811
+ var Sparkline = React7.forwardRef(function Sparkline2(props, ref) {
1650
1812
  const wh = SIZES2[props.size || "sm"] || SIZES2.sm;
1651
1813
  const W = wh[0], H = wh[1];
1652
1814
  const data = (props.data || []).map(num);
@@ -1676,7 +1838,7 @@ var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
1676
1838
  data.forEach(function(v, i) {
1677
1839
  if (v == null) return;
1678
1840
  const prev = i > 0 && data[i - 1] != null, next = i < n3 - 1 && data[i + 1] != null;
1679
- if (!prev && !next) dots.push(h5("circle", { key: "d" + i, cx: r(x(i)), cy: r(y(v)), r: 1.5 }));
1841
+ if (!prev && !next) dots.push(h6("circle", { key: "d" + i, cx: r(x(i)), cy: r(y(v)), r: 1.5 }));
1680
1842
  else d += (prev ? "L" : "M") + r(x(i)) + " " + r(y(v));
1681
1843
  });
1682
1844
  const mode = props.failures || "none";
@@ -1686,10 +1848,10 @@ var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
1686
1848
  if (!props.failed[i]) return;
1687
1849
  if (mode === "band") {
1688
1850
  const w = Math.max(2, step || W), left = Math.max(0, x(i) - w / 2), right = Math.min(W, x(i) + w / 2);
1689
- fails.push(h5("rect", { key: "f" + i, x: r(left), y: 0, width: r(right - left), height: H }));
1851
+ fails.push(h6("rect", { key: "f" + i, x: r(left), y: 0, width: r(right - left), height: H }));
1690
1852
  } else
1691
1853
  fails.push(
1692
- h5("rect", {
1854
+ h6("rect", {
1693
1855
  key: "f" + i,
1694
1856
  x: r(Math.max(0, Math.min(W - 1.5, x(i) - 0.75))),
1695
1857
  y: H - 6,
@@ -1699,7 +1861,7 @@ var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
1699
1861
  );
1700
1862
  });
1701
1863
  const named = !!props.label;
1702
- return h5(
1864
+ return h6(
1703
1865
  "svg",
1704
1866
  Object.assign(attrs(props), {
1705
1867
  ref,
@@ -1712,9 +1874,9 @@ var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
1712
1874
  "aria-hidden": named ? void 0 : true,
1713
1875
  focusable: "false"
1714
1876
  }),
1715
- fails.length && mode === "band" ? h5("g", { className: "aura-sparkline__band" }, fails) : null,
1716
- d ? h5("path", { className: "aura-sparkline__line", d }) : null,
1717
- dots.length ? h5("g", { className: "aura-sparkline__dots" }, dots) : null,
1718
- fails.length && mode === "ticks" ? h5("g", { className: "aura-sparkline__ticks" }, fails) : null
1877
+ fails.length && mode === "band" ? h6("g", { className: "aura-sparkline__band" }, fails) : null,
1878
+ d ? h6("path", { className: "aura-sparkline__line", d }) : null,
1879
+ dots.length ? h6("g", { className: "aura-sparkline__dots" }, dots) : null,
1880
+ fails.length && mode === "ticks" ? h6("g", { className: "aura-sparkline__ticks" }, fails) : null
1719
1881
  );
1720
1882
  });
@@ -117,6 +117,43 @@ export type DataAttributes = {
117
117
  };
118
118
  export type Breakpoint = "base" | "sm" | "md" | "lg" | "xl";
119
119
  export type Responsive<T> = T | Partial<Record<Breakpoint, T>>;
120
+ /** 5.52 (Chamber-OS 164): what a loading column's placeholder cell looks like. */
121
+ export interface TableSkeletonHint {
122
+ /** Text lines: 2 for a value over its caption. Default 1. */
123
+ lines?: 1 | 2 | undefined;
124
+ /** `text` (default) bars, a status `pill`, or an `action` block as tall as a small Button (44px on a phone card or a
125
+ * touch screen with `touch`). */
126
+ kind?: "text" | "pill" | "action" | undefined;
127
+ /** An `action` block 44px below 640px and on a coarse pointer, as `touchHeight` buttons are. */
128
+ touch?: boolean | undefined;
129
+ }
130
+ /** 5.52 (Chamber-OS 164): one column of a `TableSkeleton` — the same facts a header cell gives a loading Table. */
131
+ export interface TableSkeletonColumn {
132
+ /** Header text (and the stacked card's field label). */
133
+ label?: string | undefined;
134
+ /** Column width: a share such as `'22%'`, or px. Columns without one split what is left evenly. */
135
+ width?: string | number | undefined;
136
+ align?: "start" | "center" | "end" | undefined;
137
+ numeric?: boolean | undefined;
138
+ /** Its place in a stacked row: `title`, `action` or `field` (default), as on a Td. */
139
+ card?: "title" | "action" | "field" | undefined;
140
+ skeleton?: TableSkeletonHint | undefined;
141
+ }
142
+ /** 5.52 (Chamber-OS 164): a loading Table for Server Components. Same frame, density, stacking and cards as Table. */
143
+ export interface TableSkeletonProps {
144
+ columns: TableSkeletonColumn[];
145
+ /** Placeholder rows (default 5). */
146
+ rows?: number | undefined;
147
+ density?: "comfortable" | "compact" | undefined;
148
+ stackBelow?: "sm" | "md" | undefined;
149
+ stackStyle?: "list" | "cards" | undefined;
150
+ bordered?: boolean | undefined;
151
+ bleed?: boolean | undefined;
152
+ bleedEnd?: boolean | undefined;
153
+ rowHeight?: "density" | undefined;
154
+ align?: "top" | "middle" | undefined;
155
+ className?: string | undefined;
156
+ }
120
157
  export interface StatChange {
121
158
  /** Shown as written, e.g. "+12%" or "−3". */
122
159
  value: React$1.ReactNode;
@@ -487,6 +524,9 @@ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>
487
524
  }
488
525
  /** Container — centres content up to aura-container-max (1280px) with responsive side padding. */
489
526
  export declare const Container: React$1.ForwardRefExoticComponent<ContainerProps & React$1.RefAttributes<HTMLElement>>;
527
+ /** A loading Table (5.52, Chamber-OS 164), for Server Components — e.g. a route's loading.tsx. `aria-hidden` and
528
+ * `inert`: announce the load in the page's own status line. */
529
+ export declare function TableSkeleton(props: TableSkeletonProps): React$1.ReactElement;
490
530
  /** PageHeader (5.32, DxT Monitor request 3): the top of a page — an eyebrow, the page's heading, a meta line and the
491
531
  * page's actions. It has no outer padding: inside AppShell, the content padding is the page margin (16px at the sides
492
532
  * and 24px top and bottom on phones, 24px from 640px, 32px from 1024px). Stateless, so it is also exported from
@@ -117,6 +117,43 @@ export type DataAttributes = {
117
117
  };
118
118
  export type Breakpoint = "base" | "sm" | "md" | "lg" | "xl";
119
119
  export type Responsive<T> = T | Partial<Record<Breakpoint, T>>;
120
+ /** 5.52 (Chamber-OS 164): what a loading column's placeholder cell looks like. */
121
+ export interface TableSkeletonHint {
122
+ /** Text lines: 2 for a value over its caption. Default 1. */
123
+ lines?: 1 | 2 | undefined;
124
+ /** `text` (default) bars, a status `pill`, or an `action` block as tall as a small Button (44px on a phone card or a
125
+ * touch screen with `touch`). */
126
+ kind?: "text" | "pill" | "action" | undefined;
127
+ /** An `action` block 44px below 640px and on a coarse pointer, as `touchHeight` buttons are. */
128
+ touch?: boolean | undefined;
129
+ }
130
+ /** 5.52 (Chamber-OS 164): one column of a `TableSkeleton` — the same facts a header cell gives a loading Table. */
131
+ export interface TableSkeletonColumn {
132
+ /** Header text (and the stacked card's field label). */
133
+ label?: string | undefined;
134
+ /** Column width: a share such as `'22%'`, or px. Columns without one split what is left evenly. */
135
+ width?: string | number | undefined;
136
+ align?: "start" | "center" | "end" | undefined;
137
+ numeric?: boolean | undefined;
138
+ /** Its place in a stacked row: `title`, `action` or `field` (default), as on a Td. */
139
+ card?: "title" | "action" | "field" | undefined;
140
+ skeleton?: TableSkeletonHint | undefined;
141
+ }
142
+ /** 5.52 (Chamber-OS 164): a loading Table for Server Components. Same frame, density, stacking and cards as Table. */
143
+ export interface TableSkeletonProps {
144
+ columns: TableSkeletonColumn[];
145
+ /** Placeholder rows (default 5). */
146
+ rows?: number | undefined;
147
+ density?: "comfortable" | "compact" | undefined;
148
+ stackBelow?: "sm" | "md" | undefined;
149
+ stackStyle?: "list" | "cards" | undefined;
150
+ bordered?: boolean | undefined;
151
+ bleed?: boolean | undefined;
152
+ bleedEnd?: boolean | undefined;
153
+ rowHeight?: "density" | undefined;
154
+ align?: "top" | "middle" | undefined;
155
+ className?: string | undefined;
156
+ }
120
157
  export interface StatChange {
121
158
  /** Shown as written, e.g. "+12%" or "−3". */
122
159
  value: React$1.ReactNode;
@@ -487,6 +524,9 @@ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>
487
524
  }
488
525
  /** Container — centres content up to aura-container-max (1280px) with responsive side padding. */
489
526
  export declare const Container: React$1.ForwardRefExoticComponent<ContainerProps & React$1.RefAttributes<HTMLElement>>;
527
+ /** A loading Table (5.52, Chamber-OS 164), for Server Components — e.g. a route's loading.tsx. `aria-hidden` and
528
+ * `inert`: announce the load in the page's own status line. */
529
+ export declare function TableSkeleton(props: TableSkeletonProps): React$1.ReactElement;
490
530
  /** PageHeader (5.32, DxT Monitor request 3): the top of a page — an eyebrow, the page's heading, a meta line and the
491
531
  * page's actions. It has no outer padding: inside AppShell, the content padding is the page margin (16px at the sides
492
532
  * and 24px top and bottom on phones, 24px from 640px, 32px from 1024px). Stateless, so it is also exported from