@theoremjs/studio 0.3.4-next.482.g7e608f2 → 0.3.4-next.508.geda6db0
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/README.md +3 -3
- package/compile.d.ts +1 -1
- package/draft.d.ts +1 -1
- package/example.js +5 -2
- package/map-line.d.ts +12 -0
- package/map-line.js +98 -0
- package/map.d.ts +1 -1
- package/map.js +0 -1
- package/package.json +4 -4
- package/page/assets/{Banner-CrUhb26_.js → Banner-BcHZFaJb.js} +2 -2
- package/page/assets/{ConsoleFrame-6cEEvO4i.js → ConsoleFrame-Byq_hSpu.js} +3 -3
- package/page/assets/{ContextMenu-WnsgC14_.js → ContextMenu-C6S-GYrc.js} +2 -2
- package/page/assets/{ToolResultCharts-BEhuo0Z4.js → ToolResultCharts-CkEf5ub5.js} +1 -1
- package/page/assets/{TraceInspector-k1w1q0XO.js → TraceInspector-BsYHHhGv.js} +1 -1
- package/page/assets/{TraceOverview-Crxd-sTS.js → TraceOverview-CMFfbfGM.js} +2 -2
- package/page/assets/{_virtual_studio-type-sources-DAabvYbE.js → _virtual_studio-type-sources-CTIGQ210.js} +56 -48
- package/page/assets/browser-engine-DjYv346h.js +11 -0
- package/page/assets/browser-transport-Bm3uY9Fj.js +47 -0
- package/page/assets/{crypto-iT_LZ8Et.js → crypto-DAIn4qnM.js} +1 -1
- package/page/assets/{egress-automata-B5ZGE1mT.js → egress-automata-SiHQTP1i.js} +1 -1
- package/page/assets/{encode-files-8AFMw7Er.js → encode-files-oYzzs_iG.js} +1 -1
- package/page/assets/{export-agent-BedkRp13.js → export-agent-BeUTYowB.js} +3 -3
- package/page/assets/{guardrail-tester-XwnZWNsg.js → guardrail-tester-DLT99rnO.js} +2 -2
- package/page/assets/index-C9rhrCGT.css +1 -0
- package/page/assets/{index-BVHT-9mR.js → index-DNA-Y8Mp.js} +69 -69
- package/page/assets/{labels-provider-BSiD6Lrb.js → labels-provider-Gus3heEH.js} +1 -1
- package/page/assets/{live-messages-B65rUlNM.js → live-messages-BnBioidx.js} +1 -1
- package/page/assets/reader-BFYIhA73.js +7 -0
- package/page/assets/shaped-data-1Qn2111E.js +16 -0
- package/page/assets/{stub-DG5wxM-A.js → stub-B3GersQP.js} +2 -2
- package/page/assets/{studio-code-pane-p4fjtQhL.js → studio-code-pane-CCi7-lyE.js} +3 -3
- package/page/assets/{studio-console-BtZY4aUM.js → studio-console-CJT5FkWm.js} +1 -1
- package/page/assets/{studio-decision-BovTBIwV.js → studio-decision-DhHdHb7Z.js} +1 -1
- package/page/assets/{studio-embedding-BY6UQk0k.js → studio-embedding-B8vBhuZU.js} +1 -1
- package/page/assets/studio-host-console-CE_5_tEn.js +2 -0
- package/page/assets/{studio-labels-C3yQoEd0.js → studio-labels-C2SI_T2p.js} +1 -1
- package/page/assets/{studio-live-B_cVDiqs.js → studio-live-CKSSyYZj.js} +3 -3
- package/page/assets/studio-map-CKm_FCd9.js +1 -0
- package/page/assets/studio-trace-replay-BRMD6pex.js +2 -0
- package/page/assets/{studio-type-checker-Bljo3amv.js → studio-type-checker-DoaPHYNy.js} +1 -1
- package/page/assets/tool-schema-DXYwL5aE.js +18 -0
- package/page/assets/{trace-record-D4xAUHLZ.js → trace-record-DWxIfO7D.js} +1 -1
- package/page/assets/tree-Chi6mqzx.js +3 -0
- package/page/assets/{turn-client-CBWNoFgo.js → turn-client-DF0ije7A.js} +2 -2
- package/page/assets/types-2I4NfLiS.js +1 -0
- package/page/assets/{use-one-call-rh-5EjBB.js → use-one-call-Bhnpve1Y.js} +1 -1
- package/page/assets/{workspace-kAEf4Zn4.js → workspace-U3w2ELtN.js} +1 -1
- package/page/index.html +17 -17
- package/run-payload.d.ts +1 -1
- package/runtime.d.ts +1 -1
- package/runtime.js +1 -1
- package/server/draft-decide.d.ts +1 -4
- package/server/draft-decide.js +1 -1
- package/server/draft-replies.js +2 -2
- package/source.js +1 -1
- package/ui/brand-icons.d.ts +2 -2
- package/ui/brand-icons.js +6 -4
- package/ui/lib/tree-map-layout.d.ts +120 -18
- package/ui/lib/tree-map-layout.js +1292 -190
- package/ui/map-token.css +25 -0
- package/ui/node-icon.js +1 -4
- package/ui/profile-editor.js +1 -1
- package/ui/read-map.css +1 -24
- package/ui/read-map.js +52 -4
- package/ui/studio-map.js +1 -3
- package/ui/tree-map.css +9 -0
- package/ui/tree-map.d.ts +27 -6
- package/ui/tree-map.js +215 -75
- package/page/assets/browser-engine-C78edv3x.js +0 -11
- package/page/assets/browser-transport-mGxdvtBL.js +0 -47
- package/page/assets/index-Cbs7B46A.css +0 -1
- package/page/assets/reader-XebgyCzF.js +0 -7
- package/page/assets/shaped-data-Bc6u4pow.js +0 -16
- package/page/assets/studio-host-console-D9NFWXxV.js +0 -2
- package/page/assets/studio-map-iN6-MOzK.js +0 -1
- package/page/assets/studio-trace-replay-B3k21TSg.js +0 -2
- package/page/assets/tool-schema-BmScISma.js +0 -18
- package/page/assets/tree-BiZScKs7.js +0 -3
- package/page/assets/types-zRlFhC9U.js +0 -1
package/ui/map-token.css
CHANGED
|
@@ -9,3 +9,28 @@
|
|
|
9
9
|
stroke: var(--color-border-emphasized);
|
|
10
10
|
stroke-width: 1.5;
|
|
11
11
|
}
|
|
12
|
+
|
|
13
|
+
/* A line drawing in runs out from the node it leaves, as the loader's map draws: its own pace, not
|
|
14
|
+
the scroll's. */
|
|
15
|
+
.map-line-drawing {
|
|
16
|
+
stroke-dasharray: 1;
|
|
17
|
+
stroke-dashoffset: 1;
|
|
18
|
+
animation: map-line-draw var(--duration-medium, 240ms) var(--ease-standard, ease-out) forwards;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* A token drawing in shows over the same span. */
|
|
22
|
+
.map-token-drawing {
|
|
23
|
+
animation: map-draw-in var(--duration-medium, 240ms) var(--ease-standard, ease-out) both;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@keyframes map-line-draw {
|
|
27
|
+
to {
|
|
28
|
+
stroke-dashoffset: 0;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@keyframes map-draw-in {
|
|
33
|
+
from {
|
|
34
|
+
opacity: 0;
|
|
35
|
+
}
|
|
36
|
+
}
|
package/ui/node-icon.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IconTool } from '@tabler/icons-react';
|
|
2
|
-
import {
|
|
2
|
+
import { modelFamilyMark } from "./brand-icons.js";
|
|
3
3
|
import { FACET_ICON } from "./lib/facet-icons.js";
|
|
4
4
|
import { PROFILE_TYPE_ICON, toolTypeIcon } from "./lib/type-icons.js";
|
|
5
5
|
/** A node's icon; Identity shows the profile type's once one is picked. */
|
|
@@ -11,9 +11,6 @@ export function nodeIcon(draft, ref) {
|
|
|
11
11
|
const binding = draft.modelBindings.find((each) => each.key === ref.key);
|
|
12
12
|
if (!binding)
|
|
13
13
|
return FACET_ICON.modelBinding;
|
|
14
|
-
const definition = draft.providers.find((each) => each.id === binding.provider)?.definition;
|
|
15
|
-
if (definition === 'typesafe')
|
|
16
|
-
return IconTypeSafe;
|
|
17
14
|
return modelFamilyMark(binding.apiId) ?? FACET_ICON.modelBinding;
|
|
18
15
|
}
|
|
19
16
|
if (ref.facet !== 'toolSpec')
|
package/ui/profile-editor.js
CHANGED
|
@@ -2531,7 +2531,7 @@ function DecisionImageRow({ image, index, onRename, onRemove, }) {
|
|
|
2531
2531
|
const reference = `<${image.name}>`;
|
|
2532
2532
|
return (_jsxs(InspectorRow, { label: label, path: "decision.images.name", hasIssue: status !== undefined, children: [_jsx(Thumbnail, { src: `data:${image.mimeType};base64,${image.data}`, label: `Questions write it as ${reference}` }), _jsx(StackItem, { size: "fill", children: _jsx(TextInput, { label: `${label} name`, isLabelHidden: true, size: "sm", status: status, value: image.name, onChange: onRename }) }), _jsx(Tooltip, { content: `Remove ${reference}. A question that names it then has no image to read.`, children: _jsx(IconButton, { label: `Remove ${reference}`, variant: "ghost", size: "sm", icon: _jsx(Icon, { icon: IconX, size: "sm" }), onClick: onRemove }) })] }));
|
|
2533
2533
|
}
|
|
2534
|
-
/** The pictures
|
|
2534
|
+
/** The pictures a decision can send, each under the name its questions write, and a drop to add more. */
|
|
2535
2535
|
function DecisionImagesSection({ draft, setDraft }) {
|
|
2536
2536
|
const keys = useLentKeys();
|
|
2537
2537
|
const { reading, changeAction } = useFilesRead(async (picked) => {
|
package/ui/read-map.css
CHANGED
|
@@ -11,20 +11,9 @@
|
|
|
11
11
|
pointer-events: none;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
/* The line draws in from the node it leaves. */
|
|
15
|
-
.read-map-line {
|
|
16
|
-
stroke-dasharray: 1;
|
|
17
|
-
stroke-dashoffset: 1;
|
|
18
|
-
animation: read-map-line-in var(--duration-medium, 240ms) var(--ease-standard, ease-out) forwards;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
14
|
.read-map-dot {
|
|
22
15
|
fill: var(--color-text-secondary);
|
|
23
|
-
animation:
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.read-map-node {
|
|
27
|
-
animation: read-map-in var(--duration-medium, 240ms) var(--ease-standard, ease-out) both;
|
|
16
|
+
animation: map-draw-in var(--duration-fast, 120ms) var(--ease-standard, ease-out) both;
|
|
28
17
|
}
|
|
29
18
|
|
|
30
19
|
.read-map-foot {
|
|
@@ -34,15 +23,3 @@
|
|
|
34
23
|
gap: 16px;
|
|
35
24
|
justify-content: space-between;
|
|
36
25
|
}
|
|
37
|
-
|
|
38
|
-
@keyframes read-map-line-in {
|
|
39
|
-
to {
|
|
40
|
-
stroke-dashoffset: 0;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
@keyframes read-map-in {
|
|
45
|
-
from {
|
|
46
|
-
opacity: 0;
|
|
47
|
-
}
|
|
48
|
-
}
|
package/ui/read-map.js
CHANGED
|
@@ -4,6 +4,7 @@ import { IconFileCode, IconFolder } from '@tabler/icons-react';
|
|
|
4
4
|
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
5
5
|
import { mapCurve } from "../map-line.js";
|
|
6
6
|
import { readMap } from "./lib/read-map.js";
|
|
7
|
+
import { ease } from "./lib/tree-map-layout.js";
|
|
7
8
|
import { AGENT_ICON, profileTypeIcon, toolTypeIcon } from "./lib/type-icons.js";
|
|
8
9
|
import { MapToken, useTokenWidths } from "./map-token.js";
|
|
9
10
|
import './read-map.css';
|
|
@@ -15,6 +16,8 @@ const LAG_MS = 500;
|
|
|
15
16
|
const CATCH_UP_MS = 900;
|
|
16
17
|
/** The map shows for at least this long, so a quick read can still be seen. */
|
|
17
18
|
const SHOWN_MS = 2000;
|
|
19
|
+
/** How long a node already drawn takes to glide to where a new folder moves it. */
|
|
20
|
+
const GLIDE_MS = 240;
|
|
18
21
|
/** The panel's own padding, step 4. */
|
|
19
22
|
const PAD = 16;
|
|
20
23
|
const ROW = 30;
|
|
@@ -127,6 +130,50 @@ function lineTo(from, fromWidth, to, dots) {
|
|
|
127
130
|
dots: Array.from({ length: dots }, (_, index) => curve.at((index + 1) / (dots + 1))),
|
|
128
131
|
};
|
|
129
132
|
}
|
|
133
|
+
/** Where a glide stands at a time: eased from where it was to where it goes. */
|
|
134
|
+
function glideAt({ from, to, at }, now) {
|
|
135
|
+
const part = ease(Math.min(1, (now - at) / GLIDE_MS));
|
|
136
|
+
return { x: from.x + (to.x - from.x) * part, y: from.y + (to.y - from.y) * part };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The nodes where they stand now: a node drawn shows where it is laid out, and one a later folder
|
|
140
|
+
* moves glides there from where it stood, its lines with it, rather than jumping.
|
|
141
|
+
*/
|
|
142
|
+
function useGlided(placed) {
|
|
143
|
+
const glides = useRef(new Map());
|
|
144
|
+
const [now, setNow] = useState(() => performance.now());
|
|
145
|
+
useLayoutEffect(() => {
|
|
146
|
+
const at = performance.now();
|
|
147
|
+
let moving = false;
|
|
148
|
+
for (const { node, x, y } of placed) {
|
|
149
|
+
const last = glides.current.get(node.id);
|
|
150
|
+
if (last && last.to.x === x && last.to.y === y) {
|
|
151
|
+
moving ||= at - last.at < GLIDE_MS;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
glides.current.set(node.id, {
|
|
155
|
+
from: last ? glideAt(last, at) : { x, y },
|
|
156
|
+
to: { x, y },
|
|
157
|
+
at: last ? at : 0,
|
|
158
|
+
});
|
|
159
|
+
moving ||= last !== undefined;
|
|
160
|
+
}
|
|
161
|
+
if (!moving)
|
|
162
|
+
return;
|
|
163
|
+
let frame = 0;
|
|
164
|
+
const tick = (time) => {
|
|
165
|
+
setNow(time);
|
|
166
|
+
if (time - at < GLIDE_MS)
|
|
167
|
+
frame = requestAnimationFrame(tick);
|
|
168
|
+
};
|
|
169
|
+
frame = requestAnimationFrame(tick);
|
|
170
|
+
return () => cancelAnimationFrame(frame);
|
|
171
|
+
}, [placed]);
|
|
172
|
+
return placed.map((each) => {
|
|
173
|
+
const glide = glides.current.get(each.node.id);
|
|
174
|
+
return glide ? { ...each, ...glideAt(glide, now) } : each;
|
|
175
|
+
});
|
|
176
|
+
}
|
|
130
177
|
export function ReadMap({ reading, onDrawn }) {
|
|
131
178
|
const drawn = useDrawn(reading, onDrawn);
|
|
132
179
|
const { ref, size } = useSize();
|
|
@@ -149,8 +196,9 @@ export function ReadMap({ reading, onDrawn }) {
|
|
|
149
196
|
}));
|
|
150
197
|
}, [map, size, drawn.steps]);
|
|
151
198
|
const widths = useTokenWidths(ref, placed);
|
|
152
|
-
const
|
|
153
|
-
|
|
199
|
+
const shown = useGlided(placed);
|
|
200
|
+
const byId = new Map(shown.map((each) => [each.node.id, each]));
|
|
201
|
+
return (_jsxs("div", { ref: ref, className: "read-map", "aria-hidden": "true", children: [_jsx("svg", { className: "read-map-lines", "aria-hidden": "true", width: size?.width ?? 0, height: size?.height ?? 0, children: shown.map((to) => {
|
|
154
202
|
const from = to.node.parent === undefined ? undefined : byId.get(to.node.parent);
|
|
155
203
|
const width = from && widths[from.node.id];
|
|
156
204
|
if (!from || width === undefined)
|
|
@@ -158,6 +206,6 @@ export function ReadMap({ reading, onDrawn }) {
|
|
|
158
206
|
const read = to.node.own.filter((step) => step < drawn.steps).length;
|
|
159
207
|
const dots = Math.ceil((Math.min(DOTS, to.node.own.length) * read) / Math.max(1, to.node.own.length));
|
|
160
208
|
const line = lineTo(from, width, to, Math.min(DOTS, to.node.own.length));
|
|
161
|
-
return (_jsxs("g", { children: [_jsx("path", { className: "map-line
|
|
162
|
-
}) }),
|
|
209
|
+
return (_jsxs("g", { children: [_jsx("path", { className: "map-line map-line-drawing", d: line.d, pathLength: 1 }), line.dots.slice(0, dots).map(({ x, y }, index) => (_jsx("circle", { className: "read-map-dot", cx: x, cy: y, r: 2.5 }, index)))] }, to.node.id));
|
|
210
|
+
}) }), shown.map(({ node, x, y }) => (_jsx(MapToken, { className: "map-token-drawing", id: node.id, label: short(node.label), icon: nodeIcon(node), x: x, y: y }, node.id))), _jsxs("div", { className: "read-map-foot", children: [_jsx(Text, { type: "supporting", color: "secondary", maxLines: 1, children: saying(steps, drawn.steps) }), _jsx(Text, { type: "supporting", color: "secondary", maxLines: 1, children: tally(steps, drawn.steps) })] })] }));
|
|
163
211
|
}
|
package/ui/studio-map.js
CHANGED
|
@@ -19,7 +19,7 @@ import { TextInput } from '@astryxdesign/core/TextInput';
|
|
|
19
19
|
import { IconArrowsMaximize, IconArrowsMinimize, IconCloud, IconCode, IconExternalLink, IconEye, IconFocus2, IconLayoutGrid, IconSearch, IconX, } from '@tabler/icons-react';
|
|
20
20
|
import { useEffect, useMemo, useRef, useState, } from 'react';
|
|
21
21
|
import { mapFamily, mapFound, mapLayout, mapLinkWords, mapNoteLines, workspaceMap, } from "../mod.js";
|
|
22
|
-
import {
|
|
22
|
+
import { modelFamilyMark } from "./brand-icons.js";
|
|
23
23
|
import { FACET_ICON } from "./lib/facet-icons.js";
|
|
24
24
|
import { readKeptMap, writeKeptMap } from "./lib/studio-map-kept.js";
|
|
25
25
|
import { useProject } from "./lib/studio-project.js";
|
|
@@ -53,8 +53,6 @@ function nodeIcon({ kind, type, note }) {
|
|
|
53
53
|
if (kind === 'tool')
|
|
54
54
|
return toolTypeIcon(type ?? '');
|
|
55
55
|
// A model's note is its API model id, which names the family.
|
|
56
|
-
if (kind === 'model' && type === 'typesafe')
|
|
57
|
-
return IconTypeSafe;
|
|
58
56
|
if (kind === 'model')
|
|
59
57
|
return modelFamilyMark(note) ?? FACET_ICON.modelBinding;
|
|
60
58
|
if (kind === 'provider')
|
package/ui/tree-map.css
CHANGED
|
@@ -16,6 +16,15 @@
|
|
|
16
16
|
stroke: color-mix(in srgb, var(--color-border-emphasized) 60%, var(--color-background-surface));
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
/* Grown, a title over each column, and what the column is under it. */
|
|
20
|
+
.studio-tree-map-heading {
|
|
21
|
+
position: absolute;
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
pointer-events: none;
|
|
26
|
+
}
|
|
27
|
+
|
|
19
28
|
.studio-tree-map[data-draggable] {
|
|
20
29
|
cursor: grab;
|
|
21
30
|
touch-action: none;
|
package/ui/tree-map.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type MapPlace } from '../map-line.ts';
|
|
1
2
|
import { type StudioWorkspace } from '../mod.ts';
|
|
2
3
|
import { type Box } from './lib/tree-map-layout.ts';
|
|
3
4
|
export interface StudioTreeMapProps {
|
|
@@ -5,18 +6,38 @@ export interface StudioTreeMapProps {
|
|
|
5
6
|
/** The keys of the agents to draw, in the workspace's order; every agent when unset. */
|
|
6
7
|
agents?: readonly string[] | undefined;
|
|
7
8
|
/**
|
|
8
|
-
* How far the tree has grown, from 0 to 1. As it grows
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* How far the tree has grown, from 0 to 1. As it grows the map grows to its size, then draws out
|
|
10
|
+
* from the tree's agents as one pen would, at an even pace: each line runs out from the node it
|
|
11
|
+
* leaves, and the node at its end shows as the line reaches it, drifting the last of the way along
|
|
12
|
+
* it. Nothing moves before the drawing comes to it: what the map shows closed glides into place
|
|
13
|
+
* once its line reaches it, its line with it, or, where something would show where it stands, sets
|
|
14
|
+
* off just before that shows and goes slower, so its line catches it as it lands.
|
|
15
|
+
* Shrinking takes it all back the same way.
|
|
12
16
|
*/
|
|
13
17
|
grow?: number | undefined;
|
|
14
18
|
/**
|
|
15
19
|
* The box the map fills grown: its rows and gaps stretch to fill it, and it stands in the middle
|
|
16
|
-
* of it.
|
|
20
|
+
* of it.
|
|
17
21
|
*/
|
|
18
22
|
fit?: Box | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* The box the map stands in now, when it changes as the map grows: closed and grown, the map
|
|
25
|
+
* stands in the middle of it, eased smaller where it would not fit. `fit` by default.
|
|
26
|
+
*/
|
|
27
|
+
room?: Box | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* The keys of the agents the map shows closed, when not `agents`. Growing takes away what the
|
|
30
|
+
* tree does not draw, and an agent the tree draws as an agent tool's agent glides into it.
|
|
31
|
+
*/
|
|
32
|
+
still?: readonly string[] | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Where the tokens the map shows closed stand, by id, in the map's own pixels, for a map that
|
|
35
|
+
* grows out of something else: closed, the map stands at its own size from the top left of what
|
|
36
|
+
* holds it, these tokens where they are given and nothing else; growing, the tree draws out round
|
|
37
|
+
* them, and each glides to where it stands grown as the drawing comes to it. In place of `still`.
|
|
38
|
+
*/
|
|
39
|
+
closed?: ReadonlyMap<string, MapPlace> | undefined;
|
|
19
40
|
/** A token dragged moves to where it is dropped, its lines with it; the field dragged moves the whole map. */
|
|
20
41
|
draggable?: boolean | undefined;
|
|
21
42
|
}
|
|
22
|
-
export declare function StudioTreeMap({ workspace, agents, grow, fit, draggable, }: StudioTreeMapProps): import("react").JSX.Element;
|
|
43
|
+
export declare function StudioTreeMap({ workspace, agents, grow, fit, room, still, closed: given, draggable, }: StudioTreeMapProps): import("react").JSX.Element;
|