From 851c4f67b312901261c9359cd834f60b46e62d48 Mon Sep 17 00:00:00 2001 From: konojunya Date: Fri, 4 Sep 2026 22:28:57 +0900 Subject: [PATCH] Publish searchable provider icon catalog --- .../theme/components/ProviderCatalog.vue | 224 + .../theme/data/provider-catalogs.json | 6474 +++++++++++++++++ docs/.vitepress/theme/index.ts | 2 + docs/.vitepress/theme/style.css | 197 + docs/guide/provider-icons.md | 27 +- docs/ja/guide/provider-icons.md | 27 +- docs/ko/guide/provider-icons.md | 27 +- docs/public/llms.txt | 2 +- docs/zh/guide/provider-icons.md | 27 +- scripts/sync-provider-catalogs.mjs | 45 + scripts/validate-docs.mjs | 45 + src/components/provider-icons.test.tsx | 50 + src/components/provider-icons.tsx | 216 +- 13 files changed, 7246 insertions(+), 117 deletions(-) create mode 100644 docs/.vitepress/theme/components/ProviderCatalog.vue create mode 100644 docs/.vitepress/theme/data/provider-catalogs.json create mode 100644 scripts/sync-provider-catalogs.mjs create mode 100644 src/components/provider-icons.test.tsx diff --git a/docs/.vitepress/theme/components/ProviderCatalog.vue b/docs/.vitepress/theme/components/ProviderCatalog.vue new file mode 100644 index 0000000..b585159 --- /dev/null +++ b/docs/.vitepress/theme/components/ProviderCatalog.vue @@ -0,0 +1,224 @@ + + + diff --git a/docs/.vitepress/theme/data/provider-catalogs.json b/docs/.vitepress/theme/data/provider-catalogs.json new file mode 100644 index 0000000..b782d7e --- /dev/null +++ b/docs/.vitepress/theme/data/provider-catalogs.json @@ -0,0 +1,6474 @@ +{ + "catalogVersion": "1.0", + "sourceRepository": "stack-sh/cli", + "sourceRevision": "sha256:fef0a6ba6d40a5205617b70fa8b874859acbe6e5eeeb1ef8bab7a2fd5b7f19bf", + "iconCount": 1051, + "providers": [ + { + "id": "aws", + "name": "Amazon Web Services", + "release": "Icon-package_07312026", + "sourcePageUrl": "https://aws.amazon.com/architecture/icons/", + "termsUrl": "https://aws.amazon.com/trademark-guidelines/", + "icons": [ + { + "id": "aws:amazon-api-gateway", + "productName": "Amazon API Gateway", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-appflow", + "productName": "Amazon AppFlow", + "category": "Application Integration", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-application-recovery-controller", + "productName": "Amazon Application Recovery Controller", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-athena", + "productName": "Amazon Athena", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-augmented-ai-a2i", + "productName": "Amazon Augmented AI A2I", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-aurora", + "productName": "Amazon Aurora", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:amazon-bedrock", + "productName": "Amazon Bedrock", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-bedrock-agentcore", + "productName": "Amazon Bedrock AgentCore", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-braket", + "productName": "Amazon Braket", + "category": "Quantum Technologies", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-chime", + "productName": "Amazon Chime", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-chime-sdk", + "productName": "Amazon Chime SDK", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-cloud-directory", + "productName": "Amazon Cloud Directory", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-cloudfront", + "productName": "Amazon CloudFront", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-cloudsearch", + "productName": "Amazon CloudSearch", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-cloudwatch", + "productName": "Amazon CloudWatch", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-codecatalyst", + "productName": "Amazon CodeCatalyst", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-codeguru", + "productName": "Amazon CodeGuru", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-codewhisperer", + "productName": "Amazon CodeWhisperer", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-cognito", + "productName": "Amazon Cognito", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-comprehend", + "productName": "Amazon Comprehend", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-comprehend-medical", + "productName": "Amazon Comprehend Medical", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-connect", + "productName": "Amazon Connect", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-corretto", + "productName": "Amazon Corretto", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-data-firehose", + "productName": "Amazon Data Firehose", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-datazone", + "productName": "Amazon DataZone", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-dcv", + "productName": "Amazon DCV", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-detective", + "productName": "Amazon Detective", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-devops-guru", + "productName": "Amazon DevOps Guru", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-documentdb", + "productName": "Amazon DocumentDB", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:amazon-ec2-auto-scaling", + "productName": "Amazon EC2 Auto Scaling", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-ec2-image-builder", + "productName": "Amazon EC2 Image Builder", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-ecs-anywhere", + "productName": "Amazon ECS Anywhere", + "category": "Containers", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-efs", + "productName": "Amazon EFS", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-eks-anywhere", + "productName": "Amazon EKS Anywhere", + "category": "Containers", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-eks-distro", + "productName": "Amazon EKS Distro", + "category": "Containers", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-elastic-block-store", + "productName": "Amazon Elastic Block Store", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-elastic-container-registry", + "productName": "Amazon Elastic Container Registry", + "category": "Containers", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-elastic-container-service", + "productName": "Amazon Elastic Container Service", + "category": "Containers", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-elastic-inference", + "productName": "Amazon Elastic Inference", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-elastic-vmware-service", + "productName": "Amazon Elastic VMware Service", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-elasticache", + "productName": "Amazon ElastiCache", + "category": "Databases", + "recommendedNodeKind": "cache" + }, + { + "id": "aws:amazon-emr", + "productName": "Amazon EMR", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-eventbridge", + "productName": "Amazon EventBridge", + "category": "Application Integration", + "recommendedNodeKind": "queue" + }, + { + "id": "aws:amazon-file-cache", + "productName": "Amazon File Cache", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-finspace", + "productName": "Amazon FinSpace", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-forecast", + "productName": "Amazon Forecast", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-fraud-detector", + "productName": "Amazon Fraud Detector", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-fsx", + "productName": "Amazon FSx", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-fsx-for-lustre", + "productName": "Amazon FSx for Lustre", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-fsx-for-netapp-ontap", + "productName": "Amazon FSx for NetApp ONTAP", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-fsx-for-openzfs", + "productName": "Amazon FSx for OpenZFS", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-fsx-for-wfs", + "productName": "Amazon FSx for WFS", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-gamelift-servers", + "productName": "Amazon GameLift Servers", + "category": "Games", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-gamelift-streams", + "productName": "Amazon GameLift Streams", + "category": "Games", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-guardduty", + "productName": "Amazon GuardDuty", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-inspector", + "productName": "Amazon Inspector", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-interactive-video-service", + "productName": "Amazon Interactive Video Service", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-kendra", + "productName": "Amazon Kendra", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-keyspaces", + "productName": "Amazon Keyspaces", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:amazon-kinesis", + "productName": "Amazon Kinesis", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-kinesis-data-streams", + "productName": "Amazon Kinesis Data Streams", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-kinesis-video-streams", + "productName": "Amazon Kinesis Video Streams", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-kinesis-video-streams-media-services", + "productName": "Amazon Kinesis Video Streams", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-lex", + "productName": "Amazon Lex", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-lightsail", + "productName": "Amazon Lightsail", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-lightsail-for-research", + "productName": "Amazon Lightsail for Research", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-location-service", + "productName": "Amazon Location Service", + "category": "Front End Web Mobile", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-lookout-for-equipment", + "productName": "Amazon Lookout for Equipment", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-lookout-for-vision", + "productName": "Amazon Lookout for Vision", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-macie", + "productName": "Amazon Macie", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-managed-blockchain", + "productName": "Amazon Managed Blockchain", + "category": "Blockchain", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-managed-grafana", + "productName": "Amazon Managed Grafana", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-managed-service-for-apache-flink", + "productName": "Amazon Managed Service for Apache Flink", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-managed-service-for-prometheus", + "productName": "Amazon Managed Service for Prometheus", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-managed-streaming-for-apache-kafka", + "productName": "Amazon Managed Streaming for Apache Kafka", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-managed-workflows-for-apache-airflow", + "productName": "Amazon Managed Workflows for Apache Airflow", + "category": "Application Integration", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-memorydb", + "productName": "Amazon MemoryDB", + "category": "Databases", + "recommendedNodeKind": "cache" + }, + { + "id": "aws:amazon-monitron", + "productName": "Amazon Monitron", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-mq", + "productName": "Amazon MQ", + "category": "Application Integration", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-neptune", + "productName": "Amazon Neptune", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:amazon-nova", + "productName": "Amazon Nova", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-opensearch-service", + "productName": "Amazon OpenSearch Service", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-personalize", + "productName": "Amazon Personalize", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-pinpoint", + "productName": "Amazon Pinpoint", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-pinpoint-apis", + "productName": "Amazon Pinpoint APIs", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-polly", + "productName": "Amazon Polly", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-q", + "productName": "Amazon Q", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-quick", + "productName": "Amazon Quick", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-redshift", + "productName": "Amazon Redshift", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-rekognition", + "productName": "Amazon Rekognition", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-route-53", + "productName": "Amazon Route 53", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-s3-on-outposts", + "productName": "Amazon S3 on Outposts", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-sagemaker", + "productName": "Amazon SageMaker", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-sagemaker-ai", + "productName": "Amazon SageMaker AI", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-sagemaker-ground-truth", + "productName": "Amazon SageMaker Ground Truth", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-sagemaker-studio-lab", + "productName": "Amazon SageMaker Studio Lab", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-security-lake", + "productName": "Amazon Security Lake", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-simple-email-service", + "productName": "Amazon Simple Email Service", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-simple-notification-service", + "productName": "Amazon Simple Notification Service", + "category": "Application Integration", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-simple-storage-service-glacier", + "productName": "Amazon Simple Storage Service Glacier", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:amazon-textract", + "productName": "Amazon Textract", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-timestream", + "productName": "Amazon Timestream", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:amazon-transcribe", + "productName": "Amazon Transcribe", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-translate", + "productName": "Amazon Translate", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-verified-permissions", + "productName": "Amazon Verified Permissions", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-virtual-private-cloud", + "productName": "Amazon Virtual Private Cloud", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-vpc-lattice", + "productName": "Amazon VPC Lattice", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-workdocs", + "productName": "Amazon WorkDocs", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-workdocs-sdk", + "productName": "Amazon WorkDocs SDK", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-workmail", + "productName": "Amazon WorkMail", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:amazon-workspaces", + "productName": "Amazon WorkSpaces", + "category": "End User Computing", + "recommendedNodeKind": "service" + }, + { + "id": "aws:apache-mxnet-on-aws", + "productName": "Apache MXNet on AWS", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-activate", + "productName": "AWS Activate", + "category": "Customer Enablement", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-amplify", + "productName": "AWS Amplify", + "category": "Front End Web Mobile", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-app-mesh", + "productName": "AWS App Mesh", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-app-runner", + "productName": "AWS App Runner", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-app-studio", + "productName": "AWS App Studio", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-appconfig", + "productName": "AWS AppConfig", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-appfabric", + "productName": "AWS AppFabric", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-application-auto-scaling", + "productName": "AWS Application Auto Scaling", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-application-discovery-service", + "productName": "AWS Application Discovery Service", + "category": "Migration Modernization", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-application-migration-service", + "productName": "AWS Application Migration Service", + "category": "Migration Modernization", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-appsync", + "productName": "AWS AppSync", + "category": "Application Integration", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-artifact", + "productName": "AWS Artifact", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-audit-manager", + "productName": "AWS Audit Manager", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-auto-scaling", + "productName": "AWS Auto Scaling", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-b2b-data-interchange", + "productName": "AWS B2B Data Interchange", + "category": "Application Integration", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-backint-agent", + "productName": "AWS Backint Agent", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-backup", + "productName": "AWS Backup", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-batch", + "productName": "AWS Batch", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-billing-conductor", + "productName": "AWS Billing Conductor", + "category": "Cloud Financial Management", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-budgets", + "productName": "AWS Budgets", + "category": "Cloud Financial Management", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-certificate-manager", + "productName": "AWS Certificate Manager", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-chatbot", + "productName": "AWS Chatbot", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-clean-rooms", + "productName": "AWS Clean Rooms", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-client-vpn", + "productName": "AWS Client VPN", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloud-control-api", + "productName": "AWS Cloud Control API", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloud-development-kit", + "productName": "AWS Cloud Development Kit", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloud-map", + "productName": "AWS Cloud Map", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloud-wan", + "productName": "AWS Cloud WAN", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloud9", + "productName": "AWS Cloud9", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloudformation", + "productName": "AWS CloudFormation", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloudhsm", + "productName": "AWS CloudHSM", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloudshell", + "productName": "AWS CloudShell", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cloudtrail", + "productName": "AWS CloudTrail", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-codeartifact", + "productName": "AWS CodeArtifact", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-codebuild", + "productName": "AWS CodeBuild", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-codecommit", + "productName": "AWS CodeCommit", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-codedeploy", + "productName": "AWS CodeDeploy", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-codepipeline", + "productName": "AWS CodePipeline", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-command-line-interface", + "productName": "AWS Command Line Interface", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-compute-optimizer", + "productName": "AWS Compute Optimizer", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-compute-optimizer-management-tools", + "productName": "AWS Compute Optimizer", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-config", + "productName": "AWS Config", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-console-mobile-application", + "productName": "AWS Console Mobile Application", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-control-tower", + "productName": "AWS Control Tower", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-cost-and-usage-report", + "productName": "AWS Cost and Usage Report", + "category": "Cloud Financial Management", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-cost-explorer", + "productName": "AWS Cost Explorer", + "category": "Cloud Financial Management", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-data-exchange", + "productName": "AWS Data Exchange", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-data-transfer-terminal", + "productName": "AWS Data Transfer Terminal", + "category": "Migration Modernization", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-database-migration-service", + "productName": "AWS Database Migration Service", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:aws-datasync", + "productName": "AWS DataSync", + "category": "Migration Modernization", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-deadline-cloud", + "productName": "AWS Deadline Cloud", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-deep-learning-amis", + "productName": "AWS Deep Learning AMIs", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-deep-learning-containers", + "productName": "AWS Deep Learning Containers", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-deepracer", + "productName": "AWS DeepRacer", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-device-farm", + "productName": "AWS Device Farm", + "category": "Front End Web Mobile", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-devops-agent", + "productName": "AWS DevOps Agent", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-direct-connect", + "productName": "AWS Direct Connect", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-directory-service", + "productName": "AWS Directory Service", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-distro-for-opentelemetry", + "productName": "AWS Distro for OpenTelemetry", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elastic-beanstalk", + "productName": "AWS Elastic Beanstalk", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elastic-disaster-recovery", + "productName": "AWS Elastic Disaster Recovery", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-elemental-appliances-and-software", + "productName": "AWS Elemental Appliances & Software", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-conductor", + "productName": "AWS Elemental Conductor", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-delta", + "productName": "AWS Elemental Delta", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-inference", + "productName": "AWS Elemental Inference", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-link", + "productName": "AWS Elemental Link", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-live", + "productName": "AWS Elemental Live", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-mediaconnect", + "productName": "AWS Elemental MediaConnect", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-mediaconvert", + "productName": "AWS Elemental MediaConvert", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-medialive", + "productName": "AWS Elemental MediaLive", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-mediapackage", + "productName": "AWS Elemental MediaPackage", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-mediastore", + "productName": "AWS Elemental MediaStore", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-mediatailor", + "productName": "AWS Elemental MediaTailor", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-elemental-server", + "productName": "AWS Elemental Server", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-end-user-messaging", + "productName": "AWS End User Messaging", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-entity-resolution", + "productName": "AWS Entity Resolution", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-express-workflows", + "productName": "AWS Express Workflows", + "category": "Application Integration", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-fargate", + "productName": "AWS Fargate", + "category": "Containers", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-fault-injection-service", + "productName": "AWS Fault Injection Service", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-finops-agent", + "productName": "AWS FinOps Agent", + "category": "Cloud Financial Management", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-firewall-manager", + "productName": "AWS Firewall Manager", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-global-accelerator", + "productName": "AWS Global Accelerator", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-glue", + "productName": "AWS Glue", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-glue-databrew", + "productName": "AWS Glue DataBrew", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-ground-station", + "productName": "AWS Ground Station", + "category": "Satellite", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-health-dashboard", + "productName": "AWS Health Dashboard", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-healthimaging", + "productName": "AWS HealthImaging", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-healthlake", + "productName": "AWS HealthLake", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-healthomics", + "productName": "AWS HealthOmics", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-healthscribe", + "productName": "AWS HealthScribe", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iam-identity-center", + "productName": "AWS IAM Identity Center", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-identity-and-access-management", + "productName": "AWS Identity and Access Management", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-infrastructure-composer", + "productName": "AWS Infrastructure Composer", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-interconnect", + "productName": "AWS Interconnect", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-core", + "productName": "AWS IoT Core", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-device-defender", + "productName": "AWS IoT Device Defender", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-device-management", + "productName": "AWS IoT Device Management", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-events", + "productName": "AWS IoT Events", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-expresslink", + "productName": "AWS IoT ExpressLink", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-fleetwise", + "productName": "AWS IoT FleetWise", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-greengrass", + "productName": "AWS IoT Greengrass", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-sitewise", + "productName": "AWS IoT SiteWise", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iot-twinmaker", + "productName": "AWS IoT TwinMaker", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-iq", + "productName": "AWS IQ", + "category": "Customer Enablement", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-key-management-service", + "productName": "AWS Key Management Service", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-lake-formation", + "productName": "AWS Lake Formation", + "category": "Analytics", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-launch-wizard", + "productName": "AWS Launch Wizard", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-license-manager", + "productName": "AWS License Manager", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-local-zones", + "productName": "AWS Local Zones", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-mainframe-modernization", + "productName": "AWS Mainframe Modernization", + "category": "Migration Modernization", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-managed-services", + "productName": "AWS Managed Services", + "category": "Customer Enablement", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-management-console", + "productName": "AWS Management Console", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-marketplace-dark", + "productName": "AWS Marketplace_Dark", + "category": "General Icons", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-marketplace-light", + "productName": "AWS Marketplace_Light", + "category": "General Icons", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-migration-evaluator", + "productName": "AWS Migration Evaluator", + "category": "Migration Modernization", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-network-firewall", + "productName": "AWS Network Firewall", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-neuron", + "productName": "AWS Neuron", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-nitro-enclaves", + "productName": "AWS Nitro Enclaves", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-organizations", + "productName": "AWS Organizations", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-outposts-family", + "productName": "AWS Outposts family", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-outposts-rack", + "productName": "AWS Outposts rack", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-outposts-servers", + "productName": "AWS Outposts servers", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-panorama", + "productName": "AWS Panorama", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-parallel-cluster", + "productName": "AWS Parallel Cluster", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-parallel-computing-service", + "productName": "AWS Parallel Computing Service", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-partner-central", + "productName": "AWS Partner Central", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-payment-cryptography", + "productName": "AWS Payment Cryptography", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-private-certificate-authority", + "productName": "AWS Private Certificate Authority", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-privatelink", + "productName": "AWS PrivateLink", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-professional-services", + "productName": "AWS Professional Services", + "category": "Customer Enablement", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-proton", + "productName": "AWS Proton", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-repost", + "productName": "AWS rePost", + "category": "Customer Enablement", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-repost-private", + "productName": "AWS rePost Private", + "category": "Customer Enablement", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-resilience-hub", + "productName": "AWS Resilience Hub", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-resource-access-manager", + "productName": "AWS Resource Access Manager", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-resource-explorer", + "productName": "AWS Resource Explorer", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-rtb-fabric", + "productName": "AWS RTB Fabric", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-secrets-manager", + "productName": "AWS Secrets Manager", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-security-agent", + "productName": "AWS Security Agent", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-security-hub", + "productName": "AWS Security Hub", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-security-incident-response", + "productName": "AWS Security Incident Response", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-serverless-application-repository", + "productName": "AWS Serverless Application Repository", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-service-catalog", + "productName": "AWS Service Catalog", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-service-management-connector", + "productName": "AWS Service Management Connector", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-shield", + "productName": "AWS Shield", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-signer", + "productName": "AWS Signer", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-simspace-weaver", + "productName": "AWS SimSpace Weaver", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-site-to-site-vpn", + "productName": "AWS Site to Site VPN", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-snowball", + "productName": "AWS Snowball", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-snowball-edge", + "productName": "AWS Snowball Edge", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-step-functions", + "productName": "AWS Step Functions", + "category": "Application Integration", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-storage-gateway", + "productName": "AWS Storage Gateway", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:aws-supply-chain", + "productName": "AWS Supply Chain", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-support", + "productName": "AWS Support", + "category": "Customer Enablement", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-sustainability", + "productName": "AWS Sustainability", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-systems-manager", + "productName": "AWS Systems Manager", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-telco-network-builder", + "productName": "AWS Telco Network Builder", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-thinkbox-deadline", + "productName": "AWS Thinkbox Deadline", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-thinkbox-frost", + "productName": "AWS Thinkbox Frost", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-thinkbox-krakatoa", + "productName": "AWS Thinkbox Krakatoa", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-thinkbox-stoke", + "productName": "AWS Thinkbox Stoke", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-thinkbox-xmesh", + "productName": "AWS Thinkbox XMesh", + "category": "Media Services", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-tools-and-sdks", + "productName": "AWS Tools and SDKs", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-training-certification", + "productName": "AWS Training Certification", + "category": "Customer Enablement", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-transfer-family", + "productName": "AWS Transfer Family", + "category": "Migration Modernization", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-transform", + "productName": "AWS Transform", + "category": "Migration Modernization", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-transit-gateway", + "productName": "AWS Transit Gateway", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-trusted-advisor", + "productName": "AWS Trusted Advisor", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-user-notifications", + "productName": "AWS User Notifications", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-verified-access", + "productName": "AWS Verified Access", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-waf", + "productName": "AWS WAF", + "category": "Security Identity", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-wavelength", + "productName": "AWS Wavelength", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-well-architected-tool", + "productName": "AWS Well Architected Tool", + "category": "Management Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-wickr", + "productName": "AWS Wickr", + "category": "Business Applications", + "recommendedNodeKind": "service" + }, + { + "id": "aws:aws-x-ray", + "productName": "AWS X Ray", + "category": "Developer Tools", + "recommendedNodeKind": "service" + }, + { + "id": "aws:bottlerocket", + "productName": "Bottlerocket", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:dynamodb", + "productName": "Amazon DynamoDB", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:ec2", + "productName": "Amazon Elastic Compute Cloud (Amazon EC2)", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:eks", + "productName": "Amazon Elastic Kubernetes Service (Amazon EKS)", + "category": "Containers", + "recommendedNodeKind": "service" + }, + { + "id": "aws:elastic-fabric-adapter", + "productName": "Elastic Fabric Adapter", + "category": "Compute", + "recommendedNodeKind": "service" + }, + { + "id": "aws:elastic-load-balancing", + "productName": "Elastic Load Balancing", + "category": "Networking Content Delivery", + "recommendedNodeKind": "service" + }, + { + "id": "aws:freertos", + "productName": "FreeRTOS", + "category": "Internet of Things", + "recommendedNodeKind": "service" + }, + { + "id": "aws:lambda", + "productName": "AWS Lambda", + "category": "Compute", + "recommendedNodeKind": "function" + }, + { + "id": "aws:open-3d-engine", + "productName": "Open 3D Engine", + "category": "Games", + "recommendedNodeKind": "service" + }, + { + "id": "aws:oracle-database-at-aws", + "productName": "Oracle Database at AWS", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:pytorch-on-aws", + "productName": "PyTorch on AWS", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + }, + { + "id": "aws:rds", + "productName": "Amazon Relational Database Service (Amazon RDS)", + "category": "Databases", + "recommendedNodeKind": "database" + }, + { + "id": "aws:red-hat-openshift-service-on-aws", + "productName": "Red Hat OpenShift Service on AWS", + "category": "Containers", + "recommendedNodeKind": "service" + }, + { + "id": "aws:reserved-instance-reporting", + "productName": "Reserved Instance Reporting", + "category": "Cloud Financial Management", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:s3", + "productName": "Amazon Simple Storage Service (Amazon S3)", + "category": "Storage", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:savings-plans", + "productName": "Savings Plans", + "category": "Cloud Financial Management", + "recommendedNodeKind": "storage" + }, + { + "id": "aws:sqs", + "productName": "Amazon Simple Queue Service (Amazon SQS)", + "category": "Application Integration", + "recommendedNodeKind": "queue" + }, + { + "id": "aws:tensorflow-on-aws", + "productName": "TensorFlow on AWS", + "category": "Artificial Intelligence", + "recommendedNodeKind": "service" + } + ] + }, + { + "id": "gcp", + "name": "Google Cloud", + "release": "Core product icons (May 2026 guide)", + "sourcePageUrl": "https://cloud.google.com/icons", + "termsUrl": "https://about.google/brand-resource-center/", + "icons": [ + { + "id": "gcp:agents", + "productName": "Agents category", + "category": "Product categories", + "recommendedNodeKind": "worker" + }, + { + "id": "gcp:ai-and-machine-learning", + "productName": "AI & Machine Learning category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:ai-hypercomputer", + "productName": "AI Hypercomputer", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:alloydb", + "productName": "AlloyDB", + "category": "Core products", + "recommendedNodeKind": "database" + }, + { + "id": "gcp:anthos", + "productName": "Anthos", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:apigee", + "productName": "Apigee", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:bigquery", + "productName": "BigQuery", + "category": "Core products", + "recommendedNodeKind": "database" + }, + { + "id": "gcp:business-intelligence", + "productName": "Business Intelligence category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:cloud-run", + "productName": "Cloud Run", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:cloud-spanner", + "productName": "Cloud Spanner", + "category": "Core products", + "recommendedNodeKind": "database" + }, + { + "id": "gcp:cloud-sql", + "productName": "Cloud SQL", + "category": "Core products", + "recommendedNodeKind": "database" + }, + { + "id": "gcp:cloud-storage", + "productName": "Cloud Storage", + "category": "Core products", + "recommendedNodeKind": "storage" + }, + { + "id": "gcp:collaboration", + "productName": "Collaboration category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:compute", + "productName": "Compute category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:compute-engine", + "productName": "Compute Engine", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:containers", + "productName": "Containers category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:data-analytics", + "productName": "Data Analytics category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:databases", + "productName": "Databases category", + "category": "Product categories", + "recommendedNodeKind": "database" + }, + { + "id": "gcp:developer-tools", + "productName": "Developer Tools category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:devops", + "productName": "DevOps category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:distributed-cloud", + "productName": "Distributed Cloud", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:gke", + "productName": "Google Kubernetes Engine", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:hybrid-and-multicloud", + "productName": "Hybrid & Multicloud category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:hyperdisk", + "productName": "Hyperdisk", + "category": "Core products", + "recommendedNodeKind": "storage" + }, + { + "id": "gcp:integration-services", + "productName": "Integration Services category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:looker", + "productName": "Looker", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:management-tools", + "productName": "Management Tools category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:mandiant", + "productName": "Mandiant", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:maps-and-geospatial", + "productName": "Maps & Geospatial category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:marketplace", + "productName": "Marketplace category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:media-services", + "productName": "Media Services category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:migration", + "productName": "Migration category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:mixed-reality", + "productName": "Mixed Reality category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:networking", + "productName": "Networking category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:observability", + "productName": "Observability category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:operations", + "productName": "Operations category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:security-command-center", + "productName": "Security Command Center", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:security-identity", + "productName": "Security Identity category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:security-operations", + "productName": "Security Operations", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:serverless", + "productName": "Serverless Computing category", + "category": "Product categories", + "recommendedNodeKind": "function" + }, + { + "id": "gcp:storage", + "productName": "Storage category", + "category": "Product categories", + "recommendedNodeKind": "storage" + }, + { + "id": "gcp:threat-intelligence", + "productName": "Threat Intelligence", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:vertex-ai", + "productName": "Vertex AI", + "category": "Core products", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:web-and-mobile", + "productName": "Web & Mobile category", + "category": "Product categories", + "recommendedNodeKind": "service" + }, + { + "id": "gcp:web3", + "productName": "Web3 category", + "category": "Product categories", + "recommendedNodeKind": "service" + } + ] + }, + { + "id": "azure", + "name": "Microsoft Azure", + "release": "Azure_Public_Service_Icons_V24", + "sourcePageUrl": "https://learn.microsoft.com/azure/architecture/icons/", + "termsUrl": "https://learn.microsoft.com/azure/architecture/icons/", + "icons": [ + { + "id": "azure:030777508-icon-service-service-group-relationships", + "productName": "030777508 icon service Service Group Relationships", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:abs-member", + "productName": "ABS Member", + "category": "blockchain", + "recommendedNodeKind": "service" + }, + { + "id": "azure:active-directory-connect-health", + "productName": "Active Directory Connect Health", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:activity-log", + "productName": "Activity Log", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:administrative-units", + "productName": "Administrative Units", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:advisor", + "productName": "Advisor", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:agentic-web-apps", + "productName": "Agentic Web Apps", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ai-at-edge", + "productName": "AI at Edge", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ai-foundry", + "productName": "AI Foundry", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ai-gateway", + "productName": "AI Gateway", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ai-studio", + "productName": "AI Studio", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:aks", + "productName": "Azure Kubernetes Service (AKS)", + "category": "containers", + "recommendedNodeKind": "service" + }, + { + "id": "azure:aks-automatic", + "productName": "AKS Automatic", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:aks-istio", + "productName": "AKS Istio", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:aks-network-policy", + "productName": "AKS Network Policy", + "category": "containers", + "recommendedNodeKind": "service" + }, + { + "id": "azure:alerts", + "productName": "Alerts", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:all-resources", + "productName": "All Resources", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:analysis-services", + "productName": "Analysis Services", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:anomaly-detector", + "productName": "Anomaly Detector", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:api-center", + "productName": "API Center", + "category": "web", + "recommendedNodeKind": "service" + }, + { + "id": "azure:api-connections", + "productName": "API Connections", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:api-management-services", + "productName": "API Management Services", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:api-proxy", + "productName": "API Proxy", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-compliance-automation", + "productName": "App Compliance Automation", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-configuration", + "productName": "App Configuration", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-registrations", + "productName": "App Registrations", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-service", + "productName": "Azure App Service", + "category": "app services", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-service-certificates", + "productName": "App Service Certificates", + "category": "app services", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-service-domains", + "productName": "App Service Domains", + "category": "app services", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-service-environments", + "productName": "App Service Environments", + "category": "app services", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-service-plans", + "productName": "App Service Plans", + "category": "app services", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-space", + "productName": "App Space", + "category": "web", + "recommendedNodeKind": "service" + }, + { + "id": "azure:app-space-component", + "productName": "App Space Component", + "category": "web", + "recommendedNodeKind": "service" + }, + { + "id": "azure:applens", + "productName": "Applens", + "category": "azure ecosystem", + "recommendedNodeKind": "service" + }, + { + "id": "azure:application-gateway-containers", + "productName": "Application Gateway Containers", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:application-gateways", + "productName": "Application Gateways", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:application-group", + "productName": "Application Group", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:application-insights", + "productName": "Application Insights", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:application-security-groups", + "productName": "Application Security Groups", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:aquila", + "productName": "Aquila", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:arc-data-services", + "productName": "Arc Data services", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:arc-kubernetes", + "productName": "Arc Kubernetes", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:arc-machines", + "productName": "Arc Machines", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:arc-postgresql", + "productName": "Arc PostgreSQL ", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:arc-sql-managed-instance", + "productName": "Arc SQL Managed Instance", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:arc-sql-server", + "productName": "Arc SQL Server", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:atm-multistack", + "productName": "ATM Multistack", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:auto-scale", + "productName": "Auto Scale", + "category": "monitor", + "recommendedNodeKind": "service" + }, + { + "id": "azure:automanaged-vm", + "productName": "Automanaged VM", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:automation-accounts", + "productName": "Automation Accounts", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:availability-sets", + "productName": "Availability Sets", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:avs-vm", + "productName": "AVS VM", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-a", + "productName": "Azure A", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-access-point", + "productName": "Azure Access Point", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-ad-b2c", + "productName": "Azure AD B2C", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-ai-foundry-iq", + "productName": "Azure AI Foundry IQ", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-api-for-fhir", + "productName": "Azure API for FHIR", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-app-testing", + "productName": "Azure App Testing", + "category": "developer tools", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-applied-ai-services", + "productName": "Azure Applied AI Services", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-arc", + "productName": "Azure Arc", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-backup-center", + "productName": "Azure Backup Center", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-blockchain-service", + "productName": "Azure Blockchain Service", + "category": "blockchain", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-center-for-sap", + "productName": "Azure Center for SAP", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-chaos-studio", + "productName": "Azure Chaos Studio", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-cloud-shell", + "productName": "Azure Cloud Shell", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-communication-services", + "productName": "Azure Communication Services", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-communications-gateway", + "productName": "Azure Communications Gateway", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-compute-galleries", + "productName": "Azure Compute Galleries", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-consumption-commitment", + "productName": "Azure Consumption Commitment", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-container-storage", + "productName": "Azure Container Storage", + "category": "containers", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-cosmos-db", + "productName": "Azure Cosmos DB", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-data-catalog", + "productName": "Azure Data Catalog", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-data-explorer-clusters", + "productName": "Azure Data Explorer Clusters", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-data-sharing", + "productName": "Azure Data Sharing", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-data-transfer", + "productName": "Azure Data Transfer", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-database-mariadb-server", + "productName": "Azure Database MariaDB Server", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-database-migration-services", + "productName": "Azure Database Migration Services", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-database-mysql-server", + "productName": "Azure Database MySQL Server", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-database-postgresql-server", + "productName": "Azure Database PostgreSQL Server", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-database-postgresql-server-group", + "productName": "Azure Database PostgreSQL Server Group", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-databox-gateway", + "productName": "Azure Databox Gateway", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-databricks", + "productName": "Azure Databricks", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-deployment-environments", + "productName": "Azure Deployment Environments", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-dev-tunnels", + "productName": "Azure Dev Tunnels", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-devops", + "productName": "Azure DevOps", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-documentdb", + "productName": "Azure DocumentDB", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-edge-hardware-center", + "productName": "Azure Edge Hardware Center", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-enclaves", + "productName": "Azure Enclaves", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-experimentation-studio", + "productName": "Azure Experimentation Studio", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-fileshares", + "productName": "Azure Fileshares", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:azure-firewall-manager", + "productName": "Azure Firewall Manager", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-firewall-policy", + "productName": "Azure Firewall Policy", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-hcp-cache", + "productName": "Azure HCP Cache", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:azure-hpc-workbenches", + "productName": "Azure HPC Workbenches", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-hybrid-center", + "productName": "Azure Hybrid Center", + "category": "azure ecosystem", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-information-protection", + "productName": "Azure Information Protection", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-iot-operations", + "productName": "Azure IoT Operations", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-lighthouse", + "productName": "Azure Lighthouse", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-linux", + "productName": "Azure Linux", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-load-testing", + "productName": "Azure Load Testing", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-local", + "productName": "Azure Local", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-machine-learning", + "productName": "Azure Machine Learning", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-managed-grafana", + "productName": "Azure Managed Grafana", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-managed-redis", + "productName": "Azure Managed Redis", + "category": "databases", + "recommendedNodeKind": "cache" + }, + { + "id": "azure:azure-maps-accounts", + "productName": "Azure Maps Accounts", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-media-service", + "productName": "Azure Media Service", + "category": "web", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-migrate", + "productName": "Azure Migrate", + "category": "migrate", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-monitor-dashboard", + "productName": "Azure Monitor Dashboard", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-monitor-pipeline", + "productName": "Azure Monitor Pipeline", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-monitors-for-sap-solutions", + "productName": "Azure Monitors for SAP Solutions", + "category": "monitor", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-netapp-files", + "productName": "Azure NetApp Files", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:azure-network-function-manager", + "productName": "Azure Network Function Manager", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-network-function-manager-functions", + "productName": "Azure Network Function Manager Functions", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-object-understanding", + "productName": "Azure Object Understanding", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-openai", + "productName": "Azure OpenAI", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-operator-5g-core", + "productName": "Azure Operator 5G Core", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-operator-insights", + "productName": "Azure Operator Insights", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-operator-nexus", + "productName": "Azure Operator Nexus", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-operator-service-manager", + "productName": "Azure Operator Service Manager", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-orbital", + "productName": "Azure Orbital", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-programmable-connectivity", + "productName": "Azure Programmable Connectivity", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-quotas", + "productName": "Azure Quotas", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-red-hat-openshift", + "productName": "Azure Red Hat OpenShift", + "category": "containers", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-sentinel", + "productName": "Azure Sentinel", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-service-bus", + "productName": "Azure Service Bus", + "category": "integration", + "recommendedNodeKind": "queue" + }, + { + "id": "azure:azure-sphere", + "productName": "Azure Sphere", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-spring-apps", + "productName": "Azure Spring Apps", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-sql", + "productName": "Azure SQL", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-sql-database", + "productName": "Azure SQL Database", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-sql-edge", + "productName": "Azure SQL Edge", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-sql-server-stretch-databases", + "productName": "Azure SQL Server Stretch Databases", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-sql-vm", + "productName": "Azure SQL VM", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:azure-stack-hci-sizer", + "productName": "Azure Stack HCI Sizer", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-storage-mover", + "productName": "Azure Storage Mover", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-support-center-blue", + "productName": "Azure Support Center Blue", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-sustainability", + "productName": "Azure Sustainability", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-synapse-analytics", + "productName": "Azure Synapse Analytics", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-token-service", + "productName": "Azure Token Service", + "category": "blockchain", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-video-indexer", + "productName": "Azure Video Indexer", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-virtual-desktop", + "productName": "Azure Virtual Desktop", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-vmware-solution", + "productName": "Azure VMware Solution", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azure-workbooks", + "productName": "Azure Workbooks", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azureattestation", + "productName": "AzureAttestation", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:azurite", + "productName": "Azurite", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:backlog", + "productName": "Backlog", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:backup-vault", + "productName": "Backup Vault", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:bare-metal-infrastructure", + "productName": "Bare Metal Infrastructure", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:bastions", + "productName": "Bastions", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:batch-accounts", + "productName": "Batch Accounts", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:batch-ai", + "productName": "Batch AI", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:biz-talk", + "productName": "Biz Talk", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:blob-block", + "productName": "Blob Block", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:blob-page", + "productName": "Blob Page", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:blockchain-applications", + "productName": "Blockchain Applications", + "category": "blockchain", + "recommendedNodeKind": "service" + }, + { + "id": "azure:blueprints", + "productName": "Blueprints", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:bonsai", + "productName": "Bonsai", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:bot-services", + "productName": "Bot Services", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:branch", + "productName": "Branch", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:breeze", + "productName": "Breeze", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:browser", + "productName": "Browser", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:bug", + "productName": "Bug", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:builds", + "productName": "Builds", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:business-process-tracking", + "productName": "Business Process Tracking", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cache", + "productName": "Cache", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cache-redis", + "productName": "Cache Redis", + "category": "databases", + "recommendedNodeKind": "cache" + }, + { + "id": "azure:capacity-reservation-groups", + "productName": "Capacity Reservation Groups", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cdn-profiles", + "productName": "CDN Profiles", + "category": "app services", + "recommendedNodeKind": "service" + }, + { + "id": "azure:central-service-instance-for-sap", + "productName": "Central Service Instance For SAP", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ceres", + "productName": "Ceres", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:change-analysis", + "productName": "Change Analysis", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:client-apps", + "productName": "Client Apps", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cloud-services-classic", + "productName": "Cloud Services (Classic)", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cloud-services-extended-support", + "productName": "Cloud Services (extended support)", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cloudtest", + "productName": "CloudTest", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:code", + "productName": "Code", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:code-optimization", + "productName": "Code Optimization", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cognitive-search", + "productName": "Cognitive Search", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cognitive-services", + "productName": "Cognitive Services", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cognitive-services-decisions", + "productName": "Cognitive Services Decisions", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:collaborative-service", + "productName": "Collaborative Service", + "category": "azure ecosystem", + "recommendedNodeKind": "service" + }, + { + "id": "azure:commit", + "productName": "Commit", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:community-images", + "productName": "Community Images", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:compliance", + "productName": "Compliance", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:compliance-center", + "productName": "Compliance Center", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:compute-fleet", + "productName": "Compute Fleet", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:computer-vision", + "productName": "Computer Vision", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:conditional-access", + "productName": "Conditional Access", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:confidential-ledgers", + "productName": "Confidential Ledgers", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:connected-cache", + "productName": "Connected Cache", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:connected-vehicle-platform", + "productName": "Connected Vehicle Platform", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:connections", + "productName": "Connections", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:consortium", + "productName": "Consortium", + "category": "blockchain", + "recommendedNodeKind": "service" + }, + { + "id": "azure:container-apps-environments", + "productName": "Container Apps Environments", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:container-instances", + "productName": "Container Instances", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:container-registries", + "productName": "Container Registries", + "category": "containers", + "recommendedNodeKind": "service" + }, + { + "id": "azure:container-services-deprecated", + "productName": "Container Services (Deprecated)", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:content-moderators", + "productName": "Content Moderators", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:content-safety", + "productName": "Content Safety", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:controls", + "productName": "Controls", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:controls-horizontal", + "productName": "Controls Horizontal", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cost-alerts", + "productName": "Cost Alerts", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cost-analysis", + "productName": "Cost Analysis", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cost-budgets", + "productName": "Cost Budgets", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cost-export", + "productName": "Cost Export", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cost-management", + "productName": "Cost Management", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cost-management-and-billing", + "productName": "Cost Management and Billing", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:counter", + "productName": "Counter", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:cubes", + "productName": "Cubes", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:custom-ip-prefix", + "productName": "Custom IP Prefix", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:custom-vision", + "productName": "Custom Vision", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:customer-lockbox-for-microsoft-azure", + "productName": "Customer Lockbox for Microsoft Azure", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:dashboard", + "productName": "Dashboard", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:dashboard-hub", + "productName": "Dashboard Hub", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:data-box", + "productName": "Data Box", + "category": "migrate", + "recommendedNodeKind": "service" + }, + { + "id": "azure:data-collection-rules", + "productName": "Data Collection Rules", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:data-factories", + "productName": "Data Factories", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:data-lake-analytics", + "productName": "Data Lake Analytics", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:data-lake-storage-gen1", + "productName": "Data Lake Storage Gen1", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:data-lake-store-gen1", + "productName": "Data Lake Store Gen1", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:data-share-invitations", + "productName": "Data Share Invitations", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:data-shares", + "productName": "Data Shares", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:data-virtualization", + "productName": "Data Virtualization", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:database-instance-for-sap", + "productName": "Database Instance For SAP", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ddos-custom-policy", + "productName": "DDoS Custom Policy", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ddos-protection-plans", + "productName": "DDoS Protection Plans", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:dedicated-hsm", + "productName": "Dedicated HSM", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-cm-local-manager", + "productName": "Defender CM Local Manager", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-dcs-controller", + "productName": "Defender DCS Controller", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-distributer-control-system", + "productName": "Defender Distributer Control System", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-engineering-station", + "productName": "Defender Engineering Station", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-external-management", + "productName": "Defender External Management", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-freezer-monitor", + "productName": "Defender Freezer Monitor", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-historian", + "productName": "Defender Historian", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-hmi", + "productName": "Defender HMI", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-industrial-packaging-system", + "productName": "Defender Industrial Packaging System", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-industrial-printer", + "productName": "Defender Industrial Printer", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-industrial-robot", + "productName": "Defender Industrial Robot", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-industrial-scale-system", + "productName": "Defender Industrial Scale System", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-marquee", + "productName": "Defender Marquee", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-meter", + "productName": "Defender Meter", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-plc", + "productName": "Defender PLC", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-pneumatic-device", + "productName": "Defender Pneumatic Device", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-programable-board", + "productName": "Defender Programable Board", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-relay", + "productName": "Defender Relay", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-robot-controller", + "productName": "Defender Robot Controller", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-rtu", + "productName": "Defender RTU", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-sensor", + "productName": "Defender Sensor", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-slot", + "productName": "Defender Slot", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:defender-web-guiding-system", + "productName": "Defender Web Guiding System", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:detonation", + "productName": "Detonation", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:dev-console", + "productName": "Dev Console", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:device-compliance", + "productName": "Device Compliance", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:device-configuration", + "productName": "Device Configuration", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:device-enrollment", + "productName": "Device Enrollment", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:device-provisioning-services", + "productName": "Device Provisioning Services", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:device-security-apple", + "productName": "Device Security Apple", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:device-security-google", + "productName": "Device Security Google", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:device-security-windows", + "productName": "Device Security Windows", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:device-update-iot-hub", + "productName": "Device Update IoT Hub", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:devices", + "productName": "Devices", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:devops-starter", + "productName": "DevOps Starter", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:devtest-labs", + "productName": "DevTest Labs", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:diagnostics-settings", + "productName": "Diagnostics Settings", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:digital-twins", + "productName": "Digital Twins", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:disconnected-operations", + "productName": "Disconnected Operations", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:disk-encryption-sets", + "productName": "Disk Encryption Sets", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:disk-pool", + "productName": "Disk Pool", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:disks", + "productName": "Disks", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:disks-classic", + "productName": "Disks (Classic)", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:disks-snapshots", + "productName": "Disks Snapshots", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:dns-multistack", + "productName": "DNS Multistack", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:dns-private-resolver", + "productName": "DNS Private Resolver", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:dns-security-policy", + "productName": "DNS Security Policy", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:dns-zones", + "productName": "DNS Zones", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:download", + "productName": "Download", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ebooks", + "productName": "eBooks", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:edge-actions", + "productName": "Edge Actions", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:edge-management", + "productName": "Edge Management", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:edge-storage-accelerator", + "productName": "Edge Storage Accelerator", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:education", + "productName": "Education", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:elastic-job-agents", + "productName": "Elastic Job Agents", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:elastic-san", + "productName": "Elastic SAN", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:endpoint-analytics", + "productName": "Endpoint Analytics", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:engage-center-connect", + "productName": "Engage Center Connect", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:enterprise-applications", + "productName": "Enterprise Applications", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-connect", + "productName": "Entra Connect", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-connect-health", + "productName": "Entra Connect Health", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-connect-sync", + "productName": "Entra Connect Sync", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-domain-services", + "productName": "Entra Domain Services", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-global-secure-access", + "productName": "Entra Global Secure Access", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-id-protection", + "productName": "Entra ID Protection", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-identity-custom-roles", + "productName": "Entra Identity Custom Roles", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-identity-licenses", + "productName": "Entra Identity Licenses", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-identity-risky-signins", + "productName": "Entra Identity Risky Signins", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-identity-risky-users", + "productName": "Entra Identity Risky Users", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-identity-roles-and-administrators", + "productName": "Entra Identity Roles and Administrators", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-internet-access", + "productName": "Entra Internet Access", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-managed-identities", + "productName": "Entra Managed Identities", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-private-access", + "productName": "Entra Private Access", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-privleged-identity-management", + "productName": "Entra Privleged Identity Management", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:entra-verified-id", + "productName": "Entra Verified ID", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:error", + "productName": "Error", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:event-grid-domains", + "productName": "Event Grid Domains", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:event-grid-subscriptions", + "productName": "Event Grid Subscriptions", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:event-grid-topics", + "productName": "Event Grid Topics", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:event-hub-clusters", + "productName": "Event Hub Clusters", + "category": "analytics", + "recommendedNodeKind": "queue" + }, + { + "id": "azure:event-hubs", + "productName": "Event Hubs", + "category": "analytics", + "recommendedNodeKind": "queue" + }, + { + "id": "azure:exchange-access", + "productName": "Exchange Access", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:exchange-on-premises-access", + "productName": "Exchange On Premises Access", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:express-route-traffic-collector", + "productName": "Express Route Traffic Collector", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:expressroute-circuits", + "productName": "ExpressRoute Circuits", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:expressroute-direct", + "productName": "ExpressRoute Direct", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:extendedsecurityupdates", + "productName": "ExtendedSecurityUpdates", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:extensions", + "productName": "Extensions", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:external-id", + "productName": "external id", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:external-id-modified", + "productName": "external id modified", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:external-identities", + "productName": "External Identities", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:face-apis", + "productName": "Face APIs", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:feature-previews", + "productName": "Feature Previews", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:fhir-service", + "productName": "FHIR Service", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:fiji", + "productName": "Fiji", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:file", + "productName": "File", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:files", + "productName": "Files", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:firewalls", + "productName": "Firewalls", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:folder-blank", + "productName": "Folder Blank", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:folder-website", + "productName": "Folder Website", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:form-recognizers", + "productName": "Form Recognizers", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:foundry-agent-service", + "productName": "Foundry Agent Service", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:foundry-application", + "productName": "Foundry Application", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:foundry-control-plane", + "productName": "Foundry Control Plane", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:foundry-labs", + "productName": "Foundry Labs", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:foundry-local", + "productName": "Foundry Local", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:foundry-models", + "productName": "Foundry Models", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:foundry-project", + "productName": "Foundry Project", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:frd-qa", + "productName": "FRD QA", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:free-services", + "productName": "Free Services", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:front-door-and-cdn-profiles", + "productName": "Front Door and CDN Profiles", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ftp", + "productName": "FTP", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:function-apps", + "productName": "Function Apps", + "category": "compute", + "recommendedNodeKind": "function" + }, + { + "id": "azure:gear", + "productName": "Gear", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:genomics", + "productName": "Genomics", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:genomics-accounts", + "productName": "Genomics Accounts", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:globe-error", + "productName": "Globe Error", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:globe-success", + "productName": "Globe Success", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:globe-warning", + "productName": "Globe Warning", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:groups", + "productName": "Groups", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:guide", + "productName": "Guide", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:hd-insight-clusters", + "productName": "HD Insight Clusters", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:hdi-aks-cluster", + "productName": "HDI AKS Cluster", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:heart", + "productName": "Heart", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:help-and-support", + "productName": "Help and Support", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:host-groups", + "productName": "Host Groups", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:host-pools", + "productName": "Host Pools", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:hosts", + "productName": "Hosts", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:hybrid-connectivity-hub", + "productName": "Hybrid Connectivity Hub", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:icm-troubleshooting", + "productName": "IcM Troubleshooting", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:identity-governance", + "productName": "Identity Governance", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:identity-secure-score", + "productName": "Identity Secure Score", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:image", + "productName": "Image", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:image-definitions", + "productName": "Image Definitions", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:image-templates", + "productName": "Image Templates", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:image-versions", + "productName": "Image Versions", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:images", + "productName": "Images", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:immersive-readers", + "productName": "Immersive Readers", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:import-export-jobs", + "productName": "Import Export Jobs", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:industrial-iot", + "productName": "Industrial IoT", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:information", + "productName": "Information", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:input-output", + "productName": "Input Output", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:instance-pools", + "productName": "Instance Pools", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:integration-accounts", + "productName": "Integration Accounts", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:integration-environments", + "productName": "Integration Environments", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:integration-service-environments", + "productName": "Integration Service Environments", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:internet-analyzer-profiles", + "productName": "Internet Analyzer Profiles", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:intune", + "productName": "Intune", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:intune-app-protection", + "productName": "Intune App Protection", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:intune-for-education", + "productName": "Intune For Education", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:intune-trends", + "productName": "Intune Trends", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:iot-central-applications", + "productName": "IoT Central Applications", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:iot-edge", + "productName": "IoT Edge", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:iot-hub", + "productName": "IoT Hub", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ip-address-manager", + "productName": "IP Address manager", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ip-groups", + "productName": "IP Groups", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:journey-hub", + "productName": "Journey Hub", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:key-vaults", + "productName": "Key Vaults", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:keys", + "productName": "Keys", + "category": "menu", + "recommendedNodeKind": "service" + }, + { + "id": "azure:kubernetes-fleet-manager", + "productName": "Kubernetes Fleet Manager", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:kubernetes-hub", + "productName": "Kubernetes Hub", + "category": "containers", + "recommendedNodeKind": "service" + }, + { + "id": "azure:lab-accounts", + "productName": "Lab Accounts", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:lab-services", + "productName": "Lab Services", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:landing-zone", + "productName": "Landing Zone", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:language", + "productName": "Language", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:language-understanding", + "productName": "Language Understanding", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:launch-portal", + "productName": "Launch Portal", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:learn", + "productName": "Learn", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:load-balancer-hub", + "productName": "Load Balancer Hub", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:load-balancer-hub-029029174", + "productName": "Load Balancer Hub", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:load-balancers", + "productName": "Load Balancers", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:load-test", + "productName": "Load Test", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:load-testing", + "productName": "Load Testing", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:local-network-gateways", + "productName": "Local Network Gateways", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:location", + "productName": "Location", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:log-analytics-query-pack", + "productName": "Log Analytics Query Pack", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:log-analytics-workspaces", + "productName": "Log Analytics Workspaces", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:log-streaming", + "productName": "Log Streaming", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:logic-apps", + "productName": "Logic Apps", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:logic-apps-custom-connector", + "productName": "Logic Apps Custom Connector", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:logic-apps-template", + "productName": "Logic Apps Template", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:machine-learning", + "productName": "Machine Learning", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:machine-learning-studio-classic-web-services", + "productName": "Machine Learning Studio (Classic) Web Services", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:machine-learning-studio-web-service-plans", + "productName": "Machine Learning Studio Web Service Plans", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:machine-learning-studio-workspaces", + "productName": "Machine Learning Studio Workspaces", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:machinesazurearc", + "productName": "MachinesAzureArc", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:maintenance-configuration", + "productName": "Maintenance Configuration", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:managed-applications-center", + "productName": "Managed Applications Center", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:managed-database", + "productName": "Managed Database", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:managed-desktop", + "productName": "Managed Desktop", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:managed-devops-pools", + "productName": "Managed DevOps Pools", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:managed-file-shares", + "productName": "Managed File Shares", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:managed-identities", + "productName": "Managed Identities", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:managed-instance-apache-cassandra", + "productName": "Managed Instance Apache Cassandra", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:managed-service-fabric", + "productName": "Managed Service Fabric", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:management-groups", + "productName": "Management Groups", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:management-portal", + "productName": "Management Portal", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:marketplace", + "productName": "Marketplace", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:marketplace-management", + "productName": "Marketplace Management", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:media", + "productName": "Media", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:media-file", + "productName": "Media File", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:medtech-service", + "productName": "MedTech Service", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:mesh-applications", + "productName": "Mesh Applications", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:metrics", + "productName": "Metrics", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:metrics-advisor", + "productName": "Metrics Advisor", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:microsoft-defender-easm", + "productName": "Microsoft Defender EASM", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:microsoft-defender-for-cloud", + "productName": "Microsoft Defender for Cloud", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:microsoft-defender-for-iot", + "productName": "Microsoft Defender for IoT", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:microsoft-dev-box", + "productName": "Microsoft Dev Box", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:microsoft-discovery", + "productName": "Microsoft Discovery", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:mindaro", + "productName": "Mindaro", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:mission-landing-zone", + "productName": "Mission Landing Zone", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:mobile", + "productName": "Mobile", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:mobile-engagement", + "productName": "Mobile Engagement", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:mobile-networks", + "productName": "Mobile Networks", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:modular-data-center", + "productName": "Modular Data Center", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:module", + "productName": "Module", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:monitor", + "productName": "Monitor", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:monitor-health-models", + "productName": "Monitor Health Models", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:multi-factor-authentication", + "productName": "Multi Factor Authentication", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:multi-tenancy", + "productName": "Multi Tenancy", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:multifactor-authentication", + "productName": "Multifactor Authentication", + "category": "security", + "recommendedNodeKind": "service" + }, + { + "id": "azure:my-customers", + "productName": "My Customers", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:nat", + "productName": "NAT", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:network-foundation-hub", + "productName": "Network Foundation Hub", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:network-interfaces", + "productName": "Network Interfaces", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:network-managers", + "productName": "Network Managers", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:network-security-groups", + "productName": "Network Security Groups", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:network-security-hub", + "productName": "Network Security Hub", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:network-security-perimeters", + "productName": "Network Security Perimeters", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:network-watcher", + "productName": "Network Watcher", + "category": "monitor", + "recommendedNodeKind": "service" + }, + { + "id": "azure:notification-hub-namespaces", + "productName": "Notification Hub Namespaces", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:notification-hubs", + "productName": "Notification Hubs", + "category": "app services", + "recommendedNodeKind": "service" + }, + { + "id": "azure:on-premises-data-gateways", + "productName": "On Premises Data Gateways", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:open-supply-chain-platform", + "productName": "Open Supply Chain Platform", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:operation-log-classic", + "productName": "Operation Log (Classic)", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:oracle-database", + "productName": "Oracle Database", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:os-images-classic", + "productName": "OS Images (Classic)", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:osconfig", + "productName": "OSConfig", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:outbound-connection", + "productName": "Outbound Connection", + "category": "blockchain", + "recommendedNodeKind": "service" + }, + { + "id": "azure:partner-namespace", + "productName": "Partner Namespace", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:partner-registration", + "productName": "Partner Registration", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:partner-topic", + "productName": "Partner Topic", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:peering-service", + "productName": "Peering Service", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:peerings", + "productName": "Peerings", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:personalizers", + "productName": "Personalizers", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:planetary-computer-pro", + "productName": "Planetary Computer Pro", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:policy", + "productName": "Policy", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:power", + "productName": "Power", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:power-bi-embedded", + "productName": "Power BI Embedded", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:power-platform", + "productName": "Power Platform", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:power-up", + "productName": "Power Up", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:powershell", + "productName": "Powershell", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:preview-features", + "productName": "Preview Features", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:private-endpoints", + "productName": "Private Endpoints", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:private-link", + "productName": "Private Link", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:private-link-service", + "productName": "Private Link Service", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:private-link-services", + "productName": "Private Link Services", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:process-explorer", + "productName": "Process Explorer", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:production-ready-database", + "productName": "Production Ready Database", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:promethus", + "productName": "promethus", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:proximity-placement-groups", + "productName": "Proximity Placement Groups", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:public-ip-addresses", + "productName": "Public IP Addresses", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:public-ip-addresses-classic", + "productName": "Public IP Addresses (Classic)", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:public-ip-prefixes", + "productName": "Public IP Prefixes", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:pubsub", + "productName": "pubsub", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:qna-makers", + "productName": "QnA Makers", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:quickstart-center", + "productName": "Quickstart Center", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:recent", + "productName": "Recent", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:recovery-services-vaults", + "productName": "Recovery Services Vaults", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:region-management", + "productName": "Region Management", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:relays", + "productName": "Relays", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:remote-rendering", + "productName": "Remote Rendering", + "category": "mixed reality", + "recommendedNodeKind": "service" + }, + { + "id": "azure:reservations", + "productName": "Reservations", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:reserved-capacity", + "productName": "Reserved Capacity", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:reserved-ip-addresses-classic", + "productName": "Reserved IP Addresses (Classic)", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resiliency", + "productName": "Resiliency", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resource-explorer", + "productName": "Resource Explorer", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resource-graph-explorer", + "productName": "Resource Graph Explorer", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resource-group-list", + "productName": "Resource Group List", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resource-groups", + "productName": "Resource Groups", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resource-guard", + "productName": "Resource Guard", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resource-linked", + "productName": "Resource Linked", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resource-management-private-link", + "productName": "Resource Management Private Link", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resource-mover", + "productName": "Resource Mover", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:resources-provider", + "productName": "Resources Provider", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:restore-points", + "productName": "Restore Points", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:restore-points-collections", + "productName": "Restore Points Collections", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:route-filters", + "productName": "Route Filters", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:route-tables", + "productName": "Route Tables", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:rtos", + "productName": "RTOS", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:savings-plans", + "productName": "Savings Plans", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:scheduled-actions", + "productName": "Scheduled Actions", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:scheduler", + "productName": "Scheduler", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:scheduler-job-collections", + "productName": "Scheduler Job Collections", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:scvmm-management-servers", + "productName": "SCVMM Management Servers", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:search", + "productName": "Search", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:search-grid", + "productName": "Search Grid", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:security", + "productName": "Security", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:security-baselines", + "productName": "Security Baselines", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:sendgrid-accounts", + "productName": "SendGrid Accounts", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:server-farm", + "productName": "Server Farm", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:serverless-search", + "productName": "Serverless Search", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:service-catalog-mad", + "productName": "Service Catalog MAD", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:service-endpoint-policies", + "productName": "Service Endpoint Policies", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:service-fabric-clusters", + "productName": "Service Fabric Clusters", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:service-group-relationships", + "productName": "Service Group Relationships", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:service-groups", + "productName": "Service Groups", + "category": "containers", + "recommendedNodeKind": "service" + }, + { + "id": "azure:service-health", + "productName": "Service Health", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:service-providers", + "productName": "Service Providers", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:shared-image-galleries", + "productName": "Shared Image Galleries", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:signalr", + "productName": "SignalR", + "category": "web", + "recommendedNodeKind": "service" + }, + { + "id": "azure:software-as-a-service", + "productName": "Software as a Service", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:software-updates", + "productName": "Software Updates", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:solutions", + "productName": "Solutions", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:sonic-dash", + "productName": "Sonic Dash", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:spatial-anchor-accounts", + "productName": "Spatial Anchor Accounts", + "category": "mixed reality", + "recommendedNodeKind": "service" + }, + { + "id": "azure:speech-services", + "productName": "Speech Services", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:spot-vm", + "productName": "Spot VM", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:spot-vmss", + "productName": "Spot VMSS", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:sql-data-warehouses", + "productName": "SQL Data Warehouses", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:sql-database-fleet-manager", + "productName": "SQL Database Fleet Manager", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:sql-elastic-pools", + "productName": "SQL Elastic Pools", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:sql-managed-instance", + "productName": "SQL Managed Instance", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:sql-server", + "productName": "SQL Server", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:sql-server-registries", + "productName": "SQL Server Registries", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:ssd", + "productName": "SSD", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ssh-keys", + "productName": "SSH Keys", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:ssis-lift-and-shift-ir", + "productName": "SSIS Lift And Shift IR", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:stack-hci-premium", + "productName": "Stack HCI Premium", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:stage-maps", + "productName": "Stage Maps", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:static-apps", + "productName": "Static Apps", + "category": "web", + "recommendedNodeKind": "service" + }, + { + "id": "azure:storage-accounts", + "productName": "Azure Storage Accounts", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:storage-accounts-classic", + "productName": "Storage Accounts (Classic)", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:storage-actions", + "productName": "Storage Actions", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:storage-azure-files", + "productName": "Storage Azure Files", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:storage-container", + "productName": "Storage Container", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:storage-explorer", + "productName": "Storage Explorer", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:storage-functions", + "productName": "Storage Functions", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:storage-hubs", + "productName": "Storage Hubs", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:storage-queue", + "productName": "Storage Queue", + "category": "general", + "recommendedNodeKind": "queue" + }, + { + "id": "azure:storage-sync-services", + "productName": "Storage Sync Services", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:storsimple-data-managers", + "productName": "StorSimple Data Managers", + "category": "storage", + "recommendedNodeKind": "storage" + }, + { + "id": "azure:storsimple-device-managers", + "productName": "StorSimple Device Managers", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:stream-analytics-jobs", + "productName": "Stream Analytics Jobs", + "category": "analytics", + "recommendedNodeKind": "service" + }, + { + "id": "azure:subnet", + "productName": "Subnet", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:subscriptions", + "productName": "Subscriptions", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:system-topic", + "productName": "System Topic", + "category": "integration", + "recommendedNodeKind": "service" + }, + { + "id": "azure:table", + "productName": "Table", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:tag", + "productName": "Tag", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:tags", + "productName": "Tags", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:targets-management", + "productName": "Targets Management", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:template-specs", + "productName": "Template Specs", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:templates", + "productName": "Templates", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:tenant-properties", + "productName": "Tenant Properties", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:tenant-status", + "productName": "Tenant Status", + "category": "intune", + "recommendedNodeKind": "service" + }, + { + "id": "azure:test-base", + "productName": "Test Base", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:tfs-vc-repository", + "productName": "TFS VC Repository", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:time-series-data-sets", + "productName": "Time Series Data Sets", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:time-series-insights-access-policies", + "productName": "Time Series Insights Access Policies", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:time-series-insights-environments", + "productName": "Time Series Insights Environments", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:time-series-insights-event-sources", + "productName": "Time Series Insights Event Sources", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:toolbox", + "productName": "Toolbox", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:toolchain-orchestrator", + "productName": "Toolchain Orchestrator", + "category": "new icons", + "recommendedNodeKind": "service" + }, + { + "id": "azure:traffic-manager-profiles", + "productName": "Traffic Manager Profiles", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:translator-text", + "productName": "Translator Text", + "category": "ai + machine learning", + "recommendedNodeKind": "service" + }, + { + "id": "azure:troubleshoot", + "productName": "Troubleshoot", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:universal-print", + "productName": "Universal Print", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:update-management-center", + "productName": "Update Management Center", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:user-privacy", + "productName": "User Privacy", + "category": "management + governance", + "recommendedNodeKind": "service" + }, + { + "id": "azure:user-settings", + "productName": "User Settings", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:user-subscriptions", + "productName": "User Subscriptions", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:users", + "productName": "Users", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:verifiable-credentials", + "productName": "Verifiable Credentials", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:verification-as-a-service", + "productName": "Verification As A Service", + "category": "identity", + "recommendedNodeKind": "service" + }, + { + "id": "azure:versions", + "productName": "Versions", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:video-analyzers", + "productName": "Video Analyzers", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-clusters", + "productName": "Virtual Clusters", + "category": "databases", + "recommendedNodeKind": "database" + }, + { + "id": "azure:virtual-instance-for-sap", + "productName": "Virtual Instance for SAP", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-machines", + "productName": "Azure Virtual Machines", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-machines-classic", + "productName": "Virtual Machines (Classic)", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-network-gateways", + "productName": "Virtual Network Gateways", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-networks", + "productName": "Virtual Networks", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-networks-classic", + "productName": "Virtual Networks (Classic)", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-router", + "productName": "Virtual Router", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-visits-builder", + "productName": "Virtual Visits Builder", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-wan-hub", + "productName": "Virtual WAN Hub", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:virtual-wans", + "productName": "Virtual WANs", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:vm-app-definitions", + "productName": "VM App Definitions", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:vm-app-versions", + "productName": "VM App Versions", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:vm-image-version", + "productName": "VM Image Version", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:vm-images-classic", + "productName": "VM Images (Classic)", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:vm-scale-sets", + "productName": "VM Scale Sets", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:vnet-appliance", + "productName": "VNet Appliance", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:vpnclientwindows", + "productName": "VPNClientWindows", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:wac", + "productName": "WAC", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:wac-installer", + "productName": "WAC Installer", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:web-app-plus-database", + "productName": "Web App + Database", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:web-application-firewall-policies-waf", + "productName": "Web Application Firewall Policies(WAF)", + "category": "networking", + "recommendedNodeKind": "service" + }, + { + "id": "azure:web-jobs", + "productName": "Web Jobs", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:web-slots", + "productName": "Web Slots", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:web-test", + "productName": "Web Test", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:website-power", + "productName": "Website Power", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:website-staging", + "productName": "Website Staging", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:windows-notification-services", + "productName": "Windows Notification Services", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:windows10-core-services", + "productName": "Windows10 Core Services", + "category": "iot", + "recommendedNodeKind": "service" + }, + { + "id": "azure:workbooks", + "productName": "Workbooks", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:worker-container-app", + "productName": "Worker Container App", + "category": "other", + "recommendedNodeKind": "service" + }, + { + "id": "azure:workflow", + "productName": "Workflow", + "category": "general", + "recommendedNodeKind": "service" + }, + { + "id": "azure:workload-orchestration", + "productName": "Workload Orchestration", + "category": "hybrid + multicloud", + "recommendedNodeKind": "service" + }, + { + "id": "azure:workspace-gateway", + "productName": "Workspace Gateway", + "category": "devops", + "recommendedNodeKind": "service" + }, + { + "id": "azure:workspaces", + "productName": "Workspaces", + "category": "compute", + "recommendedNodeKind": "service" + }, + { + "id": "azure:workspaces-00400", + "productName": "Workspaces", + "category": "compute", + "recommendedNodeKind": "service" + } + ] + }, + { + "id": "simple-icons", + "name": "Simple Icons (curated tools)", + "release": "16.29.0", + "sourcePageUrl": "https://simpleicons.org/", + "termsUrl": "https://github.com/simple-icons/simple-icons/blob/16.29.0/DISCLAIMER.md", + "icons": [ + { + "id": "simple-icons:1password", + "productName": "1Password", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://1password.com/press", + "brandGuidelinesUrl": "https://1password.com/press" + }, + { + "id": "simple-icons:ansible", + "productName": "Ansible", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.ansible.com/logos", + "brandGuidelinesUrl": "https://www.ansible.com/logos" + }, + { + "id": "simple-icons:apacheairflow", + "productName": "Apache Airflow", + "category": "Data", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://apache.org/logos", + "brandGuidelinesUrl": "https://www.apache.org/foundation/marks" + }, + { + "id": "simple-icons:apachekafka", + "productName": "Apache Kafka", + "category": "Data", + "recommendedNodeKind": "queue", + "brandSourceUrl": "https://apache.org/logos", + "brandGuidelinesUrl": "https://www.apache.org/foundation/marks" + }, + { + "id": "simple-icons:argo", + "productName": "Argo", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://github.com/cncf/artwork/blob/c2e619cdf85e8bac090ceca7c0834c5cfedf9426/projects/argo/icon/black/argo-icon-black.svg", + "brandGuidelinesUrl": "https://github.com/cncf/artwork/blob/c2e619cdf85e8bac090ceca7c0834c5cfedf9426/projects/argo/icon/black/argo-icon-black.svg" + }, + { + "id": "simple-icons:atlassian", + "productName": "Atlassian", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://atlassian.design/resources/logo-library", + "brandGuidelinesUrl": "https://atlassian.design/foundations/logos" + }, + { + "id": "simple-icons:auth0", + "productName": "Auth0", + "category": "Identity", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://auth0.com", + "brandGuidelinesUrl": "https://auth0.com" + }, + { + "id": "simple-icons:bitbucket", + "productName": "Bitbucket", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://atlassian.design/resources/logo-library", + "brandGuidelinesUrl": "https://atlassian.design/foundations/logos" + }, + { + "id": "simple-icons:bun", + "productName": "Bun", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://bun.sh/press-kit", + "brandGuidelinesUrl": "https://bun.sh/press-kit" + }, + { + "id": "simple-icons:circleci", + "productName": "CircleCI", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://circleci.com/press", + "brandGuidelinesUrl": "https://circleci.com/press" + }, + { + "id": "simple-icons:cloudflare", + "productName": "Cloudflare", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.cloudflare.com/logo/", + "brandGuidelinesUrl": "https://www.cloudflare.com/trademark/" + }, + { + "id": "simple-icons:confluence", + "productName": "Confluence", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://www.atlassian.com/company/news/press-kit", + "brandGuidelinesUrl": "https://www.atlassian.com/company/news/press-kit" + }, + { + "id": "simple-icons:datadog", + "productName": "Datadog", + "category": "Observability", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.datadoghq.com/about/resources", + "brandGuidelinesUrl": "https://www.datadoghq.com/about/resources/" + }, + { + "id": "simple-icons:deno", + "productName": "Deno", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://github.com/denoland/docs/blob/5dee713844c7447f80acd4093caa9d350d80bf36/static/img/logo.svg", + "brandGuidelinesUrl": "https://deno.com/brand" + }, + { + "id": "simple-icons:discord", + "productName": "Discord", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://discord.com/branding", + "brandGuidelinesUrl": "https://discord.com/branding" + }, + { + "id": "simple-icons:docker", + "productName": "Docker", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.docker.com/company/newsroom/media-resources", + "brandGuidelinesUrl": "https://www.docker.com/company/newsroom/media-resources" + }, + { + "id": "simple-icons:elastic", + "productName": "Elastic", + "category": "Data", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.elastic.co/brand", + "brandGuidelinesUrl": "https://www.elastic.co/brand" + }, + { + "id": "simple-icons:figma", + "productName": "Figma", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://www.figma.com/using-the-figma-brand/", + "brandGuidelinesUrl": "https://www.figma.com/using-the-figma-brand/" + }, + { + "id": "simple-icons:firebase", + "productName": "Firebase", + "category": "Data", + "recommendedNodeKind": "database", + "brandSourceUrl": "https://firebase.google.com/brand-guidelines", + "brandGuidelinesUrl": "https://firebase.google.com/brand-guidelines" + }, + { + "id": "simple-icons:git", + "productName": "Git", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://git-scm.com/community/logos", + "brandGuidelinesUrl": "https://git-scm.com/community/logos" + }, + { + "id": "simple-icons:github", + "productName": "GitHub", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://github.com/logos", + "brandGuidelinesUrl": "https://github.com/logos" + }, + { + "id": "simple-icons:githubactions", + "productName": "GitHub Actions", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://github.com/features/actions", + "brandGuidelinesUrl": "https://github.com/features/actions" + }, + { + "id": "simple-icons:gitlab", + "productName": "GitLab", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://about.gitlab.com/press/press-kit/", + "brandGuidelinesUrl": "https://about.gitlab.com/handbook/marketing/corporate-marketing/brand-activation/trademark-guidelines/" + }, + { + "id": "simple-icons:go", + "productName": "Go", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://blog.golang.org/go-brand", + "brandGuidelinesUrl": "https://blog.golang.org/go-brand" + }, + { + "id": "simple-icons:grafana", + "productName": "Grafana", + "category": "Observability", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://grafana.com", + "brandGuidelinesUrl": "https://grafana.com" + }, + { + "id": "simple-icons:helm", + "productName": "Helm", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://helm.sh", + "brandGuidelinesUrl": "https://helm.sh" + }, + { + "id": "simple-icons:jenkins", + "productName": "Jenkins", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://get.jenkins.io/art/", + "brandGuidelinesUrl": "https://www.jenkins.io/press/" + }, + { + "id": "simple-icons:jira", + "productName": "Jira", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://atlassian.design/resources/logo-library", + "brandGuidelinesUrl": "https://atlassian.design/foundations/logos/" + }, + { + "id": "simple-icons:kubernetes", + "productName": "Kubernetes", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://github.com/kubernetes/kubernetes/tree/cac53883f4714452f3084a22e4be20d042a9df33/logo", + "brandGuidelinesUrl": "https://github.com/kubernetes/kubernetes/tree/cac53883f4714452f3084a22e4be20d042a9df33/logo" + }, + { + "id": "simple-icons:linear", + "productName": "Linear", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://linear.app", + "brandGuidelinesUrl": "https://linear.app" + }, + { + "id": "simple-icons:miro", + "productName": "Miro", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://miro.com", + "brandGuidelinesUrl": "https://miro.com" + }, + { + "id": "simple-icons:mongodb", + "productName": "MongoDB", + "category": "Data", + "recommendedNodeKind": "database", + "brandSourceUrl": "https://www.mongodb.com/pressroom", + "brandGuidelinesUrl": "https://www.mongodb.com/pressroom" + }, + { + "id": "simple-icons:mysql", + "productName": "MySQL", + "category": "Data", + "recommendedNodeKind": "database", + "brandSourceUrl": "https://www.mysql.com/about/legal/logos.html", + "brandGuidelinesUrl": "https://www.mysql.com/about/legal/logos.html" + }, + { + "id": "simple-icons:netlify", + "productName": "Netlify", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.netlify.com/press/", + "brandGuidelinesUrl": "https://www.netlify.com/press/" + }, + { + "id": "simple-icons:newrelic", + "productName": "New Relic", + "category": "Observability", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://newrelic.com/about/media-assets", + "brandGuidelinesUrl": "https://newrelic.com/about/media-assets#guidelines" + }, + { + "id": "simple-icons:nextdotjs", + "productName": "Next.js", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://vercel.com/design/brands#next-js", + "brandGuidelinesUrl": "https://vercel.com/design/brands#next-js" + }, + { + "id": "simple-icons:nginx", + "productName": "NGINX", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.nginx.com/press/", + "brandGuidelinesUrl": "https://www.nginx.com/press/" + }, + { + "id": "simple-icons:nodedotjs", + "productName": "Node.js", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://nodejs.org/en/about/branding", + "brandGuidelinesUrl": "https://nodejs.org/en/about/branding" + }, + { + "id": "simple-icons:notion", + "productName": "Notion", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://www.notion.so", + "brandGuidelinesUrl": "https://www.notion.so" + }, + { + "id": "simple-icons:npm", + "productName": "npm", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.npmjs.com", + "brandGuidelinesUrl": "https://docs.npmjs.com/policies/logos-and-usage" + }, + { + "id": "simple-icons:okta", + "productName": "Okta", + "category": "Identity", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://www.okta.com/press-room/media-assets/", + "brandGuidelinesUrl": "https://www.okta.com/terms-of-use-for-okta-content/" + }, + { + "id": "simple-icons:opentofu", + "productName": "OpenTofu", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://github.com/opentofu/brand-artifacts/blob/0d4d0d6050ca0ff06471400bc3249a64c145f659/symbol-only/transparent/SVG/on-light-mono.svg", + "brandGuidelinesUrl": "https://github.com/opentofu/brand-artifacts/blob/0d4d0d6050ca0ff06471400bc3249a64c145f659/symbol-only/transparent/SVG/on-light-mono.svg" + }, + { + "id": "simple-icons:pagerduty", + "productName": "PagerDuty", + "category": "Observability", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.pagerduty.com/brand/", + "brandGuidelinesUrl": "https://www.pagerduty.com/brand/" + }, + { + "id": "simple-icons:pnpm", + "productName": "pnpm", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://pnpm.io/logos", + "brandGuidelinesUrl": "https://pnpm.io/logos" + }, + { + "id": "simple-icons:postgresql", + "productName": "PostgreSQL", + "category": "Data", + "recommendedNodeKind": "database", + "brandSourceUrl": "https://wiki.postgresql.org/wiki/Logo", + "brandGuidelinesUrl": "https://www.postgresql.org/about/policies/trademarks/" + }, + { + "id": "simple-icons:prometheus", + "productName": "Prometheus", + "category": "Observability", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://prometheus.io", + "brandGuidelinesUrl": "https://prometheus.io" + }, + { + "id": "simple-icons:pulumi", + "productName": "Pulumi", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.pulumi.com", + "brandGuidelinesUrl": "https://www.pulumi.com/brand/" + }, + { + "id": "simple-icons:python", + "productName": "Python", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.python.org/community/logos/", + "brandGuidelinesUrl": "https://www.python.org/community/logos/" + }, + { + "id": "simple-icons:rabbitmq", + "productName": "RabbitMQ", + "category": "Data", + "recommendedNodeKind": "queue", + "brandSourceUrl": "https://www.rabbitmq.com", + "brandGuidelinesUrl": "https://www.rabbitmq.com/trademark-guidelines.html" + }, + { + "id": "simple-icons:react", + "productName": "React", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://github.com/facebook/create-react-app/blob/282c03f9525fdf8061ffa1ec50dce89296d916bd/test/fixtures/relative-paths/src/logo.svg", + "brandGuidelinesUrl": "https://github.com/facebook/create-react-app/blob/282c03f9525fdf8061ffa1ec50dce89296d916bd/test/fixtures/relative-paths/src/logo.svg" + }, + { + "id": "simple-icons:redis", + "productName": "Redis", + "category": "Data", + "recommendedNodeKind": "cache", + "brandSourceUrl": "https://redis.io/brand-guidelines", + "brandGuidelinesUrl": "https://redis.io/brand-guidelines" + }, + { + "id": "simple-icons:rust", + "productName": "Rust", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.rust-lang.org", + "brandGuidelinesUrl": "https://www.rust-lang.org/policies/media-guide" + }, + { + "id": "simple-icons:sentry", + "productName": "Sentry", + "category": "Observability", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://sentry.io/branding/", + "brandGuidelinesUrl": "https://sentry.io/branding/" + }, + { + "id": "simple-icons:snowflake", + "productName": "Snowflake", + "category": "Data", + "recommendedNodeKind": "database", + "brandSourceUrl": "https://www.snowflake.com/brand-guidelines/", + "brandGuidelinesUrl": "https://www.snowflake.com/brand-guidelines/" + }, + { + "id": "simple-icons:splunk", + "productName": "Splunk", + "category": "Observability", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.splunk.com", + "brandGuidelinesUrl": "https://www.splunk.com" + }, + { + "id": "simple-icons:supabase", + "productName": "Supabase", + "category": "Data", + "recommendedNodeKind": "database", + "brandSourceUrl": "https://github.com/supabase/supabase/blob/4031a7549f5d46da7bc79c01d56be4177dc7c114/packages/common/assets/images/supabase-logo-wordmark--light.svg", + "brandGuidelinesUrl": "https://github.com/supabase/supabase/blob/4031a7549f5d46da7bc79c01d56be4177dc7c114/packages/common/assets/images/supabase-logo-wordmark--light.svg" + }, + { + "id": "simple-icons:svelte", + "productName": "Svelte", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://github.com/sveltejs/branding/blob/c4dfca6743572087a6aef0e109ffe3d95596e86a/svelte-logo.svg", + "brandGuidelinesUrl": "https://github.com/sveltejs/branding/blob/c4dfca6743572087a6aef0e109ffe3d95596e86a/svelte-logo.svg" + }, + { + "id": "simple-icons:terraform", + "productName": "Terraform", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://www.hashicorp.com/brand", + "brandGuidelinesUrl": "https://www.hashicorp.com/brand" + }, + { + "id": "simple-icons:trello", + "productName": "Trello", + "category": "Collaboration", + "recommendedNodeKind": "external", + "brandSourceUrl": "https://atlassian.design/resources/logo-library", + "brandGuidelinesUrl": "https://atlassian.design/foundations/logos" + }, + { + "id": "simple-icons:vercel", + "productName": "Vercel", + "category": "Infrastructure", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://vercel.com/geist/brands", + "brandGuidelinesUrl": "https://vercel.com/geist/brands" + }, + { + "id": "simple-icons:vite", + "productName": "Vite", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://github.com/voidzero-dev/community-design-resources/blob/55902097229cf01cf2a4ceb376f992f5cf306756/brand-assets/vite/vite-icon-color-bracketless.svg", + "brandGuidelinesUrl": "https://github.com/voidzero-dev/community-design-resources/blob/55902097229cf01cf2a4ceb376f992f5cf306756/brand-assets/vite/vite-icon-color-bracketless.svg" + }, + { + "id": "simple-icons:vuedotjs", + "productName": "Vue.js", + "category": "Development", + "recommendedNodeKind": "service", + "brandSourceUrl": "https://github.com/vuejs/art/blob/a1c78b74569b70a25300925b4eacfefcc143b8f6/logo.svg", + "brandGuidelinesUrl": "https://github.com/vuejs/art/blob/a1c78b74569b70a25300925b4eacfefcc143b8f6/README.md" + } + ] + } + ] +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 195f747..fcb1bd7 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -3,11 +3,13 @@ import "@fontsource-variable/ibm-plex-sans" import "@fontsource/ibm-plex-mono/400.css" import IconCatalog from "./components/IconCatalog.vue" +import ProviderCatalog from "./components/ProviderCatalog.vue" import "./style.css" export default { extends: DefaultTheme, enhanceApp({ app }) { app.component("IconCatalog", IconCatalog) + app.component("ProviderCatalog", ProviderCatalog) }, } diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css index ab439cc..6fae95f 100644 --- a/docs/.vitepress/theme/style.css +++ b/docs/.vitepress/theme/style.css @@ -55,6 +55,18 @@ body { text-rendering: optimizeLegibility; } +.stack-provider-catalog .sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + ::selection { color: var(--vp-c-bg); background: var(--vp-c-text-1); @@ -144,6 +156,191 @@ body { margin: 1.5rem 0; } +.stack-provider-catalog { + margin: 1.5rem 0; +} + +.stack-provider-summary { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 0.5rem; +} + +.stack-provider-summary button { + display: flex; + min-width: 0; + padding: 0.7rem 0.75rem; + color: var(--vp-c-text-2); + font-size: 0.75rem; + text-align: left; + background: var(--vp-c-bg); + border: 1px solid var(--vp-c-divider); + border-radius: 0.375rem; + flex-direction: column; + gap: 0.2rem; +} + +.stack-provider-summary button strong { + overflow: hidden; + color: var(--vp-c-text-1); + text-overflow: ellipsis; + white-space: nowrap; +} + +.stack-provider-summary button span { + font-family: var(--vp-font-family-mono); + font-size: 1rem; +} + +.stack-provider-summary button[aria-pressed="true"] { + background: var(--vp-c-brand-soft); + border-color: var(--vp-c-brand-1); +} + +.stack-provider-filters { + display: grid; + grid-template-columns: minmax(12rem, 1fr) minmax(9rem, auto) minmax(9rem, auto); + gap: 0.5rem; + margin-top: 0.75rem; +} + +.stack-provider-filters input, +.stack-provider-filters select { + width: 100%; + height: 2.5rem; + padding: 0 0.75rem; + color: var(--vp-c-text-1); + font: inherit; + font-size: 0.8125rem; + background: var(--vp-c-bg); + border: 1px solid var(--vp-c-divider); + border-radius: 0.375rem; +} + +.stack-provider-filters input:focus-visible, +.stack-provider-filters select:focus-visible, +.stack-provider-summary button:focus-visible, +.stack-provider-table__row button:focus-visible, +.stack-provider-show-more:focus-visible { + outline: 2px solid var(--vp-c-brand-1); + outline-offset: 2px; +} + +.stack-provider-result-count, +.stack-provider-empty { + margin: 0.75rem 0; + color: var(--vp-c-text-2); + font-size: 0.8125rem; +} + +.stack-provider-empty { + padding: 1.5rem; + text-align: center; + border: 1px dashed var(--vp-c-divider); +} + +.stack-provider-table { + overflow: hidden; + border: 1px solid var(--vp-c-divider); + border-radius: 0.375rem; +} + +.stack-provider-table__header, +.stack-provider-table__row { + display: grid; + grid-template-columns: minmax(8rem, 1.25fr) minmax(9rem, 1.4fr) minmax(6rem, 0.8fr) 4rem 4rem; + gap: 0.5rem; + align-items: center; + padding: 0.65rem 0.75rem; +} + +.stack-provider-table__header { + color: var(--vp-c-text-2); + font-size: 0.6875rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + background: var(--vp-c-bg-soft); +} + +.stack-provider-table__row { + min-width: 0; + font-size: 0.75rem; + border-top: 1px solid var(--vp-c-divider); +} + +.stack-provider-table__row > * { + min-width: 0; + overflow-wrap: anywhere; +} + +.stack-provider-table__row > span { + color: var(--vp-c-text-2); +} + +.stack-provider-table__row strong { + display: block; + color: var(--vp-c-text-1); + font-weight: 600; +} + +.stack-provider-table__row small { + display: flex; + margin-top: 0.15rem; + gap: 0.5rem; +} + +.stack-provider-table__row button, +.stack-provider-show-more { + padding: 0.35rem 0.55rem; + color: var(--vp-c-brand-1); + font-size: 0.75rem; + font-weight: 600; + border: 1px solid var(--vp-c-divider); + border-radius: 0.25rem; +} + +.stack-provider-table__action { + display: flex; + justify-content: flex-end; +} + +.stack-provider-show-more { + width: 100%; + margin-top: 0.75rem; + padding: 0.6rem; +} + +@media (max-width: 767px) { + .stack-provider-summary { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .stack-provider-filters { + grid-template-columns: 1fr; + } + + .stack-provider-table__header { + display: none; + } + + .stack-provider-table__row { + grid-template-columns: minmax(0, 1fr) auto; + gap: 0.4rem 0.75rem; + } + + .stack-provider-table__row > :nth-child(2), + .stack-provider-table__row > :nth-child(3), + .stack-provider-table__row > :nth-child(4) { + grid-column: 1; + } + + .stack-provider-table__row > .stack-provider-table__action { + grid-row: 1 / span 2; + grid-column: 2; + } +} + .stack-icon-catalog-toolbar { display: flex; align-items: center; diff --git a/docs/guide/provider-icons.md b/docs/guide/provider-icons.md index 353be1f..c384040 100644 --- a/docs/guide/provider-icons.md +++ b/docs/guide/provider-icons.md @@ -1,20 +1,20 @@ # Provider icons -Stack supports a provider-neutral core icon catalog without setup. AWS, Google Cloud, and Azure artwork is available through user-imported provider packs. The audited catalog below is public, but Stack does not host or redistribute the vendor SVG files. +Stack supports a provider-neutral core icon catalog without setup. AWS, Google Cloud, Azure, and common developer or collaboration artwork is available through user-imported provider packs. The searchable catalog below is public metadata, but Stack does not host or redistribute the vendor SVG files. ## Available provider catalog -| Provider | Audited release | Available IDs | Official source and terms | -| ------------ | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| AWS | `Icon-package_07312026` | `aws:s3`, `aws:sqs`, `aws:lambda`, `aws:ec2`, `aws:rds`, `aws:dynamodb`, `aws:eks` | [AWS Architecture Icons](https://aws.amazon.com/architecture/icons/) and [AWS Trademark Guidelines](https://aws.amazon.com/trademark-guidelines/) | -| Google Cloud | Core product icons from the May 2026 guide | `gcp:cloud-run`, `gcp:cloud-storage`, `gcp:compute-engine`, `gcp:gke`, `gcp:bigquery`, `gcp:cloud-sql` | [Google Cloud Icon Library](https://cloud.google.com/icons) and [Google Brand Resource Center](https://about.google/brand-resource-center/) | -| Azure | `Azure_Public_Service_Icons_V24` | `azure:virtual-machines`, `azure:storage-accounts`, `azure:azure-sql-database`, `azure:aks`, `azure:app-service` | [Azure Architecture Icons](https://learn.microsoft.com/azure/architecture/icons/) and the terms included in the official archive | +The audited catalog contains 1,051 IDs: 305 AWS Architecture Icons, all 19 Google Cloud core-product and 26 category icons, 639 Azure service icons after exact-byte deduplication, and 62 curated tool icons. Search or filter the complete list without loading any SVG bytes. Results are shown 100 at a time so the page remains usable on smaller devices. -Every imported manifest records the official product name, source release, complete archive hash, terms URL, review date, permitted output categories, and non-endorsement notice. A provider pack adds only artwork; the authored node `kind` still controls its semantic styling and layout. + + +Every imported manifest records the official product name, every contributing source release and archive hash, terms URL, review date, permitted output categories, and non-endorsement notice. Curated tool records also retain the rights owner's brand source and guideline links. A provider pack adds only artwork; the authored node `kind` still controls its semantic styling and layout. ## Why artwork is not hosted -The reviewed vendor guidance permits particular diagram and documentation uses, but does not clearly grant Stack permission to repackage the SVG bytes in its website, npm package, WebAssembly module, or native binary. Static Documentation therefore shows the catalog, provenance, and exact IDs without copying vendor artwork. +The reviewed vendor guidance permits particular diagram and documentation uses, but does not clearly grant Stack permission to repackage every SVG byte in its website, npm package, WebAssembly module, or native binary. Static Documentation therefore shows searchable catalog metadata, provenance, and exact IDs without copying vendor artwork. + +The curated tool archive comes from [Simple Icons](https://simpleicons.org/). Its CC0 distribution does not imply that every underlying brand mark is CC0, so inclusion is not permission or endorsement. Follow the per-icon source and guideline links shown above before use. After you load a pack, the Playground shows its actual icons from your selected local files. It creates browser-local image URLs only after Engine validation and does not inject the SVG as page HTML. Review the linked provider terms before using or distributing a generated diagram. @@ -23,16 +23,21 @@ After you load a pack, the Playground shows its actual icons from your selected Download the official archive yourself, then use the public Stack CLI to process that local file: ```sh -stack icons import aws ~/Downloads/aws-icons.zip \ +stack icons list aws s3 +stack icons import aws /path/to/aws-icons.zip \ --accept-terms \ -o .stack-icons/aws +stack icons import gcp /path/to/core-products-icons.zip \ + --source categories=/path/to/category-icons.zip \ + --accept-terms \ + -o .stack-icons/gcp ``` -Replace `aws` with `gcp` or `azure` for the other audited profiles. The importer makes no network request or upload. It verifies the complete archive, reads only reviewed paths, removes active content, preserves colors and geometry, and creates `manifest.json`, `NOTICE.md`, and `assets/*.svg`. +Use `aws`, `gcp`, `azure`, or `simple-icons`. Google Cloud requires both official local archives shown above. The importer makes no network request or upload. It verifies every complete archive, reads only reviewed paths, removes active content, preserves colors and geometry, and creates `manifest.json`, `NOTICE.md`, and `assets/*.svg`. ## Use a pack in Playground -Open **Icons**, choose one pack's `manifest.json` and every declared file in `assets/`, then copy an ID from the local catalog into source: +Open **Icons**, choose one pack's `manifest.json` and every declared file in `assets/`, then search the loaded local catalog and copy an ID into source: ```stack stack 1.0 diff --git a/docs/ja/guide/provider-icons.md b/docs/ja/guide/provider-icons.md index beaa353..0499f40 100644 --- a/docs/ja/guide/provider-icons.md +++ b/docs/ja/guide/provider-icons.md @@ -1,20 +1,20 @@ # Provider icon -Stackは設定不要でprovider-neutralなcore icon catalogを利用できます。AWS、Google Cloud、Azureのartworkはuser-imported provider packとして利用します。監査済みcatalogは以下で公開しますが、Stackがvendor SVG fileをhost・再配布することはありません。 +Stackは設定不要でprovider-neutralなcore icon catalogを利用できます。AWS、Google Cloud、Azure、主要な開発・collaboration toolのartworkはuser-imported provider packとして利用します。検索可能なcatalogはpublic metadataですが、Stackがvendor SVG fileをhost・再配布することはありません。 ## 利用可能なprovider catalog -| Provider | 監査済みrelease | 利用可能なID | 公式sourceとterms | -| ------------ | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| AWS | `Icon-package_07312026` | `aws:s3`, `aws:sqs`, `aws:lambda`, `aws:ec2`, `aws:rds`, `aws:dynamodb`, `aws:eks` | [AWS Architecture Icons](https://aws.amazon.com/architecture/icons/)と[AWS Trademark Guidelines](https://aws.amazon.com/trademark-guidelines/) | -| Google Cloud | 2026年5月guideのcore product icons | `gcp:cloud-run`, `gcp:cloud-storage`, `gcp:compute-engine`, `gcp:gke`, `gcp:bigquery`, `gcp:cloud-sql` | [Google Cloud Icon Library](https://cloud.google.com/icons)と[Google Brand Resource Center](https://about.google/brand-resource-center/) | -| Azure | `Azure_Public_Service_Icons_V24` | `azure:virtual-machines`, `azure:storage-accounts`, `azure:azure-sql-database`, `azure:aks`, `azure:app-service` | [Azure Architecture Icons](https://learn.microsoft.com/azure/architecture/icons/)と公式archive内のterms | +監査済みcatalogは合計1,051 IDです。AWS Architecture Icons 305件、Google Cloudのcore product 19件とcategory 26件、完全に同じbyteをdeduplicateしたAzure service icon 639件、主要tool 62件を収録します。SVG byteをloadせず全件を検索・filterでき、小さいdeviceでも崩れないよう100件ずつ表示します。 -Import済みmanifestには、公式product name、source release、archive全体のhash、terms URL、review date、許可されたoutput category、non-endorsement noticeが記録されます。Provider packが追加するのはartworkだけで、semantic stylingとlayoutはsourceに書いたnode `kind`が引き続き決めます。 + + +Import済みmanifestには、公式product name、利用した全source releaseとarchive hash、terms URL、review date、許可されたoutput category、non-endorsement noticeが記録されます。Tool iconはrights ownerのbrand sourceとguideline linkも保持します。Provider packが追加するのはartworkだけで、semantic stylingとlayoutはsourceに書いたnode `kind`が引き続き決めます。 ## Artworkをhostしない理由 -確認したvendor guidanceは特定のdiagramやdocumentationでの利用を認めていますが、Stackのwebsite、npm package、WebAssembly module、native binaryへSVG byteを再packageする明確な許諾は確認できません。そのため静的Documentationではvendor artworkを複製せず、catalog、provenance、正確なIDを表示します。 +確認したvendor guidanceは特定のdiagramやdocumentationでの利用を認めていますが、Stackのwebsite、npm package、WebAssembly module、native binaryへすべてのSVG byteを再packageする明確な許諾は確認できません。そのため静的Documentationではvendor artworkを複製せず、検索可能なcatalog metadata、provenance、正確なIDを表示します。 + +Tool archiveには[Simple Icons](https://simpleicons.org/)を使います。そのCC0 distributionは、個々のbrand markまでCC0であることを意味しません。Catalogへの掲載は利用許諾やendorsementではないため、使用前に上表のicon別sourceとguidelineを確認してください。 Packをloadした後のPlaygroundでは、選択したlocal fileから実際のiconを表示できます。Engine validation後にbrowser-localなimage URLを作り、SVGをpage HTMLとしてinjectしません。生成diagramの利用・配布前に、link先のprovider termsを確認してください。 @@ -23,16 +23,21 @@ Packをloadした後のPlaygroundでは、選択したlocal fileから実際のi 公式archiveを自分でdownloadし、publicなStack CLIでlocal fileを処理します。 ```sh -stack icons import aws ~/Downloads/aws-icons.zip \ +stack icons list aws s3 +stack icons import aws /path/to/aws-icons.zip \ --accept-terms \ -o .stack-icons/aws +stack icons import gcp /path/to/core-products-icons.zip \ + --source categories=/path/to/category-icons.zip \ + --accept-terms \ + -o .stack-icons/gcp ``` -他の監査済みprofileでは`aws`を`gcp`または`azure`に置き換えます。Importerはnetwork requestやuploadを行いません。Archive全体を検証し、review済みpathだけを読み、active contentを除去してcolorとgeometryを保持し、`manifest.json`、`NOTICE.md`、`assets/*.svg`を生成します。 +`aws`、`gcp`、`azure`、`simple-icons`を利用できます。Google Cloudは上記2つの公式local archiveが必要です。Importerはnetwork requestやuploadを行いません。すべてのarchive全体を検証し、review済みpathだけを読み、active contentを除去してcolorとgeometryを保持し、`manifest.json`、`NOTICE.md`、`assets/*.svg`を生成します。 ## Playgroundでpackを使う -**Icons**を開き、1つのpackにある`manifest.json`と`assets/`内の宣言済みfileをすべて選びます。Local catalogからIDをcopyし、sourceで使います。 +**Icons**を開き、1つのpackにある`manifest.json`と`assets/`内の宣言済みfileをすべて選びます。Load済みlocal catalogを検索してIDをcopyし、sourceで使います。 ```stack stack 1.0 diff --git a/docs/ko/guide/provider-icons.md b/docs/ko/guide/provider-icons.md index 6491188..55ddba6 100644 --- a/docs/ko/guide/provider-icons.md +++ b/docs/ko/guide/provider-icons.md @@ -1,20 +1,20 @@ # 클라우드 제공자 아이콘 -Stack은 설정 없이 제공자 중립적인 core icon catalog를 사용할 수 있습니다. AWS, Google Cloud, Azure 그림은 사용자가 가져온 provider pack으로 사용합니다. 아래 감사 완료 catalog는 공개하지만 Stack은 vendor SVG 파일을 호스팅하거나 재배포하지 않습니다. +Stack은 설정 없이 제공자 중립적인 core icon catalog를 사용할 수 있습니다. AWS, Google Cloud, Azure 및 주요 개발·협업 도구 그림은 사용자가 가져온 provider pack으로 사용합니다. 아래 검색 가능한 catalog는 공개 metadata이지만 Stack은 vendor SVG 파일을 호스팅하거나 재배포하지 않습니다. ## 사용 가능한 제공자 catalog -| 제공자 | 감사 완료 release | 사용 가능한 ID | 공식 source 및 terms | -| ------------ | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -| AWS | `Icon-package_07312026` | `aws:s3`, `aws:sqs`, `aws:lambda`, `aws:ec2`, `aws:rds`, `aws:dynamodb`, `aws:eks` | [AWS Architecture Icons](https://aws.amazon.com/architecture/icons/) 및 [AWS Trademark Guidelines](https://aws.amazon.com/trademark-guidelines/) | -| Google Cloud | 2026년 5월 가이드의 core product icons | `gcp:cloud-run`, `gcp:cloud-storage`, `gcp:compute-engine`, `gcp:gke`, `gcp:bigquery`, `gcp:cloud-sql` | [Google Cloud Icon Library](https://cloud.google.com/icons) 및 [Google Brand Resource Center](https://about.google/brand-resource-center/) | -| Azure | `Azure_Public_Service_Icons_V24` | `azure:virtual-machines`, `azure:storage-accounts`, `azure:azure-sql-database`, `azure:aks`, `azure:app-service` | [Azure Architecture Icons](https://learn.microsoft.com/azure/architecture/icons/) 및 공식 archive의 terms | +감사 완료 catalog에는 총 1,051개 ID가 있습니다. AWS Architecture Icons 305개, Google Cloud core product 19개와 category 26개 전체, byte가 완전히 같은 항목을 deduplicate한 Azure service icon 639개, 주요 tool icon 62개입니다. SVG byte를 불러오지 않고 전체 목록을 검색·filter할 수 있으며 작은 화면에서도 안정적으로 보이도록 100개씩 표시합니다. -가져온 manifest는 공식 제품명, source release, 전체 archive hash, terms URL, 검토 날짜, 허용된 output category, 비보증 안내를 기록합니다. Provider pack은 그림만 추가하며 source의 node `kind`가 계속 의미적 스타일과 레이아웃을 결정합니다. + + +가져온 manifest는 공식 제품명, 사용한 모든 source release와 archive hash, terms URL, 검토 날짜, 허용된 output category, 비보증 안내를 기록합니다. Tool icon은 권리 보유자의 brand source 및 guideline link도 보존합니다. Provider pack은 그림만 추가하며 source의 node `kind`가 계속 의미적 스타일과 레이아웃을 결정합니다. ## 그림을 호스팅하지 않는 이유 -검토한 vendor 지침은 특정 다이어그램과 문서 용도를 허용하지만 Stack website, npm package, WebAssembly module 또는 native binary에 SVG byte를 다시 패키징할 명확한 허가는 제공하지 않습니다. 따라서 정적 문서는 vendor 그림을 복사하지 않고 catalog, provenance 및 정확한 ID를 표시합니다. +검토한 vendor 지침은 특정 다이어그램과 문서 용도를 허용하지만 Stack website, npm package, WebAssembly module 또는 native binary에 모든 SVG byte를 다시 패키징할 명확한 허가는 제공하지 않습니다. 따라서 정적 문서는 vendor 그림을 복사하지 않고 검색 가능한 catalog metadata, provenance 및 정확한 ID를 표시합니다. + +Tool archive는 [Simple Icons](https://simpleicons.org/)에서 가져옵니다. CC0 distribution은 각 brand mark까지 CC0이라는 뜻이 아니며 catalog 등재도 사용 허가나 endorsement가 아닙니다. 사용 전에 위의 icon별 source 및 guideline link를 확인하세요. Pack을 불러온 뒤에는 Playground가 사용자가 선택한 로컬 파일에서 실제 아이콘을 표시합니다. Engine 검증 후에만 브라우저 로컬 이미지 URL을 만들며 SVG를 페이지 HTML로 주입하지 않습니다. 생성한 다이어그램을 사용하거나 배포하기 전에 연결된 제공자 terms를 확인하세요. @@ -23,16 +23,21 @@ Pack을 불러온 뒤에는 Playground가 사용자가 선택한 로컬 파일 공식 archive를 직접 다운로드한 뒤 공개 Stack CLI로 로컬 파일을 처리합니다. ```sh -stack icons import aws ~/Downloads/aws-icons.zip \ +stack icons list aws s3 +stack icons import aws /path/to/aws-icons.zip \ --accept-terms \ -o .stack-icons/aws +stack icons import gcp /path/to/core-products-icons.zip \ + --source categories=/path/to/category-icons.zip \ + --accept-terms \ + -o .stack-icons/gcp ``` -다른 감사 완료 profile은 `aws`를 `gcp` 또는 `azure`로 바꿉니다. Importer는 네트워크 요청이나 업로드를 하지 않습니다. 전체 archive를 검증하고 검토된 경로만 읽으며 active content를 제거하고 색상과 기하를 보존한 뒤 `manifest.json`, `NOTICE.md`, `assets/*.svg`를 생성합니다. +`aws`, `gcp`, `azure`, `simple-icons`를 사용할 수 있습니다. Google Cloud에는 위의 공식 local archive 두 개가 필요합니다. Importer는 네트워크 요청이나 업로드를 하지 않습니다. 모든 archive 전체를 검증하고 검토된 경로만 읽으며 active content를 제거하고 색상과 기하를 보존한 뒤 `manifest.json`, `NOTICE.md`, `assets/*.svg`를 생성합니다. ## Playground에서 pack 사용하기 -**Icons**를 열고 하나의 pack에 있는 `manifest.json`과 `assets/`의 선언된 파일을 모두 선택한 뒤 로컬 catalog에서 ID를 source로 복사합니다. +**Icons**를 열고 하나의 pack에 있는 `manifest.json`과 `assets/`의 선언된 파일을 모두 선택한 뒤 불러온 local catalog를 검색해 ID를 source로 복사합니다. ```stack stack 1.0 diff --git a/docs/public/llms.txt b/docs/public/llms.txt index da69483..69e55ab 100644 --- a/docs/public/llms.txt +++ b/docs/public/llms.txt @@ -9,7 +9,7 @@ These Markdown pages are the public user-facing reference. Examples marked as `s - [What is Stack?](https://stack-diagram.com/docs/guide/what-is-stack.md): Goals, conceptual model, processing pipeline, and deliberate non-goals. - [Getting started](https://stack-diagram.com/docs/guide/getting-started.md): Package installation, first diagram, engine operations, and browser Playground workflow. - [Using the Playground](https://stack-diagram.com/docs/guide/playground.md): Editor, formatter, diagnostics, preview, color mode, and SVG download behavior. -- [Provider icons](https://stack-diagram.com/docs/guide/provider-icons.md): Local AWS, Google Cloud, and Azure pack import, catalog, terms, and offline boundaries. +- [Provider icons](https://stack-diagram.com/docs/guide/provider-icons.md): Searchable AWS, Google Cloud, Azure, and tool catalogs; local pack import, terms, and offline boundaries. ## Language diff --git a/docs/zh/guide/provider-icons.md b/docs/zh/guide/provider-icons.md index 2892879..a590f53 100644 --- a/docs/zh/guide/provider-icons.md +++ b/docs/zh/guide/provider-icons.md @@ -1,20 +1,20 @@ # 云服务商图标 -Stack 无需配置即可使用与服务商无关的核心图标目录。AWS、Google Cloud 和 Azure 图标通过用户导入的 provider pack 使用。下表公开已审核目录,但 Stack 不托管或重新分发服务商 SVG 文件。 +Stack 无需配置即可使用与服务商无关的核心图标目录。AWS、Google Cloud、Azure 以及常用开发和协作工具图标通过用户导入的 provider pack 使用。下方可搜索目录属于公开元数据,但 Stack 不托管或重新分发服务商 SVG 文件。 ## 可用的服务商目录 -| 服务商 | 已审核版本 | 可用 ID | 官方来源与条款 | -| ------------ | -------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -| AWS | `Icon-package_07312026` | `aws:s3`, `aws:sqs`, `aws:lambda`, `aws:ec2`, `aws:rds`, `aws:dynamodb`, `aws:eks` | [AWS Architecture Icons](https://aws.amazon.com/architecture/icons/) 与 [AWS Trademark Guidelines](https://aws.amazon.com/trademark-guidelines/) | -| Google Cloud | 2026 年 5 月指南中的核心产品图标 | `gcp:cloud-run`, `gcp:cloud-storage`, `gcp:compute-engine`, `gcp:gke`, `gcp:bigquery`, `gcp:cloud-sql` | [Google Cloud Icon Library](https://cloud.google.com/icons) 与 [Google Brand Resource Center](https://about.google/brand-resource-center/) | -| Azure | `Azure_Public_Service_Icons_V24` | `azure:virtual-machines`, `azure:storage-accounts`, `azure:azure-sql-database`, `azure:aks`, `azure:app-service` | [Azure Architecture Icons](https://learn.microsoft.com/azure/architecture/icons/) 与官方压缩包内的条款 | +已审核目录共有 1,051 个 ID:305 个 AWS Architecture Icons、Google Cloud 的全部 19 个核心产品与 26 个分类图标、对完全相同字节去重后的 639 个 Azure 服务图标,以及 62 个常用工具图标。无需加载 SVG 字节即可搜索和筛选完整列表,并以每次 100 项的方式在小屏设备上稳定显示。 -每个导入的 manifest 都记录官方产品名称、来源版本、完整压缩包 hash、条款 URL、审核日期、允许的输出类别和非背书声明。Provider pack 只增加图形;源代码中的节点 `kind` 仍决定语义样式和布局。 + + +每个导入的 manifest 都记录官方产品名称、使用的每个来源版本与压缩包 hash、条款 URL、审核日期、允许的输出类别和非背书声明。工具图标还保留权利方的品牌来源和使用指南链接。Provider pack 只增加图形;源代码中的节点 `kind` 仍决定语义样式和布局。 ## 为什么不托管图形 -已审核的服务商指南允许特定的架构图与文档用途,但没有明确授权 Stack 将 SVG 字节重新打包到网站、npm 包、WebAssembly 模块或原生二进制中。因此静态文档只展示目录、来源和准确 ID,不复制服务商图形。 +已审核的服务商指南允许特定的架构图与文档用途,但没有明确授权 Stack 将所有 SVG 字节重新打包到网站、npm 包、WebAssembly 模块或原生二进制中。因此静态文档只展示可搜索的目录元数据、来源和准确 ID,不复制服务商图形。 + +工具归档来自 [Simple Icons](https://simpleicons.org/)。其 CC0 分发不代表每个底层品牌标志都是 CC0;被列入目录也不构成使用许可或背书。使用前请查看上方每个图标的来源和指南链接。 加载 pack 后,Playground 会从用户选择的本地文件显示真实图标。Engine 验证完成后才创建浏览器本地图片 URL,也不会把 SVG 注入页面 HTML。使用或分发生成图之前,请检查对应的服务商条款。 @@ -23,16 +23,21 @@ Stack 无需配置即可使用与服务商无关的核心图标目录。AWS、Go 自行下载官方压缩包,再使用公开的 Stack CLI 处理本地文件: ```sh -stack icons import aws ~/Downloads/aws-icons.zip \ +stack icons list aws s3 +stack icons import aws /path/to/aws-icons.zip \ --accept-terms \ -o .stack-icons/aws +stack icons import gcp /path/to/core-products-icons.zip \ + --source categories=/path/to/category-icons.zip \ + --accept-terms \ + -o .stack-icons/gcp ``` -其他已审核 profile 可将 `aws` 换成 `gcp` 或 `azure`。Importer 不发起网络请求或上传;它验证完整压缩包,只读取审核过的路径,移除活动内容,保留颜色与几何,并生成 `manifest.json`、`NOTICE.md` 和 `assets/*.svg`。 +可使用 `aws`、`gcp`、`azure` 或 `simple-icons`。Google Cloud 需要上面两个官方本地归档。Importer 不发起网络请求或上传;它验证每个完整压缩包,只读取审核过的路径,移除活动内容,保留颜色与几何,并生成 `manifest.json`、`NOTICE.md` 和 `assets/*.svg`。 ## 在 Playground 使用 pack -打开 **Icons**,选择一个 pack 的 `manifest.json` 和 `assets/` 中所有已声明文件,再从本地目录复制 ID 到源代码: +打开 **Icons**,选择一个 pack 的 `manifest.json` 和 `assets/` 中所有已声明文件,再搜索已加载的本地目录并复制 ID 到源代码: ```stack stack 1.0 diff --git a/scripts/sync-provider-catalogs.mjs b/scripts/sync-provider-catalogs.mjs new file mode 100644 index 0000000..7dd55e7 --- /dev/null +++ b/scripts/sync-provider-catalogs.mjs @@ -0,0 +1,45 @@ +import { createHash } from "node:crypto" +import { mkdir, readFile, writeFile } from "node:fs/promises" +import path from "node:path" + +const sourceRoot = path.resolve(process.argv[2] ?? "../cli/catalogs") +const outputPath = path.resolve("docs/.vitepress/theme/data/provider-catalogs.json") +const providers = ["aws", "gcp", "azure", "simple-icons"] +const digest = createHash("sha256") +const catalogs = [] + +for (const provider of providers) { + const bytes = await readFile(path.join(sourceRoot, `${provider}.json`)) + digest.update(provider) + digest.update("\0") + digest.update(bytes) + const source = JSON.parse(bytes.toString("utf8")) + catalogs.push({ + id: source.provider.id, + name: source.provider.name, + release: source.source.release, + sourcePageUrl: source.source.pageUrl, + termsUrl: source.source.termsUrl, + icons: source.icons.map((icon) => ({ + id: icon.id, + productName: icon.productName, + category: icon.category, + recommendedNodeKind: icon.recommendedNodeKind, + ...(icon.brandSourceUrl ? { brandSourceUrl: icon.brandSourceUrl } : {}), + ...(icon.brandGuidelinesUrl ? { brandGuidelinesUrl: icon.brandGuidelinesUrl } : {}), + })), + }) +} + +const iconCount = catalogs.reduce((total, catalog) => total + catalog.icons.length, 0) +const output = { + catalogVersion: "1.0", + sourceRepository: "stack-sh/cli", + sourceRevision: `sha256:${digest.digest("hex")}`, + iconCount, + providers: catalogs, +} + +await mkdir(path.dirname(outputPath), { recursive: true }) +await writeFile(outputPath, `${JSON.stringify(output, null, 2)}\n`) +process.stdout.write(`Synced ${iconCount} asset-free provider icon records.\n`) diff --git a/scripts/validate-docs.mjs b/scripts/validate-docs.mjs index 43055ee..8ba6643 100644 --- a/scripts/validate-docs.mjs +++ b/scripts/validate-docs.mjs @@ -19,11 +19,47 @@ const pages = [ const locales = ["ja", "zh", "ko"] const docsRoot = path.resolve("docs") const packageMetadata = JSON.parse(await readFile(path.resolve("package.json"), "utf8")) +const providerCatalog = JSON.parse( + await readFile(path.join(docsRoot, ".vitepress/theme/data/provider-catalogs.json"), "utf8"), +) if (packageMetadata.dependencies["@stack-sh/engine"] !== "0.5.0") { throw new Error("Documentation must use the exact @stack-sh/engine 0.5.0 release") } +const expectedProviderCounts = { aws: 305, gcp: 45, azure: 639, "simple-icons": 62 } +if ( + providerCatalog.catalogVersion !== "1.0" || + providerCatalog.sourceRepository !== "stack-sh/cli" || + !/^sha256:[0-9a-f]{64}$/.test(providerCatalog.sourceRevision) || + providerCatalog.iconCount !== 1051 +) { + throw new Error("Provider catalog metadata is invalid") +} +const providerIds = new Set() +for (const provider of providerCatalog.providers) { + if (provider.icons.length !== expectedProviderCounts[provider.id]) { + throw new Error(`Provider catalog has an unexpected ${provider.id} count`) + } + for (const icon of provider.icons) { + if (providerIds.has(icon.id) || !icon.id.startsWith(`${provider.id}:`)) { + throw new Error(`Provider catalog has an invalid or duplicate ID: ${icon.id}`) + } + providerIds.add(icon.id) + if (JSON.stringify(icon).includes("`)) { + throw new Error(`${componentLocale}/guide/provider-icons.md is missing its provider catalog`) + } +} + console.log(`Validated ${pages.length * (locales.length + 1)} documentation pages.`) diff --git a/src/components/provider-icons.test.tsx b/src/components/provider-icons.test.tsx new file mode 100644 index 0000000..92f6d4a --- /dev/null +++ b/src/components/provider-icons.test.tsx @@ -0,0 +1,50 @@ +import { render, screen } from "@testing-library/react" +import userEvent from "@testing-library/user-event" +import { describe, expect, it, vi } from "vitest" + +import { ProviderIcons } from "./provider-icons" +import type { LoadedProviderPack } from "@/lib/provider-pack" + +function providerPack(): LoadedProviderPack { + return { + input: { manifest: {}, assets: [] }, + providerId: "azure", + providerName: "Microsoft Azure", + packVersion: "0.2.0", + sourcePageUrl: "https://example.com/icons", + sourceRelease: "fixture", + termsUrl: "https://example.com/terms", + reviewAfter: "2026-12-03", + icons: Array.from({ length: 50 }, (_, index) => ({ + id: `azure:service-${index + 1}`, + productName: index === 49 ? "Needle Database" : `Azure Service ${index + 1}`, + svg: '', + })), + } +} + +describe("ProviderIcons", () => { + it("searches large local packs and reveals results in bounded batches", async () => { + const user = userEvent.setup() + render( + , + ) + + await user.click(screen.getByRole("button", { name: "Provider icons" })) + expect(screen.getByText("azure:service-48")).toBeInTheDocument() + expect(screen.queryByText("azure:service-49")).not.toBeInTheDocument() + + await user.click(screen.getByRole("button", { name: "Show 2 more" })) + expect(screen.getByText("azure:service-50")).toBeInTheDocument() + + await user.type(screen.getByRole("searchbox"), "needle") + expect(screen.getByText("Needle Database")).toBeInTheDocument() + expect(screen.queryByText("Azure Service 1")).not.toBeInTheDocument() + expect(screen.getByText("1 result")).toBeInTheDocument() + }) +}) diff --git a/src/components/provider-icons.tsx b/src/components/provider-icons.tsx index f6294d4..0aaa5d1 100644 --- a/src/components/provider-icons.tsx +++ b/src/components/provider-icons.tsx @@ -1,5 +1,5 @@ -import { useRef, useState } from "react" -import { Check, Copy, ExternalLink, PackageOpen, Trash2, Upload } from "lucide-react" +import { useMemo, useRef, useState } from "react" +import { Check, Copy, ExternalLink, PackageOpen, Search, Trash2, Upload } from "lucide-react" import { Button } from "@/components/ui/button" import { @@ -20,11 +20,30 @@ interface ProviderIconsProps { onRemove: (providerId: string) => void } +const ICON_BATCH_SIZE = 48 + export function ProviderIcons({ disabled, packs, onImport, onRemove }: ProviderIconsProps) { const inputRef = useRef(null) const [error, setError] = useState(null) const [isImporting, setIsImporting] = useState(false) const [copiedIcon, setCopiedIcon] = useState(null) + const [query, setQuery] = useState("") + const [visibleByProvider, setVisibleByProvider] = useState>({}) + const normalizedQuery = query.trim().toLocaleLowerCase() + const filteredPacks = useMemo( + () => + packs.map((pack) => ({ + pack, + icons: pack.icons.filter( + (icon) => + normalizedQuery.length === 0 || + icon.id.toLocaleLowerCase().includes(normalizedQuery) || + icon.productName.toLocaleLowerCase().includes(normalizedQuery), + ), + })), + [normalizedQuery, packs], + ) + const filteredIconCount = filteredPacks.reduce((total, item) => total + item.icons.length, 0) async function handleFiles(files: FileList | null) { if (!files?.length) return @@ -117,8 +136,8 @@ export function ProviderIcons({ disabled, packs, onImport, onRemove }: ProviderI