@eventcatalog/core 4.12.3 → 5.0.0-beta.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.
Files changed (267) hide show
  1. package/LICENSE +226 -95
  2. package/NOTICE +30 -0
  3. package/README.md +3 -2
  4. package/dist/analytics/analytics.cjs +1 -1
  5. package/dist/analytics/analytics.js +2 -2
  6. package/dist/analytics/log-build.cjs +43 -16
  7. package/dist/analytics/log-build.d.cts +6 -5
  8. package/dist/analytics/log-build.d.ts +6 -5
  9. package/dist/analytics/log-build.js +4 -3
  10. package/dist/{chunk-U4YJSTGV.js → chunk-AYNZXUB5.js} +2 -10
  11. package/dist/{chunk-TV3YAWKQ.js → chunk-CR6AK5LR.js} +1 -1
  12. package/dist/{chunk-M577VUOX.js → chunk-LR7AGRHN.js} +13 -16
  13. package/dist/chunk-TQLRG35T.js +203 -0
  14. package/dist/{chunk-HPC6KUDQ.js → chunk-TWN43V4T.js} +1 -1
  15. package/dist/{chunk-ZYTCBNB3.js → chunk-WAIADKQE.js} +1 -1
  16. package/dist/{chunk-5BPN6QEC.js → chunk-ZHKEARLJ.js} +1 -1
  17. package/dist/constants.cjs +1 -1
  18. package/dist/constants.js +1 -1
  19. package/dist/eventcatalog.cjs +407 -291
  20. package/dist/eventcatalog.config.d.cts +2 -3
  21. package/dist/eventcatalog.config.d.ts +2 -3
  22. package/dist/eventcatalog.js +35 -98
  23. package/dist/federation/content-cache.d.cts +0 -5
  24. package/dist/federation/content-cache.d.ts +0 -5
  25. package/dist/federation/diagnostics.d.cts +0 -5
  26. package/dist/federation/diagnostics.d.ts +0 -5
  27. package/dist/federation/federate.cjs +0 -9
  28. package/dist/federation/federate.d.cts +0 -5
  29. package/dist/federation/federate.d.ts +0 -5
  30. package/dist/federation/federate.js +4 -5
  31. package/dist/federation/filesystem-source-provider.d.cts +0 -5
  32. package/dist/federation/filesystem-source-provider.d.ts +0 -5
  33. package/dist/federation/github-source-provider.d.cts +0 -5
  34. package/dist/federation/github-source-provider.d.ts +0 -5
  35. package/dist/federation/output-transaction.d.cts +0 -4
  36. package/dist/federation/output-transaction.d.ts +0 -4
  37. package/dist/federation/public-assets.d.cts +0 -5
  38. package/dist/federation/public-assets.d.ts +0 -5
  39. package/dist/federation/source-provider.d.cts +0 -5
  40. package/dist/federation/source-provider.d.ts +0 -5
  41. package/dist/federation/types.d.cts +0 -5
  42. package/dist/federation/types.d.ts +0 -5
  43. package/dist/generate.cjs +1 -1
  44. package/dist/generate.js +3 -3
  45. package/dist/license-C1y-56bb.d.cts +23 -0
  46. package/dist/license-C1y-56bb.d.ts +23 -0
  47. package/dist/runtime-dependencies/@eventcatalog__visualiser__layout.mjs +3 -0
  48. package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps.mjs +3 -0
  49. package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps__react.mjs +3 -0
  50. package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps__server.mjs +3 -0
  51. package/dist/runtime-dependencies/@modelcontextprotocol__sdk__types.js.mjs +3 -0
  52. package/dist/runtime-dependencies/manifest.json +12 -1
  53. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__graphql.mjs +3 -0
  54. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__json.mjs +3 -0
  55. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__markup.mjs +3 -0
  56. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__protobuf.mjs +3 -0
  57. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__yaml.mjs +3 -0
  58. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__styles__prism__one-dark.mjs +3 -0
  59. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__styles__prism__one-light.mjs +3 -0
  60. package/dist/utils/cli-logger.cjs +1 -1
  61. package/dist/utils/cli-logger.js +2 -2
  62. package/dist/utils/license-status.cjs +240 -0
  63. package/dist/utils/license-status.d.cts +28 -0
  64. package/dist/utils/license-status.d.ts +28 -0
  65. package/dist/utils/license-status.js +12 -0
  66. package/eventcatalog/astro.config.mjs +1 -1
  67. package/eventcatalog/integrations/eventcatalog-runtime.mjs +1 -1
  68. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +29 -19
  69. package/eventcatalog/src/components/ChatPanel/OfflineReply.tsx +74 -0
  70. package/eventcatalog/src/components/FieldsExplorer/FieldFilters.tsx +24 -28
  71. package/eventcatalog/src/components/FieldsExplorer/FieldNodeGraph.tsx +16 -11
  72. package/eventcatalog/src/components/FieldsExplorer/FieldsExplorer.tsx +4 -218
  73. package/eventcatalog/src/components/FieldsExplorer/FieldsTable.tsx +27 -36
  74. package/eventcatalog/src/components/Header.astro +43 -58
  75. package/eventcatalog/src/components/Lists/PillListFlat.styles.css +17 -17
  76. package/eventcatalog/src/components/MDX/EntityMap/EntityMap.astro +1 -1
  77. package/eventcatalog/src/components/MDX/Flow/Flow.astro +4 -0
  78. package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +14 -0
  79. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +49 -18
  80. package/eventcatalog/src/components/MDX/RemoteFile.astro +2 -24
  81. package/eventcatalog/src/components/SchemaExplorer/ApiAccessSection.tsx +59 -93
  82. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +1 -32
  83. package/eventcatalog/src/components/SchemaExplorer/DiffViewer.tsx +20 -67
  84. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -11
  85. package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +11 -60
  86. package/eventcatalog/src/components/SchemaExplorer/SchemaExplorer.tsx +1 -3
  87. package/eventcatalog/src/components/SchemaExplorer/SchemaPageViewer.tsx +0 -3
  88. package/eventcatalog/src/components/SchemaExplorer/VersionHistoryModal.tsx +2 -9
  89. package/eventcatalog/src/components/SchemaExplorer/parse-schema.ts +46 -0
  90. package/eventcatalog/src/components/SchemaExplorer/utils.ts +11 -0
  91. package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +2 -9
  92. package/eventcatalog/src/components/Settings/LicenseSettings.tsx +288 -0
  93. package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +3 -19
  94. package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +85 -30
  95. package/eventcatalog/src/components/Settings/SettingsShared.tsx +7 -75
  96. package/eventcatalog/src/components/SideNav/CustomDocsNav.astro +2 -2
  97. package/eventcatalog/src/components/TrialBadge.astro +82 -0
  98. package/eventcatalog/src/content.config.ts +9 -96
  99. package/eventcatalog/src/{enterprise → features}/ai/chat-api.ts +22 -34
  100. package/eventcatalog/src/{enterprise → features}/analytics/adapters/ga4.ts +0 -5
  101. package/eventcatalog/src/{enterprise → features}/analytics/adapters/gtm.ts +0 -5
  102. package/eventcatalog/src/{enterprise → features}/analytics/adapters/posthog.ts +0 -5
  103. package/eventcatalog/src/{enterprise → features}/analytics/components/AnalyticsHead.astro +2 -4
  104. package/eventcatalog/src/{enterprise → features}/analytics/components/AnalyticsTracker.astro +2 -4
  105. package/eventcatalog/src/{enterprise → features}/analytics/tracker.ts +0 -5
  106. package/eventcatalog/src/{enterprise → features}/api/catalog.ts +0 -5
  107. package/eventcatalog/src/{enterprise → features}/auth/[...auth].ts +0 -5
  108. package/eventcatalog/src/{enterprise → features}/auth/middleware/middleware-auth.ts +0 -5
  109. package/eventcatalog/src/{enterprise → features}/auth/middleware/middleware.ts +0 -5
  110. package/eventcatalog/src/{enterprise → features}/collections/custom-pages.ts +0 -5
  111. package/eventcatalog/src/{enterprise → features}/collections/index.ts +0 -5
  112. package/eventcatalog/src/{enterprise → features}/collections/resource-docs.ts +0 -5
  113. package/eventcatalog/src/{enterprise → features}/custom-documentation/collection.ts +0 -5
  114. package/eventcatalog/src/features/custom-documentation/components/CustomDocsNav/CustomDocsNav.astro +9 -0
  115. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/CustomDocsNavWrapper.tsx +0 -5
  116. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/components/NestedItem.tsx +1 -6
  117. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/components/NoResultsFound.tsx +0 -5
  118. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/index.tsx +1 -6
  119. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/types.ts +0 -5
  120. package/eventcatalog/src/{enterprise/custom-documentation/pages/docs/custom/index.astro → features/custom-documentation/components/CustomDocumentationPage.astro} +5 -5
  121. package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/badge-styles.ts +0 -5
  122. package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/custom-docs.ts +1 -6
  123. package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/docs-search.ts +0 -5
  124. package/eventcatalog/src/{enterprise → features}/custom-pages/routes.ts +0 -5
  125. package/eventcatalog/src/{enterprise → features}/directory/user-team-directory.ts +0 -5
  126. package/eventcatalog/src/{enterprise → features}/fields/field-extractor.ts +0 -5
  127. package/eventcatalog/src/{enterprise → features}/fields/field-indexer.ts +0 -5
  128. package/eventcatalog/src/{enterprise → features}/fields/fields-db.ts +0 -5
  129. package/eventcatalog/src/{enterprise → features}/fields/pages/api/fields.ts +1 -6
  130. package/eventcatalog/src/{enterprise → features}/fields/pages/fields.astro +1 -2
  131. package/eventcatalog/src/{enterprise → features}/integrations/eventcatalog-features.ts +17 -75
  132. package/eventcatalog/src/features/mcp/apps/architecture-diagram/links.ts +59 -0
  133. package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +299 -0
  134. package/eventcatalog/src/features/mcp/apps/architecture-diagram/shared.ts +14 -0
  135. package/eventcatalog/src/features/mcp/apps/architecture-diagram/view.tsx +454 -0
  136. package/eventcatalog/src/features/mcp/apps/generated/viewer.html +432 -0
  137. package/eventcatalog/src/features/mcp/apps/mermaid-stub.ts +10 -0
  138. package/eventcatalog/src/features/mcp/apps/schema-viewer/schema-code.tsx +65 -0
  139. package/eventcatalog/src/features/mcp/apps/schema-viewer/shared.ts +23 -0
  140. package/eventcatalog/src/features/mcp/apps/schema-viewer/view.tsx +170 -0
  141. package/eventcatalog/src/features/mcp/apps/shared/app-view.tsx +98 -0
  142. package/eventcatalog/src/features/mcp/apps/shared/resource-types.ts +15 -0
  143. package/eventcatalog/src/features/mcp/apps/viewer/shared.ts +24 -0
  144. package/eventcatalog/src/features/mcp/apps/viewer/styles.css +25 -0
  145. package/eventcatalog/src/features/mcp/apps/viewer/view.tsx +59 -0
  146. package/eventcatalog/src/features/mcp/mcp-app-icons.ts +63 -0
  147. package/eventcatalog/src/features/mcp/mcp-apps.ts +160 -0
  148. package/eventcatalog/src/{enterprise → features}/mcp/mcp-auth.ts +0 -5
  149. package/eventcatalog/src/{enterprise → features}/mcp/mcp-scope.ts +7 -7
  150. package/eventcatalog/src/{enterprise → features}/mcp/mcp-scoped-tools.ts +47 -40
  151. package/eventcatalog/src/{enterprise → features}/mcp/mcp-server.ts +347 -34
  152. package/eventcatalog/src/{enterprise → features}/mcp/oauth-protected-resource.ts +0 -5
  153. package/eventcatalog/src/features/mcp/schema-viewer.ts +24 -0
  154. package/eventcatalog/src/{enterprise → features}/tools/catalog-tools.ts +133 -102
  155. package/eventcatalog/src/features/tools/index.ts +5 -0
  156. package/eventcatalog/src/{enterprise → features}/visualizer-layout/reset.ts +0 -5
  157. package/eventcatalog/src/{enterprise → features}/visualizer-layout/save.ts +0 -5
  158. package/eventcatalog/src/layouts/BaseLayout.astro +2 -2
  159. package/eventcatalog/src/layouts/Footer.astro +31 -39
  160. package/eventcatalog/src/layouts/SettingsLayout.astro +6 -6
  161. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +7 -37
  162. package/eventcatalog/src/{enterprise → pages}/api/schemas/[collection]/[id]/[version]/index.ts +0 -22
  163. package/eventcatalog/src/{enterprise → pages}/api/schemas/services/[id]/[version]/[specification]/index.ts +0 -19
  164. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +2 -6
  165. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -5
  166. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +2 -6
  167. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -5
  168. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId].md.ts +2 -6
  169. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId].mdx.ts +2 -6
  170. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +9 -5
  171. package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +12 -0
  172. package/eventcatalog/src/{enterprise/custom-documentation/pages/docs/custom/root-index.astro → pages/docs/custom/index.astro} +1 -23
  173. package/eventcatalog/src/pages/docs/llm/llms-full.txt.ts +4 -9
  174. package/eventcatalog/src/pages/docs/llm/llms.txt.ts +4 -4
  175. package/eventcatalog/src/pages/docs/llm/schemas.txt.ts +0 -11
  176. package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +2 -2
  177. package/eventcatalog/src/pages/index.astro +2 -2
  178. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +0 -3
  179. package/eventcatalog/src/pages/schemas/explorer/index.astro +1 -4
  180. package/eventcatalog/src/pages/settings/assistant.astro +2 -4
  181. package/eventcatalog/src/pages/settings/license.astro +18 -0
  182. package/eventcatalog/src/pages/settings/llm-access.astro +1 -4
  183. package/eventcatalog/src/pages/settings/mcp.astro +33 -4
  184. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +1 -2
  185. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +2 -45
  186. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -1
  187. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version].mermaid.ts +7 -109
  188. package/eventcatalog/src/pages/visualiser/_mermaid-route.ts +78 -0
  189. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/_index.data.ts +44 -0
  190. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -1
  191. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +56 -0
  192. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +3 -40
  193. package/eventcatalog/src/pages/visualiser/domains/[id]/[version].mermaid.ts +20 -0
  194. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/_index.data.ts +29 -0
  195. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +3 -38
  196. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +56 -0
  197. package/eventcatalog/src/pages/visualiser/systems/[id]/[version].mermaid.ts +20 -0
  198. package/eventcatalog/src/stores/sidebar-store/builders/agent.ts +1 -1
  199. package/eventcatalog/src/stores/sidebar-store/builders/container.ts +1 -1
  200. package/eventcatalog/src/stores/sidebar-store/builders/data-product.ts +1 -1
  201. package/eventcatalog/src/stores/sidebar-store/builders/domain.ts +7 -32
  202. package/eventcatalog/src/stores/sidebar-store/builders/entity.ts +1 -1
  203. package/eventcatalog/src/stores/sidebar-store/builders/message.ts +1 -1
  204. package/eventcatalog/src/stores/sidebar-store/builders/service.ts +2 -8
  205. package/eventcatalog/src/stores/sidebar-store/builders/system.ts +2 -12
  206. package/eventcatalog/src/stores/sidebar-store/custom-sidebar.ts +0 -10
  207. package/eventcatalog/src/stores/sidebar-store/state.ts +4 -6
  208. package/eventcatalog/src/styles/theme.css +22 -18
  209. package/eventcatalog/src/styles/themes/forest.css +8 -8
  210. package/eventcatalog/src/styles/themes/ocean.css +8 -8
  211. package/eventcatalog/src/styles/themes/sapphire.css +8 -8
  212. package/eventcatalog/src/styles/themes/sunset.css +8 -8
  213. package/eventcatalog/src/utils/clipboard.ts +4 -4
  214. package/eventcatalog/src/utils/collections/flow-step-schema.ts +117 -0
  215. package/eventcatalog/src/utils/collections/pointer-schema.ts +7 -0
  216. package/eventcatalog/src/utils/collections/resource-docs.ts +677 -14
  217. package/eventcatalog/src/utils/collections/schema-loader.ts +0 -5
  218. package/eventcatalog/src/utils/feature.ts +14 -23
  219. package/eventcatalog/src/utils/license.ts +114 -0
  220. package/eventcatalog/src/utils/node-graphs/architecture-diagram-types.ts +32 -0
  221. package/eventcatalog/src/utils/node-graphs/architecture-diagram.ts +84 -0
  222. package/eventcatalog/src/utils/node-graphs/channel-node-graph.ts +4 -25
  223. package/eventcatalog/src/utils/node-graphs/container-node-graph.ts +12 -39
  224. package/eventcatalog/src/utils/node-graphs/data-products-node-graph.ts +11 -27
  225. package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +679 -0
  226. package/eventcatalog/src/utils/node-graphs/domains-node-graph.ts +3 -20
  227. package/eventcatalog/src/utils/node-graphs/export-mermaid.ts +51 -4
  228. package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +8 -23
  229. package/eventcatalog/src/utils/node-graphs/flow-lanes.ts +119 -0
  230. package/eventcatalog/src/utils/node-graphs/flows-node-graph.ts +133 -47
  231. package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +28 -0
  232. package/eventcatalog/src/utils/node-graphs/layout-persistence.ts +3 -3
  233. package/eventcatalog/src/utils/node-graphs/message-node-graph.ts +16 -34
  234. package/eventcatalog/src/utils/node-graphs/services-node-graph.ts +11 -25
  235. package/eventcatalog/src/utils/node-graphs/system-context-node-graph.ts +18 -54
  236. package/eventcatalog/src/utils/node-graphs/system-levels-node-graph.ts +59 -0
  237. package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +20 -80
  238. package/eventcatalog/src/utils/node-graphs/utils/utils.ts +1 -78
  239. package/eventcatalog/src/utils/trial.ts +36 -0
  240. package/eventcatalog/tsconfig.json +1 -1
  241. package/package.json +11 -11
  242. package/dist/chunk-FV56YFM4.js +0 -7
  243. package/dist/federation/entitlement.cjs +0 -31
  244. package/dist/federation/entitlement.d.cts +0 -12
  245. package/dist/federation/entitlement.d.ts +0 -12
  246. package/dist/federation/entitlement.js +0 -6
  247. package/dist/runtime-dependencies/dagre.mjs +0 -3
  248. package/eventcatalog/src/components/Settings/BillingSettingsForm.tsx +0 -265
  249. package/eventcatalog/src/enterprise/LICENSE +0 -57
  250. package/eventcatalog/src/enterprise/README.md +0 -5
  251. package/eventcatalog/src/enterprise/collections/resource-docs-utils.ts +0 -691
  252. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/CustomDocsNav.astro +0 -9
  253. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/[...path]/index.astro +0 -18
  254. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/feature.astro +0 -171
  255. package/eventcatalog/src/enterprise/feature.ts +0 -75
  256. package/eventcatalog/src/enterprise/tools/index.ts +0 -10
  257. package/eventcatalog/src/hooks/eventcatalog-visualizer.ts +0 -126
  258. package/eventcatalog/src/pages/settings/billing.astro +0 -17
  259. package/eventcatalog/src/pages/visualiser/domain-integrations/index.astro +0 -26
  260. package/eventcatalog/src/types/mcp-modules.d.ts +0 -67
  261. package/eventcatalog/src/utils/node-graphs/domains-canvas.ts +0 -261
  262. package/eventcatalog/src/utils/node-graphs/export-node-graph.ts +0 -91
  263. /package/eventcatalog/src/{enterprise → features}/auth/error.astro +0 -0
  264. /package/eventcatalog/src/{enterprise → features}/auth/login.astro +0 -0
  265. /package/eventcatalog/src/{enterprise → features}/auth/unauthorized.astro +0 -0
  266. /package/eventcatalog/src/{enterprise/custom-documentation/pages → pages}/docs/custom/[...path]/_index.data.ts +0 -0
  267. /package/eventcatalog/src/{enterprise/custom-documentation/pages → pages}/docs/custom/[...path].mdx.ts +0 -0
@@ -79,7 +79,7 @@ const nodesWithLayout = applyLayoutToNodes(nodes as any[], savedLayout);
79
79
  linkTo={'visualiser'}
80
80
  mode="simple"
81
81
  includeKey={includeKey}
82
- footerLabel={`Entity Map - ${resource?.data?.name} - v(${resource?.data?.version})`}
82
+ footerLabel={`Entity Diagram - ${resource?.data?.name} - v(${resource?.data?.version})`}
83
83
  client:only="react"
84
84
  portalId={`${id}-entity-map-portal`}
85
85
  isChatEnabled={isChatEnabled}
@@ -10,10 +10,13 @@ import { isVisualiserEnabled, isEventCatalogChatVisible, isDevMode } from '@util
10
10
  import { loadSavedLayout, applyLayoutToNodes, buildResourceKey } from '@utils/node-graphs/layout-persistence';
11
11
  import { randomUUID } from 'node:crypto';
12
12
  import { parseMdxBooleanProp } from '@utils/markdown';
13
+ import { isFlowGroupBy } from '@eventcatalog/visualiser';
13
14
 
14
15
  const isChatEnabled = isEventCatalogChatVisible();
15
16
 
16
17
  const { id, version = 'latest', maxHeight, mode = 'simple' } = Astro.props;
18
+ // Group the steps to start with (a string in MDX, so only a way they can be grouped)
19
+ const lanes = isFlowGroupBy(Astro.props.lanes) ? Astro.props.lanes : undefined;
17
20
  const includeKey = parseMdxBooleanProp(Astro.props.legend ?? Astro.props.includeKey, true);
18
21
  const search = parseMdxBooleanProp(Astro.props.search, false);
19
22
  const walkthrough = parseMdxBooleanProp(Astro.props.walkthrough, false);
@@ -74,6 +77,7 @@ const portalId = `${id}-${flow?.data.version}-flow-${randomUUID()}-portal`;
74
77
  isChatEnabled={isChatEnabled}
75
78
  isDevMode={isDevMode()}
76
79
  resourceKey={resourceKey}
80
+ swimlanes={lanes}
77
81
  />
78
82
  </div>
79
83
 
@@ -14,6 +14,7 @@
14
14
 
15
15
  import { useCallback, lazy, Suspense } from 'react';
16
16
  import type { Node, Edge } from '@xyflow/react';
17
+ import type { FlowGroupBy } from '@eventcatalog/visualiser';
17
18
  import { buildUrl } from '@utils/url-builder';
18
19
 
19
20
  const NodeGraph = lazy(() =>
@@ -43,6 +44,19 @@ interface AstroNodeGraphProps {
43
44
  isDevMode?: boolean;
44
45
  resourceKey?: string;
45
46
  disableMessageAnimation?: boolean;
47
+ // A simpler graph shown as level 1 (e.g. a system's context diagram)
48
+ overviewGraph?: {
49
+ nodes: Node[];
50
+ edges: Edge[];
51
+ label: string;
52
+ resourceKey?: string;
53
+ };
54
+ // This graph laid out with its messages and channels hidden (level 2), if precomputed
55
+ hiddenMessagesGraph?: { nodes: Node[]; edges: Edge[] };
56
+ // The kind of diagram, so the level is remembered for each kind
57
+ preferenceScope?: string;
58
+ // Group a flow's steps into swimlanes to start with
59
+ swimlanes?: FlowGroupBy;
46
60
  }
47
61
 
48
62
  const AstroNodeGraph = ({ isDevMode = false, resourceKey, ...otherProps }: AstroNodeGraphProps) => {
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  import AstroNodeGraph from './AstroNodeGraph';
3
+ import type { FlowGroupBy } from '@eventcatalog/visualiser';
3
4
  // Imported here (server side) rather than from the React island: Astro then emits it as a
4
5
  // <link> in the page head, which survives ClientRouter navigations. A dynamic import from the
5
6
  // island injects a <style> that the view-transition head swap removes — and the cached module
@@ -14,7 +15,6 @@ import {
14
15
  } from '@utils/node-graphs/message-node-graph';
15
16
  import { getNodesAndEdges as getNodesAndEdgesForDomain } from '@utils/node-graphs/domains-node-graph';
16
17
  import { getNodesAndEdges as getNodesAndEdgesForDomainEntityMap } from '@utils/node-graphs/domain-entity-map';
17
- import { getDomainsCanvasData } from '@utils/node-graphs/domains-canvas';
18
18
  import { getNodesAndEdges as getNodesAndEdgesForFlows } from '@utils/node-graphs/flows-node-graph';
19
19
  import { getNodesAndEdges as getNodesAndEdgesForDataProduct } from '@utils/node-graphs/data-products-node-graph';
20
20
  import { getNodesAndEdges as getNodesAndEdgesForSystem } from '@utils/node-graphs/systems-node-graph';
@@ -23,6 +23,8 @@ import {
23
23
  getNodesAndEdgesForDomainSystems as getNodesAndEdgesForDomainSystemsContext,
24
24
  getNodesAndEdgesForAllSystems as getNodesAndEdgesForSystemContextMap,
25
25
  } from '@utils/node-graphs/system-context-node-graph';
26
+ import { getNodesAndEdges as getNodesAndEdgesForSystemLevels } from '@utils/node-graphs/system-levels-node-graph';
27
+ import { getNodesAndEdges as getNodesAndEdgesForDomainLevels } from '@utils/node-graphs/domain-levels-node-graph';
26
28
  import { buildUrl } from '@utils/url-builder';
27
29
  import { getVersionFromCollection } from '@utils/collections/versions';
28
30
  import { pageDataLoader } from '@utils/page-loaders/page-data-loader';
@@ -56,6 +58,11 @@ interface Props {
56
58
  portalId?: string;
57
59
  // Disable + hide the "Simulate Messages" animation (e.g. on the Context Diagram).
58
60
  disableMessageAnimation?: boolean;
61
+ // Labels level 1 of a levels page (`systems-levels` or `domains-levels`): a
62
+ // system's context diagram, or a domain's systems and the domains they talk to.
63
+ overview?: { label: string };
64
+ // Flows only: group the steps into swimlanes to start with
65
+ lanes?: FlowGroupBy;
59
66
  }
60
67
 
61
68
  const {
@@ -72,6 +79,8 @@ const {
72
79
  zoomOnScroll = false,
73
80
  portalId,
74
81
  disableMessageAnimation,
82
+ overview,
83
+ lanes,
75
84
  } = Astro.props;
76
85
 
77
86
  let nodes = [],
@@ -139,12 +148,6 @@ if (collection === 'system-context-map') {
139
148
  edges = fetchedEdges;
140
149
  }
141
150
 
142
- if (collection === 'domains-canvas') {
143
- const { domainNodes, messageNodes, edges: fetchedEdges } = await getDomainsCanvasData();
144
- nodes = [...domainNodes, ...messageNodes];
145
- edges = fetchedEdges;
146
- }
147
-
148
151
  if (collection === 'systems-context') {
149
152
  const { nodes: fetchedNodes, edges: fetchedEdges } = await getNodesAndEdgesForSystemContext({
150
153
  id,
@@ -155,6 +158,25 @@ if (collection === 'systems-context') {
155
158
  edges = fetchedEdges;
156
159
  }
157
160
 
161
+ // Levels pages: a system's resource diagram inside its context diagram, or a
162
+ // domain's systems expanded with the other domains they talk to. Level 1 (the
163
+ // overview) and the level without messages are built from the same graph.
164
+ let levelsOverview: { nodes: any[]; edges: any[] } | undefined;
165
+ let hiddenMessagesGraph: { nodes: any[]; edges: any[] } | undefined;
166
+ if (collection === 'systems-levels' || collection === 'domains-levels') {
167
+ const getLevels = collection === 'systems-levels' ? getNodesAndEdgesForSystemLevels : getNodesAndEdgesForDomainLevels;
168
+ const levels = await getLevels({
169
+ id,
170
+ version,
171
+ mode,
172
+ channelRenderMode: config.visualiser?.channels?.renderMode === 'single' ? 'single' : 'flat',
173
+ });
174
+ nodes = levels.nodes;
175
+ edges = levels.edges;
176
+ levelsOverview = levels.overview;
177
+ hiddenMessagesGraph = compactVisualiserGraph(levels.hiddenMessages.nodes, levels.hiddenMessages.edges);
178
+ }
179
+
158
180
  if (collection === 'domains-systems-context') {
159
181
  const { nodes: fetchedNodes, edges: fetchedEdges } = await getNodesAndEdgesForDomainSystemsContext({
160
182
  id,
@@ -184,17 +206,6 @@ if (collection === 'services-entities') {
184
206
  edges = fetchedEdges;
185
207
  }
186
208
 
187
- if (collection === 'services-containers') {
188
- const { nodes: fetchedNodes, edges: fetchedEdges } = await getNodesAndEdgesForService({
189
- id,
190
- version,
191
- renderMessages: false,
192
- mode: 'full',
193
- });
194
- nodes = fetchedNodes;
195
- edges = fetchedEdges;
196
- }
197
-
198
209
  // Load and apply saved layout if it exists (dev mode feature)
199
210
  const resourceKey = buildResourceKey(collection, id, version);
200
211
  const savedLayout = await loadSavedLayout(resourceKey);
@@ -202,6 +213,22 @@ const nodesWithLayout = applyLayoutToNodes(nodes as any[], savedLayout);
202
213
  // Drop hydrated collection entries / markdown bodies before Astro serialises
203
214
  // the graph into the page. Visualiser components only need a small field set.
204
215
  const { nodes: clientNodes, edges: clientEdges } = compactVisualiserGraph(nodesWithLayout as any[], edges as any[]);
216
+
217
+ let overviewGraph;
218
+ if (overview && levelsOverview) {
219
+ // The system context keeps the key its own page used, so saved layouts carry over
220
+ const overviewResourceKey = buildResourceKey(
221
+ collection === 'systems-levels' ? 'systems-context' : `${collection}-overview`,
222
+ id,
223
+ version
224
+ );
225
+ const overviewLayout = await loadSavedLayout(overviewResourceKey);
226
+ overviewGraph = {
227
+ ...compactVisualiserGraph(applyLayoutToNodes(levelsOverview.nodes, overviewLayout), levelsOverview.edges),
228
+ label: overview.label,
229
+ resourceKey: overviewResourceKey,
230
+ };
231
+ }
205
232
  ---
206
233
 
207
234
  <div>
@@ -226,6 +253,10 @@ const { nodes: clientNodes, edges: clientEdges } = compactVisualiserGraph(nodesW
226
253
  resourceKey={resourceKey}
227
254
  portalId={portalId}
228
255
  disableMessageAnimation={disableMessageAnimation ?? collection === 'systems-context'}
256
+ overviewGraph={overviewGraph}
257
+ hiddenMessagesGraph={hiddenMessagesGraph}
258
+ preferenceScope={collection}
259
+ swimlanes={lanes}
229
260
  />
230
261
  </div>
231
262
 
@@ -2,7 +2,6 @@
2
2
  import { JSONPath } from 'jsonpath-plus';
3
3
  import JSONSchemaViewer from '@components/SchemaExplorer/JSONSchemaViewer';
4
4
  import { Code } from 'astro-expressive-code/components';
5
- import { isPrivateRemoteSchemaEnabled } from '@utils/feature';
6
5
  import { resolveTemplateVariables } from '@utils/remote-file';
7
6
  import { resolveSchemaRefs } from '@utils/json-schema-refs';
8
7
 
@@ -60,20 +59,13 @@ function extractWithJSONPath(data: any, path: string): any {
60
59
  }
61
60
 
62
61
  const resolvedUrl = resolveTemplateVariables(url);
63
- const resolvedHeaders = isPrivateRemoteSchemaEnabled() ? resolveTemplateVariables(headers) : {};
62
+ const resolvedHeaders = resolveTemplateVariables(headers);
64
63
 
65
64
  let content = '';
66
65
  let processedData: any = null;
67
66
  let contentType = 'text';
68
67
  let isSchema = false;
69
68
  let error = null;
70
- let showPaidFeatureMessage = false;
71
-
72
- // Check if headers were provided but private remote schema is not enabled
73
- if (Object.keys(headers).length > 0 && !isPrivateRemoteSchemaEnabled()) {
74
- error = '401 Unauthorized - Headers provided but private remote schema feature is not enabled';
75
- showPaidFeatureMessage = true;
76
- }
77
69
 
78
70
  try {
79
71
  const response = await fetch(String(resolvedUrl), {
@@ -106,9 +98,7 @@ try {
106
98
  }
107
99
  }
108
100
  } catch (e) {
109
- if (!showPaidFeatureMessage) {
110
- error = e instanceof Error ? e.message : String(e);
111
- }
101
+ error = e instanceof Error ? e.message : String(e);
112
102
  }
113
103
 
114
104
  // Determine rendering method
@@ -129,18 +119,6 @@ if (renderAs === 'auto') {
129
119
  Error loading remote file: <span class=" text-red-900">{url}</span>
130
120
  </strong>
131
121
  <p class="text-xs py-2">{` ${error} `}</p>
132
- {showPaidFeatureMessage && (
133
- <div class="my-1 p-3 bg-white border border-gray-200 rounded text-gray-700">
134
- <strong>Private API Access</strong>
135
- <p class="mt-1 text-xs">
136
- Fetching files from private APIs with headers is a paid feature.
137
- <a href="https://eventcatalog.cloud" class="underline hover:no-underline" target="_blank" rel="noopener noreferrer">
138
- Sign up for a EventCatalog Scale license key
139
- </a>{' '}
140
- to access this functionality.
141
- </p>
142
- </div>
143
- )}
144
122
  </div>
145
123
  ) : (
146
124
  <div class="remote-file-content">
@@ -1,5 +1,5 @@
1
1
  import { ChevronUpIcon, ChevronDownIcon, ClipboardDocumentIcon, CheckIcon } from '@heroicons/react/24/outline';
2
- import { CommandLineIcon, LockClosedIcon } from '@heroicons/react/24/solid';
2
+ import { CommandLineIcon } from '@heroicons/react/24/solid';
3
3
  import type { SchemaItem } from './types';
4
4
 
5
5
  interface ApiAccessSectionProps {
@@ -8,17 +8,9 @@ interface ApiAccessSectionProps {
8
8
  onToggle: () => void;
9
9
  onCopy: (content: string, id: string) => void;
10
10
  copiedId: string | null;
11
- apiAccessEnabled?: boolean;
12
11
  }
13
12
 
14
- export default function ApiAccessSection({
15
- message,
16
- isExpanded,
17
- onToggle,
18
- onCopy,
19
- copiedId,
20
- apiAccessEnabled = false,
21
- }: ApiAccessSectionProps) {
13
+ export default function ApiAccessSection({ message, isExpanded, onToggle, onCopy, copiedId }: ApiAccessSectionProps) {
22
14
  // Generate API path based on collection type
23
15
  let apiPath = '';
24
16
  if (message.collection === 'services') {
@@ -41,12 +33,6 @@ export default function ApiAccessSection({
41
33
  <div className="flex items-center gap-2">
42
34
  <CommandLineIcon className="h-3.5 w-3.5 text-[rgb(var(--ec-icon-color))]" />
43
35
  <span className="text-xs font-medium text-[rgb(var(--ec-page-text))]">API</span>
44
- {!apiAccessEnabled && (
45
- <span className="inline-flex items-center gap-1 rounded bg-[rgb(var(--ec-accent-subtle))] px-1.5 py-0.5 text-[10px] font-medium text-[rgb(var(--ec-accent-text))] border border-[rgb(var(--ec-accent)/0.2)]">
46
- <LockClosedIcon className="h-2.5 w-2.5" />
47
- Scale
48
- </span>
49
- )}
50
36
  </div>
51
37
  {isExpanded ? (
52
38
  <ChevronUpIcon className="h-3.5 w-3.5 text-[rgb(var(--ec-page-text-muted))]" />
@@ -57,86 +43,66 @@ export default function ApiAccessSection({
57
43
 
58
44
  {isExpanded && (
59
45
  <div className="px-4 pb-3">
60
- {apiAccessEnabled ? (
61
- <div className="space-y-2">
62
- {/* Endpoint */}
63
- <div className="flex items-center gap-2 bg-gray-900 rounded-md px-3 py-2">
64
- <span className="text-[10px] font-semibold text-emerald-400 uppercase tracking-wide">GET</span>
65
- <code className="flex-1 text-[11px] text-gray-300 font-mono truncate">{apiPath}</code>
66
- <button
67
- onClick={() => onCopy(fullUrl, `${message.data.id}-api`)}
68
- className={`flex-shrink-0 p-1 rounded transition-colors ${
69
- isCopied ? 'text-emerald-400' : 'text-gray-500 hover:text-gray-300'
70
- }`}
71
- title="Copy URL"
72
- >
73
- {isCopied ? <CheckIcon className="h-3.5 w-3.5" /> : <ClipboardDocumentIcon className="h-3.5 w-3.5" />}
74
- </button>
75
- </div>
76
-
77
- {/* Quick copy buttons */}
78
- <div className="flex items-center gap-2">
79
- <button
80
- onClick={() => onCopy(curlCommand, `${message.data.id}-curl`)}
81
- className={`inline-flex items-center gap-1.5 px-2 py-1 text-[10px] font-medium rounded border transition-colors ${
82
- copiedId === `${message.data.id}-curl`
83
- ? 'bg-emerald-50 text-emerald-600 border-emerald-200'
84
- : 'text-[rgb(var(--ec-page-text-muted))] border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-input-bg))] hover:text-[rgb(var(--ec-page-text))]'
85
- }`}
86
- >
87
- {copiedId === `${message.data.id}-curl` ? (
88
- <>
89
- <CheckIcon className="h-3 w-3" />
90
- Copied
91
- </>
92
- ) : (
93
- <>
94
- <ClipboardDocumentIcon className="h-3 w-3" />
95
- Copy cURL
96
- </>
97
- )}
98
- </button>
99
- <button
100
- onClick={() => onCopy(fullUrl, `${message.data.id}-url`)}
101
- className={`inline-flex items-center gap-1.5 px-2 py-1 text-[10px] font-medium rounded border transition-colors ${
102
- copiedId === `${message.data.id}-url`
103
- ? 'bg-emerald-50 text-emerald-600 border-emerald-200'
104
- : 'text-[rgb(var(--ec-page-text-muted))] border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-input-bg))] hover:text-[rgb(var(--ec-page-text))]'
105
- }`}
106
- >
107
- {copiedId === `${message.data.id}-url` ? (
108
- <>
109
- <CheckIcon className="h-3 w-3" />
110
- Copied
111
- </>
112
- ) : (
113
- <>
114
- <ClipboardDocumentIcon className="h-3 w-3" />
115
- Copy URL
116
- </>
117
- )}
118
- </button>
119
- </div>
46
+ <div className="space-y-2">
47
+ {/* Endpoint */}
48
+ <div className="flex items-center gap-2 bg-gray-900 rounded-md px-3 py-2">
49
+ <span className="text-[10px] font-semibold text-emerald-400 uppercase tracking-wide">GET</span>
50
+ <code className="flex-1 text-[11px] text-gray-300 font-mono truncate">{apiPath}</code>
51
+ <button
52
+ onClick={() => onCopy(fullUrl, `${message.data.id}-api`)}
53
+ className={`flex-shrink-0 p-1 rounded transition-colors ${
54
+ isCopied ? 'text-emerald-400' : 'text-gray-500 hover:text-gray-300'
55
+ }`}
56
+ title="Copy URL"
57
+ >
58
+ {isCopied ? <CheckIcon className="h-3.5 w-3.5" /> : <ClipboardDocumentIcon className="h-3.5 w-3.5" />}
59
+ </button>
120
60
  </div>
121
- ) : (
122
- <div className="flex items-center justify-between gap-3 bg-[rgb(var(--ec-accent-subtle))] border border-[rgb(var(--ec-accent)/0.2)] rounded-md px-3 py-2.5">
123
- <div className="flex-1 min-w-0">
124
- <p className="text-xs font-medium text-[rgb(var(--ec-page-text))]">Access schemas via API</p>
125
- <p className="text-[10px] text-[rgb(var(--ec-page-text-muted))] mt-0.5">CI/CD, automation & integrations</p>
126
- </div>
127
- <a
128
- href="https://eventcatalog.cloud"
129
- target="_blank"
130
- rel="noopener noreferrer"
131
- className="flex-shrink-0 inline-flex items-center gap-1 px-2.5 py-1.5 text-[11px] font-medium text-white bg-[rgb(var(--ec-accent))] rounded-md hover:bg-[rgb(var(--ec-accent-hover))] transition-colors"
61
+
62
+ {/* Quick copy buttons */}
63
+ <div className="flex items-center gap-2">
64
+ <button
65
+ onClick={() => onCopy(curlCommand, `${message.data.id}-curl`)}
66
+ className={`inline-flex items-center gap-1.5 px-2 py-1 text-[10px] font-medium rounded border transition-colors ${
67
+ copiedId === `${message.data.id}-curl`
68
+ ? 'bg-emerald-50 text-emerald-600 border-emerald-200'
69
+ : 'text-[rgb(var(--ec-page-text-muted))] border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-input-bg))] hover:text-[rgb(var(--ec-page-text))]'
70
+ }`}
71
+ >
72
+ {copiedId === `${message.data.id}-curl` ? (
73
+ <>
74
+ <CheckIcon className="h-3 w-3" />
75
+ Copied
76
+ </>
77
+ ) : (
78
+ <>
79
+ <ClipboardDocumentIcon className="h-3 w-3" />
80
+ Copy cURL
81
+ </>
82
+ )}
83
+ </button>
84
+ <button
85
+ onClick={() => onCopy(fullUrl, `${message.data.id}-url`)}
86
+ className={`inline-flex items-center gap-1.5 px-2 py-1 text-[10px] font-medium rounded border transition-colors ${
87
+ copiedId === `${message.data.id}-url`
88
+ ? 'bg-emerald-50 text-emerald-600 border-emerald-200'
89
+ : 'text-[rgb(var(--ec-page-text-muted))] border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-input-bg))] hover:text-[rgb(var(--ec-page-text))]'
90
+ }`}
132
91
  >
133
- Try Scale
134
- <svg xmlns="http://www.w3.org/2000/svg" className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
135
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
136
- </svg>
137
- </a>
92
+ {copiedId === `${message.data.id}-url` ? (
93
+ <>
94
+ <CheckIcon className="h-3 w-3" />
95
+ Copied
96
+ </>
97
+ ) : (
98
+ <>
99
+ <ClipboardDocumentIcon className="h-3 w-3" />
100
+ Copy URL
101
+ </>
102
+ )}
103
+ </button>
138
104
  </div>
139
- )}
105
+ </div>
140
106
  </div>
141
107
  )}
142
108
  </div>
@@ -1,5 +1,4 @@
1
1
  import { ClipboardDocumentIcon, CheckIcon, GlobeAltIcon, DocumentTextIcon } from '@heroicons/react/24/outline';
2
- import { LockClosedIcon } from '@heroicons/react/24/solid';
3
2
  import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
4
3
  import { oneDark } from 'react-syntax-highlighter/dist/cjs/styles/prism';
5
4
  import { oneLight } from 'react-syntax-highlighter/dist/cjs/styles/prism';
@@ -11,10 +10,9 @@ interface ApiContentViewerProps {
11
10
  message: SchemaItem;
12
11
  onCopy: (content: string, id: string) => void;
13
12
  copiedId: string | null;
14
- apiAccessEnabled?: boolean;
15
13
  }
16
14
 
17
- export default function ApiContentViewer({ message, onCopy, copiedId, apiAccessEnabled = false }: ApiContentViewerProps) {
15
+ export default function ApiContentViewer({ message, onCopy, copiedId }: ApiContentViewerProps) {
18
16
  const isDarkMode = useDarkMode();
19
17
  const dividerColor = isDarkMode ? 'rgb(var(--ec-page-text-muted) / 0.13)' : 'rgb(var(--ec-page-border))';
20
18
  const boxBorderColor = isDarkMode ? 'rgb(var(--ec-page-text-muted) / 0.17)' : 'rgb(var(--ec-page-border))';
@@ -37,35 +35,6 @@ export default function ApiContentViewer({ message, onCopy, copiedId, apiAccessE
37
35
  const lineCount = exampleResponse.split('\n').length;
38
36
  const byteSize = new TextEncoder().encode(exampleResponse).length;
39
37
 
40
- if (!apiAccessEnabled) {
41
- return (
42
- <div className="flex h-full items-center justify-center p-8">
43
- <div className="max-w-md text-center">
44
- <div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-2xl border border-[rgb(var(--ec-accent)/0.3)] bg-[rgb(var(--ec-accent-subtle))]">
45
- <LockClosedIcon className="h-8 w-8 text-[rgb(var(--ec-accent))]" />
46
- </div>
47
- <h3 className="mb-2 text-lg font-semibold text-[rgb(var(--ec-page-text))]">API Access</h3>
48
- <p className="mb-6 text-sm text-[rgb(var(--ec-page-text-muted))]">
49
- Access your schemas programmatically via REST API. Perfect for CI/CD pipelines, automation, and integrations with your
50
- development workflow.
51
- </p>
52
- <a
53
- href="https://eventcatalog.cloud"
54
- target="_blank"
55
- rel="noopener noreferrer"
56
- className="inline-flex items-center gap-2 rounded-lg bg-[rgb(var(--ec-accent))] px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-[rgb(var(--ec-accent-hover))]"
57
- >
58
- Upgrade to Scale
59
- <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
60
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
61
- </svg>
62
- </a>
63
- <p className="mt-3 text-xs text-[rgb(var(--ec-page-text-muted))]">Start your 14-day free trial</p>
64
- </div>
65
- </div>
66
- );
67
- }
68
-
69
38
  return (
70
39
  <div className="h-full overflow-auto pr-1">
71
40
  <div className="space-y-4 pb-3">
@@ -109,10 +109,9 @@ const DIFF_DARK_STYLES = `
109
109
  interface DiffViewerProps {
110
110
  diffs: VersionDiff[];
111
111
  onOpenFullscreen?: () => void;
112
- apiAccessEnabled?: boolean;
113
112
  }
114
113
 
115
- export default function DiffViewer({ diffs, onOpenFullscreen, apiAccessEnabled = false }: DiffViewerProps) {
114
+ export default function DiffViewer({ diffs, onOpenFullscreen }: DiffViewerProps) {
116
115
  const isDark = useDarkMode();
117
116
 
118
117
  if (diffs.length === 0) return null;
@@ -124,12 +123,10 @@ export default function DiffViewer({ diffs, onOpenFullscreen, apiAccessEnabled =
124
123
  <div className="flex-1">
125
124
  <h3 className="text-base font-semibold text-[rgb(var(--ec-page-text))] mb-1">Version Comparison</h3>
126
125
  <p className="text-sm text-[rgb(var(--ec-page-text-muted))]">
127
- {apiAccessEnabled
128
- ? `${diffs.length} selected comparison${diffs.length !== 1 ? 's' : ''}`
129
- : 'Compare schema versions side-by-side'}
126
+ {`${diffs.length} selected comparison${diffs.length !== 1 ? 's' : ''}`}
130
127
  </p>
131
128
  </div>
132
- {onOpenFullscreen && apiAccessEnabled && (
129
+ {onOpenFullscreen && (
133
130
  <button
134
131
  onClick={onOpenFullscreen}
135
132
  className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-[rgb(var(--ec-page-text-muted))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-md hover:bg-[rgb(var(--ec-content-hover))] hover:text-[rgb(var(--ec-page-text))] transition-colors"
@@ -140,72 +137,28 @@ export default function DiffViewer({ diffs, onOpenFullscreen, apiAccessEnabled =
140
137
  </button>
141
138
  )}
142
139
  </div>
143
- {apiAccessEnabled ? (
144
- <div className={`space-y-6 ${isDark ? 'diff-dark-mode' : ''}`}>
145
- {diffs.map((diff) => (
146
- <div
147
- key={`${diff.fromVersion}-${diff.toVersion}`}
148
- className="border border-[rgb(var(--ec-page-border))] rounded-lg overflow-hidden"
149
- >
150
- <div className="bg-[rgb(var(--ec-content-hover))] border-b border-[rgb(var(--ec-page-border))] px-4 py-2.5">
151
- <div className="flex items-center justify-between">
152
- <div className="text-sm">
153
- <span className="font-semibold text-[rgb(var(--ec-page-text))]">v{diff.fromVersion}</span>
154
- <span className="text-[rgb(var(--ec-page-text-muted))] mx-2">&rarr;</span>
155
- <span className="font-semibold text-[rgb(var(--ec-page-text))]">v{diff.toVersion}</span>
156
- </div>
157
- <span className="text-xs text-[rgb(var(--ec-page-text-muted))]">Selected comparison</span>
140
+ <div className={`space-y-6 ${isDark ? 'diff-dark-mode' : ''}`}>
141
+ {diffs.map((diff) => (
142
+ <div
143
+ key={`${diff.fromVersion}-${diff.toVersion}`}
144
+ className="border border-[rgb(var(--ec-page-border))] rounded-lg overflow-hidden"
145
+ >
146
+ <div className="bg-[rgb(var(--ec-content-hover))] border-b border-[rgb(var(--ec-page-border))] px-4 py-2.5">
147
+ <div className="flex items-center justify-between">
148
+ <div className="text-sm">
149
+ <span className="font-semibold text-[rgb(var(--ec-page-text))]">v{diff.fromVersion}</span>
150
+ <span className="text-[rgb(var(--ec-page-text-muted))] mx-2">&rarr;</span>
151
+ <span className="font-semibold text-[rgb(var(--ec-page-text))]">v{diff.toVersion}</span>
158
152
  </div>
159
- </div>
160
- <div className="relative">
161
- <div dangerouslySetInnerHTML={{ __html: diff.diffHtml }} />
153
+ <span className="text-xs text-[rgb(var(--ec-page-text-muted))]">Selected comparison</span>
162
154
  </div>
163
155
  </div>
164
- ))}
165
- </div>
166
- ) : (
167
- <div className="bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-accent)/0.3)] rounded-lg p-8">
168
- <div className="flex flex-col items-center text-center max-w-md mx-auto">
169
- <div className="flex-shrink-0 mb-4">
170
- <svg
171
- xmlns="http://www.w3.org/2000/svg"
172
- className="h-12 w-12 text-[rgb(var(--ec-accent))]"
173
- fill="none"
174
- viewBox="0 0 24 24"
175
- stroke="currentColor"
176
- >
177
- <path
178
- strokeLinecap="round"
179
- strokeLinejoin="round"
180
- strokeWidth={1.5}
181
- d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"
182
- />
183
- </svg>
156
+ <div className="relative">
157
+ <div dangerouslySetInnerHTML={{ __html: diff.diffHtml }} />
184
158
  </div>
185
- <h4 className="text-lg font-semibold text-[rgb(var(--ec-page-text))] mb-2">Upgrade to Scale</h4>
186
- <p className="text-sm text-[rgb(var(--ec-page-text-muted))] mb-6 leading-relaxed">
187
- Compare schema versions side-by-side with visual diffs. Track breaking changes, see exactly what changed between
188
- versions, and maintain better schema governance.
189
- </p>
190
- <a
191
- href="https://eventcatalog.cloud"
192
- target="_blank"
193
- rel="noopener noreferrer"
194
- className="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-[rgb(var(--ec-accent))] rounded-lg hover:opacity-90 transition-colors"
195
- >
196
- Start 14-day free trial
197
- <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
198
- <path
199
- strokeLinecap="round"
200
- strokeLinejoin="round"
201
- strokeWidth={2}
202
- d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
203
- />
204
- </svg>
205
- </a>
206
159
  </div>
207
- </div>
208
- )}
160
+ ))}
161
+ </div>
209
162
  </div>
210
163
  );
211
164
  }
@@ -6,7 +6,7 @@ import { buildUrl } from '@utils/url-builder';
6
6
  import JSONSchemaViewer from './JSONSchemaViewer';
7
7
  import AvroSchemaViewer from './AvroSchemaViewer';
8
8
  import ProtobufSchemaViewer from './ProtobufSchemaViewer';
9
- import { getLanguageForHighlight } from './utils';
9
+ import { getLanguageForHighlight, SCHEMA_CODE_STYLE } from './utils';
10
10
  import type { SchemaItem } from './types';
11
11
  import { useDarkMode } from './useDarkMode';
12
12
 
@@ -114,16 +114,7 @@ export default function SchemaContentViewer({
114
114
  <SyntaxHighlighter
115
115
  language={getLanguageForHighlight(message.schemaExtension)}
116
116
  style={isDarkMode ? oneDark : oneLight}
117
- customStyle={{
118
- margin: 0,
119
- padding: '1.25rem',
120
- borderRadius: 0,
121
- fontSize: '0.8125rem',
122
- lineHeight: '1.625',
123
- height: '100%',
124
- overflow: 'auto',
125
- background: 'transparent',
126
- }}
117
+ customStyle={{ ...SCHEMA_CODE_STYLE, height: '100%' }}
127
118
  showLineNumbers={true}
128
119
  wrapLines={true}
129
120
  wrapLongLines={true}