@polyxd/web 0.3.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/LICENSE +202 -0
- package/NOTICE +190 -0
- package/README.md +79 -0
- package/adapters/PolyxdSurface.svelte +65 -0
- package/adapters/PolyxdSurface.vue +61 -0
- package/dist/components/action-bar.d.ts +14 -0
- package/dist/components/action-bar.js +69 -0
- package/dist/components/action-bar.js.map +1 -0
- package/dist/components/avatar.d.ts +9 -0
- package/dist/components/avatar.js +16 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/chart.d.ts +5 -0
- package/dist/components/chart.js +132 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/content.d.ts +20 -0
- package/dist/components/content.js +286 -0
- package/dist/components/content.js.map +1 -0
- package/dist/components/filter.d.ts +9 -0
- package/dist/components/filter.js +43 -0
- package/dist/components/filter.js.map +1 -0
- package/dist/components/flow.d.ts +12 -0
- package/dist/components/flow.js +188 -0
- package/dist/components/flow.js.map +1 -0
- package/dist/components/index.d.ts +10 -0
- package/dist/components/index.js +30 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/inputs.d.ts +28 -0
- package/dist/components/inputs.js +530 -0
- package/dist/components/inputs.js.map +1 -0
- package/dist/components/marks.d.ts +32 -0
- package/dist/components/marks.js +164 -0
- package/dist/components/marks.js.map +1 -0
- package/dist/components/navigation.d.ts +11 -0
- package/dist/components/navigation.js +99 -0
- package/dist/components/navigation.js.map +1 -0
- package/dist/components/overlays.d.ts +16 -0
- package/dist/components/overlays.js +146 -0
- package/dist/components/overlays.js.map +1 -0
- package/dist/components/pickers.d.ts +6 -0
- package/dist/components/pickers.js +272 -0
- package/dist/components/pickers.js.map +1 -0
- package/dist/components/shell.d.ts +30 -0
- package/dist/components/shell.js +167 -0
- package/dist/components/shell.js.map +1 -0
- package/dist/components/split.d.ts +8 -0
- package/dist/components/split.js +76 -0
- package/dist/components/split.js.map +1 -0
- package/dist/components/structure.d.ts +12 -0
- package/dist/components/structure.js +69 -0
- package/dist/components/structure.js.map +1 -0
- package/dist/components/table.d.ts +11 -0
- package/dist/components/table.js +142 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tree.d.ts +10 -0
- package/dist/components/tree.js +177 -0
- package/dist/components/tree.js.map +1 -0
- package/dist/dom.d.ts +25 -0
- package/dist/dom.js +211 -0
- package/dist/dom.js.map +1 -0
- package/dist/elements.d.ts +87 -0
- package/dist/elements.js +244 -0
- package/dist/elements.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives.d.ts +111 -0
- package/dist/primitives.js +361 -0
- package/dist/primitives.js.map +1 -0
- package/dist/renderer.d.ts +145 -0
- package/dist/renderer.js +244 -0
- package/dist/renderer.js.map +1 -0
- package/dist/skeleton.d.ts +14 -0
- package/dist/skeleton.js +13 -0
- package/dist/skeleton.js.map +1 -0
- package/package.json +52 -0
- package/preview/polyxd-web.css +2 -0
- package/preview/polyxd-web.js +15 -0
- package/styles.css +5012 -0
- package/themes/antd.css +300 -0
- package/themes/bootstrap.css +300 -0
- package/themes/brutalist.css +300 -0
- package/themes/carbon.css +310 -0
- package/themes/chakra.css +300 -0
- package/themes/civic.css +300 -0
- package/themes/editorial.css +300 -0
- package/themes/finance.css +300 -0
- package/themes/fluent.css +300 -0
- package/themes/glass.css +300 -0
- package/themes/govuk.css +150 -0
- package/themes/health.css +300 -0
- package/themes/mantine.css +300 -0
- package/themes/material3.css +300 -0
- package/themes/mono.css +300 -0
- package/themes/neon.css +300 -0
- package/themes/pastel.css +300 -0
- package/themes/polaris.css +300 -0
- package/themes/primer.css +300 -0
- package/themes/radix.css +300 -0
- package/themes/shadcn.css +300 -0
- package/themes/sketch.css +356 -0
- package/themes/spectrum.css +300 -0
- package/themes/terminal.css +300 -0
- package/themes/wireframe.css +328 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The interactive primitives Radix gives the React renderer, written for the DOM: the same roles,
|
|
3
|
+
* names, states and keyboard handling, so a document reads and operates the same in both.
|
|
4
|
+
*/
|
|
5
|
+
import { h } from "./dom.js";
|
|
6
|
+
const isEditable = (el) => el instanceof HTMLElement && (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName));
|
|
7
|
+
/* ---- Checkbox: a button that is checked, unchecked or mixed. ---- */
|
|
8
|
+
export function Checkbox(props, ...children) {
|
|
9
|
+
const { checked, onCheckedChange, indicator, ...rest } = props;
|
|
10
|
+
const state = checked === "indeterminate" ? "indeterminate" : checked ? "checked" : "unchecked";
|
|
11
|
+
return h("button", { type: "button", role: "checkbox", "aria-checked": checked === "indeterminate" ? "mixed" : checked, "data-state": state, value: "on", ...rest, onClick: () => onCheckedChange(checked === "indeterminate" ? true : !checked) }, state !== "unchecked" ? indicator : null, ...children);
|
|
12
|
+
}
|
|
13
|
+
/** The group carries the roving focus: Tab lands on it and it hands focus to the chosen item, or the first. */
|
|
14
|
+
export function RadioGroup(props, ...children) {
|
|
15
|
+
const { value, onValueChange, orientation, ...rest } = props;
|
|
16
|
+
const onKeyDown = (e) => {
|
|
17
|
+
const group = e.currentTarget;
|
|
18
|
+
const items = Array.from(group.querySelectorAll('[role="radio"]:not(:disabled)'));
|
|
19
|
+
const i = items.indexOf(document.activeElement);
|
|
20
|
+
if (i < 0 || !items.length)
|
|
21
|
+
return;
|
|
22
|
+
const forward = e.key === "ArrowDown" || e.key === "ArrowRight";
|
|
23
|
+
const back = e.key === "ArrowUp" || e.key === "ArrowLeft";
|
|
24
|
+
if (!forward && !back)
|
|
25
|
+
return;
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
const next = items[(i + (forward ? 1 : items.length - 1)) % items.length];
|
|
28
|
+
next.focus();
|
|
29
|
+
next.click();
|
|
30
|
+
};
|
|
31
|
+
const onFocus = (e) => {
|
|
32
|
+
const group = e.currentTarget;
|
|
33
|
+
if (e.target !== group)
|
|
34
|
+
return;
|
|
35
|
+
const items = Array.from(group.querySelectorAll('[role="radio"]:not(:disabled)'));
|
|
36
|
+
(items.find((b) => b.getAttribute("aria-checked") === "true") ?? items[0])?.focus();
|
|
37
|
+
};
|
|
38
|
+
return h("div", { role: "radiogroup", "aria-orientation": orientation, dir: "ltr", tabindex: "0", style: { outline: "none" }, ...rest, "data-value": value, onKeydown: onKeyDown, onFocus, onFocusin: (e) => (e.currentTarget.tabIndex = -1), onFocusout: (e) => {
|
|
39
|
+
const g = e.currentTarget;
|
|
40
|
+
if (!g.contains(e.relatedTarget))
|
|
41
|
+
g.tabIndex = 0;
|
|
42
|
+
} }, ...children);
|
|
43
|
+
}
|
|
44
|
+
/** One option. `group` is the group's value; the checked item (or the first, when none is) takes the tab stop. */
|
|
45
|
+
export function RadioItem(props, ...children) {
|
|
46
|
+
const { value, group, first, onSelect, indicator, ...rest } = props;
|
|
47
|
+
const checked = group === value;
|
|
48
|
+
const tabbable = checked || (group === "" && first);
|
|
49
|
+
return h("button", { type: "button", role: "radio", "aria-checked": checked, "data-state": checked ? "checked" : "unchecked", value, tabindex: tabbable ? "0" : "-1", ...rest, onClick: () => !checked && onSelect() }, checked ? indicator : null, ...children);
|
|
50
|
+
}
|
|
51
|
+
/* ---- Switch ---- */
|
|
52
|
+
export function Switch(props) {
|
|
53
|
+
const { checked, onCheckedChange, ...rest } = props;
|
|
54
|
+
const state = checked ? "checked" : "unchecked";
|
|
55
|
+
return h("button", { type: "button", role: "switch", "aria-checked": checked, "data-state": state, value: "on", ...rest, onClick: () => onCheckedChange(!checked) }, h("span", { "data-state": state, class: "pxd-switch-thumb" }));
|
|
56
|
+
}
|
|
57
|
+
const THUMB_PX = 20;
|
|
58
|
+
export function Slider(p) {
|
|
59
|
+
const { min, max, step } = p;
|
|
60
|
+
const span = max - min || 1;
|
|
61
|
+
const pct = (v) => ((v - min) / span) * 100;
|
|
62
|
+
const clamp = (v) => Math.min(max, Math.max(min, v));
|
|
63
|
+
const snap = (v) => clamp(min + Math.round((v - min) / step) * step);
|
|
64
|
+
const set = (i, v) => {
|
|
65
|
+
const next = [...p.values];
|
|
66
|
+
next[i] = snap(v);
|
|
67
|
+
const gap = (p.minStepsBetweenThumbs ?? 0) * step;
|
|
68
|
+
if (next.length === 2) {
|
|
69
|
+
if (i === 0)
|
|
70
|
+
next[0] = Math.min(next[0], next[1] - gap);
|
|
71
|
+
else
|
|
72
|
+
next[1] = Math.max(next[1], next[0] + gap);
|
|
73
|
+
}
|
|
74
|
+
p.onValueChange(next);
|
|
75
|
+
};
|
|
76
|
+
const onKeyDown = (i) => (e) => {
|
|
77
|
+
const v = p.values[i];
|
|
78
|
+
const big = step * 10;
|
|
79
|
+
const next = e.key === "ArrowRight" || e.key === "ArrowUp" ? v + step : e.key === "ArrowLeft" || e.key === "ArrowDown" ? v - step : e.key === "PageUp" ? v + big : e.key === "PageDown" ? v - big : e.key === "Home" ? min : e.key === "End" ? max : undefined;
|
|
80
|
+
if (next === undefined)
|
|
81
|
+
return;
|
|
82
|
+
e.preventDefault();
|
|
83
|
+
set(i, next);
|
|
84
|
+
};
|
|
85
|
+
const onPointerDown = (e) => {
|
|
86
|
+
if (e.pointerType === "mouse" && e.button !== 0)
|
|
87
|
+
return;
|
|
88
|
+
const root = e.currentTarget;
|
|
89
|
+
const track = root.querySelector(".pxd-slider-track");
|
|
90
|
+
const valueAt = (x) => {
|
|
91
|
+
const r = track.getBoundingClientRect();
|
|
92
|
+
return min + Math.min(1, Math.max(0, (x - r.left) / (r.width || 1))) * span;
|
|
93
|
+
};
|
|
94
|
+
// The nearest thumb follows the pointer.
|
|
95
|
+
const v = valueAt(e.clientX);
|
|
96
|
+
let i = 0;
|
|
97
|
+
p.values.forEach((tv, ti) => {
|
|
98
|
+
if (Math.abs(tv - v) < Math.abs(p.values[i] - v))
|
|
99
|
+
i = ti;
|
|
100
|
+
});
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
root.querySelectorAll('[role="slider"]')[i]?.focus();
|
|
103
|
+
set(i, v);
|
|
104
|
+
const move = (ev) => set(i, valueAt(ev.clientX));
|
|
105
|
+
const up = () => {
|
|
106
|
+
document.removeEventListener("pointermove", move);
|
|
107
|
+
document.removeEventListener("pointerup", up);
|
|
108
|
+
};
|
|
109
|
+
document.addEventListener("pointermove", move);
|
|
110
|
+
document.addEventListener("pointerup", up);
|
|
111
|
+
};
|
|
112
|
+
const lo = pct(p.values[0]);
|
|
113
|
+
const hi = pct(p.values[p.values.length - 1]);
|
|
114
|
+
const range = p.values.length === 1 ? { left: "0%", right: `${100 - hi}%` } : { left: `${lo}%`, right: `${100 - hi}%` };
|
|
115
|
+
// The thumb stays inside the track: at 0% it is offset by half its width, at 100% by minus half.
|
|
116
|
+
const offset = (percent) => THUMB_PX / 2 - (percent / 50) * (THUMB_PX / 2);
|
|
117
|
+
return h("span", { dir: "ltr", "data-orientation": "horizontal", class: "pxd-slider", style: { "--radix-slider-thumb-transform": "translateX(-50%)" }, onPointerdown: onPointerDown }, h("span", { "data-orientation": "horizontal", class: "pxd-slider-track" }, h("span", { "data-orientation": "horizontal", class: "pxd-slider-range", style: range })), ...p.values.map((v, i) => h("span", { key: i, style: { transform: "var(--radix-slider-thumb-transform)", position: "absolute", left: `calc(${pct(v)}% + ${offset(pct(v))}px)` } }, h("span", {
|
|
118
|
+
role: "slider",
|
|
119
|
+
"aria-label": p.thumbs[i]?.["aria-label"],
|
|
120
|
+
"aria-labelledby": p.thumbs[i]?.["aria-labelledby"],
|
|
121
|
+
"aria-valuemin": min,
|
|
122
|
+
"aria-valuenow": v,
|
|
123
|
+
"aria-valuemax": max,
|
|
124
|
+
"aria-valuetext": p.thumbs[i]?.["aria-valuetext"],
|
|
125
|
+
"aria-orientation": "horizontal",
|
|
126
|
+
"data-orientation": "horizontal",
|
|
127
|
+
tabindex: "0",
|
|
128
|
+
class: "pxd-slider-thumb",
|
|
129
|
+
onKeydown: onKeyDown(i),
|
|
130
|
+
}))));
|
|
131
|
+
}
|
|
132
|
+
/** Arrows move between tabs and select them (automatic activation), as Radix does. */
|
|
133
|
+
export function Tabs(p) {
|
|
134
|
+
const onKeyDown = (e) => {
|
|
135
|
+
const list = e.currentTarget;
|
|
136
|
+
const tabs = Array.from(list.querySelectorAll('[role="tab"]'));
|
|
137
|
+
const i = tabs.indexOf(document.activeElement);
|
|
138
|
+
if (i < 0)
|
|
139
|
+
return;
|
|
140
|
+
const next = e.key === "ArrowRight" ? (i + 1) % tabs.length : e.key === "ArrowLeft" ? (i + tabs.length - 1) % tabs.length : e.key === "Home" ? 0 : e.key === "End" ? tabs.length - 1 : -1;
|
|
141
|
+
if (next < 0)
|
|
142
|
+
return;
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
tabs[next].focus();
|
|
145
|
+
tabs[next].click();
|
|
146
|
+
};
|
|
147
|
+
return h("div", { dir: "ltr", "data-orientation": "horizontal", class: p.rootClass, ...(p.rootProps ?? {}) }, h("div", { role: "tablist", "aria-orientation": "horizontal", class: p.listClass, tabindex: "-1", "data-orientation": "horizontal", style: { outline: "none" }, onKeydown: onKeyDown }, ...p.tabs.map((t) => {
|
|
148
|
+
const on = t.key === p.value;
|
|
149
|
+
return h("button", { key: t.key, type: "button", role: "tab", "aria-selected": on, "aria-controls": `${p.id}-content-${t.key}`, "data-state": on ? "active" : "inactive", id: `${p.id}-trigger-${t.key}`, tabindex: on ? "0" : "-1", "data-orientation": "horizontal", class: p.tabClass, onClick: () => p.onValueChange(t.key) }, ...t.label);
|
|
150
|
+
})), ...p.tabs.map((t) => {
|
|
151
|
+
const on = t.key === p.value;
|
|
152
|
+
return h("div", { key: t.key, "data-state": on ? "active" : "inactive", "data-orientation": "horizontal", role: "tabpanel", "aria-labelledby": `${p.id}-trigger-${t.key}`, id: `${p.id}-content-${t.key}`, tabindex: "0", class: p.panelClass, hidden: !on, style: { animationDuration: "0s" } }, on ? t.content : null);
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Opens on mount with showModal(), which traps focus, makes the rest inert and returns focus on
|
|
157
|
+
* close. Like Radix's hideOthers, the surface's other regions are hidden from assistive technology
|
|
158
|
+
* while it is open (the renderer sets aria-hidden on them for every modal in the portal).
|
|
159
|
+
*/
|
|
160
|
+
export function Dialog(p, ...children) {
|
|
161
|
+
const dismissible = p.dismissible !== false;
|
|
162
|
+
p.ctx.r.modals++;
|
|
163
|
+
const ref = (el) => {
|
|
164
|
+
const d = el;
|
|
165
|
+
if (d && !d.open) {
|
|
166
|
+
try {
|
|
167
|
+
d.showModal();
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
d.setAttribute("open", "");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
p.ref?.(d);
|
|
174
|
+
};
|
|
175
|
+
const close = (d) => {
|
|
176
|
+
// close() first, so focus returns to what opened it before the element goes.
|
|
177
|
+
if (d.open)
|
|
178
|
+
d.close();
|
|
179
|
+
p.onClose();
|
|
180
|
+
};
|
|
181
|
+
return [
|
|
182
|
+
h("div", { key: `${p.id}-overlay`, "data-state": "open", class: p.overlayClass ?? "pxd-overlay", "aria-hidden": "true", style: { pointerEvents: "auto" } }),
|
|
183
|
+
h("dialog", {
|
|
184
|
+
key: p.id,
|
|
185
|
+
role: p.role ?? "dialog",
|
|
186
|
+
"data-state": "open",
|
|
187
|
+
class: p.class,
|
|
188
|
+
tabindex: "-1",
|
|
189
|
+
"data-pxd-modal": "",
|
|
190
|
+
...(p.props ?? {}),
|
|
191
|
+
ref,
|
|
192
|
+
onCancel: (e) => {
|
|
193
|
+
e.preventDefault();
|
|
194
|
+
if (dismissible)
|
|
195
|
+
close(e.currentTarget);
|
|
196
|
+
},
|
|
197
|
+
onClick: (e) => {
|
|
198
|
+
// A click on the backdrop lands on the dialog element itself, outside its box.
|
|
199
|
+
const d = e.currentTarget;
|
|
200
|
+
if (e.target !== d)
|
|
201
|
+
return;
|
|
202
|
+
const r = d.getBoundingClientRect();
|
|
203
|
+
const inside = e.clientX >= r.left && e.clientX <= r.right && e.clientY >= r.top && e.clientY <= r.bottom;
|
|
204
|
+
if (!inside && dismissible)
|
|
205
|
+
close(d);
|
|
206
|
+
},
|
|
207
|
+
onClose: () => p.onClose(),
|
|
208
|
+
}, ...children),
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
/** A dialog's close control: a button that closes it, named "Close" unless told otherwise. */
|
|
212
|
+
export const dialogClose = (onClose, props, ...children) => h("button", { type: "button", ...props, onClick: (e) => {
|
|
213
|
+
const d = e.currentTarget.closest("dialog");
|
|
214
|
+
if (d?.open)
|
|
215
|
+
d.close();
|
|
216
|
+
onClose();
|
|
217
|
+
} }, ...children);
|
|
218
|
+
export const closedMenu = () => ({ open: false, x: 0, y: 0, align: "end" });
|
|
219
|
+
/** The trigger's props: what it is, whether it is open, and how to open it. */
|
|
220
|
+
export function menuTrigger(id, state, setState, align, props) {
|
|
221
|
+
const open = (el, keyboard) => {
|
|
222
|
+
const r = el.getBoundingClientRect();
|
|
223
|
+
setState({ open: true, x: align === "end" ? r.right : r.left, y: r.bottom + 4, keyboard, align });
|
|
224
|
+
};
|
|
225
|
+
return {
|
|
226
|
+
id: `${id}-trigger`,
|
|
227
|
+
"aria-haspopup": "menu",
|
|
228
|
+
"aria-expanded": state.open,
|
|
229
|
+
"aria-controls": state.open ? `${id}-content` : undefined,
|
|
230
|
+
"data-state": state.open ? "open" : "closed",
|
|
231
|
+
...props,
|
|
232
|
+
onPointerdown: (e) => {
|
|
233
|
+
if (e.button !== 0 || e.ctrlKey)
|
|
234
|
+
return;
|
|
235
|
+
e.preventDefault();
|
|
236
|
+
if (state.open)
|
|
237
|
+
setState(closedMenu());
|
|
238
|
+
else
|
|
239
|
+
open(e.currentTarget, false);
|
|
240
|
+
},
|
|
241
|
+
onKeydown: (e) => {
|
|
242
|
+
if (e.key === "Enter" || e.key === " " || e.key === "ArrowDown") {
|
|
243
|
+
e.preventDefault();
|
|
244
|
+
open(e.currentTarget, true);
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/** The menu itself, rendered into the portal while open. Escape and selection return focus to the trigger. */
|
|
250
|
+
export function Menu(ctx, id, state, setState, items, props) {
|
|
251
|
+
if (!state.open)
|
|
252
|
+
return;
|
|
253
|
+
const close = (refocus = true) => {
|
|
254
|
+
setState(closedMenu());
|
|
255
|
+
if (refocus)
|
|
256
|
+
(document.getElementById(`${id}-trigger`) ?? ctx.r.root?.querySelector(`[data-pxd-menu-trigger="${id}"]`))?.focus();
|
|
257
|
+
};
|
|
258
|
+
const onKeyDown = (e) => {
|
|
259
|
+
const menu = e.currentTarget;
|
|
260
|
+
const all = Array.from(menu.querySelectorAll('[role="menuitem"]:not([data-disabled])'));
|
|
261
|
+
const i = all.indexOf(document.activeElement);
|
|
262
|
+
if (e.key === "Escape")
|
|
263
|
+
return (e.preventDefault(), close());
|
|
264
|
+
if (e.key === "Tab")
|
|
265
|
+
return close(false);
|
|
266
|
+
const next = e.key === "ArrowDown" ? (i + 1) % all.length : e.key === "ArrowUp" ? (i + all.length - 1) % all.length : e.key === "Home" ? 0 : e.key === "End" ? all.length - 1 : -1;
|
|
267
|
+
if (next >= 0 && all.length)
|
|
268
|
+
(e.preventDefault(), all[next].focus());
|
|
269
|
+
};
|
|
270
|
+
let outside = null;
|
|
271
|
+
const ref = (el) => {
|
|
272
|
+
if (!el) {
|
|
273
|
+
if (outside)
|
|
274
|
+
document.removeEventListener("pointerdown", outside, true);
|
|
275
|
+
outside = null;
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const menu = el;
|
|
279
|
+
// Clamp within the viewport, then focus the menu (or its first item when opened from the keyboard).
|
|
280
|
+
const r = menu.getBoundingClientRect();
|
|
281
|
+
const wrapper = menu.parentElement;
|
|
282
|
+
const x = state.align === "end" ? Math.max(8, state.x - r.width) : Math.min(state.x, window.innerWidth - r.width - 8);
|
|
283
|
+
const y = state.y + r.height > window.innerHeight ? Math.max(8, state.y - r.height - 8) : state.y;
|
|
284
|
+
wrapper.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;
|
|
285
|
+
const first = menu.querySelector('[role="menuitem"]:not([data-disabled])');
|
|
286
|
+
(state.keyboard && first ? first : menu).focus({ preventScroll: true });
|
|
287
|
+
outside = (e) => {
|
|
288
|
+
if (!menu.contains(e.target) && !e.target.closest?.(`#${CSS.escape(`${id}-trigger`)}`))
|
|
289
|
+
close(false);
|
|
290
|
+
};
|
|
291
|
+
document.addEventListener("pointerdown", outside, true);
|
|
292
|
+
};
|
|
293
|
+
ctx.portal(h("div", { key: `${id}-menu`, "data-radix-popper-content-wrapper": "", style: { position: "fixed", left: "0px", top: "0px", minWidth: "max-content", zIndex: 12 } }, h("div", { role: "menu", "aria-orientation": "vertical", "data-state": "open", dir: "ltr", id: `${id}-content`, "aria-labelledby": `${id}-trigger`, tabindex: "-1", style: { outline: "none" }, ...props, ref, onKeydown: onKeyDown }, ...items.map((it, i) => it === "separator"
|
|
294
|
+
? h("div", { key: `sep-${i}`, role: "separator", "aria-orientation": "horizontal", class: "pxd-menu-separator" })
|
|
295
|
+
: h("div", {
|
|
296
|
+
key: it.key,
|
|
297
|
+
role: "menuitem",
|
|
298
|
+
class: it.class,
|
|
299
|
+
tabindex: "-1",
|
|
300
|
+
"data-orientation": "vertical",
|
|
301
|
+
"aria-disabled": it.disabled || undefined,
|
|
302
|
+
"data-disabled": it.disabled ? "" : undefined,
|
|
303
|
+
...(it.props ?? {}),
|
|
304
|
+
onPointermove: (e) => {
|
|
305
|
+
e.currentTarget.focus();
|
|
306
|
+
},
|
|
307
|
+
onFocus: (e) => {
|
|
308
|
+
for (const o of e.currentTarget.parentElement.querySelectorAll('[data-highlighted]'))
|
|
309
|
+
o.removeAttribute("data-highlighted");
|
|
310
|
+
e.currentTarget.setAttribute("data-highlighted", "");
|
|
311
|
+
},
|
|
312
|
+
onBlur: (e) => e.currentTarget.removeAttribute("data-highlighted"),
|
|
313
|
+
onClick: () => {
|
|
314
|
+
if (it.disabled)
|
|
315
|
+
return;
|
|
316
|
+
close();
|
|
317
|
+
it.onSelect();
|
|
318
|
+
},
|
|
319
|
+
onKeydown: (e) => {
|
|
320
|
+
if ((e.key === "Enter" || e.key === " ") && !it.disabled)
|
|
321
|
+
(e.preventDefault(), close(), it.onSelect());
|
|
322
|
+
},
|
|
323
|
+
}, ...it.label)))));
|
|
324
|
+
}
|
|
325
|
+
/* ---- Popover: non-modal content beside an anchor, dismissed by Escape or a click outside. ---- */
|
|
326
|
+
export function Popover(ctx, id, anchorSelector, onClose, dismissible, props, ...children) {
|
|
327
|
+
let outside = null;
|
|
328
|
+
let keys = null;
|
|
329
|
+
const ref = (el) => {
|
|
330
|
+
if (!el) {
|
|
331
|
+
if (outside)
|
|
332
|
+
document.removeEventListener("pointerdown", outside, true);
|
|
333
|
+
if (keys)
|
|
334
|
+
document.removeEventListener("keydown", keys);
|
|
335
|
+
outside = keys = null;
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const content = el;
|
|
339
|
+
const wrapper = content.parentElement;
|
|
340
|
+
const anchor = ctx.r.root?.querySelector(anchorSelector);
|
|
341
|
+
const a = anchor?.getBoundingClientRect() ?? { left: 8, bottom: 8, width: 0 };
|
|
342
|
+
const r = content.getBoundingClientRect();
|
|
343
|
+
const x = Math.max(8, Math.min(a.left + a.width / 2 - r.width / 2, window.innerWidth - r.width - 8));
|
|
344
|
+
const y = a.bottom + 8 + r.height > window.innerHeight ? Math.max(8, (anchor?.getBoundingClientRect().top ?? 0) - 8 - r.height) : a.bottom + 8;
|
|
345
|
+
wrapper.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;
|
|
346
|
+
(content.querySelector("button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])") ?? content).focus({ preventScroll: true });
|
|
347
|
+
if (!dismissible)
|
|
348
|
+
return;
|
|
349
|
+
outside = (e) => {
|
|
350
|
+
if (!content.contains(e.target))
|
|
351
|
+
onClose();
|
|
352
|
+
};
|
|
353
|
+
keys = (e) => e.key === "Escape" && onClose();
|
|
354
|
+
document.addEventListener("pointerdown", outside, true);
|
|
355
|
+
document.addEventListener("keydown", keys);
|
|
356
|
+
};
|
|
357
|
+
ctx.portal(h("div", { key: `${id}-popover`, "data-radix-popper-content-wrapper": "", style: { position: "fixed", left: "0px", top: "0px", minWidth: "max-content", zIndex: 12 } }, h("div", { "data-side": "bottom", "data-align": "center", "data-state": "open", role: "dialog", id: `${id}-content`, tabindex: "-1", ...props, ref }, ...children)));
|
|
358
|
+
}
|
|
359
|
+
/* ---- Keyboard shortcuts on the document, scoped to the surface. ---- */
|
|
360
|
+
export { isEditable };
|
|
361
|
+
//# sourceMappingURL=primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../src/primitives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The renderer: one document walked from the root into a virtual tree, patched into a host
|
|
3
|
+
* element, redrawn whenever the surface's data or a component's own state changes. Component
|
|
4
|
+
* functions take the document node and a context (scope, heading level, the enclosing Steps or
|
|
5
|
+
* Frame) and return elements, the way the React components do with hooks and providers.
|
|
6
|
+
*/
|
|
7
|
+
import { type Action, type ActionEvent, type Data, type Format, type Node, type Scope, type Surface, type UIDocument } from "@polyxd/core";
|
|
8
|
+
import { type VChild, type VNode } from "./dom.ts";
|
|
9
|
+
import { type ComponentRenderer } from "./components/index.ts";
|
|
10
|
+
export type Density = "compact" | "comfortable" | "spacious";
|
|
11
|
+
export type Mode = "light" | "dark";
|
|
12
|
+
/** What the host passes to a surface (the same props as PolyxdSurface). */
|
|
13
|
+
export interface SurfaceProps {
|
|
14
|
+
document: UIDocument;
|
|
15
|
+
data?: Data;
|
|
16
|
+
onAction?: (event: ActionEvent) => void;
|
|
17
|
+
onDataChange?: (data: Data) => void;
|
|
18
|
+
derive?: (data: Data) => Data | void;
|
|
19
|
+
onDismiss?: () => void;
|
|
20
|
+
theme?: string;
|
|
21
|
+
mode?: Mode;
|
|
22
|
+
density?: Density;
|
|
23
|
+
/** Design Direction's profile.disclosure: "show-everything" opens every Disclosure by default. */
|
|
24
|
+
disclosure?: "progressive" | "show-everything";
|
|
25
|
+
locale?: string;
|
|
26
|
+
resolveMedia?: (ref: string) => string | undefined;
|
|
27
|
+
/** Renderer overrides by component name, and the host's own components (namespaced, e.g. "brand.logo") a Custom names. */
|
|
28
|
+
components?: Record<string, ComponentRenderer | HostComponent>;
|
|
29
|
+
className?: string;
|
|
30
|
+
/** For a shell: the screen in the Outlet, which item is current, whether a screen is on its way. */
|
|
31
|
+
outlet?: Element | null;
|
|
32
|
+
current?: {
|
|
33
|
+
key?: string;
|
|
34
|
+
title?: string;
|
|
35
|
+
};
|
|
36
|
+
loading?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** A host's own component: gets the Custom's resolved props and the node, returns an element (or a description of one). */
|
|
39
|
+
export type HostComponent = (props: Record<string, unknown> & {
|
|
40
|
+
node: Node;
|
|
41
|
+
}) => Element | VNode | null;
|
|
42
|
+
/** What the Frame tells the components inside it. */
|
|
43
|
+
export interface FrameContextValue {
|
|
44
|
+
navigation: "side" | "rail" | "bar" | "drawer";
|
|
45
|
+
compact: boolean;
|
|
46
|
+
mainId: string;
|
|
47
|
+
navigationId?: string;
|
|
48
|
+
navigationLabel?: string;
|
|
49
|
+
current?: {
|
|
50
|
+
key?: string;
|
|
51
|
+
title?: string;
|
|
52
|
+
};
|
|
53
|
+
drawerOpen: boolean;
|
|
54
|
+
setDrawerOpen: (open: boolean) => void;
|
|
55
|
+
}
|
|
56
|
+
/** Binding helpers for one scope, as the React components get from useBindings. */
|
|
57
|
+
export interface Bindings {
|
|
58
|
+
scope: Scope;
|
|
59
|
+
value: <T = unknown>(v: unknown) => T;
|
|
60
|
+
text: (v: unknown, format?: Format) => string;
|
|
61
|
+
pointer: (v: {
|
|
62
|
+
path: string;
|
|
63
|
+
}) => string;
|
|
64
|
+
write: (v: {
|
|
65
|
+
path: string;
|
|
66
|
+
}, value: unknown) => void;
|
|
67
|
+
context: (c: Record<string, unknown> | undefined) => Record<string, unknown>;
|
|
68
|
+
}
|
|
69
|
+
/** The context a component renders in: the renderer, the scope, and what its ancestors decided. */
|
|
70
|
+
export interface Ctx {
|
|
71
|
+
r: Renderer;
|
|
72
|
+
scope: Scope;
|
|
73
|
+
/** Heading level for the next Section (the surface title is h1). */
|
|
74
|
+
heading: number;
|
|
75
|
+
/** Handles ui.back / ui.next inside Steps. */
|
|
76
|
+
steps?: {
|
|
77
|
+
back: () => void;
|
|
78
|
+
next: () => void;
|
|
79
|
+
};
|
|
80
|
+
frame?: FrameContextValue;
|
|
81
|
+
b: Bindings;
|
|
82
|
+
/** A component by id, in this scope (or a new one), with its `visible` honoured. */
|
|
83
|
+
render: (id: string, scope?: Scope) => VChild;
|
|
84
|
+
/** Accessibility props from the node's `accessibility` block, plus which component rendered the element. */
|
|
85
|
+
a11y: (node: Node) => Record<string, unknown>;
|
|
86
|
+
/** A stable element id for this node in this scope, for label/control pairs and live regions. */
|
|
87
|
+
id: (node: Node, suffix?: string) => string;
|
|
88
|
+
/** Local state for this node in this scope, named; a set redraws the surface. */
|
|
89
|
+
state: <T>(node: Node, name: string, initial: T | (() => T)) => [T, (next: T | ((cur: T) => T)) => void];
|
|
90
|
+
/** Runs after the tree has been patched (a layout effect): measure, then set state if it changed. */
|
|
91
|
+
after: (fn: () => void) => void;
|
|
92
|
+
/** Renders into the surface's portal, so dialogs and menus stay inside the themed surface. */
|
|
93
|
+
portal: (child: VChild) => void;
|
|
94
|
+
with: (patch: Partial<Pick<Ctx, "scope" | "heading" | "steps" | "frame">>) => Ctx;
|
|
95
|
+
}
|
|
96
|
+
export declare class Renderer {
|
|
97
|
+
surface: Surface;
|
|
98
|
+
props: SurfaceProps;
|
|
99
|
+
host: HTMLElement;
|
|
100
|
+
/** The surface's outer element once drawn: shortcuts fire only while focus is inside it. */
|
|
101
|
+
root: HTMLElement | null;
|
|
102
|
+
portalEl: HTMLElement | null;
|
|
103
|
+
components: Record<string, ComponentRenderer | HostComponent>;
|
|
104
|
+
private states;
|
|
105
|
+
private effects;
|
|
106
|
+
private portals;
|
|
107
|
+
/** Modal dialogs open in this draw: while one is, the surface's other regions are hidden from assistive technology (as Radix hides them). */
|
|
108
|
+
modals: number;
|
|
109
|
+
private scheduled;
|
|
110
|
+
private unsubscribe;
|
|
111
|
+
private observers;
|
|
112
|
+
/** Set while patching, so a state change made by an effect schedules another draw instead of nesting. */
|
|
113
|
+
private drawing;
|
|
114
|
+
/** Set by the surface once the first draw is done, so shortcut listeners can be attached once. */
|
|
115
|
+
private disposers;
|
|
116
|
+
constructor(host: HTMLElement, props: SurfaceProps);
|
|
117
|
+
private makeSurface;
|
|
118
|
+
get locale(): string;
|
|
119
|
+
get doc(): UIDocument;
|
|
120
|
+
get data(): Data;
|
|
121
|
+
get byId(): Map<string, Node>;
|
|
122
|
+
get disclosure(): "progressive" | "show-everything";
|
|
123
|
+
/** New props: a new document remounts; a shell adopts the host's new data; anything else redraws. */
|
|
124
|
+
update(props: SurfaceProps): void;
|
|
125
|
+
dispose(): void;
|
|
126
|
+
onDispose(fn: () => void): void;
|
|
127
|
+
schedule(): void;
|
|
128
|
+
/** Watches an element's width; the callback runs with each new width and may set state. */
|
|
129
|
+
observeWidth(el: Element | null, key: string, fn: (width: number) => void): void;
|
|
130
|
+
unobserve(el: Element): void;
|
|
131
|
+
bindings(scope: Scope): Bindings;
|
|
132
|
+
dispatch(action: Action | undefined, scope: Scope, source: string): void;
|
|
133
|
+
ctx(base: {
|
|
134
|
+
scope: Scope;
|
|
135
|
+
heading: number;
|
|
136
|
+
steps?: Ctx["steps"];
|
|
137
|
+
frame?: FrameContextValue;
|
|
138
|
+
}): Ctx;
|
|
139
|
+
/** Renders a component by id in a context, honouring `visible`; unknown components say so. */
|
|
140
|
+
renderNode(id: string, ctx: Ctx): VChild;
|
|
141
|
+
draw(): void;
|
|
142
|
+
private surfaceTree;
|
|
143
|
+
/** Title, and on a record page: where it sits, what state it's in, and what you can do to it. */
|
|
144
|
+
private header;
|
|
145
|
+
}
|