@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
@@ -1,7 +1,5 @@
1
1
  ---
2
- import NodeGraph from '@components/MDX/NodeGraph/NodeGraph.astro';
3
- import VisualiserLayout from '@layouts/VisualiserLayout.astro';
4
- import { ClientRouter } from 'astro:transitions';
2
+ import { buildUrl } from '@utils/url-builder';
5
3
 
6
4
  import { Page } from './_index.data';
7
5
 
@@ -11,39 +9,6 @@ export const getStaticPaths = Page.getStaticPaths;
11
9
  // Get data
12
10
  const props = await Page.getData(Astro);
13
11
 
14
- const {
15
- data: { id },
16
- } = props;
12
+ // The System Context diagram is now level 1 of the system's visualiser page
13
+ return Astro.redirect(buildUrl(`/visualiser/systems/${props.data.id}/${props.data.version}?level=1`));
17
14
  ---
18
-
19
- <VisualiserLayout title={`Visualiser | ${props.data.name} - System Context`} description={props.data.summary}>
20
- <div id="system-context-map-page" class="p-2">
21
- <div
22
- class="system-context-map-viewport h-[calc(100vh-5rem)] w-full relative border border-[rgb(var(--ec-page-border))]"
23
- id={`${id}-portal`}
24
- transition:name="visualiser-graph"
25
- >
26
- </div>
27
- <NodeGraph
28
- id={id}
29
- collection="systems-context"
30
- title={`${props.data.name} (v${props.data.version}) - System Context`}
31
- mode="full"
32
- linkTo="visualiser"
33
- version={props.data.version}
34
- linksToVisualiser={false}
35
- />
36
- </div>
37
- <ClientRouter />
38
- </VisualiserLayout>
39
-
40
- <style is:global>
41
- html[data-embedded='true'] #system-context-map-page {
42
- box-sizing: border-box;
43
- height: 100vh;
44
- }
45
-
46
- html[data-embedded='true'] #system-context-map-page .system-context-map-viewport {
47
- height: 100%;
48
- }
49
- </style>
@@ -0,0 +1,56 @@
1
+ ---
2
+ import NodeGraph from '@components/MDX/NodeGraph/NodeGraph.astro';
3
+ import VisualiserLayout from '@layouts/VisualiserLayout.astro';
4
+ import { buildUrl } from '@utils/url-builder';
5
+ import { ClientRouter } from 'astro:transitions';
6
+
7
+ import { Page } from './_index.data';
8
+
9
+ export const prerender = Page.prerender;
10
+ export const getStaticPaths = Page.getStaticPaths;
11
+
12
+ // Get data
13
+ const props = await Page.getData(Astro);
14
+
15
+ const {
16
+ data: { id },
17
+ } = props;
18
+ ---
19
+
20
+ <VisualiserLayout title={`Visualiser | ${props.data.name} (systems)`} description={props.data.summary}>
21
+ <div id="system-visualiser-page" class="p-2">
22
+ <div
23
+ class="system-visualiser-viewport h-[calc(100vh-5rem)] w-full relative border border-[rgb(var(--ec-page-border))]"
24
+ id={`${id}-portal`}
25
+ transition:name="visualiser-graph"
26
+ >
27
+ </div>
28
+ <NodeGraph
29
+ id={id}
30
+ collection="systems-levels"
31
+ overview={{ label: 'system context' }}
32
+ title={`${props.data.name} (v${props.data.version})`}
33
+ mode="full"
34
+ linkTo="visualiser"
35
+ version={props.data.version}
36
+ linksToVisualiser={false}
37
+ zoomOnScroll={true}
38
+ href={{
39
+ label: `Open documentation for ${props.data.name} v${props.data.version}`,
40
+ url: buildUrl(`/docs/systems/${props.data.id}/${props.data.version}`),
41
+ }}
42
+ />
43
+ </div>
44
+ <ClientRouter />
45
+ </VisualiserLayout>
46
+
47
+ <style is:global>
48
+ html[data-embedded='true'] #system-visualiser-page {
49
+ box-sizing: border-box;
50
+ height: 100vh;
51
+ }
52
+
53
+ html[data-embedded='true'] #system-visualiser-page .system-visualiser-viewport {
54
+ height: 100%;
55
+ }
56
+ </style>
@@ -0,0 +1,20 @@
1
+ /**
2
+ * API endpoint to return mermaid diagram code for a systems visualiser page
3
+ * URL: /visualiser/systems/{id}/{version}.mermaid
4
+ *
5
+ * Lives next to the systems Diagram page, which would otherwise handle these requests
6
+ * before the generic visualiser/[type]/[id]/[version].mermaid route.
7
+ */
8
+ import type { APIRoute, GetStaticPaths } from 'astro';
9
+ import { isAuthEnabled } from '@utils/feature';
10
+ import { createMermaidDiagramResponse, getMermaidDiagramPaths } from '../../_mermaid-route';
11
+
12
+ // Prerender static pages when auth is disabled, use SSR when auth is enabled
13
+ export const prerender = !isAuthEnabled();
14
+
15
+ export const getStaticPaths: GetStaticPaths = async () => {
16
+ const paths = await getMermaidDiagramPaths(['systems']);
17
+ return paths.map(({ id, version }) => ({ params: { id, version } }));
18
+ };
19
+
20
+ export const GET: APIRoute = async ({ params }) => createMermaidDiagramResponse({ ...params, type: 'systems' });
@@ -126,7 +126,7 @@ export const buildAgentSections = (
126
126
  pages: [
127
127
  {
128
128
  type: 'item',
129
- title: 'Map',
129
+ title: 'Diagram',
130
130
  href: buildUrl(`/visualiser/agents/${agent.data.id}/${agent.data.version}`),
131
131
  },
132
132
  ].filter(Boolean) as ChildRef[],
@@ -122,7 +122,7 @@ export const buildContainerSections = (
122
122
  pages: [
123
123
  {
124
124
  type: 'item',
125
- title: 'Map',
125
+ title: 'Diagram',
126
126
  href: buildUrl(`/visualiser/containers/${container.data.id}/${container.data.version}`),
127
127
  },
128
128
  ],
@@ -155,7 +155,7 @@ export const buildDataProductSections = (
155
155
  pages: [
156
156
  {
157
157
  type: 'item',
158
- title: 'Map',
158
+ title: 'Diagram',
159
159
  href: buildUrl(`/visualiser/data-products/${dataProduct.data.id}/${dataProduct.data.version}`),
160
160
  },
161
161
  ],
@@ -94,15 +94,6 @@ export const buildDomainSections = (
94
94
  const systemsInDomain = domain.data.systems || [];
95
95
  const renderSystems = systemsInDomain.length > 0 && shouldRenderSideBarSection(domain, 'systems');
96
96
 
97
- // The domain's System Diagram only has something to show when at least one of
98
- // its systems takes part in a context graph (declares relationships or actors). This
99
- // mirrors the guard that generates the visualiser page, so we never link to a page
100
- // that wasn't generated.
101
- const hasSystemContext = systemsInDomain.some((system: any) => {
102
- const data = system?.data || system;
103
- return (data?.relationships || []).length > 0 || (data?.actors || []).length > 0;
104
- });
105
-
106
97
  const subDomains = domain.data.domains || [];
107
98
  const renderSubDomains = subDomains.length > 0 && shouldRenderSideBarSection(domain, 'subdomains');
108
99
 
@@ -153,16 +144,6 @@ export const buildDomainSections = (
153
144
  sendsMessages.length > 0 ||
154
145
  receivesMessages.length > 0;
155
146
 
156
- // The Resource Diagram renders the domain's services, agents, data products and
157
- // subdomains (see domains-node-graph). Only link to it when there's something to
158
- // draw — otherwise the visualiser page is empty.
159
- const hasResourceDiagram =
160
- servicesInDomain.length > 0 ||
161
- externalSystemsInDomain.length > 0 ||
162
- agentsInDomain.length > 0 ||
163
- dataProductsInDomain.length > 0 ||
164
- subDomains.length > 0;
165
-
166
147
  // Diagrams
167
148
  const domainDiagrams = domain.data.diagrams || [];
168
149
  const diagramNavItems = buildDiagramNavItems(domainDiagrams, context.diagrams);
@@ -268,19 +249,13 @@ export const buildDomainSections = (
268
249
  title: 'Overview',
269
250
  href: buildUrl(`/architecture/domains/${domain.data.id}/${domain.data.version}`),
270
251
  },
271
- renderSystems &&
272
- renderVisualiser &&
273
- hasSystemContext && {
274
- type: 'item',
275
- title: 'System Diagram',
276
- href: buildUrl(`/visualiser/domains/${domain.data.id}/${domain.data.version}/systems-context`),
277
- },
278
- renderVisualiser &&
279
- hasResourceDiagram && {
280
- type: 'item',
281
- title: 'Resource Diagram',
282
- href: buildUrl(`/visualiser/domains/${domain.data.id}/${domain.data.version}`),
283
- },
252
+ // The domain's diagram, with levels from the domains it talks to down to
253
+ // its messages
254
+ renderVisualiser && {
255
+ type: 'item',
256
+ title: 'Diagram',
257
+ href: buildUrl(`/visualiser/domains/${domain.data.id}/${domain.data.version}`),
258
+ },
284
259
  renderEntities &&
285
260
  renderVisualiser && {
286
261
  type: 'item',
@@ -97,7 +97,7 @@ export const buildEntitySections = (
97
97
  icon: 'Workflow',
98
98
  pages: entityMapTargets.map((target) => ({
99
99
  type: 'item',
100
- title: entityMapTargets.length === 1 ? 'Entity Map' : `${target.label} Entity Map`,
100
+ title: entityMapTargets.length === 1 ? 'Entity Diagram' : `${target.label} Entity Diagram`,
101
101
  href: target.href,
102
102
  })),
103
103
  }
@@ -153,7 +153,7 @@ export const buildMessageSections = (
153
153
  pages: [
154
154
  {
155
155
  type: 'item',
156
- title: 'Map',
156
+ title: 'Diagram',
157
157
  href: buildUrl(`/visualiser/${collection}/${message.data.id}/${message.data.version}`),
158
158
  },
159
159
  ...(hasTriggerPaths
@@ -146,21 +146,15 @@ export const buildServiceSections = (
146
146
  },
147
147
  renderVisualiser && {
148
148
  type: 'item',
149
- title: 'Map',
149
+ title: 'Diagram',
150
150
  href: buildUrl(`/visualiser/services/${service.data.id}/${service.data.version}`),
151
151
  },
152
152
  renderVisualiser &&
153
153
  renderEntities && {
154
154
  type: 'item',
155
- title: 'Entity Map',
155
+ title: 'Entity Diagram',
156
156
  href: buildUrl(`/visualiser/services/${service.data.id}/${service.data.version}/entity-map`),
157
157
  },
158
- renderVisualiser &&
159
- hasDataStores && {
160
- type: 'item',
161
- title: 'Data Dependency Graph',
162
- href: buildUrl(`/visualiser/services/${service.data.id}/${service.data.version}/data`),
163
- },
164
158
  ].filter(Boolean) as ChildRef[],
165
159
  },
166
160
  diagrams: hasDiagrams
@@ -83,11 +83,6 @@ export const buildSystemSections = (
83
83
  const diagramNavItems = buildDiagramNavItems(systemDiagrams, context.diagrams);
84
84
  const hasDiagrams = diagramNavItems.length > 0 && shouldRenderSideBarSection(system, 'diagrams');
85
85
 
86
- // A system that declares relationships to other systems, or actors, can be the starting
87
- // point of a Context Diagram. (Systems that are only referenced by others still get a
88
- // context page; here we surface the link from systems that declare something themselves.)
89
- const hasRelationships = (system.data.relationships || []).length > 0 || (system.data.actors || []).length > 0;
90
-
91
86
  const renderOwners = owners.length > 0 && shouldRenderSideBarSection(system, 'owners');
92
87
  const renderRepository = system.data.repository && shouldRenderSideBarSection(system, 'repository');
93
88
  const hasAttachments = system.data.attachments && system.data.attachments.length > 0;
@@ -165,15 +160,10 @@ export const buildSystemSections = (
165
160
  title: 'Overview',
166
161
  href: buildUrl(`/architecture/systems/${system.data.id}/${system.data.version}`),
167
162
  },
168
- renderVisualiser &&
169
- hasRelationships && {
170
- type: 'item',
171
- title: 'Context Diagram',
172
- href: buildUrl(`/visualiser/systems/${system.data.id}/${system.data.version}/context`),
173
- },
163
+ // The system's diagram, with levels from its context down to its messages
174
164
  renderVisualiser && {
175
165
  type: 'item',
176
- title: 'Resource Diagram',
166
+ title: 'Diagram',
177
167
  href: buildUrl(`/visualiser/systems/${system.data.id}/${system.data.version}`),
178
168
  },
179
169
  ].filter(Boolean) as ChildRef[],
@@ -73,12 +73,6 @@ type EntryLike = { collection: string; data: Record<string, any> };
73
73
 
74
74
  export type CustomSidebarContext = {
75
75
  resourceDocs?: ResourceDocEntry[];
76
- /**
77
- * Whether the resource-docs feature is available on this plan. When explicitly false
78
- * (community mode) `[[doc|…]]` refs render nothing — the pages they'd link to don't
79
- * exist — instead of failing the build. Missing docs still fail when the feature is on.
80
- */
81
- resourceDocsEnabled?: boolean;
82
76
  domains?: EntryLike[];
83
77
  services?: EntryLike[];
84
78
  systems?: EntryLike[];
@@ -237,8 +231,6 @@ const resolveDocPage = (
237
231
  context: CustomSidebarContext,
238
232
  spec: SidebarSpec
239
233
  ): NavNode | null => {
240
- if (context.resourceDocsEnabled === false) return null;
241
-
242
234
  const [docType, ...rest] = ref.id.split('/');
243
235
  const docId = rest.join('/');
244
236
 
@@ -608,7 +600,6 @@ export const resolveSidebarPages = <K extends string>(
608
600
  */
609
601
  export const toCustomSidebarContext = (context: {
610
602
  resourceDocs?: ResourceDocEntry[];
611
- resourceDocsEnabled?: boolean;
612
603
  domains?: unknown[];
613
604
  services?: unknown[];
614
605
  systems?: unknown[];
@@ -626,7 +617,6 @@ export const toCustomSidebarContext = (context: {
626
617
  schemas?: unknown[];
627
618
  }): CustomSidebarContext => ({
628
619
  resourceDocs: context.resourceDocs,
629
- resourceDocsEnabled: context.resourceDocsEnabled,
630
620
  domains: context.domains as EntryLike[] | undefined,
631
621
  services: context.services as EntryLike[] | undefined,
632
622
  systems: context.systems as EntryLike[] | undefined,
@@ -41,7 +41,7 @@ import {
41
41
  shouldRenderSideBarSection,
42
42
  withArchitectureDecisionsSection,
43
43
  } from './builders/shared';
44
- import { isArchitectureGraphEnabled, isChangelogEnabled, isResourceDocsEnabled } from '@utils/feature';
44
+ import { isArchitectureGraphEnabled, isChangelogEnabled } from '@utils/feature';
45
45
  import { collectMessageIdsWithFieldUsage } from '@utils/collections/field-usage';
46
46
 
47
47
  export type { NavigationData, NavNode, ChildRef };
@@ -335,7 +335,6 @@ export const getNestedSideBarData = async (): Promise<NavigationData> => {
335
335
  const messages = [...allEvents, ...allCommands, ...allQueries];
336
336
 
337
337
  const context = {
338
- resourceDocsEnabled: isResourceDocsEnabled(),
339
338
  agents,
340
339
  services,
341
340
  domains,
@@ -659,7 +658,6 @@ export const getNestedSideBarData = async (): Promise<NavigationData> => {
659
658
  );
660
659
 
661
660
  const dataProductContext = {
662
- resourceDocsEnabled: isResourceDocsEnabled(),
663
661
  events,
664
662
  commands,
665
663
  queries,
@@ -818,7 +816,7 @@ export const getNestedSideBarData = async (): Promise<NavigationData> => {
818
816
  pages: [
819
817
  {
820
818
  type: 'item',
821
- title: 'Map',
819
+ title: 'Diagram',
822
820
  href: buildUrl(`/visualiser/${channel.collection}/${channel.data.id}/${channel.data.version}`),
823
821
  },
824
822
  ],
@@ -879,7 +877,7 @@ export const getNestedSideBarData = async (): Promise<NavigationData> => {
879
877
  ? [
880
878
  {
881
879
  type: 'item' as const,
882
- title: 'System Context Map',
880
+ title: 'System Context Diagram',
883
881
  href: buildUrl('/visualiser/system-context-map'),
884
882
  },
885
883
  ]
@@ -1172,7 +1170,7 @@ export const getNestedSideBarData = async (): Promise<NavigationData> => {
1172
1170
  pages: [
1173
1171
  {
1174
1172
  type: 'item',
1175
- title: 'System Context Map',
1173
+ title: 'System Context Diagram',
1176
1174
  href: buildUrl('/visualiser/system-context-map'),
1177
1175
  },
1178
1176
  ],
@@ -13,7 +13,7 @@
13
13
 
14
14
  /* Default/Light theme */
15
15
  :root,
16
- :root[data-theme="light"] {
16
+ :root[data-theme='light'] {
17
17
  /* Header */
18
18
  --ec-header-bg: 255 255 255; /* #ffffff */
19
19
  --ec-header-text: 15 23 42; /* #0f172a (slate-900) */
@@ -30,6 +30,9 @@
30
30
  --ec-accent-text: 88 28 135; /* #581c87 (purple-900) */
31
31
  --ec-accent-gradient-from: 126 34 206; /* #7e22ce (purple-700) */
32
32
  --ec-accent-gradient-to: 88 28 135; /* #581c87 (purple-900) */
33
+ /* Resolved on :root for every theme, so the visualiser (which overrides
34
+ --ec-accent with its own palette) can still use the catalog's accent */
35
+ --ec-catalog-accent: var(--ec-accent);
33
36
 
34
37
  /* Buttons */
35
38
  --ec-button-bg: 15 23 42; /* #0f172a */
@@ -163,7 +166,7 @@
163
166
  }
164
167
 
165
168
  /* Dark theme */
166
- :root[data-theme="dark"] {
169
+ :root[data-theme='dark'] {
167
170
  /*
168
171
  * Modern dark theme inspired by Mintlify
169
172
  * Uses deep blacks with subtle cool undertones for a refined look
@@ -178,13 +181,14 @@
178
181
  --ec-primary: 147 51 234; /* #9333ea (purple-600) */
179
182
  --ec-primary-hover: 126 34 206; /* #7e22ce (purple-700) */
180
183
 
181
- /* Accent colors - used for selections, highlights, interactive elements */
182
- --ec-accent: 147 51 234; /* #9333ea (purple-600) */
183
- --ec-accent-hover: 126 34 206; /* #7e22ce (purple-700) */
184
+ /* Accent colors - used for selections, highlights, interactive elements.
185
+ A light shade, like the other themes use in dark mode, so accent text is readable on dark surfaces */
186
+ --ec-accent: 192 132 252; /* #c084fc (purple-400) */
187
+ --ec-accent-hover: 168 85 247; /* #a855f7 (purple-500) */
184
188
  --ec-accent-subtle: 88 28 135 / 0.3; /* purple-900/30 */
185
- --ec-accent-text: 192 132 252; /* #c084fc (purple-400) */
186
- --ec-accent-gradient-from: 147 51 234; /* #9333ea (purple-600) */
187
- --ec-accent-gradient-to: 126 34 206; /* #7e22ce (purple-700) */
189
+ --ec-accent-text: 216 180 254; /* #d8b4fe (purple-300) */
190
+ --ec-accent-gradient-from: 192 132 252; /* #c084fc (purple-400) */
191
+ --ec-accent-gradient-to: 168 85 247; /* #a855f7 (purple-500) */
188
192
 
189
193
  /* Buttons - accent color for better visibility */
190
194
  --ec-button-bg: 147 51 234; /* #9333ea - purple-600 */
@@ -317,7 +321,7 @@
317
321
  }
318
322
 
319
323
  /* Dark mode prose overrides for documentation content */
320
- :root[data-theme="dark"] .prose {
324
+ :root[data-theme='dark'] .prose {
321
325
  --tw-prose-body: rgb(139 148 158); /* #8b949e - muted body text */
322
326
  --tw-prose-headings: rgb(201 209 217); /* #c9d1d9 - soft white headings */
323
327
  --tw-prose-lead: rgb(110 118 129); /* #6e7681 */
@@ -341,44 +345,44 @@
341
345
  * light-theme Tailwind colors. Keep that content readable without changing
342
346
  * the appearance of other custom prose elements.
343
347
  */
344
- :root[data-theme="dark"] .prose .rounded-full.text-gray-900.border-gray-300 {
348
+ :root[data-theme='dark'] .prose .rounded-full.text-gray-900.border-gray-300 {
345
349
  color: rgb(var(--ec-page-text));
346
350
  border-color: rgb(var(--ec-page-border));
347
351
  }
348
352
 
349
- :root[data-theme="dark"] .prose code {
353
+ :root[data-theme='dark'] .prose code {
350
354
  background-color: rgb(33 38 45); /* #21262d */
351
355
  border-radius: 0.25rem;
352
356
  padding: 0.125rem 0.375rem;
353
357
  }
354
358
 
355
- :root[data-theme="dark"] .prose pre {
359
+ :root[data-theme='dark'] .prose pre {
356
360
  background-color: rgb(22 27 34); /* #161b22 */
357
361
  border: 1px solid rgb(33 38 45); /* #21262d */
358
362
  }
359
363
 
360
- :root[data-theme="dark"] .prose a {
364
+ :root[data-theme='dark'] .prose a {
361
365
  color: rgb(168 85 247); /* purple-500 */
362
366
  }
363
367
 
364
- :root[data-theme="dark"] .prose a:hover {
368
+ :root[data-theme='dark'] .prose a:hover {
365
369
  color: rgb(192 132 252); /* purple-400 */
366
370
  }
367
371
 
368
- :root[data-theme="dark"] .prose strong {
372
+ :root[data-theme='dark'] .prose strong {
369
373
  color: rgb(240 246 252); /* #f0f6fc */
370
374
  }
371
375
 
372
- :root[data-theme="dark"] .prose table th {
376
+ :root[data-theme='dark'] .prose table th {
373
377
  color: rgb(240 246 252); /* #f0f6fc */
374
378
  }
375
379
 
376
- :root[data-theme="dark"] .prose table td {
380
+ :root[data-theme='dark'] .prose table td {
377
381
  border-color: rgb(33 38 45); /* #21262d */
378
382
  }
379
383
 
380
384
  /* Invert dark SVG icons in dark mode so they stay visible */
381
- :root[data-theme="dark"] .ec-themed-icon {
385
+ :root[data-theme='dark'] .ec-themed-icon {
382
386
  filter: invert(1);
383
387
  }
384
388
 
@@ -6,8 +6,8 @@
6
6
  */
7
7
 
8
8
  /* Forest Light Mode */
9
- :root[data-catalog-theme="forest"],
10
- :root[data-catalog-theme="forest"][data-theme="light"] {
9
+ :root[data-catalog-theme='forest'],
10
+ :root[data-catalog-theme='forest'][data-theme='light'] {
11
11
  /* Header - clean white */
12
12
  --ec-header-bg: 255 255 255; /* #ffffff */
13
13
  --ec-header-text: 20 20 20; /* #141414 */
@@ -110,7 +110,7 @@
110
110
  }
111
111
 
112
112
  /* Forest Dark Mode */
113
- :root[data-catalog-theme="forest"][data-theme="dark"] {
113
+ :root[data-catalog-theme='forest'][data-theme='dark'] {
114
114
  /* Header - deep forest dark */
115
115
  --ec-header-bg: 3 7 18; /* #030712 gray-950 */
116
116
  --ec-header-text: 243 244 246; /* #f3f4f6 gray-100 */
@@ -209,7 +209,7 @@
209
209
  }
210
210
 
211
211
  /* Forest theme prose overrides */
212
- :root[data-catalog-theme="forest"][data-theme="dark"] .prose {
212
+ :root[data-catalog-theme='forest'][data-theme='dark'] .prose {
213
213
  --tw-prose-body: rgb(156 163 175); /* gray-400 */
214
214
  --tw-prose-headings: rgb(243 244 246); /* gray-100 */
215
215
  --tw-prose-lead: rgb(107 114 128); /* gray-500 */
@@ -228,19 +228,19 @@
228
228
  --tw-prose-td-borders: rgb(31 41 55); /* gray-800 */
229
229
  }
230
230
 
231
- :root[data-catalog-theme="forest"][data-theme="dark"] .prose code {
231
+ :root[data-catalog-theme='forest'][data-theme='dark'] .prose code {
232
232
  background-color: rgb(31 41 55); /* gray-800 */
233
233
  }
234
234
 
235
- :root[data-catalog-theme="forest"][data-theme="dark"] .prose pre {
235
+ :root[data-catalog-theme='forest'][data-theme='dark'] .prose pre {
236
236
  background-color: rgb(17 24 39); /* gray-900 */
237
237
  border: 1px solid rgb(31 41 55); /* gray-800 */
238
238
  }
239
239
 
240
- :root[data-catalog-theme="forest"][data-theme="dark"] .prose a {
240
+ :root[data-catalog-theme='forest'][data-theme='dark'] .prose a {
241
241
  color: rgb(74 222 128); /* green-400 */
242
242
  }
243
243
 
244
- :root[data-catalog-theme="forest"][data-theme="dark"] .prose a:hover {
244
+ :root[data-catalog-theme='forest'][data-theme='dark'] .prose a:hover {
245
245
  color: rgb(134 239 172); /* green-300 */
246
246
  }
@@ -6,8 +6,8 @@
6
6
  */
7
7
 
8
8
  /* Ocean Light Mode */
9
- :root[data-catalog-theme="ocean"],
10
- :root[data-catalog-theme="ocean"][data-theme="light"] {
9
+ :root[data-catalog-theme='ocean'],
10
+ :root[data-catalog-theme='ocean'][data-theme='light'] {
11
11
  /* Header - light with subtle teal tint */
12
12
  --ec-header-bg: 255 255 255; /* #ffffff */
13
13
  --ec-header-text: 15 23 42; /* #0f172a */
@@ -110,7 +110,7 @@
110
110
  }
111
111
 
112
112
  /* Ocean Dark Mode */
113
- :root[data-catalog-theme="ocean"][data-theme="dark"] {
113
+ :root[data-catalog-theme='ocean'][data-theme='dark'] {
114
114
  /*
115
115
  * Unified dark background - all major surfaces share the same deep ocean color
116
116
  * Creates a seamless, immersive dark experience
@@ -214,7 +214,7 @@
214
214
  }
215
215
 
216
216
  /* Ocean theme prose overrides */
217
- :root[data-catalog-theme="ocean"][data-theme="dark"] .prose {
217
+ :root[data-catalog-theme='ocean'][data-theme='dark'] .prose {
218
218
  --tw-prose-body: rgb(148 163 184); /* slate-400 */
219
219
  --tw-prose-headings: rgb(226 232 240); /* slate-200 */
220
220
  --tw-prose-lead: rgb(100 116 139); /* slate-500 */
@@ -233,19 +233,19 @@
233
233
  --tw-prose-td-borders: rgb(30 41 59); /* slate-800 */
234
234
  }
235
235
 
236
- :root[data-catalog-theme="ocean"][data-theme="dark"] .prose code {
236
+ :root[data-catalog-theme='ocean'][data-theme='dark'] .prose code {
237
237
  background-color: rgb(30 41 59); /* slate-800 */
238
238
  }
239
239
 
240
- :root[data-catalog-theme="ocean"][data-theme="dark"] .prose pre {
240
+ :root[data-catalog-theme='ocean'][data-theme='dark'] .prose pre {
241
241
  background-color: rgb(15 23 42); /* slate-900 */
242
242
  border: 1px solid rgb(30 41 59); /* slate-800 */
243
243
  }
244
244
 
245
- :root[data-catalog-theme="ocean"][data-theme="dark"] .prose a {
245
+ :root[data-catalog-theme='ocean'][data-theme='dark'] .prose a {
246
246
  color: rgb(45 212 191); /* teal-400 */
247
247
  }
248
248
 
249
- :root[data-catalog-theme="ocean"][data-theme="dark"] .prose a:hover {
249
+ :root[data-catalog-theme='ocean'][data-theme='dark'] .prose a:hover {
250
250
  color: rgb(94 234 212); /* teal-300 */
251
251
  }
@@ -6,8 +6,8 @@
6
6
  */
7
7
 
8
8
  /* Sapphire Light Mode */
9
- :root[data-catalog-theme="sapphire"],
10
- :root[data-catalog-theme="sapphire"][data-theme="light"] {
9
+ :root[data-catalog-theme='sapphire'],
10
+ :root[data-catalog-theme='sapphire'][data-theme='light'] {
11
11
  /* Header - clean white with subtle blue tint */
12
12
  --ec-header-bg: 255 255 255; /* #ffffff */
13
13
  --ec-header-text: 15 23 42; /* #0f172a */
@@ -110,7 +110,7 @@
110
110
  }
111
111
 
112
112
  /* Sapphire Dark Mode */
113
- :root[data-catalog-theme="sapphire"][data-theme="dark"] {
113
+ :root[data-catalog-theme='sapphire'][data-theme='dark'] {
114
114
  /* Header - matches page bg for unified look */
115
115
  --ec-header-bg: 2 6 23; /* #020617 slate-950 - matches page bg */
116
116
  --ec-header-text: 226 232 240; /* #e2e8f0 */
@@ -209,7 +209,7 @@
209
209
  }
210
210
 
211
211
  /* Sapphire theme prose overrides */
212
- :root[data-catalog-theme="sapphire"][data-theme="dark"] .prose {
212
+ :root[data-catalog-theme='sapphire'][data-theme='dark'] .prose {
213
213
  --tw-prose-body: rgb(148 163 184); /* slate-400 */
214
214
  --tw-prose-headings: rgb(226 232 240); /* slate-200 */
215
215
  --tw-prose-lead: rgb(100 116 139); /* slate-500 */
@@ -228,19 +228,19 @@
228
228
  --tw-prose-td-borders: rgb(30 41 59); /* slate-800 */
229
229
  }
230
230
 
231
- :root[data-catalog-theme="sapphire"][data-theme="dark"] .prose code {
231
+ :root[data-catalog-theme='sapphire'][data-theme='dark'] .prose code {
232
232
  background-color: rgb(30 41 59); /* slate-800 */
233
233
  }
234
234
 
235
- :root[data-catalog-theme="sapphire"][data-theme="dark"] .prose pre {
235
+ :root[data-catalog-theme='sapphire'][data-theme='dark'] .prose pre {
236
236
  background-color: rgb(15 23 42); /* slate-900 */
237
237
  border: 1px solid rgb(30 41 59); /* slate-800 */
238
238
  }
239
239
 
240
- :root[data-catalog-theme="sapphire"][data-theme="dark"] .prose a {
240
+ :root[data-catalog-theme='sapphire'][data-theme='dark'] .prose a {
241
241
  color: rgb(96 165 250); /* blue-400 */
242
242
  }
243
243
 
244
- :root[data-catalog-theme="sapphire"][data-theme="dark"] .prose a:hover {
244
+ :root[data-catalog-theme='sapphire'][data-theme='dark'] .prose a:hover {
245
245
  color: rgb(147 197 253); /* blue-300 */
246
246
  }