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.
- package/dist/components/EdgeRenderer.d.ts +3 -1
- package/dist/components/EdgeRenderer.d.ts.map +1 -1
- package/dist/components/EdgeRenderer.js +3 -2
- package/dist/components/EdgeRenderer.js.map +1 -1
- package/dist/components/NodeRenderer.d.ts +5 -1
- package/dist/components/NodeRenderer.d.ts.map +1 -1
- package/dist/components/NodeRenderer.js +10 -4
- package/dist/components/NodeRenderer.js.map +1 -1
- package/dist/components/RevealsLayer.d.ts +11 -0
- package/dist/components/RevealsLayer.d.ts.map +1 -0
- package/dist/components/RevealsLayer.js +319 -0
- package/dist/components/RevealsLayer.js.map +1 -0
- package/dist/components/SearchOverlay.d.ts +22 -0
- package/dist/components/SearchOverlay.d.ts.map +1 -0
- package/dist/components/SearchOverlay.js +107 -0
- package/dist/components/SearchOverlay.js.map +1 -0
- package/dist/components/SystemCanvas.d.ts.map +1 -1
- package/dist/components/SystemCanvas.js +54 -4
- package/dist/components/SystemCanvas.js.map +1 -1
- package/dist/components/Viewport.d.ts +4 -0
- package/dist/components/Viewport.d.ts.map +1 -1
- package/dist/components/Viewport.js +11 -3
- package/dist/components/Viewport.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -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;
|
|
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
|
-
|
|
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":";AAOA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,YAAY,GACb,MAAM,eAAe,CAAA;
|
|
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;
|
|
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,
|
|
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) =>
|
|
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
|
-
|
|
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":";AAEA,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;
|
|
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"}
|