@xeonr/platform-ui 1.5.0 → 1.6.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/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/kit/Anchored.d.ts +24 -2
- package/dist/kit/Anchored.d.ts.map +1 -1
- package/dist/kit/Anchored.js +47 -3
- package/dist/kit/Anchored.js.map +1 -1
- package/dist/kit/Blocks.d.ts +6 -1
- package/dist/kit/Blocks.d.ts.map +1 -1
- package/dist/kit/Blocks.js +13 -2
- package/dist/kit/Blocks.js.map +1 -1
- package/dist/kit/Card.d.ts +6 -1
- package/dist/kit/Card.d.ts.map +1 -1
- package/dist/kit/Card.js +19 -4
- package/dist/kit/Card.js.map +1 -1
- package/dist/kit/Charts.d.ts +39 -3
- package/dist/kit/Charts.d.ts.map +1 -1
- package/dist/kit/Charts.js +70 -15
- package/dist/kit/Charts.js.map +1 -1
- package/dist/kit/CommandPalette.d.ts +47 -0
- package/dist/kit/CommandPalette.d.ts.map +1 -0
- package/dist/kit/CommandPalette.js +204 -0
- package/dist/kit/CommandPalette.js.map +1 -0
- package/dist/kit/DataTable.d.ts +18 -2
- package/dist/kit/DataTable.d.ts.map +1 -1
- package/dist/kit/DataTable.js +45 -6
- package/dist/kit/DataTable.js.map +1 -1
- package/dist/kit/Editable.d.ts +30 -0
- package/dist/kit/Editable.d.ts.map +1 -1
- package/dist/kit/Editable.js +150 -3
- package/dist/kit/Editable.js.map +1 -1
- package/dist/kit/EmptyState.d.ts +9 -2
- package/dist/kit/EmptyState.d.ts.map +1 -1
- package/dist/kit/EmptyState.js +16 -2
- package/dist/kit/EmptyState.js.map +1 -1
- package/dist/kit/Facet.d.ts.map +1 -1
- package/dist/kit/Facet.js +12 -2
- package/dist/kit/Facet.js.map +1 -1
- package/dist/kit/GroupedMultiSelect.d.ts +57 -0
- package/dist/kit/GroupedMultiSelect.d.ts.map +1 -0
- package/dist/kit/GroupedMultiSelect.js +219 -0
- package/dist/kit/GroupedMultiSelect.js.map +1 -0
- package/dist/kit/List.d.ts +18 -1
- package/dist/kit/List.d.ts.map +1 -1
- package/dist/kit/List.js +38 -10
- package/dist/kit/List.js.map +1 -1
- package/dist/kit/LogView.d.ts +39 -3
- package/dist/kit/LogView.d.ts.map +1 -1
- package/dist/kit/LogView.js +52 -10
- package/dist/kit/LogView.js.map +1 -1
- package/dist/kit/Marker.d.ts +19 -0
- package/dist/kit/Marker.d.ts.map +1 -1
- package/dist/kit/Marker.js +50 -0
- package/dist/kit/Marker.js.map +1 -1
- package/dist/kit/Modal.d.ts +13 -3
- package/dist/kit/Modal.d.ts.map +1 -1
- package/dist/kit/Modal.js +39 -9
- package/dist/kit/Modal.js.map +1 -1
- package/dist/kit/Panel.d.ts +21 -0
- package/dist/kit/Panel.d.ts.map +1 -1
- package/dist/kit/Panel.js +36 -0
- package/dist/kit/Panel.js.map +1 -1
- package/dist/kit/Picker.d.ts +7 -1
- package/dist/kit/Picker.d.ts.map +1 -1
- package/dist/kit/Picker.js +11 -2
- package/dist/kit/Picker.js.map +1 -1
- package/dist/kit/PipelineFlow.d.ts +44 -0
- package/dist/kit/PipelineFlow.d.ts.map +1 -0
- package/dist/kit/PipelineFlow.js +171 -0
- package/dist/kit/PipelineFlow.js.map +1 -0
- package/dist/kit/Popover.d.ts.map +1 -1
- package/dist/kit/Popover.js +4 -1
- package/dist/kit/Popover.js.map +1 -1
- package/dist/kit/Range.d.ts.map +1 -1
- package/dist/kit/Range.js +8 -2
- package/dist/kit/Range.js.map +1 -1
- package/dist/kit/Reorder.d.ts +54 -0
- package/dist/kit/Reorder.d.ts.map +1 -0
- package/dist/kit/Reorder.js +171 -0
- package/dist/kit/Reorder.js.map +1 -0
- package/dist/kit/Stat.d.ts +38 -5
- package/dist/kit/Stat.d.ts.map +1 -1
- package/dist/kit/Stat.js +99 -11
- package/dist/kit/Stat.js.map +1 -1
- package/dist/kit/Tooltip.d.ts.map +1 -1
- package/dist/kit/Tooltip.js +5 -2
- package/dist/kit/Tooltip.js.map +1 -1
- package/dist/theme/ThemeScope.d.ts +30 -0
- package/dist/theme/ThemeScope.d.ts.map +1 -0
- package/dist/theme/ThemeScope.js +61 -0
- package/dist/theme/ThemeScope.js.map +1 -0
- package/dist/theme/brand.d.ts +2 -1
- package/dist/theme/brand.d.ts.map +1 -1
- package/dist/theme/brand.js +10 -6
- package/dist/theme/brand.js.map +1 -1
- package/dist/theme/scope.d.ts +23 -0
- package/dist/theme/scope.d.ts.map +1 -0
- package/dist/theme/scope.js +32 -0
- package/dist/theme/scope.js.map +1 -0
- package/dist/theme/tokens.d.ts +2 -1
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +65 -100
- package/dist/theme/tokens.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useLayoutEffect, useRef, useState } from "react";
|
|
3
|
+
import styled, { css } from "styled-components";
|
|
4
|
+
import { v } from "../theme/tokens.js";
|
|
5
|
+
import { IconButton } from "./Button.js";
|
|
6
|
+
import { Icon } from "./Icon.js";
|
|
7
|
+
// An ordered list whose order is the setting: a quality ladder, a provider
|
|
8
|
+
// preference, a fallback chain. RepeaterRows adds and removes; this moves.
|
|
9
|
+
// Up/down buttons rather than drag — they work from the keyboard and on a
|
|
10
|
+
// phone, and a list of three to ten rows is a click or two either way. Alt+↑/↓
|
|
11
|
+
// moves the row that holds focus without leaving the field it is in.
|
|
12
|
+
//
|
|
13
|
+
// The marker is a line between two rows that moves on its own — XMB's
|
|
14
|
+
// "upgrade until here" cutoff. It names a position, not an item: the caller
|
|
15
|
+
// decides what it means and whether it follows an item when rows move.
|
|
16
|
+
const Wrap = styled.div `
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
border: 1px solid ${v.line};
|
|
20
|
+
border-radius: ${v.rCard};
|
|
21
|
+
background: ${v.surface};
|
|
22
|
+
`;
|
|
23
|
+
const Item = styled.div `
|
|
24
|
+
border-bottom: 1px solid ${v.line};
|
|
25
|
+
&:last-of-type { border-bottom: none; }
|
|
26
|
+
`;
|
|
27
|
+
const RowEl = styled.div `
|
|
28
|
+
display: flex;
|
|
29
|
+
align-items: center;
|
|
30
|
+
gap: 10px;
|
|
31
|
+
padding: 6px 12px 6px 6px;
|
|
32
|
+
font-size: 12.5px;
|
|
33
|
+
color: ${(p) => (p.$dim ? v.faint : v.text)};
|
|
34
|
+
&:hover .reorder-reveal, &:focus-within .reorder-reveal { opacity: 1; }
|
|
35
|
+
`;
|
|
36
|
+
const Moves = styled.div `
|
|
37
|
+
flex: none;
|
|
38
|
+
display: grid;
|
|
39
|
+
gap: 1px;
|
|
40
|
+
${(p) => p.$quiet && css `opacity: 0; transition: opacity 0.14s ease; &:focus-within { opacity: 1; }`}
|
|
41
|
+
> button { width: 26px; height: 18px; font-size: 11px; }
|
|
42
|
+
> button:disabled { opacity: 0.35; cursor: default; }
|
|
43
|
+
`;
|
|
44
|
+
const Body = styled.div `flex: 1 1 auto; min-width: 0;`;
|
|
45
|
+
const Slot = styled.div `flex: none; display: flex; align-items: center; gap: 6px;`;
|
|
46
|
+
const Place = styled.button `
|
|
47
|
+
flex: none;
|
|
48
|
+
/* every row keeps the slot, so the fields after it line up down the list */
|
|
49
|
+
${(p) => p.$held && css `visibility: hidden;`}
|
|
50
|
+
font-size: 11.5px;
|
|
51
|
+
color: ${v.faint};
|
|
52
|
+
opacity: 0;
|
|
53
|
+
transition: opacity 0.14s ease;
|
|
54
|
+
&:hover, &:focus-visible { opacity: 1; color: ${v.brand}; }
|
|
55
|
+
`;
|
|
56
|
+
const markerTones = {
|
|
57
|
+
brand: { ink: v.brand, bg: v.brand08 },
|
|
58
|
+
info: { ink: v.info, bg: v.infoBg },
|
|
59
|
+
warn: { ink: v.warning, bg: v.warningBg },
|
|
60
|
+
};
|
|
61
|
+
const MarkerEl = styled.div `
|
|
62
|
+
display: flex;
|
|
63
|
+
align-items: center;
|
|
64
|
+
gap: 10px;
|
|
65
|
+
margin: 6px 8px;
|
|
66
|
+
padding: 4px 8px 4px 0;
|
|
67
|
+
border: 1px dashed ${(p) => markerTones[p.$tone].ink};
|
|
68
|
+
border-radius: ${v.rCtl};
|
|
69
|
+
background: ${(p) => markerTones[p.$tone].bg};
|
|
70
|
+
color: ${(p) => markerTones[p.$tone].ink};
|
|
71
|
+
font-size: 12px;
|
|
72
|
+
> ${Moves} { padding-left: 4px; }
|
|
73
|
+
> ${Moves} > button, > .marker-clear { color: inherit; }
|
|
74
|
+
`;
|
|
75
|
+
// Visually hidden, read by assistive tech: the sentence a sighted person gets
|
|
76
|
+
// from watching the row jump.
|
|
77
|
+
const Announce = styled.span `
|
|
78
|
+
position: absolute;
|
|
79
|
+
width: 1px;
|
|
80
|
+
height: 1px;
|
|
81
|
+
overflow: hidden;
|
|
82
|
+
clip: rect(0 0 0 0);
|
|
83
|
+
white-space: nowrap;
|
|
84
|
+
`;
|
|
85
|
+
/**
|
|
86
|
+
* ReorderList: a controlled, keyboard-accessible ordered list. Each row has
|
|
87
|
+
* up/down buttons (and Alt+↑/↓ from anywhere in the row); every move is
|
|
88
|
+
* announced. Optionally a marker line between rows that moves on its own, an
|
|
89
|
+
* inline field per row, and trailing actions.
|
|
90
|
+
*/
|
|
91
|
+
export function ReorderList({ items, onReorder, itemKey, itemLabel, render, field, actions, dim, marker, quiet, disabled, "aria-label": ariaLabel, }) {
|
|
92
|
+
const [said, setSaid] = useState("");
|
|
93
|
+
const rows = useRef(new Map());
|
|
94
|
+
const markerEl = useRef(null);
|
|
95
|
+
// A moved row can lose focus when React re-inserts it, the button that
|
|
96
|
+
// moved it to the top is now disabled, and the marker's buttons remount
|
|
97
|
+
// under another row. Put focus back after the commit.
|
|
98
|
+
const refocus = useRef(null);
|
|
99
|
+
useLayoutEffect(() => {
|
|
100
|
+
const pending = refocus.current;
|
|
101
|
+
if (!pending)
|
|
102
|
+
return;
|
|
103
|
+
refocus.current = null;
|
|
104
|
+
const el = pending.el;
|
|
105
|
+
if (el && el.isConnected && !el.disabled) {
|
|
106
|
+
if (document.activeElement !== el)
|
|
107
|
+
el.focus();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// the same direction's button if it can still move, else the other's
|
|
111
|
+
const box = pending.within();
|
|
112
|
+
const same = box?.querySelector(`[data-move="${pending.dir === -1 ? "up" : "down"}"]`);
|
|
113
|
+
const other = box?.querySelector(`[data-move="${pending.dir === -1 ? "down" : "up"}"]`);
|
|
114
|
+
(same && !same.disabled ? same : other)?.focus();
|
|
115
|
+
});
|
|
116
|
+
const n = items.length;
|
|
117
|
+
const holds = (i) => i >= 0 && i < n && (marker?.canHold ? marker.canHold(items[i], i) : true);
|
|
118
|
+
const move = (from, dir) => {
|
|
119
|
+
const to = from + dir;
|
|
120
|
+
if (disabled || to < 0 || to >= n)
|
|
121
|
+
return;
|
|
122
|
+
const next = items.slice();
|
|
123
|
+
const [it] = next.splice(from, 1);
|
|
124
|
+
next.splice(to, 0, it);
|
|
125
|
+
const key = itemKey(it, from);
|
|
126
|
+
refocus.current = { el: document.activeElement, within: () => rows.current.get(key), dir };
|
|
127
|
+
setSaid(`${itemLabel(it, from)} moved to position ${to + 1} of ${n}.`);
|
|
128
|
+
onReorder(next, { from, to });
|
|
129
|
+
};
|
|
130
|
+
// The marker steps to the next row that can hold it.
|
|
131
|
+
const markerStep = (dir) => {
|
|
132
|
+
if (marker?.after == null)
|
|
133
|
+
return null;
|
|
134
|
+
for (let i = marker.after + dir; i >= 0 && i < n; i += dir)
|
|
135
|
+
if (holds(i))
|
|
136
|
+
return i;
|
|
137
|
+
return null;
|
|
138
|
+
};
|
|
139
|
+
const placeMarker = (after, dir) => {
|
|
140
|
+
if (!marker || disabled)
|
|
141
|
+
return;
|
|
142
|
+
if (dir)
|
|
143
|
+
refocus.current = { el: null, within: () => markerEl.current, dir };
|
|
144
|
+
setSaid(after === null ? `${marker.name} removed.` : `${marker.name} moved under ${itemLabel(items[after], after)}.`);
|
|
145
|
+
marker.onMove(after);
|
|
146
|
+
};
|
|
147
|
+
const onRowKey = (i) => (e) => {
|
|
148
|
+
if (!e.altKey || (e.key !== "ArrowUp" && e.key !== "ArrowDown"))
|
|
149
|
+
return;
|
|
150
|
+
e.preventDefault();
|
|
151
|
+
move(i, e.key === "ArrowUp" ? -1 : 1);
|
|
152
|
+
};
|
|
153
|
+
const markerRow = () => {
|
|
154
|
+
if (!marker || marker.after === null)
|
|
155
|
+
return null;
|
|
156
|
+
const up = markerStep(-1);
|
|
157
|
+
const down = markerStep(1);
|
|
158
|
+
return (_jsxs(MarkerEl, { ref: markerEl, "$tone": marker.tone ?? "brand", role: "separator", "aria-label": marker.name, children: [_jsxs(Moves, { "$quiet": false, children: [_jsx(IconButton, { "data-move": "up", "aria-label": `Move ${marker.name} up`, disabled: disabled || up === null, onClick: () => placeMarker(up, -1), children: _jsx(Icon, { name: "chevron-up" }) }), _jsx(IconButton, { "data-move": "down", "aria-label": `Move ${marker.name} down`, disabled: disabled || down === null, onClick: () => placeMarker(down, 1), children: _jsx(Icon, { name: "chevron-down" }) })] }), _jsx(Body, { children: marker.label }), marker.clearable ? (_jsx(IconButton, { className: "marker-clear", "$size": 24, "aria-label": `Remove ${marker.name}`, disabled: disabled, onClick: () => placeMarker(null), children: _jsx(Icon, { name: "close" }) })) : null] }));
|
|
159
|
+
};
|
|
160
|
+
return (_jsxs(Wrap, { role: "list", "aria-label": ariaLabel, children: [items.map((item, i) => {
|
|
161
|
+
const key = itemKey(item, i);
|
|
162
|
+
const label = itemLabel(item, i);
|
|
163
|
+
const offer = marker?.placeLabel !== undefined && marker.after !== i && holds(i);
|
|
164
|
+
const offerSlot = marker?.placeLabel !== undefined;
|
|
165
|
+
return (_jsxs(Item, { role: "listitem", children: [_jsxs(RowEl, { ref: (el) => { if (el)
|
|
166
|
+
rows.current.set(key, el);
|
|
167
|
+
else
|
|
168
|
+
rows.current.delete(key); }, "$dim": dim?.(item, i), onKeyDown: onRowKey(i), children: [_jsxs(Moves, { "$quiet": quiet, className: quiet ? "reorder-reveal" : undefined, children: [_jsx(IconButton, { "data-move": "up", "aria-label": `Move ${label} up`, disabled: disabled || i === 0, onClick: () => move(i, -1), children: _jsx(Icon, { name: "chevron-up" }) }), _jsx(IconButton, { "data-move": "down", "aria-label": `Move ${label} down`, disabled: disabled || i === n - 1, onClick: () => move(i, 1), children: _jsx(Icon, { name: "chevron-down" }) })] }), _jsx(Body, { children: render(item, i) }), field ? _jsx(Slot, { children: field(item, i) }) : null, offerSlot ? (_jsx(Place, { type: "button", className: "reorder-reveal", "$held": !offer, "aria-hidden": offer ? undefined : true, tabIndex: offer ? undefined : -1, disabled: disabled || !offer, onClick: () => placeMarker(i), children: marker?.placeLabel })) : null, actions ? _jsx(Slot, { children: actions(item, i) }) : null] }), marker?.after === i ? markerRow() : null] }, key));
|
|
169
|
+
}), _jsx(Announce, { role: "status", "aria-live": "polite", children: said })] }));
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=Reorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reorder.js","sourceRoot":"","sources":["../../src/kit/Reorder.tsx"],"names":[],"mappings":"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"}
|
package/dist/kit/Stat.d.ts
CHANGED
|
@@ -13,23 +13,56 @@ export declare function StatValue({ label, value, sub, tone }: {
|
|
|
13
13
|
tone?: "ok" | "warn" | "crit" | "brand" | undefined;
|
|
14
14
|
}): import("react").JSX.Element;
|
|
15
15
|
/** StatTile: label over a big number, with an optional subline. */
|
|
16
|
-
export declare function StatTile({ label, value, sub, tone, icon, to }: {
|
|
16
|
+
export declare function StatTile({ label, value, sub, subTone, emphasis, tone, icon, to }: {
|
|
17
17
|
label: ReactNode;
|
|
18
18
|
value: ReactNode;
|
|
19
19
|
sub?: ReactNode | undefined;
|
|
20
|
+
/** tints the subline — the footnote that is the bad news ("3 need attention") */
|
|
21
|
+
subTone?: "ok" | "warn" | "crit" | undefined;
|
|
22
|
+
/** washes the whole tile (border and ground) in the accent, or in `tone`'s
|
|
23
|
+
* colour when it has one — the tile that needs looking at */
|
|
24
|
+
emphasis?: boolean | undefined;
|
|
20
25
|
tone?: "ok" | "warn" | "crit" | "brand" | undefined;
|
|
21
26
|
/** a brand-tinted glyph beside the label */
|
|
22
27
|
icon?: IconName | undefined;
|
|
23
28
|
/** the tile is also the way in: a router link to the section it counts */
|
|
24
29
|
to?: string | undefined;
|
|
25
30
|
}): import("react").JSX.Element;
|
|
26
|
-
|
|
27
|
-
export
|
|
31
|
+
type MeterTone = "ok" | "warn" | "crit" | "brand" | "info" | "mut";
|
|
32
|
+
export interface MeterSegment {
|
|
28
33
|
value: number;
|
|
34
|
+
tone: MeterTone;
|
|
35
|
+
/** accessible name of the segment (also its tooltip) */
|
|
36
|
+
label?: string | undefined;
|
|
37
|
+
/** part of the previous top-level segment: drawn as the leading part of that span, over it, rather than after it */
|
|
38
|
+
nested?: boolean | undefined;
|
|
39
|
+
}
|
|
40
|
+
export interface MeterProps {
|
|
41
|
+
value?: number | undefined;
|
|
29
42
|
max: number;
|
|
30
|
-
tone?:
|
|
43
|
+
tone?: MeterTone | undefined;
|
|
31
44
|
label?: string | undefined;
|
|
32
45
|
/** fixed width in px (inside a table cell); fills the container otherwise */
|
|
33
46
|
width?: number | undefined;
|
|
34
|
-
|
|
47
|
+
segments?: MeterSegment[] | undefined;
|
|
48
|
+
tall?: boolean | undefined;
|
|
49
|
+
indeterminate?: boolean | undefined;
|
|
50
|
+
/** a caption above the bar ("/data"); `label` stays the accessible name */
|
|
51
|
+
head?: ReactNode | undefined;
|
|
52
|
+
/** a caption below the bar ("312 GB of 500 GB used") */
|
|
53
|
+
foot?: ReactNode | undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Meter: value out of max as a bar; tone defaults from the ratio.
|
|
57
|
+
*
|
|
58
|
+
* `segments` replaces `value` with several spans that read left to right, each
|
|
59
|
+
* starting where the last top-level one ended. A `nested` segment is part of the
|
|
60
|
+
* span before it and is drawn as that span's leading part, over it — the way a
|
|
61
|
+
* "held" figure sits inside "committed" (stacking both from the left would paint
|
|
62
|
+
* the larger last and hide the smaller). `tall` is the detail-page height,
|
|
63
|
+
* `indeterminate` a sweeping bar for work with no figure yet. `head` and `foot`
|
|
64
|
+
* are captions above and below the bar; `label` stays its accessible name.
|
|
65
|
+
*/
|
|
66
|
+
export declare function Meter({ head, foot, ...props }: MeterProps): import("react").JSX.Element;
|
|
67
|
+
export {};
|
|
35
68
|
//# sourceMappingURL=Stat.d.ts.map
|
package/dist/kit/Stat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stat.d.ts","sourceRoot":"","sources":["../../src/kit/Stat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIjD,eAAO,MAAM,QAAQ;;;WAAuB,MAAM,GAAG,SAAS;YAI7D,CAAC;
|
|
1
|
+
{"version":3,"file":"Stat.d.ts","sourceRoot":"","sources":["../../src/kit/Stat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIjD,eAAO,MAAM,QAAQ;;;WAAuB,MAAM,GAAG,SAAS;YAI7D,CAAC;AAyCF,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACrD,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACrD,+BAQA;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;IACjF,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,iFAAiF;IACjF,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C;kEAC8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,4CAA4C;IAC5C,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB,+BAgBA;AAsBD,KAAK,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AA2CnE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,oHAAoH;IACpH,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAyBD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,2EAA2E;IAC3E,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,wDAAwD;IACxD,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BASzD"}
|
package/dist/kit/Stat.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import styled, { css } from "styled-components";
|
|
2
|
+
import styled, { css, keyframes } from "styled-components";
|
|
3
3
|
import { Link } from "react-router-dom";
|
|
4
4
|
import { v } from "../theme/tokens.js";
|
|
5
5
|
import { Panel } from "./Panel.js";
|
|
@@ -20,11 +20,17 @@ const tileCss = css `
|
|
|
20
20
|
border-radius: ${v.rPanel};
|
|
21
21
|
background: ${v.surface};
|
|
22
22
|
`;
|
|
23
|
+
const washCss = (w) => w &&
|
|
24
|
+
css `
|
|
25
|
+
border-color: ${w === "ok" ? v.success : w === "warn" ? v.warning : w === "crit" ? v.danger : v.brand55};
|
|
26
|
+
background: ${w === "ok" ? v.successBg : w === "warn" ? v.warningBg : w === "crit" ? v.dangerBg : v.brand08};
|
|
27
|
+
`;
|
|
23
28
|
const Tile = styled(Panel) `
|
|
24
29
|
padding: 12px 14px;
|
|
25
30
|
display: flex;
|
|
26
31
|
flex-direction: column;
|
|
27
32
|
gap: 6px;
|
|
33
|
+
${(p) => washCss(p.$wash)}
|
|
28
34
|
`;
|
|
29
35
|
const Value = styled.span `
|
|
30
36
|
font-size: 22px;
|
|
@@ -33,15 +39,19 @@ const Value = styled.span `
|
|
|
33
39
|
font-variant-numeric: tabular-nums;
|
|
34
40
|
color: ${(p) => (p.$tone === "ok" ? v.success : p.$tone === "warn" ? v.warning : p.$tone === "crit" ? v.danger : p.$tone === "brand" ? v.brand : v.text)};
|
|
35
41
|
`;
|
|
36
|
-
const Sub = styled.span `
|
|
42
|
+
const Sub = styled.span `
|
|
43
|
+
font-size: 11px;
|
|
44
|
+
color: ${(p) => (p.$tone === "ok" ? v.success : p.$tone === "warn" ? v.warning : p.$tone === "crit" ? v.danger : v.faint)};
|
|
45
|
+
`;
|
|
37
46
|
/** StatValue: label over a big number with no tile chrome (mini-stats inside a panel). */
|
|
38
47
|
export function StatValue({ label, value, sub, tone }) {
|
|
39
48
|
return (_jsxs("span", { style: { display: "flex", flexDirection: "column", gap: 4 }, children: [_jsx(MicroLabel, { children: label }), _jsx(Value, { "$tone": tone, children: value }), sub ? _jsx(Sub, { children: sub }) : null] }));
|
|
40
49
|
}
|
|
41
50
|
/** StatTile: label over a big number, with an optional subline. */
|
|
42
|
-
export function StatTile({ label, value, sub, tone, icon, to }) {
|
|
43
|
-
const body = (_jsxs(_Fragment, { children: [_jsxs(Head, { children: [_jsxs(MicroLabel, { children: [icon ? _jsx(Glyph, { children: _jsx(Icon, { name: icon }) }) : null, label] }), to ? _jsx(Go, { children: _jsx(Icon, { name: "arrow-right" }) }) : null] }), _jsx(Value, { "$tone": tone, children: value }), sub ? _jsx(Sub, { children: sub }) : null] }));
|
|
44
|
-
|
|
51
|
+
export function StatTile({ label, value, sub, subTone, emphasis, tone, icon, to }) {
|
|
52
|
+
const body = (_jsxs(_Fragment, { children: [_jsxs(Head, { children: [_jsxs(MicroLabel, { children: [icon ? _jsx(Glyph, { children: _jsx(Icon, { name: icon }) }) : null, label] }), to ? _jsx(Go, { children: _jsx(Icon, { name: "arrow-right" }) }) : null] }), _jsx(Value, { "$tone": tone, children: value }), sub ? _jsx(Sub, { "$tone": subTone, children: sub }) : null] }));
|
|
53
|
+
const wash = emphasis ? (tone ?? "brand") : undefined;
|
|
54
|
+
return to ? _jsx(TileLink, { to: to, "$wash": wash, children: body }) : _jsx(Tile, { "$wash": wash, children: body });
|
|
45
55
|
}
|
|
46
56
|
const Head = styled.div `
|
|
47
57
|
display: flex;
|
|
@@ -58,10 +68,13 @@ const TileLink = styled(Link) `
|
|
|
58
68
|
color: inherit;
|
|
59
69
|
transition: border-color 0.14s ease, background 0.14s ease;
|
|
60
70
|
&:hover { border-color: ${v.line2}; background: ${v.surface2}; }
|
|
71
|
+
${(p) => washCss(p.$wash)}
|
|
61
72
|
`;
|
|
73
|
+
const meterFill = (t) => t === "ok" ? v.success : t === "warn" ? v.warning : t === "crit" ? v.danger : t === "info" ? v.info : t === "mut" ? v.faint : v.grad90;
|
|
62
74
|
const Bar = styled.div `
|
|
75
|
+
position: relative;
|
|
63
76
|
${(p) => p.$w && css `width: ${p.$w}px;`}
|
|
64
|
-
height: 6px;
|
|
77
|
+
height: ${(p) => (p.$tall ? "10px" : "6px")};
|
|
65
78
|
border-radius: 999px;
|
|
66
79
|
background: ${v.field};
|
|
67
80
|
border: 1px solid ${v.fieldLine};
|
|
@@ -70,13 +83,88 @@ const Bar = styled.div `
|
|
|
70
83
|
const Fill = styled.div `
|
|
71
84
|
height: 100%;
|
|
72
85
|
width: ${(p) => p.$pct}%;
|
|
73
|
-
background: ${(p) => (p.$tone
|
|
86
|
+
background: ${(p) => meterFill(p.$tone)};
|
|
74
87
|
transition: width 0.3s ease;
|
|
75
88
|
`;
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
89
|
+
/* A segment is placed by its offset as well as its width: a nested one starts
|
|
90
|
+
where its parent does and is painted over it. */
|
|
91
|
+
const Seg = styled.i `
|
|
92
|
+
position: absolute;
|
|
93
|
+
top: 0;
|
|
94
|
+
bottom: 0;
|
|
95
|
+
left: ${(p) => p.$from}%;
|
|
96
|
+
width: ${(p) => p.$pct}%;
|
|
97
|
+
background: ${(p) => meterFill(p.$tone)};
|
|
98
|
+
transition: width 0.3s ease, left 0.3s ease;
|
|
99
|
+
`;
|
|
100
|
+
const meterSlide = keyframes `
|
|
101
|
+
from { transform: translateX(-100%); }
|
|
102
|
+
to { transform: translateX(400%); }
|
|
103
|
+
`;
|
|
104
|
+
const Sweep = styled.div `
|
|
105
|
+
height: 100%;
|
|
106
|
+
width: 25%;
|
|
107
|
+
background: ${v.grad90};
|
|
108
|
+
animation: ${meterSlide} 2.4s ease-in-out infinite;
|
|
109
|
+
@media (prefers-reduced-motion: reduce) { animation: none; }
|
|
110
|
+
`;
|
|
111
|
+
/** Where each segment starts: top-level ones follow on from the last, nested ones share their parent's start. */
|
|
112
|
+
function placeSegments(segments) {
|
|
113
|
+
const starts = [];
|
|
114
|
+
let cursor = 0;
|
|
115
|
+
let parent = 0;
|
|
116
|
+
for (const s of segments) {
|
|
117
|
+
if (s.nested) {
|
|
118
|
+
starts.push(parent);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
parent = cursor;
|
|
122
|
+
starts.push(cursor);
|
|
123
|
+
cursor += s.value;
|
|
124
|
+
}
|
|
125
|
+
return starts;
|
|
126
|
+
}
|
|
127
|
+
const MeterCaption = styled.div `
|
|
128
|
+
display: flex; justify-content: space-between; gap: 8px;
|
|
129
|
+
font-size: 11px; color: ${v.muted}; font-variant-numeric: tabular-nums;
|
|
130
|
+
`;
|
|
131
|
+
const MeterStack = styled.div `
|
|
132
|
+
display: flex; flex-direction: column; gap: 4px;
|
|
133
|
+
${(p) => p.$w && css `width: ${p.$w}px;`}
|
|
134
|
+
`;
|
|
135
|
+
/**
|
|
136
|
+
* Meter: value out of max as a bar; tone defaults from the ratio.
|
|
137
|
+
*
|
|
138
|
+
* `segments` replaces `value` with several spans that read left to right, each
|
|
139
|
+
* starting where the last top-level one ended. A `nested` segment is part of the
|
|
140
|
+
* span before it and is drawn as that span's leading part, over it — the way a
|
|
141
|
+
* "held" figure sits inside "committed" (stacking both from the left would paint
|
|
142
|
+
* the larger last and hide the smaller). `tall` is the detail-page height,
|
|
143
|
+
* `indeterminate` a sweeping bar for work with no figure yet. `head` and `foot`
|
|
144
|
+
* are captions above and below the bar; `label` stays its accessible name.
|
|
145
|
+
*/
|
|
146
|
+
export function Meter({ head, foot, ...props }) {
|
|
147
|
+
if (head == null && foot == null)
|
|
148
|
+
return _jsx(MeterBar, { ...props });
|
|
149
|
+
return (_jsxs(MeterStack, { "$w": props.width, children: [head != null ? _jsx(MeterCaption, { children: head }) : null, _jsx(MeterBar, { ...props, width: undefined }), foot != null ? _jsx(MeterCaption, { children: foot }) : null] }));
|
|
150
|
+
}
|
|
151
|
+
function MeterBar({ value, max, tone, label, width, segments, tall, indeterminate }) {
|
|
152
|
+
const pctOf = (n) => (max > 0 ? Math.max(0, Math.min(100, (n / max) * 100)) : 0);
|
|
153
|
+
if (indeterminate) {
|
|
154
|
+
return (_jsx(Bar, { "$w": width, "$tall": tall, role: "progressbar", "aria-label": label, children: _jsx(Sweep, {}) }));
|
|
155
|
+
}
|
|
156
|
+
if (segments) {
|
|
157
|
+
const total = segments.filter((s) => !s.nested).reduce((a, s) => a + s.value, 0);
|
|
158
|
+
const placed = placeSegments(segments);
|
|
159
|
+
return (_jsx(Bar, { "$w": width, "$tall": tall, role: "meter", "aria-valuenow": total, "aria-valuemin": 0, "aria-valuemax": max, "aria-label": label, children: segments.map((s, i) => {
|
|
160
|
+
const f = pctOf(placed[i]);
|
|
161
|
+
const w = Math.min(pctOf(s.value), 100 - f);
|
|
162
|
+
return _jsx(Seg, { "$from": f, "$pct": Math.max(w, 0), "$tone": s.tone, title: s.label }, i);
|
|
163
|
+
}) }));
|
|
164
|
+
}
|
|
165
|
+
const n = value ?? 0;
|
|
166
|
+
const pct = pctOf(n);
|
|
79
167
|
const t = tone ?? (pct >= 90 ? "crit" : pct >= 70 ? "warn" : "brand");
|
|
80
|
-
return (_jsx(Bar, { "$w": width, role: "meter", "aria-valuenow":
|
|
168
|
+
return (_jsx(Bar, { "$w": width, "$tall": tall, role: "meter", "aria-valuenow": n, "aria-valuemin": 0, "aria-valuemax": max, "aria-label": label, children: _jsx(Fill, { "$pct": pct, "$tone": t }) }));
|
|
81
169
|
}
|
|
82
170
|
//# sourceMappingURL=Stat.js.map
|
package/dist/kit/Stat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stat.js","sourceRoot":"","sources":["../../src/kit/Stat.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Stat.js","sourceRoot":"","sources":["../../src/kit/Stat.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/kit/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyD,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/kit/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyD,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAoDlH,KAAK,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AA8BhD,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,KAAK,EAAE,SAAS,CAAC;IACjB,oEAAoE;IACpE,QAAQ,EAAE,SAAS,CAAC;IACpB,iIAAiI;IACjI,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,iEAAiE;IACjE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;IAC/C,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAY,EAAE,KAAgB,EAAE,KAAK,EAAE,KAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,+BAoFxI"}
|
package/dist/kit/Tooltip.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useId, useLayoutEffect, useRef, useState } from "react";
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
|
+
import { usePortalTarget } from "../theme/ThemeScope.js";
|
|
4
5
|
import styled, { keyframes } from "styled-components";
|
|
5
6
|
import { v } from "../theme/tokens.js";
|
|
6
7
|
// Tooltip — the hover/focus explanation a dense ops screen cannot do without.
|
|
@@ -81,6 +82,8 @@ function place(anchor, box, prefer, align) {
|
|
|
81
82
|
*/
|
|
82
83
|
export function Tooltip({ label, children, side = "top", align = "center", width, delay = 180, disabled, style, className }) {
|
|
83
84
|
const id = useId();
|
|
85
|
+
// the nearest ThemeScope's host, or body (CON-148)
|
|
86
|
+
const portalTarget = usePortalTarget();
|
|
84
87
|
const ref = useRef(null);
|
|
85
88
|
const bubble = useRef(null);
|
|
86
89
|
const timer = useRef(undefined);
|
|
@@ -132,8 +135,8 @@ export function Tooltip({ label, children, side = "top", align = "center", width
|
|
|
132
135
|
}, [anchor, close]);
|
|
133
136
|
useLayoutEffect(() => () => window.clearTimeout(timer.current), []);
|
|
134
137
|
const shown = !disabled && anchor !== null;
|
|
135
|
-
return (_jsxs(_Fragment, { children: [_jsx(Anchor, { ref: ref, style: style, className: className, onMouseEnter: open, onMouseLeave: close, onFocus: open, onBlur: close, "aria-describedby": shown ? id : undefined, children: children }), shown &&
|
|
136
|
-
? createPortal(_jsx(Bubble, { ref: bubble, id: id, role: "tooltip", "$wide": width, style: pos ? { top: pos.top, left: pos.left } : { top: 0, left: 0, opacity: 0 }, children: label }),
|
|
138
|
+
return (_jsxs(_Fragment, { children: [_jsx(Anchor, { ref: ref, style: style, className: className, onMouseEnter: open, onMouseLeave: close, onFocus: open, onBlur: close, "aria-describedby": shown ? id : undefined, children: children }), shown && portalTarget
|
|
139
|
+
? createPortal(_jsx(Bubble, { ref: bubble, id: id, role: "tooltip", "$wide": width, style: pos ? { top: pos.top, left: pos.left } : { top: 0, left: 0, opacity: 0 }, children: label }), portalTarget)
|
|
137
140
|
: null] }));
|
|
138
141
|
}
|
|
139
142
|
//# sourceMappingURL=Tooltip.js.map
|
package/dist/kit/Tooltip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.js","sourceRoot":"","sources":["../../src/kit/Tooltip.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Tooltip.js","sourceRoot":"","sources":["../../src/kit/Tooltip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export interface ThemeScopeProps {
|
|
3
|
+
/** The scope's name: the sheet hangs off `[data-x-scope="<name>"]`. */
|
|
4
|
+
name: string;
|
|
5
|
+
/** The brand colour for this scope (the derived ramp, scoped). */
|
|
6
|
+
brand?: string | null | undefined;
|
|
7
|
+
/** Follow the OS colour scheme when nothing explicit is set. Default true. */
|
|
8
|
+
systemScheme?: boolean | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Host CSS appended after the kit's sheets, for overrides. Write it against
|
|
11
|
+
* `scopeSelector(name)`; for a variable the brand ramp also sets, double the
|
|
12
|
+
* selector (the ramp's rules are doubled) and the later rule wins.
|
|
13
|
+
*/
|
|
14
|
+
css?: string | undefined;
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Where the kit's overlays portal to: the nearest ThemeScope's host, or
|
|
19
|
+
* document.body outside one (and before the host is mounted). Null on the
|
|
20
|
+
* server, where nothing portals.
|
|
21
|
+
*/
|
|
22
|
+
export declare function usePortalTarget(): HTMLElement | null;
|
|
23
|
+
/** The scope's sheets: the kit's tokens and ramp, the ink, then the host's own. */
|
|
24
|
+
export declare function themeScopeCss(name: string, opts?: {
|
|
25
|
+
brand?: string | null | undefined;
|
|
26
|
+
systemScheme?: boolean | undefined;
|
|
27
|
+
css?: string | undefined;
|
|
28
|
+
}): string;
|
|
29
|
+
export declare function ThemeScope({ name, brand, systemScheme, css, children }: ThemeScopeProps): import("react").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=ThemeScope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeScope.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeScope.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA6BxG,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAOD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAIpD;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,CAe9J;AAQD,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,eAAe,+BA0BvF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useLayoutEffect, useState } from "react";
|
|
3
|
+
import { createGlobalStyle } from "styled-components";
|
|
4
|
+
import { brandCss } from "./brand.js";
|
|
5
|
+
import { scopeSelector } from "./scope.js";
|
|
6
|
+
import { cssVariables, v } from "./tokens.js";
|
|
7
|
+
const hasDOM = typeof window !== "undefined" && typeof document !== "undefined";
|
|
8
|
+
const useIsoLayoutEffect = hasDOM ? useLayoutEffect : useEffect;
|
|
9
|
+
const PortalCtx = createContext(null);
|
|
10
|
+
/**
|
|
11
|
+
* Where the kit's overlays portal to: the nearest ThemeScope's host, or
|
|
12
|
+
* document.body outside one (and before the host is mounted). Null on the
|
|
13
|
+
* server, where nothing portals.
|
|
14
|
+
*/
|
|
15
|
+
export function usePortalTarget() {
|
|
16
|
+
const scoped = useContext(PortalCtx);
|
|
17
|
+
if (scoped)
|
|
18
|
+
return scoped;
|
|
19
|
+
return hasDOM ? document.body : null;
|
|
20
|
+
}
|
|
21
|
+
/** The scope's sheets: the kit's tokens and ramp, the ink, then the host's own. */
|
|
22
|
+
export function themeScopeCss(name, opts) {
|
|
23
|
+
const sheet = { scope: name, systemScheme: opts?.systemScheme };
|
|
24
|
+
const s = scopeSelector(name);
|
|
25
|
+
return `
|
|
26
|
+
${cssVariables(sheet)}
|
|
27
|
+
${opts?.brand ? brandCss(opts.brand, sheet) : ""}
|
|
28
|
+
${s} {
|
|
29
|
+
color: ${v.text};
|
|
30
|
+
font-family: ${v.font};
|
|
31
|
+
-webkit-font-smoothing: antialiased;
|
|
32
|
+
}
|
|
33
|
+
${s} *, ${s} *::before, ${s} *::after { box-sizing: border-box; }
|
|
34
|
+
${s} ::selection { background: ${v.brand22}; }
|
|
35
|
+
${opts?.css ?? ""}
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
const ScopeSheet = createGlobalStyle `
|
|
39
|
+
${(p) => p.$css}
|
|
40
|
+
`;
|
|
41
|
+
const wrapperStyle = { display: "contents" };
|
|
42
|
+
export function ThemeScope({ name, brand, systemScheme, css, children }) {
|
|
43
|
+
// The portal host is made once the component is in the DOM, so a server
|
|
44
|
+
// render (and a hydrating one) never touches document. An overlay that is
|
|
45
|
+
// already open on the first client frame lands in body for that frame and
|
|
46
|
+
// moves into the host on the next.
|
|
47
|
+
const [host, setHost] = useState(null);
|
|
48
|
+
useIsoLayoutEffect(() => {
|
|
49
|
+
const el = document.createElement("div");
|
|
50
|
+
el.setAttribute("data-x-scope", name);
|
|
51
|
+
el.setAttribute("data-x-portal", "");
|
|
52
|
+
document.body.appendChild(el);
|
|
53
|
+
setHost(el);
|
|
54
|
+
return () => {
|
|
55
|
+
el.remove();
|
|
56
|
+
setHost(null);
|
|
57
|
+
};
|
|
58
|
+
}, [name]);
|
|
59
|
+
return (_jsxs(PortalCtx.Provider, { value: host, children: [_jsx(ScopeSheet, { "$css": themeScopeCss(name, { brand, systemScheme, css }) }), _jsx("div", { "data-x-scope": name, style: wrapperStyle, children: children })] }));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ThemeScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeScope.js","sourceRoot":"","sources":["../../src/theme/ThemeScope.tsx"],"names":[],"mappings":"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"}
|