@eventcatalog/core 5.0.0-beta.3 → 5.0.0-beta.30
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/LICENSE +234 -134
- package/README.md +5 -5
- package/dist/analytics/analytics.cjs +18 -3
- package/dist/analytics/analytics.d.cts +1 -1
- package/dist/analytics/analytics.d.ts +1 -1
- package/dist/analytics/analytics.js +3 -2
- package/dist/analytics/log-build.cjs +160 -77
- package/dist/analytics/log-build.d.cts +2 -2
- package/dist/analytics/log-build.d.ts +2 -2
- package/dist/analytics/log-build.js +7 -5
- package/dist/analytics/studio-usage.cjs +90 -0
- package/dist/analytics/studio-usage.d.cts +5 -0
- package/dist/analytics/studio-usage.d.ts +5 -0
- package/dist/analytics/studio-usage.js +10 -0
- package/dist/analytics/telemetry.cjs +42 -0
- package/dist/analytics/telemetry.d.cts +20 -0
- package/dist/analytics/telemetry.d.ts +20 -0
- package/dist/analytics/telemetry.js +8 -0
- package/dist/catalog-runtime.cjs +1 -1
- package/dist/{chunk-RFIXKATC.js → chunk-4G7FSRPN.js} +35 -42
- package/dist/{chunk-6OC46WQJ.js → chunk-55QETQZ3.js} +66 -35
- package/dist/{chunk-TQLRG35T.js → chunk-AD7CL772.js} +78 -45
- package/dist/chunk-CA6WCQ2T.js +54 -0
- package/dist/chunk-CPW6G62V.js +17 -0
- package/dist/{chunk-423S2KHN.js → chunk-FLAZ2JVN.js} +4 -2
- package/dist/{chunk-BH2F5WPN.js → chunk-GQI5UYXZ.js} +1 -1
- package/dist/{chunk-GYIVJXOJ.js → chunk-NA7OTBWW.js} +1 -1
- package/dist/{chunk-MDWB5HLO.js → chunk-NKNOXQ62.js} +1 -1
- package/dist/{chunk-3PKS2IIP.js → chunk-OX6TSVHY.js} +1 -1
- package/dist/{chunk-36RYTYT5.js → chunk-PD7KTSYN.js} +1 -1
- package/dist/chunk-S5GWAUG5.js +29 -0
- package/dist/{chunk-NDJOAITI.js → chunk-T3OROMAU.js} +9 -3
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog-config-file-utils.cjs +34 -41
- package/dist/eventcatalog-config-file-utils.d.cts +56 -58
- package/dist/eventcatalog-config-file-utils.d.ts +56 -58
- package/dist/eventcatalog-config-file-utils.js +1 -1
- package/dist/eventcatalog.cjs +531 -356
- package/dist/eventcatalog.config.d.cts +59 -1
- package/dist/eventcatalog.config.d.ts +59 -1
- package/dist/eventcatalog.js +63 -25
- package/dist/features.cjs +34 -41
- package/dist/features.js +2 -2
- package/dist/federation/federate.cjs +37 -44
- package/dist/federation/federate.js +2 -2
- package/dist/generate.cjs +37 -42
- package/dist/generate.js +4 -4
- package/dist/resolve-catalog-dependencies.cjs +34 -41
- package/dist/resolve-catalog-dependencies.js +2 -2
- package/dist/runtime-dependencies/@eventcatalog__visualiser__studio-fonts.css.mjs +3 -0
- package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.css.mjs +3 -0
- package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.mjs +3 -0
- package/dist/runtime-dependencies/@hocuspocus__provider.mjs +3 -0
- package/dist/runtime-dependencies/@hocuspocus__server.mjs +3 -0
- package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +3 -0
- package/dist/runtime-dependencies/@mcp-b__webmcp-polyfill.mjs +3 -0
- package/dist/runtime-dependencies/htmlparser2.mjs +3 -0
- package/dist/runtime-dependencies/manifest.json +13 -1
- package/dist/runtime-dependencies/react-hotkeys-hook.mjs +3 -0
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__cjs__create-element.js.mjs +3 -0
- package/dist/runtime-dependencies/y-protocols.mjs +3 -0
- package/dist/runtime-dependencies/y-protocols__awareness.mjs +3 -0
- package/dist/runtime-dependencies/yjs.mjs +3 -0
- package/dist/utils/child-process-signals.cjs +53 -0
- package/dist/utils/child-process-signals.d.cts +19 -0
- package/dist/utils/child-process-signals.d.ts +19 -0
- package/dist/utils/child-process-signals.js +6 -0
- package/dist/utils/cli-logger.cjs +1 -1
- package/dist/utils/cli-logger.js +2 -2
- package/dist/utils/license-status.cjs +78 -45
- package/dist/utils/license-status.d.cts +15 -5
- package/dist/utils/license-status.d.ts +15 -5
- package/dist/utils/license-status.js +1 -1
- package/eventcatalog/astro.config.mjs +23 -1
- package/eventcatalog/integrations/config-loader.mjs +56 -58
- package/eventcatalog/integrations/skip-startup-reload.mjs +31 -0
- package/eventcatalog/integrations/stable-dependency-order.mjs +29 -0
- package/eventcatalog/integrations/storage.mjs +20 -0
- package/eventcatalog/integrations/studio-server.mjs +32 -0
- package/eventcatalog/src/components/CatalogGraph/CatalogForceGraph.tsx +39 -0
- package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +2 -0
- package/eventcatalog/src/components/Header.astro +3 -3
- package/eventcatalog/src/components/Homepage/CatalogDashboard.astro +342 -0
- package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +60 -4
- package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +5 -1
- package/eventcatalog/src/components/NavigationProgress.astro +7 -0
- package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +2 -0
- package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +2 -0
- package/eventcatalog/src/components/SchemaExplorer/SchemaCodeModal.tsx +2 -0
- package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -0
- package/eventcatalog/src/components/Search/SearchDataLoader.astro +16 -28
- package/eventcatalog/src/components/Search/SearchModal.tsx +2 -10
- package/eventcatalog/src/components/Search/search-utils.ts +26 -0
- package/eventcatalog/src/components/Seo.astro +5 -1
- package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +53 -48
- package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +183 -178
- package/eventcatalog/src/components/Settings/LicenseSettings.tsx +140 -31
- package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +40 -35
- package/eventcatalog/src/components/Settings/LogoUpload.tsx +1 -1
- package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +9 -8
- package/eventcatalog/src/components/Settings/Row.tsx +7 -4
- package/eventcatalog/src/components/Settings/SettingsShared.tsx +3 -3
- package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +53 -83
- package/eventcatalog/src/components/SideNav/NestedSideBar/storage.ts +2 -0
- package/eventcatalog/src/components/SideNav/NestedSideBar/utils.ts +131 -0
- package/eventcatalog/src/components/SideNav/SideNav.astro +9 -1
- package/eventcatalog/src/components/TrialBadge.astro +20 -9
- package/eventcatalog/src/content.config.ts +19 -2
- package/eventcatalog/src/features/auth/error.astro +4 -2
- package/eventcatalog/src/features/auth/login.astro +2 -1
- package/eventcatalog/src/features/auth/middleware/middleware-auth.ts +10 -0
- package/eventcatalog/src/features/auth/unauthorized.astro +1 -1
- package/eventcatalog/src/features/fields/pages/fields.astro +1 -1
- package/eventcatalog/src/features/integrations/eventcatalog-features.ts +34 -1
- package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +6 -45
- package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +47 -0
- package/eventcatalog/src/features/mcp/apps/canvas/styles.css +24 -0
- package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +278 -0
- package/eventcatalog/src/features/mcp/apps/generated/canvas.html +272 -0
- package/eventcatalog/src/features/mcp/apps/generated/viewer.html +65 -65
- package/eventcatalog/src/features/mcp/apps/shared/app-view.tsx +2 -1
- package/eventcatalog/src/features/mcp/mcp-apps.ts +6 -3
- package/eventcatalog/src/features/mcp/mcp-server.ts +36 -5
- package/eventcatalog/src/features/server/start.ts +25 -0
- package/eventcatalog/src/features/storage/database.ts +88 -0
- package/eventcatalog/src/features/storage/migrations.ts +85 -0
- package/eventcatalog/src/features/storage/sql/database.sql +5 -0
- package/eventcatalog/src/features/storage/sql/migrations/0001-studio-canvases.sql +12 -0
- package/eventcatalog/src/features/storage/sql/migrations.sql +15 -0
- package/eventcatalog/src/features/storage/sql.ts +28 -0
- package/eventcatalog/src/features/studio/agent-choreography.ts +384 -0
- package/eventcatalog/src/features/studio/agents.ts +28 -0
- package/eventcatalog/src/features/studio/api/canvases-api.ts +219 -0
- package/eventcatalog/src/features/studio/api/canvases.ts +25 -0
- package/eventcatalog/src/features/studio/api/client.ts +40 -0
- package/eventcatalog/src/features/studio/canvas-actions.ts +540 -0
- package/eventcatalog/src/features/studio/canvas-preview.ts +52 -0
- package/eventcatalog/src/features/studio/catalog-resources.ts +155 -0
- package/eventcatalog/src/features/studio/catalog.ts +173 -0
- package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +518 -0
- package/eventcatalog/src/features/studio/components/CanvasStatusMenu.tsx +118 -0
- package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +434 -0
- package/eventcatalog/src/features/studio/components/ConnectionsChooser.tsx +143 -0
- package/eventcatalog/src/features/studio/components/DeleteCanvasDialog.tsx +65 -0
- package/eventcatalog/src/features/studio/components/Dialog.tsx +60 -0
- package/eventcatalog/src/features/studio/components/JoinForm.tsx +109 -0
- package/eventcatalog/src/features/studio/components/LeftPanel.tsx +206 -0
- package/eventcatalog/src/features/studio/components/NodeDetails.tsx +183 -0
- package/eventcatalog/src/features/studio/components/OpenInStudioDialog.tsx +79 -0
- package/eventcatalog/src/features/studio/components/Presence.tsx +293 -0
- package/eventcatalog/src/features/studio/components/ShareDialog.tsx +396 -0
- package/eventcatalog/src/features/studio/components/ShortcutsDialog.tsx +41 -0
- package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +2091 -0
- package/eventcatalog/src/features/studio/components/StudioNotice.astro +24 -0
- package/eventcatalog/src/features/studio/document-name.ts +7 -0
- package/eventcatalog/src/features/studio/from-visualiser.ts +138 -0
- package/eventcatalog/src/features/studio/hooks/presence-sender.ts +63 -0
- package/eventcatalog/src/features/studio/hooks/presence-store.ts +119 -0
- package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +353 -0
- package/eventcatalog/src/features/studio/hooks/use-comments.ts +54 -0
- package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +109 -0
- package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +782 -0
- package/eventcatalog/src/features/studio/identity.ts +59 -0
- package/eventcatalog/src/features/studio/limits.ts +2 -0
- package/eventcatalog/src/features/studio/pages/[id].astro +69 -0
- package/eventcatalog/src/features/studio/pages/index.astro +784 -0
- package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +27 -0
- package/eventcatalog/src/features/studio/server/canvas-mcp.ts +495 -0
- package/eventcatalog/src/features/studio/server/runtime.ts +498 -0
- package/eventcatalog/src/features/studio/server/sign-in.ts +18 -0
- package/eventcatalog/src/features/studio/server/sql/storage.sql +18 -0
- package/eventcatalog/src/features/studio/server/storage.ts +90 -0
- package/eventcatalog/src/features/studio/server/tool-icons.ts +30 -0
- package/eventcatalog/src/features/studio/tool-sync.ts +75 -0
- package/eventcatalog/src/layouts/BaseLayout.astro +4 -4
- package/eventcatalog/src/layouts/SettingsLayout.astro +2 -2
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +13 -5
- package/eventcatalog/src/pages/_index.astro +5 -342
- package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.spec.ts +2 -3
- package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +3 -1
- package/eventcatalog/src/pages/diagrams/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/diagrams/[id]/[version]/embed.astro +1 -0
- package/eventcatalog/src/pages/diagrams/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/directory/[type]/_index.data.ts +5 -7
- package/eventcatalog/src/pages/directory/[type]/index.astro +3 -1
- package/eventcatalog/src/pages/discover/[type]/_index.data.ts +5 -7
- package/eventcatalog/src/pages/discover/[type]/index.astro +3 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +3 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/_[filename].data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/[...filename].astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/_[...filename].data.ts +0 -4
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +3 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/_[filename].data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.spec.ts +2 -3
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/[filename].astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/_[filename].data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/index.astro +2 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/language/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +1 -0
- package/eventcatalog/src/pages/docs/custom/[...path]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +1 -1
- package/eventcatalog/src/pages/docs/services/[id]/[version]/resources/index.astro +1 -0
- package/eventcatalog/src/pages/docs/services/[id]/asyncapi/[filename].astro +1 -1
- package/eventcatalog/src/pages/docs/services/[id]/changelog/index.astro +1 -1
- package/eventcatalog/src/pages/docs/services/[id]/graphql/[filename].astro +1 -1
- package/eventcatalog/src/pages/docs/services/[id]/spec/[filename].astro +1 -1
- package/eventcatalog/src/pages/docs/teams/[id]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/teams/[id]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/users/[id]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/users/[id]/index.astro +1 -0
- package/eventcatalog/src/pages/index.astro +4 -2
- package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/schemas/explorer/_index.data.ts +0 -7
- package/eventcatalog/src/pages/schemas/explorer/index.astro +4 -2
- package/eventcatalog/src/pages/settings/license.astro +9 -1
- package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/_index.data.ts +38 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/index.astro +18 -41
- package/eventcatalog/src/pages/visualiser/designs/[id]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/designs/[id]/index.astro +2 -1
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/types/react-syntax-highlighter.d.ts +10 -0
- package/eventcatalog/src/utils/collections/util.ts +8 -4
- package/eventcatalog/src/utils/feature.ts +8 -0
- package/eventcatalog/src/utils/git.ts +22 -5
- package/eventcatalog/src/utils/homepage-dashboard.ts +143 -0
- package/eventcatalog/src/utils/license.ts +1 -1
- package/eventcatalog/src/utils/link-validation.ts +25 -19
- package/eventcatalog/src/utils/node-graphs/domain-entity-map.ts +3 -1
- package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +3 -3
- package/eventcatalog/src/utils/node-graphs/export-mermaid.ts +0 -2
- package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +4 -2
- package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +20 -1
- package/eventcatalog/src/utils/node-graphs/node-resource.ts +67 -0
- package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +1 -1
- package/eventcatalog/src/utils/page-loaders/hybrid-page.ts +4 -15
- package/eventcatalog/src/utils/page-title.ts +15 -0
- package/eventcatalog/src/utils/syntax-highlighter-renderer.ts +64 -0
- package/eventcatalog/src/utils/trial.ts +14 -1
- package/package.json +19 -13
- package/dist/runtime-dependencies/shelljs.mjs +0 -3
- package/eventcatalog/public/studio-bg.png +0 -0
- package/eventcatalog/src/components/Studio/StudioPageModal.tsx +0 -150
- package/eventcatalog/src/pages/studio.astro +0 -316
|
@@ -168,6 +168,32 @@ export const getIndexedResultRank = ({
|
|
|
168
168
|
return 0;
|
|
169
169
|
};
|
|
170
170
|
|
|
171
|
+
/**
|
|
172
|
+
* How well a resource matches a resource search query: an exact name (5), a name starting with
|
|
173
|
+
* the query (4) or containing it (3), then the id (2), then the summary (1). 0 is no match.
|
|
174
|
+
*/
|
|
175
|
+
export const getResourceResultRank = (item: Pick<SearchItem, 'name' | 'key' | 'rawNode'>, query: string) => {
|
|
176
|
+
const lowerQuery = query.toLowerCase();
|
|
177
|
+
const name = item.name.toLowerCase();
|
|
178
|
+
if (name === lowerQuery) return 5;
|
|
179
|
+
if (name.startsWith(lowerQuery)) return 4;
|
|
180
|
+
if (name.includes(lowerQuery)) return 3;
|
|
181
|
+
// Key format is "type:id:version" (e.g. "service:OrdersService:0.0.3").
|
|
182
|
+
// Match against the id so users can find resources by their raw id too.
|
|
183
|
+
const id = item.key?.split(':')[1];
|
|
184
|
+
if (id?.toLowerCase().includes(lowerQuery)) return 2;
|
|
185
|
+
if (item.rawNode.summary?.toLowerCase().includes(lowerQuery)) return 1;
|
|
186
|
+
return 0;
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
/** Resources that match a resource search query, best matches first (index order within a rank) */
|
|
190
|
+
export const rankResourceSearchItems = <T extends Pick<SearchItem, 'name' | 'key' | 'rawNode'>>(items: T[], query: string) =>
|
|
191
|
+
items
|
|
192
|
+
.map((item, index) => ({ item, index, rank: getResourceResultRank(item, query) }))
|
|
193
|
+
.filter(({ rank }) => rank > 0)
|
|
194
|
+
.sort((a, b) => b.rank - a.rank || a.index - b.index)
|
|
195
|
+
.map(({ item }) => item);
|
|
196
|
+
|
|
171
197
|
export const applyActiveFilter = <T extends { type: string }>(items: T[], activeFilter: string) => {
|
|
172
198
|
if (activeFilter === 'all') {
|
|
173
199
|
return items;
|
|
@@ -3,8 +3,12 @@ import { SEO } from 'astro-seo';
|
|
|
3
3
|
import config from '@config';
|
|
4
4
|
import defaultImageFile from '../../public/opengraph.png';
|
|
5
5
|
import { buildUrl } from '@utils/url-builder';
|
|
6
|
+
import { formatPageTitle } from '@utils/page-title';
|
|
6
7
|
|
|
7
|
-
const {
|
|
8
|
+
const { description = config.tagline, ogType = 'website' } = Astro.props;
|
|
9
|
+
// The page's own title (none for the homepage), followed by the catalog's
|
|
10
|
+
const title = formatPageTitle(Astro.props.title);
|
|
11
|
+
const ogTitle = title;
|
|
8
12
|
|
|
9
13
|
const siteBaseURL = new URL(Astro.url);
|
|
10
14
|
const defaultImage = new URL(defaultImageFile.src, siteBaseURL);
|
|
@@ -64,53 +64,58 @@ export const AssistantSettingsForm = ({ canEdit, initial, chatAvailable, inSSR,
|
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
return (
|
|
67
|
-
|
|
67
|
+
<>
|
|
68
68
|
<Toaster richColors closeButton position="bottom-right" theme="system" />
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
</div>
|
|
73
|
-
)}
|
|
74
|
-
|
|
75
|
-
<Row
|
|
76
|
-
title="Assistant Agent"
|
|
77
|
-
description="Assistant agent that answers questions about your architecture directly in your catalog."
|
|
78
|
-
canEdit={canEdit}
|
|
79
|
-
dirty={dirty}
|
|
80
|
-
saving={saving}
|
|
81
|
-
onSave={save}
|
|
69
|
+
<form
|
|
70
|
+
onSubmit={(e) => e.preventDefault()}
|
|
71
|
+
className="divide-y divide-[rgb(var(--ec-page-border))] border-t border-[rgb(var(--ec-page-border))]"
|
|
82
72
|
>
|
|
83
|
-
|
|
84
|
-
<
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
73
|
+
{!canEdit && (
|
|
74
|
+
<div className="pb-6">
|
|
75
|
+
<ReadOnlyBanner />
|
|
76
|
+
</div>
|
|
77
|
+
)}
|
|
78
|
+
|
|
79
|
+
<Row
|
|
80
|
+
title="Assistant Agent"
|
|
81
|
+
description="Assistant agent that answers questions about your architecture directly in your catalog."
|
|
82
|
+
canEdit={canEdit}
|
|
83
|
+
dirty={dirty}
|
|
84
|
+
saving={saving}
|
|
85
|
+
onSave={save}
|
|
86
|
+
>
|
|
87
|
+
<div className="space-y-3">
|
|
88
|
+
<ToggleRow
|
|
89
|
+
icon={<MessageSquare className="h-4 w-4" aria-hidden />}
|
|
90
|
+
label={chatEnabled ? 'Enabled' : 'Disabled'}
|
|
91
|
+
hint={
|
|
92
|
+
chatEnabled
|
|
93
|
+
? 'Event Catalog Assistant is visible in this catalog.'
|
|
94
|
+
: 'Event Catalog Assistant is hidden from this catalog.'
|
|
95
|
+
}
|
|
96
|
+
checked={chatEnabled}
|
|
97
|
+
disabled={!canEdit}
|
|
98
|
+
onChange={setChatEnabled}
|
|
99
|
+
/>
|
|
100
|
+
{chatEnabled &&
|
|
101
|
+
(chatAvailable ? (
|
|
102
|
+
<ConfigurationRequired />
|
|
103
|
+
) : !inSSR ? (
|
|
104
|
+
<AssistantNeedsSSR />
|
|
105
|
+
) : !hasChatConfigFile ? (
|
|
106
|
+
<AssistantNeedsConfigFile />
|
|
107
|
+
) : null)}
|
|
108
|
+
</div>
|
|
109
|
+
</Row>
|
|
110
|
+
</form>
|
|
111
|
+
</>
|
|
107
112
|
);
|
|
108
113
|
};
|
|
109
114
|
|
|
110
115
|
const ConfigurationRequired = () => (
|
|
111
|
-
<div className="rounded-lg border border-[rgb(var(--ec-
|
|
116
|
+
<div className="rounded-lg border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-text)/0.03)] px-4 py-3">
|
|
112
117
|
<div className="flex items-start gap-3">
|
|
113
|
-
<span className="flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-md border border-[rgb(var(--ec-
|
|
118
|
+
<span className="flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-text)/0.05)] text-[rgb(var(--ec-page-text))]">
|
|
114
119
|
<Wrench className="h-3.5 w-3.5" aria-hidden />
|
|
115
120
|
</span>
|
|
116
121
|
<div className="flex-1 min-w-0">
|
|
@@ -125,7 +130,7 @@ const ConfigurationRequired = () => (
|
|
|
125
130
|
target="_blank"
|
|
126
131
|
rel="noreferrer"
|
|
127
132
|
className={cn(
|
|
128
|
-
'mt-2 inline-flex items-center gap-1 text-[12px] font-medium text-[rgb(var(--ec-
|
|
133
|
+
'mt-2 inline-flex items-center gap-1 text-[12px] font-medium text-[rgb(var(--ec-page-text))] hover:underline'
|
|
129
134
|
)}
|
|
130
135
|
>
|
|
131
136
|
Configure the Agent
|
|
@@ -137,15 +142,15 @@ const ConfigurationRequired = () => (
|
|
|
137
142
|
);
|
|
138
143
|
|
|
139
144
|
const AssistantNeedsSSR = () => (
|
|
140
|
-
<div className="overflow-hidden rounded-lg border border-[rgb(var(--ec-
|
|
145
|
+
<div className="overflow-hidden rounded-lg border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-text)/0.03)]">
|
|
141
146
|
<div className="flex items-start gap-3 px-4 py-3.5">
|
|
142
|
-
<span className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-[rgb(var(--ec-
|
|
147
|
+
<span className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-text)/0.05)] text-[rgb(var(--ec-page-text))]">
|
|
143
148
|
<ServerCog className="h-4 w-4" aria-hidden />
|
|
144
149
|
</span>
|
|
145
150
|
<div className="flex-1 min-w-0">
|
|
146
151
|
<div className="flex items-center gap-2">
|
|
147
152
|
<p className="text-[13px] font-semibold text-[rgb(var(--ec-page-text))]">Server output mode required</p>
|
|
148
|
-
<span className="inline-flex items-center gap-1 rounded-full border border-[rgb(var(--ec-
|
|
153
|
+
<span className="inline-flex items-center gap-1 rounded-full border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-text)/0.05)] px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-[rgb(var(--ec-page-text))]">
|
|
149
154
|
SSR
|
|
150
155
|
</span>
|
|
151
156
|
</div>
|
|
@@ -157,7 +162,7 @@ const AssistantNeedsSSR = () => (
|
|
|
157
162
|
href={ASSISTANT_CONFIGURATION_DOCS_URL}
|
|
158
163
|
target="_blank"
|
|
159
164
|
rel="noreferrer"
|
|
160
|
-
className="inline-flex items-center gap-1 rounded-md bg-[rgb(var(--ec-
|
|
165
|
+
className="inline-flex items-center gap-1 rounded-md bg-[rgb(var(--ec-page-text))] px-3 py-1.5 text-[12px] font-semibold text-[rgb(var(--ec-page-bg))] shadow-sm transition-colors hover:opacity-85"
|
|
161
166
|
>
|
|
162
167
|
Configuration guide
|
|
163
168
|
<ExternalLink className="h-3 w-3" aria-hidden />
|
|
@@ -178,9 +183,9 @@ const AssistantNeedsSSR = () => (
|
|
|
178
183
|
);
|
|
179
184
|
|
|
180
185
|
const AssistantNeedsConfigFile = () => (
|
|
181
|
-
<div className="overflow-hidden rounded-lg border border-[rgb(var(--ec-
|
|
186
|
+
<div className="overflow-hidden rounded-lg border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-text)/0.03)]">
|
|
182
187
|
<div className="flex items-start gap-3 px-4 py-3.5">
|
|
183
|
-
<span className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-[rgb(var(--ec-
|
|
188
|
+
<span className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-text)/0.05)] text-[rgb(var(--ec-page-text))]">
|
|
184
189
|
<Wrench className="h-4 w-4" aria-hidden />
|
|
185
190
|
</span>
|
|
186
191
|
<div className="flex-1 min-w-0">
|
|
@@ -195,7 +200,7 @@ const AssistantNeedsConfigFile = () => (
|
|
|
195
200
|
href={ASSISTANT_CONFIGURATION_DOCS_URL}
|
|
196
201
|
target="_blank"
|
|
197
202
|
rel="noreferrer"
|
|
198
|
-
className="inline-flex items-center gap-1 rounded-md bg-[rgb(var(--ec-
|
|
203
|
+
className="inline-flex items-center gap-1 rounded-md bg-[rgb(var(--ec-page-text))] px-3 py-1.5 text-[12px] font-semibold text-[rgb(var(--ec-page-bg))] shadow-sm transition-colors hover:opacity-85"
|
|
199
204
|
>
|
|
200
205
|
Configuration guide
|
|
201
206
|
<ExternalLink className="h-3 w-3" aria-hidden />
|
|
@@ -179,193 +179,198 @@ export const GeneralSettingsForm = ({ canEdit, initial, apiBase }: Props) => {
|
|
|
179
179
|
};
|
|
180
180
|
|
|
181
181
|
return (
|
|
182
|
-
|
|
182
|
+
<>
|
|
183
183
|
<Toaster richColors closeButton position="bottom-right" theme="system" />
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
</div>
|
|
188
|
-
)}
|
|
189
|
-
|
|
190
|
-
<Row
|
|
191
|
-
title="Theme"
|
|
192
|
-
description="Pick a built-in colour theme. Selection updates the preview live; click Save to persist."
|
|
193
|
-
canEdit={canEdit}
|
|
194
|
-
dirty={dirtyKeys.has('theme')}
|
|
195
|
-
saving={savingKey === 'theme'}
|
|
196
|
-
onSave={() => saveRow('theme')}
|
|
197
|
-
error={errors.theme}
|
|
184
|
+
<form
|
|
185
|
+
onSubmit={(e) => e.preventDefault()}
|
|
186
|
+
className="divide-y divide-[rgb(var(--ec-page-border))] border-t border-[rgb(var(--ec-page-border))]"
|
|
198
187
|
>
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
style={{ background: 'rgba(255,255,255,0.4)' }}
|
|
233
|
-
aria-hidden
|
|
234
|
-
/>
|
|
235
|
-
{isActive && (
|
|
236
|
-
<span className="absolute right-1.5 top-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-white text-black shadow-sm">
|
|
237
|
-
<Check className="h-2.5 w-2.5" aria-hidden />
|
|
238
|
-
</span>
|
|
239
|
-
)}
|
|
240
|
-
</div>
|
|
241
|
-
<div className="flex items-center justify-between gap-2 px-3 py-2">
|
|
242
|
-
<span className="text-[12px] font-medium capitalize text-[rgb(var(--ec-page-text))]">{preview.label}</span>
|
|
243
|
-
{isCustom && (
|
|
244
|
-
<span className="rounded-full border border-[rgb(var(--ec-page-border))] px-1.5 py-0.5 text-[10px] uppercase tracking-wide text-[rgb(var(--ec-page-text-muted))]">
|
|
245
|
-
custom
|
|
246
|
-
</span>
|
|
188
|
+
{!canEdit && (
|
|
189
|
+
<div className="pb-6">
|
|
190
|
+
<ReadOnlyBanner />
|
|
191
|
+
</div>
|
|
192
|
+
)}
|
|
193
|
+
|
|
194
|
+
<Row
|
|
195
|
+
title="Theme"
|
|
196
|
+
description="Pick a built-in colour theme. Selection updates the preview live; click Save to persist."
|
|
197
|
+
canEdit={canEdit}
|
|
198
|
+
dirty={dirtyKeys.has('theme')}
|
|
199
|
+
saving={savingKey === 'theme'}
|
|
200
|
+
onSave={() => saveRow('theme')}
|
|
201
|
+
error={errors.theme}
|
|
202
|
+
>
|
|
203
|
+
<div className="grid grid-cols-2 gap-3 sm:grid-cols-3">
|
|
204
|
+
{themeOptions(form.theme).map((t) => {
|
|
205
|
+
const preview = THEME_PREVIEWS[t] ?? { accent: '#888', bg: '#1a1a1a', label: t };
|
|
206
|
+
const isActive = form.theme === t;
|
|
207
|
+
const isCustom = !isKnownTheme(t);
|
|
208
|
+
return (
|
|
209
|
+
<button
|
|
210
|
+
type="button"
|
|
211
|
+
key={t}
|
|
212
|
+
onClick={() => setField('theme', t)}
|
|
213
|
+
disabled={!canEdit}
|
|
214
|
+
aria-pressed={isActive}
|
|
215
|
+
className={cn(
|
|
216
|
+
'group relative flex flex-col overflow-hidden rounded-lg border text-left transition-all',
|
|
217
|
+
'disabled:cursor-not-allowed disabled:opacity-50',
|
|
218
|
+
isActive
|
|
219
|
+
? 'border-[rgb(var(--ec-page-text))] ring-2 ring-[rgb(var(--ec-page-text)/0.15)]'
|
|
220
|
+
: 'border-[rgb(var(--ec-page-border))] hover:border-[rgb(var(--ec-page-text-muted)/0.6)]'
|
|
247
221
|
)}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
222
|
+
>
|
|
223
|
+
<div className="relative h-14 w-full overflow-hidden" style={{ background: preview.bg }}>
|
|
224
|
+
<div
|
|
225
|
+
className="absolute -bottom-2 -right-2 h-12 w-12 rounded-full opacity-90 blur-md"
|
|
226
|
+
style={{ background: preview.accent }}
|
|
227
|
+
aria-hidden
|
|
228
|
+
/>
|
|
229
|
+
<div
|
|
230
|
+
className="absolute left-3 top-3 h-1.5 w-10 rounded-full opacity-90"
|
|
231
|
+
style={{ background: preview.accent }}
|
|
232
|
+
aria-hidden
|
|
233
|
+
/>
|
|
234
|
+
<div
|
|
235
|
+
className="absolute left-3 top-6 h-1 w-7 rounded-full opacity-60"
|
|
236
|
+
style={{ background: 'rgba(255,255,255,0.4)' }}
|
|
237
|
+
aria-hidden
|
|
238
|
+
/>
|
|
239
|
+
{isActive && (
|
|
240
|
+
<span className="absolute right-1.5 top-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-white text-black shadow-sm">
|
|
241
|
+
<Check className="h-2.5 w-2.5" aria-hidden />
|
|
242
|
+
</span>
|
|
243
|
+
)}
|
|
244
|
+
</div>
|
|
245
|
+
<div className="flex items-center justify-between gap-2 px-3 py-2">
|
|
246
|
+
<span className="text-[12px] font-medium capitalize text-[rgb(var(--ec-page-text))]">{preview.label}</span>
|
|
247
|
+
{isCustom && (
|
|
248
|
+
<span className="rounded-full border border-[rgb(var(--ec-page-border))] px-1.5 py-0.5 text-[10px] uppercase tracking-wide text-[rgb(var(--ec-page-text-muted))]">
|
|
249
|
+
custom
|
|
250
|
+
</span>
|
|
251
|
+
)}
|
|
252
|
+
</div>
|
|
253
|
+
</button>
|
|
254
|
+
);
|
|
255
|
+
})}
|
|
256
|
+
</div>
|
|
257
|
+
</Row>
|
|
254
258
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
259
|
+
<Row
|
|
260
|
+
title="Organization"
|
|
261
|
+
description="Used as the catalog name, the brand line next to the logo, and OpenGraph metadata."
|
|
262
|
+
canEdit={canEdit}
|
|
263
|
+
dirty={dirtyKeys.has('organization')}
|
|
264
|
+
saving={savingKey === 'organization'}
|
|
265
|
+
onSave={() => saveRow('organization')}
|
|
266
|
+
error={errors.organization}
|
|
267
|
+
>
|
|
268
|
+
<input
|
|
269
|
+
type="text"
|
|
270
|
+
value={form.organization}
|
|
271
|
+
onChange={handleChange('organization')}
|
|
272
|
+
disabled={!canEdit}
|
|
273
|
+
maxLength={100}
|
|
274
|
+
placeholder="Acme Inc."
|
|
275
|
+
className={cn(inputBase, errors.organization && inputError)}
|
|
276
|
+
required
|
|
277
|
+
/>
|
|
278
|
+
</Row>
|
|
275
279
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
280
|
+
<Row
|
|
281
|
+
title="Tagline"
|
|
282
|
+
description="A short subtitle shown beneath the organization name on the homepage."
|
|
283
|
+
canEdit={canEdit}
|
|
284
|
+
dirty={dirtyKeys.has('tagline')}
|
|
285
|
+
saving={savingKey === 'tagline'}
|
|
286
|
+
onSave={() => saveRow('tagline')}
|
|
287
|
+
error={errors.tagline}
|
|
288
|
+
>
|
|
289
|
+
<textarea
|
|
290
|
+
value={form.tagline}
|
|
291
|
+
onChange={handleChange('tagline')}
|
|
292
|
+
disabled={!canEdit}
|
|
293
|
+
maxLength={500}
|
|
294
|
+
rows={2}
|
|
295
|
+
placeholder="Discover and explore our events, services, and architecture."
|
|
296
|
+
className={cn(inputBase, 'resize-y', errors.tagline && inputError)}
|
|
297
|
+
/>
|
|
298
|
+
</Row>
|
|
295
299
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
300
|
+
<Row
|
|
301
|
+
title="Homepage link"
|
|
302
|
+
description="Where the logo links to. Useful for pointing back to your main site."
|
|
303
|
+
canEdit={canEdit}
|
|
304
|
+
dirty={dirtyKeys.has('homepageLink')}
|
|
305
|
+
saving={savingKey === 'homepageLink'}
|
|
306
|
+
onSave={() => saveRow('homepageLink')}
|
|
307
|
+
error={errors.homepageLink}
|
|
308
|
+
>
|
|
309
|
+
<input
|
|
310
|
+
type="url"
|
|
311
|
+
value={form.homepageLink}
|
|
312
|
+
onChange={handleChange('homepageLink')}
|
|
313
|
+
onBlur={handleUrlBlur('homepageLink')}
|
|
314
|
+
disabled={!canEdit}
|
|
315
|
+
placeholder="https://example.com"
|
|
316
|
+
className={cn(inputBase, monoInput, errors.homepageLink && inputError)}
|
|
317
|
+
/>
|
|
318
|
+
</Row>
|
|
315
319
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
320
|
+
<Row
|
|
321
|
+
title="Edit URL"
|
|
322
|
+
description="Base URL for the “Edit on GitHub” links shown on resource pages."
|
|
323
|
+
canEdit={canEdit}
|
|
324
|
+
dirty={dirtyKeys.has('editUrl')}
|
|
325
|
+
saving={savingKey === 'editUrl'}
|
|
326
|
+
onSave={() => saveRow('editUrl')}
|
|
327
|
+
error={errors.editUrl}
|
|
328
|
+
>
|
|
329
|
+
<input
|
|
330
|
+
type="url"
|
|
331
|
+
value={form.editUrl}
|
|
332
|
+
onChange={handleChange('editUrl')}
|
|
333
|
+
onBlur={handleUrlBlur('editUrl')}
|
|
334
|
+
disabled={!canEdit}
|
|
335
|
+
placeholder="https://github.com/org/repo/edit/main"
|
|
336
|
+
className={cn(inputBase, monoInput, errors.editUrl && inputError)}
|
|
337
|
+
/>
|
|
338
|
+
</Row>
|
|
335
339
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
340
|
+
<Row
|
|
341
|
+
title="Repository URL"
|
|
342
|
+
description="Link to your catalog's source repository. Shown in the header for quick navigation back to the code."
|
|
343
|
+
canEdit={canEdit}
|
|
344
|
+
dirty={dirtyKeys.has('repositoryUrl')}
|
|
345
|
+
saving={savingKey === 'repositoryUrl'}
|
|
346
|
+
onSave={() => saveRow('repositoryUrl')}
|
|
347
|
+
error={errors.repositoryUrl}
|
|
348
|
+
>
|
|
349
|
+
<input
|
|
350
|
+
type="url"
|
|
351
|
+
value={form.repositoryUrl}
|
|
352
|
+
onChange={handleChange('repositoryUrl')}
|
|
353
|
+
onBlur={handleUrlBlur('repositoryUrl')}
|
|
354
|
+
disabled={!canEdit}
|
|
355
|
+
placeholder="https://github.com/org/repo"
|
|
356
|
+
className={cn(inputBase, monoInput, errors.repositoryUrl && inputError)}
|
|
357
|
+
/>
|
|
358
|
+
</Row>
|
|
355
359
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
canEdit={canEdit}
|
|
360
|
-
// Logo upload saves itself directly; no inline Save button needed.
|
|
361
|
-
dirty={false}
|
|
362
|
-
>
|
|
363
|
-
<LogoUpload
|
|
360
|
+
<Row
|
|
361
|
+
title="Logo"
|
|
362
|
+
description="Image shown in the top-left corner. PNG, JPG, SVG, or WebP up to 2MB."
|
|
364
363
|
canEdit={canEdit}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
364
|
+
// Logo upload saves itself directly; no inline Save button needed.
|
|
365
|
+
dirty={false}
|
|
366
|
+
>
|
|
367
|
+
<LogoUpload
|
|
368
|
+
canEdit={canEdit}
|
|
369
|
+
initialSrc={initial.logo?.src ? `${initial.logo.src}?t=${Date.now()}` : undefined}
|
|
370
|
+
apiUrl={`${apiBase}/logo`}
|
|
371
|
+
/>
|
|
372
|
+
</Row>
|
|
373
|
+
</form>
|
|
374
|
+
</>
|
|
370
375
|
);
|
|
371
376
|
};
|