@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
@@ -9,11 +9,11 @@ const ChatPanelButton = () => {
9
9
  <>
10
10
  <button
11
11
  onClick={() => setIsOpen(true)}
12
- className="flex items-center gap-1.5 px-4 py-1.5 rounded-md bg-white hover:bg-gray-50 ring-1 ring-inset ring-gray-300 shadow-sm transition-colors text-sm ml-[-1px]"
12
+ className="flex items-center gap-1.5 px-4 py-1.5 rounded-md bg-[rgb(var(--ec-card-bg))] hover:bg-[rgb(var(--ec-content-hover))] ring-1 ring-inset ring-[rgb(var(--ec-page-border))] shadow-sm transition-colors text-sm ml-[-1px]"
13
13
  aria-label="Open AI Assistant"
14
14
  >
15
- <BookOpen size={14} className="text-purple-500" />
16
- <span className="font-light text-gray-600">Ask</span>
15
+ <BookOpen size={14} className="text-[rgb(var(--ec-accent))]" />
16
+ <span className="font-light text-[rgb(var(--ec-page-text-muted))]">Ask</span>
17
17
  </button>
18
18
 
19
19
  <ChatPanel isOpen={isOpen} onClose={() => setIsOpen(false)} />
@@ -12,21 +12,24 @@ const { id, name, label, class: className, ...attrs } = Astro.props;
12
12
 
13
13
  <label for={id} class="relative block cursor-pointer select-none pl-5">
14
14
  <input id={id} name={name} type="checkbox" class="h-0 w-0 cursor-pointer appearance-none group" {...attrs} />
15
- <span class="text-md text-gray-700">{label}</span>
15
+ <span class="text-md text-[rgb(var(--ec-page-text))]">{label}</span>
16
16
  </label>
17
17
 
18
18
  <style>
19
19
  input::before {
20
- @apply absolute left-0 top-1/2 block h-4 w-4 -translate-y-1/2 rounded-[4px] border border-gray-300;
20
+ @apply absolute left-0 top-1/2 block h-4 w-4 -translate-y-1/2 rounded-[4px];
21
21
  content: '';
22
+ border: 1px solid rgb(var(--ec-page-border));
23
+ background-color: rgb(var(--ec-input-bg));
22
24
  }
23
25
 
24
26
  input:checked::before {
25
- @apply bg-purple-600;
27
+ background-color: rgb(var(--ec-accent));
28
+ border-color: rgb(var(--ec-accent));
26
29
  }
27
30
 
28
31
  input:focus::before {
29
- @apply outline outline-purple-300;
32
+ outline: 2px solid rgb(var(--ec-accent) / 0.3);
30
33
  }
31
34
 
32
35
  input:checked::after {
@@ -27,17 +27,17 @@ const MenuItemContent = ({
27
27
  } else {
28
28
  // It must be an ElementType (component constructor like Lucide icon)
29
29
  const IconComponent = iconProp as React.ElementType;
30
- iconElement = <IconComponent className="w-5 h-5 text-gray-500" />;
30
+ iconElement = <IconComponent className="w-5 h-5 text-[rgb(var(--ec-icon-color))]" />;
31
31
  }
32
32
 
33
33
  return (
34
34
  <div className="flex items-center gap-3 px-3 py-2 text-sm">
35
- <div className="p-1 border border-gray-200 rounded">{iconElement}</div>
35
+ <div className="p-1 border border-[rgb(var(--ec-dropdown-border))] rounded">{iconElement}</div>
36
36
  <div className="flex-1">
37
- <div className="font-medium text-gray-800">{title}</div>
38
- <div className="text-xs text-gray-500">{description}</div>
37
+ <div className="font-medium text-[rgb(var(--ec-dropdown-text))]">{title}</div>
38
+ <div className="text-xs text-[rgb(var(--ec-content-text-muted))]">{description}</div>
39
39
  </div>
40
- {external && <ExternalLink className="w-4 h-4 text-gray-400" />}
40
+ {external && <ExternalLink className="w-4 h-4 text-[rgb(var(--ec-icon-color))]" />}
41
41
  </div>
42
42
  );
43
43
  };
@@ -199,12 +199,12 @@ export function CopyPageMenu({
199
199
  return (
200
200
  <DropdownMenu.Root>
201
201
  {/* Container for the split button */}
202
- <div className="inline-flex rounded-md shadow-sm border border-gray-300">
202
+ <div className="inline-flex rounded-md shadow-sm border border-[rgb(var(--ec-dropdown-border))]">
203
203
  {/* Left Button: Default Action */}
204
204
  <button
205
205
  type="button"
206
206
  onClick={handleDefaultAction}
207
- className="inline-flex items-center justify-center gap-1 px-3 py-1.5 text-sm font-medium text-gray-700 bg-white rounded-l-md hover:bg-gray-50 focus:z-10 focus:outline-none focus:ring-1 focus:ring-indigo-500"
207
+ className="inline-flex items-center justify-center gap-1 px-3 py-1.5 text-sm font-medium text-[rgb(var(--ec-dropdown-text))] bg-[rgb(var(--ec-dropdown-bg))] rounded-l-md hover:bg-[rgb(var(--ec-dropdown-hover))] focus:z-10 focus:outline-none focus:ring-1 focus:ring-[rgb(var(--ec-accent))]"
208
208
  >
209
209
  <defaultAction.icon className="w-4 h-4" />
210
210
  {buttonText}
@@ -213,7 +213,7 @@ export function CopyPageMenu({
213
213
  <DropdownMenu.Trigger asChild>
214
214
  <button
215
215
  type="button"
216
- className="inline-flex items-center justify-center px-1.5 py-1.5 text-sm font-medium text-gray-500 bg-white rounded-r-md border-l border-gray-300 hover:bg-gray-50 focus:z-10 focus:outline-none focus:ring-1 focus:ring-indigo-500"
216
+ className="inline-flex items-center justify-center px-1.5 py-1.5 text-sm font-medium text-[rgb(var(--ec-icon-color))] bg-[rgb(var(--ec-dropdown-bg))] rounded-r-md border-l border-[rgb(var(--ec-dropdown-border))] hover:bg-[rgb(var(--ec-dropdown-hover))] focus:z-10 focus:outline-none focus:ring-1 focus:ring-[rgb(var(--ec-accent))]"
217
217
  aria-label="More options"
218
218
  >
219
219
  <ChevronDownIcon className="w-4 h-4" />
@@ -223,13 +223,13 @@ export function CopyPageMenu({
223
223
 
224
224
  {/* Adjust styling for the content dropdown */}
225
225
  <DropdownMenu.Content
226
- className="w-72 bg-white rounded-lg shadow-lg border border-gray-200 mt-1 py-1"
226
+ className="w-72 bg-[rgb(var(--ec-dropdown-bg))] rounded-lg shadow-lg border border-[rgb(var(--ec-dropdown-border))] mt-1 py-1"
227
227
  sideOffset={5}
228
228
  align="end"
229
229
  >
230
230
  {availableActions.copyMarkdown && (
231
231
  <DropdownMenu.Item
232
- className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
232
+ className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-none focus:bg-[rgb(var(--ec-dropdown-hover))]"
233
233
  onSelect={() => copyMarkdownToClipboard()}
234
234
  >
235
235
  <MenuItemContent icon={Copy} title="Copy page" description="Copy page as Markdown for LLMs" />
@@ -238,7 +238,7 @@ export function CopyPageMenu({
238
238
 
239
239
  {availableActions.editPage && (
240
240
  <DropdownMenu.Item
241
- className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
241
+ className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-none focus:bg-[rgb(var(--ec-dropdown-hover))]"
242
242
  onSelect={() => window.open(editUrl, '_blank')}
243
243
  >
244
244
  <MenuItemContent
@@ -275,7 +275,7 @@ export function CopyPageMenu({
275
275
  return (
276
276
  <DropdownMenu.Item
277
277
  key={schema.url}
278
- className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
278
+ className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-none focus:bg-[rgb(var(--ec-dropdown-hover))]"
279
279
  onSelect={() => copySchemaToClipboard(schema)}
280
280
  >
281
281
  <MenuItemContent icon={Icon} title={title} description={`Copy ${type} to clipboard`} />
@@ -285,7 +285,7 @@ export function CopyPageMenu({
285
285
 
286
286
  {availableActions.viewMarkdown && (
287
287
  <DropdownMenu.Item
288
- className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
288
+ className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-none focus:bg-[rgb(var(--ec-dropdown-hover))]"
289
289
  onSelect={() => window.open(markdownUrl, '_blank')}
290
290
  >
291
291
  <MenuItemContent
@@ -299,7 +299,7 @@ export function CopyPageMenu({
299
299
 
300
300
  {availableActions.rssFeed && (
301
301
  <DropdownMenu.Item
302
- className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
302
+ className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-none focus:bg-[rgb(var(--ec-dropdown-hover))]"
303
303
  onSelect={() => window.open(buildUrl(`/rss/all/rss.xml`), '_blank')}
304
304
  >
305
305
  <MenuItemContent icon={RssIcon} title="RSS Feed" description="View this page as RSS feed" external={true} />
@@ -307,7 +307,7 @@ export function CopyPageMenu({
307
307
  )}
308
308
  {availableActions.chat && (
309
309
  <DropdownMenu.Item
310
- className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
310
+ className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-none focus:bg-[rgb(var(--ec-dropdown-hover))]"
311
311
  onSelect={() => window.open(buildUrl(`/chat`) + `?query=${chatQuery}`)}
312
312
  >
313
313
  <MenuItemContent
@@ -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>