@eventcatalog/core 3.0.0 → 3.1.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 (108) 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-E5Q7TZYT.js → chunk-2WGZFERB.js} +1 -1
  6. package/dist/{chunk-VO5WYA44.js → chunk-ESUL7UE6.js} +1 -1
  7. package/dist/{chunk-KF5PARQK.js → chunk-I3CW5KQI.js} +1 -1
  8. package/dist/{chunk-EKGR533N.js → chunk-KBO4IL2D.js} +1 -1
  9. package/dist/{chunk-BYP43AAT.js → chunk-URR33SNK.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 +85 -69
  21. package/eventcatalog/src/components/ChatPanel/ChatPanelButton.tsx +1 -1
  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/custom-documentation/components/CustomDocsNav/components/NestedItem.tsx +15 -7
  80. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/components/NoResultsFound.tsx +2 -2
  81. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/index.tsx +19 -15
  82. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/index.astro +50 -17
  83. package/eventcatalog/src/layouts/DirectoryLayout.astro +11 -6
  84. package/eventcatalog/src/layouts/DiscoverLayout.astro +13 -8
  85. package/eventcatalog/src/layouts/Footer.astro +6 -6
  86. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +62 -14
  87. package/eventcatalog/src/pages/_index.astro +135 -179
  88. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +2 -2
  89. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +4 -4
  90. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +77 -63
  91. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +23 -24
  92. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +66 -50
  93. package/eventcatalog/src/pages/docs/custom/index.astro +2 -2
  94. package/eventcatalog/src/pages/docs/teams/[id]/index.astro +25 -21
  95. package/eventcatalog/src/pages/docs/users/[id]/index.astro +25 -21
  96. package/eventcatalog/src/pages/schemas/explorer/index.astro +1 -1
  97. package/eventcatalog/src/pages/studio.astro +59 -31
  98. package/eventcatalog/src/remark-plugins/directives.ts +6 -6
  99. package/eventcatalog/src/remark-plugins/mermaid.ts +2 -2
  100. package/eventcatalog/src/stores/theme-store.ts +93 -0
  101. package/eventcatalog/src/styles/theme.css +255 -0
  102. package/eventcatalog/src/styles/themes/forest.css +230 -0
  103. package/eventcatalog/src/styles/themes/ocean.css +235 -0
  104. package/eventcatalog/src/styles/themes/sapphire.css +230 -0
  105. package/eventcatalog/src/styles/themes/sunset.css +230 -0
  106. package/eventcatalog/src/utils/feature.ts +4 -0
  107. package/eventcatalog/tailwind.config.mjs +6 -3
  108. package/package.json +1 -1
@@ -63,7 +63,7 @@ export const EnvironmentDropdown: React.FC<EnvironmentDropdownProps> = ({ enviro
63
63
  <button
64
64
  type="button"
65
65
  onClick={toggleDropdown}
66
- className="flex items-center space-x-1 text-sm font-medium text-gray-700 hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 rounded-md px-3 py-2"
66
+ className="flex items-center space-x-1 text-sm font-medium text-[rgb(var(--ec-header-text))] hover:text-[rgb(var(--ec-icon-hover))] focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] rounded-md px-3 py-2"
67
67
  aria-expanded={isOpen}
68
68
  aria-haspopup="true"
69
69
  >
@@ -86,7 +86,7 @@ export const EnvironmentDropdown: React.FC<EnvironmentDropdownProps> = ({ enviro
86
86
  </svg>
87
87
  </button>
88
88
  <div
89
- className={`${isOpen ? '' : 'hidden'} absolute right-0 mt-2 w-64 bg-white rounded-md shadow-lg py-1 z-50 border border-gray-100 overflow-hidden z-20`}
89
+ className={`${isOpen ? '' : 'hidden'} absolute right-0 mt-2 w-64 bg-[rgb(var(--ec-dropdown-bg))] rounded-md shadow-lg py-1 z-50 border border-[rgb(var(--ec-dropdown-border))] overflow-hidden z-20`}
90
90
  >
91
91
  {environments.map((env) => {
92
92
  const isCurrentEnv = currentEnvironment?.name === env.name;
@@ -103,21 +103,29 @@ export const EnvironmentDropdown: React.FC<EnvironmentDropdownProps> = ({ enviro
103
103
  targetUrl.pathname = currentPath;
104
104
  window.location.href = targetUrl.toString();
105
105
  }}
106
- className={`block px-4 py-3 text-sm transition-colors border-b border-gray-50 last:border-b-0 ${
107
- isCurrentEnv ? 'bg-purple-50 text-purple-700 hover:bg-purple-100' : 'text-gray-700 hover:bg-gray-50'
106
+ className={`block px-4 py-3 text-sm transition-colors border-b border-[rgb(var(--ec-dropdown-border)/0.3)] last:border-b-0 ${
107
+ isCurrentEnv
108
+ ? 'bg-[rgb(var(--ec-accent)/0.1)] text-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent)/0.2)]'
109
+ : 'text-[rgb(var(--ec-dropdown-text))] hover:bg-[rgb(var(--ec-dropdown-hover))]'
108
110
  }`}
109
111
  >
110
112
  <div className="flex items-center justify-between">
111
113
  <div>
112
- <div className={`font-medium ${isCurrentEnv ? 'text-purple-700' : ''}`}>{env.name}</div>
114
+ <div className={`font-medium ${isCurrentEnv ? 'text-[rgb(var(--ec-accent))]' : ''}`}>{env.name}</div>
113
115
  {env.description && (
114
- <div className={`text-xs font-light mt-1 ${isCurrentEnv ? 'text-purple-600' : 'text-gray-500'}`}>
116
+ <div
117
+ className={`text-xs font-light mt-1 ${isCurrentEnv ? 'text-[rgb(var(--ec-accent)/0.8)]' : 'text-[rgb(var(--ec-icon-color))]'}`}
118
+ >
115
119
  {env.description}
116
120
  </div>
117
121
  )}
118
122
  </div>
119
123
  {isCurrentEnv && (
120
- <svg className="w-4 h-4 text-purple-600 flex-shrink-0 ml-2" fill="currentColor" viewBox="0 0 20 20">
124
+ <svg
125
+ className="w-4 h-4 text-[rgb(var(--ec-accent))] flex-shrink-0 ml-2"
126
+ fill="currentColor"
127
+ viewBox="0 0 20 20"
128
+ >
121
129
  <path
122
130
  fillRule="evenodd"
123
131
  d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
@@ -43,7 +43,7 @@ export default function FavoriteButton({ nodeKey, title, badge, href, size = 'md
43
43
  <button
44
44
  onClick={handleToggleFavorite}
45
45
  className={`p-2 rounded-md transition-colors ${
46
- isFavorite ? 'text-amber-400 hover:text-amber-500' : 'text-gray-300 hover:text-amber-400'
46
+ isFavorite ? 'text-amber-400 hover:text-amber-500' : 'text-[rgb(var(--ec-icon-color))] hover:text-amber-400'
47
47
  }`}
48
48
  aria-label={isFavorite ? 'Remove from favorites' : 'Add to favorites'}
49
49
  title={isFavorite ? 'Remove from favorites' : 'Add to favorites'}
@@ -52,9 +52,9 @@ const EntityBadge = memo(({ entity }: { entity: any }) => {
52
52
  return (
53
53
  <a
54
54
  href={buildUrl(`/docs/entities/${id}`)}
55
- className="inline-flex items-center gap-2 px-3 py-2 bg-white border border-gray-200 rounded-lg text-sm font-medium text-gray-700 hover:bg-gray-50 hover:border-gray-300 transition-all shadow-sm"
55
+ className="inline-flex items-center gap-2 px-3 py-2 bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg text-sm font-medium text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-content-hover))] hover:border-[rgb(var(--ec-accent)/0.5)] transition-all shadow-sm"
56
56
  >
57
- <BoxIcon className="h-4 w-4 text-purple-500" />
57
+ <BoxIcon className="h-4 w-4 text-[rgb(var(--ec-accent))]" />
58
58
  <span>{name}</span>
59
59
  </a>
60
60
  );
@@ -78,11 +78,11 @@ const MessageLink = memo(({ message }: { message: any }) => {
78
78
  return (
79
79
  <a
80
80
  href={buildUrl(`/docs/${collection}/${id}/${version}`)}
81
- className="flex items-center gap-2 py-1.5 text-sm text-gray-700 hover:text-gray-900 transition-colors group"
81
+ className="flex items-center gap-2 py-1.5 text-sm text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))] transition-colors group"
82
82
  >
83
83
  <Icon className={`h-4 w-4 flex-shrink-0 ${iconStyles[color]}`} />
84
84
  <span className="group-hover:underline">{name}</span>
85
- <span className="text-xs text-gray-400">v{version}</span>
85
+ <span className="text-xs text-[rgb(var(--ec-icon-color))]">v{version}</span>
86
86
  </a>
87
87
  );
88
88
  });
@@ -92,7 +92,7 @@ const SpecificationBadge = memo(
92
92
  return (
93
93
  <a
94
94
  href={getSpecUrl(spec, serviceId, serviceVersion)}
95
- className="inline-flex items-center gap-1.5 px-2 py-1.5 bg-white border border-gray-200 rounded-lg text-xs font-medium text-gray-700 hover:bg-gray-50 hover:border-gray-300 transition-all shadow-sm"
95
+ className="inline-flex items-center gap-1.5 px-2 py-1.5 bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg text-xs font-medium text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-content-hover))] hover:border-[rgb(var(--ec-accent)/0.5)] transition-all shadow-sm"
96
96
  >
97
97
  <img src={buildUrl(`/icons/${getSpecIcon(spec.type)}.svg`, true)} alt={`${spec.type} icon`} className="h-3.5 w-3.5" />
98
98
  <span>{getSpecLabel(spec.type)}</span>
@@ -110,7 +110,7 @@ const ContainerLink = memo(({ container, type }: { container: any; type: 'reads'
110
110
  return (
111
111
  <a
112
112
  href={buildUrl(`/docs/containers/${id}/${version}`)}
113
- className="flex items-center gap-2 py-1.5 text-sm text-gray-700 hover:text-gray-900 transition-colors group"
113
+ className="flex items-center gap-2 py-1.5 text-sm text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))] transition-colors group"
114
114
  >
115
115
  <CircleStackIcon className={`h-4 w-4 ${type === 'reads' ? 'text-amber-500' : 'text-violet-500'}`} />
116
116
  <span className="group-hover:underline">{name}</span>
@@ -149,8 +149,8 @@ const SearchableBox = memo(
149
149
  <div className="flex items-center gap-2 mb-2">
150
150
  <div className="flex items-center gap-1.5 flex-shrink-0">
151
151
  <Icon className={`h-4 w-4 ${iconColor}`} />
152
- <h4 className="text-xs font-semibold text-gray-700 uppercase tracking-wide">{title}</h4>
153
- <span className="text-[10px] text-gray-400 font-medium">({items.length})</span>
152
+ <h4 className="text-xs font-semibold text-[rgb(var(--ec-page-text))] uppercase tracking-wide">{title}</h4>
153
+ <span className="text-[10px] text-[rgb(var(--ec-icon-color))] font-medium">({items.length})</span>
154
154
  </div>
155
155
  {items.length > 0 && (
156
156
  <input
@@ -158,7 +158,7 @@ const SearchableBox = memo(
158
158
  placeholder="Search..."
159
159
  value={search}
160
160
  onChange={(e) => setSearch(e.target.value)}
161
- className="flex-1 px-2 py-0.5 text-xs border border-gray-200 rounded focus:outline-none focus:border-gray-300"
161
+ className="flex-1 px-2 py-0.5 text-xs border border-[rgb(var(--ec-input-border))] rounded focus:outline-none focus:border-[rgb(var(--ec-accent))] bg-[rgb(var(--ec-input-bg))] text-[rgb(var(--ec-input-text))]"
162
162
  onClick={(e) => e.stopPropagation()}
163
163
  />
164
164
  )}
@@ -168,11 +168,11 @@ const SearchableBox = memo(
168
168
  {filteredItems.length > 0 ? (
169
169
  filteredItems.map((item, idx) => renderItem(item, idx))
170
170
  ) : (
171
- <p className="text-xs text-gray-400 italic">No matches</p>
171
+ <p className="text-xs text-[rgb(var(--ec-icon-color))] italic">No matches</p>
172
172
  )}
173
173
  </div>
174
174
  ) : (
175
- <p className="text-xs text-gray-300">{emptyText}</p>
175
+ <p className="text-xs text-[rgb(var(--ec-icon-color))]">{emptyText}</p>
176
176
  )}
177
177
  </div>
178
178
  );
@@ -186,7 +186,7 @@ const ServiceExpandedContent = memo(
186
186
  const hasContainers = readsFrom.length > 0 || writesTo.length > 0;
187
187
 
188
188
  return (
189
- <div className="border-t border-gray-100 px-4 py-3 space-y-4">
189
+ <div className="border-t border-[rgb(var(--ec-page-border))] px-4 py-3 space-y-4">
190
190
  {/* Messages Row */}
191
191
  {hasMessages && (
192
192
  <div className="grid grid-cols-2 gap-x-6">
@@ -215,7 +215,7 @@ const ServiceExpandedContent = memo(
215
215
 
216
216
  {/* Data Row */}
217
217
  {hasContainers && (
218
- <div className="grid grid-cols-2 gap-x-6 pt-3 border-t border-gray-100">
218
+ <div className="grid grid-cols-2 gap-x-6 pt-3 border-t border-[rgb(var(--ec-page-border))]">
219
219
  <SearchableBox
220
220
  title="Reads"
221
221
  icon={CircleStackIcon}
@@ -260,22 +260,26 @@ const ServiceCard = memo(({ service }: { service: any }) => {
260
260
  const hasContent = hasMessages || hasContainers;
261
261
 
262
262
  return (
263
- <div className="bg-white border border-gray-200 rounded-xl shadow-sm hover:shadow-md transition-shadow">
263
+ <div className="bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-xl shadow-sm hover:shadow-md transition-shadow">
264
264
  {/* Service Header */}
265
265
  <div
266
266
  onClick={() => hasContent && setIsCollapsed(!isCollapsed)}
267
- className={`flex items-center justify-between px-4 py-3 ${hasContent ? 'cursor-pointer hover:bg-gray-50' : ''} transition-colors`}
267
+ className={`flex items-center justify-between px-4 py-3 ${hasContent ? 'cursor-pointer hover:bg-[rgb(var(--ec-content-hover))]' : ''} transition-colors`}
268
268
  >
269
269
  <div className="flex items-center gap-2.5">
270
- <div className="flex items-center justify-center w-8 h-8 bg-pink-100 rounded-lg">
271
- <ServerIcon className="h-4 w-4 text-pink-600" />
270
+ <div className="flex items-center justify-center w-8 h-8 bg-pink-100 dark:bg-pink-500/20 rounded-lg">
271
+ <ServerIcon className="h-4 w-4 text-pink-600 dark:text-pink-400" />
272
272
  </div>
273
273
  <div>
274
274
  <div className="flex items-center gap-2">
275
- <span className="font-semibold text-gray-900">{data.name || data.id}</span>
276
- <span className="text-[11px] text-gray-500 font-medium bg-gray-100 px-1.5 py-0.5 rounded">v{data.version}</span>
275
+ <span className="font-semibold text-[rgb(var(--ec-page-text))]">{data.name || data.id}</span>
276
+ <span className="text-[11px] text-[rgb(var(--ec-page-text-muted))] font-medium bg-[rgb(var(--ec-content-hover))] px-1.5 py-0.5 rounded">
277
+ v{data.version}
278
+ </span>
277
279
  </div>
278
- {data.summary && <p className="text-xs text-gray-500 line-clamp-1 mt-0.5 max-w-md">{data.summary}</p>}
280
+ {data.summary && (
281
+ <p className="text-xs text-[rgb(var(--ec-page-text-muted))] line-clamp-1 mt-0.5 max-w-md">{data.summary}</p>
282
+ )}
279
283
  </div>
280
284
  </div>
281
285
  <div className="flex items-center gap-2">
@@ -287,7 +291,7 @@ const ServiceCard = memo(({ service }: { service: any }) => {
287
291
  key={`${spec.type}-${idx}`}
288
292
  href={getSpecUrl(spec, data.id, data.version)}
289
293
  onClick={(e) => e.stopPropagation()}
290
- className="flex items-center gap-1 px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs text-gray-600 hover:text-gray-900 transition-colors"
294
+ className="flex items-center gap-1 px-2 py-1 bg-[rgb(var(--ec-content-hover))] hover:bg-[rgb(var(--ec-sidebar-hover-bg))] rounded text-xs text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))] transition-colors"
291
295
  title={getSpecLabel(spec.type)}
292
296
  >
293
297
  <img src={buildUrl(`/icons/${getSpecIcon(spec.type)}.svg`, true)} alt="" className="h-3.5 w-3.5" />
@@ -297,14 +301,14 @@ const ServiceCard = memo(({ service }: { service: any }) => {
297
301
  </div>
298
302
  )}
299
303
  {hasContent && (
300
- <div className="p-1.5 text-gray-400">
304
+ <div className="p-1.5 text-[rgb(var(--ec-icon-color))]">
301
305
  {isCollapsed ? <ChevronDownIcon className="h-4 w-4" /> : <ChevronUpIcon className="h-4 w-4" />}
302
306
  </div>
303
307
  )}
304
308
  <a
305
309
  href={buildUrl(`/architecture/services/${data.id}/${data.version}`)}
306
310
  onClick={(e) => e.stopPropagation()}
307
- className="p-1.5 text-gray-400 hover:text-pink-600 hover:bg-pink-50 rounded-lg transition-colors"
311
+ className="p-1.5 text-[rgb(var(--ec-icon-color))] hover:text-pink-500 hover:bg-pink-500/10 rounded-lg transition-colors"
308
312
  title="View service architecture"
309
313
  >
310
314
  <ArrowTopRightOnSquareIcon className="h-4 w-4" />
@@ -330,42 +334,42 @@ const SubdomainSection = memo(({ subdomain }: { subdomain: any }) => {
330
334
  const entities = data.entities || [];
331
335
 
332
336
  return (
333
- <div className="bg-white border border-gray-200 rounded-xl overflow-hidden shadow-sm">
337
+ <div className="bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-xl overflow-hidden shadow-sm">
334
338
  {/* Subdomain Header - Clickable */}
335
339
  <div
336
340
  onClick={() => setIsCollapsed(!isCollapsed)}
337
- className={`flex items-center justify-between px-5 py-4 cursor-pointer hover:bg-gray-50 transition-colors ${!isCollapsed ? 'border-b border-gray-200' : ''}`}
341
+ className={`flex items-center justify-between px-5 py-4 cursor-pointer hover:bg-[rgb(var(--ec-content-hover))] transition-colors ${!isCollapsed ? 'border-b border-[rgb(var(--ec-page-border))]' : ''}`}
338
342
  >
339
343
  <div className="flex items-center gap-3">
340
- <div className="flex items-center justify-center w-9 h-9 bg-orange-100 rounded-lg">
341
- <RectangleGroupIcon className="h-5 w-5 text-orange-600" />
344
+ <div className="flex items-center justify-center w-9 h-9 bg-orange-100 dark:bg-orange-500/20 rounded-lg">
345
+ <RectangleGroupIcon className="h-5 w-5 text-orange-600 dark:text-orange-400" />
342
346
  </div>
343
347
  <div>
344
348
  <div className="flex items-center gap-2">
345
- <h3 className="text-base font-semibold text-gray-900">{data.name || data.id}</h3>
346
- <span className="text-[11px] text-gray-500 font-medium bg-white px-1.5 py-0.5 rounded border border-gray-200">
349
+ <h3 className="text-base font-semibold text-[rgb(var(--ec-page-text))]">{data.name || data.id}</h3>
350
+ <span className="text-[11px] text-[rgb(var(--ec-page-text-muted))] font-medium bg-[rgb(var(--ec-content-hover))] px-1.5 py-0.5 rounded border border-[rgb(var(--ec-page-border))]">
347
351
  v{data.version}
348
352
  </span>
349
353
  {/* Show counts when collapsed */}
350
354
  {isCollapsed && (services.length > 0 || entities.length > 0) && (
351
- <span className="text-[11px] text-gray-400 ml-1">
355
+ <span className="text-[11px] text-[rgb(var(--ec-icon-color))] ml-1">
352
356
  {services.length > 0 && `${services.length} service${services.length > 1 ? 's' : ''}`}
353
357
  {services.length > 0 && entities.length > 0 && ', '}
354
358
  {entities.length > 0 && `${entities.length} entit${entities.length > 1 ? 'ies' : 'y'}`}
355
359
  </span>
356
360
  )}
357
361
  </div>
358
- <span className="text-[11px] text-gray-500 font-medium">Subdomain</span>
362
+ <span className="text-[11px] text-[rgb(var(--ec-page-text-muted))] font-medium">Subdomain</span>
359
363
  </div>
360
364
  </div>
361
365
  <div className="flex items-center gap-1">
362
- <div className="p-2 text-gray-400">
366
+ <div className="p-2 text-[rgb(var(--ec-icon-color))]">
363
367
  {isCollapsed ? <ChevronDownIcon className="h-5 w-5" /> : <ChevronUpIcon className="h-5 w-5" />}
364
368
  </div>
365
369
  <a
366
370
  href={buildUrl(`/architecture/domains/${data.id}/${data.version}`)}
367
371
  onClick={(e) => e.stopPropagation()}
368
- className="p-2 text-gray-400 hover:text-gray-600 hover:bg-white rounded-lg transition-colors"
372
+ className="p-2 text-[rgb(var(--ec-icon-color))] hover:text-orange-500 hover:bg-orange-500/10 rounded-lg transition-colors"
369
373
  title="View subdomain architecture"
370
374
  >
371
375
  <ArrowTopRightOnSquareIcon className="h-5 w-5" />
@@ -379,9 +383,11 @@ const SubdomainSection = memo(({ subdomain }: { subdomain: any }) => {
379
383
  {entities.length > 0 && (
380
384
  <div>
381
385
  <div className="flex items-center gap-2 mb-3">
382
- <BoxIcon className="h-4 w-4 text-purple-600" />
383
- <h4 className="text-sm font-semibold text-gray-700">Entities</h4>
384
- <span className="text-xs text-gray-500 bg-gray-100 px-2 py-0.5 rounded-full font-medium">{entities.length}</span>
386
+ <BoxIcon className="h-4 w-4 text-[rgb(var(--ec-accent))]" />
387
+ <h4 className="text-sm font-semibold text-[rgb(var(--ec-page-text))]">Entities</h4>
388
+ <span className="text-xs text-[rgb(var(--ec-page-text-muted))] bg-[rgb(var(--ec-content-hover))] px-2 py-0.5 rounded-full font-medium">
389
+ {entities.length}
390
+ </span>
385
391
  </div>
386
392
  <div className="flex flex-wrap gap-2">
387
393
  {entities.map((entity: any) => {
@@ -396,9 +402,11 @@ const SubdomainSection = memo(({ subdomain }: { subdomain: any }) => {
396
402
  {services.length > 0 && (
397
403
  <div>
398
404
  <div className="flex items-center gap-2 mb-3">
399
- <ServerIcon className="h-4 w-4 text-pink-600" />
400
- <h4 className="text-sm font-semibold text-gray-700">Services</h4>
401
- <span className="text-xs text-gray-500 bg-gray-100 px-2 py-0.5 rounded-full font-medium">{services.length}</span>
405
+ <ServerIcon className="h-4 w-4 text-pink-600 dark:text-pink-400" />
406
+ <h4 className="text-sm font-semibold text-[rgb(var(--ec-page-text))]">Services</h4>
407
+ <span className="text-xs text-[rgb(var(--ec-page-text-muted))] bg-[rgb(var(--ec-content-hover))] px-2 py-0.5 rounded-full font-medium">
408
+ {services.length}
409
+ </span>
402
410
  </div>
403
411
  <div className="space-y-3">
404
412
  {services.map((service: any) => {
@@ -410,7 +418,9 @@ const SubdomainSection = memo(({ subdomain }: { subdomain: any }) => {
410
418
  )}
411
419
 
412
420
  {entities.length === 0 && services.length === 0 && (
413
- <p className="text-sm text-gray-400 italic text-center py-4">No entities or services in this subdomain</p>
421
+ <p className="text-sm text-[rgb(var(--ec-icon-color))] italic text-center py-4">
422
+ No entities or services in this subdomain
423
+ </p>
414
424
  )}
415
425
  </div>
416
426
  )}
@@ -424,7 +434,7 @@ const SubdomainSection = memo(({ subdomain }: { subdomain: any }) => {
424
434
 
425
435
  export default function DomainGrid({ domain }: DomainGridProps) {
426
436
  const data = domain?.data;
427
- if (!data) return <div className="text-gray-500">No domain data</div>;
437
+ if (!data) return <div className="text-[rgb(var(--ec-page-text-muted))]">No domain data</div>;
428
438
 
429
439
  const subdomains = data.domains || [];
430
440
  const entities = data.entities || [];
@@ -454,26 +464,26 @@ export default function DomainGrid({ domain }: DomainGridProps) {
454
464
  return (
455
465
  <div className="w-full">
456
466
  {/* Domain Header - Doc style */}
457
- <div className="border-b border-gray-200 md:pb-4">
467
+ <div className="border-b border-[rgb(var(--ec-page-border))] md:pb-4">
458
468
  <div className="flex items-start justify-between">
459
469
  <div>
460
- <h2 className="text-2xl md:text-4xl font-bold text-black">{data.name || data.id}</h2>
461
- {data.summary && <p className="text-lg pt-2 text-gray-500 font-light">{data.summary}</p>}
470
+ <h2 className="text-2xl md:text-4xl font-bold text-[rgb(var(--ec-page-text))]">{data.name || data.id}</h2>
471
+ {data.summary && <p className="text-lg pt-2 text-[rgb(var(--ec-page-text-muted))] font-light">{data.summary}</p>}
462
472
  </div>
463
473
  <div className="flex items-center gap-2 flex-shrink-0">
464
474
  <a
465
475
  href={buildUrl(`/docs/domains/${data.id}/${data.version}`)}
466
- className="inline-flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-200 rounded-lg hover:bg-gray-50 hover:border-gray-300 transition-all"
476
+ className="inline-flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg hover:bg-[rgb(var(--ec-content-hover))] hover:border-[rgb(var(--ec-page-text-muted))] transition-all"
467
477
  >
468
478
  View docs
469
- <ArrowTopRightOnSquareIcon className="h-4 w-4 text-gray-400" />
479
+ <ArrowTopRightOnSquareIcon className="h-4 w-4 text-[rgb(var(--ec-icon-color))]" />
470
480
  </a>
471
481
  <a
472
482
  href={buildUrl(`/visualiser/domains/${data.id}/${data.version}`)}
473
- className="inline-flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-white bg-gray-800 rounded-lg hover:bg-gray-900 transition-all"
483
+ className="inline-flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-white bg-zinc-800 dark:bg-zinc-700 rounded-lg hover:bg-zinc-900 dark:hover:bg-zinc-600 transition-all"
474
484
  >
475
485
  Visualizer
476
- <ArrowTopRightOnSquareIcon className="h-4 w-4 text-gray-400" />
486
+ <ArrowTopRightOnSquareIcon className="h-4 w-4 text-zinc-400" />
477
487
  </a>
478
488
  </div>
479
489
  </div>
@@ -485,9 +495,11 @@ export default function DomainGrid({ domain }: DomainGridProps) {
485
495
  {entities.length > 0 && (
486
496
  <div>
487
497
  <div className="flex items-center gap-2 mb-4">
488
- <BoxIcon className="h-5 w-5 text-purple-600" />
489
- <h3 className="text-lg font-semibold text-gray-900">Entities</h3>
490
- <span className="text-sm text-gray-500 bg-gray-100 px-2.5 py-0.5 rounded-full font-medium">{entities.length}</span>
498
+ <BoxIcon className="h-5 w-5 text-[rgb(var(--ec-accent))]" />
499
+ <h3 className="text-lg font-semibold text-[rgb(var(--ec-page-text))]">Entities</h3>
500
+ <span className="text-sm text-[rgb(var(--ec-page-text-muted))] bg-[rgb(var(--ec-content-hover))] px-2.5 py-0.5 rounded-full font-medium">
501
+ {entities.length}
502
+ </span>
491
503
  </div>
492
504
  <div className="flex flex-wrap gap-2">
493
505
  {entities.map((entity: any) => {
@@ -502,9 +514,9 @@ export default function DomainGrid({ domain }: DomainGridProps) {
502
514
  {topLevelServices.length > 0 && (
503
515
  <div>
504
516
  <div className="flex items-center gap-2 mb-4">
505
- <ServerIcon className="h-5 w-5 text-pink-600" />
506
- <h3 className="text-lg font-semibold text-gray-900">Services</h3>
507
- <span className="text-sm text-gray-500 bg-gray-100 px-2.5 py-0.5 rounded-full font-medium">
517
+ <ServerIcon className="h-5 w-5 text-pink-600 dark:text-pink-400" />
518
+ <h3 className="text-lg font-semibold text-[rgb(var(--ec-page-text))]">Services</h3>
519
+ <span className="text-sm text-[rgb(var(--ec-page-text-muted))] bg-[rgb(var(--ec-content-hover))] px-2.5 py-0.5 rounded-full font-medium">
508
520
  {topLevelServices.length}
509
521
  </span>
510
522
  </div>
@@ -521,9 +533,9 @@ export default function DomainGrid({ domain }: DomainGridProps) {
521
533
  {subdomains.length > 0 && (
522
534
  <div>
523
535
  <div className="flex items-center gap-2 mb-4">
524
- <RectangleGroupIcon className="h-5 w-5 text-orange-600" />
525
- <h3 className="text-lg font-semibold text-gray-900">Subdomains</h3>
526
- <span className="text-sm text-gray-500 bg-gray-100 px-2.5 py-0.5 rounded-full font-medium">
536
+ <RectangleGroupIcon className="h-5 w-5 text-orange-600 dark:text-orange-400" />
537
+ <h3 className="text-lg font-semibold text-[rgb(var(--ec-page-text))]">Subdomains</h3>
538
+ <span className="text-sm text-[rgb(var(--ec-page-text-muted))] bg-[rgb(var(--ec-content-hover))] px-2.5 py-0.5 rounded-full font-medium">
527
539
  {subdomains.length}
528
540
  </span>
529
541
  </div>
@@ -539,10 +551,10 @@ export default function DomainGrid({ domain }: DomainGridProps) {
539
551
  {/* Empty state */}
540
552
  {entities.length === 0 && services.length === 0 && subdomains.length === 0 && (
541
553
  <div className="text-center py-12">
542
- <div className="flex items-center justify-center w-16 h-16 mx-auto mb-4 bg-gray-100 rounded-2xl">
543
- <RectangleGroupIcon className="h-8 w-8 text-gray-400" />
554
+ <div className="flex items-center justify-center w-16 h-16 mx-auto mb-4 bg-[rgb(var(--ec-content-hover))] rounded-2xl">
555
+ <RectangleGroupIcon className="h-8 w-8 text-[rgb(var(--ec-icon-color))]" />
544
556
  </div>
545
- <p className="text-gray-500">This domain has no entities, services, or subdomains defined.</p>
557
+ <p className="text-[rgb(var(--ec-page-text-muted))]">This domain has no entities, services, or subdomains defined.</p>
546
558
  </div>
547
559
  )}
548
560
  </div>