diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md
index 8277e1ec27..fcbba795f9 100644
--- a/ci/release/changelogs/next.md
+++ b/ci/release/changelogs/next.md
@@ -4,6 +4,7 @@
- Composition: Imported boards can use underscores to reference boards beyond its own
scope (e.g. to a sibling board at the scope its imported to) [#2075](https://github.com/terrastruct/d2/pull/2075)
- Autoformat: Reserved keywords are formatted to be lowercase [#2098](https://github.com/terrastruct/d2/pull/2098)
+- Misc: characters in the unicode range for Latin-1 and geometric shapes are measured more accurately [#2100](https://github.com/terrastruct/d2/pull/2100)
#### Improvements 🧹
diff --git a/e2etests/testdata/txtar/extended-ascii/dagre/board.exp.json b/e2etests/testdata/txtar/extended-ascii/dagre/board.exp.json
new file mode 100644
index 0000000000..f9ec463121
--- /dev/null
+++ b/e2etests/testdata/txtar/extended-ascii/dagre/board.exp.json
@@ -0,0 +1,433 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "1",
+ "type": "text",
+ "pos": {
+ "x": 32,
+ "y": 0
+ },
+ "width": 102,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "ÇéþüðæØÅßñò",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 102,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2",
+ "type": "text",
+ "pos": {
+ "x": 3,
+ "y": 124
+ },
+ "width": 79,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "òØõùßÍÿåÆ",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 79,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3",
+ "type": "text",
+ "pos": {
+ "x": 0,
+ "y": 248
+ },
+ "width": 84,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "çÆÐÞ©ßþúí",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 84,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4",
+ "type": "text",
+ "pos": {
+ "x": 57,
+ "y": 372
+ },
+ "width": 52,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "ÉáøÿÑö",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 52,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": [
+ {
+ "id": "(1 -> 2)[0]",
+ "src": "1",
+ "srcArrow": "none",
+ "dst": "2",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 75,
+ "y": 24
+ },
+ {
+ "x": 48.5989990234375,
+ "y": 64
+ },
+ {
+ "x": 42,
+ "y": 84
+ },
+ {
+ "x": 42,
+ "y": 124
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2 -> 3)[0]",
+ "src": "2",
+ "srcArrow": "none",
+ "dst": "3",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 42,
+ "y": 148
+ },
+ {
+ "x": 42,
+ "y": 188
+ },
+ {
+ "x": 42,
+ "y": 208
+ },
+ {
+ "x": 42,
+ "y": 248
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(3 -> 4)[0]",
+ "src": "3",
+ "srcArrow": "none",
+ "dst": "4",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 42,
+ "y": 272
+ },
+ {
+ "x": 42,
+ "y": 312
+ },
+ {
+ "x": 48.599998474121094,
+ "y": 332
+ },
+ {
+ "x": 75,
+ "y": 372
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(4 -> 1)[0]",
+ "src": "4",
+ "srcArrow": "none",
+ "dst": "1",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 91,
+ "y": 372
+ },
+ {
+ "x": 117.4000015258789,
+ "y": 332
+ },
+ {
+ "x": 124,
+ "y": 309.6000061035156
+ },
+ {
+ "x": 124,
+ "y": 291
+ },
+ {
+ "x": 124,
+ "y": 272.3999938964844
+ },
+ {
+ "x": 124,
+ "y": 247.60000610351562
+ },
+ {
+ "x": 124,
+ "y": 229
+ },
+ {
+ "x": 124,
+ "y": 210.39999389648438
+ },
+ {
+ "x": 124,
+ "y": 185.60000610351562
+ },
+ {
+ "x": 124,
+ "y": 167
+ },
+ {
+ "x": 124,
+ "y": 148.39999389648438
+ },
+ {
+ "x": 117.4000015258789,
+ "y": 64
+ },
+ {
+ "x": 91,
+ "y": 24
+ }
+ ],
+ "isCurve": true,
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/txtar/extended-ascii/dagre/sketch.exp.svg b/e2etests/testdata/txtar/extended-ascii/dagre/sketch.exp.svg
new file mode 100644
index 0000000000..1e3bdfa125
--- /dev/null
+++ b/e2etests/testdata/txtar/extended-ascii/dagre/sketch.exp.svg
@@ -0,0 +1,842 @@
+
\ No newline at end of file
diff --git a/e2etests/testdata/txtar/extended-ascii/elk/board.exp.json b/e2etests/testdata/txtar/extended-ascii/elk/board.exp.json
new file mode 100644
index 0000000000..8c98196d60
--- /dev/null
+++ b/e2etests/testdata/txtar/extended-ascii/elk/board.exp.json
@@ -0,0 +1,385 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "1",
+ "type": "text",
+ "pos": {
+ "x": 44,
+ "y": 12
+ },
+ "width": 102,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "ÇéþüðæØÅßñò",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 102,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "2",
+ "type": "text",
+ "pos": {
+ "x": 14,
+ "y": 116
+ },
+ "width": 79,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "òØõùßÍÿåÆ",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 79,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "3",
+ "type": "text",
+ "pos": {
+ "x": 12,
+ "y": 210
+ },
+ "width": 84,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "çÆÐÞ©ßþúí",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 84,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "4",
+ "type": "text",
+ "pos": {
+ "x": 69,
+ "y": 314
+ },
+ "width": 52,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "ÉáøÿÑö",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 52,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": [
+ {
+ "id": "(1 -> 2)[0]",
+ "src": "1",
+ "srcArrow": "none",
+ "dst": "2",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 78,
+ "y": 36
+ },
+ {
+ "x": 78,
+ "y": 116
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(2 -> 3)[0]",
+ "src": "2",
+ "srcArrow": "none",
+ "dst": "3",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 54,
+ "y": 140
+ },
+ {
+ "x": 54,
+ "y": 210
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(3 -> 4)[0]",
+ "src": "3",
+ "srcArrow": "none",
+ "dst": "4",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 54,
+ "y": 234
+ },
+ {
+ "x": 54,
+ "y": 274
+ },
+ {
+ "x": 86.33300018310547,
+ "y": 274
+ },
+ {
+ "x": 86.33300018310547,
+ "y": 314
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ },
+ {
+ "id": "(4 -> 1)[0]",
+ "src": "4",
+ "srcArrow": "none",
+ "dst": "1",
+ "dstArrow": "triangle",
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "stroke": "B1",
+ "borderRadius": 10,
+ "label": "",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "",
+ "color": "N2",
+ "italic": true,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "labelPosition": "",
+ "labelPercentage": 0,
+ "route": [
+ {
+ "x": 103.66600036621094,
+ "y": 314
+ },
+ {
+ "x": 103.66600036621094,
+ "y": 274
+ },
+ {
+ "x": 136,
+ "y": 274
+ },
+ {
+ "x": 136,
+ "y": 76
+ },
+ {
+ "x": 112,
+ "y": 76
+ },
+ {
+ "x": 112,
+ "y": 36
+ }
+ ],
+ "animated": false,
+ "tooltip": "",
+ "icon": null,
+ "zIndex": 0
+ }
+ ],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/txtar/extended-ascii/elk/sketch.exp.svg b/e2etests/testdata/txtar/extended-ascii/elk/sketch.exp.svg
new file mode 100644
index 0000000000..a13fe050f3
--- /dev/null
+++ b/e2etests/testdata/txtar/extended-ascii/elk/sketch.exp.svg
@@ -0,0 +1,842 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/txtar/unicode/dagre/board.exp.json b/e2etests/testdata/txtar/unicode/dagre/board.exp.json
new file mode 100644
index 0000000000..61339f4771
--- /dev/null
+++ b/e2etests/testdata/txtar/unicode/dagre/board.exp.json
@@ -0,0 +1,528 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "■",
+ "type": "text",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "■ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "□",
+ "type": "text",
+ "pos": {
+ "x": 126,
+ "y": 0
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "□ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "●",
+ "type": "text",
+ "pos": {
+ "x": 248,
+ "y": 0
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "● foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "○",
+ "type": "text",
+ "pos": {
+ "x": 370,
+ "y": 0
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "○ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "◆",
+ "type": "text",
+ "pos": {
+ "x": 492,
+ "y": 0
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "◆ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "◇",
+ "type": "text",
+ "pos": {
+ "x": 618,
+ "y": 0
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "◇ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "▲",
+ "type": "text",
+ "pos": {
+ "x": 740,
+ "y": 0
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "▲ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "△",
+ "type": "text",
+ "pos": {
+ "x": 866,
+ "y": 0
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "△ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "▼",
+ "type": "text",
+ "pos": {
+ "x": 992,
+ "y": 0
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "▼ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "▽",
+ "type": "text",
+ "pos": {
+ "x": 1118,
+ "y": 0
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "▽ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "※",
+ "type": "text",
+ "pos": {
+ "x": 1244,
+ "y": 0
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "※ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "◎",
+ "type": "text",
+ "pos": {
+ "x": 1366,
+ "y": 0
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "◎ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": [],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/txtar/unicode/dagre/sketch.exp.svg b/e2etests/testdata/txtar/unicode/dagre/sketch.exp.svg
new file mode 100644
index 0000000000..3201635aac
--- /dev/null
+++ b/e2etests/testdata/txtar/unicode/dagre/sketch.exp.svg
@@ -0,0 +1,858 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/txtar/unicode/elk/board.exp.json b/e2etests/testdata/txtar/unicode/elk/board.exp.json
new file mode 100644
index 0000000000..8dca6ac7ab
--- /dev/null
+++ b/e2etests/testdata/txtar/unicode/elk/board.exp.json
@@ -0,0 +1,528 @@
+{
+ "name": "",
+ "isFolderOnly": false,
+ "fontFamily": "SourceSansPro",
+ "shapes": [
+ {
+ "id": "■",
+ "type": "text",
+ "pos": {
+ "x": 12,
+ "y": 12
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "■ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "□",
+ "type": "text",
+ "pos": {
+ "x": 98,
+ "y": 12
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "□ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "●",
+ "type": "text",
+ "pos": {
+ "x": 180,
+ "y": 12
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "● foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "○",
+ "type": "text",
+ "pos": {
+ "x": 262,
+ "y": 12
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "○ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "◆",
+ "type": "text",
+ "pos": {
+ "x": 344,
+ "y": 12
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "◆ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "◇",
+ "type": "text",
+ "pos": {
+ "x": 430,
+ "y": 12
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "◇ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "▲",
+ "type": "text",
+ "pos": {
+ "x": 512,
+ "y": 12
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "▲ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "△",
+ "type": "text",
+ "pos": {
+ "x": 598,
+ "y": 12
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "△ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "▼",
+ "type": "text",
+ "pos": {
+ "x": 684,
+ "y": 12
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "▼ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "▽",
+ "type": "text",
+ "pos": {
+ "x": 770,
+ "y": 12
+ },
+ "width": 66,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "▽ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 66,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "※",
+ "type": "text",
+ "pos": {
+ "x": 856,
+ "y": 12
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "※ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ },
+ {
+ "id": "◎",
+ "type": "text",
+ "pos": {
+ "x": 938,
+ "y": 12
+ },
+ "width": 62,
+ "height": 24,
+ "opacity": 1,
+ "strokeDash": 0,
+ "strokeWidth": 2,
+ "borderRadius": 0,
+ "fill": "transparent",
+ "stroke": "N1",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "◎ foo bar",
+ "fontSize": 16,
+ "fontFamily": "DEFAULT",
+ "language": "markdown",
+ "color": "N1",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 62,
+ "labelHeight": 24,
+ "zIndex": 0,
+ "level": 1
+ }
+ ],
+ "connections": [],
+ "root": {
+ "id": "",
+ "type": "",
+ "pos": {
+ "x": 0,
+ "y": 0
+ },
+ "width": 0,
+ "height": 0,
+ "opacity": 0,
+ "strokeDash": 0,
+ "strokeWidth": 0,
+ "borderRadius": 0,
+ "fill": "N7",
+ "stroke": "",
+ "shadow": false,
+ "3d": false,
+ "multiple": false,
+ "double-border": false,
+ "tooltip": "",
+ "link": "",
+ "icon": null,
+ "iconPosition": "",
+ "blend": false,
+ "fields": null,
+ "methods": null,
+ "columns": null,
+ "label": "",
+ "fontSize": 0,
+ "fontFamily": "",
+ "language": "",
+ "color": "",
+ "italic": false,
+ "bold": false,
+ "underline": false,
+ "labelWidth": 0,
+ "labelHeight": 0,
+ "zIndex": 0,
+ "level": 0
+ }
+}
diff --git a/e2etests/testdata/txtar/unicode/elk/sketch.exp.svg b/e2etests/testdata/txtar/unicode/elk/sketch.exp.svg
new file mode 100644
index 0000000000..d250f9cd53
--- /dev/null
+++ b/e2etests/testdata/txtar/unicode/elk/sketch.exp.svg
@@ -0,0 +1,858 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/unicode/mixed-language-2/dagre/board.exp.json b/e2etests/testdata/unicode/mixed-language-2/dagre/board.exp.json
index b1b7f04a82..34ac578d64 100644
--- a/e2etests/testdata/unicode/mixed-language-2/dagre/board.exp.json
+++ b/e2etests/testdata/unicode/mixed-language-2/dagre/board.exp.json
@@ -130,10 +130,10 @@
"id": "d",
"type": "rectangle",
"pos": {
- "x": 29,
+ "x": 32,
"y": 498
},
- "width": 244,
+ "width": 238,
"height": 66,
"opacity": 1,
"strokeDash": 0,
@@ -161,7 +161,7 @@
"italic": false,
"bold": true,
"underline": false,
- "labelWidth": 199,
+ "labelWidth": 193,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
@@ -294,10 +294,10 @@
"id": "h",
"type": "rectangle",
"pos": {
- "x": 368,
+ "x": 370,
"y": 498
},
- "width": 173,
+ "width": 170,
"height": 66,
"opacity": 1,
"strokeDash": 0,
@@ -325,7 +325,7 @@
"italic": false,
"bold": true,
"underline": false,
- "labelWidth": 128,
+ "labelWidth": 125,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
@@ -338,7 +338,7 @@
"x": 633,
"y": 0
},
- "width": 282,
+ "width": 273,
"height": 66,
"opacity": 1,
"strokeDash": 0,
@@ -366,7 +366,7 @@
"italic": false,
"bold": true,
"underline": false,
- "labelWidth": 237,
+ "labelWidth": 228,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
@@ -376,7 +376,7 @@
"id": "j",
"type": "rectangle",
"pos": {
- "x": 662,
+ "x": 658,
"y": 166
},
"width": 224,
@@ -417,7 +417,7 @@
"id": "k",
"type": "rectangle",
"pos": {
- "x": 642,
+ "x": 637,
"y": 332
},
"width": 265,
@@ -458,7 +458,7 @@
"id": "l",
"type": "rectangle",
"pos": {
- "x": 675,
+ "x": 670,
"y": 498
},
"width": 199,
@@ -499,7 +499,7 @@
"id": "m",
"type": "rectangle",
"pos": {
- "x": 975,
+ "x": 966,
"y": 0
},
"width": 255,
@@ -540,7 +540,7 @@
"id": "n",
"type": "rectangle",
"pos": {
- "x": 996,
+ "x": 987,
"y": 166
},
"width": 213,
@@ -581,7 +581,7 @@
"id": "o",
"type": "rectangle",
"pos": {
- "x": 1024,
+ "x": 1015,
"y": 332
},
"width": 158,
@@ -622,7 +622,7 @@
"id": "p",
"type": "rectangle",
"pos": {
- "x": 984,
+ "x": 975,
"y": 498
},
"width": 238,
@@ -663,7 +663,7 @@
"id": "\"မင်္ဂလာပါ (mingalaba) - Burmese\"",
"type": "rectangle",
"pos": {
- "x": 1290,
+ "x": 1281,
"y": 0
},
"width": 307,
@@ -704,7 +704,7 @@
"id": "\"сайн уу (sain uu) - Mongolian\"",
"type": "rectangle",
"pos": {
- "x": 1657,
+ "x": 1648,
"y": 0
},
"width": 264,
@@ -745,7 +745,7 @@
"id": "\"ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ (sat sri akal) - Punjabi\"",
"type": "rectangle",
"pos": {
- "x": 1981,
+ "x": 1972,
"y": 0
},
"width": 328,
@@ -786,10 +786,10 @@
"id": "\"你吃了吗 (ní chī le ma) - Mandarin Chinese\"",
"type": "rectangle",
"pos": {
- "x": 2369,
+ "x": 2360,
"y": 0
},
- "width": 370,
+ "width": 363,
"height": 66,
"opacity": 1,
"strokeDash": 0,
@@ -817,7 +817,7 @@
"italic": false,
"bold": true,
"underline": false,
- "labelWidth": 325,
+ "labelWidth": 318,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
@@ -827,7 +827,7 @@
"id": "\"饭 (fan) - Zhuang\"",
"type": "rectangle",
"pos": {
- "x": 2799,
+ "x": 2783,
"y": 0
},
"width": 167,
@@ -868,7 +868,7 @@
"id": "مەن سىزنى ياخشى ئۈمىد ق",
"type": "rectangle",
"pos": {
- "x": 3026,
+ "x": 3010,
"y": 0
},
"width": 266,
@@ -1214,19 +1214,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 774,
+ "x": 769.5,
"y": 66
},
{
- "x": 774,
+ "x": 769.5,
"y": 106
},
{
- "x": 774,
+ "x": 769.5,
"y": 126
},
{
- "x": 774,
+ "x": 769.5,
"y": 166
}
],
@@ -1261,19 +1261,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 774,
+ "x": 769.5,
"y": 232
},
{
- "x": 774,
+ "x": 769.5,
"y": 272
},
{
- "x": 774,
+ "x": 769.5,
"y": 292
},
{
- "x": 774,
+ "x": 769.5,
"y": 332
}
],
@@ -1308,19 +1308,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 774,
+ "x": 769.5,
"y": 398
},
{
- "x": 774,
+ "x": 769.5,
"y": 438
},
{
- "x": 774,
+ "x": 769.5,
"y": 458
},
{
- "x": 774,
+ "x": 769.5,
"y": 498
}
],
@@ -1355,19 +1355,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 66
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 106
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 126
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 166
}
],
@@ -1402,19 +1402,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 232
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 272
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 292
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 332
}
],
@@ -1449,19 +1449,19 @@
"labelPercentage": 0,
"route": [
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 398
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 438
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 458
},
{
- "x": 1102.5,
+ "x": 1093.5,
"y": 498
}
],
diff --git a/e2etests/testdata/unicode/mixed-language-2/dagre/sketch.exp.svg b/e2etests/testdata/unicode/mixed-language-2/dagre/sketch.exp.svg
index 7ff89251ec..5c576ed475 100644
--- a/e2etests/testdata/unicode/mixed-language-2/dagre/sketch.exp.svg
+++ b/e2etests/testdata/unicode/mixed-language-2/dagre/sketch.exp.svg
@@ -1,9 +1,9 @@
-我 (wǒ) - Mandarin Chineseສະບາຍດີ (sabaai dii) - Laoជំរាបសួរ (jomreab suor) - Khmerสวัสดี (sà-wàt-dii) - Thaiສະບາຍດີ (sabaidee) - Laoဟယ်လို (helaou) - Burmesemari (まり) - Ainucào (草) - Zhuangкүнтізбе (kúntízbe) - Kazakhբարև (barev) - Armenianмонгол (mongol) - Mongolianmila (میلا) - Uyghurનમસ્તે (namaste) - Gujarati漢字 (kanji) - Japanese위 (wi) - Korean吾哥 (ngǔgāi) - Cantoneseမင်္ဂလာပါ (mingalaba) - Burmeseсайн уу (sain uu) - Mongolianਸਤਿ ਸ੍ਰੀ ਅਕਾਲ (sat sri akal) - Punjabi你吃了吗 (ní chī le ma) - Mandarin Chinese饭 (fan) - Zhuangمەن سىزنى ياخشى ئۈمىد ق
-
+ .d2-841573658 .fill-N1{fill:#0A0F25;}
+ .d2-841573658 .fill-N2{fill:#676C7E;}
+ .d2-841573658 .fill-N3{fill:#9499AB;}
+ .d2-841573658 .fill-N4{fill:#CFD2DD;}
+ .d2-841573658 .fill-N5{fill:#DEE1EB;}
+ .d2-841573658 .fill-N6{fill:#EEF1F8;}
+ .d2-841573658 .fill-N7{fill:#FFFFFF;}
+ .d2-841573658 .fill-B1{fill:#0D32B2;}
+ .d2-841573658 .fill-B2{fill:#0D32B2;}
+ .d2-841573658 .fill-B3{fill:#E3E9FD;}
+ .d2-841573658 .fill-B4{fill:#E3E9FD;}
+ .d2-841573658 .fill-B5{fill:#EDF0FD;}
+ .d2-841573658 .fill-B6{fill:#F7F8FE;}
+ .d2-841573658 .fill-AA2{fill:#4A6FF3;}
+ .d2-841573658 .fill-AA4{fill:#EDF0FD;}
+ .d2-841573658 .fill-AA5{fill:#F7F8FE;}
+ .d2-841573658 .fill-AB4{fill:#EDF0FD;}
+ .d2-841573658 .fill-AB5{fill:#F7F8FE;}
+ .d2-841573658 .stroke-N1{stroke:#0A0F25;}
+ .d2-841573658 .stroke-N2{stroke:#676C7E;}
+ .d2-841573658 .stroke-N3{stroke:#9499AB;}
+ .d2-841573658 .stroke-N4{stroke:#CFD2DD;}
+ .d2-841573658 .stroke-N5{stroke:#DEE1EB;}
+ .d2-841573658 .stroke-N6{stroke:#EEF1F8;}
+ .d2-841573658 .stroke-N7{stroke:#FFFFFF;}
+ .d2-841573658 .stroke-B1{stroke:#0D32B2;}
+ .d2-841573658 .stroke-B2{stroke:#0D32B2;}
+ .d2-841573658 .stroke-B3{stroke:#E3E9FD;}
+ .d2-841573658 .stroke-B4{stroke:#E3E9FD;}
+ .d2-841573658 .stroke-B5{stroke:#EDF0FD;}
+ .d2-841573658 .stroke-B6{stroke:#F7F8FE;}
+ .d2-841573658 .stroke-AA2{stroke:#4A6FF3;}
+ .d2-841573658 .stroke-AA4{stroke:#EDF0FD;}
+ .d2-841573658 .stroke-AA5{stroke:#F7F8FE;}
+ .d2-841573658 .stroke-AB4{stroke:#EDF0FD;}
+ .d2-841573658 .stroke-AB5{stroke:#F7F8FE;}
+ .d2-841573658 .background-color-N1{background-color:#0A0F25;}
+ .d2-841573658 .background-color-N2{background-color:#676C7E;}
+ .d2-841573658 .background-color-N3{background-color:#9499AB;}
+ .d2-841573658 .background-color-N4{background-color:#CFD2DD;}
+ .d2-841573658 .background-color-N5{background-color:#DEE1EB;}
+ .d2-841573658 .background-color-N6{background-color:#EEF1F8;}
+ .d2-841573658 .background-color-N7{background-color:#FFFFFF;}
+ .d2-841573658 .background-color-B1{background-color:#0D32B2;}
+ .d2-841573658 .background-color-B2{background-color:#0D32B2;}
+ .d2-841573658 .background-color-B3{background-color:#E3E9FD;}
+ .d2-841573658 .background-color-B4{background-color:#E3E9FD;}
+ .d2-841573658 .background-color-B5{background-color:#EDF0FD;}
+ .d2-841573658 .background-color-B6{background-color:#F7F8FE;}
+ .d2-841573658 .background-color-AA2{background-color:#4A6FF3;}
+ .d2-841573658 .background-color-AA4{background-color:#EDF0FD;}
+ .d2-841573658 .background-color-AA5{background-color:#F7F8FE;}
+ .d2-841573658 .background-color-AB4{background-color:#EDF0FD;}
+ .d2-841573658 .background-color-AB5{background-color:#F7F8FE;}
+ .d2-841573658 .color-N1{color:#0A0F25;}
+ .d2-841573658 .color-N2{color:#676C7E;}
+ .d2-841573658 .color-N3{color:#9499AB;}
+ .d2-841573658 .color-N4{color:#CFD2DD;}
+ .d2-841573658 .color-N5{color:#DEE1EB;}
+ .d2-841573658 .color-N6{color:#EEF1F8;}
+ .d2-841573658 .color-N7{color:#FFFFFF;}
+ .d2-841573658 .color-B1{color:#0D32B2;}
+ .d2-841573658 .color-B2{color:#0D32B2;}
+ .d2-841573658 .color-B3{color:#E3E9FD;}
+ .d2-841573658 .color-B4{color:#E3E9FD;}
+ .d2-841573658 .color-B5{color:#EDF0FD;}
+ .d2-841573658 .color-B6{color:#F7F8FE;}
+ .d2-841573658 .color-AA2{color:#4A6FF3;}
+ .d2-841573658 .color-AA4{color:#EDF0FD;}
+ .d2-841573658 .color-AA5{color:#F7F8FE;}
+ .d2-841573658 .color-AB4{color:#EDF0FD;}
+ .d2-841573658 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]>我 (wǒ) - Mandarin Chineseສະບາຍດີ (sabaai dii) - Laoជំរាបសួរ (jomreab suor) - Khmerสวัสดี (sà-wàt-dii) - Thaiສະບາຍດີ (sabaidee) - Laoဟယ်လို (helaou) - Burmesemari (まり) - Ainucào (草) - Zhuangкүнтізбе (kúntízbe) - Kazakhբարև (barev) - Armenianмонгол (mongol) - Mongolianmila (میلا) - Uyghurનમસ્તે (namaste) - Gujarati漢字 (kanji) - Japanese위 (wi) - Korean吾哥 (ngǔgāi) - Cantoneseမင်္ဂလာပါ (mingalaba) - Burmeseсайн уу (sain uu) - Mongolianਸਤਿ ਸ੍ਰੀ ਅਕਾਲ (sat sri akal) - Punjabi你吃了吗 (ní chī le ma) - Mandarin Chinese饭 (fan) - Zhuangمەن سىزنى ياخشى ئۈمىد ق
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/testdata/unicode/mixed-language-2/elk/board.exp.json b/e2etests/testdata/unicode/mixed-language-2/elk/board.exp.json
index d7112ca954..d2273cf01e 100644
--- a/e2etests/testdata/unicode/mixed-language-2/elk/board.exp.json
+++ b/e2etests/testdata/unicode/mixed-language-2/elk/board.exp.json
@@ -130,10 +130,10 @@
"id": "d",
"type": "rectangle",
"pos": {
- "x": 40,
+ "x": 43,
"y": 420
},
- "width": 244,
+ "width": 238,
"height": 66,
"opacity": 1,
"strokeDash": 0,
@@ -161,7 +161,7 @@
"italic": false,
"bold": true,
"underline": false,
- "labelWidth": 199,
+ "labelWidth": 193,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
@@ -294,10 +294,10 @@
"id": "h",
"type": "rectangle",
"pos": {
- "x": 340,
+ "x": 341,
"y": 420
},
- "width": 173,
+ "width": 170,
"height": 66,
"opacity": 1,
"strokeDash": 0,
@@ -325,7 +325,7 @@
"italic": false,
"bold": true,
"underline": false,
- "labelWidth": 128,
+ "labelWidth": 125,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
@@ -338,7 +338,7 @@
"x": 565,
"y": 12
},
- "width": 282,
+ "width": 273,
"height": 66,
"opacity": 1,
"strokeDash": 0,
@@ -366,7 +366,7 @@
"italic": false,
"bold": true,
"underline": false,
- "labelWidth": 237,
+ "labelWidth": 228,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
@@ -376,7 +376,7 @@
"id": "j",
"type": "rectangle",
"pos": {
- "x": 594,
+ "x": 589,
"y": 148
},
"width": 224,
@@ -417,7 +417,7 @@
"id": "k",
"type": "rectangle",
"pos": {
- "x": 573,
+ "x": 569,
"y": 284
},
"width": 265,
@@ -458,7 +458,7 @@
"id": "l",
"type": "rectangle",
"pos": {
- "x": 606,
+ "x": 602,
"y": 420
},
"width": 199,
@@ -499,7 +499,7 @@
"id": "m",
"type": "rectangle",
"pos": {
- "x": 867,
+ "x": 858,
"y": 12
},
"width": 255,
@@ -540,7 +540,7 @@
"id": "n",
"type": "rectangle",
"pos": {
- "x": 888,
+ "x": 879,
"y": 148
},
"width": 213,
@@ -581,7 +581,7 @@
"id": "o",
"type": "rectangle",
"pos": {
- "x": 915,
+ "x": 906,
"y": 284
},
"width": 158,
@@ -622,7 +622,7 @@
"id": "p",
"type": "rectangle",
"pos": {
- "x": 875,
+ "x": 866,
"y": 420
},
"width": 238,
@@ -663,7 +663,7 @@
"id": "\"မင်္ဂလာပါ (mingalaba) - Burmese\"",
"type": "rectangle",
"pos": {
- "x": 1142,
+ "x": 1133,
"y": 12
},
"width": 307,
@@ -704,7 +704,7 @@
"id": "\"сайн уу (sain uu) - Mongolian\"",
"type": "rectangle",
"pos": {
- "x": 1469,
+ "x": 1460,
"y": 12
},
"width": 264,
@@ -745,7 +745,7 @@
"id": "\"ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ (sat sri akal) - Punjabi\"",
"type": "rectangle",
"pos": {
- "x": 1753,
+ "x": 1744,
"y": 12
},
"width": 328,
@@ -786,10 +786,10 @@
"id": "\"你吃了吗 (ní chī le ma) - Mandarin Chinese\"",
"type": "rectangle",
"pos": {
- "x": 2101,
+ "x": 2092,
"y": 12
},
- "width": 370,
+ "width": 363,
"height": 66,
"opacity": 1,
"strokeDash": 0,
@@ -817,7 +817,7 @@
"italic": false,
"bold": true,
"underline": false,
- "labelWidth": 325,
+ "labelWidth": 318,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
@@ -827,7 +827,7 @@
"id": "\"饭 (fan) - Zhuang\"",
"type": "rectangle",
"pos": {
- "x": 2491,
+ "x": 2475,
"y": 12
},
"width": 167,
@@ -868,7 +868,7 @@
"id": "مەن سىزنى ياخشى ئۈمىد ق",
"type": "rectangle",
"pos": {
- "x": 2678,
+ "x": 2662,
"y": 12
},
"width": 266,
@@ -1160,11 +1160,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 706,
+ "x": 701.5,
"y": 78
},
{
- "x": 706,
+ "x": 701.5,
"y": 148
}
],
@@ -1198,11 +1198,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 706,
+ "x": 701.5,
"y": 214
},
{
- "x": 706,
+ "x": 701.5,
"y": 284
}
],
@@ -1236,11 +1236,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 706,
+ "x": 701.5,
"y": 350
},
{
- "x": 706,
+ "x": 701.5,
"y": 420
}
],
@@ -1274,11 +1274,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 994.5,
+ "x": 985.5,
"y": 78
},
{
- "x": 994.5,
+ "x": 985.5,
"y": 148
}
],
@@ -1312,11 +1312,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 994.5,
+ "x": 985.5,
"y": 214
},
{
- "x": 994.5,
+ "x": 985.5,
"y": 284
}
],
@@ -1350,11 +1350,11 @@
"labelPercentage": 0,
"route": [
{
- "x": 994.5,
+ "x": 985.5,
"y": 350
},
{
- "x": 994.5,
+ "x": 985.5,
"y": 420
}
],
diff --git a/e2etests/testdata/unicode/mixed-language-2/elk/sketch.exp.svg b/e2etests/testdata/unicode/mixed-language-2/elk/sketch.exp.svg
index b0ada55575..fc9244359e 100644
--- a/e2etests/testdata/unicode/mixed-language-2/elk/sketch.exp.svg
+++ b/e2etests/testdata/unicode/mixed-language-2/elk/sketch.exp.svg
@@ -1,9 +1,9 @@
-我 (wǒ) - Mandarin Chineseສະບາຍດີ (sabaai dii) - Laoជំរាបសួរ (jomreab suor) - Khmerสวัสดี (sà-wàt-dii) - Thaiສະບາຍດີ (sabaidee) - Laoဟယ်လို (helaou) - Burmesemari (まり) - Ainucào (草) - Zhuangкүнтізбе (kúntízbe) - Kazakhբարև (barev) - Armenianмонгол (mongol) - Mongolianmila (میلا) - Uyghurનમસ્તે (namaste) - Gujarati漢字 (kanji) - Japanese위 (wi) - Korean吾哥 (ngǔgāi) - Cantoneseမင်္ဂလာပါ (mingalaba) - Burmeseсайн уу (sain uu) - Mongolianਸਤਿ ਸ੍ਰੀ ਅਕਾਲ (sat sri akal) - Punjabi你吃了吗 (ní chī le ma) - Mandarin Chinese饭 (fan) - Zhuangمەن سىزنى ياخشى ئۈمىد ق
-
+ .d2-801881618 .fill-N1{fill:#0A0F25;}
+ .d2-801881618 .fill-N2{fill:#676C7E;}
+ .d2-801881618 .fill-N3{fill:#9499AB;}
+ .d2-801881618 .fill-N4{fill:#CFD2DD;}
+ .d2-801881618 .fill-N5{fill:#DEE1EB;}
+ .d2-801881618 .fill-N6{fill:#EEF1F8;}
+ .d2-801881618 .fill-N7{fill:#FFFFFF;}
+ .d2-801881618 .fill-B1{fill:#0D32B2;}
+ .d2-801881618 .fill-B2{fill:#0D32B2;}
+ .d2-801881618 .fill-B3{fill:#E3E9FD;}
+ .d2-801881618 .fill-B4{fill:#E3E9FD;}
+ .d2-801881618 .fill-B5{fill:#EDF0FD;}
+ .d2-801881618 .fill-B6{fill:#F7F8FE;}
+ .d2-801881618 .fill-AA2{fill:#4A6FF3;}
+ .d2-801881618 .fill-AA4{fill:#EDF0FD;}
+ .d2-801881618 .fill-AA5{fill:#F7F8FE;}
+ .d2-801881618 .fill-AB4{fill:#EDF0FD;}
+ .d2-801881618 .fill-AB5{fill:#F7F8FE;}
+ .d2-801881618 .stroke-N1{stroke:#0A0F25;}
+ .d2-801881618 .stroke-N2{stroke:#676C7E;}
+ .d2-801881618 .stroke-N3{stroke:#9499AB;}
+ .d2-801881618 .stroke-N4{stroke:#CFD2DD;}
+ .d2-801881618 .stroke-N5{stroke:#DEE1EB;}
+ .d2-801881618 .stroke-N6{stroke:#EEF1F8;}
+ .d2-801881618 .stroke-N7{stroke:#FFFFFF;}
+ .d2-801881618 .stroke-B1{stroke:#0D32B2;}
+ .d2-801881618 .stroke-B2{stroke:#0D32B2;}
+ .d2-801881618 .stroke-B3{stroke:#E3E9FD;}
+ .d2-801881618 .stroke-B4{stroke:#E3E9FD;}
+ .d2-801881618 .stroke-B5{stroke:#EDF0FD;}
+ .d2-801881618 .stroke-B6{stroke:#F7F8FE;}
+ .d2-801881618 .stroke-AA2{stroke:#4A6FF3;}
+ .d2-801881618 .stroke-AA4{stroke:#EDF0FD;}
+ .d2-801881618 .stroke-AA5{stroke:#F7F8FE;}
+ .d2-801881618 .stroke-AB4{stroke:#EDF0FD;}
+ .d2-801881618 .stroke-AB5{stroke:#F7F8FE;}
+ .d2-801881618 .background-color-N1{background-color:#0A0F25;}
+ .d2-801881618 .background-color-N2{background-color:#676C7E;}
+ .d2-801881618 .background-color-N3{background-color:#9499AB;}
+ .d2-801881618 .background-color-N4{background-color:#CFD2DD;}
+ .d2-801881618 .background-color-N5{background-color:#DEE1EB;}
+ .d2-801881618 .background-color-N6{background-color:#EEF1F8;}
+ .d2-801881618 .background-color-N7{background-color:#FFFFFF;}
+ .d2-801881618 .background-color-B1{background-color:#0D32B2;}
+ .d2-801881618 .background-color-B2{background-color:#0D32B2;}
+ .d2-801881618 .background-color-B3{background-color:#E3E9FD;}
+ .d2-801881618 .background-color-B4{background-color:#E3E9FD;}
+ .d2-801881618 .background-color-B5{background-color:#EDF0FD;}
+ .d2-801881618 .background-color-B6{background-color:#F7F8FE;}
+ .d2-801881618 .background-color-AA2{background-color:#4A6FF3;}
+ .d2-801881618 .background-color-AA4{background-color:#EDF0FD;}
+ .d2-801881618 .background-color-AA5{background-color:#F7F8FE;}
+ .d2-801881618 .background-color-AB4{background-color:#EDF0FD;}
+ .d2-801881618 .background-color-AB5{background-color:#F7F8FE;}
+ .d2-801881618 .color-N1{color:#0A0F25;}
+ .d2-801881618 .color-N2{color:#676C7E;}
+ .d2-801881618 .color-N3{color:#9499AB;}
+ .d2-801881618 .color-N4{color:#CFD2DD;}
+ .d2-801881618 .color-N5{color:#DEE1EB;}
+ .d2-801881618 .color-N6{color:#EEF1F8;}
+ .d2-801881618 .color-N7{color:#FFFFFF;}
+ .d2-801881618 .color-B1{color:#0D32B2;}
+ .d2-801881618 .color-B2{color:#0D32B2;}
+ .d2-801881618 .color-B3{color:#E3E9FD;}
+ .d2-801881618 .color-B4{color:#E3E9FD;}
+ .d2-801881618 .color-B5{color:#EDF0FD;}
+ .d2-801881618 .color-B6{color:#F7F8FE;}
+ .d2-801881618 .color-AA2{color:#4A6FF3;}
+ .d2-801881618 .color-AA4{color:#EDF0FD;}
+ .d2-801881618 .color-AA5{color:#F7F8FE;}
+ .d2-801881618 .color-AB4{color:#EDF0FD;}
+ .d2-801881618 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]>我 (wǒ) - Mandarin Chineseສະບາຍດີ (sabaai dii) - Laoជំរាបសួរ (jomreab suor) - Khmerสวัสดี (sà-wàt-dii) - Thaiສະບາຍດີ (sabaidee) - Laoဟယ်လို (helaou) - Burmesemari (まり) - Ainucào (草) - Zhuangкүнтізбе (kúntízbe) - Kazakhբարև (barev) - Armenianмонгол (mongol) - Mongolianmila (میلا) - Uyghurનમસ્તે (namaste) - Gujarati漢字 (kanji) - Japanese위 (wi) - Korean吾哥 (ngǔgāi) - Cantoneseမင်္ဂလာပါ (mingalaba) - Burmeseсайн уу (sain uu) - Mongolianਸਤਿ ਸ੍ਰੀ ਅਕਾਲ (sat sri akal) - Punjabi你吃了吗 (ní chī le ma) - Mandarin Chinese饭 (fan) - Zhuangمەن سىزنى ياخشى ئۈمىد ق
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2etests/txtar.txt b/e2etests/txtar.txt
index 3c2f7f0282..3a95203ba5 100644
--- a/e2etests/txtar.txt
+++ b/e2etests/txtar.txt
@@ -402,3 +402,56 @@ customer -> item: true
alice -> bob: What does it mean\nto be well-adjusted?
bob -> alice: The ability to play bridge or\ngolf as if they were games.
+
+-- extended-ascii --
+1: |md
+ ÇéþüðæØÅßñò
+|
+2: |md
+ òØõùßÍÿåÆ
+|
+3: |md
+ çÆÐÞ©ßþúí
+|
+4: |md
+ ÉáøÿÑö
+|
+1 -> 2 -> 3 -> 4 -> 1
+
+-- unicode --
+■: |md
+ ■ foo bar
+|
+□: |md
+ □ foo bar
+|
+●: |md
+ ● foo bar
+|
+○: |md
+ ○ foo bar
+|
+◆: |md
+ ◆ foo bar
+|
+◇: |md
+ ◇ foo bar
+|
+▲: |md
+ ▲ foo bar
+|
+△: |md
+ △ foo bar
+|
+▼: |md
+ ▼ foo bar
+|
+▽: |md
+ ▽ foo bar
+|
+※: |md
+ ※ foo bar
+|
+◎: |md
+ ◎ foo bar
+|
diff --git a/lib/textmeasure/textmeasure.go b/lib/textmeasure/textmeasure.go
index 294987c057..81c8fa5ba1 100644
--- a/lib/textmeasure/textmeasure.go
+++ b/lib/textmeasure/textmeasure.go
@@ -6,7 +6,6 @@ package textmeasure
import (
"math"
"strings"
- "unicode"
"unicode/utf8"
"github.com/golang/freetype/truetype"
@@ -20,13 +19,23 @@ const TAB_SIZE = 4
const SIZELESS_FONT_SIZE = 0
const CODE_LINE_HEIGHT = 1.3
-// ASCII is a set of all ASCII runes. These runes are codepoints from 32 to 127 inclusive.
-var ASCII []rune
+// Runes encompasses ASCII, Latin-1, and geometric shapes like black square
+var Runes []rune
func init() {
- ASCII = make([]rune, unicode.MaxASCII-32)
- for i := range ASCII {
- ASCII[i] = rune(32 + i)
+ // ASCII range (U+0000 to U+007F)
+ for r := rune(0x0000); r <= rune(0x007F); r++ {
+ Runes = append(Runes, r)
+ }
+
+ // Latin-1 Supplement (U+0080 to U+00FF)
+ for r := rune(0x0080); r <= rune(0x00FF); r++ {
+ Runes = append(Runes, r)
+ }
+
+ // Geometric Shapes (U+25A0 to U+25FF)
+ for r := rune(0x25A0); r <= rune(0x25FF); r++ {
+ Runes = append(Runes, r)
}
}
@@ -167,7 +176,7 @@ func (r *Ruler) addFontSize(font d2fonts.Font) {
face := truetype.NewFace(r.ttfs[sizeless], &truetype.Options{
Size: float64(font.Size),
})
- atlas := NewAtlas(face, ASCII)
+ atlas := NewAtlas(face, Runes)
r.atlases[font] = atlas
r.lineHeights[font] = atlas.lineHeight
r.tabWidths[font] = atlas.glyph(' ').advance * TAB_SIZE