From 67e8dbfe3a17b791916e52600e226c6218ebfbbd Mon Sep 17 00:00:00 2001 From: George Taylor Date: Fri, 17 Oct 2025 11:59:21 +0100 Subject: [PATCH 1/4] fix: icon image positioning --- diagrams/__init__.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/diagrams/__init__.py b/diagrams/__init__.py index 66c3458f..b8497301 100644 --- a/diagrams/__init__.py +++ b/diagrams/__init__.py @@ -315,14 +315,13 @@ class Node: self.label = prefix # fmt: off - # If a node has an icon, increase the height slightly to avoid - # that label being spanned between icon image and white space. - # Increase the height by the number of new lines included in the label. - padding = 0.4 * (self.label.count('\n')) + # If a node has an icon, set the imagepos attr so + # that that the icon image is top centered. self._attrs = { "shape": "none", - "height": str(self._height + padding), + "height": str(self._height), "image": self._load_icon(), + "imagepos": "tc", } if self._icon else {} # fmt: on From c6d40178de4a9e5a3b492c38efad1229346fe652 Mon Sep 17 00:00:00 2001 From: georgepstaylor <3026030+georgepstaylor@users.noreply.github.com> Date: Thu, 30 Oct 2025 09:54:58 +0000 Subject: [PATCH 2/4] fix: add imagepos tc to default node attrs --- diagrams/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diagrams/__init__.py b/diagrams/__init__.py index b8497301..a7c4573c 100644 --- a/diagrams/__init__.py +++ b/diagrams/__init__.py @@ -62,7 +62,7 @@ class Diagram: # imagepos attribute is not backward compatible # TODO: check graphviz version to see if "imagepos" is available >= 2.40 # https://github.com/xflr6/graphviz/blob/master/graphviz/backend.py#L248 - # "imagepos": "tc", + "imagepos": "tc", "imagescale": "true", "fontname": "Sans-Serif", "fontsize": "13", From 73446bd2509b082f73fb2929484024af225bd151 Mon Sep 17 00:00:00 2001 From: georgepstaylor <3026030+georgepstaylor@users.noreply.github.com> Date: Thu, 30 Oct 2025 09:55:10 +0000 Subject: [PATCH 3/4] Revert "fix: icon image positioning" This reverts commit 67e8dbfe3a17b791916e52600e226c6218ebfbbd. --- diagrams/__init__.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/diagrams/__init__.py b/diagrams/__init__.py index a7c4573c..2db6d8db 100644 --- a/diagrams/__init__.py +++ b/diagrams/__init__.py @@ -315,13 +315,14 @@ class Node: self.label = prefix # fmt: off - # If a node has an icon, set the imagepos attr so - # that that the icon image is top centered. + # If a node has an icon, increase the height slightly to avoid + # that label being spanned between icon image and white space. + # Increase the height by the number of new lines included in the label. + padding = 0.4 * (self.label.count('\n')) self._attrs = { "shape": "none", - "height": str(self._height), + "height": str(self._height + padding), "image": self._load_icon(), - "imagepos": "tc", } if self._icon else {} # fmt: on From 23f06b4f01135fc1ea9591be2da673044140cd1d Mon Sep 17 00:00:00 2001 From: Yoshiaki Yoshida Date: Thu, 4 Jun 2026 14:23:39 +0900 Subject: [PATCH 4/4] feat: add AWS Verified Access icon (#1218) --- .github/workflows/test.yml | 2 +- diagrams/aws/network.py | 4 ++++ docs/nodes/aws.md | 3 +++ resources/aws/network/verified-access.png | Bin 0 -> 9396 bytes .../resources/aws/network/verified-access.png | Bin 0 -> 9396 bytes 5 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 resources/aws/network/verified-access.png create mode 100644 website/static/img/resources/aws/network/verified-access.png diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7b56e730..3da9ecda 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,7 +32,7 @@ jobs: - name: Setup Graphviz uses: ts-graphviz/setup-graphviz@v2 - name: Install poetry - run: curl -sSL https://install.python-poetry.org | python3 - + run: curl -sSL https://install.python-poetry.org | python3 - --version 2.2.1 - name: Run all tests run: | poetry install diff --git a/diagrams/aws/network.py b/diagrams/aws/network.py index 4f072756..fe8d946e 100644 --- a/diagrams/aws/network.py +++ b/diagrams/aws/network.py @@ -128,6 +128,10 @@ class TransitGateway(_Network): _icon = "transit-gateway.png" +class VerifiedAccess(_Network): + _icon = "verified-access.png" + + class VPCCustomerGateway(_Network): _icon = "vpc-customer-gateway.png" diff --git a/docs/nodes/aws.md b/docs/nodes/aws.md index ad51cbc2..0d5cf59d 100644 --- a/docs/nodes/aws.md +++ b/docs/nodes/aws.md @@ -1304,6 +1304,9 @@ Node classes list of the aws provider. TransitGateway **diagrams.aws.network.TransitGateway**, **TGW** (alias) +VerifiedAccess +**diagrams.aws.network.VerifiedAccess** + VPCCustomerGateway **diagrams.aws.network.VPCCustomerGateway** diff --git a/resources/aws/network/verified-access.png b/resources/aws/network/verified-access.png new file mode 100644 index 0000000000000000000000000000000000000000..856c2d34286c1d8340d48beca30c09f446af6eee GIT binary patch literal 9396 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 Z^V{!9jRd-b7&Q{0_EhsprJ{BC{{!qB