@xeonr/platform-ui 0.3.21 → 0.5.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 +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/kit/Blocks.d.ts +12 -2
- package/dist/kit/Blocks.d.ts.map +1 -1
- package/dist/kit/Blocks.js +16 -1
- package/dist/kit/Blocks.js.map +1 -1
- package/dist/kit/Button.d.ts +1 -1
- package/dist/kit/Button.d.ts.map +1 -1
- package/dist/kit/Button.js.map +1 -1
- package/dist/kit/Combobox.d.ts +17 -1
- package/dist/kit/Combobox.d.ts.map +1 -1
- package/dist/kit/Combobox.js +12 -3
- package/dist/kit/Combobox.js.map +1 -1
- package/dist/kit/EntityHeader.d.ts +6 -1
- package/dist/kit/EntityHeader.d.ts.map +1 -1
- package/dist/kit/EntityHeader.js +13 -2
- package/dist/kit/EntityHeader.js.map +1 -1
- package/dist/kit/Forbidden.d.ts +27 -0
- package/dist/kit/Forbidden.d.ts.map +1 -0
- package/dist/kit/Forbidden.js +32 -0
- package/dist/kit/Forbidden.js.map +1 -0
- package/dist/kit/MultiCombobox.d.ts +19 -1
- package/dist/kit/MultiCombobox.d.ts.map +1 -1
- package/dist/kit/MultiCombobox.js +32 -9
- package/dist/kit/MultiCombobox.js.map +1 -1
- package/dist/kit/PageHeader.js +1 -1
- package/dist/kit/PageHeader.js.map +1 -1
- package/dist/kit/Popover.d.ts +3 -1
- package/dist/kit/Popover.d.ts.map +1 -1
- package/dist/kit/Popover.js +13 -2
- package/dist/kit/Popover.js.map +1 -1
- package/dist/kit/Sparkline.d.ts +57 -0
- package/dist/kit/Sparkline.d.ts.map +1 -0
- package/dist/kit/Sparkline.js +109 -0
- package/dist/kit/Sparkline.js.map +1 -0
- package/dist/kit/TabStrip.d.ts +53 -0
- package/dist/kit/TabStrip.d.ts.map +1 -0
- package/dist/kit/TabStrip.js +132 -0
- package/dist/kit/TabStrip.js.map +1 -0
- package/dist/kit/Text.d.ts +5 -0
- package/dist/kit/Text.d.ts.map +1 -1
- package/dist/kit/Text.js +12 -2
- package/dist/kit/Text.js.map +1 -1
- package/dist/kit/Tooltip.d.ts +41 -0
- package/dist/kit/Tooltip.d.ts.map +1 -0
- package/dist/kit/Tooltip.js +129 -0
- package/dist/kit/Tooltip.js.map +1 -0
- package/dist/theme/paint.d.ts +43 -0
- package/dist/theme/paint.d.ts.map +1 -0
- package/dist/theme/paint.js +109 -0
- package/dist/theme/paint.js.map +1 -0
- package/dist/theme/tokens.d.ts +10 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +43 -0
- package/dist/theme/tokens.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
3
|
import styled from "styled-components";
|
|
4
4
|
import { v } from "../theme/tokens.js";
|
|
@@ -93,7 +93,7 @@ const Spin = styled.span `
|
|
|
93
93
|
* choosing several in a row is the normal case and reopening between each is
|
|
94
94
|
* the annoying one.
|
|
95
95
|
*/
|
|
96
|
-
export function MultiCombobox({ query, onQueryChange, options, selected, onChange, placeholder, label, loading, emptyNote, autoFocus, disabled, }) {
|
|
96
|
+
export function MultiCombobox({ query, onQueryChange, options, selected, onChange, placeholder, label, loading, emptyNote, autoFocus, disabled, allowCreate, createLabel, validateNew, max, }) {
|
|
97
97
|
const [open, setOpen] = useState(false);
|
|
98
98
|
const [active, setActive] = useState(0);
|
|
99
99
|
const ref = useRef(null);
|
|
@@ -106,11 +106,32 @@ export function MultiCombobox({ query, onQueryChange, options, selected, onChang
|
|
|
106
106
|
document.addEventListener("mousedown", onDown);
|
|
107
107
|
return () => document.removeEventListener("mousedown", onDown);
|
|
108
108
|
}, [open]);
|
|
109
|
+
const full = max !== undefined && selected.length >= max;
|
|
109
110
|
const toggle = (key) => {
|
|
110
|
-
|
|
111
|
+
if (selected.includes(key)) {
|
|
112
|
+
onChange(selected.filter((k) => k !== key));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (full)
|
|
116
|
+
return;
|
|
117
|
+
onChange([...selected, key]);
|
|
111
118
|
};
|
|
119
|
+
// The create row, when the typed text is a value in its own right and is not
|
|
120
|
+
// already an option or already chosen. It sits FIRST and starts active, so
|
|
121
|
+
// typing a new value and pressing Enter adds it — the whole gesture a tag
|
|
122
|
+
// input exists for — while arrowing down still reaches the suggestions.
|
|
123
|
+
const typed = query.trim();
|
|
124
|
+
const newProblem = allowCreate && typed && validateNew ? validateNew(typed) : null;
|
|
125
|
+
const creatable = !!allowCreate && typed !== "" && !newProblem && !full &&
|
|
126
|
+
!options.some((o) => o.key === typed) && !selected.includes(typed);
|
|
127
|
+
const rows = options.length + (creatable ? 1 : 0);
|
|
112
128
|
const pickActive = () => {
|
|
113
|
-
|
|
129
|
+
if (creatable && active === 0) {
|
|
130
|
+
onChange([...selected, typed]);
|
|
131
|
+
onQueryChange("");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const opt = options[creatable ? active - 1 : active];
|
|
114
135
|
if (opt)
|
|
115
136
|
toggle(opt.key);
|
|
116
137
|
};
|
|
@@ -122,14 +143,15 @@ export function MultiCombobox({ query, onQueryChange, options, selected, onChang
|
|
|
122
143
|
if (e.key === "ArrowDown") {
|
|
123
144
|
e.preventDefault();
|
|
124
145
|
setOpen(true);
|
|
125
|
-
setActive((a) => Math.min(a + 1,
|
|
146
|
+
setActive((a) => Math.min(a + 1, rows - 1));
|
|
126
147
|
}
|
|
127
148
|
else if (e.key === "ArrowUp") {
|
|
128
149
|
e.preventDefault();
|
|
129
150
|
setActive((a) => Math.max(a - 1, 0));
|
|
130
151
|
}
|
|
131
|
-
else if (e.key === "Enter" &&
|
|
152
|
+
else if (e.key === "Enter" && rows > 0) {
|
|
132
153
|
e.preventDefault();
|
|
154
|
+
setOpen(true);
|
|
133
155
|
pickActive();
|
|
134
156
|
}
|
|
135
157
|
else if (e.key === "Escape")
|
|
@@ -140,9 +162,10 @@ export function MultiCombobox({ query, onQueryChange, options, selected, onChang
|
|
|
140
162
|
e.preventDefault();
|
|
141
163
|
onChange(selected.slice(0, -1));
|
|
142
164
|
}
|
|
143
|
-
} }), loading ? _jsx(Spin, { children: _jsx(Icon, { name: "spinner", spin: true }) }) : null, open && !disabled && (
|
|
165
|
+
} }), loading ? _jsx(Spin, { children: _jsx(Icon, { name: "spinner", spin: true }) }) : null, open && !disabled && (rows > 0 || emptyNote || newProblem) ? (_jsxs(List, { role: "listbox", "aria-multiselectable": true, children: [creatable ? (_jsxs(Option, { type: "button", role: "option", "aria-selected": false, "$on": active === 0, "$picked": false, onMouseEnter: () => setActive(0), onClick: () => pickActive(), children: [_jsx(Tick, { children: _jsx(Icon, { name: "add" }) }), createLabel ? createLabel(typed) : _jsxs(_Fragment, { children: ["Add \u201C", typed, "\u201D"] })] })) : null, newProblem ? _jsx(Note, { children: newProblem }) : null, options.map((o, i) => {
|
|
144
166
|
const picked = selected.includes(o.key);
|
|
145
|
-
|
|
146
|
-
|
|
167
|
+
const idx = creatable ? i + 1 : i;
|
|
168
|
+
return (_jsxs(Option, { type: "button", role: "option", "aria-selected": picked, "$on": idx === active, "$picked": picked, onMouseEnter: () => setActive(idx), onClick: () => toggle(o.key), children: [_jsx(Tick, { children: picked ? _jsx(Icon, { name: "check" }) : null }), o.render] }, o.key));
|
|
169
|
+
}), rows === 0 && !newProblem && emptyNote ? _jsx(Note, { children: emptyNote }) : null] })) : null] }));
|
|
147
170
|
}
|
|
148
171
|
//# sourceMappingURL=MultiCombobox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiCombobox.js","sourceRoot":"","sources":["../../src/kit/MultiCombobox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACpE,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAY,CAAC;AAGlC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA,qBAAqB,CAAC;AAE7C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;CAKvB,CAAC;AAEF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;;;;;;;WAOb,CAAC,CAAC,IAAI;gBACD,CAAC,CAAC,OAAO;sBACH,CAAC,CAAC,KAAK;CAC5B,CAAC;AAEF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAA;;;;;WAKhB,CAAC,CAAC,KAAK;;qBAEG,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,KAAK;CAClD,CAAC;AAEF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;aAKV,CAAC,CAAC,IAAI;;;gBAGH,CAAC,CAAC,OAAO;sBACH,CAAC,CAAC,KAAK;mBACV,CAAC,CAAC,KAAK;gBACV,CAAC,CAAC,IAAI;;CAErB,CAAC;AAEF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAoC;;;;;;;;;WASrD,CAAC,CAAC,IAAI;gBACD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;aAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;0BAChB,CAAC,CAAC,KAAK;CAChC,CAAC;AAEF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;;;WAGb,CAAC,CAAC,KAAK;;CAEjB,CAAC;AAEF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA;;;WAGZ,CAAC,CAAC,KAAK;CACjB,CAAC;AAEF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;;;;WAIb,CAAC,CAAC,KAAK;;CAEjB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAAI,EAC/B,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"MultiCombobox.js","sourceRoot":"","sources":["../../src/kit/MultiCombobox.tsx"],"names":[],"mappings":"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"}
|
package/dist/kit/PageHeader.js
CHANGED
|
@@ -37,7 +37,7 @@ export const PageBody = styled.div `
|
|
|
37
37
|
flex-direction: column;
|
|
38
38
|
gap: 16px;
|
|
39
39
|
`;
|
|
40
|
-
/** SubNav: underline tabs for entity detail pages. */
|
|
40
|
+
/** @deprecated use <Tabs mode="route">, which adds counts and an actions slot. SubNav: underline tabs for entity detail pages. */
|
|
41
41
|
const SubNavWrap = styled.nav `
|
|
42
42
|
display: flex;
|
|
43
43
|
gap: 2px;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader.js","sourceRoot":"","sources":["../../src/kit/PageHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAA;;;;;;CAMpC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAiC;;;;;IAK/D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;CACrE,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;CAKpC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;;WAEvB,CAAC,CAAC,KAAK;;;CAGjB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;;;;CAIjC,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"PageHeader.js","sourceRoot":"","sources":["../../src/kit/PageHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAA;;;;;;CAMpC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAiC;;;;;IAK/D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;CACrE,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;CAKpC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;;WAEvB,CAAC,CAAC,KAAK;;;CAGjB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;;;;CAIjC,CAAC;AAEF,kIAAkI;AAClI,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA;;;;6BAIA,CAAC,CAAC,IAAI;;CAElC,CAAC;AAEF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;;;;WAIvB,CAAC,CAAC,KAAK;;;;;qBAKG,CAAC,CAAC,IAAI;;aAEd,CAAC,CAAC,IAAI;2BACQ,CAAC,CAAC,KAAK;;;CAGjC,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,EAA2E;IACtG,OAAO,CACL,KAAC,UAAU,cACR,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACf,KAAC,UAAU,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,KAAM,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAAG,CAAC,CAAC,KAAK,IAAzE,CAAC,CAAC,EAAE,CAAmF,CACzG,CAAC,GACS,CACd,CAAC;AACJ,CAAC"}
|
package/dist/kit/Popover.d.ts
CHANGED
|
@@ -23,7 +23,9 @@ export interface PopoverProps {
|
|
|
23
23
|
width?: number | undefined;
|
|
24
24
|
/** flip above the anchor when there is no room below (default true) */
|
|
25
25
|
flip?: boolean | undefined;
|
|
26
|
+
/** become a full-width bottom sheet under 700px */
|
|
27
|
+
sheet?: boolean | undefined;
|
|
26
28
|
children: ReactNode;
|
|
27
29
|
}
|
|
28
|
-
export declare function Popover({ anchor, onClose, label, width, flip, children }: PopoverProps): import("react").ReactPortal;
|
|
30
|
+
export declare function Popover({ anchor, onClose, label, width, flip, sheet, children }: PopoverProps): import("react").ReactPortal;
|
|
29
31
|
//# sourceMappingURL=Popover.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAwCrF,eAAO,MAAM,WAAW;;WAgBvB,CAAC;AAEF,eAAO,MAAM,WAAW;;;aAAyB,OAAO,GAAG,SAAS;YAMnE,CAAC;AAEF,eAAO,MAAM,WAAW;;WAKvB,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,YAAY;;WAIxB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAW,EAAE,IAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAyC1G"}
|
package/dist/kit/Popover.js
CHANGED
|
@@ -23,6 +23,17 @@ const Sheet = styled.div `
|
|
|
23
23
|
background: ${v.surface};
|
|
24
24
|
box-shadow: ${v.elev};
|
|
25
25
|
overflow: hidden;
|
|
26
|
+
/* sheet: a full-width bottom sheet on a phone, where an anchored popover
|
|
27
|
+
inside a drawer has nowhere sensible to hang */
|
|
28
|
+
${(p) => p.$sheet &&
|
|
29
|
+
`
|
|
30
|
+
@media (max-width: 700px) {
|
|
31
|
+
top: auto !important; left: 0 !important; right: 0; bottom: 0;
|
|
32
|
+
width: 100%;
|
|
33
|
+
max-height: 70vh;
|
|
34
|
+
border-radius: ${v.rCard} ${v.rCard} 0 0;
|
|
35
|
+
}
|
|
36
|
+
`}
|
|
26
37
|
`;
|
|
27
38
|
export const PopoverHead = styled.div `
|
|
28
39
|
display: flex;
|
|
@@ -60,7 +71,7 @@ export const PopoverGroup = styled.div `
|
|
|
60
71
|
border-bottom: 1px solid ${v.line};
|
|
61
72
|
&:last-child { border-bottom: none; }
|
|
62
73
|
`;
|
|
63
|
-
export function Popover({ anchor, onClose, label, width = 268, flip = true, children }) {
|
|
74
|
+
export function Popover({ anchor, onClose, label, width = 268, flip = true, sheet, children }) {
|
|
64
75
|
const ref = useRef(null);
|
|
65
76
|
const [pos, setPos] = useState({ top: anchor.bottom + 4, left: anchor.left });
|
|
66
77
|
// Kept on screen: anchored near the right edge it would otherwise hang off
|
|
@@ -95,6 +106,6 @@ export function Popover({ anchor, onClose, label, width = 268, flip = true, chil
|
|
|
95
106
|
window.clearTimeout(id);
|
|
96
107
|
};
|
|
97
108
|
}, [onClose]);
|
|
98
|
-
return createPortal(_jsx(Sheet, { ref: ref, "$width": width, style: { top: pos.top, left: pos.left }, role: "dialog", "aria-label": label, children: children }), document.body);
|
|
109
|
+
return createPortal(_jsx(Sheet, { ref: ref, "$width": width, "$sheet": sheet, style: { top: pos.top, left: pos.left }, role: "dialog", "aria-label": label, children: children }), document.body);
|
|
99
110
|
}
|
|
100
111
|
//# sourceMappingURL=Popover.js.map
|
package/dist/kit/Popover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,0EAA0E;AAC1E,yEAAyE;AACzE,2EAA2E;AAC3E,yCAAyC;AACzC,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,8BAA8B;AAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface SparklineProps {
|
|
2
|
+
/** `[x, y]` pairs — x is usually epoch millis; order does not matter */
|
|
3
|
+
points: [number, number][];
|
|
4
|
+
/** stroke colour; a token (`v.cat1`, `v.success`), never a literal */
|
|
5
|
+
colour?: string | undefined;
|
|
6
|
+
width?: number | undefined;
|
|
7
|
+
height?: number | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Pin the bottom of the scale to zero. Right for a rate (a flat line near
|
|
10
|
+
* zero should look flat and near zero); wrong for a latency, where the
|
|
11
|
+
* interesting variation is a few percent above a large floor and a
|
|
12
|
+
* zero-based scale flattens it into nothing.
|
|
13
|
+
*/
|
|
14
|
+
zeroBased?: boolean | undefined;
|
|
15
|
+
/** fill the area under the line at low opacity (default true) */
|
|
16
|
+
area?: boolean | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* An instant to mark with a dashed rule — "what was happening when this span
|
|
19
|
+
* ran". Ignored when it falls outside the series.
|
|
20
|
+
*/
|
|
21
|
+
markAt?: number | undefined;
|
|
22
|
+
/** shown in place of the chart when there is nothing to draw (default "—") */
|
|
23
|
+
empty?: string | undefined;
|
|
24
|
+
/** accessible description; omitted leaves the chart `aria-hidden` */
|
|
25
|
+
label?: string | undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Sparkline: the shape of one series, drawn to fit a cell.
|
|
29
|
+
*
|
|
30
|
+
* The y scale is per-sparkline rather than shared down the column: each row
|
|
31
|
+
* shows its own shape instead of being flattened by the busiest row on the
|
|
32
|
+
* screen. These answer "is it trending", not "how does it compare" — a column
|
|
33
|
+
* that needs the second question wants a `Meter` or a number.
|
|
34
|
+
*/
|
|
35
|
+
export declare function Sparkline({ points, colour, width, height, zeroBased, area, markAt, empty, label, }: SparklineProps): import("react").JSX.Element;
|
|
36
|
+
/**
|
|
37
|
+
* SparkRow: a named sparkline with its latest value.
|
|
38
|
+
*
|
|
39
|
+
* Two shapes, because two things want this and they are not the same box:
|
|
40
|
+
*
|
|
41
|
+
* - `inline` (the default) is a line in a list — "name ·····/··· 128 MB" —
|
|
42
|
+
* where the names are a column the eye runs down.
|
|
43
|
+
* - `stacked` is a tile: the name and the value share the first line and the
|
|
44
|
+
* chart gets the whole width under them. In a card narrow enough to be one
|
|
45
|
+
* of twenty on a grid, an inline row spends every pixel on the chart and
|
|
46
|
+
* ellipsises the metric name down to nothing — which loses the only thing
|
|
47
|
+
* that says what you are looking at.
|
|
48
|
+
*
|
|
49
|
+
* The caller formats the value, because only it knows whether 134217728 is
|
|
50
|
+
* "128 MB", "134M" or "2m 14s".
|
|
51
|
+
*/
|
|
52
|
+
export declare function SparkRow({ name, value, layout, ...spark }: SparklineProps & {
|
|
53
|
+
name: string;
|
|
54
|
+
value?: string | undefined;
|
|
55
|
+
layout?: "inline" | "stacked" | undefined;
|
|
56
|
+
}): import("react").JSX.Element;
|
|
57
|
+
//# sourceMappingURL=Sparkline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sparkline.d.ts","sourceRoot":"","sources":["../../src/kit/Sparkline.tsx"],"names":[],"mappings":"AAiCA,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC3B,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,MAAM,EAAE,MAAgB,EAAE,KAAU,EAAE,MAAW,EAAE,SAAgB,EAAE,IAAW,EAAE,MAAM,EAAE,KAAW,EAAE,KAAK,GAC7G,EAAE,cAAc,+BAiDhB;AAyBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAiB,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,GAAG;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C,+BAmBA"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import styled from "styled-components";
|
|
4
|
+
import { v } from "../theme/tokens.js";
|
|
5
|
+
// Sparkline — shape without a value, for a table cell.
|
|
6
|
+
//
|
|
7
|
+
// `LineChart` answers "what was the number at 14:02"; it has axes, a crosshair
|
|
8
|
+
// and a legend, and it costs a fifth of the screen. A sparkline answers "is
|
|
9
|
+
// this one trending", which is the question a list of thirty rows asks three
|
|
10
|
+
// times per row — and at ninety charts per screen the answer has to be an SVG
|
|
11
|
+
// path rather than a canvas. Both exist because they are different questions.
|
|
12
|
+
//
|
|
13
|
+
// Deliberately no axes, no labels and no tooltip: a cell this size cannot
|
|
14
|
+
// carry them, and the row it sits in already says what the series is. The
|
|
15
|
+
// caller puts the latest value in its own column, where it lines up with every
|
|
16
|
+
// other row's.
|
|
17
|
+
const Wrap = styled.span `
|
|
18
|
+
display: inline-flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
justify-content: flex-start;
|
|
21
|
+
width: ${(p) => p.$w}px;
|
|
22
|
+
height: ${(p) => p.$h}px;
|
|
23
|
+
flex: none;
|
|
24
|
+
svg { display: block; }
|
|
25
|
+
`;
|
|
26
|
+
const Flat = styled.span `
|
|
27
|
+
color: ${v.faint};
|
|
28
|
+
font-size: 10px;
|
|
29
|
+
font-family: ${v.mono};
|
|
30
|
+
`;
|
|
31
|
+
/**
|
|
32
|
+
* Sparkline: the shape of one series, drawn to fit a cell.
|
|
33
|
+
*
|
|
34
|
+
* The y scale is per-sparkline rather than shared down the column: each row
|
|
35
|
+
* shows its own shape instead of being flattened by the busiest row on the
|
|
36
|
+
* screen. These answer "is it trending", not "how does it compare" — a column
|
|
37
|
+
* that needs the second question wants a `Meter` or a number.
|
|
38
|
+
*/
|
|
39
|
+
export function Sparkline({ points, colour = v.brand, width = 90, height = 22, zeroBased = true, area = true, markAt, empty = "—", label, }) {
|
|
40
|
+
const geometry = useMemo(() => {
|
|
41
|
+
const finite = points.filter((p) => Number.isFinite(p[0]) && Number.isFinite(p[1])).sort((a, b) => a[0] - b[0]);
|
|
42
|
+
if (finite.length < 2)
|
|
43
|
+
return null;
|
|
44
|
+
const xs = finite.map((p) => p[0]);
|
|
45
|
+
const ys = finite.map((p) => p[1]);
|
|
46
|
+
const minX = Math.min(...xs);
|
|
47
|
+
const maxX = Math.max(...xs);
|
|
48
|
+
const minY = zeroBased ? Math.min(0, ...ys) : Math.min(...ys);
|
|
49
|
+
const maxY = Math.max(...ys, minY);
|
|
50
|
+
const spanX = Math.max(1, maxX - minX);
|
|
51
|
+
// A flat series renders as a flat line halfway up rather than dividing by
|
|
52
|
+
// zero; a series at a constant 400ms is a real answer, not missing data.
|
|
53
|
+
const spanY = maxY - minY || 1;
|
|
54
|
+
const px = (x) => ((x - minX) / spanX) * width;
|
|
55
|
+
const py = (y) => height - 1 - ((y - minY) / spanY) * (height - 2);
|
|
56
|
+
const line = finite.map((p, i) => `${i === 0 ? "M" : "L"}${px(p[0]).toFixed(1)},${py(p[1]).toFixed(1)}`).join(" ");
|
|
57
|
+
const under = `${line} L${px(maxX).toFixed(1)},${height} L${px(minX).toFixed(1)},${height} Z`;
|
|
58
|
+
const mark = markAt !== undefined && markAt >= minX && markAt <= maxX ? px(markAt) : null;
|
|
59
|
+
return { line, under, mark };
|
|
60
|
+
}, [points, width, height, zeroBased, markAt]);
|
|
61
|
+
if (!geometry) {
|
|
62
|
+
return (_jsx(Wrap, { "$w": width, "$h": height, children: _jsx(Flat, { children: empty }) }));
|
|
63
|
+
}
|
|
64
|
+
return (_jsx(Wrap, { "$w": width, "$h": height, children: _jsxs("svg", { width: width, height: height, viewBox: `0 0 ${width} ${height}`, ...(label ? { role: "img", "aria-label": label } : { "aria-hidden": true }), children: [area ? _jsx("path", { d: geometry.under, fill: colour, opacity: 0.14 }) : null, _jsx("path", { d: geometry.line, fill: "none", stroke: colour, strokeWidth: 1.2 }), geometry.mark !== null ? (_jsx("line", { x1: geometry.mark, x2: geometry.mark, y1: 0, y2: height, stroke: v.warning, strokeWidth: 1, strokeDasharray: "2 2" })) : null] }) }));
|
|
65
|
+
}
|
|
66
|
+
const RowWrap = styled.span `
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
gap: 8px;
|
|
70
|
+
min-width: 0;
|
|
71
|
+
font-size: 10px;
|
|
72
|
+
font-family: ${v.mono};
|
|
73
|
+
> .name { flex: 1 1 auto; min-width: 0; color: ${v.faint}; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
74
|
+
> .value { flex: none; min-width: 56px; text-align: right; color: ${v.text}; font-variant-numeric: tabular-nums; }
|
|
75
|
+
`;
|
|
76
|
+
const StackWrap = styled.span `
|
|
77
|
+
display: flex;
|
|
78
|
+
flex-direction: column;
|
|
79
|
+
gap: 2px;
|
|
80
|
+
min-width: 0;
|
|
81
|
+
font-size: 10px;
|
|
82
|
+
font-family: ${v.mono};
|
|
83
|
+
> .head { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
|
|
84
|
+
> .head > .name { flex: 1 1 auto; min-width: 0; color: ${v.faint}; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
85
|
+
> .head > .value { flex: none; color: ${v.text}; font-weight: 600; font-variant-numeric: tabular-nums; }
|
|
86
|
+
`;
|
|
87
|
+
/**
|
|
88
|
+
* SparkRow: a named sparkline with its latest value.
|
|
89
|
+
*
|
|
90
|
+
* Two shapes, because two things want this and they are not the same box:
|
|
91
|
+
*
|
|
92
|
+
* - `inline` (the default) is a line in a list — "name ·····/··· 128 MB" —
|
|
93
|
+
* where the names are a column the eye runs down.
|
|
94
|
+
* - `stacked` is a tile: the name and the value share the first line and the
|
|
95
|
+
* chart gets the whole width under them. In a card narrow enough to be one
|
|
96
|
+
* of twenty on a grid, an inline row spends every pixel on the chart and
|
|
97
|
+
* ellipsises the metric name down to nothing — which loses the only thing
|
|
98
|
+
* that says what you are looking at.
|
|
99
|
+
*
|
|
100
|
+
* The caller formats the value, because only it knows whether 134217728 is
|
|
101
|
+
* "128 MB", "134M" or "2m 14s".
|
|
102
|
+
*/
|
|
103
|
+
export function SparkRow({ name, value, layout = "inline", ...spark }) {
|
|
104
|
+
if (layout === "stacked") {
|
|
105
|
+
return (_jsxs(StackWrap, { children: [_jsxs("span", { className: "head", children: [_jsx("span", { className: "name", title: name, children: name }), value !== undefined ? _jsx("span", { className: "value", children: value }) : null] }), _jsx(Sparkline, { ...spark })] }));
|
|
106
|
+
}
|
|
107
|
+
return (_jsxs(RowWrap, { children: [_jsx("span", { className: "name", title: name, children: name }), _jsx(Sparkline, { ...spark }), value !== undefined ? _jsx("span", { className: "value", children: value }) : null] }));
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=Sparkline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sparkline.js","sourceRoot":"","sources":["../../src/kit/Sparkline.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
/** Show `node` in the actions slot of the route strip above this screen, while mounted. */
|
|
3
|
+
export declare function useTabActions(node: ReactNode): void;
|
|
4
|
+
export type RouteTabsProps = {
|
|
5
|
+
mode: "route";
|
|
6
|
+
tabs: {
|
|
7
|
+
to: string;
|
|
8
|
+
label: ReactNode;
|
|
9
|
+
end?: boolean | undefined;
|
|
10
|
+
count?: number | string | undefined;
|
|
11
|
+
hidden?: boolean | undefined;
|
|
12
|
+
}[];
|
|
13
|
+
/** the strip's own actions; a screen's useTabActions wins when set */
|
|
14
|
+
actions?: ReactNode | undefined;
|
|
15
|
+
label?: string | undefined;
|
|
16
|
+
};
|
|
17
|
+
export type QueryTabsProps<T extends string = string> = {
|
|
18
|
+
mode: "query";
|
|
19
|
+
/** the query key, default "tab" */
|
|
20
|
+
param?: string | undefined;
|
|
21
|
+
/** the tab when the key is absent (absent from the URL when chosen) */
|
|
22
|
+
default: T;
|
|
23
|
+
tabs: {
|
|
24
|
+
id: T;
|
|
25
|
+
label: ReactNode;
|
|
26
|
+
count?: number | string | undefined;
|
|
27
|
+
}[];
|
|
28
|
+
actions?: ReactNode | undefined;
|
|
29
|
+
label?: string | undefined;
|
|
30
|
+
/** told after the URL changes */
|
|
31
|
+
onChange?: ((id: T) => void) | undefined;
|
|
32
|
+
};
|
|
33
|
+
export type LocalTabsProps<T extends string = string> = {
|
|
34
|
+
mode: "local";
|
|
35
|
+
tabs: {
|
|
36
|
+
id: T;
|
|
37
|
+
label: ReactNode;
|
|
38
|
+
meta?: ReactNode | undefined;
|
|
39
|
+
title?: string | undefined;
|
|
40
|
+
}[];
|
|
41
|
+
/** the active tab, or several (one per split pane) */
|
|
42
|
+
value: T | T[];
|
|
43
|
+
onChange: (id: T, ev: React.MouseEvent<HTMLButtonElement>) => void;
|
|
44
|
+
mono?: boolean | undefined;
|
|
45
|
+
label?: string | undefined;
|
|
46
|
+
after?: ReactNode | undefined;
|
|
47
|
+
};
|
|
48
|
+
export declare function RouteTabs({ tabs, actions, label }: Omit<RouteTabsProps, "mode">): import("react").JSX.Element;
|
|
49
|
+
/** The current value of a query tab, for the screen that renders the panel. */
|
|
50
|
+
export declare function useQueryTab<T extends string>(param: string, ids: readonly T[], fallback: T): [T, (id: T) => void];
|
|
51
|
+
export declare function QueryTabs<T extends string>({ param, default: fallback, tabs, actions, label, onChange }: Omit<QueryTabsProps<T>, "mode">): import("react").JSX.Element;
|
|
52
|
+
export declare function LocalTabs<T extends string>({ tabs, value, onChange, mono, label, after }: Omit<LocalTabsProps<T>, "mode">): import("react").JSX.Element;
|
|
53
|
+
//# sourceMappingURL=TabStrip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabStrip.d.ts","sourceRoot":"","sources":["../../src/kit/TabStrip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useSyncExternalStore } from "react";
|
|
3
|
+
import styled, { css } from "styled-components";
|
|
4
|
+
import { NavLink, useSearchParams } from "react-router-dom";
|
|
5
|
+
import { v } from "../theme/tokens.js";
|
|
6
|
+
// One tab primitive, three meanings, three looks (NAV-DESIGN.md §5):
|
|
7
|
+
//
|
|
8
|
+
// mode="route" facets of one entity that change the URL path, one strip
|
|
9
|
+
// directly under its EntityHeader — the brand underline.
|
|
10
|
+
// mode="query" shareable views of one screen (?tab=, ?view=) — the same
|
|
11
|
+
// underline on a muted track, so it reads as "views", not
|
|
12
|
+
// "places".
|
|
13
|
+
// mode="local" panes inside a panel (terminal sessions, filesystems) —
|
|
14
|
+
// boxed, so a pane strip cannot be mistaken for navigation.
|
|
15
|
+
//
|
|
16
|
+
// Segmented stays a form control; it is never navigation.
|
|
17
|
+
const Strip = styled.div `
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: 2px;
|
|
21
|
+
border-bottom: 1px solid ${v.line};
|
|
22
|
+
${(p) => p.$track && css `background: ${v.surface2}; border-radius: ${v.rCtl} ${v.rCtl} 0 0; padding: 0 4px;`}
|
|
23
|
+
margin: 14px 0 0;
|
|
24
|
+
overflow-x: auto;
|
|
25
|
+
> .actions { margin-left: auto; padding-left: 12px; display: inline-flex; align-items: center; gap: 8px; flex: none; }
|
|
26
|
+
`;
|
|
27
|
+
const tabText = css `
|
|
28
|
+
padding: 8px 13px;
|
|
29
|
+
font-size: 12.5px;
|
|
30
|
+
font-weight: 500;
|
|
31
|
+
color: ${v.faint};
|
|
32
|
+
border-bottom: 2px solid transparent;
|
|
33
|
+
margin-bottom: -1px;
|
|
34
|
+
white-space: nowrap;
|
|
35
|
+
text-decoration: none;
|
|
36
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
37
|
+
background: transparent;
|
|
38
|
+
border-top: 0; border-left: 0; border-right: 0;
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
&:hover { color: ${v.text}; }
|
|
41
|
+
.count { font-size: 10.5px; color: ${v.faint}; font-family: ${v.mono}; }
|
|
42
|
+
`;
|
|
43
|
+
const RouteTab = styled(NavLink) `
|
|
44
|
+
${tabText}
|
|
45
|
+
&.active { color: ${v.info}; border-bottom-color: ${v.brand}; font-weight: 600; }
|
|
46
|
+
`;
|
|
47
|
+
const QueryTab = styled.button `
|
|
48
|
+
${tabText}
|
|
49
|
+
${(p) => p.$on && css `color: ${v.text}; border-bottom-color: ${v.brand}; font-weight: 600;`}
|
|
50
|
+
`;
|
|
51
|
+
const Boxed = styled.div `
|
|
52
|
+
display: inline-flex; align-items: center; gap: 2px;
|
|
53
|
+
padding: 3px;
|
|
54
|
+
margin-bottom: 10px;
|
|
55
|
+
border: 1px solid ${v.fieldLine};
|
|
56
|
+
border-radius: ${v.rCtl};
|
|
57
|
+
background: ${v.field};
|
|
58
|
+
max-width: 100%;
|
|
59
|
+
overflow-x: auto;
|
|
60
|
+
> .after { margin-left: 8px; font-size: 10.5px; color: ${v.faint}; white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; padding-right: 4px; }
|
|
61
|
+
`;
|
|
62
|
+
const BoxTab = styled.button `
|
|
63
|
+
padding: 4px 10px;
|
|
64
|
+
border-radius: calc(${v.rCtl} - 2px);
|
|
65
|
+
border: 1px solid ${(p) => (p.$on ? v.line2 : "transparent")};
|
|
66
|
+
background: ${(p) => (p.$on ? v.surface : "transparent")};
|
|
67
|
+
color: ${(p) => (p.$on ? v.text : v.muted)};
|
|
68
|
+
font-size: 12px; font-weight: 500;
|
|
69
|
+
${(p) => p.$mono && css `font-family: ${v.mono};`}
|
|
70
|
+
white-space: nowrap;
|
|
71
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
72
|
+
cursor: pointer;
|
|
73
|
+
.meta { font-size: 10.5px; color: ${v.faint}; font-family: ${v.mono}; }
|
|
74
|
+
&:hover { color: ${v.text}; }
|
|
75
|
+
`;
|
|
76
|
+
// A screen publishes the primary action of the tab it renders; the route strip
|
|
77
|
+
// above it (rendered by a layout, a sibling of the screen, not its parent)
|
|
78
|
+
// shows it on the right. One strip is on screen at a time, so one slot.
|
|
79
|
+
let published = null;
|
|
80
|
+
const listeners = new Set();
|
|
81
|
+
const store = {
|
|
82
|
+
subscribe(l) {
|
|
83
|
+
listeners.add(l);
|
|
84
|
+
return () => listeners.delete(l);
|
|
85
|
+
},
|
|
86
|
+
get: () => published,
|
|
87
|
+
set(node) {
|
|
88
|
+
published = node;
|
|
89
|
+
listeners.forEach((l) => l());
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
/** Show `node` in the actions slot of the route strip above this screen, while mounted. */
|
|
93
|
+
export function useTabActions(node) {
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
store.set(node);
|
|
96
|
+
return () => store.set(null);
|
|
97
|
+
}, [node]);
|
|
98
|
+
}
|
|
99
|
+
export function RouteTabs({ tabs, actions, label = "Sections" }) {
|
|
100
|
+
const fromScreen = useSyncExternalStore(store.subscribe, store.get, store.get);
|
|
101
|
+
const right = fromScreen ?? actions;
|
|
102
|
+
return (_jsxs(Strip, { as: "nav", "aria-label": label, children: [tabs.filter((t) => !t.hidden).map((t) => (_jsxs(RouteTab, { to: t.to, ...(t.end !== undefined ? { end: t.end } : {}), children: [t.label, t.count !== undefined ? _jsx("span", { className: "count", children: t.count }) : null] }, t.to))), right ? _jsx("span", { className: "actions", children: right }) : null] }));
|
|
103
|
+
}
|
|
104
|
+
/** The current value of a query tab, for the screen that renders the panel. */
|
|
105
|
+
export function useQueryTab(param, ids, fallback) {
|
|
106
|
+
const [sp, setSp] = useSearchParams();
|
|
107
|
+
const raw = sp.get(param);
|
|
108
|
+
const value = ids.includes(raw) ? raw : fallback;
|
|
109
|
+
const set = (id) => setSp((prev) => {
|
|
110
|
+
const next = new URLSearchParams(prev);
|
|
111
|
+
if (id === fallback)
|
|
112
|
+
next.delete(param);
|
|
113
|
+
else
|
|
114
|
+
next.set(param, id);
|
|
115
|
+
return next;
|
|
116
|
+
},
|
|
117
|
+
// a view change is a step Back should undo
|
|
118
|
+
{ replace: false });
|
|
119
|
+
return [value, set];
|
|
120
|
+
}
|
|
121
|
+
export function QueryTabs({ param = "tab", default: fallback, tabs, actions, label = "Views", onChange }) {
|
|
122
|
+
const [value, set] = useQueryTab(param, tabs.map((t) => t.id), fallback);
|
|
123
|
+
return (_jsxs(Strip, { role: "tablist", "aria-label": label, "$track": true, children: [tabs.map((t) => (_jsxs(QueryTab, { type: "button", role: "tab", "aria-selected": t.id === value, "$on": t.id === value, onClick: () => {
|
|
124
|
+
set(t.id);
|
|
125
|
+
onChange?.(t.id);
|
|
126
|
+
}, children: [t.label, t.count !== undefined ? _jsx("span", { className: "count", children: t.count }) : null] }, t.id))), actions ? _jsx("span", { className: "actions", children: actions }) : null] }));
|
|
127
|
+
}
|
|
128
|
+
export function LocalTabs({ tabs, value, onChange, mono, label = "Panes", after }) {
|
|
129
|
+
const active = Array.isArray(value) ? value : [value];
|
|
130
|
+
return (_jsxs(Boxed, { role: "tablist", "aria-label": label, children: [tabs.map((t) => (_jsxs(BoxTab, { type: "button", role: "tab", title: t.title, "aria-selected": active.includes(t.id), "$on": active.includes(t.id), "$mono": mono, onClick: (ev) => onChange(t.id, ev), children: [t.label, t.meta ? _jsx("span", { className: "meta", children: t.meta }) : null] }, t.id))), after ? _jsx("span", { className: "after", children: after }) : null] }));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=TabStrip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabStrip.js","sourceRoot":"","sources":["../../src/kit/TabStrip.tsx"],"names":[],"mappings":"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"}
|
package/dist/kit/Text.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
|
+
declare const textTones: Record<"ok" | "warn" | "crit" | "info" | "mut" | "data", string>;
|
|
3
|
+
export type TextTone = keyof typeof textTones;
|
|
2
4
|
/** Mono: a technical string — id, ref, path, host. */
|
|
3
5
|
export declare const Mono: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style"> & {
|
|
4
6
|
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
@@ -7,6 +9,7 @@ export declare const Mono: import("styled-components/dist/types").IStyledCompone
|
|
|
7
9
|
$size?: number | undefined;
|
|
8
10
|
$truncate?: boolean | undefined;
|
|
9
11
|
$weight?: number | undefined;
|
|
12
|
+
$tone?: TextTone | undefined;
|
|
10
13
|
}>> & string;
|
|
11
14
|
/** Num: a tabular figure, right-aligned in tables. */
|
|
12
15
|
export declare const Num: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style"> & {
|
|
@@ -15,6 +18,7 @@ export declare const Num: import("styled-components/dist/types").IStyledComponen
|
|
|
15
18
|
$dim?: boolean | undefined;
|
|
16
19
|
$faint?: boolean | undefined;
|
|
17
20
|
$mono?: boolean | undefined;
|
|
21
|
+
$tone?: TextTone | undefined;
|
|
18
22
|
}>> & string;
|
|
19
23
|
/** Hint: secondary explanatory text under a control or a block. */
|
|
20
24
|
export declare const Hint: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "style"> & {
|
|
@@ -107,4 +111,5 @@ export declare function Ago({ at }: {
|
|
|
107
111
|
export declare function toDate(at: Date | bigint | number | string | undefined | null): Date | null;
|
|
108
112
|
/** relative renders the "3 days ago" string on its own, for a title or a cell. */
|
|
109
113
|
export declare function relative(d: Date): string;
|
|
114
|
+
export {};
|
|
110
115
|
//# sourceMappingURL=Text.d.ts.map
|