diff --git a/README.md b/README.md index e699e634..1eafaddf 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@
| ๐งโ๐ป Code โ Diagram SQL ยท Terraform ยท K8s OpenAPI ยท Source code |
+โจ Mermaid โ Icons Paste Mermaid ยท 1,600+ icons auto-assigned ยท beautiful |
๐ค AI Generation 9 providers ยท BYOK Direct-to-canvas output |
`{}` Diagram as Code Bidirectional live sync Git-friendly DSL |
๐งฉ Asset Libraries Developer ยท AWS ยท Azure GCP ยท CNCF ยท Icons |
@@ -101,79 +101,68 @@ Every diagramming tool makes a compromise. OpenFlowKit doesn't.
| **Lucidchart / Miro** | Cloud lock-in โ expensive, account required, your data lives on their servers |
| **PlantUML** | Server-dependent rendering โ no visual editor, no local-first model |
-OpenFlowKit is the **only MIT-licensed tool** that combines a real workspace home, a professional visual canvas, bidirectional diagram-as-code, AI generation from 9 providers, deterministic and AI-assisted imports, asset libraries for technical diagrams, and cinematic animated export โ with zero server-side storage.
+OpenFlowKit is the **only MIT-licensed tool** that combines a real workspace home, a professional visual canvas, bidirectional diagram-as-code, AI generation from 9 providers, **automatic icon assignment from 1,100+ tech icons**, and cinematic animated export โ with zero server-side storage.
---
## Feature highlights
-| | OpenFlowKit | Excalidraw | Draw.io | Mermaid | Lucidchart |
-| ------------------------------ | :---------: | :--------: | :-----: | :-----: | :--------: |
-| Visual canvas editor | โ
| โ
| โ
| โ | โ
|
-| Bidirectional diagram-as-code | โ
| โ | โ | โ
| โ |
-| AI generation (9 providers) `Beta` | โ
| โ | โ | โ | Limited |
-| SQL โ ERD (native parser) | โ
| โ | โ | โ | โ |
-| Terraform / K8s import `Beta` | โ
| โ | โ | โ | โ |
-| AWS / Azure / GCP / CNCF icons | โ
| โ | โ
| Partial | โ
|
+| | OpenFlowKit | Excalidraw | Draw.io | Mermaid | Lucidchart |
+| ------------------------------------ | :---------: | :--------: | :-----: | :-----: | :--------: |
+| Visual canvas editor | โ
| โ
| โ
| โ | โ
|
+| Bidirectional diagram-as-code | โ
| โ | โ | โ
| โ |
+| AI generation (9 providers) `Beta` | โ
| โ | โ | โ | Limited |
+| Mermaid import (8 types) | โ
| โ | โ ๏ธ | โ
| โ |
+| Auto-icon assignment (1,600+) | โ
| โ | โ | โ | โ |
+| AWS / Azure / GCP / CNCF icons | โ
| โ | โ
| Partial | โ
|
| Real-time collaboration (P2P) `Beta` | โ
| โ
| โ | โ | โ
(cloud) |
-| Cinematic animated export | โ
| โ | โ | โ | โ |
-| Figma export (editable SVG) | โ
| โ | โ | โ | โ |
-| No account required | โ
| โ
| โ
| โ
| โ |
-| Open source (MIT) | โ
| โ
| โ
| โ
| โ |
+| Cinematic animated export | โ
| โ | โ | โ | โ |
+| Figma export (editable SVG) | โ
| โ | โ | โ | โ |
+| No account required | โ
| โ
| โ
| โ
| โ |
+| Open source (MIT) | โ
| โ
| โ
| โ
| โ |
---
-## Code โ Diagram
+## Paste Mermaid โ Beautiful Diagrams
-Drop in your existing artifacts. Many formats are handled by **deterministic native parsers** that run entirely in your browser. AI-powered imports help when the source needs interpretation or when you want a richer first-pass architecture draft.
+Paste any Mermaid flowchart, architecture, state diagram, class diagram, ER diagram, sequence diagram, mindmap, or journey โ all 8 diagram families. OpenFlowKit renders it on a visual canvas and automatically assigns the correct branded icon to every technology node.
-**Native parsers (no API key needed):**
-
-```sql
-CREATE TABLE orders (
- id BIGINT PRIMARY KEY,
- user_id BIGINT NOT NULL REFERENCES users(id),
- status ENUM('pending','paid','shipped') NOT NULL
-);
+```
+flowchart TD
+ API[Express API] --> DB[(PostgreSQL)]
+ DB --> Cache[Redis Cache]
+ Cache --> Queue[RabbitMQ]
```
-โ Typed ERD with inferred foreign-key edges and cardinalities. Rendered in milliseconds, no server involved.
+Paste this โ you get the Express wordmark, PostgreSQL elephant, Redis logo, and RabbitMQ icon โ all auto-detected, all beautifully laid out. No other tool does this.
-```yaml
-# deployment.yaml
-apiVersion: apps/v1
-kind: Deployment
-spec:
- replicas: 3
----
-apiVersion: v1
-kind: Service
-selector:
- app: api
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-spec:
- rules:
- - host: api.example.com
-```
+**1,600+ icons** from developer, AWS, Azure, CNCF, and GCP catalogs are matched automatically based on node labels. No manual drag-and-drop. No configuration.
+
+### How it works
+
+1. **Paste Mermaid** on the canvas or in the code panel
+2. **Semantic classifier** detects technology names (PostgreSQL, Redis, Express, Lambda, etc.)
+3. **Icon matcher** searches 1,100+ icons across all catalogs โ exact match, then alias, then substring
+4. **Enricher** assigns colors, icons, and provider SVGs to every node
+5. **ELK layout** arranges everything cleanly
+
+### Mermaid quality gates
+
+- `npm run test:mermaid` runs the broad Mermaid parser/plugin/round-trip gate
+- `npm run test:mermaid:layout` runs the layout, import-state, and recovery corpus gate
+- `npm run test:mermaid:gold` runs both together
-โ Kubernetes architecture with Deployment โ Service โ Ingress connections.
+### AI generation (API key required)
-**AI-powered imports (API key required):**
+Describe your system in plain English. AI generates a diagram on the canvas with correct icons applied automatically.
-Paste source code, infrastructure, or API specs and hit generate โ the diagram lands directly on your canvas. AWS, Azure, GCP, and CNCF icons are automatically applied when the AI detects cloud services in your input.
+| Prompt | Output |
+| ----------------------------------------- | --------------------------------------- |
+| "Node.js API with PostgreSQL and Redis" | 3 nodes with correct icons |
+| "AWS Lambda โ SQS โ DynamoDB" | 3 nodes with AWS icons |
+| "React frontend โ Express โ MongoDB โ S3" | 4 nodes across developer + AWS catalogs |
-| Source | Engine | API key? |
-| ----------------------------------- | ------------------------- | :------: |
-| SQL DDL | **Native parser** | **No** |
-| Terraform `.tfstate` | **Native parser** | **No** |
-| Terraform HCL | AI-assisted | Yes |
-| Kubernetes YAML / Helm | **Native parser** | **No** |
-| OpenAPI / Swagger YAML/JSON | **Native parser** | **No** |
-| OpenAPI source text โ richer flow | AI-assisted | Yes |
-| Source code (single file) | AI-assisted ยท 9 languages | Yes |
-| Mermaid | **Native parser** | **No** |
+9 providers supported: Google Gemini, OpenAI, Anthropic Claude, Groq, Mistral, NVIDIA NIM, Cerebras, OpenRouter, or any custom OpenAI-compatible endpoint.
---
@@ -194,17 +183,17 @@ Flowpilot sits directly in the editor. Describe a system, paste source code, upl
**9 providers. Bring your own key. Switch any time.**
-| Provider | Default model | Why use it |
-| ------------------- | -------------------------------- | ----------------------------------------------- |
-| Google Gemini | `gemini-2.5-flash-lite` | Free tier available, fast, browser-safe |
-| OpenAI | `gpt-5-mini` | Best reasoning for complex architectures |
-| Anthropic Claude | `claude-sonnet-4-6` | Excellent code and system understanding |
-| Groq | `llama-4-scout-17b-16e-instruct` | Fastest inference available |
-| Mistral | `mistral-medium-latest` | Strong European privacy-first alternative |
-| NVIDIA NIM | `llama-4-scout-17b-16e-instruct` | Enterprise GPU inference |
-| Cerebras | `gpt-oss-120b` | Fastest on WSE-3 silicon |
-| OpenRouter | `google/gemini-2.5-flash` | Access 100+ models through one key |
-| **Custom endpoint** | Any model | Ollama, LM Studio, or any OpenAI-compatible API |
+| Provider | Default model | Why use it |
+| ------------------- | ------------------------------------------ | ----------------------------------------------- |
+| Google Gemini | `gemini-2.5-flash-lite` | Free tier available, fast, browser-safe |
+| OpenAI | `gpt-5-mini` | Best reasoning for complex architectures |
+| Anthropic Claude | `claude-sonnet-4-6` | Excellent code and system understanding |
+| Groq | `meta-llama/llama-4-scout-17b-16e-instruct`| Fastest open-source inference available |
+| Mistral | `mistral-large-latest` | Strong European privacy-first alternative |
+| NVIDIA NIM | `meta/llama-4-maverick-17b-128e-instruct` | Enterprise GPU inference |
+| Cerebras | `gpt-oss-120b` | Ultra-fast on WSE-3 silicon |
+| OpenRouter | `google/gemini-2.5-pro` | Access 300+ models through one key |
+| **Custom endpoint** | Any model | Ollama, LM Studio, or any OpenAI-compatible API |
No proxy. No middleman. Direct browser-to-provider requests.
@@ -224,9 +213,10 @@ flowchart TB
auth --> db
```
-- Mermaid-compatible syntax
+- Mermaid-compatible syntax โ paste any Mermaid and it renders with auto-assigned icons
+- Specify icons directly: `{ archProvider: "developer", archResourceType: "database-postgresql" }`
+- Auto-icon resolution: nodes are enriched with the correct branded icon based on their label
- Export to Mermaid, PlantUML, or JSON
-- Paste any Mermaid diagram and it renders immediately
- Version snapshots โ restore any previous state
---
@@ -267,7 +257,7 @@ Designed for architecture reviews, onboarding docs, and demos where a static ima
> **No other open-source diagramming tool does this.**
-Export as **WebM**, control animation speed, and share a link or embed it anywhere.
+Export as **WebM or MP4** (browser-native, no codec install needed), control animation speed, and share or embed anywhere.
---
@@ -275,7 +265,7 @@ Export as **WebM**, control animation speed, and share a link or embed it anywhe
Build your diagram once. Take it anywhere.
-- **๐ฌ Cinematic MP4 / GIF** โ animated walkthrough, browser-only, no upload required
+- **๐ฌ Cinematic WebM / MP4** โ animated build walkthrough, browser-only, no upload required
- **PNG / SVG** โ transparent background, pixel-perfect at any resolution
- **PDF** โ print-ready, vector-crisp
- **Mermaid** โ paste directly into GitHub READMEs, Notion, Confluence, Linear
@@ -310,7 +300,7 @@ Plus: smart alignment guides, snap-to-grid, multi-select, pages, layers, section
Current roadmap focus:
-- **GIF export for cinematic animations** โ WebM is shipping now; GIF export coming next so diagrams can be embedded anywhere without conversion
+- **GIF export for cinematic animations** โ WebM/MP4 ship today; GIF export for zero-conversion embeds is next
- **GitHub repo โ diagram** โ currently in beta internally; will ship when output quality is consistent across real-world codebases
- better layers and page workflows for larger technical diagrams
- stronger code and structured-import diagram quality
diff --git a/assets/third-party-icons/developer/processed/Analytics/databricks.svg b/assets/third-party-icons/developer/processed/Analytics/databricks.svg
new file mode 100644
index 00000000..d67b1705
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Analytics/databricks.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Analytics/flink.svg b/assets/third-party-icons/developer/processed/Analytics/flink.svg
new file mode 100644
index 00000000..254b43f2
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Analytics/flink.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Analytics/hadoop.svg b/assets/third-party-icons/developer/processed/Analytics/hadoop.svg
new file mode 100644
index 00000000..a03f6844
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Analytics/hadoop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Analytics/hive.svg b/assets/third-party-icons/developer/processed/Analytics/hive.svg
new file mode 100644
index 00000000..a1b23393
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Analytics/hive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Analytics/solr.svg b/assets/third-party-icons/developer/processed/Analytics/solr.svg
new file mode 100644
index 00000000..75600aaa
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Analytics/solr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Analytics/spark.svg b/assets/third-party-icons/developer/processed/Analytics/spark.svg
new file mode 100644
index 00000000..106fc42e
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Analytics/spark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Analytics/superset.svg b/assets/third-party-icons/developer/processed/Analytics/superset.svg
new file mode 100644
index 00000000..735b4b42
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Analytics/superset.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Analytics/trino.svg b/assets/third-party-icons/developer/processed/Analytics/trino.svg
new file mode 100644
index 00000000..2af274c8
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Analytics/trino.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Backend/dapr.svg b/assets/third-party-icons/developer/processed/Backend/dapr.svg
new file mode 100644
index 00000000..7ea3d977
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Backend/dapr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Backend/dotnet.svg b/assets/third-party-icons/developer/processed/Backend/dotnet.svg
new file mode 100644
index 00000000..c4b482ec
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Backend/dotnet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Backend/phoenix.svg b/assets/third-party-icons/developer/processed/Backend/phoenix.svg
new file mode 100644
index 00000000..e216b465
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Backend/phoenix.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Backend/quarkus.svg b/assets/third-party-icons/developer/processed/Backend/quarkus.svg
new file mode 100644
index 00000000..892f6f44
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Backend/quarkus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Container/containerd.svg b/assets/third-party-icons/developer/processed/Container/containerd.svg
new file mode 100644
index 00000000..6e87c072
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Container/containerd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Container/k3s.svg b/assets/third-party-icons/developer/processed/Container/k3s.svg
new file mode 100644
index 00000000..c4dbcbe3
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Container/k3s.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Container/lxc.svg b/assets/third-party-icons/developer/processed/Container/lxc.svg
new file mode 100644
index 00000000..08d405b4
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Container/lxc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Database/cockroachdb.svg b/assets/third-party-icons/developer/processed/Database/cockroachdb.svg
new file mode 100644
index 00000000..6929bf3f
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Database/cockroachdb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Database/couchbase.svg b/assets/third-party-icons/developer/processed/Database/couchbase.svg
new file mode 100644
index 00000000..6e57b7e3
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Database/couchbase.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Database/couchdb.svg b/assets/third-party-icons/developer/processed/Database/couchdb.svg
new file mode 100644
index 00000000..0f6297a9
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Database/couchdb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Database/druid.svg b/assets/third-party-icons/developer/processed/Database/druid.svg
new file mode 100644
index 00000000..a3af5cba
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Database/druid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Database/duckdb.svg b/assets/third-party-icons/developer/processed/Database/duckdb.svg
new file mode 100644
index 00000000..ac31e6f9
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Database/duckdb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Database/influxdb.svg b/assets/third-party-icons/developer/processed/Database/influxdb.svg
new file mode 100644
index 00000000..9ad681b4
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Database/influxdb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Database/neo4j.svg b/assets/third-party-icons/developer/processed/Database/neo4j.svg
new file mode 100644
index 00000000..b4194ce8
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Database/neo4j.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Database/scylladb.svg b/assets/third-party-icons/developer/processed/Database/scylladb.svg
new file mode 100644
index 00000000..f6da258d
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Database/scylladb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/airflow.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/airflow.svg
new file mode 100644
index 00000000..fd6c19c2
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/airflow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/ansible.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/ansible.svg
new file mode 100644
index 00000000..2a121a2a
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/ansible.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/argocd.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/argocd.svg
new file mode 100644
index 00000000..34239b81
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/argocd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/bentoml.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/bentoml.svg
new file mode 100644
index 00000000..232cc2fb
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/bentoml.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/ceph.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/ceph.svg
new file mode 100644
index 00000000..36810803
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/ceph.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/chef.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/chef.svg
new file mode 100644
index 00000000..f0fd1b8d
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/chef.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/droneci.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/droneci.svg
new file mode 100644
index 00000000..47b8f613
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/droneci.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/flux.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/flux.svg
new file mode 100644
index 00000000..7ba68c5e
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/flux.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/harbor.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/harbor.svg
new file mode 100644
index 00000000..8dc9fa9d
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/harbor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/jfrog.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/jfrog.svg
new file mode 100644
index 00000000..1f7aae01
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/jfrog.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/keycloak.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/keycloak.svg
new file mode 100644
index 00000000..a2c6a28d
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/keycloak.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/minio.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/minio.svg
new file mode 100644
index 00000000..12f8ffdd
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/minio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/mlflow.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/mlflow.svg
new file mode 100644
index 00000000..8d1b11f4
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/mlflow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/nomad.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/nomad.svg
new file mode 100644
index 00000000..25dae0d2
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/nomad.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/oauth2.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/oauth2.svg
new file mode 100644
index 00000000..32a6dc3f
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/oauth2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/prefect.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/prefect.svg
new file mode 100644
index 00000000..718c735a
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/prefect.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/puppet.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/puppet.svg
new file mode 100644
index 00000000..313bf0d9
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/puppet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/teamcity.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/teamcity.svg
new file mode 100644
index 00000000..3a481926
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/teamcity.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/temporal.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/temporal.svg
new file mode 100644
index 00000000..f815f900
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/temporal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/travisci.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/travisci.svg
new file mode 100644
index 00000000..723a1b3b
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/travisci.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/vault.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/vault.svg
new file mode 100644
index 00000000..adfcbdb0
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/vault.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/DevOps-AI-ML/wandb.svg b/assets/third-party-icons/developer/processed/DevOps-AI-ML/wandb.svg
new file mode 100644
index 00000000..b2f5d554
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/DevOps-AI-ML/wandb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/analytics.svg b/assets/third-party-icons/developer/processed/GCP/analytics.svg
new file mode 100644
index 00000000..8b68c100
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/analytics.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/bigquery.svg b/assets/third-party-icons/developer/processed/GCP/bigquery.svg
new file mode 100644
index 00000000..aa40433b
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/bigquery.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/cloud-composer.svg b/assets/third-party-icons/developer/processed/GCP/cloud-composer.svg
new file mode 100644
index 00000000..4ff2211e
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/cloud-composer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/cloud-spanner.svg b/assets/third-party-icons/developer/processed/GCP/cloud-spanner.svg
new file mode 100644
index 00000000..d3ed6610
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/cloud-spanner.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/cloud-storage.svg b/assets/third-party-icons/developer/processed/GCP/cloud-storage.svg
new file mode 100644
index 00000000..90978b76
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/cloud-storage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/colab.svg b/assets/third-party-icons/developer/processed/GCP/colab.svg
new file mode 100644
index 00000000..434396ea
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/colab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/dataflow.svg b/assets/third-party-icons/developer/processed/GCP/dataflow.svg
new file mode 100644
index 00000000..46b1e5f7
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/dataflow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/dataproc.svg b/assets/third-party-icons/developer/processed/GCP/dataproc.svg
new file mode 100644
index 00000000..1ec18f35
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/dataproc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/docs.svg b/assets/third-party-icons/developer/processed/GCP/docs.svg
new file mode 100644
index 00000000..12077819
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/docs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/drive.svg b/assets/third-party-icons/developer/processed/GCP/drive.svg
new file mode 100644
index 00000000..7263ef31
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/drive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/gemini.svg b/assets/third-party-icons/developer/processed/GCP/gemini.svg
new file mode 100644
index 00000000..e15e53ce
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/gemini.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/google-ads.svg b/assets/third-party-icons/developer/processed/GCP/google-ads.svg
new file mode 100644
index 00000000..d0ad5413
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/google-ads.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/google-cloud.svg b/assets/third-party-icons/developer/processed/GCP/google-cloud.svg
new file mode 100644
index 00000000..9c069578
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/google-cloud.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/looker.svg b/assets/third-party-icons/developer/processed/GCP/looker.svg
new file mode 100644
index 00000000..31db1e5c
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/looker.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/maps.svg b/assets/third-party-icons/developer/processed/GCP/maps.svg
new file mode 100644
index 00000000..2c928cd7
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/maps.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/pubsub.svg b/assets/third-party-icons/developer/processed/GCP/pubsub.svg
new file mode 100644
index 00000000..1e39cc62
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/pubsub.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/sheets.svg b/assets/third-party-icons/developer/processed/GCP/sheets.svg
new file mode 100644
index 00000000..3dce7189
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/sheets.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/GCP/slides.svg b/assets/third-party-icons/developer/processed/GCP/slides.svg
new file mode 100644
index 00000000..398312b2
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/GCP/slides.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/caddy.svg b/assets/third-party-icons/developer/processed/Infra/caddy.svg
new file mode 100644
index 00000000..c9cd0a5e
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/caddy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/consul.svg b/assets/third-party-icons/developer/processed/Infra/consul.svg
new file mode 100644
index 00000000..9d494e06
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/consul.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/envoy.svg b/assets/third-party-icons/developer/processed/Infra/envoy.svg
new file mode 100644
index 00000000..c60a821d
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/envoy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/etcd.svg b/assets/third-party-icons/developer/processed/Infra/etcd.svg
new file mode 100644
index 00000000..cb9f3cee
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/etcd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/gunicorn.svg b/assets/third-party-icons/developer/processed/Infra/gunicorn.svg
new file mode 100644
index 00000000..11396b80
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/gunicorn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/istio.svg b/assets/third-party-icons/developer/processed/Infra/istio.svg
new file mode 100644
index 00000000..580b9fd5
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/istio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/kong.svg b/assets/third-party-icons/developer/processed/Infra/kong.svg
new file mode 100644
index 00000000..d323c3a4
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/kong.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/letsencrypt.svg b/assets/third-party-icons/developer/processed/Infra/letsencrypt.svg
new file mode 100644
index 00000000..c4bdcf6d
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/letsencrypt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/linkerd.svg b/assets/third-party-icons/developer/processed/Infra/linkerd.svg
new file mode 100644
index 00000000..512d0d82
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/linkerd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/nginx.svg b/assets/third-party-icons/developer/processed/Infra/nginx.svg
new file mode 100644
index 00000000..e52ea9fe
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/nginx.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/tomcat.svg b/assets/third-party-icons/developer/processed/Infra/tomcat.svg
new file mode 100644
index 00000000..4de01fca
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/tomcat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Infra/traefik.svg b/assets/third-party-icons/developer/processed/Infra/traefik.svg
new file mode 100644
index 00000000..0135fda5
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Infra/traefik.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Languages/cpp.svg b/assets/third-party-icons/developer/processed/Languages/cpp.svg
new file mode 100644
index 00000000..3d1b49e2
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Languages/cpp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Languages/dart.svg b/assets/third-party-icons/developer/processed/Languages/dart.svg
new file mode 100644
index 00000000..990da555
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Languages/dart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Languages/latex.svg b/assets/third-party-icons/developer/processed/Languages/latex.svg
new file mode 100644
index 00000000..5bab7a8b
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Languages/latex.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Languages/lua.svg b/assets/third-party-icons/developer/processed/Languages/lua.svg
new file mode 100644
index 00000000..5f4c6521
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Languages/lua.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Languages/zig.svg b/assets/third-party-icons/developer/processed/Languages/zig.svg
new file mode 100644
index 00000000..d8504941
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Languages/zig.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Logging/fluentbit.svg b/assets/third-party-icons/developer/processed/Logging/fluentbit.svg
new file mode 100644
index 00000000..cc0c5ffc
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Logging/fluentbit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Logging/fluentd.svg b/assets/third-party-icons/developer/processed/Logging/fluentd.svg
new file mode 100644
index 00000000..38d9169d
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Logging/fluentd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Logging/graylog.svg b/assets/third-party-icons/developer/processed/Logging/graylog.svg
new file mode 100644
index 00000000..d49fc873
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Logging/graylog.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Monitoring/datadog.svg b/assets/third-party-icons/developer/processed/Monitoring/datadog.svg
new file mode 100644
index 00000000..ab437319
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Monitoring/datadog.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Monitoring/dynatrace.svg b/assets/third-party-icons/developer/processed/Monitoring/dynatrace.svg
new file mode 100644
index 00000000..d83ff94f
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Monitoring/dynatrace.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Monitoring/jaeger.svg b/assets/third-party-icons/developer/processed/Monitoring/jaeger.svg
new file mode 100644
index 00000000..74155a60
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Monitoring/jaeger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Monitoring/newrelic.svg b/assets/third-party-icons/developer/processed/Monitoring/newrelic.svg
new file mode 100644
index 00000000..f535b78b
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Monitoring/newrelic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Monitoring/prometheus.svg b/assets/third-party-icons/developer/processed/Monitoring/prometheus.svg
new file mode 100644
index 00000000..7dd2b46f
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Monitoring/prometheus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Monitoring/sentry.svg b/assets/third-party-icons/developer/processed/Monitoring/sentry.svg
new file mode 100644
index 00000000..47888975
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Monitoring/sentry.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Monitoring/splunk.svg b/assets/third-party-icons/developer/processed/Monitoring/splunk.svg
new file mode 100644
index 00000000..e84d30db
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Monitoring/splunk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Queue/celery.svg b/assets/third-party-icons/developer/processed/Queue/celery.svg
new file mode 100644
index 00000000..9dd7df66
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Queue/celery.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Queue/nats.svg b/assets/third-party-icons/developer/processed/Queue/nats.svg
new file mode 100644
index 00000000..1c31020c
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Queue/nats.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/Queue/rabbitmq.svg b/assets/third-party-icons/developer/processed/Queue/rabbitmq.svg
new file mode 100644
index 00000000..f8b90f5b
--- /dev/null
+++ b/assets/third-party-icons/developer/processed/Queue/rabbitmq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/developer/processed/developer-icons-v1.manifest.json b/assets/third-party-icons/developer/processed/developer-icons-v1.manifest.json
index 69314059..a7f69957 100644
--- a/assets/third-party-icons/developer/processed/developer-icons-v1.manifest.json
+++ b/assets/third-party-icons/developer/processed/developer-icons-v1.manifest.json
@@ -3193,6 +3193,936 @@
"defaultHeight": 96,
"nodeType": "custom",
"defaultData": {}
+ },
+ {
+ "id": "infra-nginx",
+ "label": "Nginx",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-traefik",
+ "label": "Traefik",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-envoy",
+ "label": "Envoy",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-istio",
+ "label": "Istio",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-consul",
+ "label": "Consul",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-kong",
+ "label": "Kong",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-etcd",
+ "label": "etcd",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-linkerd",
+ "label": "Linkerd",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-caddy",
+ "label": "Caddy",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-gunicorn",
+ "label": "Gunicorn",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-tomcat",
+ "label": "Tomcat",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "monitoring-prometheus",
+ "label": "Prometheus",
+ "category": "Monitoring",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "monitoring-sentry",
+ "label": "Sentry",
+ "category": "Monitoring",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "monitoring-newrelic",
+ "label": "New Relic",
+ "category": "Monitoring",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "monitoring-datadog",
+ "label": "Datadog",
+ "category": "Monitoring",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "monitoring-dynatrace",
+ "label": "Dynatrace",
+ "category": "Monitoring",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "monitoring-splunk",
+ "label": "Splunk",
+ "category": "Monitoring",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "database-influxdb",
+ "label": "InfluxDB",
+ "category": "Database",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "database-cockroachdb",
+ "label": "CockroachDB",
+ "category": "Database",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "database-neo4j",
+ "label": "Neo4j",
+ "category": "Database",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "database-couchdb",
+ "label": "CouchDB",
+ "category": "Database",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "database-couchbase",
+ "label": "Couchbase",
+ "category": "Database",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "database-duckdb",
+ "label": "DuckDB",
+ "category": "Database",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "database-scylla",
+ "label": "ScyllaDB",
+ "category": "Database",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "database-druid",
+ "label": "Apache Druid",
+ "category": "Database",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "queue-rabbitmq",
+ "label": "RabbitMQ",
+ "category": "Queue",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "queue-celery",
+ "label": "Celery",
+ "category": "Queue",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "container-containerd",
+ "label": "containerd",
+ "category": "Container",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "container-k3s",
+ "label": "K3s",
+ "category": "Container",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "container-lxc",
+ "label": "LXC",
+ "category": "Container",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "logging-fluentbit",
+ "label": "Fluent Bit",
+ "category": "Logging",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "logging-fluentd",
+ "label": "Fluentd",
+ "category": "Logging",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "logging-graylog",
+ "label": "Graylog",
+ "category": "Logging",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "ci-travisci",
+ "label": "Travis CI",
+ "category": "CI-CD",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "ci-teamcity",
+ "label": "TeamCity",
+ "category": "CI-CD",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "ci-droneci",
+ "label": "Drone CI",
+ "category": "CI-CD",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gitops-argocd",
+ "label": "Argo CD",
+ "category": "GitOps",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gitops-flux",
+ "label": "Flux",
+ "category": "GitOps",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "iac-puppet",
+ "label": "Puppet",
+ "category": "IaC",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "iac-ansible",
+ "label": "Ansible",
+ "category": "IaC",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "iac-chef",
+ "label": "Chef",
+ "category": "IaC",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "storage-ceph",
+ "label": "Ceph",
+ "category": "Storage",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "storage-minio",
+ "label": "MinIO",
+ "category": "Storage",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "auth-vault",
+ "label": "Vault",
+ "category": "Security",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "auth-keycloak",
+ "label": "Keycloak",
+ "category": "Security",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "auth-oauth2",
+ "label": "OAuth 2.0",
+ "category": "Security",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "infra-letsencrypt",
+ "label": "Let's Encrypt",
+ "category": "Infra",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "workflow-airflow",
+ "label": "Apache Airflow",
+ "category": "Workflow",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "workflow-prefect",
+ "label": "Prefect",
+ "category": "Workflow",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "workflow-temporal",
+ "label": "Temporal",
+ "category": "Workflow",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "registry-harbor",
+ "label": "Harbor",
+ "category": "Registry",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "registry-jfrog",
+ "label": "JFrog",
+ "category": "Registry",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "analytics-spark",
+ "label": "Apache Spark",
+ "category": "Analytics",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "analytics-flink",
+ "label": "Apache Flink",
+ "category": "Analytics",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "analytics-hadoop",
+ "label": "Hadoop",
+ "category": "Analytics",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "analytics-hive",
+ "label": "Apache Hive",
+ "category": "Analytics",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "analytics-databricks",
+ "label": "Databricks",
+ "category": "Analytics",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "analytics-superset",
+ "label": "Superset",
+ "category": "Analytics",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "analytics-trino",
+ "label": "Trino",
+ "category": "Analytics",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "analytics-solr",
+ "label": "Apache Solr",
+ "category": "Analytics",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "ml-mlflow",
+ "label": "MLflow",
+ "category": "ML",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "ml-wandb",
+ "label": "Weights & Biases",
+ "category": "ML",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "ml-bentoml",
+ "label": "BentoML",
+ "category": "ML",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "backend-dotnet",
+ "label": ".NET",
+ "category": "Backend",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "backend-quarkus",
+ "label": "Quarkus",
+ "category": "Backend",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "backend-phoenix",
+ "label": "Phoenix",
+ "category": "Backend",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "backend-dapr",
+ "label": "Dapr",
+ "category": "Backend",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "lang-cpp",
+ "label": "C++",
+ "category": "Languages",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "lang-latex",
+ "label": "LaTeX",
+ "category": "Languages",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "lang-zig",
+ "label": "Zig",
+ "category": "Languages",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "lang-lua",
+ "label": "Lua",
+ "category": "Languages",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "lang-dart",
+ "label": "Dart",
+ "category": "Languages",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "monitoring-jaeger",
+ "label": "Jaeger",
+ "category": "Monitoring",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "queue-nats",
+ "label": "NATS",
+ "category": "Queue",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "iac-nomad",
+ "label": "Nomad",
+ "category": "IaC",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-googlecloud",
+ "label": "Google Cloud",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-bigquery",
+ "label": "BigQuery",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-cloudstorage",
+ "label": "Cloud Storage",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-pubsub",
+ "label": "Cloud Pub/Sub",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-spanner",
+ "label": "Cloud Spanner",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-composer",
+ "label": "Cloud Composer",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-dataflow",
+ "label": "Dataflow",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-dataproc",
+ "label": "Dataproc",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-gemini",
+ "label": "Gemini",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-colab",
+ "label": "Google Colab",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-maps",
+ "label": "Google Maps",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-analytics",
+ "label": "Google Analytics",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-ads",
+ "label": "Google Ads",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-drive",
+ "label": "Google Drive",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-docs",
+ "label": "Google Docs",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-sheets",
+ "label": "Google Sheets",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-slides",
+ "label": "Google Slides",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
+ },
+ {
+ "id": "gcp-looker",
+ "label": "Looker",
+ "category": "GCP",
+ "svgContent": "",
+ "defaultWidth": 160,
+ "defaultHeight": 96,
+ "nodeType": "custom",
+ "defaultData": {}
}
]
-}
+}
\ No newline at end of file
diff --git a/assets/third-party-icons/google-cloud/SOURCE.md b/assets/third-party-icons/gcp/SOURCE.md
similarity index 100%
rename from assets/third-party-icons/google-cloud/SOURCE.md
rename to assets/third-party-icons/gcp/SOURCE.md
diff --git a/assets/third-party-icons/google-cloud/processed/.gitkeep b/assets/third-party-icons/gcp/processed/.gitkeep
similarity index 100%
rename from assets/third-party-icons/google-cloud/processed/.gitkeep
rename to assets/third-party-icons/gcp/processed/.gitkeep
diff --git a/assets/third-party-icons/gcp/processed/Core/analytics.svg b/assets/third-party-icons/gcp/processed/Core/analytics.svg
new file mode 100644
index 00000000..8b68c100
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/analytics.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/bigquery.svg b/assets/third-party-icons/gcp/processed/Core/bigquery.svg
new file mode 100644
index 00000000..aa40433b
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/bigquery.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/cloud-composer.svg b/assets/third-party-icons/gcp/processed/Core/cloud-composer.svg
new file mode 100644
index 00000000..4ff2211e
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/cloud-composer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/cloud-spanner.svg b/assets/third-party-icons/gcp/processed/Core/cloud-spanner.svg
new file mode 100644
index 00000000..d3ed6610
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/cloud-spanner.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/cloud-storage.svg b/assets/third-party-icons/gcp/processed/Core/cloud-storage.svg
new file mode 100644
index 00000000..90978b76
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/cloud-storage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/colab.svg b/assets/third-party-icons/gcp/processed/Core/colab.svg
new file mode 100644
index 00000000..434396ea
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/colab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/dataflow.svg b/assets/third-party-icons/gcp/processed/Core/dataflow.svg
new file mode 100644
index 00000000..46b1e5f7
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/dataflow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/dataproc.svg b/assets/third-party-icons/gcp/processed/Core/dataproc.svg
new file mode 100644
index 00000000..1ec18f35
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/dataproc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/docs.svg b/assets/third-party-icons/gcp/processed/Core/docs.svg
new file mode 100644
index 00000000..12077819
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/docs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/drive.svg b/assets/third-party-icons/gcp/processed/Core/drive.svg
new file mode 100644
index 00000000..7263ef31
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/drive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/gemini.svg b/assets/third-party-icons/gcp/processed/Core/gemini.svg
new file mode 100644
index 00000000..e15e53ce
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/gemini.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/google-ads.svg b/assets/third-party-icons/gcp/processed/Core/google-ads.svg
new file mode 100644
index 00000000..d0ad5413
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/google-ads.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/google-cloud.svg b/assets/third-party-icons/gcp/processed/Core/google-cloud.svg
new file mode 100644
index 00000000..9c069578
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/google-cloud.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/looker.svg b/assets/third-party-icons/gcp/processed/Core/looker.svg
new file mode 100644
index 00000000..31db1e5c
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/looker.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/maps.svg b/assets/third-party-icons/gcp/processed/Core/maps.svg
new file mode 100644
index 00000000..2c928cd7
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/maps.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/pubsub.svg b/assets/third-party-icons/gcp/processed/Core/pubsub.svg
new file mode 100644
index 00000000..1e39cc62
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/pubsub.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/sheets.svg b/assets/third-party-icons/gcp/processed/Core/sheets.svg
new file mode 100644
index 00000000..3dce7189
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/sheets.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/gcp/processed/Core/slides.svg b/assets/third-party-icons/gcp/processed/Core/slides.svg
new file mode 100644
index 00000000..398312b2
--- /dev/null
+++ b/assets/third-party-icons/gcp/processed/Core/slides.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/third-party-icons/google-cloud/raw/.gitkeep b/assets/third-party-icons/gcp/raw/.gitkeep
similarity index 100%
rename from assets/third-party-icons/google-cloud/raw/.gitkeep
rename to assets/third-party-icons/gcp/raw/.gitkeep
diff --git a/e2e/smoke.spec.ts b/e2e/smoke.spec.ts
index c9baa040..1e8849c8 100644
--- a/e2e/smoke.spec.ts
+++ b/e2e/smoke.spec.ts
@@ -12,11 +12,16 @@ async function openHomeDashboard(page: import('@playwright/test').Page) {
await expect(page.getByTestId('home-create-new-main')).toBeVisible({ timeout: 15000 });
}
-test('creates a new flow and adds an extra tab', async ({ page }) => {
+async function createNewFlow(page: import('@playwright/test').Page) {
await openHomeDashboard(page);
await page.getByTestId('home-create-new-main').click();
-
await expect(page).toHaveURL(/#\/flow\/[^?]+(?:\?.*)?$/);
+ await expect(page.getByTestId('flow-page-tab').first()).toBeVisible({ timeout: 15000 });
+ await expect(page.getByTestId('topnav-menu-toggle')).toBeVisible({ timeout: 15000 });
+}
+
+test('creates a new flow and adds an extra tab', async ({ page }) => {
+ await createNewFlow(page);
await expect(page.getByTestId('toolbar-add-toggle')).toBeVisible({ timeout: 15000 });
const tabs = page.getByTestId('flow-page-tab');
@@ -30,10 +35,8 @@ test('creates a new flow and adds an extra tab', async ({ page }) => {
});
test('saves and restores snapshot state', async ({ page }) => {
- await openHomeDashboard(page);
- await page.getByTestId('home-create-new-main').click();
+ await createNewFlow(page);
await expect(page.getByTestId('toolbar-add-toggle')).toBeVisible({ timeout: 15000 });
- await expect(page.getByTestId('topnav-menu-toggle')).toBeVisible({ timeout: 15000 });
const canvasNodes = page.locator('.react-flow__node');
diff --git a/e2e/workflows.spec.ts b/e2e/workflows.spec.ts
index 443972a6..95b7dcbe 100644
--- a/e2e/workflows.spec.ts
+++ b/e2e/workflows.spec.ts
@@ -16,11 +16,12 @@ async function createNewFlow(page: import('@playwright/test').Page) {
await expect(page.getByTestId('home-create-new-main')).toBeVisible({ timeout: 15000 });
await page.getByTestId('home-create-new-main').click();
await expect(page).toHaveURL(/#\/flow\/[^?]+(?:\?.*)?$/);
- await expect(page.getByTestId('toolbar-add-toggle')).toBeVisible({ timeout: 15000 });
await expect(page.getByTestId('flow-page-tab').first()).toBeVisible();
+ await expect(page.getByTestId('topnav-menu-toggle')).toBeVisible({ timeout: 15000 });
}
async function addRectangleNode(page: import('@playwright/test').Page) {
+ await expect(page.getByTestId('toolbar-add-toggle')).toBeVisible({ timeout: 15000 });
await page.getByTestId('toolbar-add-toggle').click();
await page.getByRole('button', { name: 'Rectangle' }).click();
}
diff --git a/package-lock.json b/package-lock.json
index f9fc3e50..cc33099b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,8 +13,9 @@
],
"dependencies": {
"@google/genai": "^1.40.0",
- "@types/react-syntax-highlighter": "^15.5.13",
+ "@mermaid-js/layout-elk": "^0.2.1",
"@xyflow/react": "^12.10.1",
+ "dagre": "^0.8.5",
"elkjs": "^0.11.0",
"framer-motion": "^12.34.0",
"html-to-image": "^1.11.13",
@@ -23,6 +24,7 @@
"i18next-http-backend": "^3.0.2",
"jszip": "^3.10.1",
"lucide-react": "^0.563.0",
+ "mermaid": "^11.14.0",
"posthog-js": "^1.347.2",
"react": "^19.2.4",
"react-dom": "^19.2.4",
@@ -35,7 +37,6 @@
"remark-gfm": "4.0.0",
"y-indexeddb": "^9.0.12",
"y-webrtc": "^10.3.0",
- "y-websocket": "^3.0.0",
"yjs": "^13.6.29",
"zustand": "^5.0.11"
},
@@ -44,7 +45,9 @@
"@tailwindcss/postcss": "^4.1.18",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2",
+ "@types/dagre": "^0.7.54",
"@types/node": "^22.14.0",
+ "@types/react-syntax-highlighter": "^15.5.13",
"@typescript-eslint/eslint-plugin": "^8.55.0",
"@typescript-eslint/parser": "^8.55.0",
"@vitejs/plugin-react": "^5.1.4",
@@ -112,6 +115,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@antfu/install-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz",
+ "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "package-manager-detector": "^1.3.0",
+ "tinyexec": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/@asamuzakjp/css-color": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz",
@@ -734,6 +750,12 @@
"node": ">=18"
}
},
+ "node_modules/@braintree/sanitize-url": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz",
+ "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==",
+ "license": "MIT"
+ },
"node_modules/@capsizecss/unpack": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz",
@@ -746,6 +768,43 @@
"node": ">=18"
}
},
+ "node_modules/@chevrotain/cst-dts-gen": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-12.0.0.tgz",
+ "integrity": "sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@chevrotain/gast": "12.0.0",
+ "@chevrotain/types": "12.0.0"
+ }
+ },
+ "node_modules/@chevrotain/gast": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-12.0.0.tgz",
+ "integrity": "sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@chevrotain/types": "12.0.0"
+ }
+ },
+ "node_modules/@chevrotain/regexp-to-ast": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-12.0.0.tgz",
+ "integrity": "sha512-p+EW9MaJwgaHguhoqwOtx/FwuGr+DnNn857sXWOi/mClXIkPGl3rn7hGNWvo31HA3vyeQxjqe+H36yZJwYU8cA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@chevrotain/types": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-12.0.0.tgz",
+ "integrity": "sha512-S+04vjFQKeuYw0/eW3U52LkAHQsB1ASxsPGsLPUyQgrZ2iNNibQrsidruDzjEX2JYfespXMG0eZmXlhA6z7nWA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@chevrotain/utils": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-12.0.0.tgz",
+ "integrity": "sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==",
+ "license": "Apache-2.0"
+ },
"node_modules/@csstools/color-helpers": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.1.tgz",
@@ -1547,6 +1606,23 @@
"dev": true,
"license": "BSD-3-Clause"
},
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "license": "MIT"
+ },
+ "node_modules/@iconify/utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz",
+ "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==",
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/install-pkg": "^1.1.0",
+ "@iconify/types": "^2.0.0",
+ "mlly": "^1.8.0"
+ }
+ },
"node_modules/@img/colour": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
@@ -2168,6 +2244,34 @@
"node": ">= 12"
}
},
+ "node_modules/@mermaid-js/layout-elk": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@mermaid-js/layout-elk/-/layout-elk-0.2.1.tgz",
+ "integrity": "sha512-MX9jwhMyd5zDcFsYcl3duDUkKhjVRUCGEQrdCeNV5hCIR6+3FuDDbRbFmvVbAu15K1+juzsYGG+K8MDvCY1Amg==",
+ "license": "MIT",
+ "dependencies": {
+ "d3": "^7.9.0",
+ "elkjs": "^0.9.3"
+ },
+ "peerDependencies": {
+ "mermaid": "^11.0.2"
+ }
+ },
+ "node_modules/@mermaid-js/layout-elk/node_modules/elkjs": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz",
+ "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==",
+ "license": "EPL-2.0"
+ },
+ "node_modules/@mermaid-js/parser": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.0.tgz",
+ "integrity": "sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==",
+ "license": "MIT",
+ "dependencies": {
+ "langium": "^4.0.0"
+ }
+ },
"node_modules/@microsoft/api-extractor": {
"version": "7.43.0",
"resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.43.0.tgz",
@@ -4415,12 +4519,102 @@
"assertion-error": "^2.0.1"
}
},
+ "node_modules/@types/d3": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-array": "*",
+ "@types/d3-axis": "*",
+ "@types/d3-brush": "*",
+ "@types/d3-chord": "*",
+ "@types/d3-color": "*",
+ "@types/d3-contour": "*",
+ "@types/d3-delaunay": "*",
+ "@types/d3-dispatch": "*",
+ "@types/d3-drag": "*",
+ "@types/d3-dsv": "*",
+ "@types/d3-ease": "*",
+ "@types/d3-fetch": "*",
+ "@types/d3-force": "*",
+ "@types/d3-format": "*",
+ "@types/d3-geo": "*",
+ "@types/d3-hierarchy": "*",
+ "@types/d3-interpolate": "*",
+ "@types/d3-path": "*",
+ "@types/d3-polygon": "*",
+ "@types/d3-quadtree": "*",
+ "@types/d3-random": "*",
+ "@types/d3-scale": "*",
+ "@types/d3-scale-chromatic": "*",
+ "@types/d3-selection": "*",
+ "@types/d3-shape": "*",
+ "@types/d3-time": "*",
+ "@types/d3-time-format": "*",
+ "@types/d3-timer": "*",
+ "@types/d3-transition": "*",
+ "@types/d3-zoom": "*"
+ }
+ },
+ "node_modules/@types/d3-array": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-axis": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-brush": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-chord": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
+ "license": "MIT"
+ },
"node_modules/@types/d3-color": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
"license": "MIT"
},
+ "node_modules/@types/d3-contour": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-array": "*",
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-delaunay": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-dispatch": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz",
+ "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==",
+ "license": "MIT"
+ },
"node_modules/@types/d3-drag": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
@@ -4430,6 +4624,54 @@
"@types/d3-selection": "*"
}
},
+ "node_modules/@types/d3-dsv": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-fetch": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-dsv": "*"
+ }
+ },
+ "node_modules/@types/d3-force": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",
+ "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-format": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-geo": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
+ "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-hierarchy": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
+ "license": "MIT"
+ },
"node_modules/@types/d3-interpolate": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
@@ -4439,12 +4681,78 @@
"@types/d3-color": "*"
}
},
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-polygon": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-quadtree": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-random": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz",
+ "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",
+ "license": "MIT"
+ },
"node_modules/@types/d3-selection": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz",
"integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==",
"license": "MIT"
},
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz",
+ "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-time-format": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+ "license": "MIT"
+ },
"node_modules/@types/d3-transition": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",
@@ -4464,6 +4772,13 @@
"@types/d3-selection": "*"
}
},
+ "node_modules/@types/dagre": {
+ "version": "0.7.54",
+ "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.54.tgz",
+ "integrity": "sha512-QjcRY+adGbYvBFS7cwv5txhVIwX1XXIUswWl+kSQTbI6NjgZydrZkEKX/etzVd7i+bCsCb40Z/xlBY5eoFuvWQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -4495,6 +4810,12 @@
"@types/estree": "*"
}
},
+ "node_modules/@types/geojson": {
+ "version": "7946.0.16",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
+ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
+ "license": "MIT"
+ },
"node_modules/@types/hast": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
@@ -4578,6 +4899,7 @@
"version": "15.5.13",
"resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz",
"integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/react": "*"
@@ -4867,6 +5189,16 @@
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
"license": "ISC"
},
+ "node_modules/@upsetjs/venn.js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz",
+ "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==",
+ "license": "MIT",
+ "optionalDependencies": {
+ "d3-selection": "^3.0.0",
+ "d3-transition": "^3.0.1"
+ }
+ },
"node_modules/@vitejs/plugin-react": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz",
@@ -5202,9 +5534,9 @@
}
},
"node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -6734,6 +7066,34 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/chevrotain": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-12.0.0.tgz",
+ "integrity": "sha512-csJvb+6kEiQaqo1woTdSAuOWdN0WTLIydkKrBnS+V5gZz0oqBrp4kQ35519QgK6TpBThiG3V1vNSHlIkv4AglQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@chevrotain/cst-dts-gen": "12.0.0",
+ "@chevrotain/gast": "12.0.0",
+ "@chevrotain/regexp-to-ast": "12.0.0",
+ "@chevrotain/types": "12.0.0",
+ "@chevrotain/utils": "12.0.0"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/chevrotain-allstar": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.4.1.tgz",
+ "integrity": "sha512-PvVJm3oGqrveUVW2Vt/eZGeiAIsJszYweUcYwcskg9e+IubNYKKD+rHHem7A6XVO22eDAL+inxNIGAzZ/VIWlA==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash-es": "^4.17.21"
+ },
+ "peerDependencies": {
+ "chevrotain": "^12.0.0"
+ }
+ },
"node_modules/chokidar": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
@@ -6944,6 +7304,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "license": "MIT"
+ },
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -6986,6 +7352,15 @@
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"license": "MIT"
},
+ "node_modules/cose-base": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",
+ "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==",
+ "license": "MIT",
+ "dependencies": {
+ "layout-base": "^1.0.0"
+ }
+ },
"node_modules/cross-fetch": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
@@ -7176,78 +7551,435 @@
"dev": true,
"license": "MIT",
"dependencies": {
- "@asamuzakjp/css-color": "^4.1.1",
- "@csstools/css-syntax-patches-for-csstree": "^1.0.21",
- "css-tree": "^3.1.0",
- "lru-cache": "^11.2.4"
+ "@asamuzakjp/css-color": "^4.1.1",
+ "@csstools/css-syntax-patches-for-csstree": "^1.0.21",
+ "css-tree": "^3.1.0",
+ "lru-cache": "^11.2.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/cssstyle/node_modules/lru-cache": {
+ "version": "11.2.6",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz",
+ "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/cytoscape": {
+ "version": "3.33.2",
+ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.2.tgz",
+ "integrity": "sha512-sj4HXd3DokGhzZAdjDejGvTPLqlt84vNFN8m7bGsOzDY5DyVcxIb2ejIXat2Iy7HxWhdT/N1oKyheJ5YdpsGuw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/cytoscape-cose-bilkent": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz",
+ "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cose-base": "^1.0.0"
+ },
+ "peerDependencies": {
+ "cytoscape": "^3.2.0"
+ }
+ },
+ "node_modules/cytoscape-fcose": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",
+ "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cose-base": "^2.2.0"
+ },
+ "peerDependencies": {
+ "cytoscape": "^3.2.0"
+ }
+ },
+ "node_modules/cytoscape-fcose/node_modules/cose-base": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",
+ "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",
+ "license": "MIT",
+ "dependencies": {
+ "layout-base": "^2.0.0"
+ }
+ },
+ "node_modules/cytoscape-fcose/node_modules/layout-base": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",
+ "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==",
+ "license": "MIT"
+ },
+ "node_modules/d3": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "3",
+ "d3-axis": "3",
+ "d3-brush": "3",
+ "d3-chord": "3",
+ "d3-color": "3",
+ "d3-contour": "4",
+ "d3-delaunay": "6",
+ "d3-dispatch": "3",
+ "d3-drag": "3",
+ "d3-dsv": "3",
+ "d3-ease": "3",
+ "d3-fetch": "3",
+ "d3-force": "3",
+ "d3-format": "3",
+ "d3-geo": "3",
+ "d3-hierarchy": "3",
+ "d3-interpolate": "3",
+ "d3-path": "3",
+ "d3-polygon": "3",
+ "d3-quadtree": "3",
+ "d3-random": "3",
+ "d3-scale": "4",
+ "d3-scale-chromatic": "3",
+ "d3-selection": "3",
+ "d3-shape": "3",
+ "d3-time": "3",
+ "d3-time-format": "4",
+ "d3-timer": "3",
+ "d3-transition": "3",
+ "d3-zoom": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+ "license": "ISC",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-axis": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-brush": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-drag": "2 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-selection": "3",
+ "d3-transition": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-chord": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-contour": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-delaunay": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
+ "license": "ISC",
+ "dependencies": {
+ "delaunator": "5"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dispatch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-drag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-selection": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dsv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+ "license": "ISC",
+ "dependencies": {
+ "commander": "7",
+ "iconv-lite": "0.6",
+ "rw": "1"
+ },
+ "bin": {
+ "csv2json": "bin/dsv2json.js",
+ "csv2tsv": "bin/dsv2dsv.js",
+ "dsv2dsv": "bin/dsv2dsv.js",
+ "dsv2json": "bin/dsv2json.js",
+ "json2csv": "bin/json2dsv.js",
+ "json2dsv": "bin/json2dsv.js",
+ "json2tsv": "bin/json2dsv.js",
+ "tsv2csv": "bin/dsv2dsv.js",
+ "tsv2json": "bin/dsv2json.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dsv/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-fetch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dsv": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-force": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-quadtree": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-geo": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.5.0 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-hierarchy": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3"
},
"engines": {
- "node": ">=20"
+ "node": ">=12"
}
},
- "node_modules/cssstyle/node_modules/lru-cache": {
- "version": "11.2.6",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz",
- "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==",
- "dev": true,
- "license": "BlueOak-1.0.0",
+ "node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "license": "ISC",
"engines": {
- "node": "20 || >=22"
+ "node": ">=12"
}
},
- "node_modules/csstype": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
- "license": "MIT"
- },
- "node_modules/d3-color": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
- "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "node_modules/d3-polygon": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
- "node_modules/d3-dispatch": {
+ "node_modules/d3-quadtree": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
- "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
- "node_modules/d3-drag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
- "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+ "node_modules/d3-random": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
"license": "ISC",
- "dependencies": {
- "d3-dispatch": "1 - 3",
- "d3-selection": "3"
- },
"engines": {
"node": ">=12"
}
},
- "node_modules/d3-ease": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
- "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "node_modules/d3-sankey": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz",
+ "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "d3-array": "1 - 2",
+ "d3-shape": "^1.2.0"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/d3-array": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
+ "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "internmap": "^1.0.0"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/d3-path": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/d3-sankey/node_modules/d3-shape": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
"license": "BSD-3-Clause",
+ "dependencies": {
+ "d3-path": "1"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/internmap": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
+ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==",
+ "license": "ISC"
+ },
+ "node_modules/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ },
"engines": {
"node": ">=12"
}
},
- "node_modules/d3-interpolate": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
- "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "node_modules/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
"license": "ISC",
"dependencies": {
- "d3-color": "1 - 3"
+ "d3-color": "1 - 3",
+ "d3-interpolate": "1 - 3"
},
"engines": {
"node": ">=12"
@@ -7262,6 +7994,42 @@
"node": ">=12"
}
},
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/d3-timer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
@@ -7306,6 +8074,26 @@
"node": ">=12"
}
},
+ "node_modules/dagre": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz",
+ "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "graphlib": "^2.1.8",
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/dagre-d3-es": {
+ "version": "7.0.14",
+ "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz",
+ "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==",
+ "license": "MIT",
+ "dependencies": {
+ "d3": "^7.9.0",
+ "lodash-es": "^4.17.21"
+ }
+ },
"node_modules/data-uri-to-buffer": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
@@ -7383,6 +8171,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/dayjs": {
+ "version": "1.11.20",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz",
+ "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
+ "license": "MIT"
+ },
"node_modules/de-indent": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
@@ -7476,6 +8270,15 @@
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"license": "MIT"
},
+ "node_modules/delaunator": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz",
+ "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==",
+ "license": "ISC",
+ "dependencies": {
+ "robust-predicates": "^3.0.2"
+ }
+ },
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -9422,6 +10225,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/graphlib": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
+ "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.15"
+ }
+ },
"node_modules/gtoken": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz",
@@ -9452,6 +10264,12 @@
"uncrypto": "^0.1.3"
}
},
+ "node_modules/hachure-fill": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz",
+ "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==",
+ "license": "MIT"
+ },
"node_modules/has-bigints": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
@@ -10162,6 +10980,18 @@
"cross-fetch": "4.0.0"
}
},
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -10294,6 +11124,15 @@
"node": ">= 0.4"
}
},
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/iron-webcrypto": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
@@ -11195,6 +12034,31 @@
"safe-buffer": "^5.0.1"
}
},
+ "node_modules/katex": {
+ "version": "0.16.45",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.45.tgz",
+ "integrity": "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/katex/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -11205,6 +12069,11 @@
"json-buffer": "3.0.1"
}
},
+ "node_modules/khroma": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",
+ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
+ },
"node_modules/kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -11230,6 +12099,30 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/langium": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.2.tgz",
+ "integrity": "sha512-JUshTRAfHI4/MF9dH2WupvjSXyn8JBuUEWazB8ZVJUtXutT0doDlAv1XKbZ1Pb5sMexa8FF4CFBc0iiul7gbUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@chevrotain/regexp-to-ast": "~12.0.0",
+ "chevrotain": "~12.0.0",
+ "chevrotain-allstar": "~0.4.1",
+ "vscode-languageserver": "~9.0.1",
+ "vscode-languageserver-textdocument": "~1.0.11",
+ "vscode-uri": "~3.1.0"
+ },
+ "engines": {
+ "node": ">=20.10.0",
+ "npm": ">=10.2.3"
+ }
+ },
+ "node_modules/layout-base": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz",
+ "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==",
+ "license": "MIT"
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -11655,7 +12548,12 @@
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
"integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
- "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash-es": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
+ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
"license": "MIT"
},
"node_modules/lodash.get": {
@@ -11906,6 +12804,18 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/marked": {
+ "version": "16.4.2",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz",
+ "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==",
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -12276,6 +13186,35 @@
"node": ">= 8"
}
},
+ "node_modules/mermaid": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.14.0.tgz",
+ "integrity": "sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@braintree/sanitize-url": "^7.1.1",
+ "@iconify/utils": "^3.0.2",
+ "@mermaid-js/parser": "^1.1.0",
+ "@types/d3": "^7.4.3",
+ "@upsetjs/venn.js": "^2.0.0",
+ "cytoscape": "^3.33.1",
+ "cytoscape-cose-bilkent": "^4.1.0",
+ "cytoscape-fcose": "^2.2.0",
+ "d3": "^7.9.0",
+ "d3-sankey": "^0.12.3",
+ "dagre-d3-es": "7.0.14",
+ "dayjs": "^1.11.19",
+ "dompurify": "^3.3.1",
+ "katex": "^0.16.25",
+ "khroma": "^2.1.0",
+ "lodash-es": "^4.17.23",
+ "marked": "^16.3.0",
+ "roughjs": "^4.6.6",
+ "stylis": "^4.3.6",
+ "ts-dedent": "^2.2.0",
+ "uuid": "^11.1.0"
+ }
+ },
"node_modules/micromark": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
@@ -13099,6 +14038,18 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/mlly": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
+ "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.3"
+ }
+ },
"node_modules/motion-dom": {
"version": "12.34.0",
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.0.tgz",
@@ -13690,6 +14641,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/path-data-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz",
+ "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==",
+ "license": "MIT"
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -13762,7 +14719,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
- "dev": true,
"license": "MIT"
},
"node_modules/piccolore": {
@@ -13815,6 +14771,17 @@
"node": ">=8"
}
},
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
"node_modules/playwright": {
"version": "1.58.2",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz",
@@ -13862,6 +14829,22 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
+ "node_modules/points-on-curve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz",
+ "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==",
+ "license": "MIT"
+ },
+ "node_modules/points-on-path": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz",
+ "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==",
+ "license": "MIT",
+ "dependencies": {
+ "path-data-parser": "0.1.0",
+ "points-on-curve": "0.2.0"
+ }
+ },
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -14977,6 +15960,12 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/robust-predicates": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",
+ "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==",
+ "license": "Unlicense"
+ },
"node_modules/rollup": {
"version": "4.57.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz",
@@ -15021,6 +16010,18 @@
"fsevents": "~2.3.2"
}
},
+ "node_modules/roughjs": {
+ "version": "4.6.6",
+ "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz",
+ "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "hachure-fill": "^0.5.2",
+ "path-data-parser": "^0.1.0",
+ "points-on-curve": "^0.2.0",
+ "points-on-path": "^0.2.1"
+ }
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -15045,6 +16046,12 @@
"queue-microtask": "^1.2.2"
}
},
+ "node_modules/rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
+ "license": "BSD-3-Clause"
+ },
"node_modules/safe-array-concat": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
@@ -15120,6 +16127,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
"node_modules/sax": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
@@ -15904,6 +16917,12 @@
"inline-style-parser": "0.2.7"
}
},
+ "node_modules/stylis": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz",
+ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==",
+ "license": "MIT"
+ },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -16198,6 +17217,15 @@
"typescript": ">=4.8.4"
}
},
+ "node_modules/ts-dedent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
+ "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.10"
+ }
+ },
"node_modules/tsconfck": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz",
@@ -16730,6 +17758,19 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
+ "node_modules/uuid": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
+ "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
"node_modules/validator": {
"version": "13.15.26",
"resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz",
@@ -17001,6 +18042,55 @@
"node": ">=0.10.0"
}
},
+ "node_modules/vscode-jsonrpc": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
+ "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/vscode-languageserver": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz",
+ "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode-languageserver-protocol": "3.17.5"
+ },
+ "bin": {
+ "installServerIntoExtension": "bin/installServerIntoExtension"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
+ "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode-jsonrpc": "8.2.0",
+ "vscode-languageserver-types": "3.17.5"
+ }
+ },
+ "node_modules/vscode-languageserver-textdocument": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
+ "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==",
+ "license": "MIT"
+ },
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
+ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
+ "license": "MIT"
+ },
+ "node_modules/vscode-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
+ "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
+ "license": "MIT"
+ },
"node_modules/vue-template-compiler": {
"version": "2.7.16",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
@@ -17503,27 +18593,6 @@
"yjs": "^13.6.8"
}
},
- "node_modules/y-websocket": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/y-websocket/-/y-websocket-3.0.0.tgz",
- "integrity": "sha512-mUHy7AzkOZ834T/7piqtlA8Yk6AchqKqcrCXjKW8J1w2lPtRDjz8W5/CvXz9higKAHgKRKqpI3T33YkRFLkPtg==",
- "license": "MIT",
- "dependencies": {
- "lib0": "^0.2.102",
- "y-protocols": "^1.0.5"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=8.0.0"
- },
- "funding": {
- "type": "GitHub Sponsors โค",
- "url": "https://github.com/sponsors/dmonad"
- },
- "peerDependencies": {
- "yjs": "^13.5.6"
- }
- },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
diff --git a/package.json b/package.json
index 67e7dec3..3485cae4 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,9 @@
"build:ci": "npm run build && npm run bundle:check",
"test:ci": "npm run test -- --run && npm run build:ci",
"test:s0": "npx tsc -b --pretty false && npm run test -- --run src/store.test.ts src/hooks/useFlowHistory.test.ts src/components/flow-canvas/flowCanvasTypes.test.ts src/services/mermaid/parseMermaidByType.test.ts src/services/exportService.test.ts src/components/flow-canvas/largeGraphSafetyMode.test.ts",
+ "test:mermaid:gold": "npm run test:mermaid && npm run test:mermaid:layout",
+ "test:mermaid": "npx tsc -b --pretty false && npm run test -- --run src/services/mermaid/*.test.ts src/diagram-types/*/*.test.ts src/services/*RoundTrip.test.ts",
+ "test:mermaid:layout": "npx tsc -b --pretty false && npm run test -- --run src/services/mermaid/mermaidLayoutCorpus.test.ts src/services/mermaid/compatFixtureCorpus.test.ts src/services/mermaid/editablePartialCorpus.test.ts",
"test:s10-state": "npx tsc -b --pretty false && npm run test -- --run src/diagram-types/stateDiagram/plugin.test.ts src/services/stateDiagramRoundTrip.test.ts src/services/exportService.test.ts src/services/mermaid/parseMermaidByType.test.ts src/services/mermaid/detectDiagramType.test.ts",
"test:s10-canvas": "npx tsc -b --pretty false && npm run test -- --run src/components/flow-canvas/pasteHelpers.test.ts src/components/flow-canvas/flowCanvasTypes.test.ts src/components/flow-canvas/largeGraphSafetyMode.test.ts src/hooks/edgeConnectInteractions.test.ts src/components/DesignSystem.integration.test.tsx src/components/HomePage.integration.test.tsx src/store.test.ts",
"test:s4-handle-safety": "npx tsc -b --pretty false && npm run test -- --run src/components/handleInteraction.test.ts src/components/handleInteractionUsage.test.ts src/components/CustomNode.handleInteraction.test.tsx src/components/custom-nodes/ArchitectureNode.handleInteraction.test.tsx src/components/custom-nodes/ClassEntityNode.handleInteraction.test.tsx src/components/lightweight-nodes.handleInteraction.test.tsx src/components/custom-nodes/VisualNodes.handleInteraction.test.tsx src/components/container-nodes.handleInteraction.test.tsx src/components/flow-canvas/flowCanvasTypes.test.ts src/components/DesignSystem.integration.test.tsx src/components/HomePage.integration.test.tsx",
@@ -37,6 +40,7 @@
"bench:harness": "node scripts/benchmark-harness.mjs",
"bench:summary": "node scripts/benchmark-summary.mjs",
"bench:check": "node scripts/check-benchmark-results.mjs",
+ "mermaid:compat-report": "node scripts/mermaid-compat-report.mjs",
"audit:reactflow-v12": "node scripts/audit-reactflow-v12.mjs",
"shape-pack:manifest": "node scripts/shape-pack/generate-shape-pack-manifest.mjs",
"shape-pack:validate": "node scripts/shape-pack/validate-shape-pack-manifests.mjs",
@@ -45,7 +49,9 @@
},
"dependencies": {
"@google/genai": "^1.40.0",
+ "@mermaid-js/layout-elk": "^0.2.1",
"@xyflow/react": "^12.10.1",
+ "dagre": "^0.8.5",
"elkjs": "^0.11.0",
"framer-motion": "^12.34.0",
"html-to-image": "^1.11.13",
@@ -54,6 +60,7 @@
"i18next-http-backend": "^3.0.2",
"jszip": "^3.10.1",
"lucide-react": "^0.563.0",
+ "mermaid": "^11.14.0",
"posthog-js": "^1.347.2",
"react": "^19.2.4",
"react-dom": "^19.2.4",
@@ -74,6 +81,7 @@
"@tailwindcss/postcss": "^4.1.18",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2",
+ "@types/dagre": "^0.7.54",
"@types/node": "^22.14.0",
"@types/react-syntax-highlighter": "^15.5.13",
"@typescript-eslint/eslint-plugin": "^8.55.0",
diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json
index d854fedb..ef465ba6 100644
--- a/public/locales/de/translation.json
+++ b/public/locales/de/translation.json
@@ -856,7 +856,11 @@
"architectureStrictMode": "Architektur-Strict-Modus",
"architectureStrictModeDesc": "Mermaid-Import blockieren, wenn Architekturdiagnosen Wiederherstellungs-/Validierungsprobleme enthalten",
"miniMap": "Minimap",
- "miniMapDesc": "Minimap unten rechts anzeigen"
+ "miniMapDesc": "Minimap unten rechts anzeigen",
+ "mermaidImportMode": "Mermaid Import Mode",
+ "mermaidImportModeRenderer": "Fidelity-first",
+ "mermaidImportModeEditable": "Editable-first",
+ "mermaidImportModeDesc": "Controls how Mermaid diagrams are imported to the canvas."
},
"ai": {
"provider": "Anbieter",
@@ -1441,4 +1445,4 @@
"aiModel": {
"buttons": {}
}
-}
+}
\ No newline at end of file
diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json
index b82a69d9..a1f0e716 100644
--- a/public/locales/en/translation.json
+++ b/public/locales/en/translation.json
@@ -949,7 +949,11 @@
"routingProfileInfrastructure": "Infrastructure",
"routingProfileHint": "Infrastructure mode biases orthogonal routes for service maps.",
"edgeBundling": "Bundle Sibling Edges",
- "edgeBundlingDesc": "Keep parallel connections on shared lanes"
+ "edgeBundlingDesc": "Keep parallel connections on shared lanes",
+ "mermaidImportMode": "Mermaid Import Mode",
+ "mermaidImportModeRenderer": "Fidelity-first",
+ "mermaidImportModeEditable": "Editable-first",
+ "mermaidImportModeDesc": "Controls how Mermaid diagrams are imported to the canvas."
},
"analytics": {
"enableTitle": "Anonymous Launch Analytics",
@@ -1436,4 +1440,4 @@
"sidebar": {
"close": "Close sidebar"
}
-}
+}
\ No newline at end of file
diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json
index 16024368..5ccd61a6 100644
--- a/public/locales/es/translation.json
+++ b/public/locales/es/translation.json
@@ -856,7 +856,11 @@
"architectureStrictMode": "Modo Estricto de Arquitectura",
"architectureStrictModeDesc": "Bloquear importaciรณn de Mermaid cuando los diagnรณsticos de arquitectura incluyan problemas de recuperaciรณn/validaciรณn",
"miniMap": "Minimapa",
- "miniMapDesc": "Mostrar minimapa en la esquina inferior derecha"
+ "miniMapDesc": "Mostrar minimapa en la esquina inferior derecha",
+ "mermaidImportMode": "Mermaid Import Mode",
+ "mermaidImportModeRenderer": "Fidelity-first",
+ "mermaidImportModeEditable": "Editable-first",
+ "mermaidImportModeDesc": "Controls how Mermaid diagrams are imported to the canvas."
},
"ai": {
"provider": "Proveedor",
@@ -1441,4 +1445,4 @@
"aiModel": {
"buttons": {}
}
-}
+}
\ No newline at end of file
diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json
index 3f6bdcf4..824bb17c 100644
--- a/public/locales/fr/translation.json
+++ b/public/locales/fr/translation.json
@@ -856,7 +856,11 @@
"architectureStrictMode": "Mode Strict Architecture",
"architectureStrictModeDesc": "Bloquer l'import Mermaid lorsque les diagnostics d'architecture incluent des problรจmes de rรฉcupรฉration/validation",
"miniMap": "Mini carte",
- "miniMapDesc": "Afficher la mini carte en bas ร droite"
+ "miniMapDesc": "Afficher la mini carte en bas ร droite",
+ "mermaidImportMode": "Mermaid Import Mode",
+ "mermaidImportModeRenderer": "Fidelity-first",
+ "mermaidImportModeEditable": "Editable-first",
+ "mermaidImportModeDesc": "Controls how Mermaid diagrams are imported to the canvas."
},
"ai": {
"provider": "Fournisseur",
@@ -1441,4 +1445,4 @@
"aiModel": {
"buttons": {}
}
-}
+}
\ No newline at end of file
diff --git a/public/locales/ja/translation.json b/public/locales/ja/translation.json
index f3b5597e..16690c1f 100644
--- a/public/locales/ja/translation.json
+++ b/public/locales/ja/translation.json
@@ -856,7 +856,11 @@
"architectureStrictMode": "ใขใผใญใใฏใใฃStrictใขใผใ",
"architectureStrictModeDesc": "ใขใผใญใใฏใใฃ่จบๆญใๅๅพฉ/ๆค่จผใฎๅ้กใๅซใๅ ดๅใMermaidใคใณใใผใใใใญใใฏ",
"miniMap": "ใใใใใ",
- "miniMapDesc": "ๅณไธใซใใใใใใ่กจ็คบ"
+ "miniMapDesc": "ๅณไธใซใใใใใใ่กจ็คบ",
+ "mermaidImportMode": "Mermaid Import Mode",
+ "mermaidImportModeRenderer": "Fidelity-first",
+ "mermaidImportModeEditable": "Editable-first",
+ "mermaidImportModeDesc": "Controls how Mermaid diagrams are imported to the canvas."
},
"ai": {
"provider": "ใใญใใคใใผ",
@@ -1441,4 +1445,4 @@
"aiModel": {
"buttons": {}
}
-}
+}
\ No newline at end of file
diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json
index 26ef6916..34c37abb 100644
--- a/public/locales/tr/translation.json
+++ b/public/locales/tr/translation.json
@@ -876,7 +876,11 @@
"architectureStrictMode": "Mimari Katฤฑ Modu",
"architectureStrictModeDesc": "Mimari tanฤฑlamalar kurtarma/doฤrulama sorunlarฤฑ iรงerdiฤinde Mermaid iรงe aktarmayฤฑ engelle",
"miniMap": "Mini Harita",
- "miniMapDesc": "Saฤ altta mini haritayฤฑ gรถster"
+ "miniMapDesc": "Saฤ altta mini haritayฤฑ gรถster",
+ "mermaidImportMode": "Mermaid Import Mode",
+ "mermaidImportModeRenderer": "Fidelity-first",
+ "mermaidImportModeEditable": "Editable-first",
+ "mermaidImportModeDesc": "Controls how Mermaid diagrams are imported to the canvas."
},
"ai": {
"provider": "Saฤlayฤฑcฤฑ",
@@ -1441,4 +1445,4 @@
"aiModel": {
"buttons": {}
}
-}
+}
\ No newline at end of file
diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json
index bdfb4b64..2a304210 100644
--- a/public/locales/zh/translation.json
+++ b/public/locales/zh/translation.json
@@ -856,7 +856,11 @@
"architectureStrictMode": "ๆถๆไธฅๆ ผๆจกๅผ",
"architectureStrictModeDesc": "ๅฝๆถๆ่ฏๆญๅ
ๅซๆขๅค/้ช่ฏ้ฎ้ขๆถ้ปๆญขMermaidๅฏผๅ
ฅ",
"miniMap": "ๅฐๅฐๅพ",
- "miniMapDesc": "ๅจๅณไธ่งๆพ็คบๅฐๅฐๅพ"
+ "miniMapDesc": "ๅจๅณไธ่งๆพ็คบๅฐๅฐๅพ",
+ "mermaidImportMode": "Mermaid Import Mode",
+ "mermaidImportModeRenderer": "Fidelity-first",
+ "mermaidImportModeEditable": "Editable-first",
+ "mermaidImportModeDesc": "Controls how Mermaid diagrams are imported to the canvas."
},
"ai": {
"provider": "ๆไพๅ",
@@ -1441,4 +1445,4 @@
"aiModel": {
"buttons": {}
}
-}
+}
\ No newline at end of file
diff --git a/scripts/check-bundle-budget.mjs b/scripts/check-bundle-budget.mjs
index 1bd8a6c5..8959f4dd 100644
--- a/scripts/check-bundle-budget.mjs
+++ b/scripts/check-bundle-budget.mjs
@@ -37,6 +37,20 @@ function readAllChunkSizes() {
return sizes;
}
+function isStaticAssetWrapperChunk(relativePath) {
+ const filePath = path.join(DIST_DIR, relativePath);
+ const source = fs.readFileSync(filePath, 'utf8').trim();
+
+ // Vite emits tiny JS modules for SVG/data-URL assets when we use import.meta.glob with
+ // `?url` or when small SVGs are inlined. These modules are static string exports, not
+ // executable application code, so including them in the lazy-JS total creates false
+ // bundle-budget failures for large icon catalogs.
+ return /^const\s+\w+=["'`][\s\S]*["'`];export\{\w+ as default\};?$/.test(source)
+ && !source.includes('import')
+ && !source.includes('function')
+ && !source.includes('=>');
+}
+
function readEntryAssetSizes() {
if (!fs.existsSync(INDEX_HTML_PATH)) {
throw new Error('Missing dist/index.html. Run "npm run build" before "npm run bundle:check".');
@@ -108,7 +122,9 @@ function main() {
// Lazy chunk checks
const allChunkSizes = readAllChunkSizes();
const entryJsSet = new Set(jsEntries.map(([file]) => file));
- const lazyChunks = Array.from(allChunkSizes.entries()).filter(([file]) => !entryJsSet.has(file));
+ const lazyChunks = Array.from(allChunkSizes.entries()).filter(
+ ([file]) => !entryJsSet.has(file) && !isStaticAssetWrapperChunk(file)
+ );
const totalLazyBytes = lazyChunks.reduce((sum, [, size]) => sum + size, 0);
const top5 = [...lazyChunks].sort(([, a], [, b]) => b - a).slice(0, 5);
diff --git a/scripts/mermaid-compat-fixtures.json b/scripts/mermaid-compat-fixtures.json
new file mode 100644
index 00000000..e33a1cf0
--- /dev/null
+++ b/scripts/mermaid-compat-fixtures.json
@@ -0,0 +1,338 @@
+[
+ {
+ "name": "flowchart-basic",
+ "family": "flowchart",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "flowchart TD\nA[Start] --> B[End]"
+ },
+ {
+ "name": "flowchart-subgraph-explicit-id",
+ "family": "flowchart",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "flowchart TD\nsubgraph api[API Layer]\n A[Gateway] --> B[Service]\nend"
+ },
+ {
+ "name": "flowchart-invalid-edge",
+ "family": "flowchart",
+ "expectedOfficial": "invalid",
+ "expectedEditableGate": "supported_family",
+ "source": "flowchart TD\nA -->"
+ },
+ {
+ "name": "flowchart-invalid-subgraph-close",
+ "family": "flowchart",
+ "expectedOfficial": "invalid",
+ "expectedEditableGate": "supported_family",
+ "source": "flowchart TD\nsubgraph api[API]\n A --> B"
+ },
+ {
+ "name": "state-basic",
+ "family": "stateDiagram",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "stateDiagram-v2\n[*] --> Idle\nIdle --> [*]"
+ },
+ {
+ "name": "state-invalid-direction",
+ "family": "stateDiagram",
+ "expectedOfficial": "environment_limited",
+ "expectedEditableGate": "supported_family",
+ "source": "stateDiagram-v2\ndirection RLX\n[*] --> Idle"
+ },
+ {
+ "name": "sequence-basic",
+ "family": "sequence",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "sequenceDiagram\nparticipant Alice\nparticipant Bob\nAlice->>Bob: Hello"
+ },
+ {
+ "name": "sequence-activation-and-alt",
+ "family": "sequence",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "sequenceDiagram\nparticipant A\nparticipant B\nA->>B: Request\nactivate B\nalt success\n B-->>A: Response\nelse failure\n B-->>A: Error\nend\ndeactivate B"
+ },
+ {
+ "name": "sequence-invalid-message",
+ "family": "sequence",
+ "expectedOfficial": "invalid",
+ "expectedEditableGate": "supported_family",
+ "source": "sequenceDiagram\nparticipant A\nA->>"
+ },
+ {
+ "name": "sequence-partial-after-valid-message",
+ "family": "sequence",
+ "expectedOfficial": "invalid",
+ "expectedEditableGate": "supported_family",
+ "source": "sequenceDiagram\nparticipant A\nparticipant B\nA->>B: Hello\nA->>"
+ },
+ {
+ "name": "class-basic",
+ "family": "classDiagram",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "classDiagram\nclass Animal\nclass Duck\nAnimal <|-- Duck"
+ },
+ {
+ "name": "class-cardinality-generic",
+ "family": "classDiagram",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "classDiagram\nclass Repository~T~\nclass User\nRepository~T~ \"1\" --> \"*\" User : stores"
+ },
+ {
+ "name": "class-generic-multi-param",
+ "family": "classDiagram",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "classDiagram\nclass Map~K, V~\nclass Entry\nMap~K, V~ --> Entry : stores"
+ },
+ {
+ "name": "class-invalid-relation",
+ "family": "classDiagram",
+ "expectedOfficial": "environment_limited",
+ "expectedEditableGate": "supported_family",
+ "source": "classDiagram\nclass User\nUser -> Account"
+ },
+ {
+ "name": "er-basic",
+ "family": "erDiagram",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "erDiagram\nCUSTOMER ||--o{ ORDER : places"
+ },
+ {
+ "name": "er-field-metadata",
+ "family": "erDiagram",
+ "expectedOfficial": "invalid",
+ "expectedEditableGate": "supported_family",
+ "source": "erDiagram\nORDER {\n uuid id PK\n uuid customer_id FK REFERENCES CUSTOMER.id\n string external_id UNIQUE\n}"
+ },
+ {
+ "name": "er-field-references-table-only",
+ "family": "erDiagram",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "erDiagram\nORDER {\n uuid customer_id FK REFERENCES CUSTOMER\n string external_id UK\n}"
+ },
+ {
+ "name": "er-field-dotted-reference",
+ "family": "erDiagram",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "erDiagram\nORDER {\n uuid customer_id FK REFERENCES billing.Customer.id\n}"
+ },
+ {
+ "name": "mindmap-basic",
+ "family": "mindmap",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "mindmap\n Root\n Branch A\n Branch B"
+ },
+ {
+ "name": "mindmap-wrapped-nodes",
+ "family": "mindmap",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "mindmap\n root((Root))\n feature[[Child A]]\n decision{{Child B}}"
+ },
+ {
+ "name": "mindmap-dotted-aliases",
+ "family": "mindmap",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "mindmap\n platform.root((Root))\n platform.api[[Child A]]\n platform.branch(Child B)"
+ },
+ {
+ "name": "journey-basic",
+ "family": "journey",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "journey\ntitle Checkout\nsection Happy\n Search: 5: User\n Buy: 3: User"
+ },
+ {
+ "name": "journey-multiple-sections",
+ "family": "journey",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "journey\ntitle Incident Response\nsection Detect\n Alert fires: 5: SRE\nsection Resolve\n Mitigate: 3: SRE, Platform"
+ },
+ {
+ "name": "journey-invalid-score",
+ "family": "journey",
+ "expectedOfficial": "environment_limited",
+ "expectedEditableGate": "supported_family",
+ "source": "journey\ntitle Checkout\nsection Happy\n Search: User"
+ },
+ {
+ "name": "journey-colon-rich-step",
+ "family": "journey",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "journey\ntitle Incident Response\nsection Alerts\n HTTP: 500 Error: 1: SRE: On-call\n Recover service: 4: API: Team"
+ },
+ {
+ "name": "journey-support-escalation",
+ "family": "journey",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "journey\ntitle Support Escalation\nsection Intake\n Customer reports issue: 2: Support\n Triage severity: 3: Support\nsection Escalation\n Hand off to engineering: 4: Support, Engineering\n Confirm resolution: 5: Support"
+ },
+ {
+ "name": "state-notes-and-control",
+ "family": "stateDiagram",
+ "expectedOfficial": "valid",
+ "expectedEditableGate": "supported_family",
+ "source": "stateDiagram-v2\nstate FanOut <