@eventcatalog/core 3.0.0 → 3.2.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 (109) 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-VO5WYA44.js → chunk-AA47DJ43.js} +1 -1
  6. package/dist/{chunk-EKGR533N.js → chunk-GGRXP5WM.js} +1 -1
  7. package/dist/{chunk-E5Q7TZYT.js → chunk-L3QRQT7U.js} +1 -1
  8. package/dist/{chunk-BYP43AAT.js → chunk-RWYEP5SD.js} +1 -1
  9. package/dist/{chunk-KF5PARQK.js → chunk-VPQCMMRM.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.config.d.cts +7 -0
  14. package/dist/eventcatalog.config.d.ts +7 -0
  15. package/dist/eventcatalog.js +5 -5
  16. package/dist/generate.cjs +1 -1
  17. package/dist/generate.js +3 -3
  18. package/dist/utils/cli-logger.cjs +1 -1
  19. package/dist/utils/cli-logger.js +2 -2
  20. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +520 -247
  21. package/eventcatalog/src/components/ChatPanel/ChatPanelButton.tsx +3 -3
  22. package/eventcatalog/src/components/Checkbox.astro +7 -4
  23. package/eventcatalog/src/components/CopyAsMarkdown.tsx +15 -15
  24. package/eventcatalog/src/components/EnvironmentDropdown.tsx +15 -7
  25. package/eventcatalog/src/components/FavoriteButton.tsx +1 -1
  26. package/eventcatalog/src/components/Grids/DomainGrid.tsx +72 -60
  27. package/eventcatalog/src/components/Grids/MessageGrid.tsx +68 -48
  28. package/eventcatalog/src/components/Header.astro +15 -10
  29. package/eventcatalog/src/components/Lists/OwnersList.tsx +17 -10
  30. package/eventcatalog/src/components/Lists/PillListFlat.styles.css +12 -0
  31. package/eventcatalog/src/components/Lists/PillListFlat.tsx +15 -15
  32. package/eventcatalog/src/components/Lists/VersionList.astro +15 -5
  33. package/eventcatalog/src/components/MDX/Accordion/Accordion.tsx +3 -3
  34. package/eventcatalog/src/components/MDX/Admonition.tsx +49 -9
  35. package/eventcatalog/src/components/MDX/Attachments.astro +15 -11
  36. package/eventcatalog/src/components/MDX/ChannelInformation/ChannelInformation.tsx +29 -15
  37. package/eventcatalog/src/components/MDX/EntityPropertiesTable/EntityPropertiesTable.astro +20 -13
  38. package/eventcatalog/src/components/MDX/Link/Link.astro +1 -1
  39. package/eventcatalog/src/components/MDX/MessageTable/MessageTable.client.tsx +50 -29
  40. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.tsx +14 -12
  41. package/eventcatalog/src/components/MDX/NodeGraph/StepWalkthrough.tsx +4 -4
  42. package/eventcatalog/src/components/MDX/NodeGraph/StudioModal.tsx +4 -4
  43. package/eventcatalog/src/components/MDX/NodeGraph/VisualiserSearch.tsx +2 -2
  44. package/eventcatalog/src/components/MDX/ResourceGroupTable/ResourceGroupTable.client.tsx +54 -33
  45. package/eventcatalog/src/components/MDX/ResourceLink/ResourceLink.astro +1 -1
  46. package/eventcatalog/src/components/MDX/Steps/Step.astro +2 -2
  47. package/eventcatalog/src/components/MDX/Steps/Steps.astro +3 -3
  48. package/eventcatalog/src/components/MDX/Tabs/Tabs.astro +13 -9
  49. package/eventcatalog/src/components/MDX/Tiles/Tile.astro +25 -13
  50. package/eventcatalog/src/components/MDX/Tiles/Tiles.astro +1 -1
  51. package/eventcatalog/src/components/SchemaExplorer/ApiAccessSection.tsx +3 -3
  52. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +3 -3
  53. package/eventcatalog/src/components/SchemaExplorer/AvroSchemaViewer.tsx +29 -25
  54. package/eventcatalog/src/components/SchemaExplorer/DiffViewer.tsx +3 -3
  55. package/eventcatalog/src/components/SchemaExplorer/JSONSchemaViewer.tsx +61 -42
  56. package/eventcatalog/src/components/SchemaExplorer/OwnersSection.tsx +13 -9
  57. package/eventcatalog/src/components/SchemaExplorer/Pagination.tsx +6 -4
  58. package/eventcatalog/src/components/SchemaExplorer/ProducersConsumersSection.tsx +17 -13
  59. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +35 -8
  60. package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsHeader.tsx +33 -21
  61. package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +1 -1
  62. package/eventcatalog/src/components/SchemaExplorer/SchemaExplorer.tsx +41 -33
  63. package/eventcatalog/src/components/SchemaExplorer/SchemaListItem.tsx +19 -7
  64. package/eventcatalog/src/components/SchemaExplorer/SchemaViewerModal.tsx +8 -8
  65. package/eventcatalog/src/components/Search/Search.astro +3 -3
  66. package/eventcatalog/src/components/Search/SearchModal.tsx +65 -36
  67. package/eventcatalog/src/components/SideNav/NestedSideBar/SearchBar.tsx +31 -21
  68. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +92 -59
  69. package/eventcatalog/src/components/Tables/Table.tsx +25 -24
  70. package/eventcatalog/src/components/Tables/columns/ContainersTableColumns.tsx +22 -16
  71. package/eventcatalog/src/components/Tables/columns/DomainTableColumns.tsx +14 -11
  72. package/eventcatalog/src/components/Tables/columns/FlowTableColumns.tsx +6 -6
  73. package/eventcatalog/src/components/Tables/columns/MessageTableColumns.tsx +22 -16
  74. package/eventcatalog/src/components/Tables/columns/ServiceTableColumns.tsx +22 -16
  75. package/eventcatalog/src/components/Tables/columns/SharedColumns.tsx +4 -4
  76. package/eventcatalog/src/components/Tables/columns/TeamsTableColumns.tsx +21 -13
  77. package/eventcatalog/src/components/Tables/columns/UserTableColumns.tsx +30 -19
  78. package/eventcatalog/src/components/ThemeToggle.tsx +18 -0
  79. package/eventcatalog/src/enterprise/ai/chat-api.ts +24 -3
  80. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/components/NestedItem.tsx +15 -7
  81. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/components/NoResultsFound.tsx +2 -2
  82. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/index.tsx +19 -15
  83. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/index.astro +50 -17
  84. package/eventcatalog/src/layouts/DirectoryLayout.astro +11 -6
  85. package/eventcatalog/src/layouts/DiscoverLayout.astro +13 -8
  86. package/eventcatalog/src/layouts/Footer.astro +6 -6
  87. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +62 -14
  88. package/eventcatalog/src/pages/_index.astro +135 -179
  89. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +2 -2
  90. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +4 -4
  91. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +77 -63
  92. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +23 -24
  93. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +66 -50
  94. package/eventcatalog/src/pages/docs/custom/index.astro +2 -2
  95. package/eventcatalog/src/pages/docs/teams/[id]/index.astro +25 -21
  96. package/eventcatalog/src/pages/docs/users/[id]/index.astro +25 -21
  97. package/eventcatalog/src/pages/schemas/explorer/index.astro +1 -1
  98. package/eventcatalog/src/pages/studio.astro +59 -31
  99. package/eventcatalog/src/remark-plugins/directives.ts +6 -6
  100. package/eventcatalog/src/remark-plugins/mermaid.ts +2 -2
  101. package/eventcatalog/src/stores/theme-store.ts +93 -0
  102. package/eventcatalog/src/styles/theme.css +255 -0
  103. package/eventcatalog/src/styles/themes/forest.css +230 -0
  104. package/eventcatalog/src/styles/themes/ocean.css +235 -0
  105. package/eventcatalog/src/styles/themes/sapphire.css +230 -0
  106. package/eventcatalog/src/styles/themes/sunset.css +230 -0
  107. package/eventcatalog/src/utils/feature.ts +4 -0
  108. package/eventcatalog/tailwind.config.mjs +6 -3
  109. package/package.json +7 -6
@@ -48,23 +48,27 @@ const hasResources = resourcesToShow.length > 0;
48
48
  </head>
49
49
  <body>
50
50
  <VerticalSideBarLayout title="EventCatalog Studio" showNestedSideBar={false}>
51
- <div class="min-h-[calc(100vh-60px)] bg-white">
51
+ <div class="min-h-[calc(100vh-60px)] bg-[rgb(var(--ec-page-bg))]">
52
52
  <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
53
53
  {/* Hero Section */}
54
54
  <div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-16">
55
55
  <div>
56
- <div class="inline-flex items-center px-3 py-1.5 rounded-full bg-gray-100 text-gray-700 font-medium text-xs mb-6">
56
+ <div
57
+ class="inline-flex items-center px-3 py-1.5 rounded-full bg-[rgb(var(--ec-content-hover))] text-[rgb(var(--ec-page-text))] font-medium text-xs mb-6"
58
+ >
57
59
  Visual Design Tool
58
60
  </div>
59
- <h1 class="text-4xl font-bold text-gray-900 tracking-tight mb-4">Turn your resources into designs</h1>
60
- <p class="text-lg text-gray-600 mb-8">
61
+ <h1 class="text-4xl font-bold text-[rgb(var(--ec-page-text))] tracking-tight mb-4">
62
+ Turn your resources into designs
63
+ </h1>
64
+ <p class="text-lg text-[rgb(var(--ec-page-text-muted))] mb-8">
61
65
  Transform your documented messages, services, and domains into architecture diagrams. Drag, drop, and design with
62
66
  what you already have.
63
67
  </p>
64
68
  <div class="flex flex-col sm:flex-row gap-3 mb-4">
65
69
  <button
66
70
  id="design-button"
67
- class="inline-flex items-center justify-center px-6 py-3 border border-transparent text-base font-medium rounded-lg text-white bg-gray-900 hover:bg-gray-800 transition-colors duration-150"
71
+ class="inline-flex items-center justify-center px-6 py-3 border border-transparent text-base font-medium rounded-lg text-[rgb(var(--ec-button-text))] bg-[rgb(var(--ec-button-bg))] hover:bg-[rgb(var(--ec-button-bg-hover))] transition-colors duration-150"
68
72
  >
69
73
  <SquareDashedMousePointerIcon className="w-4 h-4 mr-2" />
70
74
  Open Studio
@@ -73,7 +77,7 @@ const hasResources = resourcesToShow.length > 0;
73
77
  href="https://www.eventcatalog.dev/docs/development/components/designs"
74
78
  target="_blank"
75
79
  rel="noopener noreferrer"
76
- class="inline-flex items-center justify-center px-6 py-3 border border-gray-300 text-base font-medium rounded-lg text-gray-700 bg-white hover:bg-gray-50 transition-colors duration-150"
80
+ class="inline-flex items-center justify-center px-6 py-3 border border-[rgb(var(--ec-page-border))] text-base font-medium rounded-lg text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] hover:bg-[rgb(var(--ec-content-hover))] transition-colors duration-150"
77
81
  >
78
82
  Learn more
79
83
  <ExternalLink className="w-4 h-4 ml-2" />
@@ -82,8 +86,9 @@ const hasResources = resourcesToShow.length > 0;
82
86
 
83
87
  {
84
88
  totalResources > 0 && (
85
- <p class="text-sm text-gray-500">
86
- <span class="font-medium text-gray-700">{totalResources}</span> resources available to design with
89
+ <p class="text-sm text-[rgb(var(--ec-page-text-muted))]">
90
+ <span class="font-medium text-[rgb(var(--ec-page-text))]">{totalResources}</span> resources available to
91
+ design with
87
92
  </p>
88
93
  )
89
94
  }
@@ -100,7 +105,7 @@ const hasResources = resourcesToShow.length > 0;
100
105
  if (resource.type === 'event') {
101
106
  return (
102
107
  <div
103
- class="animate-float-in flex items-center gap-2 text-sm text-gray-700 px-4 py-2.5 bg-orange-50 rounded-lg border border-orange-200 shadow-sm"
108
+ class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-page-text))] px-4 py-2.5 bg-orange-50 dark:bg-orange-500/10 rounded-lg border border-orange-200 dark:border-orange-500/30 shadow-sm"
104
109
  style={`animation-delay: ${resource.index * 0.3}s;`}
105
110
  >
106
111
  <BoltIcon className="w-4 h-4 text-orange-500" />
@@ -110,7 +115,7 @@ const hasResources = resourcesToShow.length > 0;
110
115
  } else if (resource.type === 'service') {
111
116
  return (
112
117
  <div
113
- class="animate-float-in flex items-center gap-2 text-sm text-gray-700 px-4 py-2.5 bg-pink-50 rounded-lg border border-pink-200 shadow-sm"
118
+ class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-page-text))] px-4 py-2.5 bg-pink-50 dark:bg-pink-500/10 rounded-lg border border-pink-200 dark:border-pink-500/30 shadow-sm"
114
119
  style={`animation-delay: ${resource.index * 0.3}s;`}
115
120
  >
116
121
  <ServerIcon className="w-4 h-4 text-pink-500" />
@@ -120,7 +125,7 @@ const hasResources = resourcesToShow.length > 0;
120
125
  } else if (resource.type === 'channel') {
121
126
  return (
122
127
  <div
123
- class="animate-float-in flex items-center gap-2 text-sm text-gray-700 px-4 py-2.5 bg-indigo-50 rounded-lg border border-indigo-200 shadow-sm"
128
+ class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-page-text))] px-4 py-2.5 bg-indigo-50 dark:bg-indigo-500/10 rounded-lg border border-indigo-200 dark:border-indigo-500/30 shadow-sm"
124
129
  style={`animation-delay: ${resource.index * 0.3}s;`}
125
130
  >
126
131
  <ArrowLeftRightIcon className="w-4 h-4 text-indigo-500" />
@@ -133,21 +138,21 @@ const hasResources = resourcesToShow.length > 0;
133
138
  ) : (
134
139
  <div class="absolute left-0 top-1/2 -translate-y-1/2 space-y-2.5">
135
140
  <div
136
- class="animate-float-in flex items-center gap-2 text-sm text-gray-400 px-4 py-2.5 bg-gray-50 rounded-lg border border-gray-200 border-dashed"
141
+ class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-icon-color))] px-4 py-2.5 bg-[rgb(var(--ec-content-hover))] rounded-lg border border-[rgb(var(--ec-page-border))] border-dashed"
137
142
  style="animation-delay: 0s;"
138
143
  >
139
144
  <BoltIcon className="w-4 h-4" />
140
145
  <span>Your events</span>
141
146
  </div>
142
147
  <div
143
- class="animate-float-in flex items-center gap-2 text-sm text-gray-400 px-4 py-2.5 bg-gray-50 rounded-lg border border-gray-200 border-dashed"
148
+ class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-icon-color))] px-4 py-2.5 bg-[rgb(var(--ec-content-hover))] rounded-lg border border-[rgb(var(--ec-page-border))] border-dashed"
144
149
  style="animation-delay: 0.3s;"
145
150
  >
146
151
  <ServerIcon className="w-4 h-4" />
147
152
  <span>Your services</span>
148
153
  </div>
149
154
  <div
150
- class="animate-float-in flex items-center gap-2 text-sm text-gray-400 px-4 py-2.5 bg-gray-50 rounded-lg border border-gray-200 border-dashed"
155
+ class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-icon-color))] px-4 py-2.5 bg-[rgb(var(--ec-content-hover))] rounded-lg border border-[rgb(var(--ec-page-border))] border-dashed"
151
156
  style="animation-delay: 0.6s;"
152
157
  >
153
158
  <ArrowLeftRightIcon className="w-4 h-4" />
@@ -159,7 +164,12 @@ const hasResources = resourcesToShow.length > 0;
159
164
 
160
165
  {/* Arrow indicator */}
161
166
  <div class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2">
162
- <svg class="w-10 h-10 text-gray-300 animate-pulse" viewBox="0 0 24 24" fill="none" stroke="currentColor">
167
+ <svg
168
+ class="w-10 h-10 text-[rgb(var(--ec-icon-color))] animate-pulse"
169
+ viewBox="0 0 24 24"
170
+ fill="none"
171
+ stroke="currentColor"
172
+ >
163
173
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"></path>
164
174
  </svg>
165
175
  </div>
@@ -169,7 +179,7 @@ const hasResources = resourcesToShow.length > 0;
169
179
  <img
170
180
  src="/studio-bg.png"
171
181
  alt="Studio Design Preview"
172
- class="rounded-xl shadow-lg border border-gray-200 w-56 h-auto"
182
+ class="rounded-xl shadow-lg border border-[rgb(var(--ec-page-border))] w-56 h-auto"
173
183
  />
174
184
  </div>
175
185
  </div>
@@ -179,54 +189,72 @@ const hasResources = resourcesToShow.length > 0;
179
189
  {/* Features Section */}
180
190
  <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
181
191
  <div
182
- class="group bg-white rounded-xl p-6 border border-gray-200 hover:border-gray-300 hover:shadow-md transition-all duration-200"
192
+ class="group bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] rounded-xl p-6 border border-[rgb(var(--ec-page-border))] hover:border-[rgb(var(--ec-accent))] hover:shadow-md transition-all duration-200"
183
193
  >
184
194
  <div
185
- class="w-10 h-10 bg-gray-100 rounded-lg flex items-center justify-center mb-4 group-hover:bg-gray-200 transition-colors"
195
+ class="w-10 h-10 bg-[rgb(var(--ec-content-hover))] rounded-lg flex items-center justify-center mb-4 group-hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors"
186
196
  >
187
- <svg class="w-5 h-5 text-gray-700" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
197
+ <svg
198
+ class="w-5 h-5 text-[rgb(var(--ec-page-text))]"
199
+ viewBox="0 0 24 24"
200
+ fill="none"
201
+ stroke="currentColor"
202
+ stroke-width="2"
203
+ >
188
204
  <rect width="8" height="8" x="3" y="3" rx="2"></rect>
189
205
  <path d="M7 11v4a2 2 0 0 0 2 2h4"></path>
190
206
  <rect width="8" height="8" x="13" y="13" rx="2"></rect>
191
207
  </svg>
192
208
  </div>
193
- <h3 class="text-base font-semibold text-gray-900 mb-2">Real Resources</h3>
194
- <p class="text-sm text-gray-600 leading-relaxed">
209
+ <h3 class="text-base font-semibold text-[rgb(var(--ec-page-text))] mb-2">Real Resources</h3>
210
+ <p class="text-sm text-[rgb(var(--ec-page-text-muted))] leading-relaxed">
195
211
  Drag and drop messages, services, and domains from your catalog. No more copying names or keeping things in sync.
196
212
  </p>
197
213
  </div>
198
214
 
199
215
  <div
200
- class="group bg-white rounded-xl p-6 border border-gray-200 hover:border-gray-300 hover:shadow-md transition-all duration-200"
216
+ class="group bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] rounded-xl p-6 border border-[rgb(var(--ec-page-border))] hover:border-[rgb(var(--ec-accent))] hover:shadow-md transition-all duration-200"
201
217
  >
202
218
  <div
203
- class="w-10 h-10 bg-gray-100 rounded-lg flex items-center justify-center mb-4 group-hover:bg-gray-200 transition-colors"
219
+ class="w-10 h-10 bg-[rgb(var(--ec-content-hover))] rounded-lg flex items-center justify-center mb-4 group-hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors"
204
220
  >
205
- <svg class="w-5 h-5 text-gray-700" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
221
+ <svg
222
+ class="w-5 h-5 text-[rgb(var(--ec-page-text))]"
223
+ viewBox="0 0 24 24"
224
+ fill="none"
225
+ stroke="currentColor"
226
+ stroke-width="2"
227
+ >
206
228
  <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
207
229
  <polyline points="17 21 17 13 7 13 7 21"></polyline>
208
230
  <polyline points="7 3 7 8 15 8"></polyline>
209
231
  </svg>
210
232
  </div>
211
- <h3 class="text-base font-semibold text-gray-900 mb-2">Save & Version</h3>
212
- <p class="text-sm text-gray-600 leading-relaxed">
233
+ <h3 class="text-base font-semibold text-[rgb(var(--ec-page-text))] mb-2">Save & Version</h3>
234
+ <p class="text-sm text-[rgb(var(--ec-page-text-muted))] leading-relaxed">
213
235
  Save designs locally and store in Git. All designs and data is owned by you.
214
236
  </p>
215
237
  </div>
216
238
 
217
239
  <div
218
- class="group bg-white rounded-xl p-6 border border-gray-200 hover:border-gray-300 hover:shadow-md transition-all duration-200"
240
+ class="group bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] rounded-xl p-6 border border-[rgb(var(--ec-page-border))] hover:border-[rgb(var(--ec-accent))] hover:shadow-md transition-all duration-200"
219
241
  >
220
242
  <div
221
- class="w-10 h-10 bg-gray-100 rounded-lg flex items-center justify-center mb-4 group-hover:bg-gray-200 transition-colors"
243
+ class="w-10 h-10 bg-[rgb(var(--ec-content-hover))] rounded-lg flex items-center justify-center mb-4 group-hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors"
222
244
  >
223
- <svg class="w-5 h-5 text-gray-700" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
245
+ <svg
246
+ class="w-5 h-5 text-[rgb(var(--ec-page-text))]"
247
+ viewBox="0 0 24 24"
248
+ fill="none"
249
+ stroke="currentColor"
250
+ stroke-width="2"
251
+ >
224
252
  <polyline points="16 18 22 12 16 6"></polyline>
225
253
  <polyline points="8 6 2 12 8 18"></polyline>
226
254
  </svg>
227
255
  </div>
228
- <h3 class="text-base font-semibold text-gray-900 mb-2">Embed Anywhere</h3>
229
- <p class="text-sm text-gray-600 leading-relaxed">
256
+ <h3 class="text-base font-semibold text-[rgb(var(--ec-page-text))] mb-2">Embed Anywhere</h3>
257
+ <p class="text-sm text-[rgb(var(--ec-page-text-muted))] leading-relaxed">
230
258
  Drop diagrams directly into documentation pages. One source of truth for your architecture.
231
259
  </p>
232
260
  </div>
@@ -6,11 +6,11 @@ export function remarkDirectives() {
6
6
  visit(tree, (node) => {
7
7
  if (node.type === 'containerDirective') {
8
8
  const blockTypes = {
9
- info: 'bg-blue-50 border-l-4 border-blue-500',
10
- warning: 'bg-yellow-50 border-l-4 border-yellow-500',
11
- danger: 'bg-red-50 border-l-4 border-red-500',
12
- tip: 'bg-green-50 border-l-4 border-green-500',
13
- note: 'bg-gray-50 border-l-4 border-gray-500',
9
+ info: 'bg-blue-50 dark:bg-blue-950/50 border-l-4 border-blue-500 text-blue-700 dark:text-blue-200',
10
+ warning: 'bg-yellow-50 dark:bg-yellow-950/50 border-l-4 border-yellow-500 text-yellow-700 dark:text-yellow-200',
11
+ danger: 'bg-red-50 dark:bg-red-950/50 border-l-4 border-red-500 text-red-700 dark:text-red-200',
12
+ tip: 'bg-green-50 dark:bg-green-950/50 border-l-4 border-green-500 text-green-700 dark:text-green-200',
13
+ note: 'bg-gray-50 dark:bg-gray-950/50 border-l-4 border-gray-500 text-gray-700 dark:text-gray-200',
14
14
  };
15
15
 
16
16
  // Lucide icon paths
@@ -116,7 +116,7 @@ export function remarkDirectives() {
116
116
  data: {
117
117
  hName: 'div',
118
118
  hProperties: {
119
- class: 'prose prose-md w-full !max-w-none ',
119
+ class: 'prose prose-md dark:prose-invert w-full !max-w-none prose-p:my-1 prose-p:text-inherit',
120
120
  },
121
121
  },
122
122
  children: contentChildren,
@@ -19,8 +19,8 @@ export const mermaid: RemarkPlugin<[]> = () => (tree) => {
19
19
  node.type = 'html';
20
20
  node.value = `
21
21
  <div class="mermaid-block pb-4">
22
- <div class="mermaid border border-gray-200 rounded-lg p-1" data-content="${escapeHtml(node.value)}">
23
- <p>Loading graph...</p>
22
+ <div class="mermaid border border-[rgb(var(--ec-page-border))] rounded-lg p-1" data-content="${escapeHtml(node.value)}">
23
+ <p class="text-[rgb(var(--ec-page-text-muted))]">Loading graph...</p>
24
24
  </div>
25
25
  </div>
26
26
  `;
@@ -0,0 +1,93 @@
1
+ import { atom } from 'nanostores';
2
+
3
+ const THEME_KEY = 'eventcatalog-theme';
4
+
5
+ export type Theme = 'light' | 'dark';
6
+
7
+ export const themeStore = atom<Theme>('light');
8
+
9
+ // Get system preference
10
+ const getSystemTheme = (): Theme => {
11
+ if (typeof window !== 'undefined' && window.matchMedia) {
12
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
13
+ }
14
+ return 'light';
15
+ };
16
+
17
+ // Apply theme to document via data-theme attribute
18
+ const applyTheme = (theme: Theme) => {
19
+ if (typeof document !== 'undefined') {
20
+ document.documentElement.setAttribute('data-theme', theme);
21
+ }
22
+ };
23
+
24
+ // Initialize store from localStorage or system preference
25
+ const initStore = () => {
26
+ if (typeof window !== 'undefined') {
27
+ try {
28
+ const stored = localStorage.getItem(THEME_KEY) as Theme | null;
29
+ if (stored && (stored === 'light' || stored === 'dark')) {
30
+ // User has explicitly chosen a theme, use that
31
+ themeStore.set(stored);
32
+ applyTheme(stored);
33
+ } else {
34
+ // No stored preference, use system preference
35
+ const systemTheme = getSystemTheme();
36
+ themeStore.set(systemTheme);
37
+ applyTheme(systemTheme);
38
+ }
39
+ } catch (e) {
40
+ console.warn('Failed to load theme:', e);
41
+ const systemTheme = getSystemTheme();
42
+ applyTheme(systemTheme);
43
+ }
44
+ }
45
+ };
46
+
47
+ if (typeof window !== 'undefined') {
48
+ initStore();
49
+
50
+ // Listen for system preference changes
51
+ if (window.matchMedia) {
52
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
53
+ // Only follow system preference if user hasn't explicitly set a theme
54
+ const stored = localStorage.getItem(THEME_KEY);
55
+ if (!stored) {
56
+ const newTheme = e.matches ? 'dark' : 'light';
57
+ themeStore.set(newTheme);
58
+ applyTheme(newTheme);
59
+ }
60
+ });
61
+ }
62
+
63
+ // Listen for storage events (cross-tab sync)
64
+ window.addEventListener('storage', (e) => {
65
+ if (e.key === THEME_KEY) {
66
+ initStore();
67
+ }
68
+ });
69
+
70
+ // Listen for custom events (same-tab sync between instances)
71
+ window.addEventListener('theme-updated', () => {
72
+ initStore();
73
+ });
74
+ }
75
+
76
+ export const setTheme = (theme: Theme) => {
77
+ themeStore.set(theme);
78
+ applyTheme(theme);
79
+ if (typeof window !== 'undefined') {
80
+ try {
81
+ localStorage.setItem(THEME_KEY, theme);
82
+ // Dispatch event to notify other store instances/components
83
+ window.dispatchEvent(new CustomEvent('theme-updated'));
84
+ } catch (e) {
85
+ console.warn('Failed to save theme:', e);
86
+ }
87
+ }
88
+ };
89
+
90
+ export const toggleTheme = () => {
91
+ const current = themeStore.get();
92
+ setTheme(current === 'light' ? 'dark' : 'light');
93
+ };
@@ -0,0 +1,255 @@
1
+ /**
2
+ * EventCatalog Theme CSS Variables
3
+ *
4
+ * Override these variables in your eventcatalog.styles.css file to customize the theme.
5
+ * Example:
6
+ * :root[data-theme="light"] {
7
+ * --ec-header-bg: #1e293b;
8
+ * --ec-primary: #3b82f6;
9
+ * }
10
+ *
11
+ * Supported themes: light, dark (more can be added)
12
+ */
13
+
14
+ /* Default/Light theme */
15
+ :root,
16
+ :root[data-theme="light"] {
17
+ /* Header */
18
+ --ec-header-bg: 255 255 255; /* #ffffff */
19
+ --ec-header-text: 15 23 42; /* #0f172a (slate-900) */
20
+ --ec-header-border: 226 232 240; /* #e2e8f0 (slate-200) */
21
+
22
+ /* Primary brand color */
23
+ --ec-primary: 168 85 247; /* #a855f7 */
24
+ --ec-primary-hover: 147 51 234; /* #9333ea */
25
+
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) */
33
+
34
+ /* Buttons */
35
+ --ec-button-bg: 15 23 42; /* #0f172a */
36
+ --ec-button-bg-hover: 30 41 59; /* #1e293b */
37
+ --ec-button-text: 255 255 255; /* #ffffff */
38
+
39
+ /* Dropdowns & menus */
40
+ --ec-dropdown-bg: 255 255 255; /* #ffffff */
41
+ --ec-dropdown-text: 51 65 85; /* #334155 (slate-700) */
42
+ --ec-dropdown-hover: 248 250 252; /* #f8fafc (slate-50) */
43
+ --ec-dropdown-border: 226 232 240; /* #e2e8f0 (slate-200) */
44
+
45
+ /* Icons */
46
+ --ec-icon-color: 100 116 139; /* #64748b (slate-500) */
47
+ --ec-icon-hover: 51 65 85; /* #334155 (slate-700) */
48
+
49
+ /* Sidebar / Vertical Nav (icon bar) */
50
+ --ec-sidebar-bg: 255 255 255; /* #ffffff */
51
+ --ec-sidebar-bg-gradient: 248 250 252; /* #f8fafc (slate-50) */
52
+ --ec-sidebar-border: 226 232 240; /* #e2e8f0 (slate-200) */
53
+ --ec-sidebar-text: 71 85 105; /* #475569 (slate-600) */
54
+ --ec-sidebar-active-bg: 15 23 42; /* #0f172a */
55
+ --ec-sidebar-active-text: 255 255 255; /* #ffffff */
56
+ --ec-sidebar-hover-bg: 15 23 42; /* #0f172a - black on hover like active */
57
+
58
+ /* Nested sidebar content */
59
+ --ec-content-bg: 255 255 255; /* #ffffff */
60
+ --ec-content-text: 15 23 42; /* #0f172a (slate-900) */
61
+ --ec-content-text-muted: 100 116 139; /* #64748b (slate-500) */
62
+ --ec-content-text-secondary: 71 85 105; /* #475569 (slate-600) */
63
+ --ec-content-border: 226 232 240; /* #e2e8f0 (slate-200) */
64
+ --ec-content-hover: 248 250 252; /* #f8fafc (slate-50) */
65
+ --ec-content-active: 245 243 255; /* #f5f3ff (violet-50) */
66
+
67
+ /* Input fields */
68
+ --ec-input-bg: 248 250 252; /* #f8fafc (slate-50) */
69
+ --ec-input-border: 226 232 240; /* #e2e8f0 (slate-200) */
70
+ --ec-input-text: 15 23 42; /* #0f172a */
71
+ --ec-input-placeholder: 148 163 184; /* #94a3b8 (slate-400) */
72
+
73
+ /* Group headers */
74
+ --ec-group-icon-bg: 241 245 249; /* #f1f5f9 (slate-100) */
75
+ --ec-group-icon-text: 71 85 105; /* #475569 (slate-600) */
76
+
77
+ /* Main content/docs area */
78
+ --ec-page-bg: 255 255 255; /* #ffffff */
79
+ --ec-page-text: 15 23 42; /* #0f172a */
80
+ --ec-page-text-muted: 100 116 139; /* #64748b */
81
+ --ec-page-border: 226 232 240; /* #e2e8f0 */
82
+
83
+ /* Card/elevated surfaces */
84
+ --ec-card-bg: 255 255 255; /* #ffffff */
85
+
86
+ /* Code blocks */
87
+ --ec-code-bg: 250 250 250; /* #fafafa - light for light mode */
88
+
89
+ /* Badge colors - light mode */
90
+ --ec-badge-domain-bg: 254 249 195; /* yellow-100 */
91
+ --ec-badge-domain-text: 161 98 7; /* yellow-700 */
92
+ --ec-badge-service-bg: 252 231 243; /* pink-100 */
93
+ --ec-badge-service-text: 190 24 93; /* pink-700 */
94
+ --ec-badge-event-bg: 254 243 199; /* amber-100 */
95
+ --ec-badge-event-text: 180 83 9; /* amber-700 */
96
+ --ec-badge-command-bg: 252 231 243; /* pink-100 */
97
+ --ec-badge-command-text: 190 24 93; /* pink-700 */
98
+ --ec-badge-query-bg: 243 232 255; /* purple-100 */
99
+ --ec-badge-query-text: 126 34 206; /* purple-700 */
100
+ --ec-badge-message-bg: 224 231 255; /* indigo-100 */
101
+ --ec-badge-message-text: 67 56 202; /* indigo-700 */
102
+ --ec-badge-design-bg: 204 251 241; /* teal-100 */
103
+ --ec-badge-design-text: 15 118 110; /* teal-700 */
104
+ --ec-badge-channel-bg: 224 231 255; /* indigo-100 */
105
+ --ec-badge-channel-text: 67 56 202; /* indigo-700 */
106
+ --ec-badge-default-bg: 243 244 246; /* gray-100 */
107
+ --ec-badge-default-text: 75 85 99; /* gray-600 */
108
+ }
109
+
110
+ /* Dark theme */
111
+ :root[data-theme="dark"] {
112
+ /*
113
+ * Modern dark theme inspired by Mintlify
114
+ * Uses deep blacks with subtle cool undertones for a refined look
115
+ */
116
+
117
+ /* Header - deep black with cool border */
118
+ --ec-header-bg: 13 17 23; /* #0d1117 - GitHub dark bg */
119
+ --ec-header-text: 240 246 252; /* #f0f6fc - soft white */
120
+ --ec-header-border: 33 38 45; /* #21262d - subtle border */
121
+
122
+ /* Accent colors - used for selections, highlights, interactive elements */
123
+ --ec-accent: 192 132 252; /* #c084fc (purple-400) */
124
+ --ec-accent-hover: 168 85 247; /* #a855f7 (purple-500) */
125
+ --ec-accent-subtle: 88 28 135 / 0.3; /* purple-900/30 */
126
+ --ec-accent-text: 216 180 254; /* #d8b4fe (purple-300) */
127
+ --ec-accent-gradient-from: 192 132 252; /* #c084fc (purple-400) */
128
+ --ec-accent-gradient-to: 168 85 247; /* #a855f7 (purple-500) */
129
+
130
+ /* Buttons - accent color for better visibility */
131
+ --ec-button-bg: 147 51 234; /* #9333ea - purple-600 */
132
+ --ec-button-bg-hover: 168 85 247; /* #a855f7 - purple-500 */
133
+ --ec-button-text: 255 255 255; /* #ffffff - white text */
134
+
135
+ /* Dropdowns & menus - elevated surface */
136
+ --ec-dropdown-bg: 22 27 34; /* #161b22 - slightly elevated */
137
+ --ec-dropdown-text: 201 209 217; /* #c9d1d9 */
138
+ --ec-dropdown-hover: 33 38 45; /* #21262d */
139
+ --ec-dropdown-border: 48 54 61; /* #30363d */
140
+
141
+ /* Icons - muted gray that pops on hover */
142
+ --ec-icon-color: 139 148 158; /* #8b949e */
143
+ --ec-icon-hover: 240 246 252; /* #f0f6fc */
144
+
145
+ /* Sidebar / Vertical Nav (icon bar) - darkest surface */
146
+ --ec-sidebar-bg: 13 17 23; /* #0d1117 */
147
+ --ec-sidebar-bg-gradient: 22 27 34; /* #161b22 */
148
+ --ec-sidebar-border: 33 38 45; /* #21262d */
149
+ --ec-sidebar-text: 139 148 158; /* #8b949e */
150
+ --ec-sidebar-active-bg: 48 54 61; /* #30363d - subtle highlight */
151
+ --ec-sidebar-active-text: 240 246 252; /* #f0f6fc */
152
+ --ec-sidebar-hover-bg: 33 38 45; /* #21262d */
153
+
154
+ /* Nested sidebar content */
155
+ --ec-content-bg: 13 17 23; /* #0d1117 */
156
+ --ec-content-text: 201 209 217; /* #c9d1d9 - softer than pure white */
157
+ --ec-content-text-muted: 139 148 158; /* #8b949e */
158
+ --ec-content-text-secondary: 139 148 158; /* #8b949e - muted for sidebar children */
159
+ --ec-content-border: 33 38 45; /* #21262d */
160
+ --ec-content-hover: 22 27 34; /* #161b22 */
161
+ --ec-content-active: 33 38 45; /* #21262d */
162
+
163
+ /* Input fields - subtle inset look */
164
+ --ec-input-bg: 13 17 23; /* #0d1117 */
165
+ --ec-input-border: 48 54 61; /* #30363d */
166
+ --ec-input-text: 240 246 252; /* #f0f6fc */
167
+ --ec-input-placeholder: 110 118 129; /* #6e7681 */
168
+
169
+ /* Group headers */
170
+ --ec-group-icon-bg: 33 38 45; /* #21262d */
171
+ --ec-group-icon-text: 201 209 217; /* #c9d1d9 */
172
+
173
+ /* Main content/docs area - base dark surface */
174
+ --ec-page-bg: 13 17 23; /* #0d1117 */
175
+ --ec-page-text: 240 246 252; /* #f0f6fc */
176
+ --ec-page-text-muted: 139 148 158; /* #8b949e */
177
+ --ec-page-border: 33 38 45; /* #21262d */
178
+
179
+ /* Card/elevated surfaces - for depth */
180
+ --ec-card-bg: 22 27 34; /* #161b22 */
181
+
182
+ /* Code blocks */
183
+ --ec-code-bg: 22 27 34; /* #161b22 - elevated dark surface */
184
+
185
+ /* Badge colors - dark mode (subtle with good contrast) */
186
+ --ec-badge-domain-bg: 113 63 18 / 0.3; /* yellow-900/30 */
187
+ --ec-badge-domain-text: 253 224 71; /* yellow-300 */
188
+ --ec-badge-service-bg: 131 24 67 / 0.3; /* pink-900/30 */
189
+ --ec-badge-service-text: 249 168 212; /* pink-300 */
190
+ --ec-badge-event-bg: 120 53 15 / 0.3; /* amber-900/30 */
191
+ --ec-badge-event-text: 252 211 77; /* amber-300 */
192
+ --ec-badge-command-bg: 131 24 67 / 0.3; /* pink-900/30 */
193
+ --ec-badge-command-text: 249 168 212; /* pink-300 */
194
+ --ec-badge-query-bg: 88 28 135 / 0.3; /* purple-900/30 */
195
+ --ec-badge-query-text: 216 180 254; /* purple-300 */
196
+ --ec-badge-message-bg: 49 46 129 / 0.3; /* indigo-900/30 */
197
+ --ec-badge-message-text: 165 180 252; /* indigo-300 */
198
+ --ec-badge-design-bg: 17 94 89 / 0.3; /* teal-900/30 */
199
+ --ec-badge-design-text: 94 234 212; /* teal-300 */
200
+ --ec-badge-channel-bg: 49 46 129 / 0.3; /* indigo-900/30 */
201
+ --ec-badge-channel-text: 165 180 252; /* indigo-300 */
202
+ --ec-badge-default-bg: 63 63 70 / 0.3; /* zinc-700/30 */
203
+ --ec-badge-default-text: 212 212 216; /* zinc-300 */
204
+ }
205
+
206
+ /* Dark mode prose overrides for documentation content */
207
+ :root[data-theme="dark"] .prose {
208
+ --tw-prose-body: rgb(139 148 158); /* #8b949e - muted body text */
209
+ --tw-prose-headings: rgb(201 209 217); /* #c9d1d9 - soft white headings */
210
+ --tw-prose-lead: rgb(110 118 129); /* #6e7681 */
211
+ --tw-prose-links: rgb(168 85 247); /* purple-500 */
212
+ --tw-prose-bold: rgb(201 209 217); /* #c9d1d9 */
213
+ --tw-prose-counters: rgb(110 118 129); /* #6e7681 */
214
+ --tw-prose-bullets: rgb(72 79 88); /* #484f58 */
215
+ --tw-prose-hr: rgb(33 38 45); /* #21262d */
216
+ --tw-prose-quotes: rgb(201 209 217); /* #c9d1d9 */
217
+ --tw-prose-quote-borders: rgb(48 54 61); /* #30363d */
218
+ --tw-prose-captions: rgb(110 118 129); /* #6e7681 */
219
+ --tw-prose-code: rgb(201 209 217); /* #c9d1d9 */
220
+ --tw-prose-pre-code: rgb(139 148 158); /* #8b949e */
221
+ --tw-prose-pre-bg: rgb(22 27 34); /* #161b22 */
222
+ --tw-prose-th-borders: rgb(48 54 61); /* #30363d */
223
+ --tw-prose-td-borders: rgb(33 38 45); /* #21262d */
224
+ }
225
+
226
+ :root[data-theme="dark"] .prose code {
227
+ background-color: rgb(33 38 45); /* #21262d */
228
+ border-radius: 0.25rem;
229
+ padding: 0.125rem 0.375rem;
230
+ }
231
+
232
+ :root[data-theme="dark"] .prose pre {
233
+ background-color: rgb(22 27 34); /* #161b22 */
234
+ border: 1px solid rgb(33 38 45); /* #21262d */
235
+ }
236
+
237
+ :root[data-theme="dark"] .prose a {
238
+ color: rgb(168 85 247); /* purple-500 */
239
+ }
240
+
241
+ :root[data-theme="dark"] .prose a:hover {
242
+ color: rgb(192 132 252); /* purple-400 */
243
+ }
244
+
245
+ :root[data-theme="dark"] .prose strong {
246
+ color: rgb(240 246 252); /* #f0f6fc */
247
+ }
248
+
249
+ :root[data-theme="dark"] .prose table th {
250
+ color: rgb(240 246 252); /* #f0f6fc */
251
+ }
252
+
253
+ :root[data-theme="dark"] .prose table td {
254
+ border-color: rgb(33 38 45); /* #21262d */
255
+ }