@codesweep-ai/ui 0.2.1-dev.20260830023458.856ea8f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +124 -0
- package/dist/BUILD.json +1 -0
- package/dist/chart.d.ts +3 -0
- package/dist/chart.d.ts.map +1 -0
- package/dist/chart.js +3 -0
- package/dist/code.d.ts +2 -0
- package/dist/code.d.ts.map +1 -0
- package/dist/code.js +2 -0
- package/dist/components/AgentStatus.d.ts +15 -0
- package/dist/components/AgentStatus.d.ts.map +1 -0
- package/dist/components/AgentStatus.js +38 -0
- package/dist/components/AgentTrace.d.ts +42 -0
- package/dist/components/AgentTrace.d.ts.map +1 -0
- package/dist/components/AgentTrace.js +140 -0
- package/dist/components/AppShell.d.ts +29 -0
- package/dist/components/AppShell.d.ts.map +1 -0
- package/dist/components/AppShell.js +71 -0
- package/dist/components/Button.d.ts +10 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +41 -0
- package/dist/components/Card.d.ts +19 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +96 -0
- package/dist/components/CardGroup.d.ts +16 -0
- package/dist/components/CardGroup.d.ts.map +1 -0
- package/dist/components/CardGroup.js +33 -0
- package/dist/components/CardGroupContext.d.ts +14 -0
- package/dist/components/CardGroupContext.d.ts.map +1 -0
- package/dist/components/CardGroupContext.js +8 -0
- package/dist/components/ChartFrame.d.ts +30 -0
- package/dist/components/ChartFrame.d.ts.map +1 -0
- package/dist/components/ChartFrame.js +96 -0
- package/dist/components/ChartTooltip.d.ts +22 -0
- package/dist/components/ChartTooltip.d.ts.map +1 -0
- package/dist/components/ChartTooltip.js +26 -0
- package/dist/components/CheckboxGroup.d.ts +37 -0
- package/dist/components/CheckboxGroup.d.ts.map +1 -0
- package/dist/components/CheckboxGroup.js +198 -0
- package/dist/components/Chip.d.ts +9 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +31 -0
- package/dist/components/CodeBlock.d.ts +30 -0
- package/dist/components/CodeBlock.d.ts.map +1 -0
- package/dist/components/CodeBlock.js +112 -0
- package/dist/components/Dropdown.d.ts +28 -0
- package/dist/components/Dropdown.d.ts.map +1 -0
- package/dist/components/Dropdown.js +50 -0
- package/dist/components/EventLanes.d.ts +93 -0
- package/dist/components/EventLanes.d.ts.map +1 -0
- package/dist/components/EventLanes.js +445 -0
- package/dist/components/FormGroup.d.ts +29 -0
- package/dist/components/FormGroup.d.ts.map +1 -0
- package/dist/components/FormGroup.js +48 -0
- package/dist/components/HighlightText.d.ts +15 -0
- package/dist/components/HighlightText.d.ts.map +1 -0
- package/dist/components/HighlightText.js +28 -0
- package/dist/components/Input.d.ts +35 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +61 -0
- package/dist/components/Legend.d.ts +21 -0
- package/dist/components/Legend.d.ts.map +1 -0
- package/dist/components/Legend.js +61 -0
- package/dist/components/LightweightMarkdown.d.ts +3 -0
- package/dist/components/LightweightMarkdown.d.ts.map +1 -0
- package/dist/components/LightweightMarkdown.js +249 -0
- package/dist/components/MarkdownMinimap.d.ts +7 -0
- package/dist/components/MarkdownMinimap.d.ts.map +1 -0
- package/dist/components/MarkdownMinimap.js +84 -0
- package/dist/components/MarkdownViewer.d.ts +51 -0
- package/dist/components/MarkdownViewer.d.ts.map +1 -0
- package/dist/components/MarkdownViewer.js +455 -0
- package/dist/components/MermaidDiagram.d.ts +11 -0
- package/dist/components/MermaidDiagram.d.ts.map +1 -0
- package/dist/components/MermaidDiagram.js +119 -0
- package/dist/components/Modal.d.ts +13 -0
- package/dist/components/Modal.d.ts.map +1 -0
- package/dist/components/Modal.js +91 -0
- package/dist/components/Panel.d.ts +13 -0
- package/dist/components/Panel.d.ts.map +1 -0
- package/dist/components/Panel.js +44 -0
- package/dist/components/PulseBadge.d.ts +15 -0
- package/dist/components/PulseBadge.d.ts.map +1 -0
- package/dist/components/PulseBadge.js +22 -0
- package/dist/components/RadioGroup.d.ts +20 -0
- package/dist/components/RadioGroup.d.ts.map +1 -0
- package/dist/components/RadioGroup.js +63 -0
- package/dist/components/RichMarkdownRenderer.d.ts +10 -0
- package/dist/components/RichMarkdownRenderer.d.ts.map +1 -0
- package/dist/components/RichMarkdownRenderer.js +18 -0
- package/dist/components/SearchInput.d.ts +25 -0
- package/dist/components/SearchInput.d.ts.map +1 -0
- package/dist/components/SearchInput.js +92 -0
- package/dist/components/SectionedTree.d.ts +36 -0
- package/dist/components/SectionedTree.d.ts.map +1 -0
- package/dist/components/SectionedTree.js +173 -0
- package/dist/components/SegmentedControl.d.ts +16 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl.js +48 -0
- package/dist/components/Skeleton.d.ts +8 -0
- package/dist/components/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton.js +25 -0
- package/dist/components/SplitPane.d.ts +16 -0
- package/dist/components/SplitPane.d.ts.map +1 -0
- package/dist/components/SplitPane.js +118 -0
- package/dist/components/StatusBadge.d.ts +15 -0
- package/dist/components/StatusBadge.d.ts.map +1 -0
- package/dist/components/StatusBadge.js +40 -0
- package/dist/components/StreamingText.d.ts +20 -0
- package/dist/components/StreamingText.d.ts.map +1 -0
- package/dist/components/StreamingText.js +50 -0
- package/dist/components/Table.d.ts +62 -0
- package/dist/components/Table.d.ts.map +1 -0
- package/dist/components/Table.js +256 -0
- package/dist/components/ThemeToggle.d.ts +11 -0
- package/dist/components/ThemeToggle.d.ts.map +1 -0
- package/dist/components/ThemeToggle.js +55 -0
- package/dist/components/Toast.d.ts +8 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +51 -0
- package/dist/components/ToastContainer.d.ts +5 -0
- package/dist/components/ToastContainer.d.ts.map +1 -0
- package/dist/components/ToastContainer.js +29 -0
- package/dist/components/Tree.d.ts +50 -0
- package/dist/components/Tree.d.ts.map +1 -0
- package/dist/components/Tree.js +528 -0
- package/dist/components/TreeDnd.d.ts +18 -0
- package/dist/components/TreeDnd.d.ts.map +1 -0
- package/dist/components/TreeDnd.js +39 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/lib/accentToken.d.ts +3 -0
- package/dist/lib/accentToken.d.ts.map +1 -0
- package/dist/lib/accentToken.js +12 -0
- package/dist/lib/chartTheme.d.ts +45 -0
- package/dist/lib/chartTheme.d.ts.map +1 -0
- package/dist/lib/chartTheme.js +64 -0
- package/dist/lib/cn.d.ts +6 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +11 -0
- package/dist/lib/forwardRefToRoot.d.ts +8 -0
- package/dist/lib/forwardRefToRoot.d.ts.map +1 -0
- package/dist/lib/forwardRefToRoot.js +18 -0
- package/dist/lib/markdownUrl.d.ts +5 -0
- package/dist/lib/markdownUrl.d.ts.map +1 -0
- package/dist/lib/markdownUrl.js +24 -0
- package/dist/lib/toast.d.ts +30 -0
- package/dist/lib/toast.d.ts.map +1 -0
- package/dist/lib/toast.js +34 -0
- package/dist/lib/useTheme.d.ts +22 -0
- package/dist/lib/useTheme.d.ts.map +1 -0
- package/dist/lib/useTheme.js +62 -0
- package/dist/markdown/rich.d.ts +10 -0
- package/dist/markdown/rich.d.ts.map +1 -0
- package/dist/markdown/rich.js +8 -0
- package/dist/markdown.d.ts +3 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +2 -0
- package/dist/mermaid.d.ts +2 -0
- package/dist/mermaid.d.ts.map +1 -0
- package/dist/mermaid.js +2 -0
- package/dist/minimap.d.ts +2 -0
- package/dist/minimap.d.ts.map +1 -0
- package/dist/minimap.js +2 -0
- package/dist/styles/base.css +98 -0
- package/dist/styles/components/agent-status.css +52 -0
- package/dist/styles/components/agent-trace.css +206 -0
- package/dist/styles/components/app-shell.css +195 -0
- package/dist/styles/components/button.css +172 -0
- package/dist/styles/components/card-group.css +20 -0
- package/dist/styles/components/card.css +200 -0
- package/dist/styles/components/chart-frame.css +144 -0
- package/dist/styles/components/chart-tooltip.css +54 -0
- package/dist/styles/components/checkbox-group.css +281 -0
- package/dist/styles/components/chip.css +61 -0
- package/dist/styles/components/code-block.css +215 -0
- package/dist/styles/components/dropdown.css +131 -0
- package/dist/styles/components/event-lanes.css +159 -0
- package/dist/styles/components/form-group.css +34 -0
- package/dist/styles/components/highlight-text.css +17 -0
- package/dist/styles/components/input.css +168 -0
- package/dist/styles/components/legend.css +80 -0
- package/dist/styles/components/markdown-minimap.css +13 -0
- package/dist/styles/components/markdown-viewer.css +354 -0
- package/dist/styles/components/mermaid-diagram.css +8 -0
- package/dist/styles/components/modal.css +167 -0
- package/dist/styles/components/panel.css +126 -0
- package/dist/styles/components/pulse-badge.css +56 -0
- package/dist/styles/components/radio-group.css +89 -0
- package/dist/styles/components/search-input.css +153 -0
- package/dist/styles/components/sectioned-tree.css +183 -0
- package/dist/styles/components/segmented-control.css +54 -0
- package/dist/styles/components/skeleton.css +21 -0
- package/dist/styles/components/split-pane.css +78 -0
- package/dist/styles/components/status-badge.css +94 -0
- package/dist/styles/components/streaming-text.css +38 -0
- package/dist/styles/components/table.css +235 -0
- package/dist/styles/components/theme-toggle.css +123 -0
- package/dist/styles/components/toast-container.css +34 -0
- package/dist/styles/components/toast.css +169 -0
- package/dist/styles/components/tree.css +375 -0
- package/dist/styles/components.css +37 -0
- package/dist/styles/core.css +3 -0
- package/dist/styles/markdown-content.css +368 -0
- package/dist/styles/print.css +55 -0
- package/dist/styles/reset.css +202 -0
- package/dist/styles/syntax.css +62 -0
- package/dist/styles/tokens.css +344 -0
- package/dist/styles/utilities.css +7 -0
- package/dist/testing/index.d.ts +39 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +119 -0
- package/package.json +138 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface LegendItem {
|
|
2
|
+
id: string;
|
|
3
|
+
label: React.ReactNode;
|
|
4
|
+
/** Design-token custom property, for example `--color-cat-1`. */
|
|
5
|
+
color: `--${string}`;
|
|
6
|
+
/** Swatch shape. Default `"dot"`. Use `"square"` when the legend describes a
|
|
7
|
+
* chart that paints square marks — a legend whose swatch does not match the
|
|
8
|
+
* mark it stands for makes the reader map colours by hand. */
|
|
9
|
+
shape?: "dot" | "square";
|
|
10
|
+
}
|
|
11
|
+
interface LegendProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
|
|
12
|
+
items: LegendItem[];
|
|
13
|
+
/** Active items for the interactive form. Defaults to all items. */
|
|
14
|
+
selected?: Set<string>;
|
|
15
|
+
/** Enables toggle buttons and receives the next active set. */
|
|
16
|
+
onChange?: (selected: Set<string>) => void;
|
|
17
|
+
extras?: React.ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export declare const Legend: import("react").ForwardRefExoticComponent<LegendProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=Legend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Legend.d.ts","sourceRoot":"","sources":["../../src/components/Legend.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,iEAAiE;IACjE,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;IACrB;;mEAE+D;IAC/D,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC1B;AAED,UAAU,WAAY,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAClF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAiED,eAAO,MAAM,MAAM,wGAA4D,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { forwardRefToRoot as e } from "../lib/forwardRefToRoot.js";
|
|
2
|
+
import { cn as t } from "../lib/cn.js";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/Legend.tsx
|
|
5
|
+
function i({ id: e, color: r, shape: i = "dot" }) {
|
|
6
|
+
return /* @__PURE__ */ n("span", {
|
|
7
|
+
"data-legend-swatch": e,
|
|
8
|
+
"aria-hidden": "true",
|
|
9
|
+
className: t("cs-component-legend-5", i === "square" && "cs-component-legend-8"),
|
|
10
|
+
style: { backgroundColor: `var(${r})` }
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function a({ items: e, selected: a, onChange: o, extras: s, className: c, ...l }) {
|
|
14
|
+
let u = a ?? new Set(e.map((e) => e.id)), d = (e) => {
|
|
15
|
+
if (!o) return;
|
|
16
|
+
let t = new Set(u);
|
|
17
|
+
t.has(e) ? t.delete(e) : t.add(e), o(t);
|
|
18
|
+
};
|
|
19
|
+
return /* @__PURE__ */ r("div", {
|
|
20
|
+
role: "group",
|
|
21
|
+
...l,
|
|
22
|
+
"data-component": "Legend",
|
|
23
|
+
className: t("cs-component-legend-1", c),
|
|
24
|
+
children: [/* @__PURE__ */ n("ul", {
|
|
25
|
+
className: "cs-component-legend-2",
|
|
26
|
+
children: e.map((e) => /* @__PURE__ */ n("li", {
|
|
27
|
+
className: "cs-component-legend-3",
|
|
28
|
+
children: o ? /* @__PURE__ */ r("button", {
|
|
29
|
+
type: "button",
|
|
30
|
+
"aria-pressed": u.has(e.id),
|
|
31
|
+
onClick: () => d(e.id),
|
|
32
|
+
className: "cs-component-legend-4",
|
|
33
|
+
children: [/* @__PURE__ */ n(i, {
|
|
34
|
+
id: e.id,
|
|
35
|
+
color: e.color,
|
|
36
|
+
shape: e.shape
|
|
37
|
+
}), /* @__PURE__ */ n("span", {
|
|
38
|
+
"data-legend-label": e.id,
|
|
39
|
+
children: e.label
|
|
40
|
+
})]
|
|
41
|
+
}) : /* @__PURE__ */ r("span", {
|
|
42
|
+
className: "cs-component-legend-6",
|
|
43
|
+
children: [/* @__PURE__ */ n(i, {
|
|
44
|
+
id: e.id,
|
|
45
|
+
color: e.color,
|
|
46
|
+
shape: e.shape
|
|
47
|
+
}), /* @__PURE__ */ n("span", {
|
|
48
|
+
"data-legend-label": e.id,
|
|
49
|
+
children: e.label
|
|
50
|
+
})]
|
|
51
|
+
})
|
|
52
|
+
}, e.id))
|
|
53
|
+
}), s != null && /* @__PURE__ */ n("div", {
|
|
54
|
+
className: "cs-component-legend-7",
|
|
55
|
+
children: s
|
|
56
|
+
})]
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
var o = e(a);
|
|
60
|
+
//#endregion
|
|
61
|
+
export { o as Legend };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LightweightMarkdown.d.ts","sourceRoot":"","sources":["../../src/components/LightweightMarkdown.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAyc1B,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,qBAAqB,2CASjF"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { Fragment as e, createElement as t } from "react";
|
|
2
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/LightweightMarkdown.tsx
|
|
4
|
+
var r = {
|
|
5
|
+
amp: "&",
|
|
6
|
+
apos: "'",
|
|
7
|
+
colon: ":",
|
|
8
|
+
gt: ">",
|
|
9
|
+
lt: "<",
|
|
10
|
+
quot: "\""
|
|
11
|
+
};
|
|
12
|
+
function i(e) {
|
|
13
|
+
return e.replace(/&(#(?:x[0-9a-f]+|\d+)|[a-z]+);/gi, (e, t) => {
|
|
14
|
+
if (t[0] === "#") {
|
|
15
|
+
let n = t[1]?.toLowerCase() === "x", r = Number.parseInt(t.slice(n ? 2 : 1), n ? 16 : 10);
|
|
16
|
+
return Number.isFinite(r) ? String.fromCodePoint(r) : e;
|
|
17
|
+
}
|
|
18
|
+
return r[t.toLowerCase()] ?? e;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function a(e) {
|
|
22
|
+
return e.toLowerCase().replace(/[^\p{L}\p{M}\p{N}\p{Pc} -]/gu, "").replace(/ /g, "-");
|
|
23
|
+
}
|
|
24
|
+
function o(e) {
|
|
25
|
+
return i(e).replace(/!?(\[)([^\]]+)\]\(([^)]+)\)/g, "$2").replace(/[`*_~]/g, "");
|
|
26
|
+
}
|
|
27
|
+
function s(e, n, r, i, a) {
|
|
28
|
+
return t(i.components[e] ?? e, {
|
|
29
|
+
...n,
|
|
30
|
+
key: a
|
|
31
|
+
}, r);
|
|
32
|
+
}
|
|
33
|
+
function c(e, t) {
|
|
34
|
+
if (!t) return;
|
|
35
|
+
let n = i(t), r = e[e.length - 1];
|
|
36
|
+
typeof r == "string" ? e[e.length - 1] = r + n : e.push(n);
|
|
37
|
+
}
|
|
38
|
+
function l(e, t, n) {
|
|
39
|
+
let r = t;
|
|
40
|
+
for (; r < e.length;) {
|
|
41
|
+
let t = e.indexOf(n, r);
|
|
42
|
+
if (t < 0) return -1;
|
|
43
|
+
let i = 0;
|
|
44
|
+
for (let n = t - 1; n >= 0 && e[n] === "\\"; n--) i++;
|
|
45
|
+
if (i % 2 == 0) return t;
|
|
46
|
+
r = t + n.length;
|
|
47
|
+
}
|
|
48
|
+
return -1;
|
|
49
|
+
}
|
|
50
|
+
function u(e, t) {
|
|
51
|
+
let n = [], r = 0, a = 0, o = () => `${t.keyPrefix}-i${a++}`;
|
|
52
|
+
for (; r < e.length;) {
|
|
53
|
+
if (e[r] === "\\" && r + 1 < e.length) {
|
|
54
|
+
c(n, e[r + 1]), r += 2;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (e[r] === "`") {
|
|
58
|
+
let i = 1;
|
|
59
|
+
for (; e[r + i] === "`";) i++;
|
|
60
|
+
let a = "`".repeat(i), c = l(e, r + i, a);
|
|
61
|
+
if (c >= 0) {
|
|
62
|
+
let a = e.slice(r + i, c).replace(/\\\|/g, "|").replace(/\n/g, " ");
|
|
63
|
+
/^\s.*\s$/.test(a) && /\S/.test(a) && (a = a.slice(1, -1)), n.push(s("code", {}, a, t, o())), r = c + i;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
let a = e.slice(r).match(/^!\[([^\]]*)\]\((\S+?)(?:\s+["']([^"']*)["'])?\)/);
|
|
68
|
+
if (a) {
|
|
69
|
+
n.push(s("img", {
|
|
70
|
+
src: i(a[2]),
|
|
71
|
+
alt: i(a[1]),
|
|
72
|
+
title: a[3]
|
|
73
|
+
}, null, t, o())), r += a[0].length;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
let d = e.slice(r).match(/^\[([^\]]+)\]\((\S+?)(?:\s+["']([^"']*)["'])?\)/);
|
|
77
|
+
if (d) {
|
|
78
|
+
n.push(s("a", {
|
|
79
|
+
href: i(d[2]),
|
|
80
|
+
title: d[3]
|
|
81
|
+
}, u(d[1], {
|
|
82
|
+
...t,
|
|
83
|
+
keyPrefix: o()
|
|
84
|
+
}), t, o())), r += d[0].length;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
let f = e.startsWith("**", r) ? "**" : e.startsWith("__", r) ? "__" : null;
|
|
88
|
+
if (f) {
|
|
89
|
+
let i = l(e, r + 2, f);
|
|
90
|
+
if (i > r + 2) {
|
|
91
|
+
n.push(s("strong", {}, u(e.slice(r + 2, i), {
|
|
92
|
+
...t,
|
|
93
|
+
keyPrefix: o()
|
|
94
|
+
}), t, o())), r = i + 2;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (e.startsWith("~~", r)) {
|
|
99
|
+
let i = l(e, r + 2, "~~");
|
|
100
|
+
if (i > r + 2) {
|
|
101
|
+
n.push(s("del", {}, u(e.slice(r + 2, i), {
|
|
102
|
+
...t,
|
|
103
|
+
keyPrefix: o()
|
|
104
|
+
}), t, o())), r = i + 2;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (e[r] === "\n" && r >= 2 && e.slice(r - 2, r) === " ") {
|
|
109
|
+
let e = n[n.length - 1];
|
|
110
|
+
typeof e == "string" && (n[n.length - 1] = e.slice(0, -2)), n.push(s("br", {}, null, t, o())), r++;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
let p = e.slice(r + 1).search(/[\\`![\]*_~\n]/), m = p < 0 ? e.length : r + 1 + p;
|
|
114
|
+
c(n, e.slice(r, m)), r = m;
|
|
115
|
+
}
|
|
116
|
+
return n;
|
|
117
|
+
}
|
|
118
|
+
function d(e) {
|
|
119
|
+
let t = e.match(/^(\s{0,3})([-+*]|\d+[.)])\s+(.*)$/);
|
|
120
|
+
return t ? {
|
|
121
|
+
indent: t[1].length,
|
|
122
|
+
ordered: /^\d/.test(t[2]),
|
|
123
|
+
marker: t[2],
|
|
124
|
+
text: t[3]
|
|
125
|
+
} : null;
|
|
126
|
+
}
|
|
127
|
+
function f(e) {
|
|
128
|
+
let t = [], n = "";
|
|
129
|
+
for (let r = 0; r < e.length; r++) {
|
|
130
|
+
let i = e[r];
|
|
131
|
+
i === "\\" && e[r + 1] === "|" ? (n += "\\|", r++) : i === "|" ? (t.push(n.trim()), n = "") : n += i;
|
|
132
|
+
}
|
|
133
|
+
return t.push(n.trim()), t[0] === "" && t.shift(), t[t.length - 1] === "" && t.pop(), t;
|
|
134
|
+
}
|
|
135
|
+
function p(e) {
|
|
136
|
+
let t = f(e);
|
|
137
|
+
return t.length === 0 || t.some((e) => !/^:?-+:?$/.test(e)) ? null : t.map((e) => e.startsWith(":") && e.endsWith(":") ? "center" : e.startsWith(":") ? "left" : e.endsWith(":") ? "right" : void 0);
|
|
138
|
+
}
|
|
139
|
+
function m(e, t) {
|
|
140
|
+
let n = e[t] ?? "";
|
|
141
|
+
return /^\s{0,3}(#{1,6})\s+/.test(n) || /^\s{0,3}(`{3,}|~{3,})/.test(n) || /^\s{0,3}>/.test(n) || d(n) || /^\s{0,3}((\*\s*){3,}|(-\s*){3,}|(_\s*){3,})$/.test(n) ? !0 : t + 1 < e.length && p(e[t + 1]) !== null;
|
|
142
|
+
}
|
|
143
|
+
function h(e, t) {
|
|
144
|
+
let n = [], r = 0, i = 0, c = () => ({
|
|
145
|
+
...t,
|
|
146
|
+
keyPrefix: `${t.keyPrefix}-b${i++}`
|
|
147
|
+
});
|
|
148
|
+
for (; r < e.length;) {
|
|
149
|
+
if (!e[r].trim()) {
|
|
150
|
+
r++;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
let t = c(), i = e[r].match(/^\s{0,3}(`{3,}|~{3,})\s*([^\s`]*)?.*$/);
|
|
154
|
+
if (i) {
|
|
155
|
+
let a = i[1], o = i[2] ?? "", c = [];
|
|
156
|
+
for (r++; r < e.length && !RegExp(`^\\s{0,3}${a[0]}{${a.length},}\\s*$`).test(e[r]);) c.push(e[r]), r++;
|
|
157
|
+
r < e.length && r++;
|
|
158
|
+
let l = s("code", o ? { className: `language-${o}` } : {}, `${c.join("\n")}\n`, t, `${t.keyPrefix}-code`);
|
|
159
|
+
n.push(s("pre", {}, l, t, t.keyPrefix));
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
let l = e[r].match(/^\s{0,3}(#{1,6})\s+(.+?)\s*#*\s*$/);
|
|
163
|
+
if (l) {
|
|
164
|
+
let e = l[2], i = `h${l[1].length}`;
|
|
165
|
+
n.push(s(i, { id: a(o(e)) }, u(e, t), t, t.keyPrefix)), r++;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (r + 1 < e.length && /^\s{0,3}(=+|-+)\s*$/.test(e[r + 1])) {
|
|
169
|
+
let i = e[r + 1].trim()[0] === "=" ? "h1" : "h2", c = e[r].trim();
|
|
170
|
+
n.push(s(i, { id: a(o(c)) }, u(c, t), t, t.keyPrefix)), r += 2;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (/^\s{0,3}>/.test(e[r])) {
|
|
174
|
+
let i = [];
|
|
175
|
+
for (; r < e.length && (/^\s{0,3}>/.test(e[r]) || !e[r].trim());) i.push(e[r].replace(/^\s{0,3}> ?/, "")), r++;
|
|
176
|
+
n.push(s("blockquote", {}, h(i, t), t, t.keyPrefix));
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
let g = d(e[r]);
|
|
180
|
+
if (g) {
|
|
181
|
+
let i = g.ordered, a = [], o = !1, c = i ? Number.parseInt(g.marker, 10) : void 0, l = 0;
|
|
182
|
+
for (; r < e.length;) {
|
|
183
|
+
let n = d(e[r]);
|
|
184
|
+
if (!n || n.ordered !== i || n.indent !== g.indent) break;
|
|
185
|
+
let c = {
|
|
186
|
+
...t,
|
|
187
|
+
keyPrefix: `${t.keyPrefix}-li${l++}`
|
|
188
|
+
}, f = n.text, p = [];
|
|
189
|
+
for (r++; r < e.length;) {
|
|
190
|
+
let t = d(e[r]);
|
|
191
|
+
if (t && t.indent === g.indent) break;
|
|
192
|
+
if (!e[r].trim()) {
|
|
193
|
+
p.push(""), r++;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
let n = e[r].match(/^\s*/)?.[0].length ?? 0;
|
|
197
|
+
if (n > g.indent) {
|
|
198
|
+
p.push(e[r].slice(Math.min(n, g.indent + 2))), r++;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
let m = f.match(/^\[([ xX])\]\s+(.*)$/), _ = [];
|
|
204
|
+
m && (o = !0, f = m[2], _.push(s("input", {
|
|
205
|
+
type: "checkbox",
|
|
206
|
+
checked: m[1].toLowerCase() === "x",
|
|
207
|
+
disabled: !0
|
|
208
|
+
}, null, c, `${c.keyPrefix}-check`), " ")), _.push(...u(f, c)), p.some((e) => e.trim()) && _.push(...h(p, c)), a.push(s("li", m ? { className: "task-list-item" } : {}, _, c, c.keyPrefix));
|
|
209
|
+
}
|
|
210
|
+
n.push(s(i ? "ol" : "ul", {
|
|
211
|
+
...i && c !== 1 ? { start: c } : {},
|
|
212
|
+
...o ? { className: "contains-task-list" } : {}
|
|
213
|
+
}, a, t, t.keyPrefix));
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
let _ = r + 1 < e.length ? p(e[r + 1]) : null;
|
|
217
|
+
if (_) {
|
|
218
|
+
let i = f(e[r]), a = i.length;
|
|
219
|
+
r += 2;
|
|
220
|
+
let o = [];
|
|
221
|
+
for (; r < e.length && e[r].includes("|") && e[r].trim() && !d(e[r]);) {
|
|
222
|
+
let t = f(e[r]);
|
|
223
|
+
o.push(Array.from({ length: a }, (e, n) => t[n] ?? "")), r++;
|
|
224
|
+
}
|
|
225
|
+
let c = (e, n, r) => e.map((e, i) => s(n, _[i] ? { style: { textAlign: _[i] } } : {}, u(e, {
|
|
226
|
+
...t,
|
|
227
|
+
keyPrefix: `${r}-c${i}`
|
|
228
|
+
}), t, `${r}-c${i}`)), l = s("tr", {}, c(i, "th", `${t.keyPrefix}-head`), t, `${t.keyPrefix}-head`), p = o.map((e, n) => s("tr", {}, c(e, "td", `${t.keyPrefix}-r${n}`), t, `${t.keyPrefix}-r${n}`));
|
|
229
|
+
n.push(s("table", {}, [s("thead", {}, l, t, `${t.keyPrefix}-thead`), ...p.length ? [s("tbody", {}, p, t, `${t.keyPrefix}-tbody`)] : []], t, t.keyPrefix));
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (/^\s{0,3}((\*\s*){3,}|(-\s*){3,}|(_\s*){3,})$/.test(e[r])) {
|
|
233
|
+
n.push(s("hr", {}, null, t, t.keyPrefix)), r++;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
let v = [e[r].trimStart()];
|
|
237
|
+
for (r++; r < e.length && e[r].trim() && !m(e, r);) v.push(e[r]), r++;
|
|
238
|
+
n.push(s("p", {}, u(v.join("\n"), t), t, t.keyPrefix));
|
|
239
|
+
}
|
|
240
|
+
return n;
|
|
241
|
+
}
|
|
242
|
+
function g({ content: t, components: r }) {
|
|
243
|
+
return /* @__PURE__ */ n(e, { children: h(t.replace(/\r\n?/g, "\n").split("\n"), {
|
|
244
|
+
components: r,
|
|
245
|
+
keyPrefix: "markdown"
|
|
246
|
+
}) });
|
|
247
|
+
}
|
|
248
|
+
//#endregion
|
|
249
|
+
export { g as LightweightMarkdown };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface MarkdownMinimapProps {
|
|
2
|
+
contentRef: React.RefObject<HTMLDivElement>;
|
|
3
|
+
className?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const MarkdownMinimap: import("react").ForwardRefExoticComponent<MarkdownMinimapProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=MarkdownMinimap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownMinimap.d.ts","sourceRoot":"","sources":["../../src/components/MarkdownMinimap.tsx"],"names":[],"mappings":"AAOA,UAAU,oBAAoB;IAC5B,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmLD,eAAO,MAAM,eAAe,iHAA8E,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import { forwardRefToRoot as e } from "../lib/forwardRefToRoot.js";
|
|
4
|
+
import { cn as t } from "../lib/cn.js";
|
|
5
|
+
import { useCallback as n, useEffect as r, useRef as i } from "react";
|
|
6
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/MarkdownMinimap.tsx
|
|
8
|
+
var o = 4, s = 8, c = 3, l = 1, u = 2, d = .6, f = 100;
|
|
9
|
+
function p(e) {
|
|
10
|
+
return getComputedStyle(document.documentElement).getPropertyValue(e).trim();
|
|
11
|
+
}
|
|
12
|
+
function m({ contentRef: e, className: m }) {
|
|
13
|
+
let h = i(null), g = i(null), _ = i(!1), v = n(() => {
|
|
14
|
+
let t = h.current, n = g.current, r = e.current;
|
|
15
|
+
if (!t || !n || !r) return;
|
|
16
|
+
let i = t.getContext("2d");
|
|
17
|
+
if (!i) return;
|
|
18
|
+
let a = n.clientHeight, f = n.clientWidth, m = r.scrollHeight, _ = r.clientHeight, v = r.scrollTop;
|
|
19
|
+
t.width = f, t.height = a;
|
|
20
|
+
let y = a / m, b = v * y, x = _ * y;
|
|
21
|
+
i.clearRect(0, 0, t.width, t.height);
|
|
22
|
+
let S = p("--muted"), C = p("--border"), w = r.querySelectorAll("h1, h2, h3, h4, h5, h6, p, pre, table, .md-mermaid, .md-alert"), T = r.getBoundingClientRect();
|
|
23
|
+
w.forEach((e) => {
|
|
24
|
+
let t = e.getBoundingClientRect(), n = (t.top - T.top + r.scrollTop) * y, a = Math.max(t.height * y, u);
|
|
25
|
+
e.tagName.match(/^H[1-6]$/) ? (i.fillStyle = S, i.fillRect(o, n, f - o * 2, Math.max(a, c))) : (i.fillStyle = C, i.fillRect(s, n, f - s * 2, Math.max(a, l)));
|
|
26
|
+
});
|
|
27
|
+
let E = p("--color-accent-bg-strong"), D = p("--color-link");
|
|
28
|
+
i.fillStyle = E, i.globalAlpha = d, i.fillRect(0, b, f, x), i.globalAlpha = 1, i.strokeStyle = D, i.lineWidth = 1, i.strokeRect(.5, b + .5, f - 1, x - 1);
|
|
29
|
+
}, [e]);
|
|
30
|
+
r(() => {
|
|
31
|
+
let t = e.current, n = g.current;
|
|
32
|
+
if (!t) return;
|
|
33
|
+
let r = () => {
|
|
34
|
+
requestAnimationFrame(v);
|
|
35
|
+
};
|
|
36
|
+
t.addEventListener("scroll", r);
|
|
37
|
+
let i = setTimeout(v, f), a = new ResizeObserver(() => {
|
|
38
|
+
requestAnimationFrame(v);
|
|
39
|
+
});
|
|
40
|
+
a.observe(t), n && a.observe(n);
|
|
41
|
+
let o = new MutationObserver((e) => {
|
|
42
|
+
for (let t of e) t.attributeName === "data-theme" && requestAnimationFrame(v);
|
|
43
|
+
});
|
|
44
|
+
return o.observe(document.documentElement, { attributes: !0 }), () => {
|
|
45
|
+
t.removeEventListener("scroll", r), clearTimeout(i), a.disconnect(), o.disconnect();
|
|
46
|
+
};
|
|
47
|
+
}, [e, v]);
|
|
48
|
+
let y = n((t) => {
|
|
49
|
+
let n = h.current, r = e.current;
|
|
50
|
+
if (!n || !r) return;
|
|
51
|
+
let i = n.getBoundingClientRect(), a = (t.clientY - i.top) / (n.height / r.scrollHeight) - r.clientHeight / 2;
|
|
52
|
+
r.scrollTo({
|
|
53
|
+
top: Math.max(0, a),
|
|
54
|
+
behavior: "smooth"
|
|
55
|
+
});
|
|
56
|
+
}, [e]), b = n(() => {
|
|
57
|
+
_.current = !0;
|
|
58
|
+
}, []), x = n(() => {
|
|
59
|
+
_.current = !1;
|
|
60
|
+
}, []), S = n((t) => {
|
|
61
|
+
if (!_.current) return;
|
|
62
|
+
let n = h.current, r = e.current;
|
|
63
|
+
if (!n || !r) return;
|
|
64
|
+
let i = n.getBoundingClientRect(), a = (t.clientY - i.top) / (n.height / r.scrollHeight) - r.clientHeight / 2;
|
|
65
|
+
r.scrollTop = Math.max(0, a);
|
|
66
|
+
}, [e]);
|
|
67
|
+
return /* @__PURE__ */ a("div", {
|
|
68
|
+
ref: g,
|
|
69
|
+
"data-component": "MarkdownMinimap",
|
|
70
|
+
className: t("cs-component-markdown-minimap-14", m),
|
|
71
|
+
children: /* @__PURE__ */ a("canvas", {
|
|
72
|
+
ref: h,
|
|
73
|
+
className: "cs-component-markdown-minimap-15 ",
|
|
74
|
+
onClick: y,
|
|
75
|
+
onMouseDown: b,
|
|
76
|
+
onMouseUp: x,
|
|
77
|
+
onMouseLeave: x,
|
|
78
|
+
onMouseMove: S
|
|
79
|
+
})
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
var h = e(m);
|
|
83
|
+
//#endregion
|
|
84
|
+
export { h as MarkdownMinimap };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ComponentType } from "react";
|
|
2
|
+
export type MarkdownComponents = Record<string, React.ElementType>;
|
|
3
|
+
export interface MarkdownRendererProps {
|
|
4
|
+
content: string;
|
|
5
|
+
components: MarkdownComponents;
|
|
6
|
+
}
|
|
7
|
+
export interface MarkdownViewerBaseProps {
|
|
8
|
+
content: string;
|
|
9
|
+
outline?: boolean;
|
|
10
|
+
minimap?: boolean;
|
|
11
|
+
outlineCollapsed?: boolean;
|
|
12
|
+
minimapCollapsed?: boolean;
|
|
13
|
+
/** When true, render as an inline embed — no internal scroll, no
|
|
14
|
+
* outline/minimap panels, flows with the parent's natural layout.
|
|
15
|
+
* Use for embedding rendered markdown inside a scrollable page where
|
|
16
|
+
* the outer page is the only scroll surface. Default false. */
|
|
17
|
+
inline?: boolean;
|
|
18
|
+
/** Compact prose typography for narrow side panes. */
|
|
19
|
+
density?: "default" | "dense";
|
|
20
|
+
onLinkClick?: (href: string) => void;
|
|
21
|
+
onImageSrc?: (src: string) => Promise<string | undefined> | string | undefined;
|
|
22
|
+
/** Opt-in renderers keyed by fenced-code language (for example, `mermaid`). */
|
|
23
|
+
codeRenderers?: Record<string, React.ComponentType<{
|
|
24
|
+
code: string;
|
|
25
|
+
}>>;
|
|
26
|
+
onHeadingNavigate?: (slug: string) => void;
|
|
27
|
+
initialHeading?: string | null;
|
|
28
|
+
className?: string;
|
|
29
|
+
/** Loading state: render skeleton lines instead of content. */
|
|
30
|
+
loading?: boolean;
|
|
31
|
+
/** Error state: when set, render the error block. */
|
|
32
|
+
error?: Error | string | null;
|
|
33
|
+
/** Override the error primary text (default: "Something went wrong"). */
|
|
34
|
+
errorMessage?: string;
|
|
35
|
+
/** Retry handler — when provided, renders a Retry button in the error block. */
|
|
36
|
+
onRetry?: () => void;
|
|
37
|
+
/** Empty state primary text. Default: "No content." */
|
|
38
|
+
emptyMessage?: string;
|
|
39
|
+
/** Empty state secondary text. */
|
|
40
|
+
emptyHint?: string;
|
|
41
|
+
/** Empty state CTA. */
|
|
42
|
+
emptyAction?: {
|
|
43
|
+
label: string;
|
|
44
|
+
onClick: () => void;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export interface MarkdownViewerProps extends MarkdownViewerBaseProps {
|
|
48
|
+
}
|
|
49
|
+
export declare function createMarkdownViewer<Extra extends object = Record<never, never>>(Renderer: ComponentType<MarkdownRendererProps & Extra>): import("react").ForwardRefExoticComponent<import("react").PropsWithoutRef<MarkdownViewerBaseProps & Extra> & import("react").RefAttributes<HTMLDivElement>>;
|
|
50
|
+
export declare const MarkdownViewer: import("react").ForwardRefExoticComponent<MarkdownViewerBaseProps & Record<never, never> & import("react").RefAttributes<HTMLDivElement>>;
|
|
51
|
+
//# sourceMappingURL=MarkdownViewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownViewer.d.ts","sourceRoot":"","sources":["../../src/components/MarkdownViewer.tsx"],"names":[],"mappings":"AAKA,OAAO,EAML,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AAsBf,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;AAEnE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;oEAGgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/E,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACtE,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CACtD;AAED,MAAM,WAAW,mBAAoB,SAAQ,uBAAuB;CAAG;AAmtBvE,wBAAgB,oBAAoB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAC9E,QAAQ,EAAE,aAAa,CAAC,qBAAqB,GAAG,KAAK,CAAC,+JAYvD;AAED,eAAO,MAAM,cAAc,2IAA4C,CAAC"}
|