@xenosystem/blocks 0.13.26 → 0.13.28

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.
@@ -827,7 +827,7 @@ declare function layersViewState(c: LayersPanelController): LayersViewState;
827
827
  /** Apply a `ui` intent to the controller — the runtime's half of the contract. */
828
828
  declare function applyLayersUi(c: LayersPanelController, intent: LayersUiIntent): void;
829
829
  declare const layersViewManifest: PanelManifest;
830
- declare const BEHAVIOURS$8: {
830
+ declare const BEHAVIOURS$9: {
831
831
  'edit/layersPanelView': (inputs: Record<string, unknown>) => LayersViewState;
832
832
  };
833
833
  declare const LAYERS_DECLARATION: BlockDeclaration;
@@ -1723,7 +1723,7 @@ declare function inspectorViewState(c: InspectorPanelController): InspectorViewS
1723
1723
  /** Apply a `ui` intent to the controller — the runtime's half of the contract. */
1724
1724
  declare function applyInspectorUi(c: InspectorPanelController, intent: InspectorUiIntent): void;
1725
1725
  declare const inspectorViewManifest: PanelManifest;
1726
- declare const BEHAVIOURS$7: {
1726
+ declare const BEHAVIOURS$8: {
1727
1727
  'edit/inspectorPanelView': (inputs: Record<string, unknown>) => InspectorViewState;
1728
1728
  };
1729
1729
  declare const INSPECTOR_DECLARATION: BlockDeclaration;
@@ -2334,7 +2334,7 @@ declare function historyViewState(c: HistoryPanelController): HistoryViewState;
2334
2334
  /** Apply a `ui` intent to the controller — the runtime's half of the contract. */
2335
2335
  declare function applyHistoryUi(c: HistoryPanelController, intent: HistoryUiIntent): void;
2336
2336
  declare const historyViewManifest: PanelManifest;
2337
- declare const BEHAVIOURS$6: {
2337
+ declare const BEHAVIOURS$7: {
2338
2338
  'edit/historyPanelView': (inputs: Record<string, unknown>) => HistoryViewState;
2339
2339
  };
2340
2340
  declare const HISTORY_DECLARATION: BlockDeclaration;
@@ -2896,7 +2896,7 @@ declare function colorViewState(c: ColorPanelController): ColorViewState;
2896
2896
  /** Apply a `ui` intent to the controller — the runtime's half of the contract. */
2897
2897
  declare function applyColorUi(c: ColorPanelController, intent: ColorUiIntent): void;
2898
2898
  declare const colorViewManifest: PanelManifest;
2899
- declare const BEHAVIOURS$5: {
2899
+ declare const BEHAVIOURS$6: {
2900
2900
  'edit/colorPanelView': (inputs: Record<string, unknown>) => ColorViewState;
2901
2901
  };
2902
2902
  declare const COLOR_DECLARATION: BlockDeclaration;
@@ -3956,7 +3956,7 @@ declare function curveViewState(c: CurveController, options?: CurveViewOptions):
3956
3956
  /** Apply a `ui` intent to the controller — the runtime's half of the contract. */
3957
3957
  declare function applyCurveUi(c: CurveController, intent: CurveUiIntent): void;
3958
3958
  declare const curveViewManifest: PanelManifest;
3959
- declare const BEHAVIOURS$4: {
3959
+ declare const BEHAVIOURS$5: {
3960
3960
  'edit/curvePanelView': (inputs: Record<string, unknown>) => CurveViewModel;
3961
3961
  };
3962
3962
  declare const CURVE_DECLARATION: BlockDeclaration;
@@ -4373,26 +4373,69 @@ declare const VIEWPORT_PANEL_ID = "xeno.core.viewport";
4373
4373
  declare const viewportManifest: PanelManifest;
4374
4374
 
4375
4375
  /**
4376
- * The Viewport panel view.
4376
+ * The Viewport panel AS A DECLARATION — the twenty-fourth block written the §8d way, the third
4377
+ * DRAWN surface — and the one where the surface IS the panel: a canvas the host's renderer client
4378
+ * draws into, nine overlay slots the host fills with whatever it likes, an element-scoped pointer
4379
+ * and keyboard model. The chrome that is data sits OVER it: the stats readout (`chrome/Overlay`
4380
+ * at the bottom, a `StatusBar` of fps and surface size) and the lost-context notice (a scrimmed
4381
+ * `Overlay` with an error badge). Both are children of the runtime unit (`viewport/Surface`), which
4382
+ * is positioned so they can be.
4377
4383
  *
4378
- * **Where primitives fit and where they do not.** The stats readout uses `Badge`/`StatusBar`, but
4379
- * the body of this panel is a canvas and nine positioned slots — there is no primitive for "a
4380
- * drawing surface with overlay anchors", and inventing one would be a primitive with exactly one
4381
- * consumer. The slot geometry is therefore local, and deliberately so.
4384
+ * Presentation contract: input `view` (a {@link ViewportViewModel}). There is no `ui` output — every
4385
+ * pointer and key reaches the controller through the surface, and the readouts have no controls.
4386
+ */
4387
+
4388
+ /** The half of a renderer's config the view reads. */
4389
+ interface ViewportViewOptions {
4390
+ showStats?: boolean;
4391
+ background?: string;
4392
+ }
4393
+ interface ViewportViewModel {
4394
+ contextLost: boolean;
4395
+ statsShown: boolean;
4396
+ fpsLabel?: string;
4397
+ surfaceLabel?: string;
4398
+ }
4399
+ /** Derive the view model from the live controller — the runtime calls this on every draw. */
4400
+ declare function viewportViewState(c: ViewportController, options?: ViewportViewOptions): ViewportViewModel;
4401
+ declare const viewportViewManifest: PanelManifest;
4402
+ declare const BEHAVIOURS$4: {
4403
+ 'edit/viewportPanelView': (inputs: Record<string, unknown>) => ViewportViewModel;
4404
+ };
4405
+ declare const VIEWPORT_DECLARATION: BlockDeclaration;
4406
+
4407
+ /**
4408
+ * The Viewport panel view — the CODE VIEW of `VIEWPORT_DECLARATION`, drawing the same
4409
+ * {@link ViewportViewModel} byte-identical (the equivalence suite holds the two together). The one
4410
+ * runtime-bound unit is the SURFACE (`viewport/Surface`) — and here the surface is the panel: a
4411
+ * canvas the host's renderer client draws into, nine overlay slots the host fills, the element-scoped
4412
+ * pointer and keyboard model. The stats readout and the lost-context notice are `Overlay`s over it.
4382
4413
  *
4383
4414
  * @module
4384
4415
  */
4385
4416
 
4386
4417
  /** Props for {@link ViewportPanelView}. */
4387
- interface ViewportPanelViewProps {
4418
+ interface ViewportPanelViewProps extends ViewportViewOptions {
4388
4419
  controller: ViewportController;
4389
4420
  /** Overlay widgets, keyed by slot. Opaque to the panel — the host renders whatever it likes. */
4390
4421
  overlays?: Partial<Record<XenoViewportSlot, ReactNode>>;
4391
- showStats?: boolean;
4392
- background?: string;
4393
4422
  }
4394
4423
  /** The Viewport panel view. */
4395
- declare function ViewportPanelView({ controller, overlays, showStats, background, }: ViewportPanelViewProps): ReactNode;
4424
+ declare function ViewportPanelView({ controller, overlays, ...options }: ViewportPanelViewProps): ReactNode;
4425
+ /**
4426
+ * The surface — `viewport/Surface` in the declaration, bound to the controller: the canvas the
4427
+ * client draws into, the host's overlays in their slots, and the element-scoped input model.
4428
+ */
4429
+ declare function ViewportSurface({ controller, overlays, background, children }: {
4430
+ controller: ViewportController;
4431
+ overlays?: Partial<Record<XenoViewportSlot, ReactNode>>;
4432
+ background?: string;
4433
+ children?: ReactNode;
4434
+ }): ReactNode;
4435
+ /** The unit names the runtime supplies for this block — what a host's registry check must accept beside the shared families. */
4436
+ declare const VIEWPORT_RUNTIME_UNITS: readonly ["viewport/Surface"];
4437
+ /** The units the runtime registers for `VIEWPORT_DECLARATION`, bound to ITS controller and the host's overlays. */
4438
+ declare function viewportRuntimeComponents(controller: ViewportController, overlays?: Partial<Record<XenoViewportSlot, ReactNode>>, background?: string): Record<(typeof VIEWPORT_RUNTIME_UNITS)[number], React.ComponentType<any>>;
4396
4439
 
4397
4440
  /**
4398
4441
  * The Find contract.
@@ -7507,4 +7550,4 @@ declare function TreeIcon({ name, size }: {
7507
7550
  size?: number;
7508
7551
  }): ReactNode;
7509
7552
 
7510
- export { type BlendModeGroup, type BlendModeOption, type Box, BEHAVIOURS$5 as COLOR_BEHAVIOURS, COLOR_DECLARATION, COLOR_RUNTIME_UNITS, COLOR_SPACES, BEHAVIOURS$2 as COMMENTS_BEHAVIOURS, COMMENTS_DECLARATION, COMMENTS_PANEL_ID, COMMENTS_RUNTIME_UNITS, BEHAVIOURS$4 as CURVE_BEHAVIOURS, CURVE_DECLARATION, CURVE_PANEL_ID, CURVE_RUNTIME_UNITS, type ChannelId, ColorPanelController, type ColorPanelControllerOptions, type ColorPanelSerialized, ColorPanelView, type ColorPanelViewProps, type ColorSpace, type ColorStopSink, type ColorToken, type ColorUiIntent, type ColorViewState, CommentsController, type CommentsControllerOptions, type CommentsHostBridge, type CommentsPanelState, CommentsPanelView, type CommentsPanelViewProps, type CommentsRenderContext, type CommentsThreadView, type CommentsUiIntent, type CommentsViewMessage, type CommentsViewModel, type CommentsViewOptions, type CommentsViewReaction, type CommentsViewState, type CommentsViewThread, type ConnectRules, type ConnectVerdict, type CreateColorPanelOptions, type CreateCommentsPanelOptions, type CreateCurvePanelOptions, type CreateFindPanelOptions, type CreateHistoryPanelOptions, type CreateInspectorPanelOptions, type CreateLayersPanelOptions, type CreateNodeGraphPanelOptions, type CreateTreePanelOptions, type CreateViewportPanelOptions, CurveController, type CurveControllerOptions, type CurveDragKind, type CurveDragState, type CurveHostBridge, type CurvePanelState, CurvePanelView, type CurvePanelViewProps, type CurvePreview, type CurveRenderConfig, type CurveRenderContext, CurveSurface, type CurveUiIntent, type CurveViewModel, type CurveViewOptions, type CurveViewState, DEFAULT_BLEND_MODES, DEFAULT_CURVE_ZOOM, DEFAULT_GRAPH_ZOOM, DEFAULT_ICON_MAP, DEFAULT_ORIGINAL_LABEL, type DropInput, EASING_PRESETS, EDIT_SPACES, EMPTY_HISTORY, EMPTY_SCHEMA, EMPTY_TREE, EMPTY_TREE_SOURCE, BEHAVIOURS$3 as FIND_BEHAVIOURS, FIND_DECLARATION, FIND_PANEL_ID, FIND_RUNTIME_UNITS, FindController, type FindControllerOptions, type FindHostBridge, FindKeys, type FindPanelState, FindPanelView, type FindPanelViewProps, type FindRenderContext, type FindUiIntent, type FindViewGroup, type FindViewModel, type FindViewOptions, type FindViewRow, type FindViewState, type FlatRow, type FlattenOptions, GENERIC_ICON, GraphController, type GraphControllerOptions, type GraphDragKind, type GraphDragState, type GraphHostBridge, type GraphPanelState, type GraphPreview, type GraphRenderConfig, type GraphRenderContext, type GraphViewState, BEHAVIOURS$6 as HISTORY_BEHAVIOURS, HISTORY_DECLARATION, HISTORY_RUNTIME_UNITS, type HistoryKeyEvent, HistoryPanelController, type HistoryPanelControllerOptions, type HistoryPanelSerialized, HistoryPanelView, type HistoryPanelViewProps, type ProjectOptions as HistoryProjectOptions, type HistoryRow, type HistoryUiIntent, type HistoryViewRow, type HistoryViewState, type Hsl, type Hsv, IMPLEMENTED_TREE_MODES, BEHAVIOURS$7 as INSPECTOR_BEHAVIOURS, INSPECTOR_DECLARATION, INSPECTOR_RUNTIME_UNITS, type InspectorKeyEvent, InspectorPanelController, type InspectorPanelControllerOptions, type InspectorPanelSerialized, InspectorPanelView, type InspectorPanelViewProps, type ProjectOptions$1 as InspectorProjectOptions, type InspectorUiIntent, type InspectorViewField, type InspectorViewSection, type InspectorViewState, BEHAVIOURS$8 as LAYERS_BEHAVIOURS, LAYERS_DECLARATION, LAYERS_RUNTIME_UNITS, LAYER_COLUMNS, type LayerColumn, type LayersKeyEvent, LayersPanelController, type LayersPanelControllerOptions, type LayersPanelSerialized, LayersPanelView, type LayersPanelViewProps, type LayersUiIntent, type LayersViewRow, type LayersViewState, MIXED, BEHAVIOURS$1 as NODEGRAPH_BEHAVIOURS, NODEGRAPH_DECLARATION, NODEGRAPH_PANEL_ID, NODEGRAPH_RUNTIME_UNITS, NodeGraphPanelView, type NodeGraphPanelViewProps, NodeGraphSurface, type NodeGraphUiIntent, type NodeGraphViewModel, type NodeGraphViewOptions, type NumericConstraints, type OklchDisplay, type ParseResult, type ProjectedSection, type Rgba, SPACE_LABEL, type ScrubOptions, type SelectMods, BEHAVIOURS as TREE_BEHAVIOURS, TREE_DECLARATION, TREE_PANEL_ID, TREE_RUNTIME_UNITS, type TangentEdit, Thumbnail, type ThumbnailProps, TreeController, type TreeControllerOptions, type TreeHostBridge, TreeIcon, type TreeKeyEvent, type TreePanelState, TreePanelView, type TreePanelViewProps, type TreeRenderContext, type TreeRow, TreeScroller, type TreeUiIntent, type TreeViewAction, type TreeViewModel, type TreeViewOptions, type TreeViewRow, type TreeViewState, VIEWPORT_PANEL_ID, VIEWPORT_SLOTS, VIEW_STATE_OPS, ViewportController, type ViewportControllerOptions, type ViewportHostBridge, type ViewportPanelState, ViewportPanelView, type ViewportPanelViewProps, type ViewportRenderContext, type ViewportViewState, type XenoAddMenuItem, type XenoAnchorState, type XenoColorValue, type XenoCommentAuthor, type XenoCommentFilter, type XenoCommentMessage, type XenoCommentOp, type XenoCommentReaction, type XenoCommentSort, type XenoCommentThread, type XenoCommitPolicy, type XenoContextMenuRequest, type XenoCurveChannel, type XenoCurveInterpolation, type XenoCurveKey, type XenoCurveKeyRef, type XenoCurveOp, type XenoCurvePoint, XenoCurveScale, type XenoCurveScaleGeometry, type XenoCurveScaleState, type XenoCurveSelection, type XenoCurveSet, type XenoCurveViewport, type XenoCurveZoom, type XenoEasingPreset, type XenoEdge, type XenoFieldAnim, type XenoFieldFocus, type XenoFieldOption, type XenoFieldToken, type XenoFieldType, type XenoFieldValue, type XenoFindMatch, type XenoFindNavigate, type XenoFindOptions, type XenoFindQuery, type XenoFindReplace, type XenoFindResults, type XenoFindStatus, type XenoGradient, type XenoGraph, type XenoGraphOp, XenoGraphScale, type XenoGraphScaleGeometry, type XenoGraphScaleState, type XenoGraphSelection, type XenoGraphViewport, type XenoGraphZoom, type XenoHistoryEntry, type XenoHistoryIntent, type XenoHistoryMemory, type XenoHistoryOrder, type XenoHistoryScope, type XenoHistorySnapshot, type XenoHistorySource, type XenoHistoryState, type XenoHistoryStatus, type XenoInspectorEdit, type XenoInspectorField, type XenoInspectorSchema, type XenoInspectorSection, type XenoInspectorTarget, type XenoInspectorToken, type XenoKeyframeKind, type XenoLayerAdornment, type XenoLayerCap, type XenoLayerKind, type XenoLayerNode, type XenoLayerOp, type XenoLayerTree, type XenoNavigateRequest, type XenoNode, XenoNodeIndex, type XenoPort, type XenoPortDirection, type XenoPortRef, type XenoSectionAction, type XenoTangent, type XenoTangentMode, type XenoTangentSide, type XenoThreadActivate, type XenoThumbnailRequest, type XenoThumbnailResponse, type XenoTreeAction, type XenoTreeBadge, type XenoTreeCaps, type XenoTreeChildState, type XenoTreeChildrenResponse, type XenoTreeError, type XenoTreeGlyph, type XenoTreeIcon, type XenoTreeInvalidate, type XenoTreeMode, type XenoTreeModifiers, type XenoTreeNode, type XenoTreeNodeKind, type XenoTreeOp, type XenoTreeReveal, type XenoTreeSource, type XenoTreeSourceKind, type XenoTreeSourceState, type XenoViewportClient, type XenoViewportKey, type XenoViewportPointer, type XenoViewportSlot, type XenoViewportStats, type XenoViewportSurface, allFields, allIds, anchorStateOf, appliedCount, applyColorUi, applyCommentsUi, applyCurveUi, applyFindUi, applyHistoryUi, applyInspectorUi, applyLayersUi, applyNodeGraphUi, applyPrecision, applyTangentDrag, applyTreeUi, ariaSliderProps, boxesIntersect, canConnect, canRedo, canUndo, childStateOf, clamp, clampAlpha, clampTangent, collectDescendants, colorManifest, colorPanel, colorRuntimeComponents, colorViewManifest, colorViewState, commentsManifest, commentsPanel, commentsViewManifest, commentsViewState, commitPolicyOf, componentsForSpace, computeSurfaceSize, constraintsOf, countIsMeaningful, createColorPanel, createCommentsPanel, createCurvePanel, createFindPanel, createHistoryPanel, createInspectorPanel, createLayersPanel, createNodeGraphPanel, createTreePanel, createViewportPanel, createsCycle, currentRowIndex, curveManifest, curvePanel, curveRuntimeComponents, curveViewManifest, curveViewState, defaultIconFor, displayOrder, distanceToEdge, easeAt, easingPreset, edgeBounds, edgeKey, edgePath, edgesToReplace, edgesTouching, evaluateChannel, fieldMatches, findField, findManifest, findPanel, findPort, findRuntimeComponents, findSectionOf, findViewManifest, findViewState, fitToBounds, fitValueRange, flattenVisible, focusOrder, formatAge, formatNumeric, getAncestors, graphBounds, groupMatches, hasCap, hasDraggableTangents, hasTreeCap, hexFromHsv, highlightSegments, historyManifest, historyPanel, historyRuntimeComponents, historyViewManifest, historyViewState, hslToRgb, hsvFromHex, hsvToRgb, inspectorManifest, inspectorPanel, inspectorRuntimeComponents, inspectorViewManifest, inspectorViewState, interpolateSegment, isAncestorOf, isAnimated, isCollapsed, isColorSpace, isContainer, isEmptyContainer, isFieldEditable, isFieldMixed, isJumpable, isKeyEditable, isLayerColumn, isMixedValue, isOrphaned, isTreeContainer, isValidHex, isViewStateOp, keyRefId, layersManifest, layersPanel, layersRuntimeComponents, layersViewManifest, layersViewState, liveEdges, makeColorValue, matchesFilter, messagesOf, mirrorTangent, nodeBounds, nodegraphManifest, nodegraphPanel, nodegraphRuntimeComponents, nodegraphViewManifest, nodegraphViewState, normalizeColorInput, normalizeHistoryState, normalizeKindKey, normalizeNumeric, normalizeRanges, normalizeSchema, normalizeTree, nudgeValue, oklchToRgb, parseCssColor, parseHexColor, parseNumeric, passesFilter, patternError, portHasRoom, portRefId, positionToValue, projectRows, projectSections, rangeBetween, resolveDropTarget, resolveIconName, rgbToHex, rgbToHsl, rgbToHsv, rgbToOklch, rgbaToCssHex, roundRgb, rowIndexOf, rowIndexOfEntry, safeAddColorStop, safeAddColorStops, sameKey, sampleChannel, scrubValue, segmentsAround, solveBezierT, sortThreads, surfaceChanged, tangentsForMode, tangentsToControlPoints, toViewportCoords, totalCount, treeManifest, treePanel, treeRuntimeComponents, treeViewManifest, treeViewState, usesLogScale, valueExtent, valueToPosition, valuesEqual, viewportManifest, viewportPanel, visibleEdges, walkTree, wheelZoomFactor, zoomAboutCursor, zoomTimeAboutCursor, zoomValueAboutCursor };
7553
+ export { type BlendModeGroup, type BlendModeOption, type Box, BEHAVIOURS$6 as COLOR_BEHAVIOURS, COLOR_DECLARATION, COLOR_RUNTIME_UNITS, COLOR_SPACES, BEHAVIOURS$2 as COMMENTS_BEHAVIOURS, COMMENTS_DECLARATION, COMMENTS_PANEL_ID, COMMENTS_RUNTIME_UNITS, BEHAVIOURS$5 as CURVE_BEHAVIOURS, CURVE_DECLARATION, CURVE_PANEL_ID, CURVE_RUNTIME_UNITS, type ChannelId, ColorPanelController, type ColorPanelControllerOptions, type ColorPanelSerialized, ColorPanelView, type ColorPanelViewProps, type ColorSpace, type ColorStopSink, type ColorToken, type ColorUiIntent, type ColorViewState, CommentsController, type CommentsControllerOptions, type CommentsHostBridge, type CommentsPanelState, CommentsPanelView, type CommentsPanelViewProps, type CommentsRenderContext, type CommentsThreadView, type CommentsUiIntent, type CommentsViewMessage, type CommentsViewModel, type CommentsViewOptions, type CommentsViewReaction, type CommentsViewState, type CommentsViewThread, type ConnectRules, type ConnectVerdict, type CreateColorPanelOptions, type CreateCommentsPanelOptions, type CreateCurvePanelOptions, type CreateFindPanelOptions, type CreateHistoryPanelOptions, type CreateInspectorPanelOptions, type CreateLayersPanelOptions, type CreateNodeGraphPanelOptions, type CreateTreePanelOptions, type CreateViewportPanelOptions, CurveController, type CurveControllerOptions, type CurveDragKind, type CurveDragState, type CurveHostBridge, type CurvePanelState, CurvePanelView, type CurvePanelViewProps, type CurvePreview, type CurveRenderConfig, type CurveRenderContext, CurveSurface, type CurveUiIntent, type CurveViewModel, type CurveViewOptions, type CurveViewState, DEFAULT_BLEND_MODES, DEFAULT_CURVE_ZOOM, DEFAULT_GRAPH_ZOOM, DEFAULT_ICON_MAP, DEFAULT_ORIGINAL_LABEL, type DropInput, EASING_PRESETS, EDIT_SPACES, EMPTY_HISTORY, EMPTY_SCHEMA, EMPTY_TREE, EMPTY_TREE_SOURCE, BEHAVIOURS$3 as FIND_BEHAVIOURS, FIND_DECLARATION, FIND_PANEL_ID, FIND_RUNTIME_UNITS, FindController, type FindControllerOptions, type FindHostBridge, FindKeys, type FindPanelState, FindPanelView, type FindPanelViewProps, type FindRenderContext, type FindUiIntent, type FindViewGroup, type FindViewModel, type FindViewOptions, type FindViewRow, type FindViewState, type FlatRow, type FlattenOptions, GENERIC_ICON, GraphController, type GraphControllerOptions, type GraphDragKind, type GraphDragState, type GraphHostBridge, type GraphPanelState, type GraphPreview, type GraphRenderConfig, type GraphRenderContext, type GraphViewState, BEHAVIOURS$7 as HISTORY_BEHAVIOURS, HISTORY_DECLARATION, HISTORY_RUNTIME_UNITS, type HistoryKeyEvent, HistoryPanelController, type HistoryPanelControllerOptions, type HistoryPanelSerialized, HistoryPanelView, type HistoryPanelViewProps, type ProjectOptions as HistoryProjectOptions, type HistoryRow, type HistoryUiIntent, type HistoryViewRow, type HistoryViewState, type Hsl, type Hsv, IMPLEMENTED_TREE_MODES, BEHAVIOURS$8 as INSPECTOR_BEHAVIOURS, INSPECTOR_DECLARATION, INSPECTOR_RUNTIME_UNITS, type InspectorKeyEvent, InspectorPanelController, type InspectorPanelControllerOptions, type InspectorPanelSerialized, InspectorPanelView, type InspectorPanelViewProps, type ProjectOptions$1 as InspectorProjectOptions, type InspectorUiIntent, type InspectorViewField, type InspectorViewSection, type InspectorViewState, BEHAVIOURS$9 as LAYERS_BEHAVIOURS, LAYERS_DECLARATION, LAYERS_RUNTIME_UNITS, LAYER_COLUMNS, type LayerColumn, type LayersKeyEvent, LayersPanelController, type LayersPanelControllerOptions, type LayersPanelSerialized, LayersPanelView, type LayersPanelViewProps, type LayersUiIntent, type LayersViewRow, type LayersViewState, MIXED, BEHAVIOURS$1 as NODEGRAPH_BEHAVIOURS, NODEGRAPH_DECLARATION, NODEGRAPH_PANEL_ID, NODEGRAPH_RUNTIME_UNITS, NodeGraphPanelView, type NodeGraphPanelViewProps, NodeGraphSurface, type NodeGraphUiIntent, type NodeGraphViewModel, type NodeGraphViewOptions, type NumericConstraints, type OklchDisplay, type ParseResult, type ProjectedSection, type Rgba, SPACE_LABEL, type ScrubOptions, type SelectMods, BEHAVIOURS as TREE_BEHAVIOURS, TREE_DECLARATION, TREE_PANEL_ID, TREE_RUNTIME_UNITS, type TangentEdit, Thumbnail, type ThumbnailProps, TreeController, type TreeControllerOptions, type TreeHostBridge, TreeIcon, type TreeKeyEvent, type TreePanelState, TreePanelView, type TreePanelViewProps, type TreeRenderContext, type TreeRow, TreeScroller, type TreeUiIntent, type TreeViewAction, type TreeViewModel, type TreeViewOptions, type TreeViewRow, type TreeViewState, BEHAVIOURS$4 as VIEWPORT_BEHAVIOURS, VIEWPORT_DECLARATION, VIEWPORT_PANEL_ID, VIEWPORT_RUNTIME_UNITS, VIEWPORT_SLOTS, VIEW_STATE_OPS, ViewportController, type ViewportControllerOptions, type ViewportHostBridge, type ViewportPanelState, ViewportPanelView, type ViewportPanelViewProps, type ViewportRenderContext, ViewportSurface, type ViewportViewModel, type ViewportViewOptions, type ViewportViewState, type XenoAddMenuItem, type XenoAnchorState, type XenoColorValue, type XenoCommentAuthor, type XenoCommentFilter, type XenoCommentMessage, type XenoCommentOp, type XenoCommentReaction, type XenoCommentSort, type XenoCommentThread, type XenoCommitPolicy, type XenoContextMenuRequest, type XenoCurveChannel, type XenoCurveInterpolation, type XenoCurveKey, type XenoCurveKeyRef, type XenoCurveOp, type XenoCurvePoint, XenoCurveScale, type XenoCurveScaleGeometry, type XenoCurveScaleState, type XenoCurveSelection, type XenoCurveSet, type XenoCurveViewport, type XenoCurveZoom, type XenoEasingPreset, type XenoEdge, type XenoFieldAnim, type XenoFieldFocus, type XenoFieldOption, type XenoFieldToken, type XenoFieldType, type XenoFieldValue, type XenoFindMatch, type XenoFindNavigate, type XenoFindOptions, type XenoFindQuery, type XenoFindReplace, type XenoFindResults, type XenoFindStatus, type XenoGradient, type XenoGraph, type XenoGraphOp, XenoGraphScale, type XenoGraphScaleGeometry, type XenoGraphScaleState, type XenoGraphSelection, type XenoGraphViewport, type XenoGraphZoom, type XenoHistoryEntry, type XenoHistoryIntent, type XenoHistoryMemory, type XenoHistoryOrder, type XenoHistoryScope, type XenoHistorySnapshot, type XenoHistorySource, type XenoHistoryState, type XenoHistoryStatus, type XenoInspectorEdit, type XenoInspectorField, type XenoInspectorSchema, type XenoInspectorSection, type XenoInspectorTarget, type XenoInspectorToken, type XenoKeyframeKind, type XenoLayerAdornment, type XenoLayerCap, type XenoLayerKind, type XenoLayerNode, type XenoLayerOp, type XenoLayerTree, type XenoNavigateRequest, type XenoNode, XenoNodeIndex, type XenoPort, type XenoPortDirection, type XenoPortRef, type XenoSectionAction, type XenoTangent, type XenoTangentMode, type XenoTangentSide, type XenoThreadActivate, type XenoThumbnailRequest, type XenoThumbnailResponse, type XenoTreeAction, type XenoTreeBadge, type XenoTreeCaps, type XenoTreeChildState, type XenoTreeChildrenResponse, type XenoTreeError, type XenoTreeGlyph, type XenoTreeIcon, type XenoTreeInvalidate, type XenoTreeMode, type XenoTreeModifiers, type XenoTreeNode, type XenoTreeNodeKind, type XenoTreeOp, type XenoTreeReveal, type XenoTreeSource, type XenoTreeSourceKind, type XenoTreeSourceState, type XenoViewportClient, type XenoViewportKey, type XenoViewportPointer, type XenoViewportSlot, type XenoViewportStats, type XenoViewportSurface, allFields, allIds, anchorStateOf, appliedCount, applyColorUi, applyCommentsUi, applyCurveUi, applyFindUi, applyHistoryUi, applyInspectorUi, applyLayersUi, applyNodeGraphUi, applyPrecision, applyTangentDrag, applyTreeUi, ariaSliderProps, boxesIntersect, canConnect, canRedo, canUndo, childStateOf, clamp, clampAlpha, clampTangent, collectDescendants, colorManifest, colorPanel, colorRuntimeComponents, colorViewManifest, colorViewState, commentsManifest, commentsPanel, commentsViewManifest, commentsViewState, commitPolicyOf, componentsForSpace, computeSurfaceSize, constraintsOf, countIsMeaningful, createColorPanel, createCommentsPanel, createCurvePanel, createFindPanel, createHistoryPanel, createInspectorPanel, createLayersPanel, createNodeGraphPanel, createTreePanel, createViewportPanel, createsCycle, currentRowIndex, curveManifest, curvePanel, curveRuntimeComponents, curveViewManifest, curveViewState, defaultIconFor, displayOrder, distanceToEdge, easeAt, easingPreset, edgeBounds, edgeKey, edgePath, edgesToReplace, edgesTouching, evaluateChannel, fieldMatches, findField, findManifest, findPanel, findPort, findRuntimeComponents, findSectionOf, findViewManifest, findViewState, fitToBounds, fitValueRange, flattenVisible, focusOrder, formatAge, formatNumeric, getAncestors, graphBounds, groupMatches, hasCap, hasDraggableTangents, hasTreeCap, hexFromHsv, highlightSegments, historyManifest, historyPanel, historyRuntimeComponents, historyViewManifest, historyViewState, hslToRgb, hsvFromHex, hsvToRgb, inspectorManifest, inspectorPanel, inspectorRuntimeComponents, inspectorViewManifest, inspectorViewState, interpolateSegment, isAncestorOf, isAnimated, isCollapsed, isColorSpace, isContainer, isEmptyContainer, isFieldEditable, isFieldMixed, isJumpable, isKeyEditable, isLayerColumn, isMixedValue, isOrphaned, isTreeContainer, isValidHex, isViewStateOp, keyRefId, layersManifest, layersPanel, layersRuntimeComponents, layersViewManifest, layersViewState, liveEdges, makeColorValue, matchesFilter, messagesOf, mirrorTangent, nodeBounds, nodegraphManifest, nodegraphPanel, nodegraphRuntimeComponents, nodegraphViewManifest, nodegraphViewState, normalizeColorInput, normalizeHistoryState, normalizeKindKey, normalizeNumeric, normalizeRanges, normalizeSchema, normalizeTree, nudgeValue, oklchToRgb, parseCssColor, parseHexColor, parseNumeric, passesFilter, patternError, portHasRoom, portRefId, positionToValue, projectRows, projectSections, rangeBetween, resolveDropTarget, resolveIconName, rgbToHex, rgbToHsl, rgbToHsv, rgbToOklch, rgbaToCssHex, roundRgb, rowIndexOf, rowIndexOfEntry, safeAddColorStop, safeAddColorStops, sameKey, sampleChannel, scrubValue, segmentsAround, solveBezierT, sortThreads, surfaceChanged, tangentsForMode, tangentsToControlPoints, toViewportCoords, totalCount, treeManifest, treePanel, treeRuntimeComponents, treeViewManifest, treeViewState, usesLogScale, valueExtent, valueToPosition, valuesEqual, viewportManifest, viewportPanel, viewportRuntimeComponents, viewportViewManifest, viewportViewState, visibleEdges, walkTree, wheelZoomFactor, zoomAboutCursor, zoomTimeAboutCursor, zoomValueAboutCursor };
@@ -2023,8 +2023,8 @@ function constraintsOf(field) {
2023
2023
  scale: field.scale
2024
2024
  };
2025
2025
  }
2026
- function parseNumeric(text10) {
2027
- const trimmed = String(text10).trim();
2026
+ function parseNumeric(text11) {
2027
+ const trimmed = String(text11).trim();
2028
2028
  if (trimmed.length === 0) return { ok: false, reason: "empty" };
2029
2029
  const match = /^[+-]?(\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/.exec(trimmed);
2030
2030
  if (!match) return { ok: false, reason: "nan" };
@@ -2049,8 +2049,8 @@ function normalizeNumeric(value, c) {
2049
2049
  function formatNumeric(value, field) {
2050
2050
  if (!Number.isFinite(value)) return "";
2051
2051
  const precision = field.precision;
2052
- const text10 = typeof precision === "number" && Number.isFinite(precision) ? value.toFixed(Math.max(0, Math.floor(precision))) : String(value);
2053
- return field.unit ? `${text10}${field.unit}` : text10;
2052
+ const text11 = typeof precision === "number" && Number.isFinite(precision) ? value.toFixed(Math.max(0, Math.floor(precision))) : String(value);
2053
+ return field.unit ? `${text11}${field.unit}` : text11;
2054
2054
  }
2055
2055
  function usesLogScale(c) {
2056
2056
  return c.scale === "log" && typeof c.min === "number" && typeof c.max === "number" && c.min > 0 && c.max > c.min;
@@ -2384,44 +2384,44 @@ var InspectorPanelController = class {
2384
2384
  if (!field || !isFieldEditable(field)) return;
2385
2385
  const mixed = isFieldMixed(field);
2386
2386
  const value = this.getFieldValue(fieldId);
2387
- const text10 = mixed ? "" : field.type === "number" && typeof value === "number" ? formatNumeric(value, field) : value === void 0 || value === null ? "" : String(value);
2388
- this.drafts.set(fieldId, { text: text10, original: value });
2387
+ const text11 = mixed ? "" : field.type === "number" && typeof value === "number" ? formatNumeric(value, field) : value === void 0 || value === null ? "" : String(value);
2388
+ this.drafts.set(fieldId, { text: text11, original: value });
2389
2389
  this.focusedFieldId = fieldId;
2390
2390
  this.emitFieldFocus(fieldId);
2391
2391
  this.notify();
2392
2392
  }
2393
2393
  /** Update the draft text (typing). Emits nothing under the `blur` policy. */
2394
- setDraft(fieldId, text10) {
2394
+ setDraft(fieldId, text11) {
2395
2395
  const draft = this.drafts.get(fieldId);
2396
2396
  if (!draft) {
2397
- this.drafts.set(fieldId, { text: text10, original: this.getFieldValue(fieldId) });
2397
+ this.drafts.set(fieldId, { text: text11, original: this.getFieldValue(fieldId) });
2398
2398
  } else {
2399
- draft.text = text10;
2399
+ draft.text = text11;
2400
2400
  }
2401
2401
  const field = this.getField(fieldId);
2402
2402
  if (field && commitPolicyOf(field) === "live") {
2403
- const parsed = this.parseDraft(fieldId, text10);
2403
+ const parsed = this.parseDraft(fieldId, text11);
2404
2404
  if (parsed.ok) this.emitSet(fieldId, parsed.value);
2405
2405
  }
2406
2406
  this.notify();
2407
2407
  }
2408
2408
  /** Parse a draft string into a field-appropriate value. */
2409
- parseDraft(fieldId, text10) {
2409
+ parseDraft(fieldId, text11) {
2410
2410
  const field = this.getField(fieldId);
2411
2411
  if (!field) return { ok: false };
2412
2412
  if (field.type === "number") {
2413
- const parsed = parseNumeric(text10);
2413
+ const parsed = parseNumeric(text11);
2414
2414
  if (!parsed.ok) return { ok: false };
2415
2415
  return { ok: true, value: normalizeNumeric(parsed.value, constraintsOf(field)) };
2416
2416
  }
2417
2417
  if (field.type === "json") {
2418
2418
  try {
2419
- return { ok: true, value: JSON.parse(text10) };
2419
+ return { ok: true, value: JSON.parse(text11) };
2420
2420
  } catch {
2421
2421
  return { ok: false };
2422
2422
  }
2423
2423
  }
2424
- return { ok: true, value: text10 };
2424
+ return { ok: true, value: text11 };
2425
2425
  }
2426
2426
  /**
2427
2427
  * Commit the draft (Enter / blur). Invalid input reverts instead of committing garbage.
@@ -3347,7 +3347,7 @@ function NumberWidget({ field, controller, component }) {
3347
3347
  },
3348
3348
  [controller, editable, field.id, component]
3349
3349
  );
3350
- const text10 = component !== void 0 ? (() => {
3350
+ const text11 = component !== void 0 ? (() => {
3351
3351
  const raw = controller.getFieldValue(field.id);
3352
3352
  const v = Array.isArray(raw) ? raw[component] : void 0;
3353
3353
  return typeof v === "number" ? formatNumeric(v, field) : "";
@@ -3359,7 +3359,7 @@ function NumberWidget({ field, controller, component }) {
3359
3359
  Input2,
3360
3360
  {
3361
3361
  inputMode: "decimal",
3362
- value: text10,
3362
+ value: text11,
3363
3363
  placeholder: mixed ? controller.getMixedPlaceholder() : field.placeholder,
3364
3364
  mixed,
3365
3365
  readOnly: !editable,
@@ -8646,7 +8646,58 @@ var viewportManifest = {
8646
8646
 
8647
8647
  // src/edit/viewport/react/ViewportPanelView.tsx
8648
8648
  import { useEffect as useEffect6, useRef as useRef7, useSyncExternalStore as useSyncExternalStore6 } from "react";
8649
- import { Badge as Badge4, StatusBar as StatusBar4 } from "@xenosystem/components/chrome";
8649
+ import { Badge as Badge4, Overlay, StatusBar as StatusBar4 } from "@xenosystem/components/chrome";
8650
+
8651
+ // src/edit/viewport/declaration.ts
8652
+ function viewportViewState(c, options = {}) {
8653
+ const { showStats = true } = options;
8654
+ const state = c.getState();
8655
+ return {
8656
+ contextLost: state.contextLost,
8657
+ statsShown: showStats && state.stats !== null,
8658
+ fpsLabel: state.stats?.fps !== void 0 ? `${Math.round(state.stats.fps)} fps` : void 0,
8659
+ surfaceLabel: state.surface ? `${state.surface.cssWidth}\xD7${state.surface.cssHeight} @${state.surface.dpr}\xD7` : void 0
8660
+ };
8661
+ }
8662
+ var viewportViewManifest = {
8663
+ id: viewportManifest.id,
8664
+ version: "1.0.0",
8665
+ title: "Viewport",
8666
+ category: "edit",
8667
+ layout: { slot: "center" },
8668
+ inputs: [{ id: "view", type: "object", label: "View state", description: "The ViewportViewModel the runtime derives from the controller on every draw." }],
8669
+ outputs: [],
8670
+ commands: []
8671
+ };
8672
+ var EMPTY6 = { contextLost: false, statsShown: false };
8673
+ var BEHAVIOURS6 = {
8674
+ "edit/viewportPanelView": (inputs) => inputs.view ?? EMPTY6
8675
+ };
8676
+ var text6 = (b) => ({ component: "text", props: { text: b } });
8677
+ var VIEWPORT_DECLARATION = {
8678
+ format: "xeno.block@1",
8679
+ manifest: viewportViewManifest,
8680
+ behaviour: "edit/viewportPanelView",
8681
+ composition: {
8682
+ component: "viewport/Surface",
8683
+ children: [
8684
+ {
8685
+ component: "chrome/Overlay",
8686
+ when: { input: "view.contextLost" },
8687
+ props: { scrim: { value: true } },
8688
+ children: [{ component: "chrome/Badge", props: { tone: { value: "error" } }, children: [text6({ value: "graphics context lost \u2014 restoring" })] }]
8689
+ },
8690
+ {
8691
+ component: "chrome/Overlay",
8692
+ when: { input: "view.statsShown" },
8693
+ props: { anchor: { value: "bottom" } },
8694
+ children: [{ component: "chrome/StatusBar", props: { left: { input: "view.fpsLabel" }, right: { input: "view.surfaceLabel" } } }]
8695
+ }
8696
+ ]
8697
+ }
8698
+ };
8699
+
8700
+ // src/edit/viewport/react/ViewportPanelView.tsx
8650
8701
  import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
8651
8702
  var SLOT_STYLE = {
8652
8703
  "top-left": { top: 8, left: 8 },
@@ -8659,12 +8710,15 @@ var SLOT_STYLE = {
8659
8710
  "bottom-right": { bottom: 8, right: 8 },
8660
8711
  free: { inset: 0 }
8661
8712
  };
8662
- function ViewportPanelView({
8663
- controller,
8664
- overlays,
8665
- showStats = true,
8666
- background
8667
- }) {
8713
+ function ViewportPanelView({ controller, overlays, ...options }) {
8714
+ useSyncExternalStore6(controller.subscribe, controller.getState, controller.getState);
8715
+ const view = viewportViewState(controller, options);
8716
+ return /* @__PURE__ */ jsxs7(ViewportSurface, { controller, overlays, background: options.background, children: [
8717
+ view.contextLost ? /* @__PURE__ */ jsx8(Overlay, { scrim: true, children: /* @__PURE__ */ jsx8(Badge4, { tone: "error", children: "graphics context lost \u2014 restoring" }) }) : null,
8718
+ view.statsShown ? /* @__PURE__ */ jsx8(Overlay, { anchor: "bottom", children: /* @__PURE__ */ jsx8(StatusBar4, { left: view.fpsLabel, right: view.surfaceLabel }) }) : null
8719
+ ] });
8720
+ }
8721
+ function ViewportSurface({ controller, overlays, background, children }) {
8668
8722
  const state = useSyncExternalStore6(controller.subscribe, controller.getState, controller.getState);
8669
8723
  const canvasRef = useRef7(null);
8670
8724
  const containerRef = useRef7(null);
@@ -8680,6 +8734,8 @@ function ViewportPanelView({
8680
8734
  {
8681
8735
  ref: containerRef,
8682
8736
  tabIndex: 0,
8737
+ role: "application",
8738
+ "aria-label": "Viewport",
8683
8739
  onFocus: () => controller.setFocused(true),
8684
8740
  onBlur: () => controller.setFocused(false),
8685
8741
  onKeyDown: (event) => controller.routeKey("down", event.nativeEvent),
@@ -8743,33 +8799,15 @@ function ViewportPanelView({
8743
8799
  slot
8744
8800
  );
8745
8801
  }),
8746
- state.contextLost ? /* @__PURE__ */ jsx8(
8747
- "div",
8748
- {
8749
- style: {
8750
- position: "absolute",
8751
- inset: 0,
8752
- display: "flex",
8753
- alignItems: "center",
8754
- justifyContent: "center",
8755
- background: "var(--xeno-elevated)",
8756
- fontSize: 11,
8757
- zIndex: 20
8758
- },
8759
- children: /* @__PURE__ */ jsx8(Badge4, { tone: "error", children: "graphics context lost \u2014 restoring" })
8760
- }
8761
- ) : null,
8762
- showStats && state.stats ? /* @__PURE__ */ jsx8("div", { style: { position: "absolute", left: 0, right: 0, bottom: 0, zIndex: 10 }, children: /* @__PURE__ */ jsx8(
8763
- StatusBar4,
8764
- {
8765
- left: state.stats.fps !== void 0 ? `${Math.round(state.stats.fps)} fps` : void 0,
8766
- right: state.surface ? `${state.surface.cssWidth}\xD7${state.surface.cssHeight} @${state.surface.dpr}\xD7` : void 0
8767
- }
8768
- ) }) : null
8802
+ children
8769
8803
  ]
8770
8804
  }
8771
8805
  );
8772
8806
  }
8807
+ var VIEWPORT_RUNTIME_UNITS = ["viewport/Surface"];
8808
+ function viewportRuntimeComponents(controller, overlays, background) {
8809
+ return { "viewport/Surface": ({ children }) => /* @__PURE__ */ jsx8(ViewportSurface, { controller, overlays, background, children }) };
8810
+ }
8773
8811
 
8774
8812
  // src/edit/viewport/panel.ts
8775
8813
  function createViewportPanel(options = {}) {
@@ -9016,11 +9054,11 @@ var FindController = class {
9016
9054
  * @param text - The new query text.
9017
9055
  * @param immediate - Skip the debounce (a paste, or pressing Enter).
9018
9056
  */
9019
- setText(text10, immediate = false) {
9020
- if (text10 === this.text) return;
9021
- this.text = text10;
9057
+ setText(text11, immediate = false) {
9058
+ if (text11 === this.text) return;
9059
+ this.text = text11;
9022
9060
  this.index = -1;
9023
- if (text10 === "") {
9061
+ if (text11 === "") {
9024
9062
  this.clearResults("idle");
9025
9063
  this.emitQuery(true);
9026
9064
  return;
@@ -9048,8 +9086,8 @@ var FindController = class {
9048
9086
  this.notify();
9049
9087
  }
9050
9088
  /** The replacement text. Never emitted on its own — a replacement is not a search. */
9051
- setReplaceText(text10) {
9052
- this.replaceText = text10;
9089
+ setReplaceText(text11) {
9090
+ this.replaceText = text11;
9053
9091
  this.notify();
9054
9092
  }
9055
9093
  /** Show or hide the replace row. */
@@ -9523,7 +9561,7 @@ var findViewManifest = {
9523
9561
  outputs: [{ id: "ui", type: "object", label: "UI intent", description: "{ kind, value?, option?, matchId?, x?, y? } \u2014 applied by the runtime to the controller." }],
9524
9562
  commands: []
9525
9563
  };
9526
- var EMPTY6 = {
9564
+ var EMPTY7 = {
9527
9565
  text: "",
9528
9566
  hasText: false,
9529
9567
  placeholder: "Find",
@@ -9555,11 +9593,11 @@ var EMPTY6 = {
9555
9593
  rows: [],
9556
9594
  groups: []
9557
9595
  };
9558
- var BEHAVIOURS6 = {
9559
- "edit/findPanelView": (inputs) => inputs.view ?? EMPTY6
9596
+ var BEHAVIOURS7 = {
9597
+ "edit/findPanelView": (inputs) => inputs.view ?? EMPTY7
9560
9598
  };
9561
9599
  var FIND_RUNTIME_UNITS = ["find/Keys"];
9562
- var text6 = (b) => ({ component: "text", props: { text: b } });
9600
+ var text7 = (b) => ({ component: "text", props: { text: b } });
9563
9601
  var ui6 = (kind, fields = {}) => ({ emit: "ui", value: { object: { kind: { value: kind }, ...fields } } });
9564
9602
  var option = (option2, icon, label) => ({
9565
9603
  component: "chrome/IconButton",
@@ -9605,10 +9643,10 @@ var FIND_DECLARATION = {
9605
9643
  node: {
9606
9644
  component: "fragment",
9607
9645
  children: [
9608
- { component: "chrome/Badge", when: { input: "view.invalid" }, props: { tone: { value: "error" }, title: { input: "view.message" } }, children: [text6({ value: "invalid pattern" })] },
9609
- { component: "chrome/Badge", when: { input: "view.failed" }, props: { tone: { value: "error" }, title: { input: "view.message" } }, children: [text6({ value: "search failed" })] },
9610
- { component: "chrome/Badge", when: { input: "view.searchingBadge" }, children: [text6({ value: "searching\u2026" })] },
9611
- { component: "chrome/Text", when: { input: "view.countShown" }, props: { role: { value: "number" } }, children: [text6({ input: "view.counter" })] }
9646
+ { component: "chrome/Badge", when: { input: "view.invalid" }, props: { tone: { value: "error" }, title: { input: "view.message" } }, children: [text7({ value: "invalid pattern" })] },
9647
+ { component: "chrome/Badge", when: { input: "view.failed" }, props: { tone: { value: "error" }, title: { input: "view.message" } }, children: [text7({ value: "search failed" })] },
9648
+ { component: "chrome/Badge", when: { input: "view.searchingBadge" }, children: [text7({ value: "searching\u2026" })] },
9649
+ { component: "chrome/Text", when: { input: "view.countShown" }, props: { role: { value: "number" } }, children: [text7({ input: "view.counter" })] }
9612
9650
  ]
9613
9651
  }
9614
9652
  },
@@ -9619,13 +9657,13 @@ var FIND_DECLARATION = {
9619
9657
  children: [
9620
9658
  { component: "chrome/IconButton", props: { label: { value: "Previous match" }, disabled: { not: { input: "view.hasMatches" } }, icon: { node: { component: "icons/Chevron", props: { direction: { value: "up" }, size: { value: 12 } } } } }, on: { onClick: ui6("previous") } },
9621
9659
  { component: "chrome/IconButton", props: { label: { value: "Next match" }, disabled: { not: { input: "view.hasMatches" } }, icon: { node: { component: "icons/Chevron", props: { direction: { value: "down" }, size: { value: 12 } } } } }, on: { onClick: ui6("next") } },
9622
- { component: "chrome/TextButton", on: { onClick: ui6("toggleReplace") }, children: [text6({ input: "view.replaceLabel" })] }
9660
+ { component: "chrome/TextButton", on: { onClick: ui6("toggleReplace") }, children: [text7({ input: "view.replaceLabel" })] }
9623
9661
  ]
9624
9662
  }
9625
9663
  }
9626
9664
  }
9627
9665
  },
9628
- { component: "chrome/Text", when: { input: "view.invalid" }, props: { role: { value: "caption" }, className: { value: "xeno-find-message" } }, children: [text6({ input: "view.message" })] },
9666
+ { component: "chrome/Text", when: { input: "view.invalid" }, props: { role: { value: "caption" }, className: { value: "xeno-find-message" } }, children: [text7({ input: "view.message" })] },
9629
9667
  {
9630
9668
  component: "chrome/Toolbar",
9631
9669
  when: { input: "view.replaceVisible" },
@@ -9636,8 +9674,8 @@ var FIND_DECLARATION = {
9636
9674
  component: "chrome/ToolbarGroup",
9637
9675
  props: { end: { value: true } },
9638
9676
  children: [
9639
- { component: "chrome/TextButton", props: { disabled: { not: { input: "view.canReplace" } } }, on: { onClick: ui6("replaceCurrent") }, children: [text6({ value: "Replace" })] },
9640
- { component: "chrome/TextButton", props: { disabled: { not: { input: "view.canReplace" } } }, on: { onClick: ui6("replaceAll") }, children: [text6({ input: "view.allLabel" })] }
9677
+ { component: "chrome/TextButton", props: { disabled: { not: { input: "view.canReplace" } } }, on: { onClick: ui6("replaceCurrent") }, children: [text7({ value: "Replace" })] },
9678
+ { component: "chrome/TextButton", props: { disabled: { not: { input: "view.canReplace" } } }, on: { onClick: ui6("replaceAll") }, children: [text7({ input: "view.allLabel" })] }
9641
9679
  ]
9642
9680
  }
9643
9681
  }
@@ -9659,7 +9697,7 @@ var FIND_DECLARATION = {
9659
9697
  {
9660
9698
  component: "chrome/Section",
9661
9699
  each: { input: "view.groups", key: "id" },
9662
- props: { title: { item: "label" }, flush: { value: true }, badge: { node: { component: "chrome/Badge", children: [text6({ item: "count" })] } } },
9700
+ props: { title: { item: "label" }, flush: { value: true }, badge: { node: { component: "chrome/Badge", children: [text7({ item: "count" })] } } },
9663
9701
  children: [{ component: "chrome/RowList", children: [resultRow] }]
9664
9702
  }
9665
9703
  ]
@@ -10549,12 +10587,12 @@ var commentsViewManifest = {
10549
10587
  outputs: [{ id: "ui", type: "object", label: "UI intent", description: "{ kind, \u2026 } \u2014 applied by the runtime to the controller." }],
10550
10588
  commands: []
10551
10589
  };
10552
- var EMPTY7 = { show: "open", shows: [], sort: "document", sorts: [], orphanedHidden: false, filteredEmpty: false, filteredHint: "", empty: true, emptyHint: "Select something and add a comment.", listed: false, open: [], hasResolved: false, resolvedTitle: "", resolved: [], draft: "", placeholder: "", composerDisabled: true, commentDisabled: true, countLabel: "0 open" };
10553
- var BEHAVIOURS7 = {
10554
- "edit/commentsPanelView": (inputs) => inputs.view ?? EMPTY7
10590
+ var EMPTY8 = { show: "open", shows: [], sort: "document", sorts: [], orphanedHidden: false, filteredEmpty: false, filteredHint: "", empty: true, emptyHint: "Select something and add a comment.", listed: false, open: [], hasResolved: false, resolvedTitle: "", resolved: [], draft: "", placeholder: "", composerDisabled: true, commentDisabled: true, countLabel: "0 open" };
10591
+ var BEHAVIOURS8 = {
10592
+ "edit/commentsPanelView": (inputs) => inputs.view ?? EMPTY8
10555
10593
  };
10556
10594
  var COMMENTS_RUNTIME_UNITS = [];
10557
- var text7 = (b) => ({ component: "text", props: { text: b } });
10595
+ var text8 = (b) => ({ component: "text", props: { text: b } });
10558
10596
  var ui7 = (kind, fields = {}) => ({ emit: "ui", value: { object: { kind: { value: kind }, ...fields } } });
10559
10597
  var threadCard = (input) => ({
10560
10598
  component: "chrome/ThreadCard",
@@ -10566,18 +10604,18 @@ var threadCard = (input) => ({
10566
10604
  component: "chrome/Stack",
10567
10605
  props: { direction: { value: "row" }, gap: { value: 4 }, pad: { value: "none" } },
10568
10606
  children: [
10569
- { component: "chrome/Badge", when: { item: "hasAnchorBadge" }, props: { tone: { item: "anchorTone" }, title: { item: "anchorTitle" } }, children: [text7({ item: "anchorLabel" })] },
10570
- { component: "chrome/Badge", when: { item: "resolved" }, children: [text7({ value: "resolved" })] },
10571
- { component: "chrome/Text", props: { role: { value: "caption" } }, children: [text7({ item: "age" })] }
10607
+ { component: "chrome/Badge", when: { item: "hasAnchorBadge" }, props: { tone: { item: "anchorTone" }, title: { item: "anchorTitle" } }, children: [text8({ item: "anchorLabel" })] },
10608
+ { component: "chrome/Badge", when: { item: "resolved" }, children: [text8({ value: "resolved" })] },
10609
+ { component: "chrome/Text", props: { role: { value: "caption" } }, children: [text8({ item: "age" })] }
10572
10610
  ]
10573
10611
  },
10574
- { component: "chrome/Quote", when: { item: "hasQuote" }, props: { orphaned: { item: "orphaned" } }, on: { onActivate: ui7("activate", { id: { item: "id" } }) }, children: [text7({ item: "quote" })] },
10575
- { component: "chrome/Message", each: { item: "messages", key: "id" }, props: { author: { item: "author" }, age: { item: "age" }, edited: { item: "edited" } }, children: [text7({ item: "body" })] },
10612
+ { component: "chrome/Quote", when: { item: "hasQuote" }, props: { orphaned: { item: "orphaned" } }, on: { onActivate: ui7("activate", { id: { item: "id" } }) }, children: [text8({ item: "quote" })] },
10613
+ { component: "chrome/Message", each: { item: "messages", key: "id" }, props: { author: { item: "author" }, age: { item: "age" }, edited: { item: "edited" } }, children: [text8({ item: "body" })] },
10576
10614
  {
10577
10615
  component: "chrome/Stack",
10578
10616
  when: { item: "hasReactions" },
10579
10617
  props: { direction: { value: "row" }, gap: { value: 4 }, pad: { value: "none" } },
10580
- children: [{ component: "chrome/TextButton", each: { item: "reactions", key: "emoji" }, on: { onClick: ui7("react", { id: { item: "threadId" }, emoji: { item: "emoji" }, on: { item: "reactTo" } }) }, children: [text7({ item: "label" })] }]
10618
+ children: [{ component: "chrome/TextButton", each: { item: "reactions", key: "emoji" }, on: { onClick: ui7("react", { id: { item: "threadId" }, emoji: { item: "emoji" }, on: { item: "reactTo" } }) }, children: [text8({ item: "label" })] }]
10581
10619
  },
10582
10620
  {
10583
10621
  component: "chrome/Stack",
@@ -10585,7 +10623,7 @@ var threadCard = (input) => ({
10585
10623
  props: { direction: { value: "row" }, gap: { value: 4 }, pad: { value: "none" } },
10586
10624
  children: [
10587
10625
  { component: "chrome/Input", props: { value: { item: "replyDraft" }, placeholder: { value: "Reply" }, autoFocus: { value: true }, label: { value: "Reply" } }, on: { onChange: ui7("replyDraft", { value: { arg: "" } }), onKeyDown: ui7("replyKey", { id: { item: "id" }, key: { arg: "key" }, shift: { arg: "shiftKey" } }) } },
10588
- { component: "chrome/TextButton", on: { onClick: ui7("reply", { id: { item: "id" } }) }, children: [text7({ value: "Send" })] }
10626
+ { component: "chrome/TextButton", on: { onClick: ui7("reply", { id: { item: "id" } }) }, children: [text8({ value: "Send" })] }
10589
10627
  ]
10590
10628
  },
10591
10629
  {
@@ -10593,9 +10631,9 @@ var threadCard = (input) => ({
10593
10631
  when: { item: "idle" },
10594
10632
  props: { direction: { value: "row" }, gap: { value: 6 }, pad: { value: "none" } },
10595
10633
  children: [
10596
- { component: "chrome/TextButton", on: { onClick: ui7("startReply", { id: { item: "id" } }) }, children: [text7({ value: "Reply" })] },
10597
- { component: "chrome/TextButton", on: { onClick: ui7("resolve", { id: { item: "id" }, resolved: { item: "resolveTo" } }) }, children: [text7({ item: "resolveLabel" })] },
10598
- { component: "chrome/TextButton", on: { onClick: ui7("remove", { id: { item: "id" } }) }, children: [text7({ value: "Delete" })] }
10634
+ { component: "chrome/TextButton", on: { onClick: ui7("startReply", { id: { item: "id" } }) }, children: [text8({ value: "Reply" })] },
10635
+ { component: "chrome/TextButton", on: { onClick: ui7("resolve", { id: { item: "id" }, resolved: { item: "resolveTo" } }) }, children: [text8({ item: "resolveLabel" })] },
10636
+ { component: "chrome/TextButton", on: { onClick: ui7("remove", { id: { item: "id" } }) }, children: [text8({ value: "Delete" })] }
10599
10637
  ]
10600
10638
  }
10601
10639
  ]
@@ -10617,7 +10655,7 @@ var COMMENTS_DECLARATION = {
10617
10655
  {
10618
10656
  component: "chrome/Note",
10619
10657
  when: { input: "view.orphanedNotice" },
10620
- children: [text7({ input: "view.orphanedNotice" }), { component: "chrome/TextButton", when: { input: "view.orphanedHidden" }, on: { onClick: ui7("showOrphaned") }, children: [text7({ value: "Show" })] }]
10658
+ children: [text8({ input: "view.orphanedNotice" }), { component: "chrome/TextButton", when: { input: "view.orphanedHidden" }, on: { onClick: ui7("showOrphaned") }, children: [text8({ value: "Show" })] }]
10621
10659
  },
10622
10660
  {
10623
10661
  component: "chrome/ScrollArea",
@@ -10633,7 +10671,7 @@ var COMMENTS_DECLARATION = {
10633
10671
  props: { gap: { value: 2 }, pad: { value: "gutter" }, className: { value: "xeno-comments-composer" } },
10634
10672
  children: [
10635
10673
  { component: "chrome/TextArea", props: { value: { input: "view.draft" }, placeholder: { input: "view.placeholder" }, disabled: { input: "view.composerDisabled" }, rows: { value: 2 }, label: { value: "New comment" } }, on: { onChange: ui7("draft", { value: { arg: "" } }), onKeyDown: ui7("draftKey", { key: { arg: "key" }, ctrl: { arg: "ctrlKey" }, meta: { arg: "metaKey" } }) } },
10636
- { component: "chrome/Toolbar", props: { divided: { value: false }, right: { node: { component: "chrome/ToolbarGroup", props: { end: { value: true } }, children: [{ component: "chrome/TextButton", props: { strong: { value: true }, disabled: { input: "view.commentDisabled" } }, on: { onClick: ui7("create") }, children: [text7({ value: "Comment" })] }] } } } }
10674
+ { component: "chrome/Toolbar", props: { divided: { value: false }, right: { node: { component: "chrome/ToolbarGroup", props: { end: { value: true } }, children: [{ component: "chrome/TextButton", props: { strong: { value: true }, disabled: { input: "view.commentDisabled" } }, on: { onClick: ui7("create") }, children: [text8({ value: "Comment" })] }] } } } }
10637
10675
  ]
10638
10676
  },
10639
10677
  { component: "chrome/StatusBar", props: { left: { input: "view.countLabel" }, right: { input: "view.staleLabel" } } }
@@ -11888,11 +11926,11 @@ var nodegraphViewManifest = {
11888
11926
  outputs: [{ id: "ui", type: "object", label: "UI intent", description: "{ kind } \u2014 applied by the runtime to the controller." }],
11889
11927
  commands: []
11890
11928
  };
11891
- var EMPTY8 = { empty: true, drawn: false, nodesLabel: "0 nodes", zoomLabel: "100%" };
11892
- var BEHAVIOURS8 = {
11893
- "edit/nodegraphPanelView": (inputs) => inputs.view ?? EMPTY8
11929
+ var EMPTY9 = { empty: true, drawn: false, nodesLabel: "0 nodes", zoomLabel: "100%" };
11930
+ var BEHAVIOURS9 = {
11931
+ "edit/nodegraphPanelView": (inputs) => inputs.view ?? EMPTY9
11894
11932
  };
11895
- var text8 = (b) => ({ component: "text", props: { text: b } });
11933
+ var text9 = (b) => ({ component: "text", props: { text: b } });
11896
11934
  var ui8 = (kind) => ({ emit: "ui", value: { object: { kind: { value: kind } } } });
11897
11935
  var NODEGRAPH_DECLARATION = {
11898
11936
  format: "xeno.block@1",
@@ -11909,8 +11947,8 @@ var NODEGRAPH_DECLARATION = {
11909
11947
  component: "chrome/ToolbarGroup",
11910
11948
  props: { end: { value: true } },
11911
11949
  children: [
11912
- { component: "chrome/TextButton", children: [text8({ value: "Fit" })], on: { onClick: ui8("fit") } },
11913
- { component: "chrome/TextButton", children: [text8({ value: "Fit selection" })], on: { onClick: ui8("fitSelection") } }
11950
+ { component: "chrome/TextButton", children: [text9({ value: "Fit" })], on: { onClick: ui8("fit") } },
11951
+ { component: "chrome/TextButton", children: [text9({ value: "Fit selection" })], on: { onClick: ui8("fitSelection") } }
11914
11952
  ]
11915
11953
  }
11916
11954
  }
@@ -11921,8 +11959,8 @@ var NODEGRAPH_DECLARATION = {
11921
11959
  {
11922
11960
  component: "chrome/StatusBar",
11923
11961
  props: {
11924
- left: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text8({ input: "view.nodesLabel" })] } },
11925
- right: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text8({ input: "view.zoomLabel" })] } }
11962
+ left: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text9({ input: "view.nodesLabel" })] } },
11963
+ right: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text9({ input: "view.zoomLabel" })] } }
11926
11964
  }
11927
11965
  }
11928
11966
  ]
@@ -12890,12 +12928,12 @@ var TreeController = class {
12890
12928
  }
12891
12929
  if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
12892
12930
  const fresh = now - this.typeAhead.at > this.typeAheadMs;
12893
- const text10 = (fresh ? "" : this.typeAhead.text) + event.key.toLowerCase();
12894
- this.typeAhead = { text: text10, at: now };
12931
+ const text11 = (fresh ? "" : this.typeAhead.text) + event.key.toLowerCase();
12932
+ this.typeAhead = { text: text11, at: now };
12895
12933
  const from = fresh ? current : current + 1;
12896
12934
  for (let i = 0; i < rows.length; i += 1) {
12897
12935
  const candidate = rows[(from + i) % rows.length];
12898
- if (candidate.node.label.toLowerCase().startsWith(text10)) {
12936
+ if (candidate.node.label.toLowerCase().startsWith(text11)) {
12899
12937
  this.focusedId = candidate.id;
12900
12938
  this.select([candidate.id]);
12901
12939
  return true;
@@ -12921,9 +12959,9 @@ var TreeController = class {
12921
12959
  return true;
12922
12960
  }
12923
12961
  /** Update the rename draft. */
12924
- updateRenameDraft(text10) {
12962
+ updateRenameDraft(text11) {
12925
12963
  if (!this.renaming) return;
12926
- this.renaming = { ...this.renaming, draft: text10 };
12964
+ this.renaming = { ...this.renaming, draft: text11 };
12927
12965
  this.notify();
12928
12966
  }
12929
12967
  /**
@@ -13637,7 +13675,7 @@ var treeViewManifest = {
13637
13675
  outputs: [{ id: "ui", type: "object", label: "UI intent", description: "{ kind, id?, value?, key?, actionId?, x?, y?, ctrlKey?, metaKey?, shiftKey?, altKey? } \u2014 applied by the runtime to the controller." }],
13638
13676
  commands: []
13639
13677
  };
13640
- var EMPTY9 = {
13678
+ var EMPTY10 = {
13641
13679
  searchShown: true,
13642
13680
  filter: "",
13643
13681
  noSource: true,
@@ -13658,16 +13696,16 @@ var EMPTY9 = {
13658
13696
  rows: [],
13659
13697
  countLabel: "0 items"
13660
13698
  };
13661
- var BEHAVIOURS9 = {
13662
- "edit/treePanelView": (inputs) => inputs.view ?? EMPTY9
13699
+ var BEHAVIOURS10 = {
13700
+ "edit/treePanelView": (inputs) => inputs.view ?? EMPTY10
13663
13701
  };
13664
- var text9 = (b) => ({ component: "text", props: { text: b } });
13702
+ var text10 = (b) => ({ component: "text", props: { text: b } });
13665
13703
  var ui9 = (kind, fields = {}) => ({ emit: "ui", value: { object: { kind: { value: kind }, ...fields } } });
13666
13704
  var nodeIcon = () => ({
13667
13705
  component: "fragment",
13668
13706
  children: [
13669
13707
  { component: "icons/TreeKind", when: { item: "iconName" }, props: { name: { item: "iconName" } } },
13670
- { component: "chrome/Text", when: { item: "iconText" }, props: { role: { value: "caption" } }, children: [text9({ item: "iconText" })] }
13708
+ { component: "chrome/Text", when: { item: "iconText" }, props: { role: { value: "caption" } }, children: [text10({ item: "iconText" })] }
13671
13709
  ]
13672
13710
  });
13673
13711
  var TREE_DECLARATION = {
@@ -13738,11 +13776,11 @@ var TREE_DECLARATION = {
13738
13776
  node: {
13739
13777
  component: "fragment",
13740
13778
  children: [
13741
- { component: "chrome/Text", when: { item: "chipLoading" }, props: { role: { value: "caption" } }, children: [text9({ value: "loading\u2026" })] },
13742
- { component: "chrome/Badge", when: { item: "chipError" }, props: { tone: { value: "error" } }, children: [text9({ item: "chipErrorText" })] },
13743
- { component: "chrome/TextButton", when: { item: "chipLoadMore" }, children: [text9({ value: "load more\u2026" })], on: { onClick: ui9("loadMore", { id: { item: "id" } }) } },
13744
- { component: "chrome/Badge", when: { item: "chipTruncated" }, props: { tone: { value: "warning" } }, children: [text9({ item: "chipTruncatedText" })] },
13745
- { component: "chrome/Text", when: { item: "chipEmpty" }, props: { role: { value: "caption" } }, children: [text9({ value: "empty" })] }
13779
+ { component: "chrome/Text", when: { item: "chipLoading" }, props: { role: { value: "caption" } }, children: [text10({ value: "loading\u2026" })] },
13780
+ { component: "chrome/Badge", when: { item: "chipError" }, props: { tone: { value: "error" } }, children: [text10({ item: "chipErrorText" })] },
13781
+ { component: "chrome/TextButton", when: { item: "chipLoadMore" }, children: [text10({ value: "load more\u2026" })], on: { onClick: ui9("loadMore", { id: { item: "id" } }) } },
13782
+ { component: "chrome/Badge", when: { item: "chipTruncated" }, props: { tone: { value: "warning" } }, children: [text10({ item: "chipTruncatedText" })] },
13783
+ { component: "chrome/Text", when: { item: "chipEmpty" }, props: { role: { value: "caption" } }, children: [text10({ value: "empty" })] }
13746
13784
  ]
13747
13785
  }
13748
13786
  },
@@ -13750,9 +13788,9 @@ var TREE_DECLARATION = {
13750
13788
  node: {
13751
13789
  component: "fragment",
13752
13790
  children: [
13753
- { component: "chrome/Text", each: { item: "columns", key: "key" }, props: { role: { value: "number" } }, children: [text9({ item: "text" })] },
13791
+ { component: "chrome/Text", each: { item: "columns", key: "key" }, props: { role: { value: "number" } }, children: [text10({ item: "text" })] },
13754
13792
  { component: "chrome/Text", each: { item: "glyphs", key: "key" }, props: { role: { value: "meta" }, title: { item: "title" } }, children: [nodeIcon()] },
13755
- { component: "chrome/Badge", each: { item: "badges", key: "key" }, props: { tone: { item: "tone" } }, children: [text9({ item: "text" })] },
13793
+ { component: "chrome/Badge", each: { item: "badges", key: "key" }, props: { tone: { item: "tone" } }, children: [text10({ item: "text" })] },
13756
13794
  { component: "chrome/IconButton", each: { item: "actions", key: "key" }, props: { size: { value: "sm" }, icon: { node: nodeIcon() }, label: { item: "label" }, disabled: { item: "disabled" } }, on: { onClick: ui9("action", { id: { item: "rowId" }, actionId: { item: "actionId" } }) } }
13757
13795
  ]
13758
13796
  }
@@ -13774,8 +13812,8 @@ var TREE_DECLARATION = {
13774
13812
  {
13775
13813
  component: "chrome/StatusBar",
13776
13814
  props: {
13777
- left: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text9({ input: "view.countLabel" })] } },
13778
- right: { node: { component: "chrome/Text", when: { input: "view.selectedLabel" }, props: { role: { value: "meta" } }, children: [text9({ input: "view.selectedLabel" })] } }
13815
+ left: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text10({ input: "view.countLabel" })] } },
13816
+ right: { node: { component: "chrome/Text", when: { input: "view.selectedLabel" }, props: { role: { value: "meta" } }, children: [text10({ input: "view.selectedLabel" })] } }
13779
13817
  }
13780
13818
  }
13781
13819
  ]
@@ -14136,7 +14174,7 @@ export {
14136
14174
  COLOR_DECLARATION,
14137
14175
  COLOR_RUNTIME_UNITS,
14138
14176
  COLOR_SPACES,
14139
- BEHAVIOURS7 as COMMENTS_BEHAVIOURS,
14177
+ BEHAVIOURS8 as COMMENTS_BEHAVIOURS,
14140
14178
  COMMENTS_DECLARATION,
14141
14179
  COMMENTS_PANEL_ID,
14142
14180
  COMMENTS_RUNTIME_UNITS,
@@ -14162,7 +14200,7 @@ export {
14162
14200
  EMPTY_SCHEMA,
14163
14201
  EMPTY_TREE,
14164
14202
  EMPTY_TREE_SOURCE,
14165
- BEHAVIOURS6 as FIND_BEHAVIOURS,
14203
+ BEHAVIOURS7 as FIND_BEHAVIOURS,
14166
14204
  FIND_DECLARATION,
14167
14205
  FIND_PANEL_ID,
14168
14206
  FIND_RUNTIME_UNITS,
@@ -14189,14 +14227,14 @@ export {
14189
14227
  LayersPanelController,
14190
14228
  LayersPanelView,
14191
14229
  MIXED,
14192
- BEHAVIOURS8 as NODEGRAPH_BEHAVIOURS,
14230
+ BEHAVIOURS9 as NODEGRAPH_BEHAVIOURS,
14193
14231
  NODEGRAPH_DECLARATION,
14194
14232
  NODEGRAPH_PANEL_ID,
14195
14233
  NODEGRAPH_RUNTIME_UNITS,
14196
14234
  NodeGraphPanelView,
14197
14235
  NodeGraphSurface,
14198
14236
  SPACE_LABEL,
14199
- BEHAVIOURS9 as TREE_BEHAVIOURS,
14237
+ BEHAVIOURS10 as TREE_BEHAVIOURS,
14200
14238
  TREE_DECLARATION,
14201
14239
  TREE_PANEL_ID,
14202
14240
  TREE_RUNTIME_UNITS,
@@ -14205,11 +14243,15 @@ export {
14205
14243
  TreeIcon,
14206
14244
  TreePanelView,
14207
14245
  TreeScroller,
14246
+ BEHAVIOURS6 as VIEWPORT_BEHAVIOURS,
14247
+ VIEWPORT_DECLARATION,
14208
14248
  VIEWPORT_PANEL_ID,
14249
+ VIEWPORT_RUNTIME_UNITS,
14209
14250
  VIEWPORT_SLOTS,
14210
14251
  VIEW_STATE_OPS,
14211
14252
  ViewportController,
14212
14253
  ViewportPanelView,
14254
+ ViewportSurface,
14213
14255
  XenoCurveScale,
14214
14256
  XenoGraphScale,
14215
14257
  XenoNodeIndex,
@@ -14404,6 +14446,9 @@ export {
14404
14446
  valuesEqual,
14405
14447
  viewportManifest,
14406
14448
  viewportPanel,
14449
+ viewportRuntimeComponents,
14450
+ viewportViewManifest,
14451
+ viewportViewState,
14407
14452
  visibleEdges,
14408
14453
  walkTree,
14409
14454
  wheelZoomFactor,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xenosystem/blocks",
3
- "version": "0.13.26",
3
+ "version": "0.13.28",
4
4
  "description": "XENO Blocks — rung 3 of the front ladder: components composed into a contract-bearing unit (manifest: ports, intents, commands, agent surface), rendered by @xenosystem/workbench. ONE package, one subpath per family (/auth, /edit, /data, /time, /ops, /trust, /agent), one named export per block — XENO PACKAGE NAMING - STANDARD.md.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -64,7 +64,7 @@
64
64
  "peerDependencies": {
65
65
  "@duckdb/duckdb-wasm": ">=1.28.0",
66
66
  "@xenosystem/block-sdk": ">=0.3.4 <1",
67
- "@xenosystem/components": ">=0.28.1 <1",
67
+ "@xenosystem/components": ">=0.29.1 <1",
68
68
  "@xenosystem/data-core": "^0.1.0",
69
69
  "@xenosystem/elements": ">=0.0.1",
70
70
  "@xenosystem/elements-react": ">=0.0.1",
@@ -81,7 +81,7 @@
81
81
  "@types/react": "^19.0.0",
82
82
  "@types/react-dom": "^19.0.0",
83
83
  "@xenosystem/block-sdk": "^0.3.4",
84
- "@xenosystem/components": "^0.28.1",
84
+ "@xenosystem/components": "^0.29.1",
85
85
  "@xenosystem/data-core": "^0.1.0",
86
86
  "@xenosystem/elements": "0.0.1",
87
87
  "@xenosystem/elements-react": "0.0.1",