@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.
Files changed (74) hide show
  1. package/dist/index.d.ts +18 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +24 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/kit/Badge.d.ts +19 -0
  6. package/dist/kit/Badge.d.ts.map +1 -0
  7. package/dist/kit/Badge.js +61 -0
  8. package/dist/kit/Badge.js.map +1 -0
  9. package/dist/kit/Button.d.ts +28 -0
  10. package/dist/kit/Button.d.ts.map +1 -0
  11. package/dist/kit/Button.js +73 -0
  12. package/dist/kit/Button.js.map +1 -0
  13. package/dist/kit/DataTable.d.ts +23 -0
  14. package/dist/kit/DataTable.d.ts.map +1 -0
  15. package/dist/kit/DataTable.js +59 -0
  16. package/dist/kit/DataTable.js.map +1 -0
  17. package/dist/kit/EmptyState.d.ts +10 -0
  18. package/dist/kit/EmptyState.d.ts.map +1 -0
  19. package/dist/kit/EmptyState.js +42 -0
  20. package/dist/kit/EmptyState.js.map +1 -0
  21. package/dist/kit/EntityHeader.d.ts +17 -0
  22. package/dist/kit/EntityHeader.d.ts.map +1 -0
  23. package/dist/kit/EntityHeader.js +61 -0
  24. package/dist/kit/EntityHeader.js.map +1 -0
  25. package/dist/kit/Form.d.ts +78 -0
  26. package/dist/kit/Form.d.ts.map +1 -0
  27. package/dist/kit/Form.js +210 -0
  28. package/dist/kit/Form.js.map +1 -0
  29. package/dist/kit/Icon.d.ts +102 -0
  30. package/dist/kit/Icon.d.ts.map +1 -0
  31. package/dist/kit/Icon.js +48 -0
  32. package/dist/kit/Icon.js.map +1 -0
  33. package/dist/kit/KV.d.ts +9 -0
  34. package/dist/kit/KV.d.ts.map +1 -0
  35. package/dist/kit/KV.js +23 -0
  36. package/dist/kit/KV.js.map +1 -0
  37. package/dist/kit/LogView.d.ts +21 -0
  38. package/dist/kit/LogView.d.ts.map +1 -0
  39. package/dist/kit/LogView.js +35 -0
  40. package/dist/kit/LogView.js.map +1 -0
  41. package/dist/kit/Modal.d.ts +50 -0
  42. package/dist/kit/Modal.d.ts.map +1 -0
  43. package/dist/kit/Modal.js +112 -0
  44. package/dist/kit/Modal.js.map +1 -0
  45. package/dist/kit/PageHeader.d.ts +30 -0
  46. package/dist/kit/PageHeader.d.ts.map +1 -0
  47. package/dist/kit/PageHeader.js +67 -0
  48. package/dist/kit/PageHeader.js.map +1 -0
  49. package/dist/kit/Panel.d.ts +26 -0
  50. package/dist/kit/Panel.d.ts.map +1 -0
  51. package/dist/kit/Panel.js +49 -0
  52. package/dist/kit/Panel.js.map +1 -0
  53. package/dist/kit/Secret.d.ts +9 -0
  54. package/dist/kit/Secret.d.ts.map +1 -0
  55. package/dist/kit/Secret.js +39 -0
  56. package/dist/kit/Secret.js.map +1 -0
  57. package/dist/kit/Skeleton.d.ts +12 -0
  58. package/dist/kit/Skeleton.d.ts.map +1 -0
  59. package/dist/kit/Skeleton.js +21 -0
  60. package/dist/kit/Skeleton.js.map +1 -0
  61. package/dist/kit/Toast.d.ts +17 -0
  62. package/dist/kit/Toast.d.ts.map +1 -0
  63. package/dist/kit/Toast.js +64 -0
  64. package/dist/kit/Toast.js.map +1 -0
  65. package/dist/theme/ThemeProvider.d.ts +16 -0
  66. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  67. package/dist/theme/ThemeProvider.js +105 -0
  68. package/dist/theme/ThemeProvider.js.map +1 -0
  69. package/dist/theme/tokens.d.ts +62 -0
  70. package/dist/theme/tokens.d.ts.map +1 -0
  71. package/dist/theme/tokens.js +171 -0
  72. package/dist/theme/tokens.js.map +1 -0
  73. package/package.json +49 -0
  74. 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"}