@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
@@ -17,19 +17,19 @@
17
17
  /* Header */
18
18
  --ec-header-bg: 255 255 255; /* #ffffff */
19
19
  --ec-header-text: 15 23 42; /* #0f172a (slate-900) */
20
- --ec-header-border: 226 232 240; /* #e2e8f0 (slate-200) */
20
+ --ec-header-border: 229 229 229; /* #e5e5e5 (neutral-200) */
21
21
 
22
22
  /* Primary brand color */
23
- --ec-primary: 168 85 247; /* #a855f7 */
24
- --ec-primary-hover: 147 51 234; /* #9333ea */
23
+ --ec-primary: 126 34 206; /* #7e22ce (purple-700) */
24
+ --ec-primary-hover: 107 33 168; /* #6b21a8 (purple-800) */
25
25
 
26
26
  /* Accent colors - used for selections, highlights, interactive elements */
27
- --ec-accent: 168 85 247; /* #a855f7 (purple-500) */
28
- --ec-accent-hover: 147 51 234; /* #9333ea (purple-600) */
29
- --ec-accent-subtle: 243 232 255; /* #f3e8ff (purple-100) */
30
- --ec-accent-text: 107 33 168; /* #6b21a8 (purple-800) */
31
- --ec-accent-gradient-from: 168 85 247; /* #a855f7 (purple-500) */
32
- --ec-accent-gradient-to: 126 34 206; /* #7e22ce (purple-700) */
27
+ --ec-accent: 126 34 206; /* #7e22ce (purple-700) */
28
+ --ec-accent-hover: 107 33 168; /* #6b21a8 (purple-800) */
29
+ --ec-accent-subtle: 233 213 255; /* #e9d5ff (purple-200) */
30
+ --ec-accent-text: 88 28 135; /* #581c87 (purple-900) */
31
+ --ec-accent-gradient-from: 126 34 206; /* #7e22ce (purple-700) */
32
+ --ec-accent-gradient-to: 88 28 135; /* #581c87 (purple-900) */
33
33
 
34
34
  /* Buttons */
35
35
  --ec-button-bg: 15 23 42; /* #0f172a */
@@ -49,18 +49,23 @@
49
49
  /* Sidebar / Vertical Nav (icon bar) */
50
50
  --ec-sidebar-bg: 255 255 255; /* #ffffff */
51
51
  --ec-sidebar-bg-gradient: 248 250 252; /* #f8fafc (slate-50) */
52
- --ec-sidebar-border: 226 232 240; /* #e2e8f0 (slate-200) */
52
+ --ec-sidebar-border: 229 229 229; /* #e5e5e5 (neutral-200) */
53
53
  --ec-sidebar-text: 71 85 105; /* #475569 (slate-600) */
54
54
  --ec-sidebar-active-bg: 15 23 42; /* #0f172a */
55
55
  --ec-sidebar-active-text: 255 255 255; /* #ffffff */
56
56
  --ec-sidebar-hover-bg: 15 23 42; /* #0f172a - black on hover like active */
57
57
 
58
+ /* Rail / inset-panel surface (5% off the sidebar bg). Use for navigation rails,
59
+ filter panels, and any inset surface that should sit slightly off the page. */
60
+ --ec-rail-bg: 250 250 250; /* #fafafa - 2% darker than white */
61
+ --ec-rail-active-bg: 218 218 218; /* ~10% darker than rail bg */
62
+
58
63
  /* Nested sidebar content */
59
64
  --ec-content-bg: 255 255 255; /* #ffffff */
60
65
  --ec-content-text: 15 23 42; /* #0f172a (slate-900) */
61
66
  --ec-content-text-muted: 100 116 139; /* #64748b (slate-500) */
62
67
  --ec-content-text-secondary: 71 85 105; /* #475569 (slate-600) */
63
- --ec-content-border: 226 232 240; /* #e2e8f0 (slate-200) */
68
+ --ec-content-border: 229 229 229; /* #e5e5e5 (neutral-200) */
64
69
  --ec-content-hover: 248 250 252; /* #f8fafc (slate-50) */
65
70
  --ec-content-active: 245 243 255; /* #f5f3ff (violet-50) */
66
71
 
@@ -71,14 +76,14 @@
71
76
  --ec-input-placeholder: 148 163 184; /* #94a3b8 (slate-400) */
72
77
 
73
78
  /* Group headers */
74
- --ec-group-icon-bg: 241 245 249; /* #f1f5f9 (slate-100) */
75
- --ec-group-icon-text: 71 85 105; /* #475569 (slate-600) */
79
+ --ec-group-icon-bg: 233 213 255; /* #e9d5ff (purple-200) */
80
+ --ec-group-icon-text: 88 28 135; /* #581c87 (purple-900) */
76
81
 
77
82
  /* Main content/docs area */
78
83
  --ec-page-bg: 255 255 255; /* #ffffff */
79
84
  --ec-page-text: 15 23 42; /* #0f172a */
80
85
  --ec-page-text-muted: 100 116 139; /* #64748b */
81
- --ec-page-border: 226 232 240; /* #e2e8f0 */
86
+ --ec-page-border: 229 229 229; /* #e5e5e5 (neutral-200) */
82
87
 
83
88
  /* Card/elevated surfaces */
84
89
  --ec-card-bg: 255 255 255; /* #ffffff */
@@ -117,17 +122,21 @@
117
122
  */
118
123
 
119
124
  /* Header - deep black with cool border */
120
- --ec-header-bg: 13 17 23; /* #0d1117 - GitHub dark bg */
125
+ --ec-header-bg: 9 13 13; /* #090d0d */
121
126
  --ec-header-text: 240 246 252; /* #f0f6fc - soft white */
122
- --ec-header-border: 33 38 45; /* #21262d - subtle border */
127
+ --ec-header-border: 38 41 47; /* #26292f - lifted ~20% */
128
+
129
+ /* Primary brand color */
130
+ --ec-primary: 147 51 234; /* #9333ea (purple-600) */
131
+ --ec-primary-hover: 126 34 206; /* #7e22ce (purple-700) */
123
132
 
124
133
  /* Accent colors - used for selections, highlights, interactive elements */
125
- --ec-accent: 192 132 252; /* #c084fc (purple-400) */
126
- --ec-accent-hover: 168 85 247; /* #a855f7 (purple-500) */
134
+ --ec-accent: 147 51 234; /* #9333ea (purple-600) */
135
+ --ec-accent-hover: 126 34 206; /* #7e22ce (purple-700) */
127
136
  --ec-accent-subtle: 88 28 135 / 0.3; /* purple-900/30 */
128
- --ec-accent-text: 216 180 254; /* #d8b4fe (purple-300) */
129
- --ec-accent-gradient-from: 192 132 252; /* #c084fc (purple-400) */
130
- --ec-accent-gradient-to: 168 85 247; /* #a855f7 (purple-500) */
137
+ --ec-accent-text: 192 132 252; /* #c084fc (purple-400) */
138
+ --ec-accent-gradient-from: 147 51 234; /* #9333ea (purple-600) */
139
+ --ec-accent-gradient-to: 126 34 206; /* #7e22ce (purple-700) */
131
140
 
132
141
  /* Buttons - accent color for better visibility */
133
142
  --ec-button-bg: 147 51 234; /* #9333ea - purple-600 */
@@ -144,21 +153,25 @@
144
153
  --ec-icon-color: 139 148 158; /* #8b949e */
145
154
  --ec-icon-hover: 240 246 252; /* #f0f6fc */
146
155
 
147
- /* Sidebar / Vertical Nav (icon bar) - darkest surface */
148
- --ec-sidebar-bg: 13 17 23; /* #0d1117 */
149
- --ec-sidebar-bg-gradient: 22 27 34; /* #161b22 */
150
- --ec-sidebar-border: 33 38 45; /* #21262d */
156
+ /* Sidebar / Vertical Nav (icon bar) */
157
+ --ec-sidebar-bg: 9 13 13; /* #090d0d - matches page bg */
158
+ --ec-sidebar-bg-gradient: 9 13 13; /* #090d0d */
159
+ --ec-sidebar-border: 51 57 65; /* #333941 - lifted ~20% */
151
160
  --ec-sidebar-text: 139 148 158; /* #8b949e */
152
161
  --ec-sidebar-active-bg: 48 54 61; /* #30363d - subtle highlight */
153
162
  --ec-sidebar-active-text: 240 246 252; /* #f0f6fc */
154
163
  --ec-sidebar-hover-bg: 33 38 45; /* #21262d */
155
164
 
165
+ /* Rail / inset-panel surface (~2% lifted from the page bg) */
166
+ --ec-rail-bg: 15 19 19; /* ~2% lighter than #090d0d */
167
+ --ec-rail-active-bg: 35 38 38; /* ~10% lifted off rail bg */
168
+
156
169
  /* Nested sidebar content */
157
- --ec-content-bg: 13 17 23; /* #0d1117 */
170
+ --ec-content-bg: 9 13 13; /* #090d0d - matches page bg */
158
171
  --ec-content-text: 201 209 217; /* #c9d1d9 - softer than pure white */
159
172
  --ec-content-text-muted: 139 148 158; /* #8b949e */
160
173
  --ec-content-text-secondary: 170 178 186; /* #aab2ba - sidebar children text */
161
- --ec-content-border: 33 38 45; /* #21262d */
174
+ --ec-content-border: 51 57 65; /* #333941 - lifted ~20% */
162
175
  --ec-content-hover: 22 27 34; /* #161b22 */
163
176
  --ec-content-active: 33 38 45; /* #21262d */
164
177
 
@@ -170,13 +183,13 @@
170
183
 
171
184
  /* Group headers */
172
185
  --ec-group-icon-bg: 33 38 45; /* #21262d */
173
- --ec-group-icon-text: 201 209 217; /* #c9d1d9 */
186
+ --ec-group-icon-text: 192 132 252; /* #c084fc (purple-400) */
174
187
 
175
188
  /* Main content/docs area - base dark surface */
176
- --ec-page-bg: 13 17 23; /* #0d1117 */
189
+ --ec-page-bg: 9 13 13; /* #090d0d */
177
190
  --ec-page-text: 240 246 252; /* #f0f6fc */
178
191
  --ec-page-text-muted: 163 172 182; /* #a3acb6 */
179
- --ec-page-border: 33 38 45; /* #21262d */
192
+ --ec-page-border: 38 41 47; /* #26292f - lifted ~20% */
180
193
 
181
194
  /* Card/elevated surfaces - for depth */
182
195
  --ec-card-bg: 22 27 34; /* #161b22 */
@@ -262,3 +275,55 @@
262
275
  :root[data-theme="dark"] .ec-themed-icon {
263
276
  filter: invert(1);
264
277
  }
278
+
279
+ /*
280
+ * Expressive Code (code blocks) — match the EventCatalog editor look:
281
+ * single rounded container, generous padding, no scrollbar gutter when wrapping.
282
+ */
283
+ .expressive-code {
284
+ margin: 1rem 0;
285
+ --ec-codeFontSize: 0.88em;
286
+ }
287
+
288
+ .expressive-code .frame {
289
+ box-shadow: none !important;
290
+ background: transparent !important;
291
+ }
292
+
293
+ .expressive-code .frame pre {
294
+ border: 1px solid rgb(var(--ec-page-border)) !important;
295
+ border-radius: 0.5rem !important;
296
+ padding: 0 !important;
297
+ overflow: hidden !important;
298
+ scrollbar-width: none !important;
299
+ }
300
+
301
+ .expressive-code .frame pre > code {
302
+ padding: 1rem 0 !important;
303
+ background: var(--code-background);
304
+ }
305
+
306
+ .expressive-code .frame pre::-webkit-scrollbar,
307
+ .expressive-code .frame pre::-webkit-scrollbar-track,
308
+ .expressive-code .frame pre::-webkit-scrollbar-thumb {
309
+ display: none !important;
310
+ width: 0 !important;
311
+ height: 0 !important;
312
+ background: transparent !important;
313
+ }
314
+
315
+ .expressive-code .frame .copy button {
316
+ border-radius: 0.375rem;
317
+ }
318
+
319
+ /* Hide the "Copied!" tooltip and instead swap the copy icon for a checkmark
320
+ while feedback is active. Reverts back to the copy icon automatically when
321
+ the feedback element is removed. */
322
+ .expressive-code .frame .copy .feedback {
323
+ display: none !important;
324
+ }
325
+
326
+ .expressive-code .frame .copy:has(.feedback) button::after {
327
+ -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") !important;
328
+ mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") !important;
329
+ }
@@ -11,7 +11,7 @@
11
11
  /* Header - clean white */
12
12
  --ec-header-bg: 255 255 255; /* #ffffff */
13
13
  --ec-header-text: 20 20 20; /* #141414 */
14
- --ec-header-border: 229 231 235; /* #e5e7eb gray-200 */
14
+ --ec-header-border: 229 229 229; /* #e5e5e5 (neutral-200) */
15
15
 
16
16
  /* Primary brand color - deep forest green */
17
17
  --ec-primary: 22 101 52; /* #166534 green-800 */
@@ -34,7 +34,7 @@
34
34
  --ec-dropdown-bg: 255 255 255; /* #ffffff */
35
35
  --ec-dropdown-text: 55 65 81; /* #374151 gray-700 */
36
36
  --ec-dropdown-hover: 240 253 244; /* #f0fdf4 green-50 */
37
- --ec-dropdown-border: 229 231 235; /* #e5e7eb gray-200 */
37
+ --ec-dropdown-border: 229 229 229; /* #e5e5e5 (neutral-200) */
38
38
 
39
39
  /* Icons */
40
40
  --ec-icon-color: 75 85 99; /* #4b5563 gray-600 */
@@ -43,18 +43,22 @@
43
43
  /* Sidebar / Vertical Nav */
44
44
  --ec-sidebar-bg: 255 255 255; /* #ffffff */
45
45
  --ec-sidebar-bg-gradient: 240 253 244; /* #f0fdf4 green-50 */
46
- --ec-sidebar-border: 229 231 235; /* #e5e7eb gray-200 */
46
+ --ec-sidebar-border: 229 229 229; /* #e5e5e5 (neutral-200) */
47
47
  --ec-sidebar-text: 75 85 99; /* #4b5563 gray-600 */
48
48
  --ec-sidebar-active-bg: 22 101 52; /* #166534 green-800 */
49
49
  --ec-sidebar-active-text: 255 255 255; /* #ffffff */
50
50
  --ec-sidebar-hover-bg: 22 101 52; /* #166534 green-800 */
51
51
 
52
+ /* Rail / inset-panel surface (5% off the sidebar bg) */
53
+ --ec-rail-bg: 250 250 250; /* #fafafa - 2% darker than white */
54
+ --ec-rail-active-bg: 218 218 218; /* ~10% darker than rail bg */
55
+
52
56
  /* Nested sidebar content */
53
57
  --ec-content-bg: 255 255 255; /* #ffffff */
54
58
  --ec-content-text: 17 24 39; /* #111827 gray-900 */
55
59
  --ec-content-text-muted: 75 85 99; /* #4b5563 gray-600 */
56
60
  --ec-content-text-secondary: 107 114 128; /* #6b7280 gray-500 */
57
- --ec-content-border: 229 231 235; /* #e5e7eb gray-200 */
61
+ --ec-content-border: 229 229 229; /* #e5e5e5 (neutral-200) */
58
62
  --ec-content-hover: 249 250 251; /* #f9fafb gray-50 */
59
63
  --ec-content-active: 220 252 231; /* #dcfce7 green-100 */
60
64
 
@@ -72,7 +76,7 @@
72
76
  --ec-page-bg: 255 255 255; /* #ffffff */
73
77
  --ec-page-text: 17 24 39; /* #111827 gray-900 */
74
78
  --ec-page-text-muted: 75 85 99; /* #4b5563 gray-600 */
75
- --ec-page-border: 229 231 235; /* #e5e7eb gray-200 */
79
+ --ec-page-border: 229 229 229; /* #e5e5e5 (neutral-200) */
76
80
 
77
81
  /* Card/elevated surfaces */
78
82
  --ec-card-bg: 255 255 255; /* #ffffff */
@@ -108,7 +112,7 @@
108
112
  /* Header - deep forest dark */
109
113
  --ec-header-bg: 3 7 18; /* #030712 gray-950 */
110
114
  --ec-header-text: 243 244 246; /* #f3f4f6 gray-100 */
111
- --ec-header-border: 17 24 39; /* #111827 gray-900 */
115
+ --ec-header-border: 31 41 55; /* #1f2937 gray-800 */
112
116
 
113
117
  /* Accent colors - muted forest green for dark */
114
118
  --ec-accent: 74 222 128; /* #4ade80 (green-400) */
@@ -136,18 +140,22 @@
136
140
  /* Sidebar / Vertical Nav */
137
141
  --ec-sidebar-bg: 3 7 18; /* #030712 gray-950 */
138
142
  --ec-sidebar-bg-gradient: 3 7 18; /* #030712 */
139
- --ec-sidebar-border: 17 24 39; /* #111827 gray-900 */
143
+ --ec-sidebar-border: 31 41 55; /* #1f2937 gray-800 */
140
144
  --ec-sidebar-text: 156 163 175; /* #9ca3af */
141
145
  --ec-sidebar-active-bg: 22 101 52; /* #166534 green-800 */
142
146
  --ec-sidebar-active-text: 255 255 255; /* #ffffff */
143
147
  --ec-sidebar-hover-bg: 31 41 55; /* #1f2937 */
144
148
 
149
+ /* Rail / inset-panel surface (5% lifted from the sidebar bg) */
150
+ --ec-rail-bg: 8 12 23; /* ~2% lighter than #030712 */
151
+ --ec-rail-active-bg: 34 38 49; /* ~10% lifted off rail bg */
152
+
145
153
  /* Nested sidebar content */
146
154
  --ec-content-bg: 3 7 18; /* #030712 */
147
155
  --ec-content-text: 243 244 246; /* #f3f4f6 */
148
156
  --ec-content-text-muted: 156 163 175; /* #9ca3af */
149
157
  --ec-content-text-secondary: 156 163 175; /* #9ca3af */
150
- --ec-content-border: 17 24 39; /* #111827 gray-900 */
158
+ --ec-content-border: 31 41 55; /* #1f2937 gray-800 */
151
159
  --ec-content-hover: 17 24 39; /* #111827 */
152
160
  --ec-content-active: 31 41 55; /* #1f2937 */
153
161
 
@@ -165,7 +173,7 @@
165
173
  --ec-page-bg: 3 7 18; /* #030712 */
166
174
  --ec-page-text: 243 244 246; /* #f3f4f6 */
167
175
  --ec-page-text-muted: 156 163 175; /* #9ca3af */
168
- --ec-page-border: 17 24 39; /* #111827 gray-900 */
176
+ --ec-page-border: 31 41 55; /* #1f2937 gray-800 */
169
177
 
170
178
  /* Card/elevated surfaces */
171
179
  --ec-card-bg: 3 7 18; /* #030712 */
@@ -49,6 +49,10 @@
49
49
  --ec-sidebar-active-text: 255 255 255; /* #ffffff */
50
50
  --ec-sidebar-hover-bg: 13 148 136; /* #0d9488 teal-600 - same as active for consistency */
51
51
 
52
+ /* Rail / inset-panel surface (5% off the sidebar bg) */
53
+ --ec-rail-bg: 250 250 250; /* #fafafa - 2% darker than white */
54
+ --ec-rail-active-bg: 218 218 218; /* ~10% darker than rail bg */
55
+
52
56
  /* Nested sidebar content */
53
57
  --ec-content-bg: 255 255 255; /* #ffffff */
54
58
  --ec-content-text: 15 23 42; /* #0f172a */
@@ -110,8 +114,8 @@
110
114
  * Creates a seamless, immersive dark experience
111
115
  */
112
116
 
113
- /* Header - slightly elevated from page for visual hierarchy */
114
- --ec-header-bg: 15 23 42; /* #0f172a slate-900 - subtle lift */
117
+ /* Header - matches page bg for unified look */
118
+ --ec-header-bg: 2 6 23; /* #020617 slate-950 - matches page bg */
115
119
  --ec-header-text: 226 232 240; /* #e2e8f0 */
116
120
  --ec-header-border: 30 41 59; /* #1e293b */
117
121
 
@@ -147,6 +151,10 @@
147
151
  --ec-sidebar-active-text: 2 6 23; /* #020617 */
148
152
  --ec-sidebar-hover-bg: 30 41 59; /* #1e293b */
149
153
 
154
+ /* Rail / inset-panel surface (5% lifted from the sidebar bg) */
155
+ --ec-rail-bg: 7 11 28; /* ~2% lighter than #020617 */
156
+ --ec-rail-active-bg: 33 37 54; /* ~10% lifted off rail bg */
157
+
150
158
  /* Nested sidebar content - same as page bg */
151
159
  --ec-content-bg: 2 6 23; /* #020617 */
152
160
  --ec-content-text: 226 232 240; /* #e2e8f0 */
@@ -49,6 +49,10 @@
49
49
  --ec-sidebar-active-text: 255 255 255; /* #ffffff */
50
50
  --ec-sidebar-hover-bg: 37 99 235; /* #2563eb blue-600 */
51
51
 
52
+ /* Rail / inset-panel surface (5% off the sidebar bg) */
53
+ --ec-rail-bg: 250 250 250; /* #fafafa - 2% darker than white */
54
+ --ec-rail-active-bg: 218 218 218; /* ~10% darker than rail bg */
55
+
52
56
  /* Nested sidebar content */
53
57
  --ec-content-bg: 255 255 255; /* #ffffff */
54
58
  --ec-content-text: 15 23 42; /* #0f172a */
@@ -105,8 +109,8 @@
105
109
 
106
110
  /* Sapphire Dark Mode */
107
111
  :root[data-catalog-theme="sapphire"][data-theme="dark"] {
108
- /* Header - slightly elevated for visual hierarchy */
109
- --ec-header-bg: 15 23 42; /* #0f172a slate-900 */
112
+ /* Header - matches page bg for unified look */
113
+ --ec-header-bg: 2 6 23; /* #020617 slate-950 - matches page bg */
110
114
  --ec-header-text: 226 232 240; /* #e2e8f0 */
111
115
  --ec-header-border: 30 41 59; /* #1e293b slate-800 */
112
116
 
@@ -142,6 +146,10 @@
142
146
  --ec-sidebar-active-text: 255 255 255; /* #ffffff */
143
147
  --ec-sidebar-hover-bg: 30 41 59; /* #1e293b */
144
148
 
149
+ /* Rail / inset-panel surface (5% lifted from the sidebar bg) */
150
+ --ec-rail-bg: 7 11 28; /* ~2% lighter than #020617 */
151
+ --ec-rail-active-bg: 33 37 54; /* ~10% lifted off rail bg */
152
+
145
153
  /* Nested sidebar content */
146
154
  --ec-content-bg: 2 6 23; /* #020617 */
147
155
  --ec-content-text: 226 232 240; /* #e2e8f0 */
@@ -14,16 +14,16 @@
14
14
  --ec-header-border: 229 229 229; /* #e5e5e5 neutral-200 */
15
15
 
16
16
  /* Primary brand color - sunset orange */
17
- --ec-primary: 249 115 22; /* #f97316 orange-500 */
18
- --ec-primary-hover: 234 88 12; /* #ea580c orange-600 */
17
+ --ec-primary: 255 106 0; /* #ff6a00 vivid orange */
18
+ --ec-primary-hover: 232 93 0; /* #e85d00 deeper vivid orange */
19
19
 
20
20
  /* Accent colors - sunset orange */
21
- --ec-accent: 249 115 22; /* #f97316 (orange-500) */
22
- --ec-accent-hover: 234 88 12; /* #ea580c (orange-600) */
23
- --ec-accent-subtle: 255 237 213; /* #ffedd5 (orange-100) */
24
- --ec-accent-text: 154 52 18; /* #9a3412 (orange-800) */
25
- --ec-accent-gradient-from: 249 115 22; /* #f97316 (orange-500) */
26
- --ec-accent-gradient-to: 234 88 12; /* #ea580c (orange-600) */
21
+ --ec-accent: 255 106 0; /* #ff6a00 vivid orange */
22
+ --ec-accent-hover: 232 93 0; /* #e85d00 deeper vivid orange */
23
+ --ec-accent-subtle: 255 232 209; /* #ffe8d1 (subtle vivid orange) */
24
+ --ec-accent-text: 122 46 16; /* #7a2e10 burnt orange */
25
+ --ec-accent-gradient-from: 255 106 0; /* #ff6a00 */
26
+ --ec-accent-gradient-to: 232 93 0; /* #e85d00 */
27
27
 
28
28
  /* Buttons */
29
29
  --ec-button-bg: 234 88 12; /* #ea580c orange-600 */
@@ -49,6 +49,10 @@
49
49
  --ec-sidebar-active-text: 255 255 255; /* #ffffff */
50
50
  --ec-sidebar-hover-bg: 234 88 12; /* #ea580c orange-600 */
51
51
 
52
+ /* Rail / inset-panel surface (5% off the sidebar bg) */
53
+ --ec-rail-bg: 250 250 250; /* #fafafa - 2% darker than white */
54
+ --ec-rail-active-bg: 218 218 218; /* ~10% darker than rail bg */
55
+
52
56
  /* Nested sidebar content */
53
57
  --ec-content-bg: 255 255 255; /* #ffffff */
54
58
  --ec-content-text: 23 23 23; /* #171717 neutral-900 */
@@ -105,18 +109,18 @@
105
109
 
106
110
  /* Sunset Dark Mode */
107
111
  :root[data-catalog-theme="sunset"][data-theme="dark"] {
108
- /* Header - warm dark */
109
- --ec-header-bg: 23 23 23; /* #171717 neutral-900 */
112
+ /* Header - matches page bg for unified look */
113
+ --ec-header-bg: 10 10 10; /* #0a0a0a neutral-950 - matches page bg */
110
114
  --ec-header-text: 245 245 245; /* #f5f5f5 neutral-100 */
111
115
  --ec-header-border: 38 38 38; /* #262626 neutral-800 */
112
116
 
113
117
  /* Accent colors - sunset orange for dark */
114
- --ec-accent: 251 146 60; /* #fb923c (orange-400) */
115
- --ec-accent-hover: 249 115 22; /* #f97316 (orange-500) */
116
- --ec-accent-subtle: 154 52 18 / 0.3; /* orange-800/30 */
117
- --ec-accent-text: 253 186 116; /* #fdba74 (orange-300) */
118
- --ec-accent-gradient-from: 251 146 60; /* #fb923c (orange-400) */
119
- --ec-accent-gradient-to: 249 115 22; /* #f97316 (orange-500) */
118
+ --ec-accent: 255 138 61; /* #ff8a3d punchier vivid orange */
119
+ --ec-accent-hover: 255 106 0; /* #ff6a00 vivid orange */
120
+ --ec-accent-subtle: 122 46 16 / 0.3; /* burnt orange/30 */
121
+ --ec-accent-text: 255 119 51; /* #ff7733 deep vivid orange */
122
+ --ec-accent-gradient-from: 255 138 61; /* #ff8a3d */
123
+ --ec-accent-gradient-to: 255 106 0; /* #ff6a00 */
120
124
 
121
125
  /* Buttons */
122
126
  --ec-button-bg: 249 115 22; /* #f97316 orange-500 */
@@ -142,6 +146,10 @@
142
146
  --ec-sidebar-active-text: 255 255 255; /* #ffffff */
143
147
  --ec-sidebar-hover-bg: 38 38 38; /* #262626 */
144
148
 
149
+ /* Rail / inset-panel surface (5% lifted from the sidebar bg) */
150
+ --ec-rail-bg: 15 15 15; /* ~2% lighter than #0a0a0a */
151
+ --ec-rail-active-bg: 41 41 41; /* ~10% lifted off rail bg */
152
+
145
153
  /* Nested sidebar content */
146
154
  --ec-content-bg: 10 10 10; /* #0a0a0a */
147
155
  --ec-content-text: 245 245 245; /* #f5f5f5 */
@@ -159,7 +167,7 @@
159
167
 
160
168
  /* Group headers */
161
169
  --ec-group-icon-bg: 38 38 38; /* #262626 */
162
- --ec-group-icon-text: 253 186 116; /* #fdba74 orange-300 */
170
+ --ec-group-icon-text: 255 119 51; /* #ff7733 deep vivid orange */
163
171
 
164
172
  /* Main content/docs area */
165
173
  --ec-page-bg: 10 10 10; /* #0a0a0a */
@@ -1 +1,14 @@
1
+ declare module 'react-syntax-highlighter' {
2
+ import type { ComponentType } from 'react';
3
+
4
+ export interface SyntaxHighlighterProps {
5
+ [key: string]: any;
6
+ }
7
+
8
+ export const Prism: ComponentType<SyntaxHighlighterProps>;
9
+ const SyntaxHighlighter: ComponentType<SyntaxHighlighterProps>;
10
+
11
+ export default SyntaxHighlighter;
12
+ }
13
+
1
14
  declare module 'react-syntax-highlighter/dist/esm/styles/prism/material-light';
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+
3
+ export const KNOWN_THEMES = ['default', 'ocean', 'sapphire', 'sunset', 'forest'] as const;
4
+ export type KnownTheme = (typeof KNOWN_THEMES)[number];
5
+
6
+ const optionalString = (max: number) =>
7
+ z
8
+ .string()
9
+ .max(max)
10
+ .optional()
11
+ .transform((v) => (v === undefined || v.trim() === '' ? undefined : v));
12
+
13
+ const optionalUrl = z
14
+ .string()
15
+ .max(2048)
16
+ .optional()
17
+ .transform((v) => (v === undefined || v.trim() === '' ? undefined : v))
18
+ .refine((v) => v === undefined || /^https?:\/\//i.test(v), {
19
+ message: 'Must be a valid URL starting with http:// or https://',
20
+ });
21
+
22
+ export const generalSettingsSchema = z.object({
23
+ title: z.string().min(1, 'Title is required').max(100),
24
+ tagline: optionalString(500),
25
+ organizationName: optionalString(100),
26
+ homepageLink: optionalUrl,
27
+ editUrl: optionalUrl,
28
+ repositoryUrl: optionalUrl,
29
+ logo: z
30
+ .object({
31
+ alt: optionalString(200),
32
+ text: optionalString(50),
33
+ })
34
+ .partial()
35
+ .optional(),
36
+ // Allow unknown current theme value (e.g., user hand-edited) so we don't clobber it.
37
+ theme: z.string().min(1).max(100),
38
+ });
39
+
40
+ export type GeneralSettings = z.infer<typeof generalSettingsSchema>;
41
+
42
+ export const aiSettingsSchema = z.object({
43
+ llmsTxtEnabled: z.boolean(),
44
+ chatEnabled: z.boolean(),
45
+ });
46
+
47
+ export type AiSettings = z.infer<typeof aiSettingsSchema>;
48
+
49
+ export const isKnownTheme = (value: string): value is KnownTheme => (KNOWN_THEMES as readonly string[]).includes(value);