{ "edges": [ { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--font-size-base" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--font-ui" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--panel-border" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--panel-radius" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--space-1" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--space-3" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--surface-0" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--surface-2" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--surface-3" }, { "attrs": {}, "kind": "reads", "source": "file:base.css", "target": "token:--text-primary" }, { "attrs": {}, "kind": "requires", "source": "file:components/LayoutGrid.vue", "target": "package:vue" }, { "attrs": {}, "kind": "requires", "source": "file:components/Panel.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--font-size-sm" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--font-ui" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--panel-border" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--panel-header-height" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--panel-radius" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--space-1" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--space-2" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--space-3" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--status-error" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--status-idle" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--status-live" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--status-processing" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--surface-1" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--surface-2" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--text-primary" }, { "attrs": {}, "kind": "reads", "source": "file:components/Panel.vue", "target": "token:--text-secondary" }, { "attrs": {}, "kind": "requires", "source": "file:components/ParameterEditor.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:components/ParameterEditor.vue", "target": "token:--space-2" }, { "attrs": {}, "kind": "reads", "source": "file:components/ParameterEditor.vue", "target": "token:--surface-3" }, { "attrs": {}, "kind": "reads", "source": "file:components/ParameterEditor.vue", "target": "token:--text-dim" }, { "attrs": {}, "kind": "reads", "source": "file:components/ParameterEditor.vue", "target": "token:--text-primary" }, { "attrs": {}, "kind": "reads", "source": "file:components/ParameterEditor.vue", "target": "token:--text-secondary" }, { "attrs": {}, "kind": "requires", "source": "file:components/ResizeHandle.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:components/ResizeHandle.vue", "target": "token:--text-dim" }, { "attrs": {}, "kind": "requires", "source": "file:components/SplitPane.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:components/SplitPane.vue", "target": "token:--text-dim" }, { "attrs": {}, "kind": "requires", "source": "file:components/VideoPlayer.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:components/VideoPlayer.vue", "target": "token:--surface-0" }, { "attrs": {}, "kind": "imports", "source": "file:composables/useDataSource.ts", "target": "file:datasources/DataSource.ts" }, { "attrs": {}, "kind": "requires", "source": "file:composables/useDataSource.ts", "target": "package:vue" }, { "attrs": {}, "kind": "requires", "source": "file:composables/useEditorExecution.ts", "target": "package:vue" }, { "attrs": {}, "kind": "requires", "source": "file:composables/useRegistry.ts", "target": "package:vue" }, { "attrs": {}, "kind": "requires", "source": "file:datasources/DataSource.ts", "target": "package:vue" }, { "attrs": {}, "kind": "imports", "source": "file:datasources/SSEDataSource.ts", "target": "file:datasources/DataSource.ts" }, { "attrs": {}, "kind": "imports", "source": "file:datasources/StaticDataSource.ts", "target": "file:datasources/DataSource.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:components/LayoutGrid.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:components/Panel.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:components/ParameterEditor.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:components/ResizeHandle.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:components/SplitPane.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:components/VideoPlayer.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:composables/useDataSource.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:composables/useEditorExecution.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:composables/useRegistry.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:datasources/DataSource.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:datasources/SSEDataSource.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:datasources/StaticDataSource.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:plugins/BBoxDrawPlugin.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:plugins/CrosshairPlugin.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:plugins/InteractionPlugin.ts" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:renderers/FrameRenderer.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:renderers/GraphRenderer.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:renderers/LogRenderer.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:renderers/TableRenderer.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:renderers/TimeSeriesRenderer.vue" }, { "attrs": {}, "kind": "imports", "source": "file:index.ts", "target": "file:theme.css" }, { "attrs": {}, "kind": "imports", "source": "file:plugins/BBoxDrawPlugin.ts", "target": "file:plugins/InteractionPlugin.ts" }, { "attrs": {}, "kind": "imports", "source": "file:plugins/CrosshairPlugin.ts", "target": "file:plugins/InteractionPlugin.ts" }, { "attrs": {}, "kind": "requires", "source": "file:renderers/FrameRenderer.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/FrameRenderer.vue", "target": "token:--text-dim" }, { "attrs": {}, "kind": "requires", "source": "file:renderers/GraphRenderer.vue", "target": "package:@vue-flow/core" }, { "attrs": {}, "kind": "requires", "source": "file:renderers/GraphRenderer.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/GraphRenderer.vue", "target": "token:--font-mono" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/GraphRenderer.vue", "target": "token:--font-size-sm" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/GraphRenderer.vue", "target": "token:--panel-radius" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/GraphRenderer.vue", "target": "token:--status-processing" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/GraphRenderer.vue", "target": "token:--text-secondary" }, { "attrs": {}, "kind": "requires", "source": "file:renderers/LogRenderer.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/LogRenderer.vue", "target": "token:--font-mono" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/LogRenderer.vue", "target": "token:--space-2" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/LogRenderer.vue", "target": "token:--space-6" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/LogRenderer.vue", "target": "token:--status-error" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/LogRenderer.vue", "target": "token:--status-escalating" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/LogRenderer.vue", "target": "token:--status-live" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/LogRenderer.vue", "target": "token:--status-processing" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/LogRenderer.vue", "target": "token:--text-dim" }, { "attrs": {}, "kind": "requires", "source": "file:renderers/TableRenderer.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--font-mono" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--font-size-sm" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--panel-border" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--space-1" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--space-2" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--space-3" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--space-6" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--surface-2" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--surface-3" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--text-dim" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--text-primary" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TableRenderer.vue", "target": "token:--text-secondary" }, { "attrs": {}, "kind": "requires", "source": "file:renderers/TimeSeriesRenderer.vue", "target": "package:uplot" }, { "attrs": {}, "kind": "requires", "source": "file:renderers/TimeSeriesRenderer.vue", "target": "package:vue" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TimeSeriesRenderer.vue", "target": "token:--font-mono" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TimeSeriesRenderer.vue", "target": "token:--surface-2" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TimeSeriesRenderer.vue", "target": "token:--surface-3" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TimeSeriesRenderer.vue", "target": "token:--text-primary" }, { "attrs": {}, "kind": "reads", "source": "file:renderers/TimeSeriesRenderer.vue", "target": "token:--text-secondary" }, { "attrs": {}, "kind": "imports", "source": "file:theme.css", "target": "file:base.css" }, { "attrs": {}, "kind": "imports", "source": "file:theme.css", "target": "file:tokens.css" }, { "attrs": {}, "kind": "reads", "source": "file:theme.css", "target": "token:--surface-0" }, { "attrs": {}, "kind": "reads", "source": "file:tokens.css", "target": "token:--border" }, { "attrs": {}, "kind": "reads", "source": "file:tokens.css", "target": "token:--status-escalating" }, { "attrs": {}, "kind": "reads", "source": "file:tokens.css", "target": "token:--status-live" }, { "attrs": {}, "kind": "reads", "source": "file:tokens.css", "target": "token:--status-processing" }, { "attrs": {}, "kind": "binds", "source": "part:base", "target": "file:base.css" }, { "attrs": {}, "kind": "binds", "source": "part:maximize", "target": "file:components/Panel.vue" }, { "attrs": {}, "kind": "binds", "source": "part:panel", "target": "file:components/Panel.vue" }, { "attrs": {}, "kind": "binds", "source": "part:params", "target": "file:components/ParameterEditor.vue" }, { "attrs": {}, "kind": "binds", "source": "part:split", "target": "file:components/SplitPane.vue" }, { "attrs": {}, "kind": "binds", "source": "part:feed", "target": "file:datasources/DataSource.ts" }, { "attrs": {}, "kind": "binds", "source": "part:feed", "target": "file:datasources/SSEDataSource.ts" } ], "meta": { "generator": "common.slice docs", "larder": { "extra": { "exports": 19, "types": 15 }, "failed": [], "identity": "common/ui/src", "kind": "vue-library", "seen": 24, "unit": "file" }, "schema_version": "1", "source": "common/ui/src" }, "nodes": [ { "attrs": { "bytes": 1430, "group": "", "path": "base.css" }, "id": "file:base.css", "kind": "stylesheet", "label": "base.css", "parent": null }, { "attrs": { "bytes": 515, "emits": [], "group": "components", "models": [], "path": "components/LayoutGrid.vue", "props": [ { "default": "2", "doc": "", "name": "columns", "required": false, "type": "number" }, { "default": "2", "doc": "", "name": "rows", "required": false, "type": "number" }, { "default": "'var(--space-2)'", "doc": "", "name": "gap", "required": false, "type": "string" } ], "slots": [ "default" ] }, "id": "file:components/LayoutGrid.vue", "kind": "component", "label": "LayoutGrid.vue", "parent": null }, { "attrs": { "bytes": 4429, "emits": [], "group": "components", "models": [ { "default": "false", "doc": "", "name": "maximized", "required": false, "type": "boolean" } ], "path": "components/Panel.vue", "props": [ { "default": null, "doc": "", "name": "title", "required": true, "type": "string" }, { "default": null, "doc": "Omit to show no indicator at all \u2014 see the note on `.panel-status`.", "name": "status", "required": false, "type": "'idle' | 'live' | 'processing' | 'error'" }, { "default": "true", "doc": "Set false for panels that make no sense filling the window.", "name": "maximizable", "required": false, "type": "boolean" } ], "slots": [ "actions", "default", "overlay" ] }, "id": "file:components/Panel.vue", "kind": "component", "label": "Panel.vue", "parent": null }, { "attrs": { "bytes": 3178, "declarations": [ { "doc": "", "kind": "interface", "name": "ConfigField" } ], "emits": [ { "default": null, "doc": "", "name": "update", "required": true, "type": "[name: string, value: unknown]" }, { "default": null, "doc": "", "name": "reset", "required": true, "type": "[]" } ], "group": "components", "models": [], "path": "components/ParameterEditor.vue", "props": [ { "default": null, "doc": "", "name": "fields", "required": true, "type": "ConfigField[]" }, { "default": null, "doc": "", "name": "values", "required": true, "type": "Record" } ], "slots": [] }, "id": "file:components/ParameterEditor.vue", "kind": "component", "label": "ParameterEditor.vue", "parent": null }, { "attrs": { "bytes": 1348, "emits": [ { "default": null, "doc": "", "name": "resize", "required": true, "type": "[delta: number]" } ], "group": "components", "models": [], "path": "components/ResizeHandle.vue", "props": [ { "default": null, "doc": "", "name": "direction", "required": true, "type": "'horizontal' | 'vertical'" } ], "slots": [] }, "id": "file:components/ResizeHandle.vue", "kind": "component", "label": "ResizeHandle.vue", "parent": null }, { "attrs": { "bytes": 3825, "emits": [], "group": "components", "models": [], "path": "components/SplitPane.vue", "props": [ { "default": "'horizontal'", "doc": "Split direction", "name": "direction", "required": false, "type": "'horizontal' | 'vertical'" }, { "default": "1", "doc": "Initial size of the sized pane (px or flex ratio)", "name": "initialSize", "required": false, "type": "number" }, { "default": "'ratio'", "doc": "Size mode: 'px' = sized pane fixed in pixels, 'ratio' = flex ratio", "name": "sizeMode", "required": false, "type": "'px' | 'ratio'" }, { "default": "'first'", "doc": "Which pane is sized: 'first' or 'second'. Default: 'first'.", "name": "anchor", "required": false, "type": "'first' | 'second'" }, { "default": "0.1", "doc": "Min size (px in px-mode, ratio in ratio-mode)", "name": "min", "required": false, "type": "number" }, { "default": "10", "doc": "Max size (px in px-mode, ratio in ratio-mode)", "name": "max", "required": false, "type": "number" }, { "default": "true", "doc": "Whether the divider is draggable", "name": "resizable", "required": false, "type": "boolean" } ], "slots": [ "first", "second" ] }, "id": "file:components/SplitPane.vue", "kind": "component", "label": "SplitPane.vue", "parent": null }, { "attrs": { "bytes": 4196, "emits": [ { "default": null, "doc": "", "name": "update:currentTime", "required": true, "type": "[value: number]" }, { "default": null, "doc": "", "name": "update:playing", "required": true, "type": "[value: boolean]" }, { "default": null, "doc": "Media duration once metadata has loaded", "name": "duration", "required": true, "type": "[value: number]" }, { "default": null, "doc": "Playback reached the end", "name": "ended", "required": true, "type": "[]" } ], "group": "components", "models": [], "path": "components/VideoPlayer.vue", "props": [ { "default": null, "doc": "Media source URL", "name": "src", "required": true, "type": "string" }, { "default": "0", "doc": "Playback position in seconds (v-model:currentTime)", "name": "currentTime", "required": false, "type": "number" }, { "default": "false", "doc": "Whether the media is playing (v-model:playing)", "name": "playing", "required": false, "type": "boolean" } ], "slots": [ "overlay" ], "summary": "Agnostic seekable media player." }, "id": "file:components/VideoPlayer.vue", "kind": "component", "label": "VideoPlayer.vue", "parent": null }, { "attrs": { "bytes": 666, "declarations": [ { "doc": "Composable that connects a component to a DataSource. Connects on mount, disconnects on unmount. Returns reactive refs for data, status, and error.", "kind": "function", "name": "useDataSource" } ], "group": "composables", "path": "composables/useDataSource.ts", "summary": "Composable that connects a component to a DataSource." }, "id": "file:composables/useDataSource.ts", "kind": "composable", "label": "useDataSource.ts", "parent": null }, { "attrs": { "bytes": 1423, "declarations": [ { "doc": "", "kind": "interface", "name": "EditorExecutionOptions" }, { "doc": "Generic editor execution pattern \u2014 debounced apply with auto-apply toggle, loading/error/timing state tracking. The caller provides the actual execution function. This composable handles the orchestration: debounce, auto-apply, loading state, timing.", "kind": "function", "name": "useEditorExecution" } ], "group": "composables", "path": "composables/useEditorExecution.ts" }, "id": "file:composables/useEditorExecution.ts", "kind": "composable", "label": "useEditorExecution.ts", "parent": null }, { "attrs": { "bytes": 1946, "declarations": [ { "doc": "", "kind": "function", "name": "useRegistry" } ], "group": "composables", "path": "composables/useRegistry.ts", "summary": "Generic registry composable \u2014 fetches typed data from a URL, caches it, exposes it reactively." }, "id": "file:composables/useRegistry.ts", "kind": "composable", "label": "useRegistry.ts", "parent": null }, { "attrs": { "bytes": 1331, "declarations": [ { "doc": "", "kind": "type", "name": "DataSourceStatus" }, { "doc": "Base class for all data sources. A DataSource connects to some event stream, exposes reactive state, and lets consumers subscribe to typed events. Panels read from these reactively \u2014 they never touch the transport layer directly.", "kind": "abstract class", "name": "DataSource" } ], "group": "datasources", "path": "datasources/DataSource.ts" }, "id": "file:datasources/DataSource.ts", "kind": "datasource", "label": "DataSource.ts", "parent": null }, { "attrs": { "bytes": 2525, "declarations": [ { "doc": "", "kind": "interface", "name": "SSEDataSourceOptions" }, { "doc": "DataSource backed by native EventSource (Server-Sent Events). Connects to a single SSE endpoint and demultiplexes events by type. Multiple panels can subscribe to different event types from the same source.", "kind": "class", "name": "SSEDataSource" } ], "group": "datasources", "path": "datasources/SSEDataSource.ts" }, "id": "file:datasources/SSEDataSource.ts", "kind": "datasource", "label": "SSEDataSource.ts", "parent": null }, { "attrs": { "bytes": 1121, "declarations": [ { "doc": "", "kind": "interface", "name": "StaticEvent" }, { "doc": "DataSource that replays a fixture array of events. Used for development and testing without a running backend. Events are emitted in sequence with optional delays.", "kind": "class", "name": "StaticDataSource" } ], "group": "datasources", "path": "datasources/StaticDataSource.ts" }, "id": "file:datasources/StaticDataSource.ts", "kind": "datasource", "label": "StaticDataSource.ts", "parent": null }, { "attrs": { "bytes": 2361, "group": "", "path": "index.ts" }, "id": "file:index.ts", "kind": "barrel", "label": "index.ts", "parent": null }, { "attrs": { "bytes": 2096, "declarations": [ { "doc": "", "kind": "interface", "name": "BBoxResult" }, { "doc": "", "kind": "type", "name": "BBoxCallback" }, { "doc": "", "kind": "class", "name": "BBoxDrawPlugin" } ], "group": "plugins", "path": "plugins/BBoxDrawPlugin.ts", "summary": "BBoxDrawPlugin \u2014 draw bounding boxes on the frame viewer." }, "id": "file:plugins/BBoxDrawPlugin.ts", "kind": "plugin", "label": "BBoxDrawPlugin.ts", "parent": null }, { "attrs": { "bytes": 1556, "declarations": [ { "doc": "", "kind": "type", "name": "CrosshairCallback" }, { "doc": "", "kind": "class", "name": "CrosshairPlugin" } ], "group": "plugins", "path": "plugins/CrosshairPlugin.ts", "summary": "CrosshairPlugin \u2014 synchronized vertical crosshair across time-series panels." }, "id": "file:plugins/CrosshairPlugin.ts", "kind": "plugin", "label": "CrosshairPlugin.ts", "parent": null }, { "attrs": { "bytes": 1021, "declarations": [ { "doc": "Interaction plugin interface. Plugins attach to a Panel's overlay canvas. They receive pointer events and emit typed results via the callback. The panel handles rendering the overlay and routing events to the active plugin.", "kind": "interface", "name": "PluginContext" }, { "doc": "", "kind": "interface", "name": "InteractionPlugin" } ], "group": "plugins", "path": "plugins/InteractionPlugin.ts", "summary": "Interaction plugin interface." }, "id": "file:plugins/InteractionPlugin.ts", "kind": "plugin", "label": "InteractionPlugin.ts", "parent": null }, { "attrs": { "bytes": 5036, "declarations": [ { "doc": "", "kind": "interface", "name": "FrameBBox" }, { "doc": "", "kind": "interface", "name": "FrameOverlay" } ], "emits": [], "group": "renderers", "models": [], "path": "renderers/FrameRenderer.vue", "props": [ { "default": null, "doc": "Base64 JPEG image", "name": "imageSrc", "required": true, "type": "string" }, { "default": null, "doc": "Bounding boxes to overlay", "name": "boxes", "required": true, "type": "FrameBBox[]" }, { "default": null, "doc": "Debug overlay layers (edge images, line visualizations, etc.)", "name": "overlays", "required": false, "type": "FrameOverlay[]" } ], "slots": [] }, "id": "file:renderers/FrameRenderer.vue", "kind": "renderer", "label": "FrameRenderer.vue", "parent": null }, { "attrs": { "bytes": 8118, "declarations": [ { "doc": "", "kind": "interface", "name": "GraphNode" }, { "doc": "", "kind": "type", "name": "GraphMode" } ], "emits": [ { "default": null, "doc": "", "name": "open-region-editor", "required": true, "type": "[stage: string]" }, { "default": null, "doc": "", "name": "open-stage-editor", "required": true, "type": "[stage: string]" }, { "default": null, "doc": "", "name": "node-click", "required": true, "type": "[stage: string]" } ], "group": "renderers", "models": [], "path": "renderers/GraphRenderer.vue", "props": [ { "default": null, "doc": "", "name": "nodes", "required": true, "type": "GraphNode[]" }, { "default": "'observe'", "doc": "Interaction mode \u2014 changes visual treatment and click behavior", "name": "mode", "required": false, "type": "GraphMode" }, { "default": "null", "doc": "Currently edited stage (highlighted in edit modes)", "name": "activeStage", "required": false, "type": "string | null" }, { "default": null, "doc": "Stages that have a region editor (bbox/polygon)", "name": "regionStages", "required": false, "type": "string[]" } ], "slots": [] }, "id": "file:renderers/GraphRenderer.vue", "kind": "renderer", "label": "GraphRenderer.vue", "parent": null }, { "attrs": { "bytes": 3788, "declarations": [ { "doc": "", "kind": "interface", "name": "LogEntry" } ], "emits": [], "group": "renderers", "models": [], "path": "renderers/LogRenderer.vue", "props": [ { "default": null, "doc": "", "name": "entries", "required": true, "type": "LogEntry[]" }, { "default": "24", "doc": "", "name": "rowHeight", "required": false, "type": "number" }, { "default": "true", "doc": "", "name": "autoScroll", "required": false, "type": "boolean" } ], "slots": [] }, "id": "file:renderers/LogRenderer.vue", "kind": "renderer", "label": "LogRenderer.vue", "parent": null }, { "attrs": { "bytes": 2474, "declarations": [ { "doc": "", "kind": "interface", "name": "TableColumn" } ], "emits": [ { "default": null, "doc": "", "name": "sort", "required": true, "type": "[key: string]" } ], "group": "renderers", "models": [], "path": "renderers/TableRenderer.vue", "props": [ { "default": null, "doc": "", "name": "columns", "required": true, "type": "TableColumn[]" }, { "default": null, "doc": "", "name": "rows", "required": true, "type": "Record[]" }, { "default": null, "doc": "", "name": "sortKey", "required": false, "type": "string" }, { "default": null, "doc": "", "name": "sortDir", "required": false, "type": "'asc' | 'desc'" } ], "slots": [] }, "id": "file:renderers/TableRenderer.vue", "kind": "renderer", "label": "TableRenderer.vue", "parent": null }, { "attrs": { "bytes": 4418, "declarations": [ { "doc": "", "kind": "interface", "name": "TimeSeriesSeries" } ], "emits": [], "group": "renderers", "models": [], "path": "renderers/TimeSeriesRenderer.vue", "props": [ { "default": null, "doc": "Array of series configs (label + color)", "name": "series", "required": true, "type": "TimeSeriesSeries[]" }, { "default": null, "doc": "Data: [timestamps[], series1[], series2[], ...]", "name": "data", "required": true, "type": "uPlot.AlignedData" }, { "default": null, "doc": "Chart title (optional)", "name": "title", "required": false, "type": "string" }, { "default": "false", "doc": "Stacked area mode", "name": "stacked", "required": false, "type": "boolean" } ], "slots": [] }, "id": "file:renderers/TimeSeriesRenderer.vue", "kind": "renderer", "label": "TimeSeriesRenderer.vue", "parent": null }, { "attrs": { "bytes": 513, "group": "", "path": "theme.css" }, "id": "file:theme.css", "kind": "stylesheet", "label": "theme.css", "parent": null }, { "attrs": { "bytes": 1597, "group": "", "path": "tokens.css" }, "id": "file:tokens.css", "kind": "stylesheet", "label": "tokens.css", "parent": null }, { "attrs": { "bytes": 1331, "closure": [ "datasources/DataSource.ts" ], "file": "datasources/DataSource.ts", "local": "DataSource", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:DataSource", "kind": "export", "label": "DataSource", "parent": "file:datasources/DataSource.ts" }, { "attrs": { "bytes": 1331, "closure": [ "datasources/DataSource.ts" ], "file": "datasources/DataSource.ts", "local": "DataSourceStatus", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:DataSourceStatus", "kind": "type", "label": "DataSourceStatus", "parent": "file:datasources/DataSource.ts" }, { "attrs": { "bytes": 3856, "closure": [ "datasources/DataSource.ts", "datasources/SSEDataSource.ts" ], "file": "datasources/SSEDataSource.ts", "local": "SSEDataSource", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:SSEDataSource", "kind": "export", "label": "SSEDataSource", "parent": "file:datasources/SSEDataSource.ts" }, { "attrs": { "bytes": 2452, "closure": [ "datasources/DataSource.ts", "datasources/StaticDataSource.ts" ], "file": "datasources/StaticDataSource.ts", "local": "StaticDataSource", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:StaticDataSource", "kind": "export", "label": "StaticDataSource", "parent": "file:datasources/StaticDataSource.ts" }, { "attrs": { "bytes": 1997, "closure": [ "composables/useDataSource.ts", "datasources/DataSource.ts" ], "file": "composables/useDataSource.ts", "local": "useDataSource", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:useDataSource", "kind": "export", "label": "useDataSource", "parent": "file:composables/useDataSource.ts" }, { "attrs": { "bytes": 1946, "closure": [ "composables/useRegistry.ts" ], "file": "composables/useRegistry.ts", "local": "useRegistry", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:useRegistry", "kind": "export", "label": "useRegistry", "parent": "file:composables/useRegistry.ts" }, { "attrs": { "bytes": 1423, "closure": [ "composables/useEditorExecution.ts" ], "file": "composables/useEditorExecution.ts", "local": "useEditorExecution", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:useEditorExecution", "kind": "export", "label": "useEditorExecution", "parent": "file:composables/useEditorExecution.ts" }, { "attrs": { "bytes": 1423, "closure": [ "composables/useEditorExecution.ts" ], "file": "composables/useEditorExecution.ts", "local": "EditorExecutionOptions", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:EditorExecutionOptions", "kind": "type", "label": "EditorExecutionOptions", "parent": "file:composables/useEditorExecution.ts" }, { "attrs": { "bytes": 4429, "closure": [ "components/Panel.vue" ], "file": "components/Panel.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [ "--font-size-sm", "--font-ui", "--panel-border", "--panel-header-height", "--panel-radius", "--space-1", "--space-2", "--space-3", "--status-error", "--status-idle", "--status-live", "--status-processing", "--surface-1", "--surface-2", "--text-primary", "--text-secondary" ] }, "id": "export:Panel", "kind": "export", "label": "Panel", "parent": "file:components/Panel.vue" }, { "attrs": { "bytes": 515, "closure": [ "components/LayoutGrid.vue" ], "file": "components/LayoutGrid.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [] }, "id": "export:LayoutGrid", "kind": "export", "label": "LayoutGrid", "parent": "file:components/LayoutGrid.vue" }, { "attrs": { "bytes": 1348, "closure": [ "components/ResizeHandle.vue" ], "file": "components/ResizeHandle.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [ "--text-dim" ] }, "id": "export:ResizeHandle", "kind": "export", "label": "ResizeHandle", "parent": "file:components/ResizeHandle.vue" }, { "attrs": { "bytes": 3825, "closure": [ "components/SplitPane.vue" ], "file": "components/SplitPane.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [ "--text-dim" ] }, "id": "export:SplitPane", "kind": "export", "label": "SplitPane", "parent": "file:components/SplitPane.vue" }, { "attrs": { "bytes": 3178, "closure": [ "components/ParameterEditor.vue" ], "file": "components/ParameterEditor.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [ "--space-2", "--surface-3", "--text-dim", "--text-primary", "--text-secondary" ] }, "id": "export:ParameterEditor", "kind": "export", "label": "ParameterEditor", "parent": "file:components/ParameterEditor.vue" }, { "attrs": { "bytes": 3178, "closure": [ "components/ParameterEditor.vue" ], "file": "components/ParameterEditor.vue", "local": "ConfigField", "packages": { "vue": "^3.5" }, "tokens": [ "--space-2", "--surface-3", "--text-dim", "--text-primary", "--text-secondary" ] }, "id": "export:ConfigField", "kind": "type", "label": "ConfigField", "parent": "file:components/ParameterEditor.vue" }, { "attrs": { "bytes": 4196, "closure": [ "components/VideoPlayer.vue" ], "file": "components/VideoPlayer.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [ "--surface-0" ] }, "id": "export:VideoPlayer", "kind": "export", "label": "VideoPlayer", "parent": "file:components/VideoPlayer.vue" }, { "attrs": { "bytes": 3788, "closure": [ "renderers/LogRenderer.vue" ], "file": "renderers/LogRenderer.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [ "--font-mono", "--space-2", "--space-6", "--status-error", "--status-escalating", "--status-live", "--status-processing", "--text-dim" ] }, "id": "export:LogRenderer", "kind": "export", "label": "LogRenderer", "parent": "file:renderers/LogRenderer.vue" }, { "attrs": { "bytes": 4418, "closure": [ "renderers/TimeSeriesRenderer.vue" ], "file": "renderers/TimeSeriesRenderer.vue", "local": "default", "packages": { "uplot": "^1.6", "vue": "^3.5" }, "tokens": [ "--font-mono", "--surface-2", "--surface-3", "--text-primary", "--text-secondary" ] }, "id": "export:TimeSeriesRenderer", "kind": "export", "label": "TimeSeriesRenderer", "parent": "file:renderers/TimeSeriesRenderer.vue" }, { "attrs": { "bytes": 8118, "closure": [ "renderers/GraphRenderer.vue" ], "file": "renderers/GraphRenderer.vue", "local": "default", "packages": { "@vue-flow/core": "^1.48.2", "vue": "^3.5" }, "tokens": [ "--font-mono", "--font-size-sm", "--panel-radius", "--status-processing", "--text-secondary" ] }, "id": "export:GraphRenderer", "kind": "export", "label": "GraphRenderer", "parent": "file:renderers/GraphRenderer.vue" }, { "attrs": { "bytes": 5036, "closure": [ "renderers/FrameRenderer.vue" ], "file": "renderers/FrameRenderer.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [ "--text-dim" ] }, "id": "export:FrameRenderer", "kind": "export", "label": "FrameRenderer", "parent": "file:renderers/FrameRenderer.vue" }, { "attrs": { "bytes": 2474, "closure": [ "renderers/TableRenderer.vue" ], "file": "renderers/TableRenderer.vue", "local": "default", "packages": { "vue": "^3.5" }, "tokens": [ "--font-mono", "--font-size-sm", "--panel-border", "--space-1", "--space-2", "--space-3", "--space-6", "--surface-2", "--surface-3", "--text-dim", "--text-primary", "--text-secondary" ] }, "id": "export:TableRenderer", "kind": "export", "label": "TableRenderer", "parent": "file:renderers/TableRenderer.vue" }, { "attrs": { "bytes": 5036, "closure": [ "renderers/FrameRenderer.vue" ], "file": "renderers/FrameRenderer.vue", "local": "FrameBBox", "packages": { "vue": "^3.5" }, "tokens": [ "--text-dim" ] }, "id": "export:FrameBBox", "kind": "type", "label": "FrameBBox", "parent": "file:renderers/FrameRenderer.vue" }, { "attrs": { "bytes": 5036, "closure": [ "renderers/FrameRenderer.vue" ], "file": "renderers/FrameRenderer.vue", "local": "FrameOverlay", "packages": { "vue": "^3.5" }, "tokens": [ "--text-dim" ] }, "id": "export:FrameOverlay", "kind": "type", "label": "FrameOverlay", "parent": "file:renderers/FrameRenderer.vue" }, { "attrs": { "bytes": 3788, "closure": [ "renderers/LogRenderer.vue" ], "file": "renderers/LogRenderer.vue", "local": "LogEntry", "packages": { "vue": "^3.5" }, "tokens": [ "--font-mono", "--space-2", "--space-6", "--status-error", "--status-escalating", "--status-live", "--status-processing", "--text-dim" ] }, "id": "export:LogEntry", "kind": "type", "label": "LogEntry", "parent": "file:renderers/LogRenderer.vue" }, { "attrs": { "bytes": 8118, "closure": [ "renderers/GraphRenderer.vue" ], "file": "renderers/GraphRenderer.vue", "local": "GraphNode", "packages": { "@vue-flow/core": "^1.48.2", "vue": "^3.5" }, "tokens": [ "--font-mono", "--font-size-sm", "--panel-radius", "--status-processing", "--text-secondary" ] }, "id": "export:GraphNode", "kind": "type", "label": "GraphNode", "parent": "file:renderers/GraphRenderer.vue" }, { "attrs": { "bytes": 8118, "closure": [ "renderers/GraphRenderer.vue" ], "file": "renderers/GraphRenderer.vue", "local": "GraphMode", "packages": { "@vue-flow/core": "^1.48.2", "vue": "^3.5" }, "tokens": [ "--font-mono", "--font-size-sm", "--panel-radius", "--status-processing", "--text-secondary" ] }, "id": "export:GraphMode", "kind": "type", "label": "GraphMode", "parent": "file:renderers/GraphRenderer.vue" }, { "attrs": { "bytes": 2474, "closure": [ "renderers/TableRenderer.vue" ], "file": "renderers/TableRenderer.vue", "local": "TableColumn", "packages": { "vue": "^3.5" }, "tokens": [ "--font-mono", "--font-size-sm", "--panel-border", "--space-1", "--space-2", "--space-3", "--space-6", "--surface-2", "--surface-3", "--text-dim", "--text-primary", "--text-secondary" ] }, "id": "export:TableColumn", "kind": "type", "label": "TableColumn", "parent": "file:renderers/TableRenderer.vue" }, { "attrs": { "bytes": 4418, "closure": [ "renderers/TimeSeriesRenderer.vue" ], "file": "renderers/TimeSeriesRenderer.vue", "local": "TimeSeriesSeries", "packages": { "uplot": "^1.6", "vue": "^3.5" }, "tokens": [ "--font-mono", "--surface-2", "--surface-3", "--text-primary", "--text-secondary" ] }, "id": "export:TimeSeriesSeries", "kind": "type", "label": "TimeSeriesSeries", "parent": "file:renderers/TimeSeriesRenderer.vue" }, { "attrs": { "bytes": 1021, "closure": [ "plugins/InteractionPlugin.ts" ], "file": "plugins/InteractionPlugin.ts", "local": "InteractionPlugin", "packages": {}, "tokens": [] }, "id": "export:InteractionPlugin", "kind": "type", "label": "InteractionPlugin", "parent": "file:plugins/InteractionPlugin.ts" }, { "attrs": { "bytes": 1021, "closure": [ "plugins/InteractionPlugin.ts" ], "file": "plugins/InteractionPlugin.ts", "local": "PluginContext", "packages": {}, "tokens": [] }, "id": "export:PluginContext", "kind": "type", "label": "PluginContext", "parent": "file:plugins/InteractionPlugin.ts" }, { "attrs": { "bytes": 3117, "closure": [ "plugins/BBoxDrawPlugin.ts", "plugins/InteractionPlugin.ts" ], "file": "plugins/BBoxDrawPlugin.ts", "local": "BBoxDrawPlugin", "packages": {}, "tokens": [] }, "id": "export:BBoxDrawPlugin", "kind": "export", "label": "BBoxDrawPlugin", "parent": "file:plugins/BBoxDrawPlugin.ts" }, { "attrs": { "bytes": 3117, "closure": [ "plugins/BBoxDrawPlugin.ts", "plugins/InteractionPlugin.ts" ], "file": "plugins/BBoxDrawPlugin.ts", "local": "BBoxResult", "packages": {}, "tokens": [] }, "id": "export:BBoxResult", "kind": "type", "label": "BBoxResult", "parent": "file:plugins/BBoxDrawPlugin.ts" }, { "attrs": { "bytes": 3117, "closure": [ "plugins/BBoxDrawPlugin.ts", "plugins/InteractionPlugin.ts" ], "file": "plugins/BBoxDrawPlugin.ts", "local": "BBoxCallback", "packages": {}, "tokens": [] }, "id": "export:BBoxCallback", "kind": "type", "label": "BBoxCallback", "parent": "file:plugins/BBoxDrawPlugin.ts" }, { "attrs": { "bytes": 2577, "closure": [ "plugins/CrosshairPlugin.ts", "plugins/InteractionPlugin.ts" ], "file": "plugins/CrosshairPlugin.ts", "local": "CrosshairPlugin", "packages": {}, "tokens": [] }, "id": "export:CrosshairPlugin", "kind": "export", "label": "CrosshairPlugin", "parent": "file:plugins/CrosshairPlugin.ts" }, { "attrs": { "bytes": 2577, "closure": [ "plugins/CrosshairPlugin.ts", "plugins/InteractionPlugin.ts" ], "file": "plugins/CrosshairPlugin.ts", "local": "CrosshairCallback", "packages": {}, "tokens": [] }, "id": "export:CrosshairCallback", "kind": "type", "label": "CrosshairCallback", "parent": "file:plugins/CrosshairPlugin.ts" }, { "attrs": { "version": "^1.48.2" }, "id": "package:@vue-flow/core", "kind": "package", "label": "@vue-flow/core", "parent": null }, { "attrs": { "version": "^1.6" }, "id": "package:uplot", "kind": "package", "label": "uplot", "parent": null }, { "attrs": { "version": "^3.5" }, "id": "package:vue", "kind": "package", "label": "vue", "parent": null }, { "attrs": { "library": "#2e2e38", "theme": "#2e2e38" }, "id": "token:--border", "kind": "token", "label": "--border", "parent": null }, { "attrs": { "library": "#3ecf8e", "theme": "#3ecf8e" }, "id": "token:--conf-high", "kind": "token", "label": "--conf-high", "parent": null }, { "attrs": { "library": "#f06565", "theme": "#f06565" }, "id": "token:--conf-low", "kind": "token", "label": "--conf-low", "parent": null }, { "attrs": { "library": "#f5a623", "theme": "#f5a623" }, "id": "token:--conf-mid", "kind": "token", "label": "--conf-mid", "parent": null }, { "attrs": { "library": "'JetBrains Mono', 'Fira Code', monospace", "theme": "\"JetBrains Mono\", \"Cascadia Mono\", Consolas, monospace" }, "id": "token:--font-mono", "kind": "token", "label": "--font-mono", "parent": null }, { "attrs": { "library": "13px", "theme": "13px" }, "id": "token:--font-size-base", "kind": "token", "label": "--font-size-base", "parent": null }, { "attrs": { "library": "15px", "theme": "15px" }, "id": "token:--font-size-lg", "kind": "token", "label": "--font-size-lg", "parent": null }, { "attrs": { "library": "11px", "theme": "11px" }, "id": "token:--font-size-sm", "kind": "token", "label": "--font-size-sm", "parent": null }, { "attrs": { "library": "'Inter', system-ui, sans-serif", "theme": "Inter, \"Segoe UI\", system-ui, -apple-system, Arial, sans-serif" }, "id": "token:--font-ui", "kind": "token", "label": "--font-ui", "parent": null }, { "attrs": { "library": "1px solid #2e2e38", "theme": "1px solid #2e2e38" }, "id": "token:--panel-border", "kind": "token", "label": "--panel-border", "parent": null }, { "attrs": { "library": "36px", "theme": "36px" }, "id": "token:--panel-header-height", "kind": "token", "label": "--panel-header-height", "parent": null }, { "attrs": { "library": "6px", "theme": "6px" }, "id": "token:--panel-radius", "kind": "token", "label": "--panel-radius", "parent": null }, { "attrs": { "library": "4px", "theme": "4px" }, "id": "token:--space-1", "kind": "token", "label": "--space-1", "parent": null }, { "attrs": { "library": "8px", "theme": "8px" }, "id": "token:--space-2", "kind": "token", "label": "--space-2", "parent": null }, { "attrs": { "library": "12px", "theme": "12px" }, "id": "token:--space-3", "kind": "token", "label": "--space-3", "parent": null }, { "attrs": { "library": "16px", "theme": "16px" }, "id": "token:--space-4", "kind": "token", "label": "--space-4", "parent": null }, { "attrs": { "library": "24px", "theme": "24px" }, "id": "token:--space-6", "kind": "token", "label": "--space-6", "parent": null }, { "attrs": { "library": "32px", "theme": "32px" }, "id": "token:--space-8", "kind": "token", "label": "--space-8", "parent": null }, { "attrs": { "library": "#f06565", "theme": "#f06565" }, "id": "token:--status-error", "kind": "token", "label": "--status-error", "parent": null }, { "attrs": { "library": "#f5a623", "theme": "#f5a623" }, "id": "token:--status-escalating", "kind": "token", "label": "--status-escalating", "parent": null }, { "attrs": { "library": "#555568", "theme": "#555568" }, "id": "token:--status-idle", "kind": "token", "label": "--status-idle", "parent": null }, { "attrs": { "library": "#3ecf8e", "theme": "#3ecf8e" }, "id": "token:--status-live", "kind": "token", "label": "--status-live", "parent": null }, { "attrs": { "library": "#4f9cf9", "theme": "#4f9cf9" }, "id": "token:--status-processing", "kind": "token", "label": "--status-processing", "parent": null }, { "attrs": { "library": "#0d0d0f", "theme": "#0d0d0f" }, "id": "token:--surface-0", "kind": "token", "label": "--surface-0", "parent": null }, { "attrs": { "library": "#16161a", "theme": "#16161a" }, "id": "token:--surface-1", "kind": "token", "label": "--surface-1", "parent": null }, { "attrs": { "library": "#1e1e24", "theme": "#1e1e24" }, "id": "token:--surface-2", "kind": "token", "label": "--surface-2", "parent": null }, { "attrs": { "library": "#26262f", "theme": "#2e2e38" }, "id": "token:--surface-3", "kind": "token", "label": "--surface-3", "parent": null }, { "attrs": { "library": "#555568", "theme": "#555568" }, "id": "token:--text-dim", "kind": "token", "label": "--text-dim", "parent": null }, { "attrs": { "library": "#e8e8f0", "theme": "#e8e8f0" }, "id": "token:--text-primary", "kind": "token", "label": "--text-primary", "parent": null }, { "attrs": { "library": "#8888a0", "theme": "#8888a0" }, "id": "token:--text-secondary", "kind": "token", "label": "--text-secondary", "parent": null }, { "attrs": { "path": "common/theme/parts/base" }, "id": "part:base", "kind": "part", "label": "base", "parent": null }, { "attrs": { "path": "common/theme/parts/maximize" }, "id": "part:maximize", "kind": "part", "label": "maximize", "parent": null }, { "attrs": { "path": "common/theme/parts/panel" }, "id": "part:panel", "kind": "part", "label": "panel", "parent": null }, { "attrs": { "path": "common/theme/parts/params" }, "id": "part:params", "kind": "part", "label": "params", "parent": null }, { "attrs": { "path": "common/theme/parts/split" }, "id": "part:split", "kind": "part", "label": "split", "parent": null }, { "attrs": { "path": "common/theme/parts/feed" }, "id": "part:feed", "kind": "part", "label": "feed", "parent": null } ] }