@eventcatalog/visualiser 3.18.3 → 3.19.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.
package/dist/index.mjs CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  useState as useState14,
6
6
  useCallback as useCallback12,
7
7
  useRef as useRef6,
8
- memo as memo34
8
+ memo as memo35
9
9
  } from "react";
10
10
  import { createPortal } from "react-dom";
11
11
  import {
@@ -4114,6 +4114,7 @@ var config_default5 = {
4114
4114
  // src/nodes/Flow.tsx
4115
4115
  import { memo as memo16, useMemo as useMemo7 } from "react";
4116
4116
  import { Handle as Handle12 } from "@xyflow/react";
4117
+ import { Maximize2 } from "lucide-react";
4117
4118
  import * as ContextMenu from "@radix-ui/react-context-menu";
4118
4119
 
4119
4120
  // src/utils/badges.tsx
@@ -4223,7 +4224,7 @@ function getIcon(iconName) {
4223
4224
  }
4224
4225
 
4225
4226
  // src/nodes/Flow.tsx
4226
- import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
4227
+ import { Fragment as Fragment2, jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
4227
4228
  function classNames12(...classes) {
4228
4229
  return classes.filter(Boolean).join(" ");
4229
4230
  }
@@ -4233,6 +4234,7 @@ var Flow_default = memo16(function FlowNode({
4233
4234
  targetPosition
4234
4235
  }) {
4235
4236
  const { mode, flow } = data;
4237
+ const canExpand = Array.isArray(data?.expandedNodes) && data.expandedNodes.length > 0;
4236
4238
  const { id, version, owners = EMPTY_ARRAY, name, styles } = flow.data;
4237
4239
  const { node: { color = "teal", label } = {}, icon = "QueueListIcon" } = styles || {};
4238
4240
  const Icon = useMemo7(() => getIcon(icon), [icon]);
@@ -4243,60 +4245,91 @@ var Flow_default = memo16(function FlowNode({
4243
4245
  /* @__PURE__ */ jsx17(ContextMenu.Trigger, { children: /* @__PURE__ */ jsxs15(
4244
4246
  "div",
4245
4247
  {
4246
- className: classNames12(
4247
- `rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-${color}-400`
4248
- ),
4249
- style: NODE_WIDTH_STYLE,
4248
+ className: "relative",
4249
+ style: { isolation: "isolate", ...NODE_WIDTH_STYLE },
4250
4250
  children: [
4251
+ canExpand && /* @__PURE__ */ jsxs15(Fragment2, { children: [
4252
+ /* @__PURE__ */ jsx17(
4253
+ "div",
4254
+ {
4255
+ className: `absolute inset-0 rounded-md border border-${color}-400 bg-[rgb(var(--ec-card-bg))]`,
4256
+ style: { transform: "translate(6px, 6px)", opacity: 0.5 },
4257
+ "aria-hidden": true
4258
+ }
4259
+ ),
4260
+ /* @__PURE__ */ jsx17(
4261
+ "div",
4262
+ {
4263
+ className: `absolute inset-0 rounded-md border border-${color}-400 bg-[rgb(var(--ec-card-bg))]`,
4264
+ style: { transform: "translate(3px, 3px)", opacity: 0.7 },
4265
+ "aria-hidden": true
4266
+ }
4267
+ )
4268
+ ] }),
4251
4269
  /* @__PURE__ */ jsxs15(
4252
4270
  "div",
4253
4271
  {
4254
4272
  className: classNames12(
4255
- `bg-gradient-to-b from-${color}-500 to-${color}-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-${color}-100`,
4256
- `border-r-[1px] border-${color}-500`
4273
+ `relative rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-${color}-400`
4257
4274
  ),
4275
+ style: NODE_WIDTH_STYLE,
4258
4276
  children: [
4259
- Icon && /* @__PURE__ */ jsx17(Icon, { className: "w-4 h-4 opacity-90 text-white mt-1" }),
4260
- mode === "full" && /* @__PURE__ */ jsx17(
4261
- "span",
4277
+ /* @__PURE__ */ jsxs15(
4278
+ "div",
4262
4279
  {
4263
- className: `text-center text-[${fontSize}] text-white font-bold uppercase mb-4`,
4264
- style: ROTATED_LABEL_STYLE,
4265
- children: nodeLabel
4280
+ className: classNames12(
4281
+ `bg-gradient-to-b from-${color}-500 to-${color}-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-${color}-100`,
4282
+ `border-r-[1px] border-${color}-500`
4283
+ ),
4284
+ children: [
4285
+ Icon && /* @__PURE__ */ jsx17(Icon, { className: "w-4 h-4 opacity-90 text-white mt-1" }),
4286
+ mode === "full" && /* @__PURE__ */ jsx17(
4287
+ "span",
4288
+ {
4289
+ className: `text-center text-[${fontSize}] text-white font-bold uppercase mb-4`,
4290
+ style: ROTATED_LABEL_STYLE,
4291
+ children: nodeLabel
4292
+ }
4293
+ )
4294
+ ]
4266
4295
  }
4267
- )
4268
- ]
4269
- }
4270
- ),
4271
- /* @__PURE__ */ jsxs15("div", { className: "p-1 flex-1", children: [
4272
- targetPosition && /* @__PURE__ */ jsx17(Handle12, { type: "target", position: targetPosition }),
4273
- sourcePosition && /* @__PURE__ */ jsx17(Handle12, { type: "source", position: sourcePosition }),
4274
- /* @__PURE__ */ jsxs15(
4275
- "div",
4276
- {
4277
- className: classNames12(
4278
- mode === "full" ? `border-b border-[rgb(var(--ec-page-border))]` : ""
4279
4296
  ),
4280
- children: [
4281
- /* @__PURE__ */ jsx17("span", { className: "text-xs font-bold block pt-0.5 pb-0.5", children: name }),
4282
- /* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
4283
- /* @__PURE__ */ jsxs15("span", { className: "text-[10px] font-light block pt-0.5 pb-0.5 ", children: [
4284
- "v",
4285
- version
4286
- ] }),
4287
- mode === "simple" && /* @__PURE__ */ jsx17("span", { className: "text-[10px] text-[rgb(var(--ec-page-text-muted))] font-light block pt-0.5 pb-0.5 ", children: nodeLabel })
4297
+ /* @__PURE__ */ jsxs15("div", { className: "p-1 flex-1", children: [
4298
+ targetPosition && /* @__PURE__ */ jsx17(Handle12, { type: "target", position: targetPosition }),
4299
+ sourcePosition && /* @__PURE__ */ jsx17(Handle12, { type: "source", position: sourcePosition }),
4300
+ /* @__PURE__ */ jsxs15(
4301
+ "div",
4302
+ {
4303
+ className: classNames12(
4304
+ mode === "full" ? `border-b border-[rgb(var(--ec-page-border))]` : ""
4305
+ ),
4306
+ children: [
4307
+ /* @__PURE__ */ jsx17("span", { className: "text-xs font-bold block pt-0.5 pb-0.5", children: name }),
4308
+ /* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
4309
+ /* @__PURE__ */ jsxs15("span", { className: "text-[10px] font-light block pt-0.5 pb-0.5 ", children: [
4310
+ "v",
4311
+ version
4312
+ ] }),
4313
+ mode === "simple" && /* @__PURE__ */ jsx17("span", { className: "text-[10px] text-[rgb(var(--ec-page-text-muted))] font-light block pt-0.5 pb-0.5 ", children: nodeLabel })
4314
+ ] })
4315
+ ]
4316
+ }
4317
+ ),
4318
+ mode === "full" && /* @__PURE__ */ jsxs15("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] ", children: [
4319
+ /* @__PURE__ */ jsx17("div", { className: "leading-3 py-1", children: /* @__PURE__ */ jsx17("span", { className: "text-[8px] font-light", children: flow.data.summary }) }),
4320
+ /* @__PURE__ */ jsx17("div", { className: "grid grid-cols-2 gap-x-4 py-1", children: /* @__PURE__ */ jsxs15("span", { className: "text-xs", style: TINY_FONT_STYLE, children: [
4321
+ "Owners: ",
4322
+ owners.length
4323
+ ] }) })
4324
+ ] }),
4325
+ canExpand && /* @__PURE__ */ jsxs15("div", { className: "mt-1 flex items-center gap-1 text-[8px] text-[rgb(var(--ec-page-text-muted))]", children: [
4326
+ /* @__PURE__ */ jsx17(Maximize2, { className: "w-2.5 h-2.5" }),
4327
+ "Click to explore"
4288
4328
  ] })
4289
- ]
4290
- }
4291
- ),
4292
- mode === "full" && /* @__PURE__ */ jsxs15("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] ", children: [
4293
- /* @__PURE__ */ jsx17("div", { className: "leading-3 py-1", children: /* @__PURE__ */ jsx17("span", { className: "text-[8px] font-light", children: flow.data.summary }) }),
4294
- /* @__PURE__ */ jsx17("div", { className: "grid grid-cols-2 gap-x-4 py-1", children: /* @__PURE__ */ jsxs15("span", { className: "text-xs", style: TINY_FONT_STYLE, children: [
4295
- "Owners: ",
4296
- owners.length
4297
- ] }) })
4298
- ] })
4299
- ] })
4329
+ ] })
4330
+ ]
4331
+ }
4332
+ )
4300
4333
  ]
4301
4334
  }
4302
4335
  ) }),
@@ -4332,15 +4365,126 @@ var Flow_default = memo16(function FlowNode({
4332
4365
  ] });
4333
4366
  });
4334
4367
 
4368
+ // src/nodes/FlowExpandedNode.tsx
4369
+ import { memo as memo17 } from "react";
4370
+ import { Workflow, Minimize2 } from "lucide-react";
4371
+ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
4372
+ var CONTAINER_STYLE = {
4373
+ width: "100%",
4374
+ height: "100%",
4375
+ borderRadius: 12,
4376
+ border: "2px solid rgba(20, 184, 166, 0.5)",
4377
+ backgroundColor: "rgba(20, 184, 166, 0.08)",
4378
+ boxShadow: "0 2px 12px rgba(20, 184, 166, 0.12)",
4379
+ position: "relative",
4380
+ overflow: "visible"
4381
+ };
4382
+ var HEADER_STYLE = {
4383
+ position: "absolute",
4384
+ top: 0,
4385
+ left: 0,
4386
+ right: 0,
4387
+ height: 44,
4388
+ borderTopLeftRadius: 10,
4389
+ borderTopRightRadius: 10,
4390
+ background: "rgba(20, 184, 166, 0.12)",
4391
+ borderBottom: "1px solid rgba(20, 184, 166, 0.3)",
4392
+ overflow: "visible"
4393
+ };
4394
+ var BADGE_STYLE = {
4395
+ position: "absolute",
4396
+ top: -10,
4397
+ left: 12,
4398
+ display: "inline-flex",
4399
+ alignItems: "center",
4400
+ gap: 3,
4401
+ padding: "2px 8px",
4402
+ borderRadius: 4,
4403
+ background: "#0d9488",
4404
+ boxShadow: "0 1px 3px rgba(0,0,0,0.15)",
4405
+ zIndex: 10,
4406
+ fontSize: 8,
4407
+ fontWeight: 700,
4408
+ letterSpacing: "0.08em",
4409
+ textTransform: "uppercase",
4410
+ color: "white"
4411
+ };
4412
+ var HEADER_CONTENT_STYLE = {
4413
+ display: "flex",
4414
+ alignItems: "center",
4415
+ justifyContent: "space-between",
4416
+ height: "100%",
4417
+ padding: "0 12px 0 14px"
4418
+ };
4419
+ var FLOW_NAME_STYLE = {
4420
+ fontSize: 11,
4421
+ fontWeight: 700,
4422
+ color: "rgb(var(--ec-page-text))",
4423
+ letterSpacing: "0.04em",
4424
+ textTransform: "uppercase",
4425
+ whiteSpace: "nowrap"
4426
+ };
4427
+ var VERSION_STYLE = {
4428
+ fontSize: 10,
4429
+ fontWeight: 500,
4430
+ color: "#5eead4",
4431
+ marginLeft: 8
4432
+ };
4433
+ var COLLAPSE_BUTTON_STYLE = {
4434
+ background: "#0d9488",
4435
+ border: "1px solid #5eead4",
4436
+ borderRadius: 6,
4437
+ padding: "4px 10px",
4438
+ cursor: "pointer",
4439
+ display: "flex",
4440
+ alignItems: "center",
4441
+ gap: 4,
4442
+ fontSize: 10,
4443
+ fontWeight: 600,
4444
+ color: "white"
4445
+ };
4446
+ var FlowExpandedNode_default = memo17(function FlowExpandedNode({
4447
+ data
4448
+ }) {
4449
+ const { flowName, version } = data;
4450
+ return /* @__PURE__ */ jsx18("div", { style: CONTAINER_STYLE, children: /* @__PURE__ */ jsxs16("div", { style: HEADER_STYLE, children: [
4451
+ /* @__PURE__ */ jsxs16("div", { style: BADGE_STYLE, children: [
4452
+ /* @__PURE__ */ jsx18(Workflow, { size: 10, strokeWidth: 2.5 }),
4453
+ "Sub-flow"
4454
+ ] }),
4455
+ /* @__PURE__ */ jsxs16("div", { style: HEADER_CONTENT_STYLE, children: [
4456
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center" }, children: [
4457
+ /* @__PURE__ */ jsx18("span", { style: FLOW_NAME_STYLE, children: flowName || "Flow" }),
4458
+ version && /* @__PURE__ */ jsxs16("span", { style: VERSION_STYLE, children: [
4459
+ "v",
4460
+ version
4461
+ ] })
4462
+ ] }),
4463
+ /* @__PURE__ */ jsxs16(
4464
+ "button",
4465
+ {
4466
+ style: COLLAPSE_BUTTON_STYLE,
4467
+ className: "ec-collapse-flow-btn nodrag nopan",
4468
+ onMouseDown: (e) => e.stopPropagation(),
4469
+ children: [
4470
+ /* @__PURE__ */ jsx18(Minimize2, { size: 12, strokeWidth: 2.5 }),
4471
+ "Collapse"
4472
+ ]
4473
+ }
4474
+ )
4475
+ ] })
4476
+ ] }) });
4477
+ });
4478
+
4335
4479
  // src/nodes/Entity.tsx
4336
4480
  import { Handle as Handle13, Position as Position12 } from "@xyflow/react";
4337
4481
  import * as ContextMenu2 from "@radix-ui/react-context-menu";
4338
- import { memo as memo17, useState as useState3, useMemo as useMemo8 } from "react";
4339
- import { Fragment as Fragment2, jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
4482
+ import { memo as memo18, useState as useState3, useMemo as useMemo8 } from "react";
4483
+ import { Fragment as Fragment3, jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
4340
4484
  function classNames13(...classes) {
4341
4485
  return classes.filter(Boolean).join(" ");
4342
4486
  }
4343
- var Entity_default = memo17(function EntityNode({
4487
+ var Entity_default = memo18(function EntityNode({
4344
4488
  data,
4345
4489
  sourcePosition,
4346
4490
  targetPosition
@@ -4361,8 +4505,8 @@ var Entity_default = memo17(function EntityNode({
4361
4505
  const Icon = useMemo8(() => getIcon(icon), [icon]);
4362
4506
  const [hoveredProperty, setHoveredProperty] = useState3(null);
4363
4507
  const portalContainer = usePortalContainer();
4364
- return /* @__PURE__ */ jsxs16(ContextMenu2.Root, { children: [
4365
- /* @__PURE__ */ jsx18(ContextMenu2.Trigger, { children: /* @__PURE__ */ jsxs16(
4508
+ return /* @__PURE__ */ jsxs17(ContextMenu2.Root, { children: [
4509
+ /* @__PURE__ */ jsx19(ContextMenu2.Trigger, { children: /* @__PURE__ */ jsxs17(
4366
4510
  "div",
4367
4511
  {
4368
4512
  className: classNames13(
@@ -4370,7 +4514,7 @@ var Entity_default = memo17(function EntityNode({
4370
4514
  externalToDomain ? "border-amber-500/60" : "border-blue-400/50"
4371
4515
  ),
4372
4516
  children: [
4373
- /* @__PURE__ */ jsxs16(
4517
+ /* @__PURE__ */ jsxs17(
4374
4518
  "div",
4375
4519
  {
4376
4520
  className: classNames13(
@@ -4378,34 +4522,34 @@ var Entity_default = memo17(function EntityNode({
4378
4522
  externalToDomain ? "bg-amber-500/20" : "bg-blue-500/15"
4379
4523
  ),
4380
4524
  children: [
4381
- /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
4382
- Icon && /* @__PURE__ */ jsx18(Icon, { className: "w-4 h-4 text-[rgb(var(--ec-page-text-muted))]" }),
4383
- /* @__PURE__ */ jsx18("span", { className: "font-semibold text-[rgb(var(--ec-page-text))] text-sm", children: name }),
4384
- aggregateRoot && /* @__PURE__ */ jsx18("span", { className: "text-xs bg-amber-500/20 text-amber-600 dark:text-amber-400 px-1.5 py-0.5 rounded font-medium", children: "AR" })
4525
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
4526
+ Icon && /* @__PURE__ */ jsx19(Icon, { className: "w-4 h-4 text-[rgb(var(--ec-page-text-muted))]" }),
4527
+ /* @__PURE__ */ jsx19("span", { className: "font-semibold text-[rgb(var(--ec-page-text))] text-sm", children: name }),
4528
+ aggregateRoot && /* @__PURE__ */ jsx19("span", { className: "text-xs bg-amber-500/20 text-amber-600 dark:text-amber-400 px-1.5 py-0.5 rounded font-medium", children: "AR" })
4385
4529
  ] }),
4386
- domainName && /* @__PURE__ */ jsxs16("div", { className: "text-xs text-[rgb(var(--ec-page-text-muted))] font-medium mt-1", children: [
4530
+ domainName && /* @__PURE__ */ jsxs17("div", { className: "text-xs text-[rgb(var(--ec-page-text-muted))] font-medium mt-1", children: [
4387
4531
  "from ",
4388
4532
  domainName,
4389
4533
  " domain"
4390
4534
  ] }),
4391
- mode === "full" && /* @__PURE__ */ jsxs16("div", { className: "text-xs text-[rgb(var(--ec-page-text-muted))] mt-1", children: [
4535
+ mode === "full" && /* @__PURE__ */ jsxs17("div", { className: "text-xs text-[rgb(var(--ec-page-text-muted))] mt-1", children: [
4392
4536
  "v",
4393
4537
  version
4394
4538
  ] })
4395
4539
  ]
4396
4540
  }
4397
4541
  ),
4398
- properties.length > 0 ? /* @__PURE__ */ jsx18("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] relative", children: properties.map((property, index) => {
4542
+ properties.length > 0 ? /* @__PURE__ */ jsx19("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] relative", children: properties.map((property, index) => {
4399
4543
  const propertyKey = `${property.name}-${index}`;
4400
4544
  const isHovered = hoveredProperty === propertyKey;
4401
- return /* @__PURE__ */ jsxs16(
4545
+ return /* @__PURE__ */ jsxs17(
4402
4546
  "div",
4403
4547
  {
4404
4548
  className: "relative flex items-center justify-between px-4 py-2 hover:bg-[rgb(var(--ec-page-border)/0.2)]",
4405
4549
  onMouseEnter: () => property.description && setHoveredProperty(propertyKey),
4406
4550
  onMouseLeave: () => setHoveredProperty(null),
4407
4551
  children: [
4408
- /* @__PURE__ */ jsx18(
4552
+ /* @__PURE__ */ jsx19(
4409
4553
  Handle13,
4410
4554
  {
4411
4555
  type: "target",
@@ -4415,7 +4559,7 @@ var Entity_default = memo17(function EntityNode({
4415
4559
  style: HANDLE_LEFT_OFFSET_STYLE
4416
4560
  }
4417
4561
  ),
4418
- /* @__PURE__ */ jsx18(
4562
+ /* @__PURE__ */ jsx19(
4419
4563
  Handle13,
4420
4564
  {
4421
4565
  type: "source",
@@ -4425,47 +4569,47 @@ var Entity_default = memo17(function EntityNode({
4425
4569
  style: HANDLE_RIGHT_OFFSET_STYLE
4426
4570
  }
4427
4571
  ),
4428
- /* @__PURE__ */ jsxs16("div", { className: "flex-1 flex items-center justify-between", children: [
4429
- /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-1", children: [
4430
- /* @__PURE__ */ jsx18("span", { className: "text-sm font-medium text-[rgb(var(--ec-page-text))]", children: property.name }),
4431
- property.required && /* @__PURE__ */ jsx18("span", { className: "text-red-500 text-xs", children: "*" })
4572
+ /* @__PURE__ */ jsxs17("div", { className: "flex-1 flex items-center justify-between", children: [
4573
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-1", children: [
4574
+ /* @__PURE__ */ jsx19("span", { className: "text-sm font-medium text-[rgb(var(--ec-page-text))]", children: property.name }),
4575
+ property.required && /* @__PURE__ */ jsx19("span", { className: "text-red-500 text-xs", children: "*" })
4432
4576
  ] }),
4433
- /* @__PURE__ */ jsx18("span", { className: "text-sm text-[rgb(var(--ec-page-text-muted))] font-mono", children: property.type })
4577
+ /* @__PURE__ */ jsx19("span", { className: "text-sm text-[rgb(var(--ec-page-text-muted))] font-mono", children: property.type })
4434
4578
  ] }),
4435
- property.references && /* @__PURE__ */ jsx18("div", { className: "absolute right-2 top-1/2 transform -translate-y-1/2", children: /* @__PURE__ */ jsx18(
4579
+ property.references && /* @__PURE__ */ jsx19("div", { className: "absolute right-2 top-1/2 transform -translate-y-1/2", children: /* @__PURE__ */ jsx19(
4436
4580
  "div",
4437
4581
  {
4438
4582
  className: "w-2 h-2 bg-blue-500 rounded-full",
4439
4583
  title: `References ${property.references}`
4440
4584
  }
4441
4585
  ) }),
4442
- isHovered && property.description && /* @__PURE__ */ jsxs16("div", { className: "absolute left-full ml-2 top-1/2 transform -translate-y-1/2 z-[9999] w-[200px] bg-gray-900 text-white text-xs rounded-lg py-2 px-3 pointer-events-none shadow-xl max-w-xl opacity-100", children: [
4443
- /* @__PURE__ */ jsx18("div", { className: "text-gray-200 whitespace-normal break-words", children: property.description }),
4444
- /* @__PURE__ */ jsx18("div", { className: "absolute right-full top-1/2 transform -translate-y-1/2 border-4 border-transparent border-r-gray-900" })
4586
+ isHovered && property.description && /* @__PURE__ */ jsxs17("div", { className: "absolute left-full ml-2 top-1/2 transform -translate-y-1/2 z-[9999] w-[200px] bg-gray-900 text-white text-xs rounded-lg py-2 px-3 pointer-events-none shadow-xl max-w-xl opacity-100", children: [
4587
+ /* @__PURE__ */ jsx19("div", { className: "text-gray-200 whitespace-normal break-words", children: property.description }),
4588
+ /* @__PURE__ */ jsx19("div", { className: "absolute right-full top-1/2 transform -translate-y-1/2 border-4 border-transparent border-r-gray-900" })
4445
4589
  ] })
4446
4590
  ]
4447
4591
  },
4448
4592
  propertyKey
4449
4593
  );
4450
- }) }) : /* @__PURE__ */ jsx18("div", { className: "px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))] text-center", children: "No properties defined" }),
4451
- properties.length === 0 && /* @__PURE__ */ jsxs16(Fragment2, { children: [
4452
- targetPosition && /* @__PURE__ */ jsx18(Handle13, { type: "target", position: targetPosition }),
4453
- sourcePosition && /* @__PURE__ */ jsx18(Handle13, { type: "source", position: sourcePosition })
4594
+ }) }) : /* @__PURE__ */ jsx19("div", { className: "px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))] text-center", children: "No properties defined" }),
4595
+ properties.length === 0 && /* @__PURE__ */ jsxs17(Fragment3, { children: [
4596
+ targetPosition && /* @__PURE__ */ jsx19(Handle13, { type: "target", position: targetPosition }),
4597
+ sourcePosition && /* @__PURE__ */ jsx19(Handle13, { type: "source", position: sourcePosition })
4454
4598
  ] })
4455
4599
  ]
4456
4600
  }
4457
4601
  ) }),
4458
- /* @__PURE__ */ jsx18(ContextMenu2.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx18(
4602
+ /* @__PURE__ */ jsx19(ContextMenu2.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx19(
4459
4603
  ContextMenu2.Content,
4460
4604
  {
4461
4605
  className: "min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]",
4462
4606
  onClick: (e) => e.stopPropagation(),
4463
- children: /* @__PURE__ */ jsx18(
4607
+ children: /* @__PURE__ */ jsx19(
4464
4608
  ContextMenu2.Item,
4465
4609
  {
4466
4610
  asChild: true,
4467
4611
  className: "text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-accent-subtle))] rounded-sm flex items-center",
4468
- children: /* @__PURE__ */ jsx18("a", { href: buildUrl(`/docs/entities/${entity.data.id}/${version}`), children: "Read documentation" })
4612
+ children: /* @__PURE__ */ jsx19("a", { href: buildUrl(`/docs/entities/${entity.data.id}/${version}`), children: "Read documentation" })
4469
4613
  }
4470
4614
  )
4471
4615
  }
@@ -4474,14 +4618,14 @@ var Entity_default = memo17(function EntityNode({
4474
4618
  });
4475
4619
 
4476
4620
  // src/nodes/User.tsx
4477
- import { memo as memo18 } from "react";
4621
+ import { memo as memo19 } from "react";
4478
4622
  import { UserIcon as UserIcon2 } from "@heroicons/react/20/solid";
4479
4623
  import { Handle as Handle14 } from "@xyflow/react";
4480
- import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
4624
+ import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
4481
4625
  function classNames14(...classes) {
4482
4626
  return classes.filter(Boolean).join(" ");
4483
4627
  }
4484
- var User_default = memo18(function UserNode({
4628
+ var User_default = memo19(function UserNode({
4485
4629
  data,
4486
4630
  sourcePosition,
4487
4631
  targetPosition
@@ -4493,7 +4637,7 @@ var User_default = memo18(function UserNode({
4493
4637
  showSource: _showSource = true
4494
4638
  } = data;
4495
4639
  const { summary, actor: { name } = {} } = step;
4496
- return /* @__PURE__ */ jsxs17(
4640
+ return /* @__PURE__ */ jsxs18(
4497
4641
  "div",
4498
4642
  {
4499
4643
  className: classNames14(
@@ -4502,7 +4646,7 @@ var User_default = memo18(function UserNode({
4502
4646
  ),
4503
4647
  style: NODE_WIDTH_STYLE,
4504
4648
  children: [
4505
- /* @__PURE__ */ jsxs17(
4649
+ /* @__PURE__ */ jsxs18(
4506
4650
  "div",
4507
4651
  {
4508
4652
  className: classNames14(
@@ -4510,8 +4654,8 @@ var User_default = memo18(function UserNode({
4510
4654
  `border-r-[1px] border-yellow-500`
4511
4655
  ),
4512
4656
  children: [
4513
- /* @__PURE__ */ jsx19(UserIcon2, { className: "w-4 h-4 opacity-90 text-white mt-1" }),
4514
- mode === "full" && /* @__PURE__ */ jsx19(
4657
+ /* @__PURE__ */ jsx20(UserIcon2, { className: "w-4 h-4 opacity-90 text-white mt-1" }),
4658
+ mode === "full" && /* @__PURE__ */ jsx20(
4515
4659
  "span",
4516
4660
  {
4517
4661
  className: "text-center text-[9px] text-white font-bold uppercase mb-4",
@@ -4522,24 +4666,24 @@ var User_default = memo18(function UserNode({
4522
4666
  ]
4523
4667
  }
4524
4668
  ),
4525
- /* @__PURE__ */ jsxs17("div", { className: "p-1 flex-1", children: [
4526
- targetPosition && /* @__PURE__ */ jsx19(Handle14, { type: "target", position: targetPosition }),
4527
- sourcePosition && /* @__PURE__ */ jsx19(Handle14, { type: "source", position: sourcePosition }),
4528
- (!summary || mode !== "full") && /* @__PURE__ */ jsxs17("div", { className: "h-full ", children: [
4529
- /* @__PURE__ */ jsx19("span", { className: "text-sm font-bold block pb-0.5 w-full", children: name }),
4530
- mode === "simple" && /* @__PURE__ */ jsx19("div", { className: "w-full text-right", children: /* @__PURE__ */ jsx19("span", { className: " w-full text-[10px] text-[rgb(var(--ec-page-text-muted))] font-light block pt-0.5 pb-0.5 ", children: "Event" }) })
4669
+ /* @__PURE__ */ jsxs18("div", { className: "p-1 flex-1", children: [
4670
+ targetPosition && /* @__PURE__ */ jsx20(Handle14, { type: "target", position: targetPosition }),
4671
+ sourcePosition && /* @__PURE__ */ jsx20(Handle14, { type: "source", position: sourcePosition }),
4672
+ (!summary || mode !== "full") && /* @__PURE__ */ jsxs18("div", { className: "h-full ", children: [
4673
+ /* @__PURE__ */ jsx20("span", { className: "text-sm font-bold block pb-0.5 w-full", children: name }),
4674
+ mode === "simple" && /* @__PURE__ */ jsx20("div", { className: "w-full text-right", children: /* @__PURE__ */ jsx20("span", { className: " w-full text-[10px] text-[rgb(var(--ec-page-text-muted))] font-light block pt-0.5 pb-0.5 ", children: "Event" }) })
4531
4675
  ] }),
4532
- summary && mode === "full" && /* @__PURE__ */ jsxs17("div", { children: [
4533
- /* @__PURE__ */ jsx19(
4676
+ summary && mode === "full" && /* @__PURE__ */ jsxs18("div", { children: [
4677
+ /* @__PURE__ */ jsx20(
4534
4678
  "div",
4535
4679
  {
4536
4680
  className: classNames14(
4537
4681
  mode === "full" ? `border-b border-[rgb(var(--ec-page-border))]` : ""
4538
4682
  ),
4539
- children: /* @__PURE__ */ jsx19("span", { className: "text-xs font-bold block pb-0.5", children: name })
4683
+ children: /* @__PURE__ */ jsx20("span", { className: "text-xs font-bold block pb-0.5", children: name })
4540
4684
  }
4541
4685
  ),
4542
- mode === "full" && /* @__PURE__ */ jsx19("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] ", children: /* @__PURE__ */ jsx19("div", { className: "leading-3 py-1", children: /* @__PURE__ */ jsx19("span", { className: "text-[8px] font-light", children: summary }) }) })
4686
+ mode === "full" && /* @__PURE__ */ jsx20("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] ", children: /* @__PURE__ */ jsx20("div", { className: "leading-3 py-1", children: /* @__PURE__ */ jsx20("span", { className: "text-[8px] font-light", children: summary }) }) })
4543
4687
  ] })
4544
4688
  ] })
4545
4689
  ]
@@ -4548,20 +4692,20 @@ var User_default = memo18(function UserNode({
4548
4692
  });
4549
4693
 
4550
4694
  // src/nodes/Step.tsx
4551
- import { memo as memo19 } from "react";
4695
+ import { memo as memo20 } from "react";
4552
4696
  import { Handle as Handle15, Position as Position13 } from "@xyflow/react";
4553
- import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
4697
+ import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
4554
4698
  function classNames15(...classes) {
4555
4699
  return classes.filter(Boolean).join(" ");
4556
4700
  }
4557
- var Step_default = memo19(function StepNode({
4701
+ var Step_default = memo20(function StepNode({
4558
4702
  data,
4559
4703
  sourcePosition,
4560
4704
  targetPosition
4561
4705
  }) {
4562
4706
  const { mode, step } = data;
4563
4707
  const { title, summary } = step;
4564
- return /* @__PURE__ */ jsxs18(
4708
+ return /* @__PURE__ */ jsxs19(
4565
4709
  "div",
4566
4710
  {
4567
4711
  className: classNames15(
@@ -4569,14 +4713,14 @@ var Step_default = memo19(function StepNode({
4569
4713
  ),
4570
4714
  style: NODE_WIDTH_STYLE,
4571
4715
  children: [
4572
- /* @__PURE__ */ jsx20(
4716
+ /* @__PURE__ */ jsx21(
4573
4717
  "div",
4574
4718
  {
4575
4719
  className: classNames15(
4576
4720
  "bg-gradient-to-b from-gray-700 to-gray-700 relative flex flex-col items-center w-5 justify-end rounded-l-sm text-orange-100-500",
4577
4721
  `border-r-[1px] border-gray-500`
4578
4722
  ),
4579
- children: mode === "full" && /* @__PURE__ */ jsx20(
4723
+ children: mode === "full" && /* @__PURE__ */ jsx21(
4580
4724
  "span",
4581
4725
  {
4582
4726
  className: "text-center text-[9px] text-white font-bold uppercase mb-4",
@@ -4586,8 +4730,8 @@ var Step_default = memo19(function StepNode({
4586
4730
  )
4587
4731
  }
4588
4732
  ),
4589
- /* @__PURE__ */ jsxs18("div", { className: "p-1 flex-1", children: [
4590
- /* @__PURE__ */ jsx20(
4733
+ /* @__PURE__ */ jsxs19("div", { className: "p-1 flex-1", children: [
4734
+ /* @__PURE__ */ jsx21(
4591
4735
  Handle15,
4592
4736
  {
4593
4737
  type: "target",
@@ -4595,7 +4739,7 @@ var Step_default = memo19(function StepNode({
4595
4739
  style: HIDDEN_HANDLE_STYLE
4596
4740
  }
4597
4741
  ),
4598
- /* @__PURE__ */ jsx20(
4742
+ /* @__PURE__ */ jsx21(
4599
4743
  Handle15,
4600
4744
  {
4601
4745
  type: "source",
@@ -4603,18 +4747,18 @@ var Step_default = memo19(function StepNode({
4603
4747
  style: HIDDEN_HANDLE_STYLE
4604
4748
  }
4605
4749
  ),
4606
- !summary && /* @__PURE__ */ jsx20("div", { className: "h-full flex items-center", children: /* @__PURE__ */ jsx20("span", { className: "text-sm font-bold block pb-0.5", children: title }) }),
4607
- summary && /* @__PURE__ */ jsxs18("div", { children: [
4608
- /* @__PURE__ */ jsx20(
4750
+ !summary && /* @__PURE__ */ jsx21("div", { className: "h-full flex items-center", children: /* @__PURE__ */ jsx21("span", { className: "text-sm font-bold block pb-0.5", children: title }) }),
4751
+ summary && /* @__PURE__ */ jsxs19("div", { children: [
4752
+ /* @__PURE__ */ jsx21(
4609
4753
  "div",
4610
4754
  {
4611
4755
  className: classNames15(
4612
4756
  mode === "full" ? `border-b border-[rgb(var(--ec-page-border))]` : ""
4613
4757
  ),
4614
- children: /* @__PURE__ */ jsx20("span", { className: "text-xs font-bold block pb-0.5", children: title })
4758
+ children: /* @__PURE__ */ jsx21("span", { className: "text-xs font-bold block pb-0.5", children: title })
4615
4759
  }
4616
4760
  ),
4617
- mode === "full" && /* @__PURE__ */ jsx20("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] ", children: /* @__PURE__ */ jsx20("div", { className: "leading-3 py-1", children: /* @__PURE__ */ jsx20("span", { className: "text-[8px] font-light", children: summary }) }) })
4761
+ mode === "full" && /* @__PURE__ */ jsx21("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] ", children: /* @__PURE__ */ jsx21("div", { className: "leading-3 py-1", children: /* @__PURE__ */ jsx21("span", { className: "text-[8px] font-light", children: summary }) }) })
4618
4762
  ] })
4619
4763
  ] })
4620
4764
  ]
@@ -4630,9 +4774,9 @@ import {
4630
4774
  Position as Position14
4631
4775
  } from "@xyflow/react";
4632
4776
  import * as ContextMenu3 from "@radix-ui/react-context-menu";
4633
- import { memo as memo20, useState as useState4, useCallback as useCallback3, useMemo as useMemo9 } from "react";
4634
- import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
4635
- var Domain_default = memo20(function DomainNode({ data, id: nodeId }) {
4777
+ import { memo as memo21, useState as useState4, useCallback as useCallback3, useMemo as useMemo9 } from "react";
4778
+ import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
4779
+ var Domain_default = memo21(function DomainNode({ data, id: nodeId }) {
4636
4780
  const { mode, domain } = data;
4637
4781
  const reactFlow = useReactFlow();
4638
4782
  const [highlightedServices, setHighlightedServices] = useState4(
@@ -4675,27 +4819,27 @@ var Domain_default = memo20(function DomainNode({ data, id: nodeId }) {
4675
4819
  useOnSelectionChange({
4676
4820
  onChange: handleSelectionChange
4677
4821
  });
4678
- return /* @__PURE__ */ jsxs19(ContextMenu3.Root, { children: [
4679
- /* @__PURE__ */ jsx21(ContextMenu3.Trigger, { children: /* @__PURE__ */ jsxs19("div", { className: "w-full rounded-lg border-2 border-yellow-400 bg-[rgb(var(--ec-card-bg))] shadow-lg", children: [
4680
- /* @__PURE__ */ jsxs19("div", { className: "bg-[rgb(var(--ec-domain-header-bg,253_224_71)/0.2)] px-3 py-2 flex items-center space-x-2", children: [
4681
- Icon && /* @__PURE__ */ jsx21(Icon, { className: "w-4 h-4 text-yellow-500" }),
4682
- /* @__PURE__ */ jsxs19("div", { children: [
4683
- /* @__PURE__ */ jsx21("span", { className: "text-sm font-bold text-[rgb(var(--ec-page-text))]", children: name }),
4684
- /* @__PURE__ */ jsxs19("span", { className: "text-xs text-yellow-500 ml-2", children: [
4822
+ return /* @__PURE__ */ jsxs20(ContextMenu3.Root, { children: [
4823
+ /* @__PURE__ */ jsx22(ContextMenu3.Trigger, { children: /* @__PURE__ */ jsxs20("div", { className: "w-full rounded-lg border-2 border-yellow-400 bg-[rgb(var(--ec-card-bg))] shadow-lg", children: [
4824
+ /* @__PURE__ */ jsxs20("div", { className: "bg-[rgb(var(--ec-domain-header-bg,253_224_71)/0.2)] px-3 py-2 flex items-center space-x-2", children: [
4825
+ Icon && /* @__PURE__ */ jsx22(Icon, { className: "w-4 h-4 text-yellow-500" }),
4826
+ /* @__PURE__ */ jsxs20("div", { children: [
4827
+ /* @__PURE__ */ jsx22("span", { className: "text-sm font-bold text-[rgb(var(--ec-page-text))]", children: name }),
4828
+ /* @__PURE__ */ jsxs20("span", { className: "text-xs text-yellow-500 ml-2", children: [
4685
4829
  "v",
4686
4830
  version
4687
4831
  ] })
4688
4832
  ] })
4689
4833
  ] }),
4690
- mode === "full" && services.length > 0 && /* @__PURE__ */ jsx21("div", { children: services.map((service, index) => {
4834
+ mode === "full" && services.length > 0 && /* @__PURE__ */ jsx22("div", { children: services.map((service, index) => {
4691
4835
  const isHighlighted = highlightedServices.has(service.data.id);
4692
- return /* @__PURE__ */ jsxs19(ContextMenu3.Root, { children: [
4693
- /* @__PURE__ */ jsx21(ContextMenu3.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs19(
4836
+ return /* @__PURE__ */ jsxs20(ContextMenu3.Root, { children: [
4837
+ /* @__PURE__ */ jsx22(ContextMenu3.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs20(
4694
4838
  "div",
4695
4839
  {
4696
4840
  className: `relative flex items-center justify-between px-3 py-2 cursor-pointer ${index !== services.length - 1 ? "border-b border-[rgb(var(--ec-page-border))]" : ""} ${isHighlighted ? "bg-pink-100 border-pink-300" : ""}`,
4697
4841
  children: [
4698
- /* @__PURE__ */ jsx21(
4842
+ /* @__PURE__ */ jsx22(
4699
4843
  Handle16,
4700
4844
  {
4701
4845
  type: "target",
@@ -4705,7 +4849,7 @@ var Domain_default = memo20(function DomainNode({ data, id: nodeId }) {
4705
4849
  style: HANDLE_LEFT_STYLE
4706
4850
  }
4707
4851
  ),
4708
- /* @__PURE__ */ jsx21(
4852
+ /* @__PURE__ */ jsx22(
4709
4853
  Handle16,
4710
4854
  {
4711
4855
  type: "source",
@@ -4715,19 +4859,19 @@ var Domain_default = memo20(function DomainNode({ data, id: nodeId }) {
4715
4859
  style: HANDLE_RIGHT_STYLE
4716
4860
  }
4717
4861
  ),
4718
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center space-x-3", children: [
4719
- /* @__PURE__ */ jsx21("div", { className: "flex items-center justify-center w-5 h-5 bg-pink-500 rounded", children: ServerIcon3 && /* @__PURE__ */ jsx21(ServerIcon3, { className: "w-3 h-3 text-white" }) }),
4720
- /* @__PURE__ */ jsx21("span", { className: "text-sm font-medium text-[rgb(var(--ec-page-text))]", children: service.data.name || service.data.id })
4862
+ /* @__PURE__ */ jsxs20("div", { className: "flex items-center space-x-3", children: [
4863
+ /* @__PURE__ */ jsx22("div", { className: "flex items-center justify-center w-5 h-5 bg-pink-500 rounded", children: ServerIcon3 && /* @__PURE__ */ jsx22(ServerIcon3, { className: "w-3 h-3 text-white" }) }),
4864
+ /* @__PURE__ */ jsx22("span", { className: "text-sm font-medium text-[rgb(var(--ec-page-text))]", children: service.data.name || service.data.id })
4721
4865
  ] }),
4722
- /* @__PURE__ */ jsx21("div", { className: "flex items-center space-x-4 text-sm text-[rgb(var(--ec-page-text-muted))]", children: /* @__PURE__ */ jsxs19("span", { className: "text-xs", children: [
4866
+ /* @__PURE__ */ jsx22("div", { className: "flex items-center space-x-4 text-sm text-[rgb(var(--ec-page-text-muted))]", children: /* @__PURE__ */ jsxs20("span", { className: "text-xs", children: [
4723
4867
  "v",
4724
4868
  service.data.version
4725
4869
  ] }) })
4726
4870
  ]
4727
4871
  }
4728
4872
  ) }),
4729
- /* @__PURE__ */ jsx21(ContextMenu3.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs19(ContextMenu3.Content, { className: "min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]", children: [
4730
- /* @__PURE__ */ jsx21(
4873
+ /* @__PURE__ */ jsx22(ContextMenu3.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs20(ContextMenu3.Content, { className: "min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]", children: [
4874
+ /* @__PURE__ */ jsx22(
4731
4875
  ContextMenu3.Item,
4732
4876
  {
4733
4877
  className: "text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-page-border)/0.5)] rounded-sm flex items-center",
@@ -4737,7 +4881,7 @@ var Domain_default = memo20(function DomainNode({ data, id: nodeId }) {
4737
4881
  children: "View Service Documentation"
4738
4882
  }
4739
4883
  ),
4740
- /* @__PURE__ */ jsx21(
4884
+ /* @__PURE__ */ jsx22(
4741
4885
  ContextMenu3.Item,
4742
4886
  {
4743
4887
  className: "text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-page-border)/0.5)] rounded-sm flex items-center",
@@ -4751,8 +4895,8 @@ var Domain_default = memo20(function DomainNode({ data, id: nodeId }) {
4751
4895
  ] }, `${service.data.id}-${index}`);
4752
4896
  }) })
4753
4897
  ] }) }),
4754
- /* @__PURE__ */ jsx21(ContextMenu3.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs19(ContextMenu3.Content, { className: "min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]", children: [
4755
- /* @__PURE__ */ jsx21(
4898
+ /* @__PURE__ */ jsx22(ContextMenu3.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs20(ContextMenu3.Content, { className: "min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]", children: [
4899
+ /* @__PURE__ */ jsx22(
4756
4900
  ContextMenu3.Item,
4757
4901
  {
4758
4902
  className: "text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-page-border)/0.5)] rounded-sm flex items-center",
@@ -4762,7 +4906,7 @@ var Domain_default = memo20(function DomainNode({ data, id: nodeId }) {
4762
4906
  children: "View Domain Documentation"
4763
4907
  }
4764
4908
  ),
4765
- /* @__PURE__ */ jsx21(
4909
+ /* @__PURE__ */ jsx22(
4766
4910
  ContextMenu3.Item,
4767
4911
  {
4768
4912
  className: "text-sm text-[rgb(var(--ec-page-text))] px-2 py-1.5 outline-none cursor-pointer hover:bg-[rgb(var(--ec-page-border)/0.5)] rounded-sm flex items-center",
@@ -4777,9 +4921,9 @@ var Domain_default = memo20(function DomainNode({ data, id: nodeId }) {
4777
4921
  });
4778
4922
 
4779
4923
  // src/nodes/GroupNode.tsx
4780
- import { memo as memo21 } from "react";
4924
+ import { memo as memo22 } from "react";
4781
4925
  import { BoxesIcon } from "lucide-react";
4782
- import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
4926
+ import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
4783
4927
  var GROUP_CONTAINER_STYLE = {
4784
4928
  width: "100%",
4785
4929
  height: "100%",
@@ -4851,11 +4995,11 @@ var GROUP_VERSION_STYLE = {
4851
4995
  };
4852
4996
  var GROUP_ICON_COLOR_STYLE = { color: "#7c3aed" };
4853
4997
  var GROUP_ICON_WHITE_STYLE = { color: "white" };
4854
- var GroupNode_default = memo21(function GroupNode({ data }) {
4998
+ var GroupNode_default = memo22(function GroupNode({ data }) {
4855
4999
  const { domain } = data;
4856
- return /* @__PURE__ */ jsx22("div", { style: GROUP_CONTAINER_STYLE, children: /* @__PURE__ */ jsxs20("div", { style: GROUP_HEADER_STYLE, children: [
4857
- /* @__PURE__ */ jsx22("div", { style: GROUP_WATERMARK_STYLE, children: /* @__PURE__ */ jsx22(BoxesIcon, { size: 28, strokeWidth: 2, style: GROUP_ICON_COLOR_STYLE }) }),
4858
- /* @__PURE__ */ jsx22("div", { style: GROUP_ICON_CIRCLE_STYLE, children: /* @__PURE__ */ jsx22(
5000
+ return /* @__PURE__ */ jsx23("div", { style: GROUP_CONTAINER_STYLE, children: /* @__PURE__ */ jsxs21("div", { style: GROUP_HEADER_STYLE, children: [
5001
+ /* @__PURE__ */ jsx23("div", { style: GROUP_WATERMARK_STYLE, children: /* @__PURE__ */ jsx23(BoxesIcon, { size: 28, strokeWidth: 2, style: GROUP_ICON_COLOR_STYLE }) }),
5002
+ /* @__PURE__ */ jsx23("div", { style: GROUP_ICON_CIRCLE_STYLE, children: /* @__PURE__ */ jsx23(
4859
5003
  BoxesIcon,
4860
5004
  {
4861
5005
  size: 16,
@@ -4863,9 +5007,9 @@ var GroupNode_default = memo21(function GroupNode({ data }) {
4863
5007
  style: GROUP_ICON_WHITE_STYLE
4864
5008
  }
4865
5009
  ) }),
4866
- /* @__PURE__ */ jsx22("div", { style: GROUP_BANNER_CONTENT_STYLE, children: /* @__PURE__ */ jsxs20("div", { style: GROUP_BANNER_INNER_STYLE, children: [
4867
- /* @__PURE__ */ jsx22("span", { style: GROUP_DOMAIN_NAME_STYLE, children: domain?.name || "Domain" }),
4868
- domain?.version && /* @__PURE__ */ jsxs20("span", { style: GROUP_VERSION_STYLE, children: [
5010
+ /* @__PURE__ */ jsx23("div", { style: GROUP_BANNER_CONTENT_STYLE, children: /* @__PURE__ */ jsxs21("div", { style: GROUP_BANNER_INNER_STYLE, children: [
5011
+ /* @__PURE__ */ jsx23("span", { style: GROUP_DOMAIN_NAME_STYLE, children: domain?.name || "Domain" }),
5012
+ domain?.version && /* @__PURE__ */ jsxs21("span", { style: GROUP_VERSION_STYLE, children: [
4869
5013
  "v",
4870
5014
  domain.version
4871
5015
  ] })
@@ -4876,14 +5020,14 @@ var GroupNode_default = memo21(function GroupNode({ data }) {
4876
5020
  // src/nodes/Custom.tsx
4877
5021
  import { Handle as Handle17 } from "@xyflow/react";
4878
5022
  import * as Icons from "@heroicons/react/24/solid";
4879
- import { memo as memo22, useMemo as useMemo10 } from "react";
5023
+ import { memo as memo23, useMemo as useMemo10 } from "react";
4880
5024
  import * as ContextMenu4 from "@radix-ui/react-context-menu";
4881
5025
  import * as Tooltip from "@radix-ui/react-tooltip";
4882
- import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
5026
+ import { jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
4883
5027
  function classNames16(...classes) {
4884
5028
  return classes.filter(Boolean).join(" ");
4885
5029
  }
4886
- var Custom_default = memo22(function UserNode2({
5030
+ var Custom_default = memo23(function UserNode2({
4887
5031
  data,
4888
5032
  sourcePosition,
4889
5033
  targetPosition
@@ -4905,8 +5049,8 @@ var Custom_default = memo22(function UserNode2({
4905
5049
  const isLongType = type && type.length > 10;
4906
5050
  const displayType = isLongType ? `${type.substring(0, 10)}...` : type;
4907
5051
  const portalContainer = usePortalContainer();
4908
- return /* @__PURE__ */ jsxs21(ContextMenu4.Root, { children: [
4909
- /* @__PURE__ */ jsx23(ContextMenu4.Trigger, { children: /* @__PURE__ */ jsxs21(
5052
+ return /* @__PURE__ */ jsxs22(ContextMenu4.Root, { children: [
5053
+ /* @__PURE__ */ jsx24(ContextMenu4.Trigger, { children: /* @__PURE__ */ jsxs22(
4910
5054
  "div",
4911
5055
  {
4912
5056
  className: classNames16(
@@ -4917,7 +5061,7 @@ var Custom_default = memo22(function UserNode2({
4917
5061
  ...NODE_WIDTH_STYLE
4918
5062
  },
4919
5063
  children: [
4920
- /* @__PURE__ */ jsxs21(
5064
+ /* @__PURE__ */ jsxs22(
4921
5065
  "div",
4922
5066
  {
4923
5067
  className: classNames16(
@@ -4925,9 +5069,9 @@ var Custom_default = memo22(function UserNode2({
4925
5069
  `border-r-[1px] border-${color}`
4926
5070
  ),
4927
5071
  children: [
4928
- IconComponent && /* @__PURE__ */ jsx23(IconComponent, { className: "w-4 h-4 opacity-90 text-white mt-1" }),
4929
- mode === "full" && /* @__PURE__ */ jsx23(Tooltip.Provider, { children: /* @__PURE__ */ jsxs21(Tooltip.Root, { children: [
4930
- /* @__PURE__ */ jsx23(Tooltip.Trigger, { asChild: true, children: /* @__PURE__ */ jsx23(
5072
+ IconComponent && /* @__PURE__ */ jsx24(IconComponent, { className: "w-4 h-4 opacity-90 text-white mt-1" }),
5073
+ mode === "full" && /* @__PURE__ */ jsx24(Tooltip.Provider, { children: /* @__PURE__ */ jsxs22(Tooltip.Root, { children: [
5074
+ /* @__PURE__ */ jsx24(Tooltip.Trigger, { asChild: true, children: /* @__PURE__ */ jsx24(
4931
5075
  "span",
4932
5076
  {
4933
5077
  className: "text-center text-[9px] text-white font-bold uppercase mb-4",
@@ -4935,7 +5079,7 @@ var Custom_default = memo22(function UserNode2({
4935
5079
  children: displayType
4936
5080
  }
4937
5081
  ) }),
4938
- isLongType && /* @__PURE__ */ jsx23(Tooltip.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs21(
5082
+ isLongType && /* @__PURE__ */ jsx24(Tooltip.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs22(
4939
5083
  Tooltip.Content,
4940
5084
  {
4941
5085
  className: "bg-slate-800 text-white rounded px-2 py-1 text-xs shadow-md z-50",
@@ -4943,7 +5087,7 @@ var Custom_default = memo22(function UserNode2({
4943
5087
  sideOffset: 5,
4944
5088
  children: [
4945
5089
  type,
4946
- /* @__PURE__ */ jsx23(Tooltip.Arrow, { className: "fill-slate-800" })
5090
+ /* @__PURE__ */ jsx24(Tooltip.Arrow, { className: "fill-slate-800" })
4947
5091
  ]
4948
5092
  }
4949
5093
  ) })
@@ -4951,23 +5095,23 @@ var Custom_default = memo22(function UserNode2({
4951
5095
  ]
4952
5096
  }
4953
5097
  ),
4954
- /* @__PURE__ */ jsxs21("div", { className: "p-1 flex-1", children: [
4955
- targetPosition && /* @__PURE__ */ jsx23(Handle17, { type: "target", position: targetPosition }),
4956
- sourcePosition && /* @__PURE__ */ jsx23(Handle17, { type: "source", position: sourcePosition }),
4957
- (!summary || mode !== "full") && /* @__PURE__ */ jsx23("div", { className: "h-full ", children: /* @__PURE__ */ jsx23("span", { className: "text-sm font-bold block pb-0.5 w-full", children: title }) }),
4958
- summary && mode === "full" && /* @__PURE__ */ jsxs21("div", { children: [
4959
- /* @__PURE__ */ jsx23(
5098
+ /* @__PURE__ */ jsxs22("div", { className: "p-1 flex-1", children: [
5099
+ targetPosition && /* @__PURE__ */ jsx24(Handle17, { type: "target", position: targetPosition }),
5100
+ sourcePosition && /* @__PURE__ */ jsx24(Handle17, { type: "source", position: sourcePosition }),
5101
+ (!summary || mode !== "full") && /* @__PURE__ */ jsx24("div", { className: "h-full ", children: /* @__PURE__ */ jsx24("span", { className: "text-sm font-bold block pb-0.5 w-full", children: title }) }),
5102
+ summary && mode === "full" && /* @__PURE__ */ jsxs22("div", { children: [
5103
+ /* @__PURE__ */ jsx24(
4960
5104
  "div",
4961
5105
  {
4962
5106
  className: classNames16(
4963
5107
  mode === "full" ? `border-b border-[rgb(var(--ec-page-border))]` : ""
4964
5108
  ),
4965
- children: /* @__PURE__ */ jsx23("span", { className: "text-xs font-bold block pb-0.5", children: title })
5109
+ children: /* @__PURE__ */ jsx24("span", { className: "text-xs font-bold block pb-0.5", children: title })
4966
5110
  }
4967
5111
  ),
4968
- mode === "full" && /* @__PURE__ */ jsxs21("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] ", children: [
4969
- /* @__PURE__ */ jsx23("div", { className: "leading-3 py-1", children: /* @__PURE__ */ jsx23("span", { className: "text-[8px] font-light", children: summary }) }),
4970
- properties && /* @__PURE__ */ jsx23("div", { className: "grid grid-cols-2 gap-x-4 py-1", children: Object.entries(properties).map(([key, value]) => /* @__PURE__ */ jsxs21(
5112
+ mode === "full" && /* @__PURE__ */ jsxs22("div", { className: "divide-y divide-[rgb(var(--ec-page-border))] ", children: [
5113
+ /* @__PURE__ */ jsx24("div", { className: "leading-3 py-1", children: /* @__PURE__ */ jsx24("span", { className: "text-[8px] font-light", children: summary }) }),
5114
+ properties && /* @__PURE__ */ jsx24("div", { className: "grid grid-cols-2 gap-x-4 py-1", children: Object.entries(properties).map(([key, value]) => /* @__PURE__ */ jsxs22(
4971
5115
  "span",
4972
5116
  {
4973
5117
  className: "text-xs",
@@ -4976,7 +5120,7 @@ var Custom_default = memo22(function UserNode2({
4976
5120
  key,
4977
5121
  ":",
4978
5122
  " ",
4979
- typeof value === "string" && value.startsWith("http") ? /* @__PURE__ */ jsx23(
5123
+ typeof value === "string" && value.startsWith("http") ? /* @__PURE__ */ jsx24(
4980
5124
  "a",
4981
5125
  {
4982
5126
  href: value,
@@ -4996,13 +5140,13 @@ var Custom_default = memo22(function UserNode2({
4996
5140
  ]
4997
5141
  }
4998
5142
  ) }),
4999
- menu?.length > 0 && /* @__PURE__ */ jsx23(ContextMenu4.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx23(ContextMenu4.Content, { className: "min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]", children: menu?.map((item) => {
5000
- return /* @__PURE__ */ jsx23(
5143
+ menu?.length > 0 && /* @__PURE__ */ jsx24(ContextMenu4.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx24(ContextMenu4.Content, { className: "min-w-[220px] bg-[rgb(var(--ec-card-bg))] rounded-md p-1 shadow-md border border-[rgb(var(--ec-page-border))]", children: menu?.map((item) => {
5144
+ return /* @__PURE__ */ jsx24(
5001
5145
  ContextMenu4.Item,
5002
5146
  {
5003
5147
  asChild: true,
5004
5148
  className: "text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center",
5005
- children: /* @__PURE__ */ jsx23("a", { href: item.url, children: item.label })
5149
+ children: /* @__PURE__ */ jsx24("a", { href: item.url, children: item.label })
5006
5150
  }
5007
5151
  );
5008
5152
  }) }) })
@@ -5010,12 +5154,12 @@ var Custom_default = memo22(function UserNode2({
5010
5154
  });
5011
5155
 
5012
5156
  // src/nodes/ExternalSystem2.tsx
5013
- import { memo as memo23 } from "react";
5157
+ import { memo as memo24 } from "react";
5014
5158
  import { Handle as Handle18, Position as Position15 } from "@xyflow/react";
5015
- import { jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
5016
- var ExternalSystem2_default = memo23(function ExternalSystemNode(props) {
5017
- return /* @__PURE__ */ jsxs22("div", { className: "relative", children: [
5018
- /* @__PURE__ */ jsx24(
5159
+ import { jsx as jsx25, jsxs as jsxs23 } from "react/jsx-runtime";
5160
+ var ExternalSystem2_default = memo24(function ExternalSystemNode(props) {
5161
+ return /* @__PURE__ */ jsxs23("div", { className: "relative", children: [
5162
+ /* @__PURE__ */ jsx25(
5019
5163
  Handle18,
5020
5164
  {
5021
5165
  type: "target",
@@ -5024,7 +5168,7 @@ var ExternalSystem2_default = memo23(function ExternalSystemNode(props) {
5024
5168
  className: "bg-gray-500"
5025
5169
  }
5026
5170
  ),
5027
- /* @__PURE__ */ jsx24(
5171
+ /* @__PURE__ */ jsx25(
5028
5172
  Handle18,
5029
5173
  {
5030
5174
  type: "source",
@@ -5033,17 +5177,17 @@ var ExternalSystem2_default = memo23(function ExternalSystemNode(props) {
5033
5177
  className: "bg-gray-500"
5034
5178
  }
5035
5179
  ),
5036
- /* @__PURE__ */ jsx24(ExternalSystem_default, { ...props })
5180
+ /* @__PURE__ */ jsx25(ExternalSystem_default, { ...props })
5037
5181
  ] });
5038
5182
  });
5039
5183
 
5040
5184
  // src/nodes/DataProduct.tsx
5041
- import { memo as memo24 } from "react";
5185
+ import { memo as memo25 } from "react";
5042
5186
  import { Package } from "lucide-react";
5043
5187
  import { Handle as Handle19, Position as Position16, useNodeConnections as useNodeConnections10 } from "@xyflow/react";
5044
- import { jsx as jsx25, jsxs as jsxs23 } from "react/jsx-runtime";
5188
+ import { jsx as jsx26, jsxs as jsxs24 } from "react/jsx-runtime";
5045
5189
  function GlowHandle14({ side }) {
5046
- return /* @__PURE__ */ jsx25(
5190
+ return /* @__PURE__ */ jsx26(
5047
5191
  "div",
5048
5192
  {
5049
5193
  style: {
@@ -5070,7 +5214,7 @@ function PostItDataProduct(props) {
5070
5214
  const { version, name, summary, deprecated, draft, notes, styles } = props.data.dataProduct;
5071
5215
  const mode = props.data.mode || "simple";
5072
5216
  const customIcon = isIconPath(styles?.icon) ? styles.icon : void 0;
5073
- return /* @__PURE__ */ jsxs23(
5217
+ return /* @__PURE__ */ jsxs24(
5074
5218
  "div",
5075
5219
  {
5076
5220
  className: classNames17(
@@ -5078,7 +5222,7 @@ function PostItDataProduct(props) {
5078
5222
  props?.selected ? "ring-2 ring-indigo-400/60 ring-offset-1" : ""
5079
5223
  ),
5080
5224
  children: [
5081
- /* @__PURE__ */ jsx25(
5225
+ /* @__PURE__ */ jsx26(
5082
5226
  Handle19,
5083
5227
  {
5084
5228
  type: "target",
@@ -5086,7 +5230,7 @@ function PostItDataProduct(props) {
5086
5230
  style: HIDDEN_HANDLE_STYLE
5087
5231
  }
5088
5232
  ),
5089
- /* @__PURE__ */ jsx25(
5233
+ /* @__PURE__ */ jsx26(
5090
5234
  Handle19,
5091
5235
  {
5092
5236
  type: "source",
@@ -5094,8 +5238,8 @@ function PostItDataProduct(props) {
5094
5238
  style: HIDDEN_HANDLE_STYLE
5095
5239
  }
5096
5240
  ),
5097
- notes && notes.length > 0 && /* @__PURE__ */ jsx25(NotesIndicator, { notes, resourceName: name }),
5098
- /* @__PURE__ */ jsxs23(
5241
+ notes && notes.length > 0 && /* @__PURE__ */ jsx26(NotesIndicator, { notes, resourceName: name }),
5242
+ /* @__PURE__ */ jsxs24(
5099
5243
  "div",
5100
5244
  {
5101
5245
  className: "absolute inset-0",
@@ -5106,8 +5250,8 @@ function PostItDataProduct(props) {
5106
5250
  border: deprecated ? "2px dashed rgba(239, 68, 68, 0.5)" : draft ? "2px dashed rgba(99, 102, 241, 0.5)" : "none"
5107
5251
  },
5108
5252
  children: [
5109
- /* @__PURE__ */ jsx25("div", { style: FOLDED_CORNER_SHADOW_STYLE }),
5110
- /* @__PURE__ */ jsx25(
5253
+ /* @__PURE__ */ jsx26("div", { style: FOLDED_CORNER_SHADOW_STYLE }),
5254
+ /* @__PURE__ */ jsx26(
5111
5255
  "div",
5112
5256
  {
5113
5257
  style: {
@@ -5126,17 +5270,17 @@ function PostItDataProduct(props) {
5126
5270
  ]
5127
5271
  }
5128
5272
  ),
5129
- /* @__PURE__ */ jsxs23("div", { className: "relative px-3.5 py-3", children: [
5130
- /* @__PURE__ */ jsxs23("div", { className: "flex items-center justify-between mb-2", children: [
5131
- /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-1", children: [
5132
- /* @__PURE__ */ jsx25(Package, { className: "w-3 h-3 text-indigo-900/50", strokeWidth: 2.5 }),
5133
- /* @__PURE__ */ jsx25("span", { className: "text-[8px] font-bold text-indigo-900/50 uppercase tracking-widest", children: "Data Product" })
5273
+ /* @__PURE__ */ jsxs24("div", { className: "relative px-3.5 py-3", children: [
5274
+ /* @__PURE__ */ jsxs24("div", { className: "flex items-center justify-between mb-2", children: [
5275
+ /* @__PURE__ */ jsxs24("div", { className: "flex items-center gap-1", children: [
5276
+ /* @__PURE__ */ jsx26(Package, { className: "w-3 h-3 text-indigo-900/50", strokeWidth: 2.5 }),
5277
+ /* @__PURE__ */ jsx26("span", { className: "text-[8px] font-bold text-indigo-900/50 uppercase tracking-widest", children: "Data Product" })
5134
5278
  ] }),
5135
- draft && /* @__PURE__ */ jsx25("span", { className: "text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase", children: "Draft" }),
5136
- deprecated && /* @__PURE__ */ jsx25("span", { className: "text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase", children: "Deprecated" })
5279
+ draft && /* @__PURE__ */ jsx26("span", { className: "text-[8px] font-extrabold text-amber-900 bg-amber-100 border border-dashed border-amber-400 px-1.5 py-0.5 rounded uppercase", children: "Draft" }),
5280
+ deprecated && /* @__PURE__ */ jsx26("span", { className: "text-[7px] font-bold text-white bg-red-500 border border-red-600 px-1.5 py-0.5 rounded uppercase", children: "Deprecated" })
5137
5281
  ] }),
5138
- /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2", children: [
5139
- customIcon && /* @__PURE__ */ jsx25(
5282
+ /* @__PURE__ */ jsxs24("div", { className: "flex items-center gap-2", children: [
5283
+ customIcon && /* @__PURE__ */ jsx26(
5140
5284
  CustomIcon,
5141
5285
  {
5142
5286
  src: customIcon,
@@ -5144,7 +5288,7 @@ function PostItDataProduct(props) {
5144
5288
  className: mode === "full" ? "w-[26px] h-[26px] shrink-0" : "w-4 h-4 shrink-0 -my-1"
5145
5289
  }
5146
5290
  ),
5147
- /* @__PURE__ */ jsx25(
5291
+ /* @__PURE__ */ jsx26(
5148
5292
  "div",
5149
5293
  {
5150
5294
  className: classNames17(
@@ -5155,11 +5299,11 @@ function PostItDataProduct(props) {
5155
5299
  }
5156
5300
  )
5157
5301
  ] }),
5158
- version && /* @__PURE__ */ jsxs23("div", { className: "text-[9px] text-indigo-900/40 font-semibold mt-0.5", children: [
5302
+ version && /* @__PURE__ */ jsxs24("div", { className: "text-[9px] text-indigo-900/40 font-semibold mt-0.5", children: [
5159
5303
  "v",
5160
5304
  version
5161
5305
  ] }),
5162
- mode === "full" && summary && /* @__PURE__ */ jsx25(
5306
+ mode === "full" && summary && /* @__PURE__ */ jsx26(
5163
5307
  "div",
5164
5308
  {
5165
5309
  className: "mt-2 pt-1.5 border-t border-indigo-900/10 text-[9px] text-indigo-950/60 leading-relaxed overflow-hidden",
@@ -5181,7 +5325,7 @@ function DefaultDataProduct(props) {
5181
5325
  const sourceConnections = useNodeConnections10({ handleType: "source" });
5182
5326
  const isDark = useDarkMode();
5183
5327
  const deprecatedStripe = isDark ? "rgba(239,68,68,0.25)" : "rgba(239,68,68,0.1)";
5184
- return /* @__PURE__ */ jsxs23(
5328
+ return /* @__PURE__ */ jsxs24(
5185
5329
  "div",
5186
5330
  {
5187
5331
  className: classNames17(
@@ -5194,7 +5338,7 @@ function DefaultDataProduct(props) {
5194
5338
  boxShadow: "0 2px 12px rgba(99, 102, 241, 0.15)"
5195
5339
  },
5196
5340
  children: [
5197
- /* @__PURE__ */ jsx25(
5341
+ /* @__PURE__ */ jsx26(
5198
5342
  Handle19,
5199
5343
  {
5200
5344
  type: "target",
@@ -5202,7 +5346,7 @@ function DefaultDataProduct(props) {
5202
5346
  style: HIDDEN_HANDLE_STYLE
5203
5347
  }
5204
5348
  ),
5205
- /* @__PURE__ */ jsx25(
5349
+ /* @__PURE__ */ jsx26(
5206
5350
  Handle19,
5207
5351
  {
5208
5352
  type: "source",
@@ -5210,10 +5354,10 @@ function DefaultDataProduct(props) {
5210
5354
  style: HIDDEN_HANDLE_STYLE
5211
5355
  }
5212
5356
  ),
5213
- notes && notes.length > 0 && /* @__PURE__ */ jsx25(NotesIndicator, { notes, resourceName: name }),
5214
- targetConnections.length > 0 && /* @__PURE__ */ jsx25(GlowHandle14, { side: "left" }),
5215
- sourceConnections.length > 0 && /* @__PURE__ */ jsx25(GlowHandle14, { side: "right" }),
5216
- /* @__PURE__ */ jsx25("div", { className: "absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10", children: /* @__PURE__ */ jsxs23(
5357
+ notes && notes.length > 0 && /* @__PURE__ */ jsx26(NotesIndicator, { notes, resourceName: name }),
5358
+ targetConnections.length > 0 && /* @__PURE__ */ jsx26(GlowHandle14, { side: "left" }),
5359
+ sourceConnections.length > 0 && /* @__PURE__ */ jsx26(GlowHandle14, { side: "right" }),
5360
+ /* @__PURE__ */ jsx26("div", { className: "absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10", children: /* @__PURE__ */ jsxs24(
5217
5361
  "span",
5218
5362
  {
5219
5363
  className: classNames17(
@@ -5221,16 +5365,16 @@ function DefaultDataProduct(props) {
5221
5365
  deprecated ? "bg-red-500" : "bg-indigo-500"
5222
5366
  ),
5223
5367
  children: [
5224
- /* @__PURE__ */ jsx25(Package, { className: "w-2.5 h-2.5", strokeWidth: 2.5 }),
5368
+ /* @__PURE__ */ jsx26(Package, { className: "w-2.5 h-2.5", strokeWidth: 2.5 }),
5225
5369
  "Data Product",
5226
5370
  draft && " (Draft)",
5227
5371
  deprecated && " (Deprecated)"
5228
5372
  ]
5229
5373
  }
5230
5374
  ) }),
5231
- /* @__PURE__ */ jsxs23("div", { className: "px-3 pt-3.5 pb-2.5", children: [
5232
- /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2", children: [
5233
- customIcon && /* @__PURE__ */ jsx25(
5375
+ /* @__PURE__ */ jsxs24("div", { className: "px-3 pt-3.5 pb-2.5", children: [
5376
+ /* @__PURE__ */ jsxs24("div", { className: "flex items-center gap-2", children: [
5377
+ customIcon && /* @__PURE__ */ jsx26(
5234
5378
  CustomIcon,
5235
5379
  {
5236
5380
  src: customIcon,
@@ -5238,16 +5382,16 @@ function DefaultDataProduct(props) {
5238
5382
  className: mode === "full" ? "w-[26px] h-[26px] shrink-0" : "w-4 h-4 shrink-0 -my-1"
5239
5383
  }
5240
5384
  ),
5241
- /* @__PURE__ */ jsxs23("div", { className: "flex items-baseline gap-1 min-w-0", children: [
5242
- /* @__PURE__ */ jsx25("span", { className: "text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))] truncate", children: name }),
5243
- version && /* @__PURE__ */ jsxs23("span", { className: "text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0", children: [
5385
+ /* @__PURE__ */ jsxs24("div", { className: "flex items-baseline gap-1 min-w-0", children: [
5386
+ /* @__PURE__ */ jsx26("span", { className: "text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))] truncate", children: name }),
5387
+ version && /* @__PURE__ */ jsxs24("span", { className: "text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0", children: [
5244
5388
  "(v",
5245
5389
  version,
5246
5390
  ")"
5247
5391
  ] })
5248
5392
  ] })
5249
5393
  ] }),
5250
- mode === "full" && summary && /* @__PURE__ */ jsx25(
5394
+ mode === "full" && summary && /* @__PURE__ */ jsx26(
5251
5395
  "div",
5252
5396
  {
5253
5397
  className: "mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden",
@@ -5261,19 +5405,19 @@ function DefaultDataProduct(props) {
5261
5405
  }
5262
5406
  );
5263
5407
  }
5264
- var DataProduct_default = memo24(function DataProductNode(props) {
5408
+ var DataProduct_default = memo25(function DataProductNode(props) {
5265
5409
  const nodeStyle = props?.data?.style;
5266
5410
  if (nodeStyle === "post-it") {
5267
- return /* @__PURE__ */ jsx25(PostItDataProduct, { ...props });
5411
+ return /* @__PURE__ */ jsx26(PostItDataProduct, { ...props });
5268
5412
  }
5269
- return /* @__PURE__ */ jsx25(DefaultDataProduct, { ...props });
5413
+ return /* @__PURE__ */ jsx26(DefaultDataProduct, { ...props });
5270
5414
  });
5271
5415
 
5272
5416
  // src/nodes/message-group/MessageGroupNode.tsx
5273
- import { memo as memo25, useMemo as useMemo11 } from "react";
5274
- import { Layers, Zap as Zap3, Terminal, HelpCircle, Maximize2 } from "lucide-react";
5417
+ import { memo as memo26, useMemo as useMemo11 } from "react";
5418
+ import { Layers, Zap as Zap3, Terminal, HelpCircle, Maximize2 as Maximize22 } from "lucide-react";
5275
5419
  import { Handle as Handle20, Position as Position17, useNodeConnections as useNodeConnections11 } from "@xyflow/react";
5276
- import { jsx as jsx26, jsxs as jsxs24 } from "react/jsx-runtime";
5420
+ import { jsx as jsx27, jsxs as jsxs25 } from "react/jsx-runtime";
5277
5421
  var TYPE_ICONS = {
5278
5422
  events: Zap3,
5279
5423
  commands: Terminal,
@@ -5285,7 +5429,7 @@ var CARD_STYLE = {
5285
5429
  background: "var(--ec-message-group-node-bg, rgb(var(--ec-card-bg)))",
5286
5430
  pointerEvents: "none"
5287
5431
  };
5288
- var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5432
+ var MessageGroupNode_default = memo26(function MessageGroupNode(props) {
5289
5433
  const { groupName, messageCount } = props.data;
5290
5434
  const isDark = useDarkMode();
5291
5435
  const targetConnections = useNodeConnections11({ handleType: "target" });
@@ -5299,8 +5443,8 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5299
5443
  });
5300
5444
  return counts;
5301
5445
  }, [props.data.messages]);
5302
- return /* @__PURE__ */ jsxs24("div", { className: "relative", style: { isolation: "isolate" }, children: [
5303
- stackDepth >= 3 && /* @__PURE__ */ jsx26(
5446
+ return /* @__PURE__ */ jsxs25("div", { className: "relative", style: { isolation: "isolate" }, children: [
5447
+ stackDepth >= 3 && /* @__PURE__ */ jsx27(
5304
5448
  "div",
5305
5449
  {
5306
5450
  style: {
@@ -5312,7 +5456,7 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5312
5456
  }
5313
5457
  }
5314
5458
  ),
5315
- stackDepth >= 2 && /* @__PURE__ */ jsx26(
5459
+ stackDepth >= 2 && /* @__PURE__ */ jsx27(
5316
5460
  "div",
5317
5461
  {
5318
5462
  style: {
@@ -5324,7 +5468,7 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5324
5468
  }
5325
5469
  }
5326
5470
  ),
5327
- /* @__PURE__ */ jsxs24(
5471
+ /* @__PURE__ */ jsxs25(
5328
5472
  "div",
5329
5473
  {
5330
5474
  className: `relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible ${props.selected ? "ring-2 ring-violet-400/60 ring-offset-2" : ""} border-violet-500`,
@@ -5333,7 +5477,7 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5333
5477
  boxShadow: "0 2px 12px rgba(139, 92, 246, 0.15)"
5334
5478
  },
5335
5479
  children: [
5336
- /* @__PURE__ */ jsx26(
5480
+ /* @__PURE__ */ jsx27(
5337
5481
  Handle20,
5338
5482
  {
5339
5483
  type: "target",
@@ -5341,7 +5485,7 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5341
5485
  style: HIDDEN_HANDLE_STYLE
5342
5486
  }
5343
5487
  ),
5344
- /* @__PURE__ */ jsx26(
5488
+ /* @__PURE__ */ jsx27(
5345
5489
  Handle20,
5346
5490
  {
5347
5491
  type: "source",
@@ -5349,7 +5493,7 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5349
5493
  style: HIDDEN_HANDLE_STYLE
5350
5494
  }
5351
5495
  ),
5352
- targetConnections.length > 0 && /* @__PURE__ */ jsx26(
5496
+ targetConnections.length > 0 && /* @__PURE__ */ jsx27(
5353
5497
  "div",
5354
5498
  {
5355
5499
  style: {
@@ -5368,7 +5512,7 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5368
5512
  }
5369
5513
  }
5370
5514
  ),
5371
- sourceConnections.length > 0 && /* @__PURE__ */ jsx26(
5515
+ sourceConnections.length > 0 && /* @__PURE__ */ jsx27(
5372
5516
  "div",
5373
5517
  {
5374
5518
  style: {
@@ -5387,14 +5531,14 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5387
5531
  }
5388
5532
  }
5389
5533
  ),
5390
- /* @__PURE__ */ jsx26("div", { className: "absolute -top-2.5 left-2.5 z-10", children: /* @__PURE__ */ jsxs24("span", { className: "inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm bg-violet-600", children: [
5391
- /* @__PURE__ */ jsx26(Layers, { className: "w-2.5 h-2.5", strokeWidth: 2.5 }),
5534
+ /* @__PURE__ */ jsx27("div", { className: "absolute -top-2.5 left-2.5 z-10", children: /* @__PURE__ */ jsxs25("span", { className: "inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm bg-violet-600", children: [
5535
+ /* @__PURE__ */ jsx27(Layers, { className: "w-2.5 h-2.5", strokeWidth: 2.5 }),
5392
5536
  "Group"
5393
5537
  ] }) }),
5394
- /* @__PURE__ */ jsxs24("div", { className: "px-3 pt-3.5 pb-2.5", children: [
5395
- /* @__PURE__ */ jsx26("div", { className: "text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]", children: groupName }),
5396
- /* @__PURE__ */ jsxs24("div", { className: "mt-1.5 flex items-center gap-2", children: [
5397
- /* @__PURE__ */ jsxs24(
5538
+ /* @__PURE__ */ jsxs25("div", { className: "px-3 pt-3.5 pb-2.5", children: [
5539
+ /* @__PURE__ */ jsx27("div", { className: "text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))]", children: groupName }),
5540
+ /* @__PURE__ */ jsxs25("div", { className: "mt-1.5 flex items-center gap-2", children: [
5541
+ /* @__PURE__ */ jsxs25(
5398
5542
  "span",
5399
5543
  {
5400
5544
  className: "text-[10px] font-medium px-1.5 py-0.5 rounded",
@@ -5409,14 +5553,14 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5409
5553
  ]
5410
5554
  }
5411
5555
  ),
5412
- /* @__PURE__ */ jsx26("div", { className: "flex items-center gap-1", children: Object.entries(typeBreakdown).map(([type, count]) => {
5556
+ /* @__PURE__ */ jsx27("div", { className: "flex items-center gap-1", children: Object.entries(typeBreakdown).map(([type, count]) => {
5413
5557
  const Icon = TYPE_ICONS[type] || HelpCircle;
5414
- return /* @__PURE__ */ jsxs24(
5558
+ return /* @__PURE__ */ jsxs25(
5415
5559
  "span",
5416
5560
  {
5417
5561
  className: "flex items-center gap-0.5 text-[9px] text-[rgb(var(--ec-page-text-muted))]",
5418
5562
  children: [
5419
- /* @__PURE__ */ jsx26(Icon, { className: "w-2.5 h-2.5", strokeWidth: 2 }),
5563
+ /* @__PURE__ */ jsx27(Icon, { className: "w-2.5 h-2.5", strokeWidth: 2 }),
5420
5564
  count
5421
5565
  ]
5422
5566
  },
@@ -5424,8 +5568,8 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5424
5568
  );
5425
5569
  }) })
5426
5570
  ] }),
5427
- /* @__PURE__ */ jsxs24("div", { className: "mt-1.5 flex items-center gap-1 text-[8px] text-[rgb(var(--ec-page-text-muted))]", children: [
5428
- /* @__PURE__ */ jsx26(Maximize2, { className: "w-2.5 h-2.5" }),
5571
+ /* @__PURE__ */ jsxs25("div", { className: "mt-1.5 flex items-center gap-1 text-[8px] text-[rgb(var(--ec-page-text-muted))]", children: [
5572
+ /* @__PURE__ */ jsx27(Maximize22, { className: "w-2.5 h-2.5" }),
5429
5573
  "Click to explore"
5430
5574
  ] })
5431
5575
  ] })
@@ -5436,10 +5580,10 @@ var MessageGroupNode_default = memo25(function MessageGroupNode(props) {
5436
5580
  });
5437
5581
 
5438
5582
  // src/nodes/message-group/MessageGroupExpandedNode.tsx
5439
- import { memo as memo26 } from "react";
5440
- import { Layers as Layers2, Minimize2 } from "lucide-react";
5441
- import { jsx as jsx27, jsxs as jsxs25 } from "react/jsx-runtime";
5442
- var CONTAINER_STYLE = {
5583
+ import { memo as memo27 } from "react";
5584
+ import { Layers as Layers2, Minimize2 as Minimize22 } from "lucide-react";
5585
+ import { jsx as jsx28, jsxs as jsxs26 } from "react/jsx-runtime";
5586
+ var CONTAINER_STYLE2 = {
5443
5587
  width: "100%",
5444
5588
  height: "100%",
5445
5589
  borderRadius: 12,
@@ -5448,7 +5592,7 @@ var CONTAINER_STYLE = {
5448
5592
  position: "relative",
5449
5593
  overflow: "visible"
5450
5594
  };
5451
- var HEADER_STYLE = {
5595
+ var HEADER_STYLE2 = {
5452
5596
  position: "absolute",
5453
5597
  top: 0,
5454
5598
  left: 0,
@@ -5460,7 +5604,7 @@ var HEADER_STYLE = {
5460
5604
  borderBottom: "1px solid rgba(139, 92, 246, 0.3)",
5461
5605
  overflow: "visible"
5462
5606
  };
5463
- var BADGE_STYLE = {
5607
+ var BADGE_STYLE2 = {
5464
5608
  position: "absolute",
5465
5609
  top: -10,
5466
5610
  left: 12,
@@ -5478,7 +5622,7 @@ var BADGE_STYLE = {
5478
5622
  textTransform: "uppercase",
5479
5623
  color: "white"
5480
5624
  };
5481
- var HEADER_CONTENT_STYLE = {
5625
+ var HEADER_CONTENT_STYLE2 = {
5482
5626
  display: "flex",
5483
5627
  alignItems: "center",
5484
5628
  justifyContent: "space-between",
@@ -5493,7 +5637,7 @@ var GROUP_NAME_STYLE = {
5493
5637
  textTransform: "uppercase",
5494
5638
  whiteSpace: "nowrap"
5495
5639
  };
5496
- var COLLAPSE_BUTTON_STYLE = {
5640
+ var COLLAPSE_BUTTON_STYLE2 = {
5497
5641
  background: "#7c3aed",
5498
5642
  border: "1px solid #a78bfa",
5499
5643
  borderRadius: 6,
@@ -5506,25 +5650,25 @@ var COLLAPSE_BUTTON_STYLE = {
5506
5650
  fontWeight: 600,
5507
5651
  color: "white"
5508
5652
  };
5509
- var MessageGroupExpandedNode_default = memo26(function MessageGroupExpandedNode({
5653
+ var MessageGroupExpandedNode_default = memo27(function MessageGroupExpandedNode({
5510
5654
  data
5511
5655
  }) {
5512
5656
  const { groupName, messageCount } = data;
5513
- return /* @__PURE__ */ jsx27("div", { style: CONTAINER_STYLE, children: /* @__PURE__ */ jsxs25("div", { style: HEADER_STYLE, children: [
5514
- /* @__PURE__ */ jsxs25("div", { style: BADGE_STYLE, children: [
5515
- /* @__PURE__ */ jsx27(Layers2, { size: 10, strokeWidth: 2.5 }),
5657
+ return /* @__PURE__ */ jsx28("div", { style: CONTAINER_STYLE2, children: /* @__PURE__ */ jsxs26("div", { style: HEADER_STYLE2, children: [
5658
+ /* @__PURE__ */ jsxs26("div", { style: BADGE_STYLE2, children: [
5659
+ /* @__PURE__ */ jsx28(Layers2, { size: 10, strokeWidth: 2.5 }),
5516
5660
  "Group"
5517
5661
  ] }),
5518
- /* @__PURE__ */ jsxs25("div", { style: HEADER_CONTENT_STYLE, children: [
5519
- /* @__PURE__ */ jsx27("div", { style: { display: "flex", alignItems: "center" }, children: /* @__PURE__ */ jsx27("span", { style: GROUP_NAME_STYLE, children: groupName || "Group" }) }),
5520
- /* @__PURE__ */ jsxs25(
5662
+ /* @__PURE__ */ jsxs26("div", { style: HEADER_CONTENT_STYLE2, children: [
5663
+ /* @__PURE__ */ jsx28("div", { style: { display: "flex", alignItems: "center" }, children: /* @__PURE__ */ jsx28("span", { style: GROUP_NAME_STYLE, children: groupName || "Group" }) }),
5664
+ /* @__PURE__ */ jsxs26(
5521
5665
  "button",
5522
5666
  {
5523
- style: COLLAPSE_BUTTON_STYLE,
5667
+ style: COLLAPSE_BUTTON_STYLE2,
5524
5668
  className: "ec-collapse-group-btn nodrag nopan",
5525
5669
  onMouseDown: (e) => e.stopPropagation(),
5526
5670
  children: [
5527
- /* @__PURE__ */ jsx27(Minimize2, { size: 12, strokeWidth: 2.5 }),
5671
+ /* @__PURE__ */ jsx28(Minimize22, { size: 12, strokeWidth: 2.5 }),
5528
5672
  "Collapse"
5529
5673
  ]
5530
5674
  }
@@ -5534,9 +5678,9 @@ var MessageGroupExpandedNode_default = memo26(function MessageGroupExpandedNode(
5534
5678
  });
5535
5679
 
5536
5680
  // src/edges/AnimatedMessageEdge.tsx
5537
- import { memo as memo27, useMemo as useMemo12 } from "react";
5681
+ import { memo as memo28, useMemo as useMemo12 } from "react";
5538
5682
  import { BaseEdge, getSmoothStepPath } from "@xyflow/react";
5539
- import { Fragment as Fragment3, jsx as jsx28, jsxs as jsxs26 } from "react/jsx-runtime";
5683
+ import { Fragment as Fragment4, jsx as jsx29, jsxs as jsxs27 } from "react/jsx-runtime";
5540
5684
  function messageColor(collection) {
5541
5685
  switch (collection) {
5542
5686
  case "events":
@@ -5551,7 +5695,7 @@ function messageColor(collection) {
5551
5695
  }
5552
5696
  var TSPAN_NORMAL_STYLE = { fontStyle: "normal" };
5553
5697
  var TSPAN_ITALIC_STYLE = { fontStyle: "italic" };
5554
- var AnimatedMessageEdge = memo27(
5698
+ var AnimatedMessageEdge = memo28(
5555
5699
  ({
5556
5700
  id,
5557
5701
  sourceX,
@@ -5583,12 +5727,12 @@ var AnimatedMessageEdge = memo27(
5583
5727
  const animatedNodes = useMemo12(
5584
5728
  () => customColors.map((color, index) => {
5585
5729
  const delay = randomDelay + index * 0.3;
5586
- return /* @__PURE__ */ jsx28(
5730
+ return /* @__PURE__ */ jsx29(
5587
5731
  "g",
5588
5732
  {
5589
5733
  className: `ec-animated-msg ${opacityClass}`,
5590
- children: /* @__PURE__ */ jsxs26("g", { children: [
5591
- /* @__PURE__ */ jsx28(
5734
+ children: /* @__PURE__ */ jsxs27("g", { children: [
5735
+ /* @__PURE__ */ jsx29(
5592
5736
  "rect",
5593
5737
  {
5594
5738
  x: "-7",
@@ -5600,7 +5744,7 @@ var AnimatedMessageEdge = memo27(
5600
5744
  fill: color
5601
5745
  }
5602
5746
  ),
5603
- /* @__PURE__ */ jsx28(
5747
+ /* @__PURE__ */ jsx29(
5604
5748
  "path",
5605
5749
  {
5606
5750
  d: "M-7,-5 L0,1 L7,-5",
@@ -5610,7 +5754,7 @@ var AnimatedMessageEdge = memo27(
5610
5754
  strokeLinejoin: "round"
5611
5755
  }
5612
5756
  ),
5613
- /* @__PURE__ */ jsx28(
5757
+ /* @__PURE__ */ jsx29(
5614
5758
  "animateMotion",
5615
5759
  {
5616
5760
  dur: "2s",
@@ -5618,7 +5762,7 @@ var AnimatedMessageEdge = memo27(
5618
5762
  path: edgePath,
5619
5763
  rotate: "auto",
5620
5764
  begin: `${delay}s`,
5621
- children: /* @__PURE__ */ jsx28("mpath", { href: `#${id}` })
5765
+ children: /* @__PURE__ */ jsx29("mpath", { href: `#${id}` })
5622
5766
  }
5623
5767
  )
5624
5768
  ] })
@@ -5640,8 +5784,8 @@ var AnimatedMessageEdge = memo27(
5640
5784
  );
5641
5785
  const labelWidth = Math.max(longestLine.length * 6.5 + 16, 50);
5642
5786
  const firstLineDy = `${-((lines.length - 1) * 1.2) / 2}em`;
5643
- return /* @__PURE__ */ jsxs26(Fragment3, { children: [
5644
- /* @__PURE__ */ jsx28(
5787
+ return /* @__PURE__ */ jsxs27(Fragment4, { children: [
5788
+ /* @__PURE__ */ jsx29(
5645
5789
  BaseEdge,
5646
5790
  {
5647
5791
  id,
@@ -5652,8 +5796,8 @@ var AnimatedMessageEdge = memo27(
5652
5796
  }
5653
5797
  ),
5654
5798
  animatedNodes,
5655
- /* @__PURE__ */ jsxs26("g", { children: [
5656
- label && /* @__PURE__ */ jsx28(
5799
+ /* @__PURE__ */ jsxs27("g", { children: [
5800
+ label && /* @__PURE__ */ jsx29(
5657
5801
  "rect",
5658
5802
  {
5659
5803
  x: labelX - labelWidth / 2,
@@ -5668,7 +5812,7 @@ var AnimatedMessageEdge = memo27(
5668
5812
  ry: 5
5669
5813
  }
5670
5814
  ),
5671
- /* @__PURE__ */ jsx28(
5815
+ /* @__PURE__ */ jsx29(
5672
5816
  "text",
5673
5817
  {
5674
5818
  x: labelX,
@@ -5679,7 +5823,7 @@ var AnimatedMessageEdge = memo27(
5679
5823
  fontWeight: 500,
5680
5824
  fill: "rgb(var(--ec-page-text))",
5681
5825
  pointerEvents: "none",
5682
- children: lines.map((line, i) => /* @__PURE__ */ jsx28(
5826
+ children: lines.map((line, i) => /* @__PURE__ */ jsx29(
5683
5827
  "tspan",
5684
5828
  {
5685
5829
  x: labelX,
@@ -5698,12 +5842,12 @@ var AnimatedMessageEdge = memo27(
5698
5842
  var AnimatedMessageEdge_default = AnimatedMessageEdge;
5699
5843
 
5700
5844
  // src/edges/MultilineEdgeLabel.tsx
5701
- import { memo as memo28, useMemo as useMemo13 } from "react";
5845
+ import { memo as memo29, useMemo as useMemo13 } from "react";
5702
5846
  import { getSmoothStepPath as getSmoothStepPath2 } from "@xyflow/react";
5703
- import { Fragment as Fragment4, jsx as jsx29, jsxs as jsxs27 } from "react/jsx-runtime";
5847
+ import { Fragment as Fragment5, jsx as jsx30, jsxs as jsxs28 } from "react/jsx-runtime";
5704
5848
  var TSPAN_NORMAL_STYLE2 = { fontStyle: "normal" };
5705
5849
  var TSPAN_ITALIC_STYLE2 = { fontStyle: "italic" };
5706
- var MultilineEdgeLabel_default = memo28(function MultilineEdgeLabel(props) {
5850
+ var MultilineEdgeLabel_default = memo29(function MultilineEdgeLabel(props) {
5707
5851
  const {
5708
5852
  id,
5709
5853
  sourceX,
@@ -5738,8 +5882,8 @@ var MultilineEdgeLabel_default = memo28(function MultilineEdgeLabel(props) {
5738
5882
  );
5739
5883
  const labelWidth = Math.max(longestLine.length * 5.5 + 14, 44);
5740
5884
  const labelHeight = lines.length * 12 + 4;
5741
- return /* @__PURE__ */ jsxs27(Fragment4, { children: [
5742
- /* @__PURE__ */ jsx29(
5885
+ return /* @__PURE__ */ jsxs28(Fragment5, { children: [
5886
+ /* @__PURE__ */ jsx30(
5743
5887
  "path",
5744
5888
  {
5745
5889
  id,
@@ -5750,7 +5894,7 @@ var MultilineEdgeLabel_default = memo28(function MultilineEdgeLabel(props) {
5750
5894
  style
5751
5895
  }
5752
5896
  ),
5753
- label && /* @__PURE__ */ jsx29(
5897
+ label && /* @__PURE__ */ jsx30(
5754
5898
  "rect",
5755
5899
  {
5756
5900
  x: labelX - labelWidth / 2,
@@ -5766,7 +5910,7 @@ var MultilineEdgeLabel_default = memo28(function MultilineEdgeLabel(props) {
5766
5910
  pointerEvents: "none"
5767
5911
  }
5768
5912
  ),
5769
- /* @__PURE__ */ jsx29(
5913
+ /* @__PURE__ */ jsx30(
5770
5914
  "text",
5771
5915
  {
5772
5916
  x: labelX,
@@ -5776,7 +5920,7 @@ var MultilineEdgeLabel_default = memo28(function MultilineEdgeLabel(props) {
5776
5920
  fontSize: "10px",
5777
5921
  fill: "rgb(var(--ec-page-text))",
5778
5922
  pointerEvents: "none",
5779
- children: lines.map((line, i) => /* @__PURE__ */ jsx29(
5923
+ children: lines.map((line, i) => /* @__PURE__ */ jsx30(
5780
5924
  "tspan",
5781
5925
  {
5782
5926
  x: labelX,
@@ -5792,13 +5936,13 @@ var MultilineEdgeLabel_default = memo28(function MultilineEdgeLabel(props) {
5792
5936
  });
5793
5937
 
5794
5938
  // src/edges/FlowEdge.tsx
5795
- import { memo as memo29, useMemo as useMemo14 } from "react";
5939
+ import { memo as memo30, useMemo as useMemo14 } from "react";
5796
5940
  import {
5797
5941
  BaseEdge as BaseEdge2,
5798
5942
  EdgeLabelRenderer,
5799
5943
  getSmoothStepPath as getSmoothStepPath3
5800
5944
  } from "@xyflow/react";
5801
- import { Fragment as Fragment5, jsx as jsx30, jsxs as jsxs28 } from "react/jsx-runtime";
5945
+ import { Fragment as Fragment6, jsx as jsx31, jsxs as jsxs29 } from "react/jsx-runtime";
5802
5946
  function messageColor2(collection) {
5803
5947
  switch (collection) {
5804
5948
  case "events":
@@ -5812,7 +5956,7 @@ function messageColor2(collection) {
5812
5956
  }
5813
5957
  }
5814
5958
  var EMPTY_STYLE = {};
5815
- var FlowEdge_default = memo29(function CustomEdge({
5959
+ var FlowEdge_default = memo30(function CustomEdge({
5816
5960
  id,
5817
5961
  sourceX,
5818
5962
  sourceY,
@@ -5850,20 +5994,20 @@ var FlowEdge_default = memo29(function CustomEdge({
5850
5994
  }),
5851
5995
  [labelX, labelY, labelStyle]
5852
5996
  );
5853
- return /* @__PURE__ */ jsxs28(Fragment5, { children: [
5854
- /* @__PURE__ */ jsx30(BaseEdge2, { path: edgePath, markerEnd, style: mergedStyle }),
5855
- data?.animated && /* @__PURE__ */ jsx30(
5997
+ return /* @__PURE__ */ jsxs29(Fragment6, { children: [
5998
+ /* @__PURE__ */ jsx31(BaseEdge2, { path: edgePath, markerEnd, style: mergedStyle }),
5999
+ data?.animated && /* @__PURE__ */ jsx31(
5856
6000
  "g",
5857
6001
  {
5858
6002
  className: `ec-animated-msg z-30 ${opacity === 1 ? "opacity-100" : "opacity-10"}`,
5859
- children: /* @__PURE__ */ jsx30(
6003
+ children: /* @__PURE__ */ jsx31(
5860
6004
  "circle",
5861
6005
  {
5862
6006
  cx: "0",
5863
6007
  cy: "0",
5864
6008
  r: "7",
5865
6009
  fill: messageColor2(collection || "default"),
5866
- children: /* @__PURE__ */ jsx30(
6010
+ children: /* @__PURE__ */ jsx31(
5867
6011
  "animateMotion",
5868
6012
  {
5869
6013
  dur: "2s",
@@ -5871,14 +6015,14 @@ var FlowEdge_default = memo29(function CustomEdge({
5871
6015
  path: edgePath,
5872
6016
  rotate: "auto",
5873
6017
  begin: `${randomDelay}s`,
5874
- children: /* @__PURE__ */ jsx30("mpath", { href: `#${id}` })
6018
+ children: /* @__PURE__ */ jsx31("mpath", { href: `#${id}` })
5875
6019
  }
5876
6020
  )
5877
6021
  }
5878
6022
  )
5879
6023
  }
5880
6024
  ),
5881
- label && /* @__PURE__ */ jsx30(EdgeLabelRenderer, { children: /* @__PURE__ */ jsx30(
6025
+ label && /* @__PURE__ */ jsx31(EdgeLabelRenderer, { children: /* @__PURE__ */ jsx31(
5882
6026
  "div",
5883
6027
  {
5884
6028
  style: labelPositionStyle,
@@ -5897,10 +6041,10 @@ import {
5897
6041
  useEffect as useEffect2,
5898
6042
  forwardRef,
5899
6043
  useImperativeHandle,
5900
- memo as memo30
6044
+ memo as memo31
5901
6045
  } from "react";
5902
- import { jsx as jsx31, jsxs as jsxs29 } from "react/jsx-runtime";
5903
- var VisualiserSearch = memo30(
6046
+ import { jsx as jsx32, jsxs as jsxs30 } from "react/jsx-runtime";
6047
+ var VisualiserSearch = memo31(
5904
6048
  forwardRef(
5905
6049
  ({ nodes, onNodeSelect, onClear, onPaneClick: _onPaneClick }, ref) => {
5906
6050
  const [searchQuery, setSearchQuery] = useState5("");
@@ -6045,9 +6189,9 @@ var VisualiserSearch = memo30(
6045
6189
  document.removeEventListener("mousedown", handleClickOutside);
6046
6190
  };
6047
6191
  }, []);
6048
- return /* @__PURE__ */ jsxs29("div", { ref: containerRef, className: "w-full max-w-md mx-auto relative", children: [
6049
- /* @__PURE__ */ jsxs29("div", { className: "relative", children: [
6050
- /* @__PURE__ */ jsx31(
6192
+ return /* @__PURE__ */ jsxs30("div", { ref: containerRef, className: "w-full max-w-md mx-auto relative", children: [
6193
+ /* @__PURE__ */ jsxs30("div", { className: "relative", children: [
6194
+ /* @__PURE__ */ jsx32(
6051
6195
  "input",
6052
6196
  {
6053
6197
  ref: searchInputRef,
@@ -6060,20 +6204,20 @@ var VisualiserSearch = memo30(
6060
6204
  className: "w-full px-4 py-2 pr-10 bg-[rgb(var(--ec-input-bg))] border border-[rgb(var(--ec-input-border))] text-[rgb(var(--ec-input-text))] placeholder:text-[rgb(var(--ec-page-text-muted))] rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:border-transparent"
6061
6205
  }
6062
6206
  ),
6063
- searchQuery && /* @__PURE__ */ jsx31(
6207
+ searchQuery && /* @__PURE__ */ jsx32(
6064
6208
  "button",
6065
6209
  {
6066
6210
  onClick: clearSearch,
6067
6211
  className: "absolute right-2 top-1/2 transform -translate-y-1/2 text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))]",
6068
6212
  "aria-label": "Clear search",
6069
- children: /* @__PURE__ */ jsx31(
6213
+ children: /* @__PURE__ */ jsx32(
6070
6214
  "svg",
6071
6215
  {
6072
6216
  className: "w-5 h-5",
6073
6217
  fill: "none",
6074
6218
  stroke: "currentColor",
6075
6219
  viewBox: "0 0 24 24",
6076
- children: /* @__PURE__ */ jsx31(
6220
+ children: /* @__PURE__ */ jsx32(
6077
6221
  "path",
6078
6222
  {
6079
6223
  strokeLinecap: "round",
@@ -6087,17 +6231,17 @@ var VisualiserSearch = memo30(
6087
6231
  }
6088
6232
  )
6089
6233
  ] }),
6090
- showSuggestions && filteredSuggestions.length > 0 && /* @__PURE__ */ jsx31("div", { className: "absolute top-full left-0 right-0 mt-1 bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] rounded-md shadow-lg z-50 max-h-60 overflow-y-auto", children: filteredSuggestions.map((node, index) => {
6234
+ showSuggestions && filteredSuggestions.length > 0 && /* @__PURE__ */ jsx32("div", { className: "absolute top-full left-0 right-0 mt-1 bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] rounded-md shadow-lg z-50 max-h-60 overflow-y-auto", children: filteredSuggestions.map((node, index) => {
6091
6235
  const nodeName = getNodeDisplayName(node);
6092
6236
  const nodeType = node.type || "unknown";
6093
- return /* @__PURE__ */ jsxs29(
6237
+ return /* @__PURE__ */ jsxs30(
6094
6238
  "div",
6095
6239
  {
6096
6240
  onClick: () => handleSuggestionClick(node),
6097
6241
  className: `px-4 py-2 cursor-pointer flex items-center justify-between hover:bg-[rgb(var(--ec-page-border)/0.5)] ${index === selectedSuggestionIndex ? "bg-[rgb(var(--ec-accent-subtle))]" : ""}`,
6098
6242
  children: [
6099
- /* @__PURE__ */ jsx31("span", { className: "text-sm font-medium text-[rgb(var(--ec-page-text))]", children: nodeName }),
6100
- /* @__PURE__ */ jsx31(
6243
+ /* @__PURE__ */ jsx32("span", { className: "text-sm font-medium text-[rgb(var(--ec-page-text))]", children: nodeName }),
6244
+ /* @__PURE__ */ jsx32(
6101
6245
  "span",
6102
6246
  {
6103
6247
  className: `text-xs capitalize px-2 py-1 rounded ${getNodeTypeColorClass(nodeType)}`,
@@ -6123,11 +6267,11 @@ import {
6123
6267
  useCallback as useCallback5,
6124
6268
  useMemo as useMemo15,
6125
6269
  useRef as useRef3,
6126
- memo as memo31
6270
+ memo as memo32
6127
6271
  } from "react";
6128
6272
  import { ChevronLeftIcon, ChevronRightIcon } from "@heroicons/react/24/outline";
6129
- import { Fragment as Fragment6, jsx as jsx32, jsxs as jsxs30 } from "react/jsx-runtime";
6130
- var StepWalkthrough_default = memo31(function StepWalkthrough({
6273
+ import { Fragment as Fragment7, jsx as jsx33, jsxs as jsxs31 } from "react/jsx-runtime";
6274
+ var StepWalkthrough_default = memo32(function StepWalkthrough({
6131
6275
  nodes,
6132
6276
  edges,
6133
6277
  isFlowVisualization,
@@ -6167,7 +6311,8 @@ var StepWalkthrough_default = memo31(function StepWalkthrough({
6167
6311
  const startNodes = nodes.filter(
6168
6312
  (node) => incomingEdgeMap.get(node.id) === 0
6169
6313
  );
6170
- if (startNodes.length > 0 && !startNodeId) {
6314
+ const cachedStartStillValid = startNodeId && nodes.some((n) => n.id === startNodeId);
6315
+ if (startNodes.length > 0 && !cachedStartStillValid) {
6171
6316
  const firstStartNode = startNodes[0];
6172
6317
  setStartNodeId(firstStartNode.id);
6173
6318
  }
@@ -6175,6 +6320,16 @@ var StepWalkthrough_default = memo31(function StepWalkthrough({
6175
6320
  }, [nodeIdsKey, edgeKey, isFlowVisualization, startNodeId]);
6176
6321
  useEffect3(() => {
6177
6322
  if (currentNodeId) {
6323
+ const currentExists = nodes.some(
6324
+ (n) => n.id === currentNodeId
6325
+ );
6326
+ if (!currentExists) {
6327
+ setCurrentNodeId(null);
6328
+ setCurrentStepIndex(-1);
6329
+ setPathHistory([]);
6330
+ setAvailablePaths([]);
6331
+ return;
6332
+ }
6178
6333
  const outgoingEdges = edges.filter(
6179
6334
  (edge) => edge.source === currentNodeId
6180
6335
  );
@@ -6286,14 +6441,14 @@ var StepWalkthrough_default = memo31(function StepWalkthrough({
6286
6441
  }
6287
6442
  return { title: title2, description: description2 };
6288
6443
  }, [currentStepIndex, currentNodeId, nodeIdsKey]);
6289
- return /* @__PURE__ */ jsxs30("div", { className: "ml-12 bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-sm px-4 py-2 z-30 border border-[rgb(var(--ec-page-border))] w-[350px]", children: [
6290
- /* @__PURE__ */ jsxs30("div", { className: "mb-2", children: [
6291
- /* @__PURE__ */ jsx32("h3", { className: "text-sm font-semibold text-[rgb(var(--ec-page-text))]", children: title }),
6292
- description && /* @__PURE__ */ jsx32("p", { className: "text-xs text-[rgb(var(--ec-page-text-muted))] mt-1", children: description })
6444
+ return /* @__PURE__ */ jsxs31("div", { className: "ml-12 bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-sm px-4 py-2 z-30 border border-[rgb(var(--ec-page-border))] w-[350px]", children: [
6445
+ /* @__PURE__ */ jsxs31("div", { className: "mb-2", children: [
6446
+ /* @__PURE__ */ jsx33("h3", { className: "text-sm font-semibold text-[rgb(var(--ec-page-text))]", children: title }),
6447
+ description && /* @__PURE__ */ jsx33("p", { className: "text-xs text-[rgb(var(--ec-page-text-muted))] mt-1", children: description })
6293
6448
  ] }),
6294
- currentNodeId && availablePaths.length > 1 && /* @__PURE__ */ jsxs30("div", { className: "mb-3", children: [
6295
- /* @__PURE__ */ jsx32("label", { className: "block text-xs font-medium text-[rgb(var(--ec-page-text-muted))] mb-2", children: "Choose next path:" }),
6296
- /* @__PURE__ */ jsx32(
6449
+ currentNodeId && availablePaths.length > 1 && /* @__PURE__ */ jsxs31("div", { className: "mb-3", children: [
6450
+ /* @__PURE__ */ jsx33("label", { className: "block text-xs font-medium text-[rgb(var(--ec-page-text-muted))] mb-2", children: "Choose next path:" }),
6451
+ /* @__PURE__ */ jsx33(
6297
6452
  "select",
6298
6453
  {
6299
6454
  value: selectedPathIndex,
@@ -6301,16 +6456,16 @@ var StepWalkthrough_default = memo31(function StepWalkthrough({
6301
6456
  className: "w-full px-3 py-2 text-xs border border-[rgb(var(--ec-input-border))] rounded-md bg-[rgb(var(--ec-input-bg))] text-[rgb(var(--ec-input-text))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:border-[rgb(var(--ec-accent))]",
6302
6457
  children: availablePaths.map((path, index) => {
6303
6458
  const nodeLabel = path.targetNode.data.step?.title || path.targetNode.data.service?.name || path.targetNode.data.message?.name || path.targetNode.data.flow?.data?.name || path.targetNode.data.custom?.title || path.targetNode.data.custom?.label || path.targetNode.data.externalSystem?.label || path.targetNode.data.label || "Unknown";
6304
- return /* @__PURE__ */ jsx32("option", { value: index, children: path.label ? `${path.label}: ${nodeLabel}` : nodeLabel }, path.targetId);
6459
+ return /* @__PURE__ */ jsx33("option", { value: index, children: path.label ? `${path.label}: ${nodeLabel}` : nodeLabel }, path.targetId);
6305
6460
  })
6306
6461
  }
6307
6462
  )
6308
6463
  ] }),
6309
- /* @__PURE__ */ jsx32("div", { className: "flex items-center justify-between", children: currentStepIndex === -1 ? (
6464
+ /* @__PURE__ */ jsx33("div", { className: "flex items-center justify-between", children: currentStepIndex === -1 ? (
6310
6465
  // Initial state - show only Start button on the right
6311
- /* @__PURE__ */ jsxs30(Fragment6, { children: [
6312
- /* @__PURE__ */ jsx32("div", { className: "flex-1" }),
6313
- /* @__PURE__ */ jsx32(
6466
+ /* @__PURE__ */ jsxs31(Fragment7, { children: [
6467
+ /* @__PURE__ */ jsx33("div", { className: "flex-1" }),
6468
+ /* @__PURE__ */ jsx33(
6314
6469
  "button",
6315
6470
  {
6316
6471
  onClick: handleNextStep,
@@ -6321,29 +6476,29 @@ var StepWalkthrough_default = memo31(function StepWalkthrough({
6321
6476
  ] })
6322
6477
  ) : (
6323
6478
  // In walkthrough - show Previous on left, Next on right (only if paths available)
6324
- /* @__PURE__ */ jsxs30(Fragment6, { children: [
6325
- /* @__PURE__ */ jsxs30(
6479
+ /* @__PURE__ */ jsxs31(Fragment7, { children: [
6480
+ /* @__PURE__ */ jsxs31(
6326
6481
  "button",
6327
6482
  {
6328
6483
  onClick: handlePreviousStep,
6329
6484
  className: "flex items-center justify-center px-4 py-2 text-xs font-medium bg-[rgb(var(--ec-accent))] text-white rounded-md hover:bg-[rgb(var(--ec-accent-hover))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors",
6330
6485
  children: [
6331
- /* @__PURE__ */ jsx32(ChevronLeftIcon, { className: "w-4 h-4 mr-1" }),
6486
+ /* @__PURE__ */ jsx33(ChevronLeftIcon, { className: "w-4 h-4 mr-1" }),
6332
6487
  "Previous"
6333
6488
  ]
6334
6489
  }
6335
6490
  ),
6336
- availablePaths.length > 0 ? /* @__PURE__ */ jsxs30(
6491
+ availablePaths.length > 0 ? /* @__PURE__ */ jsxs31(
6337
6492
  "button",
6338
6493
  {
6339
6494
  onClick: handleNextStep,
6340
6495
  className: "flex items-center justify-center px-4 py-2 text-xs font-medium bg-[rgb(var(--ec-accent))] text-white rounded-md hover:bg-[rgb(var(--ec-accent-hover))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors",
6341
6496
  children: [
6342
6497
  "Next",
6343
- /* @__PURE__ */ jsx32(ChevronRightIcon, { className: "w-4 h-4 ml-1" })
6498
+ /* @__PURE__ */ jsx33(ChevronRightIcon, { className: "w-4 h-4 ml-1" })
6344
6499
  ]
6345
6500
  }
6346
- ) : /* @__PURE__ */ jsx32(
6501
+ ) : /* @__PURE__ */ jsx33(
6347
6502
  "button",
6348
6503
  {
6349
6504
  onClick: handleFinish,
@@ -6423,7 +6578,7 @@ var exportNodeGraphForStudio = (data) => {
6423
6578
  };
6424
6579
 
6425
6580
  // src/components/StudioModal.tsx
6426
- import { Fragment as Fragment7, jsx as jsx33, jsxs as jsxs31 } from "react/jsx-runtime";
6581
+ import { Fragment as Fragment8, jsx as jsx34, jsxs as jsxs32 } from "react/jsx-runtime";
6427
6582
  var StudioModal = ({ isOpen, onClose }) => {
6428
6583
  const [copySuccess, setCopySuccess] = useState7(false);
6429
6584
  const portalContainer = usePortalContainer();
@@ -6454,14 +6609,14 @@ var StudioModal = ({ isOpen, onClose }) => {
6454
6609
  );
6455
6610
  onClose();
6456
6611
  };
6457
- return /* @__PURE__ */ jsx33(Dialog2.Root, { open: isOpen, onOpenChange: onClose, children: /* @__PURE__ */ jsxs31(Dialog2.Portal, { container: portalContainer, children: [
6458
- /* @__PURE__ */ jsx33(Dialog2.Overlay, { className: "fixed inset-0 bg-black/50 data-[state=open]:animate-overlayShow z-50" }),
6459
- /* @__PURE__ */ jsxs31(Dialog2.Content, { className: "fixed top-1/2 left-1/2 w-[90vw] max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg bg-white p-6 shadow-xl focus:outline-none data-[state=open]:animate-contentShow z-[100]", children: [
6460
- /* @__PURE__ */ jsx33(Dialog2.Title, { className: "text-lg font-semibold text-gray-900 mb-3", children: "Open in EventCatalog Studio" }),
6461
- /* @__PURE__ */ jsxs31(Dialog2.Description, { className: "text-sm text-gray-600 mb-6", children: [
6612
+ return /* @__PURE__ */ jsx34(Dialog2.Root, { open: isOpen, onOpenChange: onClose, children: /* @__PURE__ */ jsxs32(Dialog2.Portal, { container: portalContainer, children: [
6613
+ /* @__PURE__ */ jsx34(Dialog2.Overlay, { className: "fixed inset-0 bg-black/50 data-[state=open]:animate-overlayShow z-50" }),
6614
+ /* @__PURE__ */ jsxs32(Dialog2.Content, { className: "fixed top-1/2 left-1/2 w-[90vw] max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg bg-white p-6 shadow-xl focus:outline-none data-[state=open]:animate-contentShow z-[100]", children: [
6615
+ /* @__PURE__ */ jsx34(Dialog2.Title, { className: "text-lg font-semibold text-gray-900 mb-3", children: "Open in EventCatalog Studio" }),
6616
+ /* @__PURE__ */ jsxs32(Dialog2.Description, { className: "text-sm text-gray-600 mb-6", children: [
6462
6617
  "Import your diagram into",
6463
6618
  " ",
6464
- /* @__PURE__ */ jsx33(
6619
+ /* @__PURE__ */ jsx34(
6465
6620
  "a",
6466
6621
  {
6467
6622
  href: "https://eventcatalog.studio",
@@ -6474,43 +6629,43 @@ var StudioModal = ({ isOpen, onClose }) => {
6474
6629
  " ",
6475
6630
  "to create designs from your visualization of your architecture."
6476
6631
  ] }),
6477
- /* @__PURE__ */ jsxs31("div", { className: "space-y-4", children: [
6478
- /* @__PURE__ */ jsxs31("div", { className: "bg-gray-50 rounded-lg p-4 border border-gray-200", children: [
6479
- /* @__PURE__ */ jsx33("h4", { className: "text-sm font-bold text-gray-900 mb-2", children: "Step 1: Copy diagram" }),
6480
- /* @__PURE__ */ jsx33("p", { className: "text-xs text-gray-600 mb-3", children: "Copy your diagram data to your clipboard." }),
6481
- /* @__PURE__ */ jsx33(
6632
+ /* @__PURE__ */ jsxs32("div", { className: "space-y-4", children: [
6633
+ /* @__PURE__ */ jsxs32("div", { className: "bg-gray-50 rounded-lg p-4 border border-gray-200", children: [
6634
+ /* @__PURE__ */ jsx34("h4", { className: "text-sm font-bold text-gray-900 mb-2", children: "Step 1: Copy diagram" }),
6635
+ /* @__PURE__ */ jsx34("p", { className: "text-xs text-gray-600 mb-3", children: "Copy your diagram data to your clipboard." }),
6636
+ /* @__PURE__ */ jsx34(
6482
6637
  "button",
6483
6638
  {
6484
6639
  onClick: handleCopyToClipboard,
6485
6640
  className: `w-full flex items-center justify-center space-x-2 px-4 py-2 text-sm font-medium rounded-md border transition-colors ${copySuccess ? "bg-green-50 border-green-200 text-green-700" : "bg-white border-gray-300 text-gray-700 hover:bg-gray-50"}`,
6486
- children: copySuccess ? /* @__PURE__ */ jsxs31(Fragment7, { children: [
6487
- /* @__PURE__ */ jsx33(CheckIcon, { className: "w-4 h-4" }),
6488
- /* @__PURE__ */ jsx33("span", { children: "Copied!" })
6489
- ] }) : /* @__PURE__ */ jsxs31(Fragment7, { children: [
6490
- /* @__PURE__ */ jsx33(ClipboardIcon, { className: "w-4 h-4" }),
6491
- /* @__PURE__ */ jsx33("span", { children: "Copy diagram to clipboard" })
6641
+ children: copySuccess ? /* @__PURE__ */ jsxs32(Fragment8, { children: [
6642
+ /* @__PURE__ */ jsx34(CheckIcon, { className: "w-4 h-4" }),
6643
+ /* @__PURE__ */ jsx34("span", { children: "Copied!" })
6644
+ ] }) : /* @__PURE__ */ jsxs32(Fragment8, { children: [
6645
+ /* @__PURE__ */ jsx34(ClipboardIcon, { className: "w-4 h-4" }),
6646
+ /* @__PURE__ */ jsx34("span", { children: "Copy diagram to clipboard" })
6492
6647
  ] })
6493
6648
  }
6494
6649
  )
6495
6650
  ] }),
6496
- /* @__PURE__ */ jsxs31("div", { className: "bg-[rgb(var(--ec-accent-subtle))] rounded-lg p-4 border border-[rgb(var(--ec-accent)/0.3)]", children: [
6497
- /* @__PURE__ */ jsx33("h4", { className: "text-sm font-bold text-gray-900 mb-2", children: "Step 2: Open EventCatalog Studio" }),
6498
- /* @__PURE__ */ jsx33("p", { className: "text-xs text-gray-600 mb-3", children: 'Go to EventCatalog Studio and import your design using the "Import from EventCatalog" button.' }),
6499
- /* @__PURE__ */ jsxs31(
6651
+ /* @__PURE__ */ jsxs32("div", { className: "bg-[rgb(var(--ec-accent-subtle))] rounded-lg p-4 border border-[rgb(var(--ec-accent)/0.3)]", children: [
6652
+ /* @__PURE__ */ jsx34("h4", { className: "text-sm font-bold text-gray-900 mb-2", children: "Step 2: Open EventCatalog Studio" }),
6653
+ /* @__PURE__ */ jsx34("p", { className: "text-xs text-gray-600 mb-3", children: 'Go to EventCatalog Studio and import your design using the "Import from EventCatalog" button.' }),
6654
+ /* @__PURE__ */ jsxs32(
6500
6655
  "button",
6501
6656
  {
6502
6657
  onClick: handleOpenStudio,
6503
6658
  className: "w-full flex items-center justify-center space-x-2 px-4 py-2 bg-[rgb(var(--ec-accent))] text-white text-sm font-medium rounded-md hover:bg-[rgb(var(--ec-accent-hover))] transition-colors",
6504
6659
  children: [
6505
- /* @__PURE__ */ jsx33(ExternalLinkIcon, { className: "w-4 h-4" }),
6506
- /* @__PURE__ */ jsx33("span", { children: "Open EventCatalog Studio" })
6660
+ /* @__PURE__ */ jsx34(ExternalLinkIcon, { className: "w-4 h-4" }),
6661
+ /* @__PURE__ */ jsx34("span", { children: "Open EventCatalog Studio" })
6507
6662
  ]
6508
6663
  }
6509
6664
  ),
6510
- /* @__PURE__ */ jsx33("p", { className: "text-[12px] text-gray-500 italic mt-4 mb-0", children: "Don't worry, none of your data is stored by EventCatalog Studio, everything is local to your browser." })
6665
+ /* @__PURE__ */ jsx34("p", { className: "text-[12px] text-gray-500 italic mt-4 mb-0", children: "Don't worry, none of your data is stored by EventCatalog Studio, everything is local to your browser." })
6511
6666
  ] })
6512
6667
  ] }),
6513
- /* @__PURE__ */ jsx33("div", { className: "mt-6 flex justify-end", children: /* @__PURE__ */ jsx33(Dialog2.Close, { asChild: true, children: /* @__PURE__ */ jsx33(
6668
+ /* @__PURE__ */ jsx34("div", { className: "mt-6 flex justify-end", children: /* @__PURE__ */ jsx34(Dialog2.Close, { asChild: true, children: /* @__PURE__ */ jsx34(
6514
6669
  "button",
6515
6670
  {
6516
6671
  type: "button",
@@ -6657,7 +6812,7 @@ function getNodeDocUrl(node) {
6657
6812
  // src/components/FocusMode/FocusModeNodeActions.tsx
6658
6813
  import { NodeToolbar, Position as Position18, useViewport } from "@xyflow/react";
6659
6814
  import { ArrowRightLeft as ArrowRightLeft2, FileText } from "lucide-react";
6660
- import { jsx as jsx34, jsxs as jsxs32 } from "react/jsx-runtime";
6815
+ import { jsx as jsx35, jsxs as jsxs33 } from "react/jsx-runtime";
6661
6816
  var FocusModeNodeActions = ({
6662
6817
  node,
6663
6818
  isCenter,
@@ -6684,26 +6839,26 @@ var FocusModeNodeActions = ({
6684
6839
  };
6685
6840
  if (isCenter) {
6686
6841
  if (!docUrl) return null;
6687
- return /* @__PURE__ */ jsx34(
6842
+ return /* @__PURE__ */ jsx35(
6688
6843
  NodeToolbar,
6689
6844
  {
6690
6845
  nodeId: node.id,
6691
6846
  position: Position18.Bottom,
6692
6847
  isVisible: true,
6693
6848
  offset: -16,
6694
- children: /* @__PURE__ */ jsx34(
6849
+ children: /* @__PURE__ */ jsx35(
6695
6850
  "div",
6696
6851
  {
6697
6852
  className: "flex items-center gap-1 bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md",
6698
6853
  style: { padding: Math.round(4 * scaleFactor) },
6699
- children: /* @__PURE__ */ jsx34(
6854
+ children: /* @__PURE__ */ jsx35(
6700
6855
  "button",
6701
6856
  {
6702
6857
  onClick: handleDocClick,
6703
6858
  className: "flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors",
6704
6859
  style: { width: buttonSize, height: buttonSize },
6705
6860
  title: "View documentation",
6706
- children: /* @__PURE__ */ jsx34(FileText, { style: { width: iconSize, height: iconSize } })
6861
+ children: /* @__PURE__ */ jsx35(FileText, { style: { width: iconSize, height: iconSize } })
6707
6862
  }
6708
6863
  )
6709
6864
  }
@@ -6711,37 +6866,37 @@ var FocusModeNodeActions = ({
6711
6866
  }
6712
6867
  );
6713
6868
  }
6714
- return /* @__PURE__ */ jsx34(
6869
+ return /* @__PURE__ */ jsx35(
6715
6870
  NodeToolbar,
6716
6871
  {
6717
6872
  nodeId: node.id,
6718
6873
  position: Position18.Bottom,
6719
6874
  isVisible: true,
6720
6875
  offset: -16,
6721
- children: /* @__PURE__ */ jsxs32(
6876
+ children: /* @__PURE__ */ jsxs33(
6722
6877
  "div",
6723
6878
  {
6724
6879
  className: "flex items-center gap-1 bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md",
6725
6880
  style: { padding: Math.round(4 * scaleFactor) },
6726
6881
  children: [
6727
- docUrl && /* @__PURE__ */ jsx34(
6882
+ docUrl && /* @__PURE__ */ jsx35(
6728
6883
  "button",
6729
6884
  {
6730
6885
  onClick: handleDocClick,
6731
6886
  className: "flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors",
6732
6887
  style: { width: buttonSize, height: buttonSize },
6733
6888
  title: "View documentation",
6734
- children: /* @__PURE__ */ jsx34(FileText, { style: { width: iconSize, height: iconSize } })
6889
+ children: /* @__PURE__ */ jsx35(FileText, { style: { width: iconSize, height: iconSize } })
6735
6890
  }
6736
6891
  ),
6737
- /* @__PURE__ */ jsx34(
6892
+ /* @__PURE__ */ jsx35(
6738
6893
  "button",
6739
6894
  {
6740
6895
  onClick: handleSwitch,
6741
6896
  className: "flex items-center justify-center rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors",
6742
6897
  style: { width: buttonSize, height: buttonSize },
6743
6898
  title: "Focus on this node",
6744
- children: /* @__PURE__ */ jsx34(ArrowRightLeft2, { style: { width: iconSize, height: iconSize } })
6899
+ children: /* @__PURE__ */ jsx35(ArrowRightLeft2, { style: { width: iconSize, height: iconSize } })
6745
6900
  }
6746
6901
  )
6747
6902
  ]
@@ -6754,18 +6909,18 @@ var FocusModeNodeActions_default = FocusModeNodeActions;
6754
6909
 
6755
6910
  // src/components/FocusMode/FocusModePlaceholder.tsx
6756
6911
  import { Handle as Handle21, Position as Position19 } from "@xyflow/react";
6757
- import { jsx as jsx35, jsxs as jsxs33 } from "react/jsx-runtime";
6912
+ import { jsx as jsx36, jsxs as jsxs34 } from "react/jsx-runtime";
6758
6913
  var FocusModePlaceholder = ({
6759
6914
  data
6760
6915
  }) => {
6761
6916
  const { label, side } = data;
6762
- return /* @__PURE__ */ jsxs33(
6917
+ return /* @__PURE__ */ jsxs34(
6763
6918
  "div",
6764
6919
  {
6765
6920
  className: "px-4 py-4 rounded-lg border-2 border-dashed border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg)/0.5)] max-w-[280px] flex items-center justify-center",
6766
6921
  style: { opacity: 0.6, minHeight: "130px" },
6767
6922
  children: [
6768
- side === "right" && /* @__PURE__ */ jsx35(
6923
+ side === "right" && /* @__PURE__ */ jsx36(
6769
6924
  Handle21,
6770
6925
  {
6771
6926
  type: "target",
@@ -6773,8 +6928,8 @@ var FocusModePlaceholder = ({
6773
6928
  style: { visibility: "hidden" }
6774
6929
  }
6775
6930
  ),
6776
- /* @__PURE__ */ jsx35("div", { className: "text-center text-sm text-[rgb(var(--ec-page-text-muted))] italic", children: label }),
6777
- side === "left" && /* @__PURE__ */ jsx35(
6931
+ /* @__PURE__ */ jsx36("div", { className: "text-center text-sm text-[rgb(var(--ec-page-text-muted))] italic", children: label }),
6932
+ side === "left" && /* @__PURE__ */ jsx36(
6778
6933
  Handle21,
6779
6934
  {
6780
6935
  type: "source",
@@ -6789,7 +6944,7 @@ var FocusModePlaceholder = ({
6789
6944
  var FocusModePlaceholder_default = FocusModePlaceholder;
6790
6945
 
6791
6946
  // src/components/FocusMode/FocusModeContent.tsx
6792
- import { jsx as jsx36, jsxs as jsxs34 } from "react/jsx-runtime";
6947
+ import { jsx as jsx37, jsxs as jsxs35 } from "react/jsx-runtime";
6793
6948
  var HORIZONTAL_SPACING = 450;
6794
6949
  var VERTICAL_SPACING = 200;
6795
6950
  var SLIDE_DURATION = 300;
@@ -6998,14 +7153,14 @@ var FocusModeContent = ({
6998
7153
  [nodeTypes]
6999
7154
  );
7000
7155
  if (displayNodes.length === 0) {
7001
- return /* @__PURE__ */ jsx36("div", { className: "flex items-center justify-center h-full text-[rgb(var(--ec-page-text-muted))]", children: "Node not found" });
7156
+ return /* @__PURE__ */ jsx37("div", { className: "flex items-center justify-center h-full text-[rgb(var(--ec-page-text-muted))]", children: "Node not found" });
7002
7157
  }
7003
- return /* @__PURE__ */ jsx36(
7158
+ return /* @__PURE__ */ jsx37(
7004
7159
  "div",
7005
7160
  {
7006
7161
  className: "h-full w-full focus-mode-container",
7007
7162
  style: { opacity: isReady ? 1 : 0 },
7008
- children: /* @__PURE__ */ jsxs34(
7163
+ children: /* @__PURE__ */ jsxs35(
7009
7164
  ReactFlow,
7010
7165
  {
7011
7166
  nodes: displayNodes,
@@ -7025,9 +7180,9 @@ var FocusModeContent = ({
7025
7180
  minZoom: 0.3,
7026
7181
  maxZoom: 2,
7027
7182
  children: [
7028
- /* @__PURE__ */ jsx36(Background, { color: "rgb(var(--ec-page-border))", gap: 20 }),
7029
- /* @__PURE__ */ jsx36(Controls, { showInteractive: false }),
7030
- displayNodes.map((node, index) => /* @__PURE__ */ jsx36(
7183
+ /* @__PURE__ */ jsx37(Background, { color: "rgb(var(--ec-page-border))", gap: 20 }),
7184
+ /* @__PURE__ */ jsx37(Controls, { showInteractive: false }),
7185
+ displayNodes.map((node, index) => /* @__PURE__ */ jsx37(
7031
7186
  FocusModeNodeActions_default,
7032
7187
  {
7033
7188
  node,
@@ -7045,7 +7200,7 @@ var FocusModeContent = ({
7045
7200
  var FocusModeContent_default = FocusModeContent;
7046
7201
 
7047
7202
  // src/components/FocusModeModal.tsx
7048
- import { jsx as jsx37, jsxs as jsxs35 } from "react/jsx-runtime";
7203
+ import { jsx as jsx38, jsxs as jsxs36 } from "react/jsx-runtime";
7049
7204
  var FocusModeModal = ({
7050
7205
  isOpen,
7051
7206
  onClose,
@@ -7076,7 +7231,7 @@ var FocusModeModal = ({
7076
7231
  if (!centerNodeId) {
7077
7232
  return null;
7078
7233
  }
7079
- return /* @__PURE__ */ jsx37(Dialog3.Root, { open: isOpen, onOpenChange: (open) => !open && onClose(), children: /* @__PURE__ */ jsx37(Dialog3.Portal, { children: /* @__PURE__ */ jsxs35(
7234
+ return /* @__PURE__ */ jsx38(Dialog3.Root, { open: isOpen, onOpenChange: (open) => !open && onClose(), children: /* @__PURE__ */ jsx38(Dialog3.Portal, { children: /* @__PURE__ */ jsxs36(
7080
7235
  "div",
7081
7236
  {
7082
7237
  className: "eventcatalog-visualizer",
@@ -7087,7 +7242,7 @@ var FocusModeModal = ({
7087
7242
  zIndex: 99999
7088
7243
  },
7089
7244
  children: [
7090
- /* @__PURE__ */ jsx37(
7245
+ /* @__PURE__ */ jsx38(
7091
7246
  Dialog3.Overlay,
7092
7247
  {
7093
7248
  style: {
@@ -7098,7 +7253,7 @@ var FocusModeModal = ({
7098
7253
  }
7099
7254
  }
7100
7255
  ),
7101
- /* @__PURE__ */ jsxs35(
7256
+ /* @__PURE__ */ jsxs36(
7102
7257
  Dialog3.Content,
7103
7258
  {
7104
7259
  style: {
@@ -7114,7 +7269,7 @@ var FocusModeModal = ({
7114
7269
  overflow: "hidden"
7115
7270
  },
7116
7271
  children: [
7117
- /* @__PURE__ */ jsxs35(
7272
+ /* @__PURE__ */ jsxs36(
7118
7273
  "div",
7119
7274
  {
7120
7275
  style: {
@@ -7126,8 +7281,8 @@ var FocusModeModal = ({
7126
7281
  flexShrink: 0
7127
7282
  },
7128
7283
  children: [
7129
- /* @__PURE__ */ jsxs35("div", { style: { display: "flex", alignItems: "center", gap: 12 }, children: [
7130
- /* @__PURE__ */ jsx37(
7284
+ /* @__PURE__ */ jsxs36("div", { style: { display: "flex", alignItems: "center", gap: 12 }, children: [
7285
+ /* @__PURE__ */ jsx38(
7131
7286
  "div",
7132
7287
  {
7133
7288
  style: {
@@ -7139,7 +7294,7 @@ var FocusModeModal = ({
7139
7294
  borderRadius: 10,
7140
7295
  background: isDark ? "rgba(59, 130, 246, 0.18)" : "rgba(59, 130, 246, 0.12)"
7141
7296
  },
7142
- children: /* @__PURE__ */ jsx37(
7297
+ children: /* @__PURE__ */ jsx38(
7143
7298
  FocusIcon,
7144
7299
  {
7145
7300
  style: {
@@ -7151,8 +7306,8 @@ var FocusModeModal = ({
7151
7306
  )
7152
7307
  }
7153
7308
  ),
7154
- /* @__PURE__ */ jsxs35("div", { children: [
7155
- /* @__PURE__ */ jsx37(
7309
+ /* @__PURE__ */ jsxs36("div", { children: [
7310
+ /* @__PURE__ */ jsx38(
7156
7311
  Dialog3.Title,
7157
7312
  {
7158
7313
  style: {
@@ -7163,7 +7318,7 @@ var FocusModeModal = ({
7163
7318
  children: "Focus Mode"
7164
7319
  }
7165
7320
  ),
7166
- /* @__PURE__ */ jsx37(
7321
+ /* @__PURE__ */ jsx38(
7167
7322
  Dialog3.Description,
7168
7323
  {
7169
7324
  style: {
@@ -7176,7 +7331,7 @@ var FocusModeModal = ({
7176
7331
  )
7177
7332
  ] })
7178
7333
  ] }),
7179
- /* @__PURE__ */ jsx37(Dialog3.Close, { asChild: true, children: /* @__PURE__ */ jsx37(
7334
+ /* @__PURE__ */ jsx38(Dialog3.Close, { asChild: true, children: /* @__PURE__ */ jsx38(
7180
7335
  "button",
7181
7336
  {
7182
7337
  style: {
@@ -7192,13 +7347,13 @@ var FocusModeModal = ({
7192
7347
  color: isDark ? "#94a3b8" : "#64748b"
7193
7348
  },
7194
7349
  "aria-label": "Close",
7195
- children: /* @__PURE__ */ jsx37(XIcon2, { style: { width: 20, height: 20 } })
7350
+ children: /* @__PURE__ */ jsx38(XIcon2, { style: { width: 20, height: 20 } })
7196
7351
  }
7197
7352
  ) })
7198
7353
  ]
7199
7354
  }
7200
7355
  ),
7201
- /* @__PURE__ */ jsx37("div", { style: { flex: 1, overflow: "hidden" }, children: /* @__PURE__ */ jsx37(ReactFlowProvider, { children: /* @__PURE__ */ jsx37(
7356
+ /* @__PURE__ */ jsx38("div", { style: { flex: 1, overflow: "hidden" }, children: /* @__PURE__ */ jsx38(ReactFlowProvider, { children: /* @__PURE__ */ jsx38(
7202
7357
  FocusModeContent_default,
7203
7358
  {
7204
7359
  centerNodeId,
@@ -7484,7 +7639,7 @@ async function copyToClipboard(text) {
7484
7639
  }
7485
7640
 
7486
7641
  // src/components/MermaidView.tsx
7487
- import { jsx as jsx38, jsxs as jsxs36 } from "react/jsx-runtime";
7642
+ import { jsx as jsx39, jsxs as jsxs37 } from "react/jsx-runtime";
7488
7643
  var MermaidView = ({
7489
7644
  nodes,
7490
7645
  edges,
@@ -7594,51 +7749,51 @@ var MermaidView = ({
7594
7749
  setCopySuccess(true);
7595
7750
  setTimeout(() => setCopySuccess(false), 2e3);
7596
7751
  }, [mermaidCode]);
7597
- return /* @__PURE__ */ jsxs36(
7752
+ return /* @__PURE__ */ jsxs37(
7598
7753
  "div",
7599
7754
  {
7600
7755
  ref: containerRef,
7601
7756
  className: "absolute inset-0 bg-[rgb(var(--ec-page-bg))]",
7602
7757
  style: { animation: "fadeIn 200ms ease-out" },
7603
7758
  children: [
7604
- /* @__PURE__ */ jsx38("style", { children: `
7759
+ /* @__PURE__ */ jsx39("style", { children: `
7605
7760
  @keyframes fadeIn {
7606
7761
  from { opacity: 0; }
7607
7762
  to { opacity: 1; }
7608
7763
  }
7609
7764
  ` }),
7610
- /* @__PURE__ */ jsx38("div", { className: "absolute top-[10px] right-4 z-20", children: /* @__PURE__ */ jsxs36("div", { className: "relative group", children: [
7611
- /* @__PURE__ */ jsx38(
7765
+ /* @__PURE__ */ jsx39("div", { className: "absolute top-[10px] right-4 z-20", children: /* @__PURE__ */ jsxs37("div", { className: "relative group", children: [
7766
+ /* @__PURE__ */ jsx39(
7612
7767
  "button",
7613
7768
  {
7614
7769
  onClick: handleCopyToClipboard,
7615
7770
  className: `p-2.5 rounded-md shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] transition-all duration-150 ${copySuccess ? "bg-green-500 text-white scale-110" : "bg-[rgb(var(--ec-card-bg))] hover:bg-[rgb(var(--ec-page-border))/0.5] text-[rgb(var(--ec-icon-color))] hover:scale-105"}`,
7616
7771
  "aria-label": copySuccess ? "Copied!" : "Copy Mermaid code",
7617
- children: copySuccess ? /* @__PURE__ */ jsx38(CheckIcon2, { className: "h-5 w-5" }) : /* @__PURE__ */ jsx38(ClipboardIcon2, { className: "h-5 w-5" })
7772
+ children: copySuccess ? /* @__PURE__ */ jsx39(CheckIcon2, { className: "h-5 w-5" }) : /* @__PURE__ */ jsx39(ClipboardIcon2, { className: "h-5 w-5" })
7618
7773
  }
7619
7774
  ),
7620
- /* @__PURE__ */ jsx38("div", { className: "absolute top-full right-0 mt-2 px-2 py-1 bg-[rgb(var(--ec-page-text))] text-[rgb(var(--ec-page-bg))] text-xs rounded shadow-lg opacity-0 group-hover:opacity-100 transition-opacity whitespace-nowrap pointer-events-none z-50", children: copySuccess ? "Copied!" : "Copy Mermaid code" })
7775
+ /* @__PURE__ */ jsx39("div", { className: "absolute top-full right-0 mt-2 px-2 py-1 bg-[rgb(var(--ec-page-text))] text-[rgb(var(--ec-page-bg))] text-xs rounded shadow-lg opacity-0 group-hover:opacity-100 transition-opacity whitespace-nowrap pointer-events-none z-50", children: copySuccess ? "Copied!" : "Copy Mermaid code" })
7621
7776
  ] }) }),
7622
- /* @__PURE__ */ jsxs36("div", { className: "absolute inset-0 overflow-hidden", children: [
7623
- isRendering && /* @__PURE__ */ jsx38("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsxs36("div", { className: "relative", children: [
7624
- /* @__PURE__ */ jsxs36("div", { className: "flex items-center gap-4 opacity-40", children: [
7625
- /* @__PURE__ */ jsx38("div", { className: "w-24 h-10 bg-[rgb(var(--ec-page-border))] rounded animate-pulse" }),
7626
- /* @__PURE__ */ jsx38("div", { className: "w-12 h-0.5 bg-[rgb(var(--ec-page-border))] animate-pulse" }),
7627
- /* @__PURE__ */ jsx38(
7777
+ /* @__PURE__ */ jsxs37("div", { className: "absolute inset-0 overflow-hidden", children: [
7778
+ isRendering && /* @__PURE__ */ jsx39("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsxs37("div", { className: "relative", children: [
7779
+ /* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-4 opacity-40", children: [
7780
+ /* @__PURE__ */ jsx39("div", { className: "w-24 h-10 bg-[rgb(var(--ec-page-border))] rounded animate-pulse" }),
7781
+ /* @__PURE__ */ jsx39("div", { className: "w-12 h-0.5 bg-[rgb(var(--ec-page-border))] animate-pulse" }),
7782
+ /* @__PURE__ */ jsx39(
7628
7783
  "div",
7629
7784
  {
7630
7785
  className: "w-20 h-10 bg-[rgb(var(--ec-page-border))] rounded-full animate-pulse",
7631
7786
  style: { animationDelay: "75ms" }
7632
7787
  }
7633
7788
  ),
7634
- /* @__PURE__ */ jsx38(
7789
+ /* @__PURE__ */ jsx39(
7635
7790
  "div",
7636
7791
  {
7637
7792
  className: "w-12 h-0.5 bg-[rgb(var(--ec-page-border))] animate-pulse",
7638
7793
  style: { animationDelay: "150ms" }
7639
7794
  }
7640
7795
  ),
7641
- /* @__PURE__ */ jsx38(
7796
+ /* @__PURE__ */ jsx39(
7642
7797
  "div",
7643
7798
  {
7644
7799
  className: "w-24 h-10 bg-[rgb(var(--ec-page-border))] rounded animate-pulse",
@@ -7646,14 +7801,14 @@ var MermaidView = ({
7646
7801
  }
7647
7802
  )
7648
7803
  ] }),
7649
- /* @__PURE__ */ jsx38("p", { className: "text-center text-sm text-[rgb(var(--ec-page-text-muted))] mt-4", children: "Rendering diagram..." })
7804
+ /* @__PURE__ */ jsx39("p", { className: "text-center text-sm text-[rgb(var(--ec-page-text-muted))] mt-4", children: "Rendering diagram..." })
7650
7805
  ] }) }),
7651
- previewError && !isRendering && /* @__PURE__ */ jsxs36("div", { className: "w-full h-full flex flex-col items-center justify-center p-4", children: [
7652
- /* @__PURE__ */ jsx38("div", { className: "text-red-500 text-sm mb-2", children: "Failed to render diagram" }),
7653
- /* @__PURE__ */ jsx38("div", { className: "text-[rgb(var(--ec-page-text-muted))] text-xs font-mono bg-[rgb(var(--ec-code-bg))] p-2 rounded max-w-lg overflow-auto", children: previewError }),
7654
- /* @__PURE__ */ jsxs36("div", { className: "mt-4 text-sm text-[rgb(var(--ec-page-text-muted))]", children: [
7655
- /* @__PURE__ */ jsx38("p", { children: "You can still copy the Mermaid code and paste it into" }),
7656
- /* @__PURE__ */ jsx38(
7806
+ previewError && !isRendering && /* @__PURE__ */ jsxs37("div", { className: "w-full h-full flex flex-col items-center justify-center p-4", children: [
7807
+ /* @__PURE__ */ jsx39("div", { className: "text-red-500 text-sm mb-2", children: "Failed to render diagram" }),
7808
+ /* @__PURE__ */ jsx39("div", { className: "text-[rgb(var(--ec-page-text-muted))] text-xs font-mono bg-[rgb(var(--ec-code-bg))] p-2 rounded max-w-lg overflow-auto", children: previewError }),
7809
+ /* @__PURE__ */ jsxs37("div", { className: "mt-4 text-sm text-[rgb(var(--ec-page-text-muted))]", children: [
7810
+ /* @__PURE__ */ jsx39("p", { children: "You can still copy the Mermaid code and paste it into" }),
7811
+ /* @__PURE__ */ jsx39(
7657
7812
  "a",
7658
7813
  {
7659
7814
  href: "https://mermaid.live",
@@ -7665,7 +7820,7 @@ var MermaidView = ({
7665
7820
  )
7666
7821
  ] })
7667
7822
  ] }),
7668
- previewSvg && !isRendering && !previewError && /* @__PURE__ */ jsx38(
7823
+ previewSvg && !isRendering && !previewError && /* @__PURE__ */ jsx39(
7669
7824
  "div",
7670
7825
  {
7671
7826
  ref: svgContainerRef,
@@ -7674,15 +7829,15 @@ var MermaidView = ({
7674
7829
  }
7675
7830
  )
7676
7831
  ] }),
7677
- /* @__PURE__ */ jsx38("div", { className: "absolute bottom-4 left-4 z-20", children: /* @__PURE__ */ jsxs36("div", { className: "flex items-center gap-2 bg-[rgb(var(--ec-card-bg))]/90 backdrop-blur-sm px-3 py-1.5 rounded-md shadow-sm border border-[rgb(var(--ec-page-border))]", children: [
7678
- /* @__PURE__ */ jsx38(
7832
+ /* @__PURE__ */ jsx39("div", { className: "absolute bottom-4 left-4 z-20", children: /* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-2 bg-[rgb(var(--ec-card-bg))]/90 backdrop-blur-sm px-3 py-1.5 rounded-md shadow-sm border border-[rgb(var(--ec-page-border))]", children: [
7833
+ /* @__PURE__ */ jsx39(
7679
7834
  "svg",
7680
7835
  {
7681
7836
  className: "w-3.5 h-3.5 text-[rgb(var(--ec-icon-color))]",
7682
7837
  fill: "none",
7683
7838
  viewBox: "0 0 24 24",
7684
7839
  stroke: "currentColor",
7685
- children: /* @__PURE__ */ jsx38(
7840
+ children: /* @__PURE__ */ jsx39(
7686
7841
  "path",
7687
7842
  {
7688
7843
  strokeLinecap: "round",
@@ -7693,7 +7848,7 @@ var MermaidView = ({
7693
7848
  )
7694
7849
  }
7695
7850
  ),
7696
- /* @__PURE__ */ jsx38("span", { className: "text-xs text-[rgb(var(--ec-page-text-muted))]", children: "Scroll to zoom \xB7 Drag to pan" })
7851
+ /* @__PURE__ */ jsx39("span", { className: "text-xs text-[rgb(var(--ec-page-text-muted))]", children: "Scroll to zoom \xB7 Drag to pan" })
7697
7852
  ] }) })
7698
7853
  ]
7699
7854
  }
@@ -7918,14 +8073,14 @@ var useChannelVisibility = ({
7918
8073
  };
7919
8074
 
7920
8075
  // src/components/VisualizerDropdownContent.tsx
7921
- import { useState as useState12, memo as memo32 } from "react";
8076
+ import { useState as useState12, memo as memo33 } from "react";
7922
8077
  import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
7923
8078
  import {
7924
8079
  Code,
7925
8080
  Share2,
7926
8081
  Search as Search2,
7927
8082
  Grid3x3,
7928
- Maximize2 as Maximize22,
8083
+ Maximize2 as Maximize23,
7929
8084
  Map as Map2,
7930
8085
  Sparkles,
7931
8086
  Zap as Zap4,
@@ -7940,8 +8095,8 @@ import {
7940
8095
  DocumentArrowDownIcon,
7941
8096
  PresentationChartLineIcon
7942
8097
  } from "@heroicons/react/24/outline";
7943
- import { Fragment as Fragment8, jsx as jsx39, jsxs as jsxs37 } from "react/jsx-runtime";
7944
- var VisualizerDropdownContent = memo32(
8098
+ import { Fragment as Fragment9, jsx as jsx40, jsxs as jsxs38 } from "react/jsx-runtime";
8099
+ var VisualizerDropdownContent = memo33(
7945
8100
  ({
7946
8101
  isMermaidView,
7947
8102
  setIsMermaidView,
@@ -7990,19 +8145,19 @@ var VisualizerDropdownContent = memo32(
7990
8145
  setLayoutStatus("idle");
7991
8146
  }
7992
8147
  };
7993
- return /* @__PURE__ */ jsxs37(Fragment8, { children: [
7994
- /* @__PURE__ */ jsxs37(DropdownMenu.Sub, { children: [
7995
- /* @__PURE__ */ jsxs37(DropdownMenu.SubTrigger, { className: "flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2 outline-none", children: [
7996
- /* @__PURE__ */ jsx39(Grid3x3, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
7997
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Canvas" }),
7998
- /* @__PURE__ */ jsx39(
8148
+ return /* @__PURE__ */ jsxs38(Fragment9, { children: [
8149
+ /* @__PURE__ */ jsxs38(DropdownMenu.Sub, { children: [
8150
+ /* @__PURE__ */ jsxs38(DropdownMenu.SubTrigger, { className: "flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2 outline-none", children: [
8151
+ /* @__PURE__ */ jsx40(Grid3x3, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8152
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Canvas" }),
8153
+ /* @__PURE__ */ jsx40(
7999
8154
  "svg",
8000
8155
  {
8001
8156
  className: "w-3 h-3 text-[rgb(var(--ec-page-text-muted))]",
8002
8157
  fill: "none",
8003
8158
  viewBox: "0 0 24 24",
8004
8159
  stroke: "currentColor",
8005
- children: /* @__PURE__ */ jsx39(
8160
+ children: /* @__PURE__ */ jsx40(
8006
8161
  "path",
8007
8162
  {
8008
8163
  strokeLinecap: "round",
@@ -8014,27 +8169,27 @@ var VisualizerDropdownContent = memo32(
8014
8169
  }
8015
8170
  )
8016
8171
  ] }),
8017
- /* @__PURE__ */ jsx39(DropdownMenu.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs37(
8172
+ /* @__PURE__ */ jsx40(DropdownMenu.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs38(
8018
8173
  DropdownMenu.SubContent,
8019
8174
  {
8020
8175
  className: "min-w-[200px] bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-xl border border-[rgb(var(--ec-page-border))] py-1.5 z-[60]",
8021
8176
  sideOffset: 8,
8022
8177
  alignOffset: -8,
8023
8178
  children: [
8024
- /* @__PURE__ */ jsxs37(
8179
+ /* @__PURE__ */ jsxs38(
8025
8180
  DropdownMenu.CheckboxItem,
8026
8181
  {
8027
8182
  checked: isMermaidView,
8028
8183
  onCheckedChange: setIsMermaidView,
8029
8184
  className: "flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2",
8030
8185
  children: [
8031
- /* @__PURE__ */ jsx39(Code, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8032
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Render as mermaid" }),
8033
- /* @__PURE__ */ jsx39(
8186
+ /* @__PURE__ */ jsx40(Code, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8187
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Render as mermaid" }),
8188
+ /* @__PURE__ */ jsx40(
8034
8189
  "div",
8035
8190
  {
8036
8191
  className: `w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${isMermaidView ? "bg-[rgb(var(--ec-accent))]" : "bg-[rgb(var(--ec-page-border))]"}`,
8037
- children: /* @__PURE__ */ jsx39(
8192
+ children: /* @__PURE__ */ jsx40(
8038
8193
  "div",
8039
8194
  {
8040
8195
  className: `absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${isMermaidView ? "left-3.5" : "left-0.5"}`
@@ -8045,21 +8200,21 @@ var VisualizerDropdownContent = memo32(
8045
8200
  ]
8046
8201
  }
8047
8202
  ),
8048
- /* @__PURE__ */ jsx39(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8049
- /* @__PURE__ */ jsxs37(
8203
+ /* @__PURE__ */ jsx40(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8204
+ /* @__PURE__ */ jsxs38(
8050
8205
  DropdownMenu.CheckboxItem,
8051
8206
  {
8052
8207
  checked: animateMessages,
8053
8208
  onCheckedChange: toggleAnimateMessages,
8054
8209
  className: "flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2",
8055
8210
  children: [
8056
- /* @__PURE__ */ jsx39(Zap4, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8057
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Simulate Messages" }),
8058
- /* @__PURE__ */ jsx39(
8211
+ /* @__PURE__ */ jsx40(Zap4, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8212
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Simulate Messages" }),
8213
+ /* @__PURE__ */ jsx40(
8059
8214
  "div",
8060
8215
  {
8061
8216
  className: `w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${animateMessages ? "bg-[rgb(var(--ec-accent))]" : "bg-[rgb(var(--ec-page-border))]"}`,
8062
- children: /* @__PURE__ */ jsx39(
8217
+ children: /* @__PURE__ */ jsx40(
8063
8218
  "div",
8064
8219
  {
8065
8220
  className: `absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${animateMessages ? "left-3.5" : "left-0.5"}`
@@ -8070,20 +8225,20 @@ var VisualizerDropdownContent = memo32(
8070
8225
  ]
8071
8226
  }
8072
8227
  ),
8073
- hasChannels && /* @__PURE__ */ jsxs37(
8228
+ hasChannels && /* @__PURE__ */ jsxs38(
8074
8229
  DropdownMenu.CheckboxItem,
8075
8230
  {
8076
8231
  checked: hideChannels,
8077
8232
  onCheckedChange: toggleChannelsVisibility,
8078
8233
  className: "flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2",
8079
8234
  children: [
8080
- /* @__PURE__ */ jsx39(EyeOff, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8081
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Hide channels" }),
8082
- /* @__PURE__ */ jsx39(
8235
+ /* @__PURE__ */ jsx40(EyeOff, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8236
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Hide channels" }),
8237
+ /* @__PURE__ */ jsx40(
8083
8238
  "div",
8084
8239
  {
8085
8240
  className: `w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${hideChannels ? "bg-[rgb(var(--ec-accent))]" : "bg-[rgb(var(--ec-page-border))]"}`,
8086
- children: /* @__PURE__ */ jsx39(
8241
+ children: /* @__PURE__ */ jsx40(
8087
8242
  "div",
8088
8243
  {
8089
8244
  className: `absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${hideChannels ? "left-3.5" : "left-0.5"}`
@@ -8094,20 +8249,20 @@ var VisualizerDropdownContent = memo32(
8094
8249
  ]
8095
8250
  }
8096
8251
  ),
8097
- /* @__PURE__ */ jsxs37(
8252
+ /* @__PURE__ */ jsxs38(
8098
8253
  DropdownMenu.CheckboxItem,
8099
8254
  {
8100
8255
  checked: showMinimap,
8101
8256
  onCheckedChange: setShowMinimap,
8102
8257
  className: "flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2",
8103
8258
  children: [
8104
- /* @__PURE__ */ jsx39(Map2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8105
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Show minimap" }),
8106
- /* @__PURE__ */ jsx39(
8259
+ /* @__PURE__ */ jsx40(Map2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8260
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Show minimap" }),
8261
+ /* @__PURE__ */ jsx40(
8107
8262
  "div",
8108
8263
  {
8109
8264
  className: `w-7 h-4 rounded-full transition-all duration-200 flex-shrink-0 relative ${showMinimap ? "bg-[rgb(var(--ec-accent))]" : "bg-[rgb(var(--ec-page-border))]"}`,
8110
- children: /* @__PURE__ */ jsx39(
8265
+ children: /* @__PURE__ */ jsx40(
8111
8266
  "div",
8112
8267
  {
8113
8268
  className: `absolute top-0.5 w-3 h-3 rounded-full bg-white shadow-sm transition-all duration-200 ${showMinimap ? "left-3.5" : "left-0.5"}`
@@ -8118,19 +8273,19 @@ var VisualizerDropdownContent = memo32(
8118
8273
  ]
8119
8274
  }
8120
8275
  ),
8121
- /* @__PURE__ */ jsx39(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8122
- /* @__PURE__ */ jsxs37(
8276
+ /* @__PURE__ */ jsx40(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8277
+ /* @__PURE__ */ jsxs38(
8123
8278
  DropdownMenu.Item,
8124
8279
  {
8125
8280
  onClick: handleFitView,
8126
8281
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8127
8282
  children: [
8128
- /* @__PURE__ */ jsx39(Maximize22, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8129
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Fit to view" })
8283
+ /* @__PURE__ */ jsx40(Maximize23, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8284
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Fit to view" })
8130
8285
  ]
8131
8286
  }
8132
8287
  ),
8133
- /* @__PURE__ */ jsxs37(
8288
+ /* @__PURE__ */ jsxs38(
8134
8289
  DropdownMenu.Item,
8135
8290
  {
8136
8291
  onClick: () => {
@@ -8144,8 +8299,8 @@ var VisualizerDropdownContent = memo32(
8144
8299
  },
8145
8300
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8146
8301
  children: [
8147
- /* @__PURE__ */ jsx39(Search2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8148
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Find on canvas" })
8302
+ /* @__PURE__ */ jsx40(Search2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8303
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Find on canvas" })
8149
8304
  ]
8150
8305
  }
8151
8306
  )
@@ -8153,14 +8308,14 @@ var VisualizerDropdownContent = memo32(
8153
8308
  }
8154
8309
  ) })
8155
8310
  ] }),
8156
- notesCount > 0 && onOpenNotes && /* @__PURE__ */ jsxs37(
8311
+ notesCount > 0 && onOpenNotes && /* @__PURE__ */ jsxs38(
8157
8312
  DropdownMenu.Item,
8158
8313
  {
8159
8314
  onClick: onOpenNotes,
8160
8315
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8161
8316
  children: [
8162
- /* @__PURE__ */ jsx39(MessageCircle2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8163
- /* @__PURE__ */ jsxs37("span", { className: "flex-1 font-normal", children: [
8317
+ /* @__PURE__ */ jsx40(MessageCircle2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8318
+ /* @__PURE__ */ jsxs38("span", { className: "flex-1 font-normal", children: [
8164
8319
  "View notes (",
8165
8320
  notesCount,
8166
8321
  ")"
@@ -8168,19 +8323,19 @@ var VisualizerDropdownContent = memo32(
8168
8323
  ]
8169
8324
  }
8170
8325
  ),
8171
- isDevMode && onSaveLayout && /* @__PURE__ */ jsxs37(DropdownMenu.Sub, { children: [
8172
- /* @__PURE__ */ jsxs37(DropdownMenu.SubTrigger, { className: "flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2 outline-none", children: [
8173
- /* @__PURE__ */ jsx39(Save, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8174
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Layout" }),
8175
- /* @__PURE__ */ jsx39("span", { className: "text-[10px] text-amber-600 font-medium", children: "DEV" }),
8176
- /* @__PURE__ */ jsx39(
8326
+ isDevMode && onSaveLayout && /* @__PURE__ */ jsxs38(DropdownMenu.Sub, { children: [
8327
+ /* @__PURE__ */ jsxs38(DropdownMenu.SubTrigger, { className: "flex items-center px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer transition-colors gap-2 outline-none", children: [
8328
+ /* @__PURE__ */ jsx40(Save, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8329
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Layout" }),
8330
+ /* @__PURE__ */ jsx40("span", { className: "text-[10px] text-amber-600 font-medium", children: "DEV" }),
8331
+ /* @__PURE__ */ jsx40(
8177
8332
  "svg",
8178
8333
  {
8179
8334
  className: "w-3 h-3 text-[rgb(var(--ec-page-text-muted))]",
8180
8335
  fill: "none",
8181
8336
  viewBox: "0 0 24 24",
8182
8337
  stroke: "currentColor",
8183
- children: /* @__PURE__ */ jsx39(
8338
+ children: /* @__PURE__ */ jsx40(
8184
8339
  "path",
8185
8340
  {
8186
8341
  strokeLinecap: "round",
@@ -8192,34 +8347,34 @@ var VisualizerDropdownContent = memo32(
8192
8347
  }
8193
8348
  )
8194
8349
  ] }),
8195
- /* @__PURE__ */ jsx39(DropdownMenu.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs37(
8350
+ /* @__PURE__ */ jsx40(DropdownMenu.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs38(
8196
8351
  DropdownMenu.SubContent,
8197
8352
  {
8198
8353
  className: "min-w-[180px] bg-[rgb(var(--ec-card-bg))] rounded-lg shadow-xl border border-[rgb(var(--ec-page-border))] py-1.5 z-[60]",
8199
8354
  sideOffset: 8,
8200
8355
  alignOffset: -8,
8201
8356
  children: [
8202
- /* @__PURE__ */ jsxs37(
8357
+ /* @__PURE__ */ jsxs38(
8203
8358
  DropdownMenu.Item,
8204
8359
  {
8205
8360
  onClick: handleSaveLayout,
8206
8361
  disabled: layoutStatus !== "idle",
8207
8362
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
8208
8363
  children: [
8209
- layoutStatus === "saving" ? /* @__PURE__ */ jsx39(Loader2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 animate-spin" }) : /* @__PURE__ */ jsx39(Save, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8210
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: layoutStatus === "saving" ? "Saving..." : "Save Layout" })
8364
+ layoutStatus === "saving" ? /* @__PURE__ */ jsx40(Loader2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 animate-spin" }) : /* @__PURE__ */ jsx40(Save, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8365
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: layoutStatus === "saving" ? "Saving..." : "Save Layout" })
8211
8366
  ]
8212
8367
  }
8213
8368
  ),
8214
- /* @__PURE__ */ jsxs37(
8369
+ /* @__PURE__ */ jsxs38(
8215
8370
  DropdownMenu.Item,
8216
8371
  {
8217
8372
  onClick: handleResetLayout,
8218
8373
  disabled: layoutStatus !== "idle",
8219
8374
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
8220
8375
  children: [
8221
- layoutStatus === "resetting" ? /* @__PURE__ */ jsx39(Loader2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 animate-spin" }) : /* @__PURE__ */ jsx39(RotateCcw, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8222
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: layoutStatus === "resetting" ? "Resetting..." : "Reset Layout" })
8376
+ layoutStatus === "resetting" ? /* @__PURE__ */ jsx40(Loader2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 animate-spin" }) : /* @__PURE__ */ jsx40(RotateCcw, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8377
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: layoutStatus === "resetting" ? "Resetting..." : "Reset Layout" })
8223
8378
  ]
8224
8379
  }
8225
8380
  )
@@ -8227,75 +8382,75 @@ var VisualizerDropdownContent = memo32(
8227
8382
  }
8228
8383
  ) })
8229
8384
  ] }),
8230
- isChatEnabled && /* @__PURE__ */ jsxs37(Fragment8, { children: [
8231
- /* @__PURE__ */ jsx39(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8232
- /* @__PURE__ */ jsxs37(
8385
+ isChatEnabled && /* @__PURE__ */ jsxs38(Fragment9, { children: [
8386
+ /* @__PURE__ */ jsx40(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8387
+ /* @__PURE__ */ jsxs38(
8233
8388
  DropdownMenu.Item,
8234
8389
  {
8235
8390
  onClick: openChat,
8236
8391
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8237
8392
  children: [
8238
- /* @__PURE__ */ jsx39(Sparkles, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8239
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Ask a question" })
8393
+ /* @__PURE__ */ jsx40(Sparkles, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8394
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Ask a question" })
8240
8395
  ]
8241
8396
  }
8242
8397
  )
8243
8398
  ] }),
8244
- /* @__PURE__ */ jsx39(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8245
- /* @__PURE__ */ jsxs37(
8399
+ /* @__PURE__ */ jsx40(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8400
+ /* @__PURE__ */ jsxs38(
8246
8401
  DropdownMenu.Item,
8247
8402
  {
8248
8403
  onClick: handleCopyArchitectureCode,
8249
8404
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8250
8405
  children: [
8251
- /* @__PURE__ */ jsx39(Code, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8252
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Copy as mermaid" })
8406
+ /* @__PURE__ */ jsx40(Code, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8407
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Copy as mermaid" })
8253
8408
  ]
8254
8409
  }
8255
8410
  ),
8256
- /* @__PURE__ */ jsxs37(
8411
+ /* @__PURE__ */ jsxs38(
8257
8412
  DropdownMenu.Item,
8258
8413
  {
8259
8414
  onClick: handleExportVisual,
8260
8415
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8261
8416
  children: [
8262
- /* @__PURE__ */ jsx39(DocumentArrowDownIcon, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8263
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Export image" })
8417
+ /* @__PURE__ */ jsx40(DocumentArrowDownIcon, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8418
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Export image" })
8264
8419
  ]
8265
8420
  }
8266
8421
  ),
8267
- /* @__PURE__ */ jsxs37(
8422
+ /* @__PURE__ */ jsxs38(
8268
8423
  DropdownMenu.Item,
8269
8424
  {
8270
8425
  onClick: () => setIsShareModalOpen(true),
8271
8426
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8272
8427
  children: [
8273
- /* @__PURE__ */ jsx39(Share2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8274
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Share Link" })
8428
+ /* @__PURE__ */ jsx40(Share2, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8429
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Share Link" })
8275
8430
  ]
8276
8431
  }
8277
8432
  ),
8278
- /* @__PURE__ */ jsx39(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8279
- /* @__PURE__ */ jsxs37(
8433
+ /* @__PURE__ */ jsx40(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8434
+ /* @__PURE__ */ jsxs38(
8280
8435
  DropdownMenu.Item,
8281
8436
  {
8282
8437
  onClick: toggleFullScreen,
8283
8438
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8284
8439
  children: [
8285
- /* @__PURE__ */ jsx39(PresentationChartLineIcon, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8286
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Start Presentation" })
8440
+ /* @__PURE__ */ jsx40(PresentationChartLineIcon, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8441
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Start Presentation" })
8287
8442
  ]
8288
8443
  }
8289
8444
  ),
8290
- /* @__PURE__ */ jsx39(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8291
- /* @__PURE__ */ jsxs37(
8445
+ /* @__PURE__ */ jsx40(DropdownMenu.Separator, { className: "my-1 h-px bg-[rgb(var(--ec-page-border))]" }),
8446
+ /* @__PURE__ */ jsxs38(
8292
8447
  DropdownMenu.Item,
8293
8448
  {
8294
8449
  onClick: openStudioModal,
8295
8450
  className: "px-3 py-2 text-xs text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-accent-subtle)/0.3)] cursor-pointer flex items-center gap-2 transition-colors",
8296
8451
  children: [
8297
- /* @__PURE__ */ jsx39(ExternalLink, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8298
- /* @__PURE__ */ jsx39("span", { className: "flex-1 font-normal", children: "Open in EventCatalog Studio" })
8452
+ /* @__PURE__ */ jsx40(ExternalLink, { className: "w-3.5 h-3.5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0" }),
8453
+ /* @__PURE__ */ jsx40("span", { className: "flex-1 font-normal", children: "Open in EventCatalog Studio" })
8299
8454
  ]
8300
8455
  }
8301
8456
  )
@@ -8306,30 +8461,30 @@ VisualizerDropdownContent.displayName = "VisualizerDropdownContent";
8306
8461
  var VisualizerDropdownContent_default = VisualizerDropdownContent;
8307
8462
 
8308
8463
  // src/components/NodeContextMenu.tsx
8309
- import { memo as memo33 } from "react";
8464
+ import { memo as memo34 } from "react";
8310
8465
  import * as ContextMenu5 from "@radix-ui/react-context-menu";
8311
- import { Fragment as Fragment9, jsx as jsx40, jsxs as jsxs38 } from "react/jsx-runtime";
8312
- var NodeContextMenu_default = memo33(function NodeContextMenu({
8466
+ import { Fragment as Fragment10, jsx as jsx41, jsxs as jsxs39 } from "react/jsx-runtime";
8467
+ var NodeContextMenu_default = memo34(function NodeContextMenu({
8313
8468
  items,
8314
8469
  children
8315
8470
  }) {
8316
8471
  const portalContainer = usePortalContainer();
8317
- if (!items || items.length === 0) return /* @__PURE__ */ jsx40(Fragment9, { children });
8318
- return /* @__PURE__ */ jsxs38(ContextMenu5.Root, { children: [
8319
- /* @__PURE__ */ jsx40(ContextMenu5.Trigger, { children }),
8320
- /* @__PURE__ */ jsx40(ContextMenu5.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx40(
8472
+ if (!items || items.length === 0) return /* @__PURE__ */ jsx41(Fragment10, { children });
8473
+ return /* @__PURE__ */ jsxs39(ContextMenu5.Root, { children: [
8474
+ /* @__PURE__ */ jsx41(ContextMenu5.Trigger, { children }),
8475
+ /* @__PURE__ */ jsx41(ContextMenu5.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx41(
8321
8476
  ContextMenu5.Content,
8322
8477
  {
8323
8478
  className: "min-w-[220px] bg-white rounded-md p-1 shadow-md border border-gray-200 z-50",
8324
8479
  onClick: (e) => e.stopPropagation(),
8325
- children: items.map((item, index) => /* @__PURE__ */ jsxs38("div", { children: [
8326
- item.separator && index > 0 && /* @__PURE__ */ jsx40(ContextMenu5.Separator, { className: "h-[1px] bg-gray-200 m-1" }),
8327
- /* @__PURE__ */ jsx40(
8480
+ children: items.map((item, index) => /* @__PURE__ */ jsxs39("div", { children: [
8481
+ item.separator && index > 0 && /* @__PURE__ */ jsx41(ContextMenu5.Separator, { className: "h-[1px] bg-gray-200 m-1" }),
8482
+ /* @__PURE__ */ jsx41(
8328
8483
  ContextMenu5.Item,
8329
8484
  {
8330
8485
  asChild: true,
8331
- className: "text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center",
8332
- children: /* @__PURE__ */ jsx40(
8486
+ className: "text-sm px-2 py-1.5 outline-none cursor-pointer hover:bg-orange-100 rounded-sm flex items-center text-gray-900 hover:text-gray-900 visited:text-gray-900 no-underline hover:no-underline visited:no-underline",
8487
+ children: /* @__PURE__ */ jsx41(
8333
8488
  "a",
8334
8489
  {
8335
8490
  href: item.href,
@@ -8859,7 +9014,7 @@ import {
8859
9014
  } from "lucide-react";
8860
9015
  import { useReactFlow as useReactFlow4 } from "@xyflow/react";
8861
9016
  import * as Dialog4 from "@radix-ui/react-dialog";
8862
- import { Fragment as Fragment10, jsx as jsx41, jsxs as jsxs39 } from "react/jsx-runtime";
9017
+ import { Fragment as Fragment11, jsx as jsx42, jsxs as jsxs40 } from "react/jsx-runtime";
8863
9018
  var NODE_TYPE_META = {
8864
9019
  service: { icon: ServerIcon2, color: "#ec4899", label: "Service" },
8865
9020
  services: { icon: ServerIcon2, color: "#ec4899", label: "Service" },
@@ -8965,7 +9120,7 @@ function hashStr2(s) {
8965
9120
  function Avatar2({ name, size = 28 }) {
8966
9121
  const initials = name.split(/\s+/).map((w) => w[0]).join("").toUpperCase().slice(0, 2);
8967
9122
  const [c1, c2] = AVATAR_PALETTES2[hashStr2(name) % AVATAR_PALETTES2.length];
8968
- return /* @__PURE__ */ jsx41(
9123
+ return /* @__PURE__ */ jsx42(
8969
9124
  "div",
8970
9125
  {
8971
9126
  style: {
@@ -8978,7 +9133,7 @@ function Avatar2({ name, size = 28 }) {
8978
9133
  justifyContent: "center",
8979
9134
  flexShrink: 0
8980
9135
  },
8981
- children: /* @__PURE__ */ jsx41(
9136
+ children: /* @__PURE__ */ jsx42(
8982
9137
  "span",
8983
9138
  {
8984
9139
  style: {
@@ -8997,7 +9152,7 @@ function PriorityBadge({ priority }) {
8997
9152
  const p = PRIORITY2[priority.toLowerCase()];
8998
9153
  if (!p) return null;
8999
9154
  const isUrgent = priority === "high" || priority === "critical";
9000
- return /* @__PURE__ */ jsxs39(
9155
+ return /* @__PURE__ */ jsxs40(
9001
9156
  "span",
9002
9157
  {
9003
9158
  style: {
@@ -9016,7 +9171,7 @@ function PriorityBadge({ priority }) {
9016
9171
  lineHeight: 1.4
9017
9172
  },
9018
9173
  children: [
9019
- isUrgent && /* @__PURE__ */ jsx41(AlertTriangle2, { style: { width: 9, height: 9 }, strokeWidth: 2.5 }),
9174
+ isUrgent && /* @__PURE__ */ jsx42(AlertTriangle2, { style: { width: 9, height: 9 }, strokeWidth: 2.5 }),
9020
9175
  p.label
9021
9176
  ]
9022
9177
  }
@@ -9024,7 +9179,7 @@ function PriorityBadge({ priority }) {
9024
9179
  }
9025
9180
  function NoteCard2({ note, index }) {
9026
9181
  const prioStyle = note.priority ? PRIORITY2[note.priority.toLowerCase()] : null;
9027
- return /* @__PURE__ */ jsxs39(
9182
+ return /* @__PURE__ */ jsxs40(
9028
9183
  "div",
9029
9184
  {
9030
9185
  style: {
@@ -9036,7 +9191,7 @@ function NoteCard2({ note, index }) {
9036
9191
  boxShadow: "0 1px 3px rgba(0,0,0,0.04)"
9037
9192
  },
9038
9193
  children: [
9039
- prioStyle && /* @__PURE__ */ jsx41(
9194
+ prioStyle && /* @__PURE__ */ jsx42(
9040
9195
  "div",
9041
9196
  {
9042
9197
  style: {
@@ -9050,7 +9205,7 @@ function NoteCard2({ note, index }) {
9050
9205
  }
9051
9206
  }
9052
9207
  ),
9053
- /* @__PURE__ */ jsxs39(
9208
+ /* @__PURE__ */ jsxs40(
9054
9209
  "div",
9055
9210
  {
9056
9211
  style: {
@@ -9060,7 +9215,7 @@ function NoteCard2({ note, index }) {
9060
9215
  marginBottom: 8
9061
9216
  },
9062
9217
  children: [
9063
- note.author ? /* @__PURE__ */ jsx41(Avatar2, { name: note.author, size: 24 }) : /* @__PURE__ */ jsx41(
9218
+ note.author ? /* @__PURE__ */ jsx42(Avatar2, { name: note.author, size: 24 }) : /* @__PURE__ */ jsx42(
9064
9219
  "div",
9065
9220
  {
9066
9221
  style: {
@@ -9074,10 +9229,10 @@ function NoteCard2({ note, index }) {
9074
9229
  justifyContent: "center",
9075
9230
  flexShrink: 0
9076
9231
  },
9077
- children: /* @__PURE__ */ jsx41("span", { style: { fontSize: 10, fontWeight: 700, color: AMBER2[700] }, children: index + 1 })
9232
+ children: /* @__PURE__ */ jsx42("span", { style: { fontSize: 10, fontWeight: 700, color: AMBER2[700] }, children: index + 1 })
9078
9233
  }
9079
9234
  ),
9080
- /* @__PURE__ */ jsx41("div", { style: { flex: 1, minWidth: 0 }, children: note.author && /* @__PURE__ */ jsx41(
9235
+ /* @__PURE__ */ jsx42("div", { style: { flex: 1, minWidth: 0 }, children: note.author && /* @__PURE__ */ jsx42(
9081
9236
  "span",
9082
9237
  {
9083
9238
  style: {
@@ -9089,11 +9244,11 @@ function NoteCard2({ note, index }) {
9089
9244
  children: note.author
9090
9245
  }
9091
9246
  ) }),
9092
- note.priority && /* @__PURE__ */ jsx41(PriorityBadge, { priority: note.priority })
9247
+ note.priority && /* @__PURE__ */ jsx42(PriorityBadge, { priority: note.priority })
9093
9248
  ]
9094
9249
  }
9095
9250
  ),
9096
- /* @__PURE__ */ jsx41(
9251
+ /* @__PURE__ */ jsx42(
9097
9252
  "p",
9098
9253
  {
9099
9254
  style: {
@@ -9137,7 +9292,7 @@ function AllNotesModal({
9137
9292
  [nodes, setCenter, getZoom, onClose]
9138
9293
  );
9139
9294
  if (totalNotes === 0) return null;
9140
- return /* @__PURE__ */ jsx41(
9295
+ return /* @__PURE__ */ jsx42(
9141
9296
  Dialog4.Root,
9142
9297
  {
9143
9298
  open: isOpen,
@@ -9147,13 +9302,13 @@ function AllNotesModal({
9147
9302
  setSelectedIdx(0);
9148
9303
  }
9149
9304
  },
9150
- children: /* @__PURE__ */ jsx41(Dialog4.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs39(
9305
+ children: /* @__PURE__ */ jsx42(Dialog4.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs40(
9151
9306
  "div",
9152
9307
  {
9153
9308
  className: "fixed inset-0 z-[99999]",
9154
9309
  style: { isolation: "isolate" },
9155
9310
  children: [
9156
- /* @__PURE__ */ jsx41(
9311
+ /* @__PURE__ */ jsx42(
9157
9312
  Dialog4.Overlay,
9158
9313
  {
9159
9314
  style: {
@@ -9164,7 +9319,7 @@ function AllNotesModal({
9164
9319
  }
9165
9320
  }
9166
9321
  ),
9167
- /* @__PURE__ */ jsxs39(
9322
+ /* @__PURE__ */ jsxs40(
9168
9323
  Dialog4.Content,
9169
9324
  {
9170
9325
  style: {
@@ -9185,7 +9340,7 @@ function AllNotesModal({
9185
9340
  outline: "none"
9186
9341
  },
9187
9342
  children: [
9188
- /* @__PURE__ */ jsxs39(
9343
+ /* @__PURE__ */ jsxs40(
9189
9344
  "div",
9190
9345
  {
9191
9346
  style: {
@@ -9197,7 +9352,7 @@ function AllNotesModal({
9197
9352
  flexShrink: 0
9198
9353
  },
9199
9354
  children: [
9200
- /* @__PURE__ */ jsx41(
9355
+ /* @__PURE__ */ jsx42(
9201
9356
  "div",
9202
9357
  {
9203
9358
  style: {
@@ -9210,7 +9365,7 @@ function AllNotesModal({
9210
9365
  justifyContent: "center",
9211
9366
  flexShrink: 0
9212
9367
  },
9213
- children: /* @__PURE__ */ jsx41(
9368
+ children: /* @__PURE__ */ jsx42(
9214
9369
  MessageCircle3,
9215
9370
  {
9216
9371
  style: { width: 16, height: 16, color: "#64748b" },
@@ -9219,8 +9374,8 @@ function AllNotesModal({
9219
9374
  )
9220
9375
  }
9221
9376
  ),
9222
- /* @__PURE__ */ jsxs39("div", { style: { flex: 1, minWidth: 0 }, children: [
9223
- /* @__PURE__ */ jsx41(
9377
+ /* @__PURE__ */ jsxs40("div", { style: { flex: 1, minWidth: 0 }, children: [
9378
+ /* @__PURE__ */ jsx42(
9224
9379
  Dialog4.Title,
9225
9380
  {
9226
9381
  style: {
@@ -9233,7 +9388,7 @@ function AllNotesModal({
9233
9388
  children: "Notes"
9234
9389
  }
9235
9390
  ),
9236
- /* @__PURE__ */ jsxs39(
9391
+ /* @__PURE__ */ jsxs40(
9237
9392
  Dialog4.Description,
9238
9393
  {
9239
9394
  style: {
@@ -9255,7 +9410,7 @@ function AllNotesModal({
9255
9410
  }
9256
9411
  )
9257
9412
  ] }),
9258
- /* @__PURE__ */ jsx41(Dialog4.Close, { asChild: true, children: /* @__PURE__ */ jsx41(
9413
+ /* @__PURE__ */ jsx42(Dialog4.Close, { asChild: true, children: /* @__PURE__ */ jsx42(
9259
9414
  "button",
9260
9415
  {
9261
9416
  style: {
@@ -9272,14 +9427,14 @@ function AllNotesModal({
9272
9427
  flexShrink: 0
9273
9428
  },
9274
9429
  "aria-label": "Close",
9275
- children: /* @__PURE__ */ jsx41(X, { style: { width: 15, height: 15 } })
9430
+ children: /* @__PURE__ */ jsx42(X, { style: { width: 15, height: 15 } })
9276
9431
  }
9277
9432
  ) })
9278
9433
  ]
9279
9434
  }
9280
9435
  ),
9281
- /* @__PURE__ */ jsxs39("div", { style: { display: "flex", flex: 1, overflow: "hidden" }, children: [
9282
- /* @__PURE__ */ jsx41(
9436
+ /* @__PURE__ */ jsxs40("div", { style: { display: "flex", flex: 1, overflow: "hidden" }, children: [
9437
+ /* @__PURE__ */ jsx42(
9283
9438
  "div",
9284
9439
  {
9285
9440
  style: {
@@ -9294,7 +9449,7 @@ function AllNotesModal({
9294
9449
  const meta = getNodeMeta(group.nodeType);
9295
9450
  const IconComp = meta?.icon || MessageCircle3;
9296
9451
  const iconColor = meta?.color || "#64748b";
9297
- return /* @__PURE__ */ jsxs39(
9452
+ return /* @__PURE__ */ jsxs40(
9298
9453
  "button",
9299
9454
  {
9300
9455
  onClick: () => setSelectedIdx(i),
@@ -9313,7 +9468,7 @@ function AllNotesModal({
9313
9468
  transition: "background 0.1s"
9314
9469
  },
9315
9470
  children: [
9316
- /* @__PURE__ */ jsx41(
9471
+ /* @__PURE__ */ jsx42(
9317
9472
  "div",
9318
9473
  {
9319
9474
  style: {
@@ -9327,7 +9482,7 @@ function AllNotesModal({
9327
9482
  flexShrink: 0,
9328
9483
  transition: "background 0.15s"
9329
9484
  },
9330
- children: /* @__PURE__ */ jsx41(
9485
+ children: /* @__PURE__ */ jsx42(
9331
9486
  IconComp,
9332
9487
  {
9333
9488
  style: {
@@ -9341,8 +9496,8 @@ function AllNotesModal({
9341
9496
  )
9342
9497
  }
9343
9498
  ),
9344
- /* @__PURE__ */ jsxs39("div", { style: { flex: 1, minWidth: 0 }, children: [
9345
- /* @__PURE__ */ jsx41(
9499
+ /* @__PURE__ */ jsxs40("div", { style: { flex: 1, minWidth: 0 }, children: [
9500
+ /* @__PURE__ */ jsx42(
9346
9501
  "div",
9347
9502
  {
9348
9503
  style: {
@@ -9357,7 +9512,7 @@ function AllNotesModal({
9357
9512
  children: group.name
9358
9513
  }
9359
9514
  ),
9360
- /* @__PURE__ */ jsxs39(
9515
+ /* @__PURE__ */ jsxs40(
9361
9516
  "div",
9362
9517
  {
9363
9518
  style: {
@@ -9380,7 +9535,7 @@ function AllNotesModal({
9380
9535
  }
9381
9536
  )
9382
9537
  ] }),
9383
- /* @__PURE__ */ jsx41(
9538
+ /* @__PURE__ */ jsx42(
9384
9539
  ChevronRight,
9385
9540
  {
9386
9541
  style: {
@@ -9399,7 +9554,7 @@ function AllNotesModal({
9399
9554
  })
9400
9555
  }
9401
9556
  ),
9402
- /* @__PURE__ */ jsx41(
9557
+ /* @__PURE__ */ jsx42(
9403
9558
  "div",
9404
9559
  {
9405
9560
  style: {
@@ -9408,8 +9563,8 @@ function AllNotesModal({
9408
9563
  display: "flex",
9409
9564
  flexDirection: "column"
9410
9565
  },
9411
- children: selected && /* @__PURE__ */ jsxs39(Fragment10, { children: [
9412
- /* @__PURE__ */ jsxs39(
9566
+ children: selected && /* @__PURE__ */ jsxs40(Fragment11, { children: [
9567
+ /* @__PURE__ */ jsxs40(
9413
9568
  "div",
9414
9569
  {
9415
9570
  style: {
@@ -9422,7 +9577,7 @@ function AllNotesModal({
9422
9577
  background: "#fafbfc"
9423
9578
  },
9424
9579
  children: [
9425
- /* @__PURE__ */ jsxs39(
9580
+ /* @__PURE__ */ jsxs40(
9426
9581
  "div",
9427
9582
  {
9428
9583
  style: {
@@ -9435,7 +9590,7 @@ function AllNotesModal({
9435
9590
  const meta = getNodeMeta(selected.nodeType);
9436
9591
  const Icon = meta?.icon || MessageCircle3;
9437
9592
  const color = meta?.color || "#64748b";
9438
- return /* @__PURE__ */ jsx41(
9593
+ return /* @__PURE__ */ jsx42(
9439
9594
  "div",
9440
9595
  {
9441
9596
  style: {
@@ -9448,7 +9603,7 @@ function AllNotesModal({
9448
9603
  justifyContent: "center",
9449
9604
  flexShrink: 0
9450
9605
  },
9451
- children: /* @__PURE__ */ jsx41(
9606
+ children: /* @__PURE__ */ jsx42(
9452
9607
  Icon,
9453
9608
  {
9454
9609
  style: {
@@ -9462,8 +9617,8 @@ function AllNotesModal({
9462
9617
  }
9463
9618
  );
9464
9619
  })(),
9465
- /* @__PURE__ */ jsxs39("div", { children: [
9466
- /* @__PURE__ */ jsx41(
9620
+ /* @__PURE__ */ jsxs40("div", { children: [
9621
+ /* @__PURE__ */ jsx42(
9467
9622
  "div",
9468
9623
  {
9469
9624
  style: {
@@ -9475,7 +9630,7 @@ function AllNotesModal({
9475
9630
  children: selected.name
9476
9631
  }
9477
9632
  ),
9478
- /* @__PURE__ */ jsxs39(
9633
+ /* @__PURE__ */ jsxs40(
9479
9634
  "div",
9480
9635
  {
9481
9636
  style: {
@@ -9497,7 +9652,7 @@ function AllNotesModal({
9497
9652
  ]
9498
9653
  }
9499
9654
  ),
9500
- /* @__PURE__ */ jsxs39(
9655
+ /* @__PURE__ */ jsxs40(
9501
9656
  "button",
9502
9657
  {
9503
9658
  onClick: () => handleNavigate(selected.nodeId),
@@ -9524,7 +9679,7 @@ function AllNotesModal({
9524
9679
  e.currentTarget.style.color = "#475569";
9525
9680
  },
9526
9681
  children: [
9527
- /* @__PURE__ */ jsx41(Locate, { style: { width: 12, height: 12 } }),
9682
+ /* @__PURE__ */ jsx42(Locate, { style: { width: 12, height: 12 } }),
9528
9683
  "Find on canvas"
9529
9684
  ]
9530
9685
  }
@@ -9532,7 +9687,7 @@ function AllNotesModal({
9532
9687
  ]
9533
9688
  }
9534
9689
  ),
9535
- /* @__PURE__ */ jsx41(
9690
+ /* @__PURE__ */ jsx42(
9536
9691
  "div",
9537
9692
  {
9538
9693
  style: {
@@ -9543,7 +9698,7 @@ function AllNotesModal({
9543
9698
  flexDirection: "column",
9544
9699
  gap: 10
9545
9700
  },
9546
- children: selected.notes.map((note, i) => /* @__PURE__ */ jsx41(NoteCard2, { note, index: i }, i))
9701
+ children: selected.notes.map((note, i) => /* @__PURE__ */ jsx42(NoteCard2, { note, index: i }, i))
9547
9702
  }
9548
9703
  )
9549
9704
  ] })
@@ -9562,7 +9717,7 @@ function AllNotesModal({
9562
9717
 
9563
9718
  // src/components/NodeGraph.tsx
9564
9719
  import dagre3 from "dagre";
9565
- import { Fragment as Fragment11, jsx as jsx42, jsxs as jsxs40 } from "react/jsx-runtime";
9720
+ import { Fragment as Fragment12, jsx as jsx43, jsxs as jsxs41 } from "react/jsx-runtime";
9566
9721
  var POSITION_CHANGE_THRESHOLD = 1;
9567
9722
  var LARGE_GRAPH_NODE_THRESHOLD = 30;
9568
9723
  var NODE_ORIGIN = [0.1, 0.1];
@@ -9573,29 +9728,34 @@ var MINIMAP_STYLE = {
9573
9728
  };
9574
9729
  var LAYOUT_CHANGE_PANEL_STYLE_WITH_WALKTHROUGH = {
9575
9730
  marginBottom: "20px",
9576
- marginLeft: "410px"
9731
+ marginLeft: "420px"
9577
9732
  };
9578
9733
  var LAYOUT_CHANGE_PANEL_STYLE_DEFAULT = { marginLeft: "60px" };
9579
9734
  var LEGEND_PANEL_STYLE_WITH_MINIMAP = { marginRight: "230px" };
9580
- var LegendPanel = memo34(function LegendPanel2({
9735
+ var EXPANDED_WRAPPER_TYPES = /* @__PURE__ */ new Set([
9736
+ "flowExpanded",
9737
+ "messageGroupExpanded"
9738
+ ]);
9739
+ var isExpandedWrapper = (type) => type != null && EXPANDED_WRAPPER_TYPES.has(type);
9740
+ var LegendPanel = memo35(function LegendPanel2({
9581
9741
  legend,
9582
9742
  showMinimap,
9583
9743
  onLegendClick
9584
9744
  }) {
9585
- return /* @__PURE__ */ jsx42(
9745
+ return /* @__PURE__ */ jsx43(
9586
9746
  Panel,
9587
9747
  {
9588
9748
  position: "bottom-right",
9589
9749
  style: showMinimap ? LEGEND_PANEL_STYLE_WITH_MINIMAP : void 0,
9590
- children: /* @__PURE__ */ jsx42("div", { className: "bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] font-light px-4 text-[12px] shadow-md py-1 rounded-md", children: /* @__PURE__ */ jsx42("ul", { className: "m-0 p-0 ", children: Object.entries(legend).map(
9591
- ([key, { count, colorClass, groupId }]) => /* @__PURE__ */ jsxs40(
9750
+ children: /* @__PURE__ */ jsx43("div", { className: "bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] font-light px-4 text-[12px] shadow-md py-1 rounded-md", children: /* @__PURE__ */ jsx43("ul", { className: "m-0 p-0 ", children: Object.entries(legend).map(
9751
+ ([key, { count, colorClass, groupId }]) => /* @__PURE__ */ jsxs41(
9592
9752
  "li",
9593
9753
  {
9594
9754
  className: "flex space-x-2 items-center text-[10px] cursor-pointer text-[rgb(var(--ec-page-text))] hover:text-[rgb(var(--ec-accent))] hover:underline",
9595
9755
  onClick: () => onLegendClick(key, groupId),
9596
9756
  children: [
9597
- /* @__PURE__ */ jsx42("span", { className: `w-2 h-2 block ${colorClass}` }),
9598
- /* @__PURE__ */ jsxs40("span", { className: "block capitalize", children: [
9757
+ /* @__PURE__ */ jsx43("span", { className: `w-2 h-2 block ${colorClass}` }),
9758
+ /* @__PURE__ */ jsxs41("span", { className: "block capitalize", children: [
9599
9759
  key,
9600
9760
  " (",
9601
9761
  count,
@@ -9717,10 +9877,10 @@ var NodeGraphBuilder = ({
9717
9877
  }, []);
9718
9878
  const nodeTypes = useMemo18(() => {
9719
9879
  const wrapWithContextMenu = (Component) => {
9720
- const Wrapped = memo34((props) => {
9880
+ const Wrapped = memo35((props) => {
9721
9881
  const items = props.data?.contextMenu;
9722
- if (!items?.length) return /* @__PURE__ */ jsx42(Component, { ...props });
9723
- return /* @__PURE__ */ jsx42(NodeContextMenu_default, { items, children: /* @__PURE__ */ jsx42(Component, { ...props }) });
9882
+ if (!items?.length) return /* @__PURE__ */ jsx43(Component, { ...props });
9883
+ return /* @__PURE__ */ jsx43(NodeContextMenu_default, { items, children: /* @__PURE__ */ jsx43(Component, { ...props }) });
9724
9884
  });
9725
9885
  Wrapped.displayName = `WithContextMenu(${Component.displayName || Component.name || "Component"})`;
9726
9886
  return Wrapped;
@@ -9754,10 +9914,11 @@ var NodeGraphBuilder = ({
9754
9914
  "data-product": wrapWithContextMenu(DataProduct_default),
9755
9915
  "data-products": wrapWithContextMenu(DataProduct_default),
9756
9916
  group: GroupNode_default,
9757
- note: memo34((props) => /* @__PURE__ */ jsx42(NoteNode_default, { ...props, readOnly: true })),
9917
+ note: memo35((props) => /* @__PURE__ */ jsx43(NoteNode_default, { ...props, readOnly: true })),
9758
9918
  field: wrapWithContextMenu(FieldNode_default),
9759
9919
  messageGroup: MessageGroupNode_default,
9760
- messageGroupExpanded: MessageGroupExpandedNode_default
9920
+ messageGroupExpanded: MessageGroupExpandedNode_default,
9921
+ flowExpanded: FlowExpandedNode_default
9761
9922
  };
9762
9923
  }, []);
9763
9924
  const edgeTypes2 = useMemo18(
@@ -9887,6 +10048,23 @@ var NodeGraphBuilder = ({
9887
10048
  edgesRef.current = edges;
9888
10049
  const hideChannelsRef = useRef6(hideChannels);
9889
10050
  hideChannelsRef.current = hideChannels;
10051
+ const wrapperNodeIds = useMemo18(() => {
10052
+ const ids = /* @__PURE__ */ new Set();
10053
+ nodes.forEach((n) => {
10054
+ if (isExpandedWrapper(n.type)) ids.add(n.id);
10055
+ });
10056
+ return ids;
10057
+ }, [nodes]);
10058
+ const walkthroughNodes = useMemo18(
10059
+ () => wrapperNodeIds.size === 0 ? nodes : nodes.filter((n) => !wrapperNodeIds.has(n.id)),
10060
+ [nodes, wrapperNodeIds]
10061
+ );
10062
+ const walkthroughEdges = useMemo18(
10063
+ () => wrapperNodeIds.size === 0 ? edges : edges.filter(
10064
+ (e) => !wrapperNodeIds.has(e.source) && !wrapperNodeIds.has(e.target)
10065
+ ),
10066
+ [edges, wrapperNodeIds]
10067
+ );
9890
10068
  const animateLayout = useCallback12(() => {
9891
10069
  const wrapper = reactFlowWrapperRef.current;
9892
10070
  if (!wrapper) return;
@@ -9922,6 +10100,9 @@ var NodeGraphBuilder = ({
9922
10100
  const positioned = nextNodes.map((node) => {
9923
10101
  if (node.parentId) {
9924
10102
  const parent = nextNodes.find((n) => n.id === node.parentId);
10103
+ if (parent?.type === "flowExpanded") {
10104
+ return node;
10105
+ }
9925
10106
  const parentWidth = parent?.style?.width || 380;
9926
10107
  const childWidth = 240;
9927
10108
  const xOffset = Math.max(20, (parentWidth - childWidth) / 2);
@@ -9941,10 +10122,62 @@ var NodeGraphBuilder = ({
9941
10122
  });
9942
10123
  return positioned;
9943
10124
  }, []);
10125
+ const layoutSubFlowChildren = useCallback12(
10126
+ (children, edges2, sizeOf, opts) => {
10127
+ const { padding, headerH, fallbackW = 240, fallbackH = 120 } = opts;
10128
+ const g = new dagre3.graphlib.Graph();
10129
+ g.setGraph({ rankdir: "LR", ranksep: 360, nodesep: 200 });
10130
+ g.setDefaultEdgeLabel(() => ({}));
10131
+ const childIds = new Set(children.map((c) => c.id));
10132
+ children.forEach((c) => {
10133
+ const { w, h } = sizeOf(c);
10134
+ g.setNode(c.id, { width: w, height: h });
10135
+ });
10136
+ edges2.forEach((e) => {
10137
+ if (childIds.has(e.source) && childIds.has(e.target)) {
10138
+ g.setEdge(e.source, e.target);
10139
+ }
10140
+ });
10141
+ dagre3.layout(g);
10142
+ let minX = Infinity;
10143
+ let minY = Infinity;
10144
+ let maxX = -Infinity;
10145
+ let maxY = -Infinity;
10146
+ const positions = /* @__PURE__ */ new Map();
10147
+ children.forEach((c) => {
10148
+ const pos = g.node(c.id);
10149
+ if (!pos) return;
10150
+ const x = pos.x - pos.width / 2;
10151
+ const y = pos.y - pos.height / 2;
10152
+ positions.set(c.id, { x, y });
10153
+ minX = Math.min(minX, x);
10154
+ minY = Math.min(minY, y);
10155
+ maxX = Math.max(maxX, x + pos.width);
10156
+ maxY = Math.max(maxY, y + pos.height);
10157
+ });
10158
+ const offsetX = padding - (Number.isFinite(minX) ? minX : 0);
10159
+ const offsetY = headerH + padding - (Number.isFinite(minY) ? minY : 0);
10160
+ const positioned = children.map((c) => {
10161
+ const p = positions.get(c.id);
10162
+ if (!p) return c;
10163
+ return { ...c, position: { x: p.x + offsetX, y: p.y + offsetY } };
10164
+ });
10165
+ const finalPositions = /* @__PURE__ */ new Map();
10166
+ positions.forEach(
10167
+ (p, id) => finalPositions.set(id, { x: p.x + offsetX, y: p.y + offsetY })
10168
+ );
10169
+ const width = Number.isFinite(minX) ? maxX - minX + padding * 2 : fallbackW + padding * 2;
10170
+ const height = Number.isFinite(minY) ? maxY - minY + headerH + padding * 2 : fallbackH + headerH + padding * 2;
10171
+ return { positioned, positions: finalPositions, width, height };
10172
+ },
10173
+ []
10174
+ );
9944
10175
  const handleCollapseGroup = useCallback12(
9945
10176
  (e) => {
9946
10177
  const target = e.target;
9947
- const collapseBtn = target.closest(".ec-collapse-group-btn");
10178
+ const collapseBtn = target.closest(
10179
+ ".ec-collapse-group-btn, .ec-collapse-flow-btn"
10180
+ );
9948
10181
  if (!collapseBtn) return;
9949
10182
  e.stopPropagation();
9950
10183
  const nodeWrapper = target.closest("[data-id]");
@@ -9954,23 +10187,26 @@ var NodeGraphBuilder = ({
9954
10187
  const currentNodes = nodesRef.current;
9955
10188
  const currentEdges = edgesRef.current;
9956
10189
  const expandedNode = currentNodes.find((n) => n.id === groupNodeId);
9957
- if (!expandedNode || expandedNode.type !== "messageGroupExpanded") return;
10190
+ if (!expandedNode || !isExpandedWrapper(expandedNode.type)) return;
10191
+ const stashed = expandedNode.data.__preExpansion;
10192
+ const originalNode = stashed?.node ?? initialNodes.find(
10193
+ (n) => n.id === groupNodeId && (n.type === "messageGroup" || n.type === "flows" || n.type === "flow")
10194
+ );
10195
+ if (!originalNode) return;
10196
+ const originalEdges = stashed?.edges ?? initialEdges.filter(
10197
+ (edge) => edge.source === groupNodeId || edge.target === groupNodeId
10198
+ );
9958
10199
  const childNodeIds = new Set(
9959
10200
  currentNodes.filter((n) => n.parentId === groupNodeId).map((n) => n.id)
9960
10201
  );
9961
- const originalNode = initialNodes.find(
9962
- (n) => n.id === groupNodeId && n.type === "messageGroup"
9963
- );
9964
- if (!originalNode) return;
9965
10202
  const originalData = originalNode.data;
9966
- const initialNodeIds = new Set(initialNodes.map((n) => n.id));
10203
+ const preExistingIds = new Set(
10204
+ stashed ? stashed.nodeIds : initialNodes.map((n) => n.id)
10205
+ );
9967
10206
  const downstreamNodeIds = new Set(
9968
- (originalData.expandedNodes || []).map((n) => n.id).filter((id) => !initialNodeIds.has(id))
10207
+ (originalData.expandedNodes || []).map((n) => n.id).filter((id) => !preExistingIds.has(id))
9969
10208
  );
9970
10209
  const isDownstreamEdge = (edge) => edge.id.startsWith(`${groupNodeId}__`);
9971
- const originalEdges = initialEdges.filter(
9972
- (edge) => edge.source === groupNodeId || edge.target === groupNodeId
9973
- );
9974
10210
  animateLayout();
9975
10211
  setNodes((prev) => {
9976
10212
  const nextEdges = currentEdges.filter(
@@ -9993,6 +10229,9 @@ var NodeGraphBuilder = ({
9993
10229
  );
9994
10230
  return [...without, ...originalEdges];
9995
10231
  });
10232
+ requestAnimationFrame(() => {
10233
+ fitView({ duration: 400, padding: 0.2 });
10234
+ });
9996
10235
  },
9997
10236
  [
9998
10237
  initialNodes,
@@ -10000,7 +10239,8 @@ var NodeGraphBuilder = ({
10000
10239
  setNodes,
10001
10240
  setEdges,
10002
10241
  relayoutGraph,
10003
- animateLayout
10242
+ animateLayout,
10243
+ fitView
10004
10244
  ]
10005
10245
  );
10006
10246
  useEffect8(() => {
@@ -10092,9 +10332,10 @@ var NodeGraphBuilder = ({
10092
10332
  const isEntityVisualizer = nodesRef.current.some(
10093
10333
  (n) => n.type === "entities"
10094
10334
  );
10095
- if (isFlow || isEntityVisualizer) return;
10335
+ const isExpandableFlow = (node.type === "flows" || node.type === "flow") && Array.isArray(node.data?.expandedNodes) && node.data.expandedNodes.length > 0;
10336
+ if ((isFlow || isEntityVisualizer) && !isExpandableFlow) return;
10096
10337
  if (node.type === "domain" || node.type === "domains") return;
10097
- if (node.type === "messageGroupExpanded") return;
10338
+ if (isExpandedWrapper(node.type)) return;
10098
10339
  if (node.type === "messageGroup") {
10099
10340
  const groupData = node.data;
10100
10341
  const groupNodeId = node.id;
@@ -10102,17 +10343,24 @@ var NodeGraphBuilder = ({
10102
10343
  const childCount = groupData.messages?.length || 0;
10103
10344
  const containerWidth = 380;
10104
10345
  const containerHeight = childCount * 190 + 100;
10346
+ const preExpansionEdges = edgesRef.current.filter(
10347
+ (e) => e.source === groupNodeId || e.target === groupNodeId
10348
+ );
10349
+ const preExpansionNodeIds = nodesRef.current.map((n) => n.id);
10105
10350
  const expandedContainerNode = {
10106
10351
  id: groupNodeId,
10107
- // reuse the same ID
10108
10352
  type: "messageGroupExpanded",
10109
10353
  position: node.position,
10110
- // will be recalculated by dagre
10111
10354
  data: {
10112
10355
  groupName: groupData.groupName,
10113
10356
  direction: groupData.direction,
10114
10357
  messageCount: childCount,
10115
- onCollapse: groupNodeId
10358
+ onCollapse: groupNodeId,
10359
+ __preExpansion: {
10360
+ node,
10361
+ edges: preExpansionEdges,
10362
+ nodeIds: preExpansionNodeIds
10363
+ }
10116
10364
  },
10117
10365
  style: {
10118
10366
  width: containerWidth,
@@ -10237,6 +10485,170 @@ var NodeGraphBuilder = ({
10237
10485
  });
10238
10486
  });
10239
10487
  });
10488
+ requestAnimationFrame(() => {
10489
+ fitView({ duration: 400, padding: 0.2 });
10490
+ });
10491
+ return;
10492
+ }
10493
+ if (isExpandableFlow) {
10494
+ const flowData = node.data;
10495
+ const flowNodeId = node.id;
10496
+ const subFlowNodes = flowData.expandedNodes || [];
10497
+ const subFlowEdges = flowData.expandedEdges || [];
10498
+ const initialChildNodes = subFlowNodes.map((child) => ({
10499
+ ...child,
10500
+ parentId: flowNodeId,
10501
+ extent: "parent",
10502
+ position: { x: 0, y: 0 }
10503
+ }));
10504
+ const CHILD_PADDING = 60;
10505
+ const HEADER_H = 60;
10506
+ const EST_W = 240;
10507
+ const EST_H = 120;
10508
+ const {
10509
+ positioned: childNodes,
10510
+ width: containerWidth,
10511
+ height: containerHeight
10512
+ } = layoutSubFlowChildren(
10513
+ initialChildNodes,
10514
+ subFlowEdges,
10515
+ () => ({ w: EST_W, h: EST_H }),
10516
+ { padding: CHILD_PADDING, headerH: HEADER_H }
10517
+ );
10518
+ const preExpansionEdges = edgesRef.current.filter(
10519
+ (e) => e.source === flowNodeId || e.target === flowNodeId
10520
+ );
10521
+ const preExpansionNodeIds = nodesRef.current.map((n) => n.id);
10522
+ const expandedContainerNode = {
10523
+ id: flowNodeId,
10524
+ type: "flowExpanded",
10525
+ position: node.position,
10526
+ data: {
10527
+ flowName: flowData.flow?.name || flowData.flow?.data?.name,
10528
+ version: flowData.flow?.version || flowData.flow?.data?.version,
10529
+ __preExpansion: {
10530
+ node,
10531
+ edges: preExpansionEdges,
10532
+ nodeIds: preExpansionNodeIds
10533
+ }
10534
+ },
10535
+ style: {
10536
+ width: containerWidth,
10537
+ height: containerHeight,
10538
+ background: "transparent",
10539
+ border: "none",
10540
+ padding: 0,
10541
+ overflow: "visible"
10542
+ }
10543
+ };
10544
+ const childIds = new Set(childNodes.map((n) => n.id));
10545
+ const hasIncoming = /* @__PURE__ */ new Set();
10546
+ const hasOutgoing = /* @__PURE__ */ new Set();
10547
+ for (const e of subFlowEdges) {
10548
+ if (childIds.has(e.target)) hasIncoming.add(e.target);
10549
+ if (childIds.has(e.source)) hasOutgoing.add(e.source);
10550
+ }
10551
+ const entryChildIds = childNodes.map((n) => n.id).filter((id) => !hasIncoming.has(id));
10552
+ const terminalChildIds = childNodes.map((n) => n.id).filter((id) => !hasOutgoing.has(id));
10553
+ const currentEdges = edgesRef.current;
10554
+ const predecessorEdges = currentEdges.filter(
10555
+ (e) => e.target === flowNodeId
10556
+ );
10557
+ const successorEdges = currentEdges.filter(
10558
+ (e) => e.source === flowNodeId
10559
+ );
10560
+ const stitchedPredecessors = [];
10561
+ for (const e of predecessorEdges) {
10562
+ for (const entryId of entryChildIds.length > 0 ? entryChildIds : [flowNodeId]) {
10563
+ stitchedPredecessors.push({
10564
+ ...e,
10565
+ id: `${e.id}__to__${entryId}`,
10566
+ target: entryId
10567
+ });
10568
+ }
10569
+ }
10570
+ const stitchedSuccessors = [];
10571
+ for (const e of successorEdges) {
10572
+ for (const terminalId of terminalChildIds.length > 0 ? terminalChildIds : [flowNodeId]) {
10573
+ stitchedSuccessors.push({
10574
+ ...e,
10575
+ id: `${e.id}__from__${terminalId}`,
10576
+ source: terminalId
10577
+ });
10578
+ }
10579
+ }
10580
+ animateLayout();
10581
+ setNodes((prev) => {
10582
+ const without = prev.filter((n) => n.id !== flowNodeId);
10583
+ const next = [...without, expandedContainerNode, ...childNodes];
10584
+ const nextEdges = [
10585
+ ...currentEdges.filter(
10586
+ (e) => e.source !== flowNodeId && e.target !== flowNodeId
10587
+ ),
10588
+ ...subFlowEdges,
10589
+ ...stitchedPredecessors,
10590
+ ...stitchedSuccessors
10591
+ ];
10592
+ return relayoutGraph(next, nextEdges);
10593
+ });
10594
+ setEdges((prev) => {
10595
+ const without = prev.filter(
10596
+ (e) => e.source !== flowNodeId && e.target !== flowNodeId
10597
+ );
10598
+ return [
10599
+ ...without,
10600
+ ...subFlowEdges,
10601
+ ...stitchedPredecessors,
10602
+ ...stitchedSuccessors
10603
+ ];
10604
+ });
10605
+ requestAnimationFrame(() => {
10606
+ const currentChildren = nodesRef.current.filter(
10607
+ (n) => n.parentId === flowNodeId
10608
+ );
10609
+ if (currentChildren.length === 0) return;
10610
+ const measurements = /* @__PURE__ */ new Map();
10611
+ currentChildren.forEach((n) => {
10612
+ const el = document.querySelector(
10613
+ `[data-id="${n.id}"]`
10614
+ );
10615
+ measurements.set(n.id, {
10616
+ w: el?.offsetWidth ?? EST_W,
10617
+ h: el?.offsetHeight ?? EST_H
10618
+ });
10619
+ });
10620
+ const {
10621
+ positions,
10622
+ width: actualContainerW,
10623
+ height: actualContainerH
10624
+ } = layoutSubFlowChildren(
10625
+ currentChildren,
10626
+ subFlowEdges,
10627
+ (n) => measurements.get(n.id) ?? { w: EST_W, h: EST_H },
10628
+ { padding: CHILD_PADDING, headerH: HEADER_H }
10629
+ );
10630
+ setNodes(
10631
+ (prev) => prev.map((n) => {
10632
+ if (n.id === flowNodeId) {
10633
+ return {
10634
+ ...n,
10635
+ style: {
10636
+ ...n.style,
10637
+ width: actualContainerW,
10638
+ height: actualContainerH
10639
+ }
10640
+ };
10641
+ }
10642
+ if (n.parentId !== flowNodeId) return n;
10643
+ const p = positions.get(n.id);
10644
+ if (!p) return n;
10645
+ return { ...n, position: { x: p.x, y: p.y } };
10646
+ })
10647
+ );
10648
+ });
10649
+ requestAnimationFrame(() => {
10650
+ fitView({ duration: 400, padding: 0.2 });
10651
+ });
10240
10652
  return;
10241
10653
  }
10242
10654
  setFocusedNodeId(node.id);
@@ -10670,7 +11082,7 @@ var NodeGraphBuilder = ({
10670
11082
  () => edges.some((edge) => edge.type === "flow-edge"),
10671
11083
  [edges]
10672
11084
  );
10673
- return /* @__PURE__ */ jsx42(
11085
+ return /* @__PURE__ */ jsx43(
10674
11086
  "div",
10675
11087
  {
10676
11088
  ref: reactFlowWrapperRef,
@@ -10682,22 +11094,22 @@ var NodeGraphBuilder = ({
10682
11094
  display: "flex",
10683
11095
  flexDirection: "column"
10684
11096
  },
10685
- children: /* @__PURE__ */ jsxs40(PortalContainerProvider, { value: reactFlowWrapperRef.current, children: [
10686
- isMermaidView ? /* @__PURE__ */ jsxs40(Fragment11, { children: [
10687
- /* @__PURE__ */ jsxs40("div", { className: "w-full pr-6 flex space-x-2 justify-between items-center bg-[rgb(var(--ec-page-bg))] border-b border-[rgb(var(--ec-page-border))] p-4", children: [
10688
- /* @__PURE__ */ jsx42("div", { className: "flex space-x-2 ml-4", children: /* @__PURE__ */ jsxs40(DropdownMenu2.Root, { children: [
10689
- /* @__PURE__ */ jsx42(DropdownMenu2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs40(
11097
+ children: /* @__PURE__ */ jsxs41(PortalContainerProvider, { value: reactFlowWrapperRef.current, children: [
11098
+ isMermaidView ? /* @__PURE__ */ jsxs41(Fragment12, { children: [
11099
+ /* @__PURE__ */ jsxs41("div", { className: "w-full pr-6 flex space-x-2 justify-between items-center bg-[rgb(var(--ec-page-bg))] border-b border-[rgb(var(--ec-page-border))] p-4", children: [
11100
+ /* @__PURE__ */ jsx43("div", { className: "flex space-x-2 ml-4", children: /* @__PURE__ */ jsxs41(DropdownMenu2.Root, { children: [
11101
+ /* @__PURE__ */ jsx43(DropdownMenu2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs41(
10690
11102
  "button",
10691
11103
  {
10692
11104
  className: "py-2.5 px-4 bg-[rgb(var(--ec-page-bg))] hover:bg-[rgb(var(--ec-accent-subtle)/0.4)] border border-[rgb(var(--ec-page-border))] rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] flex items-center gap-3 transition-all duration-200 hover:border-[rgb(var(--ec-accent)/0.3)] group whitespace-nowrap",
10693
11105
  "aria-label": "Open menu",
10694
11106
  children: [
10695
- title && /* @__PURE__ */ jsx42("span", { className: "text-base font-medium text-[rgb(var(--ec-page-text))] leading-tight", children: title }),
10696
- /* @__PURE__ */ jsx42(MoreVertical, { className: "h-5 w-5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 group-hover:text-[rgb(var(--ec-accent))] transition-colors duration-150" })
11107
+ title && /* @__PURE__ */ jsx43("span", { className: "text-base font-medium text-[rgb(var(--ec-page-text))] leading-tight", children: title }),
11108
+ /* @__PURE__ */ jsx43(MoreVertical, { className: "h-5 w-5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 group-hover:text-[rgb(var(--ec-accent))] transition-colors duration-150" })
10697
11109
  ]
10698
11110
  }
10699
11111
  ) }),
10700
- /* @__PURE__ */ jsx42(DropdownMenu2.Portal, { container: reactFlowWrapperRef.current, children: /* @__PURE__ */ jsxs40(
11112
+ /* @__PURE__ */ jsx43(DropdownMenu2.Portal, { container: reactFlowWrapperRef.current, children: /* @__PURE__ */ jsxs41(
10701
11113
  DropdownMenu2.Content,
10702
11114
  {
10703
11115
  className: "min-w-56 bg-[rgb(var(--ec-page-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-xl z-50 py-1.5 animate-in fade-in zoom-in-95 duration-200",
@@ -10705,8 +11117,8 @@ var NodeGraphBuilder = ({
10705
11117
  align: "end",
10706
11118
  alignOffset: -180,
10707
11119
  children: [
10708
- /* @__PURE__ */ jsx42(DropdownMenu2.Arrow, { className: "fill-[rgb(var(--ec-page-bg))] stroke-[rgb(var(--ec-page-border))] stroke-1" }),
10709
- /* @__PURE__ */ jsx42(
11120
+ /* @__PURE__ */ jsx43(DropdownMenu2.Arrow, { className: "fill-[rgb(var(--ec-page-bg))] stroke-[rgb(var(--ec-page-border))] stroke-1" }),
11121
+ /* @__PURE__ */ jsx43(
10710
11122
  VisualizerDropdownContent_default,
10711
11123
  {
10712
11124
  isMermaidView,
@@ -10736,7 +11148,7 @@ var NodeGraphBuilder = ({
10736
11148
  }
10737
11149
  ) })
10738
11150
  ] }) }),
10739
- mode === "full" && showSearch && /* @__PURE__ */ jsx42("div", { className: "flex justify-end items-center gap-2", children: !isMermaidView && /* @__PURE__ */ jsx42("div", { className: "w-96", children: /* @__PURE__ */ jsx42(
11151
+ mode === "full" && showSearch && /* @__PURE__ */ jsx43("div", { className: "flex justify-end items-center gap-2", children: !isMermaidView && /* @__PURE__ */ jsx43("div", { className: "w-96", children: /* @__PURE__ */ jsx43(
10740
11152
  VisualiserSearch_default,
10741
11153
  {
10742
11154
  ref: searchRef,
@@ -10746,7 +11158,7 @@ var NodeGraphBuilder = ({
10746
11158
  }
10747
11159
  ) }) })
10748
11160
  ] }),
10749
- /* @__PURE__ */ jsx42("div", { className: "flex-1 overflow-hidden relative", children: /* @__PURE__ */ jsx42(
11161
+ /* @__PURE__ */ jsx43("div", { className: "flex-1 overflow-hidden relative", children: /* @__PURE__ */ jsx43(
10750
11162
  MermaidView_default,
10751
11163
  {
10752
11164
  nodes,
@@ -10754,7 +11166,7 @@ var NodeGraphBuilder = ({
10754
11166
  maxTextSize
10755
11167
  }
10756
11168
  ) })
10757
- ] }) : /* @__PURE__ */ jsxs40(
11169
+ ] }) : /* @__PURE__ */ jsxs41(
10758
11170
  ReactFlow2,
10759
11171
  {
10760
11172
  nodeTypes,
@@ -10780,30 +11192,30 @@ var NodeGraphBuilder = ({
10780
11192
  zoomOnScroll,
10781
11193
  className: "relative",
10782
11194
  children: [
10783
- /* @__PURE__ */ jsxs40(
11195
+ /* @__PURE__ */ jsxs41(
10784
11196
  Panel,
10785
11197
  {
10786
11198
  position: "top-center",
10787
11199
  className: "w-full pr-6 pointer-events-none",
10788
11200
  children: [
10789
- /* @__PURE__ */ jsxs40("div", { className: "flex space-x-2 justify-between items-center pointer-events-auto", children: [
10790
- /* @__PURE__ */ jsx42("div", { className: "flex space-x-2 ml-4", children: /* @__PURE__ */ jsxs40(DropdownMenu2.Root, { children: [
10791
- /* @__PURE__ */ jsx42(DropdownMenu2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs40(
11201
+ /* @__PURE__ */ jsxs41("div", { className: "flex space-x-2 justify-between items-center pointer-events-auto", children: [
11202
+ /* @__PURE__ */ jsx43("div", { className: "flex space-x-2 ml-4", children: /* @__PURE__ */ jsxs41(DropdownMenu2.Root, { children: [
11203
+ /* @__PURE__ */ jsx43(DropdownMenu2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs41(
10792
11204
  "button",
10793
11205
  {
10794
11206
  className: "py-2.5 px-4 bg-[rgb(var(--ec-page-bg))] hover:bg-[rgb(var(--ec-accent-subtle)/0.4)] border border-[rgb(var(--ec-page-border))] rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] flex items-center gap-3 transition-all duration-200 hover:border-[rgb(var(--ec-accent)/0.3)] group whitespace-nowrap",
10795
11207
  "aria-label": "Open menu",
10796
11208
  children: [
10797
- title && /* @__PURE__ */ jsx42("span", { className: "text-base font-medium text-[rgb(var(--ec-page-text))] leading-tight", children: title }),
10798
- /* @__PURE__ */ jsx42(MoreVertical, { className: "h-5 w-5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 group-hover:text-[rgb(var(--ec-accent))] transition-colors duration-150" })
11209
+ title && /* @__PURE__ */ jsx43("span", { className: "text-base font-medium text-[rgb(var(--ec-page-text))] leading-tight", children: title }),
11210
+ /* @__PURE__ */ jsx43(MoreVertical, { className: "h-5 w-5 text-[rgb(var(--ec-page-text-muted))] flex-shrink-0 group-hover:text-[rgb(var(--ec-accent))] transition-colors duration-150" })
10799
11211
  ]
10800
11212
  }
10801
11213
  ) }),
10802
- /* @__PURE__ */ jsx42(
11214
+ /* @__PURE__ */ jsx43(
10803
11215
  DropdownMenu2.Portal,
10804
11216
  {
10805
11217
  container: reactFlowWrapperRef.current,
10806
- children: /* @__PURE__ */ jsxs40(
11218
+ children: /* @__PURE__ */ jsxs41(
10807
11219
  DropdownMenu2.Content,
10808
11220
  {
10809
11221
  className: "min-w-56 bg-[rgb(var(--ec-page-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-xl z-50 py-1.5 animate-in fade-in zoom-in-95 duration-200",
@@ -10811,8 +11223,8 @@ var NodeGraphBuilder = ({
10811
11223
  align: "end",
10812
11224
  alignOffset: -180,
10813
11225
  children: [
10814
- /* @__PURE__ */ jsx42(DropdownMenu2.Arrow, { className: "fill-[rgb(var(--ec-page-bg))] stroke-[rgb(var(--ec-page-border))] stroke-1" }),
10815
- /* @__PURE__ */ jsx42(
11226
+ /* @__PURE__ */ jsx43(DropdownMenu2.Arrow, { className: "fill-[rgb(var(--ec-page-bg))] stroke-[rgb(var(--ec-page-border))] stroke-1" }),
11227
+ /* @__PURE__ */ jsx43(
10816
11228
  VisualizerDropdownContent_default,
10817
11229
  {
10818
11230
  isMermaidView,
@@ -10846,7 +11258,7 @@ var NodeGraphBuilder = ({
10846
11258
  }
10847
11259
  )
10848
11260
  ] }) }),
10849
- mode === "full" && showSearch && /* @__PURE__ */ jsx42("div", { className: "flex justify-end items-center gap-2", children: !isMermaidView && /* @__PURE__ */ jsx42("div", { className: "w-96", children: /* @__PURE__ */ jsx42(
11261
+ mode === "full" && showSearch && /* @__PURE__ */ jsx43("div", { className: "flex justify-end items-center gap-2", children: !isMermaidView && /* @__PURE__ */ jsx43("div", { className: "w-96", children: /* @__PURE__ */ jsx43(
10850
11262
  VisualiserSearch_default,
10851
11263
  {
10852
11264
  ref: searchRef,
@@ -10856,9 +11268,9 @@ var NodeGraphBuilder = ({
10856
11268
  }
10857
11269
  ) }) })
10858
11270
  ] }),
10859
- links.length > 0 && /* @__PURE__ */ jsx42("div", { className: "flex justify-end mt-3", children: /* @__PURE__ */ jsxs40("div", { className: "relative flex items-center -mt-1", children: [
10860
- /* @__PURE__ */ jsx42("span", { className: "absolute left-2 pointer-events-none flex items-center h-full", children: /* @__PURE__ */ jsx42(HistoryIcon, { className: "h-4 w-4 text-[rgb(var(--ec-page-text-muted))]" }) }),
10861
- /* @__PURE__ */ jsx42(
11271
+ links.length > 0 && /* @__PURE__ */ jsx43("div", { className: "flex justify-end mt-3", children: /* @__PURE__ */ jsxs41("div", { className: "relative flex items-center -mt-1", children: [
11272
+ /* @__PURE__ */ jsx43("span", { className: "absolute left-2 pointer-events-none flex items-center h-full", children: /* @__PURE__ */ jsx43(HistoryIcon, { className: "h-4 w-4 text-[rgb(var(--ec-page-text-muted))]" }) }),
11273
+ /* @__PURE__ */ jsx43(
10862
11274
  "select",
10863
11275
  {
10864
11276
  value: links.find(
@@ -10873,10 +11285,10 @@ var NodeGraphBuilder = ({
10873
11285
  },
10874
11286
  className: "appearance-none pl-7 pr-6 py-0 text-[14px] bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] rounded-md border border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-page-border)/0.5)] focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))]",
10875
11287
  style: { minWidth: 120, height: "26px" },
10876
- children: links.map((link) => /* @__PURE__ */ jsx42("option", { value: link.url, children: link.label }, link.url))
11288
+ children: links.map((link) => /* @__PURE__ */ jsx43("option", { value: link.url, children: link.label }, link.url))
10877
11289
  }
10878
11290
  ),
10879
- /* @__PURE__ */ jsx42("span", { className: "absolute right-2 pointer-events-none", children: /* @__PURE__ */ jsx42(
11291
+ /* @__PURE__ */ jsx43("span", { className: "absolute right-2 pointer-events-none", children: /* @__PURE__ */ jsx43(
10880
11292
  "svg",
10881
11293
  {
10882
11294
  className: "w-4 h-4 text-[rgb(var(--ec-page-text-muted))]",
@@ -10884,7 +11296,7 @@ var NodeGraphBuilder = ({
10884
11296
  stroke: "currentColor",
10885
11297
  strokeWidth: "2",
10886
11298
  viewBox: "0 0 24 24",
10887
- children: /* @__PURE__ */ jsx42(
11299
+ children: /* @__PURE__ */ jsx43(
10888
11300
  "path",
10889
11301
  {
10890
11302
  strokeLinecap: "round",
@@ -10898,9 +11310,9 @@ var NodeGraphBuilder = ({
10898
11310
  ]
10899
11311
  }
10900
11312
  ),
10901
- includeBackground && /* @__PURE__ */ jsx42(Background2, { color: "var(--ec-bg-dots)", gap: 16 }),
10902
- includeBackground && /* @__PURE__ */ jsx42(Controls2, {}),
10903
- showMinimap && /* @__PURE__ */ jsx42(
11313
+ includeBackground && /* @__PURE__ */ jsx43(Background2, { color: "var(--ec-bg-dots)", gap: 16 }),
11314
+ includeBackground && /* @__PURE__ */ jsx43(Controls2, {}),
11315
+ showMinimap && /* @__PURE__ */ jsx43(
10904
11316
  MiniMap,
10905
11317
  {
10906
11318
  nodeStrokeWidth: 3,
@@ -10909,24 +11321,24 @@ var NodeGraphBuilder = ({
10909
11321
  style: MINIMAP_STYLE
10910
11322
  }
10911
11323
  ),
10912
- isFlowVisualization && showFlowWalkthrough && /* @__PURE__ */ jsx42(Panel, { position: "bottom-left", children: /* @__PURE__ */ jsx42(
11324
+ isFlowVisualization && showFlowWalkthrough && /* @__PURE__ */ jsx43(Panel, { position: "bottom-left", children: /* @__PURE__ */ jsx43(
10913
11325
  StepWalkthrough_default,
10914
11326
  {
10915
- nodes,
10916
- edges,
11327
+ nodes: walkthroughNodes,
11328
+ edges: walkthroughEdges,
10917
11329
  isFlowVisualization,
10918
11330
  onStepChange: handleStepChange,
10919
11331
  mode
10920
11332
  }
10921
11333
  ) }),
10922
- isDevMode && hasLayoutChanges && /* @__PURE__ */ jsx42(
11334
+ isDevMode && hasLayoutChanges && /* @__PURE__ */ jsx43(
10923
11335
  Panel,
10924
11336
  {
10925
11337
  position: "bottom-left",
10926
11338
  style: isFlowVisualization && showFlowWalkthrough ? LAYOUT_CHANGE_PANEL_STYLE_WITH_WALKTHROUGH : LAYOUT_CHANGE_PANEL_STYLE_DEFAULT,
10927
- children: /* @__PURE__ */ jsxs40("div", { className: "bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md px-3 py-2 flex items-center gap-3", children: [
10928
- /* @__PURE__ */ jsx42("span", { className: "text-xs text-[rgb(var(--ec-page-text-muted))]", children: "Layout changed" }),
10929
- /* @__PURE__ */ jsx42(
11339
+ children: /* @__PURE__ */ jsxs41("div", { className: "bg-[rgb(var(--ec-card-bg))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-md px-3 py-2 flex items-center gap-3", children: [
11340
+ /* @__PURE__ */ jsx43("span", { className: "text-xs text-[rgb(var(--ec-page-text-muted))]", children: "Layout changed" }),
11341
+ /* @__PURE__ */ jsx43(
10930
11342
  "button",
10931
11343
  {
10932
11344
  onClick: handleQuickSaveLayout,
@@ -10938,7 +11350,7 @@ var NodeGraphBuilder = ({
10938
11350
  ] })
10939
11351
  }
10940
11352
  ),
10941
- includeKey && /* @__PURE__ */ jsx42(
11353
+ includeKey && /* @__PURE__ */ jsx43(
10942
11354
  LegendPanel,
10943
11355
  {
10944
11356
  legend,
@@ -10949,14 +11361,14 @@ var NodeGraphBuilder = ({
10949
11361
  ]
10950
11362
  }
10951
11363
  ),
10952
- /* @__PURE__ */ jsx42(
11364
+ /* @__PURE__ */ jsx43(
10953
11365
  StudioModal_default,
10954
11366
  {
10955
11367
  isOpen: isStudioModalOpen || false,
10956
11368
  onClose: () => setIsStudioModalOpen(false)
10957
11369
  }
10958
11370
  ),
10959
- /* @__PURE__ */ jsx42(
11371
+ /* @__PURE__ */ jsx43(
10960
11372
  FocusModeModal_default,
10961
11373
  {
10962
11374
  isOpen: focusModeOpen,
@@ -10970,7 +11382,7 @@ var NodeGraphBuilder = ({
10970
11382
  edgeTypes: edgeTypes2
10971
11383
  }
10972
11384
  ),
10973
- /* @__PURE__ */ jsx42(
11385
+ /* @__PURE__ */ jsx43(
10974
11386
  AllNotesModal,
10975
11387
  {
10976
11388
  noteGroups: allNoteGroups,
@@ -10979,8 +11391,8 @@ var NodeGraphBuilder = ({
10979
11391
  nodes
10980
11392
  }
10981
11393
  ),
10982
- isShareModalOpen && /* @__PURE__ */ jsxs40(Fragment11, { children: [
10983
- /* @__PURE__ */ jsx42(
11394
+ isShareModalOpen && /* @__PURE__ */ jsxs41(Fragment12, { children: [
11395
+ /* @__PURE__ */ jsx43(
10984
11396
  "div",
10985
11397
  {
10986
11398
  className: "fixed inset-0 bg-black/20 z-40",
@@ -10988,13 +11400,13 @@ var NodeGraphBuilder = ({
10988
11400
  style: { animation: "fadeIn 150ms ease-out" }
10989
11401
  }
10990
11402
  ),
10991
- /* @__PURE__ */ jsxs40(
11403
+ /* @__PURE__ */ jsxs41(
10992
11404
  "div",
10993
11405
  {
10994
11406
  className: "fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-[rgb(var(--ec-page-bg))] rounded-lg shadow-xl z-50 w-full max-w-md p-6 border border-[rgb(var(--ec-page-border))]",
10995
11407
  style: { animation: "slideInCenter 250ms ease-out" },
10996
11408
  children: [
10997
- /* @__PURE__ */ jsx42("style", { children: `
11409
+ /* @__PURE__ */ jsx43("style", { children: `
10998
11410
  @keyframes fadeIn {
10999
11411
  from { opacity: 0; }
11000
11412
  to { opacity: 1; }
@@ -11004,21 +11416,21 @@ var NodeGraphBuilder = ({
11004
11416
  to { opacity: 1; transform: translate(-50%, -50%); }
11005
11417
  }
11006
11418
  ` }),
11007
- /* @__PURE__ */ jsxs40("div", { className: "flex justify-between items-start mb-4", children: [
11008
- /* @__PURE__ */ jsx42("h3", { className: "text-lg font-semibold text-[rgb(var(--ec-page-text))]", children: "Share Link" }),
11009
- /* @__PURE__ */ jsx42(
11419
+ /* @__PURE__ */ jsxs41("div", { className: "flex justify-between items-start mb-4", children: [
11420
+ /* @__PURE__ */ jsx43("h3", { className: "text-lg font-semibold text-[rgb(var(--ec-page-text))]", children: "Share Link" }),
11421
+ /* @__PURE__ */ jsx43(
11010
11422
  "button",
11011
11423
  {
11012
11424
  onClick: () => setIsShareModalOpen(false),
11013
11425
  className: "text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))] transition-colors",
11014
11426
  "aria-label": "Close modal",
11015
- children: /* @__PURE__ */ jsx42(ExternalLink2, { className: "w-5 h-5 rotate-180" })
11427
+ children: /* @__PURE__ */ jsx43(ExternalLink2, { className: "w-5 h-5 rotate-180" })
11016
11428
  }
11017
11429
  )
11018
11430
  ] }),
11019
- /* @__PURE__ */ jsx42("p", { className: "text-sm text-[rgb(var(--ec-page-text-muted))] mb-4", children: "Share this link with your team to let them view this visualization." }),
11020
- /* @__PURE__ */ jsxs40("div", { className: "flex gap-2", children: [
11021
- /* @__PURE__ */ jsx42(
11431
+ /* @__PURE__ */ jsx43("p", { className: "text-sm text-[rgb(var(--ec-page-text-muted))] mb-4", children: "Share this link with your team to let them view this visualization." }),
11432
+ /* @__PURE__ */ jsxs41("div", { className: "flex gap-2", children: [
11433
+ /* @__PURE__ */ jsx43(
11022
11434
  "input",
11023
11435
  {
11024
11436
  type: "text",
@@ -11027,15 +11439,15 @@ var NodeGraphBuilder = ({
11027
11439
  className: "flex-1 px-3 py-2.5 bg-[rgb(var(--ec-input-bg))] border border-[rgb(var(--ec-input-border))] rounded-md text-[rgb(var(--ec-input-text))] text-sm focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))]"
11028
11440
  }
11029
11441
  ),
11030
- /* @__PURE__ */ jsxs40(
11442
+ /* @__PURE__ */ jsxs41(
11031
11443
  "button",
11032
11444
  {
11033
11445
  onClick: handleCopyShareUrl,
11034
11446
  className: `px-4 py-2.5 rounded-md font-medium transition-all duration-200 flex items-center gap-2 ${shareUrlCopySuccess ? "bg-green-500 text-white" : "bg-[rgb(var(--ec-accent))] text-white hover:opacity-90"}`,
11035
11447
  "aria-label": shareUrlCopySuccess ? "Copied!" : "Copy link",
11036
11448
  children: [
11037
- shareUrlCopySuccess ? /* @__PURE__ */ jsx42(CheckIcon3, { className: "w-4 h-4" }) : /* @__PURE__ */ jsx42(ClipboardIcon3, { className: "w-4 h-4" }),
11038
- /* @__PURE__ */ jsx42("span", { children: shareUrlCopySuccess ? "Copied!" : "Copy" })
11449
+ shareUrlCopySuccess ? /* @__PURE__ */ jsx43(CheckIcon3, { className: "w-4 h-4" }) : /* @__PURE__ */ jsx43(ClipboardIcon3, { className: "w-4 h-4" }),
11450
+ /* @__PURE__ */ jsx43("span", { children: shareUrlCopySuccess ? "Copied!" : "Copy" })
11039
11451
  ]
11040
11452
  }
11041
11453
  )
@@ -11114,9 +11526,9 @@ var NodeGraph = ({
11114
11526
  }
11115
11527
  }, []);
11116
11528
  if (!elem) return null;
11117
- return /* @__PURE__ */ jsx42("div", { children: createPortal(
11118
- /* @__PURE__ */ jsxs40(ReactFlowProvider2, { children: [
11119
- /* @__PURE__ */ jsx42(
11529
+ return /* @__PURE__ */ jsx43("div", { children: createPortal(
11530
+ /* @__PURE__ */ jsxs41(ReactFlowProvider2, { children: [
11531
+ /* @__PURE__ */ jsx43(
11120
11532
  NodeGraphBuilder,
11121
11533
  {
11122
11534
  edges,
@@ -11148,11 +11560,11 @@ var NodeGraph = ({
11148
11560
  onResetLayout
11149
11561
  }
11150
11562
  ),
11151
- showFooter && /* @__PURE__ */ jsxs40("div", { className: "flex justify-between", id: "visualiser-footer", children: [
11152
- footerLabel && /* @__PURE__ */ jsx42("div", { className: "py-2 w-full text-left ", children: /* @__PURE__ */ jsx42("span", { className: " text-sm no-underline py-2 text-[rgb(var(--ec-page-text-muted))]", children: footerLabel }) }),
11153
- href && /* @__PURE__ */ jsxs40("div", { className: "py-2 w-full text-right flex justify-between", children: [
11154
- /* @__PURE__ */ jsx42("span", {}),
11155
- /* @__PURE__ */ jsxs40(
11563
+ showFooter && /* @__PURE__ */ jsxs41("div", { className: "flex justify-between", id: "visualiser-footer", children: [
11564
+ footerLabel && /* @__PURE__ */ jsx43("div", { className: "py-2 w-full text-left ", children: /* @__PURE__ */ jsx43("span", { className: " text-sm no-underline py-2 text-[rgb(var(--ec-page-text-muted))]", children: footerLabel }) }),
11565
+ href && /* @__PURE__ */ jsxs41("div", { className: "py-2 w-full text-right flex justify-between", children: [
11566
+ /* @__PURE__ */ jsx43("span", {}),
11567
+ /* @__PURE__ */ jsxs41(
11156
11568
  "a",
11157
11569
  {
11158
11570
  className: " text-sm underline text-[rgb(var(--ec-page-text))] hover:text-[rgb(var(--ec-accent))]",
@@ -11189,6 +11601,7 @@ var nodeComponents = {
11189
11601
  domain: Domain_default,
11190
11602
  entity: Entity_default,
11191
11603
  flow: Flow_default,
11604
+ flowExpanded: FlowExpandedNode_default,
11192
11605
  group: GroupNode_default,
11193
11606
  step: Step_default,
11194
11607
  user: User_default,
@@ -11231,6 +11644,7 @@ export {
11231
11644
  ExternalSystem2_default as ExternalSystem2Node,
11232
11645
  FieldNode_default as Field,
11233
11646
  FlowEdge_default as FlowEdge,
11647
+ FlowExpandedNode_default as FlowExpandedNode,
11234
11648
  Flow_default as FlowNode,
11235
11649
  FocusModeModal_default as FocusModeModal,
11236
11650
  GroupNode_default as GroupNode,