@eventcatalog/core 3.29.2 → 3.31.1
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-36IA4UE4.js → chunk-7IGMIOQF.js} +1 -1
- package/dist/{chunk-EGQGCB2B.js → chunk-HVOLSUC2.js} +1 -1
- package/dist/{chunk-DB4IQ3GB.js → chunk-LWVHWR77.js} +1 -1
- package/dist/{chunk-VEUNSJ6Z.js → chunk-QIJOBQZ7.js} +1 -1
- package/dist/{chunk-MEJOYC5Z.js → chunk-UY5QDWK7.js} +1 -1
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog.cjs +1 -1
- 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/astro.config.mjs +11 -7
- package/eventcatalog/public/logo.png +0 -0
- package/eventcatalog/src/components/CopyAsMarkdown.tsx +29 -24
- package/eventcatalog/src/components/EnvironmentDropdown.tsx +33 -21
- package/eventcatalog/src/components/FieldsExplorer/FieldFilters.tsx +3 -53
- package/eventcatalog/src/components/FieldsExplorer/FieldsExplorer.tsx +144 -91
- package/eventcatalog/src/components/FieldsExplorer/FieldsTable.tsx +112 -109
- package/eventcatalog/src/components/Header.astro +9 -19
- package/eventcatalog/src/components/MDX/Accordion/Accordion.tsx +12 -14
- package/eventcatalog/src/components/MDX/Accordion/AccordionGroup.astro +11 -3
- package/eventcatalog/src/components/MDX/Design/Design.astro +1 -1
- package/eventcatalog/src/components/MDX/ResourceRef/ResourceRef.astro +15 -5
- package/eventcatalog/src/components/MDX/Tiles/Tile.astro +11 -8
- package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +164 -53
- package/eventcatalog/src/components/SchemaExplorer/DiffViewer.tsx +1 -1
- package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +4 -4
- package/eventcatalog/src/components/SchemaExplorer/Pagination.tsx +12 -10
- package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +48 -77
- package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +238 -169
- package/eventcatalog/src/components/SchemaExplorer/SchemaExplorer.tsx +189 -230
- package/eventcatalog/src/components/SchemaExplorer/SchemaListItem.tsx +39 -36
- package/eventcatalog/src/components/Search/Search.astro +1 -1
- package/eventcatalog/src/components/Seo.astro +1 -1
- package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +218 -0
- package/eventcatalog/src/components/Settings/BillingSettingsForm.tsx +265 -0
- package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +371 -0
- package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +183 -0
- package/eventcatalog/src/components/Settings/LogoUpload.tsx +137 -0
- package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +91 -0
- package/eventcatalog/src/components/Settings/ReadOnlyBanner.tsx +18 -0
- package/eventcatalog/src/components/Settings/Row.tsx +59 -0
- package/eventcatalog/src/components/Settings/SettingsShared.tsx +176 -0
- package/eventcatalog/src/components/SideNav/NestedSideBar/SearchBar.tsx +3 -3
- package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +233 -261
- package/eventcatalog/src/components/Tables/Discover/DiscoverTable.tsx +116 -68
- package/eventcatalog/src/components/Tables/Discover/FilterComponents.tsx +2 -2
- package/eventcatalog/src/components/Tables/Discover/columns.tsx +130 -197
- package/eventcatalog/src/components/Tables/Table.tsx +21 -18
- package/eventcatalog/src/components/Tables/columns/TeamsTableColumns.tsx +79 -131
- package/eventcatalog/src/components/Tables/columns/UserTableColumns.tsx +104 -175
- package/eventcatalog/src/content.config.ts +1 -1
- package/eventcatalog/src/enterprise/auth/error.astro +1 -1
- package/eventcatalog/src/enterprise/auth/login.astro +1 -1
- package/eventcatalog/src/enterprise/auth/middleware/middleware-auth.ts +11 -7
- package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/index.tsx +97 -95
- package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/index.astro +232 -181
- package/eventcatalog/src/enterprise/feature.ts +2 -1
- package/eventcatalog/src/enterprise/fields/pages/fields.astro +10 -8
- package/eventcatalog/src/enterprise/integrations/eventcatalog-features.ts +0 -8
- package/eventcatalog/src/layouts/DirectoryLayout.astro +17 -88
- package/eventcatalog/src/layouts/SettingsLayout.astro +116 -0
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +562 -141
- package/eventcatalog/src/layouts/VisualiserLayout.astro +7 -2
- package/eventcatalog/src/pages/_index.astro +253 -256
- package/eventcatalog/src/pages/api/settings/ai.ts +57 -0
- package/eventcatalog/src/pages/api/settings/general.ts +71 -0
- package/eventcatalog/src/pages/api/settings/logo.ts +113 -0
- package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +3 -3
- package/eventcatalog/src/pages/diagrams/[id]/[version]/index.astro +223 -73
- package/eventcatalog/src/pages/discover/[type]/index.astro +22 -141
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +130 -30
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +147 -53
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +6 -2
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/[...filename].astro +2 -2
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +22 -19
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +71 -61
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/[filename].astro +5 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +3 -3
- package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +6 -32
- package/eventcatalog/src/pages/docs/llm/llms.txt.ts +5 -1
- package/eventcatalog/src/pages/docs/teams/[id]/index.astro +11 -4
- package/eventcatalog/src/pages/docs/users/[id]/index.astro +12 -5
- package/eventcatalog/src/pages/schemas/explorer/index.astro +10 -8
- package/eventcatalog/src/pages/settings/assistant.astro +37 -0
- package/eventcatalog/src/pages/settings/billing.astro +17 -0
- package/eventcatalog/src/pages/settings/general.astro +32 -0
- package/eventcatalog/src/pages/settings/index.astro +21 -0
- package/eventcatalog/src/pages/settings/llm-access.astro +34 -0
- package/eventcatalog/src/pages/settings/mcp.astro +14 -0
- package/eventcatalog/src/pages/studio.astro +1 -1
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +2 -7
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/index.astro +2 -2
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +2 -7
- package/eventcatalog/src/styles/theme.css +95 -30
- package/eventcatalog/src/styles/themes/forest.css +17 -9
- package/eventcatalog/src/styles/themes/ocean.css +10 -2
- package/eventcatalog/src/styles/themes/sapphire.css +10 -2
- package/eventcatalog/src/styles/themes/sunset.css +25 -17
- package/eventcatalog/src/types/react-syntax-highlighter.d.ts +13 -0
- package/eventcatalog/src/utils/eventcatalog-config/config-schema.ts +49 -0
- package/eventcatalog/src/utils/eventcatalog-config/config-writer.ts +149 -0
- package/eventcatalog/src/utils/url-builder.ts +4 -2
- package/package.json +7 -5
- package/eventcatalog/public/logo.svg +0 -14
- package/eventcatalog/src/enterprise/plans/index.astro +0 -319
- package/eventcatalog/src/pages/docs/llm/llms-services.txt.ts +0 -81
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
log_build_default
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-7IGMIOQF.js";
|
|
4
|
+
import "../chunk-QIJOBQZ7.js";
|
|
5
5
|
import "../chunk-4UVFXLPI.js";
|
|
6
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-UY5QDWK7.js";
|
|
7
7
|
import "../chunk-5T63CXKU.js";
|
|
8
8
|
export {
|
|
9
9
|
log_build_default as default
|
package/dist/constants.cjs
CHANGED
package/dist/constants.js
CHANGED
package/dist/eventcatalog.cjs
CHANGED
|
@@ -114,7 +114,7 @@ var verifyRequiredFieldsAreInCatalogConfigFile = async (projectDirectory) => {
|
|
|
114
114
|
var import_picocolors = __toESM(require("picocolors"), 1);
|
|
115
115
|
|
|
116
116
|
// package.json
|
|
117
|
-
var version = "3.
|
|
117
|
+
var version = "3.31.1";
|
|
118
118
|
|
|
119
119
|
// src/constants.ts
|
|
120
120
|
var VERSION = version;
|
package/dist/eventcatalog.js
CHANGED
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
} from "./chunk-K3ZVEX2Y.js";
|
|
7
7
|
import {
|
|
8
8
|
log_build_default
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-7IGMIOQF.js";
|
|
10
|
+
import "./chunk-QIJOBQZ7.js";
|
|
11
11
|
import "./chunk-4UVFXLPI.js";
|
|
12
12
|
import {
|
|
13
13
|
runMigrations
|
|
@@ -22,13 +22,13 @@ import {
|
|
|
22
22
|
} from "./chunk-3KXCGYET.js";
|
|
23
23
|
import {
|
|
24
24
|
generate
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-LWVHWR77.js";
|
|
26
26
|
import {
|
|
27
27
|
logger
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-HVOLSUC2.js";
|
|
29
29
|
import {
|
|
30
30
|
VERSION
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-UY5QDWK7.js";
|
|
32
32
|
import {
|
|
33
33
|
getEventCatalogConfigFile,
|
|
34
34
|
verifyRequiredFieldsAreInCatalogConfigFile
|
package/dist/generate.cjs
CHANGED
package/dist/generate.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
generate
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-LWVHWR77.js";
|
|
4
|
+
import "./chunk-HVOLSUC2.js";
|
|
5
|
+
import "./chunk-UY5QDWK7.js";
|
|
6
6
|
import "./chunk-5T63CXKU.js";
|
|
7
7
|
export {
|
|
8
8
|
generate
|
package/dist/utils/cli-logger.js
CHANGED
|
@@ -27,10 +27,12 @@ const projectDirectory = process.env.PROJECT_DIR || process.cwd();
|
|
|
27
27
|
const base = config.base || '/';
|
|
28
28
|
const host = config.host || false;
|
|
29
29
|
const compress = config.compress ?? false;
|
|
30
|
+
const isDevMode = process.env.EVENTCATALOG_DEV_MODE === 'true';
|
|
31
|
+
const effectiveOutput = isDevMode ? 'server' : (config.output || 'static');
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
const expressiveCodeConfig = {
|
|
33
|
-
themes: ['
|
|
35
|
+
themes: ['github-light', 'github-dark'],
|
|
34
36
|
defaultProps: {
|
|
35
37
|
wrap: true,
|
|
36
38
|
},
|
|
@@ -41,11 +43,13 @@ export default defineConfig({
|
|
|
41
43
|
base,
|
|
42
44
|
server: { port: config.port || 3000, host: host },
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+
// In dev mode (EVENTCATALOG_DEV_MODE=true) we need 'server' output so that
|
|
47
|
+
// routes which opt into SSR via `export const prerender = false` (e.g. the
|
|
48
|
+
// /api/settings/* editing endpoints) are actually invoked instead of being
|
|
49
|
+
// statically prerendered. Production builds keep the user's configured output.
|
|
50
|
+
output: effectiveOutput,
|
|
45
51
|
|
|
46
|
-
adapter:
|
|
47
|
-
mode: 'standalone'
|
|
48
|
-
}) : undefined,
|
|
52
|
+
adapter: effectiveOutput === 'server' ? node({ mode: 'standalone' }) : undefined,
|
|
49
53
|
|
|
50
54
|
outDir: config.outDir ? join(projectDirectory, config.outDir) : join(projectDirectory, 'dist'),
|
|
51
55
|
|
|
@@ -83,7 +87,7 @@ export default defineConfig({
|
|
|
83
87
|
],
|
|
84
88
|
gfm: true,
|
|
85
89
|
}),
|
|
86
|
-
|
|
90
|
+
effectiveOutput !== 'server' && compress && (await import("astro-compress")).default({
|
|
87
91
|
Logger: 0,
|
|
88
92
|
CSS: false,
|
|
89
93
|
}),
|
|
@@ -99,7 +103,7 @@ export default defineConfig({
|
|
|
99
103
|
* the eventcatalog.config, as the config use packages that only run in node environments,
|
|
100
104
|
* such as `node:path`.
|
|
101
105
|
*/
|
|
102
|
-
'__EC_TRAILING_SLASH__': config.trailingSlash
|
|
106
|
+
'__EC_TRAILING_SLASH__': JSON.stringify(config.trailingSlash === true),
|
|
103
107
|
'__EC_BASE__': JSON.stringify(base),
|
|
104
108
|
},
|
|
105
109
|
server: {
|
|
Binary file
|
|
@@ -36,17 +36,21 @@ const MenuItemContent = ({
|
|
|
36
36
|
} else {
|
|
37
37
|
// It must be an ElementType (component constructor like Lucide icon)
|
|
38
38
|
const IconComponent = iconProp as React.ElementType;
|
|
39
|
-
iconElement = <IconComponent className="w-
|
|
39
|
+
iconElement = <IconComponent className="w-4 h-4 text-[rgb(var(--ec-icon-color))]" />;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
return (
|
|
43
|
-
<div className="flex items-center gap-
|
|
44
|
-
<div className="
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
<div className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 text-sm">
|
|
44
|
+
<div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-[rgb(var(--ec-dropdown-border)/0.8)] bg-[rgb(var(--ec-page-bg))]">
|
|
45
|
+
{iconElement}
|
|
46
|
+
</div>
|
|
47
|
+
<div className="flex-1 min-w-0">
|
|
48
|
+
<div className="flex items-center gap-1.5 text-sm font-medium leading-5 text-[rgb(var(--ec-dropdown-text))]">
|
|
49
|
+
<span>{title}</span>
|
|
50
|
+
{external && <ExternalLink className="h-3.5 w-3.5 shrink-0 text-[rgb(var(--ec-icon-color))]" />}
|
|
51
|
+
</div>
|
|
52
|
+
<div className="text-xs leading-4 text-[rgb(var(--ec-content-text-muted))]">{description}</div>
|
|
48
53
|
</div>
|
|
49
|
-
{external && <ExternalLink className="w-4 h-4 text-[rgb(var(--ec-icon-color))]" />}
|
|
50
54
|
</div>
|
|
51
55
|
);
|
|
52
56
|
};
|
|
@@ -158,6 +162,7 @@ export function CopyPageMenu({
|
|
|
158
162
|
};
|
|
159
163
|
|
|
160
164
|
const defaultAction = getDefaultAction();
|
|
165
|
+
const [open, setOpen] = useState(false);
|
|
161
166
|
const [buttonText, setButtonText] = useState(defaultAction?.text || 'Action');
|
|
162
167
|
|
|
163
168
|
// Fetch the markdown from the url + .mdx
|
|
@@ -232,40 +237,40 @@ export function CopyPageMenu({
|
|
|
232
237
|
}
|
|
233
238
|
|
|
234
239
|
return (
|
|
235
|
-
<DropdownMenu.Root>
|
|
240
|
+
<DropdownMenu.Root open={open} onOpenChange={setOpen}>
|
|
236
241
|
{/* Container for the split button */}
|
|
237
|
-
<div className="inline-flex rounded-md
|
|
242
|
+
<div className="inline-flex h-8 items-stretch overflow-hidden rounded-md border border-[rgb(var(--ec-dropdown-border)/0.75)] bg-[rgb(var(--ec-page-bg))]">
|
|
238
243
|
{/* Left Button: Default Action */}
|
|
239
244
|
<button
|
|
240
245
|
type="button"
|
|
241
246
|
onClick={handleDefaultAction}
|
|
242
|
-
className="inline-flex items-center justify-center gap-
|
|
247
|
+
className="inline-flex h-full items-center justify-center gap-2 whitespace-nowrap bg-transparent pl-4 pr-3 text-sm font-medium text-[rgb(var(--ec-dropdown-text))] transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover)/0.75)] focus:z-10 focus:outline-hidden focus:ring-1 focus:ring-[rgb(var(--ec-accent))]"
|
|
243
248
|
>
|
|
244
|
-
<defaultAction.icon className="
|
|
249
|
+
<defaultAction.icon className="h-4 w-4" />
|
|
245
250
|
{buttonText}
|
|
246
251
|
</button>
|
|
247
252
|
{/* Right Button: Dropdown Trigger */}
|
|
248
253
|
<DropdownMenu.Trigger asChild>
|
|
249
254
|
<button
|
|
250
255
|
type="button"
|
|
251
|
-
className="inline-flex items-center justify-center
|
|
256
|
+
className="inline-flex h-full w-8 items-center justify-center border-l border-[rgb(var(--ec-dropdown-border)/0.75)] bg-transparent text-sm font-medium text-[rgb(var(--ec-icon-color))] transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover)/0.75)] focus:z-10 focus:outline-hidden focus:ring-1 focus:ring-[rgb(var(--ec-accent))]"
|
|
252
257
|
aria-label="More options"
|
|
253
258
|
>
|
|
254
|
-
<ChevronDownIcon className=
|
|
259
|
+
<ChevronDownIcon className={`h-4 w-4 transition-transform duration-200 ${open ? 'rotate-180' : ''}`} />
|
|
255
260
|
</button>
|
|
256
261
|
</DropdownMenu.Trigger>
|
|
257
262
|
</div>
|
|
258
263
|
|
|
259
264
|
{/* Adjust styling for the content dropdown */}
|
|
260
265
|
<DropdownMenu.Content
|
|
261
|
-
className="w-72
|
|
262
|
-
sideOffset={
|
|
266
|
+
className="z-50 w-72 max-w-[calc(100vw-1.5rem)] rounded-2xl border border-[rgb(var(--ec-dropdown-border)/0.8)] bg-[rgb(var(--ec-page-bg))] px-1.5 py-1.5 shadow-[0_24px_64px_rgb(0_0_0/0.35)]"
|
|
267
|
+
sideOffset={10}
|
|
263
268
|
align="end"
|
|
264
269
|
>
|
|
265
270
|
{availableActions.chat && (
|
|
266
271
|
<>
|
|
267
272
|
<DropdownMenu.Item
|
|
268
|
-
className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))]
|
|
273
|
+
className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
|
|
269
274
|
onSelect={() => window.dispatchEvent(new CustomEvent('eventcatalog:open-chat'))}
|
|
270
275
|
>
|
|
271
276
|
<MenuItemContent
|
|
@@ -274,13 +279,13 @@ export function CopyPageMenu({
|
|
|
274
279
|
description="Ask questions about this page"
|
|
275
280
|
/>
|
|
276
281
|
</DropdownMenu.Item>
|
|
277
|
-
<DropdownMenu.Separator className="
|
|
282
|
+
<DropdownMenu.Separator className="mx-3 my-3 h-px bg-[rgb(var(--ec-dropdown-border)/0.8)]" />
|
|
278
283
|
</>
|
|
279
284
|
)}
|
|
280
285
|
|
|
281
286
|
{availableActions.copyMarkdown && (
|
|
282
287
|
<DropdownMenu.Item
|
|
283
|
-
className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))]
|
|
288
|
+
className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
|
|
284
289
|
onSelect={() => copyMarkdownToClipboard()}
|
|
285
290
|
>
|
|
286
291
|
<MenuItemContent icon={Copy} title="Copy page" description="Copy page as Markdown for LLMs" />
|
|
@@ -312,7 +317,7 @@ export function CopyPageMenu({
|
|
|
312
317
|
return (
|
|
313
318
|
<DropdownMenu.Item
|
|
314
319
|
key={schema.url}
|
|
315
|
-
className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))]
|
|
320
|
+
className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
|
|
316
321
|
onSelect={() => copySchemaToClipboard(schema)}
|
|
317
322
|
>
|
|
318
323
|
<MenuItemContent icon={Icon} title={title} description={`Copy ${type} to clipboard`} />
|
|
@@ -322,7 +327,7 @@ export function CopyPageMenu({
|
|
|
322
327
|
|
|
323
328
|
{availableActions.viewMarkdown && (
|
|
324
329
|
<DropdownMenu.Item
|
|
325
|
-
className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))]
|
|
330
|
+
className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
|
|
326
331
|
onSelect={() => window.open(markdownUrl, '_blank')}
|
|
327
332
|
>
|
|
328
333
|
<MenuItemContent
|
|
@@ -336,7 +341,7 @@ export function CopyPageMenu({
|
|
|
336
341
|
|
|
337
342
|
{availableActions.rssFeed && (
|
|
338
343
|
<DropdownMenu.Item
|
|
339
|
-
className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))]
|
|
344
|
+
className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
|
|
340
345
|
onSelect={() => window.open(buildUrl(`/rss/all/rss.xml`), '_blank')}
|
|
341
346
|
>
|
|
342
347
|
<MenuItemContent icon={RssIcon} title="RSS Feed" description="View this page as RSS feed" external={true} />
|
|
@@ -345,7 +350,7 @@ export function CopyPageMenu({
|
|
|
345
350
|
|
|
346
351
|
{availableActions.exportPDF && (
|
|
347
352
|
<DropdownMenu.Item
|
|
348
|
-
className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))]
|
|
353
|
+
className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
|
|
349
354
|
onSelect={() => window.open(printUrl, '_blank')}
|
|
350
355
|
>
|
|
351
356
|
<MenuItemContent icon={PrinterIcon} title="Export to PDF" description="Open print-friendly version" external={true} />
|
|
@@ -354,9 +359,9 @@ export function CopyPageMenu({
|
|
|
354
359
|
|
|
355
360
|
{availableActions.editPage && (
|
|
356
361
|
<>
|
|
357
|
-
<DropdownMenu.Separator className="
|
|
362
|
+
<DropdownMenu.Separator className="mx-3 my-3 h-px bg-[rgb(var(--ec-dropdown-border)/0.8)]" />
|
|
358
363
|
<DropdownMenu.Item
|
|
359
|
-
className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))]
|
|
364
|
+
className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
|
|
360
365
|
onSelect={() => window.open(editUrl, '_blank')}
|
|
361
366
|
>
|
|
362
367
|
<MenuItemContent
|
|
@@ -63,30 +63,32 @@ export const EnvironmentDropdown: React.FC<EnvironmentDropdownProps> = ({ enviro
|
|
|
63
63
|
<button
|
|
64
64
|
type="button"
|
|
65
65
|
onClick={toggleDropdown}
|
|
66
|
-
className="flex items-center
|
|
66
|
+
className="group inline-flex items-center gap-2.5 rounded-xl border border-[rgb(var(--ec-header-border))] bg-[rgb(var(--ec-header-bg))] px-3.5 py-2 text-[13px] font-medium text-[rgb(var(--ec-header-text)/0.82)] shadow-xs transition-colors hover:border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-dropdown-hover)/0.35)] hover:text-[rgb(var(--ec-header-text))] focus:outline-hidden focus:ring-2 focus:ring-[rgb(var(--ec-accent))]"
|
|
67
67
|
aria-expanded={isOpen}
|
|
68
68
|
aria-haspopup="true"
|
|
69
69
|
>
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
strokeLinejoin="round"
|
|
74
|
-
strokeWidth="2"
|
|
75
|
-
d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"
|
|
76
|
-
/>
|
|
77
|
-
</svg>
|
|
78
|
-
<span>
|
|
79
|
-
Environments
|
|
70
|
+
<span className="h-2.5 w-2.5 rounded-full bg-emerald-400 shadow-[0_0_0_3px_rgba(16,185,129,0.14)]" aria-hidden="true" />
|
|
71
|
+
<span className="truncate">
|
|
72
|
+
<span className="font-semibold text-[rgb(var(--ec-header-text))]">Environments</span>
|
|
80
73
|
{currentEnvironment && (
|
|
81
|
-
<span className="font-
|
|
74
|
+
<span className="font-medium text-[rgb(var(--ec-header-text)/0.72)]">
|
|
75
|
+
{' '}
|
|
76
|
+
({currentEnvironment.shortName || currentEnvironment.name})
|
|
77
|
+
</span>
|
|
82
78
|
)}
|
|
83
79
|
</span>
|
|
84
|
-
<svg
|
|
80
|
+
<svg
|
|
81
|
+
className={`ml-0.5 h-4 w-4 flex-shrink-0 transition-transform ${isOpen ? 'rotate-180' : ''}`}
|
|
82
|
+
fill="none"
|
|
83
|
+
stroke="currentColor"
|
|
84
|
+
viewBox="0 0 24 24"
|
|
85
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
86
|
+
>
|
|
85
87
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M19 9l-7 7-7-7" />
|
|
86
88
|
</svg>
|
|
87
89
|
</button>
|
|
88
90
|
<div
|
|
89
|
-
className={`${isOpen ? '' : 'hidden'} absolute right-0 mt-2 w-
|
|
91
|
+
className={`${isOpen ? '' : 'hidden'} absolute right-0 mt-2 w-72 overflow-hidden rounded-2xl border border-[rgb(var(--ec-dropdown-border))] bg-[rgb(var(--ec-dropdown-bg))] p-1.5 shadow-2xl z-[100]`}
|
|
90
92
|
>
|
|
91
93
|
{environments.map((env) => {
|
|
92
94
|
const isCurrentEnv = currentEnvironment?.name === env.name;
|
|
@@ -103,18 +105,28 @@ export const EnvironmentDropdown: React.FC<EnvironmentDropdownProps> = ({ enviro
|
|
|
103
105
|
targetUrl.pathname = currentPath;
|
|
104
106
|
window.location.href = targetUrl.toString();
|
|
105
107
|
}}
|
|
106
|
-
className={`block px-
|
|
108
|
+
className={`block rounded-xl px-3 py-3 transition-colors ${
|
|
107
109
|
isCurrentEnv
|
|
108
|
-
? 'bg-[rgb(var(--ec-accent)/0.
|
|
110
|
+
? 'bg-[rgb(var(--ec-accent)/0.12)] text-[rgb(var(--ec-dropdown-text))]'
|
|
109
111
|
: 'text-[rgb(var(--ec-dropdown-text))] hover:bg-[rgb(var(--ec-dropdown-hover))]'
|
|
110
112
|
}`}
|
|
111
113
|
>
|
|
112
|
-
<div className="flex items-
|
|
113
|
-
<div>
|
|
114
|
-
<div className=
|
|
114
|
+
<div className="flex items-start justify-between gap-3">
|
|
115
|
+
<div className="min-w-0">
|
|
116
|
+
<div className="flex items-center gap-2">
|
|
117
|
+
<span
|
|
118
|
+
className={`mt-0.5 h-2 w-2 rounded-full flex-shrink-0 ${isCurrentEnv ? 'bg-emerald-400' : 'bg-[rgb(var(--ec-icon-color))]'}`}
|
|
119
|
+
aria-hidden="true"
|
|
120
|
+
/>
|
|
121
|
+
<div
|
|
122
|
+
className={`truncate text-[13px] font-semibold ${isCurrentEnv ? 'text-[rgb(var(--ec-accent-text))]' : ''}`}
|
|
123
|
+
>
|
|
124
|
+
{env.name}
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
115
127
|
{env.description && (
|
|
116
128
|
<div
|
|
117
|
-
className={`
|
|
129
|
+
className={`mt-1 pl-4 text-[12px] leading-5 ${isCurrentEnv ? 'text-[rgb(var(--ec-accent-text)/0.78)]' : 'text-[rgb(var(--ec-icon-color))]'}`}
|
|
118
130
|
>
|
|
119
131
|
{env.description}
|
|
120
132
|
</div>
|
|
@@ -122,7 +134,7 @@ export const EnvironmentDropdown: React.FC<EnvironmentDropdownProps> = ({ enviro
|
|
|
122
134
|
</div>
|
|
123
135
|
{isCurrentEnv && (
|
|
124
136
|
<svg
|
|
125
|
-
className="
|
|
137
|
+
className="mt-0.5 h-4 w-4 flex-shrink-0 text-[rgb(var(--ec-accent-text))]"
|
|
126
138
|
fill="currentColor"
|
|
127
139
|
viewBox="0 0 20 20"
|
|
128
140
|
>
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { useState, useEffect } from 'react';
|
|
2
|
-
import { Search, X, Filter } from 'lucide-react';
|
|
3
1
|
import { FilterDropdown, CheckboxItem } from '../Tables/Discover/FilterComponents';
|
|
4
2
|
|
|
5
3
|
export interface FieldFiltersProps {
|
|
@@ -21,8 +19,6 @@ export interface FieldFiltersProps {
|
|
|
21
19
|
}
|
|
22
20
|
|
|
23
21
|
export default function FieldFilters({
|
|
24
|
-
searchQuery,
|
|
25
|
-
onSearchChange,
|
|
26
22
|
selectedFormats,
|
|
27
23
|
onFormatsChange,
|
|
28
24
|
selectedMessageTypes,
|
|
@@ -34,21 +30,6 @@ export default function FieldFilters({
|
|
|
34
30
|
facets,
|
|
35
31
|
isScaleEnabled = false,
|
|
36
32
|
}: FieldFiltersProps) {
|
|
37
|
-
const [localSearch, setLocalSearch] = useState(searchQuery);
|
|
38
|
-
|
|
39
|
-
// Sync external changes
|
|
40
|
-
useEffect(() => {
|
|
41
|
-
setLocalSearch(searchQuery);
|
|
42
|
-
}, [searchQuery]);
|
|
43
|
-
|
|
44
|
-
// Debounce search input
|
|
45
|
-
useEffect(() => {
|
|
46
|
-
const timeout = setTimeout(() => {
|
|
47
|
-
onSearchChange(localSearch);
|
|
48
|
-
}, 500);
|
|
49
|
-
return () => clearTimeout(timeout);
|
|
50
|
-
}, [localSearch]);
|
|
51
|
-
|
|
52
33
|
const toggleFormat = (value: string) => {
|
|
53
34
|
if (selectedFormats.includes(value)) {
|
|
54
35
|
onFormatsChange(selectedFormats.filter((f) => f !== value));
|
|
@@ -73,45 +54,14 @@ export default function FieldFilters({
|
|
|
73
54
|
onMessageTypesChange([]);
|
|
74
55
|
onSharedOnlyChange(false);
|
|
75
56
|
onConflictingOnlyChange(false);
|
|
76
|
-
setLocalSearch('');
|
|
77
|
-
onSearchChange('');
|
|
78
57
|
};
|
|
79
58
|
|
|
80
59
|
return (
|
|
81
|
-
<div className="space-y-
|
|
82
|
-
{/* Search Input */}
|
|
83
|
-
<div className="relative">
|
|
84
|
-
<Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[rgb(var(--ec-icon-color))]" />
|
|
85
|
-
<input
|
|
86
|
-
type="text"
|
|
87
|
-
value={localSearch}
|
|
88
|
-
onChange={(e) => setLocalSearch(e.target.value)}
|
|
89
|
-
placeholder="Search fields..."
|
|
90
|
-
className="w-full pl-9 pr-8 py-2 text-sm bg-[rgb(var(--ec-dropdown-bg))] text-[rgb(var(--ec-input-text))] border border-[rgb(var(--ec-dropdown-border))] rounded-lg placeholder:text-[rgb(var(--ec-icon-color))] focus:outline-hidden focus:ring-1 focus:ring-[rgb(var(--ec-accent)/0.3)] focus:border-[rgb(var(--ec-accent))] transition-colors"
|
|
91
|
-
/>
|
|
92
|
-
{localSearch && (
|
|
93
|
-
<button
|
|
94
|
-
onClick={() => {
|
|
95
|
-
setLocalSearch('');
|
|
96
|
-
onSearchChange('');
|
|
97
|
-
}}
|
|
98
|
-
className="absolute right-2 top-1/2 -translate-y-1/2 p-0.5 text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-page-text))]"
|
|
99
|
-
>
|
|
100
|
-
<X className="w-3.5 h-3.5" />
|
|
101
|
-
</button>
|
|
102
|
-
)}
|
|
103
|
-
</div>
|
|
104
|
-
|
|
105
|
-
{/* Filter Section Header */}
|
|
106
|
-
<div className="flex items-center gap-2">
|
|
107
|
-
<Filter className="w-3.5 h-3.5 text-[rgb(var(--ec-icon-color))]" />
|
|
108
|
-
<h3 className="text-[11px] font-bold uppercase tracking-widest text-[rgb(var(--ec-page-text))]">Filters</h3>
|
|
109
|
-
</div>
|
|
110
|
-
|
|
60
|
+
<div className="space-y-6">
|
|
111
61
|
{/* Schema Format Filter */}
|
|
112
62
|
{facets && facets.formats.length > 0 && (
|
|
113
63
|
<div>
|
|
114
|
-
<label className="block text-xs font-medium text-[rgb(var(--ec-page-text)/0.8)] mb-1.5">Schema
|
|
64
|
+
<label className="block text-xs font-medium text-[rgb(var(--ec-page-text)/0.8)] mb-1.5">Schema format</label>
|
|
115
65
|
<FilterDropdown
|
|
116
66
|
label="Select formats..."
|
|
117
67
|
selectedItems={selectedFormats}
|
|
@@ -134,7 +84,7 @@ export default function FieldFilters({
|
|
|
134
84
|
{/* Message Type Filter */}
|
|
135
85
|
{facets && facets.messageTypes.length > 0 && (
|
|
136
86
|
<div>
|
|
137
|
-
<label className="block text-xs font-medium text-[rgb(var(--ec-page-text)/0.8)] mb-1.5">Message
|
|
87
|
+
<label className="block text-xs font-medium text-[rgb(var(--ec-page-text)/0.8)] mb-1.5">Message type</label>
|
|
138
88
|
<FilterDropdown
|
|
139
89
|
label="Select message types..."
|
|
140
90
|
selectedItems={selectedMessageTypes}
|