@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
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { readFile, rm
|
|
1
|
+
import { readFile, rm } from 'node:fs/promises';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { pathToFileURL } from 'node:url';
|
|
5
|
-
import {
|
|
5
|
+
import { register } from 'node:module';
|
|
6
6
|
|
|
7
7
|
export async function cleanup(projectDirectory) {
|
|
8
8
|
const filePath = path.join(projectDirectory, 'eventcatalog.config.mjs');
|
|
@@ -11,75 +11,73 @@ export async function cleanup(projectDirectory) {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
14
|
+
let hidesConfigModuleTypeWarning = false;
|
|
15
|
+
let loads = 0;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Node loads an eventcatalog.config.js that uses import/export as an ES module even when the catalog's
|
|
19
|
+
* package.json has no "type": "module" (a new catalog's doesn't), and warns that it had to detect it.
|
|
20
|
+
* That warning, for the config file only, is hidden: the catalog doesn't need to change anything.
|
|
21
|
+
*/
|
|
22
|
+
const hideConfigModuleTypeWarning = () => {
|
|
23
|
+
if (hidesConfigModuleTypeWarning) return;
|
|
24
|
+
hidesConfigModuleTypeWarning = true;
|
|
25
|
+
|
|
26
|
+
const emitWarning = process.emitWarning;
|
|
27
|
+
process.emitWarning = function (warning, ...args) {
|
|
28
|
+
const code = typeof args[0] === 'object' ? args[0]?.code : args[1];
|
|
29
|
+
const message = typeof warning === 'string' ? warning : warning?.message;
|
|
30
|
+
if (code === 'MODULE_TYPELESS_PACKAGE_JSON' && message?.includes('eventcatalog.config.js')) return;
|
|
31
|
+
return emitWarning.call(this, warning, ...args);
|
|
32
|
+
};
|
|
32
33
|
};
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
// Marks a config URL Node should load as an ES module, whatever the catalog's package.json says
|
|
36
|
+
const AS_MODULE_QUERY = 'eventcatalog-config-as-module';
|
|
37
|
+
let loadsMarkedConfigsAsModules = false;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Node won't load a config written with import/export in a catalog whose package.json has
|
|
41
|
+
* "type": "commonjs". A loader hook loads that config file (and only it) as an ES module.
|
|
42
|
+
*/
|
|
43
|
+
const loadMarkedConfigsAsModules = () => {
|
|
44
|
+
if (loadsMarkedConfigsAsModules) return;
|
|
45
|
+
loadsMarkedConfigsAsModules = true;
|
|
46
|
+
const hook = `export async function load(url, context, nextLoad) {
|
|
47
|
+
return nextLoad(url, url.includes('${AS_MODULE_QUERY}=') ? { ...context, format: 'module' } : context);
|
|
48
|
+
}`;
|
|
49
|
+
register(`data:text/javascript,${encodeURIComponent(hook)}`);
|
|
42
50
|
};
|
|
43
51
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Loads the catalog's eventcatalog.config.js from where it is, so paths it builds from its own location
|
|
54
|
+
* (`import.meta.url`, `import.meta.dirname`) and its relative imports point into the catalog. It was
|
|
55
|
+
* loaded from a copy in a temporary folder before, which broke them (e.g. the paths to a generator's specs).
|
|
56
|
+
*/
|
|
57
|
+
const isCommonJSPackage = async (projectDirectory) => {
|
|
58
|
+
try {
|
|
59
|
+
const packageJson = JSON.parse(await readFile(path.join(projectDirectory, 'package.json'), 'utf-8'));
|
|
60
|
+
return packageJson?.type === 'commonjs';
|
|
61
|
+
} catch {
|
|
62
|
+
return false;
|
|
49
63
|
}
|
|
50
|
-
|
|
51
|
-
const tempDir = await mkdtemp(path.join(tmpdir(), 'eventcatalog-config-'));
|
|
52
|
-
await linkNodeModulesIntoTempDirectory({ projectDirectory, tempDir });
|
|
53
|
-
return tempDir;
|
|
54
64
|
};
|
|
55
65
|
|
|
56
66
|
export const getEventCatalogConfigFile = async (projectDirectory) => {
|
|
57
|
-
let tempDir;
|
|
58
|
-
|
|
59
67
|
try {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
68
|
+
hideConfigModuleTypeWarning();
|
|
69
|
+
// A catalog's config is an ES module, as it always was (with "type": "commonjs" it was loaded from an .mjs copy)
|
|
70
|
+
const asModule = await isCommonJSPackage(projectDirectory);
|
|
71
|
+
if (asModule) loadMarkedConfigsAsModules();
|
|
64
72
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
tempDir = await createTemporaryConfigDirectory(projectDirectory);
|
|
70
|
-
configFilePath = path.join(tempDir, 'eventcatalog.config.mjs');
|
|
71
|
-
await copyFile(path.join(projectDirectory, 'eventcatalog.config.js'), configFilePath);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const configFileURL = `${pathToFileURL(configFilePath).href}?t=${Date.now()}`;
|
|
75
|
-
const config = await import(/* @vite-ignore */ configFileURL);
|
|
73
|
+
const configFileURL = pathToFileURL(path.join(projectDirectory, 'eventcatalog.config.js')).href;
|
|
74
|
+
// A new URL each time, so a changed config is loaded again (not `?t=`: Vite drops it as its own timestamp)
|
|
75
|
+
const query = `${asModule ? AS_MODULE_QUERY : 'loaded'}=${Date.now()}-${loads++}`;
|
|
76
|
+
const config = await import(/* @vite-ignore */ `${configFileURL}?${query}`);
|
|
76
77
|
|
|
77
78
|
return config.default;
|
|
78
79
|
} finally {
|
|
80
|
+
// Earlier versions loaded a copy from eventcatalog.config.mjs in the catalog: remove one left behind
|
|
79
81
|
await cleanup(projectDirectory);
|
|
80
|
-
|
|
81
|
-
if (tempDir) {
|
|
82
|
-
await rm(tempDir, { recursive: true, force: true });
|
|
83
|
-
}
|
|
84
82
|
}
|
|
85
83
|
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Astro writes its content data store as the dev server starts, which sends the browser a
|
|
2
|
+
// full reload. With no browser connected yet, Vite holds that reload and hands it to the
|
|
3
|
+
// first page that connects, so the first page opened after every start loaded twice.
|
|
4
|
+
// A reload sent before any page has been served has nothing to refresh (a tab left open
|
|
5
|
+
// from the previous run reloads itself when it reconnects), so drop those. Once a page has
|
|
6
|
+
// been requested, reloads pass through as usual.
|
|
7
|
+
|
|
8
|
+
const isFullReload = (payload) => typeof payload === 'object' && payload?.type === 'full-reload';
|
|
9
|
+
|
|
10
|
+
export default function skipStartupReload() {
|
|
11
|
+
return {
|
|
12
|
+
name: 'eventcatalog:skip-startup-reload',
|
|
13
|
+
apply: 'serve',
|
|
14
|
+
configureServer(server) {
|
|
15
|
+
let pageRequested = false;
|
|
16
|
+
server.middlewares.use((req, _res, next) => {
|
|
17
|
+
// Browser navigations ask for HTML; the CLI's prewarm request doesn't
|
|
18
|
+
if (!pageRequested && req.headers.accept?.includes('text/html')) pageRequested = true;
|
|
19
|
+
next();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
for (const channel of new Set([server.ws, server.environments?.client?.hot].filter(Boolean))) {
|
|
23
|
+
const send = channel.send.bind(channel);
|
|
24
|
+
channel.send = (...args) => {
|
|
25
|
+
if (!pageRequested && isFullReload(args[0])) return;
|
|
26
|
+
return send(...args);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Astro crawls framework packages with vitefu, which looks them up concurrently and lists
|
|
2
|
+
// each one in `resolve.external` / `resolve.noExternal` as its lookup finishes, so the
|
|
3
|
+
// order changes from one start to the next. Vite hashes these lists unsorted to decide
|
|
4
|
+
// whether its pre-bundled dependencies are still valid, so every `eventcatalog dev` saw a
|
|
5
|
+
// "changed" config and re-bundled all of them. Only membership matters in these lists, so
|
|
6
|
+
// sorting them keeps the hash (and the dependency cache) stable across starts.
|
|
7
|
+
|
|
8
|
+
const byName = (a, b) => {
|
|
9
|
+
const left = String(a);
|
|
10
|
+
const right = String(b);
|
|
11
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const sortResolveLists = (resolve) => {
|
|
15
|
+
if (Array.isArray(resolve?.external)) resolve.external.sort(byName);
|
|
16
|
+
if (Array.isArray(resolve?.noExternal)) resolve.noExternal.sort(byName);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default function stableDependencyOrder() {
|
|
20
|
+
return {
|
|
21
|
+
name: 'eventcatalog:stable-dependency-order',
|
|
22
|
+
apply: 'serve',
|
|
23
|
+
configResolved(config) {
|
|
24
|
+
sortResolveLists(config.resolve);
|
|
25
|
+
sortResolveLists(config.ssr);
|
|
26
|
+
for (const environment of Object.values(config.environments ?? {})) sortResolveLists(environment.resolve);
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { startStorage } from '../src/features/storage/database.ts';
|
|
2
|
+
|
|
3
|
+
// The state EventCatalog keeps (`storage` in eventcatalog.config.js): as the dev server starts, its database is opened
|
|
4
|
+
// and brought up to date (migrated), whether or not a feature that uses it is opened. `eventcatalog start` does the
|
|
5
|
+
// same through /_eventcatalog/start.
|
|
6
|
+
export default function storage() {
|
|
7
|
+
return {
|
|
8
|
+
name: 'eventcatalog-storage',
|
|
9
|
+
hooks: {
|
|
10
|
+
'astro:server:setup': async ({ logger }) => {
|
|
11
|
+
try {
|
|
12
|
+
const file = await startStorage();
|
|
13
|
+
if (file) logger.info(`Database ready (${file})`);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
logger.error(`Could not open the database: ${error.message}`);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getStudioRuntime } from '../src/features/studio/server/runtime.ts';
|
|
2
|
+
import { isDatabaseTooNew } from '../src/features/storage/migrations.ts';
|
|
2
3
|
import config from '../src/utils/eventcatalog-config/source.ts';
|
|
3
4
|
import { isCanvasEnabled } from '../src/utils/feature.ts';
|
|
4
5
|
|
|
@@ -14,8 +15,10 @@ export default function studioServer() {
|
|
|
14
15
|
const projectDirectory = process.env.PROJECT_DIR || process.cwd();
|
|
15
16
|
// Canvases are loaded from storage before anyone can open one
|
|
16
17
|
try {
|
|
17
|
-
await runtime.useStorage(config.
|
|
18
|
+
await runtime.useStorage(config.storage, projectDirectory);
|
|
18
19
|
} catch (error) {
|
|
20
|
+
// Not kept in memory instead (changes would quietly stop being saved): Studio's pages say why
|
|
21
|
+
if (isDatabaseTooNew(error)) return logger.error(`Studio isn't available: ${error.message}`);
|
|
19
22
|
logger.error(`Could not use the Studio storage configured, keeping canvases in memory: ${error.message}`);
|
|
20
23
|
await runtime.useStorage({ type: 'memory' }, projectDirectory);
|
|
21
24
|
}
|
|
@@ -170,6 +170,16 @@ const nodeRadius = (degree: number, isHub = false) =>
|
|
|
170
170
|
/** Above this node count, expensive extras (collision force) are disabled. */
|
|
171
171
|
const LARGE_GRAPH_NODE_COUNT = 1500;
|
|
172
172
|
|
|
173
|
+
/**
|
|
174
|
+
* The first layout settles before it paints instead of animating into place for ~5s: ticks
|
|
175
|
+
* run in short slices across frames (no long tasks) until it settles, ~40ms of work for 100
|
|
176
|
+
* nodes. Big catalogs stop once ticking has taken the work limit, paint past their largest
|
|
177
|
+
* moves and animate the rest. The limit counts ticking time, not elapsed time, so a page busy
|
|
178
|
+
* hydrating other islands doesn't cut the settle short.
|
|
179
|
+
*/
|
|
180
|
+
const INITIAL_SETTLE_SLICE_MS = 12;
|
|
181
|
+
const INITIAL_SETTLE_WORK_LIMIT_MS = 400;
|
|
182
|
+
|
|
173
183
|
/** Sprite resolution for node icons (drawn scaled-down, so keep it crisp) */
|
|
174
184
|
const ICON_SPRITE_SIZE = 64;
|
|
175
185
|
|
|
@@ -617,6 +627,10 @@ const CatalogForceGraph = ({
|
|
|
617
627
|
// normal-sized, whatever the lens's usual hubs are
|
|
618
628
|
const isHub = (d: SimNode) => (focusKey ? d.key === focusKey : hubs.has(d.collection));
|
|
619
629
|
|
|
630
|
+
// Later layouts (lens, focus and filter changes) animate from the previous positions
|
|
631
|
+
const isFirstLayout = positionsRef.current.size === 0;
|
|
632
|
+
// Nothing paints until the first layout has settled (see INITIAL_SETTLE_SLICE_MS)
|
|
633
|
+
let settling = isFirstLayout;
|
|
620
634
|
const visibleNodes: SimNode[] = viewNodes
|
|
621
635
|
.filter((n) => !hiddenCollections.has(n.collection))
|
|
622
636
|
.map((n) => ({ ...n, degree: 0, ...positionsRef.current.get(n.key) }));
|
|
@@ -734,6 +748,7 @@ const CatalogForceGraph = ({
|
|
|
734
748
|
};
|
|
735
749
|
|
|
736
750
|
const draw = () => {
|
|
751
|
+
if (settling) return;
|
|
737
752
|
context.save();
|
|
738
753
|
context.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);
|
|
739
754
|
context.clearRect(0, 0, width, height);
|
|
@@ -1014,6 +1029,29 @@ const CatalogForceGraph = ({
|
|
|
1014
1029
|
);
|
|
1015
1030
|
}
|
|
1016
1031
|
|
|
1032
|
+
// Settle the first layout before it paints rather than animating it into place
|
|
1033
|
+
let settleFrame: number | undefined;
|
|
1034
|
+
if (isFirstLayout) {
|
|
1035
|
+
simulation.stop();
|
|
1036
|
+
let workLeft = INITIAL_SETTLE_WORK_LIMIT_MS;
|
|
1037
|
+
const settle = () => {
|
|
1038
|
+
const sliceStart = performance.now();
|
|
1039
|
+
const sliceEnd = sliceStart + Math.min(INITIAL_SETTLE_SLICE_MS, workLeft);
|
|
1040
|
+
while (simulation.alpha() > simulation.alphaMin() && performance.now() < sliceEnd) simulation.tick();
|
|
1041
|
+
workLeft -= performance.now() - sliceStart;
|
|
1042
|
+
if (simulation.alpha() > simulation.alphaMin() && workLeft > 0) {
|
|
1043
|
+
settleFrame = requestAnimationFrame(settle);
|
|
1044
|
+
return;
|
|
1045
|
+
}
|
|
1046
|
+
settling = false;
|
|
1047
|
+
// Settled: paint it as is (restarting would run one tick more than the animated
|
|
1048
|
+
// layout). Otherwise paint and animate whatever is left.
|
|
1049
|
+
if (simulation.alpha() <= simulation.alphaMin()) fitToView();
|
|
1050
|
+
else simulation.restart();
|
|
1051
|
+
};
|
|
1052
|
+
settleFrame = requestAnimationFrame(settle);
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1017
1055
|
const findNode = (canvasX: number, canvasY: number): SimNode | null => {
|
|
1018
1056
|
if (Number.isNaN(canvasX) || Number.isNaN(canvasY)) return null;
|
|
1019
1057
|
const x = transform.invertX(canvasX);
|
|
@@ -1219,6 +1257,7 @@ const CatalogForceGraph = ({
|
|
|
1219
1257
|
for (const node of visibleNodes) {
|
|
1220
1258
|
if (node.x !== undefined && node.y !== undefined) positionsRef.current.set(node.key, { x: node.x, y: node.y });
|
|
1221
1259
|
}
|
|
1260
|
+
if (settleFrame !== undefined) cancelAnimationFrame(settleFrame);
|
|
1222
1261
|
simulation.stop();
|
|
1223
1262
|
// The tooltip outlives this effect — never leave it showing stale content
|
|
1224
1263
|
tooltip.style.opacity = '0';
|
|
@@ -29,6 +29,8 @@ const CHAT_PANEL_STYLES = `
|
|
|
29
29
|
}
|
|
30
30
|
.ec-chat-surface { font-weight: 400; }
|
|
31
31
|
.ec-chat-avatar { background: rgb(var(--ec-accent) / .06); animation: ec-chat-breathe 5s ease-in-out infinite; }
|
|
32
|
+
/* The closed panel stays on the page (off screen): a running animation there still costs every frame */
|
|
33
|
+
.ec-chat-surface[aria-hidden='true'] .ec-chat-avatar { animation-play-state: paused; }
|
|
32
34
|
.ec-chat-suggestion { width: fit-content; max-width: 100%; transition: background 180ms, transform 180ms; }
|
|
33
35
|
.ec-chat-suggestion:hover { transform: translateX(3px); }
|
|
34
36
|
.ec-chat-message { animation: fadeInUp 280ms ease-out both; }
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
---
|
|
2
|
+
import config from '@config';
|
|
3
|
+
import { buildUrl } from '@utils/url-builder';
|
|
4
|
+
import { getColorForCollection } from '@utils/collection-colors';
|
|
5
|
+
import { isArchitectureGraphEnabled, isEventCatalogChatEnabled } from '@utils/feature';
|
|
6
|
+
import CatalogForceGraph from '@components/CatalogGraph/CatalogForceGraph';
|
|
7
|
+
import { getCatalogForceGraph, toCatalogForceGraphWire } from '@utils/node-graphs/catalog-force-graph';
|
|
8
|
+
import { getDashboard, type DashboardCollection } from '@utils/homepage-dashboard';
|
|
9
|
+
import { Boxes, Clock, FileJson, Mail, Network, Search, Server, Sparkles, Users, Waypoints } from 'lucide-react';
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
/** The heading, the catalog's title by default */
|
|
13
|
+
title?: string;
|
|
14
|
+
/** Under the heading, the catalog's tagline by default */
|
|
15
|
+
description?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const {
|
|
19
|
+
title = config?.title || config?.organizationName || 'EventCatalog',
|
|
20
|
+
description = config?.tagline || 'Explore and understand your event-driven architecture.',
|
|
21
|
+
} = Astro.props;
|
|
22
|
+
|
|
23
|
+
const dashboard = await getDashboard();
|
|
24
|
+
const { counts, recentlyUpdated } = dashboard;
|
|
25
|
+
const chatEnabled = isEventCatalogChatEnabled();
|
|
26
|
+
// The architecture graph leads the dashboard; it's opt-in while in beta, and without it the dashboard shows what changed recently
|
|
27
|
+
const graph = isArchitectureGraphEnabled() ? toCatalogForceGraphWire(await getCatalogForceGraph()) : undefined;
|
|
28
|
+
|
|
29
|
+
const TYPE_LABELS: Record<DashboardCollection, string> = {
|
|
30
|
+
domains: 'Domain',
|
|
31
|
+
services: 'Service',
|
|
32
|
+
events: 'Event',
|
|
33
|
+
commands: 'Command',
|
|
34
|
+
queries: 'Query',
|
|
35
|
+
flows: 'Flow',
|
|
36
|
+
};
|
|
37
|
+
// The colour each kind of resource has across the catalog, from the theme's badge colours
|
|
38
|
+
const badgeStyle = (collection: string) => {
|
|
39
|
+
const color = getColorForCollection(collection);
|
|
40
|
+
return `color: rgb(var(--ec-badge-color-${color}-text)); background: rgb(var(--ec-badge-color-${color}-background));`;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const stats = [
|
|
44
|
+
{ label: 'Domains', value: counts.domains, href: buildUrl('/discover/domains'), icon: Boxes },
|
|
45
|
+
{ label: 'Services', value: counts.services, href: buildUrl('/discover/services'), icon: Server },
|
|
46
|
+
{ label: 'Messages', value: counts.messages, href: buildUrl('/discover/events'), icon: Mail },
|
|
47
|
+
{ label: 'Flows', value: counts.flows, href: buildUrl('/discover/flows'), icon: Waypoints },
|
|
48
|
+
{ label: 'Schemas', value: counts.schemas, href: buildUrl('/schemas/explorer'), icon: FileJson },
|
|
49
|
+
{ label: 'Teams', value: counts.teams, href: buildUrl('/directory/teams'), icon: Users },
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const formatDate = (timestamp: number) =>
|
|
53
|
+
new Date(timestamp).toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
<div class="ec-dashboard">
|
|
57
|
+
<!-- Header -->
|
|
58
|
+
<header class="flex flex-col gap-5 lg:flex-row lg:items-end lg:justify-between">
|
|
59
|
+
<div class="min-w-0">
|
|
60
|
+
<h1 class="text-[26px] font-semibold leading-tight tracking-tight text-[rgb(var(--ec-page-text))] md:text-[30px]">
|
|
61
|
+
{title}
|
|
62
|
+
</h1>
|
|
63
|
+
<p class="mt-1.5 max-w-2xl text-[14px] leading-relaxed text-[rgb(var(--ec-page-text-muted))]">
|
|
64
|
+
{description}
|
|
65
|
+
</p>
|
|
66
|
+
</div>
|
|
67
|
+
<div class="flex w-full items-center gap-2 lg:w-auto">
|
|
68
|
+
<button type="button" data-dashboard-search class="ec-dashboard-search group">
|
|
69
|
+
<Search className="h-4 w-4 text-[rgb(var(--ec-page-text-muted))]" />
|
|
70
|
+
<span class="flex-1 text-left">Search the catalog</span>
|
|
71
|
+
<kbd class="ec-dashboard-kbd">⌘K</kbd>
|
|
72
|
+
</button>
|
|
73
|
+
{
|
|
74
|
+
chatEnabled && (
|
|
75
|
+
<button type="button" data-dashboard-ask class="ec-dashboard-button">
|
|
76
|
+
<Sparkles className="h-4 w-4" />
|
|
77
|
+
Ask
|
|
78
|
+
</button>
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
</div>
|
|
82
|
+
</header>
|
|
83
|
+
|
|
84
|
+
<!-- Counts -->
|
|
85
|
+
<section class="ec-dashboard-stats mt-8" aria-label="Catalog at a glance">
|
|
86
|
+
{
|
|
87
|
+
stats.map((stat) => (
|
|
88
|
+
<a href={stat.href} class="ec-dashboard-card ec-dashboard-stat group">
|
|
89
|
+
<div class="flex items-center justify-between">
|
|
90
|
+
<span class="text-[12px] font-medium text-[rgb(var(--ec-page-text-muted))]">{stat.label}</span>
|
|
91
|
+
<stat.icon className="h-4 w-4 text-[rgb(var(--ec-page-text-muted))] transition-colors group-hover:text-[rgb(var(--ec-page-text))]" />
|
|
92
|
+
</div>
|
|
93
|
+
<span class="mt-2 block text-[28px] font-semibold leading-none tracking-tight tabular-nums text-[rgb(var(--ec-page-text))]">
|
|
94
|
+
{stat.value}
|
|
95
|
+
</span>
|
|
96
|
+
</a>
|
|
97
|
+
))
|
|
98
|
+
}
|
|
99
|
+
</section>
|
|
100
|
+
|
|
101
|
+
<!-- The architecture graph, or what changed recently without it -->
|
|
102
|
+
<div class="mt-6">
|
|
103
|
+
{
|
|
104
|
+
graph ? (
|
|
105
|
+
<section class="ec-dashboard-card overflow-hidden">
|
|
106
|
+
<div class="ec-dashboard-card-header">
|
|
107
|
+
<h2 class="ec-dashboard-title">
|
|
108
|
+
<Network className="h-4 w-4" /> Architecture
|
|
109
|
+
</h2>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="relative h-[34rem] border-t border-[rgb(var(--ec-page-border))]">
|
|
112
|
+
<CatalogForceGraph
|
|
113
|
+
client:only="react"
|
|
114
|
+
nodes={graph.nodes}
|
|
115
|
+
links={graph.links}
|
|
116
|
+
linkLabels={graph.linkLabels}
|
|
117
|
+
initialLens="domains"
|
|
118
|
+
showSearch
|
|
119
|
+
showLegend
|
|
120
|
+
showLensPicker
|
|
121
|
+
syncUrl={false}
|
|
122
|
+
zoomOnScroll={false}
|
|
123
|
+
openInGraphUrl={buildUrl('/visualiser/graph')}
|
|
124
|
+
openInGraphLabel="Open full screen"
|
|
125
|
+
/>
|
|
126
|
+
</div>
|
|
127
|
+
</section>
|
|
128
|
+
) : (
|
|
129
|
+
<section class="ec-dashboard-card">
|
|
130
|
+
<div class="ec-dashboard-card-header">
|
|
131
|
+
<h2 class="ec-dashboard-title">
|
|
132
|
+
<Clock className="h-4 w-4" /> Recently updated
|
|
133
|
+
</h2>
|
|
134
|
+
</div>
|
|
135
|
+
{recentlyUpdated.length === 0 ? (
|
|
136
|
+
<p class="px-5 pb-5 text-[13px] text-[rgb(var(--ec-page-text-muted))]">Nothing to show yet.</p>
|
|
137
|
+
) : (
|
|
138
|
+
<ul class="divide-y divide-[rgb(var(--ec-page-border))]">
|
|
139
|
+
{recentlyUpdated.map((resource) => (
|
|
140
|
+
<li>
|
|
141
|
+
<a href={resource.href} class="ec-dashboard-row">
|
|
142
|
+
<span class="ec-dashboard-type" style={badgeStyle(resource.collection)}>
|
|
143
|
+
{TYPE_LABELS[resource.collection]}
|
|
144
|
+
</span>
|
|
145
|
+
<span class="min-w-0 flex-1">
|
|
146
|
+
<span class="block truncate text-[13.5px] font-medium text-[rgb(var(--ec-page-text))]">
|
|
147
|
+
{resource.name}
|
|
148
|
+
<span class="ml-1.5 font-mono text-[11.5px] font-normal text-[rgb(var(--ec-page-text-muted))]">
|
|
149
|
+
v{resource.version}
|
|
150
|
+
</span>
|
|
151
|
+
</span>
|
|
152
|
+
{resource.summary && (
|
|
153
|
+
<span class="block truncate text-[12.5px] text-[rgb(var(--ec-page-text-muted))]">{resource.summary}</span>
|
|
154
|
+
)}
|
|
155
|
+
</span>
|
|
156
|
+
{resource.owners[0] && (
|
|
157
|
+
<span class="hidden shrink-0 text-[12px] text-[rgb(var(--ec-page-text-muted))] md:block">
|
|
158
|
+
{resource.owners[0].name}
|
|
159
|
+
</span>
|
|
160
|
+
)}
|
|
161
|
+
<time
|
|
162
|
+
class="w-24 shrink-0 text-right text-[12px] tabular-nums text-[rgb(var(--ec-page-text-muted))]"
|
|
163
|
+
datetime={new Date(resource.updatedAt!).toISOString()}
|
|
164
|
+
data-relative-time
|
|
165
|
+
>
|
|
166
|
+
{formatDate(resource.updatedAt!)}
|
|
167
|
+
</time>
|
|
168
|
+
</a>
|
|
169
|
+
</li>
|
|
170
|
+
))}
|
|
171
|
+
</ul>
|
|
172
|
+
)}
|
|
173
|
+
</section>
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
|
|
179
|
+
<script>
|
|
180
|
+
// The search bar and Ask button open the catalog's search and assistant
|
|
181
|
+
const bind = () => {
|
|
182
|
+
document.querySelector('[data-dashboard-search]')?.addEventListener('click', () => {
|
|
183
|
+
(window as any).searchModalState?.open();
|
|
184
|
+
});
|
|
185
|
+
document.querySelector('[data-dashboard-ask]')?.addEventListener('click', () => {
|
|
186
|
+
window.dispatchEvent(new CustomEvent('eventcatalog:open-chat'));
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// "3 days ago", counted in the browser so a prerendered page stays current
|
|
190
|
+
const format = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });
|
|
191
|
+
const units: [Intl.RelativeTimeFormatUnit, number][] = [
|
|
192
|
+
['year', 365 * 24 * 3600],
|
|
193
|
+
['month', 30 * 24 * 3600],
|
|
194
|
+
['week', 7 * 24 * 3600],
|
|
195
|
+
['day', 24 * 3600],
|
|
196
|
+
['hour', 3600],
|
|
197
|
+
['minute', 60],
|
|
198
|
+
];
|
|
199
|
+
document.querySelectorAll<HTMLTimeElement>('time[data-relative-time]').forEach((time) => {
|
|
200
|
+
const seconds = (new Date(time.dateTime).getTime() - Date.now()) / 1000;
|
|
201
|
+
const [unit, size] = units.find(([, size]) => Math.abs(seconds) >= size) ?? ['minute', 60];
|
|
202
|
+
time.textContent = format.format(Math.round(seconds / size), unit);
|
|
203
|
+
time.title = new Date(time.dateTime).toLocaleString();
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
bind();
|
|
207
|
+
document.addEventListener('astro:page-load', bind);
|
|
208
|
+
</script>
|
|
209
|
+
|
|
210
|
+
<style is:global>
|
|
211
|
+
.ec-dashboard {
|
|
212
|
+
max-width: 96rem;
|
|
213
|
+
padding-bottom: 2.5rem;
|
|
214
|
+
}
|
|
215
|
+
.ec-dashboard-card {
|
|
216
|
+
border: 1px solid rgb(var(--ec-page-border));
|
|
217
|
+
border-radius: 0.875rem;
|
|
218
|
+
background: rgb(var(--ec-card-bg, var(--ec-page-bg)));
|
|
219
|
+
}
|
|
220
|
+
.ec-dashboard-card-header {
|
|
221
|
+
display: flex;
|
|
222
|
+
align-items: center;
|
|
223
|
+
justify-content: space-between;
|
|
224
|
+
gap: 0.75rem;
|
|
225
|
+
padding: 1rem 1.25rem 0.75rem;
|
|
226
|
+
}
|
|
227
|
+
.ec-dashboard-title {
|
|
228
|
+
display: inline-flex;
|
|
229
|
+
align-items: center;
|
|
230
|
+
gap: 0.5rem;
|
|
231
|
+
font-size: 13.5px;
|
|
232
|
+
font-weight: 600;
|
|
233
|
+
color: rgb(var(--ec-page-text));
|
|
234
|
+
}
|
|
235
|
+
.ec-dashboard-title svg {
|
|
236
|
+
color: rgb(var(--ec-page-text-muted));
|
|
237
|
+
}
|
|
238
|
+
.ec-dashboard-link {
|
|
239
|
+
display: inline-flex;
|
|
240
|
+
align-items: center;
|
|
241
|
+
gap: 0.25rem;
|
|
242
|
+
font-size: 12px;
|
|
243
|
+
font-weight: 500;
|
|
244
|
+
color: rgb(var(--ec-page-text-muted));
|
|
245
|
+
}
|
|
246
|
+
.ec-dashboard-link:hover {
|
|
247
|
+
color: rgb(var(--ec-page-text));
|
|
248
|
+
}
|
|
249
|
+
.ec-dashboard-search {
|
|
250
|
+
display: flex;
|
|
251
|
+
flex: 1;
|
|
252
|
+
align-items: center;
|
|
253
|
+
gap: 0.625rem;
|
|
254
|
+
min-width: 0;
|
|
255
|
+
height: 2.5rem;
|
|
256
|
+
padding: 0 0.75rem;
|
|
257
|
+
border: 1px solid rgb(var(--ec-page-border));
|
|
258
|
+
border-radius: 0.625rem;
|
|
259
|
+
background: rgb(var(--ec-card-bg, var(--ec-page-bg)));
|
|
260
|
+
font-size: 13px;
|
|
261
|
+
color: rgb(var(--ec-page-text-muted));
|
|
262
|
+
transition: border-color 150ms;
|
|
263
|
+
}
|
|
264
|
+
@media (min-width: 1024px) {
|
|
265
|
+
.ec-dashboard-search {
|
|
266
|
+
width: 22rem;
|
|
267
|
+
flex: none;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
.ec-dashboard-search:hover {
|
|
271
|
+
border-color: rgb(var(--ec-page-text) / 0.35);
|
|
272
|
+
}
|
|
273
|
+
.ec-dashboard-kbd {
|
|
274
|
+
border: 1px solid rgb(var(--ec-page-border));
|
|
275
|
+
border-radius: 0.375rem;
|
|
276
|
+
padding: 0.05rem 0.375rem;
|
|
277
|
+
font-family: inherit;
|
|
278
|
+
font-size: 11px;
|
|
279
|
+
}
|
|
280
|
+
.ec-dashboard-button {
|
|
281
|
+
display: inline-flex;
|
|
282
|
+
align-items: center;
|
|
283
|
+
gap: 0.375rem;
|
|
284
|
+
height: 2.5rem;
|
|
285
|
+
padding: 0 0.875rem;
|
|
286
|
+
border-radius: 0.625rem;
|
|
287
|
+
background: rgb(var(--ec-page-text));
|
|
288
|
+
font-size: 13px;
|
|
289
|
+
font-weight: 500;
|
|
290
|
+
color: rgb(var(--ec-page-bg));
|
|
291
|
+
transition: opacity 150ms;
|
|
292
|
+
}
|
|
293
|
+
.ec-dashboard-button:hover {
|
|
294
|
+
opacity: 0.85;
|
|
295
|
+
}
|
|
296
|
+
.ec-dashboard-stats {
|
|
297
|
+
display: grid;
|
|
298
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
299
|
+
gap: 0.75rem;
|
|
300
|
+
}
|
|
301
|
+
@media (min-width: 768px) {
|
|
302
|
+
.ec-dashboard-stats {
|
|
303
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
@media (min-width: 1280px) {
|
|
307
|
+
.ec-dashboard-stats {
|
|
308
|
+
grid-template-columns: repeat(6, minmax(0, 1fr));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
.ec-dashboard-stat {
|
|
312
|
+
display: block;
|
|
313
|
+
padding: 1rem 1.1rem;
|
|
314
|
+
transition: border-color 150ms;
|
|
315
|
+
}
|
|
316
|
+
.ec-dashboard-stat:hover {
|
|
317
|
+
border-color: rgb(var(--ec-page-text) / 0.35);
|
|
318
|
+
}
|
|
319
|
+
.ec-dashboard-row {
|
|
320
|
+
display: flex;
|
|
321
|
+
align-items: center;
|
|
322
|
+
gap: 0.875rem;
|
|
323
|
+
padding: 0.7rem 1.25rem;
|
|
324
|
+
transition: background 150ms;
|
|
325
|
+
}
|
|
326
|
+
.ec-dashboard-row:hover {
|
|
327
|
+
background: rgb(var(--ec-page-text) / 0.03);
|
|
328
|
+
}
|
|
329
|
+
.ec-dashboard-type {
|
|
330
|
+
flex-shrink: 0;
|
|
331
|
+
width: 4.75rem;
|
|
332
|
+
border-radius: 0.375rem;
|
|
333
|
+
padding: 0.15rem 0;
|
|
334
|
+
text-align: center;
|
|
335
|
+
font-size: 11px;
|
|
336
|
+
font-weight: 600;
|
|
337
|
+
}
|
|
338
|
+
@media (min-width: 640px) {
|
|
339
|
+
}
|
|
340
|
+
@media (min-width: 1280px) {
|
|
341
|
+
}
|
|
342
|
+
</style>
|