@jirawatpyk/aura-react 5.50.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.
- package/README.md +33 -0
- package/dist/aura.bundle.js +438 -208
- package/dist/cjs/index.cjs +437 -207
- package/dist/esm/DataTable.js +23 -10
- package/dist/esm/Table.js +52 -7
- package/dist/esm/TableSkeleton.js +170 -0
- package/dist/esm/display.js +11 -2
- package/dist/esm/index.js +2 -0
- package/dist/index.d.cts +76 -0
- package/dist/index.d.ts +76 -0
- package/dist/server/index.cjs +221 -50
- package/dist/server/index.d.cts +43 -0
- package/dist/server/index.d.ts +43 -0
- package/dist/server/index.js +221 -50
- package/dist/styles.css +31 -4
- package/dist/styles.layer.css +31 -4
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -89,12 +89,22 @@ export interface DataTableColumn<Row extends Record<string, any> = Record<string
|
|
|
89
89
|
tones?: Record<string, StatusTone> | undefined;
|
|
90
90
|
/** Header becomes a button cycling asc → desc → unsorted. */
|
|
91
91
|
sortable?: boolean | undefined;
|
|
92
|
+
/** 5.51 (Chamber-OS 157): the order this column is in when the page sets it (from the URL, say), not a header
|
|
93
|
+
* button — puts `aria-sort` on the header, with no button, icon or click. Give it to one column. Once the table has
|
|
94
|
+
* its own sort (someone used a sortable header, or `sort` is set) that wins and this is ignored, so only one header
|
|
95
|
+
* claims the order. */
|
|
96
|
+
sortDirection?: "ascending" | "descending" | undefined;
|
|
92
97
|
/** Value to sort by, when not the cell value (dates, amounts). */
|
|
93
98
|
sortValue?: RowCallback<string | number | null, Row> | undefined;
|
|
94
99
|
/** Custom cell content. */
|
|
95
100
|
render?: RowCallback<React$1.ReactNode, Row> | undefined;
|
|
96
101
|
/** Set false to keep a sized column fixed when the table is `resizable`. */
|
|
97
102
|
resizable?: boolean | undefined;
|
|
103
|
+
/** 5.51 (Chamber-OS 162): a flexible column's share of the spare width (its cells' flex-grow; default 1) — e.g.
|
|
104
|
+
* `grow: 3` lets row actions sit side by side once the table is wide. At the minimum width nothing changes; the row
|
|
105
|
+
* minimum ignores it; a fixed `width` column and stacked cards ignore it. `0` keeps the column at its minimum; leave
|
|
106
|
+
* at least one flexible column above 0, or the rows won't fill a wide table. */
|
|
107
|
+
grow?: number | undefined;
|
|
98
108
|
/** Resize limits in px. Defaults 64 / 480. For the flexible column, minWidth defaults to 160. */
|
|
99
109
|
minWidth?: number | undefined;
|
|
100
110
|
maxWidth?: number | undefined;
|
|
@@ -160,6 +170,15 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
|
|
|
160
170
|
onSortChange?: ((sort: DataTableSort | null) => void) | undefined;
|
|
161
171
|
/** Adds a checkbox column. */
|
|
162
172
|
selectable?: boolean | undefined;
|
|
173
|
+
/** 5.51 (Chamber-OS 161): how the keyboard moves through the table. `'grid'` (default): the table is one Tab stop,
|
|
174
|
+
* the arrows move between cells and Enter or F2 enters a cell's controls (APG grid). `'tab'`: every checkbox, sort
|
|
175
|
+
* and column button, row link and row action is an ordinary Tab stop in reading order (Shift+Tab walks back), for a
|
|
176
|
+
* list whose rows carry actions people expect to Tab to; the cells are not Tab stops, the arrows still move between
|
|
177
|
+
* them once focus is in one (click a cell, or Escape from a control), and the grid's row and column semantics stay. */
|
|
178
|
+
keyboard?: "grid" | "tab" | undefined;
|
|
179
|
+
/** 5.51 (Chamber-OS 157): a ref to the select-all checkbox (an `<input>`), e.g. to return focus to it after a bulk
|
|
180
|
+
* bar's Clear. Null while the page has no selectable rows. */
|
|
181
|
+
selectAllRef?: React$1.Ref<HTMLInputElement> | undefined;
|
|
163
182
|
/** Which rows can be selected (5.6). A row it rejects shows no checkbox (the cell stays, so columns line up), is
|
|
164
183
|
* skipped by select-all, Space and the count, and never appears in `onSelectionChange` — even if passed in. */
|
|
165
184
|
isRowSelectable?: RowCallback<boolean, Row> | undefined;
|
|
@@ -307,6 +326,9 @@ export type StatusTone = "neutral" | "progress" | "ready" | "warning" | "blocked
|
|
|
307
326
|
export interface StatusPillProps extends Omit<React$1.HTMLAttributes<HTMLSpanElement>, "children"> {
|
|
308
327
|
/** The status word shown, e.g. "In Progress". Other attributes (`id`, `data-*`, `aria-*`) go on the pill (5.8). */
|
|
309
328
|
children: React$1.ReactNode;
|
|
329
|
+
/** 5.51 (Chamber-OS 158): in a box narrower than the words, the text wraps inside the pill (still rounded, the icon
|
|
330
|
+
* on the first line) instead of running out of it. Without it a pill stays on one line. */
|
|
331
|
+
wrap?: boolean | undefined;
|
|
310
332
|
/** Force a tone. Default: matched from the word (Ready/Done → ready, In Progress/In Review → progress, Warning/Problem/Degraded/At risk → warning (5.1), Blocked/Failed → blocked, anything else → neutral). */
|
|
311
333
|
tone?: StatusTone | undefined;
|
|
312
334
|
className?: string | undefined;
|
|
@@ -1343,9 +1365,54 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
|
|
|
1343
1365
|
* `rowHeight="auto"`. Content is centred on the row unless `align="top"`. Rows whose text wraps still grow (with the
|
|
1344
1366
|
* smaller padding). Header and footer rows, and stacked rows (`stackBelow`), are unchanged. */
|
|
1345
1367
|
rowHeight?: "density" | undefined;
|
|
1368
|
+
/** 5.52 (Chamber-OS 164): draw the table while its rows load — the head as given, then `loadingRows` placeholder
|
|
1369
|
+
* rows in the same columns (and, below `stackBelow`, the same cards). Each column's placeholder follows its header
|
|
1370
|
+
* cell's `skeleton` hint, width (`skeletonWidth`, else its `width`, else an even share) and `card` role. The whole
|
|
1371
|
+
* table is `aria-hidden` and `inert` meanwhile: announce the load in your own status line. TBody and TFoot children
|
|
1372
|
+
* are not rendered. For a Server Component (a route's loading.tsx) use `TableSkeleton` from `/server`. */
|
|
1373
|
+
loading?: boolean | undefined;
|
|
1374
|
+
/** Placeholder rows while `loading` (default 5). */
|
|
1375
|
+
loadingRows?: number | undefined;
|
|
1346
1376
|
className?: string | undefined;
|
|
1347
1377
|
children?: React$1.ReactNode | undefined;
|
|
1348
1378
|
}
|
|
1379
|
+
/** 5.52 (Chamber-OS 164): what a loading column's placeholder cell looks like. */
|
|
1380
|
+
export interface TableSkeletonHint {
|
|
1381
|
+
/** Text lines: 2 for a value over its caption. Default 1. */
|
|
1382
|
+
lines?: 1 | 2 | undefined;
|
|
1383
|
+
/** `text` (default) bars, a status `pill`, or an `action` block as tall as a small Button (44px on a phone card or a
|
|
1384
|
+
* touch screen with `touch`). */
|
|
1385
|
+
kind?: "text" | "pill" | "action" | undefined;
|
|
1386
|
+
/** An `action` block 44px below 640px and on a coarse pointer, as `touchHeight` buttons are. */
|
|
1387
|
+
touch?: boolean | undefined;
|
|
1388
|
+
}
|
|
1389
|
+
/** 5.52 (Chamber-OS 164): one column of a `TableSkeleton` — the same facts a header cell gives a loading Table. */
|
|
1390
|
+
export interface TableSkeletonColumn {
|
|
1391
|
+
/** Header text (and the stacked card's field label). */
|
|
1392
|
+
label?: string | undefined;
|
|
1393
|
+
/** Column width: a share such as `'22%'`, or px. Columns without one split what is left evenly. */
|
|
1394
|
+
width?: string | number | undefined;
|
|
1395
|
+
align?: "start" | "center" | "end" | undefined;
|
|
1396
|
+
numeric?: boolean | undefined;
|
|
1397
|
+
/** Its place in a stacked row: `title`, `action` or `field` (default), as on a Td. */
|
|
1398
|
+
card?: "title" | "action" | "field" | undefined;
|
|
1399
|
+
skeleton?: TableSkeletonHint | undefined;
|
|
1400
|
+
}
|
|
1401
|
+
/** 5.52 (Chamber-OS 164): a loading Table for Server Components. Same frame, density, stacking and cards as Table. */
|
|
1402
|
+
export interface TableSkeletonProps {
|
|
1403
|
+
columns: TableSkeletonColumn[];
|
|
1404
|
+
/** Placeholder rows (default 5). */
|
|
1405
|
+
rows?: number | undefined;
|
|
1406
|
+
density?: "comfortable" | "compact" | undefined;
|
|
1407
|
+
stackBelow?: "sm" | "md" | undefined;
|
|
1408
|
+
stackStyle?: "list" | "cards" | undefined;
|
|
1409
|
+
bordered?: boolean | undefined;
|
|
1410
|
+
bleed?: boolean | undefined;
|
|
1411
|
+
bleedEnd?: boolean | undefined;
|
|
1412
|
+
rowHeight?: "density" | undefined;
|
|
1413
|
+
align?: "top" | "middle" | undefined;
|
|
1414
|
+
className?: string | undefined;
|
|
1415
|
+
}
|
|
1349
1416
|
export interface TableSectionProps extends React$1.HTMLAttributes<HTMLTableSectionElement> {
|
|
1350
1417
|
className?: string | undefined;
|
|
1351
1418
|
}
|
|
@@ -1367,6 +1434,12 @@ export interface TableCellProps extends Omit<React$1.TdHTMLAttributes<HTMLTableC
|
|
|
1367
1434
|
* without a label; `action` sits at the end of that line at its natural size; `field` (default) is a labelled field,
|
|
1368
1435
|
* two to a line under them. */
|
|
1369
1436
|
card?: "title" | "action" | "field" | undefined;
|
|
1437
|
+
/** Th in the head only (5.52, Chamber-OS 164): what this column's placeholder cells look like while the Table is
|
|
1438
|
+
* `loading`. On a head cell, `card` also gives the placeholder cells their place in a stacked row. */
|
|
1439
|
+
skeleton?: TableSkeletonHint | undefined;
|
|
1440
|
+
/** Th in the head only (5.52): this column's width while loading — a share such as `'22%'` — when the loaded table
|
|
1441
|
+
* sizes it from its content. Default: the cell's `width`, else an even share. */
|
|
1442
|
+
skeletonWidth?: string | number | undefined;
|
|
1370
1443
|
className?: string | undefined;
|
|
1371
1444
|
}
|
|
1372
1445
|
export interface ActionBarProps {
|
|
@@ -2146,6 +2219,9 @@ export declare const Tr: React$1.ForwardRefExoticComponent<TableRowProps & React
|
|
|
2146
2219
|
export declare const Th: React$1.ForwardRefExoticComponent<TableCellProps & React$1.RefAttributes<HTMLTableCellElement>>;
|
|
2147
2220
|
/** Data cell. `numeric` right-aligns with tabular figures (money, counts). */
|
|
2148
2221
|
export declare const Td: React$1.ForwardRefExoticComponent<TableCellProps & React$1.RefAttributes<HTMLTableCellElement>>;
|
|
2222
|
+
/** A loading Table (5.52, Chamber-OS 164), for Server Components — e.g. a route's loading.tsx. `aria-hidden` and
|
|
2223
|
+
* `inert`: announce the load in the page's own status line. */
|
|
2224
|
+
export declare function TableSkeleton(props: TableSkeletonProps): React$1.ReactElement;
|
|
2149
2225
|
/** BottomNav — a phone tab bar: icon over a short label, a count or dot, the current page marked. Fixed to the bottom,
|
|
2150
2226
|
* padded for the home indicator, with a spacer of the same height in the flow so nothing sits under it. Which
|
|
2151
2227
|
* breakpoints show it is decided in CSS, so the server's HTML is already right and nothing shifts on hydration. */
|
package/dist/server/index.cjs
CHANGED
|
@@ -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
|
|
644
|
-
if (
|
|
645
|
-
|
|
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(
|
|
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(
|
|
651
|
+
return parseInt(h7.slice(i, i + 2), 16) / 255;
|
|
651
652
|
});
|
|
652
653
|
}
|
|
653
654
|
function rgbToHex(rgb) {
|
|
@@ -1240,8 +1241,17 @@ var PILL_ICON = {
|
|
|
1240
1241
|
};
|
|
1241
1242
|
function statusPillElement(props, ref) {
|
|
1242
1243
|
const tone2 = props.tone || toneFor(props.children);
|
|
1243
|
-
const rest = omit(props, ["tone", "className", "children"]);
|
|
1244
|
-
return /* @__PURE__ */ React3.createElement(
|
|
1244
|
+
const rest = omit(props, ["tone", "className", "children", "wrap"]);
|
|
1245
|
+
return /* @__PURE__ */ React3.createElement(
|
|
1246
|
+
"span",
|
|
1247
|
+
{
|
|
1248
|
+
...rest,
|
|
1249
|
+
ref,
|
|
1250
|
+
className: cx("aura-pill", "aura-pill--" + tone2, props.wrap && "is-wrap", props.className)
|
|
1251
|
+
},
|
|
1252
|
+
/* @__PURE__ */ React3.createElement(Icon, { name: h2(PILL_ICON[tone2] || IconCircle), size: 12 }),
|
|
1253
|
+
props.wrap ? /* @__PURE__ */ React3.createElement("span", { className: "aura-pill__text" }, props.children) : props.children
|
|
1254
|
+
);
|
|
1245
1255
|
}
|
|
1246
1256
|
function badgeElement(props, ref) {
|
|
1247
1257
|
const rest = omit(props, ["tone", "variant", "icon", "className", "children"]);
|
|
@@ -1430,10 +1440,171 @@ var Container = React4.forwardRef(function Container2(props, ref) {
|
|
|
1430
1440
|
);
|
|
1431
1441
|
});
|
|
1432
1442
|
|
|
1433
|
-
// src/
|
|
1443
|
+
// src/TableSkeleton.tsx
|
|
1434
1444
|
var React5 = __toESM(require("react"), 1);
|
|
1435
1445
|
var h4 = React5.createElement;
|
|
1436
|
-
|
|
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) {
|
|
1437
1608
|
const attrs2 = {};
|
|
1438
1609
|
Object.keys(props).forEach(function(k) {
|
|
1439
1610
|
if (k === "id" || k === "lang" || k === "dir" || k === "role" || /^(aria|data)-/.test(k))
|
|
@@ -1449,7 +1620,7 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
|
|
|
1449
1620
|
const size = props.size === "compact" || props.size === "hero" || props.size === "hero-lg" ? props.size : null;
|
|
1450
1621
|
const eyebrow = props.eyebrow;
|
|
1451
1622
|
const plainEyebrow = typeof eyebrow === "string" || typeof eyebrow === "number";
|
|
1452
|
-
const heading =
|
|
1623
|
+
const heading = h5(
|
|
1453
1624
|
"h" + level,
|
|
1454
1625
|
{
|
|
1455
1626
|
className: "aura-page-header__title",
|
|
@@ -1461,7 +1632,7 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
|
|
|
1461
1632
|
);
|
|
1462
1633
|
const hasActions = props.actions != null && props.actions !== false;
|
|
1463
1634
|
const bar = hasActions && (props.actionsBarBelow === "sm" || props.actionsBarBelow === "md") ? props.actionsBarBelow : null;
|
|
1464
|
-
return
|
|
1635
|
+
return h5(
|
|
1465
1636
|
"div",
|
|
1466
1637
|
Object.assign(attrs2, {
|
|
1467
1638
|
ref,
|
|
@@ -1478,32 +1649,32 @@ var PageHeader = React5.forwardRef(function PageHeader2(props, ref) {
|
|
|
1478
1649
|
),
|
|
1479
1650
|
style: props.style
|
|
1480
1651
|
}),
|
|
1481
|
-
|
|
1652
|
+
h5(
|
|
1482
1653
|
"div",
|
|
1483
1654
|
{ className: "aura-page-header__text" },
|
|
1484
|
-
props.breadcrumb != null && props.breadcrumb !== false ?
|
|
1485
|
-
shown(eyebrow) ? plainEyebrow ?
|
|
1486
|
-
shown(props.titleAddon) ?
|
|
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(
|
|
1487
1658
|
"div",
|
|
1488
1659
|
{ className: "aura-page-header__title-row" },
|
|
1489
1660
|
heading,
|
|
1490
|
-
|
|
1661
|
+
h5("div", { className: "aura-page-header__title-addon" }, props.titleAddon)
|
|
1491
1662
|
) : heading,
|
|
1492
|
-
shown(props.subtitle) ?
|
|
1493
|
-
props.meta != null && props.meta !== false ?
|
|
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
|
|
1494
1665
|
),
|
|
1495
|
-
props.actions != null && props.actions !== false ?
|
|
1666
|
+
props.actions != null && props.actions !== false ? h5(
|
|
1496
1667
|
"div",
|
|
1497
1668
|
{ className: "aura-page-header__actions" },
|
|
1498
|
-
bar && props.actionsStatus != null && props.actionsStatus !== false ?
|
|
1669
|
+
bar && props.actionsStatus != null && props.actionsStatus !== false ? h5("div", { className: "aura-page-header__status", role: "status" }, props.actionsStatus) : null,
|
|
1499
1670
|
props.actions
|
|
1500
1671
|
) : null
|
|
1501
1672
|
);
|
|
1502
1673
|
});
|
|
1503
1674
|
|
|
1504
1675
|
// src/tiles.tsx
|
|
1505
|
-
var
|
|
1506
|
-
var
|
|
1676
|
+
var React7 = __toESM(require("react"), 1);
|
|
1677
|
+
var h6 = React7.createElement;
|
|
1507
1678
|
var STATUS_ICON = {
|
|
1508
1679
|
down: IconCircleAlert,
|
|
1509
1680
|
problem: IconTriangleAlert,
|
|
@@ -1536,7 +1707,7 @@ function attrs(props) {
|
|
|
1536
1707
|
});
|
|
1537
1708
|
return out;
|
|
1538
1709
|
}
|
|
1539
|
-
var comma =
|
|
1710
|
+
var comma = h6("span", { className: "aura-status-tile__sep" }, ",");
|
|
1540
1711
|
function statusTileElement(props, ref, Link, t, titleRef) {
|
|
1541
1712
|
const status = STATUS_ICON[props.status] ? props.status : "unknown";
|
|
1542
1713
|
if (status !== props.status)
|
|
@@ -1552,43 +1723,43 @@ function statusTileElement(props, ref, Link, t, titleRef) {
|
|
|
1552
1723
|
};
|
|
1553
1724
|
const hasValue = has(props.value), hasMeta = has(props.meta);
|
|
1554
1725
|
const Tag = props.href ? Link : "div";
|
|
1555
|
-
return
|
|
1726
|
+
return h6(
|
|
1556
1727
|
Tag,
|
|
1557
1728
|
Object.assign(attrs(props), {
|
|
1558
1729
|
ref,
|
|
1559
1730
|
href: props.href,
|
|
1560
1731
|
className: cx("aura-status-tile", "aura-status-tile--" + status, props.href && "is-interactive", props.className)
|
|
1561
1732
|
}),
|
|
1562
|
-
|
|
1733
|
+
h6(
|
|
1563
1734
|
"span",
|
|
1564
1735
|
{ className: "aura-status-tile__head" },
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
hasValue ?
|
|
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(
|
|
1569
1740
|
"span",
|
|
1570
1741
|
{ className: cx("aura-status-tile__value", "is-" + valueTone) },
|
|
1571
1742
|
props.value,
|
|
1572
1743
|
hasMeta || markers.length ? comma : null
|
|
1573
1744
|
) : null
|
|
1574
1745
|
),
|
|
1575
|
-
hasMeta || markers.length ?
|
|
1746
|
+
hasMeta || markers.length ? h6(
|
|
1576
1747
|
"span",
|
|
1577
1748
|
{ className: "aura-status-tile__foot" },
|
|
1578
|
-
hasMeta ?
|
|
1579
|
-
markers.length ?
|
|
1749
|
+
hasMeta ? h6("span", { className: "aura-status-tile__meta" }, props.meta, markers.length ? comma : null) : null,
|
|
1750
|
+
markers.length ? h6(
|
|
1580
1751
|
"span",
|
|
1581
1752
|
{ className: "aura-status-tile__markers" },
|
|
1582
1753
|
markers.map(function(m, i) {
|
|
1583
|
-
return
|
|
1754
|
+
return h6(
|
|
1584
1755
|
"span",
|
|
1585
1756
|
{
|
|
1586
1757
|
key: i,
|
|
1587
1758
|
className: cx("aura-status-tile__marker", "is-" + (m.tone || "neutral")),
|
|
1588
1759
|
"data-aura-tip": m.label
|
|
1589
1760
|
},
|
|
1590
|
-
|
|
1591
|
-
|
|
1761
|
+
h6(Icon, { name: m.icon, size: 14 }),
|
|
1762
|
+
h6("span", { className: "aura-sr-only" }, m.label + (i < markers.length - 1 ? "," : ""))
|
|
1592
1763
|
);
|
|
1593
1764
|
})
|
|
1594
1765
|
) : null
|
|
@@ -1598,13 +1769,13 @@ function statusTileElement(props, ref, Link, t, titleRef) {
|
|
|
1598
1769
|
function ServerStatusTile(props) {
|
|
1599
1770
|
return statusTileElement(props, void 0, props.linkComponent || "a", STRINGS.en);
|
|
1600
1771
|
}
|
|
1601
|
-
var TileGrid =
|
|
1772
|
+
var TileGrid = React7.forwardRef(function TileGrid2(props, ref) {
|
|
1602
1773
|
const style = Object.assign(
|
|
1603
1774
|
{},
|
|
1604
1775
|
respVars("aura-grid-cols", props.columns == null ? { base: 2, md: 3 } : props.columns),
|
|
1605
1776
|
props.style
|
|
1606
1777
|
);
|
|
1607
|
-
return
|
|
1778
|
+
return h6(
|
|
1608
1779
|
"ul",
|
|
1609
1780
|
Object.assign(attrs(props), {
|
|
1610
1781
|
ref,
|
|
@@ -1614,16 +1785,16 @@ var TileGrid = React6.forwardRef(function TileGrid2(props, ref) {
|
|
|
1614
1785
|
}),
|
|
1615
1786
|
/* toArray drops null and booleans and keys each element; a Fragment's children are items too. */
|
|
1616
1787
|
flat(props.children).map(function(c, i) {
|
|
1617
|
-
return
|
|
1788
|
+
return h6("li", { key: React7.isValidElement(c) && c.key != null ? c.key : i }, c);
|
|
1618
1789
|
})
|
|
1619
1790
|
);
|
|
1620
1791
|
});
|
|
1621
1792
|
function flat(children) {
|
|
1622
1793
|
const out = [];
|
|
1623
|
-
|
|
1624
|
-
if (
|
|
1794
|
+
React7.Children.toArray(children).forEach(function(c) {
|
|
1795
|
+
if (React7.isValidElement(c) && c.type === React7.Fragment)
|
|
1625
1796
|
flat(c.props.children).forEach(function(x) {
|
|
1626
|
-
out.push(
|
|
1797
|
+
out.push(React7.isValidElement(x) ? React7.cloneElement(x, { key: String(c.key) + "/" + String(x.key) }) : x);
|
|
1627
1798
|
});
|
|
1628
1799
|
else if (c !== "") out.push(c);
|
|
1629
1800
|
});
|
|
@@ -1637,7 +1808,7 @@ function r(n3) {
|
|
|
1637
1808
|
function num(v) {
|
|
1638
1809
|
return typeof v === "number" && isFinite(v) ? v : null;
|
|
1639
1810
|
}
|
|
1640
|
-
var Sparkline =
|
|
1811
|
+
var Sparkline = React7.forwardRef(function Sparkline2(props, ref) {
|
|
1641
1812
|
const wh = SIZES2[props.size || "sm"] || SIZES2.sm;
|
|
1642
1813
|
const W = wh[0], H = wh[1];
|
|
1643
1814
|
const data = (props.data || []).map(num);
|
|
@@ -1667,7 +1838,7 @@ var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
|
|
|
1667
1838
|
data.forEach(function(v, i) {
|
|
1668
1839
|
if (v == null) return;
|
|
1669
1840
|
const prev = i > 0 && data[i - 1] != null, next = i < n3 - 1 && data[i + 1] != null;
|
|
1670
|
-
if (!prev && !next) dots.push(
|
|
1841
|
+
if (!prev && !next) dots.push(h6("circle", { key: "d" + i, cx: r(x(i)), cy: r(y(v)), r: 1.5 }));
|
|
1671
1842
|
else d += (prev ? "L" : "M") + r(x(i)) + " " + r(y(v));
|
|
1672
1843
|
});
|
|
1673
1844
|
const mode = props.failures || "none";
|
|
@@ -1677,10 +1848,10 @@ var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
|
|
|
1677
1848
|
if (!props.failed[i]) return;
|
|
1678
1849
|
if (mode === "band") {
|
|
1679
1850
|
const w = Math.max(2, step || W), left = Math.max(0, x(i) - w / 2), right = Math.min(W, x(i) + w / 2);
|
|
1680
|
-
fails.push(
|
|
1851
|
+
fails.push(h6("rect", { key: "f" + i, x: r(left), y: 0, width: r(right - left), height: H }));
|
|
1681
1852
|
} else
|
|
1682
1853
|
fails.push(
|
|
1683
|
-
|
|
1854
|
+
h6("rect", {
|
|
1684
1855
|
key: "f" + i,
|
|
1685
1856
|
x: r(Math.max(0, Math.min(W - 1.5, x(i) - 0.75))),
|
|
1686
1857
|
y: H - 6,
|
|
@@ -1690,7 +1861,7 @@ var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
|
|
|
1690
1861
|
);
|
|
1691
1862
|
});
|
|
1692
1863
|
const named = !!props.label;
|
|
1693
|
-
return
|
|
1864
|
+
return h6(
|
|
1694
1865
|
"svg",
|
|
1695
1866
|
Object.assign(attrs(props), {
|
|
1696
1867
|
ref,
|
|
@@ -1703,9 +1874,9 @@ var Sparkline = React6.forwardRef(function Sparkline2(props, ref) {
|
|
|
1703
1874
|
"aria-hidden": named ? void 0 : true,
|
|
1704
1875
|
focusable: "false"
|
|
1705
1876
|
}),
|
|
1706
|
-
fails.length && mode === "band" ?
|
|
1707
|
-
d ?
|
|
1708
|
-
dots.length ?
|
|
1709
|
-
fails.length && mode === "ticks" ?
|
|
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
|
|
1710
1881
|
);
|
|
1711
1882
|
});
|
package/dist/server/index.d.cts
CHANGED
|
@@ -46,6 +46,9 @@ export type StatusTone = "neutral" | "progress" | "ready" | "warning" | "blocked
|
|
|
46
46
|
export interface StatusPillProps extends Omit<React$1.HTMLAttributes<HTMLSpanElement>, "children"> {
|
|
47
47
|
/** The status word shown, e.g. "In Progress". Other attributes (`id`, `data-*`, `aria-*`) go on the pill (5.8). */
|
|
48
48
|
children: React$1.ReactNode;
|
|
49
|
+
/** 5.51 (Chamber-OS 158): in a box narrower than the words, the text wraps inside the pill (still rounded, the icon
|
|
50
|
+
* on the first line) instead of running out of it. Without it a pill stays on one line. */
|
|
51
|
+
wrap?: boolean | undefined;
|
|
49
52
|
/** Force a tone. Default: matched from the word (Ready/Done → ready, In Progress/In Review → progress, Warning/Problem/Degraded/At risk → warning (5.1), Blocked/Failed → blocked, anything else → neutral). */
|
|
50
53
|
tone?: StatusTone | undefined;
|
|
51
54
|
className?: string | undefined;
|
|
@@ -114,6 +117,43 @@ export type DataAttributes = {
|
|
|
114
117
|
};
|
|
115
118
|
export type Breakpoint = "base" | "sm" | "md" | "lg" | "xl";
|
|
116
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
|
+
}
|
|
117
157
|
export interface StatChange {
|
|
118
158
|
/** Shown as written, e.g. "+12%" or "−3". */
|
|
119
159
|
value: React$1.ReactNode;
|
|
@@ -484,6 +524,9 @@ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>
|
|
|
484
524
|
}
|
|
485
525
|
/** Container — centres content up to aura-container-max (1280px) with responsive side padding. */
|
|
486
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;
|
|
487
530
|
/** PageHeader (5.32, DxT Monitor request 3): the top of a page — an eyebrow, the page's heading, a meta line and the
|
|
488
531
|
* page's actions. It has no outer padding: inside AppShell, the content padding is the page margin (16px at the sides
|
|
489
532
|
* and 24px top and bottom on phones, 24px from 640px, 32px from 1024px). Stateless, so it is also exported from
|