@eventcatalog/core 5.0.0-beta.9 → 5.0.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/LICENSE +13 -12
- package/README.md +5 -5
- package/dist/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +91 -44
- package/dist/analytics/log-build.d.cts +2 -2
- package/dist/analytics/log-build.d.ts +2 -2
- package/dist/analytics/log-build.js +6 -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/catalog-runtime.cjs +1 -1
- package/dist/{chunk-RFIXKATC.js → chunk-4G7FSRPN.js} +35 -42
- package/dist/{chunk-AWOO63ME.js → chunk-AD7CL772.js} +11 -4
- package/dist/chunk-CA6WCQ2T.js +54 -0
- package/dist/{chunk-GAHKCOQM.js → chunk-JZN4RSMF.js} +1 -1
- package/dist/{chunk-JQMYHZWI.js → chunk-NEAVAFSJ.js} +16 -8
- package/dist/{chunk-4CFZUHGG.js → chunk-NIVST4WY.js} +1 -1
- package/dist/{chunk-ENAG6UH7.js → chunk-NKNOXQ62.js} +1 -6
- package/dist/{chunk-ZEY2XUJN.js → chunk-OX6TSVHY.js} +6 -6
- package/dist/{chunk-36RYTYT5.js → chunk-PD7KTSYN.js} +1 -1
- package/dist/{chunk-EUNQJO3J.js → chunk-RE7UTPWH.js} +1 -1
- package/dist/chunk-S5GWAUG5.js +29 -0
- package/dist/{chunk-TZVDMWQX.js → chunk-YQGRMDRB.js} +4 -2
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/docs/api/02-config.md +57 -7
- package/dist/docs/development/00-why-eventcatalog.md +11 -11
- package/dist/docs/development/01-fundamentals.md +20 -13
- package/dist/docs/development/01-getting-started/configuration-overview.md +2 -2
- package/dist/docs/development/01-getting-started/installation.md +9 -1
- package/dist/docs/development/_getting-started.mdx +1 -1
- package/dist/docs/development/ask-your-architecture/01-intro.md +5 -5
- package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/01-what-is-eventcatalog-assistant.md +0 -4
- package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/02-configuration.md +15 -3
- package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/03-bring-your-own-tools.md +0 -3
- package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/_category_.json +1 -1
- package/dist/docs/development/ask-your-architecture/02-llms.txt.md +1 -1
- package/dist/docs/development/ask-your-architecture/{05-skills/01-introduction.md → 03-install-skills.md} +57 -7
- package/dist/docs/development/ask-your-architecture/03-mcp-server/_category_.json +1 -1
- package/dist/docs/development/ask-your-architecture/03-mcp-server/getting-started.md +86 -33
- package/dist/docs/development/ask-your-architecture/03-mcp-server/introduction.md +14 -4
- package/dist/docs/development/ask-your-architecture/03-schemas.txt.md +1 -1
- package/dist/docs/development/ask-your-architecture/04-agents/_category_.json +1 -1
- package/dist/docs/development/authentication/01-introduction.md +2 -23
- package/dist/docs/development/authentication/02-enabling-authentication.md +0 -20
- package/dist/docs/development/authentication/07-rbac-middleware.md +0 -2
- package/dist/docs/development/authentication/providers/03-setting-up-github.md +0 -2
- package/dist/docs/development/authentication/providers/03a-setting-up-google.md +0 -2
- package/dist/docs/development/authentication/providers/04-setting-up-azure-ad.md +0 -2
- package/dist/docs/development/authentication/providers/05-setting-up-okta.md +0 -3
- package/dist/docs/development/authentication/providers/06-setting-up-auth0.md +0 -2
- package/dist/docs/development/bring-your-own-documentation/01-introduction.md +0 -4
- package/dist/docs/development/bring-your-own-documentation/custom-pages/01-introduction.md +0 -3
- package/dist/docs/development/bring-your-own-documentation/custom-pages/02-adding-custom-docs.md +0 -17
- package/dist/docs/development/bring-your-own-documentation/custom-pages/03-components.md +0 -4
- package/dist/docs/development/bring-your-own-documentation/custom-pages/04-owners.md +0 -2
- package/dist/docs/development/bring-your-own-documentation/resource-docs/01-introduction.md +1 -3
- package/dist/docs/development/bring-your-own-documentation/resource-docs/02-adding-resource-docs.md +1 -4
- package/dist/docs/development/bring-your-own-documentation/resource-docs/03-categories.md +0 -2
- package/dist/docs/development/bring-your-own-documentation/resource-docs/04-versioning.md +1 -3
- package/dist/docs/development/components/components/11-flow.md +17 -0
- package/dist/docs/development/components/components/15-nodegraph.md +43 -10
- package/dist/docs/development/components/components/18-remote-schema.md +1 -4
- package/dist/docs/development/components/custom-components/07-reference.md +14 -0
- package/dist/docs/development/customization/02-themes.md +0 -5
- package/dist/docs/development/customization/03-search.md +1 -1
- package/dist/docs/development/customization/05-custom-pages-and-api-routes/01-introduction.md +0 -2
- package/dist/docs/development/customization/05-custom-pages-and-api-routes/04-reference.md +7 -1
- package/dist/docs/development/customization/05-resource-sidebar.md +1 -1
- package/dist/docs/development/customization/09-embed-eventcatalog.md +20 -25
- package/dist/docs/development/deployment/hosting-options.md +7 -2
- package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/05-fix-common-problems.md +16 -0
- package/dist/docs/development/developer-tools/eventcatalog-linter/reference/03-rules.md +31 -1
- package/dist/docs/development/developer-tools/eventcatalog-linter/reference/05-supported-resources.md +1 -1
- package/dist/docs/development/governance/architecture-change-detection/01-introduction.md +0 -10
- package/dist/docs/development/governance/architecture-change-detection/06-pipeline-gates.md +0 -4
- package/dist/docs/development/guides/97-architecture-graph.md +1 -1
- package/dist/docs/development/guides/99-adding-analytics.md +0 -7
- package/dist/docs/development/guides/domains/03-model-subdomains.md +2 -2
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/01-add-systems-to-domains.md +3 -1
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/02-add-services-to-domains.md +5 -1
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/03-add-messages-to-domains.md +2 -2
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/05-add-entities-to-domains.md +1 -1
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/06-domain-resources-page.md +40 -0
- package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-diagram.md +89 -0
- package/dist/docs/development/guides/domains/06-visualize-domains/_category_.json +1 -2
- package/dist/docs/development/guides/domains/09-reference.md +4 -4
- package/dist/docs/development/guides/owners/automated-teams-and-users/create-your-own-connector.md +0 -2
- package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-github.md +0 -3
- package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-microsoft-entra.md +0 -2
- package/dist/docs/development/guides/resources/adrs/03-linking-resources.md +8 -0
- package/dist/docs/development/guides/resources/adrs/06-reference.md +4 -4
- package/dist/docs/development/guides/resources/agents/11-reference.md +1 -1
- package/dist/docs/development/guides/resources/data/04-reference.md +1 -1
- package/dist/docs/development/guides/resources/data-products/07-reference.md +1 -1
- package/dist/docs/development/guides/resources/entities/05-entity-maps.md +1 -1
- package/dist/docs/development/guides/resources/entities/06-reference.md +2 -2
- package/dist/docs/development/guides/resources/flows/01-introduction.md +11 -1
- package/dist/docs/development/guides/resources/flows/03-model-flow-steps.md +65 -6
- package/dist/docs/development/guides/resources/flows/05-explore-flows.md +112 -0
- package/dist/docs/development/guides/resources/flows/06-reference.md +25 -4
- package/dist/docs/development/guides/resources/messages/01-what-are-messages.md +19 -0
- package/dist/docs/development/guides/resources/messages/04-message-channels/01-introduction.md +16 -0
- package/dist/docs/development/guides/resources/messages/04-message-channels/05-reference.md +2 -1
- package/dist/docs/development/guides/resources/messages/10-reference.md +6 -3
- package/dist/docs/development/guides/resources/schemas/04-explore-schemas/01-schema-explorer.md +2 -2
- package/dist/docs/development/guides/resources/schemas/04-explore-schemas/02-fields-explorer.md +0 -9
- package/dist/docs/development/guides/resources/schemas/05-schema-api.md +0 -3
- package/dist/docs/development/guides/resources/schemas/06-schema-mcp.md +11 -3
- package/dist/docs/development/guides/resources/services/04-add-resources-to-services/03-add-entities-to-services.md +1 -1
- package/dist/docs/development/guides/resources/services/05-resources-page.md +50 -0
- package/dist/docs/development/guides/resources/services/08-reference.md +2 -1
- package/dist/docs/development/guides/systems/01-introduction.md +1 -1
- package/dist/docs/development/guides/systems/02-create-system.md +2 -2
- package/dist/docs/development/guides/systems/03-add-resources-to-systems.md +35 -9
- package/dist/docs/development/guides/systems/04-model-relationships-and-actors.md +5 -3
- package/dist/docs/development/guides/systems/05-system-context-maps.md +39 -22
- package/dist/docs/development/guides/systems/06-reference.md +4 -4
- package/dist/docs/development/license/01-license-file.md +151 -0
- package/dist/docs/development/license/_category_.json +12 -0
- package/dist/docs/development/license-keys/_category_.json +3 -3
- package/dist/docs/development/license-keys/integrations.md +7 -37
- package/dist/docs/development/license-keys/license-validation.md +4 -0
- package/dist/docs/development/license-keys/overview.md +5 -1
- package/dist/docs/development/license-keys/plans.md +4 -2
- package/dist/docs/development/studio/01-introduction.md +60 -0
- package/dist/docs/development/studio/02-create-a-canvas.md +103 -0
- package/dist/docs/development/studio/03-set-up-persistent-storage.md +59 -0
- package/dist/docs/development/studio/04-collaborate-on-a-canvas.md +78 -0
- package/dist/docs/development/studio/05-connect-your-agent.md +102 -0
- package/dist/docs/development/studio/06-run-studio-in-production.md +54 -0
- package/dist/docs/development/studio/07-reference.md +294 -0
- package/dist/docs/development/studio/_category_.json +12 -0
- package/dist/docs/development/upgrading/v5.md +345 -0
- package/dist/docs/federation/00-overview.md +2 -8
- package/dist/docs/federation/01-first-federation.md +6 -18
- package/dist/docs/federation/explanation/how-it-works.md +0 -4
- package/dist/docs/federation/explanation/lockfile-and-cache.md +0 -4
- package/dist/docs/federation/explanation/mvp-status-and-feedback.md +0 -4
- package/dist/docs/federation/explanation/ownership-and-references.md +0 -4
- package/dist/docs/federation/how-to/configure-github-sources.md +6 -5
- package/dist/docs/federation/how-to/configure-validation-rules.md +0 -4
- package/dist/docs/federation/how-to/run-in-ci.md +2 -9
- package/dist/docs/federation/how-to/share-assets-and-components.md +0 -4
- package/dist/docs/federation/how-to/use-local-sources.md +0 -4
- package/dist/docs/federation/legacy-federation/00-introduction.md +4 -22
- package/dist/docs/federation/legacy-federation/01-installation.md +7 -58
- package/dist/docs/federation/legacy-federation/02-plugin-configuration.md +3 -21
- package/dist/docs/federation/legacy-federation/03-examples.md +3 -5
- package/dist/docs/federation/legacy-federation/04-configuration.md +3 -8
- package/dist/docs/federation/legacy-federation/05-setup-team-catalog.md +3 -6
- package/dist/docs/federation/reference/cli.md +2 -8
- package/dist/docs/federation/reference/configuration.md +0 -4
- package/dist/docs/federation/reference/diagnostic-rules.md +0 -5
- package/dist/docs/federation/reference/generated-output.md +0 -4
- package/dist/docs/federation/reference/supported-content.md +0 -4
- package/dist/docs/federation/reference/troubleshooting.md +0 -14
- package/dist/docs/plugins/02-generators.md +1 -1
- package/dist/docs/plugins/amazon-apigateway/00-intro.md +3 -28
- package/dist/docs/plugins/amazon-apigateway/01-installation.md +4 -56
- package/dist/docs/plugins/amazon-apigateway/02-plugin-configuration.md +1 -6
- package/dist/docs/plugins/apicurio/00-intro.md +2 -31
- package/dist/docs/plugins/apicurio/01-installation.md +2 -26
- package/dist/docs/plugins/apicurio/02-plugin-configuration.md +5 -13
- package/dist/docs/plugins/apicurio/03-features.md +1 -3
- package/dist/docs/plugins/asyncapi/00-intro.md +2 -28
- package/dist/docs/plugins/asyncapi/01-installation.md +3 -54
- package/dist/docs/plugins/asyncapi/02-plugin-configuration.md +2 -1
- package/dist/docs/plugins/aws-glue-registry/00-intro.md +4 -32
- package/dist/docs/plugins/aws-glue-registry/00a-installation.md +3 -53
- package/dist/docs/plugins/azure-schema-registry/00-intro.md +4 -32
- package/dist/docs/plugins/azure-schema-registry/01-installation.md +6 -33
- package/dist/docs/plugins/azure-schema-registry/02-plugin-configuration.md +1 -14
- package/dist/docs/plugins/azure-schema-registry/04-examples.md +0 -2
- package/dist/docs/plugins/backstage/00-overview.md +1 -7
- package/dist/docs/plugins/backstage/01-get-started.md +6 -15
- package/dist/docs/plugins/backstage/06-configuration.md +2 -8
- package/dist/docs/plugins/confluent-schema-registry/00-intro.md +2 -29
- package/dist/docs/plugins/confluent-schema-registry/01-installation.md +2 -26
- package/dist/docs/plugins/eventbridge/00-intro.md +0 -4
- package/dist/docs/plugins/eventbridge/00a-installation.md +1 -87
- package/dist/docs/plugins/eventbridge/03-api.md +2 -20
- package/dist/docs/plugins/github/00-intro.md +0 -31
- package/dist/docs/plugins/github/01-installation.md +2 -34
- package/dist/docs/plugins/graphql/00-intro.md +0 -30
- package/dist/docs/plugins/graphql/01-installation.md +1 -53
- package/dist/docs/plugins/graphql/02-plugin-configuration.md +0 -1
- package/dist/docs/plugins/hookdeck/01-intro.md +1 -1
- package/dist/docs/plugins/openapi/00-intro.md +0 -30
- package/dist/docs/plugins/openapi/01-installation.md +1 -57
- package/dist/docs/plugins/openapi/02-plugin-configuration.md +0 -5
- package/dist/docs/plugins/openapi/03-features.md +0 -4
- 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 +340 -249
- package/dist/eventcatalog.config.d.cts +18 -15
- package/dist/eventcatalog.config.d.ts +18 -15
- package/dist/eventcatalog.js +51 -33
- package/dist/features.cjs +36 -49
- package/dist/features.d.cts +1 -3
- package/dist/features.d.ts +1 -3
- package/dist/features.js +4 -6
- package/dist/federation/federate.cjs +37 -44
- package/dist/federation/federate.js +5 -5
- package/dist/federation/source-provider.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/htmlparser2.mjs +3 -0
- package/dist/runtime-dependencies/manifest.json +5 -1
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__cjs__create-element.js.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 +11 -4
- package/dist/utils/license-status.d.cts +3 -2
- package/dist/utils/license-status.d.ts +3 -2
- package/dist/utils/license-status.js +1 -1
- package/eventcatalog/astro.config.mjs +21 -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 +4 -1
- package/eventcatalog/src/components/CatalogGraph/CatalogForceGraph.tsx +39 -0
- package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +2 -0
- 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 +37 -76
- package/eventcatalog/src/components/SideNav/NestedSideBar/storage.ts +2 -0
- package/eventcatalog/src/components/SideNav/NestedSideBar/utils.ts +122 -1
- 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 +21 -1
- 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 +13 -7
- package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +6 -45
- package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +3 -3
- package/eventcatalog/src/features/mcp/apps/canvas/styles.css +3 -1
- package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +7 -5
- package/eventcatalog/src/features/mcp/apps/generated/canvas.html +123 -98
- package/eventcatalog/src/features/mcp/apps/generated/viewer.html +118 -101
- package/eventcatalog/src/features/mcp/mcp-server.ts +20 -4
- 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 +13 -10
- 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 +160 -34
- package/eventcatalog/src/features/studio/canvas-preview.ts +1 -2
- package/eventcatalog/src/features/studio/catalog.ts +16 -14
- package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +274 -105
- package/eventcatalog/src/features/studio/components/CanvasStatusMenu.tsx +15 -14
- package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +272 -119
- package/eventcatalog/src/features/studio/components/ConnectionsChooser.tsx +1 -2
- 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 +101 -26
- package/eventcatalog/src/features/studio/components/LeftPanel.tsx +122 -230
- 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 +52 -45
- package/eventcatalog/src/features/studio/components/ShareDialog.tsx +277 -141
- package/eventcatalog/src/features/studio/components/ShortcutsDialog.tsx +41 -0
- package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +1314 -385
- 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 +19 -2
- package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +9 -3
- package/eventcatalog/src/features/studio/hooks/use-comments.ts +2 -2
- package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +8 -3
- package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +244 -32
- package/eventcatalog/src/features/studio/identity.ts +25 -1
- package/eventcatalog/src/features/studio/limits.ts +2 -0
- package/eventcatalog/src/features/studio/pages/[id].astro +42 -16
- package/eventcatalog/src/features/studio/pages/index.astro +596 -373
- package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +12 -15
- package/eventcatalog/src/features/studio/server/canvas-mcp.ts +8 -23
- package/eventcatalog/src/features/studio/server/runtime.ts +150 -46
- package/eventcatalog/src/features/studio/server/sql/storage.sql +18 -0
- package/eventcatalog/src/features/studio/server/storage.ts +53 -73
- package/eventcatalog/src/features/studio/webmcp-relay/LICENSE +21 -0
- package/eventcatalog/src/features/studio/webmcp-relay/README.md +5 -0
- package/eventcatalog/src/features/studio/webmcp-relay/embed.js +2 -0
- package/eventcatalog/src/features/studio/webmcp-relay/widget.html +10 -0
- package/eventcatalog/src/features/studio/webmcp-relay/widget.js +1 -0
- package/eventcatalog/src/features/tools/catalog-tools.ts +3 -1
- package/eventcatalog/src/layouts/BaseLayout.astro +4 -4
- package/eventcatalog/src/layouts/SettingsLayout.astro +2 -2
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +3 -2
- 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 +9 -1
- 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/flows.ts +20 -7
- package/eventcatalog/src/utils/collections/resource-owners.ts +8 -2
- package/eventcatalog/src/utils/collections/resources.ts +2 -0
- package/eventcatalog/src/utils/collections/util.ts +8 -4
- package/eventcatalog/src/utils/git.ts +11 -0
- 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/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 +13 -0
- package/package.json +11 -11
- package/dist/docs/development/ask-your-architecture/05-skills/02-installation.md +0 -60
- package/dist/docs/development/ask-your-architecture/05-skills/_category_.json +0 -11
- package/dist/docs/development/ask-your-architecture/06-slack-integration/01-introduction.md +0 -63
- package/dist/docs/development/ask-your-architecture/06-slack-integration/02-slack-app-setup.md +0 -154
- package/dist/docs/development/ask-your-architecture/06-slack-integration/03-installation.md +0 -169
- package/dist/docs/development/ask-your-architecture/06-slack-integration/04-deployment.md +0 -236
- package/dist/docs/development/ask-your-architecture/06-slack-integration/05-usage.md +0 -140
- package/dist/docs/development/ask-your-architecture/06-slack-integration/06-troubleshooting.md +0 -268
- package/dist/docs/development/ask-your-architecture/06-slack-integration/_category_.json +0 -13
- package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-integration-map.md +0 -40
- package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +0 -3
- package/eventcatalog/src/features/studio/canvas-doc.ts +0 -409
- package/eventcatalog/src/features/studio/clipboard.ts +0 -97
- package/eventcatalog/src/features/studio/components/CanvasControls.tsx +0 -154
- package/eventcatalog/src/features/studio/components/Comments.tsx +0 -770
- package/eventcatalog/src/features/studio/components/ContainerChooser.tsx +0 -145
- package/eventcatalog/src/features/studio/components/DragGhost.tsx +0 -115
- package/eventcatalog/src/features/studio/components/Picture.tsx +0 -21
- package/eventcatalog/src/features/studio/components/PropertiesPanel.tsx +0 -212
- package/eventcatalog/src/features/studio/components/canvas-nodes.tsx +0 -255
- package/eventcatalog/src/features/studio/components/icons.ts +0 -53
- package/eventcatalog/src/features/studio/components/status.ts +0 -51
- package/eventcatalog/src/features/studio/edges.ts +0 -56
- package/eventcatalog/src/features/studio/flow-state.ts +0 -92
- package/eventcatalog/src/features/studio/grouping.ts +0 -226
- package/eventcatalog/src/features/studio/layout.ts +0 -42
- package/eventcatalog/src/features/studio/levels.ts +0 -282
- package/eventcatalog/src/features/studio/node-types.ts +0 -205
- package/eventcatalog/src/features/studio/pages/new.astro +0 -24
- package/eventcatalog/src/features/studio/pages/wake.ts +0 -15
- package/eventcatalog/src/features/studio/placement.ts +0 -197
- package/eventcatalog/src/features/studio/studio.css +0 -273
- package/dist/{chunk-A2RZR3U4.js → chunk-6K7XZAYI.js} +3 -3
|
@@ -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
|
};
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react';
|
|
2
|
-
import { ArrowUpRight, Clock, TriangleAlert } from 'lucide-react';
|
|
2
|
+
import { ArrowUpRight, Clock, Info, Mail, TriangleAlert } from 'lucide-react';
|
|
3
3
|
import { Row, cn } from './Row';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
BUY_BUSINESS_URL,
|
|
6
|
+
getTrialStatus,
|
|
7
|
+
LICENSE_FAQ_URL,
|
|
8
|
+
LICENSE_REMINDER_DAYS,
|
|
9
|
+
LICENSE_RENEW_URL,
|
|
10
|
+
PRICING_URL,
|
|
11
|
+
TALK_TO_US_URL,
|
|
12
|
+
TRIAL_LENGTH_DAYS,
|
|
13
|
+
} from '@utils/trial';
|
|
5
14
|
|
|
6
15
|
/**
|
|
7
16
|
* The license status (see getLicenseStatus in @utils/license) with dates as unix ms, so it can be
|
|
@@ -35,7 +44,8 @@ const PILL_TONES: Record<Tone, string> = {
|
|
|
35
44
|
'border-[rgb(var(--ec-badge-color-amber-text)/0.3)] bg-[rgb(var(--ec-badge-color-amber-background))] text-[rgb(var(--ec-badge-color-amber-text))]',
|
|
36
45
|
danger:
|
|
37
46
|
'border-[rgb(var(--ec-badge-color-red-text)/0.3)] bg-[rgb(var(--ec-badge-color-red-background))] text-[rgb(var(--ec-badge-color-red-text))]',
|
|
38
|
-
|
|
47
|
+
// Black on light themes, white on dark: the catalog's accent colour reads as a warning
|
|
48
|
+
info: 'border-transparent bg-[rgb(var(--ec-page-text))] text-[rgb(var(--ec-page-bg))]',
|
|
39
49
|
neutral: 'border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg))] text-[rgb(var(--ec-page-text-muted))]',
|
|
40
50
|
};
|
|
41
51
|
|
|
@@ -120,11 +130,21 @@ const LicenseNotice = ({ license, now }: { license: LicenseProps; now: number })
|
|
|
120
130
|
<p className="text-[13px] font-semibold">
|
|
121
131
|
{expired ? 'Your commercial license has expired' : `Your commercial license expires in ${formatDays(daysLeft!)}`}
|
|
122
132
|
</p>
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
133
|
+
{expired ? (
|
|
134
|
+
<>
|
|
135
|
+
<p className="text-[13px] opacity-90">
|
|
136
|
+
It expired on {formatDate(expiresAt)}. Organisations that don't qualify for Free Use need a commercial license to
|
|
137
|
+
use EventCatalog in production.
|
|
138
|
+
</p>
|
|
139
|
+
<p className="text-[13px] opacity-90">
|
|
140
|
+
Your catalog keeps building and running. Renew to stay licensed, or talk to us if anything has changed.
|
|
141
|
+
</p>
|
|
142
|
+
</>
|
|
143
|
+
) : (
|
|
144
|
+
<p className="text-[13px] opacity-90">
|
|
145
|
+
It expires on {formatDate(expiresAt)}. Renew it before then to keep using EventCatalog commercially.
|
|
146
|
+
</p>
|
|
147
|
+
)}
|
|
128
148
|
<div className="flex flex-wrap items-center gap-3 pt-2">
|
|
129
149
|
<a
|
|
130
150
|
href={LICENSE_RENEW_URL}
|
|
@@ -135,6 +155,14 @@ const LicenseNotice = ({ license, now }: { license: LicenseProps; now: number })
|
|
|
135
155
|
Renew license
|
|
136
156
|
<ArrowUpRight className="h-3.5 w-3.5" aria-hidden />
|
|
137
157
|
</a>
|
|
158
|
+
<a
|
|
159
|
+
href={TALK_TO_US_URL}
|
|
160
|
+
target="_blank"
|
|
161
|
+
rel="noreferrer"
|
|
162
|
+
className="text-[13px] font-medium underline underline-offset-2 hover:opacity-80"
|
|
163
|
+
>
|
|
164
|
+
Talk to us
|
|
165
|
+
</a>
|
|
138
166
|
<a
|
|
139
167
|
href={LICENSE_FAQ_URL}
|
|
140
168
|
target="_blank"
|
|
@@ -149,6 +177,55 @@ const LicenseNotice = ({ license, now }: { license: LicenseProps; now: number })
|
|
|
149
177
|
);
|
|
150
178
|
};
|
|
151
179
|
|
|
180
|
+
// Where a customer with a legacy key asks for a license.jwt (as the license FAQ does)
|
|
181
|
+
const LICENSE_CONTACT_EMAIL = 'hello@eventcatalog.dev';
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* A Scale or Starter plan uses a license key from before EventCatalog 5, checked online. It still works, but the
|
|
185
|
+
* customer should ask us for a license.jwt (checked offline) for their plan.
|
|
186
|
+
*/
|
|
187
|
+
const LegacyKeyNotice = ({ plan }: { plan: 'scale' | 'starter' }) => {
|
|
188
|
+
const subject = encodeURIComponent(`A license.jwt for our ${PLAN_NAMES[plan]} plan`);
|
|
189
|
+
return (
|
|
190
|
+
<div
|
|
191
|
+
role="note"
|
|
192
|
+
className="flex gap-3 rounded-lg border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-text)/0.05)] p-4 text-[rgb(var(--ec-page-text))]"
|
|
193
|
+
>
|
|
194
|
+
<Info className="mt-0.5 h-4 w-4 shrink-0 text-[rgb(var(--ec-page-text))]" aria-hidden />
|
|
195
|
+
<div className="space-y-1">
|
|
196
|
+
<p className="text-[13px] font-semibold">You're using a legacy license key</p>
|
|
197
|
+
<p className="text-[13px] text-[rgb(var(--ec-page-text-muted))]">
|
|
198
|
+
Your plan still works. Its key is from before EventCatalog 5.
|
|
199
|
+
</p>
|
|
200
|
+
<p className="text-[13px] text-[rgb(var(--ec-page-text-muted))]">
|
|
201
|
+
Contact us for a new key: a license.jwt file, checked offline.
|
|
202
|
+
</p>
|
|
203
|
+
<div className="pt-2">
|
|
204
|
+
<a
|
|
205
|
+
href={`mailto:${LICENSE_CONTACT_EMAIL}?subject=${subject}`}
|
|
206
|
+
className="inline-flex items-center gap-1.5 rounded-md bg-[rgb(var(--ec-page-text))] px-3.5 py-1.5 text-[13px] font-medium text-[rgb(var(--ec-page-bg))] shadow-sm transition-opacity hover:opacity-85"
|
|
207
|
+
>
|
|
208
|
+
Contact us for a new key
|
|
209
|
+
<Mail className="h-3.5 w-3.5" aria-hidden />
|
|
210
|
+
</a>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
);
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// For organisations that don't need to pay: without it, the trial reads as "EventCatalog is now paid"
|
|
218
|
+
const FreeUseNotice = () => (
|
|
219
|
+
<p className="text-[13px] leading-relaxed text-[rgb(var(--ec-content-text-muted,var(--ec-page-text-muted)))]">
|
|
220
|
+
<span className="font-medium text-[rgb(var(--ec-page-text))]">You may qualify for Free Use.</span> Under $10M revenue and $10M
|
|
221
|
+
raised, an individual or an open-source project? You can use EventCatalog for free.{' '}
|
|
222
|
+
<a href={LICENSE_RENEW_URL} target="_blank" rel="noreferrer" className="underline underline-offset-2 hover:opacity-80">
|
|
223
|
+
Get a free key at eventcatalog.cloud
|
|
224
|
+
</a>
|
|
225
|
+
.
|
|
226
|
+
</p>
|
|
227
|
+
);
|
|
228
|
+
|
|
152
229
|
const LicenseTable = ({ license, now }: { license: LicenseProps; now: number }) => {
|
|
153
230
|
if (license.state === 'plan') {
|
|
154
231
|
return (
|
|
@@ -243,46 +320,78 @@ interface Props {
|
|
|
243
320
|
trialStartedAt?: number;
|
|
244
321
|
/** When the page was rendered, unix ms: the first render matches the server's, then it counts from now */
|
|
245
322
|
renderedAt: number;
|
|
323
|
+
/** EventCatalog's license (the Business Source License) on GitHub */
|
|
324
|
+
licenseUrl: string;
|
|
246
325
|
}
|
|
247
326
|
|
|
248
|
-
export const LicenseSettings = ({ license, trialStartedAt, renderedAt }: Props) => {
|
|
327
|
+
export const LicenseSettings = ({ license, trialStartedAt, renderedAt, licenseUrl }: Props) => {
|
|
249
328
|
const [now, setNow] = useState(renderedAt);
|
|
250
329
|
useEffect(() => setNow(Date.now()), []);
|
|
330
|
+
// A catalog is on the trial or has a license: an expired license is shown (to renew), not the trial. As in the header.
|
|
331
|
+
const onTrial = license.state === 'none' || license.state === 'invalid';
|
|
332
|
+
// While the trial runs, buying starts from pricing; once it has ended, from the Business order form
|
|
333
|
+
const trialEnded = onTrial && getTrialStatus(trialStartedAt, now)?.ended;
|
|
251
334
|
|
|
252
335
|
return (
|
|
253
|
-
|
|
336
|
+
// A top border, as on the other settings pages
|
|
337
|
+
<div className="divide-y divide-[rgb(var(--ec-page-border))] border-t border-[rgb(var(--ec-page-border))]">
|
|
254
338
|
<Row
|
|
255
339
|
title="License"
|
|
256
|
-
description=
|
|
340
|
+
description={
|
|
341
|
+
<>
|
|
342
|
+
EventCatalog is licensed under the{' '}
|
|
343
|
+
<a href={licenseUrl} target="_blank" rel="noreferrer" className="underline underline-offset-2 hover:opacity-80">
|
|
344
|
+
Business Source License 1.1
|
|
345
|
+
</a>
|
|
346
|
+
. Your license is read from the license.jwt file in the root of your catalog. The{' '}
|
|
347
|
+
<a href={LICENSE_FAQ_URL} target="_blank" rel="noreferrer" className="underline underline-offset-2 hover:opacity-80">
|
|
348
|
+
license FAQ
|
|
349
|
+
</a>{' '}
|
|
350
|
+
explains who can use EventCatalog for free.
|
|
351
|
+
</>
|
|
352
|
+
}
|
|
353
|
+
aside={
|
|
354
|
+
(onTrial || license.state === 'expired') && (
|
|
355
|
+
<div className="space-y-3">
|
|
356
|
+
<FreeUseNotice />
|
|
357
|
+
<p className="text-[13px] leading-relaxed text-[rgb(var(--ec-content-text-muted,var(--ec-page-text-muted)))]">
|
|
358
|
+
Questions about licensing, or need something different? Get in touch and let us know how we can help.
|
|
359
|
+
</p>
|
|
360
|
+
</div>
|
|
361
|
+
)
|
|
362
|
+
}
|
|
257
363
|
canEdit={false}
|
|
258
364
|
dirty={false}
|
|
259
365
|
>
|
|
260
366
|
<div className="space-y-4">
|
|
261
367
|
<LicenseTable license={license} now={now} />
|
|
262
368
|
<LicenseNotice license={license} now={now} />
|
|
263
|
-
{
|
|
264
|
-
{
|
|
265
|
-
|
|
369
|
+
{license.state === 'plan' && <LegacyKeyNotice plan={license.plan} />}
|
|
370
|
+
{onTrial && <TrialTable trialStartedAt={trialStartedAt} now={now} />}
|
|
371
|
+
{onTrial && (
|
|
372
|
+
<div className="flex flex-wrap gap-3">
|
|
373
|
+
<a
|
|
374
|
+
href={trialEnded ? BUY_BUSINESS_URL : PRICING_URL}
|
|
375
|
+
target="_blank"
|
|
376
|
+
rel="noreferrer"
|
|
377
|
+
className="inline-flex items-center gap-1.5 rounded-md bg-[rgb(var(--ec-page-text))] px-4 py-2 text-[13px] font-medium text-[rgb(var(--ec-page-bg))] shadow-sm transition-opacity hover:opacity-85"
|
|
378
|
+
>
|
|
379
|
+
{trialEnded ? 'Buy Business' : 'Buy a license'}
|
|
380
|
+
<ArrowUpRight className="h-3.5 w-3.5" aria-hidden />
|
|
381
|
+
</a>
|
|
382
|
+
<a
|
|
383
|
+
href={TALK_TO_US_URL}
|
|
384
|
+
target="_blank"
|
|
385
|
+
rel="noreferrer"
|
|
386
|
+
className="inline-flex items-center gap-1.5 rounded-md border border-[rgb(var(--ec-page-border))] px-4 py-2 text-[13px] font-medium text-[rgb(var(--ec-page-text))] transition-opacity hover:opacity-80"
|
|
387
|
+
>
|
|
388
|
+
Talk to us
|
|
389
|
+
<ArrowUpRight className="h-3.5 w-3.5" aria-hidden />
|
|
390
|
+
</a>
|
|
391
|
+
</div>
|
|
266
392
|
)}
|
|
267
393
|
</div>
|
|
268
394
|
</Row>
|
|
269
|
-
|
|
270
|
-
<Row
|
|
271
|
-
title="Learn more"
|
|
272
|
-
description="Who can use EventCatalog for free, and when you need a commercial license."
|
|
273
|
-
canEdit={false}
|
|
274
|
-
dirty={false}
|
|
275
|
-
>
|
|
276
|
-
<a
|
|
277
|
-
href={LICENSE_FAQ_URL}
|
|
278
|
-
target="_blank"
|
|
279
|
-
rel="noreferrer"
|
|
280
|
-
className="inline-flex items-center gap-1.5 rounded-md bg-[rgb(var(--ec-page-text))] px-4 py-2 text-[13px] font-medium text-[rgb(var(--ec-page-bg))] shadow-sm transition-opacity hover:opacity-85"
|
|
281
|
-
>
|
|
282
|
-
Read the license FAQ
|
|
283
|
-
<ArrowUpRight className="h-3.5 w-3.5" aria-hidden />
|
|
284
|
-
</a>
|
|
285
|
-
</Row>
|
|
286
395
|
</div>
|
|
287
396
|
);
|
|
288
397
|
};
|