@eventcatalog/visualiser 5.0.0-beta.2 → 5.0.0-beta.4

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.js CHANGED
@@ -46,6 +46,7 @@ __export(index_exports, {
46
46
  DATA: () => DATA,
47
47
  Data: () => DataNode_default,
48
48
  DataProductNode: () => DataProduct_default,
49
+ DomainCardNode: () => DomainCard_default,
49
50
  DomainNode: () => Domain_default,
50
51
  ENTITY_TARGET_HANDLE_ID: () => ENTITY_TARGET_HANDLE_ID,
51
52
  EVENT: () => EVENT,
@@ -257,6 +258,7 @@ var HANDLE_GLOW = {
257
258
  actor: glow("234, 179, 8"),
258
259
  external: glow("168, 85, 247"),
259
260
  dataProduct: glow("99, 102, 241"),
261
+ view: glow("14, 165, 233"),
260
262
  // Nodes without a colour of their own (fields, message groups, custom steps)
261
263
  generic: glow("251, 146, 60")
262
264
  };
@@ -3763,29 +3765,63 @@ var import_react26 = require("react");
3763
3765
  var import_lucide_react14 = require("lucide-react");
3764
3766
  var import_react27 = require("@xyflow/react");
3765
3767
  var import_jsx_runtime15 = require("react/jsx-runtime");
3766
- function classNames9(...classes) {
3767
- return classes.filter(Boolean).join(" ");
3768
- }
3768
+ var VIEW_COLOR = "#0ea5e9";
3769
+ var GlowHandle13 = (0, import_react26.memo)(function GlowHandle14({
3770
+ side
3771
+ }) {
3772
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3773
+ "div",
3774
+ {
3775
+ className: "ec-handle-glow",
3776
+ style: {
3777
+ position: "absolute",
3778
+ top: "50%",
3779
+ [side]: -6,
3780
+ transform: "translateY(-50%)",
3781
+ width: 12,
3782
+ height: 12,
3783
+ borderRadius: "50%",
3784
+ background: "linear-gradient(135deg, #38bdf8, #0284c7)",
3785
+ border: "2px solid rgb(var(--ec-page-bg))",
3786
+ zIndex: 20,
3787
+ ...HANDLE_GLOW.view,
3788
+ pointerEvents: "none"
3789
+ }
3790
+ }
3791
+ );
3792
+ });
3769
3793
  var ViewNode_default = (0, import_react26.memo)(function View(props) {
3770
- const { data: _data, selected } = props;
3771
- const { name, summary, screenshot } = props.data.view;
3794
+ const {
3795
+ name,
3796
+ version,
3797
+ summary,
3798
+ screenshot,
3799
+ owners = EMPTY_ARRAY,
3800
+ notes
3801
+ } = props.data.view;
3772
3802
  const mode = props.data.mode || "simple";
3773
- const nodeLabel = "View";
3803
+ const ownersNormalized = (0, import_react26.useMemo)(() => normalizeOwners(owners), [owners]);
3804
+ const targetConnections = (0, import_react27.useNodeConnections)({ handleType: "target" });
3805
+ const sourceConnections = (0, import_react27.useNodeConnections)({ handleType: "source" });
3774
3806
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
3775
3807
  "div",
3776
3808
  {
3777
- className: classNames9(
3778
- "rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] min-h-[100px] relative",
3779
- selected ? "border-blue-600 ring-2 ring-blue-500 shadow-lg" : "border-blue-400"
3780
- ),
3781
- style: NODE_WIDTH_STYLE,
3809
+ className: [
3810
+ "relative min-w-48 max-w-60 rounded-xl border-2 border-sky-500 overflow-visible",
3811
+ props.selected ? "ring-2 ring-sky-400/60 ring-offset-2" : ""
3812
+ ].join(" "),
3813
+ style: {
3814
+ background: "rgb(var(--ec-card-bg))",
3815
+ boxShadow: "0 2px 12px rgba(14, 165, 233, 0.15)"
3816
+ },
3782
3817
  children: [
3818
+ props.data.isFocused && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(FocusedResourceIndicator, {}),
3783
3819
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3784
3820
  import_react27.Handle,
3785
3821
  {
3786
3822
  type: "target",
3787
3823
  position: import_react27.Position.Left,
3788
- className: "!left-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10"
3824
+ style: HIDDEN_HANDLE_STYLE
3789
3825
  }
3790
3826
  ),
3791
3827
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
@@ -3793,53 +3829,59 @@ var ViewNode_default = (0, import_react26.memo)(function View(props) {
3793
3829
  {
3794
3830
  type: "source",
3795
3831
  position: import_react27.Position.Right,
3796
- className: "!right-[-1px] !w-2.5 !h-2.5 !bg-blue-500 !border !border-blue-600 !rounded-full !z-10"
3797
- }
3798
- ),
3799
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
3800
- "div",
3801
- {
3802
- className: `bg-gradient-to-b from-blue-500 to-blue-700 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-blue-100 border-r-[1px] border-blue-500`,
3803
- children: [
3804
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3805
- import_lucide_react14.MonitorIcon,
3806
- {
3807
- className: `w-4 h-4 opacity-90 text-white mt-1 ${mode === "full" ? "mb-2" : "mb-1"}`
3808
- }
3809
- ),
3810
- mode === "full" && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3811
- "span",
3812
- {
3813
- className: "text-center text-[8px] text-white font-bold uppercase mb-4",
3814
- style: ROTATED_LABEL_STYLE,
3815
- children: nodeLabel
3816
- }
3817
- )
3818
- ]
3832
+ style: HIDDEN_HANDLE_STYLE
3819
3833
  }
3820
3834
  ),
3821
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "p-1 flex-1", children: [
3822
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "pb-1", children: [
3823
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "text-xs font-bold block pt-0.5 pb-0.5", children: name }),
3824
- mode === "simple" && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "text-[10px] text-[rgb(var(--ec-page-text-muted))] font-light block pt-0.5 pb-0.5", children: nodeLabel })
3835
+ notes && notes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(NotesIndicator, { notes, resourceName: name }),
3836
+ targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(GlowHandle13, { side: "left" }),
3837
+ sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(GlowHandle13, { side: "right" }),
3838
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "absolute -top-2.5 left-2.5 z-10", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("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-sky-500", children: [
3839
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react14.MonitorIcon, { className: "w-2.5 h-2.5", strokeWidth: 2.5 }),
3840
+ "View"
3841
+ ] }) }),
3842
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "px-3 pt-3.5 pb-2.5", children: [
3843
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-baseline gap-1 min-w-0", children: [
3844
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3845
+ TruncatedResourceName,
3846
+ {
3847
+ value: name,
3848
+ tooltipBorderColor: VIEW_COLOR,
3849
+ className: "text-[13px] font-semibold leading-snug text-[rgb(var(--ec-page-text))] truncate",
3850
+ children: name
3851
+ }
3852
+ ),
3853
+ version && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "text-[10px] font-normal text-[rgb(var(--ec-page-text-muted))] shrink-0", children: [
3854
+ "(v",
3855
+ version,
3856
+ ")"
3857
+ ] })
3825
3858
  ] }),
3826
- summary && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "pb-1", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3859
+ mode === "full" && summary && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3827
3860
  "div",
3828
3861
  {
3829
- className: "text-[8px] font-light text-[rgb(var(--ec-page-text-muted))] block leading-tight overflow-hidden",
3862
+ className: "mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden",
3830
3863
  style: LINE_CLAMP_STYLE,
3831
3864
  title: summary,
3832
3865
  children: summary
3833
3866
  }
3834
- ) }),
3835
- screenshot && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "py-1", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3867
+ ),
3868
+ mode === "full" && screenshot && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3836
3869
  "img",
3837
3870
  {
3838
3871
  src: screenshot,
3839
3872
  alt: `${name} screenshot`,
3840
- className: "w-full max-w-40 h-20 object-cover rounded border border-[rgb(var(--ec-page-border))]"
3873
+ className: "mt-2 w-full h-24 object-cover rounded-md border border-[rgb(var(--ec-page-border))]"
3841
3874
  }
3842
- ) })
3875
+ ),
3876
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3877
+ OwnerIndicator,
3878
+ {
3879
+ owners: ownersNormalized,
3880
+ accentColor: "bg-sky-400",
3881
+ borderColor: "rgba(14,165,233,0.08)",
3882
+ iconClass: "text-sky-300"
3883
+ }
3884
+ )
3843
3885
  ] })
3844
3886
  ]
3845
3887
  }
@@ -3851,7 +3893,7 @@ var import_react28 = require("react");
3851
3893
  var import_lucide_react15 = require("lucide-react");
3852
3894
  var import_react29 = require("@xyflow/react");
3853
3895
  var import_jsx_runtime16 = require("react/jsx-runtime");
3854
- function GlowHandle13({ side }) {
3896
+ function GlowHandle15({ side }) {
3855
3897
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
3856
3898
  "div",
3857
3899
  {
@@ -3873,7 +3915,7 @@ function GlowHandle13({ side }) {
3873
3915
  }
3874
3916
  );
3875
3917
  }
3876
- function classNames10(...classes) {
3918
+ function classNames9(...classes) {
3877
3919
  return classes.filter(Boolean).join(" ");
3878
3920
  }
3879
3921
  function PostItActor(props) {
@@ -3882,7 +3924,7 @@ function PostItActor(props) {
3882
3924
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
3883
3925
  "div",
3884
3926
  {
3885
- className: classNames10(
3927
+ className: classNames9(
3886
3928
  "relative min-w-44 max-w-56 min-h-[120px]",
3887
3929
  props?.selected ? "ring-2 ring-yellow-400/60 ring-offset-1" : ""
3888
3930
  ),
@@ -3950,7 +3992,7 @@ function PostItActor(props) {
3950
3992
  as: "div",
3951
3993
  value: name,
3952
3994
  tooltipBorderColor: "#eab308",
3953
- className: classNames10(
3995
+ className: classNames9(
3954
3996
  "text-[13px] font-bold leading-snug truncate",
3955
3997
  deprecated ? "text-yellow-950/40 line-through" : "text-yellow-950"
3956
3998
  ),
@@ -3981,7 +4023,7 @@ function DefaultActor(props) {
3981
4023
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
3982
4024
  "div",
3983
4025
  {
3984
- className: classNames10(
4026
+ className: classNames9(
3985
4027
  "relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible",
3986
4028
  props?.selected ? "ring-2 ring-yellow-400/60 ring-offset-2" : "",
3987
4029
  deprecated ? "border-dashed border-red-500" : draft ? `border-dashed ${isDark ? "border-yellow-400" : "border-yellow-400/60"}` : "border-yellow-500"
@@ -4008,12 +4050,12 @@ function DefaultActor(props) {
4008
4050
  }
4009
4051
  ),
4010
4052
  notes && notes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(NotesIndicator, { notes, resourceName: name }),
4011
- targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(GlowHandle13, { side: "left" }),
4012
- sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(GlowHandle13, { side: "right" }),
4053
+ targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(GlowHandle15, { side: "left" }),
4054
+ sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(GlowHandle15, { side: "right" }),
4013
4055
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
4014
4056
  "span",
4015
4057
  {
4016
- className: classNames10(
4058
+ className: classNames9(
4017
4059
  "inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm",
4018
4060
  deprecated ? "bg-red-500" : "bg-yellow-500"
4019
4061
  ),
@@ -4303,7 +4345,8 @@ var DomainCard_default = (0, import_react36.memo)(function DomainCardNode({ data
4303
4345
  systemsCount = 0,
4304
4346
  servicesCount = 0,
4305
4347
  entitiesCount = 0,
4306
- subdomain = false
4348
+ subdomain = false,
4349
+ navigable = true
4307
4350
  } = data;
4308
4351
  const { id, version, name, summary } = domain;
4309
4352
  const stats = [
@@ -4315,14 +4358,16 @@ var DomainCard_default = (0, import_react36.memo)(function DomainCardNode({ data
4315
4358
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
4316
4359
  "div",
4317
4360
  {
4318
- role: "button",
4319
- tabIndex: 0,
4320
- onClick: goToDiagram,
4321
- onKeyDown: (e) => {
4322
- if (e.key === "Enter" || e.key === " ") goToDiagram();
4323
- },
4324
- title: `Open the ${name} diagram`,
4325
- className: "relative min-w-48 max-w-60 rounded-xl border-2 border-yellow-400 overflow-visible cursor-pointer",
4361
+ ...navigable ? {
4362
+ role: "button",
4363
+ tabIndex: 0,
4364
+ onClick: goToDiagram,
4365
+ onKeyDown: (e) => {
4366
+ if (e.key === "Enter" || e.key === " ") goToDiagram();
4367
+ },
4368
+ title: `Open the ${name} diagram`
4369
+ } : {},
4370
+ className: `relative min-w-48 max-w-60 rounded-xl border-2 border-yellow-400 overflow-visible${navigable ? " cursor-pointer" : ""}`,
4326
4371
  style: CARD_STYLE,
4327
4372
  children: [
4328
4373
  /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
@@ -4394,7 +4439,7 @@ var import_react37 = require("react");
4394
4439
  var import_lucide_react20 = require("lucide-react");
4395
4440
  var import_react38 = require("@xyflow/react");
4396
4441
  var import_jsx_runtime20 = require("react/jsx-runtime");
4397
- function GlowHandle14({ side }) {
4442
+ function GlowHandle16({ side }) {
4398
4443
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
4399
4444
  "div",
4400
4445
  {
@@ -4416,7 +4461,7 @@ function GlowHandle14({ side }) {
4416
4461
  }
4417
4462
  );
4418
4463
  }
4419
- function classNames11(...classes) {
4464
+ function classNames10(...classes) {
4420
4465
  return classes.filter(Boolean).join(" ");
4421
4466
  }
4422
4467
  function PostItExternalSystem(props) {
@@ -4425,7 +4470,7 @@ function PostItExternalSystem(props) {
4425
4470
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
4426
4471
  "div",
4427
4472
  {
4428
- className: classNames11(
4473
+ className: classNames10(
4429
4474
  "relative min-w-44 max-w-56 min-h-[120px]",
4430
4475
  props?.selected ? "ring-2 ring-purple-400/60 ring-offset-1" : ""
4431
4476
  ),
@@ -4493,7 +4538,7 @@ function PostItExternalSystem(props) {
4493
4538
  as: "div",
4494
4539
  value: name,
4495
4540
  tooltipBorderColor: "#a855f7",
4496
- className: classNames11(
4541
+ className: classNames10(
4497
4542
  "text-[13px] font-bold leading-snug truncate",
4498
4543
  deprecated ? "text-purple-950/40 line-through" : "text-purple-950"
4499
4544
  ),
@@ -4528,7 +4573,7 @@ function DefaultExternalSystem(props) {
4528
4573
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
4529
4574
  "div",
4530
4575
  {
4531
- className: classNames11(
4576
+ className: classNames10(
4532
4577
  "relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible",
4533
4578
  props?.selected ? "ring-2 ring-purple-400/60 ring-offset-2" : "",
4534
4579
  deprecated ? "border-dashed border-red-500" : draft ? `border-dashed ${isDark ? "border-purple-400" : "border-purple-400/60"}` : "border-purple-500"
@@ -4555,12 +4600,12 @@ function DefaultExternalSystem(props) {
4555
4600
  }
4556
4601
  ),
4557
4602
  notes && notes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(NotesIndicator, { notes, resourceName: name }),
4558
- targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(GlowHandle14, { side: "left" }),
4559
- sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(GlowHandle14, { side: "right" }),
4603
+ targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(GlowHandle16, { side: "left" }),
4604
+ sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(GlowHandle16, { side: "right" }),
4560
4605
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
4561
4606
  "span",
4562
4607
  {
4563
- className: classNames11(
4608
+ className: classNames10(
4564
4609
  "inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm",
4565
4610
  deprecated ? "bg-red-500" : "bg-purple-500"
4566
4611
  ),
@@ -4679,7 +4724,7 @@ var config_default4 = {
4679
4724
  var import_react40 = require("@xyflow/react");
4680
4725
  var import_react41 = require("react");
4681
4726
  var import_jsx_runtime21 = require("react/jsx-runtime");
4682
- function classNames12(...classes) {
4727
+ function classNames11(...classes) {
4683
4728
  return classes.filter(Boolean).join(" ");
4684
4729
  }
4685
4730
  var AVAILABLE_COLORS = {
@@ -4846,7 +4891,7 @@ var NoteNode_default = (0, import_react41.memo)(function NoteNodeComponent({
4846
4891
  "button",
4847
4892
  {
4848
4893
  onClick: () => handleColorChange(colorKey),
4849
- className: classNames12(
4894
+ className: classNames11(
4850
4895
  "w-6 h-6 rounded-full border-2",
4851
4896
  AVAILABLE_COLORS[colorKey].bg,
4852
4897
  AVAILABLE_COLORS[colorKey].border,
@@ -4860,7 +4905,7 @@ var NoteNode_default = (0, import_react41.memo)(function NoteNodeComponent({
4860
4905
  "div",
4861
4906
  {
4862
4907
  onDoubleClick: handleDoubleClick,
4863
- className: classNames12(
4908
+ className: classNames11(
4864
4909
  "w-full h-full rounded-lg border p-3 flex flex-col min-w-[150px] min-h-[150px] relative",
4865
4910
  colorClasses.bg,
4866
4911
  colorClasses.border,
@@ -4879,7 +4924,7 @@ var NoteNode_default = (0, import_react41.memo)(function NoteNodeComponent({
4879
4924
  onChange: handleTextChange,
4880
4925
  onBlur: handleBlur,
4881
4926
  onKeyDown: handleKeyDown,
4882
- className: classNames12(
4927
+ className: classNames11(
4883
4928
  "w-full flex-1 bg-transparent border-none outline-none resize-none text-[10px] p-0 m-0",
4884
4929
  colorClasses.text,
4885
4930
  colorClasses.placeholder
@@ -4931,7 +4976,7 @@ var import_react42 = require("react");
4931
4976
  var import_lucide_react22 = require("lucide-react");
4932
4977
  var import_react43 = require("@xyflow/react");
4933
4978
  var import_jsx_runtime22 = require("react/jsx-runtime");
4934
- function GlowHandle15({ side }) {
4979
+ function GlowHandle17({ side }) {
4935
4980
  return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
4936
4981
  "div",
4937
4982
  {
@@ -4953,7 +4998,7 @@ function GlowHandle15({ side }) {
4953
4998
  }
4954
4999
  );
4955
5000
  }
4956
- function classNames13(...classes) {
5001
+ function classNames12(...classes) {
4957
5002
  return classes.filter(Boolean).join(" ");
4958
5003
  }
4959
5004
  var FieldNode_default = (0, import_react42.memo)(function Field(props) {
@@ -4965,7 +5010,7 @@ var FieldNode_default = (0, import_react42.memo)(function Field(props) {
4965
5010
  return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
4966
5011
  "div",
4967
5012
  {
4968
- className: classNames13(
5013
+ className: classNames12(
4969
5014
  "relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible",
4970
5015
  props?.selected ? "ring-2 ring-cyan-400/60 ring-offset-2" : "",
4971
5016
  "border-cyan-500"
@@ -4991,8 +5036,8 @@ var FieldNode_default = (0, import_react42.memo)(function Field(props) {
4991
5036
  style: HIDDEN_HANDLE_STYLE
4992
5037
  }
4993
5038
  ),
4994
- targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(GlowHandle15, { side: "left" }),
4995
- sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(GlowHandle15, { side: "right" }),
5039
+ targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(GlowHandle17, { side: "left" }),
5040
+ sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(GlowHandle17, { side: "right" }),
4996
5041
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "absolute -top-2.5 left-2.5 z-10", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("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-cyan-600", children: [
4997
5042
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react22.Database, { className: "w-2.5 h-2.5", strokeWidth: 2.5 }),
4998
5043
  "Field"
@@ -5167,7 +5212,7 @@ function getIcon(iconName) {
5167
5212
 
5168
5213
  // src/nodes/Flow.tsx
5169
5214
  var import_jsx_runtime24 = require("react/jsx-runtime");
5170
- function classNames14(...classes) {
5215
+ function classNames13(...classes) {
5171
5216
  return classes.filter(Boolean).join(" ");
5172
5217
  }
5173
5218
  var Flow_default = (0, import_react45.memo)(function FlowNode({
@@ -5211,7 +5256,7 @@ var Flow_default = (0, import_react45.memo)(function FlowNode({
5211
5256
  /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
5212
5257
  "div",
5213
5258
  {
5214
- className: classNames14(
5259
+ className: classNames13(
5215
5260
  `relative rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-${color}-400`
5216
5261
  ),
5217
5262
  style: NODE_WIDTH_STYLE,
@@ -5219,7 +5264,7 @@ var Flow_default = (0, import_react45.memo)(function FlowNode({
5219
5264
  /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
5220
5265
  "div",
5221
5266
  {
5222
- className: classNames14(
5267
+ className: classNames13(
5223
5268
  `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`,
5224
5269
  `border-r-[1px] border-${color}-500`
5225
5270
  ),
@@ -5242,7 +5287,7 @@ var Flow_default = (0, import_react45.memo)(function FlowNode({
5242
5287
  /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
5243
5288
  "div",
5244
5289
  {
5245
- className: classNames14(
5290
+ className: classNames13(
5246
5291
  mode === "full" ? `border-b border-[rgb(var(--ec-page-border))]` : ""
5247
5292
  ),
5248
5293
  children: [
@@ -5455,7 +5500,7 @@ var import_react49 = require("react");
5455
5500
  var import_solid = require("@heroicons/react/20/solid");
5456
5501
  var import_jsx_runtime26 = require("react/jsx-runtime");
5457
5502
  var ENTITY_TARGET_HANDLE_ID = "__eventcatalog-entity-target";
5458
- function classNames15(...classes) {
5503
+ function classNames14(...classes) {
5459
5504
  return classes.filter(Boolean).join(" ");
5460
5505
  }
5461
5506
  var getPropertyTypeLabel = (property) => {
@@ -5538,7 +5583,7 @@ var Entity_default = (0, import_react49.memo)(function EntityNode({
5538
5583
  /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
5539
5584
  "div",
5540
5585
  {
5541
- className: classNames15(
5586
+ className: classNames14(
5542
5587
  "relative flex items-center justify-between py-2 pr-4 hover:bg-[rgb(var(--ec-page-border)/0.2)]",
5543
5588
  isExpandable && "nodrag nopan cursor-pointer"
5544
5589
  ),
@@ -5620,7 +5665,7 @@ var Entity_default = (0, import_react49.memo)(function EntityNode({
5620
5665
  /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ContextMenu2.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
5621
5666
  "div",
5622
5667
  {
5623
- className: classNames15(
5668
+ className: classNames14(
5624
5669
  "bg-[rgb(var(--ec-card-bg))] border rounded-lg shadow-sm min-w-[200px]",
5625
5670
  externalToDomain ? "border-amber-500/60" : "border-blue-400/50"
5626
5671
  ),
@@ -5628,7 +5673,7 @@ var Entity_default = (0, import_react49.memo)(function EntityNode({
5628
5673
  /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
5629
5674
  "div",
5630
5675
  {
5631
- className: classNames15(
5676
+ className: classNames14(
5632
5677
  "relative px-4 py-2 rounded-t-lg border-b border-[rgb(var(--ec-page-border))]",
5633
5678
  externalToDomain ? "bg-amber-500/20" : "bg-blue-500/15"
5634
5679
  ),
@@ -5717,7 +5762,7 @@ var import_react50 = require("react");
5717
5762
  var import_solid2 = require("@heroicons/react/20/solid");
5718
5763
  var import_react51 = require("@xyflow/react");
5719
5764
  var import_jsx_runtime27 = require("react/jsx-runtime");
5720
- function classNames16(...classes) {
5765
+ function classNames15(...classes) {
5721
5766
  return classes.filter(Boolean).join(" ");
5722
5767
  }
5723
5768
  var User_default = (0, import_react50.memo)(function UserNode({
@@ -5736,7 +5781,7 @@ var User_default = (0, import_react50.memo)(function UserNode({
5736
5781
  return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
5737
5782
  "div",
5738
5783
  {
5739
- className: classNames16(
5784
+ className: classNames15(
5740
5785
  `rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-yellow-400`,
5741
5786
  mode === "full" ? "min-h-[5em]" : "min-h-[2em]"
5742
5787
  ),
@@ -5745,7 +5790,7 @@ var User_default = (0, import_react50.memo)(function UserNode({
5745
5790
  /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
5746
5791
  "div",
5747
5792
  {
5748
- className: classNames16(
5793
+ className: classNames15(
5749
5794
  "bg-gradient-to-b from-yellow-400 to-yellow-600 relative flex flex-col items-center w-5 justify-between rounded-l-sm text-orange-100-500",
5750
5795
  `border-r-[1px] border-yellow-500`
5751
5796
  ),
@@ -5782,7 +5827,7 @@ var User_default = (0, import_react50.memo)(function UserNode({
5782
5827
  /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
5783
5828
  "div",
5784
5829
  {
5785
- className: classNames16(
5830
+ className: classNames15(
5786
5831
  mode === "full" ? `border-b border-[rgb(var(--ec-page-border))]` : ""
5787
5832
  ),
5788
5833
  children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
@@ -5809,7 +5854,7 @@ var User_default = (0, import_react50.memo)(function UserNode({
5809
5854
  var import_react52 = require("react");
5810
5855
  var import_react53 = require("@xyflow/react");
5811
5856
  var import_jsx_runtime28 = require("react/jsx-runtime");
5812
- function classNames17(...classes) {
5857
+ function classNames16(...classes) {
5813
5858
  return classes.filter(Boolean).join(" ");
5814
5859
  }
5815
5860
  var Step_default = (0, import_react52.memo)(function StepNode({
@@ -5822,7 +5867,7 @@ var Step_default = (0, import_react52.memo)(function StepNode({
5822
5867
  return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
5823
5868
  "div",
5824
5869
  {
5825
- className: classNames17(
5870
+ className: classNames16(
5826
5871
  "rounded-md border flex justify-start bg-[rgb(var(--ec-card-bg))] text-[rgb(var(--ec-page-text))] border-blue-400 min-h-[3em]"
5827
5872
  ),
5828
5873
  style: NODE_WIDTH_STYLE,
@@ -5830,7 +5875,7 @@ var Step_default = (0, import_react52.memo)(function StepNode({
5830
5875
  /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
5831
5876
  "div",
5832
5877
  {
5833
- className: classNames17(
5878
+ className: classNames16(
5834
5879
  "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",
5835
5880
  `border-r-[1px] border-gray-500`
5836
5881
  ),
@@ -5875,7 +5920,7 @@ var Step_default = (0, import_react52.memo)(function StepNode({
5875
5920
  /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
5876
5921
  "div",
5877
5922
  {
5878
- className: classNames17(
5923
+ className: classNames16(
5879
5924
  mode === "full" ? `border-b border-[rgb(var(--ec-page-border))]` : ""
5880
5925
  ),
5881
5926
  children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
@@ -6068,7 +6113,7 @@ var import_react56 = require("@xyflow/react");
6068
6113
  var import_lucide_react27 = require("lucide-react");
6069
6114
  var import_react57 = require("react");
6070
6115
  var import_jsx_runtime30 = require("react/jsx-runtime");
6071
- function classNames18(...classes) {
6116
+ function classNames17(...classes) {
6072
6117
  return classes.filter(Boolean).join(" ");
6073
6118
  }
6074
6119
  var System_default = (0, import_react57.memo)(function SystemNode({ data }) {
@@ -6079,12 +6124,14 @@ var System_default = (0, import_react57.memo)(function SystemNode({ data }) {
6079
6124
  entitiesCount = 0,
6080
6125
  containersCount = 0,
6081
6126
  messagesCount = 0,
6082
- isFocused = false
6127
+ isFocused = false,
6128
+ navigable = true
6083
6129
  } = data;
6084
6130
  const { id, version, name, summary, scope } = system;
6085
6131
  const isExternal = scope === "external";
6086
6132
  const isDark = useDarkMode();
6087
6133
  const isFlowStep = Boolean(data.step);
6134
+ const opensMap = navigable && !isFlowStep;
6088
6135
  const stats = [
6089
6136
  { icon: import_lucide_react27.Server, label: "Services", count: servicesCount },
6090
6137
  { icon: import_lucide_react27.MessageSquare, label: "Messages", count: messagesCount },
@@ -6098,7 +6145,7 @@ var System_default = (0, import_react57.memo)(function SystemNode({ data }) {
6098
6145
  return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
6099
6146
  "div",
6100
6147
  {
6101
- ...isFlowStep ? {} : {
6148
+ ...!opensMap ? {} : {
6102
6149
  role: "button",
6103
6150
  tabIndex: 0,
6104
6151
  onClick: goToMap,
@@ -6107,9 +6154,9 @@ var System_default = (0, import_react57.memo)(function SystemNode({ data }) {
6107
6154
  },
6108
6155
  title: `Open the ${name} map`
6109
6156
  },
6110
- className: classNames18(
6157
+ className: classNames17(
6111
6158
  "relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible",
6112
- !isFlowStep && "cursor-pointer",
6159
+ opensMap && "cursor-pointer",
6113
6160
  isExternal ? "border-dashed border-violet-400" : "border-violet-500"
6114
6161
  ),
6115
6162
  style: {
@@ -6158,7 +6205,7 @@ var System_default = (0, import_react57.memo)(function SystemNode({ data }) {
6158
6205
  mode === "full" && summary && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
6159
6206
  "div",
6160
6207
  {
6161
- className: classNames18(
6208
+ className: classNames17(
6162
6209
  "mt-1.5 text-[9px] text-[rgb(var(--ec-page-text-muted))] leading-relaxed overflow-hidden"
6163
6210
  ),
6164
6211
  style: LINE_CLAMP_STYLE,
@@ -6428,13 +6475,13 @@ var PALETTES = {
6428
6475
  pillBorder: "#f43f5e"
6429
6476
  }
6430
6477
  };
6431
- function classNames19(...classes) {
6478
+ function classNames18(...classes) {
6432
6479
  return classes.filter(Boolean).join(" ");
6433
6480
  }
6434
6481
  function getPalette(color) {
6435
6482
  return PALETTES[color || "blue"] ?? PALETTES.blue;
6436
6483
  }
6437
- function GlowHandle16({
6484
+ function GlowHandle18({
6438
6485
  side,
6439
6486
  gradient
6440
6487
  }) {
@@ -6483,7 +6530,7 @@ var Custom_default = (0, import_react59.memo)(function CustomNode({ data, select
6483
6530
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ContextMenu4.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
6484
6531
  "div",
6485
6532
  {
6486
- className: classNames19(
6533
+ className: classNames18(
6487
6534
  "relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible",
6488
6535
  selected ? palette.ring : "",
6489
6536
  palette.border
@@ -6510,12 +6557,12 @@ var Custom_default = (0, import_react59.memo)(function CustomNode({ data, select
6510
6557
  style: HIDDEN_HANDLE_STYLE
6511
6558
  }
6512
6559
  ),
6513
- targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(GlowHandle16, { side: "left", gradient: palette.glow }),
6514
- sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(GlowHandle16, { side: "right", gradient: palette.glow }),
6560
+ targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(GlowHandle18, { side: "left", gradient: palette.glow }),
6561
+ sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(GlowHandle18, { side: "right", gradient: palette.glow }),
6515
6562
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "absolute -top-3 left-2.5 z-10", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
6516
6563
  "span",
6517
6564
  {
6518
- className: classNames19(
6565
+ className: classNames18(
6519
6566
  "inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm",
6520
6567
  palette.badge
6521
6568
  ),
@@ -6623,7 +6670,7 @@ var import_react63 = require("react");
6623
6670
  var import_lucide_react29 = require("lucide-react");
6624
6671
  var import_react64 = require("@xyflow/react");
6625
6672
  var import_jsx_runtime34 = require("react/jsx-runtime");
6626
- function GlowHandle17({ side }) {
6673
+ function GlowHandle19({ side }) {
6627
6674
  return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
6628
6675
  "div",
6629
6676
  {
@@ -6645,7 +6692,7 @@ function GlowHandle17({ side }) {
6645
6692
  }
6646
6693
  );
6647
6694
  }
6648
- function classNames20(...classes) {
6695
+ function classNames19(...classes) {
6649
6696
  return classes.filter(Boolean).join(" ");
6650
6697
  }
6651
6698
  function PostItDataProduct(props) {
@@ -6655,7 +6702,7 @@ function PostItDataProduct(props) {
6655
6702
  return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
6656
6703
  "div",
6657
6704
  {
6658
- className: classNames20(
6705
+ className: classNames19(
6659
6706
  "relative min-w-44 max-w-56 min-h-[120px]",
6660
6707
  props?.selected ? "ring-2 ring-indigo-400/60 ring-offset-1" : ""
6661
6708
  ),
@@ -6732,7 +6779,7 @@ function PostItDataProduct(props) {
6732
6779
  as: "div",
6733
6780
  value: name,
6734
6781
  tooltipBorderColor: "#6366f1",
6735
- className: classNames20(
6782
+ className: classNames19(
6736
6783
  "text-[13px] font-bold leading-snug min-w-0 truncate",
6737
6784
  deprecated ? "text-indigo-950/40 line-through" : "text-indigo-950"
6738
6785
  ),
@@ -6769,7 +6816,7 @@ function DefaultDataProduct(props) {
6769
6816
  return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
6770
6817
  "div",
6771
6818
  {
6772
- className: classNames20(
6819
+ className: classNames19(
6773
6820
  "relative min-w-48 max-w-60 rounded-xl border-2 overflow-visible",
6774
6821
  props?.selected ? "ring-2 ring-indigo-400/60 ring-offset-2" : "",
6775
6822
  deprecated ? "border-dashed border-red-500" : draft ? `border-dashed ${isDark ? "border-indigo-400" : "border-indigo-400/60"}` : "border-indigo-500"
@@ -6796,12 +6843,12 @@ function DefaultDataProduct(props) {
6796
6843
  }
6797
6844
  ),
6798
6845
  notes && notes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(NotesIndicator, { notes, resourceName: name }),
6799
- targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(GlowHandle17, { side: "left" }),
6800
- sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(GlowHandle17, { side: "right" }),
6846
+ targetConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(GlowHandle19, { side: "left" }),
6847
+ sourceConnections.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(GlowHandle19, { side: "right" }),
6801
6848
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "absolute -top-2.5 left-2.5 flex items-center gap-1.5 z-10", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
6802
6849
  "span",
6803
6850
  {
6804
- className: classNames20(
6851
+ className: classNames19(
6805
6852
  "inline-flex items-center gap-1 text-[7px] font-bold uppercase tracking-widest text-white px-1.5 py-0.5 rounded shadow-sm",
6806
6853
  deprecated ? "bg-red-500" : "bg-indigo-500"
6807
6854
  ),
@@ -15609,6 +15656,7 @@ var exportNodeGraphForStudio = (data) => {
15609
15656
  DATA,
15610
15657
  Data,
15611
15658
  DataProductNode,
15659
+ DomainCardNode,
15612
15660
  DomainNode,
15613
15661
  ENTITY_TARGET_HANDLE_ID,
15614
15662
  EVENT,