@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.
- package/dist/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +1 -1
- package/dist/analytics/log-build.js +3 -3
- package/dist/{chunk-VO5WYA44.js → chunk-AA47DJ43.js} +1 -1
- package/dist/{chunk-EKGR533N.js → chunk-GGRXP5WM.js} +1 -1
- package/dist/{chunk-E5Q7TZYT.js → chunk-L3QRQT7U.js} +1 -1
- package/dist/{chunk-BYP43AAT.js → chunk-RWYEP5SD.js} +1 -1
- package/dist/{chunk-KF5PARQK.js → chunk-VPQCMMRM.js} +1 -1
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog.cjs +1 -1
- package/dist/eventcatalog.config.d.cts +7 -0
- package/dist/eventcatalog.config.d.ts +7 -0
- package/dist/eventcatalog.js +5 -5
- package/dist/generate.cjs +1 -1
- package/dist/generate.js +3 -3
- package/dist/utils/cli-logger.cjs +1 -1
- package/dist/utils/cli-logger.js +2 -2
- package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +520 -247
- package/eventcatalog/src/components/ChatPanel/ChatPanelButton.tsx +3 -3
- package/eventcatalog/src/components/Checkbox.astro +7 -4
- package/eventcatalog/src/components/CopyAsMarkdown.tsx +15 -15
- package/eventcatalog/src/components/EnvironmentDropdown.tsx +15 -7
- package/eventcatalog/src/components/FavoriteButton.tsx +1 -1
- package/eventcatalog/src/components/Grids/DomainGrid.tsx +72 -60
- package/eventcatalog/src/components/Grids/MessageGrid.tsx +68 -48
- package/eventcatalog/src/components/Header.astro +15 -10
- package/eventcatalog/src/components/Lists/OwnersList.tsx +17 -10
- package/eventcatalog/src/components/Lists/PillListFlat.styles.css +12 -0
- package/eventcatalog/src/components/Lists/PillListFlat.tsx +15 -15
- package/eventcatalog/src/components/Lists/VersionList.astro +15 -5
- package/eventcatalog/src/components/MDX/Accordion/Accordion.tsx +3 -3
- package/eventcatalog/src/components/MDX/Admonition.tsx +49 -9
- package/eventcatalog/src/components/MDX/Attachments.astro +15 -11
- package/eventcatalog/src/components/MDX/ChannelInformation/ChannelInformation.tsx +29 -15
- package/eventcatalog/src/components/MDX/EntityPropertiesTable/EntityPropertiesTable.astro +20 -13
- package/eventcatalog/src/components/MDX/Link/Link.astro +1 -1
- package/eventcatalog/src/components/MDX/MessageTable/MessageTable.client.tsx +50 -29
- package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.tsx +14 -12
- package/eventcatalog/src/components/MDX/NodeGraph/StepWalkthrough.tsx +4 -4
- package/eventcatalog/src/components/MDX/NodeGraph/StudioModal.tsx +4 -4
- package/eventcatalog/src/components/MDX/NodeGraph/VisualiserSearch.tsx +2 -2
- package/eventcatalog/src/components/MDX/ResourceGroupTable/ResourceGroupTable.client.tsx +54 -33
- package/eventcatalog/src/components/MDX/ResourceLink/ResourceLink.astro +1 -1
- package/eventcatalog/src/components/MDX/Steps/Step.astro +2 -2
- package/eventcatalog/src/components/MDX/Steps/Steps.astro +3 -3
- package/eventcatalog/src/components/MDX/Tabs/Tabs.astro +13 -9
- package/eventcatalog/src/components/MDX/Tiles/Tile.astro +25 -13
- package/eventcatalog/src/components/MDX/Tiles/Tiles.astro +1 -1
- package/eventcatalog/src/components/SchemaExplorer/ApiAccessSection.tsx +3 -3
- package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +3 -3
- package/eventcatalog/src/components/SchemaExplorer/AvroSchemaViewer.tsx +29 -25
- package/eventcatalog/src/components/SchemaExplorer/DiffViewer.tsx +3 -3
- package/eventcatalog/src/components/SchemaExplorer/JSONSchemaViewer.tsx +61 -42
- package/eventcatalog/src/components/SchemaExplorer/OwnersSection.tsx +13 -9
- package/eventcatalog/src/components/SchemaExplorer/Pagination.tsx +6 -4
- package/eventcatalog/src/components/SchemaExplorer/ProducersConsumersSection.tsx +17 -13
- package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +35 -8
- package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsHeader.tsx +33 -21
- package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +1 -1
- package/eventcatalog/src/components/SchemaExplorer/SchemaExplorer.tsx +41 -33
- package/eventcatalog/src/components/SchemaExplorer/SchemaListItem.tsx +19 -7
- package/eventcatalog/src/components/SchemaExplorer/SchemaViewerModal.tsx +8 -8
- package/eventcatalog/src/components/Search/Search.astro +3 -3
- package/eventcatalog/src/components/Search/SearchModal.tsx +65 -36
- package/eventcatalog/src/components/SideNav/NestedSideBar/SearchBar.tsx +31 -21
- package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +92 -59
- package/eventcatalog/src/components/Tables/Table.tsx +25 -24
- package/eventcatalog/src/components/Tables/columns/ContainersTableColumns.tsx +22 -16
- package/eventcatalog/src/components/Tables/columns/DomainTableColumns.tsx +14 -11
- package/eventcatalog/src/components/Tables/columns/FlowTableColumns.tsx +6 -6
- package/eventcatalog/src/components/Tables/columns/MessageTableColumns.tsx +22 -16
- package/eventcatalog/src/components/Tables/columns/ServiceTableColumns.tsx +22 -16
- package/eventcatalog/src/components/Tables/columns/SharedColumns.tsx +4 -4
- package/eventcatalog/src/components/Tables/columns/TeamsTableColumns.tsx +21 -13
- package/eventcatalog/src/components/Tables/columns/UserTableColumns.tsx +30 -19
- package/eventcatalog/src/components/ThemeToggle.tsx +18 -0
- package/eventcatalog/src/enterprise/ai/chat-api.ts +24 -3
- package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/components/NestedItem.tsx +15 -7
- package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/components/NoResultsFound.tsx +2 -2
- package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/index.tsx +19 -15
- package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/index.astro +50 -17
- package/eventcatalog/src/layouts/DirectoryLayout.astro +11 -6
- package/eventcatalog/src/layouts/DiscoverLayout.astro +13 -8
- package/eventcatalog/src/layouts/Footer.astro +6 -6
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +62 -14
- package/eventcatalog/src/pages/_index.astro +135 -179
- package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +2 -2
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +4 -4
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +77 -63
- package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +23 -24
- package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +66 -50
- package/eventcatalog/src/pages/docs/custom/index.astro +2 -2
- package/eventcatalog/src/pages/docs/teams/[id]/index.astro +25 -21
- package/eventcatalog/src/pages/docs/users/[id]/index.astro +25 -21
- package/eventcatalog/src/pages/schemas/explorer/index.astro +1 -1
- package/eventcatalog/src/pages/studio.astro +59 -31
- package/eventcatalog/src/remark-plugins/directives.ts +6 -6
- package/eventcatalog/src/remark-plugins/mermaid.ts +2 -2
- package/eventcatalog/src/stores/theme-store.ts +93 -0
- package/eventcatalog/src/styles/theme.css +255 -0
- package/eventcatalog/src/styles/themes/forest.css +230 -0
- package/eventcatalog/src/styles/themes/ocean.css +235 -0
- package/eventcatalog/src/styles/themes/sapphire.css +230 -0
- package/eventcatalog/src/styles/themes/sunset.css +230 -0
- package/eventcatalog/src/utils/feature.ts +4 -0
- package/eventcatalog/tailwind.config.mjs +6 -3
- 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-
|
|
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-
|
|
16
|
-
<span className="font-light text-
|
|
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-
|
|
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]
|
|
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
|
-
|
|
27
|
+
background-color: rgb(var(--ec-accent));
|
|
28
|
+
border-color: rgb(var(--ec-accent));
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
input:focus::before {
|
|
29
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
38
|
-
<div className="text-xs text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
107
|
-
isCurrentEnv
|
|
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-
|
|
114
|
+
<div className={`font-medium ${isCurrentEnv ? 'text-[rgb(var(--ec-accent))]' : ''}`}>{env.name}</div>
|
|
113
115
|
{env.description && (
|
|
114
|
-
<div
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
153
|
-
<span className="text-[10px] text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
276
|
-
<span className="text-[11px] text-
|
|
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 &&
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
346
|
-
<span className="text-[11px] text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
383
|
-
<h4 className="text-sm font-semibold text-
|
|
384
|
-
<span className="text-xs text-
|
|
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-
|
|
401
|
-
<span className="text-xs text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
461
|
-
{data.summary && <p className="text-lg pt-2 text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
489
|
-
<h3 className="text-lg font-semibold text-
|
|
490
|
-
<span className="text-sm text-
|
|
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-
|
|
507
|
-
<span className="text-sm text-
|
|
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-
|
|
526
|
-
<span className="text-sm text-
|
|
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-
|
|
543
|
-
<RectangleGroupIcon className="h-8 w-8 text-
|
|
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-
|
|
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>
|