@eventcatalog/core 3.29.2 → 3.31.1

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 (113) hide show
  1. package/dist/analytics/analytics.cjs +1 -1
  2. package/dist/analytics/analytics.js +2 -2
  3. package/dist/analytics/log-build.cjs +1 -1
  4. package/dist/analytics/log-build.js +3 -3
  5. package/dist/{chunk-36IA4UE4.js → chunk-7IGMIOQF.js} +1 -1
  6. package/dist/{chunk-EGQGCB2B.js → chunk-HVOLSUC2.js} +1 -1
  7. package/dist/{chunk-DB4IQ3GB.js → chunk-LWVHWR77.js} +1 -1
  8. package/dist/{chunk-VEUNSJ6Z.js → chunk-QIJOBQZ7.js} +1 -1
  9. package/dist/{chunk-MEJOYC5Z.js → chunk-UY5QDWK7.js} +1 -1
  10. package/dist/constants.cjs +1 -1
  11. package/dist/constants.js +1 -1
  12. package/dist/eventcatalog.cjs +1 -1
  13. package/dist/eventcatalog.js +5 -5
  14. package/dist/generate.cjs +1 -1
  15. package/dist/generate.js +3 -3
  16. package/dist/utils/cli-logger.cjs +1 -1
  17. package/dist/utils/cli-logger.js +2 -2
  18. package/eventcatalog/astro.config.mjs +11 -7
  19. package/eventcatalog/public/logo.png +0 -0
  20. package/eventcatalog/src/components/CopyAsMarkdown.tsx +29 -24
  21. package/eventcatalog/src/components/EnvironmentDropdown.tsx +33 -21
  22. package/eventcatalog/src/components/FieldsExplorer/FieldFilters.tsx +3 -53
  23. package/eventcatalog/src/components/FieldsExplorer/FieldsExplorer.tsx +144 -91
  24. package/eventcatalog/src/components/FieldsExplorer/FieldsTable.tsx +112 -109
  25. package/eventcatalog/src/components/Header.astro +9 -19
  26. package/eventcatalog/src/components/MDX/Accordion/Accordion.tsx +12 -14
  27. package/eventcatalog/src/components/MDX/Accordion/AccordionGroup.astro +11 -3
  28. package/eventcatalog/src/components/MDX/Design/Design.astro +1 -1
  29. package/eventcatalog/src/components/MDX/ResourceRef/ResourceRef.astro +15 -5
  30. package/eventcatalog/src/components/MDX/Tiles/Tile.astro +11 -8
  31. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +164 -53
  32. package/eventcatalog/src/components/SchemaExplorer/DiffViewer.tsx +1 -1
  33. package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +4 -4
  34. package/eventcatalog/src/components/SchemaExplorer/Pagination.tsx +12 -10
  35. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +48 -77
  36. package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +238 -169
  37. package/eventcatalog/src/components/SchemaExplorer/SchemaExplorer.tsx +189 -230
  38. package/eventcatalog/src/components/SchemaExplorer/SchemaListItem.tsx +39 -36
  39. package/eventcatalog/src/components/Search/Search.astro +1 -1
  40. package/eventcatalog/src/components/Seo.astro +1 -1
  41. package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +218 -0
  42. package/eventcatalog/src/components/Settings/BillingSettingsForm.tsx +265 -0
  43. package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +371 -0
  44. package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +183 -0
  45. package/eventcatalog/src/components/Settings/LogoUpload.tsx +137 -0
  46. package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +91 -0
  47. package/eventcatalog/src/components/Settings/ReadOnlyBanner.tsx +18 -0
  48. package/eventcatalog/src/components/Settings/Row.tsx +59 -0
  49. package/eventcatalog/src/components/Settings/SettingsShared.tsx +176 -0
  50. package/eventcatalog/src/components/SideNav/NestedSideBar/SearchBar.tsx +3 -3
  51. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +233 -261
  52. package/eventcatalog/src/components/Tables/Discover/DiscoverTable.tsx +116 -68
  53. package/eventcatalog/src/components/Tables/Discover/FilterComponents.tsx +2 -2
  54. package/eventcatalog/src/components/Tables/Discover/columns.tsx +130 -197
  55. package/eventcatalog/src/components/Tables/Table.tsx +21 -18
  56. package/eventcatalog/src/components/Tables/columns/TeamsTableColumns.tsx +79 -131
  57. package/eventcatalog/src/components/Tables/columns/UserTableColumns.tsx +104 -175
  58. package/eventcatalog/src/content.config.ts +1 -1
  59. package/eventcatalog/src/enterprise/auth/error.astro +1 -1
  60. package/eventcatalog/src/enterprise/auth/login.astro +1 -1
  61. package/eventcatalog/src/enterprise/auth/middleware/middleware-auth.ts +11 -7
  62. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/index.tsx +97 -95
  63. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/index.astro +232 -181
  64. package/eventcatalog/src/enterprise/feature.ts +2 -1
  65. package/eventcatalog/src/enterprise/fields/pages/fields.astro +10 -8
  66. package/eventcatalog/src/enterprise/integrations/eventcatalog-features.ts +0 -8
  67. package/eventcatalog/src/layouts/DirectoryLayout.astro +17 -88
  68. package/eventcatalog/src/layouts/SettingsLayout.astro +116 -0
  69. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +562 -141
  70. package/eventcatalog/src/layouts/VisualiserLayout.astro +7 -2
  71. package/eventcatalog/src/pages/_index.astro +253 -256
  72. package/eventcatalog/src/pages/api/settings/ai.ts +57 -0
  73. package/eventcatalog/src/pages/api/settings/general.ts +71 -0
  74. package/eventcatalog/src/pages/api/settings/logo.ts +113 -0
  75. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +3 -3
  76. package/eventcatalog/src/pages/diagrams/[id]/[version]/index.astro +223 -73
  77. package/eventcatalog/src/pages/discover/[type]/index.astro +22 -141
  78. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +130 -30
  79. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +147 -53
  80. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +6 -2
  81. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/[...filename].astro +2 -2
  82. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +22 -19
  83. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +71 -61
  84. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/[filename].astro +5 -1
  85. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +3 -3
  86. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +6 -32
  87. package/eventcatalog/src/pages/docs/llm/llms.txt.ts +5 -1
  88. package/eventcatalog/src/pages/docs/teams/[id]/index.astro +11 -4
  89. package/eventcatalog/src/pages/docs/users/[id]/index.astro +12 -5
  90. package/eventcatalog/src/pages/schemas/explorer/index.astro +10 -8
  91. package/eventcatalog/src/pages/settings/assistant.astro +37 -0
  92. package/eventcatalog/src/pages/settings/billing.astro +17 -0
  93. package/eventcatalog/src/pages/settings/general.astro +32 -0
  94. package/eventcatalog/src/pages/settings/index.astro +21 -0
  95. package/eventcatalog/src/pages/settings/llm-access.astro +34 -0
  96. package/eventcatalog/src/pages/settings/mcp.astro +14 -0
  97. package/eventcatalog/src/pages/studio.astro +1 -1
  98. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +2 -7
  99. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/index.astro +2 -2
  100. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +2 -7
  101. package/eventcatalog/src/styles/theme.css +95 -30
  102. package/eventcatalog/src/styles/themes/forest.css +17 -9
  103. package/eventcatalog/src/styles/themes/ocean.css +10 -2
  104. package/eventcatalog/src/styles/themes/sapphire.css +10 -2
  105. package/eventcatalog/src/styles/themes/sunset.css +25 -17
  106. package/eventcatalog/src/types/react-syntax-highlighter.d.ts +13 -0
  107. package/eventcatalog/src/utils/eventcatalog-config/config-schema.ts +49 -0
  108. package/eventcatalog/src/utils/eventcatalog-config/config-writer.ts +149 -0
  109. package/eventcatalog/src/utils/url-builder.ts +4 -2
  110. package/package.json +7 -5
  111. package/eventcatalog/public/logo.svg +0 -14
  112. package/eventcatalog/src/enterprise/plans/index.astro +0 -319
  113. package/eventcatalog/src/pages/docs/llm/llms-services.txt.ts +0 -81
@@ -23,20 +23,18 @@ const { subdomains, duplicateTerms } = ubiquitousLanguageData;
23
23
 
24
24
  <VerticalSideBarLayout title={pageTitle} description={props.data.summary}>
25
25
  <main
26
- class="flex sm:px-6 docs-layout h-full bg-[rgb(var(--ec-page-bg))]"
26
+ class="flex docs-layout min-h-full bg-[rgb(var(--ec-page-bg))]"
27
27
  data-pagefind-body
28
28
  data-pagefind-meta={`title:${pageTitle}`}
29
29
  >
30
30
  <div class="flex docs-layout w-full">
31
- <div class="w-full lg:mr-2 pr-8 overflow-y-auto pt-6 pb-8 min-h-[50em]">
31
+ <div class="w-full lg:mr-2 pr-24 py-8 min-h-[50em]">
32
32
  {/* Title Section */}
33
33
  <div class="relative border-b border-[rgb(var(--ec-page-border))] mb-6 pb-6">
34
34
  <div class="xl:flex xl:items-start xl:justify-between">
35
35
  <div class="min-w-0 flex-1">
36
- <h1 class="text-xl font-bold leading-7 text-[rgb(var(--ec-page-text))] sm:text-2xl xl:text-3xl">
37
- Ubiquitous Language
38
- </h1>
39
- <p class="mt-2 text-sm text-[rgb(var(--ec-page-text-muted))]">
36
+ <h1 class="text-2xl md:text-4xl font-bold text-[rgb(var(--ec-page-text))]">Ubiquitous Language</h1>
37
+ <p class="pt-2 text-base text-[rgb(var(--ec-page-text-muted))] font-light">
40
38
  Browse and discover ubiquitous language terms in the {props.data.name} domain{
41
39
  subdomains.length > 0 ? ' and its subdomains' : ''
42
40
  }
@@ -49,7 +47,7 @@ const { subdomains, duplicateTerms } = ubiquitousLanguageData;
49
47
  type="text"
50
48
  id="searchInput"
51
49
  placeholder="Search terms..."
52
- class="w-full px-4 py-2.5 pl-10 border border-[rgb(var(--ec-input-border))] rounded-lg focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:border-[rgb(var(--ec-accent))] text-sm bg-[rgb(var(--ec-input-bg))] text-[rgb(var(--ec-input-text))] placeholder:text-[rgb(var(--ec-input-placeholder))] transition-colors"
50
+ class="block w-full rounded-md border-0 py-1.5 pr-4 pl-10 text-sm font-light text-[rgb(var(--ec-header-text))] bg-[rgb(var(--ec-header-bg))] shadow-xs ring-1 ring-inset ring-[rgb(var(--ec-dropdown-border))] placeholder:text-[rgb(var(--ec-icon-color))] focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:outline-none"
53
51
  />
54
52
  <div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
55
53
  <svg class="h-4 w-4 text-[rgb(var(--ec-icon-color))]" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -61,14 +59,6 @@ const { subdomains, duplicateTerms } = ubiquitousLanguageData;
61
59
  </svg>
62
60
  </div>
63
61
  </div>
64
- <div class="mt-2 text-right">
65
- <span
66
- class="inline-flex items-center px-2 py-1 text-xs font-medium text-[rgb(var(--ec-page-text-muted))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-md"
67
- id="resultsCount"
68
- >
69
- {/* This will be updated by JavaScript */}
70
- </span>
71
- </div>
72
62
  </div>
73
63
  </div>
74
64
  </div>
@@ -325,15 +315,11 @@ const { subdomains, duplicateTerms } = ubiquitousLanguageData;
325
315
  function initializeSearch() {
326
316
  const searchInput = document.getElementById('searchInput');
327
317
  const domainSections = document.querySelectorAll('[data-domain-section]');
328
- const resultsCount = document.getElementById('resultsCount');
329
318
 
330
319
  function updateResults() {
331
320
  //@ts-ignore
332
321
  const searchTerm = searchInput?.value.toLowerCase() || '';
333
- let totalVisibleTerms = 0;
334
- let totalTerms = 0;
335
322
 
336
- // Handle search for each domain section
337
323
  domainSections.forEach((section) => {
338
324
  const domainId = section.getAttribute('data-domain-section');
339
325
  const domainCards = section.querySelectorAll('.term-card');
@@ -341,19 +327,14 @@ const { subdomains, duplicateTerms } = ubiquitousLanguageData;
341
327
  let domainVisibleCount = 0;
342
328
 
343
329
  domainCards.forEach((card) => {
344
- totalTerms++;
345
330
  const title = card.querySelector('h4')?.textContent?.toLowerCase() || '';
346
331
  const description = card.querySelector('p')?.textContent?.toLowerCase() || '';
347
332
  const matches = searchTerm === '' || title.includes(searchTerm) || description.includes(searchTerm);
348
333
 
349
334
  card.classList.toggle('hidden', !matches);
350
- if (matches) {
351
- domainVisibleCount++;
352
- totalVisibleTerms++;
353
- }
335
+ if (matches) domainVisibleCount++;
354
336
  });
355
337
 
356
- // Show/hide domain-specific no results message
357
338
  if (domainNoResults) {
358
339
  if (searchTerm.trim() === '') {
359
340
  domainNoResults.classList.add('hidden');
@@ -362,16 +343,9 @@ const { subdomains, duplicateTerms } = ubiquitousLanguageData;
362
343
  }
363
344
  }
364
345
  });
365
-
366
- // Update results count
367
- if (resultsCount) {
368
- resultsCount.textContent = `Showing ${totalVisibleTerms} terms`;
369
- }
370
346
  }
371
347
 
372
348
  searchInput?.addEventListener('input', updateResults);
373
-
374
- // Initialize results count
375
349
  updateResults();
376
350
  }
377
351
 
@@ -2,7 +2,7 @@ import { getCollection } from 'astro:content';
2
2
  import config from '@config';
3
3
  import type { APIRoute } from 'astro';
4
4
 
5
- import { isCustomDocsEnabled, isResourceDocsEnabled } from '@utils/feature';
5
+ import { isCustomDocsEnabled, isResourceDocsEnabled, isLLMSTxtEnabled } from '@utils/feature';
6
6
  import { getUbiquitousLanguage } from '@utils/collections/domains';
7
7
  import { getResourceDocs } from '@utils/collections/resource-docs';
8
8
 
@@ -82,6 +82,10 @@ const renderEntities = (baseUrl: string) => {
82
82
  };
83
83
 
84
84
  export const GET: APIRoute = async ({ params, request }) => {
85
+ if (!isLLMSTxtEnabled()) {
86
+ return new Response('llms.txt is not enabled for this Catalog.', { status: 404 });
87
+ }
88
+
85
89
  const url = new URL(request.url);
86
90
  const baseUrl = process.env.LLMS_TXT_BASE_URL || `${url.origin}`;
87
91
 
@@ -63,9 +63,13 @@ const pageTitle = `Team | ${props.data.name}`;
63
63
  ---
64
64
 
65
65
  <VerticalSideBarLayout title={pageTitle} description={props.data.summary}>
66
- <main class="flex sm:px-8 docs-layout h-full" data-pagefind-body data-pagefind-meta={`title:${pageTitle}`}>
66
+ <main
67
+ class="flex docs-layout min-h-full bg-[rgb(var(--ec-page-bg))]"
68
+ data-pagefind-body
69
+ data-pagefind-meta={`title:${pageTitle}`}
70
+ >
67
71
  <div class="flex docs-layout w-full">
68
- <div class="w-full lg:mr-2 pr-8 overflow-y-auto py-8">
72
+ <div class="w-full lg:mr-2 pr-24 py-8 bg-[rgb(var(--ec-page-bg))]">
69
73
  <div class="border-b border-[rgb(var(--ec-page-border))] pb-6">
70
74
  <div class="flex justify-start">
71
75
  <div class="flex flex-col justify-between space-y-3">
@@ -146,8 +150,11 @@ const pageTitle = `Team | ${props.data.name}`;
146
150
  <Content components={components(props)} />
147
151
  </div>
148
152
  </div>
149
- <aside class="hidden lg:block sticky top-0 pb-10 w-96 overflow-y-auto py-2" data-pagefind-ignore>
150
- <div class="sticky top-28 left-0 h-full overflow-y-auto pr-6 py-4">
153
+ <aside
154
+ class="hidden xl:block sticky top-[5.5rem] self-start w-[280px] max-h-[calc(100vh-5.5rem)] overflow-y-auto py-2 flex-shrink-0 pr-10 bg-[rgb(var(--ec-page-bg))]"
155
+ data-pagefind-ignore
156
+ >
157
+ <div class="py-2">
151
158
  {
152
159
  ownedDomainsList.length > 0 && (
153
160
  <PillListFlat
@@ -60,9 +60,13 @@ const pageTitle = `User | ${props.data.name}`;
60
60
  ---
61
61
 
62
62
  <VerticalSideBarLayout title={pageTitle}>
63
- <main class="flex sm:px-8 docs-layout h-full" data-pagefind-body data-pagefind-meta={`title:${pageTitle}`}>
63
+ <main
64
+ class="flex docs-layout min-h-full bg-[rgb(var(--ec-page-bg))]"
65
+ data-pagefind-body
66
+ data-pagefind-meta={`title:${pageTitle}`}
67
+ >
64
68
  <div class="flex docs-layout w-full">
65
- <div class="w-full lg:mr-2 pr-8 overflow-y-auto py-8">
69
+ <div class="w-full lg:mr-2 pr-24 py-8 bg-[rgb(var(--ec-page-bg))]">
66
70
  <div class="border-b border-[rgb(var(--ec-page-border))] pb-6">
67
71
  <div class="flex justify-start gap-6">
68
72
  {
@@ -70,7 +74,7 @@ const pageTitle = `User | ${props.data.name}`;
70
74
  <img
71
75
  src={props.data.avatarUrl}
72
76
  alt={`${props.data.name}'s profile picture`}
73
- class="w-20 h-20 rounded-full object-cover border-2 border-[rgb(var(--ec-page-border))]"
77
+ class="w-20 h-20 rounded-md object-cover border-2 border-[rgb(var(--ec-page-border))]"
74
78
  />
75
79
  )
76
80
  }
@@ -147,8 +151,11 @@ const pageTitle = `User | ${props.data.name}`;
147
151
  <Content components={components(props)} />
148
152
  </div>
149
153
  </div>
150
- <aside class="hidden lg:block sticky top-0 pb-10 w-96 overflow-y-auto py-2" data-pagefind-ignore>
151
- <div class="sticky top-28 left-0 h-full overflow-y-auto pr-6 py-4">
154
+ <aside
155
+ class="hidden xl:block sticky top-[5.5rem] self-start w-[280px] max-h-[calc(100vh-5.5rem)] overflow-y-auto py-2 flex-shrink-0 pr-10 bg-[rgb(var(--ec-page-bg))]"
156
+ data-pagefind-ignore
157
+ >
158
+ <div class="py-2">
152
159
  {
153
160
  ownedDomainsList.length > 0 && (
154
161
  <PillListFlat
@@ -13,13 +13,15 @@ const apiAccessEnabled = isEventCatalogScaleEnabled();
13
13
  ---
14
14
 
15
15
  <VerticalSideBarLayout title="Schema Explorer - EventCatalog" showNestedSideBar={false}>
16
- <main class="flex docs-layout h-[calc(100vh-var(--header-height,0px)-64px)] bg-[rgb(var(--ec-page-bg))]">
17
- <div class="flex docs-layout w-full h-full">
18
- <div class="w-full flex flex-col h-full">
19
- <div class="w-full max-w-none! h-full flex flex-col overflow-hidden">
20
- <SchemaExplorer client:load schemas={schemas as any} apiAccessEnabled={apiAccessEnabled} />
21
- </div>
22
- </div>
23
- </div>
16
+ <style is:global>
17
+ #eventcatalog-header {
18
+ left: calc(var(--ec-vertical-nav-width, 14rem) + var(--ec-schema-sidebar-width, 360px)) !important;
19
+ }
20
+ </style>
21
+ <main
22
+ class="min-h-0 overflow-hidden bg-[rgb(var(--ec-page-bg))]"
23
+ style={`--ec-schema-sidebar-width: 360px; margin-left: calc(var(--ec-app-content-padding-left, 5rem) * -1); margin-right: calc(var(--ec-app-content-padding-right, 5rem) * -1); height: calc(100dvh - 60px);`}
24
+ >
25
+ <SchemaExplorer client:load schemas={schemas as any} apiAccessEnabled={apiAccessEnabled} />
24
26
  </main>
25
27
  </VerticalSideBarLayout>
@@ -0,0 +1,37 @@
1
+ ---
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import SettingsLayout from '@layouts/SettingsLayout.astro';
5
+ import { AssistantSettingsForm } from '@components/Settings/AssistantSettingsForm';
6
+ import { isDevMode, isSSR, isEventCatalogStarterEnabled, isEventCatalogScaleEnabled } from '@utils/feature';
7
+ import { buildUrl } from '@utils/url-builder';
8
+ import config from '@config';
9
+
10
+ const canEdit = isDevMode();
11
+
12
+ const initial = {
13
+ llmsTxtEnabled: config?.llmsTxt?.enabled ?? true,
14
+ chatEnabled: config?.chat?.enabled ?? true,
15
+ };
16
+
17
+ const projectRoot = process.env.PROJECT_DIR ?? process.cwd();
18
+ const hasChatConfigFile = fs.existsSync(path.join(projectRoot, 'eventcatalog.chat.js'));
19
+ const hasPlan = isEventCatalogStarterEnabled() || isEventCatalogScaleEnabled();
20
+ const inSSR = isSSR();
21
+ const chatAvailable = hasPlan && hasChatConfigFile && inSSR;
22
+
23
+ const apiBase = buildUrl('/api/settings');
24
+ ---
25
+
26
+ <SettingsLayout title="Assistant Agent" active="assistant">
27
+ <AssistantSettingsForm
28
+ client:load
29
+ canEdit={canEdit}
30
+ initial={initial}
31
+ chatAvailable={chatAvailable}
32
+ hasPlan={hasPlan}
33
+ inSSR={inSSR}
34
+ hasChatConfigFile={hasChatConfigFile}
35
+ apiBase={apiBase}
36
+ />
37
+ </SettingsLayout>
@@ -0,0 +1,17 @@
1
+ ---
2
+ import SettingsLayout from '@layouts/SettingsLayout.astro';
3
+ import { BillingSettingsForm, type PlanId } from '@components/Settings/BillingSettingsForm';
4
+ import { isEventCatalogStarterEnabled, isEventCatalogScaleEnabled } from '@utils/feature';
5
+
6
+ // Detect which plan is active. Enterprise has no env flag of its own — it includes
7
+ // Scale features, so an explicit Enterprise toggle would need a separate flag.
8
+ // For now, treat anything Scale-licensed as Scale; Enterprise users will still see
9
+ // upgrade copy on the Scale card but the Plans grid is the canonical source.
10
+ let currentPlan: PlanId = 'community';
11
+ if (isEventCatalogScaleEnabled()) currentPlan = 'scale';
12
+ else if (isEventCatalogStarterEnabled()) currentPlan = 'starter';
13
+ ---
14
+
15
+ <SettingsLayout title="Billing" active="billing">
16
+ <BillingSettingsForm client:load currentPlan={currentPlan} />
17
+ </SettingsLayout>
@@ -0,0 +1,32 @@
1
+ ---
2
+ import SettingsLayout from '@layouts/SettingsLayout.astro';
3
+ import { GeneralSettingsForm } from '@components/Settings/GeneralSettingsForm';
4
+ import { isDevMode } from '@utils/feature';
5
+ import { buildUrl } from '@utils/url-builder';
6
+ import config from '@config';
7
+
8
+ const canEdit = isDevMode();
9
+
10
+ const initial = {
11
+ title: config?.title ?? '',
12
+ tagline: config?.tagline,
13
+ organizationName: config?.organizationName,
14
+ homepageLink: config?.homepageLink,
15
+ editUrl: config?.editUrl,
16
+ repositoryUrl: config?.repositoryUrl,
17
+ logo: config?.logo
18
+ ? {
19
+ alt: config.logo.alt,
20
+ text: config.logo.text,
21
+ src: config.logo.src,
22
+ }
23
+ : undefined,
24
+ theme: config?.theme || 'default',
25
+ };
26
+
27
+ const apiBase = buildUrl('/api/settings');
28
+ ---
29
+
30
+ <SettingsLayout title="General" active="general">
31
+ <GeneralSettingsForm client:load canEdit={canEdit} initial={initial} apiBase={apiBase} />
32
+ </SettingsLayout>
@@ -0,0 +1,21 @@
1
+ ---
2
+ import { buildUrl } from '@utils/url-builder';
3
+
4
+ const target = buildUrl('/settings/general');
5
+ ---
6
+
7
+ <!doctype html>
8
+ <html lang="en">
9
+ <head>
10
+ <meta charset="utf-8" />
11
+ <meta http-equiv="refresh" content={`0; url=${target}`} />
12
+ <link rel="canonical" href={target} />
13
+ <title>Redirecting…</title>
14
+ </head>
15
+ <body>
16
+ <p>Redirecting to <a href={target}>{target}</a>…</p>
17
+ <script is:inline define:vars={{ target }}>
18
+ window.location.replace(target);
19
+ </script>
20
+ </body>
21
+ </html>
@@ -0,0 +1,34 @@
1
+ ---
2
+ import SettingsLayout from '@layouts/SettingsLayout.astro';
3
+ import { LlmAccessSettingsForm } from '@components/Settings/LlmAccessSettingsForm';
4
+ import { isDevMode, isEventCatalogScaleEnabled } from '@utils/feature';
5
+ import { buildUrl } from '@utils/url-builder';
6
+ import config from '@config';
7
+
8
+ const canEdit = isDevMode();
9
+
10
+ const initial = {
11
+ llmsTxtEnabled: config?.llmsTxt?.enabled ?? true,
12
+ chatEnabled: config?.chat?.enabled ?? true,
13
+ };
14
+
15
+ const hasScalePlan = isEventCatalogScaleEnabled();
16
+
17
+ const apiBase = buildUrl('/api/settings');
18
+ const llmsTxtUrl = buildUrl('/docs/llm/llms.txt');
19
+ const llmsFullTxtUrl = buildUrl('/docs/llm/llms-full.txt');
20
+ const schemasTxtUrl = buildUrl('/docs/llm/schemas.txt');
21
+ ---
22
+
23
+ <SettingsLayout title="LLM Access" active="llm-access">
24
+ <LlmAccessSettingsForm
25
+ client:load
26
+ canEdit={canEdit}
27
+ initial={initial}
28
+ hasScalePlan={hasScalePlan}
29
+ apiBase={apiBase}
30
+ llmsTxtUrl={llmsTxtUrl}
31
+ llmsFullTxtUrl={llmsFullTxtUrl}
32
+ schemasTxtUrl={schemasTxtUrl}
33
+ />
34
+ </SettingsLayout>
@@ -0,0 +1,14 @@
1
+ ---
2
+ import SettingsLayout from '@layouts/SettingsLayout.astro';
3
+ import { McpSettingsForm } from '@components/Settings/McpSettingsForm';
4
+ import { isSSR, isEventCatalogScaleEnabled } from '@utils/feature';
5
+ import { buildUrl } from '@utils/url-builder';
6
+
7
+ const hasScalePlan = isEventCatalogScaleEnabled();
8
+ const inSSR = isSSR();
9
+ const mcpUrl = buildUrl('/docs/mcp');
10
+ ---
11
+
12
+ <SettingsLayout title="MCP" active="mcp">
13
+ <McpSettingsForm client:load hasScalePlan={hasScalePlan} inSSR={inSSR} mcpUrl={mcpUrl} />
14
+ </SettingsLayout>
@@ -42,7 +42,7 @@ const hasResources = resourcesToShow.length > 0;
42
42
  <head>
43
43
  <meta charset="UTF-8" />
44
44
  <meta name="viewport" content="width=device-width" />
45
- <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
45
+ <link rel="icon" type="image/png" href="/logo.png" />
46
46
  <meta name="generator" content={Astro.generator} />
47
47
  <title>EventCatalog Studio</title>
48
48
  </head>
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  import NodeGraph from '@components/MDX/NodeGraph/NodeGraph.astro';
3
3
  import VisualiserLayout from '@layouts/VisualiserLayout.astro';
4
- import { buildUrl } from '@utils/url-builder';
5
4
  import { ClientRouter } from 'astro:transitions';
6
5
 
7
6
  import { Page } from './_index.data';
@@ -19,9 +18,9 @@ const {
19
18
  ---
20
19
 
21
20
  <VisualiserLayout title={`Visualiser | ${props.data.name} (${props.collection})`} description={props.data.summary}>
22
- <div class="m-4">
21
+ <div class="p-2">
23
22
  <div
24
- class="h-[calc(100vh-130px)] w-full relative border border-[rgb(var(--ec-page-border))] rounded-md"
23
+ class="h-[calc(100vh-5rem)] w-full relative border border-[rgb(var(--ec-page-border))]"
25
24
  id={`${id}-portal`}
26
25
  transition:animate="fade"
27
26
  >
@@ -34,10 +33,6 @@ const {
34
33
  linkTo="visualiser"
35
34
  version={props.data.version}
36
35
  linksToVisualiser={false}
37
- href={{
38
- label: `Open documentation for ${props.data.name} v${props.data.version}`,
39
- url: buildUrl(`/docs/${props.collection}/${props.data.id}/${props.data.version}`),
40
- }}
41
36
  />
42
37
  </div>
43
38
  <ClientRouter />
@@ -20,9 +20,9 @@ const {
20
20
  ---
21
21
 
22
22
  <VisualiserLayout title={`Visualiser | ${props.data.name} (${props.collection})`} description={props.data.summary}>
23
- <div class="m-4">
23
+ <div class="p-2">
24
24
  <div
25
- class="h-[calc(100vh-130px)] w-full relative border border-[rgb(var(--ec-page-border))] rounded-md"
25
+ class="h-[calc(100vh-5rem)] w-full relative border border-[rgb(var(--ec-page-border))]"
26
26
  id={`${id}-portal`}
27
27
  transition:animate="fade"
28
28
  >
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  import NodeGraph from '@components/MDX/NodeGraph/NodeGraph.astro';
3
3
  import VisualiserLayout from '@layouts/VisualiserLayout.astro';
4
- import { buildUrl } from '@utils/url-builder';
5
4
  import { ClientRouter } from 'astro:transitions';
6
5
 
7
6
  import { Page } from './_index.data';
@@ -19,9 +18,9 @@ const {
19
18
  ---
20
19
 
21
20
  <VisualiserLayout title={`Visualiser | ${props.data.name} (${props.collection})`} description={props.data.summary}>
22
- <div class="m-4">
21
+ <div class="p-2">
23
22
  <div
24
- class="h-[calc(100vh-130px)] w-full relative border border-[rgb(var(--ec-page-border))] rounded-md"
23
+ class="h-[calc(100vh-5rem)] w-full relative border border-[rgb(var(--ec-page-border))]"
25
24
  id={`${id}-portal`}
26
25
  transition:animate="fade"
27
26
  >
@@ -34,10 +33,6 @@ const {
34
33
  linkTo="visualiser"
35
34
  version={props.data.version}
36
35
  linksToVisualiser={false}
37
- href={{
38
- label: `Open documentation for ${props.data.name} v${props.data.version}`,
39
- url: buildUrl(`/docs/${props.collection}/${props.data.id}/${props.data.version}`),
40
- }}
41
36
  />
42
37
  </div>
43
38
  <ClientRouter />