@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
@@ -15,7 +15,6 @@ export interface FieldFiltersProps {
15
15
  formats: { value: string; count: number }[];
16
16
  messageTypes: { value: string; count: number }[];
17
17
  } | null;
18
- isScaleEnabled?: boolean;
19
18
  }
20
19
 
21
20
  export default function FieldFilters({
@@ -28,7 +27,6 @@ export default function FieldFilters({
28
27
  conflictingOnly,
29
28
  onConflictingOnlyChange,
30
29
  facets,
31
- isScaleEnabled = false,
32
30
  }: FieldFiltersProps) {
33
31
  const toggleFormat = (value: string) => {
34
32
  if (selectedFormats.includes(value)) {
@@ -131,32 +129,30 @@ export default function FieldFilters({
131
129
  </div>
132
130
 
133
131
  {/* Conflicting Fields Only Toggle */}
134
- {isScaleEnabled && (
135
- <div>
136
- <label className="flex items-center gap-2 cursor-pointer group">
137
- <div
138
- className={`w-4 h-4 flex-shrink-0 rounded border flex items-center justify-center transition-colors ${
139
- conflictingOnly
140
- ? 'bg-amber-500 border-amber-500'
141
- : 'border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-input-bg))] group-hover:border-[rgb(var(--ec-icon-color))]'
142
- }`}
143
- onClick={() => onConflictingOnlyChange(!conflictingOnly)}
144
- >
145
- {conflictingOnly && (
146
- <svg className="w-3 h-3 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3">
147
- <path d="M5 13l4 4L19 7" strokeLinecap="round" strokeLinejoin="round" />
148
- </svg>
149
- )}
150
- </div>
151
- <span className="text-sm text-[rgb(var(--ec-page-text))]" onClick={() => onConflictingOnlyChange(!conflictingOnly)}>
152
- Conflicting fields
153
- </span>
154
- </label>
155
- <p className="text-[11px] text-[rgb(var(--ec-page-text-muted))] mt-1 ml-6">
156
- Show only fields with inconsistent types across messages
157
- </p>
158
- </div>
159
- )}
132
+ <div>
133
+ <label className="flex items-center gap-2 cursor-pointer group">
134
+ <div
135
+ className={`w-4 h-4 flex-shrink-0 rounded border flex items-center justify-center transition-colors ${
136
+ conflictingOnly
137
+ ? 'bg-amber-500 border-amber-500'
138
+ : 'border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-input-bg))] group-hover:border-[rgb(var(--ec-icon-color))]'
139
+ }`}
140
+ onClick={() => onConflictingOnlyChange(!conflictingOnly)}
141
+ >
142
+ {conflictingOnly && (
143
+ <svg className="w-3 h-3 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3">
144
+ <path d="M5 13l4 4L19 7" strokeLinecap="round" strokeLinejoin="round" />
145
+ </svg>
146
+ )}
147
+ </div>
148
+ <span className="text-sm text-[rgb(var(--ec-page-text))]" onClick={() => onConflictingOnlyChange(!conflictingOnly)}>
149
+ Conflicting fields
150
+ </span>
151
+ </label>
152
+ <p className="text-[11px] text-[rgb(var(--ec-page-text-muted))] mt-1 ml-6">
153
+ Show only fields with inconsistent types across messages
154
+ </p>
155
+ </div>
160
156
 
161
157
  {/* Results & Clear */}
162
158
  {activeFilterCount > 0 && (
@@ -211,23 +211,28 @@ function FieldNodeGraphInner({
211
211
  occurrences,
212
212
  onClose,
213
213
  }: FieldNodeGraphProps) {
214
- const { nodes: initialNodes, edges: initialEdges } = useMemo(
215
- () => getNodesAndEdges({ fieldPath, fieldType, occurrences }),
216
- [fieldPath, fieldType, occurrences]
217
- );
218
-
219
- const [nodes, , onNodesChange] = useNodesState(initialNodes);
220
- const [edges, , onEdgesChange] = useEdgesState(initialEdges);
221
- const edgesRef = useRef(initialEdges);
214
+ const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);
215
+ const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);
216
+ const edgesRef = useRef(edges);
222
217
  edgesRef.current = edges;
223
218
 
224
219
  const { fitView } = useReactFlow();
225
220
  const wrapperRef = useRef<HTMLDivElement>(null);
226
221
 
222
+ // Laying the graph out is async, so it's shown (and fitted) once it's ready
227
223
  useEffect(() => {
228
- const timer = setTimeout(() => fitView({ padding: 0.2 }), 50);
229
- return () => clearTimeout(timer);
230
- }, [fitView]);
224
+ let cancelled = false;
225
+ getNodesAndEdges({ fieldPath, fieldType, occurrences }).then((graph) => {
226
+ if (cancelled) return;
227
+ setNodes(graph.nodes);
228
+ setEdges(graph.edges);
229
+ // Called straight after setNodes so React Flow fits once they're measured
230
+ fitView({ padding: 0.2 });
231
+ });
232
+ return () => {
233
+ cancelled = true;
234
+ };
235
+ }, [fieldPath, fieldType, occurrences, setNodes, setEdges, fitView]);
231
236
 
232
237
  // Unique messages, producers, consumers for the details panel
233
238
  const uniqueMessages = useMemo(() => {
@@ -1,205 +1,11 @@
1
1
  import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
2
- import { ChevronLeft, ChevronRight, Lock, Search, X, AlertTriangle } from 'lucide-react';
2
+ import { ChevronLeft, ChevronRight, Search, X, AlertTriangle } from 'lucide-react';
3
3
  import FieldFilters from './FieldFilters';
4
4
  import FieldsTable from './FieldsTable';
5
5
  import type { FieldResult } from './FieldsTable';
6
6
  import FieldNodeGraph from './FieldNodeGraph';
7
7
  import { buildUrl } from '@utils/url-builder';
8
8
 
9
- function DummyNode({
10
- type,
11
- name,
12
- version,
13
- className,
14
- }: {
15
- type: 'service' | 'event' | 'field';
16
- name: string;
17
- version?: string;
18
- className?: string;
19
- }) {
20
- const styles = {
21
- service: { border: 'border-pink-500', badge: 'bg-pink-500', label: 'SERVICE' },
22
- event: { border: 'border-orange-500', badge: 'bg-orange-500', label: 'EVENT' },
23
- field: { border: 'border-cyan-500', badge: 'bg-cyan-500', label: 'FIELD' },
24
- };
25
- const s = styles[type];
26
- return (
27
- <div
28
- className={`relative rounded-xl border-2 ${s.border} bg-[rgb(var(--ec-card-bg))] px-3 pt-4 pb-2.5 min-w-[140px] ${className || ''}`}
29
- >
30
- <div
31
- className={`absolute -top-2.5 left-2.5 ${s.badge} text-white text-[7px] font-bold uppercase tracking-widest px-1.5 py-0.5 rounded`}
32
- >
33
- {s.label}
34
- </div>
35
- <div className="text-[11px] font-semibold text-[rgb(var(--ec-page-text))]">{name}</div>
36
- {version && <div className="text-[9px] text-[rgb(var(--ec-page-text-muted))]">v{version}</div>}
37
- </div>
38
- );
39
- }
40
-
41
- function DummyEdge({ label }: { label: string }) {
42
- return (
43
- <div className="flex items-center gap-1">
44
- <div className="w-8 h-px bg-[rgb(var(--ec-page-border))]" />
45
- <span className="text-[8px] text-[rgb(var(--ec-page-text-muted))] whitespace-nowrap">{label}</span>
46
- <div className="w-8 h-px bg-[rgb(var(--ec-page-border))]" />
47
- </div>
48
- );
49
- }
50
-
51
- function FieldLineageUpgradeModal({ fieldPath, onClose }: { fieldPath: string; onClose: () => void }) {
52
- return (
53
- <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50" onClick={onClose}>
54
- <div
55
- className="w-[90vw] h-[80vh] max-w-[1400px] rounded-xl border shadow-2xl flex flex-col overflow-hidden relative"
56
- style={{
57
- backgroundColor: 'rgb(var(--ec-page-bg))',
58
- borderColor: 'rgb(var(--ec-page-border))',
59
- }}
60
- onClick={(e) => e.stopPropagation()}
61
- >
62
- {/* Header */}
63
- <div
64
- className="flex items-center justify-between px-5 py-3 border-b flex-shrink-0"
65
- style={{ borderColor: 'rgb(var(--ec-page-border))' }}
66
- >
67
- <div className="flex items-center gap-2">
68
- <h3 className="text-sm font-semibold" style={{ color: 'rgb(var(--ec-page-text))' }}>
69
- Field Traceability
70
- </h3>
71
- <code
72
- className="px-2 py-0.5 rounded text-xs font-mono"
73
- style={{
74
- backgroundColor: 'rgb(var(--ec-accent) / 0.1)',
75
- color: 'rgb(var(--ec-accent))',
76
- }}
77
- >
78
- {fieldPath}
79
- </code>
80
- </div>
81
- <button
82
- onClick={onClose}
83
- className="p-1.5 rounded-lg transition-colors hover:bg-[rgb(var(--ec-content-hover))] flex-shrink-0"
84
- style={{ color: 'rgb(var(--ec-icon-color))' }}
85
- >
86
- <X className="w-4 h-4" />
87
- </button>
88
- </div>
89
-
90
- {/* Blurred dummy content */}
91
- <div className="flex-1 relative overflow-hidden">
92
- {/* Fake graph + side panel */}
93
- <div className="absolute inset-0 flex blur-[2px] opacity-60 select-none pointer-events-none">
94
- {/* Fake graph area */}
95
- <div className="flex-1 flex items-center justify-center p-8">
96
- <div className="flex items-center gap-3">
97
- {/* Producer services */}
98
- <div className="flex flex-col gap-6">
99
- <DummyNode type="service" name="Billing Service" version="1.2.0" />
100
- <DummyNode type="service" name="Order Service" version="2.0.1" />
101
- </div>
102
- {/* Edges to events */}
103
- <div className="flex flex-col gap-12">
104
- <DummyEdge label="produces" />
105
- <DummyEdge label="produces" />
106
- </div>
107
- {/* Events */}
108
- <div className="flex flex-col gap-6">
109
- <DummyNode type="event" name="Payment Due" version="0.0.1" />
110
- <DummyNode type="event" name="Order Created" version="1.0.0" />
111
- </div>
112
- {/* Edges to field */}
113
- <div className="flex flex-col gap-12">
114
- <DummyEdge label="contains" />
115
- <DummyEdge label="contains" />
116
- </div>
117
- {/* Field */}
118
- <div className="flex flex-col gap-6">
119
- <DummyNode type="field" name={fieldPath} />
120
- </div>
121
- {/* Edges to consumers */}
122
- <div className="flex flex-col gap-12">
123
- <DummyEdge label="consumed by" />
124
- </div>
125
- {/* Consumer services */}
126
- <div className="flex flex-col gap-6">
127
- <DummyNode type="service" name="Notification Service" version="0.0.2" />
128
- </div>
129
- </div>
130
- </div>
131
- {/* Fake side panel */}
132
- <div className="w-[280px] flex-shrink-0 border-l border-[rgb(var(--ec-page-border))] p-4 space-y-4">
133
- <div>
134
- <div className="text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider mb-2">
135
- Field
136
- </div>
137
- <div className="text-sm font-mono font-semibold text-[rgb(var(--ec-page-text))]">{fieldPath}</div>
138
- <div className="text-xs text-[rgb(var(--ec-page-text-muted))] mt-1">string</div>
139
- </div>
140
- <div>
141
- <div className="text-[11px] font-medium text-amber-500 uppercase tracking-wider mb-2">Type Conflict</div>
142
- <div className="rounded-lg border border-amber-500/20 bg-amber-500/5 p-2.5 space-y-1">
143
- <div className="text-xs text-amber-600">Inconsistent types detected</div>
144
- <div className="flex justify-between text-xs">
145
- <code className="font-mono">string</code>
146
- <span className="text-[rgb(var(--ec-page-text-muted))]">3 schemas</span>
147
- </div>
148
- <div className="flex justify-between text-xs">
149
- <code className="font-mono">integer</code>
150
- <span className="text-[rgb(var(--ec-page-text-muted))]">1 schema</span>
151
- </div>
152
- </div>
153
- </div>
154
- <div>
155
- <div className="text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider mb-2">
156
- Messages (3)
157
- </div>
158
- <div className="space-y-1.5">
159
- <div className="rounded-lg border border-[rgb(var(--ec-page-border)/0.5)] bg-[rgb(var(--ec-card-bg))] px-2.5 py-2 text-xs">
160
- Payment Due
161
- </div>
162
- <div className="rounded-lg border border-[rgb(var(--ec-page-border)/0.5)] bg-[rgb(var(--ec-card-bg))] px-2.5 py-2 text-xs">
163
- Order Created
164
- </div>
165
- <div className="rounded-lg border border-[rgb(var(--ec-page-border)/0.5)] bg-[rgb(var(--ec-card-bg))] px-2.5 py-2 text-xs">
166
- Invoice Generated
167
- </div>
168
- </div>
169
- </div>
170
- </div>
171
- </div>
172
-
173
- {/* Upgrade prompt overlay */}
174
- <div className="absolute inset-0 flex items-center justify-center bg-[rgb(var(--ec-page-bg)/0.5)]">
175
- <div className="text-center max-w-lg px-6 py-8 rounded-2xl border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg))] shadow-2xl">
176
- <div className="w-12 h-12 rounded-full bg-[rgb(var(--ec-accent)/0.1)] flex items-center justify-center mx-auto mb-4">
177
- <Lock className="w-6 h-6 text-[rgb(var(--ec-accent))]" />
178
- </div>
179
- <h3 className="text-lg font-semibold text-[rgb(var(--ec-page-text))] mb-2">Field Lineage & Traceability</h3>
180
- <p className="text-sm text-[rgb(var(--ec-page-text-muted))] mb-5 leading-relaxed">
181
- See which services produce and consume this field, detect type conflicts across schemas, and trace field usage
182
- across your entire event-driven architecture.
183
- </p>
184
- <a
185
- href="https://eventcatalog.cloud/"
186
- target="_blank"
187
- rel="noopener noreferrer"
188
- className="inline-flex items-center gap-2 px-5 py-2.5 rounded-lg text-sm font-medium text-white bg-[rgb(var(--ec-accent))] hover:opacity-90 transition-opacity"
189
- >
190
- Start your 14-day free trial
191
- </a>
192
- <p className="text-xs text-[rgb(var(--ec-page-text-muted))] mt-3">
193
- Available with EventCatalog Scale. No credit card required.
194
- </p>
195
- </div>
196
- </div>
197
- </div>
198
- </div>
199
- </div>
200
- );
201
- }
202
-
203
9
  interface Facets {
204
10
  formats: { value: string; count: number }[];
205
11
  types: { value: string; count: number }[];
@@ -223,11 +29,7 @@ interface SelectedField {
223
29
  occurrences: FieldResult[];
224
30
  }
225
31
 
226
- interface FieldsExplorerProps {
227
- isScaleEnabled?: boolean;
228
- }
229
-
230
- export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplorerProps) {
32
+ export default function FieldsExplorer() {
231
33
  const [fields, setFields] = useState<FieldResult[]>([]);
232
34
  const [total, setTotal] = useState(0);
233
35
  const [cursor, setCursor] = useState<string | null>(null);
@@ -325,18 +127,6 @@ export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplore
325
127
 
326
128
  // Open modal: fetch all occurrences for the field path, then show modal
327
129
  const handleSelectField = useCallback(async (fieldPath: string) => {
328
- // Non-scale users get the locked upgrade modal
329
- if (!isScaleEnabled) {
330
- setSelectedField({
331
- path: fieldPath,
332
- type: 'unknown',
333
- description: '',
334
- required: false,
335
- occurrences: [],
336
- });
337
- return;
338
- }
339
-
340
130
  try {
341
131
  // Fetch all pages of occurrences for this field path
342
132
  let allOccurrences: FieldResult[] = [];
@@ -446,7 +236,6 @@ export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplore
446
236
  conflictingOnly={conflictingOnly}
447
237
  onConflictingOnlyChange={setConflictingOnly}
448
238
  facets={filterFacets}
449
- isScaleEnabled={isScaleEnabled}
450
239
  />
451
240
  </div>
452
241
  </div>
@@ -485,7 +274,7 @@ export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplore
485
274
  )}
486
275
 
487
276
  {/* Table */}
488
- <FieldsTable fields={fields} onSelectField={handleSelectField} isLoading={isLoading} isScaleEnabled={isScaleEnabled} />
277
+ <FieldsTable fields={fields} onSelectField={handleSelectField} isLoading={isLoading} />
489
278
 
490
279
  {/* Pagination */}
491
280
  <div className="flex-shrink-0 flex items-center justify-between px-6 py-3 border-t border-[rgb(var(--ec-page-border))]">
@@ -524,10 +313,7 @@ export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplore
524
313
  </div>
525
314
 
526
315
  {/* Field Detail Modal with Node Graph */}
527
- {selectedField && !isScaleEnabled && (
528
- <FieldLineageUpgradeModal fieldPath={selectedField.path} onClose={() => setSelectedField(null)} />
529
- )}
530
- {selectedField && isScaleEnabled && (
316
+ {selectedField && (
531
317
  <FieldNodeGraph
532
318
  fieldPath={selectedField.path}
533
319
  fieldType={selectedField.type}
@@ -26,7 +26,6 @@ export interface FieldsTableProps {
26
26
  fields: FieldResult[];
27
27
  onSelectField: (fieldPath: string) => void;
28
28
  isLoading: boolean;
29
- isScaleEnabled?: boolean;
30
29
  }
31
30
 
32
31
  const getColorAndIconForMessageType = (type: string) => {
@@ -82,7 +81,7 @@ function FieldPathCell({ path }: { path: string }) {
82
81
  );
83
82
  }
84
83
 
85
- export default function FieldsTable({ fields, onSelectField, isLoading, isScaleEnabled = false }: FieldsTableProps) {
84
+ export default function FieldsTable({ fields, onSelectField, isLoading }: FieldsTableProps) {
86
85
  if (isLoading) {
87
86
  return (
88
87
  <div className="flex-1 flex items-center justify-center px-6 pb-5">
@@ -130,16 +129,12 @@ export default function FieldsTable({ fields, onSelectField, isLoading, isScaleE
130
129
  <th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
131
130
  Required
132
131
  </th>
133
- {isScaleEnabled && (
134
- <th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
135
- Consistency
136
- </th>
137
- )}
138
- {isScaleEnabled && (
139
- <th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
140
- Used In
141
- </th>
142
- )}
132
+ <th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
133
+ Consistency
134
+ </th>
135
+ <th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
136
+ Used In
137
+ </th>
143
138
  <th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
144
139
  Owners
145
140
  </th>
@@ -178,32 +173,28 @@ export default function FieldsTable({ fields, onSelectField, isLoading, isScaleE
178
173
  <span className="text-[0.8rem] text-[rgb(var(--ec-page-text-muted))]">-</span>
179
174
  )}
180
175
  </td>
181
- {isScaleEnabled && (
182
- <td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
183
- {field.conflicts && field.conflicts.length > 1 ? (
184
- <div
185
- className="flex items-center gap-1.5"
186
- title={field.conflicts.map((c) => `${c.type} (${c.count})`).join(', ')}
187
- >
188
- <AlertTriangle className="w-3.5 h-3.5 text-amber-500 flex-shrink-0" />
189
- <span className="inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-semibold bg-amber-500/10 text-amber-600 border border-amber-500/20">
190
- {field.conflicts.length} types
191
- </span>
192
- </div>
193
- ) : (
194
- <span className="inline-flex items-center" title="All usages of this field match the same type">
195
- <Check className="h-4 w-4 text-green-500" />
176
+ <td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
177
+ {field.conflicts && field.conflicts.length > 1 ? (
178
+ <div
179
+ className="flex items-center gap-1.5"
180
+ title={field.conflicts.map((c) => `${c.type} (${c.count})`).join(', ')}
181
+ >
182
+ <AlertTriangle className="w-3.5 h-3.5 text-amber-500 flex-shrink-0" />
183
+ <span className="inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-semibold bg-amber-500/10 text-amber-600 border border-amber-500/20">
184
+ {field.conflicts.length} types
196
185
  </span>
197
- )}
198
- </td>
199
- )}
200
- {isScaleEnabled && (
201
- <td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
202
- <span className="text-[0.8rem] text-[rgb(var(--ec-page-text-muted))]">
203
- {field.usedInCount || 1} {(field.usedInCount || 1) === 1 ? 'schema' : 'schemas'}
186
+ </div>
187
+ ) : (
188
+ <span className="inline-flex items-center" title="All usages of this field match the same type">
189
+ <Check className="h-4 w-4 text-green-500" />
204
190
  </span>
205
- </td>
206
- )}
191
+ )}
192
+ </td>
193
+ <td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
194
+ <span className="text-[0.8rem] text-[rgb(var(--ec-page-text-muted))]">
195
+ {field.usedInCount || 1} {(field.usedInCount || 1) === 1 ? 'schema' : 'schemas'}
196
+ </span>
197
+ </td>
207
198
  <td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
208
199
  {owners.length > 0 ? (
209
200
  <div className="flex items-center gap-1 flex-wrap">
@@ -2,17 +2,12 @@
2
2
  import catalog from '@utils/eventcatalog-config/catalog';
3
3
  import Search from '@components/Search/Search.astro';
4
4
  import { buildUrl } from '@utils/url-builder';
5
- import {
6
- showEventCatalogBranding,
7
- showCustomBranding,
8
- isEventCatalogChatVisible,
9
- isEventCatalogChatEnabled,
10
- } from '@utils/feature';
11
5
  import { getSession } from '@utils/auth-astro/server';
12
- import { isAuthEnabled, isSSR } from '@utils/feature';
6
+ import { isAuthEnabled, isEventCatalogChatVisible, isEventCatalogChatEnabled } from '@utils/feature';
13
7
  import { EnvironmentDropdown } from './EnvironmentDropdown';
14
8
  import ChatPanelButton from './ChatPanel/ChatPanelButton';
15
9
  import ThemeToggle from './ThemeToggle';
10
+ import TrialBadge from './TrialBadge.astro';
16
11
 
17
12
  const { showNestedSideBar = true } = Astro.props;
18
13
 
@@ -27,7 +22,16 @@ const logo = {
27
22
  text: catalog?.logo?.text || 'EventCatalog',
28
23
  };
29
24
 
30
- const repositoryUrl = catalog?.repositoryUrl || 'https://github.com/event-catalog/eventcatalog';
25
+ const repositoryUrl = catalog?.repositoryUrl;
26
+
27
+ // Header icons match the theme toggle: a 20px icon in a padded button, coloured with the theme's icon colour
28
+ const headerIconLinkClass =
29
+ 'block p-2 rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-icon-hover))] hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors';
30
+ const headerIconClass = 'block h-5 w-5 bg-current';
31
+ const iconMask = (name: string) => {
32
+ const url = buildUrl(`/icons/${name}.svg`, true);
33
+ return `mask: url("${url}") center / contain no-repeat; -webkit-mask: url("${url}") center / contain no-repeat;`;
34
+ };
31
35
 
32
36
  const user = session?.user as { name?: string; email?: string; image?: string; provider?: string } | undefined;
33
37
  const userName = user?.name || user?.email || 'User';
@@ -70,7 +74,8 @@ const providerName = user?.provider ? providerNames[user.provider] || user.provi
70
74
  <div class="hidden md:block shrink-0 ml-auto">
71
75
  {
72
76
  session ? (
73
- <div class="flex items-center space-x-4 justify-end pr-2">
77
+ <div class="flex items-center gap-3 justify-end pr-2">
78
+ <TrialBadge />
74
79
  {catalog.environments && catalog.environments.length > 0 && (
75
80
  <EnvironmentDropdown environments={catalog.environments} client:idle />
76
81
  )}
@@ -168,7 +173,8 @@ const providerName = user?.provider ? providerNames[user.provider] || user.provi
168
173
  </div>
169
174
  ) : (
170
175
  <>
171
- <div class="flex items-center space-x-4 justify-end pr-2">
176
+ <div class="flex items-center gap-3 justify-end pr-2">
177
+ <TrialBadge />
172
178
  {catalog.environments && catalog.environments.length > 0 && (
173
179
  <EnvironmentDropdown environments={catalog.environments} client:idle />
174
180
  )}
@@ -180,57 +186,36 @@ const providerName = user?.provider ? providerNames[user.provider] || user.provi
180
186
  Sign In
181
187
  </button>
182
188
  )}
183
- <ThemeToggle client:idle />
184
- {showEventCatalogBranding() && (
185
- <ul class="flex space-x-4">
186
- <li>
187
- <a
188
- href="https://discord.com/invite/3rjaZMmrAm"
189
- class="block p-1.5 rounded-lg hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors"
190
- aria-label="Join our Discord community"
191
- >
192
- <img
193
- src={buildUrl('/icons/discord.svg', true)}
194
- alt=""
195
- class="h-6 w-6 hover:opacity-100 transition-opacity ec-themed-icon"
196
- aria-hidden="true"
197
- />
198
- </a>
199
- </li>
200
- <li>
201
- <a
202
- href="https://github.com/event-catalog/eventcatalog"
203
- class="block p-1.5 rounded-lg hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors"
204
- aria-label="View EventCatalog on GitHub"
205
- >
206
- <img
207
- src={buildUrl('/icons/github.svg', true)}
208
- alt=""
209
- class="h-6 w-6 hover:opacity-100 transition-opacity ec-themed-icon"
210
- aria-hidden="true"
211
- />
212
- </a>
213
- </li>
214
- </ul>
215
- )}
216
- {showCustomBranding() && !showEventCatalogBranding() && (
217
- <ul class="flex space-x-4">
189
+ <ul class="flex items-center gap-1">
190
+ <li>
191
+ <ThemeToggle client:idle />
192
+ </li>
193
+ {repositoryUrl && (
218
194
  <li>
219
- <a
220
- href={repositoryUrl}
221
- class="block p-1.5 rounded-lg hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors focus:outline-hidden"
222
- aria-label="View repository on GitHub"
223
- >
224
- <img
225
- src={buildUrl('/icons/github.svg', true)}
226
- alt=""
227
- class="h-6 w-6 opacity-70 hover:opacity-100 transition-opacity ec-themed-icon"
228
- aria-hidden="true"
229
- />
195
+ <a href={repositoryUrl} class={headerIconLinkClass} aria-label="View repository on GitHub">
196
+ <span class={headerIconClass} style={iconMask('github')} aria-hidden="true" />
230
197
  </a>
231
198
  </li>
232
- </ul>
233
- )}
199
+ )}
200
+ <li>
201
+ <a
202
+ href="https://discord.com/invite/3rjaZMmrAm"
203
+ class={headerIconLinkClass}
204
+ aria-label="Join our Discord community"
205
+ >
206
+ <span class={headerIconClass} style={iconMask('discord')} aria-hidden="true" />
207
+ </a>
208
+ </li>
209
+ <li>
210
+ <a
211
+ href="https://github.com/event-catalog/eventcatalog"
212
+ class={headerIconLinkClass}
213
+ aria-label="View EventCatalog on GitHub"
214
+ >
215
+ <span class={headerIconClass} style={iconMask('github')} aria-hidden="true" />
216
+ </a>
217
+ </li>
218
+ </ul>
234
219
  </div>
235
220
  </>
236
221
  )
@@ -1,20 +1,20 @@
1
1
  .tooltip {
2
- visibility: hidden;
3
- position: absolute;
4
- }
5
- .has-tooltip:hover .tooltip {
6
- visibility: visible;
7
- z-index: 100;
8
- }
2
+ visibility: hidden;
3
+ position: absolute;
4
+ }
5
+ .has-tooltip:hover .tooltip {
6
+ visibility: visible;
7
+ z-index: 100;
8
+ }
9
9
 
10
- .pill-item:hover {
11
- background: linear-gradient(to left, rgb(var(--ec-accent-gradient-from)), rgb(var(--ec-accent-gradient-to)));
12
- color: white;
13
- font-weight: normal;
14
- }
10
+ .pill-item:hover {
11
+ background: linear-gradient(to left, rgb(var(--ec-accent-gradient-from)), rgb(var(--ec-accent-gradient-to)));
12
+ color: white;
13
+ font-weight: normal;
14
+ }
15
15
 
16
- .owner-item:hover {
17
- background: linear-gradient(to left, rgb(var(--ec-accent-gradient-from)), rgb(var(--ec-accent-gradient-to)));
18
- color: white;
19
- font-weight: normal;
20
- }
16
+ .owner-item:hover {
17
+ background: linear-gradient(to left, rgb(var(--ec-accent-gradient-from)), rgb(var(--ec-accent-gradient-to)));
18
+ color: white;
19
+ font-weight: normal;
20
+ }