@almadar/ui 4.47.9 → 4.49.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.
@@ -25078,14 +25078,7 @@ function DataGrid({
25078
25078
  {
25079
25079
  "data-entity-row": true,
25080
25080
  "data-entity-id": id,
25081
- className: cn(
25082
- "bg-card rounded-lg",
25083
- "border border-border",
25084
- "shadow-sm hover:shadow-lg",
25085
- "hover:border-primary transition-all",
25086
- "p-4",
25087
- isSelected && "ring-2 ring-primary border-primary"
25088
- ),
25081
+ className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
25089
25082
  children: children(itemData, index)
25090
25083
  },
25091
25084
  id
@@ -25470,45 +25463,34 @@ function DataList({
25470
25463
  if (hasRenderProp) {
25471
25464
  const id2 = itemData.id || String(index);
25472
25465
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, children: [
25473
- /* @__PURE__ */ jsxRuntime.jsxs(
25474
- Box,
25475
- {
25476
- className: cn(
25477
- "group flex items-center gap-4 transition-all duration-200",
25478
- isCompact ? "px-4 py-2" : "px-6 py-4",
25479
- "hover:bg-muted/80",
25480
- !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
25481
- ),
25482
- children: [
25483
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
25484
- itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
25485
- HStack,
25466
+ /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "group flex items-stretch gap-2", children: [
25467
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
25468
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
25469
+ HStack,
25470
+ {
25471
+ gap: "xs",
25472
+ className: "flex-shrink-0",
25473
+ children: itemActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
25474
+ Button,
25486
25475
  {
25487
- gap: "xs",
25488
- className: "flex-shrink-0",
25489
- children: itemActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
25490
- Button,
25491
- {
25492
- variant: action.variant ?? "ghost",
25493
- size: "sm",
25494
- onClick: handleActionClick(action, itemData),
25495
- "data-testid": `action-${action.event}`,
25496
- "data-row-id": String(itemData.id),
25497
- className: cn(
25498
- action.variant === "danger" && "text-error hover:bg-error/10"
25499
- ),
25500
- children: [
25501
- action.icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
25502
- action.label
25503
- ]
25504
- },
25505
- idx
25506
- ))
25507
- }
25508
- )
25509
- ]
25510
- }
25511
- ),
25476
+ variant: action.variant ?? "ghost",
25477
+ size: "sm",
25478
+ onClick: handleActionClick(action, itemData),
25479
+ "data-testid": `action-${action.event}`,
25480
+ "data-row-id": String(itemData.id),
25481
+ className: cn(
25482
+ action.variant === "danger" && "text-error hover:bg-error/10"
25483
+ ),
25484
+ children: [
25485
+ action.icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
25486
+ action.label
25487
+ ]
25488
+ },
25489
+ idx
25490
+ ))
25491
+ }
25492
+ )
25493
+ ] }),
25512
25494
  isCard && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "mx-6 border-b border-border/40" })
25513
25495
  ] }, id2);
25514
25496
  }
@@ -56165,7 +56147,7 @@ function findCrossLinks(orbitals) {
56165
56147
  }
56166
56148
  return links;
56167
56149
  }
56168
- function schemaToOverviewGraph(schema, mockData, behaviorMeta, layoutHint) {
56150
+ function schemaToOverviewGraph(schema, mockData, behaviorMeta, layoutHint, orbitalStatus) {
56169
56151
  const orbitals = getOrbitals(schema);
56170
56152
  const nodes = [];
56171
56153
  const edges = [];
@@ -56243,6 +56225,7 @@ function schemaToOverviewGraph(schema, mockData, behaviorMeta, layoutHint) {
56243
56225
  fieldCount: entityInfo.fieldCount,
56244
56226
  traitCount: traits2.length,
56245
56227
  pageRoutes,
56228
+ status: orbitalStatus?.[orb.name] ?? "idle",
56246
56229
  _fullSchema: schema,
56247
56230
  _mockData: mockData
56248
56231
  }
@@ -58775,6 +58758,10 @@ var OrbPreviewNodeInner = (props) => {
58775
58758
  const eventSources = data.eventSources ?? [];
58776
58759
  const layerColor = data.layer ? LAYER_COLORS[data.layer] : void 0;
58777
58760
  const isExpanded = Boolean(data.traitName);
58761
+ const status = data.status ?? "idle";
58762
+ const isRunning = status === "running";
58763
+ const isSuccess = status === "success";
58764
+ const isError = status === "error";
58778
58765
  const label = isExpanded ? `${data.transitionEvent ?? ""}` : data.orbitalName;
58779
58766
  const sublabel = isExpanded ? `${data.fromState ?? ""} \u2192 ${data.toState ?? ""}` : data.entityName ?? "";
58780
58767
  const orbitalSchema = React147.useMemo(() => {
@@ -58909,19 +58896,54 @@ var OrbPreviewNodeInner = (props) => {
58909
58896
  const handlePreviewDragLeave = React147.useCallback((e) => {
58910
58897
  contentRef.current?.querySelectorAll(".drag-hover").forEach((c) => c.classList.remove("drag-hover"));
58911
58898
  }, []);
58899
+ const statusBorder = isRunning ? "var(--color-primary)" : isError ? "var(--color-danger)" : isSuccess ? "var(--color-success)" : null;
58900
+ const borderWidth = isRunning || isError || isSuccess ? "2px" : "1.5px";
58901
+ const borderColor = statusBorder ?? (hovered ? "var(--color-primary)" : colors.border);
58912
58902
  return /* @__PURE__ */ jsxRuntime.jsxs(
58913
58903
  Box,
58914
58904
  {
58915
- className: "rounded-lg border shadow-sm bg-card transition-all duration-200 overflow-hidden",
58905
+ className: `rounded-lg border shadow-sm bg-card transition-all duration-200 overflow-hidden relative${isRunning ? " orb-preview-running" : ""}`,
58916
58906
  style: {
58917
- borderColor: hovered ? "var(--color-primary)" : colors.border,
58918
- borderWidth: "1.5px",
58907
+ borderColor,
58908
+ borderWidth,
58919
58909
  width: preset.width
58920
58910
  },
58921
58911
  onMouseEnter: handleMouseEnter,
58922
58912
  onMouseLeave: handleMouseLeave,
58923
58913
  children: [
58924
58914
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: SELECTION_STYLES }),
58915
+ isRunning && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
58916
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
58917
+ @keyframes orb-preview-running-pulse {
58918
+ 0%, 100% { box-shadow: 0 0 0 0 var(--color-primary); opacity: 0.6; }
58919
+ 50% { box-shadow: 0 0 0 4px var(--color-primary); opacity: 0.15; }
58920
+ }
58921
+ .orb-preview-running {
58922
+ animation: orb-preview-running-pulse 1.8s ease-in-out infinite;
58923
+ }
58924
+ @keyframes orb-preview-spinner {
58925
+ from { transform: rotate(0deg); }
58926
+ to { transform: rotate(360deg); }
58927
+ }
58928
+ .orb-preview-spinner {
58929
+ animation: orb-preview-spinner 0.9s linear infinite;
58930
+ }
58931
+ ` }),
58932
+ /* @__PURE__ */ jsxRuntime.jsx(
58933
+ Box,
58934
+ {
58935
+ className: "orb-preview-spinner absolute top-2 right-2 rounded-full pointer-events-none",
58936
+ style: {
58937
+ width: 14,
58938
+ height: 14,
58939
+ border: "2px solid var(--color-primary)",
58940
+ borderTopColor: "transparent",
58941
+ zIndex: 2
58942
+ },
58943
+ title: "Coordinator is dispatching to this orbital"
58944
+ }
58945
+ )
58946
+ ] }),
58925
58947
  layerColor && /* @__PURE__ */ jsxRuntime.jsx(
58926
58948
  Box,
58927
58949
  {
@@ -59857,6 +59879,8 @@ function FlowCanvasInner({
59857
59879
  onPatternDelete,
59858
59880
  onEventWire,
59859
59881
  behaviorMeta,
59882
+ orbitalStatus,
59883
+ onOrbitalHover,
59860
59884
  layoutHint,
59861
59885
  onNodeSelect,
59862
59886
  composeLevel,
@@ -59899,7 +59923,7 @@ function FlowCanvasInner({
59899
59923
  const { composeNodes, composeEdges, overviewNodes, overviewEdges, expandedNodes, expandedEdges } = React147.useMemo(() => {
59900
59924
  const t = perfStart("compose-graph");
59901
59925
  const compose = composeLevel === "behavior" && behaviorEntries?.length ? behaviorsToComposeGraph(behaviorEntries, behaviorWires ?? [], layoutHint) : { nodes: [], edges: [] };
59902
- const overview = schemaToOverviewGraph(parsedSchema, mockData, behaviorMeta, layoutHint);
59926
+ const overview = schemaToOverviewGraph(parsedSchema, mockData, behaviorMeta, layoutHint, orbitalStatus);
59903
59927
  const expanded = expandedOrbital ? orbitalToExpandedGraph(parsedSchema, expandedOrbital, mockData) : { nodes: [], edges: [] };
59904
59928
  perfEnd("compose-graph", t, {
59905
59929
  composeNodes: compose.nodes.length,
@@ -59915,7 +59939,7 @@ function FlowCanvasInner({
59915
59939
  expandedNodes: expanded.nodes,
59916
59940
  expandedEdges: expanded.edges
59917
59941
  };
59918
- }, [parsedSchema, expandedOrbital, behaviorMeta, layoutHint, composeLevel, behaviorEntries, behaviorWires, mockData]);
59942
+ }, [parsedSchema, expandedOrbital, behaviorMeta, layoutHint, composeLevel, behaviorEntries, behaviorWires, mockData, orbitalStatus]);
59919
59943
  const activeNodes = atBehaviorLevel && composeNodes.length > 0 ? composeNodes : level === "overview" ? overviewNodes : expandedNodes;
59920
59944
  const activeEdges = atBehaviorLevel && composeEdges.length > 0 ? composeEdges : level === "overview" ? overviewEdges : expandedEdges;
59921
59945
  const [nodes, setNodes, onNodesChange] = react.useNodesState(activeNodes);
@@ -901,6 +901,18 @@ interface PreviewNodeData extends Record<string, unknown> {
901
901
  fieldCount?: number;
902
902
  traitCount?: number;
903
903
  pageRoutes?: string[];
904
+ /**
905
+ * Generation status for this orbital. When `'running'`, the overview node
906
+ * renders a spinner overlay + accent border so the user can see which
907
+ * orbital the coordinator is currently dispatching to. Other states are
908
+ * available so consumers can also paint success/error treatments
909
+ * (e.g. green border on completion, red on failure). Default is `'idle'`.
910
+ *
911
+ * Set by FlowCanvasProps.orbitalStatus and threaded through the converter.
912
+ * Future expansion: hover over a `'running'` node to surface the subagent
913
+ * trace inline.
914
+ */
915
+ status?: 'idle' | 'running' | 'success' | 'error';
904
916
  }
905
917
  /** Data for event flow edges. */
906
918
  interface EventEdgeData extends Record<string, unknown> {
@@ -948,7 +960,7 @@ interface EventEdgeData extends Record<string, unknown> {
948
960
  */
949
961
  declare function schemaToOverviewGraph(schema: OrbitalSchema, mockData?: Record<string, unknown[]>, behaviorMeta?: Record<string, {
950
962
  layer: string;
951
- }>, layoutHint?: 'pipeline' | 'grid'): {
963
+ }>, layoutHint?: 'pipeline' | 'grid', orbitalStatus?: Record<string, PreviewNodeData['status']>): {
952
964
  nodes: Node<PreviewNodeData>[];
953
965
  edges: Edge<EventEdgeData>[];
954
966
  };
@@ -1260,6 +1272,20 @@ interface FlowCanvasProps {
1260
1272
  behaviorMeta?: Record<string, {
1261
1273
  layer: string;
1262
1274
  }>;
1275
+ /**
1276
+ * Per-orbital generation status. Keyed by orbital name. Drives the spinner
1277
+ * + accent border treatment on the overview node and (future) the hover
1278
+ * trace surface. Defaults to `'idle'` for missing entries. Consumers
1279
+ * derive this from agent subagent_start/complete SSE events.
1280
+ */
1281
+ orbitalStatus?: Record<string, PreviewNodeData['status']>;
1282
+ /**
1283
+ * Hover handler for overview-level orbital nodes. Fires with the orbital
1284
+ * name on enter and `null` on leave. Reserved for the upcoming trace
1285
+ * tooltip: consumers will use it to anchor a popover that shows the
1286
+ * subagent's live trace + reasoning for the hovered orbital.
1287
+ */
1288
+ onOrbitalHover?: (orbitalName: string | null) => void;
1263
1289
  /** Layout hint: 'pipeline' renders nodes left-to-right, 'grid' (default) uses sqrt-based grid. */
1264
1290
  layoutHint?: 'pipeline' | 'grid';
1265
1291
  /** Called when the user clicks a node in overview level (for composition hints). */
package/dist/avl/index.js CHANGED
@@ -25032,14 +25032,7 @@ function DataGrid({
25032
25032
  {
25033
25033
  "data-entity-row": true,
25034
25034
  "data-entity-id": id,
25035
- className: cn(
25036
- "bg-card rounded-lg",
25037
- "border border-border",
25038
- "shadow-sm hover:shadow-lg",
25039
- "hover:border-primary transition-all",
25040
- "p-4",
25041
- isSelected && "ring-2 ring-primary border-primary"
25042
- ),
25035
+ className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
25043
25036
  children: children(itemData, index)
25044
25037
  },
25045
25038
  id
@@ -25424,45 +25417,34 @@ function DataList({
25424
25417
  if (hasRenderProp) {
25425
25418
  const id2 = itemData.id || String(index);
25426
25419
  return /* @__PURE__ */ jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, children: [
25427
- /* @__PURE__ */ jsxs(
25428
- Box,
25429
- {
25430
- className: cn(
25431
- "group flex items-center gap-4 transition-all duration-200",
25432
- isCompact ? "px-4 py-2" : "px-6 py-4",
25433
- "hover:bg-muted/80",
25434
- !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
25435
- ),
25436
- children: [
25437
- /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
25438
- itemActions && itemActions.length > 0 && /* @__PURE__ */ jsx(
25439
- HStack,
25420
+ /* @__PURE__ */ jsxs(Box, { className: "group flex items-stretch gap-2", children: [
25421
+ /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
25422
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsx(
25423
+ HStack,
25424
+ {
25425
+ gap: "xs",
25426
+ className: "flex-shrink-0",
25427
+ children: itemActions.map((action, idx) => /* @__PURE__ */ jsxs(
25428
+ Button,
25440
25429
  {
25441
- gap: "xs",
25442
- className: "flex-shrink-0",
25443
- children: itemActions.map((action, idx) => /* @__PURE__ */ jsxs(
25444
- Button,
25445
- {
25446
- variant: action.variant ?? "ghost",
25447
- size: "sm",
25448
- onClick: handleActionClick(action, itemData),
25449
- "data-testid": `action-${action.event}`,
25450
- "data-row-id": String(itemData.id),
25451
- className: cn(
25452
- action.variant === "danger" && "text-error hover:bg-error/10"
25453
- ),
25454
- children: [
25455
- action.icon && /* @__PURE__ */ jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
25456
- action.label
25457
- ]
25458
- },
25459
- idx
25460
- ))
25461
- }
25462
- )
25463
- ]
25464
- }
25465
- ),
25430
+ variant: action.variant ?? "ghost",
25431
+ size: "sm",
25432
+ onClick: handleActionClick(action, itemData),
25433
+ "data-testid": `action-${action.event}`,
25434
+ "data-row-id": String(itemData.id),
25435
+ className: cn(
25436
+ action.variant === "danger" && "text-error hover:bg-error/10"
25437
+ ),
25438
+ children: [
25439
+ action.icon && /* @__PURE__ */ jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
25440
+ action.label
25441
+ ]
25442
+ },
25443
+ idx
25444
+ ))
25445
+ }
25446
+ )
25447
+ ] }),
25466
25448
  isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
25467
25449
  ] }, id2);
25468
25450
  }
@@ -56119,7 +56101,7 @@ function findCrossLinks(orbitals) {
56119
56101
  }
56120
56102
  return links;
56121
56103
  }
56122
- function schemaToOverviewGraph(schema, mockData, behaviorMeta, layoutHint) {
56104
+ function schemaToOverviewGraph(schema, mockData, behaviorMeta, layoutHint, orbitalStatus) {
56123
56105
  const orbitals = getOrbitals(schema);
56124
56106
  const nodes = [];
56125
56107
  const edges = [];
@@ -56197,6 +56179,7 @@ function schemaToOverviewGraph(schema, mockData, behaviorMeta, layoutHint) {
56197
56179
  fieldCount: entityInfo.fieldCount,
56198
56180
  traitCount: traits2.length,
56199
56181
  pageRoutes,
56182
+ status: orbitalStatus?.[orb.name] ?? "idle",
56200
56183
  _fullSchema: schema,
56201
56184
  _mockData: mockData
56202
56185
  }
@@ -58729,6 +58712,10 @@ var OrbPreviewNodeInner = (props) => {
58729
58712
  const eventSources = data.eventSources ?? [];
58730
58713
  const layerColor = data.layer ? LAYER_COLORS[data.layer] : void 0;
58731
58714
  const isExpanded = Boolean(data.traitName);
58715
+ const status = data.status ?? "idle";
58716
+ const isRunning = status === "running";
58717
+ const isSuccess = status === "success";
58718
+ const isError = status === "error";
58732
58719
  const label = isExpanded ? `${data.transitionEvent ?? ""}` : data.orbitalName;
58733
58720
  const sublabel = isExpanded ? `${data.fromState ?? ""} \u2192 ${data.toState ?? ""}` : data.entityName ?? "";
58734
58721
  const orbitalSchema = useMemo(() => {
@@ -58863,19 +58850,54 @@ var OrbPreviewNodeInner = (props) => {
58863
58850
  const handlePreviewDragLeave = useCallback((e) => {
58864
58851
  contentRef.current?.querySelectorAll(".drag-hover").forEach((c) => c.classList.remove("drag-hover"));
58865
58852
  }, []);
58853
+ const statusBorder = isRunning ? "var(--color-primary)" : isError ? "var(--color-danger)" : isSuccess ? "var(--color-success)" : null;
58854
+ const borderWidth = isRunning || isError || isSuccess ? "2px" : "1.5px";
58855
+ const borderColor = statusBorder ?? (hovered ? "var(--color-primary)" : colors.border);
58866
58856
  return /* @__PURE__ */ jsxs(
58867
58857
  Box,
58868
58858
  {
58869
- className: "rounded-lg border shadow-sm bg-card transition-all duration-200 overflow-hidden",
58859
+ className: `rounded-lg border shadow-sm bg-card transition-all duration-200 overflow-hidden relative${isRunning ? " orb-preview-running" : ""}`,
58870
58860
  style: {
58871
- borderColor: hovered ? "var(--color-primary)" : colors.border,
58872
- borderWidth: "1.5px",
58861
+ borderColor,
58862
+ borderWidth,
58873
58863
  width: preset.width
58874
58864
  },
58875
58865
  onMouseEnter: handleMouseEnter,
58876
58866
  onMouseLeave: handleMouseLeave,
58877
58867
  children: [
58878
58868
  /* @__PURE__ */ jsx("style", { children: SELECTION_STYLES }),
58869
+ isRunning && /* @__PURE__ */ jsxs(Fragment, { children: [
58870
+ /* @__PURE__ */ jsx("style", { children: `
58871
+ @keyframes orb-preview-running-pulse {
58872
+ 0%, 100% { box-shadow: 0 0 0 0 var(--color-primary); opacity: 0.6; }
58873
+ 50% { box-shadow: 0 0 0 4px var(--color-primary); opacity: 0.15; }
58874
+ }
58875
+ .orb-preview-running {
58876
+ animation: orb-preview-running-pulse 1.8s ease-in-out infinite;
58877
+ }
58878
+ @keyframes orb-preview-spinner {
58879
+ from { transform: rotate(0deg); }
58880
+ to { transform: rotate(360deg); }
58881
+ }
58882
+ .orb-preview-spinner {
58883
+ animation: orb-preview-spinner 0.9s linear infinite;
58884
+ }
58885
+ ` }),
58886
+ /* @__PURE__ */ jsx(
58887
+ Box,
58888
+ {
58889
+ className: "orb-preview-spinner absolute top-2 right-2 rounded-full pointer-events-none",
58890
+ style: {
58891
+ width: 14,
58892
+ height: 14,
58893
+ border: "2px solid var(--color-primary)",
58894
+ borderTopColor: "transparent",
58895
+ zIndex: 2
58896
+ },
58897
+ title: "Coordinator is dispatching to this orbital"
58898
+ }
58899
+ )
58900
+ ] }),
58879
58901
  layerColor && /* @__PURE__ */ jsx(
58880
58902
  Box,
58881
58903
  {
@@ -59811,6 +59833,8 @@ function FlowCanvasInner({
59811
59833
  onPatternDelete,
59812
59834
  onEventWire,
59813
59835
  behaviorMeta,
59836
+ orbitalStatus,
59837
+ onOrbitalHover,
59814
59838
  layoutHint,
59815
59839
  onNodeSelect,
59816
59840
  composeLevel,
@@ -59853,7 +59877,7 @@ function FlowCanvasInner({
59853
59877
  const { composeNodes, composeEdges, overviewNodes, overviewEdges, expandedNodes, expandedEdges } = useMemo(() => {
59854
59878
  const t = perfStart("compose-graph");
59855
59879
  const compose = composeLevel === "behavior" && behaviorEntries?.length ? behaviorsToComposeGraph(behaviorEntries, behaviorWires ?? [], layoutHint) : { nodes: [], edges: [] };
59856
- const overview = schemaToOverviewGraph(parsedSchema, mockData, behaviorMeta, layoutHint);
59880
+ const overview = schemaToOverviewGraph(parsedSchema, mockData, behaviorMeta, layoutHint, orbitalStatus);
59857
59881
  const expanded = expandedOrbital ? orbitalToExpandedGraph(parsedSchema, expandedOrbital, mockData) : { nodes: [], edges: [] };
59858
59882
  perfEnd("compose-graph", t, {
59859
59883
  composeNodes: compose.nodes.length,
@@ -59869,7 +59893,7 @@ function FlowCanvasInner({
59869
59893
  expandedNodes: expanded.nodes,
59870
59894
  expandedEdges: expanded.edges
59871
59895
  };
59872
- }, [parsedSchema, expandedOrbital, behaviorMeta, layoutHint, composeLevel, behaviorEntries, behaviorWires, mockData]);
59896
+ }, [parsedSchema, expandedOrbital, behaviorMeta, layoutHint, composeLevel, behaviorEntries, behaviorWires, mockData, orbitalStatus]);
59873
59897
  const activeNodes = atBehaviorLevel && composeNodes.length > 0 ? composeNodes : level === "overview" ? overviewNodes : expandedNodes;
59874
59898
  const activeEdges = atBehaviorLevel && composeEdges.length > 0 ? composeEdges : level === "overview" ? overviewEdges : expandedEdges;
59875
59899
  const [nodes, setNodes, onNodesChange] = useNodesState(activeNodes);
@@ -20245,14 +20245,7 @@ function DataGrid({
20245
20245
  {
20246
20246
  "data-entity-row": true,
20247
20247
  "data-entity-id": id,
20248
- className: cn(
20249
- "bg-card rounded-lg",
20250
- "border border-border",
20251
- "shadow-sm hover:shadow-lg",
20252
- "hover:border-primary transition-all",
20253
- "p-4",
20254
- isSelected && "ring-2 ring-primary border-primary"
20255
- ),
20248
+ className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
20256
20249
  children: children(itemData, index)
20257
20250
  },
20258
20251
  id
@@ -20637,45 +20630,34 @@ function DataList({
20637
20630
  if (hasRenderProp) {
20638
20631
  const id2 = itemData.id || String(index);
20639
20632
  return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { "data-entity-row": true, "data-entity-id": id2, children: [
20640
- /* @__PURE__ */ jsxRuntime.jsxs(
20641
- exports.Box,
20642
- {
20643
- className: cn(
20644
- "group flex items-center gap-4 transition-all duration-200",
20645
- isCompact ? "px-4 py-2" : "px-6 py-4",
20646
- "hover:bg-muted/80",
20647
- !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
20648
- ),
20649
- children: [
20650
- /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
20651
- itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
20652
- exports.HStack,
20633
+ /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "group flex items-stretch gap-2", children: [
20634
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
20635
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
20636
+ exports.HStack,
20637
+ {
20638
+ gap: "xs",
20639
+ className: "flex-shrink-0",
20640
+ children: itemActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
20641
+ exports.Button,
20653
20642
  {
20654
- gap: "xs",
20655
- className: "flex-shrink-0",
20656
- children: itemActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
20657
- exports.Button,
20658
- {
20659
- variant: action.variant ?? "ghost",
20660
- size: "sm",
20661
- onClick: handleActionClick(action, itemData),
20662
- "data-testid": `action-${action.event}`,
20663
- "data-row-id": String(itemData.id),
20664
- className: cn(
20665
- action.variant === "danger" && "text-error hover:bg-error/10"
20666
- ),
20667
- children: [
20668
- action.icon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: action.icon, size: "xs", className: "mr-1" }),
20669
- action.label
20670
- ]
20671
- },
20672
- idx
20673
- ))
20674
- }
20675
- )
20676
- ]
20677
- }
20678
- ),
20643
+ variant: action.variant ?? "ghost",
20644
+ size: "sm",
20645
+ onClick: handleActionClick(action, itemData),
20646
+ "data-testid": `action-${action.event}`,
20647
+ "data-row-id": String(itemData.id),
20648
+ className: cn(
20649
+ action.variant === "danger" && "text-error hover:bg-error/10"
20650
+ ),
20651
+ children: [
20652
+ action.icon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: action.icon, size: "xs", className: "mr-1" }),
20653
+ action.label
20654
+ ]
20655
+ },
20656
+ idx
20657
+ ))
20658
+ }
20659
+ )
20660
+ ] }),
20679
20661
  isCard && !isLast && /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "mx-6 border-b border-border/40" })
20680
20662
  ] }, id2);
20681
20663
  }
@@ -20199,14 +20199,7 @@ function DataGrid({
20199
20199
  {
20200
20200
  "data-entity-row": true,
20201
20201
  "data-entity-id": id,
20202
- className: cn(
20203
- "bg-card rounded-lg",
20204
- "border border-border",
20205
- "shadow-sm hover:shadow-lg",
20206
- "hover:border-primary transition-all",
20207
- "p-4",
20208
- isSelected && "ring-2 ring-primary border-primary"
20209
- ),
20202
+ className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
20210
20203
  children: children(itemData, index)
20211
20204
  },
20212
20205
  id
@@ -20591,45 +20584,34 @@ function DataList({
20591
20584
  if (hasRenderProp) {
20592
20585
  const id2 = itemData.id || String(index);
20593
20586
  return /* @__PURE__ */ jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, children: [
20594
- /* @__PURE__ */ jsxs(
20595
- Box,
20596
- {
20597
- className: cn(
20598
- "group flex items-center gap-4 transition-all duration-200",
20599
- isCompact ? "px-4 py-2" : "px-6 py-4",
20600
- "hover:bg-muted/80",
20601
- !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
20602
- ),
20603
- children: [
20604
- /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
20605
- itemActions && itemActions.length > 0 && /* @__PURE__ */ jsx(
20606
- HStack,
20587
+ /* @__PURE__ */ jsxs(Box, { className: "group flex items-stretch gap-2", children: [
20588
+ /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
20589
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsx(
20590
+ HStack,
20591
+ {
20592
+ gap: "xs",
20593
+ className: "flex-shrink-0",
20594
+ children: itemActions.map((action, idx) => /* @__PURE__ */ jsxs(
20595
+ Button,
20607
20596
  {
20608
- gap: "xs",
20609
- className: "flex-shrink-0",
20610
- children: itemActions.map((action, idx) => /* @__PURE__ */ jsxs(
20611
- Button,
20612
- {
20613
- variant: action.variant ?? "ghost",
20614
- size: "sm",
20615
- onClick: handleActionClick(action, itemData),
20616
- "data-testid": `action-${action.event}`,
20617
- "data-row-id": String(itemData.id),
20618
- className: cn(
20619
- action.variant === "danger" && "text-error hover:bg-error/10"
20620
- ),
20621
- children: [
20622
- action.icon && /* @__PURE__ */ jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
20623
- action.label
20624
- ]
20625
- },
20626
- idx
20627
- ))
20628
- }
20629
- )
20630
- ]
20631
- }
20632
- ),
20597
+ variant: action.variant ?? "ghost",
20598
+ size: "sm",
20599
+ onClick: handleActionClick(action, itemData),
20600
+ "data-testid": `action-${action.event}`,
20601
+ "data-row-id": String(itemData.id),
20602
+ className: cn(
20603
+ action.variant === "danger" && "text-error hover:bg-error/10"
20604
+ ),
20605
+ children: [
20606
+ action.icon && /* @__PURE__ */ jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
20607
+ action.label
20608
+ ]
20609
+ },
20610
+ idx
20611
+ ))
20612
+ }
20613
+ )
20614
+ ] }),
20633
20615
  isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
20634
20616
  ] }, id2);
20635
20617
  }
@@ -21,7 +21,7 @@ import type { PreviewNodeData, EventEdgeData } from './avl-preview-types';
21
21
  */
22
22
  export declare function schemaToOverviewGraph(schema: OrbitalSchema, mockData?: Record<string, unknown[]>, behaviorMeta?: Record<string, {
23
23
  layer: string;
24
- }>, layoutHint?: 'pipeline' | 'grid'): {
24
+ }>, layoutHint?: 'pipeline' | 'grid', orbitalStatus?: Record<string, PreviewNodeData['status']>): {
25
25
  nodes: Node<PreviewNodeData>[];
26
26
  edges: Edge<EventEdgeData>[];
27
27
  };
@@ -89,6 +89,18 @@ export interface PreviewNodeData extends Record<string, unknown> {
89
89
  fieldCount?: number;
90
90
  traitCount?: number;
91
91
  pageRoutes?: string[];
92
+ /**
93
+ * Generation status for this orbital. When `'running'`, the overview node
94
+ * renders a spinner overlay + accent border so the user can see which
95
+ * orbital the coordinator is currently dispatching to. Other states are
96
+ * available so consumers can also paint success/error treatments
97
+ * (e.g. green border on completion, red on failure). Default is `'idle'`.
98
+ *
99
+ * Set by FlowCanvasProps.orbitalStatus and threaded through the converter.
100
+ * Future expansion: hover over a `'running'` node to surface the subagent
101
+ * trace inline.
102
+ */
103
+ status?: 'idle' | 'running' | 'success' | 'error';
92
104
  }
93
105
  /** Data for event flow edges. */
94
106
  export interface EventEdgeData extends Record<string, unknown> {
@@ -78,6 +78,20 @@ export interface FlowCanvasProps {
78
78
  behaviorMeta?: Record<string, {
79
79
  layer: string;
80
80
  }>;
81
+ /**
82
+ * Per-orbital generation status. Keyed by orbital name. Drives the spinner
83
+ * + accent border treatment on the overview node and (future) the hover
84
+ * trace surface. Defaults to `'idle'` for missing entries. Consumers
85
+ * derive this from agent subagent_start/complete SSE events.
86
+ */
87
+ orbitalStatus?: Record<string, PreviewNodeData['status']>;
88
+ /**
89
+ * Hover handler for overview-level orbital nodes. Fires with the orbital
90
+ * name on enter and `null` on leave. Reserved for the upcoming trace
91
+ * tooltip: consumers will use it to anchor a popover that shows the
92
+ * subagent's live trace + reasoning for the hovered orbital.
93
+ */
94
+ onOrbitalHover?: (orbitalName: string | null) => void;
81
95
  /** Layout hint: 'pipeline' renders nodes left-to-right, 'grid' (default) uses sqrt-based grid. */
82
96
  layoutHint?: 'pipeline' | 'grid';
83
97
  /** Called when the user clicks a node in overview level (for composition hints). */
@@ -21490,14 +21490,7 @@ function DataGrid({
21490
21490
  {
21491
21491
  "data-entity-row": true,
21492
21492
  "data-entity-id": id,
21493
- className: cn(
21494
- "bg-card rounded-lg",
21495
- "border border-border",
21496
- "shadow-sm hover:shadow-lg",
21497
- "hover:border-primary transition-all",
21498
- "p-4",
21499
- isSelected && "ring-2 ring-primary border-primary"
21500
- ),
21493
+ className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
21501
21494
  children: children(itemData, index)
21502
21495
  },
21503
21496
  id
@@ -21882,45 +21875,34 @@ function DataList({
21882
21875
  if (hasRenderProp) {
21883
21876
  const id2 = itemData.id || String(index);
21884
21877
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, children: [
21885
- /* @__PURE__ */ jsxRuntime.jsxs(
21886
- Box,
21887
- {
21888
- className: cn(
21889
- "group flex items-center gap-4 transition-all duration-200",
21890
- isCompact ? "px-4 py-2" : "px-6 py-4",
21891
- "hover:bg-muted/80",
21892
- !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
21893
- ),
21894
- children: [
21895
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21896
- itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
21897
- HStack,
21878
+ /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "group flex items-stretch gap-2", children: [
21879
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21880
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
21881
+ HStack,
21882
+ {
21883
+ gap: "xs",
21884
+ className: "flex-shrink-0",
21885
+ children: itemActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
21886
+ Button,
21898
21887
  {
21899
- gap: "xs",
21900
- className: "flex-shrink-0",
21901
- children: itemActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
21902
- Button,
21903
- {
21904
- variant: action.variant ?? "ghost",
21905
- size: "sm",
21906
- onClick: handleActionClick(action, itemData),
21907
- "data-testid": `action-${action.event}`,
21908
- "data-row-id": String(itemData.id),
21909
- className: cn(
21910
- action.variant === "danger" && "text-error hover:bg-error/10"
21911
- ),
21912
- children: [
21913
- action.icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
21914
- action.label
21915
- ]
21916
- },
21917
- idx
21918
- ))
21919
- }
21920
- )
21921
- ]
21922
- }
21923
- ),
21888
+ variant: action.variant ?? "ghost",
21889
+ size: "sm",
21890
+ onClick: handleActionClick(action, itemData),
21891
+ "data-testid": `action-${action.event}`,
21892
+ "data-row-id": String(itemData.id),
21893
+ className: cn(
21894
+ action.variant === "danger" && "text-error hover:bg-error/10"
21895
+ ),
21896
+ children: [
21897
+ action.icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
21898
+ action.label
21899
+ ]
21900
+ },
21901
+ idx
21902
+ ))
21903
+ }
21904
+ )
21905
+ ] }),
21924
21906
  isCard && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "mx-6 border-b border-border/40" })
21925
21907
  ] }, id2);
21926
21908
  }
@@ -21444,14 +21444,7 @@ function DataGrid({
21444
21444
  {
21445
21445
  "data-entity-row": true,
21446
21446
  "data-entity-id": id,
21447
- className: cn(
21448
- "bg-card rounded-lg",
21449
- "border border-border",
21450
- "shadow-sm hover:shadow-lg",
21451
- "hover:border-primary transition-all",
21452
- "p-4",
21453
- isSelected && "ring-2 ring-primary border-primary"
21454
- ),
21447
+ className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
21455
21448
  children: children(itemData, index)
21456
21449
  },
21457
21450
  id
@@ -21836,45 +21829,34 @@ function DataList({
21836
21829
  if (hasRenderProp) {
21837
21830
  const id2 = itemData.id || String(index);
21838
21831
  return /* @__PURE__ */ jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, children: [
21839
- /* @__PURE__ */ jsxs(
21840
- Box,
21841
- {
21842
- className: cn(
21843
- "group flex items-center gap-4 transition-all duration-200",
21844
- isCompact ? "px-4 py-2" : "px-6 py-4",
21845
- "hover:bg-muted/80",
21846
- !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
21847
- ),
21848
- children: [
21849
- /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21850
- itemActions && itemActions.length > 0 && /* @__PURE__ */ jsx(
21851
- HStack,
21832
+ /* @__PURE__ */ jsxs(Box, { className: "group flex items-stretch gap-2", children: [
21833
+ /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21834
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsx(
21835
+ HStack,
21836
+ {
21837
+ gap: "xs",
21838
+ className: "flex-shrink-0",
21839
+ children: itemActions.map((action, idx) => /* @__PURE__ */ jsxs(
21840
+ Button,
21852
21841
  {
21853
- gap: "xs",
21854
- className: "flex-shrink-0",
21855
- children: itemActions.map((action, idx) => /* @__PURE__ */ jsxs(
21856
- Button,
21857
- {
21858
- variant: action.variant ?? "ghost",
21859
- size: "sm",
21860
- onClick: handleActionClick(action, itemData),
21861
- "data-testid": `action-${action.event}`,
21862
- "data-row-id": String(itemData.id),
21863
- className: cn(
21864
- action.variant === "danger" && "text-error hover:bg-error/10"
21865
- ),
21866
- children: [
21867
- action.icon && /* @__PURE__ */ jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
21868
- action.label
21869
- ]
21870
- },
21871
- idx
21872
- ))
21873
- }
21874
- )
21875
- ]
21876
- }
21877
- ),
21842
+ variant: action.variant ?? "ghost",
21843
+ size: "sm",
21844
+ onClick: handleActionClick(action, itemData),
21845
+ "data-testid": `action-${action.event}`,
21846
+ "data-row-id": String(itemData.id),
21847
+ className: cn(
21848
+ action.variant === "danger" && "text-error hover:bg-error/10"
21849
+ ),
21850
+ children: [
21851
+ action.icon && /* @__PURE__ */ jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
21852
+ action.label
21853
+ ]
21854
+ },
21855
+ idx
21856
+ ))
21857
+ }
21858
+ )
21859
+ ] }),
21878
21860
  isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
21879
21861
  ] }, id2);
21880
21862
  }
@@ -21259,14 +21259,7 @@ function DataGrid({
21259
21259
  {
21260
21260
  "data-entity-row": true,
21261
21261
  "data-entity-id": id,
21262
- className: cn(
21263
- "bg-card rounded-lg",
21264
- "border border-border",
21265
- "shadow-sm hover:shadow-lg",
21266
- "hover:border-primary transition-all",
21267
- "p-4",
21268
- isSelected && "ring-2 ring-primary border-primary"
21269
- ),
21262
+ className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
21270
21263
  children: children(itemData, index)
21271
21264
  },
21272
21265
  id
@@ -21651,45 +21644,34 @@ function DataList({
21651
21644
  if (hasRenderProp) {
21652
21645
  const id2 = itemData.id || String(index);
21653
21646
  return /* @__PURE__ */ jsxRuntime.jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, children: [
21654
- /* @__PURE__ */ jsxRuntime.jsxs(
21655
- Box,
21656
- {
21657
- className: cn(
21658
- "group flex items-center gap-4 transition-all duration-200",
21659
- isCompact ? "px-4 py-2" : "px-6 py-4",
21660
- "hover:bg-muted/80",
21661
- !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
21662
- ),
21663
- children: [
21664
- /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21665
- itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
21666
- HStack,
21647
+ /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "group flex items-stretch gap-2", children: [
21648
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21649
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
21650
+ HStack,
21651
+ {
21652
+ gap: "xs",
21653
+ className: "flex-shrink-0",
21654
+ children: itemActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
21655
+ Button,
21667
21656
  {
21668
- gap: "xs",
21669
- className: "flex-shrink-0",
21670
- children: itemActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
21671
- Button,
21672
- {
21673
- variant: action.variant ?? "ghost",
21674
- size: "sm",
21675
- onClick: handleActionClick(action, itemData),
21676
- "data-testid": `action-${action.event}`,
21677
- "data-row-id": String(itemData.id),
21678
- className: cn(
21679
- action.variant === "danger" && "text-error hover:bg-error/10"
21680
- ),
21681
- children: [
21682
- action.icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
21683
- action.label
21684
- ]
21685
- },
21686
- idx
21687
- ))
21688
- }
21689
- )
21690
- ]
21691
- }
21692
- ),
21657
+ variant: action.variant ?? "ghost",
21658
+ size: "sm",
21659
+ onClick: handleActionClick(action, itemData),
21660
+ "data-testid": `action-${action.event}`,
21661
+ "data-row-id": String(itemData.id),
21662
+ className: cn(
21663
+ action.variant === "danger" && "text-error hover:bg-error/10"
21664
+ ),
21665
+ children: [
21666
+ action.icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
21667
+ action.label
21668
+ ]
21669
+ },
21670
+ idx
21671
+ ))
21672
+ }
21673
+ )
21674
+ ] }),
21693
21675
  isCard && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "mx-6 border-b border-border/40" })
21694
21676
  ] }, id2);
21695
21677
  }
@@ -21213,14 +21213,7 @@ function DataGrid({
21213
21213
  {
21214
21214
  "data-entity-row": true,
21215
21215
  "data-entity-id": id,
21216
- className: cn(
21217
- "bg-card rounded-lg",
21218
- "border border-border",
21219
- "shadow-sm hover:shadow-lg",
21220
- "hover:border-primary transition-all",
21221
- "p-4",
21222
- isSelected && "ring-2 ring-primary border-primary"
21223
- ),
21216
+ className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
21224
21217
  children: children(itemData, index)
21225
21218
  },
21226
21219
  id
@@ -21605,45 +21598,34 @@ function DataList({
21605
21598
  if (hasRenderProp) {
21606
21599
  const id2 = itemData.id || String(index);
21607
21600
  return /* @__PURE__ */ jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, children: [
21608
- /* @__PURE__ */ jsxs(
21609
- Box,
21610
- {
21611
- className: cn(
21612
- "group flex items-center gap-4 transition-all duration-200",
21613
- isCompact ? "px-4 py-2" : "px-6 py-4",
21614
- "hover:bg-muted/80",
21615
- !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
21616
- ),
21617
- children: [
21618
- /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21619
- itemActions && itemActions.length > 0 && /* @__PURE__ */ jsx(
21620
- HStack,
21601
+ /* @__PURE__ */ jsxs(Box, { className: "group flex items-stretch gap-2", children: [
21602
+ /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21603
+ itemActions && itemActions.length > 0 && /* @__PURE__ */ jsx(
21604
+ HStack,
21605
+ {
21606
+ gap: "xs",
21607
+ className: "flex-shrink-0",
21608
+ children: itemActions.map((action, idx) => /* @__PURE__ */ jsxs(
21609
+ Button,
21621
21610
  {
21622
- gap: "xs",
21623
- className: "flex-shrink-0",
21624
- children: itemActions.map((action, idx) => /* @__PURE__ */ jsxs(
21625
- Button,
21626
- {
21627
- variant: action.variant ?? "ghost",
21628
- size: "sm",
21629
- onClick: handleActionClick(action, itemData),
21630
- "data-testid": `action-${action.event}`,
21631
- "data-row-id": String(itemData.id),
21632
- className: cn(
21633
- action.variant === "danger" && "text-error hover:bg-error/10"
21634
- ),
21635
- children: [
21636
- action.icon && /* @__PURE__ */ jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
21637
- action.label
21638
- ]
21639
- },
21640
- idx
21641
- ))
21642
- }
21643
- )
21644
- ]
21645
- }
21646
- ),
21611
+ variant: action.variant ?? "ghost",
21612
+ size: "sm",
21613
+ onClick: handleActionClick(action, itemData),
21614
+ "data-testid": `action-${action.event}`,
21615
+ "data-row-id": String(itemData.id),
21616
+ className: cn(
21617
+ action.variant === "danger" && "text-error hover:bg-error/10"
21618
+ ),
21619
+ children: [
21620
+ action.icon && /* @__PURE__ */ jsx(Icon, { name: action.icon, size: "xs", className: "mr-1" }),
21621
+ action.label
21622
+ ]
21623
+ },
21624
+ idx
21625
+ ))
21626
+ }
21627
+ )
21628
+ ] }),
21647
21629
  isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
21648
21630
  ] }, id2);
21649
21631
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "4.47.9",
3
+ "version": "4.49.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [