@xenosystem/blocks 0.13.26 → 0.13.27

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);
@@ -8743,33 +8797,15 @@ function ViewportPanelView({
8743
8797
  slot
8744
8798
  );
8745
8799
  }),
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
8800
+ children
8769
8801
  ]
8770
8802
  }
8771
8803
  );
8772
8804
  }
8805
+ var VIEWPORT_RUNTIME_UNITS = ["viewport/Surface"];
8806
+ function viewportRuntimeComponents(controller, overlays, background) {
8807
+ return { "viewport/Surface": ({ children }) => /* @__PURE__ */ jsx8(ViewportSurface, { controller, overlays, background, children }) };
8808
+ }
8773
8809
 
8774
8810
  // src/edit/viewport/panel.ts
8775
8811
  function createViewportPanel(options = {}) {
@@ -9016,11 +9052,11 @@ var FindController = class {
9016
9052
  * @param text - The new query text.
9017
9053
  * @param immediate - Skip the debounce (a paste, or pressing Enter).
9018
9054
  */
9019
- setText(text10, immediate = false) {
9020
- if (text10 === this.text) return;
9021
- this.text = text10;
9055
+ setText(text11, immediate = false) {
9056
+ if (text11 === this.text) return;
9057
+ this.text = text11;
9022
9058
  this.index = -1;
9023
- if (text10 === "") {
9059
+ if (text11 === "") {
9024
9060
  this.clearResults("idle");
9025
9061
  this.emitQuery(true);
9026
9062
  return;
@@ -9048,8 +9084,8 @@ var FindController = class {
9048
9084
  this.notify();
9049
9085
  }
9050
9086
  /** The replacement text. Never emitted on its own — a replacement is not a search. */
9051
- setReplaceText(text10) {
9052
- this.replaceText = text10;
9087
+ setReplaceText(text11) {
9088
+ this.replaceText = text11;
9053
9089
  this.notify();
9054
9090
  }
9055
9091
  /** Show or hide the replace row. */
@@ -9523,7 +9559,7 @@ var findViewManifest = {
9523
9559
  outputs: [{ id: "ui", type: "object", label: "UI intent", description: "{ kind, value?, option?, matchId?, x?, y? } \u2014 applied by the runtime to the controller." }],
9524
9560
  commands: []
9525
9561
  };
9526
- var EMPTY6 = {
9562
+ var EMPTY7 = {
9527
9563
  text: "",
9528
9564
  hasText: false,
9529
9565
  placeholder: "Find",
@@ -9555,11 +9591,11 @@ var EMPTY6 = {
9555
9591
  rows: [],
9556
9592
  groups: []
9557
9593
  };
9558
- var BEHAVIOURS6 = {
9559
- "edit/findPanelView": (inputs) => inputs.view ?? EMPTY6
9594
+ var BEHAVIOURS7 = {
9595
+ "edit/findPanelView": (inputs) => inputs.view ?? EMPTY7
9560
9596
  };
9561
9597
  var FIND_RUNTIME_UNITS = ["find/Keys"];
9562
- var text6 = (b) => ({ component: "text", props: { text: b } });
9598
+ var text7 = (b) => ({ component: "text", props: { text: b } });
9563
9599
  var ui6 = (kind, fields = {}) => ({ emit: "ui", value: { object: { kind: { value: kind }, ...fields } } });
9564
9600
  var option = (option2, icon, label) => ({
9565
9601
  component: "chrome/IconButton",
@@ -9605,10 +9641,10 @@ var FIND_DECLARATION = {
9605
9641
  node: {
9606
9642
  component: "fragment",
9607
9643
  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" })] }
9644
+ { component: "chrome/Badge", when: { input: "view.invalid" }, props: { tone: { value: "error" }, title: { input: "view.message" } }, children: [text7({ value: "invalid pattern" })] },
9645
+ { component: "chrome/Badge", when: { input: "view.failed" }, props: { tone: { value: "error" }, title: { input: "view.message" } }, children: [text7({ value: "search failed" })] },
9646
+ { component: "chrome/Badge", when: { input: "view.searchingBadge" }, children: [text7({ value: "searching\u2026" })] },
9647
+ { component: "chrome/Text", when: { input: "view.countShown" }, props: { role: { value: "number" } }, children: [text7({ input: "view.counter" })] }
9612
9648
  ]
9613
9649
  }
9614
9650
  },
@@ -9619,13 +9655,13 @@ var FIND_DECLARATION = {
9619
9655
  children: [
9620
9656
  { 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
9657
  { 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" })] }
9658
+ { component: "chrome/TextButton", on: { onClick: ui6("toggleReplace") }, children: [text7({ input: "view.replaceLabel" })] }
9623
9659
  ]
9624
9660
  }
9625
9661
  }
9626
9662
  }
9627
9663
  },
9628
- { component: "chrome/Text", when: { input: "view.invalid" }, props: { role: { value: "caption" }, className: { value: "xeno-find-message" } }, children: [text6({ input: "view.message" })] },
9664
+ { component: "chrome/Text", when: { input: "view.invalid" }, props: { role: { value: "caption" }, className: { value: "xeno-find-message" } }, children: [text7({ input: "view.message" })] },
9629
9665
  {
9630
9666
  component: "chrome/Toolbar",
9631
9667
  when: { input: "view.replaceVisible" },
@@ -9636,8 +9672,8 @@ var FIND_DECLARATION = {
9636
9672
  component: "chrome/ToolbarGroup",
9637
9673
  props: { end: { value: true } },
9638
9674
  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" })] }
9675
+ { component: "chrome/TextButton", props: { disabled: { not: { input: "view.canReplace" } } }, on: { onClick: ui6("replaceCurrent") }, children: [text7({ value: "Replace" })] },
9676
+ { component: "chrome/TextButton", props: { disabled: { not: { input: "view.canReplace" } } }, on: { onClick: ui6("replaceAll") }, children: [text7({ input: "view.allLabel" })] }
9641
9677
  ]
9642
9678
  }
9643
9679
  }
@@ -9659,7 +9695,7 @@ var FIND_DECLARATION = {
9659
9695
  {
9660
9696
  component: "chrome/Section",
9661
9697
  each: { input: "view.groups", key: "id" },
9662
- props: { title: { item: "label" }, flush: { value: true }, badge: { node: { component: "chrome/Badge", children: [text6({ item: "count" })] } } },
9698
+ props: { title: { item: "label" }, flush: { value: true }, badge: { node: { component: "chrome/Badge", children: [text7({ item: "count" })] } } },
9663
9699
  children: [{ component: "chrome/RowList", children: [resultRow] }]
9664
9700
  }
9665
9701
  ]
@@ -10549,12 +10585,12 @@ var commentsViewManifest = {
10549
10585
  outputs: [{ id: "ui", type: "object", label: "UI intent", description: "{ kind, \u2026 } \u2014 applied by the runtime to the controller." }],
10550
10586
  commands: []
10551
10587
  };
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
10588
+ 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" };
10589
+ var BEHAVIOURS8 = {
10590
+ "edit/commentsPanelView": (inputs) => inputs.view ?? EMPTY8
10555
10591
  };
10556
10592
  var COMMENTS_RUNTIME_UNITS = [];
10557
- var text7 = (b) => ({ component: "text", props: { text: b } });
10593
+ var text8 = (b) => ({ component: "text", props: { text: b } });
10558
10594
  var ui7 = (kind, fields = {}) => ({ emit: "ui", value: { object: { kind: { value: kind }, ...fields } } });
10559
10595
  var threadCard = (input) => ({
10560
10596
  component: "chrome/ThreadCard",
@@ -10566,18 +10602,18 @@ var threadCard = (input) => ({
10566
10602
  component: "chrome/Stack",
10567
10603
  props: { direction: { value: "row" }, gap: { value: 4 }, pad: { value: "none" } },
10568
10604
  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" })] }
10605
+ { component: "chrome/Badge", when: { item: "hasAnchorBadge" }, props: { tone: { item: "anchorTone" }, title: { item: "anchorTitle" } }, children: [text8({ item: "anchorLabel" })] },
10606
+ { component: "chrome/Badge", when: { item: "resolved" }, children: [text8({ value: "resolved" })] },
10607
+ { component: "chrome/Text", props: { role: { value: "caption" } }, children: [text8({ item: "age" })] }
10572
10608
  ]
10573
10609
  },
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" })] },
10610
+ { component: "chrome/Quote", when: { item: "hasQuote" }, props: { orphaned: { item: "orphaned" } }, on: { onActivate: ui7("activate", { id: { item: "id" } }) }, children: [text8({ item: "quote" })] },
10611
+ { component: "chrome/Message", each: { item: "messages", key: "id" }, props: { author: { item: "author" }, age: { item: "age" }, edited: { item: "edited" } }, children: [text8({ item: "body" })] },
10576
10612
  {
10577
10613
  component: "chrome/Stack",
10578
10614
  when: { item: "hasReactions" },
10579
10615
  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" })] }]
10616
+ 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
10617
  },
10582
10618
  {
10583
10619
  component: "chrome/Stack",
@@ -10585,7 +10621,7 @@ var threadCard = (input) => ({
10585
10621
  props: { direction: { value: "row" }, gap: { value: 4 }, pad: { value: "none" } },
10586
10622
  children: [
10587
10623
  { 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" })] }
10624
+ { component: "chrome/TextButton", on: { onClick: ui7("reply", { id: { item: "id" } }) }, children: [text8({ value: "Send" })] }
10589
10625
  ]
10590
10626
  },
10591
10627
  {
@@ -10593,9 +10629,9 @@ var threadCard = (input) => ({
10593
10629
  when: { item: "idle" },
10594
10630
  props: { direction: { value: "row" }, gap: { value: 6 }, pad: { value: "none" } },
10595
10631
  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" })] }
10632
+ { component: "chrome/TextButton", on: { onClick: ui7("startReply", { id: { item: "id" } }) }, children: [text8({ value: "Reply" })] },
10633
+ { component: "chrome/TextButton", on: { onClick: ui7("resolve", { id: { item: "id" }, resolved: { item: "resolveTo" } }) }, children: [text8({ item: "resolveLabel" })] },
10634
+ { component: "chrome/TextButton", on: { onClick: ui7("remove", { id: { item: "id" } }) }, children: [text8({ value: "Delete" })] }
10599
10635
  ]
10600
10636
  }
10601
10637
  ]
@@ -10617,7 +10653,7 @@ var COMMENTS_DECLARATION = {
10617
10653
  {
10618
10654
  component: "chrome/Note",
10619
10655
  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" })] }]
10656
+ children: [text8({ input: "view.orphanedNotice" }), { component: "chrome/TextButton", when: { input: "view.orphanedHidden" }, on: { onClick: ui7("showOrphaned") }, children: [text8({ value: "Show" })] }]
10621
10657
  },
10622
10658
  {
10623
10659
  component: "chrome/ScrollArea",
@@ -10633,7 +10669,7 @@ var COMMENTS_DECLARATION = {
10633
10669
  props: { gap: { value: 2 }, pad: { value: "gutter" }, className: { value: "xeno-comments-composer" } },
10634
10670
  children: [
10635
10671
  { 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" })] }] } } } }
10672
+ { 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
10673
  ]
10638
10674
  },
10639
10675
  { component: "chrome/StatusBar", props: { left: { input: "view.countLabel" }, right: { input: "view.staleLabel" } } }
@@ -11888,11 +11924,11 @@ var nodegraphViewManifest = {
11888
11924
  outputs: [{ id: "ui", type: "object", label: "UI intent", description: "{ kind } \u2014 applied by the runtime to the controller." }],
11889
11925
  commands: []
11890
11926
  };
11891
- var EMPTY8 = { empty: true, drawn: false, nodesLabel: "0 nodes", zoomLabel: "100%" };
11892
- var BEHAVIOURS8 = {
11893
- "edit/nodegraphPanelView": (inputs) => inputs.view ?? EMPTY8
11927
+ var EMPTY9 = { empty: true, drawn: false, nodesLabel: "0 nodes", zoomLabel: "100%" };
11928
+ var BEHAVIOURS9 = {
11929
+ "edit/nodegraphPanelView": (inputs) => inputs.view ?? EMPTY9
11894
11930
  };
11895
- var text8 = (b) => ({ component: "text", props: { text: b } });
11931
+ var text9 = (b) => ({ component: "text", props: { text: b } });
11896
11932
  var ui8 = (kind) => ({ emit: "ui", value: { object: { kind: { value: kind } } } });
11897
11933
  var NODEGRAPH_DECLARATION = {
11898
11934
  format: "xeno.block@1",
@@ -11909,8 +11945,8 @@ var NODEGRAPH_DECLARATION = {
11909
11945
  component: "chrome/ToolbarGroup",
11910
11946
  props: { end: { value: true } },
11911
11947
  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") } }
11948
+ { component: "chrome/TextButton", children: [text9({ value: "Fit" })], on: { onClick: ui8("fit") } },
11949
+ { component: "chrome/TextButton", children: [text9({ value: "Fit selection" })], on: { onClick: ui8("fitSelection") } }
11914
11950
  ]
11915
11951
  }
11916
11952
  }
@@ -11921,8 +11957,8 @@ var NODEGRAPH_DECLARATION = {
11921
11957
  {
11922
11958
  component: "chrome/StatusBar",
11923
11959
  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" })] } }
11960
+ left: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text9({ input: "view.nodesLabel" })] } },
11961
+ right: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text9({ input: "view.zoomLabel" })] } }
11926
11962
  }
11927
11963
  }
11928
11964
  ]
@@ -12890,12 +12926,12 @@ var TreeController = class {
12890
12926
  }
12891
12927
  if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
12892
12928
  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 };
12929
+ const text11 = (fresh ? "" : this.typeAhead.text) + event.key.toLowerCase();
12930
+ this.typeAhead = { text: text11, at: now };
12895
12931
  const from = fresh ? current : current + 1;
12896
12932
  for (let i = 0; i < rows.length; i += 1) {
12897
12933
  const candidate = rows[(from + i) % rows.length];
12898
- if (candidate.node.label.toLowerCase().startsWith(text10)) {
12934
+ if (candidate.node.label.toLowerCase().startsWith(text11)) {
12899
12935
  this.focusedId = candidate.id;
12900
12936
  this.select([candidate.id]);
12901
12937
  return true;
@@ -12921,9 +12957,9 @@ var TreeController = class {
12921
12957
  return true;
12922
12958
  }
12923
12959
  /** Update the rename draft. */
12924
- updateRenameDraft(text10) {
12960
+ updateRenameDraft(text11) {
12925
12961
  if (!this.renaming) return;
12926
- this.renaming = { ...this.renaming, draft: text10 };
12962
+ this.renaming = { ...this.renaming, draft: text11 };
12927
12963
  this.notify();
12928
12964
  }
12929
12965
  /**
@@ -13637,7 +13673,7 @@ var treeViewManifest = {
13637
13673
  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
13674
  commands: []
13639
13675
  };
13640
- var EMPTY9 = {
13676
+ var EMPTY10 = {
13641
13677
  searchShown: true,
13642
13678
  filter: "",
13643
13679
  noSource: true,
@@ -13658,16 +13694,16 @@ var EMPTY9 = {
13658
13694
  rows: [],
13659
13695
  countLabel: "0 items"
13660
13696
  };
13661
- var BEHAVIOURS9 = {
13662
- "edit/treePanelView": (inputs) => inputs.view ?? EMPTY9
13697
+ var BEHAVIOURS10 = {
13698
+ "edit/treePanelView": (inputs) => inputs.view ?? EMPTY10
13663
13699
  };
13664
- var text9 = (b) => ({ component: "text", props: { text: b } });
13700
+ var text10 = (b) => ({ component: "text", props: { text: b } });
13665
13701
  var ui9 = (kind, fields = {}) => ({ emit: "ui", value: { object: { kind: { value: kind }, ...fields } } });
13666
13702
  var nodeIcon = () => ({
13667
13703
  component: "fragment",
13668
13704
  children: [
13669
13705
  { 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" })] }
13706
+ { component: "chrome/Text", when: { item: "iconText" }, props: { role: { value: "caption" } }, children: [text10({ item: "iconText" })] }
13671
13707
  ]
13672
13708
  });
13673
13709
  var TREE_DECLARATION = {
@@ -13738,11 +13774,11 @@ var TREE_DECLARATION = {
13738
13774
  node: {
13739
13775
  component: "fragment",
13740
13776
  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" })] }
13777
+ { component: "chrome/Text", when: { item: "chipLoading" }, props: { role: { value: "caption" } }, children: [text10({ value: "loading\u2026" })] },
13778
+ { component: "chrome/Badge", when: { item: "chipError" }, props: { tone: { value: "error" } }, children: [text10({ item: "chipErrorText" })] },
13779
+ { component: "chrome/TextButton", when: { item: "chipLoadMore" }, children: [text10({ value: "load more\u2026" })], on: { onClick: ui9("loadMore", { id: { item: "id" } }) } },
13780
+ { component: "chrome/Badge", when: { item: "chipTruncated" }, props: { tone: { value: "warning" } }, children: [text10({ item: "chipTruncatedText" })] },
13781
+ { component: "chrome/Text", when: { item: "chipEmpty" }, props: { role: { value: "caption" } }, children: [text10({ value: "empty" })] }
13746
13782
  ]
13747
13783
  }
13748
13784
  },
@@ -13750,9 +13786,9 @@ var TREE_DECLARATION = {
13750
13786
  node: {
13751
13787
  component: "fragment",
13752
13788
  children: [
13753
- { component: "chrome/Text", each: { item: "columns", key: "key" }, props: { role: { value: "number" } }, children: [text9({ item: "text" })] },
13789
+ { component: "chrome/Text", each: { item: "columns", key: "key" }, props: { role: { value: "number" } }, children: [text10({ item: "text" })] },
13754
13790
  { 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" })] },
13791
+ { component: "chrome/Badge", each: { item: "badges", key: "key" }, props: { tone: { item: "tone" } }, children: [text10({ item: "text" })] },
13756
13792
  { 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
13793
  ]
13758
13794
  }
@@ -13774,8 +13810,8 @@ var TREE_DECLARATION = {
13774
13810
  {
13775
13811
  component: "chrome/StatusBar",
13776
13812
  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" })] } }
13813
+ left: { node: { component: "chrome/Text", props: { role: { value: "number" } }, children: [text10({ input: "view.countLabel" })] } },
13814
+ right: { node: { component: "chrome/Text", when: { input: "view.selectedLabel" }, props: { role: { value: "meta" } }, children: [text10({ input: "view.selectedLabel" })] } }
13779
13815
  }
13780
13816
  }
13781
13817
  ]
@@ -14136,7 +14172,7 @@ export {
14136
14172
  COLOR_DECLARATION,
14137
14173
  COLOR_RUNTIME_UNITS,
14138
14174
  COLOR_SPACES,
14139
- BEHAVIOURS7 as COMMENTS_BEHAVIOURS,
14175
+ BEHAVIOURS8 as COMMENTS_BEHAVIOURS,
14140
14176
  COMMENTS_DECLARATION,
14141
14177
  COMMENTS_PANEL_ID,
14142
14178
  COMMENTS_RUNTIME_UNITS,
@@ -14162,7 +14198,7 @@ export {
14162
14198
  EMPTY_SCHEMA,
14163
14199
  EMPTY_TREE,
14164
14200
  EMPTY_TREE_SOURCE,
14165
- BEHAVIOURS6 as FIND_BEHAVIOURS,
14201
+ BEHAVIOURS7 as FIND_BEHAVIOURS,
14166
14202
  FIND_DECLARATION,
14167
14203
  FIND_PANEL_ID,
14168
14204
  FIND_RUNTIME_UNITS,
@@ -14189,14 +14225,14 @@ export {
14189
14225
  LayersPanelController,
14190
14226
  LayersPanelView,
14191
14227
  MIXED,
14192
- BEHAVIOURS8 as NODEGRAPH_BEHAVIOURS,
14228
+ BEHAVIOURS9 as NODEGRAPH_BEHAVIOURS,
14193
14229
  NODEGRAPH_DECLARATION,
14194
14230
  NODEGRAPH_PANEL_ID,
14195
14231
  NODEGRAPH_RUNTIME_UNITS,
14196
14232
  NodeGraphPanelView,
14197
14233
  NodeGraphSurface,
14198
14234
  SPACE_LABEL,
14199
- BEHAVIOURS9 as TREE_BEHAVIOURS,
14235
+ BEHAVIOURS10 as TREE_BEHAVIOURS,
14200
14236
  TREE_DECLARATION,
14201
14237
  TREE_PANEL_ID,
14202
14238
  TREE_RUNTIME_UNITS,
@@ -14205,11 +14241,15 @@ export {
14205
14241
  TreeIcon,
14206
14242
  TreePanelView,
14207
14243
  TreeScroller,
14244
+ BEHAVIOURS6 as VIEWPORT_BEHAVIOURS,
14245
+ VIEWPORT_DECLARATION,
14208
14246
  VIEWPORT_PANEL_ID,
14247
+ VIEWPORT_RUNTIME_UNITS,
14209
14248
  VIEWPORT_SLOTS,
14210
14249
  VIEW_STATE_OPS,
14211
14250
  ViewportController,
14212
14251
  ViewportPanelView,
14252
+ ViewportSurface,
14213
14253
  XenoCurveScale,
14214
14254
  XenoGraphScale,
14215
14255
  XenoNodeIndex,
@@ -14404,6 +14444,9 @@ export {
14404
14444
  valuesEqual,
14405
14445
  viewportManifest,
14406
14446
  viewportPanel,
14447
+ viewportRuntimeComponents,
14448
+ viewportViewManifest,
14449
+ viewportViewState,
14407
14450
  visibleEdges,
14408
14451
  walkTree,
14409
14452
  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.27",
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",