@xeonr/platform-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/kit/Badge.d.ts +19 -0
- package/dist/kit/Badge.d.ts.map +1 -0
- package/dist/kit/Badge.js +61 -0
- package/dist/kit/Badge.js.map +1 -0
- package/dist/kit/Button.d.ts +28 -0
- package/dist/kit/Button.d.ts.map +1 -0
- package/dist/kit/Button.js +73 -0
- package/dist/kit/Button.js.map +1 -0
- package/dist/kit/DataTable.d.ts +23 -0
- package/dist/kit/DataTable.d.ts.map +1 -0
- package/dist/kit/DataTable.js +59 -0
- package/dist/kit/DataTable.js.map +1 -0
- package/dist/kit/EmptyState.d.ts +10 -0
- package/dist/kit/EmptyState.d.ts.map +1 -0
- package/dist/kit/EmptyState.js +42 -0
- package/dist/kit/EmptyState.js.map +1 -0
- package/dist/kit/EntityHeader.d.ts +17 -0
- package/dist/kit/EntityHeader.d.ts.map +1 -0
- package/dist/kit/EntityHeader.js +61 -0
- package/dist/kit/EntityHeader.js.map +1 -0
- package/dist/kit/Form.d.ts +78 -0
- package/dist/kit/Form.d.ts.map +1 -0
- package/dist/kit/Form.js +210 -0
- package/dist/kit/Form.js.map +1 -0
- package/dist/kit/Icon.d.ts +102 -0
- package/dist/kit/Icon.d.ts.map +1 -0
- package/dist/kit/Icon.js +48 -0
- package/dist/kit/Icon.js.map +1 -0
- package/dist/kit/KV.d.ts +9 -0
- package/dist/kit/KV.d.ts.map +1 -0
- package/dist/kit/KV.js +23 -0
- package/dist/kit/KV.js.map +1 -0
- package/dist/kit/LogView.d.ts +21 -0
- package/dist/kit/LogView.d.ts.map +1 -0
- package/dist/kit/LogView.js +35 -0
- package/dist/kit/LogView.js.map +1 -0
- package/dist/kit/Modal.d.ts +50 -0
- package/dist/kit/Modal.d.ts.map +1 -0
- package/dist/kit/Modal.js +112 -0
- package/dist/kit/Modal.js.map +1 -0
- package/dist/kit/PageHeader.d.ts +30 -0
- package/dist/kit/PageHeader.d.ts.map +1 -0
- package/dist/kit/PageHeader.js +67 -0
- package/dist/kit/PageHeader.js.map +1 -0
- package/dist/kit/Panel.d.ts +26 -0
- package/dist/kit/Panel.d.ts.map +1 -0
- package/dist/kit/Panel.js +49 -0
- package/dist/kit/Panel.js.map +1 -0
- package/dist/kit/Secret.d.ts +9 -0
- package/dist/kit/Secret.d.ts.map +1 -0
- package/dist/kit/Secret.js +39 -0
- package/dist/kit/Secret.js.map +1 -0
- package/dist/kit/Skeleton.d.ts +12 -0
- package/dist/kit/Skeleton.d.ts.map +1 -0
- package/dist/kit/Skeleton.js +21 -0
- package/dist/kit/Skeleton.js.map +1 -0
- package/dist/kit/Toast.d.ts +17 -0
- package/dist/kit/Toast.d.ts.map +1 -0
- package/dist/kit/Toast.js +64 -0
- package/dist/kit/Toast.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +16 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +105 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/tokens.d.ts +62 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +171 -0
- package/dist/theme/tokens.js.map +1 -0
- package/package.json +49 -0
- package/scripts/check-colour-literals.mjs +221 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import styled, { keyframes } from "styled-components";
|
|
4
|
+
import { v } from "../theme/tokens.js";
|
|
5
|
+
import { Icon } from "./Icon.js";
|
|
6
|
+
import { IconButton, AppButton, ButtonRow } from "./Button.js";
|
|
7
|
+
import { MonoInput } from "./Form.js";
|
|
8
|
+
const fadeIn = keyframes `from { opacity: 0; }`;
|
|
9
|
+
const popIn = keyframes `from { opacity: 0; transform: scale(0.985) translateY(4px); }`;
|
|
10
|
+
const Backdrop = styled.div `
|
|
11
|
+
position: fixed;
|
|
12
|
+
inset: 0;
|
|
13
|
+
z-index: ${v.zModal};
|
|
14
|
+
display: grid;
|
|
15
|
+
place-items: center;
|
|
16
|
+
padding: 24px;
|
|
17
|
+
background: ${v.scrim};
|
|
18
|
+
backdrop-filter: blur(3px);
|
|
19
|
+
animation: ${fadeIn} 0.14s ease;
|
|
20
|
+
`;
|
|
21
|
+
const sizes = { sm: 420, md: 560, lg: 760 };
|
|
22
|
+
const Card = styled.div `
|
|
23
|
+
position: relative;
|
|
24
|
+
width: min(${(p) => sizes[p.$size]}px, 100%);
|
|
25
|
+
max-height: min(86vh, 900px);
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
background: ${v.surface};
|
|
29
|
+
border: 1px solid ${v.line2};
|
|
30
|
+
border-radius: ${v.rModal};
|
|
31
|
+
box-shadow: ${v.elev};
|
|
32
|
+
overflow: hidden;
|
|
33
|
+
animation: ${popIn} 0.16s cubic-bezier(0.2, 0.7, 0.3, 1);
|
|
34
|
+
&::before {
|
|
35
|
+
content: "";
|
|
36
|
+
position: absolute;
|
|
37
|
+
top: 0; left: 0; right: 0;
|
|
38
|
+
height: 2px;
|
|
39
|
+
background: ${v.grad90};
|
|
40
|
+
}
|
|
41
|
+
`;
|
|
42
|
+
const Head = styled.header `
|
|
43
|
+
display: flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
gap: 10px;
|
|
46
|
+
padding: 16px 18px 12px;
|
|
47
|
+
flex: none; /* never squashed by an overflowing modal body */
|
|
48
|
+
`;
|
|
49
|
+
const Title = styled.h3 `
|
|
50
|
+
margin: 0;
|
|
51
|
+
font-size: 14.5px;
|
|
52
|
+
font-weight: 600;
|
|
53
|
+
`;
|
|
54
|
+
const Sub = styled.p `
|
|
55
|
+
margin: 1px 0 0;
|
|
56
|
+
font-size: 11.5px;
|
|
57
|
+
color: ${v.muted};
|
|
58
|
+
`;
|
|
59
|
+
const Body = styled.div `
|
|
60
|
+
padding: 4px 18px 18px;
|
|
61
|
+
overflow-y: auto;
|
|
62
|
+
`;
|
|
63
|
+
export function EntityModal({ title, sub, size = "md", onClose, dismissable = true, children }) {
|
|
64
|
+
const ref = useRef(null);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (!dismissable)
|
|
67
|
+
return;
|
|
68
|
+
const onKey = (e) => { if (e.key === "Escape")
|
|
69
|
+
onClose(); };
|
|
70
|
+
document.addEventListener("keydown", onKey);
|
|
71
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
72
|
+
}, [onClose, dismissable]);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
const prev = document.activeElement;
|
|
75
|
+
ref.current?.focus();
|
|
76
|
+
return () => prev?.focus?.();
|
|
77
|
+
}, []);
|
|
78
|
+
return (_jsx(Backdrop, { onMouseDown: (e) => { if (dismissable && e.target === e.currentTarget)
|
|
79
|
+
onClose(); }, children: _jsxs(Card, { "$size": size, ref: ref, tabIndex: -1, role: "dialog", "aria-modal": "true", "aria-label": title, children: [_jsxs(Head, { children: [_jsxs("div", { style: { minWidth: 0 }, children: [_jsx(Title, { children: title }), sub ? _jsx(Sub, { children: sub }) : null] }), dismissable ? (_jsx(IconButton, { onClick: onClose, "aria-label": "Close", style: { marginLeft: "auto" }, children: _jsx(Icon, { name: "close" }) })) : null] }), _jsx(Body, { children: children })] }) }));
|
|
80
|
+
}
|
|
81
|
+
const ConfirmText = styled.p `
|
|
82
|
+
margin: 0 0 14px;
|
|
83
|
+
font-size: 12.5px;
|
|
84
|
+
color: ${v.muted};
|
|
85
|
+
b { color: ${v.text}; font-weight: 600; }
|
|
86
|
+
`;
|
|
87
|
+
/**
|
|
88
|
+
* ConfirmDialog: two-step confirmation for destructive actions. Pass typedValue
|
|
89
|
+
* to require the operator to type the entity name (function deletes, team
|
|
90
|
+
* deletes) before the destructive button arms.
|
|
91
|
+
*/
|
|
92
|
+
export function ConfirmDialog({ title, body, actionLabel, typedValue, danger = true, busy, extra, onConfirm, onClose }) {
|
|
93
|
+
const [typed, setTyped] = useState("");
|
|
94
|
+
const armed = !typedValue || typed === typedValue;
|
|
95
|
+
return (_jsxs(EntityModal, { title: title, size: "sm", onClose: onClose, children: [_jsx(ConfirmText, { children: body }), extra, typedValue ? (_jsxs("div", { style: { margin: "0 0 14px" }, children: [_jsxs(ConfirmText, { style: { marginBottom: 6 }, children: ["Type ", _jsx("b", { children: typedValue }), " to confirm."] }), _jsx(MonoInput, { autoFocus: true, value: typed, onChange: (e) => setTyped(e.target.value), placeholder: typedValue })] })) : null, _jsxs(ButtonRow, { style: { justifyContent: "flex-end" }, children: [_jsx(AppButton, { variant: "quiet", onClick: onClose, children: "Cancel" }), _jsx(AppButton, { variant: danger ? "danger" : "grad", disabled: !armed, loading: busy, onClick: onConfirm, children: actionLabel })] })] }));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* PromptDialog: a one-field modal for naming things (new file, rename) — the
|
|
99
|
+
* kit's replacement for window.prompt, which cannot be styled or validated.
|
|
100
|
+
*/
|
|
101
|
+
export function PromptDialog({ title, body, label, initial = "", placeholder, actionLabel = "OK", busy, validate, onSubmit, onClose }) {
|
|
102
|
+
const [value, setValue] = useState(initial);
|
|
103
|
+
const problem = validate ? validate(value) : null;
|
|
104
|
+
const submit = () => {
|
|
105
|
+
if (!value.trim() || problem)
|
|
106
|
+
return;
|
|
107
|
+
onSubmit(value.trim());
|
|
108
|
+
};
|
|
109
|
+
return (_jsxs(EntityModal, { title: title, size: "sm", onClose: onClose, children: [body ? _jsx(ConfirmText, { children: body }) : null, _jsxs("div", { style: { margin: "0 0 6px" }, children: [_jsx(ConfirmText, { style: { marginBottom: 6 }, children: label }), _jsx(MonoInput, { autoFocus: true, value: value, onChange: (e) => setValue(e.target.value), onKeyDown: (e) => { if (e.key === "Enter")
|
|
110
|
+
submit(); }, ...(placeholder !== undefined ? { placeholder } : {}) }), problem && value ? _jsx(ConfirmText, { style: { margin: "6px 0 0", color: "var(--x-danger)" }, children: problem }) : null] }), _jsxs(ButtonRow, { style: { justifyContent: "flex-end", marginTop: 12 }, children: [_jsx(AppButton, { variant: "quiet", onClick: onClose, children: "Cancel" }), _jsx(AppButton, { variant: "grad", disabled: !value.trim() || !!problem, loading: busy, onClick: submit, children: actionLabel })] })] }));
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=Modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/kit/Modal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export declare const PageHead: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "style"> & {
|
|
3
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
4
|
+
}> & string;
|
|
5
|
+
export declare const PageTitle: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>, "style"> & {
|
|
6
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
$mono?: boolean | undefined;
|
|
9
|
+
}>> & string;
|
|
10
|
+
export declare const PageActions: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
11
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
12
|
+
}> & string;
|
|
13
|
+
/**
|
|
14
|
+
* FactLine — an xmb port: the line under a page title is always a fact
|
|
15
|
+
* ("6 functions · 4 live · 1 building"), never a description.
|
|
16
|
+
*/
|
|
17
|
+
export declare const FactLine: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
18
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
19
|
+
}> & string;
|
|
20
|
+
export declare const PageBody: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
21
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
22
|
+
}> & string;
|
|
23
|
+
export declare function SubNav({ tabs }: {
|
|
24
|
+
tabs: {
|
|
25
|
+
to: string;
|
|
26
|
+
label: ReactNode;
|
|
27
|
+
end?: boolean | undefined;
|
|
28
|
+
}[];
|
|
29
|
+
}): import("react").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=PageHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeader.d.ts","sourceRoot":"","sources":["../../src/kit/PageHeader.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,eAAO,MAAM,QAAQ;;WAMpB,CAAC;AAEF,eAAO,MAAM,SAAS;;;YAAuB,OAAO,GAAG,SAAS;YAM/D,CAAC;AAEF,eAAO,MAAM,WAAW;;WAKvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ;;WAKpB,CAAC;AAEF,eAAO,MAAM,QAAQ;;WAIpB,CAAC;AA4BF,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,EAAE,CAAA;CAAE,+BAQvG"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import styled from "styled-components";
|
|
3
|
+
import { NavLink } from "react-router-dom";
|
|
4
|
+
import { v } from "../theme/tokens.js";
|
|
5
|
+
export const PageHead = styled.header `
|
|
6
|
+
display: flex;
|
|
7
|
+
align-items: center;
|
|
8
|
+
gap: 12px;
|
|
9
|
+
flex-wrap: wrap;
|
|
10
|
+
margin-bottom: 4px;
|
|
11
|
+
`;
|
|
12
|
+
export const PageTitle = styled.h2 `
|
|
13
|
+
margin: 0;
|
|
14
|
+
font-size: 19px;
|
|
15
|
+
font-weight: 600;
|
|
16
|
+
letter-spacing: -0.01em;
|
|
17
|
+
${(p) => (p.$mono ? `font-family: ${v.mono}; font-size: 17px;` : "")}
|
|
18
|
+
`;
|
|
19
|
+
export const PageActions = styled.div `
|
|
20
|
+
margin-left: auto;
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
gap: 8px;
|
|
24
|
+
`;
|
|
25
|
+
/**
|
|
26
|
+
* FactLine — an xmb port: the line under a page title is always a fact
|
|
27
|
+
* ("6 functions · 4 live · 1 building"), never a description.
|
|
28
|
+
*/
|
|
29
|
+
export const FactLine = styled.div `
|
|
30
|
+
font-size: 12px;
|
|
31
|
+
color: ${v.muted};
|
|
32
|
+
font-variant-numeric: tabular-nums;
|
|
33
|
+
margin: 2px 0 16px;
|
|
34
|
+
`;
|
|
35
|
+
export const PageBody = styled.div `
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
gap: 16px;
|
|
39
|
+
`;
|
|
40
|
+
/** SubNav: underline tabs for entity detail pages. */
|
|
41
|
+
const SubNavWrap = styled.nav `
|
|
42
|
+
display: flex;
|
|
43
|
+
gap: 2px;
|
|
44
|
+
margin: 14px 0 0;
|
|
45
|
+
border-bottom: 1px solid ${v.line};
|
|
46
|
+
overflow-x: auto;
|
|
47
|
+
`;
|
|
48
|
+
const SubNavLink = styled(NavLink) `
|
|
49
|
+
padding: 8px 13px;
|
|
50
|
+
font-size: 12.5px;
|
|
51
|
+
font-weight: 500;
|
|
52
|
+
color: ${v.faint};
|
|
53
|
+
border-bottom: 2px solid transparent;
|
|
54
|
+
text-decoration: none;
|
|
55
|
+
margin-bottom: -1px;
|
|
56
|
+
white-space: nowrap;
|
|
57
|
+
&:hover { color: ${v.text}; }
|
|
58
|
+
&.active {
|
|
59
|
+
color: ${v.info};
|
|
60
|
+
border-bottom-color: ${v.brand};
|
|
61
|
+
font-weight: 600;
|
|
62
|
+
}
|
|
63
|
+
`;
|
|
64
|
+
export function SubNav({ tabs }) {
|
|
65
|
+
return (_jsx(SubNavWrap, { children: tabs.map((t) => (_jsx(SubNavLink, { to: t.to, ...(t.end !== undefined ? { end: t.end } : {}), children: t.label }, t.to))) }));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=PageHeader.js.map
|
|
@@ -0,0 +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,sDAAsD;AACtD,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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Panel: the standard bordered surface; brand-tinted inset on the top edge. */
|
|
2
|
+
export declare const Panel: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "style"> & {
|
|
3
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
4
|
+
}> & string;
|
|
5
|
+
export declare const PanelHead: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "style"> & {
|
|
6
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
7
|
+
}> & string;
|
|
8
|
+
export declare const PanelTitle: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>, "style"> & {
|
|
9
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
10
|
+
}> & string;
|
|
11
|
+
export declare const PanelActions: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
12
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
13
|
+
}> & string;
|
|
14
|
+
export declare const PanelBody: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
15
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
16
|
+
}, {
|
|
17
|
+
$pad?: boolean | undefined;
|
|
18
|
+
}>> & string;
|
|
19
|
+
/** MicroLabel: uppercase mono kicker used for section heads and field labels. */
|
|
20
|
+
export declare const MicroLabel: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style"> & {
|
|
21
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
22
|
+
}> & string;
|
|
23
|
+
export declare const Hairline: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLHRElement>, HTMLHRElement>, "style"> & {
|
|
24
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
25
|
+
}> & string;
|
|
26
|
+
//# sourceMappingURL=Panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.d.ts","sourceRoot":"","sources":["../../src/kit/Panel.tsx"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,eAAO,MAAM,KAAK;;WAMjB,CAAC;AAEF,eAAO,MAAM,SAAS;;WAQrB,CAAC;AAEF,eAAO,MAAM,UAAU;;WAItB,CAAC;AAEF,eAAO,MAAM,YAAY;;WAKxB,CAAC;AAEF,eAAO,MAAM,SAAS;;;WAAuB,OAAO,GAAG,SAAS;YAE/D,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,UAAU;;WAQtB,CAAC;AAEF,eAAO,MAAM,QAAQ;;WAIpB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import styled from "styled-components";
|
|
2
|
+
import { v } from "../theme/tokens.js";
|
|
3
|
+
/** Panel: the standard bordered surface; brand-tinted inset on the top edge. */
|
|
4
|
+
export const Panel = styled.section `
|
|
5
|
+
background: ${v.surface};
|
|
6
|
+
border: 1px solid ${v.line};
|
|
7
|
+
border-radius: ${v.rPanel};
|
|
8
|
+
box-shadow: inset 0 1px 0 0 ${v.brand08}, ${v.elev};
|
|
9
|
+
overflow: hidden;
|
|
10
|
+
`;
|
|
11
|
+
export const PanelHead = styled.header `
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
gap: 9px;
|
|
15
|
+
padding: 11px 16px;
|
|
16
|
+
border-bottom: 1px solid ${v.line};
|
|
17
|
+
font-size: 12px;
|
|
18
|
+
font-weight: 600;
|
|
19
|
+
`;
|
|
20
|
+
export const PanelTitle = styled.h3 `
|
|
21
|
+
margin: 0;
|
|
22
|
+
font-size: 12px;
|
|
23
|
+
font-weight: 600;
|
|
24
|
+
`;
|
|
25
|
+
export const PanelActions = styled.div `
|
|
26
|
+
margin-left: auto;
|
|
27
|
+
display: flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
gap: 8px;
|
|
30
|
+
`;
|
|
31
|
+
export const PanelBody = styled.div `
|
|
32
|
+
padding: ${(p) => (p.$pad === false ? 0 : "14px 16px")};
|
|
33
|
+
`;
|
|
34
|
+
/** MicroLabel: uppercase mono kicker used for section heads and field labels. */
|
|
35
|
+
export const MicroLabel = styled.span `
|
|
36
|
+
display: block;
|
|
37
|
+
font-family: ${v.mono};
|
|
38
|
+
font-size: 9.5px;
|
|
39
|
+
font-weight: 600;
|
|
40
|
+
letter-spacing: 0.14em;
|
|
41
|
+
text-transform: uppercase;
|
|
42
|
+
color: ${v.faint};
|
|
43
|
+
`;
|
|
44
|
+
export const Hairline = styled.hr `
|
|
45
|
+
border: none;
|
|
46
|
+
border-top: 1px solid ${v.line};
|
|
47
|
+
margin: 0;
|
|
48
|
+
`;
|
|
49
|
+
//# sourceMappingURL=Panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.js","sourceRoot":"","sources":["../../src/kit/Panel.tsx"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,gFAAgF;AAChF,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAA;gBACnB,CAAC,CAAC,OAAO;sBACH,CAAC,CAAC,IAAI;mBACT,CAAC,CAAC,MAAM;gCACK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI;;CAEnD,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAA;;;;;6BAKT,CAAC,CAAC,IAAI;;;CAGlC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAA;;;;CAIlC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;CAKrC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAgC;aACtD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;CACvD,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAA;;iBAEpB,CAAC,CAAC,IAAI;;;;;WAKZ,CAAC,CAAC,KAAK;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAA;;0BAEP,CAAC,CAAC,IAAI;;CAE/B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function CopyIcon({ text, label }: {
|
|
2
|
+
text: string;
|
|
3
|
+
label?: string | undefined;
|
|
4
|
+
}): import("react").JSX.Element;
|
|
5
|
+
/** SecretField: monospace reveal/copy field for one-time tokens. */
|
|
6
|
+
export declare function SecretField({ value }: {
|
|
7
|
+
value: string;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=Secret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Secret.d.ts","sourceRoot":"","sources":["../../src/kit/Secret.tsx"],"names":[],"mappings":"AA0BA,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,+BAgBrF;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,+BAWvD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import styled from "styled-components";
|
|
4
|
+
import { v } from "../theme/tokens.js";
|
|
5
|
+
import { Icon } from "./Icon.js";
|
|
6
|
+
import { IconButton } from "./Button.js";
|
|
7
|
+
const Wrap = styled.div `
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
gap: 6px;
|
|
11
|
+
border: 1px solid ${v.fieldLine};
|
|
12
|
+
background: ${v.field};
|
|
13
|
+
border-radius: ${v.rCtl};
|
|
14
|
+
padding: 6px 6px 6px 10px;
|
|
15
|
+
`;
|
|
16
|
+
const Value = styled.code `
|
|
17
|
+
flex: 1;
|
|
18
|
+
min-width: 0;
|
|
19
|
+
font-size: 11.5px;
|
|
20
|
+
overflow-x: auto;
|
|
21
|
+
white-space: nowrap;
|
|
22
|
+
filter: ${(p) => (p.$hidden ? "blur(5px)" : "none")};
|
|
23
|
+
user-select: ${(p) => (p.$hidden ? "none" : "text")};
|
|
24
|
+
`;
|
|
25
|
+
export function CopyIcon({ text, label }) {
|
|
26
|
+
const [done, setDone] = useState(false);
|
|
27
|
+
return (_jsx(IconButton, { "aria-label": label ?? "Copy", title: label ?? "Copy", onClick: () => {
|
|
28
|
+
void navigator.clipboard.writeText(text).then(() => {
|
|
29
|
+
setDone(true);
|
|
30
|
+
setTimeout(() => setDone(false), 1400);
|
|
31
|
+
});
|
|
32
|
+
}, children: _jsx(Icon, { name: done ? "check" : "copy", style: done ? { color: "var(--x-success)" } : undefined }) }));
|
|
33
|
+
}
|
|
34
|
+
/** SecretField: monospace reveal/copy field for one-time tokens. */
|
|
35
|
+
export function SecretField({ value }) {
|
|
36
|
+
const [hidden, setHidden] = useState(true);
|
|
37
|
+
return (_jsxs(Wrap, { children: [_jsx(Value, { "$hidden": hidden, children: value }), _jsx(IconButton, { "aria-label": hidden ? "Reveal" : "Hide", onClick: () => setHidden(!hidden), children: _jsx(Icon, { name: hidden ? "reveal" : "hide" }) }), _jsx(CopyIcon, { text: value, label: "Copy token" })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=Secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Secret.js","sourceRoot":"","sources":["../../src/kit/Secret.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAY,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAc,CAAC;AAE1C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA;;;;sBAID,CAAC,CAAC,SAAS;gBACjB,CAAC,CAAC,KAAK;mBACJ,CAAC,CAAC,IAAI;;CAExB,CAAC;AAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAsB;;;;;;YAMnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;iBACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;CACpD,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAgD;IACpF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CACL,KAAC,UAAU,kBACG,KAAK,IAAI,MAAM,EAC3B,KAAK,EAAE,KAAK,IAAI,MAAM,EACtB,OAAO,EAAE,GAAG,EAAE;YACZ,KAAK,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjD,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,YAED,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,GAAI,GACrF,CACd,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAqB;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CACL,MAAC,IAAI,eACH,KAAC,KAAK,eAAU,MAAM,YAAG,KAAK,GAAS,EACvC,KAAC,UAAU,kBAAa,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,YACnF,KAAC,IAAI,IAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAI,GAC/B,EACb,KAAC,QAAQ,IAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAC,YAAY,GAAG,IACvC,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Skeleton: sits at the exact final geometry and breathes; no spinners for known shapes. */
|
|
2
|
+
export declare const Skeleton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "style"> & {
|
|
3
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
4
|
+
}, {
|
|
5
|
+
$w?: string | undefined;
|
|
6
|
+
$h?: string | undefined;
|
|
7
|
+
$r?: string | undefined;
|
|
8
|
+
}>> & string;
|
|
9
|
+
export declare const SkeletonRow: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
10
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
11
|
+
}> & string;
|
|
12
|
+
//# sourceMappingURL=Skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.d.ts","sourceRoot":"","sources":["../../src/kit/Skeleton.tsx"],"names":[],"mappings":"AAKA,6FAA6F;AAC7F,eAAO,MAAM,QAAQ;;;SAAsB,MAAM,GAAG,SAAS;SAAO,MAAM,GAAG,SAAS;SAAO,MAAM,GAAG,SAAS;YAO9G,CAAC;AAEF,eAAO,MAAM,WAAW;;WAOvB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import styled, { keyframes } from "styled-components";
|
|
2
|
+
import { v } from "../theme/tokens.js";
|
|
3
|
+
const shimmer = keyframes `50% { opacity: 0.45; }`;
|
|
4
|
+
/** Skeleton: sits at the exact final geometry and breathes; no spinners for known shapes. */
|
|
5
|
+
export const Skeleton = styled.span `
|
|
6
|
+
display: inline-block;
|
|
7
|
+
width: ${(p) => p.$w ?? "100%"};
|
|
8
|
+
height: ${(p) => p.$h ?? "12px"};
|
|
9
|
+
border-radius: ${(p) => p.$r ?? "5px"};
|
|
10
|
+
background: ${v.hover};
|
|
11
|
+
animation: ${shimmer} 1.5s ease-in-out infinite;
|
|
12
|
+
`;
|
|
13
|
+
export const SkeletonRow = styled.div `
|
|
14
|
+
display: flex;
|
|
15
|
+
align-items: center;
|
|
16
|
+
gap: 14px;
|
|
17
|
+
padding: 12px 16px;
|
|
18
|
+
border-bottom: 1px solid ${v.line};
|
|
19
|
+
&:last-child { border-bottom: none; }
|
|
20
|
+
`;
|
|
21
|
+
//# sourceMappingURL=Skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.js","sourceRoot":"","sources":["../../src/kit/Skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,MAAM,OAAO,GAAG,SAAS,CAAA,wBAAwB,CAAC;AAElD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAA+E;;WAEvG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM;YACpB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM;mBACd,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK;gBACvB,CAAC,CAAC,KAAK;eACR,OAAO;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;6BAKR,CAAC,CAAC,IAAI;;CAElC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
type Kind = "ok" | "err" | "info";
|
|
3
|
+
interface ToastApi {
|
|
4
|
+
push: (kind: Kind, text: string) => void;
|
|
5
|
+
ok: (text: string) => void;
|
|
6
|
+
error: (e: unknown, prefix?: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function toastError(e: unknown): {
|
|
9
|
+
kind: Kind;
|
|
10
|
+
text: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function ToastProvider({ children }: {
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
export declare function useToast(): ToastApi;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=Toast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/kit/Toast.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK1G,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAIlC,UAAU,QAAQ;IAChB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAsCD,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAEnE;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAgClE;AAED,wBAAgB,QAAQ,IAAI,QAAQ,CAInC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useCallback, useContext, useMemo, useRef, useState } from "react";
|
|
3
|
+
import styled, { keyframes } from "styled-components";
|
|
4
|
+
import { v } from "../theme/tokens.js";
|
|
5
|
+
import { Icon } from "./Icon.js";
|
|
6
|
+
const Ctx = createContext(null);
|
|
7
|
+
const rise = keyframes `from { opacity: 0; transform: translateY(-6px); }`;
|
|
8
|
+
const Stack = styled.div `
|
|
9
|
+
position: fixed;
|
|
10
|
+
top: 14px;
|
|
11
|
+
right: 14px;
|
|
12
|
+
z-index: ${v.zToast};
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
gap: 8px;
|
|
16
|
+
width: min(360px, calc(100vw - 28px));
|
|
17
|
+
/* The stack overlays the page's top-right corner even when empty — it must
|
|
18
|
+
never swallow clicks meant for what's underneath it. */
|
|
19
|
+
pointer-events: none;
|
|
20
|
+
`;
|
|
21
|
+
const Item = styled.div `
|
|
22
|
+
pointer-events: auto;
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: flex-start;
|
|
25
|
+
gap: 9px;
|
|
26
|
+
padding: 11px 13px;
|
|
27
|
+
border-radius: ${v.rCard};
|
|
28
|
+
background: ${v.surface};
|
|
29
|
+
border: 1px solid ${v.line2};
|
|
30
|
+
box-shadow: ${v.elev};
|
|
31
|
+
font-size: 12.5px;
|
|
32
|
+
animation: ${rise} 0.16s cubic-bezier(0.2, 0.7, 0.3, 1);
|
|
33
|
+
svg { margin-top: 1px; flex: none; }
|
|
34
|
+
color: ${v.text};
|
|
35
|
+
border-left: 3px solid ${(p) => p.$kind === "ok" ? v.success : p.$kind === "err" ? v.danger : v.brand};
|
|
36
|
+
`;
|
|
37
|
+
export function toastError(e) {
|
|
38
|
+
return { kind: "err", text: String(e?.message ?? e) };
|
|
39
|
+
}
|
|
40
|
+
export function ToastProvider({ children }) {
|
|
41
|
+
const [toasts, setToasts] = useState([]);
|
|
42
|
+
const idRef = useRef(1);
|
|
43
|
+
const push = useCallback((kind, text) => {
|
|
44
|
+
const id = idRef.current++;
|
|
45
|
+
setToasts((t) => [...t, { id, kind, text }]);
|
|
46
|
+
setTimeout(() => setToasts((t) => t.filter((x) => x.id !== id)), kind === "err" ? 8000 : 5000);
|
|
47
|
+
}, []);
|
|
48
|
+
const api = useMemo(() => ({
|
|
49
|
+
push,
|
|
50
|
+
ok: (text) => push("ok", text),
|
|
51
|
+
error: (e, prefix) => {
|
|
52
|
+
const { kind, text } = toastError(e);
|
|
53
|
+
push(kind, prefix ? `${prefix}: ${text}` : text);
|
|
54
|
+
},
|
|
55
|
+
}), [push]);
|
|
56
|
+
return (_jsxs(Ctx.Provider, { value: api, children: [children, _jsx(Stack, { role: "status", "aria-live": "polite", children: toasts.map((t) => (_jsxs(Item, { "$kind": t.kind, children: [_jsx(Icon, { name: t.kind === "ok" ? "check" : t.kind === "err" ? "error" : "info" }), _jsx("span", { children: t.text })] }, t.id))) })] }));
|
|
57
|
+
}
|
|
58
|
+
export function useToast() {
|
|
59
|
+
const c = useContext(Ctx);
|
|
60
|
+
if (!c)
|
|
61
|
+
throw new Error("useToast outside ToastProvider");
|
|
62
|
+
return c;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=Toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../src/kit/Toast.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export type ThemePref = "system" | "light" | "dark";
|
|
3
|
+
interface ThemeCtx {
|
|
4
|
+
pref: ThemePref;
|
|
5
|
+
resolved: "light" | "dark";
|
|
6
|
+
setPref: (p: ThemePref) => void;
|
|
7
|
+
/** system → the opposite of what's resolved → … (the rail's theme button) */
|
|
8
|
+
cycle: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function AppThemeProvider({ children, storageKey }: {
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
storageKey?: string | undefined;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
export declare function useTheme(): ThemeCtx;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=ThemeProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ7G,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAMpD,UAAU,QAAQ;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IAChC,6EAA6E;IAC7E,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAQD,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,UAAgC,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,+BAoDxI;AAED,wBAAgB,QAAQ,IAAI,QAAQ,CAInC"}
|