@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
@@ -1,15 +1,55 @@
1
1
  import { InformationCircleIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline';
2
2
 
3
- const getConfigurationByType = (type: string) => {
3
+ type AdmonitionType = 'danger' | 'alert' | 'warning' | 'info' | 'note';
4
+
5
+ interface AdmonitionConfig {
6
+ icon: typeof InformationCircleIcon;
7
+ title: string;
8
+ containerClasses: string;
9
+ iconClasses: string;
10
+ titleClasses: string;
11
+ contentClasses: string;
12
+ }
13
+
14
+ const getConfigurationByType = (type: string): AdmonitionConfig => {
4
15
  switch (type) {
5
16
  case 'danger':
6
- return { color: 'red', icon: ExclamationTriangleIcon, title: 'Danger' };
7
17
  case 'alert':
8
- return { color: 'red', icon: ExclamationTriangleIcon, title: 'Alert' };
18
+ return {
19
+ icon: ExclamationTriangleIcon,
20
+ title: type === 'danger' ? 'Danger' : 'Alert',
21
+ containerClasses: 'bg-red-50 dark:bg-red-950/50 border-red-500',
22
+ iconClasses: 'text-red-500 dark:text-red-400',
23
+ titleClasses: 'text-red-600 dark:text-red-300',
24
+ contentClasses: 'text-red-700 dark:text-red-200',
25
+ };
9
26
  case 'warning':
10
- return { color: 'yellow', icon: ExclamationTriangleIcon, title: 'Warning' };
27
+ return {
28
+ icon: ExclamationTriangleIcon,
29
+ title: 'Warning',
30
+ containerClasses: 'bg-yellow-50 dark:bg-yellow-950/50 border-yellow-500',
31
+ iconClasses: 'text-yellow-500 dark:text-yellow-400',
32
+ titleClasses: 'text-yellow-600 dark:text-yellow-300',
33
+ contentClasses: 'text-yellow-700 dark:text-yellow-200',
34
+ };
35
+ case 'note':
36
+ return {
37
+ icon: InformationCircleIcon,
38
+ title: 'Note',
39
+ containerClasses: 'bg-blue-50 dark:bg-blue-950/50 border-blue-500',
40
+ iconClasses: 'text-blue-500 dark:text-blue-400',
41
+ titleClasses: 'text-blue-600 dark:text-blue-300',
42
+ contentClasses: 'text-blue-700 dark:text-blue-200',
43
+ };
11
44
  default:
12
- return { color: 'indigo', icon: InformationCircleIcon, title: 'Info' };
45
+ return {
46
+ icon: InformationCircleIcon,
47
+ title: 'Info',
48
+ containerClasses: 'bg-indigo-50 dark:bg-indigo-950/50 border-indigo-500',
49
+ iconClasses: 'text-indigo-500 dark:text-indigo-400',
50
+ titleClasses: 'text-indigo-600 dark:text-indigo-300',
51
+ contentClasses: 'text-indigo-700 dark:text-indigo-200',
52
+ };
13
53
  }
14
54
  };
15
55
 
@@ -25,13 +65,13 @@ export default function Admonition({ children, type = 'info', className = '', ti
25
65
  const Icon = config.icon;
26
66
 
27
67
  return (
28
- <div className={`bg-${config.color}-50 border-l-4 border-${config.color}-500 p-4 my-4 ${className} rounded-md not-prose`}>
68
+ <div className={`${config.containerClasses} border-l-4 p-4 my-4 ${className} rounded-md not-prose`}>
29
69
  <div className="flex flex-col">
30
70
  <div className="flex items-center justify-start">
31
- <Icon className={`h-6 w-6 text-${config.color}-500 stroke-2`} aria-hidden="true" />
32
- <h3 className={`ml-2 text-${config.color}-600 font-bold text-md`}>{title || config.title}</h3>
71
+ <Icon className={`h-6 w-6 ${config.iconClasses} stroke-2`} aria-hidden="true" />
72
+ <h3 className={`ml-2 ${config.titleClasses} font-bold text-md`}>{title || config.title}</h3>
33
73
  </div>
34
- <div className={`mt-2 text-${config.color}-700 text-md`}>{children}</div>
74
+ <div className={`mt-2 ${config.contentClasses} text-md`}>{children}</div>
35
75
  </div>
36
76
  </div>
37
77
  );
@@ -83,16 +83,16 @@ const sortedGroups = Object.entries(groupedAttachments).sort(([a], [b]) => {
83
83
  <section class="not-prose my-8">
84
84
  {title && <h3 class="flex items-center gap-2 text-3xl font-bold mb-4">{title}</h3>}
85
85
 
86
- {description && <p class="text-gray-600 mb-6 prose prose-md">{description}</p>}
86
+ {description && <p class="text-[rgb(var(--ec-page-text-muted))] mb-6 prose prose-md">{description}</p>}
87
87
 
88
88
  {
89
89
  normalizedAttachments.length === 0 ? (
90
- <div class="text-gray-500 text-sm italic">No attachments available.</div>
90
+ <div class="text-[rgb(var(--ec-page-text-muted))] text-sm italic">No attachments available.</div>
91
91
  ) : (
92
92
  <div class="space-y-6">
93
93
  {sortedGroups.map(([groupType, groupAttachments], index) => (
94
94
  <div>
95
- <h4 class="text-sm font-medium text-gray-900 mb-3 uppercase tracking-wider">
95
+ <h4 class="text-sm font-medium text-[rgb(var(--ec-page-text))] mb-3 uppercase tracking-wider">
96
96
  {groupType} ({groupAttachments.length})
97
97
  </h4>
98
98
  <div class={`grid grid-cols-1 ${columns === 1 ? '' : `md:grid-cols-${Math.min(columns, 3)}`} gap-4`}>
@@ -105,34 +105,38 @@ const sortedGroups = Object.entries(groupedAttachments).sort(([a], [b]) => {
105
105
  href={attachment.url}
106
106
  target={isExternal ? '_blank' : '_self'}
107
107
  rel={isExternal ? 'noopener noreferrer' : undefined}
108
- class="group block bg-white border border-gray-200 rounded-lg p-4 transition-all duration-200 hover:shadow-md hover:border-purple-300 hover:bg-purple-50/30 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2"
108
+ class="group block bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-lg p-4 transition-all duration-200 hover:shadow-md hover:border-[rgb(var(--ec-accent)/0.5)] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2"
109
109
  >
110
110
  <div class="flex items-start gap-3">
111
- <div class="flex-shrink-0 p-2 bg-gray-100 rounded-lg group-hover:bg-purple-100 transition-colors duration-200">
112
- {IconComponent && <IconComponent className="w-5 h-5 text-gray-600 group-hover:text-purple-600" />}
111
+ <div class="flex-shrink-0 p-2 bg-[rgb(var(--ec-content-hover))] rounded-lg group-hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors duration-200">
112
+ {IconComponent && (
113
+ <IconComponent className="w-5 h-5 text-[rgb(var(--ec-icon-color))] group-hover:text-[rgb(var(--ec-accent))]" />
114
+ )}
113
115
  </div>
114
116
 
115
117
  <div class="flex-grow min-w-0">
116
118
  <div class="flex items-center gap-2">
117
- <h5 class="text-sm font-medium text-gray-900 group-hover:text-purple-900 truncate">
119
+ <h5 class="text-sm font-medium text-[rgb(var(--ec-page-text))] group-hover:text-[rgb(var(--ec-accent))] truncate">
118
120
  {attachment.title || 'Attachment'}
119
121
  </h5>
120
122
  {isExternal && (
121
- <Icons.ArrowTopRightOnSquareIcon className="w-3 h-3 text-gray-400 group-hover:text-purple-500 flex-shrink-0" />
123
+ <Icons.ArrowTopRightOnSquareIcon className="w-3 h-3 text-[rgb(var(--ec-icon-color))] group-hover:text-[rgb(var(--ec-accent))] flex-shrink-0" />
122
124
  )}
123
125
  </div>
124
126
 
125
127
  {attachment.summary && (
126
- <p class="mt-1 text-xs text-gray-600 group-hover:text-purple-700 line-clamp-2">{attachment.summary}</p>
128
+ <p class="mt-1 text-xs text-[rgb(var(--ec-page-text-muted))] group-hover:text-[rgb(var(--ec-accent-text))] line-clamp-2">
129
+ {attachment.summary}
130
+ </p>
127
131
  )}
128
132
 
129
133
  {attachment.description && (
130
- <p class="mt-1 text-xs text-gray-600 group-hover:text-purple-700 line-clamp-2">
134
+ <p class="mt-1 text-xs text-[rgb(var(--ec-page-text-muted))] group-hover:text-[rgb(var(--ec-accent-text))] line-clamp-2">
131
135
  {attachment.description}
132
136
  </p>
133
137
  )}
134
138
 
135
- <div class="mt-2 text-xs text-gray-400 group-hover:text-purple-500 truncate">
139
+ <div class="mt-2 text-xs text-[rgb(var(--ec-icon-color))] group-hover:text-[rgb(var(--ec-accent))] truncate">
136
140
  {attachment.url.replace(/^https?:\/\//, '')}
137
141
  </div>
138
142
  </div>
@@ -5,14 +5,17 @@ const ChannelParameters = (data: CollectionEntry<'channels'>['data']) => {
5
5
  return (
6
6
  <div className="container mx-auto py-4 not-prose space-y-4">
7
7
  <div>
8
- <h4 className="text-2xl font-bold">Channel information</h4>
8
+ <h4 className="text-2xl font-bold text-[rgb(var(--ec-page-text))]">Channel information</h4>
9
9
  </div>
10
10
 
11
11
  <div>
12
- <p className="text-md">
12
+ <p className="text-md text-[rgb(var(--ec-page-text))]">
13
13
  {data.address && (
14
14
  <div>
15
- <span className="font-semibold">Address:</span> <code className="bg-gray-100 p-1 rounded">{data.address}</code>
15
+ <span className="font-semibold">Address:</span>{' '}
16
+ <code className="bg-[rgb(var(--ec-content-hover))] p-1 rounded text-[rgb(var(--ec-page-text))]">
17
+ {data.address}
18
+ </code>
16
19
  </div>
17
20
  )}
18
21
  {data.protocols && data.protocols.length > 0 && (
@@ -22,7 +25,10 @@ const ChannelParameters = (data: CollectionEntry<'channels'>['data']) => {
22
25
  {data.protocols.map((protocol) => {
23
26
  const IconComponent = getIconForProtocol(protocol.toLowerCase());
24
27
  return (
25
- <li key={protocol} className=" text-sm flex items-center space-x-1 bg-gray-100 rounded-md px-1">
28
+ <li
29
+ key={protocol}
30
+ className="text-sm flex items-center space-x-1 bg-[rgb(var(--ec-content-hover))] rounded-md px-1"
31
+ >
26
32
  {IconComponent && <IconComponent className="w-4 h-4" />}
27
33
  <span>{protocol}</span>
28
34
  </li>
@@ -36,22 +42,30 @@ const ChannelParameters = (data: CollectionEntry<'channels'>['data']) => {
36
42
 
37
43
  {data.parameters && Object.keys(data.parameters).length > 0 && (
38
44
  <div className="overflow-x-auto">
39
- <table className="min-w-full bg-white border border-gray-300">
45
+ <table className="min-w-full bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))]">
40
46
  <thead>
41
- <tr className="bg-purple-500 text-white">
42
- <th className="py-2 px-4 border-b text-left">Parameter</th>
43
- <th className="py-2 px-4 border-b text-left">Description</th>
44
- <th className="py-2 px-4 border-b text-left">Options</th>
45
- <th className="py-2 px-4 border-b text-left">Default</th>
47
+ <tr className="bg-[rgb(var(--ec-accent))] text-white">
48
+ <th className="py-2 px-4 border-b border-[rgb(var(--ec-page-border))] text-left">Parameter</th>
49
+ <th className="py-2 px-4 border-b border-[rgb(var(--ec-page-border))] text-left">Description</th>
50
+ <th className="py-2 px-4 border-b border-[rgb(var(--ec-page-border))] text-left">Options</th>
51
+ <th className="py-2 px-4 border-b border-[rgb(var(--ec-page-border))] text-left">Default</th>
46
52
  </tr>
47
53
  </thead>
48
54
  <tbody>
49
55
  {Object.entries(data.parameters).map(([param, details]) => (
50
- <tr className="hover:bg-gray-50" key={param}>
51
- <td className="py-2 px-4 border-b">{param}</td>
52
- <td className="py-2 px-4 border-b">{details.description}</td>
53
- <td className="py-2 px-4 border-b">{details.enum ? details.enum.join(', ') : 'N/A'}</td>
54
- <td className="py-2 px-4 border-b">{details.default || 'N/A'}</td>
56
+ <tr className="hover:bg-[rgb(var(--ec-content-hover))]" key={param}>
57
+ <td className="py-2 px-4 border-b border-[rgb(var(--ec-page-border))] text-[rgb(var(--ec-page-text))]">
58
+ {param}
59
+ </td>
60
+ <td className="py-2 px-4 border-b border-[rgb(var(--ec-page-border))] text-[rgb(var(--ec-page-text-muted))]">
61
+ {details.description}
62
+ </td>
63
+ <td className="py-2 px-4 border-b border-[rgb(var(--ec-page-border))] text-[rgb(var(--ec-page-text-muted))]">
64
+ {details.enum ? details.enum.join(', ') : 'N/A'}
65
+ </td>
66
+ <td className="py-2 px-4 border-b border-[rgb(var(--ec-page-border))] text-[rgb(var(--ec-page-text-muted))]">
67
+ {details.default || 'N/A'}
68
+ </td>
55
69
  </tr>
56
70
  ))}
57
71
  </tbody>
@@ -41,8 +41,8 @@ const isComponentEnabled = collection === 'entities';
41
41
  {
42
42
  isComponentEnabled && properties && properties.length > 0 ? (
43
43
  <div class="overflow-x-auto relative not-prose">
44
- <table class="w-full text-sm text-left text-gray-500 border border-gray-200 rounded-lg shadow-sm">
45
- <thead class="text-xs text-gray-700 uppercase bg-gray-50">
44
+ <table class="w-full text-sm text-left text-[rgb(var(--ec-page-text-muted))] border border-[rgb(var(--ec-page-border))] rounded-lg shadow-sm">
45
+ <thead class="text-xs text-[rgb(var(--ec-page-text))] uppercase bg-[rgb(var(--ec-content-hover))]">
46
46
  <tr>
47
47
  <th scope="col" class="py-3 px-6">
48
48
  Name
@@ -60,25 +60,26 @@ const isComponentEnabled = collection === 'entities';
60
60
  </thead>
61
61
  <tbody>
62
62
  {properties.map((prop) => (
63
- <tr class="bg-white border-b hover:bg-gray-50 align-top">
64
- <td class="py-4 px-6 font-medium text-gray-900 whitespace-nowrap">
65
- <code class="text-sm bg-gray-100 rounded px-1 py-0.5">{prop.name}</code>
63
+ <tr class="bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border-b border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-content-hover))] align-top">
64
+ <td class="py-4 px-6 font-medium text-[rgb(var(--ec-page-text))] whitespace-nowrap">
65
+ <code class="text-sm bg-[rgb(var(--ec-content-hover))] rounded px-1 py-0.5">{prop.name}</code>
66
66
  </td>
67
- <td class="py-4 px-6">
67
+ <td class="py-4 px-6 text-[rgb(var(--ec-page-text-muted))]">
68
68
  {prop.type === 'array' && prop.items ? (
69
69
  <span>
70
- array&lt;<code class="text-sm bg-gray-100 rounded px-1 py-0.5">{prop.items.type}</code>&gt;
70
+ array&lt;<code class="text-sm bg-[rgb(var(--ec-content-hover))] rounded px-1 py-0.5">{prop.items.type}</code>
71
+ &gt;
71
72
  </span>
72
73
  ) : (
73
- <code class="text-sm bg-gray-100 rounded px-1 py-0.5">{prop.type}</code>
74
+ <code class="text-sm bg-[rgb(var(--ec-content-hover))] rounded px-1 py-0.5">{prop.type}</code>
74
75
  )}
75
76
  {prop.enum && (
76
- <div class="text-xs text-gray-500 mt-2">
77
+ <div class="text-xs text-[rgb(var(--ec-page-text-muted))] mt-2">
77
78
  <span class="font-semibold block mb-1">Enum:</span>
78
79
  <ul class="list-disc list-inside ml-2 space-y-1">
79
80
  {prop.enum.map((enumValue: string) => (
80
81
  <li>
81
- <code class="text-xs bg-gray-100 rounded px-1 py-0.5">{enumValue}</code>
82
+ <code class="text-xs bg-[rgb(var(--ec-content-hover))] rounded px-1 py-0.5">{enumValue}</code>
82
83
  </li>
83
84
  ))}
84
85
  </ul>
@@ -87,12 +88,18 @@ const isComponentEnabled = collection === 'entities';
87
88
  </td>
88
89
  <td class="py-4 px-6">
89
90
  {prop.required ? (
90
- <span class="bg-purple-100 text-purple-800 text-xs font-semibold mr-2 px-2.5 py-0.5 rounded">Required</span>
91
+ <span class="bg-[rgb(var(--ec-accent-subtle))] text-[rgb(var(--ec-accent-text))] text-xs font-semibold mr-2 px-2.5 py-0.5 rounded">
92
+ Required
93
+ </span>
91
94
  ) : (
92
- <span class="bg-gray-100 text-gray-800 text-xs font-semibold mr-2 px-2.5 py-0.5 rounded">Optional</span>
95
+ <span class="bg-[rgb(var(--ec-content-hover))] text-[rgb(var(--ec-page-text-muted))] text-xs font-semibold mr-2 px-2.5 py-0.5 rounded">
96
+ Optional
97
+ </span>
93
98
  )}
94
99
  </td>
95
- <td class="py-4 px-6">{prop.description || <span class="text-gray-400 italic">No description provided.</span>}</td>
100
+ <td class="py-4 px-6 text-[rgb(var(--ec-page-text-muted))]">
101
+ {prop.description || <span class="text-[rgb(var(--ec-icon-color))] italic">No description provided.</span>}
102
+ </td>
96
103
  </tr>
97
104
  ))}
98
105
  </tbody>
@@ -4,4 +4,4 @@ import { buildUrl } from '@utils/url-builder';
4
4
  const { href } = Astro.props;
5
5
  ---
6
6
 
7
- <a href={buildUrl(href)} class="text-purple-500 hover:text-purple-700"><slot /></a>
7
+ <a href={buildUrl(href)} class="text-[rgb(var(--ec-accent))] hover:text-[rgb(var(--ec-accent-hover))]"><slot /></a>
@@ -33,35 +33,35 @@ const MessageRow = memo(
33
33
  const channels = message.channels || [];
34
34
 
35
35
  return (
36
- <tr className="group hover:bg-gray-100">
37
- <td className="whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6 relative">
36
+ <tr className="group hover:bg-[rgb(var(--ec-content-hover))]">
37
+ <td className="whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-[rgb(var(--ec-page-text))] sm:pl-6 relative">
38
38
  <a href={url} className="absolute inset-0 z-10" aria-label={`View details for ${message.name}`} />
39
39
  <div className="flex items-center gap-2 relative">
40
40
  <Icon className={`h-5 w-5 text-${color}-500`} />
41
41
  <span className="group-hover:text-blue-600 break-all">{message.name}</span>
42
42
  </div>
43
43
  </td>
44
- <td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500 relative">
44
+ <td className="whitespace-nowrap px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
45
45
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
46
46
  <span>v{message.version}</span>
47
47
  </td>
48
- <td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500 relative">
48
+ <td className="whitespace-nowrap px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
49
49
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
50
50
  <span>{type}</span>
51
51
  </td>
52
- <td className="px-3 py-4 text-sm text-gray-500 relative">
52
+ <td className="px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
53
53
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
54
54
  <span className="line-clamp-2 break-words">{message.summary || '-'}</span>
55
55
  </td>
56
56
  {showChannels && (
57
- <td className="px-3 py-4 text-sm text-gray-500 relative">
57
+ <td className="px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
58
58
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
59
59
  <div className="flex flex-wrap gap-1">
60
60
  {channels.length > 0
61
61
  ? channels.map((channel, index) => (
62
62
  <span
63
63
  key={`${channel.id}-${index}`}
64
- className="inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10"
64
+ className="inline-flex items-center rounded-md bg-[rgb(var(--ec-content-hover))] px-2 py-1 text-xs font-medium text-[rgb(var(--ec-page-text-muted))] ring-1 ring-inset ring-[rgb(var(--ec-page-border))]"
65
65
  >
66
66
  {channel.id}
67
67
  </span>
@@ -98,8 +98,8 @@ const FilterButton = memo(
98
98
  }}
99
99
  className={`px-3 py-1 rounded-md text-sm font-medium ${
100
100
  typeFilter === type
101
- ? 'bg-black text-white border border-gray-200 hover:bg-gray-900'
102
- : 'bg-white text-black border border-gray-200 hover:bg-gray-100'
101
+ ? 'bg-[rgb(var(--ec-button-bg))] text-[rgb(var(--ec-button-text))] border border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-button-bg-hover))]'
102
+ : 'bg-[rgb(var(--ec-page-bg))] text-[rgb(var(--ec-page-text))] border border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-content-hover))]'
103
103
  }`}
104
104
  >
105
105
  {label} ({count})
@@ -210,12 +210,12 @@ const MessageTable = (props: MessageTableProps) => {
210
210
  );
211
211
 
212
212
  return (
213
- <div className="flow-root bg-white border-gray-200 border p-4 pb-2 rounded-lg text-gray-900">
213
+ <div className="flow-root bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border-[rgb(var(--ec-page-border))] border p-4 pb-2 rounded-lg text-[rgb(var(--ec-page-text))]">
214
214
  <div className="space-y-4">
215
215
  <h2 className="text-xl font-semibold">
216
216
  {title} ({searchTerm || typeFilter ? `${filteredMessages.length}/${messages.length}` : messages.length})
217
217
  </h2>
218
- <span className="text-sm text-gray-700">
218
+ <span className="text-sm text-[rgb(var(--ec-page-text-muted))]">
219
219
  Quickly find the message you need by searching for the name, type, or summary.
220
220
  </span>
221
221
 
@@ -238,7 +238,12 @@ const MessageTable = (props: MessageTableProps) => {
238
238
 
239
239
  <div className="relative">
240
240
  <div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3">
241
- <svg className="h-5 w-5 text-gray-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
241
+ <svg
242
+ className="h-5 w-5 text-[rgb(var(--ec-icon-color))]"
243
+ viewBox="0 0 20 20"
244
+ fill="currentColor"
245
+ aria-hidden="true"
246
+ >
242
247
  <path
243
248
  fillRule="evenodd"
244
249
  d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
@@ -254,7 +259,7 @@ const MessageTable = (props: MessageTableProps) => {
254
259
  setCurrentPage(1); // Reset to first page when searching
255
260
  }}
256
261
  placeholder={`Search by name, type, or summary...`}
257
- className="block w-full rounded-md border-0 py-1.5 pl-10 pr-10 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-blue-600 sm:text-sm sm:leading-6"
262
+ className="block w-full rounded-md border-0 py-1.5 pl-10 pr-10 text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-input-bg))] ring-1 ring-inset ring-[rgb(var(--ec-input-border))] placeholder:text-[rgb(var(--ec-input-placeholder))] focus:ring-2 focus:ring-inset focus:ring-[rgb(var(--ec-accent))] sm:text-sm sm:leading-6"
258
263
  />
259
264
  {searchTerm && (
260
265
  <button
@@ -265,7 +270,11 @@ const MessageTable = (props: MessageTableProps) => {
265
270
  className="absolute inset-y-0 right-0 flex items-center pr-3"
266
271
  aria-label="Clear search"
267
272
  >
268
- <svg className="h-5 w-5 text-gray-400 hover:text-gray-500" viewBox="0 0 20 20" fill="currentColor">
273
+ <svg
274
+ className="h-5 w-5 text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-icon-hover))]"
275
+ viewBox="0 0 20 20"
276
+ fill="currentColor"
277
+ >
269
278
  <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" />
270
279
  </svg>
271
280
  </button>
@@ -275,35 +284,44 @@ const MessageTable = (props: MessageTableProps) => {
275
284
  <div className="overflow-x-auto">
276
285
  <div className="inline-block min-w-full py-2 align-middle">
277
286
  <div className="max-w-full overflow-hidden">
278
- <table className="min-w-full table-fixed divide-y divide-gray-300 rounded-sm bg-white ">
287
+ <table className="min-w-full table-fixed divide-y divide-[rgb(var(--ec-page-border))] rounded-sm bg-[rgb(var(--ec-page-bg))]">
279
288
  <thead>
280
289
  <tr>
281
290
  <th
282
291
  scope="col"
283
- className={`${showChannels ? 'w-1/4' : 'w-1/3'} py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6`}
292
+ className={`${showChannels ? 'w-1/4' : 'w-1/3'} py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))] sm:pl-6`}
284
293
  >
285
294
  Name
286
295
  </th>
287
- <th scope="col" className="w-[100px] px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
296
+ <th
297
+ scope="col"
298
+ className="w-[100px] px-3 py-3.5 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]"
299
+ >
288
300
  Version
289
301
  </th>
290
- <th scope="col" className="w-[100px] py-3.5 pl-3.5 pr-3 text-left text-sm font-semibold text-gray-900">
302
+ <th
303
+ scope="col"
304
+ className="w-[100px] py-3.5 pl-3.5 pr-3 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]"
305
+ >
291
306
  Type
292
307
  </th>
293
308
  <th
294
309
  scope="col"
295
- className={`${showChannels ? 'w-1/3' : 'w-1/2'} px-3 py-3.5 text-left text-sm font-semibold text-gray-900`}
310
+ className={`${showChannels ? 'w-1/3' : 'w-1/2'} px-3 py-3.5 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]`}
296
311
  >
297
312
  Summary
298
313
  </th>
299
314
  {showChannels && (
300
- <th scope="col" className="w-1/4 px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
315
+ <th
316
+ scope="col"
317
+ className="w-1/4 px-3 py-3.5 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]"
318
+ >
301
319
  Channels
302
320
  </th>
303
321
  )}
304
322
  </tr>
305
323
  </thead>
306
- <tbody className="divide-y divide-gray-200">
324
+ <tbody className="divide-y divide-[rgb(var(--ec-page-border))]">
307
325
  {paginatedMessages.length > 0 ? (
308
326
  paginatedMessages.map((message) => (
309
327
  <MessageRow
@@ -315,7 +333,10 @@ const MessageTable = (props: MessageTableProps) => {
315
333
  ))
316
334
  ) : (
317
335
  <tr>
318
- <td colSpan={showChannels ? 5 : 4} className="text-center py-4 text-sm text-gray-500">
336
+ <td
337
+ colSpan={showChannels ? 5 : 4}
338
+ className="text-center py-4 text-sm text-[rgb(var(--ec-page-text-muted))]"
339
+ >
319
340
  No messages found
320
341
  </td>
321
342
  </tr>
@@ -326,26 +347,26 @@ const MessageTable = (props: MessageTableProps) => {
326
347
  </div>
327
348
  </div>
328
349
  {totalPages > 1 && (
329
- <div className="flex items-center justify-between border-t border-gray-200 bg-white px-4 py-3 sm:px-6 -mt-2">
350
+ <div className="flex items-center justify-between border-t border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg))] px-4 py-3 sm:px-6 -mt-2">
330
351
  <div className="flex flex-1 justify-between sm:hidden">
331
352
  <button
332
353
  onClick={() => setCurrentPage(currentPage - 1)}
333
354
  disabled={currentPage === 1}
334
- className={`relative inline-flex items-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium ${currentPage === 1 ? 'text-gray-300' : 'text-gray-700 hover:bg-gray-50'}`}
355
+ className={`relative inline-flex items-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg))] px-4 py-2 text-sm font-medium ${currentPage === 1 ? 'text-[rgb(var(--ec-page-text-muted))] opacity-50' : 'text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-content-hover))]'}`}
335
356
  >
336
357
  Previous
337
358
  </button>
338
359
  <button
339
360
  onClick={() => setCurrentPage(currentPage + 1)}
340
361
  disabled={currentPage === totalPages}
341
- className={`relative ml-3 inline-flex items-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium ${currentPage === totalPages ? 'text-gray-300' : 'text-gray-700 hover:bg-gray-50'}`}
362
+ className={`relative ml-3 inline-flex items-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg))] px-4 py-2 text-sm font-medium ${currentPage === totalPages ? 'text-[rgb(var(--ec-page-text-muted))] opacity-50' : 'text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-content-hover))]'}`}
342
363
  >
343
364
  Next
344
365
  </button>
345
366
  </div>
346
367
  <div className="hidden sm:flex sm:flex-1 sm:items-center sm:justify-between">
347
368
  <div>
348
- <p className="text-sm text-gray-700">
369
+ <p className="text-sm text-[rgb(var(--ec-page-text-muted))]">
349
370
  Showing <span className="font-medium">{startIndex + 1}</span> to{' '}
350
371
  <span className="font-medium">{Math.min(startIndex + itemsPerPage, filteredMessages.length)}</span> of{' '}
351
372
  <span className="font-medium">{filteredMessages.length}</span> results
@@ -356,7 +377,7 @@ const MessageTable = (props: MessageTableProps) => {
356
377
  <button
357
378
  onClick={() => setCurrentPage(currentPage - 1)}
358
379
  disabled={currentPage === 1}
359
- className={`relative inline-flex items-center rounded-l-md px-2 py-2 ${currentPage === 1 ? 'text-gray-300' : 'text-gray-400 hover:bg-gray-50'} ring-1 ring-inset ring-gray-300`}
380
+ className={`relative inline-flex items-center rounded-l-md px-2 py-2 ${currentPage === 1 ? 'text-[rgb(var(--ec-page-text-muted))] opacity-50' : 'text-[rgb(var(--ec-icon-color))] hover:bg-[rgb(var(--ec-content-hover))]'} ring-1 ring-inset ring-[rgb(var(--ec-page-border))]`}
360
381
  >
361
382
  <span className="sr-only">Previous</span>
362
383
  <svg className="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
@@ -370,7 +391,7 @@ const MessageTable = (props: MessageTableProps) => {
370
391
  <button
371
392
  onClick={() => setCurrentPage(currentPage + 1)}
372
393
  disabled={currentPage === totalPages}
373
- className={`relative inline-flex items-center rounded-r-md px-2 py-2 ${currentPage === totalPages ? 'text-gray-300' : 'text-gray-400 hover:bg-gray-50'} ring-1 ring-inset ring-gray-300`}
394
+ className={`relative inline-flex items-center rounded-r-md px-2 py-2 ${currentPage === totalPages ? 'text-[rgb(var(--ec-page-text-muted))] opacity-50' : 'text-[rgb(var(--ec-icon-color))] hover:bg-[rgb(var(--ec-content-hover))]'} ring-1 ring-inset ring-[rgb(var(--ec-page-border))]`}
374
395
  >
375
396
  <span className="sr-only">Next</span>
376
397
  <svg className="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
@@ -392,7 +413,7 @@ const MessageTable = (props: MessageTableProps) => {
392
413
 
393
414
  return (
394
415
  <div className={`mx-auto not-prose py-4 space-y-4 my-4`}>
395
- <h2 className="text-2xl font-semibold">Messages for this {collection.slice(0, -1)}</h2>
416
+ <h2 className="text-2xl font-semibold text-[rgb(var(--ec-page-text))]">Messages for this {collection.slice(0, -1)}</h2>
396
417
  <div>
397
418
  {shouldRenderSends && (
398
419
  <div>
@@ -622,7 +622,7 @@ const NodeGraphBuilder = ({
622
622
  <div className="relative group">
623
623
  <button
624
624
  onClick={() => setIsSettingsOpen(!isSettingsOpen)}
625
- className="py-2.5 px-3 bg-white rounded-md shadow-md hover:bg-purple-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500"
625
+ className="py-2.5 px-3 bg-white rounded-md shadow-md hover:bg-[rgb(var(--ec-accent-subtle))] focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))]"
626
626
  aria-label="Open settings"
627
627
  >
628
628
  <CogIcon className="h-5 w-5 text-gray-600" />
@@ -634,12 +634,14 @@ const NodeGraphBuilder = ({
634
634
  <div className="relative group">
635
635
  <button
636
636
  onClick={toggleFullScreen}
637
- className={`py-2.5 px-3 bg-white rounded-md shadow-md hover:bg-purple-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 ${
638
- isFullscreen ? 'bg-purple-50 text-purple-600' : ''
637
+ className={`py-2.5 px-3 bg-white rounded-md shadow-md hover:bg-[rgb(var(--ec-accent-subtle))] focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] ${
638
+ isFullscreen ? 'bg-[rgb(var(--ec-accent-subtle))] text-[rgb(var(--ec-accent))]' : ''
639
639
  }`}
640
640
  aria-label={isFullscreen ? 'Exit presentation mode' : 'Enter presentation mode'}
641
641
  >
642
- <PresentationChartLineIcon className={`h-5 w-5 ${isFullscreen ? 'text-purple-600' : 'text-gray-600'}`} />
642
+ <PresentationChartLineIcon
643
+ className={`h-5 w-5 ${isFullscreen ? 'text-[rgb(var(--ec-accent))]' : 'text-gray-600'}`}
644
+ />
643
645
  </button>
644
646
  <div className="absolute top-full left-1/2 -translate-x-1/2 mt-2 px-2 py-1 bg-gray-900 text-white text-xs rounded shadow-lg opacity-0 group-hover:opacity-100 transition-opacity whitespace-nowrap pointer-events-none z-50">
645
647
  {isFullscreen ? 'Exit Presentation Mode' : 'Presentation Mode'}
@@ -667,7 +669,7 @@ const NodeGraphBuilder = ({
667
669
  <select
668
670
  value={links.find((link) => window.location.href.includes(link.url))?.url || links[0].url}
669
671
  onChange={(e) => navigate(e.target.value)}
670
- className="appearance-none pl-7 pr-6 py-0 text-[14px] bg-white rounded-md border border-gray-200 hover:bg-gray-100/50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500"
672
+ className="appearance-none pl-7 pr-6 py-0 text-[14px] bg-white rounded-md border border-gray-200 hover:bg-gray-100/50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))]"
671
673
  style={{ minWidth: 120, height: '26px' }}
672
674
  >
673
675
  {links.map((link) => (
@@ -699,8 +701,8 @@ const NodeGraphBuilder = ({
699
701
  id="message-animation-toggle"
700
702
  onClick={toggleAnimateMessages}
701
703
  className={`${
702
- animateMessages ? 'bg-purple-600' : 'bg-gray-200'
703
- } relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2`}
704
+ animateMessages ? 'bg-[rgb(var(--ec-accent))]' : 'bg-gray-200'
705
+ } relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2`}
704
706
  >
705
707
  <span
706
708
  className={`${
@@ -721,8 +723,8 @@ const NodeGraphBuilder = ({
721
723
  id="hide-channels-toggle"
722
724
  onClick={toggleChannelsVisibility}
723
725
  className={`${
724
- hideChannels ? 'bg-purple-600' : 'bg-gray-200'
725
- } relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2`}
726
+ hideChannels ? 'bg-[rgb(var(--ec-accent))]' : 'bg-gray-200'
727
+ } relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2`}
726
728
  >
727
729
  <span
728
730
  className={`${
@@ -737,7 +739,7 @@ const NodeGraphBuilder = ({
737
739
  <div className="pt-4 border-t border-gray-200 space-y-2">
738
740
  <button
739
741
  onClick={openStudioModal}
740
- className="w-full flex items-center justify-center space-x-2 px-4 py-2 bg-black hover:bg-gray-800 text-white text-sm font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 transition-colors"
742
+ className="w-full flex items-center justify-center space-x-2 px-4 py-2 bg-black hover:bg-gray-800 text-white text-sm font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 transition-colors"
741
743
  >
742
744
  <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
743
745
  <path
@@ -751,7 +753,7 @@ const NodeGraphBuilder = ({
751
753
  </button>
752
754
  <button
753
755
  onClick={handleExportVisual}
754
- className="w-full flex items-center justify-center border border-gray-200 space-x-2 px-4 py-2 bg-white text-gray-800 text-sm font-medium rounded-md hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2"
756
+ className="w-full flex items-center justify-center border border-gray-200 space-x-2 px-4 py-2 bg-white text-gray-800 text-sm font-medium rounded-md hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2"
755
757
  >
756
758
  <DocumentArrowDownIcon className="w-4 h-4" />
757
759
  <span>Export as png</span>
@@ -780,7 +782,7 @@ const NodeGraphBuilder = ({
780
782
  {Object.entries(legend).map(([key, { count, colorClass, groupId }]) => (
781
783
  <li
782
784
  key={key}
783
- className="flex space-x-2 items-center text-[10px] cursor-pointer hover:text-purple-600 hover:underline"
785
+ className="flex space-x-2 items-center text-[10px] cursor-pointer hover:text-[rgb(var(--ec-accent))] hover:underline"
784
786
  onClick={() => handleLegendClick(key, groupId)}
785
787
  >
786
788
  <span className={`w-2 h-2 block ${colorClass}`} />