@k-4u/resource-mapper-core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.aws-icons-last-updated +1 -0
- package/.svelte-kit/ambient.d.ts +263 -0
- package/.svelte-kit/generated/client/app.js +31 -0
- package/.svelte-kit/generated/client/matchers.js +1 -0
- package/.svelte-kit/generated/client/nodes/0.js +1 -0
- package/.svelte-kit/generated/client/nodes/1.js +1 -0
- package/.svelte-kit/generated/client/nodes/2.js +3 -0
- package/.svelte-kit/generated/client/nodes/3.js +3 -0
- package/.svelte-kit/generated/client-optimized/app.js +31 -0
- package/.svelte-kit/generated/client-optimized/matchers.js +1 -0
- package/.svelte-kit/generated/client-optimized/nodes/0.js +1 -0
- package/.svelte-kit/generated/client-optimized/nodes/1.js +1 -0
- package/.svelte-kit/generated/client-optimized/nodes/2.js +3 -0
- package/.svelte-kit/generated/client-optimized/nodes/3.js +3 -0
- package/.svelte-kit/generated/root.js +3 -0
- package/.svelte-kit/generated/root.svelte +68 -0
- package/.svelte-kit/generated/server/internal.js +53 -0
- package/.svelte-kit/non-ambient.d.ts +43 -0
- package/.svelte-kit/output/client/.vite/manifest.json +175 -0
- package/.svelte-kit/output/client/_app/immutable/assets/0.Czt_67iE.css +1 -0
- package/.svelte-kit/output/client/_app/immutable/assets/TeamContactCard.Dxj5nUCr.css +1 -0
- package/.svelte-kit/output/client/_app/immutable/assets/helpers.ysDrpaDf.css +1 -0
- package/.svelte-kit/output/client/_app/immutable/assets/libavoid.DQJapW5w.wasm +0 -0
- package/.svelte-kit/output/client/_app/immutable/chunks/BlLuv0eP.js +46 -0
- package/.svelte-kit/output/client/_app/immutable/chunks/CSBHmwYv.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/chunks/CTCi5ueQ.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/chunks/CfOzjaik.js +2 -0
- package/.svelte-kit/output/client/_app/immutable/chunks/D4PdvFNs.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/chunks/DXgP-QUS.js +2 -0
- package/.svelte-kit/output/client/_app/immutable/chunks/DlbDC5An.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/chunks/wRWe7aK9.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/entry/app.ConrMuHl.js +2 -0
- package/.svelte-kit/output/client/_app/immutable/entry/start.Bm6FyGme.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/nodes/0.d3cL-ETU.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/nodes/1.D6z9rPGv.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/nodes/2.CLD-8chl.js +1 -0
- package/.svelte-kit/output/client/_app/immutable/nodes/3.DXYeBoel.js +1 -0
- package/.svelte-kit/output/client/_app/version.json +1 -0
- package/.svelte-kit/output/client/libavoid.wasm +0 -0
- package/.svelte-kit/output/client/static/robots.txt +3 -0
- package/.svelte-kit/output/prerendered/dependencies/_app/env.js +1 -0
- package/.svelte-kit/output/server/.vite/manifest.json +224 -0
- package/.svelte-kit/output/server/_app/immutable/assets/LoadingOverlay.DBbe6V8W.css +1 -0
- package/.svelte-kit/output/server/_app/immutable/assets/_layout.Czt_67iE.css +1 -0
- package/.svelte-kit/output/server/_app/immutable/assets/_page.D9P41uDZ.css +1 -0
- package/.svelte-kit/output/server/chunks/ErrorDisplay.js +59 -0
- package/.svelte-kit/output/server/chunks/LoadingOverlay.js +12 -0
- package/.svelte-kit/output/server/chunks/LoadingOverlay.svelte_svelte_type_style_lang.js +1671 -0
- package/.svelte-kit/output/server/chunks/connections.js +33 -0
- package/.svelte-kit/output/server/chunks/diagram.js +7 -0
- package/.svelte-kit/output/server/chunks/environment.js +34 -0
- package/.svelte-kit/output/server/chunks/equality.js +57 -0
- package/.svelte-kit/output/server/chunks/exports.js +174 -0
- package/.svelte-kit/output/server/chunks/false.js +4 -0
- package/.svelte-kit/output/server/chunks/index.js +59 -0
- package/.svelte-kit/output/server/chunks/index2.js +2939 -0
- package/.svelte-kit/output/server/chunks/index3.js +20 -0
- package/.svelte-kit/output/server/chunks/internal.js +1017 -0
- package/.svelte-kit/output/server/chunks/shared.js +770 -0
- package/.svelte-kit/output/server/chunks/utils.js +43 -0
- package/.svelte-kit/output/server/entries/pages/_error.svelte.js +64 -0
- package/.svelte-kit/output/server/entries/pages/_layout.svelte.js +65 -0
- package/.svelte-kit/output/server/entries/pages/_page.svelte.js +3991 -0
- package/.svelte-kit/output/server/entries/pages/_page.ts.js +30 -0
- package/.svelte-kit/output/server/entries/pages/group/_groupId_/_page.svelte.js +67 -0
- package/.svelte-kit/output/server/entries/pages/group/_groupId_/_page.ts.js +47 -0
- package/.svelte-kit/output/server/index.js +3747 -0
- package/.svelte-kit/output/server/internal.js +13 -0
- package/.svelte-kit/output/server/manifest-full.js +47 -0
- package/.svelte-kit/output/server/manifest.js +47 -0
- package/.svelte-kit/output/server/nodes/0.js +8 -0
- package/.svelte-kit/output/server/nodes/1.js +8 -0
- package/.svelte-kit/output/server/nodes/2.js +10 -0
- package/.svelte-kit/output/server/nodes/3.js +10 -0
- package/.svelte-kit/output/server/remote-entry.js +557 -0
- package/.svelte-kit/tsconfig.json +61 -0
- package/.svelte-kit/types/route_meta_data.json +8 -0
- package/.svelte-kit/types/src/routes/$types.d.ts +26 -0
- package/.svelte-kit/types/src/routes/group/[groupId]/$types.d.ts +21 -0
- package/.svelte-kit/types/src/routes/group/[groupId]/proxy+page.ts +49 -0
- package/.svelte-kit/types/src/routes/proxy+page.ts +33 -0
- package/build/_app/env.js +1 -0
- package/build/_app/env.js.br +1 -0
- package/build/_app/env.js.gz +0 -0
- package/build/_app/immutable/assets/0.Czt_67iE.css +1 -0
- package/build/_app/immutable/assets/0.Czt_67iE.css.br +0 -0
- package/build/_app/immutable/assets/0.Czt_67iE.css.gz +0 -0
- package/build/_app/immutable/assets/TeamContactCard.Dxj5nUCr.css +1 -0
- package/build/_app/immutable/assets/TeamContactCard.Dxj5nUCr.css.br +0 -0
- package/build/_app/immutable/assets/TeamContactCard.Dxj5nUCr.css.gz +0 -0
- package/build/_app/immutable/assets/helpers.ysDrpaDf.css +1 -0
- package/build/_app/immutable/assets/helpers.ysDrpaDf.css.br +0 -0
- package/build/_app/immutable/assets/helpers.ysDrpaDf.css.gz +0 -0
- package/build/_app/immutable/assets/libavoid.DQJapW5w.wasm +0 -0
- package/build/_app/immutable/assets/libavoid.DQJapW5w.wasm.br +0 -0
- package/build/_app/immutable/assets/libavoid.DQJapW5w.wasm.gz +0 -0
- package/build/_app/immutable/chunks/BlLuv0eP.js +46 -0
- package/build/_app/immutable/chunks/BlLuv0eP.js.br +0 -0
- package/build/_app/immutable/chunks/BlLuv0eP.js.gz +0 -0
- package/build/_app/immutable/chunks/CSBHmwYv.js +1 -0
- package/build/_app/immutable/chunks/CSBHmwYv.js.br +0 -0
- package/build/_app/immutable/chunks/CSBHmwYv.js.gz +0 -0
- package/build/_app/immutable/chunks/CTCi5ueQ.js +1 -0
- package/build/_app/immutable/chunks/CTCi5ueQ.js.br +0 -0
- package/build/_app/immutable/chunks/CTCi5ueQ.js.gz +0 -0
- package/build/_app/immutable/chunks/CfOzjaik.js +2 -0
- package/build/_app/immutable/chunks/CfOzjaik.js.br +0 -0
- package/build/_app/immutable/chunks/CfOzjaik.js.gz +0 -0
- package/build/_app/immutable/chunks/D4PdvFNs.js +1 -0
- package/build/_app/immutable/chunks/D4PdvFNs.js.br +0 -0
- package/build/_app/immutable/chunks/D4PdvFNs.js.gz +0 -0
- package/build/_app/immutable/chunks/DXgP-QUS.js +2 -0
- package/build/_app/immutable/chunks/DXgP-QUS.js.br +0 -0
- package/build/_app/immutable/chunks/DXgP-QUS.js.gz +0 -0
- package/build/_app/immutable/chunks/DlbDC5An.js +1 -0
- package/build/_app/immutable/chunks/DlbDC5An.js.br +0 -0
- package/build/_app/immutable/chunks/DlbDC5An.js.gz +0 -0
- package/build/_app/immutable/chunks/wRWe7aK9.js +1 -0
- package/build/_app/immutable/chunks/wRWe7aK9.js.br +0 -0
- package/build/_app/immutable/chunks/wRWe7aK9.js.gz +0 -0
- package/build/_app/immutable/entry/app.ConrMuHl.js +2 -0
- package/build/_app/immutable/entry/app.ConrMuHl.js.br +0 -0
- package/build/_app/immutable/entry/app.ConrMuHl.js.gz +0 -0
- package/build/_app/immutable/entry/start.Bm6FyGme.js +1 -0
- package/build/_app/immutable/entry/start.Bm6FyGme.js.br +2 -0
- package/build/_app/immutable/entry/start.Bm6FyGme.js.gz +0 -0
- package/build/_app/immutable/nodes/0.d3cL-ETU.js +1 -0
- package/build/_app/immutable/nodes/0.d3cL-ETU.js.br +0 -0
- package/build/_app/immutable/nodes/0.d3cL-ETU.js.gz +0 -0
- package/build/_app/immutable/nodes/1.D6z9rPGv.js +1 -0
- package/build/_app/immutable/nodes/1.D6z9rPGv.js.br +0 -0
- package/build/_app/immutable/nodes/1.D6z9rPGv.js.gz +0 -0
- package/build/_app/immutable/nodes/2.CLD-8chl.js +1 -0
- package/build/_app/immutable/nodes/2.CLD-8chl.js.br +0 -0
- package/build/_app/immutable/nodes/2.CLD-8chl.js.gz +0 -0
- package/build/_app/immutable/nodes/3.DXYeBoel.js +1 -0
- package/build/_app/immutable/nodes/3.DXYeBoel.js.br +0 -0
- package/build/_app/immutable/nodes/3.DXYeBoel.js.gz +0 -0
- package/build/_app/version.json +1 -0
- package/build/_app/version.json.br +0 -0
- package/build/_app/version.json.gz +0 -0
- package/build/index.html +34 -0
- package/build/index.html.br +0 -0
- package/build/index.html.gz +0 -0
- package/build/libavoid.wasm +0 -0
- package/build/libavoid.wasm.br +0 -0
- package/build/libavoid.wasm.gz +0 -0
- package/build/static/robots.txt +3 -0
- package/coverage/coverage-final.json +6 -0
- package/coverage/coverage-summary.json +7 -0
- package/coverage/junit.xml +57 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +131 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/stores/index.html +116 -0
- package/coverage/lcov-report/stores/routingStore.ts.html +781 -0
- package/coverage/lcov-report/utils/flow/helpers.ts.html +127 -0
- package/coverage/lcov-report/utils/flow/index.html +161 -0
- package/coverage/lcov-report/utils/flow/layout.ts.html +805 -0
- package/coverage/lcov-report/utils/flow/serviceIds.ts.html +97 -0
- package/coverage/lcov-report/utils/flow/servicesGraph.ts.html +859 -0
- package/coverage/lcov.info +646 -0
- package/coverage/test-results.json +1 -0
- package/data/services/api/api-gateway.yaml +18 -0
- package/data/services/api/group-info.yaml +7 -0
- package/data/services/api/lambda-orders.yaml +21 -0
- package/data/services/api/lambda-products.yaml +15 -0
- package/data/services/api/lambda-users.yaml +15 -0
- package/data/services/compute/alb.yaml +15 -0
- package/data/services/compute/ecs-inventory.yaml +16 -0
- package/data/services/compute/ecs-notification.yaml +15 -0
- package/data/services/compute/group-info.yaml +7 -0
- package/data/services/data/dynamodb-notifications.yaml +12 -0
- package/data/services/data/dynamodb-orders.yaml +9 -0
- package/data/services/data/dynamodb-products.yaml +9 -0
- package/data/services/data/dynamodb-users.yaml +9 -0
- package/data/services/data/group-info.yaml +7 -0
- package/data/services/data/rds-postgres.yaml +9 -0
- package/data/services/data/redis.yaml +10 -0
- package/data/services/frontend/cloudfront.yaml +12 -0
- package/data/services/frontend/group-info.yaml +7 -0
- package/data/services/frontend/route53.yaml +15 -0
- package/data/services/frontend/s3-website.yaml +9 -0
- package/data/teams/cloud-shepherds.yaml +15 -0
- package/data/teams/data-wizards.yaml +15 -0
- package/data/teams/interface-architects.yaml +19 -0
- package/e2e/demo.test.ts +54 -0
- package/e2e/header-toolbar.simple.spec.ts +0 -0
- package/e2e/header-toolbar.spec.ts +53 -0
- package/e2e/layout.spec.ts +30 -0
- package/package.json +69 -0
- package/playwright.config.ts +10 -0
- package/plugins/mapper-data-plugin.ts +32 -0
- package/project.json +23 -0
- package/src/app.css +125 -0
- package/src/app.d.ts +31 -0
- package/src/app.html +11 -0
- package/src/lib/assets/favicon.svg +19 -0
- package/src/lib/components/EmptyState.svelte +37 -0
- package/src/lib/components/ErrorDisplay.svelte +82 -0
- package/src/lib/components/FlowCanvas.svelte +223 -0
- package/src/lib/components/GenericSidebarCard.svelte +44 -0
- package/src/lib/components/GroupDetailSidebar.svelte +31 -0
- package/src/lib/components/Header.svelte +57 -0
- package/src/lib/components/Legend.svelte +25 -0
- package/src/lib/components/LoadingOverlay.svelte +42 -0
- package/src/lib/components/LoadingSpinner.svelte +10 -0
- package/src/lib/components/ServiceDetailSidebar.svelte +90 -0
- package/src/lib/components/TeamContactCard.svelte +166 -0
- package/src/lib/components/flow/ExternalNode.svelte +45 -0
- package/src/lib/components/flow/MainGroupNode.svelte +24 -0
- package/src/lib/components/flow/ServiceGroupNode.svelte +17 -0
- package/src/lib/components/flow/ServiceNode.svelte +40 -0
- package/src/lib/components/flow/SnakeEdge.svelte +206 -0
- package/src/lib/components/flow/index.ts +6 -0
- package/src/lib/components/index.ts +12 -0
- package/src/lib/data/connections.ts +26 -0
- package/src/lib/data/groups.ts +11 -0
- package/src/lib/data/services.ts +12 -0
- package/src/lib/data/teams.ts +11 -0
- package/src/lib/index.ts +1 -0
- package/src/lib/state/theme.svelte.ts +21 -0
- package/src/lib/stores/diagram.ts +6 -0
- package/src/lib/stores/routingStore.test.ts +133 -0
- package/src/lib/stores/routingStore.ts +232 -0
- package/src/lib/utils/awsIcons.ts +117 -0
- package/src/lib/utils/flow/groupOverviewGraph.ts +73 -0
- package/src/lib/utils/flow/helpers.ts +14 -0
- package/src/lib/utils/flow/layout.test.ts +271 -0
- package/src/lib/utils/flow/layout.ts +240 -0
- package/src/lib/utils/flow/serviceIds.ts +5 -0
- package/src/lib/utils/flow/servicesGraph.test.ts +119 -0
- package/src/lib/utils/flow/servicesGraph.ts +258 -0
- package/src/routes/+error.svelte +36 -0
- package/src/routes/+layout.svelte +27 -0
- package/src/routes/+page.svelte +81 -0
- package/src/routes/+page.ts +31 -0
- package/src/routes/group/[groupId]/+page.svelte +102 -0
- package/src/routes/group/[groupId]/+page.ts +48 -0
- package/src/routes/layout.css +0 -0
- package/static/static/robots.txt +3 -0
- package/svelte.config.js +28 -0
- package/tailwind.config.js +12 -0
- package/tsconfig.json +22 -0
- package/vite.config.ts +81 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
friendlyName: "User Management Lambda"
|
|
2
|
+
description: |
|
|
3
|
+
Lambda function handling user authentication, registration, and profile management.
|
|
4
|
+
|
|
5
|
+
Processes user-related API requests with JWT token validation and session management.
|
|
6
|
+
Connects to DynamoDB for user data storage and RDS for transactional operations.
|
|
7
|
+
serviceType: LAMBDA
|
|
8
|
+
outgoingConnections:
|
|
9
|
+
- targetIdentifier: "data/dynamodb-users"
|
|
10
|
+
description: "User data storage"
|
|
11
|
+
connectionType: CALLS
|
|
12
|
+
- targetIdentifier: "data/rds-postgres"
|
|
13
|
+
description: "User authentication data"
|
|
14
|
+
connectionType: TCP
|
|
15
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
friendlyName: "Application Load Balancer"
|
|
2
|
+
description: |
|
|
3
|
+
Application Load Balancer distributing traffic to ECS services across availability zones.
|
|
4
|
+
|
|
5
|
+
Provides health checks, SSL termination, and intelligent routing with path-based rules.
|
|
6
|
+
Configured with auto-scaling and connection draining for zero-downtime deployments.
|
|
7
|
+
serviceType: ALB
|
|
8
|
+
outgoingConnections:
|
|
9
|
+
- targetIdentifier: "compute/ecs-inventory"
|
|
10
|
+
description: "Routes to inventory service"
|
|
11
|
+
connectionType: TCP
|
|
12
|
+
- targetIdentifier: "compute/ecs-notification"
|
|
13
|
+
description: "Routes to notification service"
|
|
14
|
+
connectionType: TCP
|
|
15
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
friendlyName: "ECS Inventory Service"
|
|
2
|
+
description: |
|
|
3
|
+
Containerized Spring Boot inventory management service running on ECS Fargate.
|
|
4
|
+
|
|
5
|
+
REST API service handling real-time inventory tracking, stock updates, and warehouse management.
|
|
6
|
+
Built with Spring Boot, provides endpoints for inventory CRUD operations, stock level monitoring,
|
|
7
|
+
and automated reorder alerts. Auto-scales based on CPU and memory metrics.
|
|
8
|
+
serviceType: ECS
|
|
9
|
+
outgoingConnections:
|
|
10
|
+
- targetIdentifier: "data/rds-postgres"
|
|
11
|
+
description: "PostgreSQL database for inventory persistence"
|
|
12
|
+
connectionType: TCP
|
|
13
|
+
- targetIdentifier: "data/redis"
|
|
14
|
+
description: "Redis cache for high-frequency inventory lookups"
|
|
15
|
+
connectionType: TCP
|
|
16
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
friendlyName: "ECS Notification Service"
|
|
2
|
+
description: |
|
|
3
|
+
Containerized notification service running on ECS for email and SMS delivery.
|
|
4
|
+
|
|
5
|
+
Processes notification queues and sends alerts to users via multiple channels.
|
|
6
|
+
Integrates with external services and maintains delivery logs in DynamoDB.
|
|
7
|
+
serviceType: ECS
|
|
8
|
+
outgoingConnections:
|
|
9
|
+
- targetIdentifier: "data/dynamodb-notifications"
|
|
10
|
+
description: "Notification logs and queue"
|
|
11
|
+
connectionType: CALLS
|
|
12
|
+
- targetIdentifier: "data/redis"
|
|
13
|
+
description: "Redis cache for high-frequency inventory lookups"
|
|
14
|
+
connectionType: TCP
|
|
15
|
+
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
name: "Compute Services"
|
|
2
|
+
description: |
|
|
3
|
+
Manages containerized applications, load balancers, and compute resources.
|
|
4
|
+
This group handles ECS clusters, container services, and application load balancers
|
|
5
|
+
for running stateful and long-running applications.
|
|
6
|
+
teamId: "cloud-shepherds"
|
|
7
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
friendlyName: "DynamoDB Notifications Table"
|
|
2
|
+
description: |
|
|
3
|
+
DynamoDB table tracking notification delivery status and queued messages.
|
|
4
|
+
|
|
5
|
+
Manages notification queue with TTL for automatic cleanup of processed notifications.
|
|
6
|
+
Provides audit trail for compliance and debugging notification issues.
|
|
7
|
+
serviceType: DYNAMODB
|
|
8
|
+
outgoingConnections:
|
|
9
|
+
- targetIdentifier: "api/lambda-orders"
|
|
10
|
+
description: "Triggers order processing Lambda function"
|
|
11
|
+
connectionType: STREAM
|
|
12
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
friendlyName: "DynamoDB Orders Table"
|
|
2
|
+
description: |
|
|
3
|
+
DynamoDB table storing order history and real-time order status tracking.
|
|
4
|
+
|
|
5
|
+
Optimized for high-throughput reads and writes with TTL for order archival.
|
|
6
|
+
Uses DynamoDB Streams for event-driven order processing workflows.
|
|
7
|
+
serviceType: DYNAMODB
|
|
8
|
+
outgoingConnections: []
|
|
9
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
friendlyName: "DynamoDB Products Table"
|
|
2
|
+
description: |
|
|
3
|
+
DynamoDB table managing product catalog with full-text search capabilities.
|
|
4
|
+
|
|
5
|
+
Stores product details, pricing, and inventory levels with global tables for multi-region access.
|
|
6
|
+
Integrated with ElastiCache for frequently accessed product data.
|
|
7
|
+
serviceType: DYNAMODB
|
|
8
|
+
outgoingConnections: []
|
|
9
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
friendlyName: "DynamoDB Users Table"
|
|
2
|
+
description: |
|
|
3
|
+
DynamoDB table storing user profiles and session data with global secondary indexes.
|
|
4
|
+
|
|
5
|
+
Provides single-digit millisecond latency for user lookups and session management.
|
|
6
|
+
Configured with on-demand capacity and point-in-time recovery enabled.
|
|
7
|
+
serviceType: DYNAMODB
|
|
8
|
+
outgoingConnections: []
|
|
9
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
friendlyName: "RDS PostgreSQL Database"
|
|
2
|
+
description: |
|
|
3
|
+
Multi-AZ PostgreSQL RDS instance for transactional data and relational storage.
|
|
4
|
+
|
|
5
|
+
Provides ACID transactions, complex queries, and data consistency for critical business data.
|
|
6
|
+
Configured with automated backups, point-in-time recovery, and read replicas for scaling.
|
|
7
|
+
serviceType: RDS
|
|
8
|
+
outgoingConnections: []
|
|
9
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
friendlyName: "Redis Cache Server"
|
|
2
|
+
description: |
|
|
3
|
+
High-performance in-memory data store used for caching and session management.
|
|
4
|
+
|
|
5
|
+
This Redis instance provides fast data access for session storage, reducing
|
|
6
|
+
database load and improving application performance. Configured with persistence
|
|
7
|
+
enabled for data durability.
|
|
8
|
+
serviceType: VALKEY
|
|
9
|
+
outgoingConnections: []
|
|
10
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
friendlyName: "CloudFront CDN Distribution"
|
|
2
|
+
description: |
|
|
3
|
+
CloudFront distribution providing global content delivery with edge caching.
|
|
4
|
+
|
|
5
|
+
Configured with custom SSL certificate, HTTPS enforcement, and optimized
|
|
6
|
+
cache behaviors. Improves website performance and reduces S3 costs by caching content at edge locations.
|
|
7
|
+
serviceType: CLOUDFRONT
|
|
8
|
+
outgoingConnections:
|
|
9
|
+
- targetIdentifier: "frontend/s3-website"
|
|
10
|
+
description: "Origin - S3 static website bucket"
|
|
11
|
+
connectionType: TCP
|
|
12
|
+
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
name: "Frontend Infrastructure"
|
|
2
|
+
description: |
|
|
3
|
+
Manages static website hosting, CDN, and DNS for the web application.
|
|
4
|
+
This group handles all frontend-facing AWS services including S3 buckets
|
|
5
|
+
for static assets, CloudFront for global content delivery, and Route53 for DNS management.
|
|
6
|
+
teamId: "interface-architects"
|
|
7
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
friendlyName: "Route53 DNS Zone"
|
|
2
|
+
description: |
|
|
3
|
+
Route53 hosted zone managing DNS records for the application domain.
|
|
4
|
+
|
|
5
|
+
Handles domain name resolution with health checks and routing policies.
|
|
6
|
+
Configured with alias records pointing to CloudFront and ALB endpoints.
|
|
7
|
+
serviceType: ROUTE53
|
|
8
|
+
outgoingConnections:
|
|
9
|
+
- targetIdentifier: "frontend/cloudfront"
|
|
10
|
+
description: "DNS resolution to CloudFront distribution"
|
|
11
|
+
connectionType: TCP
|
|
12
|
+
- targetIdentifier: "compute/alb"
|
|
13
|
+
description: "DNS resolution to Application Load Balancer"
|
|
14
|
+
connectionType: TCP
|
|
15
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
friendlyName: "S3 Static Website Bucket"
|
|
2
|
+
description: |
|
|
3
|
+
S3 bucket hosting static website assets including HTML, CSS, JavaScript, and images.
|
|
4
|
+
|
|
5
|
+
Configured with website hosting enabled, versioning for rollback capability,
|
|
6
|
+
and lifecycle policies for cost optimization. Serves as the origin for CloudFront distribution.
|
|
7
|
+
serviceType: S3
|
|
8
|
+
outgoingConnections: []
|
|
9
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
name: "The Cloud Shepherds"
|
|
2
|
+
description: |
|
|
3
|
+
Herding clouds and wrangling infrastructure since day one.
|
|
4
|
+
This team manages all things cloud infrastructure, networking, and compute.
|
|
5
|
+
We keep the lights on and the packets flowing.
|
|
6
|
+
teamLead: "Alex Rivera"
|
|
7
|
+
reachability:
|
|
8
|
+
- channel: email
|
|
9
|
+
detail: "cloud-shepherds@k4u.nl"
|
|
10
|
+
- channel: slack
|
|
11
|
+
detail: "#team-cloud-shepherds"
|
|
12
|
+
- channel: phone
|
|
13
|
+
detail: "+31 20 100 2000"
|
|
14
|
+
- channel: pigeon
|
|
15
|
+
detail: "Release the blue pigeon from HQ rooftop"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
name: "The Data Wizards"
|
|
2
|
+
description: |
|
|
3
|
+
Conjuring data magic and casting database spells daily.
|
|
4
|
+
Masters of persistence, guardians of state, and keepers of the sacred schemas.
|
|
5
|
+
If it needs to be stored, we've got a spell for it.
|
|
6
|
+
teamLead: "Morgan Chen"
|
|
7
|
+
reachability:
|
|
8
|
+
- channel: email
|
|
9
|
+
detail: "data-wizards@k4u.nl"
|
|
10
|
+
- channel: slack
|
|
11
|
+
detail: "#team-data-wizards"
|
|
12
|
+
- channel: phone
|
|
13
|
+
detail: "+31 20 200 3000"
|
|
14
|
+
- channel: teams
|
|
15
|
+
detail: "teams://data-wizards-room"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: "The Interface Architects"
|
|
2
|
+
description: |
|
|
3
|
+
Building bridges between humans and machines since the dawn of APIs.
|
|
4
|
+
From pixels to payloads, we design the experiences that users love.
|
|
5
|
+
Frontend, APIs, and everything in between.
|
|
6
|
+
teamLead: "Jordan Lee"
|
|
7
|
+
reachability:
|
|
8
|
+
- channel: email
|
|
9
|
+
detail: "interface-architects@k4u.nl"
|
|
10
|
+
- channel: slack
|
|
11
|
+
detail: "#team-interface-architects"
|
|
12
|
+
- channel: phone
|
|
13
|
+
detail: "+31 20 300 4000"
|
|
14
|
+
- channel: pagerduty
|
|
15
|
+
detail: "pagerduty://interface-architects"
|
|
16
|
+
- channel: teams
|
|
17
|
+
detail: "teams://interface-architects-room"
|
|
18
|
+
- channel: pigeon
|
|
19
|
+
detail: "Release the red pigeon from HQ rooftop"
|
package/e2e/demo.test.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test';
|
|
2
|
+
import type { Page } from '@playwright/test';
|
|
3
|
+
|
|
4
|
+
const logBrowserConsole = (page: Page) => {
|
|
5
|
+
page.on('console', (msg) => {
|
|
6
|
+
console.log(`[browser:${msg.type()}] ${msg.text()}`);
|
|
7
|
+
});
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const waitForOverlayToDisappear = async (page: Page) => {
|
|
11
|
+
const overlay = page.locator('[data-testid="flow-loading-overlay"]');
|
|
12
|
+
try {
|
|
13
|
+
await overlay.waitFor({ state: 'detached', timeout: 20000 });
|
|
14
|
+
} catch {
|
|
15
|
+
await expect(overlay).toHaveCount(0);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const gotoHomeAndWaitForDiagram = async (page: Page) => {
|
|
20
|
+
logBrowserConsole(page);
|
|
21
|
+
await page.goto('/');
|
|
22
|
+
await page.waitForSelector('[data-testid="flow-canvas"]', { timeout: 20000 });
|
|
23
|
+
await expect(page.locator('[data-testid="flow-canvas"]')).toBeVisible();
|
|
24
|
+
await waitForOverlayToDisappear(page);
|
|
25
|
+
const anyNode = page.locator('[data-testid="flow-canvas"] .svelte-flow__node').first();
|
|
26
|
+
await anyNode.waitFor({ state: 'visible', timeout: 20000 });
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
test('home page renders diagram with data', async ({ page }) => {
|
|
30
|
+
await gotoHomeAndWaitForDiagram(page);
|
|
31
|
+
const flowCanvas = page.locator('[data-testid="flow-canvas"]');
|
|
32
|
+
await expect(flowCanvas.locator('.svelte-flow__node').first()).toBeVisible();
|
|
33
|
+
await expect(flowCanvas.getByText('No diagram available.')).toHaveCount(0);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('clicking a group node updates the sidebar selection', async ({ page }) => {
|
|
37
|
+
await gotoHomeAndWaitForDiagram(page);
|
|
38
|
+
const groupNode = page.locator('.svelte-flow__node').filter({ hasText: 'API Services' });
|
|
39
|
+
await groupNode.first().waitFor({ state: 'visible' });
|
|
40
|
+
await groupNode.first().click();
|
|
41
|
+
const sidebar = page.locator('[data-testid="group-sidebar"], aside').filter({ hasText: 'API Services' });
|
|
42
|
+
await expect(sidebar.first()).toBeVisible();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('double clicking a node navigates to the group detail page', async ({ page }) => {
|
|
46
|
+
await gotoHomeAndWaitForDiagram(page);
|
|
47
|
+
const groupNode = page.locator('.svelte-flow__node').filter({ hasText: 'API Services' });
|
|
48
|
+
await groupNode.first().waitFor({ state: 'visible' });
|
|
49
|
+
await groupNode.first().dblclick();
|
|
50
|
+
await page.waitForURL('**/group/api', { timeout: 20000 });
|
|
51
|
+
await page.waitForSelector('[data-testid="flow-canvas"]', { timeout: 20000 });
|
|
52
|
+
await waitForOverlayToDisappear(page);
|
|
53
|
+
await expect(page.locator('h2').filter({ hasText: 'API Services' }).first()).toBeVisible();
|
|
54
|
+
});
|
|
File without changes
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
// Helper to get the header toolbar buttons
|
|
4
|
+
const getToolbarButtons = async (page) => {
|
|
5
|
+
const legendBtn = page.locator('[data-testid="toolbar-legend"]');
|
|
6
|
+
const darkBtn = page.locator('[data-testid="toolbar-darkmode"]');
|
|
7
|
+
const logBtn = page.locator('[data-testid="toolbar-log"]');
|
|
8
|
+
return { legendBtn, darkBtn, logBtn };
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
test.describe('Header Toolbar', () => {
|
|
12
|
+
test.beforeEach(async ({ page }) => {
|
|
13
|
+
await page.goto('/');
|
|
14
|
+
await page.waitForSelector('[data-testid="toolbar-legend"]');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('shows all three toolbar buttons', async ({ page }) => {
|
|
18
|
+
const { legendBtn, darkBtn, logBtn } = await getToolbarButtons(page);
|
|
19
|
+
await expect(legendBtn).toBeVisible();
|
|
20
|
+
await expect(darkBtn).toBeVisible();
|
|
21
|
+
await expect(logBtn).toBeVisible();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('Show/Hide Legend toggles legend', async ({ page }) => {
|
|
25
|
+
const { legendBtn } = await getToolbarButtons(page);
|
|
26
|
+
// Legend should be visible by default
|
|
27
|
+
await expect(page.locator('.pointer-events-none.absolute.bottom-4.right-4')).toBeVisible();
|
|
28
|
+
await legendBtn.click();
|
|
29
|
+
await expect(page.locator('.pointer-events-none.absolute.bottom-4.right-4')).toBeHidden();
|
|
30
|
+
await legendBtn.click();
|
|
31
|
+
await expect(page.locator('.pointer-events-none.absolute.bottom-4.right-4')).toBeVisible();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('Light/Dark mode toggles color mode', async ({ page }) => {
|
|
35
|
+
const { darkBtn } = await getToolbarButtons(page);
|
|
36
|
+
// Default is light mode
|
|
37
|
+
await expect(page.locator('html')).not.toHaveClass(/dark/);
|
|
38
|
+
await darkBtn.click();
|
|
39
|
+
await expect(page.locator('html')).toHaveClass(/dark/);
|
|
40
|
+
await darkBtn.click();
|
|
41
|
+
await expect(page.locator('html')).not.toHaveClass(/dark/);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('Log button logs to console', async ({ page }) => {
|
|
45
|
+
const { logBtn } = await getToolbarButtons(page);
|
|
46
|
+
const [msg] = await Promise.all([
|
|
47
|
+
page.waitForEvent('console', (m) => m.text().includes('[Header] Log button clicked')),
|
|
48
|
+
logBtn.click()
|
|
49
|
+
]);
|
|
50
|
+
expect(msg.text()).toContain('[Header] Log button clicked');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
const gotoHomeAndWaitForDiagram = async (page: any) => {
|
|
4
|
+
await page.goto('/')
|
|
5
|
+
await page.waitForSelector('[data-testid="flow-canvas"]')
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
test.describe('layout fills viewport', () => {
|
|
9
|
+
test('overview canvas height tracks viewport', async ({ page }) => {
|
|
10
|
+
await gotoHomeAndWaitForDiagram(page)
|
|
11
|
+
const metrics = await page.evaluate(() => {
|
|
12
|
+
const canvas = document.querySelector('[data-testid="flow-canvas"]')
|
|
13
|
+
const sidebar = document.querySelector('[data-testid="group-sidebar"]')
|
|
14
|
+
const header = document.querySelector('header')
|
|
15
|
+
const main = document.querySelector('main')
|
|
16
|
+
const headerHeight = header?.getBoundingClientRect().height ?? 0
|
|
17
|
+
const mainStyles = main ? getComputedStyle(main) : null
|
|
18
|
+
const mainPadding = mainStyles
|
|
19
|
+
? parseFloat(mainStyles.paddingTop) + parseFloat(mainStyles.paddingBottom)
|
|
20
|
+
: 0
|
|
21
|
+
const availableHeight = window.innerHeight - headerHeight - mainPadding
|
|
22
|
+
const canvasHeight = canvas?.getBoundingClientRect().height ?? 0
|
|
23
|
+
const sidebarHeight = sidebar?.getBoundingClientRect().height ?? 0
|
|
24
|
+
return { canvasHeight, sidebarHeight, availableHeight }
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
expect(metrics.canvasHeight).toBeGreaterThanOrEqual(metrics.availableHeight - 8)
|
|
28
|
+
expect(Math.abs(metrics.canvasHeight - metrics.sidebarHeight)).toBeLessThanOrEqual(4)
|
|
29
|
+
})
|
|
30
|
+
})
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@k-4u/resource-mapper-core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "SvelteKit UI template for resource-mapper — used internally by the CLI",
|
|
5
|
+
"keywords": ["architecture", "visualisation", "svelte", "ui"],
|
|
6
|
+
"author": "K-4U",
|
|
7
|
+
"homepage": "https://github.com/K-4U/resource-mapper#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/K-4U/resource-mapper.git",
|
|
11
|
+
"directory": "packages/core"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/K-4U/resource-mapper/issues"
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"type": "module",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@k-4u/resource-mapper": "*",
|
|
23
|
+
"@k-4u/resource-mapper-shared": "*",
|
|
24
|
+
"@xyflow/svelte": "^1.5.1",
|
|
25
|
+
"adm-zip": "^0.5.16",
|
|
26
|
+
"elkjs": "^0.11.0",
|
|
27
|
+
"libavoid-js": "^0.5.0-beta.3",
|
|
28
|
+
"svelte-theme": "^1.4.3",
|
|
29
|
+
"vite-plugin-static-copy": "^3.2.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@eslint/compat": "^2.0.2",
|
|
33
|
+
"@eslint/js": "^9.39.2",
|
|
34
|
+
"@iconify/svelte": "^5.2.1",
|
|
35
|
+
"@nx/vite": "^22.5.3",
|
|
36
|
+
"@sveltejs/adapter-auto": "^7.0.1",
|
|
37
|
+
"@sveltejs/adapter-static": "^3.0.10",
|
|
38
|
+
"@sveltejs/kit": "^2.51.0",
|
|
39
|
+
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
|
40
|
+
"@tailwindcss/typography": "^0.5.19",
|
|
41
|
+
"@tailwindcss/vite": "^4.2.1",
|
|
42
|
+
"@types/adm-zip": "^0.5.7",
|
|
43
|
+
"@types/js-yaml": "^4.0.9",
|
|
44
|
+
"@types/node": "^25",
|
|
45
|
+
"@vitest/browser-playwright": "^4.0.18",
|
|
46
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
47
|
+
"eslint": "^9.39.2",
|
|
48
|
+
"eslint-config-prettier": "^10.1.8",
|
|
49
|
+
"eslint-plugin-svelte": "^3.15.0",
|
|
50
|
+
"globals": "^17.3.0",
|
|
51
|
+
"playwright": "^1.58.2",
|
|
52
|
+
"prettier": "^3.8.1",
|
|
53
|
+
"prettier-plugin-svelte": "^3.5.0",
|
|
54
|
+
"prettier-plugin-tailwindcss": "^0.7.2",
|
|
55
|
+
"svelte": "^5.51.1",
|
|
56
|
+
"svelte-check": "^4.4.0",
|
|
57
|
+
"tailwindcss": "^4.1.18",
|
|
58
|
+
"typescript": "^5.9.3",
|
|
59
|
+
"typescript-eslint": "^8.55.0",
|
|
60
|
+
"vite": "^7.3.1",
|
|
61
|
+
"vitest": "^4.0.18",
|
|
62
|
+
"vitest-browser-svelte": "^2.0.2"
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"dev": "vite",
|
|
66
|
+
"build": "vite build",
|
|
67
|
+
"preview": "vite preview"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type {Plugin} from 'vite';
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
|
|
4
|
+
export function mapperDataPlugin(): Plugin {
|
|
5
|
+
const virtualModuleId = 'virtual:mapper-data';
|
|
6
|
+
const resolvedVirtualModuleId = '\0' + virtualModuleId;
|
|
7
|
+
|
|
8
|
+
return {
|
|
9
|
+
name: 'mapper-data-plugin',
|
|
10
|
+
resolveId(id) {
|
|
11
|
+
if (id === virtualModuleId) return resolvedVirtualModuleId;
|
|
12
|
+
},
|
|
13
|
+
load(id) {
|
|
14
|
+
if (id === resolvedVirtualModuleId) {
|
|
15
|
+
const filePath = process.env.VITE_MAPPER_DATA
|
|
16
|
+
let data: string;
|
|
17
|
+
|
|
18
|
+
if (filePath) {
|
|
19
|
+
this.addWatchFile(filePath);
|
|
20
|
+
try {
|
|
21
|
+
data = fs.readFileSync(filePath, 'utf-8');
|
|
22
|
+
} catch (err) {
|
|
23
|
+
console.error(`Failed to read data from ${filePath}: ${err}`);
|
|
24
|
+
return '{}';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return `export default ${data};`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
package/project.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "core",
|
|
3
|
+
"projectType": "application",
|
|
4
|
+
"targets": {
|
|
5
|
+
"test": {
|
|
6
|
+
"executor": "nx:run-commands",
|
|
7
|
+
"options": {
|
|
8
|
+
"command": "vitest run",
|
|
9
|
+
"cwd": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"configurations": {
|
|
12
|
+
"coverage": {
|
|
13
|
+
"command": "vitest run --coverage"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"outputs": ["{projectRoot}/coverage"]
|
|
17
|
+
},
|
|
18
|
+
"publish": {
|
|
19
|
+
"command": "npm publish --access public",
|
|
20
|
+
"dependsOn": ["build"]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
package/src/app.css
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
@import '@xyflow/svelte/dist/style.css';
|
|
2
|
+
@import "tailwindcss";
|
|
3
|
+
|
|
4
|
+
@plugin '@tailwindcss/typography';
|
|
5
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
6
|
+
|
|
7
|
+
html,
|
|
8
|
+
body,
|
|
9
|
+
#svelte {
|
|
10
|
+
height: 100%;
|
|
11
|
+
min-height: 100%;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
body {
|
|
15
|
+
margin: 0;
|
|
16
|
+
min-height: 100vh;
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@utility big-title {
|
|
22
|
+
@apply uppercase tracking-[0.3em] text-blue-600 dark:text-blue-400;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
TODO: The styles below are for all nodes, style them based on the type of node, e.g. .svelte-flow__node[data-type="custom"] { ... }
|
|
27
|
+
*/
|
|
28
|
+
.svelte-flow__node {
|
|
29
|
+
@apply gap-1 px-4 py-3 dark:text-white text-black transition-colors duration-300 ease-in-out;
|
|
30
|
+
@apply shadow-sm;
|
|
31
|
+
@apply rounded-lg;
|
|
32
|
+
@apply bg-linear-to-tr from-gray-50 to-gray-100 dark:from-gray-500 dark:to-gray-700;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.svelte-flow__node.selected {
|
|
36
|
+
@apply border-blue-400/80 shadow-lg;
|
|
37
|
+
@apply from-blue-400 to-blue-700 dark:from-blue-900 dark:to-blue-950;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Internal service nodes */
|
|
41
|
+
.svelte-flow__node-service {
|
|
42
|
+
@apply from-green-50 to-green-100 dark:from-green-500 dark:to-green-800;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* External service nodes */
|
|
46
|
+
.svelte-flow__node-external {
|
|
47
|
+
@apply from-yellow-50 to-yellow-100 dark:from-yellow-500 dark:to-yellow-800;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Service group nodes (partially transparent) */
|
|
51
|
+
.svelte-flow__node-serviceGroup {
|
|
52
|
+
@apply transition-colors duration-300 ease-in-out opacity-60 dark:opacity-40;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.svelte-flow__node-serviceGroup.current-group {
|
|
56
|
+
@apply from-green-400 dark:from-green-900 text-blue-600 dark:text-blue-200 to-green-700 dark:to-green-950;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.svelte-flow__node-serviceGroup.external-group {
|
|
60
|
+
@apply from-yellow-50 dark:from-yellow-900 text-blue-600 dark:text-blue-200 to-yellow-700 dark:to-yellow-950;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
.edge-label {
|
|
65
|
+
@apply absolute bg-slate-900 text-slate-400 px-2 py-0.5 rounded
|
|
66
|
+
text-[10px] font-bold border border-slate-700 whitespace-nowrap
|
|
67
|
+
shadow-lg pointer-events-none transition-colors duration-200 ease-in-out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.edge-label.selected {
|
|
71
|
+
@apply text-blue-400 border-blue-500 bg-slate-800;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* The actual SVG path of the edge */
|
|
75
|
+
.snake-edge-path {
|
|
76
|
+
@apply transition-colors duration-200 ease-in-out;
|
|
77
|
+
stroke: #64748b; /* slate-500 */
|
|
78
|
+
stroke-width: 2px;
|
|
79
|
+
stroke-linejoin: round;
|
|
80
|
+
stroke-linecap: round;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.snake-edge-path.selected {
|
|
84
|
+
@apply stroke-blue-500;
|
|
85
|
+
stroke-width: 3px;
|
|
86
|
+
/* This creates a subtle SVG filter-based glow if desired,
|
|
87
|
+
or you can just rely on the stroke color */
|
|
88
|
+
filter: drop-shadow(0 0 2px rgba(59, 130, 246, 0.5));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.snake-edge-path.internal {
|
|
92
|
+
@apply stroke-blue-400 dark:stroke-blue-600
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.svelte-flow__edge {
|
|
96
|
+
@apply stroke-3;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.snake-edge-path.incoming {
|
|
100
|
+
@apply stroke-green-400 dark:stroke-green-600;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.snake-edge-path.outgoing {
|
|
104
|
+
@apply stroke-sky-400 dark:stroke-sky-600
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.sidebar-card {
|
|
108
|
+
@apply rounded-xl border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-slate-700 p-4 mt-4
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.sidebar-card.external {
|
|
112
|
+
@apply border-yellow-400 dark:border-yellow-600 bg-yellow-50 dark:bg-yellow-800
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.sidebar-card-subtitle {
|
|
116
|
+
@apply text-xl font-semibold text-gray-900 dark:text-white
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.sidebar-card-title {
|
|
120
|
+
@apply big-title
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.sidebar-card-contents {
|
|
124
|
+
@apply mt-2 text-sm text-gray-700 dark:text-gray-300
|
|
125
|
+
}
|