@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
@@ -25,13 +25,13 @@ export const columns = (tableConfiguration: TableConfiguration) => [
25
25
  const user = info.row.original;
26
26
  return (
27
27
  <a href={buildUrl(`/docs/${user.collection}/${user.data.id}`)} className="group inline-flex items-center">
28
- <span className="inline-flex items-center rounded-md border border-gray-200 bg-white hover:border-purple-300 hover:bg-purple-50 transition-colors">
29
- <span className="flex items-center justify-center w-6 h-6 bg-purple-500 rounded-l-md">
28
+ <span className="inline-flex items-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] hover:border-[rgb(var(--ec-accent))] hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors">
29
+ <span className="flex items-center justify-center w-6 h-6 bg-[rgb(var(--ec-accent))] rounded-l-md">
30
30
  <User className="h-3 w-3 text-white" />
31
31
  </span>
32
- <span className="px-2 py-1 text-xs text-gray-700 group-hover:text-gray-900">
32
+ <span className="px-2 py-1 text-xs text-[rgb(var(--ec-page-text))] group-hover:text-[rgb(var(--ec-page-text))]">
33
33
  {user.data.name}
34
- {user.data.role && <span className="text-gray-400 ml-1">({user.data.role})</span>}
34
+ {user.data.role && <span className="text-[rgb(var(--ec-icon-color))] ml-1">({user.data.role})</span>}
35
35
  </span>
36
36
  </span>
37
37
  </a>
@@ -65,7 +65,7 @@ export const columns = (tableConfiguration: TableConfiguration) => [
65
65
 
66
66
  if (messages?.length === 0 || !messages)
67
67
  return (
68
- <span className="inline-flex items-center px-2 py-1 text-xs text-gray-400 bg-gray-50 rounded-md border border-gray-100">
68
+ <span className="inline-flex items-center px-2 py-1 text-xs text-[rgb(var(--ec-icon-color))] bg-[rgb(var(--ec-content-hover))] rounded-md border border-[rgb(var(--ec-page-border))]">
69
69
  No messages
70
70
  </span>
71
71
  );
@@ -84,21 +84,24 @@ export const columns = (tableConfiguration: TableConfiguration) => [
84
84
  className="group inline-flex items-center"
85
85
  >
86
86
  <span
87
- className={`inline-flex items-center rounded-md border border-gray-200 bg-white hover:border-${color}-300 hover:bg-${color}-50 transition-colors`}
87
+ className={`inline-flex items-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] hover:border-${color}-400 dark:hover:border-${color}-500 hover:bg-${color}-50 dark:hover:bg-${color}-500/10 transition-colors`}
88
88
  >
89
89
  <span className={`flex items-center justify-center w-6 h-6 bg-${color}-500 rounded-l-md`}>
90
90
  <Icon className="h-3 w-3 text-white" />
91
91
  </span>
92
- <span className="px-2 py-1 text-xs text-gray-700 group-hover:text-gray-900">
92
+ <span className="px-2 py-1 text-xs text-[rgb(var(--ec-page-text))] group-hover:text-[rgb(var(--ec-page-text))]">
93
93
  {message.data.name}
94
- <span className="text-gray-400 ml-1">v{message.data.version}</span>
94
+ <span className="text-[rgb(var(--ec-icon-color))] ml-1">v{message.data.version}</span>
95
95
  </span>
96
96
  </span>
97
97
  </a>
98
98
  );
99
99
  })}
100
100
  {hiddenCount > 0 && (
101
- <button onClick={() => setIsExpanded(!isExpanded)} className="text-xs text-gray-500 hover:text-gray-700 text-left">
101
+ <button
102
+ onClick={() => setIsExpanded(!isExpanded)}
103
+ className="text-xs text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-page-text))] text-left"
104
+ >
102
105
  {isExpanded ? 'Show less' : `+${hiddenCount} more`}
103
106
  </button>
104
107
  )}
@@ -121,7 +124,7 @@ export const columns = (tableConfiguration: TableConfiguration) => [
121
124
 
122
125
  if (services?.length === 0 || !services)
123
126
  return (
124
- <span className="inline-flex items-center px-2 py-1 text-xs text-gray-400 bg-gray-50 rounded-md border border-gray-100">
127
+ <span className="inline-flex items-center px-2 py-1 text-xs text-[rgb(var(--ec-icon-color))] bg-[rgb(var(--ec-content-hover))] rounded-md border border-[rgb(var(--ec-page-border))]">
125
128
  No services
126
129
  </span>
127
130
  );
@@ -137,19 +140,22 @@ export const columns = (tableConfiguration: TableConfiguration) => [
137
140
  href={buildUrl(`/docs/${service.collection}/${service.data.id}/${service.data.version}`)}
138
141
  className="group inline-flex items-center"
139
142
  >
140
- <span className="inline-flex items-center rounded-md border border-gray-200 bg-white hover:border-pink-300 hover:bg-pink-50 transition-colors">
143
+ <span className="inline-flex items-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] hover:border-pink-400 dark:hover:border-pink-500 hover:bg-pink-50 dark:hover:bg-pink-500/10 transition-colors">
141
144
  <span className="flex items-center justify-center w-6 h-6 bg-pink-500 rounded-l-md">
142
145
  <ServerIcon className="h-3 w-3 text-white" />
143
146
  </span>
144
- <span className="px-2 py-1 text-xs text-gray-700 group-hover:text-gray-900">
147
+ <span className="px-2 py-1 text-xs text-[rgb(var(--ec-page-text))] group-hover:text-[rgb(var(--ec-page-text))]">
145
148
  {service.data.name}
146
- <span className="text-gray-400 ml-1">v{service.data.version}</span>
149
+ <span className="text-[rgb(var(--ec-icon-color))] ml-1">v{service.data.version}</span>
147
150
  </span>
148
151
  </span>
149
152
  </a>
150
153
  ))}
151
154
  {hiddenCount > 0 && (
152
- <button onClick={() => setIsExpanded(!isExpanded)} className="text-xs text-gray-500 hover:text-gray-700 text-left">
155
+ <button
156
+ onClick={() => setIsExpanded(!isExpanded)}
157
+ className="text-xs text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-page-text))] text-left"
158
+ >
153
159
  {isExpanded ? 'Show less' : `+${hiddenCount} more`}
154
160
  </button>
155
161
  )}
@@ -174,7 +180,7 @@ export const columns = (tableConfiguration: TableConfiguration) => [
174
180
 
175
181
  if (teams?.length === 0 || !teams)
176
182
  return (
177
- <span className="inline-flex items-center px-2 py-1 text-xs text-gray-400 bg-gray-50 rounded-md border border-gray-100">
183
+ <span className="inline-flex items-center px-2 py-1 text-xs text-[rgb(var(--ec-icon-color))] bg-[rgb(var(--ec-content-hover))] rounded-md border border-[rgb(var(--ec-page-border))]">
178
184
  No teams
179
185
  </span>
180
186
  );
@@ -190,16 +196,21 @@ export const columns = (tableConfiguration: TableConfiguration) => [
190
196
  href={buildUrl(`/docs/teams/${team.data.id}`)}
191
197
  className="group inline-flex items-center"
192
198
  >
193
- <span className="inline-flex items-center rounded-md border border-gray-200 bg-white hover:border-pink-300 hover:bg-pink-50 transition-colors">
199
+ <span className="inline-flex items-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] hover:border-pink-400 dark:hover:border-pink-500 hover:bg-pink-50 dark:hover:bg-pink-500/10 transition-colors">
194
200
  <span className="flex items-center justify-center w-6 h-6 bg-pink-500 rounded-l-md">
195
201
  <Users className="h-3 w-3 text-white" />
196
202
  </span>
197
- <span className="px-2 py-1 text-xs text-gray-700 group-hover:text-gray-900">{team.data.name}</span>
203
+ <span className="px-2 py-1 text-xs text-[rgb(var(--ec-page-text))] group-hover:text-[rgb(var(--ec-page-text))]">
204
+ {team.data.name}
205
+ </span>
198
206
  </span>
199
207
  </a>
200
208
  ))}
201
209
  {hiddenCount > 0 && (
202
- <button onClick={() => setIsExpanded(!isExpanded)} className="text-xs text-gray-500 hover:text-gray-700 text-left">
210
+ <button
211
+ onClick={() => setIsExpanded(!isExpanded)}
212
+ className="text-xs text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-page-text))] text-left"
213
+ >
203
214
  {isExpanded ? 'Show less' : `+${hiddenCount} more`}
204
215
  </button>
205
216
  )}
@@ -216,7 +227,7 @@ export const columns = (tableConfiguration: TableConfiguration) => [
216
227
  const item = info.row.original;
217
228
  return (
218
229
  <a
219
- className="inline-flex items-center px-2.5 py-1 text-xs font-medium text-gray-600 bg-gray-50 border border-gray-200 rounded-md hover:bg-gray-100 hover:text-gray-900 transition-colors whitespace-nowrap"
230
+ className="inline-flex items-center px-2.5 py-1 text-xs font-medium text-[rgb(var(--ec-page-text-muted))] bg-[rgb(var(--ec-content-hover))] border border-[rgb(var(--ec-page-border))] rounded-md hover:bg-[rgb(var(--ec-content-hover))] hover:text-[rgb(var(--ec-page-text))] transition-colors whitespace-nowrap"
220
231
  href={buildUrl(`/docs/${item.collection}/${item.data.id}`)}
221
232
  >
222
233
  View profile
@@ -0,0 +1,18 @@
1
+ import { useStore } from '@nanostores/react';
2
+ import { Moon, Sun } from 'lucide-react';
3
+ import { themeStore, toggleTheme } from '@stores/theme-store';
4
+
5
+ export default function ThemeToggle() {
6
+ const theme = useStore(themeStore);
7
+
8
+ return (
9
+ <button
10
+ onClick={toggleTheme}
11
+ className="p-2 rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-icon-hover))] hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors"
12
+ aria-label={`Switch to ${theme === 'light' ? 'dark' : 'light'} mode`}
13
+ title={`Switch to ${theme === 'light' ? 'dark' : 'light'} mode`}
14
+ >
15
+ {theme === 'light' ? <Moon className="w-5 h-5" /> : <Sun className="w-5 h-5" />}
16
+ </button>
17
+ );
18
+ }
@@ -28,7 +28,10 @@ try {
28
28
  model = await providerConfiguration.default();
29
29
  modelConfiguration = providerConfiguration.configuration || defaultConfiguration;
30
30
  hasChatConfiguration = true;
31
- extendedTools = providerConfiguration.tools || {};
31
+
32
+ if (isEventCatalogScaleEnabled()) {
33
+ extendedTools = providerConfiguration.tools || {};
34
+ }
32
35
  } catch (error) {
33
36
  console.error('[Chat] Error loading chat configuration', error);
34
37
  hasChatConfiguration = false;
@@ -111,12 +114,14 @@ When responding:
111
114
  5. Don't provide code examples unless specifically requested.
112
115
  6. When you refer to a resource in EventCatalog, try and create a link to the resource in the response
113
116
  - Example, if you return a message in the text, rather than than just the id or version you should return a markdown link to the resource e.g [MyEvent - 1.0.0](/docs/events/MyEvent/1.0.0)
114
- - NEVER return "latest" in the markdown link, always use the specific version
117
+ - CRITICAL: NEVER use "latest" in any URL or link. Always use the actual semantic version number (e.g., 1.0.0, 2.1.3). The word "latest" is not a valid version and will result in broken links.
115
118
  - The link options are:
116
119
  - If you want to get the documentation for a resource use the /docs/ prefix (e.g /docs/{collection}/{id}/{version})
117
120
  - If you want to let the user know they can visualize a resource use the /visualiser/ prefix (e.g /visualiser/{collection}/{id}/{version})
118
121
  - If you want to let the user know they can see the architecture of a resource use the /architecture/ prefix (e.g /architecture/{collection}/{id}/{version})
122
+ - If you don't know the version, use the getResource tool to fetch the resource and get the actual version number before creating the link.
119
123
  7. When you return a schema, use code blocks to render the schema to the user too, for example if the schema is in JSON format use \`\`\`json and if the schema is in YAML format use \`\`\`yaml
124
+ 8. IMPORTANT: After answering each question, ALWAYS use the suggestFollowUpQuestions tool to suggest 2-3 relevant follow-up questions the user might want to ask next. These should be contextual to the conversation and help the user explore related topics.
120
125
 
121
126
  If you have additional context, use it to answer the question.`;
122
127
 
@@ -171,7 +176,7 @@ export const POST = async ({ request }: APIContext<{ question: string; messages:
171
176
  const result = await streamText({
172
177
  model,
173
178
  system: getBaseSystemPrompt(referrer ?? ''),
174
- messages: convertToModelMessages(messages) as ModelMessage[],
179
+ messages: await convertToModelMessages(messages),
175
180
  temperature: modelConfiguration?.temperature ?? 0.7,
176
181
  stopWhen: stepCountIs(5),
177
182
  // maxTokens: 4000, // Increased to handle large tool results
@@ -320,6 +325,22 @@ export const POST = async ({ request }: APIContext<{ question: string; messages:
320
325
  return [];
321
326
  },
322
327
  }),
328
+ suggestFollowUpQuestions: tool({
329
+ description:
330
+ 'Use this tool after answering a question to suggest 2-3 relevant follow-up questions the user might want to ask. These will be displayed as clickable suggestions.',
331
+ inputSchema: z.object({
332
+ questions: z
333
+ .array(z.string())
334
+ .min(1)
335
+ .max(3)
336
+ .describe('Array of 2-3 follow-up questions relevant to the conversation'),
337
+ }),
338
+ execute: async ({ questions }) => {
339
+ // This tool doesn't need to do anything - it just returns the questions
340
+ // which will be captured by the UI
341
+ return { suggestions: questions };
342
+ },
343
+ }),
323
344
  ...extendedTools,
324
345
  },
325
346
  });
@@ -28,7 +28,7 @@ const NestedItem: React.FC<NestedItemProps> = ({
28
28
  <div className="py-1">
29
29
  <div className="flex items-center">
30
30
  <button
31
- className="p-1 hover:bg-gray-100 rounded-md flex-shrink-0"
31
+ className="p-1 hover:bg-[rgb(var(--ec-content-hover))] rounded-md flex-shrink-0"
32
32
  onClick={(e) => {
33
33
  e.stopPropagation();
34
34
  toggleGroupCollapse(`nested-${itemId}`);
@@ -43,14 +43,14 @@ const NestedItem: React.FC<NestedItemProps> = ({
43
43
  stroke="currentColor"
44
44
  aria-hidden="true"
45
45
  data-slot="icon"
46
- className="h-3 w-3 text-gray-500"
46
+ className="h-3 w-3 text-[rgb(var(--ec-icon-color))]"
47
47
  >
48
48
  <path strokeLinecap="round" strokeLinejoin="round" d="m19.5 8.25-7.5 7.5-7.5-7.5"></path>
49
49
  </svg>
50
50
  </div>
51
51
  </button>
52
52
  <button
53
- className="flex items-center px-2 py-1 text-xs font-medium text-gray-700 rounded-md hover:bg-purple-50 min-w-0 flex-1"
53
+ className="flex items-center px-2 py-1 text-xs font-medium text-[rgb(var(--ec-page-text-muted))] rounded-md hover:bg-[rgb(var(--ec-content-hover))] min-w-0 flex-1"
54
54
  onClick={(e) => {
55
55
  e.stopPropagation();
56
56
  toggleGroupCollapse(`nested-${itemId}`);
@@ -59,7 +59,11 @@ const NestedItem: React.FC<NestedItemProps> = ({
59
59
  <span className="truncate">{item.label}</span>
60
60
  {item.badge && item?.badge?.text && (
61
61
  <span
62
- className={`text-${item.badge.color || 'purple'}-600 ml-2 text-[10px] font-medium bg-${item.badge.color || 'purple'}-50 px-2 py-0.5 rounded uppercase`}
62
+ className={
63
+ item.badge.color
64
+ ? `text-${item.badge.color}-600 dark:text-${item.badge.color}-400 ml-2 text-[10px] font-medium bg-${item.badge.color}-50 dark:bg-${item.badge.color}-500/20 px-2 py-0.5 rounded uppercase`
65
+ : `text-[rgb(var(--ec-accent))] ml-2 text-[10px] font-medium bg-[rgb(var(--ec-accent-subtle))] px-2 py-0.5 rounded uppercase`
66
+ }
63
67
  >
64
68
  {item.badge.text}
65
69
  </span>
@@ -72,7 +76,7 @@ const NestedItem: React.FC<NestedItemProps> = ({
72
76
  collapsedGroups[`nested-${itemId}`] ? 'h-0' : 'h-auto'
73
77
  }`}
74
78
  >
75
- <div className="space-y-0.5 border-gray-200/80 border-l pl-4 ml-[9px] mt-1">
79
+ <div className="space-y-0.5 border-[rgb(var(--ec-page-border))] border-l pl-4 ml-[9px] mt-1">
76
80
  {item.items.map((nestedItem: SidebarItem, nestedIndex: number) => (
77
81
  <NestedItem
78
82
  key={`nested-${itemId}-${nestedIndex}`}
@@ -121,7 +125,7 @@ const NestedItem: React.FC<NestedItemProps> = ({
121
125
  <a
122
126
  href={itemPath}
123
127
  {...(attrs || {})}
124
- className={`flex items-center px-2 py-1.5 text-xs ${isActive ? 'bg-purple-100 text-purple-900 font-medium' : 'text-gray-600 hover:bg-purple-100'} rounded-md`}
128
+ className={`flex items-center px-2 py-1.5 text-xs ${isActive ? 'bg-[rgb(var(--ec-accent-subtle))] text-[rgb(var(--ec-page-text))] font-semibold' : 'text-[rgb(var(--ec-page-text-muted))] hover:bg-[rgb(var(--ec-content-hover))]'} rounded-md`}
125
129
  data-active={isActive}
126
130
  target={isExternalLink ? '_blank' : undefined}
127
131
  >
@@ -131,7 +135,11 @@ const NestedItem: React.FC<NestedItemProps> = ({
131
135
  </span>
132
136
  {item.badge && item?.badge?.text && (
133
137
  <span
134
- className={`text-${item.badge.color || 'purple'}-600 ml-2 text-[10px] font-medium bg-${item.badge.color || 'purple'}-50 px-2 py-0.5 rounded uppercase`}
138
+ className={
139
+ item.badge.color
140
+ ? `text-${item.badge.color}-600 dark:text-${item.badge.color}-400 ml-2 text-[10px] font-medium bg-${item.badge.color}-50 dark:bg-${item.badge.color}-500/20 px-2 py-0.5 rounded uppercase`
141
+ : `text-[rgb(var(--ec-accent))] ml-2 text-[10px] font-medium bg-[rgb(var(--ec-accent-subtle))] px-2 py-0.5 rounded uppercase`
142
+ }
135
143
  >
136
144
  {item.badge.text}
137
145
  </span>
@@ -6,8 +6,8 @@ interface NoResultsFoundProps {
6
6
 
7
7
  const NoResultsFound: React.FC<NoResultsFoundProps> = ({ searchTerm }) => (
8
8
  <div className="px-4 py-6 text-center">
9
- <div className="text-gray-400 text-sm mb-2">No results found for "{searchTerm}"</div>
10
- <div className="text-gray-400 text-xs">
9
+ <div className="text-[rgb(var(--ec-page-text-muted))] text-sm mb-2">No results found for "{searchTerm}"</div>
10
+ <div className="text-[rgb(var(--ec-page-text-muted))] text-xs">
11
11
  Try:
12
12
  <ul className="mt-2 space-y-1 text-left list-disc pl-4">
13
13
  <li>Checking for typos</li>
@@ -197,31 +197,31 @@ const CustomDocsNav: React.FC<CustomDocsNavProps> = ({ sidebarItems }) => {
197
197
  const hasNoResults = debouncedSearchTerm && filteredSidebarItems.length === 0;
198
198
 
199
199
  return (
200
- <nav ref={navRef} className="h-full text-gray-800 pt-4 overflow-y-auto">
201
- <div className="mb-2 px-3 bg-white z-10">
200
+ <nav ref={navRef} className="h-full text-[rgb(var(--ec-page-text))] pt-4 overflow-y-auto">
201
+ <div className="mb-2 px-3 bg-[rgb(var(--ec-page-bg))] z-10">
202
202
  <div className="flex gap-2">
203
203
  <input
204
204
  type="text"
205
205
  value={searchTerm}
206
206
  onChange={handleSearchChange}
207
207
  placeholder="Quick search..."
208
- className="flex-1 p-2 px-2 text-sm rounded-md border border-gray-200 h-[30px]"
208
+ className="flex-1 p-2 px-2 text-sm rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-input-bg))] text-[rgb(var(--ec-input-text))] placeholder:text-[rgb(var(--ec-input-placeholder))] h-[30px]"
209
209
  />
210
210
  <button
211
211
  onClick={toggleExpandCollapse}
212
212
  title={isExpanded ? 'Collapse All' : 'Expand All'}
213
- className="px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded-md border border-gray-200 h-[30px] flex items-center justify-center"
213
+ className="px-2 py-1 bg-[rgb(var(--ec-content-hover))] hover:bg-[rgb(var(--ec-content-active))] rounded-md border border-[rgb(var(--ec-page-border))] h-[30px] flex items-center justify-center"
214
214
  >
215
215
  {isExpanded ? (
216
- <ChevronDoubleUpIcon className="h-4 w-4 text-gray-600" />
216
+ <ChevronDoubleUpIcon className="h-4 w-4 text-[rgb(var(--ec-icon-color))]" />
217
217
  ) : (
218
- <ChevronDoubleDownIcon className="h-4 w-4 text-gray-600" />
218
+ <ChevronDoubleDownIcon className="h-4 w-4 text-[rgb(var(--ec-icon-color))]" />
219
219
  )}
220
220
  </button>
221
221
  </div>
222
222
  </div>
223
223
 
224
- <div className="space-y-2 divide-y divide-gray-100/40 pb-4">
224
+ <div className="space-y-2 divide-y divide-[rgb(var(--ec-page-border))] pb-4">
225
225
  {hasNoResults ? (
226
226
  <NoResultsFound searchTerm={debouncedSearchTerm} />
227
227
  ) : (
@@ -231,7 +231,7 @@ const CustomDocsNav: React.FC<CustomDocsNavProps> = ({ sidebarItems }) => {
231
231
  {section.items ? (
232
232
  <div className="flex items-center">
233
233
  <button
234
- className="p-1 hover:bg-gray-100 rounded-md flex-shrink-0"
234
+ className="p-1 hover:bg-[rgb(var(--ec-content-hover))] rounded-md flex-shrink-0"
235
235
  onClick={(e) => {
236
236
  e.stopPropagation();
237
237
  toggleGroupCollapse(`section-${index}`);
@@ -248,14 +248,14 @@ const CustomDocsNav: React.FC<CustomDocsNavProps> = ({ sidebarItems }) => {
248
248
  stroke="currentColor"
249
249
  aria-hidden="true"
250
250
  data-slot="icon"
251
- className="h-3 w-3 text-gray-500"
251
+ className="h-3 w-3 text-[rgb(var(--ec-icon-color))]"
252
252
  >
253
253
  <path strokeLinecap="round" strokeLinejoin="round" d="m19.5 8.25-7.5 7.5-7.5-7.5"></path>
254
254
  </svg>
255
255
  </div>
256
256
  </button>
257
257
  <button
258
- className="flex items-center justify-between px-2 py-0.5 text-xs font-bold rounded-md hover:bg-purple-50 min-w-0 flex-1"
258
+ className="flex items-center justify-between px-2 py-0.5 text-xs font-bold rounded-md hover:bg-[rgb(var(--ec-content-hover))] min-w-0 flex-1"
259
259
  onClick={(e) => {
260
260
  e.stopPropagation();
261
261
  toggleGroupCollapse(`section-${index}`);
@@ -264,7 +264,11 @@ const CustomDocsNav: React.FC<CustomDocsNavProps> = ({ sidebarItems }) => {
264
264
  <span className="truncate">{section.label}</span>
265
265
  {section.badge && section?.badge?.text && (
266
266
  <span
267
- className={`text-${section.badge.color || 'purple'}-600 ml-2 text-[10px] font-medium bg-${section.badge.color || 'purple'}-50 px-2 py-0.5 rounded uppercase`}
267
+ className={
268
+ section.badge.color
269
+ ? `text-${section.badge.color}-600 dark:text-${section.badge.color}-400 ml-2 text-[10px] font-medium bg-${section.badge.color}-50 dark:bg-${section.badge.color}-500/20 px-2 py-0.5 rounded uppercase`
270
+ : `text-[rgb(var(--ec-accent))] ml-2 text-[10px] font-medium bg-[rgb(var(--ec-accent-subtle))] px-2 py-0.5 rounded uppercase`
271
+ }
268
272
  >
269
273
  {section.badge.text}
270
274
  </span>
@@ -275,7 +279,7 @@ const CustomDocsNav: React.FC<CustomDocsNavProps> = ({ sidebarItems }) => {
275
279
  <div className="flex items-center">
276
280
  <span className="flex-grow flex items-center justify-between px-2 py-0.5 text-xs font-bold rounded-md">
277
281
  <span className="truncate">{section.label}</span>
278
- <span className="text-purple-600 ml-2 text-[10px] font-medium bg-purple-50 px-2 py-0.5 rounded uppercase">
282
+ <span className="text-[rgb(var(--ec-accent))] ml-2 text-[10px] font-medium bg-[rgb(var(--ec-accent-subtle))] px-2 py-0.5 rounded uppercase">
279
283
  Section
280
284
  </span>
281
285
  </span>
@@ -288,7 +292,7 @@ const CustomDocsNav: React.FC<CustomDocsNavProps> = ({ sidebarItems }) => {
288
292
  collapsedGroups[`section-${index}`] ? 'h-0' : 'h-auto'
289
293
  }`}
290
294
  >
291
- <div className="space-y-0.5 border-gray-200/80 border-l pl-4 ml-[9px] mt-1">
295
+ <div className="space-y-0.5 border-[rgb(var(--ec-page-border))] border-l pl-4 ml-[9px] mt-1">
292
296
  {section.items.map((item: SidebarItem, itemIndex: number) => (
293
297
  <NestedItem
294
298
  key={`item-${index}-${itemIndex}`}
@@ -309,8 +313,8 @@ const CustomDocsNav: React.FC<CustomDocsNavProps> = ({ sidebarItems }) => {
309
313
  href={buildUrl(`/docs/custom/${section.slug}`)}
310
314
  className={`flex items-center px-2 py-1.5 text-xs ${
311
315
  currentPath.endsWith(`/${section.slug}`)
312
- ? 'bg-purple-100 text-purple-900 font-medium'
313
- : 'text-gray-600 hover:bg-purple-100'
316
+ ? 'bg-[rgb(var(--ec-accent-subtle))] text-[rgb(var(--ec-page-text))] font-semibold'
317
+ : 'text-[rgb(var(--ec-page-text-muted))] hover:bg-[rgb(var(--ec-content-hover))]'
314
318
  } rounded-md ml-6`}
315
319
  data-active={currentPath.endsWith(`/${section.slug}`)}
316
320
  >
@@ -83,7 +83,9 @@ const badges = doc?.badges || [];
83
83
  <VerticalSideBarLayout title={doc.title || 'Documentation'} showNestedSideBar={false}>
84
84
  <div class="flex w-full" data-pagefind-body data-pagefind-meta={`title:${doc.title}`}>
85
85
  <!-- Left Sidebar Navigation -->
86
- <aside class="sidebar-transition overflow-y-auto bg-white border-r border-gray-100 w-80 fixed top-16 bottom-0 z-10">
86
+ <aside
87
+ class="sidebar-transition overflow-y-auto bg-[rgb(var(--ec-page-bg))] border-r border-[rgb(var(--ec-page-border))] w-80 fixed top-16 bottom-0 z-10"
88
+ >
87
89
  <CustomDocsNav />
88
90
  </aside>
89
91
 
@@ -92,10 +94,10 @@ const badges = doc?.badges || [];
92
94
  class="sidebar-transition w-full max-h-content ml-[22em] md:ml-[21em] lg:mr-2 2xl:mr-2 2xl:ml-[22em] pr-2 overflow-y-auto"
93
95
  >
94
96
  <div class="max-w-none mx-auto px-4 py-10">
95
- <div class="border-b border-gray-200 flex justify-between items-start md:pb-6">
97
+ <div class="border-b border-[rgb(var(--ec-page-border))] flex justify-between items-start md:pb-6">
96
98
  <div>
97
- <h2 id="doc-page-header" class="text-2xl md:text-4xl font-bold text-black">{doc.title}</h2>
98
- <p class="text-lg pt-2 text-gray-500 font-light">{doc.summary}</p>
99
+ <h2 id="doc-page-header" class="text-2xl md:text-4xl font-bold text-[rgb(var(--ec-page-text))]">{doc.title}</h2>
100
+ <p class="text-lg pt-2 text-[rgb(var(--ec-page-text-muted))] font-light">{doc.summary}</p>
99
101
  {
100
102
  badges && (
101
103
  <div class="flex flex-wrap pt-4">
@@ -148,16 +150,18 @@ const badges = doc?.badges || [];
148
150
  }
149
151
 
150
152
  <!-- Previous / Next Navigation -->
151
- <div class="py-8 border-t border-gray-200 mt-8">
153
+ <div class="py-8 border-t border-[rgb(var(--ec-page-border))] mt-8">
152
154
  <div class="flex flex-col sm:flex-row justify-between w-full gap-4">
153
155
  {
154
156
  prev && (
155
157
  <a
156
158
  href={buildUrl(`/docs/custom/${prev.slug}`)}
157
- class="group flex flex-col border border-gray-200 rounded-lg p-4 hover:border-gray-300 hover:bg-gray-50 transition-colors w-full sm:w-1/2"
159
+ class="group flex flex-col border border-[rgb(var(--ec-page-border))] rounded-lg p-4 hover:border-[rgb(var(--ec-content-text-muted))] hover:bg-[rgb(var(--ec-content-hover))] transition-colors w-full sm:w-1/2"
158
160
  >
159
- <span class="text-sm text-gray-500 mb-1">Previous</span>
160
- <span class="font-medium group-hover:text-primary-600 transition-colors">{prev.label}</span>
161
+ <span class="text-sm text-[rgb(var(--ec-page-text-muted))] mb-1">Previous</span>
162
+ <span class="font-medium text-[rgb(var(--ec-page-text))] group-hover:text-primary-600 transition-colors">
163
+ {prev.label}
164
+ </span>
161
165
  </a>
162
166
  )
163
167
  }
@@ -168,10 +172,12 @@ const badges = doc?.badges || [];
168
172
  next && (
169
173
  <a
170
174
  href={buildUrl(`/docs/custom/${next.slug}`)}
171
- class="group flex flex-col items-end text-right border border-gray-200 rounded-lg p-4 hover:border-gray-300 hover:bg-gray-50 transition-colors w-full sm:w-1/2"
175
+ class="group flex flex-col items-end text-right border border-[rgb(var(--ec-page-border))] rounded-lg p-4 hover:border-[rgb(var(--ec-content-text-muted))] hover:bg-[rgb(var(--ec-content-hover))] transition-colors w-full sm:w-1/2"
172
176
  >
173
- <span class="text-sm text-gray-500 mb-1">Next</span>
174
- <span class="font-medium group-hover:text-primary-600 transition-colors">{next.label}</span>
177
+ <span class="text-sm text-[rgb(var(--ec-page-text-muted))] mb-1">Next</span>
178
+ <span class="font-medium text-[rgb(var(--ec-page-text))] group-hover:text-primary-600 transition-colors">
179
+ {next.label}
180
+ </span>
175
181
  </a>
176
182
  )
177
183
  }
@@ -182,7 +188,7 @@ const badges = doc?.badges || [];
182
188
 
183
189
  <!-- Right Sidebar TOC -->
184
190
  <aside
185
- class="hidden lg:block sticky top-0 pb-10 w-80 overflow-y-auto border-l border-gray-100 bg-white p-6 flex-shrink-0 py-2"
191
+ class="hidden lg:block sticky top-0 pb-10 w-80 overflow-y-auto border-l border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg))] p-6 flex-shrink-0 py-2"
186
192
  >
187
193
  <div class="py-4">
188
194
  <div>
@@ -197,7 +203,7 @@ const badges = doc?.badges || [];
197
203
  )
198
204
  }
199
205
  </div>
200
- <h3 class="text-sm text-black font-semibold group-data-[hover]:text-black/80 capitalize flex items-center gap-2">
206
+ <h3 class="text-sm text-[rgb(var(--ec-page-text))] font-semibold capitalize flex items-center gap-2">
201
207
  <AlignLeftIcon className="w-4 h-4" />
202
208
  On this page
203
209
  </h3>
@@ -210,7 +216,7 @@ const badges = doc?.badges || [];
210
216
  return (
211
217
  <a
212
218
  href={`#${heading.slug}`}
213
- class={`block text-[12px] py-0.5 ${heading.depth === 1 ? 'font-light' : ''} text-gray-400 hover:text-primary-600`}
219
+ class={`block text-[12px] py-0.5 ${heading.depth === 1 ? 'font-light' : ''} text-[rgb(var(--ec-page-text-muted))] hover:text-primary-600`}
214
220
  style={`padding-left: ${(heading.depth - 1) * 8}px`}
215
221
  >
216
222
  {heading.text}
@@ -235,6 +241,11 @@ const badges = doc?.badges || [];
235
241
  margin: 0;
236
242
  /* width: 100px !important; */
237
243
  }
244
+
245
+ /* TOC active state - uses accent CSS variable */
246
+ .toc-active-text {
247
+ color: rgb(var(--ec-accent));
248
+ }
238
249
  </style>
239
250
 
240
251
  <script define:vars={{ props, config }}>
@@ -262,14 +273,14 @@ const badges = doc?.badges || [];
262
273
  function highlightTocItem(id: string) {
263
274
  // Remove active class from all links
264
275
  document.querySelectorAll('.active-toc-item').forEach((link) => {
265
- link.classList.remove('active-toc-item', 'text-purple-600', 'font-light');
276
+ link.classList.remove('active-toc-item', 'toc-active-text', 'font-light');
266
277
  link.classList.add('text-gray-400');
267
278
  });
268
279
 
269
280
  // Add active class to current link
270
281
  const tocLink = document.querySelector(`nav a[href="#${id}"]`);
271
282
  if (tocLink) {
272
- tocLink.classList.add('active-toc-item', 'text-purple-600', 'font-light');
283
+ tocLink.classList.add('active-toc-item', 'toc-active-text', 'font-light');
273
284
  tocLink.classList.remove('text-gray-400');
274
285
 
275
286
  // Scroll the highlighted item into view with a small delay to ensure DOM updates first
@@ -389,6 +400,27 @@ const badges = doc?.badges || [];
389
400
  }
390
401
  }
391
402
 
403
+ // Detect current theme from data-theme attribute
404
+ const isDarkMode = document.documentElement.getAttribute('data-theme') === 'dark';
405
+ const currentTheme = isDarkMode ? 'dark' : 'default';
406
+
407
+ // Custom theme variables for better readability in dark mode
408
+ const darkThemeVariables = {
409
+ // Sequence diagram - improve text contrast
410
+ signalColor: '#f0f6fc',
411
+ signalTextColor: '#f0f6fc',
412
+ actorTextColor: '#0d1117',
413
+ actorBkg: '#f0f6fc',
414
+ actorBorder: '#484f58',
415
+ actorLineColor: '#6b7280',
416
+ // General text colors
417
+ primaryTextColor: '#f0f6fc',
418
+ secondaryTextColor: '#c9d1d9',
419
+ tertiaryTextColor: '#f0f6fc',
420
+ // Line colors
421
+ lineColor: '#6b7280',
422
+ };
423
+
392
424
  mermaid.initialize({
393
425
  // fontSize: 2,
394
426
  flowchart: {
@@ -399,7 +431,8 @@ const badges = doc?.badges || [];
399
431
  startOnLoad: false,
400
432
  fontFamily: 'var(--sans-font)',
401
433
  // @ts-ignore This works, but TS expects a enum for some reason
402
- theme: 'light',
434
+ theme: currentTheme,
435
+ themeVariables: isDarkMode ? darkThemeVariables : undefined,
403
436
  architecture: {
404
437
  useMaxWidth: true,
405
438
  },
@@ -49,10 +49,10 @@ const tabs = [
49
49
  ---
50
50
 
51
51
  <VerticalSideBarLayout title={`Explore | ${title}`} showNestedSideBar={false}>
52
- <main class="ml-0">
52
+ <main class="ml-0 bg-[rgb(var(--ec-page-bg))]">
53
53
  <div id="discover-collection-tabs">
54
54
  <div class="hidden sm:block">
55
- <div class="border-b border-gray-200">
55
+ <div class="border-b border-[rgb(var(--ec-page-border))]">
56
56
  <nav class="flex space-x-8 -mb-0.5 pl-6" aria-label="Tabs">
57
57
  {
58
58
  tabs
@@ -60,11 +60,16 @@ const tabs = [
60
60
  .map((tab) => (
61
61
  <a
62
62
  href={tab.href}
63
- class={` text-black group inline-flex items-center py-4 px-1 text-sm font-light ${tab.isActive ? `border-${tab.activeColor}-500 border-b-[2px] text-${tab.activeColor}-500` : 'opacity-80'} ${!tab.enabled ? 'disabled' : ''}`}
63
+ class:list={[
64
+ 'group inline-flex items-center py-4 px-1 text-sm font-light text-[rgb(var(--ec-page-text))]',
65
+ tab.isActive && 'border-b-[2px] border-[rgb(var(--ec-accent))] text-[rgb(var(--ec-accent))]',
66
+ !tab.isActive && 'opacity-70 hover:opacity-100',
67
+ !tab.enabled && 'disabled',
68
+ ]}
64
69
  aria-current="page"
65
70
  >
66
71
  <tab.icon
67
- className={`w-6 h-6 -ml-0.5 mr-2 ${tab.isActive ? `text-${tab.activeColor}-500` : 'text-gray-500'}`}
72
+ className={`w-6 h-6 -ml-0.5 mr-2 ${tab.isActive ? 'text-[rgb(var(--ec-accent))]' : 'text-[rgb(var(--ec-icon-color))]'}`}
68
73
  />
69
74
  <span>{tab.label}</span>
70
75
  </a>
@@ -80,8 +85,8 @@ const tabs = [
80
85
  <div>
81
86
  <div class="sm:flex sm:items-end py-4 pb-4" id="discover-title">
82
87
  <div class="sm:flex-auto space-y-2">
83
- <h1 class="text-4xl font-semibold text-gray-900 capitalize">{title}</h1>
84
- <p class="text-md text-gray-700">{subtitle}</p>
88
+ <h1 class="text-4xl font-semibold text-[rgb(var(--ec-page-text))] capitalize">{title}</h1>
89
+ <p class="text-md text-[rgb(var(--ec-page-text-muted))]">{subtitle}</p>
85
90
  </div>
86
91
  </div>
87
92
  <div class="mt-4 flow-root">