feat(diagram): optimize architecture resource icons and add hardware components

This commit is contained in:
tianma-if committed 2026-09-21 19:40:36 +08:00
1 parent 95ff1b36d8
commit b0c818ee56
8 files changed
+330 -87

No files matched your search

@@ -336,7 +336,12 @@ describe("diagram editor canvas surface", () => {
expect(source).toContain('resourceIcon: architectureResourceIcon(item)');
expect(source).toContain('...(data?.resourceIcon ? { resourceIcon: data.resourceIcon } : {})');
expect(source).toContain('architectureNodeVisual(node.shape, appearance, size, node.resourceIcon)');
expect(source).toContain('inferArchitectureResourceIcon(node.label, t)');
expect(source).toContain('labelKey: "diagram.architectureResources.gpu"');
expect(source).toContain('labelKey: "diagram.architectureResources.cpu"');
expect(source).toContain('labelKey: "diagram.architectureResources.memory"');
expect(source).toContain("ARCHITECTURE_RESOURCE_ALIASES");
expect(source).toContain("<ArchitectureIconPicker");
expect(source).toContain("updateSelectedResourceIcon");
expect(source).not.toContain('.render({}, null).props.iconNode');
expect(source).not.toContain('className="line-clamp-2"');
});
+249 -29
View File
@@ -11,6 +11,8 @@ import {
Blocks,
Bot,
Box,
Boxes,
Braces,
BrainCircuit,
BrickWall,
Cable,
@@ -22,8 +24,8 @@ import {
CircleAlert,
Cloud,
CloudCog,
CloudUpload,
Code2,
Compass,
Container,
Copy,
Cpu,
@@ -31,6 +33,7 @@ import {
Database,
DatabaseZap,
EthernetPort,
ExternalLink,
FileCode2,
FileClock,
FileImage,
@@ -38,31 +41,41 @@ import {
FolderArchive,
Gauge,
GitBranch,
GitFork,
Globe2,
Gpu,
Grid2x2,
HardDrive,
History as HistoryIcon,
KeyRound,
Layers3,
ListOrdered,
ListTree,
Share2,
LockKeyhole,
LoaderCircle,
MemoryStick,
Microchip,
MonitorSmartphone,
Network,
Pencil,
PlugZap,
RadioTower,
Radio,
RefreshCw,
RotateCcw,
Route,
Router,
Search,
Server,
ServerCog,
Share2,
ShieldCheck,
ShieldEllipsis,
ShipWheel,
Smartphone,
Sparkles,
SquareFunction,
Trash2,
WavesHorizontal,
Waypoints,
Webhook,
Workflow,
Zap,
@@ -92,6 +105,8 @@ import {
resolveDiagramTheme,
resolveFlowchartTheme,
serializeDiagramDocument,
ARCHITECTURE_COMPONENT_SHAPES,
ARCHITECTURE_SHAPE_RESOURCE,
architectureEdgeVisual,
architectureIconOffset,
architectureNodeVisual,
@@ -104,6 +119,7 @@ import {
flowchartFitsReadableViewport,
flowchartNodeVisual,
resolveFlowchartSurface,
type ArchitectureComponentShape,
type ArchitectureResourceIcon,
type DiagramDocument,
type DiagramEdgeKind,
@@ -239,9 +255,12 @@ const ARCHITECTURE_LIBRARY_CATEGORIES: Array<{
tone: "text-emerald-600",
items: [
{ shape: "service", icon: Server, labelKey: "diagram.architectureResources.service" },
{ shape: "service", icon: Cpu, labelKey: "diagram.architectureResources.virtualMachine" },
{ shape: "service", icon: Cpu, labelKey: "diagram.architectureResources.cpu" },
{ shape: "service", icon: Gpu, labelKey: "diagram.architectureResources.gpu" },
{ shape: "service", icon: MemoryStick, labelKey: "diagram.architectureResources.memory" },
{ shape: "service", icon: ServerCog, labelKey: "diagram.architectureResources.virtualMachine" },
{ shape: "service", icon: Container, labelKey: "diagram.architectureResources.container" },
{ shape: "service", icon: Blocks, labelKey: "diagram.architectureResources.kubernetes" },
{ shape: "service", icon: ShipWheel, labelKey: "diagram.architectureResources.kubernetes" },
{ shape: "service", icon: SquareFunction, labelKey: "diagram.architectureResources.serverless" },
],
},
@@ -254,8 +273,8 @@ const ARCHITECTURE_LIBRARY_CATEGORIES: Array<{
{ shape: "service", icon: Sparkles, labelKey: "diagram.architectureResources.multimodalModel" },
{ shape: "service", icon: Binary, labelKey: "diagram.architectureResources.embeddingModel" },
{ shape: "service", icon: ArrowDownUp, labelKey: "diagram.architectureResources.reranker" },
{ shape: "service", icon: Cpu, labelKey: "diagram.architectureResources.modelInference" },
{ shape: "database", icon: DatabaseZap, labelKey: "diagram.architectureResources.vectorDatabase" },
{ shape: "service", icon: Microchip, labelKey: "diagram.architectureResources.modelInference" },
{ shape: "database", icon: Waypoints, labelKey: "diagram.architectureResources.vectorDatabase" },
{ shape: "service", icon: Workflow, labelKey: "diagram.architectureResources.ragPipeline" },
{ shape: "service", icon: Bot, labelKey: "diagram.architectureResources.aiAgent" },
{ shape: "service", icon: Router, labelKey: "diagram.architectureResources.modelGateway" },
@@ -269,8 +288,8 @@ const ARCHITECTURE_LIBRARY_CATEGORIES: Array<{
items: [
{ shape: "database", icon: Database, labelKey: "diagram.architectureResources.relationalDatabase" },
{ shape: "database", icon: DatabaseZap, labelKey: "diagram.architectureResources.noSqlDatabase" },
{ shape: "database", icon: Layers3, labelKey: "diagram.architectureResources.cache" },
{ shape: "database", icon: ChartNoAxesCombined, labelKey: "diagram.architectureResources.dataWarehouse" },
{ shape: "database", icon: Zap, labelKey: "diagram.architectureResources.cache" },
{ shape: "database", icon: Boxes, labelKey: "diagram.architectureResources.dataWarehouse" },
{ shape: "database", icon: Search, labelKey: "diagram.architectureResources.searchEngine" },
],
},
@@ -283,7 +302,7 @@ const ARCHITECTURE_LIBRARY_CATEGORIES: Array<{
{ shape: "storage", icon: FileStack, labelKey: "diagram.architectureResources.fileStorage" },
{ shape: "storage", icon: HardDrive, labelKey: "diagram.architectureResources.blockStorage" },
{ shape: "storage", icon: FolderArchive, labelKey: "diagram.architectureResources.backup" },
{ shape: "storage", icon: CloudUpload, labelKey: "diagram.architectureResources.cdn" },
{ shape: "storage", icon: Radio, labelKey: "diagram.architectureResources.cdn" },
],
},
{
@@ -291,11 +310,11 @@ const ARCHITECTURE_LIBRARY_CATEGORIES: Array<{
labelKey: "diagram.componentCategoryMiddleware",
tone: "text-orange-600",
items: [
{ shape: "queue", icon: GitBranch, labelKey: "diagram.architectureResources.messageQueue" },
{ shape: "queue", icon: Workflow, labelKey: "diagram.architectureResources.eventBus" },
{ shape: "queue", icon: RadioTower, labelKey: "diagram.architectureResources.streamProcessing" },
{ shape: "queue", icon: ListOrdered, labelKey: "diagram.architectureResources.messageQueue" },
{ shape: "queue", icon: Share2, labelKey: "diagram.architectureResources.eventBus" },
{ shape: "queue", icon: WavesHorizontal, labelKey: "diagram.architectureResources.streamProcessing" },
{ shape: "service", icon: Webhook, labelKey: "diagram.architectureResources.webhook" },
{ shape: "service", icon: ListTree, labelKey: "diagram.architectureResources.serviceMesh" },
{ shape: "service", icon: Grid2x2, labelKey: "diagram.architectureResources.serviceMesh" },
],
},
{
@@ -303,9 +322,9 @@ const ARCHITECTURE_LIBRARY_CATEGORIES: Array<{
labelKey: "diagram.componentCategoryNetwork",
tone: "text-blue-600",
items: [
{ shape: "service", icon: Router, labelKey: "diagram.architectureResources.apiGateway" },
{ shape: "service", icon: Activity, labelKey: "diagram.architectureResources.loadBalancer" },
{ shape: "external", icon: Globe2, labelKey: "diagram.architectureResources.dns" },
{ shape: "service", icon: Route, labelKey: "diagram.architectureResources.apiGateway" },
{ shape: "service", icon: GitFork, labelKey: "diagram.architectureResources.loadBalancer" },
{ shape: "external", icon: Compass, labelKey: "diagram.architectureResources.dns" },
{ shape: "boundary", icon: Network, labelKey: "diagram.architectureResources.vpc" },
{ shape: "boundary", icon: Cable, labelKey: "diagram.architectureResources.subnet" },
{ shape: "security", icon: EthernetPort, labelKey: "diagram.architectureResources.vpn" },
@@ -342,8 +361,8 @@ const ARCHITECTURE_LIBRARY_CATEGORIES: Array<{
tone: "text-slate-600",
items: [
{ shape: "external", icon: CloudCog, labelKey: "diagram.architectureResources.saas" },
{ shape: "external", icon: Webhook, labelKey: "diagram.architectureResources.externalApi" },
{ shape: "external", icon: Zap, labelKey: "diagram.architectureResources.thirdPartyService" },
{ shape: "external", icon: Braces, labelKey: "diagram.architectureResources.externalApi" },
{ shape: "external", icon: ExternalLink, labelKey: "diagram.architectureResources.thirdPartyService" },
],
},
];
@@ -353,12 +372,49 @@ const architectureResourceIcon = (item: ArchitectureLibraryItem) =>
const ARCHITECTURE_LIBRARY_ITEMS = ARCHITECTURE_LIBRARY_CATEGORIES.flatMap((category) => category.items);
const ARCHITECTURE_RESOURCE_ALIASES: Array<{
pattern: RegExp;
icon: ArchitectureResourceIcon;
}> = [
{ pattern: /\b(gpu|cuda|vram|graphics|显卡)\b|独立\s*gpu|gpu\s*核心|核显/i, icon: "gpu" },
{ pattern: /\b(cpu|soc|processor|core)\b|cpu\s*核心|中央处理器|处理器/i, icon: "cpu" },
{ pattern: /\b(memory|ram|vram|ddr|dram|unified\s*memory)\b|内存|统一内存|显存/i, icon: "memory" },
{ pattern: /\b(k8s|kubernetes|kube)\b/i, icon: "kubernetes" },
{ pattern: /\b(redis|memcached|cache)\b|缓存/i, icon: "cache" },
{ pattern: /\b(kafka|rabbitmq|rocketmq|activemq|pulsar|sqs|queue|mq)\b|消息队列/i, icon: "messageQueue" },
{ pattern: /\b(mysql|postgres|postgresql|oracle|sqlite|mariadb|db)\b|关系型数据库|数据库/i, icon: "relationalDatabase" },
{ pattern: /\b(mongo|mongodb|dynamodb|cassandra|couchbase|nosql)\b/i, icon: "noSqlDatabase" },
{ pattern: /\b(milvus|pinecone|qdrant|chroma|weaviate|vector)\b|向量/i, icon: "vectorDatabase" },
{ pattern: /\b(kong|apisix|gateway|zuul)\b|网关|api\s*网关/i, icon: "apiGateway" },
{ pattern: /\b(nginx|haproxy|alb|nlb|slb|load\s*balancer)\b|负载均衡/i, icon: "loadBalancer" },
{ pattern: /\b(docker|container|pod)\b|容器/i, icon: "container" },
{ pattern: /\b(llm|gpt|claude|gemini|deepseek|qwen|openai)\b|大模型|语言模型/i, icon: "largeLanguageModel" },
{ pattern: /\b(agent)\b|智能体/i, icon: "aiAgent" },
{ pattern: /\b(elasticsearch|es|opensearch|solr|meilisearch)\b|搜索/i, icon: "searchEngine" },
{ pattern: /\b(cdn|cloudflare|akamai)\b/i, icon: "cdn" },
{ pattern: /\b(dns|route53)\b/i, icon: "dns" },
{ pattern: /\b(lambda|serverless|faas|function)\b|函数/i, icon: "serverless" },
{ pattern: /\b(prometheus|grafana|datadog)\b|监控/i, icon: "monitoring" },
{ pattern: /\b(loki|elk|fluentd|logstash)\b|日志/i, icon: "logging" },
{ pattern: /\b(jaeger|zipkin|opentelemetry|otel|tracing)\b|链路追踪/i, icon: "tracing" },
{ pattern: /\b(s3|oss|cos|minio|blob)\b|对象存储/i, icon: "objectStorage" },
{ pattern: /\b(web|frontend|react|vue|angular|h5)\b|前端/i, icon: "webApp" },
{ pattern: /\b(app|ios|android|mobile|flutter|react\s*native)\b|移动端/i, icon: "mobileApp" },
{ pattern: /\b(service|microservice|backend|server)\b|服务|后端/i, icon: "service" },
];
const inferArchitectureResourceIcon = (
label: string,
t: (key: string) => string,
) => {
const item = ARCHITECTURE_LIBRARY_ITEMS.find((candidate) => t(candidate.labelKey) === label);
return item ? architectureResourceIcon(item) : undefined;
const trimmed = label.trim();
const directItem = ARCHITECTURE_LIBRARY_ITEMS.find((candidate) => (
t(candidate.labelKey).toLowerCase() === trimmed.toLowerCase()
|| architectureResourceIcon(candidate).toLowerCase() === trimmed.toLowerCase()
));
if (directItem) return architectureResourceIcon(directItem);
const aliasMatch = ARCHITECTURE_RESOURCE_ALIASES.find((entry) => entry.pattern.test(trimmed));
return aliasMatch ? aliasMatch.icon : undefined;
};
const isArchitectureLibraryDrag = (event: ReactDragEvent) => {
@@ -479,6 +535,119 @@ const ArchitectureComponentLibrary = ({
);
};
const ArchitectureIconPicker = ({
currentIcon,
onSelectIcon,
t,
}: {
currentIcon: ArchitectureResourceIcon;
onSelectIcon: (icon: ArchitectureResourceIcon) => void;
t: (key: string) => string;
}) => {
const [open, setOpen] = useState(false);
const [query, setQuery] = useState("");
const normalizedQuery = query.trim().toLocaleLowerCase();
const categories = ARCHITECTURE_LIBRARY_CATEGORIES.map((category) => ({
...category,
items: category.items.filter((item) => t(item.labelKey).toLocaleLowerCase().includes(normalizedQuery)),
})).filter((category) => category.items.length > 0);
const CurrentLucide = ARCHITECTURE_LIBRARY_ITEMS.find(
(item) => architectureResourceIcon(item) === currentIcon,
)?.icon ?? Server;
return (
<DropdownMenu open={open} onOpenChange={(nextOpen) => {
setOpen(nextOpen);
if (!nextOpen) setQuery("");
}}>
<Tooltip>
<TooltipTrigger asChild>
<DropdownMenuTrigger asChild>
<Button
variant="outline"
size="icon"
className="h-8 w-8 shrink-0 rounded-md border-slate-200 bg-card p-0 text-slate-700 hover:bg-slate-50 focus-visible:ring-1 focus-visible:ring-[var(--brand-green)]"
aria-label={t("diagram.changeNodeIcon")}
>
<CurrentLucide className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
</TooltipTrigger>
<TooltipContent side="bottom">
<div>{t("diagram.changeNodeIcon")}</div>
</TooltipContent>
</Tooltip>
<DropdownMenuContent
align="start"
className="max-h-[min(28rem,calc(100vh-10rem))] w-[min(24rem,calc(100vw-2rem))] overflow-y-auto p-0"
>
<div className="sticky top-0 z-10 border-b border-slate-200 bg-card p-2">
<div className="relative">
<Search className="pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-slate-400" />
<Input
autoFocus
className="h-8 pl-8 text-xs"
value={query}
placeholder={t("diagram.componentSearch")}
aria-label={t("diagram.componentSearch")}
onChange={(event) => setQuery(event.target.value)}
onKeyDown={(event) => event.stopPropagation()}
/>
</div>
</div>
<div className="p-1.5">
{categories.length > 0 ? categories.map((category) => (
<Collapsible key={category.id} defaultOpen>
<DropdownMenuItem asChild onSelect={(event) => event.preventDefault()}>
<CollapsibleTrigger className="group flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[11px] font-semibold text-slate-700 hover:bg-slate-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--brand-green)]">
<ChevronDown className="h-3.5 w-3.5 text-slate-400 transition-transform group-data-[state=closed]:-rotate-90" />
{t(category.labelKey)}
</CollapsibleTrigger>
</DropdownMenuItem>
<CollapsibleContent>
<div className="grid grid-cols-6 gap-1 px-1 pb-1.5">
{category.items.map((item) => {
const Icon = item.icon;
const resIcon = architectureResourceIcon(item);
const label = t(item.labelKey);
const isSelected = resIcon === currentIcon;
return (
<Tooltip key={item.labelKey}>
<TooltipTrigger asChild>
<DropdownMenuItem
aria-label={label}
className={cn(
"flex h-9 w-9 cursor-pointer justify-center rounded-lg p-0 hover:bg-current/10 focus:bg-current/10",
category.tone,
isSelected && "ring-2 ring-current font-bold",
)}
onSelect={() => {
onSelectIcon(resIcon);
setOpen(false);
}}
>
<Icon className="h-4 w-4" />
</DropdownMenuItem>
</TooltipTrigger>
<TooltipContent side="top">
<div>{label}</div>
</TooltipContent>
</Tooltip>
);
})}
</div>
</CollapsibleContent>
</Collapsible>
)) : (
<div className="px-3 py-6 text-center text-xs text-slate-500">{t("diagram.noMatchingComponents")}</div>
)}
</div>
</DropdownMenuContent>
</DropdownMenu>
);
};
const DiagramInsertMenu = ({
items,
}: {
@@ -2346,8 +2515,41 @@ export const DiagramEditorPane = ({
setSelectedNodeLabel(label);
const node = selectedNodeId ? graphRef.current?.getCellById(selectedNodeId) : null;
if (!node?.isNode() || readOnly) return;
node.setData({ ...node.getData<NodeData>(), label });
const data = node.getData<NodeData>();
const isArchitecture = document?.kind === "architecture";
let nextResourceIcon = data?.resourceIcon;
if (isArchitecture) {
const inferred = inferArchitectureResourceIcon(label, t);
if (inferred && inferred !== data?.resourceIcon) {
nextResourceIcon = inferred;
}
}
node.setData({ ...data, label, ...(nextResourceIcon ? { resourceIcon: nextResourceIcon } : {}) });
refreshNodeLabel(node, label);
if (isArchitecture && nextResourceIcon && nextResourceIcon !== data?.resourceIcon) {
const shape = data?.shape ?? "service";
const visual = architectureNodeVisual(shape, appearanceRef.current, node.getSize(), nextResourceIcon);
node.setMarkup(visual.markup);
node.replaceAttrs({
body: visual.body,
label: { ...visual.label, text: label },
...visual.attrs,
});
}
};
const updateSelectedResourceIcon = (resourceIcon: ArchitectureResourceIcon) => {
const node = selectedNodeId ? graphRef.current?.getCellById(selectedNodeId) : null;
if (!node?.isNode() || readOnly || document?.kind !== "architecture") return;
const data = node.getData<NodeData>() ?? { label: "", shape: "service" };
node.setData({ ...data, resourceIcon });
const visual = architectureNodeVisual(data.shape, appearanceRef.current, node.getSize(), resourceIcon);
node.setMarkup(visual.markup);
node.replaceAttrs({
body: visual.body,
label: { ...visual.label, text: node.attr("label/text") ?? data.label },
...visual.attrs,
});
};
const updateSelectedEdgeLabel = (label: string) => {
@@ -2977,12 +3179,30 @@ export const DiagramEditorPane = ({
readOnly={readOnly}
selectionEditor={(
<>
{selectedNodeId && !readOnly && (
<div className="ml-auto flex min-w-[220px] flex-1 items-center gap-2 sm:max-w-sm">
<span className="shrink-0 text-xs font-medium text-slate-500">{t("diagram.nodeText")}</span>
<Input value={selectedNodeLabel} maxLength={120} onChange={(event) => updateSelectedLabel(event.target.value)} />
</div>
)}
{selectedNodeId && !readOnly && (() => {
const selectedNode = graphRef.current?.getCellById(selectedNodeId);
const selectedData = selectedNode?.isNode() ? selectedNode.getData<NodeData>() : undefined;
const isArchitecture = document?.kind === "architecture";
const isArchitectureComponent = isArchitecture && selectedData?.shape !== "boundary";
const selectedIcon: ArchitectureResourceIcon = selectedData?.resourceIcon
?? (selectedData?.shape && ARCHITECTURE_COMPONENT_SHAPES.includes(selectedData.shape as ArchitectureComponentShape)
? ARCHITECTURE_SHAPE_RESOURCE[selectedData.shape as ArchitectureComponentShape]
: "service");
return (
<div className="ml-auto flex min-w-[220px] flex-1 items-center gap-2 sm:max-w-sm">
{isArchitectureComponent && (
<ArchitectureIconPicker
currentIcon={selectedIcon}
onSelectIcon={updateSelectedResourceIcon}
t={t}
/>
)}
<span className="shrink-0 text-xs font-medium text-slate-500">{t("diagram.nodeText")}</span>
<Input value={selectedNodeLabel} maxLength={120} onChange={(event) => updateSelectedLabel(event.target.value)} />
</div>
);
})()}
{selectedEdgeId && !readOnly && (
<div className="ml-auto flex min-w-[220px] flex-1 items-center gap-2 sm:max-w-sm">
<span className="shrink-0 text-xs font-medium text-slate-500">{t("diagram.edgeText")}</span>
@@ -8,59 +8,62 @@ export type ArchitectureIconElement = {
};
export const ARCHITECTURE_RESOURCE_ICON_ELEMENTS: Record<ArchitectureResourceIcon, ArchitectureIconElement[]> = {
client: [{ tagName: "path", attrs: { d: "M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8" } }, { tagName: "path", attrs: { d: "M10 19v-3.96 3.15" } }, { tagName: "path", attrs: { d: "M7 19h5" } }, { tagName: "rect", attrs: { width: "6", height: "10", x: "16", y: "12", rx: "2" } }],
webApp: [{ tagName: "rect", attrs: { x: "2", y: "4", width: "20", height: "16", rx: "2" } }, { tagName: "path", attrs: { d: "M10 4v4" } }, { tagName: "path", attrs: { d: "M2 8h20" } }, { tagName: "path", attrs: { d: "M6 4v4" } }],
mobileApp: [{ tagName: "rect", attrs: { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2" } }, { tagName: "path", attrs: { d: "M12 18h.01" } }],
website: [{ tagName: "path", attrs: { d: "M21.54 15H17a2 2 0 0 0-2 2v4.54" } }, { tagName: "path", attrs: { d: "M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17" } }, { tagName: "path", attrs: { d: "M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05" } }, { tagName: "circle", attrs: { cx: "12", cy: "12", r: "10" } }],
apiClient: [{ tagName: "path", attrs: { d: "m18 16 4-4-4-4" } }, { tagName: "path", attrs: { d: "m6 8-4 4 4 4" } }, { tagName: "path", attrs: { d: "m14.5 4-5 16" } }],
service: [{ tagName: "rect", attrs: { width: "20", height: "8", x: "2", y: "2", rx: "2", ry: "2" } }, { tagName: "rect", attrs: { width: "20", height: "8", x: "2", y: "14", rx: "2", ry: "2" } }, { tagName: "line", attrs: { x1: "6", x2: "6.01", y1: "6", y2: "6" } }, { tagName: "line", attrs: { x1: "6", x2: "6.01", y1: "18", y2: "18" } }],
virtualMachine: [{ tagName: "path", attrs: { d: "M12 20v2" } }, { tagName: "path", attrs: { d: "M12 2v2" } }, { tagName: "path", attrs: { d: "M17 20v2" } }, { tagName: "path", attrs: { d: "M17 2v2" } }, { tagName: "path", attrs: { d: "M2 12h2" } }, { tagName: "path", attrs: { d: "M2 17h2" } }, { tagName: "path", attrs: { d: "M2 7h2" } }, { tagName: "path", attrs: { d: "M20 12h2" } }, { tagName: "path", attrs: { d: "M20 17h2" } }, { tagName: "path", attrs: { d: "M20 7h2" } }, { tagName: "path", attrs: { d: "M7 20v2" } }, { tagName: "path", attrs: { d: "M7 2v2" } }, { tagName: "rect", attrs: { x: "4", y: "4", width: "16", height: "16", rx: "2" } }, { tagName: "rect", attrs: { x: "8", y: "8", width: "8", height: "8", rx: "1" } }],
container: [{ tagName: "path", attrs: { d: "M22 7.7c0-.6-.4-1.2-.8-1.5l-6.3-3.9a1.72 1.72 0 0 0-1.7 0l-10.3 6c-.5.2-.9.8-.9 1.4v6.6c0 .5.4 1.2.8 1.5l6.3 3.9a1.72 1.72 0 0 0 1.7 0l10.3-6c.5-.3.9-1 .9-1.5Z" } }, { tagName: "path", attrs: { d: "M10 21.9V14L2.1 9.1" } }, { tagName: "path", attrs: { d: "m10 14 11.9-6.9" } }, { tagName: "path", attrs: { d: "M14 19.8v-8.1" } }, { tagName: "path", attrs: { d: "M18 17.5V9.4" } }],
kubernetes: [{ tagName: "path", attrs: { d: "M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2" } }, { tagName: "rect", attrs: { x: "14", y: "2", width: "8", height: "8", rx: "1" } }],
serverless: [{ tagName: "rect", attrs: { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2" } }, { tagName: "path", attrs: { d: "M9 17c2 0 2.8-1 2.8-2.8V10c0-2 1-3.3 3.2-3" } }, { tagName: "path", attrs: { d: "M9 11.2h5.7" } }],
largeLanguageModel: [{ tagName: "path", attrs: { d: "M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z" } }, { tagName: "path", attrs: { d: "M9 13a4.5 4.5 0 0 0 3-4" } }, { tagName: "path", attrs: { d: "M6.003 5.125A3 3 0 0 0 6.401 6.5" } }, { tagName: "path", attrs: { d: "M3.477 10.896a4 4 0 0 1 .585-.396" } }, { tagName: "path", attrs: { d: "M6 18a4 4 0 0 1-1.967-.516" } }, { tagName: "path", attrs: { d: "M12 13h4" } }, { tagName: "path", attrs: { d: "M12 18h6a2 2 0 0 1 2 2v1" } }, { tagName: "path", attrs: { d: "M12 8h8" } }, { tagName: "path", attrs: { d: "M16 8V5a2 2 0 0 1 2-2" } }, { tagName: "circle", attrs: { cx: "16", cy: "13", r: ".5" } }, { tagName: "circle", attrs: { cx: "18", cy: "3", r: ".5" } }, { tagName: "circle", attrs: { cx: "20", cy: "21", r: ".5" } }, { tagName: "circle", attrs: { cx: "20", cy: "8", r: ".5" } }],
multimodalModel: [{ tagName: "path", attrs: { d: "M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" } }, { tagName: "path", attrs: { d: "M20 2v4" } }, { tagName: "path", attrs: { d: "M22 4h-4" } }, { tagName: "circle", attrs: { cx: "4", cy: "20", r: "2" } }],
embeddingModel: [{ tagName: "rect", attrs: { x: "14", y: "14", width: "4", height: "6", rx: "2" } }, { tagName: "rect", attrs: { x: "6", y: "4", width: "4", height: "6", rx: "2" } }, { tagName: "path", attrs: { d: "M6 20h4" } }, { tagName: "path", attrs: { d: "M14 10h4" } }, { tagName: "path", attrs: { d: "M6 14h2v6" } }, { tagName: "path", attrs: { d: "M14 4h2v6" } }],
reranker: [{ tagName: "path", attrs: { d: "m3 16 4 4 4-4" } }, { tagName: "path", attrs: { d: "M7 20V4" } }, { tagName: "path", attrs: { d: "m21 8-4-4-4 4" } }, { tagName: "path", attrs: { d: "M17 4v16" } }],
modelInference: [{ tagName: "path", attrs: { d: "M12 20v2" } }, { tagName: "path", attrs: { d: "M12 2v2" } }, { tagName: "path", attrs: { d: "M17 20v2" } }, { tagName: "path", attrs: { d: "M17 2v2" } }, { tagName: "path", attrs: { d: "M2 12h2" } }, { tagName: "path", attrs: { d: "M2 17h2" } }, { tagName: "path", attrs: { d: "M2 7h2" } }, { tagName: "path", attrs: { d: "M20 12h2" } }, { tagName: "path", attrs: { d: "M20 17h2" } }, { tagName: "path", attrs: { d: "M20 7h2" } }, { tagName: "path", attrs: { d: "M7 20v2" } }, { tagName: "path", attrs: { d: "M7 2v2" } }, { tagName: "rect", attrs: { x: "4", y: "4", width: "16", height: "16", rx: "2" } }, { tagName: "rect", attrs: { x: "8", y: "8", width: "8", height: "8", rx: "1" } }],
vectorDatabase: [{ tagName: "ellipse", attrs: { cx: "12", cy: "5", rx: "9", ry: "3" } }, { tagName: "path", attrs: { d: "M3 5V19A9 3 0 0 0 15 21.84" } }, { tagName: "path", attrs: { d: "M21 5V8" } }, { tagName: "path", attrs: { d: "M21 12L18 17H22L19 22" } }, { tagName: "path", attrs: { d: "M3 12A9 3 0 0 0 14.59 14.87" } }],
ragPipeline: [{ tagName: "rect", attrs: { width: "8", height: "8", x: "3", y: "3", rx: "2" } }, { tagName: "path", attrs: { d: "M7 11v4a2 2 0 0 0 2 2h4" } }, { tagName: "rect", attrs: { width: "8", height: "8", x: "13", y: "13", rx: "2" } }],
aiAgent: [{ tagName: "path", attrs: { d: "M12 8V4H8" } }, { tagName: "rect", attrs: { width: "16", height: "12", x: "4", y: "8", rx: "2" } }, { tagName: "path", attrs: { d: "M2 14h2" } }, { tagName: "path", attrs: { d: "M20 14h2" } }, { tagName: "path", attrs: { d: "M15 13v2" } }, { tagName: "path", attrs: { d: "M9 13v2" } }],
modelGateway: [{ tagName: "rect", attrs: { width: "20", height: "8", x: "2", y: "14", rx: "2" } }, { tagName: "path", attrs: { d: "M6.01 18H6" } }, { tagName: "path", attrs: { d: "M10.01 18H10" } }, { tagName: "path", attrs: { d: "M15 10v4" } }, { tagName: "path", attrs: { d: "M17.84 7.17a4 4 0 0 0-5.66 0" } }, { tagName: "path", attrs: { d: "M20.66 4.34a8 8 0 0 0-11.31 0" } }],
mcpServer: [{ tagName: "path", attrs: { d: "M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z" } }, { tagName: "path", attrs: { d: "m2 22 3-3" } }, { tagName: "path", attrs: { d: "M7.5 13.5 10 11" } }, { tagName: "path", attrs: { d: "M10.5 16.5 13 14" } }, { tagName: "path", attrs: { d: "m18 3-4 4h6l-4 4" } }],
relationalDatabase: [{ tagName: "ellipse", attrs: { cx: "12", cy: "5", rx: "9", ry: "3" } }, { tagName: "path", attrs: { d: "M3 5V19A9 3 0 0 0 21 19V5" } }, { tagName: "path", attrs: { d: "M3 12A9 3 0 0 0 21 12" } }],
noSqlDatabase: [{ tagName: "ellipse", attrs: { cx: "12", cy: "5", rx: "9", ry: "3" } }, { tagName: "path", attrs: { d: "M3 5V19A9 3 0 0 0 15 21.84" } }, { tagName: "path", attrs: { d: "M21 5V8" } }, { tagName: "path", attrs: { d: "M21 12L18 17H22L19 22" } }, { tagName: "path", attrs: { d: "M3 12A9 3 0 0 0 14.59 14.87" } }],
cache: [{ tagName: "path", attrs: { d: "M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z" } }, { tagName: "path", attrs: { d: "M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12" } }, { tagName: "path", attrs: { d: "M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17" } }],
dataWarehouse: [{ tagName: "path", attrs: { d: "M12 16v5" } }, { tagName: "path", attrs: { d: "M16 14.639V21" } }, { tagName: "path", attrs: { d: "M20 10.656V21" } }, { tagName: "path", attrs: { d: "m22 3-8.646 8.646a.5.5 0 0 1-.708 0L9.354 8.354a.5.5 0 0 0-.707 0L2 15" } }, { tagName: "path", attrs: { d: "M4 18.463V21" } }, { tagName: "path", attrs: { d: "M8 14.656V21" } }],
searchEngine: [{ tagName: "path", attrs: { d: "m21 21-4.34-4.34" } }, { tagName: "circle", attrs: { cx: "11", cy: "11", r: "8" } }],
objectStorage: [{ tagName: "path", attrs: { d: "M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" } }],
fileStorage: [{ tagName: "path", attrs: { d: "M11 21a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1" } }, { tagName: "path", attrs: { d: "M16 16a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1" } }, { tagName: "path", attrs: { d: "M21 6a2 2 0 0 0-.586-1.414l-2-2A2 2 0 0 0 17 2h-3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1z" } }],
blockStorage: [{ tagName: "path", attrs: { d: "M10 16h.01" } }, { tagName: "path", attrs: { d: "M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z" } }, { tagName: "path", attrs: { d: "M21.946 12.013H2.054" } }, { tagName: "path", attrs: { d: "M6 16h.01" } }],
backup: [{ tagName: "circle", attrs: { cx: "15", cy: "19", r: "2" } }, { tagName: "path", attrs: { d: "M20.9 19.8A2 2 0 0 0 22 18V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h5.1" } }, { tagName: "path", attrs: { d: "M15 11v-1" } }, { tagName: "path", attrs: { d: "M15 17v-2" } }],
cdn: [{ tagName: "path", attrs: { d: "M12 13v8" } }, { tagName: "path", attrs: { d: "M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242" } }, { tagName: "path", attrs: { d: "m8 17 4-4 4 4" } }],
messageQueue: [{ tagName: "path", attrs: { d: "M15 6a9 9 0 0 0-9 9V3" } }, { tagName: "circle", attrs: { cx: "18", cy: "6", r: "3" } }, { tagName: "circle", attrs: { cx: "6", cy: "18", r: "3" } }],
eventBus: [{ tagName: "rect", attrs: { width: "8", height: "8", x: "3", y: "3", rx: "2" } }, { tagName: "path", attrs: { d: "M7 11v4a2 2 0 0 0 2 2h4" } }, { tagName: "rect", attrs: { width: "8", height: "8", x: "13", y: "13", rx: "2" } }],
streamProcessing: [{ tagName: "path", attrs: { d: "M4.9 16.1C1 12.2 1 5.8 4.9 1.9" } }, { tagName: "path", attrs: { d: "M7.8 4.7a6.14 6.14 0 0 0-.8 7.5" } }, { tagName: "circle", attrs: { cx: "12", cy: "9", r: "2" } }, { tagName: "path", attrs: { d: "M16.2 4.8c2 2 2.26 5.11.8 7.47" } }, { tagName: "path", attrs: { d: "M19.1 1.9a9.96 9.96 0 0 1 0 14.1" } }, { tagName: "path", attrs: { d: "M9.5 18h5" } }, { tagName: "path", attrs: { d: "m8 22 4-11 4 11" } }],
webhook: [{ tagName: "path", attrs: { d: "M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2" } }, { tagName: "path", attrs: { d: "m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06" } }, { tagName: "path", attrs: { d: "m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8" } }],
serviceMesh: [{ tagName: "path", attrs: { d: "M8 5h13" } }, { tagName: "path", attrs: { d: "M13 12h8" } }, { tagName: "path", attrs: { d: "M13 19h8" } }, { tagName: "path", attrs: { d: "M3 10a2 2 0 0 0 2 2h3" } }, { tagName: "path", attrs: { d: "M3 5v12a2 2 0 0 0 2 2h3" } }],
apiGateway: [{ tagName: "rect", attrs: { width: "20", height: "8", x: "2", y: "14", rx: "2" } }, { tagName: "path", attrs: { d: "M6.01 18H6" } }, { tagName: "path", attrs: { d: "M10.01 18H10" } }, { tagName: "path", attrs: { d: "M15 10v4" } }, { tagName: "path", attrs: { d: "M17.84 7.17a4 4 0 0 0-5.66 0" } }, { tagName: "path", attrs: { d: "M20.66 4.34a8 8 0 0 0-11.31 0" } }],
loadBalancer: [{ tagName: "path", attrs: { d: "M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2" } }],
dns: [{ tagName: "path", attrs: { d: "M21.54 15H17a2 2 0 0 0-2 2v4.54" } }, { tagName: "path", attrs: { d: "M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17" } }, { tagName: "path", attrs: { d: "M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05" } }, { tagName: "circle", attrs: { cx: "12", cy: "12", r: "10" } }],
vpc: [{ tagName: "rect", attrs: { x: "16", y: "16", width: "6", height: "6", rx: "1" } }, { tagName: "rect", attrs: { x: "2", y: "16", width: "6", height: "6", rx: "1" } }, { tagName: "rect", attrs: { x: "9", y: "2", width: "6", height: "6", rx: "1" } }, { tagName: "path", attrs: { d: "M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3" } }, { tagName: "path", attrs: { d: "M12 12V8" } }],
subnet: [{ tagName: "path", attrs: { d: "M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z" } }, { tagName: "path", attrs: { d: "M17 21v-2" } }, { tagName: "path", attrs: { d: "M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10" } }, { tagName: "path", attrs: { d: "M21 21v-2" } }, { tagName: "path", attrs: { d: "M3 5V3" } }, { tagName: "path", attrs: { d: "M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z" } }, { tagName: "path", attrs: { d: "M7 5V3" } }],
vpn: [{ tagName: "path", attrs: { d: "m15 20 3-3h2a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h2l3 3z" } }, { tagName: "path", attrs: { d: "M6 8v1" } }, { tagName: "path", attrs: { d: "M10 8v1" } }, { tagName: "path", attrs: { d: "M14 8v1" } }, { tagName: "path", attrs: { d: "M18 8v1" } }],
identity: [{ tagName: "path", attrs: { d: "M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z" } }, { tagName: "circle", attrs: { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor" } }],
firewall: [{ tagName: "rect", attrs: { width: "18", height: "18", x: "3", y: "3", rx: "2" } }, { tagName: "path", attrs: { d: "M12 9v6" } }, { tagName: "path", attrs: { d: "M16 15v6" } }, { tagName: "path", attrs: { d: "M16 3v6" } }, { tagName: "path", attrs: { d: "M3 15h18" } }, { tagName: "path", attrs: { d: "M3 9h18" } }, { tagName: "path", attrs: { d: "M8 15v6" } }, { tagName: "path", attrs: { d: "M8 3v6" } }],
waf: [{ tagName: "path", attrs: { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" } }, { tagName: "path", attrs: { d: "m9 12 2 2 4-4" } }],
secretManager: [{ tagName: "circle", attrs: { cx: "12", cy: "16", r: "1" } }, { tagName: "rect", attrs: { x: "3", y: "10", width: "18", height: "12", rx: "2" } }, { tagName: "path", attrs: { d: "M7 10V7a5 5 0 0 1 10 0v3" } }],
certificate: [{ tagName: "path", attrs: { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" } }, { tagName: "path", attrs: { d: "M8 12h.01" } }, { tagName: "path", attrs: { d: "M12 12h.01" } }, { tagName: "path", attrs: { d: "M16 12h.01" } }],
systemBoundary: [{ tagName: "path", attrs: { d: "M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z" } }, { tagName: "path", attrs: { d: "m3.3 7 8.7 5 8.7-5" } }, { tagName: "path", attrs: { d: "M12 22V12" } }],
monitoring: [{ tagName: "path", attrs: { d: "m12 14 4-4" } }, { tagName: "path", attrs: { d: "M3.34 19a10 10 0 1 1 17.32 0" } }],
logging: [{ tagName: "path", attrs: { d: "M16 22h2a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v2.85" } }, { tagName: "path", attrs: { d: "M14 2v5a1 1 0 0 0 1 1h5" } }, { tagName: "path", attrs: { d: "M8 14v2.2l1.6 1" } }, { tagName: "circle", attrs: { cx: "8", cy: "16", r: "6" } }],
metrics: [{ tagName: "path", attrs: { d: "M12 16v5" } }, { tagName: "path", attrs: { d: "M16 14.639V21" } }, { tagName: "path", attrs: { d: "M20 10.656V21" } }, { tagName: "path", attrs: { d: "m22 3-8.646 8.646a.5.5 0 0 1-.708 0L9.354 8.354a.5.5 0 0 0-.707 0L2 15" } }, { tagName: "path", attrs: { d: "M4 18.463V21" } }, { tagName: "path", attrs: { d: "M8 14.656V21" } }],
tracing: [{ tagName: "path", attrs: { d: "M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2" } }],
alerting: [{ tagName: "circle", attrs: { cx: "12", cy: "12", r: "10" } }, { tagName: "line", attrs: { x1: "12", x2: "12", y1: "8", y2: "12" } }, { tagName: "line", attrs: { x1: "12", x2: "12.01", y1: "16", y2: "16" } }],
saas: [{ tagName: "path", attrs: { d: "m10.852 19.772-.383.924" } }, { tagName: "path", attrs: { d: "m13.148 14.228.383-.923" } }, { tagName: "path", attrs: { d: "M13.148 19.772a3 3 0 1 0-2.296-5.544l-.383-.923" } }, { tagName: "path", attrs: { d: "m13.53 20.696-.382-.924a3 3 0 1 1-2.296-5.544" } }, { tagName: "path", attrs: { d: "m14.772 15.852.923-.383" } }, { tagName: "path", attrs: { d: "m14.772 18.148.923.383" } }, { tagName: "path", attrs: { d: "M4.2 15.1a7 7 0 1 1 9.93-9.858A7 7 0 0 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.2" } }, { tagName: "path", attrs: { d: "m9.228 15.852-.923-.383" } }, { tagName: "path", attrs: { d: "m9.228 18.148-.923.383" } }],
externalApi: [{ tagName: "path", attrs: { d: "M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2" } }, { tagName: "path", attrs: { d: "m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06" } }, { tagName: "path", attrs: { d: "m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8" } }],
thirdPartyService: [{ tagName: "path", attrs: { d: "M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z" } }],
client: [{"tagName":"path","attrs":{"d":"M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8"}},{"tagName":"path","attrs":{"d":"M10 19v-3.96 3.15"}},{"tagName":"path","attrs":{"d":"M7 19h5"}},{"tagName":"rect","attrs":{"width":"6","height":"10","x":"16","y":"12","rx":"2"}}],
webApp: [{"tagName":"rect","attrs":{"x":"2","y":"4","width":"20","height":"16","rx":"2"}},{"tagName":"path","attrs":{"d":"M10 4v4"}},{"tagName":"path","attrs":{"d":"M2 8h20"}},{"tagName":"path","attrs":{"d":"M6 4v4"}}],
mobileApp: [{"tagName":"rect","attrs":{"width":"14","height":"20","x":"5","y":"2","rx":"2","ry":"2"}},{"tagName":"path","attrs":{"d":"M12 18h.01"}}],
website: [{"tagName":"path","attrs":{"d":"M21.54 15H17a2 2 0 0 0-2 2v4.54"}},{"tagName":"path","attrs":{"d":"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17"}},{"tagName":"path","attrs":{"d":"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05"}},{"tagName":"circle","attrs":{"cx":"12","cy":"12","r":"10"}}],
apiClient: [{"tagName":"path","attrs":{"d":"m18 16 4-4-4-4"}},{"tagName":"path","attrs":{"d":"m6 8-4 4 4 4"}},{"tagName":"path","attrs":{"d":"m14.5 4-5 16"}}],
service: [{"tagName":"rect","attrs":{"width":"20","height":"8","x":"2","y":"2","rx":"2","ry":"2"}},{"tagName":"rect","attrs":{"width":"20","height":"8","x":"2","y":"14","rx":"2","ry":"2"}},{"tagName":"line","attrs":{"x1":"6","x2":"6.01","y1":"6","y2":"6"}},{"tagName":"line","attrs":{"x1":"6","x2":"6.01","y1":"18","y2":"18"}}],
cpu: [{"tagName":"path","attrs":{"d":"M12 20v2"}},{"tagName":"path","attrs":{"d":"M12 2v2"}},{"tagName":"path","attrs":{"d":"M17 20v2"}},{"tagName":"path","attrs":{"d":"M17 2v2"}},{"tagName":"path","attrs":{"d":"M2 12h2"}},{"tagName":"path","attrs":{"d":"M2 17h2"}},{"tagName":"path","attrs":{"d":"M2 7h2"}},{"tagName":"path","attrs":{"d":"M20 12h2"}},{"tagName":"path","attrs":{"d":"M20 17h2"}},{"tagName":"path","attrs":{"d":"M20 7h2"}},{"tagName":"path","attrs":{"d":"M7 20v2"}},{"tagName":"path","attrs":{"d":"M7 2v2"}},{"tagName":"rect","attrs":{"x":"4","y":"4","width":"16","height":"16","rx":"2"}},{"tagName":"rect","attrs":{"x":"8","y":"8","width":"8","height":"8","rx":"1"}}],
gpu: [{"tagName":"path","attrs":{"d":"M2 17h18a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2H2"}},{"tagName":"path","attrs":{"d":"M2 21V3"}},{"tagName":"path","attrs":{"d":"M7 17v3a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1v-3"}},{"tagName":"circle","attrs":{"cx":"16","cy":"11","r":"2"}},{"tagName":"circle","attrs":{"cx":"8","cy":"11","r":"2"}}],
memory: [{"tagName":"path","attrs":{"d":"M12 12v-2"}},{"tagName":"path","attrs":{"d":"M12 18v-2"}},{"tagName":"path","attrs":{"d":"M16 12v-2"}},{"tagName":"path","attrs":{"d":"M16 18v-2"}},{"tagName":"path","attrs":{"d":"M2 11h1.5"}},{"tagName":"path","attrs":{"d":"M20 18v-2"}},{"tagName":"path","attrs":{"d":"M20.5 11H22"}},{"tagName":"path","attrs":{"d":"M4 18v-2"}},{"tagName":"path","attrs":{"d":"M8 12v-2"}},{"tagName":"path","attrs":{"d":"M8 18v-2"}},{"tagName":"rect","attrs":{"x":"2","y":"6","width":"20","height":"10","rx":"2"}}],
virtualMachine: [{"tagName":"path","attrs":{"d":"m10.852 14.772-.383.923"}},{"tagName":"path","attrs":{"d":"M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923"}},{"tagName":"path","attrs":{"d":"m13.148 9.228.383-.923"}},{"tagName":"path","attrs":{"d":"m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544"}},{"tagName":"path","attrs":{"d":"m14.772 10.852.923-.383"}},{"tagName":"path","attrs":{"d":"m14.772 13.148.923.383"}},{"tagName":"path","attrs":{"d":"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5"}},{"tagName":"path","attrs":{"d":"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5"}},{"tagName":"path","attrs":{"d":"M6 18h.01"}},{"tagName":"path","attrs":{"d":"M6 6h.01"}},{"tagName":"path","attrs":{"d":"m9.228 10.852-.923-.383"}},{"tagName":"path","attrs":{"d":"m9.228 13.148-.923.383"}}],
container: [{"tagName":"path","attrs":{"d":"M22 7.7c0-.6-.4-1.2-.8-1.5l-6.3-3.9a1.72 1.72 0 0 0-1.7 0l-10.3 6c-.5.2-.9.8-.9 1.4v6.6c0 .5.4 1.2.8 1.5l6.3 3.9a1.72 1.72 0 0 0 1.7 0l10.3-6c.5-.3.9-1 .9-1.5Z"}},{"tagName":"path","attrs":{"d":"M10 21.9V14L2.1 9.1"}},{"tagName":"path","attrs":{"d":"m10 14 11.9-6.9"}},{"tagName":"path","attrs":{"d":"M14 19.8v-8.1"}},{"tagName":"path","attrs":{"d":"M18 17.5V9.4"}}],
kubernetes: [{"tagName":"circle","attrs":{"cx":"12","cy":"12","r":"8"}},{"tagName":"path","attrs":{"d":"M12 2v7.5"}},{"tagName":"path","attrs":{"d":"m19 5-5.23 5.23"}},{"tagName":"path","attrs":{"d":"M22 12h-7.5"}},{"tagName":"path","attrs":{"d":"m19 19-5.23-5.23"}},{"tagName":"path","attrs":{"d":"M12 14.5V22"}},{"tagName":"path","attrs":{"d":"M10.23 13.77 5 19"}},{"tagName":"path","attrs":{"d":"M9.5 12H2"}},{"tagName":"path","attrs":{"d":"M10.23 10.23 5 5"}},{"tagName":"circle","attrs":{"cx":"12","cy":"12","r":"2.5"}}],
serverless: [{"tagName":"rect","attrs":{"width":"18","height":"18","x":"3","y":"3","rx":"2","ry":"2"}},{"tagName":"path","attrs":{"d":"M9 17c2 0 2.8-1 2.8-2.8V10c0-2 1-3.3 3.2-3"}},{"tagName":"path","attrs":{"d":"M9 11.2h5.7"}}],
largeLanguageModel: [{"tagName":"path","attrs":{"d":"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"}},{"tagName":"path","attrs":{"d":"M9 13a4.5 4.5 0 0 0 3-4"}},{"tagName":"path","attrs":{"d":"M6.003 5.125A3 3 0 0 0 6.401 6.5"}},{"tagName":"path","attrs":{"d":"M3.477 10.896a4 4 0 0 1 .585-.396"}},{"tagName":"path","attrs":{"d":"M6 18a4 4 0 0 1-1.967-.516"}},{"tagName":"path","attrs":{"d":"M12 13h4"}},{"tagName":"path","attrs":{"d":"M12 18h6a2 2 0 0 1 2 2v1"}},{"tagName":"path","attrs":{"d":"M12 8h8"}},{"tagName":"path","attrs":{"d":"M16 8V5a2 2 0 0 1 2-2"}},{"tagName":"circle","attrs":{"cx":"16","cy":"13","r":".5"}},{"tagName":"circle","attrs":{"cx":"18","cy":"3","r":".5"}},{"tagName":"circle","attrs":{"cx":"20","cy":"21","r":".5"}},{"tagName":"circle","attrs":{"cx":"20","cy":"8","r":".5"}}],
multimodalModel: [{"tagName":"path","attrs":{"d":"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"}},{"tagName":"path","attrs":{"d":"M20 2v4"}},{"tagName":"path","attrs":{"d":"M22 4h-4"}},{"tagName":"circle","attrs":{"cx":"4","cy":"20","r":"2"}}],
embeddingModel: [{"tagName":"rect","attrs":{"x":"14","y":"14","width":"4","height":"6","rx":"2"}},{"tagName":"rect","attrs":{"x":"6","y":"4","width":"4","height":"6","rx":"2"}},{"tagName":"path","attrs":{"d":"M6 20h4"}},{"tagName":"path","attrs":{"d":"M14 10h4"}},{"tagName":"path","attrs":{"d":"M6 14h2v6"}},{"tagName":"path","attrs":{"d":"M14 4h2v6"}}],
reranker: [{"tagName":"path","attrs":{"d":"m3 16 4 4 4-4"}},{"tagName":"path","attrs":{"d":"M7 20V4"}},{"tagName":"path","attrs":{"d":"m21 8-4-4-4 4"}},{"tagName":"path","attrs":{"d":"M17 4v16"}}],
modelInference: [{"tagName":"path","attrs":{"d":"M10 12h4"}},{"tagName":"path","attrs":{"d":"M10 17h4"}},{"tagName":"path","attrs":{"d":"M10 7h4"}},{"tagName":"path","attrs":{"d":"M18 12h2"}},{"tagName":"path","attrs":{"d":"M18 18h2"}},{"tagName":"path","attrs":{"d":"M18 6h2"}},{"tagName":"path","attrs":{"d":"M4 12h2"}},{"tagName":"path","attrs":{"d":"M4 18h2"}},{"tagName":"path","attrs":{"d":"M4 6h2"}},{"tagName":"rect","attrs":{"x":"6","y":"2","width":"12","height":"20","rx":"2"}}],
vectorDatabase: [{"tagName":"path","attrs":{"d":"m10.586 5.414-5.172 5.172"}},{"tagName":"path","attrs":{"d":"m18.586 13.414-5.172 5.172"}},{"tagName":"path","attrs":{"d":"M6 12h12"}},{"tagName":"circle","attrs":{"cx":"12","cy":"20","r":"2"}},{"tagName":"circle","attrs":{"cx":"12","cy":"4","r":"2"}},{"tagName":"circle","attrs":{"cx":"20","cy":"12","r":"2"}},{"tagName":"circle","attrs":{"cx":"4","cy":"12","r":"2"}}],
ragPipeline: [{"tagName":"rect","attrs":{"width":"8","height":"8","x":"3","y":"3","rx":"2"}},{"tagName":"path","attrs":{"d":"M7 11v4a2 2 0 0 0 2 2h4"}},{"tagName":"rect","attrs":{"width":"8","height":"8","x":"13","y":"13","rx":"2"}}],
aiAgent: [{"tagName":"path","attrs":{"d":"M12 8V4H8"}},{"tagName":"rect","attrs":{"width":"16","height":"12","x":"4","y":"8","rx":"2"}},{"tagName":"path","attrs":{"d":"M2 14h2"}},{"tagName":"path","attrs":{"d":"M20 14h2"}},{"tagName":"path","attrs":{"d":"M15 13v2"}},{"tagName":"path","attrs":{"d":"M9 13v2"}}],
modelGateway: [{"tagName":"rect","attrs":{"width":"20","height":"8","x":"2","y":"14","rx":"2"}},{"tagName":"path","attrs":{"d":"M6.01 18H6"}},{"tagName":"path","attrs":{"d":"M10.01 18H10"}},{"tagName":"path","attrs":{"d":"M15 10v4"}},{"tagName":"path","attrs":{"d":"M17.84 7.17a4 4 0 0 0-5.66 0"}},{"tagName":"path","attrs":{"d":"M20.66 4.34a8 8 0 0 0-11.31 0"}}],
mcpServer: [{"tagName":"path","attrs":{"d":"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z"}},{"tagName":"path","attrs":{"d":"m2 22 3-3"}},{"tagName":"path","attrs":{"d":"M7.5 13.5 10 11"}},{"tagName":"path","attrs":{"d":"M10.5 16.5 13 14"}},{"tagName":"path","attrs":{"d":"m18 3-4 4h6l-4 4"}}],
relationalDatabase: [{"tagName":"ellipse","attrs":{"cx":"12","cy":"5","rx":"9","ry":"3"}},{"tagName":"path","attrs":{"d":"M3 5V19A9 3 0 0 0 21 19V5"}},{"tagName":"path","attrs":{"d":"M3 12A9 3 0 0 0 21 12"}}],
noSqlDatabase: [{"tagName":"ellipse","attrs":{"cx":"12","cy":"5","rx":"9","ry":"3"}},{"tagName":"path","attrs":{"d":"M3 5V19A9 3 0 0 0 15 21.84"}},{"tagName":"path","attrs":{"d":"M21 5V8"}},{"tagName":"path","attrs":{"d":"M21 12L18 17H22L19 22"}},{"tagName":"path","attrs":{"d":"M3 12A9 3 0 0 0 14.59 14.87"}}],
cache: [{"tagName":"path","attrs":{"d":"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"}}],
dataWarehouse: [{"tagName":"path","attrs":{"d":"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z"}},{"tagName":"path","attrs":{"d":"m7 16.5-4.74-2.85"}},{"tagName":"path","attrs":{"d":"m7 16.5 5-3"}},{"tagName":"path","attrs":{"d":"M7 16.5v5.17"}},{"tagName":"path","attrs":{"d":"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z"}},{"tagName":"path","attrs":{"d":"m17 16.5-5-3"}},{"tagName":"path","attrs":{"d":"m17 16.5 4.74-2.85"}},{"tagName":"path","attrs":{"d":"M17 16.5v5.17"}},{"tagName":"path","attrs":{"d":"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z"}},{"tagName":"path","attrs":{"d":"M12 8 7.26 5.15"}},{"tagName":"path","attrs":{"d":"m12 8 4.74-2.85"}},{"tagName":"path","attrs":{"d":"M12 13.5V8"}}],
searchEngine: [{"tagName":"path","attrs":{"d":"m21 21-4.34-4.34"}},{"tagName":"circle","attrs":{"cx":"11","cy":"11","r":"8"}}],
objectStorage: [{"tagName":"path","attrs":{"d":"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"}}],
fileStorage: [{"tagName":"path","attrs":{"d":"M11 21a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1"}},{"tagName":"path","attrs":{"d":"M16 16a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1"}},{"tagName":"path","attrs":{"d":"M21 6a2 2 0 0 0-.586-1.414l-2-2A2 2 0 0 0 17 2h-3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1z"}}],
blockStorage: [{"tagName":"path","attrs":{"d":"M10 16h.01"}},{"tagName":"path","attrs":{"d":"M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"}},{"tagName":"path","attrs":{"d":"M21.946 12.013H2.054"}},{"tagName":"path","attrs":{"d":"M6 16h.01"}}],
backup: [{"tagName":"circle","attrs":{"cx":"15","cy":"19","r":"2"}},{"tagName":"path","attrs":{"d":"M20.9 19.8A2 2 0 0 0 22 18V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h5.1"}},{"tagName":"path","attrs":{"d":"M15 11v-1"}},{"tagName":"path","attrs":{"d":"M15 17v-2"}}],
cdn: [{"tagName":"path","attrs":{"d":"M16.247 7.761a6 6 0 0 1 0 8.478"}},{"tagName":"path","attrs":{"d":"M19.075 4.933a10 10 0 0 1 0 14.134"}},{"tagName":"path","attrs":{"d":"M4.925 19.067a10 10 0 0 1 0-14.134"}},{"tagName":"path","attrs":{"d":"M7.753 16.239a6 6 0 0 1 0-8.478"}},{"tagName":"circle","attrs":{"cx":"12","cy":"12","r":"2"}}],
messageQueue: [{"tagName":"path","attrs":{"d":"M11 5h10"}},{"tagName":"path","attrs":{"d":"M11 12h10"}},{"tagName":"path","attrs":{"d":"M11 19h10"}},{"tagName":"path","attrs":{"d":"M4 4h1v5"}},{"tagName":"path","attrs":{"d":"M4 9h2"}},{"tagName":"path","attrs":{"d":"M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02"}}],
eventBus: [{"tagName":"circle","attrs":{"cx":"18","cy":"5","r":"3"}},{"tagName":"circle","attrs":{"cx":"6","cy":"12","r":"3"}},{"tagName":"circle","attrs":{"cx":"18","cy":"19","r":"3"}},{"tagName":"line","attrs":{"x1":"8.59","x2":"15.42","y1":"13.51","y2":"17.49"}},{"tagName":"line","attrs":{"x1":"15.41","x2":"8.59","y1":"6.51","y2":"10.49"}}],
streamProcessing: [{"tagName":"path","attrs":{"d":"M2 12q2.5 2 5 0t5 0 5 0 5 0"}},{"tagName":"path","attrs":{"d":"M2 19q2.5 2 5 0t5 0 5 0 5 0"}},{"tagName":"path","attrs":{"d":"M2 5q2.5 2 5 0t5 0 5 0 5 0"}}],
webhook: [{"tagName":"path","attrs":{"d":"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2"}},{"tagName":"path","attrs":{"d":"m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06"}},{"tagName":"path","attrs":{"d":"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8"}}],
serviceMesh: [{"tagName":"path","attrs":{"d":"M12 3v18"}},{"tagName":"path","attrs":{"d":"M3 12h18"}},{"tagName":"rect","attrs":{"x":"3","y":"3","width":"18","height":"18","rx":"2"}}],
apiGateway: [{"tagName":"circle","attrs":{"cx":"6","cy":"19","r":"3"}},{"tagName":"path","attrs":{"d":"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15"}},{"tagName":"circle","attrs":{"cx":"18","cy":"5","r":"3"}}],
loadBalancer: [{"tagName":"circle","attrs":{"cx":"12","cy":"18","r":"3"}},{"tagName":"circle","attrs":{"cx":"6","cy":"6","r":"3"}},{"tagName":"circle","attrs":{"cx":"18","cy":"6","r":"3"}},{"tagName":"path","attrs":{"d":"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9"}},{"tagName":"path","attrs":{"d":"M12 12v3"}}],
dns: [{"tagName":"circle","attrs":{"cx":"12","cy":"12","r":"10"}},{"tagName":"path","attrs":{"d":"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z"}}],
vpc: [{"tagName":"rect","attrs":{"x":"16","y":"16","width":"6","height":"6","rx":"1"}},{"tagName":"rect","attrs":{"x":"2","y":"16","width":"6","height":"6","rx":"1"}},{"tagName":"rect","attrs":{"x":"9","y":"2","width":"6","height":"6","rx":"1"}},{"tagName":"path","attrs":{"d":"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3"}},{"tagName":"path","attrs":{"d":"M12 12V8"}}],
subnet: [{"tagName":"path","attrs":{"d":"M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z"}},{"tagName":"path","attrs":{"d":"M17 21v-2"}},{"tagName":"path","attrs":{"d":"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10"}},{"tagName":"path","attrs":{"d":"M21 21v-2"}},{"tagName":"path","attrs":{"d":"M3 5V3"}},{"tagName":"path","attrs":{"d":"M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z"}},{"tagName":"path","attrs":{"d":"M7 5V3"}}],
vpn: [{"tagName":"path","attrs":{"d":"m15 20 3-3h2a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h2l3 3z"}},{"tagName":"path","attrs":{"d":"M6 8v1"}},{"tagName":"path","attrs":{"d":"M10 8v1"}},{"tagName":"path","attrs":{"d":"M14 8v1"}},{"tagName":"path","attrs":{"d":"M18 8v1"}}],
identity: [{"tagName":"path","attrs":{"d":"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z"}},{"tagName":"circle","attrs":{"cx":"16.5","cy":"7.5","r":".5","fill":"currentColor"}}],
firewall: [{"tagName":"rect","attrs":{"width":"18","height":"18","x":"3","y":"3","rx":"2"}},{"tagName":"path","attrs":{"d":"M12 9v6"}},{"tagName":"path","attrs":{"d":"M16 15v6"}},{"tagName":"path","attrs":{"d":"M16 3v6"}},{"tagName":"path","attrs":{"d":"M3 15h18"}},{"tagName":"path","attrs":{"d":"M3 9h18"}},{"tagName":"path","attrs":{"d":"M8 15v6"}},{"tagName":"path","attrs":{"d":"M8 3v6"}}],
waf: [{"tagName":"path","attrs":{"d":"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"}},{"tagName":"path","attrs":{"d":"m9 12 2 2 4-4"}}],
secretManager: [{"tagName":"circle","attrs":{"cx":"12","cy":"16","r":"1"}},{"tagName":"rect","attrs":{"x":"3","y":"10","width":"18","height":"12","rx":"2"}},{"tagName":"path","attrs":{"d":"M7 10V7a5 5 0 0 1 10 0v3"}}],
certificate: [{"tagName":"path","attrs":{"d":"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"}},{"tagName":"path","attrs":{"d":"M8 12h.01"}},{"tagName":"path","attrs":{"d":"M12 12h.01"}},{"tagName":"path","attrs":{"d":"M16 12h.01"}}],
systemBoundary: [{"tagName":"path","attrs":{"d":"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"}},{"tagName":"path","attrs":{"d":"m3.3 7 8.7 5 8.7-5"}},{"tagName":"path","attrs":{"d":"M12 22V12"}}],
monitoring: [{"tagName":"path","attrs":{"d":"m12 14 4-4"}},{"tagName":"path","attrs":{"d":"M3.34 19a10 10 0 1 1 17.32 0"}}],
logging: [{"tagName":"path","attrs":{"d":"M16 22h2a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v2.85"}},{"tagName":"path","attrs":{"d":"M14 2v5a1 1 0 0 0 1 1h5"}},{"tagName":"path","attrs":{"d":"M8 14v2.2l1.6 1"}},{"tagName":"circle","attrs":{"cx":"8","cy":"16","r":"6"}}],
metrics: [{"tagName":"path","attrs":{"d":"M12 16v5"}},{"tagName":"path","attrs":{"d":"M16 14.639V21"}},{"tagName":"path","attrs":{"d":"M20 10.656V21"}},{"tagName":"path","attrs":{"d":"m22 3-8.646 8.646a.5.5 0 0 1-.708 0L9.354 8.354a.5.5 0 0 0-.707 0L2 15"}},{"tagName":"path","attrs":{"d":"M4 18.463V21"}},{"tagName":"path","attrs":{"d":"M8 14.656V21"}}],
tracing: [{"tagName":"path","attrs":{"d":"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"}}],
alerting: [{"tagName":"circle","attrs":{"cx":"12","cy":"12","r":"10"}},{"tagName":"line","attrs":{"x1":"12","x2":"12","y1":"8","y2":"12"}},{"tagName":"line","attrs":{"x1":"12","x2":"12.01","y1":"16","y2":"16"}}],
saas: [{"tagName":"path","attrs":{"d":"m10.852 19.772-.383.924"}},{"tagName":"path","attrs":{"d":"m13.148 14.228.383-.923"}},{"tagName":"path","attrs":{"d":"M13.148 19.772a3 3 0 1 0-2.296-5.544l-.383-.923"}},{"tagName":"path","attrs":{"d":"m13.53 20.696-.382-.924a3 3 0 1 1-2.296-5.544"}},{"tagName":"path","attrs":{"d":"m14.772 15.852.923-.383"}},{"tagName":"path","attrs":{"d":"m14.772 18.148.923.383"}},{"tagName":"path","attrs":{"d":"M4.2 15.1a7 7 0 1 1 9.93-9.858A7 7 0 0 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.2"}},{"tagName":"path","attrs":{"d":"m9.228 15.852-.923-.383"}},{"tagName":"path","attrs":{"d":"m9.228 18.148-.923.383"}}],
externalApi: [{"tagName":"path","attrs":{"d":"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1"}},{"tagName":"path","attrs":{"d":"M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1"}}],
thirdPartyService: [{"tagName":"path","attrs":{"d":"M15 3h6v6"}},{"tagName":"path","attrs":{"d":"M10 14 21 3"}},{"tagName":"path","attrs":{"d":"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}}],
};
@@ -38,7 +38,7 @@ export const ARCHITECTURE_ACCENTS: Record<ArchitectureComponentShape, string> =
external: "#64748B",
};
const ARCHITECTURE_SHAPE_RESOURCE: Record<ArchitectureComponentShape, ArchitectureResourceIcon> = {
export const ARCHITECTURE_SHAPE_RESOURCE: Record<ArchitectureComponentShape, ArchitectureResourceIcon> = {
client: "client",
frontend: "webApp",
service: "service",
+1 -1
View File
@@ -89,7 +89,7 @@ export const resolveDiagramStructure = (structure?: DiagramStructure): DiagramSt
export const ARCHITECTURE_RESOURCE_ICONS = [
"client", "webApp", "mobileApp", "website", "apiClient",
"service", "virtualMachine", "container", "kubernetes", "serverless",
"service", "cpu", "gpu", "memory", "virtualMachine", "container", "kubernetes", "serverless",
"largeLanguageModel", "multimodalModel", "embeddingModel", "reranker", "modelInference",
"vectorDatabase", "ragPipeline", "aiAgent", "modelGateway", "mcpServer",
"relationalDatabase", "noSqlDatabase", "cache", "dataWarehouse", "searchEngine",
+5
View File
@@ -325,6 +325,9 @@ export const enUS = {
website: "Website",
apiClient: "API client",
service: "Application service",
cpu: "CPU core",
gpu: "GPU",
memory: "Memory",
virtualMachine: "Virtual machine",
container: "Container",
kubernetes: "Kubernetes",
@@ -391,6 +394,8 @@ export const enUS = {
quickCreateTitle: "Choose the next node type",
quickCreateShortcuts: "Press 1 / 2 / 3 to choose; Esc to cancel",
nodeText: "Node text",
nodeIcon: "Node icon",
changeNodeIcon: "Change node icon",
edgeText: "Connection label",
editNode: "Edit node text",
deleteSelection: "Delete selection",
+5
View File
@@ -325,6 +325,9 @@ export const ja = {
website: "ウェブサイト",
apiClient: "API クライアント",
service: "アプリケーションサービス",
cpu: "CPU コア",
gpu: "GPU",
memory: "メモリ",
virtualMachine: "仮想マシン",
container: "コンテナ",
kubernetes: "Kubernetes",
@@ -391,6 +394,8 @@ export const ja = {
quickCreateTitle: "次のノードの種類を選択",
quickCreateShortcuts: "1 / 2 / 3 で選択、Esc でキャンセル",
nodeText: "ノードの文字",
nodeIcon: "ノードアイコン",
changeNodeIcon: "ノードアイコンを変更",
edgeText: "接続ラベル",
editNode: "ノードの文字を編集",
deleteSelection: "選択を削除",
+5
View File
@@ -325,6 +325,9 @@ export const zhCN = {
website: "网站",
apiClient: "API 客户端",
service: "应用服务",
cpu: "CPU 核心",
gpu: "GPU / 显卡",
memory: "内存 / 显存",
virtualMachine: "虚拟机",
container: "容器",
kubernetes: "Kubernetes",
@@ -391,6 +394,8 @@ export const zhCN = {
quickCreateTitle: "选择后续节点类型",
quickCreateShortcuts: "按 1 / 2 / 3 选择,Esc 取消",
nodeText: "节点文字",
nodeIcon: "节点图标",
changeNodeIcon: "更换节点图标",
edgeText: "连线说明",
editNode: "编辑节点文字",
deleteSelection: "删除所选内容",