@visual-json/react 0.1.1 → 0.3.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/README.md +0 -4
- package/dist/index.d.mts +11 -7
- package/dist/index.d.ts +11 -7
- package/dist/index.js +674 -711
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +674 -714
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -10
- package/LICENSE +0 -201
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/json-editor.tsx","../src/visual-json.tsx","../src/context.ts","../src/tree-view.tsx","../src/context-menu.tsx","../src/display-key.ts","../src/get-visible-nodes.ts","../src/use-drag-drop.ts","../src/form-view.tsx","../src/breadcrumbs.tsx","../src/enum-input.tsx","../src/search-bar.tsx","../src/property-editor.tsx","../src/diff-view.tsx"],"sourcesContent":["import {\n useState,\n useRef,\n useCallback,\n useEffect,\n type CSSProperties,\n} from \"react\";\nimport type { JsonValue, JsonSchema } from \"@visual-json/core\";\nimport { VisualJson } from \"./visual-json\";\nimport { TreeView } from \"./tree-view\";\nimport { FormView } from \"./form-view\";\nimport { SearchBar } from \"./search-bar\";\n\nexport interface JsonEditorProps {\n value?: JsonValue;\n defaultValue?: JsonValue;\n onChange?: (value: JsonValue) => void;\n schema?: JsonSchema | null;\n height?: string | number;\n width?: string | number;\n className?: string;\n style?: CSSProperties;\n readOnly?: boolean;\n treeShowValues?: boolean;\n treeShowCounts?: boolean;\n editorShowDescriptions?: boolean;\n editorShowCounts?: boolean;\n sidebarOpen?: boolean;\n}\n\nconst DEFAULT_CSS_VARS: Record<string, string> = {\n \"--vj-bg\": \"#1e1e1e\",\n \"--vj-bg-panel\": \"#252526\",\n \"--vj-bg-hover\": \"#2a2d2e\",\n \"--vj-bg-selected\": \"#2a5a1e\",\n \"--vj-bg-selected-muted\": \"#2a2d2e\",\n \"--vj-bg-match\": \"#3a3520\",\n \"--vj-bg-match-active\": \"#51502b\",\n \"--vj-border\": \"#333333\",\n \"--vj-border-subtle\": \"#2a2a2a\",\n \"--vj-text\": \"#cccccc\",\n \"--vj-text-muted\": \"#888888\",\n \"--vj-text-dim\": \"#666666\",\n \"--vj-text-dimmer\": \"#555555\",\n \"--vj-string\": \"#ce9178\",\n \"--vj-number\": \"#b5cea8\",\n \"--vj-boolean\": \"#569cd6\",\n \"--vj-accent\": \"#007acc\",\n \"--vj-accent-muted\": \"#094771\",\n \"--vj-input-bg\": \"#3c3c3c\",\n \"--vj-input-border\": \"#555555\",\n \"--vj-error\": \"#f48771\",\n \"--vj-font\": \"monospace\",\n \"--vj-input-font-size\": \"13px\",\n};\n\nexport function JsonEditor({\n value,\n defaultValue,\n onChange,\n schema,\n height = \"100%\",\n width = \"100%\",\n className,\n style,\n readOnly,\n treeShowValues = true,\n treeShowCounts = false,\n editorShowDescriptions = false,\n editorShowCounts = false,\n sidebarOpen = true,\n}: JsonEditorProps) {\n const isControlled = value !== undefined;\n const initialValue = isControlled ? value : (defaultValue ?? {});\n\n const [editorKey, setEditorKey] = useState(0);\n const valueRef = useRef(initialValue);\n\n useEffect(() => {\n if (isControlled && value !== valueRef.current) {\n valueRef.current = value;\n setEditorKey((k) => k + 1);\n }\n }, [value, isControlled]);\n\n const handleChange = useCallback(\n (newValue: JsonValue) => {\n valueRef.current = newValue;\n if (!readOnly) {\n onChange?.(newValue);\n }\n },\n [onChange, readOnly],\n );\n\n const containerStyle: CSSProperties = {\n height: typeof height === \"number\" ? `${height}px` : height,\n width: typeof width === \"number\" ? `${width}px` : width,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...(DEFAULT_CSS_VARS as unknown as CSSProperties),\n ...style,\n };\n\n return (\n <div className={className} data-vj-root=\"\" style={containerStyle}>\n <style\n dangerouslySetInnerHTML={{\n __html: `@media(pointer:coarse){[data-vj-root]{--vj-input-font-size:16px}}`,\n }}\n />\n <VisualJson\n key={editorKey}\n value={valueRef.current}\n onChange={readOnly ? undefined : handleChange}\n schema={schema}\n >\n <EditorLayout\n treeShowValues={treeShowValues}\n treeShowCounts={treeShowCounts}\n editorShowDescriptions={editorShowDescriptions}\n editorShowCounts={editorShowCounts}\n sidebarOpen={sidebarOpen}\n />\n </VisualJson>\n </div>\n );\n}\n\nfunction EditorLayout({\n treeShowValues,\n treeShowCounts,\n editorShowDescriptions,\n editorShowCounts,\n sidebarOpen,\n}: {\n treeShowValues: boolean;\n treeShowCounts: boolean;\n editorShowDescriptions: boolean;\n editorShowCounts: boolean;\n sidebarOpen: boolean;\n}) {\n const [sidebarWidth, setSidebarWidth] = useState(280);\n const [isNarrow, setIsNarrow] = useState(false);\n const [activePanel, setActivePanel] = useState<\"tree\" | \"form\">(\"tree\");\n const containerRef = useRef<HTMLDivElement>(null);\n const dragging = useRef(false);\n const startX = useRef(0);\n const startWidth = useRef(0);\n\n useEffect(() => {\n function checkWidth() {\n if (containerRef.current) {\n setIsNarrow(containerRef.current.offsetWidth < 500);\n }\n }\n checkWidth();\n const observer = new ResizeObserver(checkWidth);\n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n dragging.current = true;\n startX.current = e.clientX;\n startWidth.current = sidebarWidth;\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n\n const handleMouseMove = (ev: MouseEvent) => {\n if (!dragging.current) return;\n const delta = ev.clientX - startX.current;\n const newWidth = Math.max(\n 180,\n Math.min(600, startWidth.current + delta),\n );\n setSidebarWidth(newWidth);\n };\n\n const handleMouseUp = () => {\n dragging.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n },\n [sidebarWidth],\n );\n\n if (isNarrow) {\n if (!sidebarOpen) {\n return (\n <div\n ref={containerRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n minHeight: 0,\n }}\n >\n <div style={{ flex: 1, minHeight: 0 }}>\n <FormView\n showDescriptions={editorShowDescriptions}\n showCounts={editorShowCounts}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n minHeight: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexShrink: 0,\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n }}\n >\n <button\n onClick={() => setActivePanel(\"tree\")}\n style={{\n flex: 1,\n fontSize: 11,\n padding: \"4px 0\",\n cursor: \"pointer\",\n fontFamily: \"var(--vj-font, monospace)\",\n border: \"none\",\n background:\n activePanel === \"tree\"\n ? \"var(--vj-accent-muted, #094771)\"\n : \"transparent\",\n color:\n activePanel === \"tree\"\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-muted, #999999)\",\n }}\n >\n Tree\n </button>\n <button\n onClick={() => setActivePanel(\"form\")}\n style={{\n flex: 1,\n fontSize: 11,\n padding: \"4px 0\",\n cursor: \"pointer\",\n fontFamily: \"var(--vj-font, monospace)\",\n border: \"none\",\n background:\n activePanel === \"form\"\n ? \"var(--vj-accent-muted, #094771)\"\n : \"transparent\",\n color:\n activePanel === \"form\"\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-muted, #999999)\",\n }}\n >\n Form\n </button>\n </div>\n <div style={{ flex: 1, minHeight: 0, overflow: \"hidden\" }}>\n {activePanel === \"tree\" ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n }}\n >\n <SearchBar />\n <div style={{ flex: 1, minHeight: 0, overflow: \"auto\" }}>\n <TreeView\n showValues={treeShowValues}\n showCounts={treeShowCounts}\n />\n </div>\n </div>\n ) : (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n }}\n >\n <div style={{ flex: 1, minHeight: 0 }}>\n <FormView\n showDescriptions={editorShowDescriptions}\n showCounts={editorShowCounts}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div ref={containerRef} style={{ display: \"flex\", flex: 1, minHeight: 0 }}>\n <div\n style={{\n flexShrink: 0,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n width: sidebarOpen ? sidebarWidth : 0,\n transition: \"width 0.2s ease\",\n }}\n >\n <SearchBar />\n <div style={{ flex: 1, minHeight: 0, overflow: \"auto\" }}>\n <TreeView showValues={treeShowValues} showCounts={treeShowCounts} />\n </div>\n </div>\n {sidebarOpen && (\n <div\n style={{\n width: 1,\n flexShrink: 0,\n backgroundColor: \"var(--vj-border, #333333)\",\n position: \"relative\",\n transition: \"background-color 0.15s\",\n }}\n >\n <div\n onMouseDown={handleMouseDown}\n onMouseEnter={(e) => {\n const parent = e.currentTarget.parentElement;\n if (parent)\n parent.style.backgroundColor = \"var(--vj-accent, #007acc)\";\n }}\n onMouseLeave={(e) => {\n if (!dragging.current) {\n const parent = e.currentTarget.parentElement;\n if (parent)\n parent.style.backgroundColor = \"var(--vj-border, #333333)\";\n }\n }}\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: -3,\n width: 7,\n cursor: \"col-resize\",\n zIndex: 10,\n }}\n />\n </div>\n )}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n minWidth: 0,\n overflow: \"hidden\",\n }}\n >\n <div style={{ flex: 1, minHeight: 0 }}>\n <FormView\n showDescriptions={editorShowDescriptions}\n showCounts={editorShowCounts}\n />\n </div>\n </div>\n </div>\n );\n}\n","import {\n useState,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\nimport {\n fromJson,\n toJson,\n History,\n searchNodes,\n getAncestorIds,\n type JsonValue,\n type JsonSchema,\n type TreeState,\n type SearchMatch,\n type TreeNode,\n} from \"@visual-json/core\";\nimport { StudioContext, type StudioState, type StudioActions } from \"./context\";\n\nexport interface VisualJsonProps {\n value: JsonValue;\n onChange?: (value: JsonValue) => void;\n schema?: JsonSchema | null;\n children: ReactNode;\n}\n\nfunction collectAllIds(node: TreeNode): string[] {\n const ids: string[] = [node.id];\n for (const child of node.children) {\n ids.push(...collectAllIds(child));\n }\n return ids;\n}\n\nexport function VisualJson({\n value,\n onChange,\n schema,\n children,\n}: VisualJsonProps) {\n const [tree, setTreeState] = useState<TreeState>(() => fromJson(value));\n const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);\n const [expandedNodeIds, setExpandedNodeIds] = useState<Set<string>>(\n () => new Set([tree.root.id]),\n );\n\n const historyRef = useRef<History>(new History());\n const isInternalChange = useRef(false);\n const hasMounted = useRef(false);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n\n const [searchQuery, setSearchQueryState] = useState(\"\");\n const [searchMatches, setSearchMatches] = useState<SearchMatch[]>([]);\n const [searchMatchIndex, setSearchMatchIndex] = useState(0);\n const [searchMatchNodeIds, setSearchMatchNodeIds] = useState<Set<string>>(\n new Set(),\n );\n\n useEffect(() => {\n historyRef.current.push(tree);\n setCanUndo(historyRef.current.canUndo);\n setCanRedo(historyRef.current.canRedo);\n }, []);\n\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n if (isInternalChange.current) {\n isInternalChange.current = false;\n return;\n }\n const newTree = fromJson(value);\n setTreeState(newTree);\n setExpandedNodeIds(new Set([newTree.root.id]));\n setSelectedNodeId(null);\n historyRef.current = new History();\n historyRef.current.push(newTree);\n setCanUndo(false);\n setCanRedo(false);\n setSearchQueryState(\"\");\n setSearchMatches([]);\n setSearchMatchIndex(0);\n setSearchMatchNodeIds(new Set());\n }, [value]);\n\n const setTree = useCallback(\n (newTree: TreeState) => {\n setTreeState(newTree);\n historyRef.current.push(newTree);\n setCanUndo(historyRef.current.canUndo);\n setCanRedo(historyRef.current.canRedo);\n isInternalChange.current = true;\n onChange?.(toJson(newTree.root));\n },\n [onChange],\n );\n\n const undo = useCallback(() => {\n const prev = historyRef.current.undo();\n if (prev) {\n setTreeState(prev);\n setCanUndo(historyRef.current.canUndo);\n setCanRedo(historyRef.current.canRedo);\n isInternalChange.current = true;\n onChange?.(toJson(prev.root));\n }\n }, [onChange]);\n\n const redo = useCallback(() => {\n const next = historyRef.current.redo();\n if (next) {\n setTreeState(next);\n setCanUndo(historyRef.current.canUndo);\n setCanRedo(historyRef.current.canRedo);\n isInternalChange.current = true;\n onChange?.(toJson(next.root));\n }\n }, [onChange]);\n\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n undo();\n } else if (mod && e.key === \"z\" && e.shiftKey) {\n e.preventDefault();\n redo();\n } else if (mod && e.key === \"y\") {\n e.preventDefault();\n redo();\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [undo, redo]);\n\n const selectNode = useCallback((nodeId: string | null) => {\n setSelectedNodeId(nodeId);\n }, []);\n\n const toggleExpand = useCallback((nodeId: string) => {\n setExpandedNodeIds((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) next.delete(nodeId);\n else next.add(nodeId);\n return next;\n });\n }, []);\n\n const expandNode = useCallback((nodeId: string) => {\n setExpandedNodeIds((prev) => {\n const next = new Set(prev);\n next.add(nodeId);\n return next;\n });\n }, []);\n\n const collapseNode = useCallback((nodeId: string) => {\n setExpandedNodeIds((prev) => {\n const next = new Set(prev);\n next.delete(nodeId);\n return next;\n });\n }, []);\n\n const expandAll = useCallback(() => {\n const allIds = collectAllIds(tree.root);\n setExpandedNodeIds(new Set(allIds));\n }, [tree]);\n\n const collapseAll = useCallback(() => {\n setExpandedNodeIds(new Set([tree.root.id]));\n }, [tree]);\n\n const setSearchQuery = useCallback(\n (query: string) => {\n setSearchQueryState(query);\n if (!query.trim()) {\n setSearchMatches([]);\n setSearchMatchIndex(0);\n setSearchMatchNodeIds(new Set());\n return;\n }\n const matches = searchNodes(tree, query);\n setSearchMatches(matches);\n setSearchMatchIndex(0);\n const matchIds = new Set(matches.map((m) => m.nodeId));\n setSearchMatchNodeIds(matchIds);\n\n if (matches.length > 0) {\n const ancestors = getAncestorIds(\n tree,\n matches.map((m) => m.nodeId),\n );\n setExpandedNodeIds((prev) => {\n const next = new Set(prev);\n for (const id of ancestors) next.add(id);\n return next;\n });\n setSelectedNodeId(matches[0].nodeId);\n }\n },\n [tree],\n );\n\n const nextSearchMatch = useCallback(() => {\n if (searchMatches.length === 0) return;\n const nextIdx = (searchMatchIndex + 1) % searchMatches.length;\n setSearchMatchIndex(nextIdx);\n setSelectedNodeId(searchMatches[nextIdx].nodeId);\n }, [searchMatches, searchMatchIndex]);\n\n const prevSearchMatch = useCallback(() => {\n if (searchMatches.length === 0) return;\n const prevIdx =\n (searchMatchIndex - 1 + searchMatches.length) % searchMatches.length;\n setSearchMatchIndex(prevIdx);\n setSelectedNodeId(searchMatches[prevIdx].nodeId);\n }, [searchMatches, searchMatchIndex]);\n\n useEffect(() => {\n if (!searchQuery.trim()) return;\n const matches = searchNodes(tree, searchQuery);\n setSearchMatches(matches);\n setSearchMatchIndex((prev) =>\n Math.min(prev, Math.max(matches.length - 1, 0)),\n );\n setSearchMatchNodeIds(new Set(matches.map((m) => m.nodeId)));\n }, [tree]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const state: StudioState = useMemo(\n () => ({\n tree,\n selectedNodeId,\n expandedNodeIds,\n schema: schema ?? null,\n searchQuery,\n searchMatches,\n searchMatchIndex,\n searchMatchNodeIds,\n }),\n [\n tree,\n selectedNodeId,\n expandedNodeIds,\n schema,\n searchQuery,\n searchMatches,\n searchMatchIndex,\n searchMatchNodeIds,\n ],\n );\n\n const actions: StudioActions = useMemo(\n () => ({\n setTree,\n selectNode,\n toggleExpand,\n expandNode,\n collapseNode,\n expandAll,\n collapseAll,\n undo,\n redo,\n canUndo,\n canRedo,\n setSearchQuery,\n nextSearchMatch,\n prevSearchMatch,\n }),\n [\n setTree,\n selectNode,\n toggleExpand,\n expandNode,\n collapseNode,\n expandAll,\n collapseAll,\n undo,\n redo,\n canUndo,\n canRedo,\n setSearchQuery,\n nextSearchMatch,\n prevSearchMatch,\n ],\n );\n\n const contextValue = useMemo(() => ({ state, actions }), [state, actions]);\n\n return (\n <StudioContext.Provider value={contextValue}>\n {children}\n </StudioContext.Provider>\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { TreeState, JsonSchema, SearchMatch } from \"@visual-json/core\";\n\nexport interface StudioState {\n tree: TreeState;\n selectedNodeId: string | null;\n expandedNodeIds: Set<string>;\n schema: JsonSchema | null;\n searchQuery: string;\n searchMatches: SearchMatch[];\n searchMatchIndex: number;\n searchMatchNodeIds: Set<string>;\n}\n\nexport interface StudioActions {\n setTree: (tree: TreeState) => void;\n selectNode: (nodeId: string | null) => void;\n toggleExpand: (nodeId: string) => void;\n expandNode: (nodeId: string) => void;\n collapseNode: (nodeId: string) => void;\n expandAll: () => void;\n collapseAll: () => void;\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n setSearchQuery: (query: string) => void;\n nextSearchMatch: () => void;\n prevSearchMatch: () => void;\n}\n\nexport interface StudioContextValue {\n state: StudioState;\n actions: StudioActions;\n}\n\nexport const StudioContext = createContext<StudioContextValue | null>(null);\n\nexport function useStudio(): StudioContextValue {\n const ctx = useContext(StudioContext);\n if (!ctx) {\n throw new Error(\"useStudio must be used within a <VisualJson> provider\");\n }\n return ctx;\n}\n","import { useState, useMemo, useRef, useCallback, useEffect } from \"react\";\nimport type { TreeNode, NodeType } from \"@visual-json/core\";\nimport {\n removeNode,\n getPropertySchema,\n validateNode,\n duplicateNode,\n changeType,\n toJson,\n} from \"@visual-json/core\";\nimport { useStudio } from \"./context\";\nimport { ContextMenu, type ContextMenuEntry } from \"./context-menu\";\nimport { getDisplayKey } from \"./display-key\";\nimport { getVisibleNodes } from \"./get-visible-nodes\";\nimport { useDragDrop, type DragState } from \"./use-drag-drop\";\n\ninterface TreeNodeRowProps {\n node: TreeNode;\n depth: number;\n dragState: DragState;\n showValues: boolean;\n showCounts: boolean;\n isFocused: boolean;\n onDragStart: (nodeId: string) => void;\n onDragOver: (nodeId: string, position: \"before\" | \"after\") => void;\n onDragEnd: () => void;\n onDrop: () => void;\n onContextMenu: (e: React.MouseEvent, node: TreeNode) => void;\n}\n\nfunction TreeNodeRow({\n node,\n depth,\n dragState,\n showValues,\n showCounts,\n isFocused,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n onContextMenu,\n}: TreeNodeRowProps) {\n const { state, actions } = useStudio();\n const isSelected = state.selectedNodeId === node.id;\n const isExpanded = state.expandedNodeIds.has(node.id);\n const isContainer = node.type === \"object\" || node.type === \"array\";\n const [hovered, setHovered] = useState(false);\n const isRoot = node.parentId === null;\n const isSearchMatch = state.searchMatchNodeIds.has(node.id);\n const isActiveMatch =\n state.searchMatches.length > 0 &&\n state.searchMatches[state.searchMatchIndex]?.nodeId === node.id;\n\n const schema = state.schema;\n const nodeSchema = schema ? getPropertySchema(schema, node.path) : undefined;\n const validation = nodeSchema ? validateNode(node, nodeSchema) : null;\n const hasError = validation ? !validation.valid : false;\n\n const isDragTarget = dragState.dropTargetNodeId === node.id;\n const isDraggedNode = dragState.draggedNodeId === node.id;\n\n function displayValue(): string {\n if (isContainer) {\n return node.type === \"array\"\n ? `[${node.children.length}]`\n : `{${node.children.length}}`;\n }\n if (node.value === null) return \"null\";\n if (typeof node.value === \"string\") return node.value;\n return String(node.value);\n }\n\n function handleDragOverEvent(e: React.DragEvent) {\n e.preventDefault();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const midY = rect.top + rect.height / 2;\n const position = e.clientY < midY ? \"before\" : \"after\";\n onDragOver(node.id, position);\n }\n\n let borderTop = \"none\";\n let borderBottom = \"none\";\n if (isDragTarget && dragState.dropPosition === \"before\") {\n borderTop = \"2px solid var(--vj-accent, #007acc)\";\n } else if (isDragTarget && dragState.dropPosition === \"after\") {\n borderBottom = \"2px solid var(--vj-accent, #007acc)\";\n }\n\n return (\n <>\n <div\n role=\"treeitem\"\n aria-selected={isSelected}\n aria-expanded={isContainer ? isExpanded : undefined}\n onClick={() => actions.selectNode(node.id)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onContextMenu={(e) => onContextMenu(e, node)}\n draggable={!isRoot}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n onDragStart(node.id);\n }}\n onDragOver={handleDragOverEvent}\n onDragEnd={onDragEnd}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n data-node-id={node.id}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"3px 8px\",\n paddingLeft: 8 + depth * 16,\n cursor: \"pointer\",\n backgroundColor: isSelected\n ? isFocused\n ? \"var(--vj-bg-selected, #2a5a1e)\"\n : \"var(--vj-bg-selected-muted, var(--vj-bg-hover, #2a2d2e))\"\n : isActiveMatch\n ? \"var(--vj-bg-match-active, #51502b)\"\n : isSearchMatch\n ? \"var(--vj-bg-match, #3a3520)\"\n : hovered\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\",\n minHeight: 28,\n userSelect: \"none\",\n opacity: isDraggedNode ? 0.4 : 1,\n borderTop,\n borderBottom,\n color:\n isSelected && isFocused\n ? \"var(--vj-text-selected, var(--vj-text, #cccccc))\"\n : \"var(--vj-text, #cccccc)\",\n }}\n >\n {isContainer ? (\n <button\n onClick={(e) => {\n e.stopPropagation();\n actions.toggleExpand(node.id);\n }}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 0,\n width: 16,\n fontSize: 9,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"transform 0.15s\",\n transform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n }}\n >\n ▶\n </button>\n ) : (\n <span style={{ width: 16, flexShrink: 0 }} />\n )}\n <span\n style={{\n color: \"inherit\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n flexShrink: 0,\n fontWeight: isRoot ? 600 : 400,\n }}\n >\n {isRoot ? \"/\" : getDisplayKey(node, state.tree)}\n </span>\n {!isRoot && isContainer && showCounts && (\n <span\n style={{\n color: isSelected ? \"inherit\" : \"var(--vj-text-muted, #888888)\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n whiteSpace: \"nowrap\",\n marginLeft: \"auto\",\n }}\n >\n {displayValue()}\n </span>\n )}\n {!isRoot && !isContainer && showValues && (\n <span\n style={{\n color:\n node.type === \"string\"\n ? \"var(--vj-string, #ce9178)\"\n : \"var(--vj-number, #b5cea8)\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n marginLeft: \"auto\",\n }}\n >\n {displayValue()}\n </span>\n )}\n </div>\n {isExpanded &&\n node.children.map((child) => (\n <TreeNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n dragState={dragState}\n showValues={showValues}\n showCounts={showCounts}\n isFocused={isFocused}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n onDrop={onDrop}\n onContextMenu={onContextMenu}\n />\n ))}\n </>\n );\n}\n\nexport interface TreeViewProps {\n className?: string;\n showValues?: boolean;\n showCounts?: boolean;\n}\n\nexport function TreeView({\n className,\n showValues = true,\n showCounts = false,\n}: TreeViewProps) {\n const { state, actions } = useStudio();\n const containerRef = useRef<HTMLDivElement>(null);\n\n const {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n } = useDragDrop();\n\n const [contextMenu, setContextMenu] = useState<{\n x: number;\n y: number;\n node: TreeNode;\n } | null>(null);\n\n const visibleNodes = useMemo(\n () =>\n getVisibleNodes(state.tree.root, (id) => state.expandedNodeIds.has(id)),\n [state.tree.root, state.expandedNodeIds],\n );\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent, node: TreeNode) => {\n e.preventDefault();\n actions.selectNode(node.id);\n setContextMenu({ x: e.clientX, y: e.clientY, node });\n },\n [actions],\n );\n\n const buildContextMenuItems = useCallback(\n (node: TreeNode): ContextMenuEntry[] => {\n const items: ContextMenuEntry[] = [];\n const isContainer = node.type === \"object\" || node.type === \"array\";\n\n if (isContainer) {\n items.push({\n label: \"Expand all children\",\n action: () => {\n function collectIds(n: TreeNode): string[] {\n const ids: string[] = [n.id];\n for (const c of n.children) ids.push(...collectIds(c));\n return ids;\n }\n const allIds = collectIds(node);\n for (const id of allIds) actions.expandNode(id);\n },\n });\n items.push({\n label: \"Collapse all children\",\n action: () => {\n function collectIds(n: TreeNode): string[] {\n const ids: string[] = [];\n for (const c of n.children) {\n ids.push(c.id);\n ids.push(...collectIds(c));\n }\n return ids;\n }\n const childIds = collectIds(node);\n for (const id of childIds) actions.collapseNode(id);\n },\n });\n items.push({ separator: true });\n }\n\n items.push({\n label: \"Copy path\",\n action: () => navigator.clipboard.writeText(node.path).catch(() => {}),\n });\n items.push({\n label: \"Copy value as JSON\",\n action: () => {\n const val = toJson(node);\n const text =\n typeof val === \"string\" ? val : JSON.stringify(val, null, 2);\n navigator.clipboard.writeText(text).catch(() => {});\n },\n });\n\n if (node.parentId) {\n items.push({ separator: true });\n items.push({\n label: \"Duplicate\",\n action: () => {\n const newTree = duplicateNode(state.tree, node.id);\n actions.setTree(newTree);\n },\n });\n\n const typeSubmenu: ContextMenuEntry[] = (\n [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"object\",\n \"array\",\n ] as NodeType[]\n )\n .filter((t) => t !== node.type)\n .map((t) => ({\n label: `Change to ${t}`,\n action: () => {\n const newTree = changeType(state.tree, node.id, t);\n actions.setTree(newTree);\n },\n }));\n items.push({ separator: true });\n items.push(...typeSubmenu);\n\n items.push({ separator: true });\n items.push({\n label: \"Delete\",\n action: () => {\n const newTree = removeNode(state.tree, node.id);\n actions.setTree(newTree);\n },\n });\n }\n\n return items;\n },\n [state.tree, actions],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const currentIndex = visibleNodes.findIndex(\n (n) => n.id === state.selectedNodeId,\n );\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const next = visibleNodes[currentIndex + 1];\n if (next) actions.selectNode(next.id);\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prev = visibleNodes[currentIndex - 1];\n if (prev) actions.selectNode(prev.id);\n break;\n }\n case \"ArrowRight\": {\n e.preventDefault();\n const node = currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (node && (node.type === \"object\" || node.type === \"array\")) {\n if (!state.expandedNodeIds.has(node.id)) {\n actions.expandNode(node.id);\n } else if (node.children.length > 0) {\n actions.selectNode(node.children[0].id);\n }\n }\n break;\n }\n case \"ArrowLeft\": {\n e.preventDefault();\n const current = currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (!current) break;\n const isContainer =\n current.type === \"object\" || current.type === \"array\";\n if (isContainer && state.expandedNodeIds.has(current.id)) {\n actions.collapseNode(current.id);\n } else if (current.parentId) {\n actions.selectNode(current.parentId);\n }\n break;\n }\n case \"Delete\":\n case \"Backspace\": {\n e.preventDefault();\n const toDelete =\n currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (toDelete && toDelete.parentId) {\n const nextSelect =\n visibleNodes[currentIndex + 1] ?? visibleNodes[currentIndex - 1];\n const newTree = removeNode(state.tree, toDelete.id);\n actions.setTree(newTree);\n if (nextSelect && nextSelect.id !== toDelete.id) {\n actions.selectNode(nextSelect.id);\n }\n }\n break;\n }\n }\n },\n [\n visibleNodes,\n state.selectedNodeId,\n state.expandedNodeIds,\n state.tree,\n actions,\n ],\n );\n\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (state.selectedNodeId && containerRef.current) {\n const el = containerRef.current.querySelector(\n `[data-node-id=\"${state.selectedNodeId}\"]`,\n );\n if (el) {\n el.scrollIntoView({ block: \"nearest\" });\n }\n }\n }, [state.selectedNodeId]);\n\n return (\n <>\n <div\n ref={containerRef}\n className={className}\n role=\"tree\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n style={{\n overflow: \"auto\",\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n color: \"var(--vj-text, #cccccc)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 13,\n outline: \"none\",\n flex: 1,\n }}\n >\n <TreeNodeRow\n node={state.tree.root}\n depth={0}\n dragState={dragState}\n showValues={showValues}\n showCounts={showCounts}\n isFocused={isFocused}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDrop={handleDrop}\n onContextMenu={handleContextMenu}\n />\n </div>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n items={buildContextMenuItems(contextMenu.node)}\n onClose={() => setContextMenu(null)}\n />\n )}\n </>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface ContextMenuItem {\n label: string;\n action: () => void;\n disabled?: boolean;\n separator?: false;\n}\n\nexport interface ContextMenuSeparator {\n separator: true;\n}\n\nexport type ContextMenuEntry = ContextMenuItem | ContextMenuSeparator;\n\nexport interface ContextMenuProps {\n x: number;\n y: number;\n items: ContextMenuEntry[];\n onClose: () => void;\n}\n\nexport function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ left: x, top: y });\n\n useEffect(() => {\n if (!ref.current) return;\n const rect = ref.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n setPos({\n left: rect.right > vw ? Math.max(0, x - rect.width) : x,\n top: rect.bottom > vh ? Math.max(0, y - rect.height) : y,\n });\n }, [x, y]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose();\n }\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose]);\n\n return (\n <div\n ref={ref}\n style={{\n position: \"fixed\",\n left: pos.left,\n top: pos.top,\n zIndex: 10000,\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n border: \"1px solid var(--vj-border, #454545)\",\n borderRadius: 4,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.5)\",\n padding: \"4px 0\",\n minWidth: 160,\n }}\n >\n {items.map((item, i) =>\n item.separator ? (\n <div\n key={i}\n style={{\n height: 1,\n backgroundColor: \"var(--vj-border, #454545)\",\n margin: \"4px 0\",\n }}\n />\n ) : (\n <button\n key={i}\n onClick={() => {\n if (!item.disabled) {\n item.action();\n onClose();\n }\n }}\n disabled={item.disabled}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n background: \"none\",\n border: \"none\",\n color: item.disabled\n ? \"var(--vj-text-dimmer, #555555)\"\n : \"var(--vj-text, #cccccc)\",\n cursor: item.disabled ? \"default\" : \"pointer\",\n padding: \"4px 16px\",\n fontSize: 12,\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n onMouseEnter={(e) => {\n if (!item.disabled)\n (e.target as HTMLElement).style.backgroundColor =\n \"var(--vj-accent-muted, #094771)\";\n }}\n onMouseLeave={(e) => {\n (e.target as HTMLElement).style.backgroundColor = \"transparent\";\n }}\n >\n {item.label}\n </button>\n ),\n )}\n </div>\n );\n}\n","import type { TreeNode, TreeState } from \"@visual-json/core\";\n\nconst LABEL_FIELDS = [\"name\", \"type\", \"title\", \"id\", \"label\", \"key\"];\n\n/**\n * For array items that are objects, returns a meaningful label derived from\n * well-known child fields (name, type, title, id, label, key) instead of\n * the numeric index.\n */\nexport function getDisplayKey(node: TreeNode, state: TreeState): string {\n if (node.parentId === null) return \"/\";\n\n const parent = state.nodesById.get(node.parentId);\n if (parent?.type !== \"array\" || node.type !== \"object\") return node.key;\n\n for (const field of LABEL_FIELDS) {\n const child = node.children.find((c) => c.key === field);\n if (child?.value != null && child.value !== \"\") {\n return String(child.value);\n }\n }\n\n return node.key;\n}\n","import type { TreeNode } from \"@visual-json/core\";\n\nexport function getVisibleNodes(\n root: TreeNode,\n isExpanded: (nodeId: string) => boolean,\n): TreeNode[] {\n const result: TreeNode[] = [];\n\n function walk(node: TreeNode) {\n result.push(node);\n if (\n isExpanded(node.id) &&\n (node.type === \"object\" || node.type === \"array\")\n ) {\n for (const child of node.children) {\n walk(child);\n }\n }\n }\n\n walk(root);\n return result;\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport { reorderChildren, moveNode } from \"@visual-json/core\";\nimport { useStudio } from \"./context\";\n\nexport interface DragState {\n draggedNodeId: string | null;\n dropTargetNodeId: string | null;\n dropPosition: \"before\" | \"after\" | null;\n}\n\nconst INITIAL_DRAG_STATE: DragState = {\n draggedNodeId: null,\n dropTargetNodeId: null,\n dropPosition: null,\n};\n\nexport function useDragDrop() {\n const { state, actions } = useStudio();\n const [dragState, setDragState] = useState<DragState>(INITIAL_DRAG_STATE);\n const dragStateRef = useRef<DragState>(dragState);\n dragStateRef.current = dragState;\n\n const handleDragStart = useCallback((nodeId: string) => {\n setDragState({\n draggedNodeId: nodeId,\n dropTargetNodeId: null,\n dropPosition: null,\n });\n }, []);\n\n const handleDragOver = useCallback(\n (nodeId: string, position: \"before\" | \"after\") => {\n setDragState((prev) => ({\n ...prev,\n dropTargetNodeId: nodeId,\n dropPosition: position,\n }));\n },\n [],\n );\n\n const handleDragEnd = useCallback(() => {\n setDragState(INITIAL_DRAG_STATE);\n }, []);\n\n const handleDrop = useCallback(() => {\n const { draggedNodeId, dropTargetNodeId, dropPosition } =\n dragStateRef.current;\n if (!draggedNodeId || !dropTargetNodeId || !dropPosition) return;\n\n const draggedNode = state.tree.nodesById.get(draggedNodeId);\n const targetNode = state.tree.nodesById.get(dropTargetNodeId);\n if (!draggedNode || !targetNode) return;\n\n if (draggedNode.parentId && draggedNode.parentId === targetNode.parentId) {\n const parent = state.tree.nodesById.get(draggedNode.parentId);\n if (parent) {\n const fromIndex = parent.children.findIndex(\n (c) => c.id === draggedNodeId,\n );\n let toIndex = parent.children.findIndex(\n (c) => c.id === dropTargetNodeId,\n );\n if (dropPosition === \"after\") toIndex++;\n if (fromIndex < toIndex) toIndex--;\n if (fromIndex !== toIndex && fromIndex >= 0 && toIndex >= 0) {\n const newTree = reorderChildren(\n state.tree,\n parent.id,\n fromIndex,\n toIndex,\n );\n actions.setTree(newTree);\n }\n }\n } else if (targetNode.parentId) {\n const newParent = state.tree.nodesById.get(targetNode.parentId);\n if (newParent) {\n let toIndex = newParent.children.findIndex(\n (c) => c.id === dropTargetNodeId,\n );\n if (dropPosition === \"after\") toIndex++;\n const newTree = moveNode(\n state.tree,\n draggedNodeId,\n newParent.id,\n toIndex,\n );\n actions.setTree(newTree);\n }\n }\n\n setDragState(INITIAL_DRAG_STATE);\n }, [state.tree, actions]);\n\n return {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n };\n}\n","import { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport {\n setValue,\n setKey,\n addProperty,\n removeNode,\n getPropertySchema,\n resolveRef,\n type TreeNode,\n type JsonSchemaProperty,\n type JsonSchema,\n} from \"@visual-json/core\";\nimport { useStudio } from \"./context\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\nimport { EnumInput } from \"./enum-input\";\nimport { getDisplayKey } from \"./display-key\";\nimport { getVisibleNodes } from \"./get-visible-nodes\";\nimport { useDragDrop, type DragState } from \"./use-drag-drop\";\n\ninterface FormFieldProps {\n node: TreeNode;\n schema: JsonSchema | null;\n rootSchema: JsonSchemaProperty | undefined;\n depth: number;\n showDescriptions: boolean;\n showCounts: boolean;\n formSelectedNodeId: string | null;\n editingNodeId: string | null;\n collapsedIds: Set<string>;\n maxKeyLength: number;\n maxDepth: number;\n isFocused: boolean;\n dragState: DragState;\n onSelect: (nodeId: string) => void;\n onToggleCollapse: (nodeId: string) => void;\n onStartEditing: (nodeId: string) => void;\n onDragStart: (nodeId: string) => void;\n onDragOver: (nodeId: string, position: \"before\" | \"after\") => void;\n onDragEnd: () => void;\n onDrop: () => void;\n}\n\nfunction getResolvedSchema(\n schema: JsonSchema | null,\n rootSchema: JsonSchemaProperty | undefined,\n path: string,\n): JsonSchemaProperty | undefined {\n if (!schema) return undefined;\n const raw = getPropertySchema(schema, path, rootSchema);\n if (!raw) return undefined;\n return resolveRef(raw, rootSchema ?? schema);\n}\n\nfunction getValueColor(node: TreeNode): string {\n if (node.type === \"boolean\" || node.type === \"null\")\n return \"var(--vj-boolean, #569cd6)\";\n if (node.type === \"number\") return \"var(--vj-number, #b5cea8)\";\n return \"var(--vj-string, #ce9178)\";\n}\n\nfunction getDisplayValue(node: TreeNode): string {\n if (node.type === \"null\") return \"null\";\n if (node.type === \"boolean\") return String(node.value);\n if (node.value === null || node.value === undefined) return \"\";\n return String(node.value);\n}\n\nfunction FormField({\n node,\n schema,\n rootSchema,\n depth,\n showDescriptions,\n showCounts,\n formSelectedNodeId,\n editingNodeId,\n collapsedIds,\n maxKeyLength,\n maxDepth,\n isFocused,\n dragState,\n onSelect,\n onToggleCollapse,\n onStartEditing,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n}: FormFieldProps) {\n const { state, actions } = useStudio();\n const isContainer = node.type === \"object\" || node.type === \"array\";\n const collapsed = collapsedIds.has(node.id);\n const isSelected = formSelectedNodeId === node.id;\n const isEditing = editingNodeId === node.id;\n const propSchema = getResolvedSchema(schema, rootSchema, node.path);\n const isRequired = checkRequired(node, schema, rootSchema);\n const [hovered, setHovered] = useState(false);\n\n const isRoot = node.parentId === null;\n const isDragTarget = dragState.dropTargetNodeId === node.id;\n const isDraggedNode = dragState.draggedNodeId === node.id;\n\n function handleDragOverEvent(e: React.DragEvent) {\n e.preventDefault();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const midY = rect.top + rect.height / 2;\n onDragOver(node.id, e.clientY < midY ? \"before\" : \"after\");\n }\n\n let borderTop = \"none\";\n let borderBottom = \"none\";\n if (isDragTarget && dragState.dropPosition === \"before\") {\n borderTop = \"2px solid var(--vj-accent, #007acc)\";\n } else if (isDragTarget && dragState.dropPosition === \"after\") {\n borderBottom = \"2px solid var(--vj-accent, #007acc)\";\n }\n\n const valueRef = useRef<HTMLInputElement | HTMLSelectElement>(null);\n const keyRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!isEditing) return;\n if (!isContainer) {\n const hasValue =\n node.value !== null && node.value !== undefined && node.value !== \"\";\n if (hasValue && valueRef.current) {\n valueRef.current.focus();\n } else if (keyRef.current) {\n keyRef.current.focus();\n }\n } else if (keyRef.current) {\n keyRef.current.focus();\n }\n }, [isEditing, isContainer, node.value]);\n\n const handleValueChange = useCallback(\n (newValue: string) => {\n let parsed: string | number | boolean | null;\n if (\n propSchema?.type === \"boolean\" ||\n newValue === \"true\" ||\n newValue === \"false\"\n ) {\n parsed = newValue === \"true\";\n } else if (newValue === \"null\") {\n parsed = null;\n } else if (\n propSchema?.type === \"number\" ||\n propSchema?.type === \"integer\" ||\n node.type === \"number\"\n ) {\n const num = Number(newValue);\n parsed = isNaN(num) ? newValue : num;\n } else {\n parsed = newValue;\n }\n const newTree = setValue(state.tree, node.id, parsed);\n actions.setTree(newTree);\n },\n [state.tree, node.id, node.type, actions, propSchema],\n );\n\n const handleKeyChange = useCallback(\n (newKey: string) => {\n const newTree = setKey(state.tree, node.id, newKey);\n actions.setTree(newTree);\n },\n [state.tree, node.id, actions],\n );\n\n const handleRemove = useCallback(() => {\n const newTree = removeNode(state.tree, node.id);\n actions.setTree(newTree);\n }, [state.tree, node.id, actions]);\n\n const handleAddChild = useCallback(() => {\n const key =\n node.type === \"array\"\n ? String(node.children.length)\n : `newKey${node.children.length}`;\n const newTree = addProperty(state.tree, node.id, key, \"\");\n actions.setTree(newTree);\n }, [state.tree, node.id, node.type, node.children.length, actions]);\n\n const description = propSchema?.description;\n const defaultVal = propSchema?.default;\n const isDeprecated = propSchema?.deprecated;\n const fieldTitle = propSchema?.title;\n const parentIsObject =\n node.parentId && state.tree.nodesById.get(node.parentId)?.type === \"object\";\n\n const rowBg = isSelected\n ? isFocused\n ? \"var(--vj-bg-selected, #2a5a1e)\"\n : \"var(--vj-bg-selected-muted, var(--vj-bg-hover, #2a2d2e))\"\n : hovered\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\";\n\n const rowColor =\n isSelected && isFocused\n ? \"var(--vj-text-selected, var(--vj-text, #cccccc))\"\n : \"var(--vj-text, #cccccc)\";\n\n if (isContainer) {\n return (\n <div>\n <div\n data-form-node-id={node.id}\n draggable={!isRoot}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n onDragStart(node.id);\n }}\n onDragOver={handleDragOverEvent}\n onDragEnd={onDragEnd}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"3px 8px\",\n paddingLeft: 8 + depth * 16,\n cursor: \"pointer\",\n backgroundColor: rowBg,\n color: rowColor,\n height: 28,\n userSelect: \"none\",\n opacity: isDeprecated ? 0.5 : isDraggedNode ? 0.4 : 1,\n borderTop,\n borderBottom,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelect(node.id);\n }}\n onDoubleClick={() => onToggleCollapse(node.id)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleCollapse(node.id);\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 0,\n width: 16,\n fontSize: 9,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"transform 0.15s\",\n transform: collapsed ? \"rotate(0deg)\" : \"rotate(90deg)\",\n }}\n >\n ▶\n </button>\n {isEditing && !isRoot ? (\n <input\n ref={keyRef}\n value={node.key}\n onChange={(e) => handleKeyChange(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontWeight: 500,\n padding: 0,\n outline: \"none\",\n flexShrink: 0,\n width: `calc(${(maxDepth - depth) * 16}px + ${maxKeyLength}ch)`,\n }}\n />\n ) : (\n <span\n style={{\n color:\n !isRoot && !parentIsObject && !isSelected\n ? \"var(--vj-text-muted, #888888)\"\n : \"inherit\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n fontWeight: 500,\n flexShrink: 0,\n display: \"inline-block\",\n width: `calc(${(maxDepth - depth) * 16}px + ${maxKeyLength}ch)`,\n }}\n >\n {isRoot ? \"/\" : getDisplayKey(node, state.tree)}\n </span>\n )}\n {showDescriptions && fieldTitle && !isSelected && (\n <span\n style={{\n color: \"var(--vj-text-muted, #888888)\",\n fontSize: 11,\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n >\n {fieldTitle}\n </span>\n )}\n {hovered && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleAddChild();\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: isSelected ? \"inherit\" : \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: 0,\n fontSize: 12,\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n >\n + Add {node.type === \"array\" ? \"item\" : \"property\"}\n </button>\n )}\n {showCounts && (\n <span\n style={{\n color: isSelected ? \"inherit\" : \"var(--vj-text-dim, #666666)\",\n fontSize: 12,\n fontFamily: \"var(--vj-font, monospace)\",\n marginLeft: \"auto\",\n }}\n >\n {node.type === \"array\"\n ? `${node.children.length} items`\n : `${node.children.length} properties`}\n </span>\n )}\n {!isRoot && isEditing && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRemove();\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: isSelected ? \"inherit\" : \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px 4px\",\n fontSize: 14,\n fontFamily: \"var(--vj-font, monospace)\",\n ...(!showCounts ? { marginLeft: \"auto\" } : {}),\n }}\n title=\"Remove\"\n >\n ×\n </button>\n )}\n </div>\n {showDescriptions && description && (\n <div\n style={{\n padding: \"2px 12px 4px\",\n paddingLeft: 8 + depth * 16 + 22,\n fontSize: 11,\n color: \"var(--vj-text-dim, #666666)\",\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n >\n {description}\n </div>\n )}\n {!collapsed && (\n <div>\n {node.children.map((child) => (\n <FormField\n key={child.id}\n node={child}\n schema={schema}\n rootSchema={rootSchema}\n depth={depth + 1}\n showDescriptions={showDescriptions}\n showCounts={showCounts}\n formSelectedNodeId={formSelectedNodeId}\n editingNodeId={editingNodeId}\n collapsedIds={collapsedIds}\n maxKeyLength={maxKeyLength}\n maxDepth={maxDepth}\n isFocused={isFocused}\n dragState={dragState}\n onSelect={onSelect}\n onToggleCollapse={onToggleCollapse}\n onStartEditing={onStartEditing}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n onDrop={onDrop}\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n const displayValue = getDisplayValue(node);\n const valueColor = getValueColor(node);\n\n return (\n <div\n data-form-node-id={node.id}\n draggable={!isRoot}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n onDragStart(node.id);\n }}\n onDragOver={handleDragOverEvent}\n onDragEnd={onDragEnd}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"3px 8px\",\n paddingLeft: 8 + depth * 16,\n cursor: \"pointer\",\n backgroundColor: rowBg,\n color: rowColor,\n height: 28,\n userSelect: \"none\",\n opacity: isDeprecated ? 0.5 : isDraggedNode ? 0.4 : 1,\n borderTop,\n borderBottom,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelect(node.id);\n }}\n onDoubleClick={() => onStartEditing(node.id)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <span style={{ width: 16, flexShrink: 0 }} />\n {isEditing && parentIsObject ? (\n <input\n ref={keyRef}\n value={node.key}\n onChange={(e) => handleKeyChange(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === \"Tab\" && !e.shiftKey && valueRef.current) {\n e.preventDefault();\n valueRef.current.focus();\n }\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: 0,\n flexShrink: 0,\n outline: \"none\",\n width: `calc(${(maxDepth - depth) * 16}px + ${maxKeyLength}ch)`,\n }}\n />\n ) : (\n <span\n style={{\n color:\n !parentIsObject && !isSelected\n ? \"var(--vj-text-muted, #888888)\"\n : \"inherit\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n flexShrink: 0,\n display: \"inline-block\",\n width: `calc(${(maxDepth - depth) * 16}px + ${maxKeyLength}ch)`,\n }}\n >\n {getDisplayKey(node, state.tree)}\n </span>\n )}\n {isRequired && !isSelected && (\n <span\n style={{\n color: \"var(--vj-error, #f48771)\",\n fontSize: 10,\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n >\n *\n </span>\n )}\n {isEditing ? (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0,\n }}\n >\n {renderEditInput(\n node,\n propSchema,\n displayValue,\n handleValueChange,\n valueRef as React.RefObject<HTMLInputElement | HTMLSelectElement>,\n valueColor,\n )}\n </div>\n ) : (\n <span\n style={{\n color: valueColor,\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n fontStyle: node.type === \"null\" ? \"italic\" : undefined,\n }}\n >\n {displayValue}\n </span>\n )}\n {isEditing && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRemove();\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: isSelected ? \"inherit\" : \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px 4px\",\n fontSize: 14,\n fontFamily: \"var(--vj-font, monospace)\",\n flexShrink: 0,\n }}\n title=\"Remove\"\n >\n ×\n </button>\n )}\n </div>\n );\n}\n\nfunction renderEditInput(\n node: TreeNode,\n propSchema: JsonSchemaProperty | undefined,\n displayValue: string,\n handleValueChange: (val: string) => void,\n inputRef: React.RefObject<HTMLInputElement | HTMLSelectElement>,\n valueColor: string,\n) {\n const hasEnumValues = propSchema?.enum && propSchema.enum.length > 0;\n\n const inputStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: 0,\n flex: 1,\n outline: \"none\",\n color: valueColor,\n };\n\n if (node.type === \"boolean\") {\n return (\n <EnumInput\n enumValues={[\"true\", \"false\"]}\n value={String(node.value)}\n onValueChange={handleValueChange}\n inputRef={inputRef as React.RefObject<HTMLInputElement>}\n inputStyle={inputStyle}\n />\n );\n }\n\n if (hasEnumValues && propSchema?.enum) {\n return (\n <EnumInput\n enumValues={propSchema.enum}\n value={displayValue}\n onValueChange={handleValueChange}\n inputRef={inputRef as React.RefObject<HTMLInputElement>}\n inputStyle={inputStyle}\n />\n );\n }\n\n if (node.type === \"null\") {\n return (\n <span\n style={{\n color: \"var(--vj-boolean, #569cd6)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 13,\n fontStyle: \"italic\",\n flex: 1,\n }}\n >\n null\n </span>\n );\n }\n\n return (\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n value={displayValue}\n onChange={(e) => handleValueChange(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n placeholder={\n propSchema?.default !== undefined\n ? String(propSchema.default)\n : \"<value>\"\n }\n style={inputStyle}\n />\n );\n}\n\nfunction checkRequired(\n node: TreeNode,\n schema: JsonSchema | null,\n rootSchema: JsonSchemaProperty | undefined,\n): boolean {\n if (!schema || !node.parentId) return false;\n const parentPath = node.path.split(\"/\").slice(0, -1).join(\"/\") || \"/\";\n const parentSchema = getResolvedSchema(schema, rootSchema, parentPath);\n return parentSchema?.required?.includes(node.key) ?? false;\n}\n\nexport interface FormViewProps {\n className?: string;\n showDescriptions?: boolean;\n showCounts?: boolean;\n}\n\nexport function FormView({\n className,\n showDescriptions = false,\n showCounts = false,\n}: FormViewProps) {\n const { state, actions } = useStudio();\n const rootSchema = state.schema ?? undefined;\n const selectedNode = state.selectedNodeId\n ? state.tree.nodesById.get(state.selectedNodeId)\n : null;\n const displayNode = selectedNode ?? state.tree.root;\n\n const [formSelectedNodeId, setFormSelectedNodeId] = useState<string | null>(\n null,\n );\n const [editingNodeId, setEditingNodeId] = useState<string | null>(null);\n const preEditTreeRef = useRef<typeof state.tree | null>(null);\n const [collapsedIds, setCollapsedIds] = useState<Set<string>>(\n () => new Set<string>(),\n );\n const containerRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n const {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n } = useDragDrop();\n\n useEffect(() => {\n setFormSelectedNodeId(null);\n setEditingNodeId(null);\n setCollapsedIds(new Set<string>());\n }, [displayNode.id]);\n\n const visibleNodes = useMemo(\n () => getVisibleNodes(displayNode, (id) => !collapsedIds.has(id)),\n [displayNode, collapsedIds],\n );\n\n const { maxKeyLength, maxDepth } = useMemo(() => {\n let maxKey = 1;\n let maxD = 0;\n const baseSegments =\n displayNode.path === \"/\"\n ? 0\n : displayNode.path.split(\"/\").filter(Boolean).length;\n for (const node of visibleNodes) {\n const keyText =\n node.parentId === null ? \"/\" : getDisplayKey(node, state.tree);\n if (keyText.length > maxKey) maxKey = keyText.length;\n const segments =\n node.path === \"/\" ? 0 : node.path.split(\"/\").filter(Boolean).length;\n const depth = segments - baseSegments;\n if (depth > maxD) maxD = depth;\n }\n return { maxKeyLength: maxKey, maxDepth: maxD };\n }, [visibleNodes, displayNode.path, state.tree]);\n\n const handleSelect = useCallback((nodeId: string) => {\n setFormSelectedNodeId(nodeId);\n setEditingNodeId(null);\n }, []);\n\n const handleToggleCollapse = useCallback((nodeId: string) => {\n setCollapsedIds((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) {\n next.delete(nodeId);\n } else {\n next.add(nodeId);\n }\n return next;\n });\n }, []);\n\n const handleStartEditing = useCallback(\n (nodeId: string) => {\n preEditTreeRef.current = state.tree;\n setEditingNodeId(nodeId);\n },\n [state.tree],\n );\n\n const scrollToNode = useCallback((nodeId: string) => {\n requestAnimationFrame(() => {\n const el = containerRef.current?.querySelector(\n `[data-form-node-id=\"${nodeId}\"]`,\n );\n el?.scrollIntoView({ block: \"nearest\" });\n });\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (editingNodeId) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n if (preEditTreeRef.current) {\n actions.setTree(preEditTreeRef.current);\n preEditTreeRef.current = null;\n }\n setEditingNodeId(null);\n containerRef.current?.focus();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n preEditTreeRef.current = null;\n setEditingNodeId(null);\n containerRef.current?.focus();\n }\n return;\n }\n\n const currentIndex = visibleNodes.findIndex(\n (n) => n.id === formSelectedNodeId,\n );\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const next = visibleNodes[currentIndex + 1];\n if (next) {\n setFormSelectedNodeId(next.id);\n scrollToNode(next.id);\n }\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prev = visibleNodes[currentIndex - 1];\n if (prev) {\n setFormSelectedNodeId(prev.id);\n scrollToNode(prev.id);\n }\n break;\n }\n case \"ArrowRight\": {\n e.preventDefault();\n const node = currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (node && (node.type === \"object\" || node.type === \"array\")) {\n if (collapsedIds.has(node.id)) {\n setCollapsedIds((prev) => {\n const next = new Set(prev);\n next.delete(node.id);\n return next;\n });\n } else if (node.children.length > 0) {\n setFormSelectedNodeId(node.children[0].id);\n scrollToNode(node.children[0].id);\n }\n }\n break;\n }\n case \"ArrowLeft\": {\n e.preventDefault();\n const current = currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (!current) break;\n const isContainer =\n current.type === \"object\" || current.type === \"array\";\n if (isContainer && !collapsedIds.has(current.id)) {\n setCollapsedIds((prev) => {\n const next = new Set(prev);\n next.add(current.id);\n return next;\n });\n } else if (current.parentId) {\n const parentInVisible = visibleNodes.find(\n (n) => n.id === current.parentId,\n );\n if (parentInVisible) {\n setFormSelectedNodeId(parentInVisible.id);\n scrollToNode(parentInVisible.id);\n }\n }\n break;\n }\n case \"Enter\": {\n e.preventDefault();\n if (formSelectedNodeId) {\n preEditTreeRef.current = state.tree;\n setEditingNodeId(formSelectedNodeId);\n }\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n setEditingNodeId(null);\n break;\n }\n case \"Delete\":\n case \"Backspace\": {\n e.preventDefault();\n const toDelete =\n currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (toDelete && toDelete.parentId) {\n const nextSelect =\n visibleNodes[currentIndex + 1] ?? visibleNodes[currentIndex - 1];\n const newTree = removeNode(state.tree, toDelete.id);\n actions.setTree(newTree);\n if (nextSelect && nextSelect.id !== toDelete.id) {\n setFormSelectedNodeId(nextSelect.id);\n } else {\n setFormSelectedNodeId(null);\n }\n }\n break;\n }\n }\n },\n [\n visibleNodes,\n formSelectedNodeId,\n editingNodeId,\n collapsedIds,\n scrollToNode,\n state.tree,\n actions,\n ],\n );\n\n return (\n <div\n className={className}\n style={{\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n color: \"var(--vj-text, #cccccc)\",\n height: \"100%\",\n fontFamily: \"var(--vj-font, monospace)\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <div\n style={{\n padding: \"4px 8px\",\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n flexShrink: 0,\n }}\n >\n <Breadcrumbs />\n </div>\n <div\n ref={containerRef}\n data-form-container\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsFocused(false);\n }\n }}\n style={{\n flex: 1,\n overflow: \"auto\",\n outline: \"none\",\n }}\n >\n <FormField\n node={displayNode}\n schema={state.schema}\n rootSchema={rootSchema}\n depth={0}\n showDescriptions={showDescriptions}\n showCounts={showCounts}\n formSelectedNodeId={formSelectedNodeId}\n editingNodeId={editingNodeId}\n collapsedIds={collapsedIds}\n maxKeyLength={maxKeyLength}\n maxDepth={maxDepth}\n isFocused={isFocused}\n dragState={dragState}\n onSelect={handleSelect}\n onToggleCollapse={handleToggleCollapse}\n onStartEditing={handleStartEditing}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDrop={handleDrop}\n />\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback, useMemo } from \"react\";\nimport { useStudio } from \"./context\";\n\nexport interface BreadcrumbsProps {\n className?: string;\n}\n\nconst MAX_SUGGESTIONS = 20;\nconst DROPDOWN_MAX_HEIGHT = 200;\n\nexport function Breadcrumbs({ className }: BreadcrumbsProps) {\n const { state, actions } = useStudio();\n const selectedNode = state.selectedNodeId\n ? state.tree.nodesById.get(state.selectedNodeId)\n : null;\n\n const currentPath = selectedNode?.path ?? \"/\";\n\n const [inputValue, setInputValue] = useState(currentPath);\n const [open, setOpen] = useState(false);\n const [highlightIndex, setHighlightIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setInputValue(currentPath);\n }, [currentPath]);\n\n const suggestions = useMemo(() => {\n if (!open) return [];\n const query = inputValue.toLowerCase();\n const matches: { id: string; path: string }[] = [];\n for (const [id, node] of state.tree.nodesById) {\n if (node.path.toLowerCase().startsWith(query)) {\n matches.push({ id, path: node.path });\n }\n if (matches.length >= MAX_SUGGESTIONS) break;\n }\n matches.sort((a, b) => a.path.localeCompare(b.path));\n return matches;\n }, [open, inputValue, state.tree.nodesById]);\n\n useEffect(() => {\n setHighlightIndex(0);\n }, [suggestions]);\n\n const navigateTo = useCallback(\n (path: string) => {\n for (const [id, node] of state.tree.nodesById) {\n if (node.path === path) {\n actions.selectNode(id);\n break;\n }\n }\n setOpen(false);\n inputRef.current?.blur();\n },\n [state.tree.nodesById, actions],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\") {\n setOpen(true);\n e.preventDefault();\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setHighlightIndex((i) => Math.min(i + 1, suggestions.length - 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setHighlightIndex((i) => Math.max(i - 1, 0));\n break;\n case \"Enter\":\n e.preventDefault();\n if (suggestions.length > 0 && highlightIndex < suggestions.length) {\n navigateTo(suggestions[highlightIndex].path);\n } else {\n const trimmed = inputValue.trim() || \"/\";\n navigateTo(trimmed);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n setInputValue(currentPath);\n setOpen(false);\n inputRef.current?.blur();\n break;\n }\n },\n [open, suggestions, highlightIndex, inputValue, currentPath, navigateTo],\n );\n\n useEffect(() => {\n const el = listRef.current;\n if (!el || !open) return;\n const item = el.children[highlightIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: \"nearest\" });\n }, [highlightIndex, open]);\n\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(e.target as Node)\n ) {\n setInputValue(currentPath);\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [currentPath]);\n\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{ position: \"relative\", flex: 1, minWidth: 0 }}\n >\n <input\n ref={inputRef}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={(e) => {\n e.target.select();\n setOpen(true);\n }}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n autoComplete=\"off\"\n style={{\n width: \"100%\",\n boxSizing: \"border-box\",\n padding: \"2px 0\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontFamily: \"var(--vj-font, monospace)\",\n color: \"var(--vj-text-muted, #999999)\",\n background: \"transparent\",\n border: \"none\",\n outline: \"none\",\n }}\n />\n\n {open && suggestions.length > 0 && (\n <div\n ref={listRef}\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: -12,\n right: -12,\n zIndex: 50,\n maxHeight: DROPDOWN_MAX_HEIGHT,\n overflowY: \"auto\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n border: \"1px solid var(--vj-border, #333333)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n }}\n >\n {suggestions.map((s, i) => (\n <div\n key={s.id}\n onMouseDown={(e) => {\n e.preventDefault();\n navigateTo(s.path);\n }}\n onMouseEnter={() => setHighlightIndex(i)}\n style={{\n padding: \"4px 12px\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n color:\n i === highlightIndex\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-muted, #888888)\",\n backgroundColor:\n i === highlightIndex\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {s.path}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n type CSSProperties,\n type RefObject,\n type KeyboardEvent,\n} from \"react\";\nimport type { JsonValue } from \"@visual-json/core\";\n\nconst DROPDOWN_MAX_HEIGHT = 200;\n\ninterface EnumInputProps {\n enumValues: JsonValue[];\n value: string;\n onValueChange: (val: string) => void;\n inputRef: RefObject<HTMLInputElement | null>;\n inputStyle: CSSProperties;\n}\n\nexport function EnumInput({\n enumValues,\n value,\n onValueChange,\n inputRef,\n inputStyle,\n}: EnumInputProps) {\n const [inputValue, setInputValue] = useState(value);\n const [open, setOpen] = useState(false);\n const [highlightIndex, setHighlightIndex] = useState(0);\n const listRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setInputValue(value);\n }, [value]);\n\n const suggestions = useMemo(\n () => enumValues.map((v) => String(v)),\n [enumValues],\n );\n\n useEffect(() => {\n setHighlightIndex(0);\n }, [suggestions]);\n\n const selectValue = useCallback(\n (val: string) => {\n onValueChange(val);\n setInputValue(val);\n setOpen(false);\n },\n [onValueChange],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n e.stopPropagation();\n setOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n e.stopPropagation();\n setHighlightIndex((i) => Math.min(i + 1, suggestions.length - 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n e.stopPropagation();\n setHighlightIndex((i) => Math.max(i - 1, 0));\n break;\n case \"Enter\":\n e.preventDefault();\n e.stopPropagation();\n if (suggestions.length > 0 && highlightIndex < suggestions.length) {\n selectValue(suggestions[highlightIndex]);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation();\n setInputValue(value);\n setOpen(false);\n break;\n case \"Tab\":\n setInputValue(value);\n setOpen(false);\n break;\n }\n },\n [open, suggestions, highlightIndex, value, selectValue],\n );\n\n useEffect(() => {\n const el = listRef.current;\n if (!el || !open) return;\n const item = el.children[highlightIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: \"nearest\" });\n }, [highlightIndex, open]);\n\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(e.target as Node)\n ) {\n setInputValue(value);\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [value]);\n\n return (\n <div\n ref={wrapperRef}\n style={{ position: \"relative\", flex: 1, minWidth: 0 }}\n >\n <input\n ref={inputRef}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n spellCheck={false}\n autoComplete=\"off\"\n style={inputStyle}\n />\n\n {open && suggestions.length > 0 && (\n <div\n ref={listRef}\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: -32,\n right: 0,\n zIndex: 50,\n maxHeight: DROPDOWN_MAX_HEIGHT,\n overflowY: \"auto\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n border: \"1px solid var(--vj-border, #333333)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n }}\n >\n {suggestions.map((s, i) => (\n <div\n key={s}\n onMouseDown={(e) => {\n e.preventDefault();\n selectValue(s);\n }}\n onMouseEnter={() => setHighlightIndex(i)}\n style={{\n padding: \"4px 12px\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color:\n i === highlightIndex\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-muted, #888888)\",\n backgroundColor:\n i === highlightIndex\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n <span style={{ width: 14, flexShrink: 0, fontSize: 12 }}>\n {s === value ? \"✓\" : \"\"}\n </span>\n {s}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useRef, useEffect, useCallback } from \"react\";\nimport { useStudio } from \"./context\";\n\nexport interface SearchBarProps {\n className?: string;\n}\n\nexport function SearchBar({ className }: SearchBarProps) {\n const { state, actions } = useStudio();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (e.shiftKey) {\n actions.prevSearchMatch();\n } else {\n actions.nextSearchMatch();\n }\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n actions.setSearchQuery(\"\");\n inputRef.current?.blur();\n }\n },\n [actions],\n );\n\n useEffect(() => {\n function handleGlobalKeyDown(e: KeyboardEvent) {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key === \"f\") {\n e.preventDefault();\n inputRef.current?.focus();\n inputRef.current?.select();\n }\n }\n document.addEventListener(\"keydown\", handleGlobalKeyDown);\n return () => document.removeEventListener(\"keydown\", handleGlobalKeyDown);\n }, []);\n\n const matchCount = state.searchMatches.length;\n const currentMatch = matchCount > 0 ? state.searchMatchIndex + 1 : 0;\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={state.searchQuery}\n onChange={(e) => actions.setSearchQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Search...\"\n style={{\n flex: 1,\n background: \"none\",\n border: \"none\",\n borderRadius: 3,\n color: \"var(--vj-text, #cccccc)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: \"3px 8px\",\n outline: \"none\",\n minWidth: 0,\n }}\n />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n flexShrink: 0,\n height: 18,\n }}\n >\n {state.searchQuery ? (\n <>\n <span\n style={{\n fontSize: 11,\n lineHeight: 1,\n color:\n matchCount > 0\n ? \"var(--vj-text-muted, #999999)\"\n : \"var(--vj-error, #f48771)\",\n fontFamily: \"var(--vj-font, monospace)\",\n whiteSpace: \"nowrap\",\n }}\n >\n {matchCount > 0 ? `${currentMatch}/${matchCount}` : \"0/0\"}\n </span>\n <button\n onClick={actions.prevSearchMatch}\n disabled={matchCount === 0}\n aria-label=\"Previous match (Shift+Enter)\"\n style={{\n background: \"none\",\n border: \"none\",\n color:\n matchCount > 0\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-dimmer, #555555)\",\n cursor: matchCount > 0 ? \"pointer\" : \"default\",\n padding: 0,\n fontSize: 10,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 18,\n height: 18,\n }}\n title=\"Previous match (Shift+Enter)\"\n >\n ▲\n </button>\n <button\n onClick={actions.nextSearchMatch}\n disabled={matchCount === 0}\n aria-label=\"Next match (Enter)\"\n style={{\n background: \"none\",\n border: \"none\",\n color:\n matchCount > 0\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-dimmer, #555555)\",\n cursor: matchCount > 0 ? \"pointer\" : \"default\",\n padding: 0,\n fontSize: 10,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 18,\n height: 18,\n }}\n title=\"Next match (Enter)\"\n >\n ▼\n </button>\n <button\n onClick={() => actions.setSearchQuery(\"\")}\n aria-label=\"Clear search (Esc)\"\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--vj-text, #cccccc)\",\n cursor: \"pointer\",\n padding: 0,\n fontSize: 14,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 18,\n height: 18,\n }}\n title=\"Clear search (Esc)\"\n >\n ×\n </button>\n </>\n ) : (\n <>\n <button\n onClick={actions.expandAll}\n aria-label=\"Expand all\"\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px\",\n fontSize: 12,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n title=\"Expand all\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 2v4M5 4l3-2 3 2\" />\n <path d=\"M8 14v-4M5 12l3 2 3-2\" />\n <path d=\"M2 8h12\" />\n </svg>\n </button>\n <button\n onClick={actions.collapseAll}\n aria-label=\"Collapse all\"\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px\",\n fontSize: 12,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n title=\"Collapse all\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 5V1M5 3l3 2 3-2\" />\n <path d=\"M8 11v4M5 13l3-2 3 2\" />\n <path d=\"M2 8h12\" />\n </svg>\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport {\n setValue,\n setKey,\n addProperty,\n removeNode,\n changeType,\n duplicateNode,\n toJson,\n getPropertySchema,\n resolveRef,\n type TreeNode,\n type NodeType,\n type JsonSchemaProperty,\n} from \"@visual-json/core\";\nimport { EnumInput } from \"./enum-input\";\nimport { useStudio } from \"./context\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\n\nconst ALL_TYPES: NodeType[] = [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"object\",\n \"array\",\n];\n\ninterface PropertyRowProps {\n node: TreeNode;\n schemaProperty?: JsonSchemaProperty;\n}\n\nfunction PropertyRow({ node, schemaProperty }: PropertyRowProps) {\n const { state, actions } = useStudio();\n const isContainer = node.type === \"object\" || node.type === \"array\";\n const [hoveredRow, setHoveredRow] = useState(false);\n const enumRef = useRef<HTMLInputElement>(null);\n\n function handleValueChange(newValue: string) {\n let parsed: string | number | boolean | null;\n if (newValue === \"null\") parsed = null;\n else if (newValue === \"true\") parsed = true;\n else if (newValue === \"false\") parsed = false;\n else if (\n (node.type === \"number\" ||\n schemaProperty?.type === \"number\" ||\n schemaProperty?.type === \"integer\") &&\n !isNaN(Number(newValue)) &&\n newValue.trim() !== \"\"\n )\n parsed = Number(newValue);\n else parsed = newValue;\n\n const newTree = setValue(state.tree, node.id, parsed);\n actions.setTree(newTree);\n }\n\n function handleKeyChange(newKey: string) {\n const newTree = setKey(state.tree, node.id, newKey);\n actions.setTree(newTree);\n }\n\n function handleRemove() {\n const newTree = removeNode(state.tree, node.id);\n actions.setTree(newTree);\n }\n\n function handleAddChild() {\n const key =\n node.type === \"array\"\n ? String(node.children.length)\n : `key${node.children.length}`;\n const newTree = addProperty(state.tree, node.id, key, \"\");\n actions.setTree(newTree);\n }\n\n function displayValue(): string {\n if (isContainer) {\n return node.type === \"array\"\n ? `[${node.children.length} items]`\n : `{${node.children.length} keys}`;\n }\n if (node.value === null) return \"\";\n if (node.value === undefined) return \"\";\n if (typeof node.value === \"string\" && node.value === \"\") return \"\";\n return String(node.value);\n }\n\n const hasEnumValues = schemaProperty?.enum && schemaProperty.enum.length > 0;\n const description = schemaProperty?.description;\n\n return (\n <div\n onMouseEnter={() => setHoveredRow(true)}\n onMouseLeave={() => setHoveredRow(false)}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"4px 12px\",\n borderBottom: \"1px solid var(--vj-border-subtle, #2a2a2a)\",\n minHeight: 32,\n backgroundColor: hoveredRow\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\",\n }}\n >\n <input\n value={node.key}\n onChange={(e) => handleKeyChange(e.target.value)}\n style={{\n background: \"none\",\n border: \"1px solid transparent\",\n borderRadius: 3,\n color: \"var(--vj-text, #cccccc)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: \"2px 6px\",\n width: 140,\n flexShrink: 0,\n }}\n />\n {!isContainer ? (\n hasEnumValues ? (\n <EnumInput\n enumValues={schemaProperty!.enum!}\n value={displayValue()}\n onValueChange={handleValueChange}\n inputRef={enumRef}\n inputStyle={{\n background: \"none\",\n border: \"1px solid transparent\",\n borderRadius: 3,\n color:\n node.type === \"string\"\n ? \"var(--vj-string, #ce9178)\"\n : \"var(--vj-number, #b5cea8)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: \"2px 6px\",\n flex: 1,\n outline: \"none\",\n }}\n />\n ) : (\n <input\n value={displayValue()}\n onChange={(e) => handleValueChange(e.target.value)}\n placeholder=\"<value>\"\n style={{\n background: \"none\",\n border: \"1px solid transparent\",\n borderRadius: 3,\n color:\n node.type === \"string\"\n ? \"var(--vj-string, #ce9178)\"\n : \"var(--vj-number, #b5cea8)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: \"2px 6px\",\n flex: 1,\n textAlign: \"right\",\n }}\n />\n )\n ) : (\n <span\n style={{\n color: \"var(--vj-text-dim, #666666)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 13,\n flex: 1,\n textAlign: \"right\",\n }}\n >\n {displayValue()}\n </span>\n )}\n <div\n style={{\n display: \"flex\",\n gap: 2,\n opacity: hoveredRow ? 1 : 0,\n transition: \"opacity 0.1s\",\n flexShrink: 0,\n }}\n >\n {isContainer && (\n <button\n onClick={handleAddChild}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px 4px\",\n fontSize: 15,\n fontFamily: \"var(--vj-font, monospace)\",\n borderRadius: 3,\n lineHeight: 1,\n }}\n title=\"Add child\"\n >\n +\n </button>\n )}\n <button\n onClick={handleRemove}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px 4px\",\n fontSize: 15,\n fontFamily: \"var(--vj-font, monospace)\",\n borderRadius: 3,\n lineHeight: 1,\n }}\n title=\"Remove\"\n >\n ×\n </button>\n </div>\n </div>\n {description && (\n <div\n style={{\n padding: \"2px 12px 4px 44px\",\n fontSize: 11,\n color: \"var(--vj-text-dim, #666666)\",\n fontFamily: \"var(--vj-font, monospace)\",\n borderBottom: \"1px solid var(--vj-border-subtle, #2a2a2a)\",\n }}\n >\n {description}\n </div>\n )}\n </div>\n );\n}\n\nexport interface PropertyEditorProps {\n className?: string;\n}\n\nexport function PropertyEditor({ className }: PropertyEditorProps) {\n const { state, actions } = useStudio();\n const selectedNode = state.selectedNodeId\n ? state.tree.nodesById.get(state.selectedNodeId)\n : null;\n\n const handleChangeType = useCallback(\n (newType: NodeType) => {\n if (!selectedNode) return;\n const newTree = changeType(state.tree, selectedNode.id, newType);\n actions.setTree(newTree);\n },\n [state.tree, selectedNode, actions],\n );\n\n const handleDuplicate = useCallback(() => {\n if (!selectedNode) return;\n const newTree = duplicateNode(state.tree, selectedNode.id);\n actions.setTree(newTree);\n }, [state.tree, selectedNode, actions]);\n\n const handleCopyPath = useCallback(() => {\n if (!selectedNode) return;\n navigator.clipboard.writeText(selectedNode.path).catch(() => {});\n }, [selectedNode]);\n\n const handleCopyValue = useCallback(() => {\n if (!selectedNode) return;\n const value = toJson(selectedNode);\n const text =\n typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n navigator.clipboard.writeText(text).catch(() => {});\n }, [selectedNode]);\n\n if (!selectedNode) {\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n color: \"var(--vj-text-dimmer, #555555)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 13,\n height: \"100%\",\n }}\n >\n Select a node to edit\n </div>\n );\n }\n\n const isContainer =\n selectedNode.type === \"object\" || selectedNode.type === \"array\";\n\n const schema = state.schema ?? undefined;\n const schemaTitle = schema?.title;\n\n function getChildSchema(childKey: string): JsonSchemaProperty | undefined {\n if (!schema || !selectedNode) return undefined;\n const childPath =\n selectedNode.path === \"/\"\n ? `/${childKey}`\n : `${selectedNode.path}/${childKey}`;\n const raw = getPropertySchema(schema, childPath);\n return raw ? resolveRef(raw, schema) : undefined;\n }\n\n function handleAdd() {\n if (!selectedNode) return;\n const key =\n selectedNode.type === \"array\"\n ? String(selectedNode.children.length)\n : `key${selectedNode.children.length}`;\n const newTree = addProperty(state.tree, selectedNode.id, key, \"\");\n actions.setTree(newTree);\n }\n\n return (\n <div\n className={className}\n style={{\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n color: \"var(--vj-text, #cccccc)\",\n overflow: \"auto\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"6px 12px\",\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n fontSize: 12,\n color: \"var(--vj-text-muted, #999999)\",\n fontFamily: \"var(--vj-font, monospace)\",\n flexShrink: 0,\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n flex: 1,\n minWidth: 0,\n }}\n >\n <Breadcrumbs />\n {schemaTitle && (\n <span\n style={{ fontSize: 10, color: \"var(--vj-text-dim, #666666)\" }}\n >\n {schemaTitle}\n </span>\n )}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n flexShrink: 0,\n }}\n >\n <select\n value={selectedNode.type}\n onChange={(e) => handleChangeType(e.target.value as NodeType)}\n style={{\n background: \"var(--vj-input-bg, #3c3c3c)\",\n border: \"1px solid var(--vj-input-border, #555555)\",\n borderRadius: 3,\n color: \"var(--vj-text, #cccccc)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontFamily: \"var(--vj-font, monospace)\",\n padding: \"1px 4px\",\n cursor: \"pointer\",\n }}\n title=\"Change type\"\n >\n {ALL_TYPES.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n <button\n onClick={handleCopyPath}\n style={actionButtonStyle}\n title=\"Copy path\"\n >\n path\n </button>\n <button\n onClick={handleCopyValue}\n style={actionButtonStyle}\n title=\"Copy value\"\n >\n value\n </button>\n {selectedNode.parentId && (\n <button\n onClick={handleDuplicate}\n style={actionButtonStyle}\n title=\"Duplicate\"\n >\n dup\n </button>\n )}\n {isContainer && (\n <button\n onClick={handleAdd}\n style={{\n ...actionButtonStyle,\n border: \"1px solid var(--vj-input-border, #555555)\",\n }}\n >\n + Add\n </button>\n )}\n </div>\n </div>\n <div style={{ flex: 1, overflow: \"auto\" }}>\n {isContainer ? (\n selectedNode.children.map((child) => (\n <PropertyRow\n key={child.id}\n node={child}\n schemaProperty={getChildSchema(child.key)}\n />\n ))\n ) : (\n <PropertyRow node={selectedNode} />\n )}\n </div>\n </div>\n );\n}\n\nconst actionButtonStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n borderRadius: 3,\n color: \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"1px 6px\",\n fontSize: 11,\n fontFamily: \"var(--vj-font, monospace)\",\n};\n","import { useMemo } from \"react\";\nimport { computeDiff, type DiffEntry, type DiffType } from \"@visual-json/core\";\n\nconst DIFF_COLORS: Record<\n DiffType,\n { bg: string; marker: string; label: string }\n> = {\n added: { bg: \"#1e3a1e\", marker: \"+\", label: \"#4ec94e\" },\n removed: { bg: \"#3a1e1e\", marker: \"-\", label: \"#f48771\" },\n changed: { bg: \"#3a3a1e\", marker: \"~\", label: \"#dcdcaa\" },\n};\n\nfunction formatValue(value: unknown): string {\n if (value === undefined) return \"\";\n if (value === null) return \"null\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"object\") {\n const json = JSON.stringify(value, null, 2);\n if (json.length > 80) {\n return JSON.stringify(value).slice(0, 77) + \"...\";\n }\n return json;\n }\n return String(value);\n}\n\ninterface DiffRowProps {\n entry: DiffEntry;\n}\n\nfunction DiffRow({ entry }: DiffRowProps) {\n const colors = DIFF_COLORS[entry.type];\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n padding: \"3px 12px\",\n borderBottom: \"1px solid var(--vj-border-subtle, #2a2a2a)\",\n backgroundColor: colors.bg,\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 12,\n gap: 8,\n }}\n >\n <span\n style={{\n color: colors.label,\n fontWeight: 600,\n width: 14,\n flexShrink: 0,\n textAlign: \"center\",\n }}\n >\n {colors.marker}\n </span>\n <span\n style={{\n color: \"var(--vj-text, #cccccc)\",\n flexShrink: 0,\n minWidth: 100,\n }}\n >\n {entry.path}\n </span>\n <span style={{ flex: 1, display: \"flex\", gap: 8, overflow: \"hidden\" }}>\n {entry.type === \"changed\" && (\n <>\n <span style={{ color: \"#f48771\", textDecoration: \"line-through\" }}>\n {formatValue(entry.oldValue)}\n </span>\n <span style={{ color: \"var(--vj-text-dim, #666666)\" }}>→</span>\n <span style={{ color: \"#4ec94e\" }}>\n {formatValue(entry.newValue)}\n </span>\n </>\n )}\n {entry.type === \"added\" && (\n <span style={{ color: \"#4ec94e\" }}>\n {formatValue(entry.newValue)}\n </span>\n )}\n {entry.type === \"removed\" && (\n <span style={{ color: \"#f48771\", textDecoration: \"line-through\" }}>\n {formatValue(entry.oldValue)}\n </span>\n )}\n </span>\n </div>\n );\n}\n\nexport interface DiffViewProps {\n originalJson: unknown;\n currentJson: unknown;\n className?: string;\n}\n\nexport function DiffView({\n originalJson,\n currentJson,\n className,\n}: DiffViewProps) {\n const entries = useMemo(\n () => computeDiff(originalJson as never, currentJson as never),\n [originalJson, currentJson],\n );\n\n const added = entries.filter((e) => e.type === \"added\").length;\n const removed = entries.filter((e) => e.type === \"removed\").length;\n const changed = entries.filter((e) => e.type === \"changed\").length;\n\n return (\n <div\n className={className}\n style={{\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n color: \"var(--vj-text, #cccccc)\",\n overflow: \"auto\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"6px 12px\",\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n <span style={{ color: \"var(--vj-text-muted, #999999)\" }}>\n {entries.length === 0 ? \"No changes\" : `${entries.length} changes`}\n </span>\n {added > 0 && <span style={{ color: \"#4ec94e\" }}>+{added} added</span>}\n {removed > 0 && (\n <span style={{ color: \"#f48771\" }}>-{removed} removed</span>\n )}\n {changed > 0 && (\n <span style={{ color: \"#dcdcaa\" }}>~{changed} modified</span>\n )}\n </div>\n <div style={{ flex: 1, overflow: \"auto\" }}>\n {entries.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n color: \"var(--vj-text-dimmer, #555555)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 13,\n }}\n >\n No differences detected\n </div>\n ) : (\n entries.map((entry, i) => <DiffRow key={i} entry={entry} />)\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";AAAA;AAAA,EACE,YAAAA;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,OAEK;;;ACNP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;;;ACnBP,SAAS,eAAe,kBAAkB;AAoCnC,IAAM,gBAAgB,cAAyC,IAAI;AAEnE,SAAS,YAAgC;AAC9C,QAAM,MAAM,WAAW,aAAa;AACpC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACA,SAAO;AACT;;;AD+PI;AA9QJ,SAAS,cAAc,MAA0B;AAC/C,QAAM,MAAgB,CAAC,KAAK,EAAE;AAC9B,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,KAAK,GAAG,cAAc,KAAK,CAAC;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,CAAC,MAAM,YAAY,IAAI,SAAoB,MAAM,SAAS,KAAK,CAAC;AACtE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAwB,IAAI;AACxE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI;AAAA,IAC5C,MAAM,oBAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,EAC9B;AAEA,QAAM,aAAa,OAAgB,IAAI,QAAQ,CAAC;AAChD,QAAM,mBAAmB,OAAO,KAAK;AACrC,QAAM,aAAa,OAAO,KAAK;AAC/B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,CAAC,aAAa,mBAAmB,IAAI,SAAS,EAAE;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,CAAC,CAAC;AACpE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,CAAC;AAC1D,QAAM,CAAC,oBAAoB,qBAAqB,IAAI;AAAA,IAClD,oBAAI,IAAI;AAAA,EACV;AAEA,YAAU,MAAM;AACd,eAAW,QAAQ,KAAK,IAAI;AAC5B,eAAW,WAAW,QAAQ,OAAO;AACrC,eAAW,WAAW,QAAQ,OAAO;AAAA,EACvC,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,QAAI,CAAC,WAAW,SAAS;AACvB,iBAAW,UAAU;AACrB;AAAA,IACF;AACA,QAAI,iBAAiB,SAAS;AAC5B,uBAAiB,UAAU;AAC3B;AAAA,IACF;AACA,UAAM,UAAU,SAAS,KAAK;AAC9B,iBAAa,OAAO;AACpB,uBAAmB,oBAAI,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;AAC7C,sBAAkB,IAAI;AACtB,eAAW,UAAU,IAAI,QAAQ;AACjC,eAAW,QAAQ,KAAK,OAAO;AAC/B,eAAW,KAAK;AAChB,eAAW,KAAK;AAChB,wBAAoB,EAAE;AACtB,qBAAiB,CAAC,CAAC;AACnB,wBAAoB,CAAC;AACrB,0BAAsB,oBAAI,IAAI,CAAC;AAAA,EACjC,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,UAAU;AAAA,IACd,CAAC,YAAuB;AACtB,mBAAa,OAAO;AACpB,iBAAW,QAAQ,KAAK,OAAO;AAC/B,iBAAW,WAAW,QAAQ,OAAO;AACrC,iBAAW,WAAW,QAAQ,OAAO;AACrC,uBAAiB,UAAU;AAC3B,iBAAW,OAAO,QAAQ,IAAI,CAAC;AAAA,IACjC;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,OAAO,YAAY,MAAM;AAC7B,UAAM,OAAO,WAAW,QAAQ,KAAK;AACrC,QAAI,MAAM;AACR,mBAAa,IAAI;AACjB,iBAAW,WAAW,QAAQ,OAAO;AACrC,iBAAW,WAAW,QAAQ,OAAO;AACrC,uBAAiB,UAAU;AAC3B,iBAAW,OAAO,KAAK,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,OAAO,YAAY,MAAM;AAC7B,UAAM,OAAO,WAAW,QAAQ,KAAK;AACrC,QAAI,MAAM;AACR,mBAAa,IAAI;AACjB,iBAAW,WAAW,QAAQ,OAAO;AACrC,iBAAW,WAAW,QAAQ,OAAO;AACrC,uBAAiB,UAAU;AAC3B,iBAAW,OAAO,KAAK,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,YAAU,MAAM;AACd,aAAS,cAAc,GAAkB;AACvC,YAAM,MAAM,EAAE,WAAW,EAAE;AAC3B,UAAI,OAAO,EAAE,QAAQ,OAAO,CAAC,EAAE,UAAU;AACvC,UAAE,eAAe;AACjB,aAAK;AAAA,MACP,WAAW,OAAO,EAAE,QAAQ,OAAO,EAAE,UAAU;AAC7C,UAAE,eAAe;AACjB,aAAK;AAAA,MACP,WAAW,OAAO,EAAE,QAAQ,KAAK;AAC/B,UAAE,eAAe;AACjB,aAAK;AAAA,MACP;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACpE,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,QAAM,aAAa,YAAY,CAAC,WAA0B;AACxD,sBAAkB,MAAM;AAAA,EAC1B,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,YAAY,CAAC,WAAmB;AACnD,uBAAmB,CAAC,SAAS;AAC3B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,MAAM,EAAG,MAAK,OAAO,MAAM;AAAA,UACnC,MAAK,IAAI,MAAM;AACpB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,YAAY,CAAC,WAAmB;AACjD,uBAAmB,CAAC,SAAS;AAC3B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,MAAM;AACf,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,YAAY,CAAC,WAAmB;AACnD,uBAAmB,CAAC,SAAS;AAC3B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,MAAM;AAClB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,YAAY,MAAM;AAClC,UAAM,SAAS,cAAc,KAAK,IAAI;AACtC,uBAAmB,IAAI,IAAI,MAAM,CAAC;AAAA,EACpC,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,cAAc,YAAY,MAAM;AACpC,uBAAmB,oBAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA,EAC5C,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,iBAAiB;AAAA,IACrB,CAAC,UAAkB;AACjB,0BAAoB,KAAK;AACzB,UAAI,CAAC,MAAM,KAAK,GAAG;AACjB,yBAAiB,CAAC,CAAC;AACnB,4BAAoB,CAAC;AACrB,8BAAsB,oBAAI,IAAI,CAAC;AAC/B;AAAA,MACF;AACA,YAAM,UAAU,YAAY,MAAM,KAAK;AACvC,uBAAiB,OAAO;AACxB,0BAAoB,CAAC;AACrB,YAAM,WAAW,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACrD,4BAAsB,QAAQ;AAE9B,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,YAAY;AAAA,UAChB;AAAA,UACA,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,QAC7B;AACA,2BAAmB,CAAC,SAAS;AAC3B,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,qBAAW,MAAM,UAAW,MAAK,IAAI,EAAE;AACvC,iBAAO;AAAA,QACT,CAAC;AACD,0BAAkB,QAAQ,CAAC,EAAE,MAAM;AAAA,MACrC;AAAA,IACF;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,kBAAkB,YAAY,MAAM;AACxC,QAAI,cAAc,WAAW,EAAG;AAChC,UAAM,WAAW,mBAAmB,KAAK,cAAc;AACvD,wBAAoB,OAAO;AAC3B,sBAAkB,cAAc,OAAO,EAAE,MAAM;AAAA,EACjD,GAAG,CAAC,eAAe,gBAAgB,CAAC;AAEpC,QAAM,kBAAkB,YAAY,MAAM;AACxC,QAAI,cAAc,WAAW,EAAG;AAChC,UAAM,WACH,mBAAmB,IAAI,cAAc,UAAU,cAAc;AAChE,wBAAoB,OAAO;AAC3B,sBAAkB,cAAc,OAAO,EAAE,MAAM;AAAA,EACjD,GAAG,CAAC,eAAe,gBAAgB,CAAC;AAEpC,YAAU,MAAM;AACd,QAAI,CAAC,YAAY,KAAK,EAAG;AACzB,UAAM,UAAU,YAAY,MAAM,WAAW;AAC7C,qBAAiB,OAAO;AACxB;AAAA,MAAoB,CAAC,SACnB,KAAK,IAAI,MAAM,KAAK,IAAI,QAAQ,SAAS,GAAG,CAAC,CAAC;AAAA,IAChD;AACA,0BAAsB,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,EAC7D,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,QAAqB;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAyB;AAAA,IAC7B,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ,OAAO,EAAE,OAAO,QAAQ,IAAI,CAAC,OAAO,OAAO,CAAC;AAEzE,SACE,oBAAC,cAAc,UAAd,EAAuB,OAAO,cAC5B,UACH;AAEJ;;;AE/SA,SAAS,YAAAC,WAAU,WAAAC,UAAS,UAAAC,SAAQ,eAAAC,cAAa,aAAAC,kBAAiB;AAElE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,OACK;;;ACTP,SAAS,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAwElC,gBAAAC,YAAA;AAlDH,SAAS,YAAY,EAAE,GAAG,GAAG,OAAO,QAAQ,GAAqB;AACtE,QAAM,MAAMF,QAAuB,IAAI;AACvC,QAAM,CAAC,KAAK,MAAM,IAAIC,UAAS,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;AAElD,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,IAAI,QAAS;AAClB,UAAM,OAAO,IAAI,QAAQ,sBAAsB;AAC/C,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,OAAO;AAClB,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ,KAAK,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI;AAAA,MACtD,KAAK,KAAK,SAAS,KAAK,KAAK,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI;AAAA,IACzD,CAAC;AAAA,EACH,GAAG,CAAC,GAAG,CAAC,CAAC;AAET,EAAAA,WAAU,MAAM;AACd,aAAS,YAAY,GAAe;AAClC,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAc,GAAG;AAC1D,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,aAAS,UAAU,GAAkB;AACnC,UAAI,EAAE,QAAQ,SAAU,SAAQ;AAAA,IAClC;AACA,aAAS,iBAAiB,aAAa,WAAW;AAClD,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,WAAW;AACrD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,gBAAAG;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM,IAAI;AAAA,QACV,KAAK,IAAI;AAAA,QACT,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,MAEC,gBAAM;AAAA,QAAI,CAAC,MAAM,MAChB,KAAK,YACH,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,iBAAiB;AAAA,cACjB,QAAQ;AAAA,YACV;AAAA;AAAA,UALK;AAAA,QAMP,IAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM;AACb,kBAAI,CAAC,KAAK,UAAU;AAClB,qBAAK,OAAO;AACZ,wBAAQ;AAAA,cACV;AAAA,YACF;AAAA,YACA,UAAU,KAAK;AAAA,YACf,OAAO;AAAA,cACL,SAAS;AAAA,cACT,OAAO;AAAA,cACP,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,OAAO,KAAK,WACR,mCACA;AAAA,cACJ,QAAQ,KAAK,WAAW,YAAY;AAAA,cACpC,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,kBAAI,CAAC,KAAK;AACR,gBAAC,EAAE,OAAuB,MAAM,kBAC9B;AAAA,YACN;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,cAAC,EAAE,OAAuB,MAAM,kBAAkB;AAAA,YACpD;AAAA,YAEC,eAAK;AAAA;AAAA,UA/BD;AAAA,QAgCP;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;;;ACrHA,IAAM,eAAe,CAAC,QAAQ,QAAQ,SAAS,MAAM,SAAS,KAAK;AAO5D,SAAS,cAAc,MAAgB,OAA0B;AACtE,MAAI,KAAK,aAAa,KAAM,QAAO;AAEnC,QAAM,SAAS,MAAM,UAAU,IAAI,KAAK,QAAQ;AAChD,MAAI,QAAQ,SAAS,WAAW,KAAK,SAAS,SAAU,QAAO,KAAK;AAEpE,aAAW,SAAS,cAAc;AAChC,UAAM,QAAQ,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK;AACvD,QAAI,OAAO,SAAS,QAAQ,MAAM,UAAU,IAAI;AAC9C,aAAO,OAAO,MAAM,KAAK;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO,KAAK;AACd;;;ACrBO,SAAS,gBACd,MACA,YACY;AACZ,QAAM,SAAqB,CAAC;AAE5B,WAAS,KAAK,MAAgB;AAC5B,WAAO,KAAK,IAAI;AAChB,QACE,WAAW,KAAK,EAAE,MACjB,KAAK,SAAS,YAAY,KAAK,SAAS,UACzC;AACA,iBAAW,SAAS,KAAK,UAAU;AACjC,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,OAAK,IAAI;AACT,SAAO;AACT;;;ACtBA,SAAS,YAAAC,WAAU,eAAAC,cAAa,UAAAC,eAAc;AAC9C,SAAS,iBAAiB,gBAAgB;AAS1C,IAAM,qBAAgC;AAAA,EACpC,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,cAAc;AAChB;AAEO,SAAS,cAAc;AAC5B,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAoB,kBAAkB;AACxE,QAAM,eAAeC,QAAkB,SAAS;AAChD,eAAa,UAAU;AAEvB,QAAM,kBAAkBC,aAAY,CAAC,WAAmB;AACtD,iBAAa;AAAA,MACX,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA;AAAA,IACrB,CAAC,QAAgB,aAAiC;AAChD,mBAAa,CAAC,UAAU;AAAA,QACtB,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB,cAAc;AAAA,MAChB,EAAE;AAAA,IACJ;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgBA,aAAY,MAAM;AACtC,iBAAa,kBAAkB;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAaA,aAAY,MAAM;AACnC,UAAM,EAAE,eAAe,kBAAkB,aAAa,IACpD,aAAa;AACf,QAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,aAAc;AAE1D,UAAM,cAAc,MAAM,KAAK,UAAU,IAAI,aAAa;AAC1D,UAAM,aAAa,MAAM,KAAK,UAAU,IAAI,gBAAgB;AAC5D,QAAI,CAAC,eAAe,CAAC,WAAY;AAEjC,QAAI,YAAY,YAAY,YAAY,aAAa,WAAW,UAAU;AACxE,YAAM,SAAS,MAAM,KAAK,UAAU,IAAI,YAAY,QAAQ;AAC5D,UAAI,QAAQ;AACV,cAAM,YAAY,OAAO,SAAS;AAAA,UAChC,CAAC,MAAM,EAAE,OAAO;AAAA,QAClB;AACA,YAAI,UAAU,OAAO,SAAS;AAAA,UAC5B,CAAC,MAAM,EAAE,OAAO;AAAA,QAClB;AACA,YAAI,iBAAiB,QAAS;AAC9B,YAAI,YAAY,QAAS;AACzB,YAAI,cAAc,WAAW,aAAa,KAAK,WAAW,GAAG;AAC3D,gBAAM,UAAU;AAAA,YACd,MAAM;AAAA,YACN,OAAO;AAAA,YACP;AAAA,YACA;AAAA,UACF;AACA,kBAAQ,QAAQ,OAAO;AAAA,QACzB;AAAA,MACF;AAAA,IACF,WAAW,WAAW,UAAU;AAC9B,YAAM,YAAY,MAAM,KAAK,UAAU,IAAI,WAAW,QAAQ;AAC9D,UAAI,WAAW;AACb,YAAI,UAAU,UAAU,SAAS;AAAA,UAC/B,CAAC,MAAM,EAAE,OAAO;AAAA,QAClB;AACA,YAAI,iBAAiB,QAAS;AAC9B,cAAM,UAAU;AAAA,UACd,MAAM;AAAA,UACN;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QACF;AACA,gBAAQ,QAAQ,OAAO;AAAA,MACzB;AAAA,IACF;AAEA,iBAAa,kBAAkB;AAAA,EACjC,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC;AAExB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AJZI,mBAmDM,OAAAC,MAlDJ,YADF;AA5DJ,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,aAAa,MAAM,mBAAmB,KAAK;AACjD,QAAM,aAAa,MAAM,gBAAgB,IAAI,KAAK,EAAE;AACpD,QAAM,cAAc,KAAK,SAAS,YAAY,KAAK,SAAS;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,KAAK;AAC5C,QAAM,SAAS,KAAK,aAAa;AACjC,QAAM,gBAAgB,MAAM,mBAAmB,IAAI,KAAK,EAAE;AAC1D,QAAM,gBACJ,MAAM,cAAc,SAAS,KAC7B,MAAM,cAAc,MAAM,gBAAgB,GAAG,WAAW,KAAK;AAE/D,QAAM,SAAS,MAAM;AACrB,QAAM,aAAa,SAAS,kBAAkB,QAAQ,KAAK,IAAI,IAAI;AACnE,QAAM,aAAa,aAAa,aAAa,MAAM,UAAU,IAAI;AACjE,QAAM,WAAW,aAAa,CAAC,WAAW,QAAQ;AAElD,QAAM,eAAe,UAAU,qBAAqB,KAAK;AACzD,QAAM,gBAAgB,UAAU,kBAAkB,KAAK;AAEvD,WAAS,eAAuB;AAC9B,QAAI,aAAa;AACf,aAAO,KAAK,SAAS,UACjB,IAAI,KAAK,SAAS,MAAM,MACxB,IAAI,KAAK,SAAS,MAAM;AAAA,IAC9B;AACA,QAAI,KAAK,UAAU,KAAM,QAAO;AAChC,QAAI,OAAO,KAAK,UAAU,SAAU,QAAO,KAAK;AAChD,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B;AAEA,WAAS,oBAAoB,GAAoB;AAC/C,MAAE,eAAe;AACjB,UAAM,OAAQ,EAAE,cAA8B,sBAAsB;AACpE,UAAM,OAAO,KAAK,MAAM,KAAK,SAAS;AACtC,UAAM,WAAW,EAAE,UAAU,OAAO,WAAW;AAC/C,eAAW,KAAK,IAAI,QAAQ;AAAA,EAC9B;AAEA,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,MAAI,gBAAgB,UAAU,iBAAiB,UAAU;AACvD,gBAAY;AAAA,EACd,WAAW,gBAAgB,UAAU,iBAAiB,SAAS;AAC7D,mBAAe;AAAA,EACjB;AAEA,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe,cAAc,aAAa;AAAA,QAC1C,SAAS,MAAM,QAAQ,WAAW,KAAK,EAAE;AAAA,QACzC,cAAc,MAAM,WAAW,IAAI;AAAA,QACnC,cAAc,MAAM,WAAW,KAAK;AAAA,QACpC,eAAe,CAAC,MAAM,cAAc,GAAG,IAAI;AAAA,QAC3C,WAAW,CAAC;AAAA,QACZ,aAAa,CAAC,MAAM;AAClB,YAAE,aAAa,gBAAgB;AAC/B,sBAAY,KAAK,EAAE;AAAA,QACrB;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,QAAQ,CAAC,MAAM;AACb,YAAE,eAAe;AACjB,iBAAO;AAAA,QACT;AAAA,QACA,gBAAc,KAAK;AAAA,QACnB,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,SAAS;AAAA,UACT,aAAa,IAAI,QAAQ;AAAA,UACzB,QAAQ;AAAA,UACR,iBAAiB,aACb,YACE,mCACA,6DACF,gBACE,uCACA,gBACE,gCACA,UACE,gCACA;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,SAAS,gBAAgB,MAAM;AAAA,UAC/B;AAAA,UACA;AAAA,UACA,OACE,cAAc,YACV,qDACA;AAAA,QACR;AAAA,QAEC;AAAA,wBACC,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAgB;AAClB,wBAAQ,aAAa,KAAK,EAAE;AAAA,cAC9B;AAAA,cACA,cAAY,aAAa,aAAa;AAAA,cACtC,OAAO;AAAA,gBACL,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,YAAY;AAAA,gBACZ,WAAW,aAAa,kBAAkB;AAAA,cAC5C;AAAA,cACD;AAAA;AAAA,UAED,IAEA,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,GAAG;AAAA,UAE7C,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,YAAY,SAAS,MAAM;AAAA,cAC7B;AAAA,cAEC,mBAAS,MAAM,cAAc,MAAM,MAAM,IAAI;AAAA;AAAA,UAChD;AAAA,UACC,CAAC,UAAU,eAAe,cACzB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO,aAAa,YAAY;AAAA,gBAChC,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,YAAY;AAAA,cACd;AAAA,cAEC,uBAAa;AAAA;AAAA,UAChB;AAAA,UAED,CAAC,UAAU,CAAC,eAAe,cAC1B,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OACE,KAAK,SAAS,WACV,8BACA;AAAA,gBACN,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,YAAY;AAAA,cACd;AAAA,cAEC,uBAAa;AAAA;AAAA,UAChB;AAAA;AAAA;AAAA,IAEJ;AAAA,IACC,cACC,KAAK,SAAS,IAAI,CAAC,UACjB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MAXK,MAAM;AAAA,IAYb,CACD;AAAA,KACL;AAEJ;AAQO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,aAAa;AAAA,EACb,aAAa;AACf,GAAkB;AAChB,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,eAAeE,QAAuB,IAAI;AAEhD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,YAAY;AAEhB,QAAM,CAAC,aAAa,cAAc,IAAID,UAI5B,IAAI;AAEd,QAAM,eAAeE;AAAA,IACnB,MACE,gBAAgB,MAAM,KAAK,MAAM,CAAC,OAAO,MAAM,gBAAgB,IAAI,EAAE,CAAC;AAAA,IACxE,CAAC,MAAM,KAAK,MAAM,MAAM,eAAe;AAAA,EACzC;AAEA,QAAM,oBAAoBC;AAAA,IACxB,CAAC,GAAqB,SAAmB;AACvC,QAAE,eAAe;AACjB,cAAQ,WAAW,KAAK,EAAE;AAC1B,qBAAe,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,KAAK,CAAC;AAAA,IACrD;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,wBAAwBA;AAAA,IAC5B,CAAC,SAAuC;AACtC,YAAM,QAA4B,CAAC;AACnC,YAAM,cAAc,KAAK,SAAS,YAAY,KAAK,SAAS;AAE5D,UAAI,aAAa;AACf,cAAM,KAAK;AAAA,UACT,OAAO;AAAA,UACP,QAAQ,MAAM;AACZ,qBAAS,WAAW,GAAuB;AACzC,oBAAM,MAAgB,CAAC,EAAE,EAAE;AAC3B,yBAAW,KAAK,EAAE,SAAU,KAAI,KAAK,GAAG,WAAW,CAAC,CAAC;AACrD,qBAAO;AAAA,YACT;AACA,kBAAM,SAAS,WAAW,IAAI;AAC9B,uBAAW,MAAM,OAAQ,SAAQ,WAAW,EAAE;AAAA,UAChD;AAAA,QACF,CAAC;AACD,cAAM,KAAK;AAAA,UACT,OAAO;AAAA,UACP,QAAQ,MAAM;AACZ,qBAAS,WAAW,GAAuB;AACzC,oBAAM,MAAgB,CAAC;AACvB,yBAAW,KAAK,EAAE,UAAU;AAC1B,oBAAI,KAAK,EAAE,EAAE;AACb,oBAAI,KAAK,GAAG,WAAW,CAAC,CAAC;AAAA,cAC3B;AACA,qBAAO;AAAA,YACT;AACA,kBAAM,WAAW,WAAW,IAAI;AAChC,uBAAW,MAAM,SAAU,SAAQ,aAAa,EAAE;AAAA,UACpD;AAAA,QACF,CAAC;AACD,cAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,MAChC;AAEA,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,QAAQ,MAAM,UAAU,UAAU,UAAU,KAAK,IAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACvE,CAAC;AACD,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,QAAQ,MAAM;AACZ,gBAAM,MAAMC,QAAO,IAAI;AACvB,gBAAM,OACJ,OAAO,QAAQ,WAAW,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC;AAC7D,oBAAU,UAAU,UAAU,IAAI,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QACpD;AAAA,MACF,CAAC;AAED,UAAI,KAAK,UAAU;AACjB,cAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAC9B,cAAM,KAAK;AAAA,UACT,OAAO;AAAA,UACP,QAAQ,MAAM;AACZ,kBAAM,UAAU,cAAc,MAAM,MAAM,KAAK,EAAE;AACjD,oBAAQ,QAAQ,OAAO;AAAA,UACzB;AAAA,QACF,CAAC;AAED,cAAM,cACJ;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAEC,OAAO,CAAC,MAAM,MAAM,KAAK,IAAI,EAC7B,IAAI,CAAC,OAAO;AAAA,UACX,OAAO,aAAa,CAAC;AAAA,UACrB,QAAQ,MAAM;AACZ,kBAAM,UAAU,WAAW,MAAM,MAAM,KAAK,IAAI,CAAC;AACjD,oBAAQ,QAAQ,OAAO;AAAA,UACzB;AAAA,QACF,EAAE;AACJ,cAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAC9B,cAAM,KAAK,GAAG,WAAW;AAEzB,cAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAC9B,cAAM,KAAK;AAAA,UACT,OAAO;AAAA,UACP,QAAQ,MAAM;AACZ,kBAAM,UAAU,WAAW,MAAM,MAAM,KAAK,EAAE;AAC9C,oBAAQ,QAAQ,OAAO;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,MAAM,MAAM,OAAO;AAAA,EACtB;AAEA,QAAM,gBAAgBD;AAAA,IACpB,CAAC,MAA2B;AAC1B,YAAM,eAAe,aAAa;AAAA,QAChC,CAAC,MAAM,EAAE,OAAO,MAAM;AAAA,MACxB;AAEA,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,gBAAM,OAAO,aAAa,eAAe,CAAC;AAC1C,cAAI,KAAM,SAAQ,WAAW,KAAK,EAAE;AACpC;AAAA,QACF;AAAA,QACA,KAAK,WAAW;AACd,YAAE,eAAe;AACjB,gBAAM,OAAO,aAAa,eAAe,CAAC;AAC1C,cAAI,KAAM,SAAQ,WAAW,KAAK,EAAE;AACpC;AAAA,QACF;AAAA,QACA,KAAK,cAAc;AACjB,YAAE,eAAe;AACjB,gBAAM,OAAO,gBAAgB,IAAI,aAAa,YAAY,IAAI;AAC9D,cAAI,SAAS,KAAK,SAAS,YAAY,KAAK,SAAS,UAAU;AAC7D,gBAAI,CAAC,MAAM,gBAAgB,IAAI,KAAK,EAAE,GAAG;AACvC,sBAAQ,WAAW,KAAK,EAAE;AAAA,YAC5B,WAAW,KAAK,SAAS,SAAS,GAAG;AACnC,sBAAQ,WAAW,KAAK,SAAS,CAAC,EAAE,EAAE;AAAA,YACxC;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,gBAAM,UAAU,gBAAgB,IAAI,aAAa,YAAY,IAAI;AACjE,cAAI,CAAC,QAAS;AACd,gBAAM,cACJ,QAAQ,SAAS,YAAY,QAAQ,SAAS;AAChD,cAAI,eAAe,MAAM,gBAAgB,IAAI,QAAQ,EAAE,GAAG;AACxD,oBAAQ,aAAa,QAAQ,EAAE;AAAA,UACjC,WAAW,QAAQ,UAAU;AAC3B,oBAAQ,WAAW,QAAQ,QAAQ;AAAA,UACrC;AACA;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,gBAAM,WACJ,gBAAgB,IAAI,aAAa,YAAY,IAAI;AACnD,cAAI,YAAY,SAAS,UAAU;AACjC,kBAAM,aACJ,aAAa,eAAe,CAAC,KAAK,aAAa,eAAe,CAAC;AACjE,kBAAM,UAAU,WAAW,MAAM,MAAM,SAAS,EAAE;AAClD,oBAAQ,QAAQ,OAAO;AACvB,gBAAI,cAAc,WAAW,OAAO,SAAS,IAAI;AAC/C,sBAAQ,WAAW,WAAW,EAAE;AAAA,YAClC;AAAA,UACF;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,CAAC,WAAW,YAAY,IAAIH,UAAS,KAAK;AAEhD,EAAAK,WAAU,MAAM;AACd,QAAI,MAAM,kBAAkB,aAAa,SAAS;AAChD,YAAM,KAAK,aAAa,QAAQ;AAAA,QAC9B,kBAAkB,MAAM,cAAc;AAAA,MACxC;AACA,UAAI,IAAI;AACN,WAAG,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,cAAc,CAAC;AAEzB,SACE,iCACE;AAAA,oBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QACA,MAAK;AAAA,QACL,UAAU;AAAA,QACV,WAAW;AAAA,QACX,SAAS,MAAM,aAAa,IAAI;AAAA,QAChC,QAAQ,MAAM,aAAa,KAAK;AAAA,QAChC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,MAAM,KAAK;AAAA,YACjB,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,eAAe;AAAA;AAAA,QACjB;AAAA;AAAA,IACF;AAAA,IACC,eACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,YAAY;AAAA,QACf,GAAG,YAAY;AAAA,QACf,OAAO,sBAAsB,YAAY,IAAI;AAAA,QAC7C,SAAS,MAAM,eAAe,IAAI;AAAA;AAAA,IACpC;AAAA,KAEJ;AAEJ;;;AKnfA,SAAS,YAAAO,WAAU,eAAAC,cAAa,UAAAC,SAAQ,aAAAC,YAAW,WAAAC,gBAAe;AAClE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,qBAAAC;AAAA,EACA;AAAA,OAIK;;;ACXP,SAAS,YAAAC,WAAU,UAAAC,SAAQ,aAAAC,YAAW,eAAAC,cAAa,WAAAC,gBAAe;AA0H9D,SAKE,OAAAC,MALF,QAAAC,aAAA;AAnHJ,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAErB,SAAS,YAAY,EAAE,UAAU,GAAqB;AAC3D,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,eAAe,MAAM,iBACvB,MAAM,KAAK,UAAU,IAAI,MAAM,cAAc,IAC7C;AAEJ,QAAM,cAAc,cAAc,QAAQ;AAE1C,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,WAAW;AACxD,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,CAAC;AACtD,QAAM,WAAWC,QAAyB,IAAI;AAC9C,QAAM,UAAUA,QAAuB,IAAI;AAC3C,QAAM,aAAaA,QAAuB,IAAI;AAE9C,EAAAC,WAAU,MAAM;AACd,kBAAc,WAAW;AAAA,EAC3B,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcC,SAAQ,MAAM;AAChC,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,UAAM,QAAQ,WAAW,YAAY;AACrC,UAAM,UAA0C,CAAC;AACjD,eAAW,CAAC,IAAI,IAAI,KAAK,MAAM,KAAK,WAAW;AAC7C,UAAI,KAAK,KAAK,YAAY,EAAE,WAAW,KAAK,GAAG;AAC7C,gBAAQ,KAAK,EAAE,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,MACtC;AACA,UAAI,QAAQ,UAAU,gBAAiB;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACnD,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,YAAY,MAAM,KAAK,SAAS,CAAC;AAE3C,EAAAD,WAAU,MAAM;AACd,sBAAkB,CAAC;AAAA,EACrB,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAaE;AAAA,IACjB,CAAC,SAAiB;AAChB,iBAAW,CAAC,IAAI,IAAI,KAAK,MAAM,KAAK,WAAW;AAC7C,YAAI,KAAK,SAAS,MAAM;AACtB,kBAAQ,WAAW,EAAE;AACrB;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK;AACb,eAAS,SAAS,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,MAAM,KAAK,WAAW,OAAO;AAAA,EAChC;AAEA,QAAM,gBAAgBA;AAAA,IACpB,CAAC,MAA2B;AAC1B,UAAI,CAAC,MAAM;AACT,YAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,SAAS;AAC9C,kBAAQ,IAAI;AACZ,YAAE,eAAe;AAAA,QACnB;AACA;AAAA,MACF;AAEA,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,YAAE,eAAe;AACjB,4BAAkB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,YAAY,SAAS,CAAC,CAAC;AAChE;AAAA,QACF,KAAK;AACH,YAAE,eAAe;AACjB,4BAAkB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAC3C;AAAA,QACF,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,YAAY,SAAS,KAAK,iBAAiB,YAAY,QAAQ;AACjE,uBAAW,YAAY,cAAc,EAAE,IAAI;AAAA,UAC7C,OAAO;AACL,kBAAM,UAAU,WAAW,KAAK,KAAK;AACrC,uBAAW,OAAO;AAAA,UACpB;AACA;AAAA,QACF,KAAK;AACH,YAAE,eAAe;AACjB,wBAAc,WAAW;AACzB,kBAAQ,KAAK;AACb,mBAAS,SAAS,KAAK;AACvB;AAAA,MACJ;AAAA,IACF;AAAA,IACA,CAAC,MAAM,aAAa,gBAAgB,YAAY,aAAa,UAAU;AAAA,EACzE;AAEA,EAAAF,WAAU,MAAM;AACd,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,MAAM,CAAC,KAAM;AAClB,UAAM,OAAO,GAAG,SAAS,cAAc;AACvC,UAAM,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,EAC3C,GAAG,CAAC,gBAAgB,IAAI,CAAC;AAEzB,EAAAA,WAAU,MAAM;AACd,aAAS,mBAAmB,GAAe;AACzC,UACE,WAAW,WACX,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,GAC7C;AACA,sBAAc,WAAW;AACzB,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,WAAW,CAAC;AAEhB,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG,UAAU,EAAE;AAAA,MAEpD;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM;AACf,4BAAc,EAAE,OAAO,KAAK;AAC5B,kBAAI,CAAC,KAAM,SAAQ,IAAI;AAAA,YACzB;AAAA,YACA,SAAS,CAAC,MAAM;AACd,gBAAE,OAAO,OAAO;AAChB,sBAAQ,IAAI;AAAA,YACd;AAAA,YACA,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,cAAa;AAAA,YACb,OAAO;AAAA,cACL,OAAO;AAAA,cACP,WAAW;AAAA,cACX,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,YACX;AAAA;AAAA,QACF;AAAA,QAEC,QAAQ,YAAY,SAAS,KAC5B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,WAAW;AAAA,cACX,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,WAAW;AAAA,YACb;AAAA,YAEC,sBAAY,IAAI,CAAC,GAAG,MACnB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,aAAa,CAAC,MAAM;AAClB,oBAAE,eAAe;AACjB,6BAAW,EAAE,IAAI;AAAA,gBACnB;AAAA,gBACA,cAAc,MAAM,kBAAkB,CAAC;AAAA,gBACvC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OACE,MAAM,iBACF,4BACA;AAAA,kBACN,iBACE,MAAM,iBACF,gCACA;AAAA,kBACN,QAAQ;AAAA,kBACR,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,cAAc;AAAA,gBAChB;AAAA,gBAEC,YAAE;AAAA;AAAA,cAxBE,EAAE;AAAA,YAyBT,CACD;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AC3MA;AAAA,EACE,YAAAO;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,WAAAC;AAAA,OAIK;AAsHD,gBAAAC,MAgCM,QAAAC,aAhCN;AAnHN,IAAMC,uBAAsB;AAUrB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,YAAY,aAAa,IAAIP,UAAS,KAAK;AAClD,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,CAAC;AACtD,QAAM,UAAUC,QAAuB,IAAI;AAC3C,QAAM,aAAaA,QAAuB,IAAI;AAE9C,EAAAC,WAAU,MAAM;AACd,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,cAAcE;AAAA,IAClB,MAAM,WAAW,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,IACrC,CAAC,UAAU;AAAA,EACb;AAEA,EAAAF,WAAU,MAAM;AACd,sBAAkB,CAAC;AAAA,EACrB,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcC;AAAA,IAClB,CAAC,QAAgB;AACf,oBAAc,GAAG;AACjB,oBAAc,GAAG;AACjB,cAAQ,KAAK;AAAA,IACf;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,gBAAgBA;AAAA,IACpB,CAAC,MAAqB;AACpB,UAAI,CAAC,MAAM;AACT,YAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;AAChD,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAClB,kBAAQ,IAAI;AAAA,QACd;AACA;AAAA,MACF;AAEA,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAClB,4BAAkB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,YAAY,SAAS,CAAC,CAAC;AAChE;AAAA,QACF,KAAK;AACH,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAClB,4BAAkB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAC3C;AAAA,QACF,KAAK;AACH,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAClB,cAAI,YAAY,SAAS,KAAK,iBAAiB,YAAY,QAAQ;AACjE,wBAAY,YAAY,cAAc,CAAC;AAAA,UACzC;AACA;AAAA,QACF,KAAK;AACH,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAClB,wBAAc,KAAK;AACnB,kBAAQ,KAAK;AACb;AAAA,QACF,KAAK;AACH,wBAAc,KAAK;AACnB,kBAAQ,KAAK;AACb;AAAA,MACJ;AAAA,IACF;AAAA,IACA,CAAC,MAAM,aAAa,gBAAgB,OAAO,WAAW;AAAA,EACxD;AAEA,EAAAD,WAAU,MAAM;AACd,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,MAAM,CAAC,KAAM;AAClB,UAAM,OAAO,GAAG,SAAS,cAAc;AACvC,UAAM,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,EAC3C,GAAG,CAAC,gBAAgB,IAAI,CAAC;AAEzB,EAAAA,WAAU,MAAM;AACd,aAAS,mBAAmB,GAAe;AACzC,UACE,WAAW,WACX,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,GAC7C;AACA,sBAAc,KAAK;AACnB,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,gBAAAI;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG,UAAU,EAAE;AAAA,MAEpD;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM;AACf,4BAAc,EAAE,OAAO,KAAK;AAC5B,kBAAI,CAAC,KAAM,SAAQ,IAAI;AAAA,YACzB;AAAA,YACA,SAAS,MAAM,QAAQ,IAAI;AAAA,YAC3B,WAAW;AAAA,YACX,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAClC,YAAY;AAAA,YACZ,cAAa;AAAA,YACb,OAAO;AAAA;AAAA,QACT;AAAA,QAEC,QAAQ,YAAY,SAAS,KAC5B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAWE;AAAA,cACX,WAAW;AAAA,cACX,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,WAAW;AAAA,YACb;AAAA,YAEC,sBAAY,IAAI,CAAC,GAAG,MACnB,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBAEC,aAAa,CAAC,MAAM;AAClB,oBAAE,eAAe;AACjB,8BAAY,CAAC;AAAA,gBACf;AAAA,gBACA,cAAc,MAAM,kBAAkB,CAAC;AAAA,gBACvC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,OACE,MAAM,iBACF,4BACA;AAAA,kBACN,iBACE,MAAM,iBACF,gCACA;AAAA,kBACN,QAAQ;AAAA,kBACR,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,cAAc;AAAA,gBAChB;AAAA,gBAEA;AAAA,kCAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,IAAI,YAAY,GAAG,UAAU,GAAG,GACnD,gBAAM,QAAQ,WAAM,IACvB;AAAA,kBACC;AAAA;AAAA;AAAA,cA9BI;AAAA,YA+BP,CACD;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AF8CU,gBAAAG,MAwEE,QAAAC,aAxEF;AAzMV,SAAS,kBACP,QACA,YACA,MACgC;AAChC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,MAAMC,mBAAkB,QAAQ,MAAM,UAAU;AACtD,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,WAAW,KAAK,cAAc,MAAM;AAC7C;AAEA,SAAS,cAAc,MAAwB;AAC7C,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS;AAC3C,WAAO;AACT,MAAI,KAAK,SAAS,SAAU,QAAO;AACnC,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAwB;AAC/C,MAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,MAAI,KAAK,SAAS,UAAW,QAAO,OAAO,KAAK,KAAK;AACrD,MAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,OAAW,QAAO;AAC5D,SAAO,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,cAAc,KAAK,SAAS,YAAY,KAAK,SAAS;AAC5D,QAAM,YAAY,aAAa,IAAI,KAAK,EAAE;AAC1C,QAAM,aAAa,uBAAuB,KAAK;AAC/C,QAAM,YAAY,kBAAkB,KAAK;AACzC,QAAM,aAAa,kBAAkB,QAAQ,YAAY,KAAK,IAAI;AAClE,QAAM,aAAa,cAAc,MAAM,QAAQ,UAAU;AACzD,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,KAAK;AAE5C,QAAM,SAAS,KAAK,aAAa;AACjC,QAAM,eAAe,UAAU,qBAAqB,KAAK;AACzD,QAAM,gBAAgB,UAAU,kBAAkB,KAAK;AAEvD,WAAS,oBAAoB,GAAoB;AAC/C,MAAE,eAAe;AACjB,UAAM,OAAQ,EAAE,cAA8B,sBAAsB;AACpE,UAAM,OAAO,KAAK,MAAM,KAAK,SAAS;AACtC,eAAW,KAAK,IAAI,EAAE,UAAU,OAAO,WAAW,OAAO;AAAA,EAC3D;AAEA,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,MAAI,gBAAgB,UAAU,iBAAiB,UAAU;AACvD,gBAAY;AAAA,EACd,WAAW,gBAAgB,UAAU,iBAAiB,SAAS;AAC7D,mBAAe;AAAA,EACjB;AAEA,QAAM,WAAWC,QAA6C,IAAI;AAClE,QAAM,SAASA,QAAyB,IAAI;AAE5C,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,QAAI,CAAC,aAAa;AAChB,YAAM,WACJ,KAAK,UAAU,QAAQ,KAAK,UAAU,UAAa,KAAK,UAAU;AACpE,UAAI,YAAY,SAAS,SAAS;AAChC,iBAAS,QAAQ,MAAM;AAAA,MACzB,WAAW,OAAO,SAAS;AACzB,eAAO,QAAQ,MAAM;AAAA,MACvB;AAAA,IACF,WAAW,OAAO,SAAS;AACzB,aAAO,QAAQ,MAAM;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,WAAW,aAAa,KAAK,KAAK,CAAC;AAEvC,QAAM,oBAAoBC;AAAA,IACxB,CAAC,aAAqB;AACpB,UAAI;AACJ,UACE,YAAY,SAAS,aACrB,aAAa,UACb,aAAa,SACb;AACA,iBAAS,aAAa;AAAA,MACxB,WAAW,aAAa,QAAQ;AAC9B,iBAAS;AAAA,MACX,WACE,YAAY,SAAS,YACrB,YAAY,SAAS,aACrB,KAAK,SAAS,UACd;AACA,cAAM,MAAM,OAAO,QAAQ;AAC3B,iBAAS,MAAM,GAAG,IAAI,WAAW;AAAA,MACnC,OAAO;AACL,iBAAS;AAAA,MACX;AACA,YAAM,UAAU,SAAS,MAAM,MAAM,KAAK,IAAI,MAAM;AACpD,cAAQ,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA,CAAC,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM,SAAS,UAAU;AAAA,EACtD;AAEA,QAAM,kBAAkBA;AAAA,IACtB,CAAC,WAAmB;AAClB,YAAM,UAAU,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM;AAClD,cAAQ,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA,CAAC,MAAM,MAAM,KAAK,IAAI,OAAO;AAAA,EAC/B;AAEA,QAAM,eAAeA,aAAY,MAAM;AACrC,UAAM,UAAUC,YAAW,MAAM,MAAM,KAAK,EAAE;AAC9C,YAAQ,QAAQ,OAAO;AAAA,EACzB,GAAG,CAAC,MAAM,MAAM,KAAK,IAAI,OAAO,CAAC;AAEjC,QAAM,iBAAiBD,aAAY,MAAM;AACvC,UAAM,MACJ,KAAK,SAAS,UACV,OAAO,KAAK,SAAS,MAAM,IAC3B,SAAS,KAAK,SAAS,MAAM;AACnC,UAAM,UAAU,YAAY,MAAM,MAAM,KAAK,IAAI,KAAK,EAAE;AACxD,YAAQ,QAAQ,OAAO;AAAA,EACzB,GAAG,CAAC,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,SAAS,QAAQ,OAAO,CAAC;AAElE,QAAM,cAAc,YAAY;AAChC,QAAM,aAAa,YAAY;AAC/B,QAAM,eAAe,YAAY;AACjC,QAAM,aAAa,YAAY;AAC/B,QAAM,iBACJ,KAAK,YAAY,MAAM,KAAK,UAAU,IAAI,KAAK,QAAQ,GAAG,SAAS;AAErE,QAAM,QAAQ,aACV,YACE,mCACA,6DACF,UACE,gCACA;AAEN,QAAM,WACJ,cAAc,YACV,qDACA;AAEN,MAAI,aAAa;AACf,WACE,gBAAAL,MAAC,SACC;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,qBAAmB,KAAK;AAAA,UACxB,WAAW,CAAC;AAAA,UACZ,aAAa,CAAC,MAAM;AAClB,cAAE,aAAa,gBAAgB;AAC/B,wBAAY,KAAK,EAAE;AAAA,UACrB;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA,QAAQ,CAAC,MAAM;AACb,cAAE,eAAe;AACjB,mBAAO;AAAA,UACT;AAAA,UACA,OAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,YACL,SAAS;AAAA,YACT,aAAa,IAAI,QAAQ;AAAA,YACzB,QAAQ;AAAA,YACR,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,SAAS,eAAe,MAAM,gBAAgB,MAAM;AAAA,YACpD;AAAA,YACA;AAAA,UACF;AAAA,UACA,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,qBAAS,KAAK,EAAE;AAAA,UAClB;AAAA,UACA,eAAe,MAAM,iBAAiB,KAAK,EAAE;AAAA,UAC7C,cAAc,MAAM,WAAW,IAAI;AAAA,UACnC,cAAc,MAAM,WAAW,KAAK;AAAA,UAEpC;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,mCAAiB,KAAK,EAAE;AAAA,gBAC1B;AAAA,gBACA,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,YAAY;AAAA,kBACZ,WAAW,YAAY,iBAAiB;AAAA,gBAC1C;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACC,aAAa,CAAC,SACb,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,OAAO,KAAK;AAAA,gBACZ,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,gBAC/C,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,gBAClC,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,OAAO,SAAS,WAAW,SAAS,EAAE,QAAQ,YAAY;AAAA,gBAC5D;AAAA;AAAA,YACF,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OACE,CAAC,UAAU,CAAC,kBAAkB,CAAC,aAC3B,kCACA;AAAA,kBACN,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,OAAO,SAAS,WAAW,SAAS,EAAE,QAAQ,YAAY;AAAA,gBAC5D;AAAA,gBAEC,mBAAS,MAAM,cAAc,MAAM,MAAM,IAAI;AAAA;AAAA,YAChD;AAAA,YAED,oBAAoB,cAAc,CAAC,cAClC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,YAED,WACC,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,iCAAe;AAAA,gBACjB;AAAA,gBACA,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,OAAO,aAAa,YAAY;AAAA,kBAChC,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd;AAAA,gBACD;AAAA;AAAA,kBACQ,KAAK,SAAS,UAAU,SAAS;AAAA;AAAA;AAAA,YAC1C;AAAA,YAED,cACC,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,aAAa,YAAY;AAAA,kBAChC,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,gBACd;AAAA,gBAEC,eAAK,SAAS,UACX,GAAG,KAAK,SAAS,MAAM,WACvB,GAAG,KAAK,SAAS,MAAM;AAAA;AAAA,YAC7B;AAAA,YAED,CAAC,UAAU,aACV,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,+BAAa;AAAA,gBACf;AAAA,gBACA,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,OAAO,aAAa,YAAY;AAAA,kBAChC,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,GAAI,CAAC,aAAa,EAAE,YAAY,OAAO,IAAI,CAAC;AAAA,gBAC9C;AAAA,gBACA,OAAM;AAAA,gBACP;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,MAEJ;AAAA,MACC,oBAAoB,eACnB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,aAAa,IAAI,QAAQ,KAAK;AAAA,YAC9B,UAAU;AAAA,YACV,OAAO;AAAA,YACP,YAAY;AAAA,UACd;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MAED,CAAC,aACA,gBAAAA,KAAC,SACE,eAAK,SAAS,IAAI,CAAC,UAClB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,OAAO,QAAQ;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QApBK,MAAM;AAAA,MAqBb,CACD,GACH;AAAA,OAEJ;AAAA,EAEJ;AAEA,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,aAAa,cAAc,IAAI;AAErC,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,qBAAmB,KAAK;AAAA,MACxB,WAAW,CAAC;AAAA,MACZ,aAAa,CAAC,MAAM;AAClB,UAAE,aAAa,gBAAgB;AAC/B,oBAAY,KAAK,EAAE;AAAA,MACrB;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ,CAAC,MAAM;AACb,UAAE,eAAe;AACjB,eAAO;AAAA,MACT;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,aAAa,IAAI,QAAQ;AAAA,QACzB,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,SAAS,eAAe,MAAM,gBAAgB,MAAM;AAAA,QACpD;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,MAAM;AACd,UAAE,gBAAgB;AAClB,iBAAS,KAAK,EAAE;AAAA,MAClB;AAAA,MACA,eAAe,MAAM,eAAe,KAAK,EAAE;AAAA,MAC3C,cAAc,MAAM,WAAW,IAAI;AAAA,MACnC,cAAc,MAAM,WAAW,KAAK;AAAA,MAEpC;AAAA,wBAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,GAAG;AAAA,QAC1C,aAAa,iBACZ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,YAC/C,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAClC,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,SAAS,CAAC,EAAE,YAAY,SAAS,SAAS;AACtD,kBAAE,eAAe;AACjB,yBAAS,QAAQ,MAAM;AAAA,cACzB;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,OAAO,SAAS,WAAW,SAAS,EAAE,QAAQ,YAAY;AAAA,YAC5D;AAAA;AAAA,QACF,IAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OACE,CAAC,kBAAkB,CAAC,aAChB,kCACA;AAAA,cACN,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,OAAO,SAAS,WAAW,SAAS,EAAE,QAAQ,YAAY;AAAA,YAC5D;AAAA,YAEC,wBAAc,MAAM,MAAM,IAAI;AAAA;AAAA,QACjC;AAAA,QAED,cAAc,CAAC,cACd,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QAED,YACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,UAAU;AAAA,YACZ;AAAA,YAEC;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA;AAAA,QACF,IAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,WAAW,KAAK,SAAS,SAAS,WAAW;AAAA,YAC/C;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QAED,aACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,CAAC,MAAM;AACd,gBAAE,gBAAgB;AAClB,2BAAa;AAAA,YACf;AAAA,YACA,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,OAAO,aAAa,YAAY;AAAA,cAChC,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YACA,OAAM;AAAA,YACP;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,gBACP,MACA,YACA,cACA,mBACA,UACA,YACA;AACA,QAAM,gBAAgB,YAAY,QAAQ,WAAW,KAAK,SAAS;AAEnE,QAAM,aAAkC;AAAA,IACtC,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,WAAW;AAC3B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,CAAC,QAAQ,OAAO;AAAA,QAC5B,OAAO,OAAO,KAAK,KAAK;AAAA,QACxB,eAAe;AAAA,QACf;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,iBAAiB,YAAY,MAAM;AACrC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,WAAW;AAAA,QACvB,OAAO;AAAA,QACP,eAAe;AAAA,QACf;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,KAAK,SAAS,QAAQ;AACxB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,MAAM;AAAA,QACR;AAAA,QACD;AAAA;AAAA,IAED;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA,MACjD,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAClC,aACE,YAAY,YAAY,SACpB,OAAO,WAAW,OAAO,IACzB;AAAA,MAEN,OAAO;AAAA;AAAA,EACT;AAEJ;AAEA,SAAS,cACP,MACA,QACA,YACS;AACT,MAAI,CAAC,UAAU,CAAC,KAAK,SAAU,QAAO;AACtC,QAAM,aAAa,KAAK,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,KAAK;AAClE,QAAM,eAAe,kBAAkB,QAAQ,YAAY,UAAU;AACrE,SAAO,cAAc,UAAU,SAAS,KAAK,GAAG,KAAK;AACvD;AAQO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,mBAAmB;AAAA,EACnB,aAAa;AACf,GAAkB;AAChB,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,aAAa,MAAM,UAAU;AACnC,QAAM,eAAe,MAAM,iBACvB,MAAM,KAAK,UAAU,IAAI,MAAM,cAAc,IAC7C;AACJ,QAAM,cAAc,gBAAgB,MAAM,KAAK;AAE/C,QAAM,CAAC,oBAAoB,qBAAqB,IAAIG;AAAA,IAClD;AAAA,EACF;AACA,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAwB,IAAI;AACtE,QAAM,iBAAiBC,QAAiC,IAAI;AAC5D,QAAM,CAAC,cAAc,eAAe,IAAID;AAAA,IACtC,MAAM,oBAAI,IAAY;AAAA,EACxB;AACA,QAAM,eAAeC,QAAuB,IAAI;AAChD,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,KAAK;AAChD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,YAAY;AAEhB,EAAAE,WAAU,MAAM;AACd,0BAAsB,IAAI;AAC1B,qBAAiB,IAAI;AACrB,oBAAgB,oBAAI,IAAY,CAAC;AAAA,EACnC,GAAG,CAAC,YAAY,EAAE,CAAC;AAEnB,QAAM,eAAeG;AAAA,IACnB,MAAM,gBAAgB,aAAa,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;AAAA,IAChE,CAAC,aAAa,YAAY;AAAA,EAC5B;AAEA,QAAM,EAAE,cAAc,SAAS,IAAIA,SAAQ,MAAM;AAC/C,QAAI,SAAS;AACb,QAAI,OAAO;AACX,UAAM,eACJ,YAAY,SAAS,MACjB,IACA,YAAY,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE;AAClD,eAAW,QAAQ,cAAc;AAC/B,YAAM,UACJ,KAAK,aAAa,OAAO,MAAM,cAAc,MAAM,MAAM,IAAI;AAC/D,UAAI,QAAQ,SAAS,OAAQ,UAAS,QAAQ;AAC9C,YAAM,WACJ,KAAK,SAAS,MAAM,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE;AAC/D,YAAM,QAAQ,WAAW;AACzB,UAAI,QAAQ,KAAM,QAAO;AAAA,IAC3B;AACA,WAAO,EAAE,cAAc,QAAQ,UAAU,KAAK;AAAA,EAChD,GAAG,CAAC,cAAc,YAAY,MAAM,MAAM,IAAI,CAAC;AAE/C,QAAM,eAAeF,aAAY,CAAC,WAAmB;AACnD,0BAAsB,MAAM;AAC5B,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuBA,aAAY,CAAC,WAAmB;AAC3D,oBAAgB,CAAC,SAAS;AACxB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,MAAM,GAAG;AACpB,aAAK,OAAO,MAAM;AAAA,MACpB,OAAO;AACL,aAAK,IAAI,MAAM;AAAA,MACjB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqBA;AAAA,IACzB,CAAC,WAAmB;AAClB,qBAAe,UAAU,MAAM;AAC/B,uBAAiB,MAAM;AAAA,IACzB;AAAA,IACA,CAAC,MAAM,IAAI;AAAA,EACb;AAEA,QAAM,eAAeA,aAAY,CAAC,WAAmB;AACnD,0BAAsB,MAAM;AAC1B,YAAM,KAAK,aAAa,SAAS;AAAA,QAC/B,uBAAuB,MAAM;AAAA,MAC/B;AACA,UAAI,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,IACzC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA;AAAA,IACpB,CAAC,MAA2B;AAC1B,UAAI,eAAe;AACjB,YAAI,EAAE,QAAQ,UAAU;AACtB,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAClB,cAAI,eAAe,SAAS;AAC1B,oBAAQ,QAAQ,eAAe,OAAO;AACtC,2BAAe,UAAU;AAAA,UAC3B;AACA,2BAAiB,IAAI;AACrB,uBAAa,SAAS,MAAM;AAAA,QAC9B,WAAW,EAAE,QAAQ,SAAS;AAC5B,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAClB,yBAAe,UAAU;AACzB,2BAAiB,IAAI;AACrB,uBAAa,SAAS,MAAM;AAAA,QAC9B;AACA;AAAA,MACF;AAEA,YAAM,eAAe,aAAa;AAAA,QAChC,CAAC,MAAM,EAAE,OAAO;AAAA,MAClB;AAEA,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,gBAAM,OAAO,aAAa,eAAe,CAAC;AAC1C,cAAI,MAAM;AACR,kCAAsB,KAAK,EAAE;AAC7B,yBAAa,KAAK,EAAE;AAAA,UACtB;AACA;AAAA,QACF;AAAA,QACA,KAAK,WAAW;AACd,YAAE,eAAe;AACjB,gBAAM,OAAO,aAAa,eAAe,CAAC;AAC1C,cAAI,MAAM;AACR,kCAAsB,KAAK,EAAE;AAC7B,yBAAa,KAAK,EAAE;AAAA,UACtB;AACA;AAAA,QACF;AAAA,QACA,KAAK,cAAc;AACjB,YAAE,eAAe;AACjB,gBAAM,OAAO,gBAAgB,IAAI,aAAa,YAAY,IAAI;AAC9D,cAAI,SAAS,KAAK,SAAS,YAAY,KAAK,SAAS,UAAU;AAC7D,gBAAI,aAAa,IAAI,KAAK,EAAE,GAAG;AAC7B,8BAAgB,CAAC,SAAS;AACxB,sBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,qBAAK,OAAO,KAAK,EAAE;AACnB,uBAAO;AAAA,cACT,CAAC;AAAA,YACH,WAAW,KAAK,SAAS,SAAS,GAAG;AACnC,oCAAsB,KAAK,SAAS,CAAC,EAAE,EAAE;AACzC,2BAAa,KAAK,SAAS,CAAC,EAAE,EAAE;AAAA,YAClC;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,gBAAM,UAAU,gBAAgB,IAAI,aAAa,YAAY,IAAI;AACjE,cAAI,CAAC,QAAS;AACd,gBAAM,cACJ,QAAQ,SAAS,YAAY,QAAQ,SAAS;AAChD,cAAI,eAAe,CAAC,aAAa,IAAI,QAAQ,EAAE,GAAG;AAChD,4BAAgB,CAAC,SAAS;AACxB,oBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,mBAAK,IAAI,QAAQ,EAAE;AACnB,qBAAO;AAAA,YACT,CAAC;AAAA,UACH,WAAW,QAAQ,UAAU;AAC3B,kBAAM,kBAAkB,aAAa;AAAA,cACnC,CAAC,MAAM,EAAE,OAAO,QAAQ;AAAA,YAC1B;AACA,gBAAI,iBAAiB;AACnB,oCAAsB,gBAAgB,EAAE;AACxC,2BAAa,gBAAgB,EAAE;AAAA,YACjC;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ,YAAE,eAAe;AACjB,cAAI,oBAAoB;AACtB,2BAAe,UAAU,MAAM;AAC/B,6BAAiB,kBAAkB;AAAA,UACrC;AACA;AAAA,QACF;AAAA,QACA,KAAK,UAAU;AACb,YAAE,eAAe;AACjB,2BAAiB,IAAI;AACrB;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,gBAAM,WACJ,gBAAgB,IAAI,aAAa,YAAY,IAAI;AACnD,cAAI,YAAY,SAAS,UAAU;AACjC,kBAAM,aACJ,aAAa,eAAe,CAAC,KAAK,aAAa,eAAe,CAAC;AACjE,kBAAM,UAAUC,YAAW,MAAM,MAAM,SAAS,EAAE;AAClD,oBAAQ,QAAQ,OAAO;AACvB,gBAAI,cAAc,WAAW,OAAO,SAAS,IAAI;AAC/C,oCAAsB,WAAW,EAAE;AAAA,YACrC,OAAO;AACL,oCAAsB,IAAI;AAAA,YAC5B;AAAA,UACF;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,iBAAiB;AAAA,cACjB,YAAY;AAAA,YACd;AAAA,YAEA,0BAAAA,KAAC,eAAY;AAAA;AAAA,QACf;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,uBAAmB;AAAA,YACnB,UAAU;AAAA,YACV,WAAW;AAAA,YACX,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,QAAQ,CAAC,MAAM;AACb,kBAAI,CAAC,EAAE,cAAc,SAAS,EAAE,aAAqB,GAAG;AACtD,6BAAa,KAAK;AAAA,cACpB;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS;AAAA,YACX;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,QAAQ,MAAM;AAAA,gBACd;AAAA,gBACA,OAAO;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV,kBAAkB;AAAA,gBAClB,gBAAgB;AAAA,gBAChB,aAAa;AAAA,gBACb,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,QAAQ;AAAA;AAAA,YACV;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AGp7BA,SAAS,UAAAS,SAAQ,aAAAC,YAAW,eAAAC,oBAAmB;AA0DzC,SA8BI,YAAAC,WA9BJ,OAAAC,MA8BI,QAAAC,aA9BJ;AAnDC,SAAS,UAAU,EAAE,UAAU,GAAmB;AACvD,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,WAAWC,QAAyB,IAAI;AAE9C,QAAM,gBAAgBC;AAAA,IACpB,CAAC,MAA2B;AAC1B,UAAI,EAAE,QAAQ,SAAS;AACrB,UAAE,eAAe;AACjB,YAAI,EAAE,UAAU;AACd,kBAAQ,gBAAgB;AAAA,QAC1B,OAAO;AACL,kBAAQ,gBAAgB;AAAA,QAC1B;AAAA,MACF;AACA,UAAI,EAAE,QAAQ,UAAU;AACtB,UAAE,eAAe;AACjB,gBAAQ,eAAe,EAAE;AACzB,iBAAS,SAAS,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,EAAAC,WAAU,MAAM;AACd,aAAS,oBAAoB,GAAkB;AAC7C,YAAM,MAAM,EAAE,WAAW,EAAE;AAC3B,UAAI,OAAO,EAAE,QAAQ,KAAK;AACxB,UAAE,eAAe;AACjB,iBAAS,SAAS,MAAM;AACxB,iBAAS,SAAS,OAAO;AAAA,MAC3B;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,mBAAmB;AACxD,WAAO,MAAM,SAAS,oBAAoB,WAAW,mBAAmB;AAAA,EAC1E,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,eAAe,aAAa,IAAI,MAAM,mBAAmB,IAAI;AAEnE,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,cAAc;AAAA,MAChB;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAO,MAAM;AAAA,YACb,UAAU,CAAC,MAAM,QAAQ,eAAe,EAAE,OAAO,KAAK;AAAA,YACtD,WAAW;AAAA,YACX,aAAY;AAAA,YACZ,OAAO;AAAA,cACL,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,SAAS;AAAA,cACT,SAAS;AAAA,cACT,UAAU;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YAEC,gBAAM,cACL,gBAAAC,MAAAF,WAAA,EACE;AAAA,8BAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,OACE,aAAa,IACT,kCACA;AAAA,oBACN,YAAY;AAAA,oBACZ,YAAY;AAAA,kBACd;AAAA,kBAEC,uBAAa,IAAI,GAAG,YAAY,IAAI,UAAU,KAAK;AAAA;AAAA,cACtD;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,QAAQ;AAAA,kBACjB,UAAU,eAAe;AAAA,kBACzB,cAAW;AAAA,kBACX,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,OACE,aAAa,IACT,4BACA;AAAA,oBACN,QAAQ,aAAa,IAAI,YAAY;AAAA,oBACrC,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,OAAO;AAAA,oBACP,QAAQ;AAAA,kBACV;AAAA,kBACA,OAAM;AAAA,kBACP;AAAA;AAAA,cAED;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,QAAQ;AAAA,kBACjB,UAAU,eAAe;AAAA,kBACzB,cAAW;AAAA,kBACX,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,OACE,aAAa,IACT,4BACA;AAAA,oBACN,QAAQ,aAAa,IAAI,YAAY;AAAA,oBACrC,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,OAAO;AAAA,oBACP,QAAQ;AAAA,kBACV;AAAA,kBACA,OAAM;AAAA,kBACP;AAAA;AAAA,cAED;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM,QAAQ,eAAe,EAAE;AAAA,kBACxC,cAAW;AAAA,kBACX,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,OAAO;AAAA,oBACP,QAAQ;AAAA,kBACV;AAAA,kBACA,OAAM;AAAA,kBACP;AAAA;AAAA,cAED;AAAA,eACF,IAEA,gBAAAC,MAAAF,WAAA,EACE;AAAA,8BAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,QAAQ;AAAA,kBACjB,cAAW;AAAA,kBACX,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,kBACd;AAAA,kBACA,OAAM;AAAA,kBAEN,0BAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAM;AAAA,sBACN,QAAO;AAAA,sBACP,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,aAAY;AAAA,sBACZ,eAAc;AAAA,sBACd,gBAAe;AAAA,sBAEf;AAAA,wCAAAD,KAAC,UAAK,GAAE,sBAAqB;AAAA,wBAC7B,gBAAAA,KAAC,UAAK,GAAE,yBAAwB;AAAA,wBAChC,gBAAAA,KAAC,UAAK,GAAE,WAAU;AAAA;AAAA;AAAA,kBACpB;AAAA;AAAA,cACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,QAAQ;AAAA,kBACjB,cAAW;AAAA,kBACX,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,kBACd;AAAA,kBACA,OAAM;AAAA,kBAEN,0BAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAM;AAAA,sBACN,QAAO;AAAA,sBACP,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,aAAY;AAAA,sBACZ,eAAc;AAAA,sBACd,gBAAe;AAAA,sBAEf;AAAA,wCAAAD,KAAC,UAAK,GAAE,sBAAqB;AAAA,wBAC7B,gBAAAA,KAAC,UAAK,GAAE,wBAAuB;AAAA,wBAC/B,gBAAAA,KAAC,UAAK,GAAE,WAAU;AAAA;AAAA;AAAA,kBACpB;AAAA;AAAA,cACF;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;AX1II,SACE,OAAAK,MADF,QAAAC,aAAA;AA5EJ,IAAM,mBAA2C;AAAA,EAC/C,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,wBAAwB;AAC1B;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,cAAc;AAChB,GAAoB;AAClB,QAAM,eAAe,UAAU;AAC/B,QAAM,eAAe,eAAe,QAAS,gBAAgB,CAAC;AAE9D,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,CAAC;AAC5C,QAAM,WAAWC,QAAO,YAAY;AAEpC,EAAAC,WAAU,MAAM;AACd,QAAI,gBAAgB,UAAU,SAAS,SAAS;AAC9C,eAAS,UAAU;AACnB,mBAAa,CAAC,MAAM,IAAI,CAAC;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,QAAM,eAAeC;AAAA,IACnB,CAAC,aAAwB;AACvB,eAAS,UAAU;AACnB,UAAI,CAAC,UAAU;AACb,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,IACA,CAAC,UAAU,QAAQ;AAAA,EACrB;AAEA,QAAM,iBAAgC;AAAA,IACpC,QAAQ,OAAO,WAAW,WAAW,GAAG,MAAM,OAAO;AAAA,IACrD,OAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,IAClD,SAAS;AAAA,IACT,eAAe;AAAA,IACf,UAAU;AAAA,IACV,GAAI;AAAA,IACJ,GAAG;AAAA,EACL;AAEA,SACE,gBAAAJ,MAAC,SAAI,WAAsB,gBAAa,IAAG,OAAO,gBAChD;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,yBAAyB;AAAA,UACvB,QAAQ;AAAA,QACV;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO,SAAS;AAAA,QAChB,UAAU,WAAW,SAAY;AAAA,QACjC;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA;AAAA,MAXK;AAAA,IAYP;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,CAAC,cAAc,eAAe,IAAIE,UAAS,GAAG;AACpD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA0B,MAAM;AACtE,QAAM,eAAeC,QAAuB,IAAI;AAChD,QAAM,WAAWA,QAAO,KAAK;AAC7B,QAAM,SAASA,QAAO,CAAC;AACvB,QAAM,aAAaA,QAAO,CAAC;AAE3B,EAAAC,WAAU,MAAM;AACd,aAAS,aAAa;AACpB,UAAI,aAAa,SAAS;AACxB,oBAAY,aAAa,QAAQ,cAAc,GAAG;AAAA,MACpD;AAAA,IACF;AACA,eAAW;AACX,UAAM,WAAW,IAAI,eAAe,UAAU;AAC9C,QAAI,aAAa,QAAS,UAAS,QAAQ,aAAa,OAAO;AAC/D,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBC;AAAA,IACtB,CAAC,MAAwB;AACvB,eAAS,UAAU;AACnB,aAAO,UAAU,EAAE;AACnB,iBAAW,UAAU;AACrB,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAEjC,YAAM,kBAAkB,CAAC,OAAmB;AAC1C,YAAI,CAAC,SAAS,QAAS;AACvB,cAAM,QAAQ,GAAG,UAAU,OAAO;AAClC,cAAM,WAAW,KAAK;AAAA,UACpB;AAAA,UACA,KAAK,IAAI,KAAK,WAAW,UAAU,KAAK;AAAA,QAC1C;AACA,wBAAgB,QAAQ;AAAA,MAC1B;AAEA,YAAM,gBAAgB,MAAM;AAC1B,iBAAS,UAAU;AACnB,iBAAS,KAAK,MAAM,SAAS;AAC7B,iBAAS,KAAK,MAAM,aAAa;AACjC,iBAAS,oBAAoB,aAAa,eAAe;AACzD,iBAAS,oBAAoB,WAAW,aAAa;AAAA,MACvD;AAEA,eAAS,iBAAiB,aAAa,eAAe;AACtD,eAAS,iBAAiB,WAAW,aAAa;AAAA,IACpD;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,MAAI,UAAU;AACZ,QAAI,CAAC,aAAa;AAChB,aACE,gBAAAL;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,MAAM;AAAA,YACN,WAAW;AAAA,UACb;AAAA,UAEA,0BAAAA,KAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAClC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,kBAAkB;AAAA,cAClB,YAAY;AAAA;AAAA,UACd,GACF;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,MAAM;AAAA,UACN,WAAW;AAAA,QACb;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,iBAAiB;AAAA,cACnB;AAAA,cAEA;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,MAAM,eAAe,MAAM;AAAA,oBACpC,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,UAAU;AAAA,sBACV,SAAS;AAAA,sBACT,QAAQ;AAAA,sBACR,YAAY;AAAA,sBACZ,QAAQ;AAAA,sBACR,YACE,gBAAgB,SACZ,oCACA;AAAA,sBACN,OACE,gBAAgB,SACZ,4BACA;AAAA,oBACR;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,MAAM,eAAe,MAAM;AAAA,oBACpC,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,UAAU;AAAA,sBACV,SAAS;AAAA,sBACT,QAAQ;AAAA,sBACR,YAAY;AAAA,sBACZ,QAAQ;AAAA,sBACR,YACE,gBAAgB,SACZ,oCACA;AAAA,sBACN,OACE,gBAAgB,SACZ,4BACA;AAAA,oBACR;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA,KAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,SAAS,GACrD,0BAAgB,SACf,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,QAAQ;AAAA,cACV;AAAA,cAEA;AAAA,gCAAAD,KAAC,aAAU;AAAA,gBACX,gBAAAA,KAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,OAAO,GACpD,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,YAAY;AAAA,oBACZ,YAAY;AAAA;AAAA,gBACd,GACF;AAAA;AAAA;AAAA,UACF,IAEA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,QAAQ;AAAA,cACV;AAAA,cAEA,0BAAAA,KAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAClC,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,kBAAkB;AAAA,kBAClB,YAAY;AAAA;AAAA,cACd,GACF;AAAA;AAAA,UACF,GAEJ;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,KAAK,cAAc,OAAO,EAAE,SAAS,QAAQ,MAAM,GAAG,WAAW,EAAE,GACtE;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,eAAe;AAAA,UACf,OAAO,cAAc,eAAe;AAAA,UACpC,YAAY;AAAA,QACd;AAAA,QAEA;AAAA,0BAAAD,KAAC,aAAU;AAAA,UACX,gBAAAA,KAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,OAAO,GACpD,0BAAAA,KAAC,YAAS,YAAY,gBAAgB,YAAY,gBAAgB,GACpE;AAAA;AAAA;AAAA,IACF;AAAA,IACC,eACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,iBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa;AAAA,YACb,cAAc,CAAC,MAAM;AACnB,oBAAM,SAAS,EAAE,cAAc;AAC/B,kBAAI;AACF,uBAAO,MAAM,kBAAkB;AAAA,YACnC;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,kBAAI,CAAC,SAAS,SAAS;AACrB,sBAAM,SAAS,EAAE,cAAc;AAC/B,oBAAI;AACF,yBAAO,MAAM,kBAAkB;AAAA,cACnC;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QAEA,0BAAAA,KAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAClC,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,kBAAkB;AAAA,YAClB,YAAY;AAAA;AAAA,QACd,GACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AYnYA,SAAS,YAAAM,WAAU,eAAAC,cAAa,UAAAC,gBAAc;AAC9C;AAAA,EACE,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,cAAAC;AAAA,OAIK;AAgGC,gBAAAC,MAuEA,QAAAC,aAvEA;AA3FR,IAAM,YAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOA,SAAS,YAAY,EAAE,MAAM,eAAe,GAAqB;AAC/D,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,cAAc,KAAK,SAAS,YAAY,KAAK,SAAS;AAC5D,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,KAAK;AAClD,QAAM,UAAUC,SAAyB,IAAI;AAE7C,WAAS,kBAAkB,UAAkB;AAC3C,QAAI;AACJ,QAAI,aAAa,OAAQ,UAAS;AAAA,aACzB,aAAa,OAAQ,UAAS;AAAA,aAC9B,aAAa,QAAS,UAAS;AAAA,cAErC,KAAK,SAAS,YACb,gBAAgB,SAAS,YACzB,gBAAgB,SAAS,cAC3B,CAAC,MAAM,OAAO,QAAQ,CAAC,KACvB,SAAS,KAAK,MAAM;AAEpB,eAAS,OAAO,QAAQ;AAAA,QACrB,UAAS;AAEd,UAAM,UAAUC,UAAS,MAAM,MAAM,KAAK,IAAI,MAAM;AACpD,YAAQ,QAAQ,OAAO;AAAA,EACzB;AAEA,WAAS,gBAAgB,QAAgB;AACvC,UAAM,UAAUC,QAAO,MAAM,MAAM,KAAK,IAAI,MAAM;AAClD,YAAQ,QAAQ,OAAO;AAAA,EACzB;AAEA,WAAS,eAAe;AACtB,UAAM,UAAUC,YAAW,MAAM,MAAM,KAAK,EAAE;AAC9C,YAAQ,QAAQ,OAAO;AAAA,EACzB;AAEA,WAAS,iBAAiB;AACxB,UAAM,MACJ,KAAK,SAAS,UACV,OAAO,KAAK,SAAS,MAAM,IAC3B,MAAM,KAAK,SAAS,MAAM;AAChC,UAAM,UAAUC,aAAY,MAAM,MAAM,KAAK,IAAI,KAAK,EAAE;AACxD,YAAQ,QAAQ,OAAO;AAAA,EACzB;AAEA,WAAS,eAAuB;AAC9B,QAAI,aAAa;AACf,aAAO,KAAK,SAAS,UACjB,IAAI,KAAK,SAAS,MAAM,YACxB,IAAI,KAAK,SAAS,MAAM;AAAA,IAC9B;AACA,QAAI,KAAK,UAAU,KAAM,QAAO;AAChC,QAAI,KAAK,UAAU,OAAW,QAAO;AACrC,QAAI,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,GAAI,QAAO;AAChE,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B;AAEA,QAAM,gBAAgB,gBAAgB,QAAQ,eAAe,KAAK,SAAS;AAC3E,QAAM,cAAc,gBAAgB;AAEpC,SACE,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,MAAM,cAAc,IAAI;AAAA,MACtC,cAAc,MAAM,cAAc,KAAK;AAAA,MAEvC;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,WAAW;AAAA,cACX,iBAAiB,aACb,gCACA;AAAA,YACN;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,KAAK;AAAA,kBACZ,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,kBAC/C,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,OAAO;AAAA,oBACP,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,OAAO;AAAA,oBACP,YAAY;AAAA,kBACd;AAAA;AAAA,cACF;AAAA,cACC,CAAC,cACA,gBACE,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,YAAY,eAAgB;AAAA,kBAC5B,OAAO,aAAa;AAAA,kBACpB,eAAe;AAAA,kBACf,UAAU;AAAA,kBACV,YAAY;AAAA,oBACV,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,OACE,KAAK,SAAS,WACV,8BACA;AAAA,oBACN,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,MAAM;AAAA,oBACN,SAAS;AAAA,kBACX;AAAA;AAAA,cACF,IAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,aAAa;AAAA,kBACpB,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA,kBACjD,aAAY;AAAA,kBACZ,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,OACE,KAAK,SAAS,WACV,8BACA;AAAA,oBACN,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,MAAM;AAAA,oBACN,WAAW;AAAA,kBACb;AAAA;AAAA,cACF,IAGF,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,MAAM;AAAA,oBACN,WAAW;AAAA,kBACb;AAAA,kBAEC,uBAAa;AAAA;AAAA,cAChB;AAAA,cAEF,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,KAAK;AAAA,oBACL,SAAS,aAAa,IAAI;AAAA,oBAC1B,YAAY;AAAA,oBACZ,YAAY;AAAA,kBACd;AAAA,kBAEC;AAAA,mCACC,gBAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,OAAO;AAAA,0BACL,YAAY;AAAA,0BACZ,QAAQ;AAAA,0BACR,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,SAAS;AAAA,0BACT,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,cAAc;AAAA,0BACd,YAAY;AAAA,wBACd;AAAA,wBACA,OAAM;AAAA,wBACP;AAAA;AAAA,oBAED;AAAA,oBAEF,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,OAAO;AAAA,0BACL,YAAY;AAAA,0BACZ,QAAQ;AAAA,0BACR,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,SAAS;AAAA,0BACT,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,cAAc;AAAA,0BACd,YAAY;AAAA,wBACd;AAAA,wBACA,OAAM;AAAA,wBACP;AAAA;AAAA,oBAED;AAAA;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QACF;AAAA,QACC,eACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,cAAc;AAAA,YAChB;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAMO,SAAS,eAAe,EAAE,UAAU,GAAwB;AACjE,QAAM,EAAE,OAAO,QAAQ,IAAI,UAAU;AACrC,QAAM,eAAe,MAAM,iBACvB,MAAM,KAAK,UAAU,IAAI,MAAM,cAAc,IAC7C;AAEJ,QAAM,mBAAmBQ;AAAA,IACvB,CAAC,YAAsB;AACrB,UAAI,CAAC,aAAc;AACnB,YAAM,UAAUC,YAAW,MAAM,MAAM,aAAa,IAAI,OAAO;AAC/D,cAAQ,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA,CAAC,MAAM,MAAM,cAAc,OAAO;AAAA,EACpC;AAEA,QAAM,kBAAkBD,aAAY,MAAM;AACxC,QAAI,CAAC,aAAc;AACnB,UAAM,UAAUE,eAAc,MAAM,MAAM,aAAa,EAAE;AACzD,YAAQ,QAAQ,OAAO;AAAA,EACzB,GAAG,CAAC,MAAM,MAAM,cAAc,OAAO,CAAC;AAEtC,QAAM,iBAAiBF,aAAY,MAAM;AACvC,QAAI,CAAC,aAAc;AACnB,cAAU,UAAU,UAAU,aAAa,IAAI,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACjE,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,kBAAkBA,aAAY,MAAM;AACxC,QAAI,CAAC,aAAc;AACnB,UAAM,QAAQG,QAAO,YAAY;AACjC,UAAM,OACJ,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,OAAO,MAAM,CAAC;AACnE,cAAU,UAAU,UAAU,IAAI,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpD,GAAG,CAAC,YAAY,CAAC;AAEjB,MAAI,CAAC,cAAc;AACjB,WACE,gBAAAX;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ;AAAA,QACV;AAAA,QACD;AAAA;AAAA,IAED;AAAA,EAEJ;AAEA,QAAM,cACJ,aAAa,SAAS,YAAY,aAAa,SAAS;AAE1D,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,cAAc,QAAQ;AAE5B,WAAS,eAAe,UAAkD;AACxE,QAAI,CAAC,UAAU,CAAC,aAAc,QAAO;AACrC,UAAM,YACJ,aAAa,SAAS,MAClB,IAAI,QAAQ,KACZ,GAAG,aAAa,IAAI,IAAI,QAAQ;AACtC,UAAM,MAAMY,mBAAkB,QAAQ,SAAS;AAC/C,WAAO,MAAMC,YAAW,KAAK,MAAM,IAAI;AAAA,EACzC;AAEA,WAAS,YAAY;AACnB,QAAI,CAAC,aAAc;AACnB,UAAM,MACJ,aAAa,SAAS,UAClB,OAAO,aAAa,SAAS,MAAM,IACnC,MAAM,aAAa,SAAS,MAAM;AACxC,UAAM,UAAUN,aAAY,MAAM,MAAM,aAAa,IAAI,KAAK,EAAE;AAChE,YAAQ,QAAQ,OAAO;AAAA,EACzB;AAEA,SACE,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,SAAS;AAAA,cACT,cAAc;AAAA,cACd,UAAU;AAAA,cACV,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,iBAAiB;AAAA,YACnB;AAAA,YAEA;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,eAAe;AAAA,oBACf,KAAK;AAAA,oBACL,MAAM;AAAA,oBACN,UAAU;AAAA,kBACZ;AAAA,kBAEA;AAAA,oCAAAD,KAAC,eAAY;AAAA,oBACZ,eACC,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO,EAAE,UAAU,IAAI,OAAO,8BAA8B;AAAA,wBAE3D;AAAA;AAAA,oBACH;AAAA;AAAA;AAAA,cAEJ;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,YAAY;AAAA,kBACd;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO,aAAa;AAAA,wBACpB,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAiB;AAAA,wBAC5D,OAAO;AAAA,0BACL,YAAY;AAAA,0BACZ,QAAQ;AAAA,0BACR,cAAc;AAAA,0BACd,OAAO;AAAA,0BACP,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,SAAS;AAAA,0BACT,QAAQ;AAAA,wBACV;AAAA,wBACA,OAAM;AAAA,wBAEL,oBAAU,IAAI,CAAC,MACd,gBAAAA,KAAC,YAAe,OAAO,GACpB,eADU,CAEb,CACD;AAAA;AAAA,oBACH;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,OAAO;AAAA,wBACP,OAAM;AAAA,wBACP;AAAA;AAAA,oBAED;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,OAAO;AAAA,wBACP,OAAM;AAAA,wBACP;AAAA;AAAA,oBAED;AAAA,oBACC,aAAa,YACZ,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,OAAO;AAAA,wBACP,OAAM;AAAA,wBACP;AAAA;AAAA,oBAED;AAAA,oBAED,eACC,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,OAAO;AAAA,0BACL,GAAG;AAAA,0BACH,QAAQ;AAAA,wBACV;AAAA,wBACD;AAAA;AAAA,oBAED;AAAA;AAAA;AAAA,cAEJ;AAAA;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA,KAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,OAAO,GACrC,wBACC,aAAa,SAAS,IAAI,CAAC,UACzB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM;AAAA,YACN,gBAAgB,eAAe,MAAM,GAAG;AAAA;AAAA,UAFnC,MAAM;AAAA,QAGb,CACD,IAED,gBAAAA,KAAC,eAAY,MAAM,cAAc,GAErC;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,oBAAyC;AAAA,EAC7C,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AACd;;;AChdA,SAAS,WAAAc,gBAAe;AACxB,SAAS,mBAAkD;AA6CrD,SAsBI,YAAAC,WAtBJ,OAAAC,OAsBI,QAAAC,aAtBJ;AA3CN,IAAM,cAGF;AAAA,EACF,OAAO,EAAE,IAAI,WAAW,QAAQ,KAAK,OAAO,UAAU;AAAA,EACtD,SAAS,EAAE,IAAI,WAAW,QAAQ,KAAK,OAAO,UAAU;AAAA,EACxD,SAAS,EAAE,IAAI,WAAW,QAAQ,KAAK,OAAO,UAAU;AAC1D;AAEA,SAAS,YAAY,OAAwB;AAC3C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAC1C,QAAI,KAAK,SAAS,IAAI;AACpB,aAAO,KAAK,UAAU,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK;AACrB;AAMA,SAAS,QAAQ,EAAE,MAAM,GAAiB;AACxC,QAAM,SAAS,YAAY,MAAM,IAAI;AAErC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,cAAc;AAAA,QACd,iBAAiB,OAAO;AAAA,QACxB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,KAAK;AAAA,MACP;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO,OAAO;AAAA,cACd,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,WAAW;AAAA,YACb;AAAA,YAEC,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ;AAAA,YAEC,gBAAM;AAAA;AAAA,QACT;AAAA,QACA,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,GAAG,SAAS,QAAQ,KAAK,GAAG,UAAU,SAAS,GACjE;AAAA,gBAAM,SAAS,aACd,gBAAAA,MAAAF,WAAA,EACE;AAAA,4BAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,WAAW,gBAAgB,eAAe,GAC7D,sBAAY,MAAM,QAAQ,GAC7B;AAAA,YACA,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,8BAA8B,GAAG,oBAAM;AAAA,YAC7D,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,UAAU,GAC7B,sBAAY,MAAM,QAAQ,GAC7B;AAAA,aACF;AAAA,UAED,MAAM,SAAS,WACd,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,UAAU,GAC7B,sBAAY,MAAM,QAAQ,GAC7B;AAAA,UAED,MAAM,SAAS,aACd,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,WAAW,gBAAgB,eAAe,GAC7D,sBAAY,MAAM,QAAQ,GAC7B;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAQO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,UAAUF;AAAA,IACd,MAAM,YAAY,cAAuB,WAAoB;AAAA,IAC7D,CAAC,cAAc,WAAW;AAAA,EAC5B;AAEA,QAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE;AACxD,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE;AAE5D,SACE,gBAAAG;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,iBAAiB;AAAA,cACjB,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD,MAAC,UAAK,OAAO,EAAE,OAAO,gCAAgC,GACnD,kBAAQ,WAAW,IAAI,eAAe,GAAG,QAAQ,MAAM,YAC1D;AAAA,cACC,QAAQ,KAAK,gBAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,UAAU,GAAG;AAAA;AAAA,gBAAE;AAAA,gBAAM;AAAA,iBAAM;AAAA,cAC9D,UAAU,KACT,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,UAAU,GAAG;AAAA;AAAA,gBAAE;AAAA,gBAAQ;AAAA,iBAAQ;AAAA,cAEtD,UAAU,KACT,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,UAAU,GAAG;AAAA;AAAA,gBAAE;AAAA,gBAAQ;AAAA,iBAAS;AAAA;AAAA;AAAA,QAE1D;AAAA,QACA,gBAAAD,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,OAAO,GACrC,kBAAQ,WAAW,IAClB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ;AAAA,YACD;AAAA;AAAA,QAED,IAEA,QAAQ,IAAI,CAAC,OAAO,MAAM,gBAAAA,MAAC,WAAgB,SAAH,CAAiB,CAAE,GAE/D;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["useState","useRef","useCallback","useEffect","useState","useMemo","useRef","useCallback","useEffect","toJson","useEffect","useRef","useState","jsx","useState","useCallback","useRef","useState","useRef","useCallback","jsx","useState","useRef","useMemo","useCallback","toJson","useEffect","useState","useCallback","useRef","useEffect","useMemo","removeNode","getPropertySchema","useState","useRef","useEffect","useCallback","useMemo","jsx","jsxs","useState","useRef","useEffect","useMemo","useCallback","useState","useRef","useEffect","useCallback","useMemo","jsx","jsxs","DROPDOWN_MAX_HEIGHT","jsx","jsxs","getPropertySchema","useState","useRef","useEffect","useCallback","removeNode","useMemo","useRef","useEffect","useCallback","Fragment","jsx","jsxs","useRef","useCallback","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","useCallback","useRef","setValue","setKey","addProperty","removeNode","changeType","duplicateNode","toJson","getPropertySchema","resolveRef","jsx","jsxs","useState","useRef","setValue","setKey","removeNode","addProperty","useCallback","changeType","duplicateNode","toJson","getPropertySchema","resolveRef","useMemo","Fragment","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/json-editor.tsx","../src/visual-json.tsx","../../../@internal/ui/src/tree.ts","../../../@internal/ui/src/drag-drop.ts","../../../@internal/ui/src/theme.ts","../../../@internal/ui/src/diff.ts","../../../@internal/ui/src/form.ts","../src/context.ts","../src/selection-utils.ts","../src/tree-view.tsx","../src/context-menu.tsx","../src/use-drag-drop.ts","../src/form-view.tsx","../src/breadcrumbs.tsx","../src/enum-input.tsx","../src/search-bar.tsx","../src/diff-view.tsx"],"sourcesContent":["import {\n useState,\n useRef,\n useCallback,\n useEffect,\n type CSSProperties,\n} from \"react\";\nimport type { JsonValue, JsonSchema } from \"@visual-json/core\";\nimport { VisualJson } from \"./visual-json\";\nimport { TreeView } from \"./tree-view\";\nimport { FormView } from \"./form-view\";\nimport { SearchBar } from \"./search-bar\";\n\nexport interface JsonEditorProps {\n value?: JsonValue;\n defaultValue?: JsonValue;\n onChange?: (value: JsonValue) => void;\n schema?: JsonSchema | null;\n height?: string | number;\n width?: string | number;\n className?: string;\n style?: CSSProperties;\n readOnly?: boolean;\n treeShowValues?: boolean;\n treeShowCounts?: boolean;\n editorShowDescriptions?: boolean;\n editorShowCounts?: boolean;\n sidebarOpen?: boolean;\n}\n\nimport { DEFAULT_CSS_VARS } from \"@internal/ui\";\n\nexport function JsonEditor({\n value,\n defaultValue,\n onChange,\n schema,\n height = \"100%\",\n width = \"100%\",\n className,\n style,\n readOnly,\n treeShowValues = true,\n treeShowCounts = false,\n editorShowDescriptions = false,\n editorShowCounts = false,\n sidebarOpen = true,\n}: JsonEditorProps) {\n const isControlled = value !== undefined;\n const initialValue = isControlled ? value : (defaultValue ?? {});\n\n const [editorKey, setEditorKey] = useState(0);\n const valueRef = useRef(initialValue);\n\n useEffect(() => {\n if (isControlled && value !== valueRef.current) {\n valueRef.current = value;\n setEditorKey((k) => k + 1);\n }\n }, [value, isControlled]);\n\n const handleChange = useCallback(\n (newValue: JsonValue) => {\n valueRef.current = newValue;\n if (!readOnly) {\n onChange?.(newValue);\n }\n },\n [onChange, readOnly],\n );\n\n const containerStyle: CSSProperties = {\n height: typeof height === \"number\" ? `${height}px` : height,\n width: typeof width === \"number\" ? `${width}px` : width,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...(DEFAULT_CSS_VARS as unknown as CSSProperties),\n ...style,\n };\n\n return (\n <div className={className} data-vj-root=\"\" style={containerStyle}>\n <style\n dangerouslySetInnerHTML={{\n __html: `@media(pointer:coarse){[data-vj-root]{--vj-input-font-size:16px}}`,\n }}\n />\n <VisualJson\n key={editorKey}\n value={valueRef.current}\n onChange={readOnly ? undefined : handleChange}\n schema={schema}\n >\n <EditorLayout\n treeShowValues={treeShowValues}\n treeShowCounts={treeShowCounts}\n editorShowDescriptions={editorShowDescriptions}\n editorShowCounts={editorShowCounts}\n sidebarOpen={sidebarOpen}\n />\n </VisualJson>\n </div>\n );\n}\n\nfunction EditorLayout({\n treeShowValues,\n treeShowCounts,\n editorShowDescriptions,\n editorShowCounts,\n sidebarOpen,\n}: {\n treeShowValues: boolean;\n treeShowCounts: boolean;\n editorShowDescriptions: boolean;\n editorShowCounts: boolean;\n sidebarOpen: boolean;\n}) {\n const [sidebarWidth, setSidebarWidth] = useState(280);\n const [isNarrow, setIsNarrow] = useState(false);\n const [activePanel, setActivePanel] = useState<\"tree\" | \"form\">(\"tree\");\n const containerRef = useRef<HTMLDivElement>(null);\n const dragging = useRef(false);\n const startX = useRef(0);\n const startWidth = useRef(0);\n\n useEffect(() => {\n function checkWidth() {\n if (containerRef.current) {\n setIsNarrow(containerRef.current.offsetWidth < 500);\n }\n }\n checkWidth();\n const observer = new ResizeObserver(checkWidth);\n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n dragging.current = true;\n startX.current = e.clientX;\n startWidth.current = sidebarWidth;\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n\n const handleMouseMove = (ev: MouseEvent) => {\n if (!dragging.current) return;\n const delta = ev.clientX - startX.current;\n const newWidth = Math.max(\n 180,\n Math.min(600, startWidth.current + delta),\n );\n setSidebarWidth(newWidth);\n };\n\n const handleMouseUp = () => {\n dragging.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n },\n [sidebarWidth],\n );\n\n if (isNarrow) {\n if (!sidebarOpen) {\n return (\n <div\n ref={containerRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n minHeight: 0,\n }}\n >\n <div style={{ flex: 1, minHeight: 0 }}>\n <FormView\n showDescriptions={editorShowDescriptions}\n showCounts={editorShowCounts}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n minHeight: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexShrink: 0,\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n }}\n >\n <button\n onClick={() => setActivePanel(\"tree\")}\n style={{\n flex: 1,\n fontSize: 11,\n padding: \"4px 0\",\n cursor: \"pointer\",\n fontFamily: \"var(--vj-font, monospace)\",\n border: \"none\",\n background:\n activePanel === \"tree\"\n ? \"var(--vj-accent-muted, #094771)\"\n : \"transparent\",\n color:\n activePanel === \"tree\"\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-muted, #999999)\",\n }}\n >\n Tree\n </button>\n <button\n onClick={() => setActivePanel(\"form\")}\n style={{\n flex: 1,\n fontSize: 11,\n padding: \"4px 0\",\n cursor: \"pointer\",\n fontFamily: \"var(--vj-font, monospace)\",\n border: \"none\",\n background:\n activePanel === \"form\"\n ? \"var(--vj-accent-muted, #094771)\"\n : \"transparent\",\n color:\n activePanel === \"form\"\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-muted, #999999)\",\n }}\n >\n Form\n </button>\n </div>\n <div style={{ flex: 1, minHeight: 0, overflow: \"hidden\" }}>\n {activePanel === \"tree\" ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n }}\n >\n <SearchBar />\n <div style={{ flex: 1, minHeight: 0, overflow: \"auto\" }}>\n <TreeView\n showValues={treeShowValues}\n showCounts={treeShowCounts}\n />\n </div>\n </div>\n ) : (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n }}\n >\n <div style={{ flex: 1, minHeight: 0 }}>\n <FormView\n showDescriptions={editorShowDescriptions}\n showCounts={editorShowCounts}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div ref={containerRef} style={{ display: \"flex\", flex: 1, minHeight: 0 }}>\n <div\n style={{\n flexShrink: 0,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n width: sidebarOpen ? sidebarWidth : 0,\n transition: \"width 0.2s ease\",\n }}\n >\n <SearchBar />\n <div style={{ flex: 1, minHeight: 0, overflow: \"auto\" }}>\n <TreeView showValues={treeShowValues} showCounts={treeShowCounts} />\n </div>\n </div>\n {sidebarOpen && (\n <div\n style={{\n width: 1,\n flexShrink: 0,\n backgroundColor: \"var(--vj-border, #333333)\",\n position: \"relative\",\n transition: \"background-color 0.15s\",\n }}\n >\n <div\n onMouseDown={handleMouseDown}\n onMouseEnter={(e) => {\n const parent = e.currentTarget.parentElement;\n if (parent)\n parent.style.backgroundColor = \"var(--vj-accent, #007acc)\";\n }}\n onMouseLeave={(e) => {\n if (!dragging.current) {\n const parent = e.currentTarget.parentElement;\n if (parent)\n parent.style.backgroundColor = \"var(--vj-border, #333333)\";\n }\n }}\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: -3,\n width: 7,\n cursor: \"col-resize\",\n zIndex: 10,\n }}\n />\n </div>\n )}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n minWidth: 0,\n overflow: \"hidden\",\n }}\n >\n <div style={{ flex: 1, minHeight: 0 }}>\n <FormView\n showDescriptions={editorShowDescriptions}\n showCounts={editorShowCounts}\n />\n </div>\n </div>\n </div>\n );\n}\n","import {\n useState,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\nimport {\n fromJson,\n toJson,\n History,\n searchNodes,\n getAncestorIds,\n type JsonValue,\n type JsonSchema,\n type TreeState,\n type TreeNode,\n type SearchMatch,\n} from \"@visual-json/core\";\nimport { collectAllIds, getVisibleNodes } from \"@internal/ui\";\nimport { StudioContext, type StudioState, type StudioActions } from \"./context\";\nimport { computeRangeIds } from \"./selection-utils\";\n\nexport interface VisualJsonProps {\n value: JsonValue;\n onChange?: (value: JsonValue) => void;\n schema?: JsonSchema | null;\n children: ReactNode;\n}\n\nexport function VisualJson({\n value,\n onChange,\n schema,\n children,\n}: VisualJsonProps) {\n const [tree, setTreeState] = useState<TreeState>(() => fromJson(value));\n const [focusedNodeId, setFocusedNodeId] = useState<string | null>(null);\n const [selectedNodeIds, setSelectedNodeIdsState] = useState<Set<string>>(\n () => new Set<string>(),\n );\n const selectedNodeIdsRef = useRef<Set<string>>(new Set());\n const setSelectedNodeIds = useCallback((ids: Set<string>) => {\n selectedNodeIdsRef.current = ids;\n setSelectedNodeIdsState(ids);\n }, []);\n const anchorNodeIdRef = useRef<string | null>(null);\n const [anchorNodeId, setAnchorNodeIdState] = useState<string | null>(null);\n const [drillDownNodeId, setDrillDownNodeId] = useState<string | null>(null);\n const [expandedNodeIds, setExpandedNodeIds] = useState<Set<string>>(\n () => new Set([tree.root.id]),\n );\n\n const setAnchorNodeId = useCallback((id: string | null) => {\n anchorNodeIdRef.current = id;\n setAnchorNodeIdState(id);\n }, []);\n\n const focusSelectAndDrillDown = useCallback(\n (nodeId: string | null) => {\n setFocusedNodeId(nodeId);\n setSelectedNodeIds(nodeId ? new Set([nodeId]) : new Set<string>());\n setAnchorNodeId(nodeId);\n setDrillDownNodeId(nodeId);\n },\n [setSelectedNodeIds, setAnchorNodeId],\n );\n\n const visibleNodes = useMemo(\n () => getVisibleNodes(tree.root, (id) => expandedNodeIds.has(id)),\n [tree.root, expandedNodeIds],\n );\n\n const visibleNodesOverrideRef = useRef<TreeNode[] | null>(null);\n\n const setVisibleNodesOverride = useCallback((nodes: TreeNode[] | null) => {\n visibleNodesOverrideRef.current = nodes;\n }, []);\n\n const historyRef = useRef<History>(new History());\n const isInternalChange = useRef(false);\n const hasMounted = useRef(false);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n\n const [searchQuery, setSearchQueryState] = useState(\"\");\n const [searchMatches, setSearchMatches] = useState<SearchMatch[]>([]);\n const [searchMatchIndex, setSearchMatchIndex] = useState(0);\n const [searchMatchNodeIds, setSearchMatchNodeIds] = useState<Set<string>>(\n new Set(),\n );\n\n useEffect(() => {\n historyRef.current.push(tree);\n setCanUndo(historyRef.current.canUndo);\n setCanRedo(historyRef.current.canRedo);\n }, []);\n\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n if (isInternalChange.current) {\n isInternalChange.current = false;\n return;\n }\n const newTree = fromJson(value);\n setTreeState(newTree);\n setExpandedNodeIds(new Set([newTree.root.id]));\n focusSelectAndDrillDown(null);\n historyRef.current = new History();\n historyRef.current.push(newTree);\n setCanUndo(false);\n setCanRedo(false);\n setSearchQueryState(\"\");\n setSearchMatches([]);\n setSearchMatchIndex(0);\n setSearchMatchNodeIds(new Set());\n }, [value]);\n\n const setTree = useCallback(\n (newTree: TreeState) => {\n setTreeState(newTree);\n historyRef.current.push(newTree);\n setCanUndo(historyRef.current.canUndo);\n setCanRedo(historyRef.current.canRedo);\n isInternalChange.current = true;\n onChange?.(toJson(newTree.root));\n },\n [onChange],\n );\n\n const undo = useCallback(() => {\n const prev = historyRef.current.undo();\n if (prev) {\n setTreeState(prev);\n setCanUndo(historyRef.current.canUndo);\n setCanRedo(historyRef.current.canRedo);\n isInternalChange.current = true;\n onChange?.(toJson(prev.root));\n }\n }, [onChange]);\n\n const redo = useCallback(() => {\n const next = historyRef.current.redo();\n if (next) {\n setTreeState(next);\n setCanUndo(historyRef.current.canUndo);\n setCanRedo(historyRef.current.canRedo);\n isInternalChange.current = true;\n onChange?.(toJson(next.root));\n }\n }, [onChange]);\n\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n undo();\n } else if (mod && e.key === \"z\" && e.shiftKey) {\n e.preventDefault();\n redo();\n } else if (mod && e.key === \"y\") {\n e.preventDefault();\n redo();\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [undo, redo]);\n\n const selectNode = useCallback(\n (nodeId: string | null) => {\n setFocusedNodeId(nodeId);\n setSelectedNodeIds(nodeId ? new Set([nodeId]) : new Set<string>());\n setAnchorNodeId(nodeId);\n },\n [setSelectedNodeIds, setAnchorNodeId],\n );\n\n const selectAndDrillDown = focusSelectAndDrillDown;\n\n const toggleNodeSelection = useCallback(\n (nodeId: string) => {\n const next = new Set(selectedNodeIdsRef.current);\n if (next.has(nodeId)) {\n next.delete(nodeId);\n } else {\n next.add(nodeId);\n }\n setSelectedNodeIds(next);\n if (next.size === 0) {\n setFocusedNodeId(null);\n setAnchorNodeId(null);\n } else {\n setFocusedNodeId(nodeId);\n setAnchorNodeId(nodeId);\n }\n },\n [setSelectedNodeIds, setAnchorNodeId],\n );\n\n const selectNodeRange = useCallback(\n (toNodeId: string) => {\n const nodes = visibleNodesOverrideRef.current ?? visibleNodes;\n const anchor = anchorNodeIdRef.current;\n if (!anchor) {\n setFocusedNodeId(toNodeId);\n setSelectedNodeIds(new Set([toNodeId]));\n setAnchorNodeId(toNodeId);\n return;\n }\n const rangeIds = computeRangeIds(nodes, anchor, toNodeId);\n if (!rangeIds) {\n setFocusedNodeId(toNodeId);\n setSelectedNodeIds(new Set([toNodeId]));\n setAnchorNodeId(toNodeId);\n return;\n }\n setSelectedNodeIds(rangeIds);\n setFocusedNodeId(toNodeId);\n },\n [visibleNodes, setSelectedNodeIds, setAnchorNodeId],\n );\n\n const setSelection = useCallback(\n (\n focusedId: string | null,\n newSelectedIds: Set<string>,\n newAnchorId: string | null,\n ) => {\n setFocusedNodeId(focusedId);\n setSelectedNodeIds(newSelectedIds);\n setAnchorNodeId(newAnchorId);\n },\n [setSelectedNodeIds, setAnchorNodeId],\n );\n\n const drillDown = useCallback((nodeId: string | null) => {\n setDrillDownNodeId(nodeId);\n }, []);\n\n const toggleExpand = useCallback((nodeId: string) => {\n setExpandedNodeIds((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) next.delete(nodeId);\n else next.add(nodeId);\n return next;\n });\n }, []);\n\n const expandNode = useCallback((nodeId: string) => {\n setExpandedNodeIds((prev) => {\n const next = new Set(prev);\n next.add(nodeId);\n return next;\n });\n }, []);\n\n const collapseNode = useCallback((nodeId: string) => {\n setExpandedNodeIds((prev) => {\n const next = new Set(prev);\n next.delete(nodeId);\n return next;\n });\n }, []);\n\n const expandAll = useCallback(() => {\n const allIds = collectAllIds(tree.root);\n setExpandedNodeIds(new Set(allIds));\n }, [tree]);\n\n const collapseAll = useCallback(() => {\n setExpandedNodeIds(new Set([tree.root.id]));\n }, [tree]);\n\n const setSearchQuery = useCallback(\n (query: string) => {\n setSearchQueryState(query);\n if (!query.trim()) {\n setSearchMatches([]);\n setSearchMatchIndex(0);\n setSearchMatchNodeIds(new Set());\n return;\n }\n const matches = searchNodes(tree, query);\n setSearchMatches(matches);\n setSearchMatchIndex(0);\n const matchIds = new Set(matches.map((m) => m.nodeId));\n setSearchMatchNodeIds(matchIds);\n\n if (matches.length > 0) {\n const firstId = matches[0].nodeId;\n const ancestors = getAncestorIds(\n tree,\n matches.map((m) => m.nodeId),\n );\n setExpandedNodeIds((prev) => {\n const next = new Set(prev);\n for (const id of ancestors) next.add(id);\n return next;\n });\n focusSelectAndDrillDown(firstId);\n }\n },\n [tree],\n );\n\n const nextSearchMatch = useCallback(() => {\n if (searchMatches.length === 0) return;\n const nextIdx = (searchMatchIndex + 1) % searchMatches.length;\n setSearchMatchIndex(nextIdx);\n focusSelectAndDrillDown(searchMatches[nextIdx].nodeId);\n }, [searchMatches, searchMatchIndex, focusSelectAndDrillDown]);\n\n const prevSearchMatch = useCallback(() => {\n if (searchMatches.length === 0) return;\n const prevIdx =\n (searchMatchIndex - 1 + searchMatches.length) % searchMatches.length;\n setSearchMatchIndex(prevIdx);\n focusSelectAndDrillDown(searchMatches[prevIdx].nodeId);\n }, [searchMatches, searchMatchIndex, focusSelectAndDrillDown]);\n\n useEffect(() => {\n if (!searchQuery.trim()) return;\n const matches = searchNodes(tree, searchQuery);\n setSearchMatches(matches);\n setSearchMatchIndex((prev) =>\n Math.min(prev, Math.max(matches.length - 1, 0)),\n );\n setSearchMatchNodeIds(new Set(matches.map((m) => m.nodeId)));\n }, [tree]);\n\n const state: StudioState = useMemo(\n () => ({\n tree,\n focusedNodeId,\n selectedNodeIds,\n anchorNodeId,\n drillDownNodeId,\n expandedNodeIds,\n schema: schema ?? null,\n searchQuery,\n searchMatches,\n searchMatchIndex,\n searchMatchNodeIds,\n }),\n [\n tree,\n focusedNodeId,\n selectedNodeIds,\n anchorNodeId,\n drillDownNodeId,\n expandedNodeIds,\n schema,\n searchQuery,\n searchMatches,\n searchMatchIndex,\n searchMatchNodeIds,\n ],\n );\n\n const actions: StudioActions = useMemo(\n () => ({\n setTree,\n selectNode,\n selectAndDrillDown,\n toggleNodeSelection,\n selectNodeRange,\n setSelection,\n setVisibleNodesOverride,\n drillDown,\n toggleExpand,\n expandNode,\n collapseNode,\n expandAll,\n collapseAll,\n undo,\n redo,\n canUndo,\n canRedo,\n setSearchQuery,\n nextSearchMatch,\n prevSearchMatch,\n }),\n [\n setTree,\n selectNode,\n selectAndDrillDown,\n toggleNodeSelection,\n selectNodeRange,\n setSelection,\n setVisibleNodesOverride,\n drillDown,\n toggleExpand,\n expandNode,\n collapseNode,\n expandAll,\n collapseAll,\n undo,\n redo,\n canUndo,\n canRedo,\n setSearchQuery,\n nextSearchMatch,\n prevSearchMatch,\n ],\n );\n\n const contextValue = useMemo(() => ({ state, actions }), [state, actions]);\n\n return (\n <StudioContext.Provider value={contextValue}>\n {children}\n </StudioContext.Provider>\n );\n}\n","import type { TreeNode, TreeState } from \"@visual-json/core\";\n\nexport function getVisibleNodes(\n root: TreeNode,\n isExpanded: (nodeId: string) => boolean,\n): TreeNode[] {\n const result: TreeNode[] = [];\n\n function walk(node: TreeNode) {\n result.push(node);\n if (\n isExpanded(node.id) &&\n (node.type === \"object\" || node.type === \"array\")\n ) {\n for (const child of node.children) {\n walk(child);\n }\n }\n }\n\n walk(root);\n return result;\n}\n\nconst LABEL_FIELDS = [\"name\", \"type\", \"title\", \"id\", \"label\", \"key\"];\n\n/**\n * For array items that are objects, returns a meaningful label derived from\n * well-known child fields (name, type, title, id, label, key) instead of\n * the numeric index.\n */\nexport function getDisplayKey(node: TreeNode, state: TreeState): string {\n if (node.parentId === null) return \"/\";\n\n const parent = state.nodesById.get(node.parentId);\n if (parent?.type !== \"array\" || node.type !== \"object\") return node.key;\n\n for (const field of LABEL_FIELDS) {\n const child = node.children.find((c) => c.key === field);\n if (child?.value != null && child.value !== \"\") {\n return String(child.value);\n }\n }\n\n return node.key;\n}\n\nexport function collectAllIds(node: TreeNode): string[] {\n const ids: string[] = [node.id];\n for (const child of node.children) {\n ids.push(...collectAllIds(child));\n }\n return ids;\n}\n","import type { TreeNode, TreeState } from \"@visual-json/core\";\nimport {\n reorderChildrenMulti,\n removeNode,\n insertNode,\n isDescendant,\n} from \"@visual-json/core\";\nimport { DEFAULT_CSS_VARS } from \"./theme\";\n\nexport interface DragState {\n draggedNodeIds: ReadonlySet<string>;\n dropTargetNodeId: string | null;\n dropPosition: \"before\" | \"after\" | null;\n}\n\nconst EMPTY_SET: ReadonlySet<string> = Object.freeze(new Set<string>());\n\nexport const INITIAL_DRAG_STATE: () => DragState = () => ({\n draggedNodeIds: EMPTY_SET,\n dropTargetNodeId: null,\n dropPosition: null,\n});\n\nexport function sortByTreeOrder(\n root: TreeNode,\n ids: ReadonlySet<string>,\n): string[] {\n const result: string[] = [];\n function walk(node: TreeNode) {\n if (ids.has(node.id)) result.push(node.id);\n for (const child of node.children) walk(child);\n }\n walk(root);\n return result;\n}\n\n/**\n * Given the current tree and drag state, computes the new tree after a drop.\n * Supports multi-node drag: same-parent reorder uses reorderChildrenMulti,\n * cross-parent moves remove then insert each node.\n * Returns null if the drop is invalid or a no-op.\n */\nexport function computeDrop(\n tree: TreeState,\n drag: DragState,\n): TreeState | null {\n const { draggedNodeIds, dropTargetNodeId, dropPosition } = drag;\n if (draggedNodeIds.size === 0 || !dropTargetNodeId || !dropPosition)\n return null;\n\n const targetNode = tree.nodesById.get(dropTargetNodeId);\n if (!targetNode || !targetNode.parentId) return null;\n\n for (const id of draggedNodeIds) {\n if (isDescendant(tree, dropTargetNodeId, id)) return null;\n }\n\n const targetParentId = targetNode.parentId;\n const targetParent = tree.nodesById.get(targetParentId);\n if (!targetParent) return null;\n\n const parentChildren = targetParent.children;\n const orderedDragIds = parentChildren\n .filter((c) => draggedNodeIds.has(c.id))\n .map((c) => c.id);\n\n const allSameParent =\n orderedDragIds.length === draggedNodeIds.size &&\n [...draggedNodeIds].every((id) => {\n const n = tree.nodesById.get(id);\n return n?.parentId === targetParentId;\n });\n\n if (allSameParent) {\n return reorderChildrenMulti(\n tree,\n targetParentId,\n orderedDragIds,\n dropTargetNodeId,\n dropPosition,\n );\n }\n\n // Cross-parent: remove all dragged nodes then insert at target\n const orderedIds = sortByTreeOrder(tree.root, draggedNodeIds);\n const draggedNodes = orderedIds\n .map((id) => tree.nodesById.get(id))\n .filter((n): n is NonNullable<typeof n> => !!n && n.parentId !== null)\n .map((n) => structuredClone(n));\n\n let newTree = tree;\n for (const id of [...orderedIds].reverse()) {\n if (newTree.nodesById.has(id)) {\n newTree = removeNode(newTree, id);\n }\n }\n\n const updatedTarget = newTree.nodesById.get(dropTargetNodeId);\n if (!updatedTarget || !updatedTarget.parentId) return null;\n\n const updatedParent = newTree.nodesById.get(updatedTarget.parentId);\n if (!updatedParent) return null;\n\n let insertIdx = updatedParent.children.findIndex(\n (c) => c.id === dropTargetNodeId,\n );\n if (dropPosition === \"after\") insertIdx++;\n\n for (let i = 0; i < draggedNodes.length; i++) {\n newTree = insertNode(\n newTree,\n updatedParent.id,\n draggedNodes[i],\n insertIdx + i,\n );\n }\n\n return newTree;\n}\n\n/**\n * Sets a custom drag image showing \"N selected\" for multi-node drag.\n * Framework-agnostic: takes a DataTransfer object directly.\n */\nexport function setMultiDragImage(\n dataTransfer: DataTransfer,\n count: number,\n rootEl?: Element | null,\n) {\n const ghost = document.createElement(\"div\");\n ghost.textContent = `${count} selected`;\n const root =\n rootEl ?? document.querySelector(\"[data-form-container], [role='tree']\");\n const cs = root ? getComputedStyle(root) : null;\n const bg =\n cs?.getPropertyValue(\"--vj-bg-selected\").trim() ||\n DEFAULT_CSS_VARS[\"--vj-bg-selected\"];\n const fg =\n cs?.getPropertyValue(\"--vj-text-selected\").trim() ||\n cs?.getPropertyValue(\"--vj-text\").trim() ||\n DEFAULT_CSS_VARS[\"--vj-text\"];\n const font =\n cs?.getPropertyValue(\"--vj-font\").trim() || DEFAULT_CSS_VARS[\"--vj-font\"];\n ghost.style.cssText = [\n \"position:fixed\",\n \"top:-1000px\",\n \"left:-1000px\",\n \"padding:4px 12px\",\n `background:${bg}`,\n `color:${fg}`,\n `font-family:${font}`,\n \"font-size:13px\",\n \"border-radius:4px\",\n \"white-space:nowrap\",\n \"pointer-events:none\",\n ].join(\";\");\n document.body.appendChild(ghost);\n dataTransfer.setDragImage(ghost, 0, 14);\n requestAnimationFrame(() => ghost.remove());\n}\n","export const DEFAULT_CSS_VARS: Record<string, string> = {\n \"--vj-bg\": \"#1e1e1e\",\n \"--vj-bg-panel\": \"#252526\",\n \"--vj-bg-hover\": \"#2a2d2e\",\n \"--vj-bg-selected\": \"#2a5a1e\",\n \"--vj-bg-selected-muted\": \"#2a2d2e\",\n \"--vj-bg-match\": \"#3a3520\",\n \"--vj-bg-match-active\": \"#51502b\",\n \"--vj-border\": \"#333333\",\n \"--vj-border-subtle\": \"#2a2a2a\",\n \"--vj-text\": \"#cccccc\",\n \"--vj-text-muted\": \"#888888\",\n \"--vj-text-dim\": \"#666666\",\n \"--vj-text-dimmer\": \"#555555\",\n \"--vj-string\": \"#ce9178\",\n \"--vj-number\": \"#b5cea8\",\n \"--vj-boolean\": \"#569cd6\",\n \"--vj-accent\": \"#007acc\",\n \"--vj-accent-muted\": \"#094771\",\n \"--vj-input-bg\": \"#3c3c3c\",\n \"--vj-input-border\": \"#555555\",\n \"--vj-error\": \"#f48771\",\n \"--vj-font\": \"monospace\",\n \"--vj-input-font-size\": \"13px\",\n};\n","import type { DiffType } from \"@visual-json/core\";\n\nexport const DIFF_COLORS: Record<\n DiffType,\n { bg: string; marker: string; label: string }\n> = {\n added: { bg: \"#1e3a1e\", marker: \"+\", label: \"#4ec94e\" },\n removed: { bg: \"#3a1e1e\", marker: \"-\", label: \"#f48771\" },\n changed: { bg: \"#3a3a1e\", marker: \"~\", label: \"#dcdcaa\" },\n};\n\nexport function formatValue(value: unknown): string {\n if (value === undefined) return \"\";\n if (value === null) return \"null\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"object\") {\n const json = JSON.stringify(value, null, 2);\n if (json.length > 80) {\n return JSON.stringify(value).slice(0, 77) + \"...\";\n }\n return json;\n }\n return String(value);\n}\n","import {\n getPropertySchema,\n resolveRef,\n type TreeNode,\n type JsonSchema,\n type JsonSchemaProperty,\n} from \"@visual-json/core\";\n\nexport function getResolvedSchema(\n schema: JsonSchema | null,\n rootSchema: JsonSchemaProperty | undefined,\n path: string,\n): JsonSchemaProperty | undefined {\n if (!schema) return undefined;\n const raw = getPropertySchema(schema, path, rootSchema);\n if (!raw) return undefined;\n return resolveRef(raw, rootSchema ?? schema);\n}\n\nexport function getValueColor(node: TreeNode): string {\n if (node.type === \"boolean\" || node.type === \"null\")\n return \"var(--vj-boolean, #569cd6)\";\n if (node.type === \"number\") return \"var(--vj-number, #b5cea8)\";\n return \"var(--vj-string, #ce9178)\";\n}\n\nexport function getDisplayValue(node: TreeNode): string {\n if (node.type === \"null\") return \"null\";\n if (node.type === \"boolean\") return String(node.value);\n if (node.value === null || node.value === undefined) return \"\";\n return String(node.value);\n}\n\nexport function checkRequired(\n node: TreeNode,\n schema: JsonSchema | null,\n rootSchema: JsonSchemaProperty | undefined,\n): boolean {\n if (!schema || !node.parentId) return false;\n const parentPath = node.path.split(\"/\").slice(0, -1).join(\"/\") || \"/\";\n const parentSchema = getResolvedSchema(schema, rootSchema, parentPath);\n return parentSchema?.required?.includes(node.key) ?? false;\n}\n\nexport function parseInputValue(\n value: string,\n schemaType: string | string[] | undefined,\n nodeType: string,\n): string | number | boolean | null {\n // Normalize array type to first element for matching\n const primaryType = Array.isArray(schemaType) ? schemaType[0] : schemaType;\n if (primaryType === \"boolean\" || value === \"true\" || value === \"false\") {\n return value === \"true\";\n }\n if (value === \"null\") {\n return null;\n }\n if (\n primaryType === \"number\" ||\n primaryType === \"integer\" ||\n nodeType === \"number\"\n ) {\n const num = Number(value);\n return isNaN(num) ? value : num;\n }\n return value;\n}\n","import { createContext, useContext } from \"react\";\nimport type {\n TreeState,\n TreeNode,\n JsonSchema,\n SearchMatch,\n} from \"@visual-json/core\";\n\nexport interface StudioState {\n tree: TreeState;\n focusedNodeId: string | null;\n selectedNodeIds: Set<string>;\n anchorNodeId: string | null;\n drillDownNodeId: string | null;\n expandedNodeIds: Set<string>;\n schema: JsonSchema | null;\n searchQuery: string;\n searchMatches: SearchMatch[];\n searchMatchIndex: number;\n searchMatchNodeIds: Set<string>;\n}\n\nexport interface StudioActions {\n setTree: (tree: TreeState) => void;\n selectNode: (nodeId: string | null) => void;\n selectAndDrillDown: (nodeId: string | null) => void;\n toggleNodeSelection: (nodeId: string) => void;\n selectNodeRange: (toNodeId: string) => void;\n setSelection: (\n focusedId: string | null,\n selectedIds: Set<string>,\n anchorId: string | null,\n ) => void;\n setVisibleNodesOverride: (nodes: TreeNode[] | null) => void;\n drillDown: (nodeId: string | null) => void;\n toggleExpand: (nodeId: string) => void;\n expandNode: (nodeId: string) => void;\n collapseNode: (nodeId: string) => void;\n expandAll: () => void;\n collapseAll: () => void;\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n setSearchQuery: (query: string) => void;\n nextSearchMatch: () => void;\n prevSearchMatch: () => void;\n}\n\nexport interface StudioContextValue {\n state: StudioState;\n actions: StudioActions;\n}\n\nexport const StudioContext = createContext<StudioContextValue | null>(null);\n\nexport function useStudio(): StudioContextValue {\n const ctx = useContext(StudioContext);\n if (!ctx) {\n throw new Error(\"useStudio must be used within a <VisualJson> provider\");\n }\n return ctx;\n}\n","import { removeNode, type TreeNode, type TreeState } from \"@visual-json/core\";\n\nexport function computeSelectAllIds(\n tree: TreeState,\n focusedNodeId: string | null,\n currentlySelected: Set<string>,\n): Set<string> | null {\n if (!focusedNodeId) return null;\n let node: TreeNode | undefined = tree.nodesById.get(focusedNodeId);\n if (!node) return null;\n\n while (node) {\n const parent: TreeNode | undefined = node.parentId\n ? tree.nodesById.get(node.parentId)\n : undefined;\n const siblings = parent ? parent.children : [tree.root];\n const siblingIds = new Set<string>(siblings.map((s) => s.id));\n const allSelected = siblings.every((s) => currentlySelected.has(s.id));\n if (!allSelected) {\n return siblingIds;\n }\n if (!parent || !parent.parentId) return siblingIds;\n node = parent;\n }\n return null;\n}\n\nexport function computeRangeIds(\n visibleNodes: TreeNode[],\n anchorId: string,\n targetId: string,\n): Set<string> | null {\n const anchorIdx = visibleNodes.findIndex((n) => n.id === anchorId);\n const targetIdx = visibleNodes.findIndex((n) => n.id === targetId);\n if (anchorIdx === -1 || targetIdx === -1) return null;\n const start = Math.min(anchorIdx, targetIdx);\n const end = Math.max(anchorIdx, targetIdx);\n const ids = new Set<string>();\n for (let i = start; i <= end; i++) {\n ids.add(visibleNodes[i].id);\n }\n return ids;\n}\n\nexport function deleteSelectedNodes(\n tree: TreeState,\n selectedIds: Set<string>,\n visibleNodes: TreeNode[],\n): { newTree: TreeState; nextFocusId: string | null } {\n const idsToDelete = [...selectedIds].filter((id) => {\n const node = tree.nodesById.get(id);\n if (!node || node.parentId === null) return false;\n let cur = tree.nodesById.get(node.parentId);\n while (cur) {\n if (selectedIds.has(cur.id)) return false;\n cur = cur.parentId ? tree.nodesById.get(cur.parentId) : undefined;\n }\n return true;\n });\n\n if (idsToDelete.length === 0) return { newTree: tree, nextFocusId: null };\n\n const firstDeletedIdx = visibleNodes.findIndex((n) => selectedIds.has(n.id));\n\n let newTree = tree;\n for (const id of idsToDelete) {\n if (newTree.nodesById.has(id)) {\n newTree = removeNode(newTree, id);\n }\n }\n\n let nextFocusId: string | null = null;\n for (let i = firstDeletedIdx; i < visibleNodes.length; i++) {\n const id = visibleNodes[i].id;\n if (!selectedIds.has(id) && newTree.nodesById.has(id)) {\n nextFocusId = id;\n break;\n }\n }\n if (!nextFocusId) {\n for (let i = firstDeletedIdx - 1; i >= 0; i--) {\n const id = visibleNodes[i].id;\n if (!selectedIds.has(id) && newTree.nodesById.has(id)) {\n nextFocusId = id;\n break;\n }\n }\n }\n\n return { newTree, nextFocusId };\n}\n","import { useState, useMemo, useRef, useCallback, useEffect } from \"react\";\nimport type { TreeNode, NodeType } from \"@visual-json/core\";\nimport {\n removeNode,\n duplicateNode,\n changeType,\n toJson,\n} from \"@visual-json/core\";\nimport { useStudio } from \"./context\";\nimport { ContextMenu, type ContextMenuEntry } from \"./context-menu\";\nimport { getDisplayKey, getVisibleNodes } from \"@internal/ui\";\nimport { deleteSelectedNodes, computeSelectAllIds } from \"./selection-utils\";\nimport {\n useDragDrop,\n setMultiDragImage,\n type DragState,\n} from \"./use-drag-drop\";\n\ninterface TreeNodeRowProps {\n node: TreeNode;\n depth: number;\n dragState: DragState;\n showValues: boolean;\n showCounts: boolean;\n isFocused: boolean;\n onSelectRange: (nodeId: string) => void;\n onDragStart: (nodeId: string) => void;\n onDragOver: (nodeId: string, position: \"before\" | \"after\") => void;\n onDragEnd: () => void;\n onDrop: () => void;\n onContextMenu: (e: React.MouseEvent, node: TreeNode) => void;\n}\n\nfunction TreeNodeRow({\n node,\n depth,\n dragState,\n showValues,\n showCounts,\n isFocused,\n onSelectRange,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n onContextMenu,\n}: TreeNodeRowProps) {\n const { state, actions } = useStudio();\n const isSelected = state.selectedNodeIds.has(node.id);\n const isExpanded = state.expandedNodeIds.has(node.id);\n const isContainer = node.type === \"object\" || node.type === \"array\";\n const [hovered, setHovered] = useState(false);\n const isRoot = node.parentId === null;\n const isSearchMatch = state.searchMatchNodeIds.has(node.id);\n const isActiveMatch =\n state.searchMatches.length > 0 &&\n state.searchMatches[state.searchMatchIndex]?.nodeId === node.id;\n\n const isDragTarget = dragState.dropTargetNodeId === node.id;\n const isDraggedNode = dragState.draggedNodeIds.has(node.id);\n\n function displayValue(): string {\n if (isContainer) {\n return node.type === \"array\"\n ? `[${node.children.length}]`\n : `{${node.children.length}}`;\n }\n if (node.value === null) return \"null\";\n if (typeof node.value === \"string\") return node.value;\n return String(node.value);\n }\n\n function handleDragOverEvent(e: React.DragEvent) {\n e.preventDefault();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const midY = rect.top + rect.height / 2;\n const position = e.clientY < midY ? \"before\" : \"after\";\n onDragOver(node.id, position);\n }\n\n let borderTopColor = \"transparent\";\n let borderBottomColor = \"transparent\";\n if (isDragTarget && dragState.dropPosition === \"before\") {\n borderTopColor = \"var(--vj-accent, #007acc)\";\n } else if (isDragTarget && dragState.dropPosition === \"after\") {\n borderBottomColor = \"var(--vj-accent, #007acc)\";\n }\n\n return (\n <>\n <div\n role=\"treeitem\"\n aria-selected={isSelected}\n aria-expanded={isContainer ? isExpanded : undefined}\n onClick={(e) => {\n if (e.shiftKey) {\n onSelectRange(node.id);\n } else if (e.metaKey || e.ctrlKey) {\n actions.toggleNodeSelection(node.id);\n } else {\n actions.selectAndDrillDown(node.id);\n }\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onContextMenu={(e) => onContextMenu(e, node)}\n draggable={!isRoot}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n if (\n state.selectedNodeIds.size > 1 &&\n state.selectedNodeIds.has(node.id)\n ) {\n setMultiDragImage(e, state.selectedNodeIds.size);\n }\n onDragStart(node.id);\n }}\n onDragOver={handleDragOverEvent}\n onDragEnd={onDragEnd}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n data-node-id={node.id}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"1px 8px\",\n paddingLeft: 8 + depth * 16,\n cursor: \"pointer\",\n backgroundColor: isSelected\n ? isFocused\n ? \"var(--vj-bg-selected, #2a5a1e)\"\n : \"var(--vj-bg-selected-muted, var(--vj-bg-hover, #2a2d2e))\"\n : isActiveMatch\n ? \"var(--vj-bg-match-active, #51502b)\"\n : isSearchMatch\n ? \"var(--vj-bg-match, #3a3520)\"\n : hovered\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\",\n minHeight: 28,\n userSelect: \"none\",\n opacity: isDraggedNode ? 0.4 : 1,\n borderTop: `2px solid ${borderTopColor}`,\n borderBottom: `2px solid ${borderBottomColor}`,\n boxSizing: \"border-box\",\n color:\n isSelected && isFocused\n ? \"var(--vj-text-selected, var(--vj-text, #cccccc))\"\n : \"var(--vj-text, #cccccc)\",\n }}\n >\n {isContainer ? (\n <button\n onClick={(e) => {\n e.stopPropagation();\n actions.toggleExpand(node.id);\n }}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 0,\n width: 16,\n fontSize: 9,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"transform 0.15s\",\n transform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n }}\n >\n ▶\n </button>\n ) : (\n <span style={{ width: 16, flexShrink: 0 }} />\n )}\n <span\n style={{\n color: \"inherit\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n flexShrink: 0,\n fontWeight: isRoot ? 600 : 400,\n }}\n >\n {isRoot ? \"/\" : getDisplayKey(node, state.tree)}\n </span>\n {!isRoot && isContainer && showCounts && (\n <span\n style={{\n color: isSelected ? \"inherit\" : \"var(--vj-text-muted, #888888)\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n whiteSpace: \"nowrap\",\n marginLeft: \"auto\",\n }}\n >\n {displayValue()}\n </span>\n )}\n {!isRoot && !isContainer && showValues && (\n <span\n style={{\n color:\n node.type === \"string\"\n ? \"var(--vj-string, #ce9178)\"\n : \"var(--vj-number, #b5cea8)\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n marginLeft: \"auto\",\n }}\n >\n {displayValue()}\n </span>\n )}\n </div>\n {isExpanded &&\n node.children.map((child) => (\n <TreeNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n dragState={dragState}\n showValues={showValues}\n showCounts={showCounts}\n isFocused={isFocused}\n onSelectRange={onSelectRange}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n onDrop={onDrop}\n onContextMenu={onContextMenu}\n />\n ))}\n </>\n );\n}\n\nexport interface TreeViewProps {\n className?: string;\n showValues?: boolean;\n showCounts?: boolean;\n}\n\nexport function TreeView({\n className,\n showValues = true,\n showCounts = false,\n}: TreeViewProps) {\n const { state, actions } = useStudio();\n const containerRef = useRef<HTMLDivElement>(null);\n\n const visibleNodes = useMemo(\n () =>\n getVisibleNodes(state.tree.root, (id) => state.expandedNodeIds.has(id)),\n [state.tree.root, state.expandedNodeIds],\n );\n\n const {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n } = useDragDrop(visibleNodes, state.selectedNodeIds);\n\n const handleSelectRange = useCallback(\n (nodeId: string) => {\n actions.setVisibleNodesOverride(visibleNodes);\n actions.selectNodeRange(nodeId);\n },\n [visibleNodes, actions],\n );\n\n const [contextMenu, setContextMenu] = useState<{\n x: number;\n y: number;\n node: TreeNode;\n } | null>(null);\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent, node: TreeNode) => {\n e.preventDefault();\n if (!state.selectedNodeIds.has(node.id)) {\n actions.selectAndDrillDown(node.id);\n }\n setContextMenu({ x: e.clientX, y: e.clientY, node });\n },\n [actions, state.selectedNodeIds],\n );\n\n const buildContextMenuItems = useCallback(\n (node: TreeNode): ContextMenuEntry[] => {\n const items: ContextMenuEntry[] = [];\n const isContainer = node.type === \"object\" || node.type === \"array\";\n\n if (isContainer) {\n items.push({\n label: \"Expand all children\",\n action: () => {\n function collectIds(n: TreeNode): string[] {\n const ids: string[] = [n.id];\n for (const c of n.children) ids.push(...collectIds(c));\n return ids;\n }\n const allIds = collectIds(node);\n for (const id of allIds) actions.expandNode(id);\n },\n });\n items.push({\n label: \"Collapse all children\",\n action: () => {\n function collectIds(n: TreeNode): string[] {\n const ids: string[] = [];\n for (const c of n.children) {\n ids.push(c.id);\n ids.push(...collectIds(c));\n }\n return ids;\n }\n const childIds = collectIds(node);\n for (const id of childIds) actions.collapseNode(id);\n },\n });\n items.push({ separator: true });\n }\n\n items.push({\n label: \"Copy path\",\n action: () => navigator.clipboard.writeText(node.path).catch(() => {}),\n });\n items.push({\n label: \"Copy value as JSON\",\n action: () => {\n const val = toJson(node);\n const text =\n typeof val === \"string\" ? val : JSON.stringify(val, null, 2);\n navigator.clipboard.writeText(text).catch(() => {});\n },\n });\n\n if (node.parentId) {\n items.push({ separator: true });\n items.push({\n label: \"Duplicate\",\n action: () => {\n const newTree = duplicateNode(state.tree, node.id);\n actions.setTree(newTree);\n },\n });\n\n const typeSubmenu: ContextMenuEntry[] = (\n [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"object\",\n \"array\",\n ] as NodeType[]\n )\n .filter((t) => t !== node.type)\n .map((t) => ({\n label: `Change to ${t}`,\n action: () => {\n const newTree = changeType(state.tree, node.id, t);\n actions.setTree(newTree);\n },\n }));\n items.push({ separator: true });\n items.push(...typeSubmenu);\n\n items.push({ separator: true });\n items.push({\n label: \"Delete\",\n action: () => {\n const newTree = removeNode(state.tree, node.id);\n actions.setTree(newTree);\n },\n });\n }\n\n return items;\n },\n [state.tree, actions],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const currentIndex = visibleNodes.findIndex(\n (n) => n.id === state.focusedNodeId,\n );\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const next = visibleNodes[currentIndex + 1];\n if (next) {\n if (e.shiftKey) {\n handleSelectRange(next.id);\n } else {\n actions.selectNode(next.id);\n }\n }\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prev = visibleNodes[currentIndex - 1];\n if (prev) {\n if (e.shiftKey) {\n handleSelectRange(prev.id);\n } else {\n actions.selectNode(prev.id);\n }\n }\n break;\n }\n case \"ArrowRight\": {\n e.preventDefault();\n const node = currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (node && (node.type === \"object\" || node.type === \"array\")) {\n if (!state.expandedNodeIds.has(node.id)) {\n actions.expandNode(node.id);\n } else if (node.children.length > 0) {\n actions.selectNode(node.children[0].id);\n }\n }\n break;\n }\n case \"ArrowLeft\": {\n e.preventDefault();\n const current = currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (!current) break;\n const isContainer =\n current.type === \"object\" || current.type === \"array\";\n if (isContainer && state.expandedNodeIds.has(current.id)) {\n actions.collapseNode(current.id);\n } else if (current.parentId) {\n actions.selectNode(current.parentId);\n }\n break;\n }\n case \"a\": {\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n const ids = computeSelectAllIds(\n state.tree,\n state.focusedNodeId,\n state.selectedNodeIds,\n );\n if (ids) {\n actions.setSelection(\n state.focusedNodeId,\n ids,\n state.focusedNodeId,\n );\n }\n }\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n if (state.selectedNodeIds.size > 1 && state.focusedNodeId) {\n actions.selectNode(state.focusedNodeId);\n } else {\n actions.setSelection(null, new Set<string>(), null);\n }\n break;\n }\n case \"Delete\":\n case \"Backspace\": {\n e.preventDefault();\n const { newTree, nextFocusId } = deleteSelectedNodes(\n state.tree,\n state.selectedNodeIds,\n visibleNodes,\n );\n if (newTree === state.tree) break;\n actions.setTree(newTree);\n if (nextFocusId) {\n actions.selectNode(nextFocusId);\n } else {\n actions.setSelection(null, new Set<string>(), null);\n }\n break;\n }\n }\n },\n [\n visibleNodes,\n state.focusedNodeId,\n state.selectedNodeIds,\n state.expandedNodeIds,\n state.tree,\n actions,\n handleSelectRange,\n ],\n );\n\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (state.focusedNodeId && containerRef.current) {\n const el = containerRef.current.querySelector(\n `[data-node-id=\"${state.focusedNodeId}\"]`,\n );\n if (el) {\n el.scrollIntoView({ block: \"nearest\" });\n }\n }\n }, [state.focusedNodeId]);\n\n return (\n <>\n <div\n ref={containerRef}\n className={className}\n role=\"tree\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n style={{\n overflow: \"auto\",\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n color: \"var(--vj-text, #cccccc)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 13,\n outline: \"none\",\n flex: 1,\n }}\n >\n <TreeNodeRow\n node={state.tree.root}\n depth={0}\n dragState={dragState}\n showValues={showValues}\n showCounts={showCounts}\n isFocused={isFocused}\n onSelectRange={handleSelectRange}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDrop={handleDrop}\n onContextMenu={handleContextMenu}\n />\n </div>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n items={buildContextMenuItems(contextMenu.node)}\n onClose={() => setContextMenu(null)}\n />\n )}\n </>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface ContextMenuItem {\n label: string;\n action: () => void;\n disabled?: boolean;\n separator?: false;\n}\n\nexport interface ContextMenuSeparator {\n separator: true;\n}\n\nexport type ContextMenuEntry = ContextMenuItem | ContextMenuSeparator;\n\nexport interface ContextMenuProps {\n x: number;\n y: number;\n items: ContextMenuEntry[];\n onClose: () => void;\n}\n\nexport function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ left: x, top: y });\n\n useEffect(() => {\n if (!ref.current) return;\n const rect = ref.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n setPos({\n left: rect.right > vw ? Math.max(0, x - rect.width) : x,\n top: rect.bottom > vh ? Math.max(0, y - rect.height) : y,\n });\n }, [x, y]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose();\n }\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose]);\n\n return (\n <div\n ref={ref}\n style={{\n position: \"fixed\",\n left: pos.left,\n top: pos.top,\n zIndex: 10000,\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n border: \"1px solid var(--vj-border, #454545)\",\n borderRadius: 4,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.5)\",\n padding: \"4px 0\",\n minWidth: 160,\n }}\n >\n {items.map((item, i) =>\n item.separator ? (\n <div\n key={i}\n style={{\n height: 1,\n backgroundColor: \"var(--vj-border, #454545)\",\n margin: \"4px 0\",\n }}\n />\n ) : (\n <button\n key={i}\n onClick={() => {\n if (!item.disabled) {\n item.action();\n onClose();\n }\n }}\n disabled={item.disabled}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n background: \"none\",\n border: \"none\",\n color: item.disabled\n ? \"var(--vj-text-dimmer, #555555)\"\n : \"var(--vj-text, #cccccc)\",\n cursor: item.disabled ? \"default\" : \"pointer\",\n padding: \"4px 16px\",\n fontSize: 12,\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n onMouseEnter={(e) => {\n if (!item.disabled)\n (e.target as HTMLElement).style.backgroundColor =\n \"var(--vj-accent-muted, #094771)\";\n }}\n onMouseLeave={(e) => {\n (e.target as HTMLElement).style.backgroundColor = \"transparent\";\n }}\n >\n {item.label}\n </button>\n ),\n )}\n </div>\n );\n}\n","import type React from \"react\";\nimport { useState, useCallback, useRef, useMemo } from \"react\";\nimport { isDescendant, type TreeNode } from \"@visual-json/core\";\nimport {\n computeDrop,\n setMultiDragImage as setMultiDragImageShared,\n type DragState,\n} from \"@internal/ui\";\nimport { useStudio } from \"./context\";\n\nexport type { DragState } from \"@internal/ui\";\n\nconst EMPTY_SET: ReadonlySet<string> = Object.freeze(new Set<string>());\n\nconst INITIAL_DRAG_STATE: DragState = {\n draggedNodeIds: EMPTY_SET,\n dropTargetNodeId: null,\n dropPosition: null,\n};\n\nexport function setMultiDragImage(e: React.DragEvent, count: number) {\n setMultiDragImageShared(e.dataTransfer, count);\n}\n\nexport function useDragDrop(\n visibleNodes: TreeNode[],\n selectedNodeIds: ReadonlySet<string>,\n) {\n const { state, actions } = useStudio();\n const [dragState, setDragState] = useState<DragState>(INITIAL_DRAG_STATE);\n const dragStateRef = useRef<DragState>(dragState);\n dragStateRef.current = dragState;\n\n const visibleNodeIndexMap = useMemo(() => {\n const map = new Map<string, number>();\n visibleNodes.forEach((n, i) => map.set(n.id, i));\n return map;\n }, [visibleNodes]);\n\n const handleDragStart = useCallback(\n (nodeId: string) => {\n let ids: ReadonlySet<string>;\n if (selectedNodeIds.size > 0 && selectedNodeIds.has(nodeId)) {\n ids = selectedNodeIds;\n } else {\n ids = new Set([nodeId]);\n }\n setDragState({\n draggedNodeIds: ids,\n dropTargetNodeId: null,\n dropPosition: null,\n });\n },\n [selectedNodeIds],\n );\n\n const rawDragOver = useCallback(\n (nodeId: string, position: \"before\" | \"after\") => {\n const draggedIds = dragStateRef.current.draggedNodeIds;\n for (const draggedId of draggedIds) {\n if (\n nodeId === draggedId ||\n isDescendant(state.tree, nodeId, draggedId)\n ) {\n return;\n }\n }\n\n setDragState((prev) => ({\n ...prev,\n dropTargetNodeId: nodeId,\n dropPosition: position,\n }));\n },\n [state.tree],\n );\n\n const handleDragOver = useCallback(\n (nodeId: string, position: \"before\" | \"after\") => {\n if (position === \"before\") {\n const idx = visibleNodeIndexMap.get(nodeId);\n if (idx !== undefined && idx > 0) {\n rawDragOver(visibleNodes[idx - 1].id, \"after\");\n return;\n }\n }\n rawDragOver(nodeId, position);\n },\n [visibleNodes, visibleNodeIndexMap, rawDragOver],\n );\n\n const handleDragEnd = useCallback(() => {\n setDragState(INITIAL_DRAG_STATE);\n }, []);\n\n const handleDrop = useCallback(() => {\n const currentDragState = dragStateRef.current;\n const newTree = computeDrop(state.tree, currentDragState);\n if (newTree) {\n actions.setTree(newTree);\n }\n setDragState(INITIAL_DRAG_STATE);\n }, [state.tree, actions]);\n\n return {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n };\n}\n","import { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport {\n setValue,\n setKey,\n addProperty,\n removeNode,\n getPropertySchema,\n resolveRef,\n type TreeNode,\n type JsonSchemaProperty,\n type JsonSchema,\n} from \"@visual-json/core\";\nimport { useStudio } from \"./context\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\nimport { EnumInput } from \"./enum-input\";\nimport { getDisplayKey, getVisibleNodes } from \"@internal/ui\";\nimport { deleteSelectedNodes, computeSelectAllIds } from \"./selection-utils\";\nimport {\n useDragDrop,\n setMultiDragImage,\n type DragState,\n} from \"./use-drag-drop\";\n\ninterface FormFieldProps {\n node: TreeNode;\n schema: JsonSchema | null;\n rootSchema: JsonSchemaProperty | undefined;\n depth: number;\n showDescriptions: boolean;\n showCounts: boolean;\n editingNodeId: string | null;\n collapsedIds: Set<string>;\n maxKeyLength: number;\n maxDepth: number;\n isFocused: boolean;\n dragState: DragState;\n onSelect: (nodeId: string, e: React.MouseEvent) => void;\n onToggleCollapse: (nodeId: string) => void;\n onStartEditing: (nodeId: string) => void;\n onDragStart: (nodeId: string) => void;\n onDragOver: (nodeId: string, position: \"before\" | \"after\") => void;\n onDragEnd: () => void;\n onDrop: () => void;\n}\n\nfunction getResolvedSchema(\n schema: JsonSchema | null,\n rootSchema: JsonSchemaProperty | undefined,\n path: string,\n): JsonSchemaProperty | undefined {\n if (!schema) return undefined;\n const raw = getPropertySchema(schema, path, rootSchema);\n if (!raw) return undefined;\n return resolveRef(raw, rootSchema ?? schema);\n}\n\nfunction getValueColor(node: TreeNode): string {\n if (node.type === \"boolean\" || node.type === \"null\")\n return \"var(--vj-boolean, #569cd6)\";\n if (node.type === \"number\") return \"var(--vj-number, #b5cea8)\";\n return \"var(--vj-string, #ce9178)\";\n}\n\nfunction getDisplayValue(node: TreeNode): string {\n if (node.type === \"null\") return \"null\";\n if (node.type === \"boolean\") return String(node.value);\n if (node.value === null || node.value === undefined) return \"\";\n return String(node.value);\n}\n\nfunction FormField({\n node,\n schema,\n rootSchema,\n depth,\n showDescriptions,\n showCounts,\n editingNodeId,\n collapsedIds,\n maxKeyLength,\n maxDepth,\n isFocused,\n dragState,\n onSelect,\n onToggleCollapse,\n onStartEditing,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n}: FormFieldProps) {\n const { state, actions } = useStudio();\n const isContainer = node.type === \"object\" || node.type === \"array\";\n const collapsed = collapsedIds.has(node.id);\n const isSelected = state.selectedNodeIds.has(node.id);\n const isEditing = editingNodeId === node.id;\n const propSchema = getResolvedSchema(schema, rootSchema, node.path);\n const isRequired = checkRequired(node, schema, rootSchema);\n const [hovered, setHovered] = useState(false);\n\n const isRoot = node.parentId === null;\n const isDragTarget = dragState.dropTargetNodeId === node.id;\n const isDraggedNode = dragState.draggedNodeIds.has(node.id);\n\n function handleDragOverEvent(e: React.DragEvent) {\n e.preventDefault();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const midY = rect.top + rect.height / 2;\n onDragOver(node.id, e.clientY < midY ? \"before\" : \"after\");\n }\n\n let borderTopColor = \"transparent\";\n let borderBottomColor = \"transparent\";\n if (isDragTarget && dragState.dropPosition === \"before\") {\n borderTopColor = \"var(--vj-accent, #007acc)\";\n } else if (isDragTarget && dragState.dropPosition === \"after\") {\n borderBottomColor = \"var(--vj-accent, #007acc)\";\n }\n\n const valueRef = useRef<HTMLInputElement | HTMLSelectElement>(null);\n const keyRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!isEditing) return;\n if (!isContainer) {\n const hasValue =\n node.value !== null && node.value !== undefined && node.value !== \"\";\n if (hasValue && valueRef.current) {\n valueRef.current.focus();\n } else if (keyRef.current) {\n keyRef.current.focus();\n }\n } else if (keyRef.current) {\n keyRef.current.focus();\n }\n }, [isEditing, isContainer, node.value]);\n\n const handleValueChange = useCallback(\n (newValue: string) => {\n let parsed: string | number | boolean | null;\n if (\n propSchema?.type === \"boolean\" ||\n newValue === \"true\" ||\n newValue === \"false\"\n ) {\n parsed = newValue === \"true\";\n } else if (newValue === \"null\") {\n parsed = null;\n } else if (\n propSchema?.type === \"number\" ||\n propSchema?.type === \"integer\" ||\n node.type === \"number\"\n ) {\n const num = Number(newValue);\n parsed = isNaN(num) ? newValue : num;\n } else {\n parsed = newValue;\n }\n const newTree = setValue(state.tree, node.id, parsed);\n actions.setTree(newTree);\n },\n [state.tree, node.id, node.type, actions, propSchema],\n );\n\n const handleKeyChange = useCallback(\n (newKey: string) => {\n const newTree = setKey(state.tree, node.id, newKey);\n actions.setTree(newTree);\n },\n [state.tree, node.id, actions],\n );\n\n const handleRemove = useCallback(() => {\n const newTree = removeNode(state.tree, node.id);\n actions.setTree(newTree);\n }, [state.tree, node.id, actions]);\n\n const handleAddChild = useCallback(() => {\n const key =\n node.type === \"array\"\n ? String(node.children.length)\n : `newKey${node.children.length}`;\n const newTree = addProperty(state.tree, node.id, key, \"\");\n actions.setTree(newTree);\n }, [state.tree, node.id, node.type, node.children.length, actions]);\n\n const description = propSchema?.description;\n const isDeprecated = propSchema?.deprecated;\n const fieldTitle = propSchema?.title;\n const parentIsObject =\n node.parentId && state.tree.nodesById.get(node.parentId)?.type === \"object\";\n\n const rowBg = isSelected\n ? isFocused\n ? \"var(--vj-bg-selected, #2a5a1e)\"\n : \"var(--vj-bg-selected-muted, var(--vj-bg-hover, #2a2d2e))\"\n : hovered\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\";\n\n const rowColor =\n isSelected && isFocused\n ? \"var(--vj-text-selected, var(--vj-text, #cccccc))\"\n : \"var(--vj-text, #cccccc)\";\n\n if (isContainer) {\n return (\n <div>\n <div\n data-form-node-id={node.id}\n draggable={!isRoot}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n if (\n state.selectedNodeIds.size > 1 &&\n state.selectedNodeIds.has(node.id)\n ) {\n setMultiDragImage(e, state.selectedNodeIds.size);\n }\n onDragStart(node.id);\n }}\n onDragOver={handleDragOverEvent}\n onDragEnd={onDragEnd}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"1px 8px\",\n paddingLeft: 8 + depth * 16,\n cursor: \"pointer\",\n backgroundColor: rowBg,\n color: rowColor,\n height: 28,\n boxSizing: \"border-box\",\n userSelect: \"none\",\n opacity: isDeprecated ? 0.5 : isDraggedNode ? 0.4 : 1,\n borderTop: `2px solid ${borderTopColor}`,\n borderBottom: `2px solid ${borderBottomColor}`,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelect(node.id, e);\n }}\n onDoubleClick={() => onToggleCollapse(node.id)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleCollapse(node.id);\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 0,\n width: 16,\n fontSize: 9,\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"transform 0.15s\",\n transform: collapsed ? \"rotate(0deg)\" : \"rotate(90deg)\",\n }}\n >\n ▶\n </button>\n {isEditing && !isRoot ? (\n <input\n ref={keyRef}\n value={node.key}\n onChange={(e) => handleKeyChange(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontWeight: 500,\n padding: 0,\n outline: \"none\",\n flexShrink: 0,\n width: `calc(${(maxDepth - depth) * 16}px + ${maxKeyLength}ch)`,\n }}\n />\n ) : (\n <span\n style={{\n color:\n !isRoot && !parentIsObject && !isSelected\n ? \"var(--vj-text-muted, #888888)\"\n : \"inherit\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontWeight: 500,\n flexShrink: 0,\n display: \"inline-block\",\n width: `calc(${(maxDepth - depth) * 16}px + ${maxKeyLength}ch)`,\n }}\n >\n {isRoot ? \"/\" : getDisplayKey(node, state.tree)}\n </span>\n )}\n {showDescriptions && fieldTitle && !isSelected && (\n <span\n style={{\n color: \"var(--vj-text-muted, #888888)\",\n fontSize: 11,\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n >\n {fieldTitle}\n </span>\n )}\n {hovered && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleAddChild();\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: isSelected ? \"inherit\" : \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: 0,\n fontSize: 12,\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n >\n + Add {node.type === \"array\" ? \"item\" : \"property\"}\n </button>\n )}\n {showCounts && (\n <span\n style={{\n color: isSelected ? \"inherit\" : \"var(--vj-text-dim, #666666)\",\n fontSize: 12,\n fontFamily: \"var(--vj-font, monospace)\",\n marginLeft: \"auto\",\n }}\n >\n {node.type === \"array\"\n ? `${node.children.length} items`\n : `${node.children.length} properties`}\n </span>\n )}\n {!isRoot && isEditing && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRemove();\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: isSelected ? \"inherit\" : \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px 4px\",\n fontSize: 14,\n fontFamily: \"var(--vj-font, monospace)\",\n ...(!showCounts ? { marginLeft: \"auto\" } : {}),\n }}\n title=\"Remove\"\n >\n ×\n </button>\n )}\n </div>\n {showDescriptions && description && (\n <div\n style={{\n padding: \"2px 12px 4px\",\n paddingLeft: 8 + depth * 16 + 22,\n fontSize: 11,\n color: \"var(--vj-text-dim, #666666)\",\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n >\n {description}\n </div>\n )}\n {!collapsed && (\n <div>\n {node.children.map((child) => (\n <FormField\n key={child.id}\n node={child}\n schema={schema}\n rootSchema={rootSchema}\n depth={depth + 1}\n showDescriptions={showDescriptions}\n showCounts={showCounts}\n editingNodeId={editingNodeId}\n collapsedIds={collapsedIds}\n maxKeyLength={maxKeyLength}\n maxDepth={maxDepth}\n isFocused={isFocused}\n dragState={dragState}\n onSelect={onSelect}\n onToggleCollapse={onToggleCollapse}\n onStartEditing={onStartEditing}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n onDrop={onDrop}\n />\n ))}\n </div>\n )}\n </div>\n );\n }\n\n const displayValue = getDisplayValue(node);\n const valueColor = getValueColor(node);\n\n return (\n <div\n data-form-node-id={node.id}\n draggable={!isRoot}\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n if (\n state.selectedNodeIds.size > 1 &&\n state.selectedNodeIds.has(node.id)\n ) {\n setMultiDragImage(e, state.selectedNodeIds.size);\n }\n onDragStart(node.id);\n }}\n onDragOver={handleDragOverEvent}\n onDragEnd={onDragEnd}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"1px 8px\",\n paddingLeft: 8 + depth * 16,\n cursor: \"pointer\",\n backgroundColor: rowBg,\n color: rowColor,\n height: 28,\n boxSizing: \"border-box\",\n userSelect: \"none\",\n opacity: isDeprecated ? 0.5 : isDraggedNode ? 0.4 : 1,\n borderTop: `2px solid ${borderTopColor}`,\n borderBottom: `2px solid ${borderBottomColor}`,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelect(node.id, e);\n }}\n onDoubleClick={() => onStartEditing(node.id)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <span style={{ width: 16, flexShrink: 0 }} />\n {isEditing && parentIsObject ? (\n <input\n ref={keyRef}\n value={node.key}\n onChange={(e) => handleKeyChange(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === \"Tab\" && !e.shiftKey && valueRef.current) {\n e.preventDefault();\n valueRef.current.focus();\n }\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: 0,\n flexShrink: 0,\n outline: \"none\",\n width: `calc(${(maxDepth - depth) * 16}px + ${maxKeyLength}ch)`,\n }}\n />\n ) : (\n <span\n style={{\n color:\n !parentIsObject && !isSelected\n ? \"var(--vj-text-muted, #888888)\"\n : \"inherit\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontFamily: \"var(--vj-font, monospace)\",\n flexShrink: 0,\n display: \"inline-block\",\n width: `calc(${(maxDepth - depth) * 16}px + ${maxKeyLength}ch)`,\n }}\n >\n {getDisplayKey(node, state.tree)}\n </span>\n )}\n {isRequired && !isSelected && (\n <span\n style={{\n color: \"var(--vj-error, #f48771)\",\n fontSize: 10,\n fontFamily: \"var(--vj-font, monospace)\",\n }}\n >\n *\n </span>\n )}\n {isEditing ? (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0,\n }}\n >\n {renderEditInput(\n node,\n propSchema,\n displayValue,\n handleValueChange,\n valueRef as React.RefObject<HTMLInputElement | HTMLSelectElement>,\n valueColor,\n )}\n </div>\n ) : (\n <span\n style={{\n color: valueColor,\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontFamily: \"var(--vj-font, monospace)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n fontStyle: node.type === \"null\" ? \"italic\" : undefined,\n }}\n >\n {displayValue}\n </span>\n )}\n {isEditing && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRemove();\n }}\n style={{\n background: \"none\",\n border: \"none\",\n color: isSelected ? \"inherit\" : \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px 4px\",\n fontSize: 14,\n fontFamily: \"var(--vj-font, monospace)\",\n flexShrink: 0,\n }}\n title=\"Remove\"\n >\n ×\n </button>\n )}\n </div>\n );\n}\n\nfunction renderEditInput(\n node: TreeNode,\n propSchema: JsonSchemaProperty | undefined,\n displayValue: string,\n handleValueChange: (val: string) => void,\n inputRef: React.RefObject<HTMLInputElement | HTMLSelectElement>,\n valueColor: string,\n) {\n const hasEnumValues = propSchema?.enum && propSchema.enum.length > 0;\n\n const inputStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: 0,\n flex: 1,\n outline: \"none\",\n color: valueColor,\n };\n\n if (node.type === \"boolean\") {\n return (\n <EnumInput\n enumValues={[\"true\", \"false\"]}\n value={String(node.value)}\n onValueChange={handleValueChange}\n inputRef={inputRef as React.RefObject<HTMLInputElement>}\n inputStyle={inputStyle}\n />\n );\n }\n\n if (hasEnumValues && propSchema?.enum) {\n return (\n <EnumInput\n enumValues={propSchema.enum}\n value={displayValue}\n onValueChange={handleValueChange}\n inputRef={inputRef as React.RefObject<HTMLInputElement>}\n inputStyle={inputStyle}\n />\n );\n }\n\n if (node.type === \"null\") {\n return (\n <span\n style={{\n color: \"var(--vj-boolean, #569cd6)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontStyle: \"italic\",\n flex: 1,\n }}\n >\n null\n </span>\n );\n }\n\n return (\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n value={displayValue}\n onChange={(e) => handleValueChange(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n placeholder={\n propSchema?.default !== undefined\n ? String(propSchema.default)\n : \"<value>\"\n }\n style={inputStyle}\n />\n );\n}\n\nfunction checkRequired(\n node: TreeNode,\n schema: JsonSchema | null,\n rootSchema: JsonSchemaProperty | undefined,\n): boolean {\n if (!schema || !node.parentId) return false;\n const parentPath = node.path.split(\"/\").slice(0, -1).join(\"/\") || \"/\";\n const parentSchema = getResolvedSchema(schema, rootSchema, parentPath);\n return parentSchema?.required?.includes(node.key) ?? false;\n}\n\nexport interface FormViewProps {\n className?: string;\n showDescriptions?: boolean;\n showCounts?: boolean;\n}\n\nexport function FormView({\n className,\n showDescriptions = false,\n showCounts = false,\n}: FormViewProps) {\n const { state, actions } = useStudio();\n const rootSchema = state.schema ?? undefined;\n const drillDownNode = state.drillDownNodeId\n ? state.tree.nodesById.get(state.drillDownNodeId)\n : null;\n const displayNode = drillDownNode ?? state.tree.root;\n\n const [editingNodeId, setEditingNodeId] = useState<string | null>(null);\n const preEditTreeRef = useRef<typeof state.tree | null>(null);\n const [collapsedIds, setCollapsedIds] = useState<Set<string>>(\n () => new Set<string>(),\n );\n const containerRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n setEditingNodeId(null);\n setCollapsedIds(new Set<string>());\n }, [displayNode.id]);\n\n const visibleNodes = useMemo(\n () => getVisibleNodes(displayNode, (id) => !collapsedIds.has(id)),\n [displayNode, collapsedIds],\n );\n\n const {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n } = useDragDrop(visibleNodes, state.selectedNodeIds);\n\n useEffect(() => {\n actions.setVisibleNodesOverride(visibleNodes);\n return () => actions.setVisibleNodesOverride(null);\n }, [visibleNodes, actions]);\n\n const { maxKeyLength, maxDepth } = useMemo(() => {\n let maxKey = 1;\n let maxD = 0;\n const baseSegments =\n displayNode.path === \"/\"\n ? 0\n : displayNode.path.split(\"/\").filter(Boolean).length;\n for (const node of visibleNodes) {\n const keyText =\n node.parentId === null ? \"/\" : getDisplayKey(node, state.tree);\n if (keyText.length > maxKey) maxKey = keyText.length;\n const segments =\n node.path === \"/\" ? 0 : node.path.split(\"/\").filter(Boolean).length;\n const depth = segments - baseSegments;\n if (depth > maxD) maxD = depth;\n }\n return { maxKeyLength: maxKey, maxDepth: maxD };\n }, [visibleNodes, displayNode.path, state.tree]);\n\n const handleSelect = useCallback(\n (nodeId: string, e: React.MouseEvent) => {\n setEditingNodeId(null);\n if (e.shiftKey) {\n actions.setVisibleNodesOverride(visibleNodes);\n actions.selectNodeRange(nodeId);\n } else if (e.metaKey || e.ctrlKey) {\n actions.toggleNodeSelection(nodeId);\n } else {\n actions.selectNode(nodeId);\n }\n },\n [actions, visibleNodes],\n );\n\n const handleToggleCollapse = useCallback((nodeId: string) => {\n setCollapsedIds((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) {\n next.delete(nodeId);\n } else {\n next.add(nodeId);\n }\n return next;\n });\n }, []);\n\n const handleStartEditing = useCallback(\n (nodeId: string) => {\n preEditTreeRef.current = state.tree;\n setEditingNodeId(nodeId);\n },\n [state.tree],\n );\n\n const scrollToNode = useCallback((nodeId: string) => {\n requestAnimationFrame(() => {\n const el = containerRef.current?.querySelector(\n `[data-form-node-id=\"${nodeId}\"]`,\n );\n el?.scrollIntoView({ block: \"nearest\" });\n });\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (editingNodeId) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n if (preEditTreeRef.current) {\n actions.setTree(preEditTreeRef.current);\n preEditTreeRef.current = null;\n }\n setEditingNodeId(null);\n containerRef.current?.focus();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n preEditTreeRef.current = null;\n setEditingNodeId(null);\n containerRef.current?.focus();\n }\n return;\n }\n\n let currentIndex = visibleNodes.findIndex(\n (n) => n.id === state.focusedNodeId,\n );\n if (currentIndex === -1 && visibleNodes.length > 0) {\n currentIndex = 0;\n }\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const next = visibleNodes[currentIndex + 1];\n if (next) {\n if (e.shiftKey) {\n actions.setVisibleNodesOverride(visibleNodes);\n actions.selectNodeRange(next.id);\n } else {\n actions.selectNode(next.id);\n }\n scrollToNode(next.id);\n }\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prev = visibleNodes[currentIndex - 1];\n if (prev) {\n if (e.shiftKey) {\n actions.setVisibleNodesOverride(visibleNodes);\n actions.selectNodeRange(prev.id);\n } else {\n actions.selectNode(prev.id);\n }\n scrollToNode(prev.id);\n }\n break;\n }\n case \"ArrowRight\": {\n e.preventDefault();\n const node = currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (node && (node.type === \"object\" || node.type === \"array\")) {\n if (collapsedIds.has(node.id)) {\n setCollapsedIds((prev) => {\n const next = new Set(prev);\n next.delete(node.id);\n return next;\n });\n } else if (node.children.length > 0) {\n actions.selectNode(node.children[0].id);\n scrollToNode(node.children[0].id);\n }\n }\n break;\n }\n case \"ArrowLeft\": {\n e.preventDefault();\n const current = currentIndex >= 0 ? visibleNodes[currentIndex] : null;\n if (!current) break;\n const isContainer =\n current.type === \"object\" || current.type === \"array\";\n if (isContainer && !collapsedIds.has(current.id)) {\n setCollapsedIds((prev) => {\n const next = new Set(prev);\n next.add(current.id);\n return next;\n });\n } else if (current.parentId) {\n const parentInVisible = visibleNodes.find(\n (n) => n.id === current.parentId,\n );\n if (parentInVisible) {\n actions.selectNode(parentInVisible.id);\n scrollToNode(parentInVisible.id);\n }\n }\n break;\n }\n case \"Enter\": {\n e.preventDefault();\n if (state.focusedNodeId) {\n preEditTreeRef.current = state.tree;\n actions.selectNode(state.focusedNodeId);\n setEditingNodeId(state.focusedNodeId);\n }\n break;\n }\n case \"a\": {\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n const ids = computeSelectAllIds(\n state.tree,\n state.focusedNodeId,\n state.selectedNodeIds,\n );\n if (ids) {\n actions.setSelection(\n state.focusedNodeId,\n ids,\n state.focusedNodeId,\n );\n }\n }\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n if (state.selectedNodeIds.size > 1 && state.focusedNodeId) {\n actions.selectNode(state.focusedNodeId);\n } else {\n actions.setSelection(null, new Set<string>(), null);\n }\n break;\n }\n case \"Delete\":\n case \"Backspace\": {\n e.preventDefault();\n const { newTree, nextFocusId } = deleteSelectedNodes(\n state.tree,\n state.selectedNodeIds,\n visibleNodes,\n );\n if (newTree === state.tree) break;\n actions.setTree(newTree);\n if (nextFocusId) {\n actions.selectNode(nextFocusId);\n } else {\n actions.setSelection(null, new Set<string>(), null);\n }\n break;\n }\n }\n },\n [\n visibleNodes,\n state.focusedNodeId,\n state.selectedNodeIds,\n editingNodeId,\n collapsedIds,\n scrollToNode,\n state.tree,\n actions,\n ],\n );\n\n return (\n <div\n className={className}\n style={{\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n color: \"var(--vj-text, #cccccc)\",\n height: \"100%\",\n fontFamily: \"var(--vj-font, monospace)\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: \"4px 8px\",\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n flexShrink: 0,\n }}\n >\n <Breadcrumbs />\n </div>\n <div\n ref={containerRef}\n data-form-container\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsFocused(false);\n }\n }}\n style={{\n flex: 1,\n overflow: \"auto\",\n outline: \"none\",\n }}\n >\n <FormField\n node={displayNode}\n schema={state.schema}\n rootSchema={rootSchema}\n depth={0}\n showDescriptions={showDescriptions}\n showCounts={showCounts}\n editingNodeId={editingNodeId}\n collapsedIds={collapsedIds}\n maxKeyLength={maxKeyLength}\n maxDepth={maxDepth}\n isFocused={isFocused}\n dragState={dragState}\n onSelect={handleSelect}\n onToggleCollapse={handleToggleCollapse}\n onStartEditing={handleStartEditing}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDrop={handleDrop}\n />\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback, useMemo } from \"react\";\nimport { useStudio } from \"./context\";\n\nexport interface BreadcrumbsProps {\n className?: string;\n}\n\nconst MAX_SUGGESTIONS = 20;\nconst DROPDOWN_MAX_HEIGHT = 200;\n\nexport function Breadcrumbs({ className }: BreadcrumbsProps) {\n const { state, actions } = useStudio();\n const drillDownNode = state.drillDownNodeId\n ? state.tree.nodesById.get(state.drillDownNodeId)\n : null;\n\n const currentPath = drillDownNode?.path ?? \"/\";\n\n const [inputValue, setInputValue] = useState(currentPath);\n const [open, setOpen] = useState(false);\n const [highlightIndex, setHighlightIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setInputValue(currentPath);\n }, [currentPath]);\n\n const suggestions = useMemo(() => {\n if (!open) return [];\n const query = inputValue.toLowerCase();\n const matches: { id: string; path: string }[] = [];\n for (const [id, node] of state.tree.nodesById) {\n if (node.path.toLowerCase().startsWith(query)) {\n matches.push({ id, path: node.path });\n }\n if (matches.length >= MAX_SUGGESTIONS) break;\n }\n matches.sort((a, b) => a.path.localeCompare(b.path));\n return matches;\n }, [open, inputValue, state.tree.nodesById]);\n\n useEffect(() => {\n setHighlightIndex(0);\n }, [suggestions]);\n\n const navigateTo = useCallback(\n (path: string) => {\n for (const [id, node] of state.tree.nodesById) {\n if (node.path === path) {\n actions.selectAndDrillDown(id);\n break;\n }\n }\n setOpen(false);\n inputRef.current?.blur();\n },\n [state.tree.nodesById, actions],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\") {\n setOpen(true);\n e.preventDefault();\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setHighlightIndex((i) => Math.min(i + 1, suggestions.length - 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setHighlightIndex((i) => Math.max(i - 1, 0));\n break;\n case \"Enter\":\n e.preventDefault();\n if (suggestions.length > 0 && highlightIndex < suggestions.length) {\n navigateTo(suggestions[highlightIndex].path);\n } else {\n const trimmed = inputValue.trim() || \"/\";\n navigateTo(trimmed);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n setInputValue(currentPath);\n setOpen(false);\n inputRef.current?.blur();\n break;\n }\n },\n [open, suggestions, highlightIndex, inputValue, currentPath, navigateTo],\n );\n\n useEffect(() => {\n const el = listRef.current;\n if (!el || !open) return;\n const item = el.children[highlightIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: \"nearest\" });\n }, [highlightIndex, open]);\n\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(e.target as Node)\n ) {\n setInputValue(currentPath);\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [currentPath]);\n\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{ position: \"relative\", flex: 1, minWidth: 0 }}\n >\n <input\n ref={inputRef}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={(e) => {\n e.target.select();\n setOpen(true);\n }}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n autoComplete=\"off\"\n style={{\n width: \"100%\",\n boxSizing: \"border-box\",\n padding: \"3px 0\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n fontFamily: \"var(--vj-font, monospace)\",\n color: \"var(--vj-text-muted, #999999)\",\n background: \"transparent\",\n border: \"none\",\n outline: \"none\",\n }}\n />\n\n {open && suggestions.length > 0 && (\n <div\n ref={listRef}\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: -12,\n right: -12,\n zIndex: 50,\n maxHeight: DROPDOWN_MAX_HEIGHT,\n overflowY: \"auto\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n border: \"1px solid var(--vj-border, #333333)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n }}\n >\n {suggestions.map((s, i) => (\n <div\n key={s.id}\n onMouseDown={(e) => {\n e.preventDefault();\n navigateTo(s.path);\n }}\n onMouseEnter={() => setHighlightIndex(i)}\n style={{\n padding: \"4px 12px\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n color:\n i === highlightIndex\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-muted, #888888)\",\n backgroundColor:\n i === highlightIndex\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {s.path}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n type CSSProperties,\n type RefObject,\n type KeyboardEvent,\n} from \"react\";\nimport type { JsonValue } from \"@visual-json/core\";\n\nconst DROPDOWN_MAX_HEIGHT = 200;\n\ninterface EnumInputProps {\n enumValues: JsonValue[];\n value: string;\n onValueChange: (val: string) => void;\n inputRef: RefObject<HTMLInputElement | null>;\n inputStyle: CSSProperties;\n}\n\nexport function EnumInput({\n enumValues,\n value,\n onValueChange,\n inputRef,\n inputStyle,\n}: EnumInputProps) {\n const [inputValue, setInputValue] = useState(value);\n const [open, setOpen] = useState(false);\n const [highlightIndex, setHighlightIndex] = useState(0);\n const listRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setInputValue(value);\n }, [value]);\n\n const suggestions = useMemo(\n () => enumValues.map((v) => String(v)),\n [enumValues],\n );\n\n useEffect(() => {\n setHighlightIndex(0);\n }, [suggestions]);\n\n const selectValue = useCallback(\n (val: string) => {\n onValueChange(val);\n setInputValue(val);\n setOpen(false);\n },\n [onValueChange],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n e.stopPropagation();\n setOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n e.stopPropagation();\n setHighlightIndex((i) => Math.min(i + 1, suggestions.length - 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n e.stopPropagation();\n setHighlightIndex((i) => Math.max(i - 1, 0));\n break;\n case \"Enter\":\n e.preventDefault();\n e.stopPropagation();\n if (suggestions.length > 0 && highlightIndex < suggestions.length) {\n selectValue(suggestions[highlightIndex]);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation();\n setInputValue(value);\n setOpen(false);\n break;\n case \"Tab\":\n setInputValue(value);\n setOpen(false);\n break;\n }\n },\n [open, suggestions, highlightIndex, value, selectValue],\n );\n\n useEffect(() => {\n const el = listRef.current;\n if (!el || !open) return;\n const item = el.children[highlightIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: \"nearest\" });\n }, [highlightIndex, open]);\n\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(e.target as Node)\n ) {\n setInputValue(value);\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [value]);\n\n return (\n <div\n ref={wrapperRef}\n style={{ position: \"relative\", flex: 1, minWidth: 0 }}\n >\n <input\n ref={inputRef}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n spellCheck={false}\n autoComplete=\"off\"\n style={inputStyle}\n />\n\n {open && suggestions.length > 0 && (\n <div\n ref={listRef}\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: -32,\n right: 0,\n zIndex: 50,\n maxHeight: DROPDOWN_MAX_HEIGHT,\n overflowY: \"auto\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n border: \"1px solid var(--vj-border, #333333)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n }}\n >\n {suggestions.map((s, i) => (\n <div\n key={s}\n onMouseDown={(e) => {\n e.preventDefault();\n selectValue(s);\n }}\n onMouseEnter={() => setHighlightIndex(i)}\n style={{\n padding: \"4px 12px\",\n fontSize: 13,\n fontFamily: \"var(--vj-font, monospace)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color:\n i === highlightIndex\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-muted, #888888)\",\n backgroundColor:\n i === highlightIndex\n ? \"var(--vj-bg-hover, #2a2d2e)\"\n : \"transparent\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n <span style={{ width: 14, flexShrink: 0, fontSize: 12 }}>\n {s === value ? \"✓\" : \"\"}\n </span>\n {s}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useRef, useEffect, useCallback } from \"react\";\nimport { useStudio } from \"./context\";\n\nexport interface SearchBarProps {\n className?: string;\n}\n\nexport function SearchBar({ className }: SearchBarProps) {\n const { state, actions } = useStudio();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (e.shiftKey) {\n actions.prevSearchMatch();\n } else {\n actions.nextSearchMatch();\n }\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n actions.setSearchQuery(\"\");\n inputRef.current?.blur();\n }\n },\n [actions],\n );\n\n useEffect(() => {\n function handleGlobalKeyDown(e: KeyboardEvent) {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key === \"f\") {\n e.preventDefault();\n inputRef.current?.focus();\n inputRef.current?.select();\n }\n }\n document.addEventListener(\"keydown\", handleGlobalKeyDown);\n return () => document.removeEventListener(\"keydown\", handleGlobalKeyDown);\n }, []);\n\n const matchCount = state.searchMatches.length;\n const currentMatch = matchCount > 0 ? state.searchMatchIndex + 1 : 0;\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={state.searchQuery}\n onChange={(e) => actions.setSearchQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Search...\"\n style={{\n flex: 1,\n background: \"none\",\n border: \"none\",\n borderRadius: 3,\n color: \"var(--vj-text, #cccccc)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: \"var(--vj-input-font-size, 13px)\",\n padding: \"3px 8px\",\n outline: \"none\",\n minWidth: 0,\n }}\n />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n flexShrink: 0,\n height: 18,\n }}\n >\n {state.searchQuery ? (\n <>\n <span\n style={{\n fontSize: 11,\n lineHeight: 1,\n color:\n matchCount > 0\n ? \"var(--vj-text-muted, #999999)\"\n : \"var(--vj-error, #f48771)\",\n fontFamily: \"var(--vj-font, monospace)\",\n whiteSpace: \"nowrap\",\n }}\n >\n {matchCount > 0 ? `${currentMatch}/${matchCount}` : \"0/0\"}\n </span>\n <button\n onClick={actions.prevSearchMatch}\n disabled={matchCount === 0}\n aria-label=\"Previous match (Shift+Enter)\"\n style={{\n background: \"none\",\n border: \"none\",\n color:\n matchCount > 0\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-dimmer, #555555)\",\n cursor: matchCount > 0 ? \"pointer\" : \"default\",\n padding: 0,\n fontSize: 10,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 18,\n height: 18,\n }}\n title=\"Previous match (Shift+Enter)\"\n >\n ▲\n </button>\n <button\n onClick={actions.nextSearchMatch}\n disabled={matchCount === 0}\n aria-label=\"Next match (Enter)\"\n style={{\n background: \"none\",\n border: \"none\",\n color:\n matchCount > 0\n ? \"var(--vj-text, #cccccc)\"\n : \"var(--vj-text-dimmer, #555555)\",\n cursor: matchCount > 0 ? \"pointer\" : \"default\",\n padding: 0,\n fontSize: 10,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 18,\n height: 18,\n }}\n title=\"Next match (Enter)\"\n >\n ▼\n </button>\n <button\n onClick={() => actions.setSearchQuery(\"\")}\n aria-label=\"Clear search (Esc)\"\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--vj-text, #cccccc)\",\n cursor: \"pointer\",\n padding: 0,\n fontSize: 14,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 18,\n height: 18,\n }}\n title=\"Clear search (Esc)\"\n >\n ×\n </button>\n </>\n ) : (\n <>\n <button\n onClick={actions.expandAll}\n aria-label=\"Expand all\"\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px\",\n fontSize: 12,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n title=\"Expand all\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 2v4M5 4l3-2 3 2\" />\n <path d=\"M8 14v-4M5 12l3 2 3-2\" />\n <path d=\"M2 8h12\" />\n </svg>\n </button>\n <button\n onClick={actions.collapseAll}\n aria-label=\"Collapse all\"\n style={{\n background: \"none\",\n border: \"none\",\n color: \"var(--vj-text-muted, #888888)\",\n cursor: \"pointer\",\n padding: \"2px\",\n fontSize: 12,\n lineHeight: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n title=\"Collapse all\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 5V1M5 3l3 2 3-2\" />\n <path d=\"M8 11v4M5 13l3-2 3 2\" />\n <path d=\"M2 8h12\" />\n </svg>\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { computeDiff, type DiffEntry } from \"@visual-json/core\";\nimport { DIFF_COLORS, formatValue } from \"@internal/ui\";\n\ninterface DiffRowProps {\n entry: DiffEntry;\n}\n\nfunction DiffRow({ entry }: DiffRowProps) {\n const colors = DIFF_COLORS[entry.type];\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n padding: \"3px 12px\",\n borderBottom: \"1px solid var(--vj-border-subtle, #2a2a2a)\",\n backgroundColor: colors.bg,\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 12,\n gap: 8,\n }}\n >\n <span\n style={{\n color: colors.label,\n fontWeight: 600,\n width: 14,\n flexShrink: 0,\n textAlign: \"center\",\n }}\n >\n {colors.marker}\n </span>\n <span\n style={{\n color: \"var(--vj-text, #cccccc)\",\n flexShrink: 0,\n minWidth: 100,\n }}\n >\n {entry.path}\n </span>\n <span style={{ flex: 1, display: \"flex\", gap: 8, overflow: \"hidden\" }}>\n {entry.type === \"changed\" && (\n <>\n <span style={{ color: \"#f48771\", textDecoration: \"line-through\" }}>\n {formatValue(entry.oldValue)}\n </span>\n <span style={{ color: \"var(--vj-text-dim, #666666)\" }}>→</span>\n <span style={{ color: \"#4ec94e\" }}>\n {formatValue(entry.newValue)}\n </span>\n </>\n )}\n {entry.type === \"added\" && (\n <span style={{ color: \"#4ec94e\" }}>\n {formatValue(entry.newValue)}\n </span>\n )}\n {entry.type === \"removed\" && (\n <span style={{ color: \"#f48771\", textDecoration: \"line-through\" }}>\n {formatValue(entry.oldValue)}\n </span>\n )}\n </span>\n </div>\n );\n}\n\nexport interface DiffViewProps {\n originalJson: unknown;\n currentJson: unknown;\n className?: string;\n}\n\nexport function DiffView({\n originalJson,\n currentJson,\n className,\n}: DiffViewProps) {\n const entries = useMemo(\n () => computeDiff(originalJson as never, currentJson as never),\n [originalJson, currentJson],\n );\n\n const added = entries.filter((e) => e.type === \"added\").length;\n const removed = entries.filter((e) => e.type === \"removed\").length;\n const changed = entries.filter((e) => e.type === \"changed\").length;\n\n return (\n <div\n className={className}\n style={{\n backgroundColor: \"var(--vj-bg, #1e1e1e)\",\n color: \"var(--vj-text, #cccccc)\",\n overflow: \"auto\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"6px 12px\",\n borderBottom: \"1px solid var(--vj-border, #333333)\",\n backgroundColor: \"var(--vj-bg-panel, #252526)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n <span style={{ color: \"var(--vj-text-muted, #999999)\" }}>\n {entries.length === 0 ? \"No changes\" : `${entries.length} changes`}\n </span>\n {added > 0 && <span style={{ color: \"#4ec94e\" }}>+{added} added</span>}\n {removed > 0 && (\n <span style={{ color: \"#f48771\" }}>-{removed} removed</span>\n )}\n {changed > 0 && (\n <span style={{ color: \"#dcdcaa\" }}>~{changed} modified</span>\n )}\n </div>\n <div style={{ flex: 1, overflow: \"auto\" }}>\n {entries.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n color: \"var(--vj-text-dimmer, #555555)\",\n fontFamily: \"var(--vj-font, monospace)\",\n fontSize: 13,\n }}\n >\n No differences detected\n </div>\n ) : (\n entries.map((entry, i) => <DiffRow key={i} entry={entry} />)\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useState","useRef","useCallback","useEffect","removeNode","useState","useMemo","useRef","useCallback","useEffect","removeNode","toJson","useEffect","useRef","useState","jsx","useState","useCallback","useRef","useMemo","isDescendant","EMPTY_SET","setMultiDragImage","useState","useRef","useMemo","useCallback","isDescendant","jsx","useState","setMultiDragImage","useRef","useMemo","useCallback","toJson","removeNode","useEffect","useState","useCallback","useRef","useEffect","useMemo","removeNode","getPropertySchema","resolveRef","useState","useRef","useEffect","useCallback","useMemo","jsx","jsxs","useState","useRef","useEffect","useMemo","useCallback","useState","useRef","useEffect","useCallback","useMemo","jsx","jsxs","DROPDOWN_MAX_HEIGHT","jsx","jsxs","getPropertySchema","resolveRef","useState","useRef","useEffect","useCallback","removeNode","setMultiDragImage","useMemo","useRef","useEffect","useCallback","Fragment","jsx","jsxs","useRef","useCallback","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","useMemo","Fragment","jsx","jsxs","useMemo"]}
|