system-canvas-react 0.2.8 → 0.2.9

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.
@@ -12,11 +12,13 @@ interface EdgeRendererProps {
12
12
  selectedId?: string | null;
13
13
  /** Id of the edge whose label is currently being edited (label is hidden) */
14
14
  editingId?: string | null;
15
+ /** Node ids that are dimmed (search/category filter). Edges connected to dimmed nodes render as dotted lines. */
16
+ dimmedNodeIds?: Set<string>;
15
17
  }
16
18
  /**
17
19
  * Renders all edges. Edges are drawn before nodes in the SVG so they
18
20
  * appear behind node rectangles (painter's model).
19
21
  */
20
- export declare function EdgeRenderer({ edges, nodeMap, theme, defaultEdgeStyle, onClick, onDoubleClick, onContextMenu, selectedId, editingId, }: EdgeRendererProps): import("react/jsx-runtime").JSX.Element;
22
+ export declare function EdgeRenderer({ edges, nodeMap, theme, defaultEdgeStyle, onClick, onDoubleClick, onContextMenu, selectedId, editingId, dimmedNodeIds, }: EdgeRendererProps): import("react/jsx-runtime").JSX.Element;
21
23
  export {};
22
24
  //# sourceMappingURL=EdgeRenderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EdgeRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACV,MAAM,eAAe,CAAA;AAOtB,UAAU,iBAAiB;IACzB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAClC,KAAK,EAAE,WAAW,CAAA;IAClB,gBAAgB,EAAE,SAAS,CAAA;IAC3B,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IAC5D,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACnE,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IAClE,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,aAAa,EACb,UAAU,EACV,SAAS,GACV,EAAE,iBAAiB,2CA8HnB"}
1
+ {"version":3,"file":"EdgeRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EdgeRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACV,MAAM,eAAe,CAAA;AAOtB,UAAU,iBAAiB;IACzB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAClC,KAAK,EAAE,WAAW,CAAA;IAClB,gBAAgB,EAAE,SAAS,CAAA;IAC3B,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IAC5D,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACnE,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IAClE,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,iHAAiH;IACjH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,aAAa,EACb,UAAU,EACV,SAAS,EACT,aAAa,GACd,EAAE,iBAAiB,2CAmInB"}
@@ -4,7 +4,7 @@ import { computeEdgePath, computeEdgeMidpoint, resolveColor, } from 'system-canv
4
4
  * Renders all edges. Edges are drawn before nodes in the SVG so they
5
5
  * appear behind node rectangles (painter's model).
6
6
  */
7
- export function EdgeRenderer({ edges, nodeMap, theme, defaultEdgeStyle, onClick, onDoubleClick, onContextMenu, selectedId, editingId, }) {
7
+ export function EdgeRenderer({ edges, nodeMap, theme, defaultEdgeStyle, onClick, onDoubleClick, onContextMenu, selectedId, editingId, dimmedNodeIds, }) {
8
8
  return (_jsxs(_Fragment, { children: [_jsx("defs", { children: _jsx("marker", { id: "system-canvas-arrowhead", markerWidth: theme.edge.arrowSize, markerHeight: theme.edge.arrowSize * 0.7, refX: theme.edge.arrowSize - 1, refY: theme.edge.arrowSize * 0.35, orient: "auto", markerUnits: "userSpaceOnUse", children: _jsx("polygon", { points: `0 0, ${theme.edge.arrowSize} ${theme.edge.arrowSize * 0.35}, 0 ${theme.edge.arrowSize * 0.7}`, fill: "context-stroke" }) }) }), [...edges]
9
9
  .map((edge, i) => ({ edge, i }))
10
10
  .sort((a, b) => {
@@ -40,7 +40,8 @@ export function EdgeRenderer({ edges, nodeMap, theme, defaultEdgeStyle, onClick,
40
40
  const toEnd = edge.toEnd ?? 'arrow';
41
41
  const fromEnd = edge.fromEnd ?? 'none';
42
42
  const arrowId = 'system-canvas-arrowhead';
43
- return (_jsxs("g", { className: "system-canvas-edge", style: { cursor: 'pointer' }, onClick: (e) => onClick(edge, e), onDoubleClick: (e) => onDoubleClick?.(edge, e), onContextMenu: (e) => onContextMenu(edge, e), children: [_jsx("path", { d: pathD, fill: "none", stroke: "transparent", strokeWidth: 12 }), _jsx("path", { d: pathD, fill: "none", stroke: edgeColor, strokeWidth: strokeWidth, markerEnd: toEnd === 'arrow' ? `url(#${arrowId})` : undefined, markerStart: fromEnd === 'arrow' ? `url(#${arrowId})` : undefined }), edge.label && !isEditing && (_jsxs(_Fragment, { children: [_jsx("rect", { x: midpoint.x - edge.label.length * 3 - 4, y: midpoint.y - theme.edge.labelFontSize - 2, width: edge.label.length * 6 + 8, height: theme.edge.labelFontSize + 6, rx: 3, fill: theme.background, opacity: 0.8 }), _jsx("text", { x: midpoint.x, y: midpoint.y, fill: isSelected ? theme.node.labelColor : theme.edge.labelColor, fontSize: theme.edge.labelFontSize, fontFamily: theme.node.fontFamily, textAnchor: "middle", pointerEvents: "none", children: edge.label })] }))] }, edge.id));
43
+ const isEdgeDimmed = (dimmedNodeIds?.has(edge.fromNode) || dimmedNodeIds?.has(edge.toNode)) ?? false;
44
+ return (_jsxs("g", { className: "system-canvas-edge", style: { cursor: 'pointer' }, onClick: (e) => onClick(edge, e), onDoubleClick: (e) => onDoubleClick?.(edge, e), onContextMenu: (e) => onContextMenu(edge, e), children: [_jsx("path", { d: pathD, fill: "none", stroke: "transparent", strokeWidth: 12 }), _jsx("path", { d: pathD, fill: "none", stroke: edgeColor, strokeWidth: strokeWidth, strokeDasharray: isEdgeDimmed ? '4 4' : undefined, strokeOpacity: isEdgeDimmed ? 0.3 : 1, markerEnd: toEnd === 'arrow' ? `url(#${arrowId})` : undefined, markerStart: fromEnd === 'arrow' ? `url(#${arrowId})` : undefined }), edge.label && !isEditing && (_jsxs(_Fragment, { children: [_jsx("rect", { x: midpoint.x - edge.label.length * 3 - 4, y: midpoint.y - theme.edge.labelFontSize - 2, width: edge.label.length * 6 + 8, height: theme.edge.labelFontSize + 6, rx: 3, fill: theme.background, opacity: 0.8 }), _jsx("text", { x: midpoint.x, y: midpoint.y, fill: isSelected ? theme.node.labelColor : theme.edge.labelColor, fontSize: theme.edge.labelFontSize, fontFamily: theme.node.fontFamily, textAnchor: "middle", pointerEvents: "none", children: edge.label })] }))] }, edge.id));
44
45
  })] }));
45
46
  }
46
47
  //# sourceMappingURL=EdgeRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeRenderer.js","sourceRoot":"","sources":["../../src/components/EdgeRenderer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EdgeRenderer.js","sourceRoot":"","sources":["../../src/components/EdgeRenderer.tsx"],"names":[],"mappings":"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"}
@@ -27,6 +27,10 @@ interface NodeRendererProps {
27
27
  * Callers can use this to interleave edges between groups and other nodes.
28
28
  */
29
29
  only?: 'groups' | 'non-groups';
30
+ /** Nodes that should render at low opacity (search/category filter). */
31
+ dimmedNodeIds?: Set<string>;
32
+ /** Nodes that should render with a highlight ring (search match). */
33
+ highlightedNodeIds?: Set<string>;
30
34
  }
31
35
  /**
32
36
  * Renders all nodes, dispatching to the appropriate type-specific component.
@@ -40,6 +44,6 @@ interface NodeRendererProps {
40
44
  * `<g>` so slot primitives paint above the body but below the ref
41
45
  * indicator and resize handles.
42
46
  */
43
- export declare function NodeRenderer({ nodes, theme, onClick, onDoubleClick, onContextMenu, onNavigate, onPointerDown, selectedIds, editingId, onResizeHandlePointerDown, canvases, only, }: NodeRendererProps): import("react/jsx-runtime").JSX.Element;
47
+ export declare function NodeRenderer({ nodes, theme, onClick, onDoubleClick, onContextMenu, onNavigate, onPointerDown, selectedIds, editingId, onResizeHandlePointerDown, canvases, only, dimmedNodeIds, highlightedNodeIds, }: NodeRendererProps): import("react/jsx-runtime").JSX.Element;
44
48
  export { CategorySlotsLayer };
45
49
  //# sourceMappingURL=NodeRenderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeRenderer.d.ts","sourceRoot":"","sources":["../../src/components/NodeRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAW1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,KAAK,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IAC9D,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACpE,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACpE,UAAU,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACjE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAA;IACvE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,yBAAyB,CAAC,EAAE,CAC1B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,KAAK,CAAC,YAAY,KACtB,IAAI,CAAA;IACT;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACrC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAA;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,OAAO,EACP,aAAa,EACb,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,SAAS,EACT,yBAAyB,EACzB,QAAQ,EACR,IAAI,GACL,EAAE,iBAAiB,2CAmFnB;AAaD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
1
+ {"version":3,"file":"NodeRenderer.d.ts","sourceRoot":"","sources":["../../src/components/NodeRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAW1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,KAAK,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IAC9D,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACpE,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACpE,UAAU,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACjE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAA;IACvE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,yBAAyB,CAAC,EAAE,CAC1B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,KAAK,CAAC,YAAY,KACtB,IAAI,CAAA;IACT;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACrC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAA;IAC9B,wEAAwE;IACxE,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,OAAO,EACP,aAAa,EACb,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,SAAS,EACT,yBAAyB,EACzB,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,kBAAkB,GACnB,EAAE,iBAAiB,2CA6HnB;AAaD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { computeReflowReservations, getCategorySlots, pickRefIndicatorCorner, } from 'system-canvas';
3
3
  import { TextNode } from './TextNode.js';
4
4
  import { FileNode } from './FileNode.js';
@@ -18,7 +18,7 @@ import { CategorySlotsLayer } from './CategorySlotsLayer.js';
18
18
  * `<g>` so slot primitives paint above the body but below the ref
19
19
  * indicator and resize handles.
20
20
  */
21
- export function NodeRenderer({ nodes, theme, onClick, onDoubleClick, onContextMenu, onNavigate, onPointerDown, selectedIds, editingId, onResizeHandlePointerDown, canvases, only, }) {
21
+ export function NodeRenderer({ nodes, theme, onClick, onDoubleClick, onContextMenu, onNavigate, onPointerDown, selectedIds, editingId, onResizeHandlePointerDown, canvases, only, dimmedNodeIds, highlightedNodeIds, }) {
22
22
  const groups = nodes.filter((n) => n.type === 'group');
23
23
  const others = nodes.filter((n) => n.type !== 'group');
24
24
  const common = (node) => {
@@ -56,10 +56,16 @@ export function NodeRenderer({ nodes, theme, onClick, onDoubleClick, onContextMe
56
56
  // drawing non-groups (or everything), so they end up above edges and nodes.
57
57
  const renderResizeHandles = only !== 'groups' && selectedNode && onResizeHandlePointerDown;
58
58
  return (_jsxs(_Fragment, { children: [only !== 'non-groups' &&
59
- groups.map((node) => _jsx(GroupNode, { ...common(node) }, node.id)), only !== 'groups' &&
59
+ groups.map((node) => {
60
+ const isDimmed = dimmedNodeIds?.has(node.id) ?? false;
61
+ const isHighlighted = highlightedNodeIds?.has(node.id) ?? false;
62
+ return (_jsxs("g", { opacity: isDimmed ? 0.15 : 1, children: [isHighlighted && (_jsx("rect", { x: node.x - 4, y: node.y - 4, width: node.width + 8, height: node.height + 8, rx: 6, fill: "none", stroke: theme.node.labelColor, strokeWidth: 2, opacity: 0.6, pointerEvents: "none" })), _jsx(GroupNode, { ...common(node) })] }, node.id));
63
+ }), only !== 'groups' &&
60
64
  others.map((node) => {
61
65
  const Component = getNodeComponent(node.type);
62
- return _jsx(Component, { ...common(node) }, node.id);
66
+ const isDimmed = dimmedNodeIds?.has(node.id) ?? false;
67
+ const isHighlighted = highlightedNodeIds?.has(node.id) ?? false;
68
+ return (_jsxs("g", { opacity: isDimmed ? 0.15 : 1, children: [isHighlighted && (_jsx("rect", { x: node.x - 4, y: node.y - 4, width: node.width + 8, height: node.height + 8, rx: 6, fill: "none", stroke: theme.node.labelColor, strokeWidth: 2, opacity: 0.6, pointerEvents: "none" })), _jsx(Component, { ...common(node) })] }, node.id));
63
69
  }), renderResizeHandles && (_jsx(ResizeHandles, { node: selectedNode, theme: theme, onHandlePointerDown: onResizeHandlePointerDown })), renderResizeHandles &&
64
70
  (() => {
65
71
  const slots = getCategorySlots(selectedNode, theme);
@@ -1 +1 @@
1
- {"version":3,"file":"NodeRenderer.js","sourceRoot":"","sources":["../../src/components/NodeRenderer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NodeRenderer.js","sourceRoot":"","sources":["../../src/components/NodeRenderer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CanvasData, CanvasTheme, ResolvedNode, ViewportState } from 'system-canvas';
2
+ interface RevealsLayerProps {
3
+ nodes: ResolvedNode[];
4
+ theme: CanvasTheme;
5
+ canvases?: Record<string, CanvasData>;
6
+ /** Stable getter for the current viewport (pan + zoom). */
7
+ getViewport: () => ViewportState;
8
+ }
9
+ export declare function RevealsLayer({ nodes, theme, canvases, getViewport, }: RevealsLayerProps): import("react/jsx-runtime").JSX.Element | null;
10
+ export {};
11
+ //# sourceMappingURL=RevealsLayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RevealsLayer.d.ts","sourceRoot":"","sources":["../../src/components/RevealsLayer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAEV,WAAW,EAGX,YAAY,EAQZ,aAAa,EACd,MAAM,eAAe,CAAA;AAkCtB,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,KAAK,EAAE,WAAW,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACrC,2DAA2D;IAC3D,WAAW,EAAE,MAAM,aAAa,CAAA;CACjC;AAeD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,GACZ,EAAE,iBAAiB,kDAyGnB"}
@@ -0,0 +1,319 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { computeRevealOpacity, computeRevealRegion, getCategoryReveals, measureTextWidth, resolveRevealAccessor, resolveRevealThresholds, revealEntries, rollupNodes, truncateToWidth, wrapTextWithBreaks, } from 'system-canvas';
4
+ import { NodeIcon } from './NodeIcon.js';
5
+ export function RevealsLayer({ nodes, theme, canvases, getViewport, }) {
6
+ // Snapshot of the zoom value that controls which reveals are mounted.
7
+ // Updated only when a reveal crosses its `[threshold - fadeWindow,
8
+ // threshold]` band — i.e. enters or leaves the "alive" range. Inside
9
+ // the band we update opacity via direct DOM writes (see below).
10
+ const [zoomTick, setZoomTick] = useState(getViewport().zoom);
11
+ // Latest known zoom — used by the DOM-write opacity tick and read by
12
+ // accessors so they see a consistent value within a frame.
13
+ const zoomRef = useRef(getViewport().zoom);
14
+ useEffect(() => {
15
+ let raf = 0;
16
+ let lastZoom = -Infinity;
17
+ let lastTickedZoom = zoomTick;
18
+ const tick = () => {
19
+ const vp = getViewport();
20
+ const z = vp.zoom;
21
+ zoomRef.current = z;
22
+ if (z !== lastZoom) {
23
+ lastZoom = z;
24
+ // Update opacity on every mounted reveal via direct DOM writes.
25
+ // This avoids a React re-render for every frame while the
26
+ // panels are inside a fade window. The wrapping <g> uses
27
+ // `data-reveal-id` so we can find them without a ref-per-node
28
+ // bookkeeping dance.
29
+ if (rootRef.current) {
30
+ const groups = rootRef.current.querySelectorAll('[data-reveal-key]');
31
+ for (const g of Array.from(groups)) {
32
+ const t = parseFloat(g.dataset.threshold ?? 'NaN');
33
+ const f = parseFloat(g.dataset.fadeWindow ?? 'NaN');
34
+ if (Number.isFinite(t) && Number.isFinite(f)) {
35
+ const op = computeRevealOpacity(z, t, f);
36
+ g.style.opacity = String(op);
37
+ }
38
+ }
39
+ }
40
+ // Decide whether the mount set should change. We re-render
41
+ // when crossing the "alive vs. not" boundary for any reveal,
42
+ // approximated by checking whether the integer-floored
43
+ // distance-to-threshold band has changed for any active
44
+ // category-bearing node. Cheaper proxy: re-tick state when
45
+ // the zoom changes by more than 0.02 — that's enough to keep
46
+ // the mount/unmount transitions sharp without thrashing.
47
+ if (Math.abs(z - lastTickedZoom) >= 0.02) {
48
+ lastTickedZoom = z;
49
+ setZoomTick(z);
50
+ }
51
+ }
52
+ raf = requestAnimationFrame(tick);
53
+ };
54
+ raf = requestAnimationFrame(tick);
55
+ return () => cancelAnimationFrame(raf);
56
+ }, [getViewport, zoomTick]);
57
+ const rootRef = useRef(null);
58
+ // Compute the active set off the most recent state-tick zoom. This is
59
+ // recomputed when nodes/theme/canvases change OR when the zoom-tick
60
+ // crosses the 0.02 threshold above. Inside that window opacity is
61
+ // animated directly via DOM writes.
62
+ const active = computeActiveReveals(nodes, theme, canvases, zoomTick);
63
+ if (active.length === 0)
64
+ return null;
65
+ return (_jsx("g", { ref: rootRef, className: "system-canvas-reveals", pointerEvents: "none", children: active.map((entry) => {
66
+ const { threshold, fadeWindow } = resolveRevealThresholds(entry.spec, theme);
67
+ const key = `${entry.node.id}:${entry.placement}`;
68
+ return (_jsx("g", { "data-reveal-key": key, "data-threshold": threshold, "data-fade-window": fadeWindow, style: { opacity: entry.opacity }, children: _jsx(RevealRenderer, { node: entry.node, theme: theme, canvases: canvases, placement: entry.placement, spec: entry.spec, region: entry.region, zoom: zoomRef.current, opacity: entry.opacity }) }, key));
69
+ }) }));
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Active-set computation
73
+ // ---------------------------------------------------------------------------
74
+ function computeActiveReveals(nodes, theme, canvases, zoom) {
75
+ const out = [];
76
+ for (const node of nodes) {
77
+ const reveals = getCategoryReveals(node, theme);
78
+ if (!reveals)
79
+ continue;
80
+ for (const [placement, spec] of revealEntries(reveals)) {
81
+ const { threshold, fadeWindow } = resolveRevealThresholds(spec, theme);
82
+ // Below the fade band → skip entirely so no SVG is produced.
83
+ if (zoom < threshold - fadeWindow)
84
+ continue;
85
+ const region = computeRevealRegion(node, theme, placement, spec);
86
+ const opacity = computeRevealOpacity(zoom, threshold, fadeWindow);
87
+ // Build the context once so the visible-gate accessor sees the
88
+ // same values as the renderer does.
89
+ const ctx = buildRevealContext({
90
+ node,
91
+ theme,
92
+ region,
93
+ placement,
94
+ zoom,
95
+ opacity,
96
+ canvases,
97
+ });
98
+ if (spec.visible !== undefined) {
99
+ const v = resolveRevealAccessor(spec.visible, ctx);
100
+ if (!v)
101
+ continue;
102
+ }
103
+ out.push({ node, placement, spec, region, opacity });
104
+ }
105
+ }
106
+ return out;
107
+ }
108
+ function buildRevealContext(args) {
109
+ const { node, theme, region, placement, zoom, opacity, canvases } = args;
110
+ const getSubCanvas = (ref) => canvases?.[ref];
111
+ return {
112
+ node,
113
+ theme,
114
+ region,
115
+ placement,
116
+ zoom,
117
+ opacity,
118
+ getSubCanvas,
119
+ canvases,
120
+ rollup: (predicate) => node.ref
121
+ ? rollupNodes(getSubCanvas(node.ref), predicate)
122
+ : { total: 0, matched: 0, fraction: 0 },
123
+ };
124
+ }
125
+ function RevealRenderer(props) {
126
+ const { spec } = props;
127
+ switch (spec.kind) {
128
+ case 'text':
129
+ return _jsx(TextRevealRenderer, { ...props, spec: spec });
130
+ case 'list':
131
+ return _jsx(ListRevealRenderer, { ...props, spec: spec });
132
+ case 'metrics':
133
+ return _jsx(MetricsRevealRenderer, { ...props, spec: spec });
134
+ case 'custom':
135
+ return _jsx(CustomRevealRenderer, { ...props });
136
+ default:
137
+ return null;
138
+ }
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Shared helpers
142
+ // ---------------------------------------------------------------------------
143
+ /** Paint the optional panel background (fill + border) behind a reveal. */
144
+ function PanelBackground({ region, theme, }) {
145
+ const td = theme.reveals;
146
+ const fill = td?.panelFill;
147
+ const stroke = td?.panelStroke;
148
+ const rx = td?.panelCornerRadius ?? 6;
149
+ if (!fill && !stroke)
150
+ return null;
151
+ return (_jsx("rect", { x: region.x, y: region.y, width: region.width, height: region.height, rx: rx, fill: fill ?? 'none', stroke: stroke ?? 'none', strokeWidth: stroke ? 1 : 0 }));
152
+ }
153
+ /**
154
+ * Build the per-reveal `RevealContext` for accessor calls inside a
155
+ * specific renderer. Mirrors `buildRevealContext` above but the
156
+ * `canvases` map flows in as a prop so the closure stays cheap.
157
+ */
158
+ function makeCtx(props) {
159
+ return buildRevealContext(props);
160
+ }
161
+ /**
162
+ * Resolve a `NodeAccessor<string | null | undefined>` and coerce the
163
+ * result into a string suitable for rendering (or null to skip).
164
+ */
165
+ function resolveTextField(accessor, ctx) {
166
+ if (accessor === undefined)
167
+ return null;
168
+ const v = resolveRevealAccessor(accessor, ctx);
169
+ if (v === null || v === undefined)
170
+ return null;
171
+ return String(v);
172
+ }
173
+ // ---------------------------------------------------------------------------
174
+ // kind: 'text' — headline + body + optional leading icon
175
+ // ---------------------------------------------------------------------------
176
+ const PANEL_PAD_X = 12;
177
+ const PANEL_PAD_Y = 10;
178
+ function TextRevealRenderer(props) {
179
+ const { node, theme, region, spec } = props;
180
+ const ctx = makeCtx(props);
181
+ const headline = resolveTextField(spec.headline, ctx);
182
+ const body = resolveTextField(spec.body, ctx);
183
+ const iconName = resolveTextField(spec.icon, ctx);
184
+ if (!headline && !body)
185
+ return null;
186
+ const fontSize = theme.node.fontSize;
187
+ const labelColor = resolveRevealAccessor(spec.headlineColor ?? theme.node.labelColor, ctx);
188
+ const bodyColor = resolveRevealAccessor(spec.bodyColor ?? theme.node.sublabelColor, ctx);
189
+ const iconColor = resolveRevealAccessor(spec.iconColor ?? node.resolvedStroke, ctx);
190
+ const align = spec.textAlign ?? 'start';
191
+ const iconSize = 14;
192
+ const iconGap = 8;
193
+ const contentLeft = region.x + PANEL_PAD_X + (iconName ? iconSize + iconGap : 0);
194
+ const contentRight = region.x + region.width - PANEL_PAD_X;
195
+ const contentWidth = Math.max(0, contentRight - contentLeft);
196
+ // Anchor x for proportional text alignment.
197
+ const anchorX = align === 'center'
198
+ ? region.x + region.width / 2
199
+ : align === 'end'
200
+ ? contentRight
201
+ : contentLeft;
202
+ const textAnchor = align === 'center' ? 'middle' : align === 'end' ? 'end' : 'start';
203
+ // Layout: headline near the top, body wrapping below.
204
+ const headlineFs = Math.round(fontSize * 1.05);
205
+ const bodyFs = fontSize;
206
+ const headlineY = region.y + PANEL_PAD_Y + headlineFs * 0.85;
207
+ const bodyStartY = headlineY + (headline ? headlineFs * 0.9 : 0);
208
+ const bodyLines = body
209
+ ? wrapTextWithBreaks(body, contentWidth, bodyFs)
210
+ : [];
211
+ const bodyLineHeight = Math.round(bodyFs * 1.35);
212
+ return (_jsxs("g", { children: [_jsx(PanelBackground, { region: region, theme: theme }), iconName && (_jsx(NodeIcon, { icon: iconName, x: region.x + PANEL_PAD_X, y: region.y + PANEL_PAD_Y - 1, size: iconSize, color: iconColor, opacity: 1, customIcons: theme.icons })), headline && (_jsx("text", { x: anchorX, y: headlineY, fill: labelColor, fontSize: headlineFs, fontFamily: theme.node.labelFont ?? theme.node.fontFamily, fontWeight: 600, textAnchor: textAnchor, children: headline })), bodyLines.length > 0 && (_jsx("text", { x: anchorX, y: bodyStartY, fill: bodyColor, fontSize: bodyFs, fontFamily: theme.node.fontFamily, textAnchor: textAnchor, children: bodyLines.map((line, i) => (_jsx("tspan", { x: anchorX, dy: i === 0 ? '1em' : bodyLineHeight, children: line }, i))) }))] }));
213
+ }
214
+ function ListRevealRenderer(props) {
215
+ const { theme, region, spec } = props;
216
+ const ctx = makeCtx(props);
217
+ const fontSize = spec.fontSize ?? theme.node.fontSize;
218
+ const rowH = spec.rowHeight ?? Math.round(fontSize * 1.6);
219
+ const alignValues = spec.alignValues ?? true;
220
+ const valueWeight = spec.valueWeight ?? 600;
221
+ const labelWeight = spec.labelWeight ?? 500;
222
+ // Resolve every row up front so we know which rows are renderable
223
+ // before we lay anything out.
224
+ const resolved = [];
225
+ for (const row of spec.rows) {
226
+ const value = resolveRevealAccessor(row.value, ctx);
227
+ if (value === null || value === undefined)
228
+ continue;
229
+ resolved.push({
230
+ icon: resolveTextField(row.icon, ctx),
231
+ iconColor: resolveRevealAccessor(row.iconColor ?? props.node.resolvedStroke, ctx),
232
+ label: resolveTextField(row.label, ctx),
233
+ value: String(value),
234
+ valueColor: resolveRevealAccessor(row.valueColor ?? theme.node.labelColor, ctx),
235
+ mono: row.mono ?? false,
236
+ });
237
+ }
238
+ if (resolved.length === 0)
239
+ return null;
240
+ const labelColor = theme.node.sublabelColor;
241
+ const iconSize = 13;
242
+ const iconGap = 8;
243
+ const labelGap = 10;
244
+ // Compute the label column width — used when `alignValues` is on to
245
+ // line every row's value at the same x.
246
+ const labelCol = alignValues
247
+ ? Math.max(0, ...resolved.map((r) => r.label ? measureTextWidth(r.label, fontSize) : 0))
248
+ : 0;
249
+ // x positions. We always inset by PANEL_PAD_X; icons (when present
250
+ // on any row) consume the leading column even on rows that don't
251
+ // have one, so labels/values line up vertically.
252
+ const anyIcon = resolved.some((r) => r.icon !== null);
253
+ const xIcon = region.x + PANEL_PAD_X;
254
+ const xLabel = xIcon + (anyIcon ? iconSize + iconGap : 0);
255
+ const xValue = xLabel + (labelCol > 0 ? labelCol + labelGap : 0);
256
+ const valueRight = region.x + region.width - PANEL_PAD_X;
257
+ const valueMaxWidth = Math.max(0, valueRight - xValue);
258
+ const fontFamily = theme.node.fontFamily;
259
+ const monoFamily = 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace';
260
+ return (_jsxs("g", { children: [_jsx(PanelBackground, { region: region, theme: theme }), resolved.map((r, i) => {
261
+ const baselineY = region.y + PANEL_PAD_Y + rowH * (i + 0.5) + fontSize * 0.36;
262
+ // Safety net so the lib never paints values that overflow the
263
+ // panel. Consumers who want middle-truncation or any other
264
+ // custom shape should slice/format the string inside their
265
+ // own accessor before returning it — `measureTextWidth` and
266
+ // `truncateToWidth` are both exported from core for that.
267
+ const renderedValue = truncateToWidth(r.value, valueMaxWidth, fontSize);
268
+ return (_jsxs("g", { children: [r.icon && (_jsx(NodeIcon, { icon: r.icon, x: xIcon, y: baselineY - fontSize, size: iconSize, color: r.iconColor, opacity: 1, customIcons: theme.icons })), r.label && (_jsx("text", { x: xLabel, y: baselineY, fill: labelColor, fontSize: fontSize, fontFamily: fontFamily, fontWeight: labelWeight, children: r.label })), _jsx("text", { x: xValue, y: baselineY, fill: r.valueColor, fontSize: fontSize, fontFamily: r.mono ? monoFamily : fontFamily, fontWeight: valueWeight, children: renderedValue })] }, i));
269
+ })] }));
270
+ }
271
+ function MetricsRevealRenderer(props) {
272
+ const { theme, region, spec } = props;
273
+ const ctx = makeCtx(props);
274
+ const resolved = [];
275
+ for (const block of spec.blocks) {
276
+ const value = resolveRevealAccessor(block.value, ctx);
277
+ if (value === null || value === undefined)
278
+ continue;
279
+ resolved.push({
280
+ label: resolveTextField(block.label, ctx),
281
+ value: String(value),
282
+ delta: resolveTextField(block.delta, ctx),
283
+ color: resolveRevealAccessor(block.color ?? theme.node.labelColor, ctx),
284
+ });
285
+ }
286
+ if (resolved.length === 0)
287
+ return null;
288
+ const fontSize = theme.node.fontSize;
289
+ const labelFs = Math.round(fontSize * 0.85);
290
+ const valueFs = Math.round(fontSize * 1.4);
291
+ const deltaFs = Math.round(fontSize * 0.85);
292
+ const fontFamily = theme.node.fontFamily;
293
+ // Evenly divide horizontal space between blocks.
294
+ const innerLeft = region.x + PANEL_PAD_X;
295
+ const innerRight = region.x + region.width - PANEL_PAD_X;
296
+ const innerWidth = Math.max(0, innerRight - innerLeft);
297
+ const blockWidth = innerWidth / resolved.length;
298
+ const topPad = PANEL_PAD_Y;
299
+ const labelY = region.y + topPad + labelFs * 0.85;
300
+ const valueY = labelY + valueFs * 0.95;
301
+ const deltaY = valueY + deltaFs * 1.1;
302
+ return (_jsxs("g", { children: [_jsx(PanelBackground, { region: region, theme: theme }), resolved.map((b, i) => {
303
+ const cx = innerLeft + blockWidth * (i + 0.5);
304
+ return (_jsxs("g", { children: [b.label && (_jsx("text", { x: cx, y: labelY, fill: theme.node.sublabelColor, fontSize: labelFs, fontFamily: fontFamily, fontWeight: 500, textAnchor: "middle", children: b.label })), _jsx("text", { x: cx, y: valueY, fill: b.color, fontSize: valueFs, fontFamily: theme.node.labelFont ?? fontFamily, fontWeight: 700, textAnchor: "middle", children: b.value }), b.delta && (_jsx("text", { x: cx, y: deltaY, fill: theme.node.sublabelColor, fontSize: deltaFs, fontFamily: fontFamily, textAnchor: "middle", children: b.delta }))] }, i));
305
+ })] }));
306
+ }
307
+ // ---------------------------------------------------------------------------
308
+ // kind: 'custom' — consumer escape hatch
309
+ // ---------------------------------------------------------------------------
310
+ function CustomRevealRenderer(props) {
311
+ const ctx = makeCtx(props);
312
+ const { spec } = props;
313
+ if (spec.kind !== 'custom')
314
+ return null;
315
+ const out = spec.render(ctx);
316
+ // React accepts most node shapes — coerce to ReactNode via the cast.
317
+ return _jsx(_Fragment, { children: out });
318
+ }
319
+ //# sourceMappingURL=RevealsLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RevealsLayer.js","sourceRoot":"","sources":["../../src/components/RevealsLayer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { CanvasTheme } from 'system-canvas';
2
+ interface SearchOverlayProps {
3
+ open: boolean;
4
+ query: string;
5
+ onQueryChange: (q: string) => void;
6
+ theme: CanvasTheme;
7
+ hiddenCategories: Set<string>;
8
+ onToggleCategory: (cat: string) => void;
9
+ matchCount: number;
10
+ totalCount: number;
11
+ onClose: () => void;
12
+ onPanToMatch: () => void;
13
+ }
14
+ /**
15
+ * Floating search + category-filter overlay, rendered as a pill-shaped HTML
16
+ * overlay centered at the top of the canvas container.
17
+ *
18
+ * Returns null when `open` is false — zero cost when inactive.
19
+ */
20
+ export declare function SearchOverlay({ open, query, onQueryChange, theme, hiddenCategories, onToggleCategory, matchCount, totalCount, onClose, onPanToMatch, }: SearchOverlayProps): import("react/jsx-runtime").JSX.Element | null;
21
+ export {};
22
+ //# sourceMappingURL=SearchOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchOverlay.d.ts","sourceRoot":"","sources":["../../src/components/SearchOverlay.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,KAAK,EAAE,WAAW,CAAA;IAClB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7B,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,OAAO,EACP,YAAY,GACb,EAAE,kBAAkB,kDA0KpB"}