@treenity/react 3.0.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/AclEditor.d.ts +11 -0
- package/dist/AclEditor.d.ts.map +1 -0
- package/dist/AclEditor.js +152 -0
- package/dist/AclEditor.js.map +1 -0
- package/dist/App.d.ts +2 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +521 -0
- package/dist/App.js.map +1 -0
- package/dist/Inspector.d.ts +12 -0
- package/dist/Inspector.d.ts.map +1 -0
- package/dist/Inspector.js +360 -0
- package/dist/Inspector.js.map +1 -0
- package/dist/Tree.d.ts +16 -0
- package/dist/Tree.d.ts.map +1 -0
- package/dist/Tree.js +100 -0
- package/dist/Tree.js.map +1 -0
- package/dist/ViewPage.d.ts +5 -0
- package/dist/ViewPage.d.ts.map +1 -0
- package/dist/ViewPage.js +13 -0
- package/dist/ViewPage.js.map +1 -0
- package/dist/bind/computed.d.ts +9 -0
- package/dist/bind/computed.d.ts.map +1 -0
- package/dist/bind/computed.js +61 -0
- package/dist/bind/computed.js.map +1 -0
- package/dist/bind/engine.d.ts +3 -0
- package/dist/bind/engine.d.ts.map +1 -0
- package/dist/bind/engine.js +184 -0
- package/dist/bind/engine.js.map +1 -0
- package/dist/bind/eval.d.ts +13 -0
- package/dist/bind/eval.d.ts.map +1 -0
- package/dist/bind/eval.js +97 -0
- package/dist/bind/eval.js.map +1 -0
- package/dist/bind/hook.d.ts +8 -0
- package/dist/bind/hook.d.ts.map +1 -0
- package/dist/bind/hook.js +99 -0
- package/dist/bind/hook.js.map +1 -0
- package/dist/bind/parse.d.ts +19 -0
- package/dist/bind/parse.d.ts.map +1 -0
- package/dist/bind/parse.js +86 -0
- package/dist/bind/parse.js.map +1 -0
- package/dist/bind/pipes.d.ts +4 -0
- package/dist/bind/pipes.d.ts.map +1 -0
- package/dist/bind/pipes.js +43 -0
- package/dist/bind/pipes.js.map +1 -0
- package/dist/cache.d.ts +27 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +236 -0
- package/dist/cache.js.map +1 -0
- package/dist/client-tree.d.ts +9 -0
- package/dist/client-tree.d.ts.map +1 -0
- package/dist/client-tree.js +14 -0
- package/dist/client-tree.js.map +1 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +10 -0
- package/dist/client.js.map +1 -0
- package/dist/components/ui/accordion.d.ts +8 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/accordion.js +18 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +19 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/button.d.ts +11 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +31 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +4 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +7 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +37 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +14 -0
- package/dist/components/ui/drawer.d.ts.map +1 -0
- package/dist/components/ui/drawer.js +35 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +7 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.d.ts +5 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/label.js +8 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/popover.d.ts +11 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +26 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/progress.d.ts +5 -0
- package/dist/components/ui/progress.d.ts.map +1 -0
- package/dist/components/ui/progress.js +9 -0
- package/dist/components/ui/progress.js.map +1 -0
- package/dist/components/ui/select.d.ts +16 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +39 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/slider.d.ts +5 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/slider.js +15 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.d.ts +4 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/sonner.js +21 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/switch.d.ts +7 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/switch.js +9 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +4 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +7 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +8 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +18 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/context/index.d.ts +31 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +98 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/hooks.d.ts +21 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +156 -0
- package/dist/hooks.js.map +1 -0
- package/dist/idb.d.ts +13 -0
- package/dist/idb.d.ts.map +1 -0
- package/dist/idb.js +67 -0
- package/dist/idb.js.map +1 -0
- package/dist/lib/minimd.d.ts +3 -0
- package/dist/lib/minimd.d.ts.map +1 -0
- package/dist/lib/minimd.js +97 -0
- package/dist/lib/minimd.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/load-client.d.ts +2 -0
- package/dist/load-client.d.ts.map +1 -0
- package/dist/load-client.js +6 -0
- package/dist/load-client.js.map +1 -0
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +16 -0
- package/dist/main.js.map +1 -0
- package/dist/mods/editor-ui/client.d.ts +6 -0
- package/dist/mods/editor-ui/client.d.ts.map +1 -0
- package/dist/mods/editor-ui/client.js +8 -0
- package/dist/mods/editor-ui/client.js.map +1 -0
- package/dist/mods/editor-ui/default-view.d.ts +2 -0
- package/dist/mods/editor-ui/default-view.d.ts.map +1 -0
- package/dist/mods/editor-ui/default-view.js +71 -0
- package/dist/mods/editor-ui/default-view.js.map +1 -0
- package/dist/mods/editor-ui/dir-view.d.ts +2 -0
- package/dist/mods/editor-ui/dir-view.d.ts.map +1 -0
- package/dist/mods/editor-ui/dir-view.js +42 -0
- package/dist/mods/editor-ui/dir-view.js.map +1 -0
- package/dist/mods/editor-ui/form-fields.d.ts +6 -0
- package/dist/mods/editor-ui/form-fields.d.ts.map +1 -0
- package/dist/mods/editor-ui/form-fields.js +401 -0
- package/dist/mods/editor-ui/form-fields.js.map +1 -0
- package/dist/mods/editor-ui/layout-view.d.ts +2 -0
- package/dist/mods/editor-ui/layout-view.d.ts.map +1 -0
- package/dist/mods/editor-ui/layout-view.js +22 -0
- package/dist/mods/editor-ui/layout-view.js.map +1 -0
- package/dist/mods/editor-ui/list-items.d.ts +2 -0
- package/dist/mods/editor-ui/list-items.d.ts.map +1 -0
- package/dist/mods/editor-ui/list-items.js +38 -0
- package/dist/mods/editor-ui/list-items.js.map +1 -0
- package/dist/mods/editor-ui/node-utils.d.ts +10 -0
- package/dist/mods/editor-ui/node-utils.d.ts.map +1 -0
- package/dist/mods/editor-ui/node-utils.js +76 -0
- package/dist/mods/editor-ui/node-utils.js.map +1 -0
- package/dist/mods/editor-ui/user-view.d.ts +2 -0
- package/dist/mods/editor-ui/user-view.d.ts.map +1 -0
- package/dist/mods/editor-ui/user-view.js +47 -0
- package/dist/mods/editor-ui/user-view.js.map +1 -0
- package/dist/mods/treenity/client.d.ts +4 -0
- package/dist/mods/treenity/client.d.ts.map +1 -0
- package/dist/mods/treenity/client.js +6 -0
- package/dist/mods/treenity/client.js.map +1 -0
- package/dist/mods/treenity/groups/index.d.ts +2 -0
- package/dist/mods/treenity/groups/index.d.ts.map +1 -0
- package/dist/mods/treenity/groups/index.js +27 -0
- package/dist/mods/treenity/groups/index.js.map +1 -0
- package/dist/mods/treenity/preview.d.ts +6 -0
- package/dist/mods/treenity/preview.d.ts.map +1 -0
- package/dist/mods/treenity/preview.js +95 -0
- package/dist/mods/treenity/preview.js.map +1 -0
- package/dist/mods/treenity/ref-view.d.ts +2 -0
- package/dist/mods/treenity/ref-view.d.ts.map +1 -0
- package/dist/mods/treenity/ref-view.js +29 -0
- package/dist/mods/treenity/ref-view.js.map +1 -0
- package/dist/mods/treenity/schema-form.d.ts +2 -0
- package/dist/mods/treenity/schema-form.d.ts.map +1 -0
- package/dist/mods/treenity/schema-form.js +38 -0
- package/dist/mods/treenity/schema-form.js.map +1 -0
- package/dist/mods/treenity/seed.d.ts +2 -0
- package/dist/mods/treenity/seed.d.ts.map +1 -0
- package/dist/mods/treenity/seed.js +53 -0
- package/dist/mods/treenity/seed.js.map +1 -0
- package/dist/mods/treenity/server.d.ts +2 -0
- package/dist/mods/treenity/server.d.ts.map +1 -0
- package/dist/mods/treenity/server.js +2 -0
- package/dist/mods/treenity/server.js.map +1 -0
- package/dist/mods/treenity/type-view.d.ts +2 -0
- package/dist/mods/treenity/type-view.d.ts.map +1 -0
- package/dist/mods/treenity/type-view.js +36 -0
- package/dist/mods/treenity/type-view.js.map +1 -0
- package/dist/remote-tree.d.ts +6 -0
- package/dist/remote-tree.d.ts.map +1 -0
- package/dist/remote-tree.js +18 -0
- package/dist/remote-tree.js.map +1 -0
- package/dist/schema-loader.d.ts +19 -0
- package/dist/schema-loader.d.ts.map +1 -0
- package/dist/schema-loader.js +63 -0
- package/dist/schema-loader.js.map +1 -0
- package/dist/trpc.d.ts +187 -0
- package/dist/trpc.d.ts.map +1 -0
- package/dist/trpc.js +21 -0
- package/dist/trpc.js.map +1 -0
- package/package.json +88 -0
- package/src/AclEditor.tsx +330 -0
- package/src/App.tsx +775 -0
- package/src/CLAUDE.md +16 -0
- package/src/Inspector.tsx +857 -0
- package/src/Tree.tsx +237 -0
- package/src/ViewPage.tsx +45 -0
- package/src/bind/bind.test.ts +316 -0
- package/src/bind/computed.ts +64 -0
- package/src/bind/engine.ts +198 -0
- package/src/bind/eval.ts +108 -0
- package/src/bind/hook.ts +112 -0
- package/src/bind/parse.ts +104 -0
- package/src/bind/pipes.ts +71 -0
- package/src/cache.test.ts +139 -0
- package/src/cache.ts +244 -0
- package/src/client-tree.test.ts +116 -0
- package/src/client-tree.ts +24 -0
- package/src/client.ts +11 -0
- package/src/components/ui/accordion.tsx +63 -0
- package/src/components/ui/badge.tsx +27 -0
- package/src/components/ui/button.tsx +44 -0
- package/src/components/ui/checkbox.tsx +19 -0
- package/src/components/ui/dialog.tsx +156 -0
- package/src/components/ui/drawer.tsx +132 -0
- package/src/components/ui/input.tsx +19 -0
- package/src/components/ui/label.tsx +21 -0
- package/src/components/ui/popover.tsx +86 -0
- package/src/components/ui/progress.tsx +30 -0
- package/src/components/ui/select.tsx +189 -0
- package/src/components/ui/slider.tsx +62 -0
- package/src/components/ui/sonner.tsx +32 -0
- package/src/components/ui/switch.tsx +34 -0
- package/src/components/ui/textarea.tsx +17 -0
- package/src/components/ui/tooltip.tsx +56 -0
- package/src/context/index.tsx +131 -0
- package/src/context.ts +1 -0
- package/src/hooks.ts +208 -0
- package/src/idb.ts +80 -0
- package/src/index.html +14 -0
- package/src/lib/minimd.css +28 -0
- package/src/lib/minimd.ts +95 -0
- package/src/lib/utils.ts +6 -0
- package/src/load-client.ts +5 -0
- package/src/main.tsx +22 -0
- package/src/mods/editor-ui/CLAUDE.md +3 -0
- package/src/mods/editor-ui/client.ts +8 -0
- package/src/mods/editor-ui/default-view.tsx +148 -0
- package/src/mods/editor-ui/dir-view.tsx +91 -0
- package/src/mods/editor-ui/form-fields.tsx +861 -0
- package/src/mods/editor-ui/layout-view.tsx +62 -0
- package/src/mods/editor-ui/list-items.tsx +63 -0
- package/src/mods/editor-ui/node-utils.ts +84 -0
- package/src/mods/editor-ui/user-view.tsx +101 -0
- package/src/mods/treenity/CLAUDE.md +7 -0
- package/src/mods/treenity/client.ts +6 -0
- package/src/mods/treenity/groups/index.tsx +65 -0
- package/src/mods/treenity/preview.tsx +133 -0
- package/src/mods/treenity/ref-view.tsx +87 -0
- package/src/mods/treenity/schema-form.tsx +65 -0
- package/src/mods/treenity/seed.ts +56 -0
- package/src/mods/treenity/server.ts +1 -0
- package/src/mods/treenity/type-view.tsx +116 -0
- package/src/remote-tree.test.ts +142 -0
- package/src/remote-tree.ts +25 -0
- package/src/schema-loader.ts +84 -0
- package/src/style.css +1269 -0
- package/src/trpc.ts +27 -0
- package/src/vite-env.d.ts +3 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// Inspector — view + edit panel for selected node (Unity-style inspector)
|
|
3
|
+
// Shell only: delegates rendering to registered views, provides generic edit UI
|
|
4
|
+
import { Render, RenderContext } from '#context';
|
|
5
|
+
import { getActions, getActionSchema, getComponents, getPlainFields, getSchema, getViewContexts, pickDefaultContext, } from '#mods/editor-ui/node-utils';
|
|
6
|
+
import { resolve, resolveExact } from '@treenity/core/core';
|
|
7
|
+
import { createElement, useEffect, useRef, useState } from 'react';
|
|
8
|
+
import { AclEditor } from './AclEditor';
|
|
9
|
+
import * as cache from './cache';
|
|
10
|
+
import { set, usePath } from './hooks';
|
|
11
|
+
import { useSchema } from './schema-loader';
|
|
12
|
+
import { trpc } from './trpc';
|
|
13
|
+
// Breadcrumb from path
|
|
14
|
+
function Breadcrumb({ path, onSelect }) {
|
|
15
|
+
if (path === '/')
|
|
16
|
+
return (_jsx("div", { className: "editor-breadcrumb", children: _jsx("span", { children: "/" }) }));
|
|
17
|
+
const parts = path.split('/').filter(Boolean);
|
|
18
|
+
const crumbs = [{ label: '/', path: '/' }];
|
|
19
|
+
let cur = '';
|
|
20
|
+
for (const p of parts) {
|
|
21
|
+
cur += '/' + p;
|
|
22
|
+
crumbs.push({ label: p, path: cur });
|
|
23
|
+
}
|
|
24
|
+
return (_jsx("div", { className: "editor-breadcrumb", children: crumbs.map((c, i) => (_jsxs("span", { children: [i > 0 && _jsx("span", { className: "sep", children: "/" }), _jsx("span", { onClick: () => onSelect(c.path), children: c.label === '/' ? 'root' : c.label })] }, c.path))) }));
|
|
25
|
+
}
|
|
26
|
+
// Pretty-print action result value
|
|
27
|
+
function ResultView({ value }) {
|
|
28
|
+
if (value === undefined || value === null)
|
|
29
|
+
return null;
|
|
30
|
+
if (typeof value !== 'object')
|
|
31
|
+
return _jsx("span", { className: "font-mono text-[11px]", children: String(value) });
|
|
32
|
+
// Object/array with typed $type → render via Render
|
|
33
|
+
if ('$type' in value) {
|
|
34
|
+
return _jsx(Render, { value: value });
|
|
35
|
+
}
|
|
36
|
+
// Plain object — key/value pairs
|
|
37
|
+
const entries = Object.entries(value);
|
|
38
|
+
if (entries.length === 0)
|
|
39
|
+
return _jsx("span", { className: "text-muted-foreground text-[11px]", children: "empty" });
|
|
40
|
+
return (_jsx("div", { className: "flex flex-col gap-0.5", children: entries.map(([k, v]) => (_jsxs("div", { className: "flex gap-2 text-[11px]", children: [_jsx("span", { className: "text-muted-foreground shrink-0", children: k }), _jsx("span", { className: "font-mono text-foreground/80 truncate", children: typeof v === 'object' && v !== null ? JSON.stringify(v) : String(v ?? '') })] }, k))) }));
|
|
41
|
+
}
|
|
42
|
+
// Action pills — compact action buttons that expand on click
|
|
43
|
+
function ActionCardList({ path, componentName, compType, toast, onActionComplete, }) {
|
|
44
|
+
const schema = useSchema(compType);
|
|
45
|
+
const [expanded, setExpanded] = useState(null);
|
|
46
|
+
const [paramsText, setParamsText] = useState({});
|
|
47
|
+
const [schemaData, setSchemaData] = useState({});
|
|
48
|
+
const [running, setRunning] = useState(null);
|
|
49
|
+
const [results, setResults] = useState({});
|
|
50
|
+
const [resultMode, setResultMode] = useState({});
|
|
51
|
+
if (schema === undefined)
|
|
52
|
+
return null;
|
|
53
|
+
const actions = getActions(compType, schema);
|
|
54
|
+
if (actions.length === 0)
|
|
55
|
+
return null;
|
|
56
|
+
async function run(a) {
|
|
57
|
+
setRunning(a);
|
|
58
|
+
try {
|
|
59
|
+
const actionSchema = getActionSchema(compType, a);
|
|
60
|
+
let data = {};
|
|
61
|
+
if (actionSchema) {
|
|
62
|
+
data = schemaData[a] ?? {};
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const raw = (paramsText[a] ?? '').trim();
|
|
66
|
+
if (raw && raw !== '{}') {
|
|
67
|
+
try {
|
|
68
|
+
data = JSON.parse(raw);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
toast('Invalid JSON params');
|
|
72
|
+
setRunning(null);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const result = await trpc.execute.mutate({ path, key: componentName, action: a, data });
|
|
78
|
+
const fresh = (await trpc.get.query({ path, watch: true }));
|
|
79
|
+
if (fresh)
|
|
80
|
+
cache.put(fresh);
|
|
81
|
+
onActionComplete?.();
|
|
82
|
+
setResults((prev) => ({ ...prev, [a]: { ok: true, value: result } }));
|
|
83
|
+
setExpanded(a);
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
setResults((prev) => ({
|
|
87
|
+
...prev,
|
|
88
|
+
[a]: { ok: false, value: e instanceof Error ? e.message : String(e) },
|
|
89
|
+
}));
|
|
90
|
+
setExpanded(a);
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
setRunning(null);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return (_jsxs("div", { className: "action-pills", children: [_jsx("div", { className: "flex flex-wrap gap-1.5", children: actions.map((a) => (_jsxs("button", { className: `action-pill${expanded === a ? ' active' : ''}${running === a ? ' running' : ''}`, onClick: () => setExpanded(expanded === a ? null : a), children: [running === a ? '...' : a, results[a] && !results[a].ok && expanded !== a && (_jsx("span", { className: "ml-1 text-destructive", children: "!" })), results[a]?.ok && expanded !== a && (_jsx("span", { className: "ml-1 text-primary/60", children: "\u2713" }))] }, a))) }), expanded && (() => {
|
|
97
|
+
const a = expanded;
|
|
98
|
+
const actionSchema = getActionSchema(compType, a);
|
|
99
|
+
const hasParams = actionSchema !== null && Object.keys(actionSchema.properties).length > 0;
|
|
100
|
+
const noParams = actionSchema !== null && Object.keys(actionSchema.properties).length === 0;
|
|
101
|
+
const result = results[a];
|
|
102
|
+
const mode = resultMode[a] ?? 'pretty';
|
|
103
|
+
return (_jsxs("div", { className: "action-detail", children: [hasParams && (_jsx("div", { className: "flex flex-col gap-1.5 mb-2", children: Object.entries(actionSchema.properties).map(([field, prop]) => {
|
|
104
|
+
const p = prop;
|
|
105
|
+
const val = (schemaData[a] ?? {})[field];
|
|
106
|
+
const setField = (v) => setSchemaData((prev) => ({
|
|
107
|
+
...prev,
|
|
108
|
+
[a]: { ...(prev[a] ?? {}), [field]: v },
|
|
109
|
+
}));
|
|
110
|
+
return (_jsxs("div", { className: "action-detail-field", children: [_jsx("label", { children: p.title ?? field }), p.type === 'number' || p.format === 'number' ? (_jsx("input", { type: "number", value: String(val ?? 0), onChange: (e) => setField(Number(e.target.value)) })) : p.type === 'boolean' ? (_jsxs("label", { className: "flex items-center gap-1.5 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: !!val, className: "w-auto", onChange: (e) => setField(e.target.checked) }), _jsx("span", { className: "text-[11px]", children: val ? 'true' : 'false' })] })) : (_jsx("input", { value: String(val ?? ''), onChange: (e) => setField(e.target.value) }))] }, field));
|
|
111
|
+
}) })), !hasParams && !noParams && (_jsx("textarea", { className: "action-params-input mb-2", value: paramsText[a] ?? '{}', onChange: (e) => setParamsText((prev) => ({ ...prev, [a]: e.target.value })), spellCheck: false, rows: 2 })), _jsxs("button", { className: "action-run-btn", disabled: running !== null, onClick: () => run(a), children: [running === a ? '...' : '▶', " ", a] }), result && (_jsx("div", { className: `action-result-box${result.ok ? '' : ' error'}`, children: !result.ok ? (_jsx("span", { className: "text-destructive font-mono text-[11px]", children: String(result.value) })) : result.value === undefined || result.value === null ? (_jsx("span", { className: "text-primary text-[11px]", children: "\u2713 done" })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center justify-between mb-1", children: [_jsx("span", { className: "text-[10px] text-muted-foreground uppercase tracking-wider", children: "Result" }), typeof result.value === 'object' && (_jsxs("div", { className: "flex gap-0.5", children: [_jsx("button", { className: `action-mode-btn${mode === 'pretty' ? ' active' : ''}`, onClick: () => setResultMode((p) => ({ ...p, [a]: 'pretty' })), children: "View" }), _jsx("button", { className: `action-mode-btn${mode === 'json' ? ' active' : ''}`, onClick: () => setResultMode((p) => ({ ...p, [a]: 'json' })), children: "JSON" })] }))] }), mode === 'json' ? (_jsx("pre", { className: "text-[11px] font-mono text-foreground/60 whitespace-pre-wrap break-all leading-relaxed", children: JSON.stringify(result.value, null, 2) })) : (_jsx(ResultView, { value: result.value }))] })) }))] }));
|
|
112
|
+
})()] }));
|
|
113
|
+
}
|
|
114
|
+
function renderField(name, fieldSchema, plainData, setPlainData) {
|
|
115
|
+
const ctx = fieldSchema.readOnly ? 'react' : 'react:form';
|
|
116
|
+
const handler = resolveExact(fieldSchema.type, ctx) ?? resolveExact('string', ctx);
|
|
117
|
+
if (!handler)
|
|
118
|
+
return (_jsxs("div", { className: "text-[--danger] text-xs", children: ["No form handler: ", fieldSchema.type] }, name));
|
|
119
|
+
const fieldData = {
|
|
120
|
+
$type: fieldSchema.type,
|
|
121
|
+
value: plainData[name],
|
|
122
|
+
label: fieldSchema.label,
|
|
123
|
+
placeholder: fieldSchema.placeholder,
|
|
124
|
+
};
|
|
125
|
+
if (fieldSchema.items)
|
|
126
|
+
fieldData.items = fieldSchema.items;
|
|
127
|
+
if (fieldSchema.enum)
|
|
128
|
+
fieldData.enum = fieldSchema.enum;
|
|
129
|
+
if (fieldSchema.refType)
|
|
130
|
+
fieldData.refType = fieldSchema.refType;
|
|
131
|
+
const isComplex = fieldSchema.type === 'object' || fieldSchema.type === 'array';
|
|
132
|
+
return (_jsxs("div", { className: isComplex ? 'field stack' : 'field', children: [fieldSchema.type !== 'boolean' && _jsx("label", { children: fieldSchema.label }), createElement(handler, {
|
|
133
|
+
value: fieldData,
|
|
134
|
+
onChange: fieldSchema.readOnly
|
|
135
|
+
? undefined
|
|
136
|
+
: (next) => setPlainData((prev) => ({ ...prev, [name]: next.value })),
|
|
137
|
+
})] }, name));
|
|
138
|
+
}
|
|
139
|
+
// Inline string-array editor for raw component fields without schema
|
|
140
|
+
function StringArrayField({ value, onChange, }) {
|
|
141
|
+
const [input, setInput] = useState('');
|
|
142
|
+
const isStrings = value.every((v) => typeof v === 'string');
|
|
143
|
+
if (!isStrings) {
|
|
144
|
+
return (_jsx("textarea", { value: JSON.stringify(value, null, 2), onChange: (e) => {
|
|
145
|
+
try {
|
|
146
|
+
onChange(JSON.parse(e.target.value));
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
/* typing */
|
|
150
|
+
}
|
|
151
|
+
} }));
|
|
152
|
+
}
|
|
153
|
+
const tags = value;
|
|
154
|
+
return (_jsxs("div", { className: "flex-1 space-y-1", children: [_jsx("div", { className: "flex flex-wrap gap-1", children: tags.map((tag, i) => (_jsxs("span", { className: "inline-flex items-center gap-0.5 text-[11px] font-mono bg-muted text-foreground/70 px-1.5 py-0.5 rounded", children: [tag, _jsx("button", { type: "button", className: "ml-0.5 border-0 bg-transparent p-0 text-muted-foreground/40 hover:text-foreground leading-none cursor-pointer", onClick: () => onChange(tags.filter((_, j) => j !== i)), children: "\u00D7" })] }, i))) }), _jsx("input", { className: "text-xs w-full", placeholder: "Add item...", value: input, onChange: (e) => setInput(e.target.value), onKeyDown: (e) => {
|
|
155
|
+
if (e.key !== 'Enter')
|
|
156
|
+
return;
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
const t = input.trim();
|
|
159
|
+
if (t && !tags.includes(t))
|
|
160
|
+
onChange([...tags, t]);
|
|
161
|
+
setInput('');
|
|
162
|
+
} })] }));
|
|
163
|
+
}
|
|
164
|
+
function NodeCard({ path, type, onChangeType, }) {
|
|
165
|
+
const [open, setOpen] = useState(false);
|
|
166
|
+
return (_jsxs("div", { className: "card", children: [_jsxs("div", { className: "card-header cursor-pointer select-none", onClick: () => setOpen((v) => !v), children: [_jsx("span", { children: "Node" }), _jsxs("span", { className: "flex items-center gap-2 normal-case tracking-normal font-normal text-[11px] font-mono text-foreground/50", children: [path, _jsx("span", { className: "text-primary", children: type }), open ? (_jsx("svg", { className: "h-3 w-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "m6 9 6 6 6-6" }) })) : (_jsx("svg", { className: "h-3 w-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "m9 18 6-6-6-6" }) }))] })] }), open && (_jsxs("div", { className: "card-body", children: [_jsxs("div", { className: "field", children: [_jsx("label", { children: "$path" }), _jsx("input", { value: path, readOnly: true })] }), _jsxs("div", { className: "field", children: [_jsx("label", { children: "$type" }), _jsx("input", { value: type, onChange: (e) => onChangeType(e.target.value) })] })] }))] }));
|
|
167
|
+
}
|
|
168
|
+
function ComponentBody({ ctype, cdata, setCD, path, componentName, toast, onActionComplete, }) {
|
|
169
|
+
const cschema = useSchema(ctype);
|
|
170
|
+
if (cschema === undefined)
|
|
171
|
+
return null;
|
|
172
|
+
return (_jsxs("div", { className: "card-body", children: [cschema && Object.keys(cschema.properties).length > 0 ? (Object.entries(cschema.properties).map(([field, prop]) => {
|
|
173
|
+
const p = prop;
|
|
174
|
+
return renderField(field, {
|
|
175
|
+
type: p.format ?? p.type, label: p.title ?? field, placeholder: p.description,
|
|
176
|
+
readOnly: p.readOnly, enum: p.enum, items: p.items, refType: p.refType,
|
|
177
|
+
}, cdata, setCD);
|
|
178
|
+
})) : Object.keys(cdata).length > 0 ? (Object.entries(cdata).map(([k, v]) => (_jsxs("div", { className: `field${Array.isArray(v) || (typeof v === 'object' && v !== null) ? ' stack' : ''}`, children: [_jsx("label", { children: k }), typeof v === 'boolean' ? (_jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: !!cdata[k], className: "w-auto", onChange: (e) => setCD((prev) => ({ ...prev, [k]: e.target.checked })) }), cdata[k] ? 'true' : 'false'] })) : typeof v === 'number' ? (_jsx("input", { type: "number", value: String(cdata[k] ?? 0), onChange: (e) => setCD((prev) => ({ ...prev, [k]: Number(e.target.value) })) })) : Array.isArray(v) ? (_jsx(StringArrayField, { value: cdata[k], onChange: (next) => setCD((prev) => ({ ...prev, [k]: next })) })) : typeof v === 'object' ? ((() => {
|
|
179
|
+
const h = resolve('object', 'react:form');
|
|
180
|
+
return h
|
|
181
|
+
? createElement(h, {
|
|
182
|
+
value: { $type: 'object', value: cdata[k] },
|
|
183
|
+
onChange: (next) => setCD((prev) => ({ ...prev, [k]: next.value })),
|
|
184
|
+
})
|
|
185
|
+
: _jsx("pre", { className: "text-[11px] font-mono text-foreground/60", children: JSON.stringify(cdata[k], null, 2) });
|
|
186
|
+
})()) : (_jsx("input", { value: String(cdata[k] ?? ''), onChange: (e) => setCD((prev) => ({ ...prev, [k]: e.target.value })) }))] }, k)))) : (_jsx("pre", { className: "text-[11px] font-mono text-foreground/60 bg-muted/30 rounded p-2 whitespace-pre-wrap", children: JSON.stringify(cdata, null, 2) })), _jsx(ActionCardList, { path: path, componentName: componentName, compType: ctype, compData: cdata, toast: toast, onActionComplete: onActionComplete })] }));
|
|
187
|
+
}
|
|
188
|
+
export function Inspector({ path, currentUserId, onDelete, onAddComponent, onSelect, onSetRoot, toast }) {
|
|
189
|
+
const node = usePath(path);
|
|
190
|
+
const [context, setContext] = useState('react');
|
|
191
|
+
const [editing, setEditing] = useState(false);
|
|
192
|
+
const [nodeType, setNodeType] = useState('');
|
|
193
|
+
const [compTexts, setCompTexts] = useState({});
|
|
194
|
+
const [compData, setCompData] = useState({});
|
|
195
|
+
const [plainData, setPlainData] = useState({});
|
|
196
|
+
const [tab, setTab] = useState('properties');
|
|
197
|
+
const [jsonText, setJsonText] = useState('');
|
|
198
|
+
const [collapsed, setCollapsed] = useState(new Set());
|
|
199
|
+
const [aclOwner, setAclOwner] = useState('');
|
|
200
|
+
const [aclRules, setAclRules] = useState([]);
|
|
201
|
+
const [dirty, setDirty] = useState(false);
|
|
202
|
+
const [stale, setStale] = useState(false);
|
|
203
|
+
const syncedPathRef = useRef(null);
|
|
204
|
+
const syncedRevRef = useRef(null);
|
|
205
|
+
function syncFromNode(n) {
|
|
206
|
+
setNodeType(n.$type);
|
|
207
|
+
setAclOwner(n.$owner ?? '');
|
|
208
|
+
setAclRules(n.$acl ? [...n.$acl] : []);
|
|
209
|
+
const texts = {};
|
|
210
|
+
const cdata = {};
|
|
211
|
+
for (const [name, comp] of getComponents(n)) {
|
|
212
|
+
texts[name] = JSON.stringify(comp, null, 2);
|
|
213
|
+
const d = {};
|
|
214
|
+
for (const [k, v] of Object.entries(comp)) {
|
|
215
|
+
if (!k.startsWith('$'))
|
|
216
|
+
d[k] = v;
|
|
217
|
+
}
|
|
218
|
+
cdata[name] = d;
|
|
219
|
+
}
|
|
220
|
+
setCompTexts(texts);
|
|
221
|
+
setCompData(cdata);
|
|
222
|
+
setPlainData(getPlainFields(n));
|
|
223
|
+
setJsonText(JSON.stringify(n, null, 2));
|
|
224
|
+
setTab('properties');
|
|
225
|
+
}
|
|
226
|
+
useEffect(() => {
|
|
227
|
+
if (!node)
|
|
228
|
+
return;
|
|
229
|
+
const pathChanged = node.$path !== syncedPathRef.current;
|
|
230
|
+
if (pathChanged) {
|
|
231
|
+
setContext(pickDefaultContext(node.$type));
|
|
232
|
+
syncFromNode(node);
|
|
233
|
+
syncedPathRef.current = node.$path;
|
|
234
|
+
syncedRevRef.current = node.$rev;
|
|
235
|
+
setDirty(false);
|
|
236
|
+
setStale(false);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (node.$rev !== syncedRevRef.current) {
|
|
240
|
+
if (dirty) {
|
|
241
|
+
setStale(true);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
syncFromNode(node);
|
|
245
|
+
syncedRevRef.current = node.$rev;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}, [node?.$path, node?.$rev]);
|
|
249
|
+
// Dirty-tracking wrappers — mark form as edited on any user change
|
|
250
|
+
const dSetNodeType = (v) => { setNodeType(v); setDirty(true); };
|
|
251
|
+
const dSetCompData = (v) => { setCompData(v); setDirty(true); };
|
|
252
|
+
const dSetPlainData = (v) => { setPlainData(v); setDirty(true); };
|
|
253
|
+
const dSetJsonText = (v) => { setJsonText(v); setDirty(true); };
|
|
254
|
+
const dSetAclOwner = (v) => { setAclOwner(v); setDirty(true); };
|
|
255
|
+
const dSetAclRules = (v) => { setAclRules(v); setDirty(true); };
|
|
256
|
+
function handleReset() {
|
|
257
|
+
if (!node)
|
|
258
|
+
return;
|
|
259
|
+
const current = cache.get(node.$path) ?? node;
|
|
260
|
+
syncFromNode(current);
|
|
261
|
+
syncedRevRef.current = current.$rev;
|
|
262
|
+
setDirty(false);
|
|
263
|
+
setStale(false);
|
|
264
|
+
}
|
|
265
|
+
if (!node) {
|
|
266
|
+
return (_jsx("div", { className: "editor", children: _jsxs("div", { className: "editor-empty", children: [_jsx("div", { className: "icon", children: "\u260D" }), _jsx("p", { children: "Select a node to inspect" })] }) }));
|
|
267
|
+
}
|
|
268
|
+
const nodeName = node.$path === '/' ? '/' : node.$path.slice(node.$path.lastIndexOf('/') + 1);
|
|
269
|
+
const components = getComponents(node);
|
|
270
|
+
const viewContexts = getViewContexts(node.$type, node);
|
|
271
|
+
const schemaHandler = resolve(node.$type, 'schema');
|
|
272
|
+
const schema = schemaHandler ? schemaHandler() : null;
|
|
273
|
+
// Main component: when the node IS the component (its $type has a registered class).
|
|
274
|
+
// Show the class's fields (with defaults as fallback for unset fields).
|
|
275
|
+
const mainCompCls = resolve(node.$type, 'class');
|
|
276
|
+
const mainCompDefaults = mainCompCls ? new mainCompCls() : null;
|
|
277
|
+
async function handleSave() {
|
|
278
|
+
if (!node)
|
|
279
|
+
return;
|
|
280
|
+
let toSave;
|
|
281
|
+
if (tab === 'json') {
|
|
282
|
+
try {
|
|
283
|
+
toSave = JSON.parse(jsonText);
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
toast('Invalid JSON');
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
toSave = { $path: node.$path, $type: nodeType, ...plainData };
|
|
292
|
+
if (aclOwner)
|
|
293
|
+
toSave.$owner = aclOwner;
|
|
294
|
+
if (aclRules.length > 0)
|
|
295
|
+
toSave.$acl = aclRules;
|
|
296
|
+
for (const [name, comp] of components) {
|
|
297
|
+
const ctype = comp.$type;
|
|
298
|
+
const cschema = getSchema(ctype);
|
|
299
|
+
const cd = compData[name];
|
|
300
|
+
if ((cschema || (cd && Object.keys(cd).length > 0)) && cd) {
|
|
301
|
+
toSave[name] = { $type: ctype, ...cd };
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
const text = compTexts[name];
|
|
305
|
+
if (text === undefined)
|
|
306
|
+
continue;
|
|
307
|
+
try {
|
|
308
|
+
toSave[name] = JSON.parse(text);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
toast(`Invalid JSON in component: ${name}`);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
await set(toSave);
|
|
318
|
+
const fresh = cache.get(node.$path);
|
|
319
|
+
if (fresh) {
|
|
320
|
+
syncFromNode(fresh);
|
|
321
|
+
syncedRevRef.current = fresh.$rev;
|
|
322
|
+
}
|
|
323
|
+
setDirty(false);
|
|
324
|
+
setStale(false);
|
|
325
|
+
toast('Saved');
|
|
326
|
+
}
|
|
327
|
+
function handleAdd() {
|
|
328
|
+
if (!node)
|
|
329
|
+
return;
|
|
330
|
+
onAddComponent(node.$path);
|
|
331
|
+
}
|
|
332
|
+
function handleRemoveComponent(name) {
|
|
333
|
+
if (!node)
|
|
334
|
+
return;
|
|
335
|
+
const next = { ...node };
|
|
336
|
+
delete next[name];
|
|
337
|
+
set(next);
|
|
338
|
+
}
|
|
339
|
+
function toggleCollapse(name) {
|
|
340
|
+
setCollapsed((prev) => {
|
|
341
|
+
const next = new Set(prev);
|
|
342
|
+
if (next.has(name))
|
|
343
|
+
next.delete(name);
|
|
344
|
+
else
|
|
345
|
+
next.add(name);
|
|
346
|
+
return next;
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
return (_jsxs("div", { className: "editor", children: [_jsxs("div", { className: "editor-header", children: [_jsx(Breadcrumb, { path: node.$path, onSelect: onSelect }), _jsxs("div", { className: "editor-title", children: [_jsx("h2", { children: nodeName }), _jsx("span", { className: "editor-type-badge", children: node.$type }), _jsx("a", { href: node.$path, target: "_blank", rel: "noopener", className: "text-[11px] text-[--text-3] hover:text-[--accent] no-underline", children: "View \u2197" }), onSetRoot && (_jsx("button", { className: "sm ghost text-[11px]", onClick: () => onSetRoot(node.$path), title: "Focus subtree", children: "\u2302" })), viewContexts.length > 1 && (_jsx("span", { className: "context-buttons", children: viewContexts.map((c) => (_jsx("button", { className: `sm context-btn${context === c ? ' active' : ''}`, onClick: () => setContext(c), children: c }, c))) })), _jsx("span", { className: "spacer" }), _jsx("button", { className: editing ? 'sm' : 'sm primary', onClick: () => setEditing(!editing), children: editing ? 'Close' : 'Edit' }), _jsx("button", { className: "sm danger", onClick: () => {
|
|
350
|
+
if (confirm(`Delete ${node.$path}?`))
|
|
351
|
+
onDelete(node.$path);
|
|
352
|
+
}, children: "Delete" })] })] }), _jsx("div", { className: "editor-body", children: _jsx(RenderContext, { name: context, children: _jsx("div", { className: "node-view", children: _jsx(Render, { value: node }) }) }) }), _jsxs("div", { className: `edit-panel${editing ? ' open' : ''}`, children: [_jsxs("div", { className: "edit-panel-header", children: [_jsxs("span", { children: ["Edit ", nodeName] }), _jsx("button", { className: "sm ghost", onClick: () => setEditing(false), children: "\u2715" })] }), _jsxs("div", { className: "edit-panel-tabs", children: [_jsx("button", { className: `editor-tab${tab === 'properties' ? ' active' : ''}`, onClick: () => setTab('properties'), children: "Properties" }), _jsx("button", { className: `editor-tab${tab === 'json' ? ' active' : ''}`, onClick: () => {
|
|
353
|
+
setTab('json');
|
|
354
|
+
setJsonText(JSON.stringify({ ...node, ...plainData }, null, 2));
|
|
355
|
+
}, children: "JSON" })] }), _jsx("div", { className: "edit-panel-body", children: tab === 'properties' ? (_jsxs(_Fragment, { children: [_jsx(NodeCard, { path: node.$path, type: nodeType, onChangeType: dSetNodeType }), _jsx(AclEditor, { path: node.$path, owner: aclOwner, rules: aclRules, currentUserId: currentUserId, onChange: (o, r) => {
|
|
356
|
+
dSetAclOwner(o);
|
|
357
|
+
dSetAclRules(r);
|
|
358
|
+
} }), (mainCompCls || schema) && (_jsxs("div", { className: "card", children: [_jsx("div", { className: "card-header", children: node.$type }), _jsx(ComponentBody, { ctype: node.$type, cdata: plainData, setCD: (fn) => dSetPlainData(fn), path: node.$path, componentName: "", toast: toast, onActionComplete: handleReset })] })), components.map(([name, comp]) => (_jsxs("div", { className: "card", children: [_jsxs("div", { className: "card-header cursor-pointer select-none", onClick: () => toggleCollapse(name), children: [_jsx("span", { className: "font-mono text-[12px]", children: name }), _jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "component-type", children: comp.$type }), _jsx("button", { className: "sm danger", onClick: (e) => { e.stopPropagation(); handleRemoveComponent(name); }, children: "Remove" })] })] }), !collapsed.has(name) && (_jsx(ComponentBody, { ctype: comp.$type, cdata: compData[name] ?? {}, setCD: (fn) => dSetCompData((prev) => ({ ...prev, [name]: fn(prev[name] ?? {}) })), path: node.$path, componentName: name, toast: toast, onActionComplete: handleReset }))] }, name))), !schema && !mainCompDefaults && Object.keys(plainData).length > 0 && (_jsxs("div", { className: "card", children: [_jsx("div", { className: "card-header", children: "Data" }), _jsx("div", { className: "card-body", children: Object.entries(plainData).map(([k, v]) => (_jsxs("div", { className: "field", children: [_jsx("label", { children: k }), _jsx("input", { value: typeof v === 'string' ? v : JSON.stringify(v), onChange: (e) => dSetPlainData((prev) => ({ ...prev, [k]: e.target.value })) })] }, k))) })] }))] })) : (_jsx("div", { className: "json-view", children: _jsx("textarea", { value: jsonText, onChange: (e) => dSetJsonText(e.target.value), spellCheck: false }) })) }), _jsxs("div", { className: "edit-panel-actions", children: [stale && (_jsx("button", { className: "ghost", onClick: handleReset, title: "Node updated externally", children: "Reset" })), _jsx("button", { className: "primary", onClick: handleSave, children: "Save" }), tab === 'properties' && (_jsx("button", { onClick: handleAdd, children: "+ Component" }))] })] })] }));
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=Inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Inspector.js","sourceRoot":"","sources":["../src/Inspector.tsx"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,gFAAgF;AAEhF,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EACL,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,EACd,SAAS,EACT,eAAe,EACf,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAqD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/G,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAc9B,uBAAuB;AACvB,SAAS,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAmD;IACrF,IAAI,IAAI,KAAK,GAAG;QACd,OAAO,CACL,cAAK,SAAS,EAAC,mBAAmB,YAChC,+BAAc,GACV,CACP,CAAC;IACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAsC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9E,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CACL,cAAK,SAAS,EAAC,mBAAmB,YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,2BACG,CAAC,GAAG,CAAC,IAAI,eAAM,SAAS,EAAC,KAAK,kBAAS,EACxC,eAAM,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAG,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAQ,KAFzE,CAAC,CAAC,IAAI,CAGV,CACR,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,mCAAmC;AACnC,SAAS,UAAU,CAAC,EAAE,KAAK,EAAsB;IAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3B,OAAO,eAAM,SAAS,EAAC,uBAAuB,YAAE,MAAM,CAAC,KAAK,CAAC,GAAQ,CAAC;IAExE,oDAAoD;IACpD,IAAI,OAAO,IAAK,KAAa,EAAE,CAAC;QAC9B,OAAO,KAAC,MAAM,IAAC,KAAK,EAAE,KAAsB,GAAI,CAAC;IACnD,CAAC;IAED,iCAAiC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,eAAM,SAAS,EAAC,mCAAmC,sBAAa,CAAC;IAElG,OAAO,CACL,cAAK,SAAS,EAAC,uBAAuB,YACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CACvB,eAAa,SAAS,EAAC,wBAAwB,aAC7C,eAAM,SAAS,EAAC,gCAAgC,YAAE,CAAC,GAAQ,EAC3D,eAAM,SAAS,EAAC,uCAAuC,YACpD,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GACrE,KAJC,CAAC,CAKL,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,SAAS,cAAc,CAAC,EACtB,IAAI,EACJ,aAAa,EACb,QAAQ,EACR,KAAK,EACL,gBAAgB,GAQjB;IACC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAA0C,EAAE,CAAC,CAAC;IAC1F,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAkD,EAAE,CAAC,CAAC;IAC5F,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAoC,EAAE,CAAC,CAAC;IAEpF,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,KAAK,UAAU,GAAG,CAAC,CAAS;QAC1B,UAAU,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAClD,IAAI,IAAI,GAAY,EAAE,CAAC;YACvB,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzC,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;oBACxB,IAAI,CAAC;wBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAAC,CAAC;oBAC/B,MAAM,CAAC;wBAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;wBAAC,UAAU,CAAC,IAAI,CAAC,CAAC;wBAAC,OAAO;oBAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAyB,CAAC;YACpF,IAAI,KAAK;gBAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5B,gBAAgB,EAAE,EAAE,CAAC;YACrB,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;YACtE,WAAW,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpB,GAAG,IAAI;gBACP,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;aACtE,CAAC,CAAC,CAAC;YACJ,WAAW,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,cAAc,aAC3B,cAAK,SAAS,EAAC,wBAAwB,YACpC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,kBAEE,SAAS,EAAE,cAAc,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAC5F,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAEpD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,QAAQ,KAAK,CAAC,IAAI,CACjD,eAAM,SAAS,EAAC,uBAAuB,kBAAS,CACjD,EACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,QAAQ,KAAK,CAAC,IAAI,CACnC,eAAM,SAAS,EAAC,sBAAsB,uBAAS,CAChD,KAVI,CAAC,CAWC,CACV,CAAC,GACE,EAEL,QAAQ,IAAI,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,GAAG,QAAQ,CAAC;gBACnB,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAClD,MAAM,SAAS,GAAG,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3F,MAAM,QAAQ,GAAG,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;gBAC5F,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;gBAEvC,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAE3B,SAAS,IAAI,CACZ,cAAK,SAAS,EAAC,4BAA4B,YACxC,MAAM,CAAC,OAAO,CAAC,YAAa,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;gCAC9D,MAAM,CAAC,GAAG,IAAyD,CAAC;gCACpE,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gCACzC,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAE,EAAE,CAC9B,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oCACvB,GAAG,IAAI;oCACP,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;iCACxC,CAAC,CAAC,CAAC;gCACN,OAAO,CACL,eAAiB,SAAS,EAAC,qBAAqB,aAC9C,0BAAQ,CAAC,CAAC,KAAK,IAAI,KAAK,GAAS,EAChC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC9C,gBAAO,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAC1C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAI,CACxD,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CACzB,iBAAO,SAAS,EAAC,0CAA0C,aACzD,gBAAO,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAC,QAAQ,EACvD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,EACjD,eAAM,SAAS,EAAC,aAAa,YAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAQ,IACvD,CACT,CAAC,CAAC,CAAC,CACF,gBAAO,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,CAChD,KAdO,KAAK,CAeT,CACP,CAAC;4BACJ,CAAC,CAAC,GACE,CACP,EAGA,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAC1B,mBACE,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAC5B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAC5E,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,CAAC,GACP,CACH,EAGD,kBACE,SAAS,EAAC,gBAAgB,EAC1B,QAAQ,EAAE,OAAO,KAAK,IAAI,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,aAEpB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAG,CAAC,IACzB,EAGR,MAAM,IAAI,CACT,cAAK,SAAS,EAAE,oBAAoB,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,YAC5D,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CACZ,eAAM,SAAS,EAAC,wCAAwC,YAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,CACvF,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CACxD,eAAM,SAAS,EAAC,0BAA0B,4BAAc,CACzD,CAAC,CAAC,CAAC,CACF,8BACE,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAM,SAAS,EAAC,4DAA4D,uBAAc,EACzF,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CACnC,eAAK,SAAS,EAAC,cAAc,aAC3B,iBACE,SAAS,EAAE,kBAAkB,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EACjE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,qBAClD,EACd,iBACE,SAAS,EAAE,kBAAkB,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,qBAChD,IACV,CACP,IACG,EACL,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CACjB,cAAK,SAAS,EAAC,wFAAwF,YACpG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAClC,CACP,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAI,CACpC,IACA,CACJ,GACG,CACP,IACG,CACP,CAAC;YACJ,CAAC,CAAC,EAAE,IACA,CACP,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,IAAY,EACZ,WAQC,EACD,SAAkC,EAClC,YAAsF;IAEtF,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1D,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnF,IAAI,CAAC,OAAO;QACV,OAAO,CACL,eAAgB,SAAS,EAAC,yBAAyB,kCAC/B,WAAW,CAAC,IAAI,KAD1B,IAAI,CAER,CACP,CAAC;IACJ,MAAM,SAAS,GAA4C;QACzD,KAAK,EAAE,WAAW,CAAC,IAAI;QACvB,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;QACtB,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,WAAW,EAAE,WAAW,CAAC,WAAW;KACrC,CAAC;IACF,IAAI,WAAW,CAAC,KAAK;QAAE,SAAS,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IAC3D,IAAI,WAAW,CAAC,IAAI;QAAE,SAAS,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IACxD,IAAI,WAAW,CAAC,OAAO;QAAE,SAAS,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IACjE,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC;IAChF,OAAO,CACL,eAAgB,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,aAC3D,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,0BAAQ,WAAW,CAAC,KAAK,GAAS,EACpE,aAAa,CAAC,OAAc,EAAE;gBAC7B,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,WAAW,CAAC,QAAQ;oBAC5B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,CAAC,IAAwB,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;aAC5F,CAAC,KAPM,IAAI,CAQR,CACP,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,SAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,QAAQ,GAIT;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAE5D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CACL,mBACE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EACrC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,IAAI,CAAC;oBACH,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvC,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC,GACD,CACH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,KAAiB,CAAC;IAC/B,OAAO,CACL,eAAK,SAAS,EAAC,kBAAkB,aAC/B,cAAK,SAAS,EAAC,sBAAsB,YAClC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,gBAEE,SAAS,EAAC,0GAA0G,aAEnH,GAAG,EACJ,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,+GAA+G,EACzH,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,uBAGhD,KAVJ,CAAC,CAWD,CACR,CAAC,GACE,EACN,gBACE,SAAS,EAAC,gBAAgB,EAC1B,WAAW,EAAC,aAAa,EACzB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;wBAAE,OAAO;oBAC9B,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACnD,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC,GACD,IACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,EAChB,IAAI,EACJ,IAAI,EACJ,YAAY,GAKb;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,eACE,SAAS,EAAC,wCAAwC,EAClD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAEjC,kCAAiB,EACjB,gBAAM,SAAS,EAAC,0GAA0G,aACvH,IAAI,EACL,eAAM,SAAS,EAAC,cAAc,YAAE,IAAI,GAAQ,EAC3C,IAAI,CAAC,CAAC,CAAC,CACN,cAAK,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,YAAC,eAAM,CAAC,EAAC,cAAc,GAAE,GAAM,CAC9H,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,YAAC,eAAM,CAAC,EAAC,eAAe,GAAE,GAAM,CAC/H,IACI,IACH,EACL,IAAI,IAAI,CACP,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,OAAO,aACpB,oCAAoB,EACpB,gBAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,SAAG,IAC3B,EACN,eAAK,SAAS,EAAC,OAAO,aACpB,oCAAoB,EACpB,gBAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,IACjE,IACF,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,gBAAgB,GASlE;IACC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEvC,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACvB,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACvD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;gBACvD,MAAM,CAAC,GAAG,IAIT,CAAC;gBACF,OAAO,WAAW,CAAC,KAAK,EAAE;oBACxB,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC7E,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO;iBACvE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACnB,CAAC,CAAC,CACH,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAClC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CACpC,eAAa,SAAS,EAAE,QAAQ,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,aACzG,0BAAQ,CAAC,GAAS,EACjB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CACxB,iBAAO,SAAS,EAAC,wCAAwC,aACvD,gBAAO,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAC,QAAQ,EAC5D,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAI,EAC3E,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IACtB,CACT,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC1B,gBAAO,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAC/C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAI,CACnF,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrB,KAAC,gBAAgB,IAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAc,EAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAI,CACpE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC1B,CAAC,GAAG,EAAE;wBACJ,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;wBAC1C,OAAO,CAAC;4BACN,CAAC,CAAC,aAAa,CAAC,CAAQ,EAAE;gCACtB,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;gCAC3C,QAAQ,EAAE,CAAC,IAAwB,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;6BACxF,CAAC;4BACJ,CAAC,CAAC,cAAK,SAAS,EAAC,0CAA0C,YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAO,CAAC;oBAC1G,CAAC,CAAC,EAAE,CACL,CAAC,CAAC,CAAC,CACF,gBAAO,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAClC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAAI,CAC3E,KA3BO,CAAC,CA4BL,CACP,CAAC,CACH,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,sFAAsF,YAClG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAC3B,CACP,EACD,KAAC,cAAc,IAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,GAAI,IAC5I,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAS;IAC5G,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA0C,EAAE,CAAC,CAAC;IACtF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAwB,YAAY,CAAC,CAAC;IACpE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,MAAM,CAAU,IAAI,CAAC,CAAC;IAE3C,SAAS,YAAY,CAAC,CAAW;QAC/B,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACrB,WAAW,CAAE,CAAC,CAAC,MAAiB,IAAI,EAAE,CAAC,CAAC;QACxC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAI,CAAC,CAAC,IAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,MAAM,KAAK,GAA4C,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,GAA4B,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,OAAO,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YACnC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YACjC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9B,mEAAmE;IACnE,MAAM,YAAY,GAAuB,CAAC,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,YAAY,GAAuB,CAAC,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,aAAa,GAAwB,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,YAAY,GAAuB,CAAC,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,YAAY,GAAuB,CAAC,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,YAAY,GAAuB,CAAC,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpF,SAAS,WAAW;QAClB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;QAC9C,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;QACpC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CACL,cAAK,SAAS,EAAC,QAAQ,YACrB,eAAK,SAAS,EAAC,cAAc,aAC3B,cAAK,SAAS,EAAC,MAAM,uBAAc,EACnC,mDAA+B,IAC3B,GACF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAE,aAAa,EAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtE,qFAAqF;IACrF,wEAAwE;IACxE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAoB,CAAC;IACpE,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEhE,KAAK,UAAU,UAAU;QACvB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,MAAgB,CAAC;QACrB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,cAAc,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;YAC9D,IAAI,QAAQ;gBAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAI,IAAsB,CAAC,KAAK,CAAC;gBAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC1B,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;oBAC7B,IAAI,IAAI,KAAK,SAAS;wBAAE,SAAS;oBACjC,IAAI,CAAC;wBACH,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;oBAAC,MAAM,CAAC;wBACP,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;wBAC5C,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;QACpC,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAED,SAAS,SAAS;QAChB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,qBAAqB,CAAC,IAAY;QACzC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,GAAG,CAAC,IAAI,CAAC,CAAC;IACZ,CAAC;IAED,SAAS,cAAc,CAAC,IAAY;QAClC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;gBACjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,QAAQ,aAErB,eAAK,SAAS,EAAC,eAAe,aAC5B,KAAC,UAAU,IAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,EACpD,eAAK,SAAS,EAAC,cAAc,aAC3B,uBAAK,QAAQ,GAAM,EACnB,eAAM,SAAS,EAAC,mBAAmB,YAAE,IAAI,CAAC,KAAK,GAAQ,EACvD,YACE,IAAI,EAAE,IAAI,CAAC,KAAK,EAChB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,UAAU,EACd,SAAS,EAAC,gEAAgE,4BAGxE,EACH,SAAS,IAAI,CACZ,iBACE,SAAS,EAAC,sBAAsB,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EACpC,KAAK,EAAC,eAAe,uBAGd,CACV,EACA,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1B,eAAM,SAAS,EAAC,iBAAiB,YAC9B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACvB,iBAEE,SAAS,EAAE,iBAAiB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,YAE3B,CAAC,IAJG,CAAC,CAKC,CACV,CAAC,GACG,CACR,EACD,eAAM,SAAS,EAAC,QAAQ,GAAG,EAC3B,iBAAQ,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,YAClF,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GACpB,EACT,iBACE,SAAS,EAAC,WAAW,EACrB,OAAO,EAAE,GAAG,EAAE;oCACZ,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,GAAG,CAAC;wCAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCAC7D,CAAC,uBAGM,IACL,IACF,EAGN,cAAK,SAAS,EAAC,aAAa,YAC1B,KAAC,aAAa,IAAC,IAAI,EAAE,OAAO,YAC1B,cAAK,SAAS,EAAC,WAAW,YACxB,KAAC,MAAM,IAAC,KAAK,EAAE,IAAI,GAAI,GACnB,GACQ,GACZ,EAGN,eAAK,SAAS,EAAE,aAAa,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,aACnD,eAAK,SAAS,EAAC,mBAAmB,aAChC,oCAAY,QAAQ,IAAQ,EAC5B,iBAAQ,SAAS,EAAC,UAAU,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,uBAEpD,IACL,EAEN,eAAK,SAAS,EAAC,iBAAiB,aAC9B,iBACE,SAAS,EAAE,aAAa,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,2BAG5B,EACT,iBACE,SAAS,EAAE,aAAa,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EACzD,OAAO,EAAE,GAAG,EAAE;oCACZ,MAAM,CAAC,MAAM,CAAC,CAAC;oCACf,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gCAClE,CAAC,qBAGM,IACL,EAEN,cAAK,SAAS,EAAC,iBAAiB,YAC7B,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,CACtB,8BACE,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,GAAI,EAE1E,KAAC,SAAS,IACR,IAAI,EAAE,IAAI,CAAC,KAAK,EAChB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wCACjB,YAAY,CAAC,CAAC,CAAC,CAAC;wCAChB,YAAY,CAAC,CAAC,CAAC,CAAC;oCAClB,CAAC,GACD,EAED,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAC1B,eAAK,SAAS,EAAC,MAAM,aACnB,cAAK,SAAS,EAAC,aAAa,YAAE,IAAI,CAAC,KAAK,GAAO,EAC/C,KAAC,aAAa,IACZ,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE,IAAI,CAAC,KAAK,EAChB,aAAa,EAAC,EAAE,EAChB,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,WAAW,GAC7B,IACE,CACP,EAEA,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAChC,eAAgB,SAAS,EAAC,MAAM,aAC9B,eAAK,SAAS,EAAC,wCAAwC,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,aACzF,eAAM,SAAS,EAAC,uBAAuB,YAAE,IAAI,GAAQ,EACrD,gBAAM,SAAS,EAAC,yBAAyB,aACvC,eAAM,SAAS,EAAC,gBAAgB,YAAG,IAAsB,CAAC,KAAK,GAAQ,EACvE,iBACE,SAAS,EAAC,WAAW,EACrB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,uBAG9D,IACJ,IACH,EACL,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CACvB,KAAC,aAAa,IACZ,KAAK,EAAG,IAAsB,CAAC,KAAK,EACpC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAC3B,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAClF,IAAI,EAAE,IAAI,CAAC,KAAK,EAChB,aAAa,EAAE,IAAI,EACnB,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,WAAW,GAC7B,CACH,KAvBO,IAAI,CAwBR,CACP,CAAC,EAED,CAAC,MAAM,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CACpE,eAAK,SAAS,EAAC,MAAM,aACnB,cAAK,SAAS,EAAC,aAAa,qBAAW,EACvC,cAAK,SAAS,EAAC,WAAW,YACvB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CACzC,eAAa,SAAS,EAAC,OAAO,aAC5B,0BAAQ,CAAC,GAAS,EAClB,gBACE,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EACpD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAE7D,KAPM,CAAC,CAQL,CACP,CAAC,GACE,IACF,CACP,IACA,CACJ,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,WAAW,YACxB,mBACE,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,UAAU,EAAE,KAAK,GACjB,GACE,CACP,GACG,EAEN,eAAK,SAAS,EAAC,oBAAoB,aAChC,KAAK,IAAI,CACR,iBAAQ,SAAS,EAAC,OAAO,EAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAC,yBAAyB,sBAEtE,CACV,EACD,iBAAQ,SAAS,EAAC,SAAS,EAAC,OAAO,EAAE,UAAU,qBAEtC,EACR,GAAG,KAAK,YAAY,IAAI,CACvB,iBAAQ,OAAO,EAAE,SAAS,4BAAsB,CACjD,IACG,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
package/dist/Tree.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type TreeProps = {
|
|
2
|
+
roots: string[];
|
|
3
|
+
expanded: Set<string>;
|
|
4
|
+
loaded: Set<string>;
|
|
5
|
+
selected: string | null;
|
|
6
|
+
filter: string;
|
|
7
|
+
showHidden: boolean;
|
|
8
|
+
onSelect: (path: string) => void;
|
|
9
|
+
onExpand: (path: string) => void;
|
|
10
|
+
onCreateChild: (parentPath: string) => void;
|
|
11
|
+
onDelete?: (path: string) => void;
|
|
12
|
+
onMove?: (fromPath: string, toPath: string) => void;
|
|
13
|
+
};
|
|
14
|
+
export declare function Tree(props: TreeProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=Tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tree.d.ts","sourceRoot":"","sources":["../src/Tree.tsx"],"names":[],"mappings":"AAGA,KAAK,SAAS,GAAG;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD,CAAC;AAqNF,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CAQpC"}
|
package/dist/Tree.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';
|
|
3
|
+
import * as cache from './cache';
|
|
4
|
+
function nodeName(p) {
|
|
5
|
+
return p.slice(p.lastIndexOf('/') + 1) || '/';
|
|
6
|
+
}
|
|
7
|
+
function matchesFilter(name, type, filter) {
|
|
8
|
+
if (!filter)
|
|
9
|
+
return true;
|
|
10
|
+
const lf = filter.toLowerCase();
|
|
11
|
+
return name.toLowerCase().includes(lf) || type.toLowerCase().includes(lf);
|
|
12
|
+
}
|
|
13
|
+
function hasMatchingDescendant(path, filter) {
|
|
14
|
+
const nodes = cache.raw();
|
|
15
|
+
const prefix = path === '/' ? '/' : path + '/';
|
|
16
|
+
for (const [k, v] of nodes) {
|
|
17
|
+
if (k.startsWith(prefix) && matchesFilter(nodeName(k), v.$type, filter))
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
function BadgeMenu({ path, typeLabel, fullType, onCreateChild, onDelete, }) {
|
|
23
|
+
const [open, setOpen] = useState(false);
|
|
24
|
+
const ref = useRef(null);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (!open)
|
|
27
|
+
return;
|
|
28
|
+
const close = (e) => {
|
|
29
|
+
if (ref.current && !ref.current.contains(e.target))
|
|
30
|
+
setOpen(false);
|
|
31
|
+
};
|
|
32
|
+
document.addEventListener('mousedown', close);
|
|
33
|
+
return () => document.removeEventListener('mousedown', close);
|
|
34
|
+
}, [open]);
|
|
35
|
+
return (_jsxs("div", { ref: ref, className: "tree-badge-wrap", children: [_jsx("span", { className: "tree-badge", title: fullType, onClick: (e) => {
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
setOpen(!open);
|
|
38
|
+
}, children: typeLabel }), open && (_jsxs("div", { className: "tree-menu", children: [_jsx("button", { className: "tree-menu-item", onClick: (e) => {
|
|
39
|
+
e.stopPropagation();
|
|
40
|
+
setOpen(false);
|
|
41
|
+
onCreateChild(path);
|
|
42
|
+
}, children: "+ Add child" }), onDelete && (_jsx("button", { className: "tree-menu-item danger", onClick: (e) => {
|
|
43
|
+
e.stopPropagation();
|
|
44
|
+
setOpen(false);
|
|
45
|
+
if (confirm(`Delete ${path}?`))
|
|
46
|
+
onDelete(path);
|
|
47
|
+
}, children: "\u00D7 Delete" }))] }))] }));
|
|
48
|
+
}
|
|
49
|
+
function TreeNode({ path, expanded, loaded = new Set(), selected, filter, showHidden, depth, onSelect, onExpand, onCreateChild, onDelete, onMove, }) {
|
|
50
|
+
// Granular subscriptions — only re-render when THIS node or ITS children change
|
|
51
|
+
const node = useSyncExternalStore(useCallback((cb) => cache.subscribePath(path, cb), [path]), useCallback(() => cache.get(path), [path]));
|
|
52
|
+
const childrenNodes = useSyncExternalStore(useCallback((cb) => cache.subscribeChildren(path, cb), [path]), useCallback(() => cache.getChildren(path), [path]));
|
|
53
|
+
const rowRef = useRef(null);
|
|
54
|
+
const [dragOver, setDragOver] = useState(null);
|
|
55
|
+
if (!node)
|
|
56
|
+
return null;
|
|
57
|
+
const name = nodeName(path);
|
|
58
|
+
const isExp = expanded.has(path);
|
|
59
|
+
const allChildren = childrenNodes.map(n => n.$path).filter(p => p !== path);
|
|
60
|
+
const knownChildren = showHidden
|
|
61
|
+
? allChildren
|
|
62
|
+
: allChildren.filter(p => !nodeName(p).startsWith('_'));
|
|
63
|
+
const showChildren = filter ? knownChildren : isExp ? knownChildren : [];
|
|
64
|
+
const filteredChildren = filter
|
|
65
|
+
? showChildren.filter((c) => {
|
|
66
|
+
const cn = cache.get(c);
|
|
67
|
+
if (!cn)
|
|
68
|
+
return false;
|
|
69
|
+
return matchesFilter(nodeName(c), cn.$type, filter) || hasMatchingDescendant(c, filter);
|
|
70
|
+
})
|
|
71
|
+
: showChildren;
|
|
72
|
+
if (filter && !matchesFilter(name, node.$type, filter) && filteredChildren.length === 0) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const indent = depth * 12 + 4;
|
|
76
|
+
const typeLabel = node.$type.includes('.') ? node.$type.slice(node.$type.lastIndexOf('.') + 1) : node.$type;
|
|
77
|
+
return (_jsxs("div", { className: "tree-node", children: [_jsxs("div", { ref: rowRef, className: `tree-row${selected === path ? ' selected' : ''}${dragOver === 'above' ? ' tree-drop-above' : ''}${dragOver === 'below' ? ' tree-drop-below' : ''}`, style: { paddingLeft: indent }, onClick: () => onSelect(path), draggable: true, onDragStart: (e) => {
|
|
78
|
+
e.dataTransfer.setData('text/plain', path);
|
|
79
|
+
e.dataTransfer.setData('application/treenity-path', path);
|
|
80
|
+
e.dataTransfer.effectAllowed = 'all';
|
|
81
|
+
}, onDragOver: (e) => {
|
|
82
|
+
e.preventDefault();
|
|
83
|
+
const rect = rowRef.current.getBoundingClientRect();
|
|
84
|
+
const y = e.clientY - rect.top;
|
|
85
|
+
setDragOver(y < rect.height / 2 ? 'above' : 'below');
|
|
86
|
+
}, onDragLeave: () => setDragOver(null), onDrop: (e) => {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
setDragOver(null);
|
|
89
|
+
const from = e.dataTransfer.getData('text/plain');
|
|
90
|
+
if (from && from !== path && onMove)
|
|
91
|
+
onMove(from, path);
|
|
92
|
+
}, children: [knownChildren.length > 0 || !loaded.has(path) ? (_jsx("span", { className: "tree-toggle", onClick: (e) => {
|
|
93
|
+
e.stopPropagation();
|
|
94
|
+
onExpand(path);
|
|
95
|
+
}, children: isExp ? '\u25BE' : '\u25B8' })) : (_jsx("span", { className: "tree-toggle" })), _jsx("span", { className: "tree-label", children: name }), _jsx(BadgeMenu, { path: path, typeLabel: typeLabel, fullType: node.$type, onCreateChild: onCreateChild, onDelete: onDelete })] }), (isExp || filter) && filteredChildren.length > 0 && (_jsx("div", { className: "tree-children", children: filteredChildren.map((c) => (_jsx(TreeNode, { path: c, depth: depth + 1, expanded: expanded, loaded: loaded, selected: selected, filter: filter, showHidden: showHidden, onSelect: onSelect, onExpand: onExpand, onCreateChild: onCreateChild, onDelete: onDelete, onMove: onMove }, c))) }))] }));
|
|
96
|
+
}
|
|
97
|
+
export function Tree(props) {
|
|
98
|
+
return (_jsx("div", { children: props.roots.map((r) => (_jsx(TreeNode, { path: r, depth: 0, ...props }, r))) }));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=Tree.js.map
|
package/dist/Tree.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tree.js","sourceRoot":"","sources":["../src/Tree.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewPage.d.ts","sourceRoot":"","sources":["../src/ViewPage.tsx"],"names":[],"mappings":"AAKA,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,2CAuCpF"}
|
package/dist/ViewPage.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// ViewPage — standalone read-only node view at /{path}
|
|
3
|
+
import { Render, RenderContext } from '#context';
|
|
4
|
+
import { usePath } from './hooks';
|
|
5
|
+
export function ViewPage({ path, editorLink }) {
|
|
6
|
+
const node = usePath(path);
|
|
7
|
+
const name = path === '/' ? '/' : path.slice(path.lastIndexOf('/') + 1);
|
|
8
|
+
if (!node) {
|
|
9
|
+
return (_jsxs("div", { className: "flex flex-col items-center justify-center h-screen gap-4 text-[--text-3]", children: [_jsx("div", { className: "text-4xl", children: "404" }), _jsxs("p", { children: ["Node not found: ", _jsx("span", { className: "font-mono", children: path })] }), editorLink && _jsx("a", { href: `/t${path}`, className: "text-[--accent] hover:underline", children: "Open in editor" })] }));
|
|
10
|
+
}
|
|
11
|
+
return (_jsxs("div", { className: "flex flex-col h-screen", children: [editorLink && (_jsxs("div", { className: "flex items-center gap-3 px-4 py-2 border-b border-[--border] bg-[--bg-2]", children: [_jsx("span", { className: "font-semibold text-sm", children: name }), _jsx("span", { className: "text-[10px] font-mono px-1.5 py-0.5 rounded bg-[--accent]/10 text-[--accent]", children: node.$type }), _jsx("span", { className: "flex-1" }), _jsx("a", { href: `/t${path}`, className: "text-xs text-[--text-3] hover:text-[--text-1] no-underline", children: "Open in editor" })] })), _jsx("div", { className: "flex-1 overflow-auto p-4 has-[.view-full]:p-0", children: _jsx(RenderContext, { name: "react", children: _jsx(Render, { value: node }) }) })] }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ViewPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewPage.js","sourceRoot":"","sources":["../src/ViewPage.tsx"],"names":[],"mappings":";AAAA,uDAAuD;AAEvD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAA0C;IACnF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAExE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CACL,eAAK,SAAS,EAAC,0EAA0E,aACvF,cAAK,SAAS,EAAC,UAAU,oBAAU,EACnC,4CAAmB,eAAM,SAAS,EAAC,WAAW,YAAE,IAAI,GAAQ,IAAI,EAC/D,UAAU,IAAI,YAAG,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,SAAS,EAAC,iCAAiC,+BAAmB,IAC/F,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,wBAAwB,aACpC,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,0EAA0E,aACvF,eAAM,SAAS,EAAC,uBAAuB,YAAE,IAAI,GAAQ,EACrD,eAAM,SAAS,EAAC,8EAA8E,YAC3F,IAAI,CAAC,KAAK,GACN,EACP,eAAM,SAAS,EAAC,QAAQ,GAAG,EAC3B,YACE,IAAI,EAAE,KAAK,IAAI,EAAE,EACjB,SAAS,EAAC,4DAA4D,+BAGpE,IACA,CACP,EACD,cAAK,SAAS,EAAC,+CAA+C,YAC5D,KAAC,aAAa,IAAC,IAAI,EAAC,OAAO,YACzB,KAAC,MAAM,IAAC,KAAK,EAAE,IAAI,GAAI,GACT,GACZ,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type Sub = () => void;
|
|
2
|
+
export declare function getComputed(path: string): Record<string, unknown> | undefined;
|
|
3
|
+
/** Get the raw valtio proxy — for useSnapshot in hooks */
|
|
4
|
+
export declare function getComputedProxy(path: string): Record<string, unknown> | undefined;
|
|
5
|
+
export declare function setComputed(path: string, field: string, value: unknown): void;
|
|
6
|
+
export declare function clearComputed(path: string): void;
|
|
7
|
+
export declare function subscribeComputed(path: string, cb: Sub): () => void;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=computed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../src/bind/computed.ts"],"names":[],"mappings":"AAOA,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAmBtB,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAI7E;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAElF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAK7E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOhD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,MAAM,IAAI,CAUnE"}
|