diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md index 867eb6998..4c437fbfa 100644 --- a/ci/release/changelogs/next.md +++ b/ci/release/changelogs/next.md @@ -1,7 +1,7 @@ #### Features 🚀 - UTF-16 files are automatically detected and supported [#1525](https://github.com/terrastruct/d2/pull/1525) -- Grid diagrams can now have edges between cells [#1586](https://github.com/terrastruct/d2/pull/1586) +- Grid diagrams can now have simple edges between cells [#1586](https://github.com/terrastruct/d2/pull/1586) #### Improvements 🧹 diff --git a/e2etests/testdata/files/simple_grid_edges.d2 b/e2etests/testdata/files/simple_grid_edges.d2 index d9628f50a..79c632a32 100644 --- a/e2etests/testdata/files/simple_grid_edges.d2 +++ b/e2etests/testdata/files/simple_grid_edges.d2 @@ -4,7 +4,7 @@ horizontal-gap: 20 *.class: [text; blue] -a: { +0,0: { label: "npm i -g\n@forge/cli" style: { fill: "#30304c" @@ -16,26 +16,26 @@ a: { } } -b: { +0,1: { label: "Set up an\nAtlassian site" class: [text; gray] } -c.class: empty -d: { +0,2.class: empty +0,3: { label: "View the hello\nworld app" class: [text; gray] } -e: forge\ntunnel -f: forge\nlogin -g: forge\ncreate -h: forge\ndeploy -i: forge\ninstall -j: { +0,4: forge\ntunnel +1,0: forge\nlogin +1,1: forge\ncreate +1,2: forge\ndeploy +1,3: forge\ninstall +1,4: { shape: diamond label: "Hot reload\nchanges?" class: [text; gray] } -k: "" { +2,0: "" { grid-rows: 3 grid-columns: 1 grid-gap: 0 @@ -67,10 +67,30 @@ k: "" { style.font-color: "#cecece" } } -l.class: empty -m.class: empty -n.class: empty -o: forge\ndeploy +2,1.class: empty +2,2.class: empty +2,3.class: empty +2,4: forge\ndeploy + +0,0 -> 1,0 -> 1,1 -> 1,2 -> 1,3 -> 1,4: { + class: arrow +} +1,1 -> 0,1: { + class: arrow + style.stroke: "#cecece" +} +1,3 -> 0,3: { + class: arrow + style.stroke: "#cecece" +} +1,4 -> 0,4: Yes { + class: arrow + style.font-size: 10 +} +1,4 -> 2,4: No { + class: arrow + style.font-size: 10 +} classes: { text.style: { @@ -111,23 +131,3 @@ classes: { } } } - -a -> f -> g -> h -> i -> j: { - class: arrow -} -g -> b: { - class: arrow - style.stroke: "#cecece" -} -i -> d: { - class: arrow - style.stroke: "#cecece" -} -j -> e: Yes { - class: arrow - style.font-size: 10 -} -j -> o: No { - class: arrow - style.font-size: 10 -} diff --git a/e2etests/testdata/stable/simple_grid_edges/dagre/board.exp.json b/e2etests/testdata/stable/simple_grid_edges/dagre/board.exp.json index 66e053be1..1f3e3d490 100644 --- a/e2etests/testdata/stable/simple_grid_edges/dagre/board.exp.json +++ b/e2etests/testdata/stable/simple_grid_edges/dagre/board.exp.json @@ -4,7 +4,7 @@ "fontFamily": "SourceSansPro", "shapes": [ { - "id": "a", + "id": "0,0", "type": "rectangle", "classes": [ "text", @@ -49,7 +49,7 @@ "level": 1 }, { - "id": "b", + "id": "0,1", "type": "rectangle", "classes": [ "text", @@ -94,7 +94,7 @@ "level": 1 }, { - "id": "c", + "id": "0,2", "type": "rectangle", "classes": [ "empty" @@ -138,7 +138,7 @@ "level": 1 }, { - "id": "d", + "id": "0,3", "type": "rectangle", "classes": [ "text", @@ -183,7 +183,7 @@ "level": 1 }, { - "id": "e", + "id": "0,4", "type": "rectangle", "classes": [ "text", @@ -228,7 +228,7 @@ "level": 1 }, { - "id": "f", + "id": "1,0", "type": "rectangle", "classes": [ "text", @@ -273,7 +273,7 @@ "level": 1 }, { - "id": "g", + "id": "1,1", "type": "rectangle", "classes": [ "text", @@ -318,7 +318,7 @@ "level": 1 }, { - "id": "h", + "id": "1,2", "type": "rectangle", "classes": [ "text", @@ -363,7 +363,7 @@ "level": 1 }, { - "id": "i", + "id": "1,3", "type": "rectangle", "classes": [ "text", @@ -408,7 +408,7 @@ "level": 1 }, { - "id": "j", + "id": "1,4", "type": "diamond", "classes": [ "text", @@ -453,7 +453,7 @@ "level": 1 }, { - "id": "k", + "id": "2,0", "type": "rectangle", "pos": { "x": 0, @@ -494,7 +494,7 @@ "level": 1 }, { - "id": "k.a", + "id": "2,0.a", "type": "rectangle", "pos": { "x": 0, @@ -535,7 +535,7 @@ "level": 2 }, { - "id": "k.b", + "id": "2,0.b", "type": "rectangle", "pos": { "x": 0, @@ -576,7 +576,7 @@ "level": 2 }, { - "id": "k.c", + "id": "2,0.c", "type": "rectangle", "pos": { "x": 0, @@ -617,7 +617,7 @@ "level": 2 }, { - "id": "l", + "id": "2,1", "type": "rectangle", "classes": [ "empty" @@ -661,7 +661,7 @@ "level": 1 }, { - "id": "m", + "id": "2,2", "type": "rectangle", "classes": [ "empty" @@ -705,7 +705,7 @@ "level": 1 }, { - "id": "n", + "id": "2,3", "type": "rectangle", "classes": [ "empty" @@ -749,7 +749,7 @@ "level": 1 }, { - "id": "o", + "id": "2,4", "type": "rectangle", "classes": [ "text", @@ -796,13 +796,13 @@ ], "connections": [ { - "id": "(a -> f)[0]", + "id": "(0,0 -> 1,0)[0]", "classes": [ "arrow" ], - "src": "a", + "src": "0,0", "srcArrow": "none", - "dst": "f", + "dst": "1,0", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -837,13 +837,13 @@ "zIndex": 0 }, { - "id": "(f -> g)[0]", + "id": "(1,0 -> 1,1)[0]", "classes": [ "arrow" ], - "src": "f", + "src": "1,0", "srcArrow": "none", - "dst": "g", + "dst": "1,1", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -878,13 +878,13 @@ "zIndex": 0 }, { - "id": "(g -> h)[0]", + "id": "(1,1 -> 1,2)[0]", "classes": [ "arrow" ], - "src": "g", + "src": "1,1", "srcArrow": "none", - "dst": "h", + "dst": "1,2", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -919,13 +919,13 @@ "zIndex": 0 }, { - "id": "(h -> i)[0]", + "id": "(1,2 -> 1,3)[0]", "classes": [ "arrow" ], - "src": "h", + "src": "1,2", "srcArrow": "none", - "dst": "i", + "dst": "1,3", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -960,13 +960,13 @@ "zIndex": 0 }, { - "id": "(i -> j)[0]", + "id": "(1,3 -> 1,4)[0]", "classes": [ "arrow" ], - "src": "i", + "src": "1,3", "srcArrow": "none", - "dst": "j", + "dst": "1,4", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -1001,13 +1001,13 @@ "zIndex": 0 }, { - "id": "(g -> b)[0]", + "id": "(1,1 -> 0,1)[0]", "classes": [ "arrow" ], - "src": "g", + "src": "1,1", "srcArrow": "none", - "dst": "b", + "dst": "0,1", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -1042,13 +1042,13 @@ "zIndex": 0 }, { - "id": "(i -> d)[0]", + "id": "(1,3 -> 0,3)[0]", "classes": [ "arrow" ], - "src": "i", + "src": "1,3", "srcArrow": "none", - "dst": "d", + "dst": "0,3", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -1083,13 +1083,13 @@ "zIndex": 0 }, { - "id": "(j -> e)[0]", + "id": "(1,4 -> 0,4)[0]", "classes": [ "arrow" ], - "src": "j", + "src": "1,4", "srcArrow": "none", - "dst": "e", + "dst": "0,4", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -1124,13 +1124,13 @@ "zIndex": 0 }, { - "id": "(j -> o)[0]", + "id": "(1,4 -> 2,4)[0]", "classes": [ "arrow" ], - "src": "j", + "src": "1,4", "srcArrow": "none", - "dst": "o", + "dst": "2,4", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, diff --git a/e2etests/testdata/stable/simple_grid_edges/dagre/sketch.exp.svg b/e2etests/testdata/stable/simple_grid_edges/dagre/sketch.exp.svg index 7194aedc7..d57150a7d 100644 --- a/e2etests/testdata/stable/simple_grid_edges/dagre/sketch.exp.svg +++ b/e2etests/testdata/stable/simple_grid_edges/dagre/sketch.exp.svg @@ -1,23 +1,23 @@ -npm i -g@forge/cliSet up anAtlassian siteView the helloworld appforgetunnelforgeloginforgecreateforgedeployforgeinstallHot reloadchanges?forgedeploy⬤ Forge CLI⬤ Required⬤ Optional YesNo + .d2-2096830999 .fill-N1{fill:#0A0F25;} + .d2-2096830999 .fill-N2{fill:#676C7E;} + .d2-2096830999 .fill-N3{fill:#9499AB;} + .d2-2096830999 .fill-N4{fill:#CFD2DD;} + .d2-2096830999 .fill-N5{fill:#DEE1EB;} + .d2-2096830999 .fill-N6{fill:#EEF1F8;} + .d2-2096830999 .fill-N7{fill:#FFFFFF;} + .d2-2096830999 .fill-B1{fill:#0D32B2;} + .d2-2096830999 .fill-B2{fill:#0D32B2;} + .d2-2096830999 .fill-B3{fill:#E3E9FD;} + .d2-2096830999 .fill-B4{fill:#E3E9FD;} + .d2-2096830999 .fill-B5{fill:#EDF0FD;} + .d2-2096830999 .fill-B6{fill:#F7F8FE;} + .d2-2096830999 .fill-AA2{fill:#4A6FF3;} + .d2-2096830999 .fill-AA4{fill:#EDF0FD;} + .d2-2096830999 .fill-AA5{fill:#F7F8FE;} + .d2-2096830999 .fill-AB4{fill:#EDF0FD;} + .d2-2096830999 .fill-AB5{fill:#F7F8FE;} + .d2-2096830999 .stroke-N1{stroke:#0A0F25;} + .d2-2096830999 .stroke-N2{stroke:#676C7E;} + .d2-2096830999 .stroke-N3{stroke:#9499AB;} + .d2-2096830999 .stroke-N4{stroke:#CFD2DD;} + .d2-2096830999 .stroke-N5{stroke:#DEE1EB;} + .d2-2096830999 .stroke-N6{stroke:#EEF1F8;} + .d2-2096830999 .stroke-N7{stroke:#FFFFFF;} + .d2-2096830999 .stroke-B1{stroke:#0D32B2;} + .d2-2096830999 .stroke-B2{stroke:#0D32B2;} + .d2-2096830999 .stroke-B3{stroke:#E3E9FD;} + .d2-2096830999 .stroke-B4{stroke:#E3E9FD;} + .d2-2096830999 .stroke-B5{stroke:#EDF0FD;} + .d2-2096830999 .stroke-B6{stroke:#F7F8FE;} + .d2-2096830999 .stroke-AA2{stroke:#4A6FF3;} + .d2-2096830999 .stroke-AA4{stroke:#EDF0FD;} + .d2-2096830999 .stroke-AA5{stroke:#F7F8FE;} + .d2-2096830999 .stroke-AB4{stroke:#EDF0FD;} + .d2-2096830999 .stroke-AB5{stroke:#F7F8FE;} + .d2-2096830999 .background-color-N1{background-color:#0A0F25;} + .d2-2096830999 .background-color-N2{background-color:#676C7E;} + .d2-2096830999 .background-color-N3{background-color:#9499AB;} + .d2-2096830999 .background-color-N4{background-color:#CFD2DD;} + .d2-2096830999 .background-color-N5{background-color:#DEE1EB;} + .d2-2096830999 .background-color-N6{background-color:#EEF1F8;} + .d2-2096830999 .background-color-N7{background-color:#FFFFFF;} + .d2-2096830999 .background-color-B1{background-color:#0D32B2;} + .d2-2096830999 .background-color-B2{background-color:#0D32B2;} + .d2-2096830999 .background-color-B3{background-color:#E3E9FD;} + .d2-2096830999 .background-color-B4{background-color:#E3E9FD;} + .d2-2096830999 .background-color-B5{background-color:#EDF0FD;} + .d2-2096830999 .background-color-B6{background-color:#F7F8FE;} + .d2-2096830999 .background-color-AA2{background-color:#4A6FF3;} + .d2-2096830999 .background-color-AA4{background-color:#EDF0FD;} + .d2-2096830999 .background-color-AA5{background-color:#F7F8FE;} + .d2-2096830999 .background-color-AB4{background-color:#EDF0FD;} + .d2-2096830999 .background-color-AB5{background-color:#F7F8FE;} + .d2-2096830999 .color-N1{color:#0A0F25;} + .d2-2096830999 .color-N2{color:#676C7E;} + .d2-2096830999 .color-N3{color:#9499AB;} + .d2-2096830999 .color-N4{color:#CFD2DD;} + .d2-2096830999 .color-N5{color:#DEE1EB;} + .d2-2096830999 .color-N6{color:#EEF1F8;} + .d2-2096830999 .color-N7{color:#FFFFFF;} + .d2-2096830999 .color-B1{color:#0D32B2;} + .d2-2096830999 .color-B2{color:#0D32B2;} + .d2-2096830999 .color-B3{color:#E3E9FD;} + .d2-2096830999 .color-B4{color:#E3E9FD;} + .d2-2096830999 .color-B5{color:#EDF0FD;} + .d2-2096830999 .color-B6{color:#F7F8FE;} + .d2-2096830999 .color-AA2{color:#4A6FF3;} + .d2-2096830999 .color-AA4{color:#EDF0FD;} + .d2-2096830999 .color-AA5{color:#F7F8FE;} + .d2-2096830999 .color-AB4{color:#EDF0FD;} + .d2-2096830999 .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}]]>npm i -g@forge/cliSet up anAtlassian siteView the helloworld appforgetunnelforgeloginforgecreateforgedeployforgeinstallHot reloadchanges?forgedeploy⬤ Forge CLI⬤ Required⬤ Optional YesNo diff --git a/e2etests/testdata/stable/simple_grid_edges/elk/board.exp.json b/e2etests/testdata/stable/simple_grid_edges/elk/board.exp.json index 66e053be1..1f3e3d490 100644 --- a/e2etests/testdata/stable/simple_grid_edges/elk/board.exp.json +++ b/e2etests/testdata/stable/simple_grid_edges/elk/board.exp.json @@ -4,7 +4,7 @@ "fontFamily": "SourceSansPro", "shapes": [ { - "id": "a", + "id": "0,0", "type": "rectangle", "classes": [ "text", @@ -49,7 +49,7 @@ "level": 1 }, { - "id": "b", + "id": "0,1", "type": "rectangle", "classes": [ "text", @@ -94,7 +94,7 @@ "level": 1 }, { - "id": "c", + "id": "0,2", "type": "rectangle", "classes": [ "empty" @@ -138,7 +138,7 @@ "level": 1 }, { - "id": "d", + "id": "0,3", "type": "rectangle", "classes": [ "text", @@ -183,7 +183,7 @@ "level": 1 }, { - "id": "e", + "id": "0,4", "type": "rectangle", "classes": [ "text", @@ -228,7 +228,7 @@ "level": 1 }, { - "id": "f", + "id": "1,0", "type": "rectangle", "classes": [ "text", @@ -273,7 +273,7 @@ "level": 1 }, { - "id": "g", + "id": "1,1", "type": "rectangle", "classes": [ "text", @@ -318,7 +318,7 @@ "level": 1 }, { - "id": "h", + "id": "1,2", "type": "rectangle", "classes": [ "text", @@ -363,7 +363,7 @@ "level": 1 }, { - "id": "i", + "id": "1,3", "type": "rectangle", "classes": [ "text", @@ -408,7 +408,7 @@ "level": 1 }, { - "id": "j", + "id": "1,4", "type": "diamond", "classes": [ "text", @@ -453,7 +453,7 @@ "level": 1 }, { - "id": "k", + "id": "2,0", "type": "rectangle", "pos": { "x": 0, @@ -494,7 +494,7 @@ "level": 1 }, { - "id": "k.a", + "id": "2,0.a", "type": "rectangle", "pos": { "x": 0, @@ -535,7 +535,7 @@ "level": 2 }, { - "id": "k.b", + "id": "2,0.b", "type": "rectangle", "pos": { "x": 0, @@ -576,7 +576,7 @@ "level": 2 }, { - "id": "k.c", + "id": "2,0.c", "type": "rectangle", "pos": { "x": 0, @@ -617,7 +617,7 @@ "level": 2 }, { - "id": "l", + "id": "2,1", "type": "rectangle", "classes": [ "empty" @@ -661,7 +661,7 @@ "level": 1 }, { - "id": "m", + "id": "2,2", "type": "rectangle", "classes": [ "empty" @@ -705,7 +705,7 @@ "level": 1 }, { - "id": "n", + "id": "2,3", "type": "rectangle", "classes": [ "empty" @@ -749,7 +749,7 @@ "level": 1 }, { - "id": "o", + "id": "2,4", "type": "rectangle", "classes": [ "text", @@ -796,13 +796,13 @@ ], "connections": [ { - "id": "(a -> f)[0]", + "id": "(0,0 -> 1,0)[0]", "classes": [ "arrow" ], - "src": "a", + "src": "0,0", "srcArrow": "none", - "dst": "f", + "dst": "1,0", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -837,13 +837,13 @@ "zIndex": 0 }, { - "id": "(f -> g)[0]", + "id": "(1,0 -> 1,1)[0]", "classes": [ "arrow" ], - "src": "f", + "src": "1,0", "srcArrow": "none", - "dst": "g", + "dst": "1,1", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -878,13 +878,13 @@ "zIndex": 0 }, { - "id": "(g -> h)[0]", + "id": "(1,1 -> 1,2)[0]", "classes": [ "arrow" ], - "src": "g", + "src": "1,1", "srcArrow": "none", - "dst": "h", + "dst": "1,2", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -919,13 +919,13 @@ "zIndex": 0 }, { - "id": "(h -> i)[0]", + "id": "(1,2 -> 1,3)[0]", "classes": [ "arrow" ], - "src": "h", + "src": "1,2", "srcArrow": "none", - "dst": "i", + "dst": "1,3", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -960,13 +960,13 @@ "zIndex": 0 }, { - "id": "(i -> j)[0]", + "id": "(1,3 -> 1,4)[0]", "classes": [ "arrow" ], - "src": "i", + "src": "1,3", "srcArrow": "none", - "dst": "j", + "dst": "1,4", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -1001,13 +1001,13 @@ "zIndex": 0 }, { - "id": "(g -> b)[0]", + "id": "(1,1 -> 0,1)[0]", "classes": [ "arrow" ], - "src": "g", + "src": "1,1", "srcArrow": "none", - "dst": "b", + "dst": "0,1", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -1042,13 +1042,13 @@ "zIndex": 0 }, { - "id": "(i -> d)[0]", + "id": "(1,3 -> 0,3)[0]", "classes": [ "arrow" ], - "src": "i", + "src": "1,3", "srcArrow": "none", - "dst": "d", + "dst": "0,3", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -1083,13 +1083,13 @@ "zIndex": 0 }, { - "id": "(j -> e)[0]", + "id": "(1,4 -> 0,4)[0]", "classes": [ "arrow" ], - "src": "j", + "src": "1,4", "srcArrow": "none", - "dst": "e", + "dst": "0,4", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, @@ -1124,13 +1124,13 @@ "zIndex": 0 }, { - "id": "(j -> o)[0]", + "id": "(1,4 -> 2,4)[0]", "classes": [ "arrow" ], - "src": "j", + "src": "1,4", "srcArrow": "none", - "dst": "o", + "dst": "2,4", "dstArrow": "arrow", "opacity": 1, "strokeDash": 0, diff --git a/e2etests/testdata/stable/simple_grid_edges/elk/sketch.exp.svg b/e2etests/testdata/stable/simple_grid_edges/elk/sketch.exp.svg index 7194aedc7..d57150a7d 100644 --- a/e2etests/testdata/stable/simple_grid_edges/elk/sketch.exp.svg +++ b/e2etests/testdata/stable/simple_grid_edges/elk/sketch.exp.svg @@ -1,23 +1,23 @@ -npm i -g@forge/cliSet up anAtlassian siteView the helloworld appforgetunnelforgeloginforgecreateforgedeployforgeinstallHot reloadchanges?forgedeploy⬤ Forge CLI⬤ Required⬤ Optional YesNo + .d2-2096830999 .fill-N1{fill:#0A0F25;} + .d2-2096830999 .fill-N2{fill:#676C7E;} + .d2-2096830999 .fill-N3{fill:#9499AB;} + .d2-2096830999 .fill-N4{fill:#CFD2DD;} + .d2-2096830999 .fill-N5{fill:#DEE1EB;} + .d2-2096830999 .fill-N6{fill:#EEF1F8;} + .d2-2096830999 .fill-N7{fill:#FFFFFF;} + .d2-2096830999 .fill-B1{fill:#0D32B2;} + .d2-2096830999 .fill-B2{fill:#0D32B2;} + .d2-2096830999 .fill-B3{fill:#E3E9FD;} + .d2-2096830999 .fill-B4{fill:#E3E9FD;} + .d2-2096830999 .fill-B5{fill:#EDF0FD;} + .d2-2096830999 .fill-B6{fill:#F7F8FE;} + .d2-2096830999 .fill-AA2{fill:#4A6FF3;} + .d2-2096830999 .fill-AA4{fill:#EDF0FD;} + .d2-2096830999 .fill-AA5{fill:#F7F8FE;} + .d2-2096830999 .fill-AB4{fill:#EDF0FD;} + .d2-2096830999 .fill-AB5{fill:#F7F8FE;} + .d2-2096830999 .stroke-N1{stroke:#0A0F25;} + .d2-2096830999 .stroke-N2{stroke:#676C7E;} + .d2-2096830999 .stroke-N3{stroke:#9499AB;} + .d2-2096830999 .stroke-N4{stroke:#CFD2DD;} + .d2-2096830999 .stroke-N5{stroke:#DEE1EB;} + .d2-2096830999 .stroke-N6{stroke:#EEF1F8;} + .d2-2096830999 .stroke-N7{stroke:#FFFFFF;} + .d2-2096830999 .stroke-B1{stroke:#0D32B2;} + .d2-2096830999 .stroke-B2{stroke:#0D32B2;} + .d2-2096830999 .stroke-B3{stroke:#E3E9FD;} + .d2-2096830999 .stroke-B4{stroke:#E3E9FD;} + .d2-2096830999 .stroke-B5{stroke:#EDF0FD;} + .d2-2096830999 .stroke-B6{stroke:#F7F8FE;} + .d2-2096830999 .stroke-AA2{stroke:#4A6FF3;} + .d2-2096830999 .stroke-AA4{stroke:#EDF0FD;} + .d2-2096830999 .stroke-AA5{stroke:#F7F8FE;} + .d2-2096830999 .stroke-AB4{stroke:#EDF0FD;} + .d2-2096830999 .stroke-AB5{stroke:#F7F8FE;} + .d2-2096830999 .background-color-N1{background-color:#0A0F25;} + .d2-2096830999 .background-color-N2{background-color:#676C7E;} + .d2-2096830999 .background-color-N3{background-color:#9499AB;} + .d2-2096830999 .background-color-N4{background-color:#CFD2DD;} + .d2-2096830999 .background-color-N5{background-color:#DEE1EB;} + .d2-2096830999 .background-color-N6{background-color:#EEF1F8;} + .d2-2096830999 .background-color-N7{background-color:#FFFFFF;} + .d2-2096830999 .background-color-B1{background-color:#0D32B2;} + .d2-2096830999 .background-color-B2{background-color:#0D32B2;} + .d2-2096830999 .background-color-B3{background-color:#E3E9FD;} + .d2-2096830999 .background-color-B4{background-color:#E3E9FD;} + .d2-2096830999 .background-color-B5{background-color:#EDF0FD;} + .d2-2096830999 .background-color-B6{background-color:#F7F8FE;} + .d2-2096830999 .background-color-AA2{background-color:#4A6FF3;} + .d2-2096830999 .background-color-AA4{background-color:#EDF0FD;} + .d2-2096830999 .background-color-AA5{background-color:#F7F8FE;} + .d2-2096830999 .background-color-AB4{background-color:#EDF0FD;} + .d2-2096830999 .background-color-AB5{background-color:#F7F8FE;} + .d2-2096830999 .color-N1{color:#0A0F25;} + .d2-2096830999 .color-N2{color:#676C7E;} + .d2-2096830999 .color-N3{color:#9499AB;} + .d2-2096830999 .color-N4{color:#CFD2DD;} + .d2-2096830999 .color-N5{color:#DEE1EB;} + .d2-2096830999 .color-N6{color:#EEF1F8;} + .d2-2096830999 .color-N7{color:#FFFFFF;} + .d2-2096830999 .color-B1{color:#0D32B2;} + .d2-2096830999 .color-B2{color:#0D32B2;} + .d2-2096830999 .color-B3{color:#E3E9FD;} + .d2-2096830999 .color-B4{color:#E3E9FD;} + .d2-2096830999 .color-B5{color:#EDF0FD;} + .d2-2096830999 .color-B6{color:#F7F8FE;} + .d2-2096830999 .color-AA2{color:#4A6FF3;} + .d2-2096830999 .color-AA4{color:#EDF0FD;} + .d2-2096830999 .color-AA5{color:#F7F8FE;} + .d2-2096830999 .color-AB4{color:#EDF0FD;} + .d2-2096830999 .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}]]>npm i -g@forge/cliSet up anAtlassian siteView the helloworld appforgetunnelforgeloginforgecreateforgedeployforgeinstallHot reloadchanges?forgedeploy⬤ Forge CLI⬤ Required⬤ Optional YesNo