@polyxd/react 0.1.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.
Files changed (63) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +177 -0
  3. package/README.md +39 -0
  4. package/dist/components/avatar.d.ts +10 -0
  5. package/dist/components/avatar.js +47 -0
  6. package/dist/components/avatar.js.map +1 -0
  7. package/dist/components/chart.d.ts +5 -0
  8. package/dist/components/chart.js +98 -0
  9. package/dist/components/chart.js.map +1 -0
  10. package/dist/components/content.d.ts +23 -0
  11. package/dist/components/content.js +108 -0
  12. package/dist/components/content.js.map +1 -0
  13. package/dist/components/filter.d.ts +9 -0
  14. package/dist/components/filter.js +97 -0
  15. package/dist/components/filter.js.map +1 -0
  16. package/dist/components/flow.d.ts +22 -0
  17. package/dist/components/flow.js +143 -0
  18. package/dist/components/flow.js.map +1 -0
  19. package/dist/components/index.d.ts +10 -0
  20. package/dist/components/index.js +19 -0
  21. package/dist/components/index.js.map +1 -0
  22. package/dist/components/inputs.d.ts +38 -0
  23. package/dist/components/inputs.js +230 -0
  24. package/dist/components/inputs.js.map +1 -0
  25. package/dist/components/navigation.d.ts +8 -0
  26. package/dist/components/navigation.js +51 -0
  27. package/dist/components/navigation.js.map +1 -0
  28. package/dist/components/structure.d.ts +25 -0
  29. package/dist/components/structure.js +58 -0
  30. package/dist/components/structure.js.map +1 -0
  31. package/dist/components/table.d.ts +9 -0
  32. package/dist/components/table.js +144 -0
  33. package/dist/components/table.js.map +1 -0
  34. package/dist/context.d.ts +93 -0
  35. package/dist/context.js +42 -0
  36. package/dist/context.js.map +1 -0
  37. package/dist/data.d.ts +26 -0
  38. package/dist/data.js +52 -0
  39. package/dist/data.js.map +1 -0
  40. package/dist/format.d.ts +12 -0
  41. package/dist/format.js +51 -0
  42. package/dist/format.js.map +1 -0
  43. package/dist/index.d.ts +5 -0
  44. package/dist/index.js +6 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/surface.d.ts +37 -0
  47. package/dist/surface.js +80 -0
  48. package/dist/surface.js.map +1 -0
  49. package/package.json +53 -0
  50. package/src/styles.css +2182 -0
  51. package/themes/antd.css +300 -0
  52. package/themes/bootstrap.css +300 -0
  53. package/themes/carbon.css +310 -0
  54. package/themes/chakra.css +300 -0
  55. package/themes/fluent.css +300 -0
  56. package/themes/govuk.css +150 -0
  57. package/themes/mantine.css +300 -0
  58. package/themes/material3.css +300 -0
  59. package/themes/polaris.css +300 -0
  60. package/themes/primer.css +300 -0
  61. package/themes/radix.css +300 -0
  62. package/themes/shadcn.css +300 -0
  63. package/themes/spectrum.css +300 -0
@@ -0,0 +1,108 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { resolveFormat, useBindings, useSurface } from "../context.js";
4
+ import { asList, absolute, childPointer, get } from "../data.js";
5
+ import { formatValue } from "../format.js";
6
+ import { Render, useA11y } from "../surface.js";
7
+ import { Icon } from "./avatar.js";
8
+ import { Heading } from "./structure.js";
9
+ export function Text({ node }) {
10
+ const b = useBindings();
11
+ return (_jsx("p", { className: `pxd-text pxd-text-${node.variant ?? "body"}`, ...useA11y(node), children: b.text(node.text, node.format) }));
12
+ }
13
+ export function Metric({ node }) {
14
+ const b = useBindings();
15
+ const s = useSurface();
16
+ const label = b.text(node.label);
17
+ const value = b.text(node.value, node.format);
18
+ let change;
19
+ if (node.change) {
20
+ const raw = b.value(node.change.value);
21
+ if (typeof raw === "number") {
22
+ const favorable = node.change.favorable ?? "increase";
23
+ const dir = raw > 0 ? "up" : raw < 0 ? "down" : "unchanged";
24
+ const good = favorable === "none" || raw === 0 ? "neutral" : (raw > 0) === (favorable === "increase") ? "positive" : "negative";
25
+ const amount = formatValue(Math.abs(raw), resolveFormat(node.change.format, s.data, b.scope), s.locale);
26
+ change = { text: `${raw > 0 ? "▲" : raw < 0 ? "▼" : "■"} ${amount}`, spoken: dir === "unchanged" ? "unchanged" : `${dir} ${amount}`, tone: good };
27
+ }
28
+ }
29
+ const caption = node.caption !== undefined ? b.text(node.caption) : undefined;
30
+ return (_jsxs("div", { className: "pxd-metric", role: "group", "aria-label": label, ...useA11y(node), children: [_jsx("div", { className: "pxd-metric-label", children: label }), _jsx("div", { className: "pxd-metric-value", children: value }), change && (_jsxs("div", { className: `pxd-metric-change pxd-data-${change.tone}`, children: [_jsx("span", { "aria-hidden": "true", children: change.text }), _jsx("span", { className: "pxd-sr-only", children: change.spoken })] })), caption && _jsx("div", { className: "pxd-metric-caption", children: caption })] }));
31
+ }
32
+ export function DetailList({ node }) {
33
+ const b = useBindings();
34
+ const s = useSurface();
35
+ const receipt = node.variant === "receipt";
36
+ const value = (item) => {
37
+ const raw = b.value(item.value);
38
+ // In a receipt, a zero charge reads as "Free".
39
+ if (receipt && item.format?.type === "currency" && raw === 0 && !item.total)
40
+ return { text: "Free", free: true };
41
+ return { text: b.text(item.value, item.format), free: false };
42
+ };
43
+ const rows = node.items.filter((i) => !i.total);
44
+ const totals = node.items.filter((i) => i.total);
45
+ return (_jsxs("div", { className: `pxd-detail-list${receipt ? " pxd-receipt" : ""}${node.layout === "grid" ? " pxd-detail-grid" : ""}`, ...useA11y(node), children: [node.title !== undefined && _jsx(Heading, { className: "pxd-detail-title", children: b.text(node.title) }), _jsxs("dl", { children: [rows.map((item, i) => {
46
+ const v = value(item);
47
+ return (_jsxs("div", { className: "pxd-detail-row", children: [_jsx("dt", { children: b.text(item.label) }), _jsx("dd", { className: v.free ? "pxd-free" : undefined, children: v.text })] }, item.key ?? i));
48
+ }), totals.map((item, i) => (_jsxs("div", { className: "pxd-detail-row pxd-total", children: [_jsx("dt", { children: b.text(item.label) }), _jsx("dd", { children: value(item).text })] }, item.key ?? `t${i}`)))] })] }));
49
+ }
50
+ /** Stable value used for selecting an item: its id when present, else its index. */
51
+ const itemValue = (item, index) => (item && typeof item === "object" && "id" in item ? item.id : index);
52
+ export function Collection({ node }) {
53
+ const b = useBindings();
54
+ const s = useSurface();
55
+ const labelId = useId();
56
+ const pointer = absolute(node.items.path, b.scope);
57
+ const items = asList(get(s.data, pointer));
58
+ const selection = node.selection ?? "none";
59
+ const selected = selection !== "none" && node.selected ? b.value(node.selected) : undefined;
60
+ const isSelected = (v) => (Array.isArray(selected) ? selected.includes(v) : selected === v);
61
+ const toggle = (v) => {
62
+ if (!node.selected)
63
+ return;
64
+ if (selection === "single")
65
+ return b.write(node.selected, v);
66
+ const cur = Array.isArray(selected) ? selected : [];
67
+ b.write(node.selected, cur.includes(v) ? cur.filter((x) => x !== v) : [...cur, v]);
68
+ };
69
+ const label = b.text(node.label);
70
+ // Grid for visual items (a Card with media), list otherwise, unless the document says which.
71
+ const template = s.byId.get(node.items.componentId);
72
+ const grid = node.layout === "grid" || (node.layout !== "list" && node.layout !== "timeline" && template?.component === "Card" && !!template.media);
73
+ const timeline = node.layout === "timeline";
74
+ if (!items.length && node.empty)
75
+ return _jsx(Render, { id: node.empty });
76
+ return (_jsxs("div", { className: "pxd-collection", ...useA11y(node), children: [_jsxs("div", { className: "pxd-collection-label", id: labelId, children: [label, " ", _jsxs("span", { className: "pxd-count", children: ["(", items.length, ")"] })] }), _jsx("ul", { className: `pxd-collection-list${grid ? " pxd-collection-grid" : ""}${timeline ? " pxd-timeline" : ""}`, "aria-labelledby": labelId, children: items.map((item, i) => {
77
+ const v = itemValue(item, i);
78
+ const scope = { pointer: childPointer(pointer, i) };
79
+ return (_jsxs("li", { className: "pxd-collection-item", children: [selection !== "none" && (_jsx("input", { type: selection === "single" ? "radio" : "checkbox", className: "pxd-collection-select", name: selection === "single" ? `${node.id}-selection` : undefined, checked: isSelected(v), onChange: () => toggle(v), "aria-label": `Select item ${i + 1} of ${items.length}` })), _jsx("div", { className: "pxd-collection-content", children: _jsx(Render, { id: node.items.componentId, scope: scope }) })] }, String(v)));
80
+ }) })] }));
81
+ }
82
+ const NUMERIC = new Set(["number", "currency", "percent", "duration"]);
83
+ export function Media({ node }) {
84
+ const b = useBindings();
85
+ const s = useSurface();
86
+ const ref = b.value(node.src);
87
+ const url = ref ? s.resolveMedia?.(ref) : undefined;
88
+ const alt = node.decorative ? "" : b.text(node.alt);
89
+ const cls = `pxd-media pxd-media-${node.aspect ?? "auto"}`;
90
+ if (!url)
91
+ return _jsx("div", { className: `${cls} pxd-media-placeholder`, role: node.decorative ? "presentation" : "img", "aria-label": alt || undefined });
92
+ return _jsx("img", { className: cls, src: url, alt: alt, ...useA11y(node) });
93
+ }
94
+ const STATUS_ICON = { info: "info", success: "check", warning: "alert", error: "alert", empty: "inbox", undo: "check" };
95
+ /**
96
+ * Status. 'undo' is a snackbar after a reversible action ran (announced politely, with Undo);
97
+ * 'empty' gets an icon tile and may carry an ActionBar (one primary, one secondary).
98
+ */
99
+ export function Status({ node }) {
100
+ const b = useBindings();
101
+ const urgent = node.kind === "error";
102
+ const a11y = useA11y(node);
103
+ if (node.kind === "undo") {
104
+ return (_jsxs("div", { className: "pxd-snackbar", role: "status", ...a11y, children: [_jsxs("p", { className: "pxd-snackbar-text", children: [b.text(node.title), node.message !== undefined && _jsxs("span", { className: "pxd-snackbar-message", children: [" ", b.text(node.message)] })] }), node.action && _jsx(Render, { id: node.action })] }));
105
+ }
106
+ return (_jsxs("div", { className: `pxd-status pxd-status-${node.kind}${node.variant === "inline" ? " pxd-status-notice" : ""}`, role: urgent ? "alert" : "status", ...a11y, children: [node.kind === "loading" ? (_jsx("span", { className: "pxd-spinner", "aria-hidden": "true" })) : (_jsx("span", { className: "pxd-status-icon", "aria-hidden": "true", children: _jsx(Icon, { name: node.icon ?? STATUS_ICON[node.kind], size: node.kind === "empty" ? 28 : 16 }) })), _jsxs("div", { className: "pxd-status-body", children: [_jsx("p", { className: "pxd-status-title", children: b.text(node.title) }), node.message !== undefined && _jsx("p", { className: "pxd-status-message", children: b.text(node.message) }), node.action && node.variant !== "inline" && (_jsx("div", { className: "pxd-status-action", children: _jsx(Render, { id: node.action }) }))] }), node.action && node.variant === "inline" && (_jsx("div", { className: "pxd-status-action", children: _jsx(Render, { id: node.action }) }))] }));
107
+ }
108
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/components/content.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Node } from "../context.tsx";
2
+ /**
3
+ * FilterPanel: filters beside their results on wide surfaces; on compact ones a "Filters · n"
4
+ * button opens a bottom sheet that ends in "Show n results". Search fields stay above the results
5
+ * everywhere. Active filters show as removable chips; the result count is announced politely.
6
+ */
7
+ export declare function FilterPanel({ node }: {
8
+ node: Node;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,97 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useLayoutEffect, useRef, useState } from "react";
3
+ import { Dialog } from "radix-ui";
4
+ import { resolveFormat, useBindings, useSurface } from "../context.js";
5
+ import { formatValue } from "../format.js";
6
+ import { Render, useA11y } from "../surface.js";
7
+ import { Icon } from "./avatar.js";
8
+ import { optionsOf } from "./inputs.js";
9
+ import { Heading } from "./structure.js";
10
+ /** Below this width the filters move into a bottom sheet. */
11
+ const COMPACT_PX = 640;
12
+ /**
13
+ * FilterPanel: filters beside their results on wide surfaces; on compact ones a "Filters · n"
14
+ * button opens a bottom sheet that ends in "Show n results". Search fields stay above the results
15
+ * everywhere. Active filters show as removable chips; the result count is announced politely.
16
+ */
17
+ export function FilterPanel({ node }) {
18
+ const b = useBindings();
19
+ const s = useSurface();
20
+ const ref = useRef(null);
21
+ const [compact, setCompact] = useState(false);
22
+ const [open, setOpen] = useState(false);
23
+ const a11y = useA11y(node);
24
+ useLayoutEffect(() => {
25
+ const el = ref.current;
26
+ if (!el || typeof ResizeObserver === "undefined")
27
+ return;
28
+ const measure = () => setCompact(el.getBoundingClientRect().width < COMPACT_PX);
29
+ measure();
30
+ const ro = new ResizeObserver(measure);
31
+ ro.observe(el);
32
+ return () => ro.disconnect();
33
+ }, []);
34
+ const label = node.label !== undefined ? b.text(node.label) : "Filters";
35
+ const children = (node.children ?? []).map((id) => s.byId.get(id)).filter(Boolean);
36
+ const searches = children.filter((c) => c.component === "TextInput" && c.kind === "search");
37
+ const filters = children.filter((c) => !searches.includes(c));
38
+ const active = activeFilters(filters, s, b);
39
+ const count = node.resultCount !== undefined ? b.value(node.resultCount) : undefined;
40
+ const countText = count === undefined ? undefined : `${formatValue(count, { type: "number" }, s.locale)} ${count === 1 ? "result" : "results"}`;
41
+ const clearAll = () => {
42
+ for (const f of active)
43
+ f.remove();
44
+ if (node.clear)
45
+ s.dispatch(node.clear, b.scope, node.id);
46
+ };
47
+ const filterFields = filters.map((c) => _jsx(Render, { id: c.id }, c.id));
48
+ const results = (_jsxs("div", { className: "pxd-filter-results", children: [searches.map((c) => (_jsx(Render, { id: c.id }, c.id))), _jsxs("div", { className: "pxd-filter-status", children: [compact && (_jsxs(Dialog.Trigger, { className: "pxd-chip pxd-filter-trigger", children: [_jsx(Icon, { name: "filter", size: 18 }), label, active.length > 0 && _jsxs("span", { "aria-hidden": "true", children: [" \u00B7 ", active.length] }), active.length > 0 && _jsxs("span", { className: "pxd-sr-only", children: [", ", active.length, " active"] })] })), countText && (_jsx("p", { className: "pxd-filter-count", "aria-live": "polite", children: countText }))] }), active.length > 0 && (_jsxs("ul", { className: "pxd-filter-chips", "aria-label": "Active filters", children: [active.map((f) => (_jsx("li", { children: _jsxs("button", { type: "button", className: "pxd-chip pxd-filter-chip", onClick: f.remove, "aria-label": `Remove filter: ${f.label}`, children: [f.label, _jsx(Icon, { name: "close", size: 16 })] }) }, f.key))), _jsx("li", { children: _jsx("button", { type: "button", className: "pxd-button pxd-button-tertiary pxd-filter-clear", onClick: clearAll, children: "Clear all" }) })] })), _jsx(Render, { id: node.results })] }));
49
+ return (_jsx("div", { ref: ref, className: `pxd-filter-panel${compact ? " pxd-filter-compact" : ""}`, ...a11y, children: compact ? (_jsxs(Dialog.Root, { open: open, onOpenChange: setOpen, children: [results, _jsxs(Dialog.Portal, { container: s.portal, children: [_jsx(Dialog.Overlay, { className: "pxd-overlay" }), _jsxs(Dialog.Content, { className: "pxd-sheet", "aria-describedby": undefined, children: [_jsxs("div", { className: "pxd-sheet-header", children: [_jsx(Dialog.Title, { className: "pxd-sheet-title", children: label }), _jsx(Dialog.Close, { className: "pxd-icon-button", "aria-label": "Close", children: _jsx(Icon, { name: "close" }) })] }), _jsx("div", { className: "pxd-sheet-body pxd-stack", children: filterFields }), _jsxs("div", { className: "pxd-sheet-footer", children: [active.length > 0 && (_jsx("button", { type: "button", className: "pxd-button pxd-button-secondary", onClick: clearAll, children: "Clear all" })), _jsx(Dialog.Close, { className: "pxd-button pxd-button-primary", children: countText ? `Show ${countText}` : "Show results" })] })] })] })] })) : (_jsxs("div", { className: "pxd-filter-layout", children: [_jsxs("section", { className: "pxd-filter-sidebar", "aria-label": label, children: [_jsx(Heading, { className: "pxd-filter-title", children: label }), _jsx("div", { className: "pxd-stack", children: filterFields })] }), results] })) }));
50
+ }
51
+ /** What each filter input currently narrows by, and how to remove it. */
52
+ function activeFilters(filters, s, b) {
53
+ const out = [];
54
+ for (const c of filters) {
55
+ if (!c.value || typeof c.value !== "object" || !("path" in c.value))
56
+ continue;
57
+ const v = b.value(c.value);
58
+ const name = b.text(c.label);
59
+ const fmt = (n) => formatValue(n, resolveFormat(c.format ?? { type: "number" }, s.data, b.scope), s.locale);
60
+ switch (c.component) {
61
+ case "Choice": {
62
+ const options = optionsOf(c, s.data, b.scope, b.text);
63
+ const labelOf = (x) => options.find((o) => o.value === x)?.label ?? String(x);
64
+ if (Array.isArray(v))
65
+ for (const x of v)
66
+ out.push({ key: `${c.id}:${x}`, label: labelOf(x), remove: () => b.write(c.value, v.filter((y) => y !== x)) });
67
+ else if (v !== null && v !== undefined && v !== "")
68
+ out.push({ key: c.id, label: labelOf(v), remove: () => b.write(c.value, null) });
69
+ break;
70
+ }
71
+ case "RangeInput": {
72
+ if (c.mode === "range" && Array.isArray(v)) {
73
+ const [lo, hi] = v.map(Number);
74
+ if (lo > c.min || hi < c.max)
75
+ out.push({ key: c.id, label: `${name}: ${fmt(lo)} – ${fmt(hi)}`, remove: () => b.write(c.value, [c.min, c.max]) });
76
+ }
77
+ else if (typeof v === "number" && v < c.max)
78
+ out.push({ key: c.id, label: `${name}: ${fmt(v)}`, remove: () => b.write(c.value, c.max) });
79
+ break;
80
+ }
81
+ case "Toggle":
82
+ if (v === true)
83
+ out.push({ key: c.id, label: name, remove: () => b.write(c.value, false) });
84
+ break;
85
+ case "TextInput":
86
+ if (typeof v === "string" && v.trim())
87
+ out.push({ key: c.id, label: `${name}: ${v}`, remove: () => b.write(c.value, "") });
88
+ break;
89
+ case "DateInput":
90
+ if (v)
91
+ out.push({ key: c.id, label: `${name}: ${String(v)}`, remove: () => b.write(c.value, null) });
92
+ break;
93
+ }
94
+ }
95
+ return out;
96
+ }
97
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/components/filter.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type Node } from "../context.tsx";
2
+ export declare function Action({ node }: {
3
+ node: Node;
4
+ }): import("react").JSX.Element;
5
+ /** Children are in order of importance; CSS places the primary where each layout expects it. */
6
+ export declare function ActionBar({ node }: {
7
+ node: Node;
8
+ }): import("react").JSX.Element;
9
+ export declare function Steps({ node }: {
10
+ node: Node;
11
+ }): import("react").JSX.Element;
12
+ /**
13
+ * Confirmation. When it is the surface root, the surface *is* the dialog: it renders inline as an
14
+ * alertdialog scoped to the surface, so it never takes over the host page. When it opens on top of
15
+ * other surface content, it is a modal dialog (Radix AlertDialog), portalled inside the surface.
16
+ */
17
+ export declare function Confirm({ node }: {
18
+ node: Node;
19
+ }): import("react").JSX.Element;
20
+ export declare function Comparison({ node }: {
21
+ node: Node;
22
+ }): import("react").JSX.Element;
@@ -0,0 +1,143 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useContext, useEffect, useId, useRef, useState } from "react";
3
+ import { AlertDialog } from "radix-ui";
4
+ import { StepsContext, resolveFormat, useBindings, useSurface } from "../context.js";
5
+ import { asList, absolute, childPointer, get } from "../data.js";
6
+ import { formatValue } from "../format.js";
7
+ import { Render, useA11y } from "../surface.js";
8
+ import { Heading } from "./structure.js";
9
+ import { Avatar, Icon } from "./avatar.js";
10
+ export function Action({ node }) {
11
+ const b = useBindings();
12
+ const s = useSurface();
13
+ const steps = useContext(StepsContext);
14
+ const disabled = node.disabled !== undefined ? Boolean(b.value(node.disabled)) : false;
15
+ const tone = node.tone === "danger" ? " pxd-button-danger" : "";
16
+ const onClick = () => {
17
+ const name = node.action.event.name;
18
+ if (name === "ui.back" && steps)
19
+ return steps.back();
20
+ if (name === "ui.next" && steps)
21
+ return steps.next();
22
+ s.dispatch(node.action, b.scope, node.id);
23
+ };
24
+ return (_jsx("button", { type: "button", className: `pxd-button pxd-button-${node.emphasis ?? "secondary"}${tone}`, disabled: disabled, onClick: onClick, ...useA11y(node), children: b.text(node.label) }));
25
+ }
26
+ /** Children are in order of importance; CSS places the primary where each layout expects it. */
27
+ export function ActionBar({ node }) {
28
+ return (_jsx("div", { className: "pxd-action-bar", role: "group", "aria-label": "Actions", ...useA11y(node), children: node.children.map((id) => (_jsx(Render, { id: id }, id))) }));
29
+ }
30
+ export function Steps({ node }) {
31
+ const b = useBindings();
32
+ const s = useSurface();
33
+ const bound = node.current !== undefined ? b.value(node.current) : undefined;
34
+ const [local, setLocal] = useState(typeof bound === "number" ? bound : 0);
35
+ const index = typeof bound === "number" && node.current?.path ? bound : local;
36
+ const total = node.steps.length;
37
+ const go = (i) => {
38
+ const next = Math.max(0, Math.min(total - 1, i));
39
+ if (node.current?.path)
40
+ b.write(node.current, next);
41
+ else
42
+ setLocal(next);
43
+ };
44
+ const step = node.steps[index];
45
+ const last = index === total - 1;
46
+ return (_jsx(StepsContext.Provider, { value: { back: () => go(index - 1), next: () => go(index + 1) }, children: _jsxs("div", { className: "pxd-steps", ...useA11y(node), children: [_jsx("p", { className: "pxd-steps-progress", children: `Step ${index + 1} of ${total}` }), _jsx("ol", { className: "pxd-steps-list", children: node.steps.map((st, i) => (_jsx("li", { "aria-current": i === index ? "step" : undefined, className: i < index ? "pxd-step-done" : i === index ? "pxd-step-current" : undefined, children: b.text(st.title) }, st.key))) }), _jsxs("form", { className: "pxd-steps-content", onSubmit: (e) => {
47
+ e.preventDefault();
48
+ if (last)
49
+ s.dispatch(node.finish.action, b.scope, node.id);
50
+ else
51
+ go(index + 1);
52
+ }, children: [_jsx(Heading, { className: "pxd-steps-title", children: b.text(step.title) }), _jsx(Render, { id: step.content }, step.key), _jsxs("div", { className: "pxd-action-bar", children: [_jsx("button", { type: "submit", className: "pxd-button pxd-button-primary", children: last ? b.text(node.finish.label) : "Continue" }), index > 0 && (_jsx("button", { type: "button", className: "pxd-button pxd-button-secondary", onClick: () => go(index - 1), children: "Back" }))] })] })] }) }));
53
+ }
54
+ /**
55
+ * Confirmation. When it is the surface root, the surface *is* the dialog: it renders inline as an
56
+ * alertdialog scoped to the surface, so it never takes over the host page. When it opens on top of
57
+ * other surface content, it is a modal dialog (Radix AlertDialog), portalled inside the surface.
58
+ */
59
+ export function Confirm({ node }) {
60
+ const b = useBindings();
61
+ const s = useSurface();
62
+ const isRoot = s.doc.root === node.id;
63
+ const [open, setOpen] = useState(true);
64
+ const [typed, setTyped] = useState("");
65
+ const titleId = useId();
66
+ const descId = useId();
67
+ const mustType = node.typeToConfirm !== undefined ? b.text(node.typeToConfirm) : undefined;
68
+ const ready = !mustType || typed.trim() === mustType;
69
+ const destructive = node.severity === "destructive";
70
+ const a11y = useA11y(node);
71
+ // A root confirmation takes focus on its safest option (Cancel), like a dialog would.
72
+ const safest = useRef(null);
73
+ useEffect(() => {
74
+ if (isRoot)
75
+ safest.current?.focus({ preventScroll: true });
76
+ }, [isRoot]);
77
+ const cancel = () => {
78
+ if (!isRoot)
79
+ setOpen(false);
80
+ s.dispatch(node.cancel?.action ?? { event: { name: "ui.dismiss" } }, b.scope, node.id);
81
+ };
82
+ const confirm = () => ready && s.dispatch(node.confirm.action, b.scope, node.id);
83
+ const subject = node.subject && (_jsxs("div", { className: "pxd-dialog-subject", children: [_jsx(Avatar, { value: node.subject.avatar !== undefined ? b.value(node.subject.avatar) : undefined, name: b.text(node.subject.title), size: 56 }), _jsxs("div", { children: [_jsx("div", { className: "pxd-dialog-subject-title", children: b.text(node.subject.title) }), node.subject.subtitle !== undefined && _jsx("div", { className: "pxd-dialog-subject-sub", children: b.text(node.subject.subtitle) })] })] }));
84
+ const amount = node.amount && _jsx("div", { className: "pxd-dialog-amount", children: b.text(node.amount.value, node.amount.format) });
85
+ const consequences = Array.isArray(node.consequences) && (_jsx("ul", { className: "pxd-consequences", children: node.consequences.map((c, i) => (_jsxs("li", { children: [_jsx("span", { className: "pxd-consequence-icon", children: _jsx(Icon, { name: c.icon ?? "info" }) }), _jsxs("span", { children: [_jsx("span", { className: "pxd-consequence-title", children: b.text(c.title) }), c.detail !== undefined && _jsx("span", { className: "pxd-consequence-detail", children: b.text(c.detail) })] })] }, i))) }));
86
+ const description = (_jsx("div", { className: "pxd-dialog-description", id: descId, children: node.message !== undefined && _jsx("p", { children: b.text(node.message) }) }));
87
+ // The consequence sits directly above the confirm button (design review, 2026-09-20).
88
+ const consequence = node.consequence !== undefined && (_jsxs("p", { className: "pxd-dialog-consequence", id: `${descId}-consequence`, children: [_jsx(Icon, { name: "info", size: 18 }), _jsx("span", { children: b.text(node.consequence) })] }));
89
+ const body = (confirmButton, cancelButton) => (_jsxs(_Fragment, { children: [consequences, node.summary && _jsx(Render, { id: node.summary }), mustType && (_jsxs("div", { className: "pxd-field", children: [_jsxs("label", { className: "pxd-field-label", htmlFor: `${node.id}-type`, children: ["Type ", _jsx("strong", { children: mustType }), " to confirm"] }), _jsx("input", { id: `${node.id}-type`, className: "pxd-input", autoComplete: "off", value: typed, onChange: (e) => setTyped(e.target.value) })] })), consequence, _jsxs("div", { className: "pxd-action-bar", children: [confirmButton, cancelButton] })] }));
90
+ const confirmButton = (_jsx("button", { type: "button", className: `pxd-button pxd-button-primary${destructive ? " pxd-button-danger" : ""}`, disabled: !ready, onClick: confirm, children: b.text(node.confirm.label) }));
91
+ const cancelLabel = node.cancel ? b.text(node.cancel.label) : "Cancel";
92
+ if (isRoot) {
93
+ return (_jsxs("div", { role: "alertdialog", "aria-modal": "false", "aria-labelledby": titleId, "aria-describedby": node.consequence !== undefined ? `${descId} ${descId}-consequence` : descId, className: `pxd-dialog pxd-dialog-inline${destructive ? " pxd-dialog-destructive" : ""}`, onKeyDown: (e) => e.key === "Escape" && cancel(), ...a11y, children: [_jsx("h1", { className: "pxd-dialog-title", id: titleId, children: b.text(node.title) }), amount, subject, description, body(confirmButton, _jsx("button", { type: "button", ref: safest, className: "pxd-button pxd-button-secondary", onClick: cancel, children: cancelLabel }))] }));
94
+ }
95
+ return (_jsx(AlertDialog.Root, { open: open, onOpenChange: (o) => (o ? setOpen(true) : cancel()), children: _jsxs(AlertDialog.Portal, { container: s.portal, children: [_jsx(AlertDialog.Overlay, { className: "pxd-overlay" }), _jsxs(AlertDialog.Content, { className: `pxd-dialog${destructive ? " pxd-dialog-destructive" : ""}`, "aria-describedby": node.consequence !== undefined ? `${descId} ${descId}-consequence` : descId, ...a11y, children: [_jsx(AlertDialog.Title, { className: "pxd-dialog-title", children: b.text(node.title) }), amount, subject, _jsx(AlertDialog.Description, { asChild: true, children: description }), body(_jsx(AlertDialog.Action, { asChild: true, onClick: (e) => (e.preventDefault(), confirm()), children: confirmButton }), _jsx(AlertDialog.Cancel, { asChild: true, children: _jsx("button", { type: "button", className: "pxd-button pxd-button-secondary", autoFocus: true, children: cancelLabel }) }))] })] }) }));
96
+ }
97
+ export function Comparison({ node }) {
98
+ const b = useBindings();
99
+ const s = useSurface();
100
+ const pointer = absolute(node.items.path, b.scope);
101
+ const items = asList(get(s.data, pointer));
102
+ const scopes = items.map((_, i) => ({ pointer: childPointer(pointer, i) }));
103
+ const at = (path, i) => get(s.data, absolute(path, scopes[i]));
104
+ const recommended = node.recommended !== undefined ? b.text(node.recommended) : undefined;
105
+ const reason = node.recommendedReason !== undefined ? b.text(node.recommendedReason) : undefined;
106
+ // Best item per attribute, when the attribute says which direction is better.
107
+ const best = new Map();
108
+ for (const a of node.attributes) {
109
+ if (!a.better || a.better === "none")
110
+ continue;
111
+ const vals = items.map((_, i) => Number(at(a.path, i)));
112
+ const target = a.better === "higher" ? Math.max(...vals) : Math.min(...vals);
113
+ if (vals.filter((v) => v === target).length === 1)
114
+ best.set(a.key, vals.indexOf(target));
115
+ }
116
+ // Attributes under their group headings, in first-seen order.
117
+ const groups = [];
118
+ for (const a of node.attributes) {
119
+ const label = a.group !== undefined ? b.text(a.group) : undefined;
120
+ const g = groups.find((x) => x.label === label);
121
+ if (g)
122
+ g.attributes.push(a);
123
+ else
124
+ groups.push({ label, attributes: [a] });
125
+ }
126
+ // The recommended item comes first, so it's read (and seen on phones) first.
127
+ const order = items.map((_, i) => i);
128
+ const ri = order.findIndex((i) => String(at(node.itemTitle, i) ?? "") === recommended);
129
+ if (ri > 0)
130
+ order.unshift(...order.splice(ri, 1));
131
+ const value = (a, i) => {
132
+ const v = at(a.path, i);
133
+ if (typeof v === "boolean")
134
+ return v ? (_jsxs("span", { className: "pxd-yes", children: [_jsx(Icon, { name: "check", size: 18 }), _jsx("span", { className: "pxd-sr-only", children: "Included" })] })) : (_jsxs("span", { className: "pxd-no", children: [_jsx(Icon, { name: "dash", size: 18 }), _jsx("span", { className: "pxd-sr-only", children: "Not included" })] }));
135
+ return formatValue(v, resolveFormat(a.format, s.data, b.scope), s.locale);
136
+ };
137
+ return (_jsxs("div", { className: "pxd-comparison", ...useA11y(node), children: [node.summary !== undefined && _jsx("p", { className: "pxd-comparison-summary", children: b.text(node.summary) }), _jsx("ul", { className: "pxd-comparison-items", children: order.map((i) => {
138
+ const title = String(at(node.itemTitle, i) ?? "");
139
+ const isRecommended = recommended === title;
140
+ return (_jsxs("li", { className: `pxd-comparison-item${isRecommended ? " pxd-recommended" : ""}`, children: [isRecommended && (_jsxs("p", { className: "pxd-recommendation", children: [_jsx("span", { className: "pxd-badge pxd-tone-info", children: "Recommended" }), reason && _jsx("span", { className: "pxd-recommendation-reason", children: reason })] })), _jsx(Heading, { className: "pxd-comparison-title", children: title }), groups.map((g, gi) => (_jsxs("div", { className: "pxd-comparison-group", children: [g.label && _jsx("p", { className: "pxd-comparison-group-label", children: g.label }), _jsx("dl", { children: g.attributes.map((a) => (_jsxs("div", { className: "pxd-detail-row", children: [_jsx("dt", { children: b.text(a.label) }), _jsxs("dd", { children: [value(a, i), best.get(a.key) === i && _jsx("span", { className: "pxd-best", children: " Best" })] })] }, a.key))) })] }, gi))), node.choose && (_jsxs("button", { type: "button", className: `pxd-button ${isRecommended ? "pxd-button-primary" : "pxd-button-secondary"}`, onClick: () => s.dispatch(node.choose.action, scopes[i], node.id), children: [b.text(node.choose.label), " ", _jsx("span", { className: "pxd-sr-only", children: title })] }))] }, i));
141
+ }) })] }));
142
+ }
143
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/components/flow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ComponentType } from "react";
2
+ import type { Node } from "../context.tsx";
3
+ export type ComponentRenderer = ComponentType<{
4
+ node: Node;
5
+ }>;
6
+ /**
7
+ * The default adapter: Radix primitives styled by design-system tokens.
8
+ * Other adapters (e.g. Astryx, see docs/decisions/0002) replace entries via PolyxdSurface's `components` prop.
9
+ */
10
+ export declare const registry: Record<string, ComponentRenderer>;
@@ -0,0 +1,19 @@
1
+ import { Card, Disclosure, Group, Section, Views } from "./structure.js";
2
+ import { Collection, DetailList, Media, Metric, Status, Text } from "./content.js";
3
+ import { Table } from "./table.js";
4
+ import { Chart } from "./chart.js";
5
+ import { Choice, DateInput, Form, RangeInput, TextInput, Toggle } from "./inputs.js";
6
+ import { Action, ActionBar, Comparison, Confirm, Steps } from "./flow.js";
7
+ import { FilterPanel } from "./filter.js";
8
+ import { Navigation } from "./navigation.js";
9
+ /**
10
+ * The default adapter: Radix primitives styled by design-system tokens.
11
+ * Other adapters (e.g. Astryx, see docs/decisions/0002) replace entries via PolyxdSurface's `components` prop.
12
+ */
13
+ export const registry = {
14
+ Section, Group, Card, Disclosure, Views, Navigation,
15
+ Text, Metric, DetailList, Collection, Table, Chart, Media, Status,
16
+ TextInput, Choice, Toggle, DateInput, RangeInput, Form,
17
+ Action, ActionBar, Steps, Confirm, Comparison, FilterPanel,
18
+ };
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAiB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAe,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAa,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAc,CAAC;AACtF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAY,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAC;AAI9C;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAsC;IACzD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IACnD,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IACjE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI;IACtD,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW;CAC3D,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type Node } from "../context.tsx";
2
+ import { type Scope } from "../data.ts";
3
+ import { Render } from "../surface.tsx";
4
+ export declare function TextInput({ node }: {
5
+ node: Node;
6
+ }): import("react").JSX.Element;
7
+ export interface Option {
8
+ value: string | number | boolean;
9
+ label: string;
10
+ description?: string;
11
+ avatar?: unknown;
12
+ recent?: boolean;
13
+ }
14
+ /** A Choice's options, from literal options or host data. */
15
+ export declare function optionsOf(node: Node, data: unknown, scope: Scope, text: (v: unknown) => string): Option[];
16
+ /**
17
+ * Choice picks its control from the options' number and shape (see the Choice rendering rules):
18
+ * people or things with faces → a picker (recent row, then a list); ≤ 6 short options → chips;
19
+ * otherwise radios or checkboxes, searchable past 10.
20
+ */
21
+ export declare function Choice({ node }: {
22
+ node: Node;
23
+ }): import("react").JSX.Element;
24
+ /** With an action it's a switch that applies immediately; inside a form it's a checkbox. */
25
+ export declare function Toggle({ node }: {
26
+ node: Node;
27
+ }): import("react").JSX.Element;
28
+ /** Native date/time inputs: typing is always possible, and pickers are platform-native. */
29
+ export declare function DateInput({ node }: {
30
+ node: Node;
31
+ }): import("react").JSX.Element;
32
+ export declare function RangeInput({ node }: {
33
+ node: Node;
34
+ }): import("react").JSX.Element;
35
+ export declare function Form({ node }: {
36
+ node: Node;
37
+ }): import("react").JSX.Element;
38
+ export { Render };