@almadar/ui 5.133.0 → 5.135.0

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.
@@ -8,9 +8,9 @@ export { A as AudioManifest, G as GameAudioContext, a as GameAudioContextValue,
8
8
  import { SExpr } from '@almadar/evaluator';
9
9
  import { U as UnitAnimationState, F as FacingDirection, S as SpriteSheetUrls, d as SpriteFrameDims, R as ResolvedFrame, a as IsometricUnit, C as CameraState, e as FieldInfo, f as OrbitalTraitInfo, g as OrbitalPageInfo, T as TraitLevelData, E as ExternalLink } from '../avl-schema-parser-B8Onmfsu.cjs';
10
10
  export { B as BoardTile, G as GameAction, h as GamePhase, i as GameState, j as GameUnit, b as IsometricFeature, I as IsometricTile, P as Position, k as UnitTrait, l as calculateAttackTargets, m as calculateValidMoves, n as createInitialGameState } from '../avl-schema-parser-B8Onmfsu.cjs';
11
- import { D as DrawableNode } from '../paintDispatch-BXJgISot.cjs';
12
- import { C as ContentSegment, b as DomLayoutData, d as DomStateNode, V as VisualizerConfig, e as DomTransitionLabel } from '../cn-D3H9UzCW.cjs';
13
- export { n as cn } from '../cn-D3H9UzCW.cjs';
11
+ import { D as DrawableNode } from '../paintDispatch-Bl2sfRFb.cjs';
12
+ import { C as ContentSegment, b as DomLayoutData, d as DomStateNode, V as VisualizerConfig, e as DomTransitionLabel } from '../cn-B8GXqrtp.cjs';
13
+ export { n as cn } from '../cn-B8GXqrtp.cjs';
14
14
  import { b as SlotContent } from '../useUISlots-BesZYMks.cjs';
15
15
  export { D as DEFAULT_SLOTS, S as SlotAnimation, a as SlotChangeCallback, c as SlotRenderConfig, U as UISlotManager, u as useUISlotManager } from '../useUISlots-BesZYMks.cjs';
16
16
  export { ALMADAR_DND_MIME, AuthContextValue, AuthUser, CanvasGestureCallbacks, CanvasGestureHandlers, CompileResult, CompileStage, DragReorderResult, DraggablePayload, Extension, ExtensionManifest, FileSystemFile, FileSystemStatus, GitHubRepo, GitHubStatus, HistoryChangeSummary, HistoryTimelineItem, I18nContextValue, I18nProvider, InfiniteScrollOptions, InfiniteScrollResult, LongPressHandlers, LongPressOptions, OpenFile, Positioned, PullToRefreshOptions, PullToRefreshResult, QuerySingletonEntity, QuerySingletonResult, QuerySingletonState, QueryState, RenderInterpolationHandle, RenderInterpolationOptions, RevertResult, SelectedFile, SharedEntityStore, SharedEntityStoreContext, SharedEntitySubscriber, SharedEntityWriter, SwipeGestureOptions, SwipeGestureResult, SwipeHandlers, TapRevealOptions, TapRevealResult, TraitListenSpec, TranslateFunction, UseCanvasGesturesOptions, UseCompileResult, UseDraggableOptions, UseDraggableResult, UseDropZoneOptions, UseDropZoneResult, UseExtensionsOptions, UseExtensionsResult, UseFileEditorOptions, UseFileEditorResult, UseFileSystemResult, UseOrbitalHistoryOptions, UseOrbitalHistoryResult, createSharedEntityStore, createTranslate, parseQueryBinding, runTickFrame, useAgentChat, useAuthContext, useCanvasGestures, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useExtensions, useFileEditor, useFileSystem, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useInfiniteScroll, useLongPress, useMediaQuery, useOrbitalHistory, usePreview, usePullToRefresh, useQuerySingleton, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSharedEntityStoreContext, useSwipeGesture, useTapReveal, useTraitListens, useTranslate, useUIEvents, useValidation } from '../hooks/index.cjs';
@@ -1131,6 +1131,12 @@ interface TypographyProps {
1131
1131
  className?: string;
1132
1132
  /** Inline style */
1133
1133
  style?: React__default.CSSProperties;
1134
+ /**
1135
+ * Value formatting applied to string/number/Date content — `none` (the
1136
+ * default) renders content as-is. Covers the raw-ISO-date class: a bound
1137
+ * datetime renders human-readable via `format="date"|"time"|"datetime"`.
1138
+ */
1139
+ format?: "none" | "date" | "time" | "datetime" | "number" | "currency" | "percent";
1134
1140
  /** Text content (alternative to children) */
1135
1141
  content?: React__default.ReactNode;
1136
1142
  /** Children elements */
@@ -6436,7 +6442,9 @@ declare namespace DataGrid {
6436
6442
  *
6437
6443
  * A simplified, schema-driven list for iterating over entity data.
6438
6444
  * Extracted from the List organism with all complexity removed:
6439
- * no built-in search, sort, filter, selection, bulk actions, or custom renderers.
6445
+ * no built-in search, filter, selection, bulk actions, or custom renderers.
6446
+ * Ordering is available via `sortBy`/`sortDirection`, but it orders only the
6447
+ * rows handed in — a set larger than its `limit` must be ordered upstream.
6440
6448
  *
6441
6449
  * Accepts `fields` config for per-field rendering control (icon, variant, format)
6442
6450
  * and `itemActions` for per-item event bus wiring.
@@ -6503,8 +6511,20 @@ interface DataListProps extends DataDndProps {
6503
6511
  groupBy?: string;
6504
6512
  /** Field name identifying the sender (used with variant: "message") */
6505
6513
  senderField?: string;
6514
+ /**
6515
+ * Field holding the sender's human-readable name (used with variant: "message").
6516
+ * Defaults to `senderField`. Set this when `senderField` holds an id — an
6517
+ * id-keyed thread otherwise labels bubbles `staff-1` instead of `Sam Staff`.
6518
+ */
6519
+ senderLabelField?: string;
6506
6520
  /** Current user identifier; messages matching this value align right (used with variant: "message") */
6507
6521
  currentUser?: string;
6522
+ /**
6523
+ * Message shown when there are no rows. Falls back to the generic
6524
+ * "no items" translation. `TableView` already exposes this; an agenda or an
6525
+ * inbox wants to say what "empty" means in its own words.
6526
+ */
6527
+ emptyMessage?: string;
6508
6528
  /** Additional CSS classes */
6509
6529
  className?: string;
6510
6530
  /** Loading state */
@@ -6547,13 +6567,25 @@ interface DataListProps extends DataDndProps {
6547
6567
  renderItem?: (item: EntityRow, index: number) => React__default.ReactNode;
6548
6568
  /** Max items to show before "Show More" button. Defaults to 5. Set to 0 to disable. */
6549
6569
  pageSize?: number;
6570
+ /**
6571
+ * Field name to order rows by. Values are compared by their own type —
6572
+ * numbers numerically, date-like strings chronologically, everything else
6573
+ * alphabetically — never by what the field is called. Empty cells sort last.
6574
+ * Unset leaves the incoming order untouched.
6575
+ *
6576
+ * Orders only the rows already fetched: a collection larger than its `limit`
6577
+ * still needs ordering at the data layer.
6578
+ */
6579
+ sortBy?: string;
6580
+ /** Direction for `sortBy`. Defaults to ascending. */
6581
+ sortDirection?: "asc" | "desc";
6550
6582
  /**
6551
6583
  * Layer 2 visual treatment — mirrors the `entity-table` look enum so
6552
6584
  * data-grid / data-list / entity-table share one knob name from authors.
6553
6585
  */
6554
6586
  look?: "dense" | "spacious" | "striped" | "borderless" | "card-rows";
6555
6587
  }
6556
- declare function DataList({ entity, fields, columns, itemActions, maxInlineActions, itemClickEvent, gap, variant, groupBy, senderField, currentUser, className, isLoading, error, reorderable: _reorderable, reorderEvent: _reorderEvent, swipeLeftEvent: _swipeLeftEvent, swipeLeftActions: _swipeLeftActions, swipeRightEvent: _swipeRightEvent, swipeRightActions: _swipeRightActions, longPressEvent: _longPressEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, renderItem: schemaRenderItem, dragGroup, accepts, sortable: sortableProp, dropEvent, reorderEvent: dndReorderEvent, positionEvent, dndItemIdField, dndRoot, look, }: DataListProps): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
6588
+ declare function DataList({ entity, fields, columns, itemActions, maxInlineActions, itemClickEvent, gap, variant, groupBy, senderField, senderLabelField, currentUser, emptyMessage, className, isLoading, error, reorderable: _reorderable, reorderEvent: _reorderEvent, swipeLeftEvent: _swipeLeftEvent, swipeLeftActions: _swipeLeftActions, swipeRightEvent: _swipeRightEvent, swipeRightActions: _swipeRightActions, longPressEvent: _longPressEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, sortBy, sortDirection, renderItem: schemaRenderItem, dragGroup, accepts, sortable: sortableProp, dropEvent, reorderEvent: dndReorderEvent, positionEvent, dndItemIdField, dndRoot, look, }: DataListProps): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
6557
6589
  declare namespace DataList {
6558
6590
  var displayName: string;
6559
6591
  }
@@ -9034,6 +9066,14 @@ declare const DocumentViewer: React__default.FC<DocumentViewerProps>;
9034
9066
  * - className for external styling
9035
9067
  */
9036
9068
 
9069
+ type GraphNodeMark = {
9070
+ kind: 'suggested';
9071
+ suggestionId: string;
9072
+ } | {
9073
+ kind: 'proposed';
9074
+ suggestionId: string;
9075
+ tint?: string;
9076
+ };
9037
9077
  type GraphNode = EventPayload & {
9038
9078
  id: string;
9039
9079
  label?: string;
@@ -9042,6 +9082,8 @@ type GraphNode = EventPayload & {
9042
9082
  size?: number;
9043
9083
  /** Merge-cluster count (drawn as a top-right badge; click expands). */
9044
9084
  badge?: number;
9085
+ /** Overlay decoration: a suggestion/proposal target. undefined = ordinary committed node. */
9086
+ mark?: GraphNodeMark;
9045
9087
  /** Position (optional, computed if missing) */
9046
9088
  x?: number;
9047
9089
  y?: number;
@@ -9079,6 +9121,8 @@ interface GraphCanvasProps {
9079
9121
  nodes?: readonly GraphNode[];
9080
9122
  /** Graph edges (the only rendered links) */
9081
9123
  edges?: readonly GraphEdge[];
9124
+ /** Uncommitted proposal links — rendered dashed/faint in a separate pass, never folded into the layout springs. */
9125
+ proposedEdges?: readonly GraphEdge[];
9082
9126
  /**
9083
9127
  * All-pairs similarity (cosine 0–1) used ONLY for layout, never drawn. It is the
9084
9128
  * secondary macro-layout: non-connected pairs get a weak spring (higher cosine ⇒
@@ -9098,6 +9142,8 @@ interface GraphCanvasProps {
9098
9142
  actions?: readonly GraphAction[];
9099
9143
  /** On node click */
9100
9144
  onNodeClick?: (node: GraphNode) => void;
9145
+ /** On marked-node click (suggestion/proposal target). Takes priority over onNodeClick. */
9146
+ onMarkClick?: (node: GraphNode) => void;
9101
9147
  /** On node double-click (e.g. to drill in) */
9102
9148
  onNodeDoubleClick?: (node: GraphNode) => void;
9103
9149
  /** On node badge click (e.g. to expand a merged cluster). */
@@ -8,9 +8,9 @@ export { A as AudioManifest, G as GameAudioContext, a as GameAudioContextValue,
8
8
  import { SExpr } from '@almadar/evaluator';
9
9
  import { U as UnitAnimationState, F as FacingDirection, S as SpriteSheetUrls, d as SpriteFrameDims, R as ResolvedFrame, a as IsometricUnit, C as CameraState, e as FieldInfo, f as OrbitalTraitInfo, g as OrbitalPageInfo, T as TraitLevelData, E as ExternalLink } from '../avl-schema-parser-B8Onmfsu.js';
10
10
  export { B as BoardTile, G as GameAction, h as GamePhase, i as GameState, j as GameUnit, b as IsometricFeature, I as IsometricTile, P as Position, k as UnitTrait, l as calculateAttackTargets, m as calculateValidMoves, n as createInitialGameState } from '../avl-schema-parser-B8Onmfsu.js';
11
- import { D as DrawableNode } from '../paintDispatch-BXJgISot.js';
12
- import { C as ContentSegment, b as DomLayoutData, d as DomStateNode, V as VisualizerConfig, e as DomTransitionLabel } from '../cn-Dm0VrLRG.js';
13
- export { n as cn } from '../cn-Dm0VrLRG.js';
11
+ import { D as DrawableNode } from '../paintDispatch-Bl2sfRFb.js';
12
+ import { C as ContentSegment, b as DomLayoutData, d as DomStateNode, V as VisualizerConfig, e as DomTransitionLabel } from '../cn-CZq0uJLA.js';
13
+ export { n as cn } from '../cn-CZq0uJLA.js';
14
14
  import { b as SlotContent } from '../useUISlots-BesZYMks.js';
15
15
  export { D as DEFAULT_SLOTS, S as SlotAnimation, a as SlotChangeCallback, c as SlotRenderConfig, U as UISlotManager, u as useUISlotManager } from '../useUISlots-BesZYMks.js';
16
16
  export { ALMADAR_DND_MIME, AuthContextValue, AuthUser, CanvasGestureCallbacks, CanvasGestureHandlers, CompileResult, CompileStage, DragReorderResult, DraggablePayload, Extension, ExtensionManifest, FileSystemFile, FileSystemStatus, GitHubRepo, GitHubStatus, HistoryChangeSummary, HistoryTimelineItem, I18nContextValue, I18nProvider, InfiniteScrollOptions, InfiniteScrollResult, LongPressHandlers, LongPressOptions, OpenFile, Positioned, PullToRefreshOptions, PullToRefreshResult, QuerySingletonEntity, QuerySingletonResult, QuerySingletonState, QueryState, RenderInterpolationHandle, RenderInterpolationOptions, RevertResult, SelectedFile, SharedEntityStore, SharedEntityStoreContext, SharedEntitySubscriber, SharedEntityWriter, SwipeGestureOptions, SwipeGestureResult, SwipeHandlers, TapRevealOptions, TapRevealResult, TraitListenSpec, TranslateFunction, UseCanvasGesturesOptions, UseCompileResult, UseDraggableOptions, UseDraggableResult, UseDropZoneOptions, UseDropZoneResult, UseExtensionsOptions, UseExtensionsResult, UseFileEditorOptions, UseFileEditorResult, UseFileSystemResult, UseOrbitalHistoryOptions, UseOrbitalHistoryResult, createSharedEntityStore, createTranslate, parseQueryBinding, runTickFrame, useAgentChat, useAuthContext, useCanvasGestures, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useExtensions, useFileEditor, useFileSystem, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useInfiniteScroll, useLongPress, useMediaQuery, useOrbitalHistory, usePreview, usePullToRefresh, useQuerySingleton, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSharedEntityStoreContext, useSwipeGesture, useTapReveal, useTraitListens, useTranslate, useUIEvents, useValidation } from '../hooks/index.js';
@@ -1131,6 +1131,12 @@ interface TypographyProps {
1131
1131
  className?: string;
1132
1132
  /** Inline style */
1133
1133
  style?: React__default.CSSProperties;
1134
+ /**
1135
+ * Value formatting applied to string/number/Date content — `none` (the
1136
+ * default) renders content as-is. Covers the raw-ISO-date class: a bound
1137
+ * datetime renders human-readable via `format="date"|"time"|"datetime"`.
1138
+ */
1139
+ format?: "none" | "date" | "time" | "datetime" | "number" | "currency" | "percent";
1134
1140
  /** Text content (alternative to children) */
1135
1141
  content?: React__default.ReactNode;
1136
1142
  /** Children elements */
@@ -6436,7 +6442,9 @@ declare namespace DataGrid {
6436
6442
  *
6437
6443
  * A simplified, schema-driven list for iterating over entity data.
6438
6444
  * Extracted from the List organism with all complexity removed:
6439
- * no built-in search, sort, filter, selection, bulk actions, or custom renderers.
6445
+ * no built-in search, filter, selection, bulk actions, or custom renderers.
6446
+ * Ordering is available via `sortBy`/`sortDirection`, but it orders only the
6447
+ * rows handed in — a set larger than its `limit` must be ordered upstream.
6440
6448
  *
6441
6449
  * Accepts `fields` config for per-field rendering control (icon, variant, format)
6442
6450
  * and `itemActions` for per-item event bus wiring.
@@ -6503,8 +6511,20 @@ interface DataListProps extends DataDndProps {
6503
6511
  groupBy?: string;
6504
6512
  /** Field name identifying the sender (used with variant: "message") */
6505
6513
  senderField?: string;
6514
+ /**
6515
+ * Field holding the sender's human-readable name (used with variant: "message").
6516
+ * Defaults to `senderField`. Set this when `senderField` holds an id — an
6517
+ * id-keyed thread otherwise labels bubbles `staff-1` instead of `Sam Staff`.
6518
+ */
6519
+ senderLabelField?: string;
6506
6520
  /** Current user identifier; messages matching this value align right (used with variant: "message") */
6507
6521
  currentUser?: string;
6522
+ /**
6523
+ * Message shown when there are no rows. Falls back to the generic
6524
+ * "no items" translation. `TableView` already exposes this; an agenda or an
6525
+ * inbox wants to say what "empty" means in its own words.
6526
+ */
6527
+ emptyMessage?: string;
6508
6528
  /** Additional CSS classes */
6509
6529
  className?: string;
6510
6530
  /** Loading state */
@@ -6547,13 +6567,25 @@ interface DataListProps extends DataDndProps {
6547
6567
  renderItem?: (item: EntityRow, index: number) => React__default.ReactNode;
6548
6568
  /** Max items to show before "Show More" button. Defaults to 5. Set to 0 to disable. */
6549
6569
  pageSize?: number;
6570
+ /**
6571
+ * Field name to order rows by. Values are compared by their own type —
6572
+ * numbers numerically, date-like strings chronologically, everything else
6573
+ * alphabetically — never by what the field is called. Empty cells sort last.
6574
+ * Unset leaves the incoming order untouched.
6575
+ *
6576
+ * Orders only the rows already fetched: a collection larger than its `limit`
6577
+ * still needs ordering at the data layer.
6578
+ */
6579
+ sortBy?: string;
6580
+ /** Direction for `sortBy`. Defaults to ascending. */
6581
+ sortDirection?: "asc" | "desc";
6550
6582
  /**
6551
6583
  * Layer 2 visual treatment — mirrors the `entity-table` look enum so
6552
6584
  * data-grid / data-list / entity-table share one knob name from authors.
6553
6585
  */
6554
6586
  look?: "dense" | "spacious" | "striped" | "borderless" | "card-rows";
6555
6587
  }
6556
- declare function DataList({ entity, fields, columns, itemActions, maxInlineActions, itemClickEvent, gap, variant, groupBy, senderField, currentUser, className, isLoading, error, reorderable: _reorderable, reorderEvent: _reorderEvent, swipeLeftEvent: _swipeLeftEvent, swipeLeftActions: _swipeLeftActions, swipeRightEvent: _swipeRightEvent, swipeRightActions: _swipeRightActions, longPressEvent: _longPressEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, renderItem: schemaRenderItem, dragGroup, accepts, sortable: sortableProp, dropEvent, reorderEvent: dndReorderEvent, positionEvent, dndItemIdField, dndRoot, look, }: DataListProps): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
6588
+ declare function DataList({ entity, fields, columns, itemActions, maxInlineActions, itemClickEvent, gap, variant, groupBy, senderField, senderLabelField, currentUser, emptyMessage, className, isLoading, error, reorderable: _reorderable, reorderEvent: _reorderEvent, swipeLeftEvent: _swipeLeftEvent, swipeLeftActions: _swipeLeftActions, swipeRightEvent: _swipeRightEvent, swipeRightActions: _swipeRightActions, longPressEvent: _longPressEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, sortBy, sortDirection, renderItem: schemaRenderItem, dragGroup, accepts, sortable: sortableProp, dropEvent, reorderEvent: dndReorderEvent, positionEvent, dndItemIdField, dndRoot, look, }: DataListProps): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
6557
6589
  declare namespace DataList {
6558
6590
  var displayName: string;
6559
6591
  }
@@ -9034,6 +9066,14 @@ declare const DocumentViewer: React__default.FC<DocumentViewerProps>;
9034
9066
  * - className for external styling
9035
9067
  */
9036
9068
 
9069
+ type GraphNodeMark = {
9070
+ kind: 'suggested';
9071
+ suggestionId: string;
9072
+ } | {
9073
+ kind: 'proposed';
9074
+ suggestionId: string;
9075
+ tint?: string;
9076
+ };
9037
9077
  type GraphNode = EventPayload & {
9038
9078
  id: string;
9039
9079
  label?: string;
@@ -9042,6 +9082,8 @@ type GraphNode = EventPayload & {
9042
9082
  size?: number;
9043
9083
  /** Merge-cluster count (drawn as a top-right badge; click expands). */
9044
9084
  badge?: number;
9085
+ /** Overlay decoration: a suggestion/proposal target. undefined = ordinary committed node. */
9086
+ mark?: GraphNodeMark;
9045
9087
  /** Position (optional, computed if missing) */
9046
9088
  x?: number;
9047
9089
  y?: number;
@@ -9079,6 +9121,8 @@ interface GraphCanvasProps {
9079
9121
  nodes?: readonly GraphNode[];
9080
9122
  /** Graph edges (the only rendered links) */
9081
9123
  edges?: readonly GraphEdge[];
9124
+ /** Uncommitted proposal links — rendered dashed/faint in a separate pass, never folded into the layout springs. */
9125
+ proposedEdges?: readonly GraphEdge[];
9082
9126
  /**
9083
9127
  * All-pairs similarity (cosine 0–1) used ONLY for layout, never drawn. It is the
9084
9128
  * secondary macro-layout: non-connected pairs get a weak spring (higher cosine ⇒
@@ -9098,6 +9142,8 @@ interface GraphCanvasProps {
9098
9142
  actions?: readonly GraphAction[];
9099
9143
  /** On node click */
9100
9144
  onNodeClick?: (node: GraphNode) => void;
9145
+ /** On marked-node click (suggestion/proposal target). Takes priority over onNodeClick. */
9146
+ onMarkClick?: (node: GraphNode) => void;
9101
9147
  /** On node double-click (e.g. to drill in) */
9102
9148
  onNodeDoubleClick?: (node: GraphNode) => void;
9103
9149
  /** On node badge click (e.g. to expand a merged cluster). */