From ea1111807a4c5eb0f0dba18d94015cc92ee524cc Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Thu, 1 Feb 2024 14:05:44 -0800 Subject: [PATCH] add playground link to code snippet --- blog/powerpoint.md | 70 +--- blog/sketch.md | 8 +- docs/tour/api.md | 6 +- docs/tour/classes.md | 90 +---- docs/tour/composition.md | 4 +- docs/tour/connections.md | 80 ++--- docs/tour/containers.md | 74 ++--- docs/tour/dimensions.md | 32 +- docs/tour/globs.md | 191 +++-------- docs/tour/grid-diagrams.md | 194 +++-------- docs/tour/hello-world.md | 9 +- docs/tour/icons.md | 60 +--- docs/tour/imported-template.md | 34 +- docs/tour/imports.md | 49 +-- docs/tour/interactive.md | 24 +- docs/tour/intro.md | 56 +--- docs/tour/layers.md | 65 +--- docs/tour/layouts.md | 22 +- docs/tour/linking.md | 50 +-- docs/tour/model-view.md | 39 +-- docs/tour/modular-classes.md | 53 +-- docs/tour/nested-composition.md | 50 +-- docs/tour/overrides.md | 87 ++--- docs/tour/positions.md | 101 ++---- docs/tour/scenarios.md | 89 +---- docs/tour/sequence-diagrams.md | 167 +++------- docs/tour/shapes.md | 25 +- docs/tour/sql-tables.md | 58 +--- docs/tour/steps.md | 24 +- docs/tour/strings.md | 9 +- docs/tour/style.md | 221 +++++------- docs/tour/text.md | 125 ++----- docs/tour/themes.md | 53 +-- docs/tour/uml-classes.md | 42 +-- docs/tour/vars.md | 112 ++----- docs/tour/version-visualization.md | 45 +-- docusaurus.config.js | 4 + package.json | 1 + src/pages/index.js | 49 +-- src/theme/CodeBlock/CodeBlock.scss | 29 +- src/theme/CodeBlock/index.js | 49 ++- static/bespoke-d2/terminal-theme.d2 | 7 + static/blog/sketch/animated.d2 | 5 + static/d2/globs-nested.d2 | 3 + static/d2/sequence-diagrams-group.d2 | 1 + static/d2/sequence-diagrams-note.d2 | 1 + static/d2/styles-text-decoration.d2 | 2 + static/d2/styles-text-transform.d2 | 6 +- static/d2/table.d2 | 1 + static/icons/externallink.svg | 5 + .../img/generated/styles-text-transform.svg2 | 314 +++++++++--------- static/img/screenshots/tala-direction.png | Bin 127320 -> 22672 bytes static/img/screenshots/text-2.png | Bin 70418 -> 46896 bytes yarn.lock | 5 + 54 files changed, 866 insertions(+), 2034 deletions(-) create mode 100644 static/icons/externallink.svg diff --git a/blog/powerpoint.md b/blog/powerpoint.md index 36eeeaaf..272890cd 100644 --- a/blog/powerpoint.md +++ b/blog/powerpoint.md @@ -6,6 +6,8 @@ tags: [powerpoint, show-and-tell] image: https://raw.githubusercontent.com/terrastruct/d2-docs/master/static/img/screenshots/wcc_pptx.png hide_table_of_contents: false --- +import CodeBlock from '@theme/CodeBlock'; +import Cult from '@site/static/bespoke-d2/cult.d2'; D2 is a diagramming language, and it's versatile unlike any other. For example, you can create full PowerPoint presentations with just text. @@ -31,71 +33,9 @@ To produce this: - copy the below - run `d2 input.d2 cult.pptx`. -```d2 -text: |md - # Introduction - - ## How to start a cult - - This presentation educates the public on starting a cult - - This is an abridged presentation -| - -layers: { - 1: { - text: |md - # What is a cult? - - *Definition*: A group or movement with a shared devotion to a charismatic leader, an ideology, or a set of rituals and beliefs - - *Characteristics*: Totalitarian control, manipulative practices, and exploitation of members - | - } - 2: { - text: |md - # Charismatic Leader - - ## Role - - Cult leaders have a strong, magnetic personality, and are typically seen as an authority figure - - ## Tips: - - - Cultivate a unique and compelling persona - - Be convincing and persuasive - - Establish yourself as an authority figure with exclusive knowledge or abilities - | - } - 3: { - text: |md - # Recruitment - - *Importance*: New members are vital for the growth and sustainability of a cult - - *Methods*: Targeting vulnerable individuals, offering solutions to personal problems, and using social pressure - | - } - 4: { - text: |md - # Control and manipulation - - ## Purpose - To maintain power over members and ensure loyalty - - ## Techniques - Information control, emotional manipulation, and behavior control - - ## Tips: - - - Limit members' access to outside information and discourage critical thinking - - Use guilt, shame, and fear to manipulate members' emotions - - Create strict rules and rituals to control behavior - | - } - 5: { - text: |md - # Enjoy your cult - | - } -} -``` + + {Cult} + ## Complex example diff --git a/blog/sketch.md b/blog/sketch.md index a73223d5..b696ee59 100644 --- a/blog/sketch.md +++ b/blog/sketch.md @@ -6,6 +6,8 @@ tags: [hand-drawn, show-and-tell] image: https://raw.githubusercontent.com/terrastruct/d2-docs/master/static/img/blog/sketch.png hide_table_of_contents: false --- +import CodeBlock from '@theme/CodeBlock'; +import Animated from '@site/static/blog/sketch/animated.d2'; Sketch mode started out as a "wouldn't it be cool" weekend feature, and has since turned into one of the things people love most about D2. @@ -58,8 +60,8 @@ brightness of fills. It even works with animated connections! -```d2 -winter.snow -> summer.sun -> trees -> winter.snow: { style.animated: true } -``` + + {Animated} +
diff --git a/docs/tour/api.md b/docs/tour/api.md index 5a599aa5..42db9c68 100644 --- a/docs/tour/api.md +++ b/docs/tour/api.md @@ -1,3 +1,7 @@ +--- +pagination_next: tour/studio +--- + # D2 Oracle D2 has an API built on top of its AST for **programmatically creating diagrams in Go**. @@ -63,7 +67,7 @@ _, newKey, _ = d2oracle.Create(g, nil, "a -> b") If you have a multi-board diagram like so: -```d2 +```d2-incomplete x layers: { diff --git a/docs/tour/classes.md b/docs/tour/classes.md index 49446d05..e0aaf7dc 100644 --- a/docs/tour/classes.md +++ b/docs/tour/classes.md @@ -1,43 +1,16 @@ +import CodeBlock from '@theme/CodeBlock'; +import StyleClasses1 from '@site/static/d2/style-classes-1.d2'; +import StyleClasses2 from '@site/static/d2/style-classes-2.d2'; +import MultipleClasses from '@site/static/d2/multiple-classes.d2'; +import OrderedClasses from '@site/static/d2/ordered-classes.d2'; + # Classes Classes let you aggregate attributes and reuse them. -```d2 -direction: right -classes: { - load balancer: { - label: load\nbalancer - width: 100 - height: 200 - style: { - stroke-width: 0 - fill: "#44C7B1" - shadow: true - border-radius: 5 - } - } - unhealthy: { - style: { - fill: "#FE7070" - stroke: "#F69E03" - } - } -} - -web traffic -> web lb -web lb.class: load balancer - -web lb -> api1 -web lb -> api2 -web lb -> api3 - -api2.class: unhealthy - -api1 -> cache lb -api3 -> cache lb - -cache lb.class: load balancer -``` + + {StyleClasses1} +
@@ -65,15 +38,9 @@ a -> b If your object defines an attribute that the class also has defined, the object's attribute overrides the class attribute. -```d2 -classes: { - unhealthy: { - style.fill: red - } -} -x.class: unhealthy -x.style.fill: orange -``` + + {StyleClasses2} +
@@ -81,20 +48,9 @@ x.style.fill: orange You may use arrays for the value as well to apply multiple classes. -```d2 -classes: { - d2: { - label: "" - icon: https://play.d2lang.com/assets/icons/d2-logo.svg - } - sphere: { - shape: circle - style.stroke-width: 0 - } -} - -logo.class: [d2; sphere] -``` + + {MultipleClasses} +
@@ -102,19 +58,9 @@ logo.class: [d2; sphere] When multiple classes are given, they are applied left-to-right. -```d2 -classes: { - uno: { - label: 1 - } - dos: { - label: 2 - } -} - -x.class: [uno; dos] -y.class: [dos; uno] -``` + + {OrderedClasses} +
diff --git a/docs/tour/composition.md b/docs/tour/composition.md index 591850ec..c0e7778e 100644 --- a/docs/tour/composition.md +++ b/docs/tour/composition.md @@ -28,14 +28,14 @@ Each one serves different use cases. The example above is achieved by defining a Thus far, all D2 diagrams we've encountered are single-board diagrams, the root board. -```d2 +```d2-incomplete # Root board x -> y ``` Composition in D2 is when you use one of those keywords to declare another board. -```d2 +```d2-incomplete # Root board x -> y layers: { diff --git a/docs/tour/connections.md b/docs/tour/connections.md index 1d8e4fa9..e8cebc65 100644 --- a/docs/tour/connections.md +++ b/docs/tour/connections.md @@ -1,3 +1,11 @@ +import CodeBlock from '@theme/CodeBlock'; +import Connections1 from '@site/static/d2/connections-1.d2'; +import Connections2 from '@site/static/d2/connections-2.d2'; +import Connections3 from '@site/static/d2/connections-3.d2'; +import Connections4 from '@site/static/d2/connections-4.d2'; +import Connections5 from '@site/static/d2/connections-5.d2'; +import ConnectionsReference from '@site/static/d2/connections-reference.d2'; + # Connections Connections define relationships between shapes. @@ -49,16 +57,9 @@ be -> fe ## Example -```d2 -Write Replica Canada <-> Write Replica Australia - -Read Replica <- Master - -x -- y - -super long shape id here --\ - -> super long shape id even longer here -``` + + {Connections1} +
@@ -66,11 +67,9 @@ super long shape id here --\ Repeated connections do not override existing connections. They declare new ones. -```d2 -Database -> S3: backup -Database -> S3 -Database -> S3: backup -``` + + {Connections2} +
@@ -78,19 +77,17 @@ Database -> S3: backup For readability, it may look more natural to define multiple connection in a single line. -```d2 -# The label applies to each connection in the chain. -High Mem Instance -> EC2 <- High CPU Instance: Hosted By -``` + + {Connections3} +
## Cycles are okay -```d2 -Stage One -> Stage Two -> Stage Three -> Stage Four -Stage Four -> Stage One: repeat -``` + + {Connections4} +
@@ -98,30 +95,9 @@ Stage Four -> Stage One: repeat To override the default arrowhead shape or give a label next to arrowheads, define a special shape on connections named `source-arrowhead` and/or `target-arrowhead`. -```d2 -a: The best way to avoid responsibility is to say, "I've got responsibilities" -b: Whether weary or unweary, O man, do not rest -c: I still maintain the point that designing a monolithic kernel in 1991 is a - -a -> b: To err is human, to moo bovine { - source-arrowhead: 1 - target-arrowhead: * { - shape: diamond - } -} - -b <-> c: "Reality is just a crutch for people who can't handle science fiction" { - source-arrowhead.label: 1 - target-arrowhead: * { - shape: diamond - style.filled: true - } -} - -d: A black cat crossing your path signifies that the animal is going somewhere - -d -> a -> c -``` + + {Connections5} +
@@ -159,12 +135,8 @@ x -> y: { You can reference a connection by specifying the original ID followed by its index. -```d2 -x -> y: hi -x -> y: hello - -(x -> y)[0].style.stroke: red -(x -> y)[1].style.stroke: blue -``` + + {ConnectionsReference} +
diff --git a/docs/tour/containers.md b/docs/tour/containers.md index c646be5a..2c8e89bd 100644 --- a/docs/tour/containers.md +++ b/docs/tour/containers.md @@ -1,16 +1,14 @@ -# Containers - -```d2 -server -# Declares a shape inside of another shape -server.process +import CodeBlock from '@theme/CodeBlock'; +import Containers1 from '@site/static/d2/containers-1.d2'; +import Containers2 from '@site/static/d2/containers-2.d2'; +import Containers3 from '@site/static/d2/containers-3.d2'; +import ContainersUnderscore from '@site/static/d2/containers-underscore.d2'; -# Can declare the container and child in same line -im a parent.im a child +# Containers -# Since connections can also declare keys, this works too -apartment.Bedroom.Bathroom -> office.Spare Room.Bathroom: Portal -``` + + {Containers1} +
@@ -18,19 +16,9 @@ apartment.Bedroom.Bathroom -> office.Spare Room.Bathroom: Portal You can avoid repeating containers by creating nested maps. -```d2 -clouds: { - aws: { - load_balancer -> api - api -> db - } - gcloud: { - auth -> db - } - - gcloud -> aws -} -``` + + {Containers2} +
@@ -40,7 +28,7 @@ There are two ways define container labels. ### 1. Shorthand container labels -```d2 +```d2-incomplete gcloud: Google Cloud { ... } @@ -48,7 +36,7 @@ gcloud: Google Cloud { ### 2. Reserved keyword `label` -```d2 +```d2-incomplete gcloud: { label: Google Cloud ... @@ -57,24 +45,9 @@ gcloud: { ## Example -```d2 -clouds: { - aws: AWS { - load_balancer -> api - api -> db - } - gcloud: Google Cloud { - auth -> db - } - - gcloud -> aws -} - -users -> clouds.aws.load_balancer -users -> clouds.gcloud.auth - -ci.deploys -> clouds -``` + + {Containers3} +
@@ -83,15 +56,8 @@ ci.deploys -> clouds Sometimes you want to reference something outside of the container from within. The underscore (`_`) refers to parent. -```d2 -christmas: { - presents -} -birthdays: { - presents - _.christmas.presents -> presents: regift - _.christmas.style.fill: "#ACE1AF" -} -``` + + {ContainersUnderscore} +
diff --git a/docs/tour/dimensions.md b/docs/tour/dimensions.md index a1b71dcf..cac3ee36 100644 --- a/docs/tour/dimensions.md +++ b/docs/tour/dimensions.md @@ -1,3 +1,6 @@ +import CodeBlock from '@theme/CodeBlock'; +import Dimensions from '@site/static/d2/dimensions.d2'; + # Dimensions You can specify the `width` and `height` of most shapes. @@ -6,31 +9,8 @@ You can specify the `width` and `height` of most shapes. These keywords cannot be set on containers, since containers resize to fit their children. ::: -```d2 -direction: right - -small jerry: "" { - shape: image - icon: https://static.wikia.nocookie.net/tomandjerry/images/4/46/JerryJumbo3-1-.jpg - width: 200 - height: 200 -} - -med jerry: "" { - shape: image - icon: https://static.wikia.nocookie.net/tomandjerry/images/4/46/JerryJumbo3-1-.jpg - width: 300 - height: 300 -} - -big jerry: "" { - shape: image - icon: https://static.wikia.nocookie.net/tomandjerry/images/4/46/JerryJumbo3-1-.jpg - width: 500 - height: 400 -} - -big jerry -> med jerry -> small jerry -``` + + {Dimensions} +
diff --git a/docs/tour/globs.md b/docs/tour/globs.md index 3f29fa74..7e98b68a 100644 --- a/docs/tour/globs.md +++ b/docs/tour/globs.md @@ -1,3 +1,17 @@ +import CodeBlock from '@theme/CodeBlock'; +import GlobsIntro from '@site/static/d2/globs-intro.d2'; +import GlobsLazy from '@site/static/d2/globs-lazy.d2'; +import GlobsCasing from '@site/static/d2/globs-casing.d2'; +import GlobsMultiple from '@site/static/d2/globs-multiple.d2'; +import GlobsConnections from '@site/static/d2/globs-connections.d2'; +import GlobsIndexedConnections from '@site/static/d2/globs-indexed-connections.d2'; +import GlobsScope from '@site/static/d2/globs-scope.d2'; +import GlobsRecursive from '@site/static/d2/globs-recursive.d2'; +import GlobsRecursive2 from '@site/static/d2/globs-recursive-2.d2'; +import GlobsFilter from '@site/static/d2/globs-filter.d2'; +import GlobsFilter2 from '@site/static/d2/globs-filter-2.d2'; +import GlobsNested from '@site/static/d2/globs-nested.d2'; + # Globs :::note Etymology @@ -8,17 +22,9 @@ Globs are a powerful language feature to make global changes in one line. -```d2 -iphone 10 -iphone 11 mini -iphone 11 pro -iphone 12 mini - -*.height: 300 -*.width: 140 -*mini.height: 200 -*pro.height: 400 -``` + + {GlobsIntro} +
@@ -31,37 +37,25 @@ In the following example, the instructions are as follows: criteria. This does, so it applies to `b`. 4. Same with `c`. -```d2 -a - -* -> y - -b -c -``` + + {GlobsLazy} +
## Globs are case insensitive -```d2 -diddy kong -Donkey Kong - -*kong.style.fill: brown -``` + + {GlobsCasing} +
## Globs can appear multiple times -```d2 -teacher -thriller -thrifter - -t*h*r.shape: person -``` + + {GlobsMultiple} +
@@ -69,19 +63,9 @@ t*h*r.shape: person You can use globs to create connections. -```d2 -vars: { - d2-config: { - layout-engine: elk - } -} - -Spiderman 1 -Spiderman 2 -Spiderman 3 - -* -> *: 👉 -``` + + {GlobsConnections} +
@@ -92,17 +76,9 @@ expect from globs, we feel it is more pragmatic for this to be the behavior. You can also use globs to target modifying existing connections. -```d2 -lady 1 -lady 2 - -barbie - -lady 1 -> barbie: hi barbie -lady 2 -> barbie: hi barbie - -(lady* -> barbie)[*].style.stroke: pink -``` + + {GlobsIndexedConnections} +
@@ -110,22 +86,9 @@ lady 2 -> barbie: hi barbie Notice that in the below example, globs only apply to the scope they are specified in. -```d2 -foods: { - pizzas: { - cheese - sausage - pineapple - *.shape: circle - } - humans: { - john - james - *.shape: person - } - humans.* -> pizzas.pineapple: eats -} -``` + + {GlobsScope} +
@@ -133,29 +96,15 @@ foods: { `**` means target recursively. -```d2 -a: { - b: { - c - } -} - -**.style.border-radius: 7 -``` + + {GlobsRecursive} +
-```d2 -zone-A: { - machine A - machine B: { - submachine A - submachine B - } -} - -zone-A.** -> load balancer -``` + + {GlobsRecursive2} +
@@ -170,39 +119,18 @@ diagramming: it only applies to non-container (AKA leaf) shapes. Use `&` to filter what globs target. -```d2 -bravo team.shape: person -charlie team.shape: person -command center.shape: cloud -hq.shape: rectangle - -*: { - &shape: person - style.multiple: true -} -``` + + {GlobsFilter} +
If the filtered attribute has an array value, the filter will match if it matches any element of the array. -```d2 -the-little-cannon: { - class: [server; deployed] -} -dino: { - class: [internal; deployed] -} -catapult: { - class: [server] -} - -*: { - &class: server - style.multiple: true -} -``` + + {GlobsFilter2} +
@@ -214,28 +142,9 @@ We are working on adding more filters, as well as the "not-filter", `!&`. You can nest globs, combining the features above. -```d2 -conversation 1: { - shape: sequence_diagram - alice -> bob: hi - bob -> alice: hi -} - -conversation 2: { - shape: sequence_diagram - alice -> bob: hello again - alice -> bob: hello? - bob -> alice: hello -} - -# Recursively target all shapes... -**: { - # ... that are sequence diagrams - &shape: sequence_diagram - # Then recursively set all shapes in them to person - **: {shape: person} -} -``` + + {GlobsNested} +
diff --git a/docs/tour/grid-diagrams.md b/docs/tour/grid-diagrams.md index fce6b1d9..d46a2921 100644 --- a/docs/tour/grid-diagrams.md +++ b/docs/tour/grid-diagrams.md @@ -1,3 +1,13 @@ +import CodeBlock from '@theme/CodeBlock'; +import Grid from '@site/static/d2/grid.d2'; +import Grid2 from '@site/static/d2/grid-2.d2'; +import Grid3 from '@site/static/d2/grid-3.d2'; +import Grid4 from '@site/static/d2/grid-4.d2'; +import GridDimensions from '@site/static/d2/grid-dimensions.d2'; +import GridFill from '@site/static/d2/grid-fill.d2'; +import GridNestedGrid from '@site/static/d2/grid-nested-grid.d2'; +import Table from '@site/static/d2/table.d2'; + # Grid Diagrams Grid diagrams let you display objects in a structured grid. @@ -15,35 +25,25 @@ Two keywords do all the magic: Setting just `grid-rows`: -```d2 -grid-rows: 3 -Executive -Legislative -Judicial -``` + + {Grid2} +
Setting just `grid-columns`: -```d2 -grid-columns: 3 -Executive -Legislative -Judicial -``` + + {Grid3} +
Setting both `grid-rows` and `grid-columns`: -```d2 -grid-rows: 2 -grid-columns: 2 -Executive -Legislative -Judicial -``` + + {Grid4} +
@@ -51,13 +51,9 @@ Judicial To create specific constructions, use `width` and/or `height`. -```d2 -grid-rows: 2 -Executive -Legislative -Judicial -The American Government.width: 400 -``` + + {GridDimensions} +
@@ -67,15 +63,9 @@ Notice how objects are evenly distributed within each row. When you define only one of row or column, objects will expand. -```d2 -grid-rows: 3 -Executive -Legislative -Judicial -The American Government.width: 400 -Voters -Non-voters -``` + + {GridFill} + Notice how `Voters` and `Non-voters` fill the space. @@ -88,7 +78,7 @@ dominant direction is the order in which cells are filled. For example: -```d2 +```d2-incomplete grid-rows: 4 grid-columns: 2 # bunch of shapes @@ -100,7 +90,7 @@ Since `grid-rows` is defined first, objects will fill rows before moving onto co But if it were reversed: -```d2 +```d2-incomplete grid-columns: 2 grid-rows: 4 # bunch of shapes @@ -140,38 +130,9 @@ Setting `grid-gap` is equivalent to setting both `vertical-gap` and `horizontal-
-```d2 -# Specified so that objects are written in row-dominant order -grid-rows: 2 -grid-columns: 4 -grid-gap: 0 - -classes: { - header: { - style.underline: true - } -} - -Element.class: header -Atomic Number.class: header -Atomic Mass.class: header -Melting Point.class: header - -Hydrogen -1 -"1.008" -"-259.16" - -Carbon -6 -"12.011" -3500 - -Oxygen -8 -"15.999" -"-218.79" -``` + + {Table} + ## Connections @@ -201,95 +162,16 @@ i.e., no path-finding. Currently you can nest grid diagrams within grid diagrams. Nesting other types is coming soon. -```d2 -grid-gap: 0 -grid-columns: 1 -header -body: "" { - grid-gap: 0 - grid-columns: 2 - content - sidebar -} -footer -``` + + {GridNestedGrid} +
- - ## Source code -This is the text for the image at the top of this page. - -```d2 -grid-rows: 5 -style.fill: black - -classes: { - white square: { - label: "" - width: 120 - style: { - fill: white - stroke: cornflowerblue - stroke-width: 10 - } - } - block: { - style: { - text-transform: uppercase - font-color: white - fill: darkcyan - stroke: black - } - } -} - -flow1.class: white square -flow2.class: white square -flow3.class: white square -flow4.class: white square -flow5.class: white square -flow6.class: white square -flow7.class: white square -flow8.class: white square -flow9.class: white square - -dagger engine: { - width: 800 - class: block - style: { - fill: beige - stroke: darkcyan - font-color: blue - stroke-width: 8 - } -} - -any docker compatible runtime: { - width: 800 - class: block - style: { - fill: lightcyan - stroke: darkcyan - font-color: black - stroke-width: 8 - } - icon: https://icons.terrastruct.com/dev%2Fdocker.svg -} - -any ci: { - class: block - style: { - fill: gold - stroke: maroon - font-color: maroon - stroke-width: 8 - } -} -windows.class: block -linux.class: block -macos.class: block -kubernetes.class: block -``` +This is the script for the image at the top of this page. + + + {Grid} + diff --git a/docs/tour/hello-world.md b/docs/tour/hello-world.md index f24f99cb..c7c71ce3 100644 --- a/docs/tour/hello-world.md +++ b/docs/tour/hello-world.md @@ -1,11 +1,14 @@ --- pagination_next: tour/shapes --- +import CodeBlock from '@theme/CodeBlock'; +import HelloWorld from '@site/static/d2/hello-world.d2'; + # Hello World -```d2 -x -> y: hello world -``` + + {HelloWorld} +
diff --git a/docs/tour/icons.md b/docs/tour/icons.md index 5e06831e..3325c3b6 100644 --- a/docs/tour/icons.md +++ b/docs/tour/icons.md @@ -1,6 +1,10 @@ --- sidebar_label: Icons & Images --- +import CodeBlock from '@theme/CodeBlock'; +import Icons1 from '@site/static/d2/icons-1.d2'; +import IconPlacement from '@site/static/d2/icon-placement.d2'; +import IconsImage from '@site/static/d2/icons-image.d2'; # Icons @@ -13,11 +17,9 @@ Icons and images are an essential part of production-ready diagrams. You can use any URL as value. -```d2 -my network: { - icon: https://icons.terrastruct.com/infra/019-network.svg -} -``` + + {Icons1} +
@@ -34,35 +36,9 @@ like coexistence with a label and whether it's a container generally affect wher is placed to not obstruct. Notice how the following diagram has container icons in the top-left and non-container icons in the center. -```d2 -vpc: VPC 1 10.1.0.0./16 { - icon: https://icons.terrastruct.com/aws%2F_Group%20Icons%2FVirtual-private-cloud-VPC_light-bg.svg - style: { - stroke: green - font-color: green - fill: white - } - az: Availability Zone A { - style: { - stroke: blue - font-color: blue - stroke-dash: 3 - fill: white - } - firewall: Firewall Subnet A { - icon: https://icons.terrastruct.com/aws%2FNetworking%20&%20Content%20Delivery%2FAmazon-Route-53_Hosted-Zone_light-bg.svg - style: { - stroke: purple - font-color: purple - fill: "#e1d5e7" - } - ec2: EC2 Instance { - icon: https://icons.terrastruct.com/aws%2FCompute%2F_Instance%2FAmazon-EC2_C4-Instance_light-bg.svg - } - } - } -} -``` + + {IconPlacement} +
@@ -72,19 +48,9 @@ Icons can be positioned with the `near` keyword [introduced later](/tour/positio ## Add `shape: image` for standalone icon shapes -```d2 -server: { - shape: image - icon: https://icons.terrastruct.com/tech/022-server.svg -} - -github: { - shape: image - icon: https://icons.terrastruct.com/dev/github.svg -} - -server -> github -``` + + {IconsImage} +
diff --git a/docs/tour/imported-template.md b/docs/tour/imported-template.md index 1f26b612..f25182c3 100644 --- a/docs/tour/imported-template.md +++ b/docs/tour/imported-template.md @@ -1,3 +1,7 @@ +import CodeBlock from '@theme/CodeBlock'; +import ImportsTemplate from '@site/static/d2/imports-template.d2'; +import ImportsWrapperTemplate from '@site/static/d2/imports-wrapper-template.d2'; + # Template You make diagrams for external consulting clients. In order to appear professional, all @@ -5,32 +9,14 @@ diagrams must be contained within a template that your designer has created that on-brand. - `diagram.d2` -```d2 -template: { - ...@wrapper-template - synergy: { - our firm -> yours: value add - } - stakeholders: { - george.shape: person - tim.shape: person - tim.tooltip: is this web scale? - } -} -``` + + {ImportsTemplate} + - `wrapper-template.d2` -```d2 -style: { - fill: "#E3EDE6" - fill-pattern: dots - stroke: "#820758" - stroke-width: 3 - border-radius: 2 - shadow: true -} -label: "" -``` + + {ImportsWrapperTemplate} + :::info This use case will be made much more powerful when D2 finishes glob (`*`) support. diff --git a/docs/tour/imports.md b/docs/tour/imports.md index dfdc684e..0867551d 100644 --- a/docs/tour/imports.md +++ b/docs/tour/imports.md @@ -1,6 +1,9 @@ --- pagination_next: tour/imports-use-cases --- +import CodeBlock from '@theme/CodeBlock'; +import ImportsTargeted from '@site/static/d2/imports-targeted.d2'; +import ImportsTargetedPeople from '@site/static/d2/imports-targeted-people.d2'; # Syntax @@ -17,13 +20,13 @@ In the next section, we'll see examples of common import use cases. ### 1. Regular import - `x.d2` -```d2 +```d2-incomplete x: { shape: circle } ``` - `y.d2` -```d2 +```d2-incomplete a: @x.d2 a -> b ``` @@ -34,13 +37,13 @@ value. ### 2. Spread import - `x.d2` -```d2 +```d2-incomplete x: { shape: circle } ``` - `y.d2` -```d2 +```d2-incomplete a: { ...@x.d2 } @@ -58,13 +61,13 @@ Spread imports only work within maps. Something like `a: ...@x.d2` is an invalid Above, we wrote the full file name for clarity, but the correct usage is to just specify the file name without the suffix. If you run D2's autoformatter, it'll change -```d2 +```d2-incomplete x: @x.d2 ``` into -```d2 +```d2-incomplete x: @x ``` @@ -80,34 +83,16 @@ You don't have to import the full file. For example, if you have a file that defines all the people in your organization, and you just want to show some relations between managers, you can import a specific object. + `donut-flowchart.d2` -```d2 -...@people.management -joe -> donuts: loves -jan -> donuts: brings -``` + + {ImportsTargeted} + `people.d2` -```d2 -management: { - joe: { - shape: person - label: Joe Donutlover - } - jan: { - shape: person - label: Jan Donutbaker - } -} - -# Notice how these do not appear in the rendered diagram -employees: { - toby: { - shape: person - label: Toby Simonton - } -} -``` + + {ImportsTargetedPeople} + :::info Since `.` is used for targeting, if you want to import from a file with `.` in its name, @@ -127,7 +112,7 @@ Not to the executing path. Consider that your working directory is `/Users/You/dev`. Your D2 files: - `/Users/you/dev/d2-stuff/x.d2` -```d2 +```d2-incomplete y: @../y.d2 ``` diff --git a/docs/tour/interactive.md b/docs/tour/interactive.md index d30a3387..69819b96 100644 --- a/docs/tour/interactive.md +++ b/docs/tour/interactive.md @@ -1,3 +1,7 @@ +import CodeBlock from '@theme/CodeBlock'; +import Tooltip from '@site/static/d2/tooltip.d2'; +import Links from '@site/static/d2/links.d2'; + # Interactive ## Tooltips @@ -10,11 +14,9 @@ Tooltips are text that appear on hover. They serve two purposes: - Your diagram is getting messy. Instead of adding more text, you can tuck some into tooltips. -```d2 -x: { tooltip: Total abstinence is easier than perfect moderation } -y: { tooltip: Gee, I feel kind of LIGHT in the head now,\nknowing I can't make my satellite dish PAYMENTS! } -x -> y -``` + + {Tooltip} + Try it out, hover over `x` and `y`. Notice that they have an icon indicating that they have a tooltip. @@ -39,15 +41,9 @@ tooltips. Links are like tooltips, except you click to go to an external link. -```d2 -x: I'm a Mac { - link: https://apple.com -} -y: And I'm a PC { - link: https://microsoft.com -} -x -> y: gazoontite -``` + + {Links} + Try clicking on each. diff --git a/docs/tour/intro.md b/docs/tour/intro.md index 0fde3272..2398ceaa 100644 --- a/docs/tour/intro.md +++ b/docs/tour/intro.md @@ -2,6 +2,8 @@ sidebar_label: What is D2 pagination_next: tour/experience --- +import CodeBlock from '@theme/CodeBlock'; +import Example from '@site/static/bespoke-d2/terminal-theme.d2'; # D2 Tour @@ -18,51 +20,9 @@ d2 --theme=300 --dark-theme=200 -l elk --pad 0 ./input.d2
-```d2 -network: { - cell tower: { - satellites: { - shape: stored_data - style.multiple: true - } - - transmitter - - satellites -> transmitter: send - satellites -> transmitter: send - satellites -> transmitter: send - } - - online portal: { - ui: {shape: hexagon} - } - - data processor: { - storage: { - shape: cylinder - style.multiple: true - } - } - - cell tower.transmitter -> data processor.storage: phone logs -} - -user: { - shape: person - width: 130 -} - -user -> network.cell tower: make call -user -> network.online portal.ui: access { - style.stroke-dash: 3 -} - -api server -> network.online portal.ui: display -api server -> logs: persist -logs: {shape: page; style.multiple: true} - -network.data processor -> api server -``` + + {Example} + ## Using the CLI watch mode @@ -81,3 +41,9 @@ The source code for D2 is hosted here: The source code for these docs are here: [https://github.com/terrastruct/d2-docs](https://github.com/terrastruct/d2-docs). ::: + +:::info +For each D2 snippet, you can hover over it to open directly in the Playground and tinker. + +There's some exceptions like snippets that use imports. +::: diff --git a/docs/tour/layers.md b/docs/tour/layers.md index 582c01ed..12a84aed 100644 --- a/docs/tour/layers.md +++ b/docs/tour/layers.md @@ -1,6 +1,9 @@ --- pagination_next: tour/scenarios --- +import CodeBlock from '@theme/CodeBlock'; +import TikTok from '@site/static/bespoke-d2/tiktok.d2'; + # Layers A "Layer" represents "a layer of abstraction". Each Layer starts off as a blank @@ -11,62 +14,6 @@ Try clicking on the objects. -```d2 -explain: |md - This is the top layer, highest level of abstraction. -| { - near: top-center -} - -Tik Tok's User Data: { - link: layers.tiktok -} - -layers: { - tiktok: { - explain: |md - One layer deeper: - - Tik Tok's CEO explained that user data is stored in two places currently. - | { - near: top-center - } - Virginia data center <-> Hong Kong data center - Virginia data center.link: layers.virginia - Hong Kong data center.link: layers.hongkong - layers: { - virginia: { - direction: right - explain: |md - Getting deeper into details: - - TikTok's CEO explains that Virginia data center has strict security measures. - | { - near: top-center - } - Oracle Databases: { - shape: cylinder - style.multiple: true - } - US residents -> Oracle Databases: access - US residents: { - shape: person - } - Third party auditors -> Oracle Databases: verify - } - hongkong: { - direction: right - explain: |md - TikTok's CEO says data is actively being deleted and should be done by the end of the year. - | { - near: top-center - } - Legacy Databases: { - shape: cylinder - style.multiple: true - } - } - } - } -} -``` + + {TikTok} + diff --git a/docs/tour/layouts.md b/docs/tour/layouts.md index 83369783..0eb3acff 100644 --- a/docs/tour/layouts.md +++ b/docs/tour/layouts.md @@ -1,6 +1,9 @@ --- pagination_next: tour/dagre --- +import CodeBlock from '@theme/CodeBlock'; +import DirectionRight from '@site/static/d2/direction-right.d2'; +import DirectionUp from '@site/static/d2/direction-up.d2'; # Overview @@ -58,18 +61,16 @@ flows towards. - `left` ::: -```d2 -direction: right -x -> y -> z: hello -``` + + {DirectionRight} +
-```d2 -direction: up -x -> y -> z: hello -``` + + {DirectionUp} +
@@ -83,6 +84,11 @@ direction. We are investigating ways to hack it to work. ::: ```d2 +vars: { + d2-config: { + layout-engine: tala + } +} direction: down a -> b -> c diff --git a/docs/tour/linking.md b/docs/tour/linking.md index ff6a5ed8..91b91bbe 100644 --- a/docs/tour/linking.md +++ b/docs/tour/linking.md @@ -1,3 +1,7 @@ +import CodeBlock from '@theme/CodeBlock'; +import Cat from '@site/static/bespoke-d2/cat.d2'; +import LOTR from '@site/static/bespoke-d2/lotr.d2'; + # Linking between boards We've introduced `link` before as a way to jump to external resources. They can also be @@ -5,17 +9,9 @@ used to create interactivity to jump to other boards. We'll call these "internal Example of internal link: -```d2 -how does the cat go?: { - link: layers.cat -} - -layers: { - cat: { - meoowww - } -} -``` + + {Cat} + @@ -24,7 +20,7 @@ layers: { If your board name has a `.`, use quotes to target that board. For example: -```d2 +```d2-incomplete a.link: layers."2012.06" layers: { @@ -40,33 +36,9 @@ layers: { The underscore `_` is used to refer to the parent scope, but when used in `link` values, they refer not to parent containers, but to parent boards. -```d2 -The shire - -journey: { - link: layers.rivendell -} - -layers: { - rivendell: { - elves: { - elrond -> frodo: gives advice - } - - take me home sam.link: _ - go deeper: { - link: layers.moria - } - layers: { - moria: { - dwarves - - take me home sam.link: _._ - } - } - } -} -``` + + {LOTR} + diff --git a/docs/tour/model-view.md b/docs/tour/model-view.md index d1eb52b8..e32f0417 100644 --- a/docs/tour/model-view.md +++ b/docs/tour/model-view.md @@ -1,6 +1,10 @@ --- pagination_next: tour/modular-classes --- +import CodeBlock from '@theme/CodeBlock'; +import ImportsMVModels from '@site/static/d2/imports-mv-models.d2'; +import ImportsMVAccessView from '@site/static/d2/imports-mv-access-view.d2'; +import ImportsMVSSHView from '@site/static/d2/imports-mv-ssh-view.d2'; # Model-view @@ -8,37 +12,20 @@ A popular pattern defines your models once, and then reuses it across a number o different views. ## `models.d2` -```d2 -postgres: { - shape: cylinder - icon: https://icons.terrastruct.com/dev%2Fpostgresql.svg -} -it: IT Guy { - shape: person - style: { - fill: maroon - } -} -vpn: { - style: { - shadow: true - } - tooltip: IP is 192.2.2.1 -} -``` + + {ImportsMVModels} + ## `access-view.d2` -```d2 -...@models.d2 -it -> vpn -> postgres -``` + + {ImportsMVAccessView} +
## `ssh-view.d2` -```d2 -...@models.d2 -it -> postgres: ssh, bypassing VPN -``` + + {ImportsMVSSHView} +
diff --git a/docs/tour/modular-classes.md b/docs/tour/modular-classes.md index 15cfa072..7b153e32 100644 --- a/docs/tour/modular-classes.md +++ b/docs/tour/modular-classes.md @@ -1,52 +1,19 @@ +import CodeBlock from '@theme/CodeBlock'; +import ImportsClasses from '@site/static/d2/imports-classes.d2'; +import ImportsClassesMain from '@site/static/d2/imports-classes-main.d2'; + # Modular classes This pattern mirrors web development, separating HTML and CSS. ## `classes.d2` -```d2 -classes: { - base: { - style: { - border-radius: 4 - shadow: true - } - } - error: { - style.fill: red - style.stroke: red - } - med: { - width: 200 - height: 200 - style.font-size: 24 - } - large: { - width: 300 - height: 300 - style.font-size: 28 - } - xlarge: { - width: 400 - height: 400 - style.font-size: 32 - } - person: { - shape: person - style.stroke-dash: 3 - } -} -``` + + {ImportsClasses} + ## `main.d2` -```d2 -...@classes.d2 -user.class: person -error.class: [base; error] -modal.class: [base; med] - -user -> app.signup: click -app.signup -> error: invalid fields -app.signup -> modal: continue registration -``` + + {ImportsClassesMain} +
diff --git a/docs/tour/nested-composition.md b/docs/tour/nested-composition.md index ddaa3df5..a38ebb90 100644 --- a/docs/tour/nested-composition.md +++ b/docs/tour/nested-composition.md @@ -1,3 +1,8 @@ +import CodeBlock from '@theme/CodeBlock'; +import ImportsNested from '@site/static/bespoke-d2/imports-nested.d2'; +import ImportsNestedServiceB from '@site/static/d2/imports-nested-serviceB.d2'; +import ImportsNestedData from '@site/static/d2/imports-nested-data.d2'; + # Nested composition Imports make large compositions much more manageable. @@ -9,46 +14,19 @@ Rendering `overview.d2` gives us a nested diagram while each file is kept flat a readable. ### `overview.d2` -```d2 -serviceA -> serviceB -serviceB.link: layers.serviceB -layers: { - serviceB: @serviceB.d2 -} -``` + + {ImportsNested} + ### `serviceB.d2` -```d2 -aws vault: { - key - token -} -stripe: { - customer id -} -aws vault.key -> data -aws vault.token -> data -stripe.customer id -> data -data.link: layers.data -layers: { - data: @data.d2 -} -``` + + {ImportsNestedServiceB} + ### `data.d2` -```d2 -users: { - shape: sql_table - id: int - token: string - customer_id: string -} - -# Continue nesting as needed! -# layers: { -# ... -# } -``` + + {ImportsNestedData} + ## Render of `overview.d2` diff --git a/docs/tour/overrides.md b/docs/tour/overrides.md index 2ec39c4b..e4bdc58a 100644 --- a/docs/tour/overrides.md +++ b/docs/tour/overrides.md @@ -1,15 +1,19 @@ +import CodeBlock from '@theme/CodeBlock'; +import Overrides1 from '@site/static/d2/overrides-1.d2'; +import Overrides2 from '@site/static/d2/overrides-2.d2'; +import NullBasic from '@site/static/d2/null-basic.d2'; +import NullConnection from '@site/static/d2/null-connection.d2'; +import NullAttribute from '@site/static/d2/null-attribute.d2'; +import NullImplicitConnection from '@site/static/d2/null-implicit-connection.d2'; +import NullImplicitDescendant from '@site/static/d2/null-implicit-descendant.d2'; + # Overrides If you redeclare a shape, the new declaration is merged with the previous declaration. -```d2 -visual studio code text editor -visual studio code text editor: visual_studio_code_text_editor -# Remember that shape keys are case insensitive -visual studio CODE text editor: VisualStudioCodeTextEditor -visual studio code TEXT editor: Visual Studio Code Text Editor -visual STUDIO code text editor -``` + + {Overrides1} +
@@ -17,20 +21,9 @@ The latest explicit setting of the label takes priority. Here's a more complex example of overrides involving containers: -```d2 -aws_s3: AWS S3 California { - Monitoring -> California -} -aws_s3: "AWS S3 San Francisco, California" { - California.San Francisco -} - -# Equal to: -# aws_s3: "AWS S3 San Francisco, California" { -# Monitoring -> California -# California.San Francisco -# } -``` + + {Overrides2} +
@@ -38,12 +31,9 @@ aws_s3: "AWS S3 San Francisco, California" { You may override with the value `null` to delete the shape/connection/attribute. -```d2 -one -two - -one: null -``` + + {NullBasic} +
@@ -56,26 +46,17 @@ When is this useful? ### Nulling a connection -```d2 -one -> two - -(one -> two)[0]: null -``` + + {NullConnection} +
### Nulling an attribute -```d2 -one: { - style: { - fill: pink - stroke: green - } -} - -one.style.stroke: null -``` + + {NullAttribute} +
@@ -85,24 +66,16 @@ one.style.stroke: null If you null a shape with connections, its connections are also nulled (since every connection in D2 needs an endpoint). -```d2 -one -> two - -two: null -``` + + {NullImplicitConnection} +
If you null a shape with descendents, those descendants are also nulled. -```d2 -one: { - two: { - three - } -} - -one.two: null -``` + + {NullImplicitDescendant} +
diff --git a/docs/tour/positions.md b/docs/tour/positions.md index dde2dcfa..93a42e89 100644 --- a/docs/tour/positions.md +++ b/docs/tour/positions.md @@ -1,3 +1,9 @@ +import CodeBlock from '@theme/CodeBlock'; +import NearConstant from '@site/static/d2/near-constant.d2'; +import NearContainer from '@site/static/d2/near-container.d2'; +import NearExplanation from '@site/static/d2/near-explanation.d2'; +import NearLabelIcon from '@site/static/d2/near-label-icon.d2'; + # Positions In general, positioning is controlled entirely by the layout engine. It's one of the @@ -23,76 +29,25 @@ Let's explore some use cases: ### Giving your diagram a title -```d2 -title: |md - # A winning strategy -| { near: top-center } - -poll the people -> results -results -> unfavorable -> poll the people -results -> favorable -> will of the people -``` + + {NearConstant} +
### Creating a legend -```d2 -direction: right - -x -> y: { - style.stroke: green -} - -y -> z: { - style.stroke: red -} - -legend: { - near: bottom-center - color1: foo { - shape: text - style.font-color: green - } - - color2: bar { - shape: text - style.font-color: red - } -} -``` + + {NearContainer} +
### Longform description or explanation -```d2 -explanation: |md - # LLMs - The Large Language Model (LLM) is a powerful AI\ - system that learns from vast amounts of text data.\ - By analyzing patterns and structures in language,\ - it gains an understanding of grammar, facts,\ - and even some reasoning abilities. As users input text,\ - the LLM predicts the most likely next words or phrases\ - to create coherent responses. The model\ - continuously fine-tunes its output, considering both the\ - user's input and its own vast knowledge base.\ - This cutting-edge technology enables LLM to generate human-like text,\ - making it a valuable tool for various applications. -| { - near: center-left -} - -ML Platform -> Pre-trained models -ML Platform -> Model registry -ML Platform -> Compiler -ML Platform -> Validation -ML Platform -> Auditing - -Model registry -> Server.Batch Predictor -Server.Online Model Server -``` + + {NearExplanation} +
@@ -100,22 +55,9 @@ Server.Online Model Server The `near` can be nested to `label` and `icon` to specify their positions. -```d2 -direction: right -x -> y - -x: worker { - label.near: top-center - icon: https://icons.terrastruct.com/essentials%2F005-programmer.svg - icon.near: outside-top-right -} - -y: profits { - label.near: bottom-right - icon: https://icons.terrastruct.com/essentials%2Fprofits.svg - icon.near: outside-top-left -} -``` + + {NearLabelIcon} +
@@ -146,6 +88,11 @@ You can also set `near` to the absolute ID of another shape to hint to the layou that they should be in the vicinity of one another. ```d2 +vars: { + d2-config: { + layout-engine: tala + } +} aws: { load_balancer -> api api -> db @@ -167,7 +114,7 @@ explanation: |md Notice how the text is positioned near the `aws` node and not the `gcloud` node. -text near example +text near example ## Top and left diff --git a/docs/tour/scenarios.md b/docs/tour/scenarios.md index 2ed1bea4..77d4c1a5 100644 --- a/docs/tour/scenarios.md +++ b/docs/tour/scenarios.md @@ -1,3 +1,6 @@ +import CodeBlock from '@theme/CodeBlock'; +import Animated from '@site/static/bespoke-d2/animated.d2'; + # Scenarios A "Scenario" represents a different view of the base Layer. @@ -10,86 +13,6 @@ new connection to show an alternate view of the deployment diagram.
-```d2 -direction: right - -title: { - label: Normal deployment - near: bottom-center - shape: text - style.font-size: 40 - style.underline: true -} - -local: { - code: { - icon: https://icons.terrastruct.com/dev/go.svg - } -} -local.code -> github.dev: commit - -github: { - icon: https://icons.terrastruct.com/dev/github.svg - dev - master: { - workflows - } - - dev -> master.workflows: merge trigger -} - -github.master.workflows -> aws.builders: upload and run - -aws: { - builders -> s3: upload binaries - ec2 <- s3: pull binaries - - builders: { - icon: https://icons.terrastruct.com/aws/Developer%20Tools/AWS-CodeBuild_light-bg.svg - } - s3: { - icon: https://icons.terrastruct.com/aws/Storage/Amazon-S3-Glacier_light-bg.svg - } - ec2: { - icon: https://icons.terrastruct.com/aws/_Group%20Icons/EC2-instance-container_light-bg.svg - } -} - -local.code -> aws.ec2: { - style.opacity: 0.0 -} - -scenarios: { - hotfix: { - title.label: Hotfix deployment - (local.code -> github.dev)[0].style: { - stroke: "#ca052b" - opacity: 0.1 - } - - github: { - dev: { - style.opacity: 0.1 - } - master: { - workflows: { - style.opacity: 0.1 - } - style.opacity: 0.1 - } - - (dev -> master.workflows)[0].style.opacity: 0.1 - style.opacity: 0.1 - style.fill: "#ca052b" - } - - (github.master.workflows -> aws.builders)[0].style.opacity: 0.1 - - local.code -> aws.ec2: { - style.opacity: 1 - style.stroke-dash: 5 - style.stroke: "#167c3c" - } - } -} -``` + + {Animated} + diff --git a/docs/tour/sequence-diagrams.md b/docs/tour/sequence-diagrams.md index fd35457b..ee6f05fc 100644 --- a/docs/tour/sequence-diagrams.md +++ b/docs/tour/sequence-diagrams.md @@ -1,12 +1,21 @@ +import CodeBlock from '@theme/CodeBlock'; +import SequenceDiagrams1 from '@site/static/d2/sequence-diagrams-1.d2'; +import SequenceDiagrams2 from '@site/static/d2/sequence-diagrams-2.d2'; +import SequenceDiagrams3 from '@site/static/d2/sequence-diagrams-3.d2'; +import SequenceDiagrams4 from '@site/static/d2/sequence-diagrams-4.d2'; +import SequenceDiagramsScope from '@site/static/d2/sequence-diagrams-scope.d2'; +import SequenceDiagramsGroup from '@site/static/d2/sequence-diagrams-group.d2'; +import SequenceDiagramsNote from '@site/static/d2/sequence-diagrams-note.d2'; +import SequenceDiagramsSelf from '@site/static/d2/sequence-diagrams-self.d2'; +import SequenceDiagramsLifeline from '@site/static/d2/sequence-diagrams-lifeline.d2'; + # Sequence Diagrams Sequence diagrams are created by setting `shape: sequence_diagram` on an object. -```d2 -shape: sequence_diagram -alice -> bob: What does it mean\nto be well-adjusted? -bob -> alice: The ability to play bridge or\ngolf as if they were games. -``` + + {SequenceDiagrams1} +
@@ -21,23 +30,9 @@ Children of sequence diagrams share the same scope throughout the sequence diagr For example: -```d2 -Office chatter: { - shape: sequence_diagram - alice: Alice - bob: Bobby - awkward small talk: { - alice -> bob: uhm, hi - bob -> alice: oh, hello - icebreaker attempt: { - alice -> bob: what did you have for lunch? - } - unfortunate outcome: { - bob -> alice: that's personal - } - } -} -``` + + {SequenceDiagramsScope} +
@@ -76,40 +71,9 @@ An actor in D2 is also known elsewhere as "participant". Like every other object in D2, they can be contained, connected, relabeled, re-styled, and treated like any other object. -```d2 -direction: right -Before and after becoming friends: { - 2007: Office chatter in 2007 { - shape: sequence_diagram - alice: Alice - bob: Bobby - awkward small talk: { - alice -> bob: uhm, hi - bob -> alice: oh, hello - icebreaker attempt: { - alice -> bob: what did you have for lunch? - } - unfortunate outcome: { - bob -> alice: that's personal - } - } - } - - 2012: Office chatter in 2012 { - shape: sequence_diagram - alice: Alice - bob: Bobby - alice -> bob: Want to play with ChatGPT? - bob -> alice: Yes! - bob -> alice.play: Write a play... - alice.play -> bob.play: about 2 friends... - bob.play -> alice.play: who find love... - alice.play -> bob.play: in a sequence diagram - } - - 2007 -> 2012: Five\nyears\nlater -} -``` + + {SequenceDiagrams2} +
@@ -123,14 +87,9 @@ A span in D2 is also known elsewhere as a "lifespan", "activation box", and "act You can specify a span by connecting a nested object on an actor. -```d2 -shape: sequence_diagram -alice.t1 -> bob -alice.t2 -> bob.a -alice.t2.a -> bob.a -alice.t2.a <- bob.a -alice.t2 <- bob.a -``` + + {SequenceDiagrams3} +
@@ -146,18 +105,9 @@ We saw an example of this in an earlier example when explaining scoping rules. M formally, a group is a container within a `sequence_diagram` shape which is not connected to anything but has connections or objects inside. -```d2 -shape: sequence_diagram -# Predefine actors -alice; bob -shower thoughts: { - alice -> bob: A physicist is an atom's way of knowing about atoms. - alice -> bob: Today is the first day of the rest of your life. -} -life advice: { - bob -> alice: If all else fails, lower your standards. -} -``` + + {SequenceDiagramsGroup} + :::caution Due to the unique scoping rules in sequence diagrams, when you are within a group, the @@ -172,16 +122,9 @@ example that `alice` and `bob` are explicitly declared before group declarations Notes are declared by defining a nested object on an actor with no connections going to it. -```d2 -shape: sequence_diagram -alice -> bob -bob."In the eyes of my dog, I'm a man." -# Notes can go into groups, too -important insight: { - bob."Cold hands, no gloves." -} -bob -> alice: Chocolate chip. -``` + + {SequenceDiagramsNote} +
@@ -189,12 +132,9 @@ bob -> alice: Chocolate chip. Self-referential messages can be declared from an actor to the themselves. -```d2 -shape: sequence_diagram -son -> father: Can I borrow your car? -friend -> father: Never lend your car to anyone to whom you have given birth. -father -> father: internal debate ensues -``` + + {SequenceDiagramsSelf} +
@@ -203,49 +143,18 @@ father -> father: internal debate ensues You can style shapes and connections like any other. Here we make some messages dashed and set the shape on an actor. -```d2 -shape: sequence_diagram -scorer: { shape: person } -scorer.t -> itemResponse.t: getItem() -scorer.t <- itemResponse.t: item { - style.stroke-dash: 5 -} - -scorer.t -> item.t1: getRubric() -scorer.t <- item.t1: rubric { - style.stroke-dash: 5 -} - -scorer.t -> essayRubric.t: applyTo(essayResp) -itemResponse -> essayRubric.t.c -essayRubric.t.c -> concept.t: match(essayResponse) -scorer <- essayRubric.t: score { - style.stroke-dash: 5 -} - -scorer.t -> itemOutcome.t1: new -scorer.t -> item.t2: getNormalMinimum() -scorer.t -> item.t3: getNormalMaximum() - -scorer.t -> itemOutcome.t2: setScore(score) -scorer.t -> itemOutcome.t3: setFeedback(missingConcepts) + + {SequenceDiagrams4} + -```
Lifeline edges (those lines going from top-down) inherit the actor's `stroke` and `stroke-dash` styles. -```d2 -shape: sequence_diagram -alice -> bob: What does it mean\nto be well-adjusted? -bob -> alice: The ability to play bridge or\ngolf as if they were games. - -alice.style: { - stroke: red - stroke-dash: 0 -} -``` + + {SequenceDiagramsLifeline} +
diff --git a/docs/tour/shapes.md b/docs/tour/shapes.md index d59d0145..aa54900b 100644 --- a/docs/tour/shapes.md +++ b/docs/tour/shapes.md @@ -1,18 +1,16 @@ +import CodeBlock from '@theme/CodeBlock'; +import Shapes1 from '@site/static/d2/shapes-1.d2'; +import Shapes2 from '@site/static/d2/shapes-2.d2'; + # Shapes ## Basics You can declare shapes like so: -```d2 -imAShape -im_a_shape -im a shape -i'm a shape -# notice that one-hyphen is not a connection -# whereas, `a--shape` would be a connection -a-shape -``` + + {Shapes1} +
@@ -37,12 +35,9 @@ Cloud.shape: cloud ## Example -```d2 -pg: PostgreSQL -Cloud: my cloud -Cloud.shape: cloud -SQLite; Cassandra -``` + + {Shapes2} +
diff --git a/docs/tour/sql-tables.md b/docs/tour/sql-tables.md index d29a58f2..80db5815 100644 --- a/docs/tour/sql-tables.md +++ b/docs/tour/sql-tables.md @@ -1,19 +1,17 @@ +import CodeBlock from '@theme/CodeBlock'; +import Tables1 from '@site/static/d2/tables-1.d2'; +import Tables2 from '@site/static/d2/tables-2.d2'; +import Tables3 from '@site/static/d2/tables-3.d2'; + # SQL Tables ## Basics You can easily diagram entity-relationship diagrams (ERDs) in D2 by using the `sql_table` shape. Here's a minimal example: -```d2 -my_table: { - shape: sql_table - # This is defined using the shorthand syntax for labels discussed in the containers section. - # But here it's for the type of a constraint. - # The id field becomes a map that looks like {type: int; constraint: primary_key} - id: int {constraint: primary_key} - last_updated: timestamp with time zone -} -``` + + {Tables1} +
@@ -43,23 +41,9 @@ x: int { constraint: [primary_key; unique] } Here's an example of how you'd define a foreign key connection between two tables: -```d2 -objects: { - shape: sql_table - id: int {constraint: primary_key} - disk: int {constraint: foreign_key} - - json: jsonb {constraint: unique} - last_updated: timestamp with time zone -} - -disks: { - shape: sql_table - id: int {constraint: primary_key} -} - -objects.disk -> disks.id -``` + + {Tables2} +
@@ -73,22 +57,8 @@ connections point to the exact row. Like all other shapes, you can nest `sql_tables` into containers and define edges to them from other shapes. Here's an example: -```d2 -cloud: { - disks: { - shape: sql_table - id: int {constraint: primary_key} - } - blocks: { - shape: sql_table - id: int {constraint: primary_key} - disk: int {constraint: foreign_key} - blob: blob - } - blocks.disk -> disks.id - - AWS S3 Vancouver -> disks -} -``` + + {Tables3} +
diff --git a/docs/tour/steps.md b/docs/tour/steps.md index 9d613246..f07529ce 100644 --- a/docs/tour/steps.md +++ b/docs/tour/steps.md @@ -1,3 +1,6 @@ +import CodeBlock from '@theme/CodeBlock'; +import Chicken from '@site/static/bespoke-d2/chicken.d2'; + # Steps A "Step" represents a step in a sequence of events. @@ -10,21 +13,6 @@ defined, because it was inherited from Step 2, which inherited it from Step 1.
-```d2 -Chicken's plan: { - style.font-size: 35 - near: top-center - shape: text -} -steps: { - 1: { - Approach road - } - 2: { - Approach road -> Cross road - } - 3: { - Cross road -> Make you wonder why - } -} -``` + + {Chicken} + diff --git a/docs/tour/strings.md b/docs/tour/strings.md index 48e2b1d9..471158d7 100644 --- a/docs/tour/strings.md +++ b/docs/tour/strings.md @@ -1,6 +1,9 @@ --- pagination_next: tour/comments --- +import CodeBlock from '@theme/CodeBlock'; +import Strings2 from '@site/static/d2/strings-2.d2'; + # Strings ## Unquoted strings @@ -30,9 +33,9 @@ language. The syntax highlighting will make it clear if you're using a forbidden If you need to use such symbols, you can use single or double quoted strings: -```d2 -'$$$' -> "###" -``` + + {Strings2} +
diff --git a/docs/tour/style.md b/docs/tour/style.md index 2c53b768..deae3cc1 100644 --- a/docs/tour/style.md +++ b/docs/tour/style.md @@ -1,3 +1,26 @@ +import CodeBlock from '@theme/CodeBlock'; +import StylesOpacity from '@site/static/d2/styles-opacity.d2'; +import StylesStroke from '@site/static/d2/styles-stroke.d2'; +import StylesFill from '@site/static/d2/styles-fill.d2'; +import StylesFillTransparent from '@site/static/d2/styles-fill-transparent.d2'; +import StylesFillPattern from '@site/static/d2/styles-fill-pattern.d2'; +import StylesStrokeWidth from '@site/static/d2/styles-stroke-width.d2'; +import StylesStrokeDash from '@site/static/d2/styles-stroke-dash.d2'; +import StylesBorderRadius from '@site/static/d2/styles-border-radius.d2'; +import Pill from '@site/static/d2/pill.d2'; +import StylesShadow from '@site/static/d2/styles-shadow.d2'; +import Styles3d from '@site/static/d2/styles-3d.d2'; +import StylesMultiple from '@site/static/d2/styles-multiple.d2'; +import StylesDoubleBorder from '@site/static/d2/styles-double-border.d2'; +import StylesFont from '@site/static/d2/styles-font.d2'; +import StylesFontSize from '@site/static/d2/styles-font-size.d2'; +import StylesFontColor from '@site/static/d2/styles-font-color.d2'; +import StylesTableColor from '@site/static/d2/styles-table-color.d2'; +import StylesAnimated from '@site/static/d2/styles-animated.d2'; +import StylesTextDecoration from '@site/static/d2/styles-text-decoration.d2'; +import StylesTextTransform from '@site/static/d2/styles-text-transform.d2'; +import StylesRoot from '@site/static/d2/styles-root.d2'; + # Styles If you'd like to customize the style of a shape, the following reserved keywords can be @@ -37,15 +60,9 @@ brevity. Float between `0` and `1`. -```d2 -x -> y: hi { - style: { - opacity: 0.4 - } -} -x.style.opacity: 0 -y.style.opacity: 0.7 -``` + + {StylesOpacity} +
@@ -53,15 +70,9 @@ y.style.opacity: 0.7 CSS color name or hex code. -```d2 -x -> y: hi { - style: { - stroke: deepskyblue - } -} -# We need quotes for hex otherwise it gets interpreted as comment -x.style.stroke: "#f4a261" -``` + + {StylesStroke} +
@@ -76,11 +87,9 @@ already used to control header's `fill`). CSS color name or hex code. -```d2 -x -> y: hi -x.style.fill: "#f4a261" -y.style.fill: honeydew -``` + + {StylesFill} +
@@ -92,13 +101,9 @@ For `sql_table`s and `class`es, `fill` is applied to the header. Want transparent? -```d2 -x: { - y - y.style.fill: transparent -} -x.style.fill: PapayaWhip -``` + + {StylesFillTransparent} +
@@ -110,12 +115,9 @@ Available patterns: - `lines` - `grain` -```d2 -style.fill-pattern: dots -x -> y: hi -x.style.fill-pattern: lines -y.style.fill-pattern: grain -``` + + {StylesFillPattern} +
@@ -123,14 +125,9 @@ y.style.fill-pattern: grain Integer between `1` and `15`. -```d2 -x -> y: hi { - style: { - stroke-width: 8 - } -} -x.style.stroke-width: 1 -``` + + {StylesStrokeWidth} +
@@ -138,14 +135,9 @@ x.style.stroke-width: 1 Integer between `0` and `10`. -```d2 -x -> y: hi { - style: { - stroke-dash: 3 - } -} -x.style.stroke-dash: 5 -``` + + {StylesStrokeDash} +
@@ -153,11 +145,9 @@ x.style.stroke-dash: 5 Integer between `0` and `20`. -```d2 -x -> y: hi -x.style.border-radius: 3 -y.style.border-radius: 8 -``` + + {StylesBorderRadius} +
@@ -169,9 +159,9 @@ on connections whose routes have corners. Specifying a very high value creates a "pill" effect. -```d2 -tylenol.style.border-radius: 999 -``` + + {Pill} +
@@ -179,10 +169,9 @@ tylenol.style.border-radius: 999 `true` or `false`. -```d2 -x -> y: hi -x.style.shadow: true -``` + + {StylesShadow} +
@@ -190,10 +179,9 @@ x.style.shadow: true `true` or `false`. -```d2 -x -> y: hi -x.style.3d: true -``` + + {Styles3d} +
@@ -201,10 +189,9 @@ x.style.3d: true `true` or `false`. -```d2 -x -> y: hi -x.style.multiple: true -``` + + {StylesMultiple} +
@@ -212,12 +199,9 @@ x.style.multiple: true `true` or `false`. -```d2 -x -> y: hi -x.style.double-border: true -y.shape: circle -y.style.double-border: true -``` + + {StylesDoubleBorder} +
@@ -225,15 +209,9 @@ y.style.double-border: true Currently the only option is to specify `mono`. More coming soon. -```d2 -x -> y: hi { - style: { - font: mono - } -} -x.style.font: mono -y.style.font: mono -``` + + {StylesFont} +
@@ -241,15 +219,9 @@ y.style.font: mono Integer between `8` and `100`. -```d2 -x -> y: hi { - style: { - font-size: 28 - } -} -x.style.font-size: 8 -y.style.font-size: 55 -``` + + {StylesFontSize} +
@@ -257,14 +229,9 @@ y.style.font-size: 55 CSS color name or hex code. -```d2 -x -> y: hi { - style: { - font-color: red - } -} -x.style.font-color: "#f4a261" -``` + + {StylesFontColor} +
@@ -279,11 +246,9 @@ controls other colors in the body). `true` or `false`. -```d2 -x -> y: hi { - style.animated: true -} -``` + + {StylesAnimated} +
@@ -291,18 +256,9 @@ x -> y: hi { `true` or `false`. -```d2 -x -> y: hi { - style: { - bold: true - } -} -x.style.underline: true -y.style.italic: true -# By default, shape labels are bold. Bold has precedence over italic, so unbold to see -# italic style -y.style.bold: false -``` + + {StylesTextDecoration} +
@@ -315,15 +271,9 @@ y.style.bold: false - `title` - `none` (used for negating caps lock that special themes may apply) -```d2 -x -> y: hi { - style: { - text-transform: capitalize - } -} -x.style.text-transform: lowercase -y.style.text-transform: uppercase -``` + + {StylesTextTransform} +
@@ -341,14 +291,9 @@ Currently the set of supported keywords are: - `stroke-dash` - `double-border`: two frames, which is a popular framing method -```d2 -x -> y: hi -style: { - fill: LightBlue - stroke: FireBrick - stroke-width: 2 -} -``` + + {StylesRoot} +
diff --git a/docs/tour/text.md b/docs/tour/text.md index dbcb367d..7cdff843 100644 --- a/docs/tour/text.md +++ b/docs/tour/text.md @@ -2,19 +2,20 @@ sidebar_label: Text & Code pagination_next: tour/icons --- +import CodeBlock from '@theme/CodeBlock'; +import Markdown from '@site/static/d2/markdown.d2'; +import Text2 from '@site/static/d2/text-2.d2'; +import Code2 from '@site/static/d2/code-2.d2'; +import NonMarkdownText from '@site/static/d2/non-markdown-text.d2'; +import Latex from '@site/static/d2/latex.d2'; + # Text ## Standalone text is Markdown -```d2 -explanation: |md - # I can do headers - - lists - - lists - - And other normal markdown stuff -| -``` + + {Markdown} +
@@ -29,14 +30,9 @@ Chinese, Japanese, Korean, even emojis! You can use `latex` or `tex` to specify a LaTeX language block. -```d2 -plankton -> formula: will steal -formula: { - equation: |latex - \\lim_{h \\rightarrow 0 } \\frac{f(x+h)-f(x)}{h} - | -} -``` + + {Text2} +
@@ -72,15 +68,9 @@ This is coming soon. Change `md` to a programming language for code blocks -```d2 -explanation: |go - awsSession := From(c.Request.Context()) - client := s3.New(awsSession) - - ctx, cancelFn := context.WithTimeout(c.Request.Context(), AWS_TIMEOUT) - defer cancelFn() -| -``` + + {Code2} +
@@ -90,20 +80,9 @@ In some cases, you may want non-Markdown text. Maybe you just don't like Markdow GitHub-styling of Markdown that D2 uses, or you want to quickly change a shape to text. Just set `shape: text`. -```d2 -title: A winning strategy { - shape: text - near: top-center - style: { - font-size: 55 - italic: true - } -} - -poll the people -> results -results -> unfavorable -> poll the people -results -> favorable -> will of the people -``` + + {NonMarkdownText} +
@@ -142,68 +121,8 @@ my_code: |`ts D2 includes the following LaTeX plugins: -```d2 -grid-columns: 3 -grid-gap: 100 - -*.style.fill: transparent -*.style.stroke: black - -amscd plugin: { - ex: |tex - \\begin{CD} B @>{\\text{very long label}}>> C S^{{\\mathcal{W}}_\\Lambda}\\otimes T @>j>> T\\\\ @VVV V \\end{CD} - | -} - -braket plugin: { - ex: |tex - \\bra{a}\\ket{b} - | -} - -cancel plugin: { - ex: |tex - \\cancel{Culture + 5} - | -} - -color plugin: { - ex: |tex - \\textcolor{red}{y} = \\textcolor{green}{\\sin} x - | -} - -gensymb plugin: { - ex: |tex - \\lambda = 10.6\\,\\micro\\mathrm{m} - | -} - -mhchem plugin: { - ex: |tex - \ce{SO4^2- + Ba^2+ -> BaSO4 v} - | -} - -physics plugin: { - ex: |tex - \\var{F[g(x)]} - \\dd(\\cos\\theta) - | -} - -multilines: { - ex: |tex - \\displaylines{x = a + b \\\\ y = b + c} - \\sum_{k=1}^{n} h_{k} \\int_{0}^{1} \\bigl(\\partial_{k} f(x_{k-1}+t h_{k} e_{k}) -\\partial_{k} f(a)\\bigr) \\,dt - | -} - -asm: { - ex: |latex - \\min_{ \\mathclap{\\substack{ x \\in \\mathbb{R}^n \\ x \\geq 0 \\ Ax \\leq b }}} c^T x - | -} -``` + + {Latex} +
diff --git a/docs/tour/themes.md b/docs/tour/themes.md index ec815377..ae0efe85 100644 --- a/docs/tour/themes.md +++ b/docs/tour/themes.md @@ -1,6 +1,9 @@ --- pagination_next: tour/style --- +import CodeBlock from '@theme/CodeBlock'; +import TerminalTheme from '@site/static/bespoke-d2/terminal-theme.d2'; + # Themes D2 comes with many themes that make your diagram look professional and ready to insert @@ -91,51 +94,9 @@ Source code for the above diagram (rendered with ELK) is as follows. Notice that the properties apparent in the diagram do not appear in the source, such as the casing of the labels, because the special theme uses different defaults. -```d2 -network: { - cell tower: { - satellites: { - shape: stored_data - style.multiple: true - } - - transmitter - - satellites -> transmitter: send - satellites -> transmitter: send - satellites -> transmitter: send - } - - online portal: { - ui: {shape: hexagon} - } - - data processor: { - storage: { - shape: cylinder - style.multiple: true - } - } - - cell tower.transmitter -> data processor.storage: phone logs -} - -user: { - shape: person - width: 130 -} - -user -> network.cell tower: make call -user -> network.online portal.ui: access { - style.stroke-dash: 3 -} - -api server -> network.online portal.ui: display -api server -> logs: persist -logs: {shape: page; style.multiple: true} - -network.data processor -> api server -``` + + {TerminalTheme} + ## Customizing themes @@ -149,7 +110,7 @@ This is controlled by two [configuration variables](/tour/vars#configuration-var Adding this snippet to the above code results in the following diagram. -```d2 +```d2-incomplete vars: { d2-config: { theme-overrides: { diff --git a/docs/tour/uml-classes.md b/docs/tour/uml-classes.md index bcfbc346..d54e1875 100644 --- a/docs/tour/uml-classes.md +++ b/docs/tour/uml-classes.md @@ -1,17 +1,16 @@ +import CodeBlock from '@theme/CodeBlock'; +import Classes1 from '@site/static/d2/classes-1.d2'; +import Classes2 from '@site/static/d2/classes-2.d2'; + # UML Classes ## Basics D2 fully supports UML Class diagrams. Here's a minimal example: -```d2 -MyClass: { - shape: class - - field: "[]string" - method(a uint64): (x, y int) -} -``` + + {Classes1} +
@@ -38,29 +37,8 @@ See https://www.uml-diagrams.org/visibility.html Here's an example with differing visibilities and more complex types: -```d2 -D2 Parser: { - shape: class - - # Default visibility is + so no need to specify. - +reader: io.RuneReader - readerPos: d2ast.Position - - # Private field. - -lookahead: "[]rune" - - # Protected field. - # We have to escape the # to prevent the line from being parsed as a comment. - \#lookaheadPos: d2ast.Position - - +peek(): (r rune, eof bool) - rewind() - commit() - - \#peekn(n int): (s string, eof bool) -} - -"github.com/terrastruct/d2parser.git" -> D2 Parser -``` + + {Classes2} +
diff --git a/docs/tour/vars.md b/docs/tour/vars.md index 130f0b15..23ac6499 100644 --- a/docs/tour/vars.md +++ b/docs/tour/vars.md @@ -1,18 +1,19 @@ +import CodeBlock from '@theme/CodeBlock'; +import VarsIntro from '@site/static/d2/vars-intro.d2'; +import VarsNested from '@site/static/d2/vars-nested.d2'; +import VarsScoped from '@site/static/d2/vars-scoped.d2'; +import VarsEscaped from '@site/static/d2/vars-escaped.d2'; +import VarsSpread from '@site/static/d2/vars-spread.d2'; +import VarsConfig from '@site/static/d2/vars-config.d2'; + # Variables & Substitutions `vars` is a special keyword that lets you define variables. These variables can be referenced with the substitution syntax: `${}`. -```d2 -vars: { - server-name: Cat -} - -server1: ${server-name}-1 -server2: ${server-name}-2 - -server1 <-> server2 -``` + + {VarsIntro} +
@@ -20,26 +21,9 @@ server1 <-> server2 Use `.` to refer to nested variables. -```d2 -vars: { - primaryColors: { - button: { - active: "#4baae5" - border: black - } - } -} - -button: { - width: 100 - height: 40 - style: { - border-radius: 5 - fill: ${primaryColors.button.active} - stroke: ${primaryColors.button.border} - } -} -``` + + {VarsNested} +
@@ -49,34 +33,17 @@ They work just like variable scopes in programming. Substitutions can refer to v defined in a more outer scope, but not a more inner scope. If a variable appears in two scopes, the one closer to the substitution is used. -```d2 -vars: { - region: Global - font: mono -} - -lb: ${region} load balancer -lb.style.font: ${font} - -zone1: { - vars: { - region: us-east-1 - } - server: ${region} API - server.style.font: ${font} -} -``` + + {VarsScoped} +
## Single quotes bypass substitutions -```d2 -vars: { - names: John and Joyce -} -a -> b: 'Send field ${names}' -``` + + {VarsEscaped} +
@@ -85,24 +52,9 @@ a -> b: 'Send field ${names}' If `x` is a map or an array, `...${x}` will spread the contents of `x` into either a map or an array. -```d2 -vars: { - base-constraints: [NOT NULL; UNQ] - disclaimer: DISCLAIMER { - I am not a lawyer - near: top-center - } -} - -data: { - shape: sql_table - a: int {constraint: [PK; ...${base-constraints}]} -} - -custom-disclaimer: DRAFT DISCLAIMER { - ...${disclaimer} -} -``` + + {VarsSpread} +
@@ -111,21 +63,9 @@ custom-disclaimer: DRAFT DISCLAIMER { Some configurations can be made directly in `vars` instead of using flags or environment variables. -```d2 -vars: { - d2-config: { - theme-id: 4 - dark-theme-id: 200 - pad: 0 - center: true - sketch: true - layout-engine: elk - } -} - -direction: right -x -> y -``` + + {VarsConfig} + This is equivalent to calling the following with no `vars`: ```shell diff --git a/docs/tour/version-visualization.md b/docs/tour/version-visualization.md index 99d97f1b..8d47d7df 100644 --- a/docs/tour/version-visualization.md +++ b/docs/tour/version-visualization.md @@ -1,6 +1,10 @@ --- pagination_next: tour/imported-template --- +import CodeBlock from '@theme/CodeBlock'; +import ImportsVVHistory from '@site/static/d2/imports-vv-history.d2'; +import ImportsVVUsersCurrent from '@site/static/d2/imports-vv-users-current.d2'; +import ImportsVVUsersV01 from '@site/static/d2/imports-vv-users-v0.1.d2'; # Version visualization @@ -10,38 +14,19 @@ You want to understand how the schema of a system has evolved over time. As long diagram is modularized with imports, such a visualization is easy to whip up. - `history.d2` -```d2 -direction: right -Users 1: Users Table (v0.1) { - ...@"users-v0.1" -} - -Users 2: Users Table (current) { - ...@"users-current" -} - -Users 1 -> Users 2 -``` + + {ImportsVVHistory} + - `users.d2` (latest version, 0.2) -```d2 -users: { - id: int {constraint: primary_key} - email: int {constraint: foreign_key} - name: string - password: text - created_at: timestamp - last_updated: timestamp -} + + {ImportsVVUsersCurrent} + -emails: { - id: int {constraint: [primary_key; unique]} - local: string - domain: string - verified: boolean -} -users.email -> emails.id -``` +- `users.d2` (0.1) + + {ImportsVVUsersV01} + Since you want how `users.d2` looked like at `v0.1`, you use `git` to get that version: @@ -61,7 +46,7 @@ the two results. The evaluation starts by comparing their design decisions in an overarching diagram projected in a dark room behind a closed door. - `compare.d2` -```d2 +```d2-incomplete Team Alpha: { Quick facts: |md - 3 L6 engineers diff --git a/docusaurus.config.js b/docusaurus.config.js index a46ed1ba..9740676a 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -154,6 +154,10 @@ const config = { test: /\.wasm$/, type: "asset", }, + { + test: /\.d2/, + type: "asset/source", + }, { test: new RegExp(`d2-vscode/syntaxes/.*\.json$`), type: "asset", diff --git a/package.json b/package.json index 4f923370..7cb215dc 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@mdx-js/react": "^1.6.22", "clsx": "^1.1.1", "docusaurus-plugin-sass": "^0.2.3", + "pako": "^2.1.0", "prettier": "^2.7.1", "prism-react-renderer": "^1.3.1", "react": "^17.0.2", diff --git a/src/pages/index.js b/src/pages/index.js index 7b753603..641db825 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -11,52 +11,7 @@ import FeatureHighlights from "@site/src/components/Directory/FeatureHighlights" import MoreFeatures from "@site/src/components/Directory/MoreFeatures"; import D2CodeBlock from "@theme/CodeBlock"; import Example from "@site/static/img/generated/terminal-theme.svg2"; - -const exampleD2 = `logs: { - shape: page - style.multiple: true -} -user: User {shape: person} -network: Network { - tower: Cell Tower { - satellites: { - shape: stored_data - style.multiple: true - } - - satellites -> transmitter - satellites -> transmitter - satellites -> transmitter - transmitter - } - processor: Data Processor { - storage: Storage { - shape: cylinder - style.multiple: true - } - } - portal: Online Portal { - UI - } - - tower.transmitter -> processor: phone logs -} -server: API Server - -user -> network.tower: Make call -network.processor -> server -network.processor -> server -network.processor -> server - -server -> logs -server -> logs -server -> logs: persist - -server -> network.portal.UI: display -user -> network.portal.UI: access { - style.stroke-dash: 3 -} -`; +import ExampleCode from "@site/static/bespoke-d2/terminal-theme.d2"; export default function Home() { const context = useDocusaurusContext(); @@ -94,7 +49,7 @@ export default function Home() { className="language-d2" containerClassName="Directory__Example--Code" > - {exampleD2} + {ExampleCode}
{ if (tmGrammar) { @@ -120,20 +128,49 @@ export default function D2CodeBlock(props) { } } + function base64url_encode(buffer) { + return btoa(Array.from(buffer, (b) => String.fromCharCode(b)).join("")) + .replace(/\+/g, "-") + .replace(/\//g, "_"); + } + + function compressAndEncodeScript() { + const textEncoder = new TextEncoder(); + const uint8Array = textEncoder.encode(code); + const deflate = new pako.Deflate({ level: 9, windowBits: -15 }); + deflate.push(uint8Array, true); + + return base64url_encode(deflate.result); + } + return (
+ {props.className === "language-d2" && ( + + )}
{children}
); diff --git a/static/bespoke-d2/terminal-theme.d2 b/static/bespoke-d2/terminal-theme.d2 index 59d147fe..f40e88e1 100644 --- a/static/bespoke-d2/terminal-theme.d2 +++ b/static/bespoke-d2/terminal-theme.d2 @@ -1,3 +1,10 @@ +vars: { + d2-config: { + layout-engine: elk + # Terminal theme code + theme-id: 300 + } +} network: { cell tower: { satellites: { diff --git a/static/blog/sketch/animated.d2 b/static/blog/sketch/animated.d2 index ee3d0a1e..e2dc0c45 100644 --- a/static/blog/sketch/animated.d2 +++ b/static/blog/sketch/animated.d2 @@ -1 +1,6 @@ +vars: { + d2-config: { + sketch: true + } +} winter.snow -> summer.sun -> trees -> winter.snow: {style.animated: true} diff --git a/static/d2/globs-nested.d2 b/static/d2/globs-nested.d2 index facb38f4..2364e138 100644 --- a/static/d2/globs-nested.d2 +++ b/static/d2/globs-nested.d2 @@ -11,7 +11,10 @@ conversation 2: { bob -> alice: hello } +# Recursively target all shapes... **: { + # ... that are sequence diagrams &shape: sequence_diagram + # Then recursively set all shapes in them to person **: {shape: person} } diff --git a/static/d2/sequence-diagrams-group.d2 b/static/d2/sequence-diagrams-group.d2 index a8694113..fde11b7d 100644 --- a/static/d2/sequence-diagrams-group.d2 +++ b/static/d2/sequence-diagrams-group.d2 @@ -1,4 +1,5 @@ shape: sequence_diagram +# Predefine actors alice bob shower thoughts: { diff --git a/static/d2/sequence-diagrams-note.d2 b/static/d2/sequence-diagrams-note.d2 index ca5303e6..f970f184 100644 --- a/static/d2/sequence-diagrams-note.d2 +++ b/static/d2/sequence-diagrams-note.d2 @@ -1,6 +1,7 @@ shape: sequence_diagram alice -> bob bob."In the eyes of my dog, I'm a man." +# Notes can go into groups, too important insight: { bob."Cold hands, no gloves." } diff --git a/static/d2/styles-text-decoration.d2 b/static/d2/styles-text-decoration.d2 index c6eb2713..3e0f9ebe 100644 --- a/static/d2/styles-text-decoration.d2 +++ b/static/d2/styles-text-decoration.d2 @@ -6,4 +6,6 @@ x -> y: hi { } x.style.underline: true y.style.italic: true +# By default, shape labels are bold. Bold has precedence over italic, so unbold to see +# italic style y.style.bold: false diff --git a/static/d2/styles-text-transform.d2 b/static/d2/styles-text-transform.d2 index f41bc0e9..ba514aac 100644 --- a/static/d2/styles-text-transform.d2 +++ b/static/d2/styles-text-transform.d2 @@ -1,8 +1,8 @@ direction: right -x -> y: hi { +TOM -> jerry: hi { style: { text-transform: capitalize } } -x.style.text-transform: lowercase -y.style.text-transform: uppercase +TOM.style.text-transform: lowercase +jerry.style.text-transform: uppercase diff --git a/static/d2/table.d2 b/static/d2/table.d2 index 4f61731a..e28b5656 100644 --- a/static/d2/table.d2 +++ b/static/d2/table.d2 @@ -1,3 +1,4 @@ +# Specified so that objects are written in row-dominant order grid-rows: 2 grid-columns: 4 grid-gap: 0 diff --git a/static/icons/externallink.svg b/static/icons/externallink.svg new file mode 100644 index 00000000..f4011a1c --- /dev/null +++ b/static/icons/externallink.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/generated/styles-text-transform.svg2 b/static/img/generated/styles-text-transform.svg2 index 7378a9bd..d34367f2 100644 --- a/static/img/generated/styles-text-transform.svg2 +++ b/static/img/generated/styles-text-transform.svg2 @@ -1,17 +1,17 @@ -xY Hi - - - - + .d2-2975714911 .fill-N1{fill:#0A0F25;} + .d2-2975714911 .fill-N2{fill:#676C7E;} + .d2-2975714911 .fill-N3{fill:#9499AB;} + .d2-2975714911 .fill-N4{fill:#CFD2DD;} + .d2-2975714911 .fill-N5{fill:#DEE1EB;} + .d2-2975714911 .fill-N6{fill:#EEF1F8;} + .d2-2975714911 .fill-N7{fill:#FFFFFF;} + .d2-2975714911 .fill-B1{fill:#0D32B2;} + .d2-2975714911 .fill-B2{fill:#0D32B2;} + .d2-2975714911 .fill-B3{fill:#E3E9FD;} + .d2-2975714911 .fill-B4{fill:#E3E9FD;} + .d2-2975714911 .fill-B5{fill:#EDF0FD;} + .d2-2975714911 .fill-B6{fill:#F7F8FE;} + .d2-2975714911 .fill-AA2{fill:#4A6FF3;} + .d2-2975714911 .fill-AA4{fill:#EDF0FD;} + .d2-2975714911 .fill-AA5{fill:#F7F8FE;} + .d2-2975714911 .fill-AB4{fill:#EDF0FD;} + .d2-2975714911 .fill-AB5{fill:#F7F8FE;} + .d2-2975714911 .stroke-N1{stroke:#0A0F25;} + .d2-2975714911 .stroke-N2{stroke:#676C7E;} + .d2-2975714911 .stroke-N3{stroke:#9499AB;} + .d2-2975714911 .stroke-N4{stroke:#CFD2DD;} + .d2-2975714911 .stroke-N5{stroke:#DEE1EB;} + .d2-2975714911 .stroke-N6{stroke:#EEF1F8;} + .d2-2975714911 .stroke-N7{stroke:#FFFFFF;} + .d2-2975714911 .stroke-B1{stroke:#0D32B2;} + .d2-2975714911 .stroke-B2{stroke:#0D32B2;} + .d2-2975714911 .stroke-B3{stroke:#E3E9FD;} + .d2-2975714911 .stroke-B4{stroke:#E3E9FD;} + .d2-2975714911 .stroke-B5{stroke:#EDF0FD;} + .d2-2975714911 .stroke-B6{stroke:#F7F8FE;} + .d2-2975714911 .stroke-AA2{stroke:#4A6FF3;} + .d2-2975714911 .stroke-AA4{stroke:#EDF0FD;} + .d2-2975714911 .stroke-AA5{stroke:#F7F8FE;} + .d2-2975714911 .stroke-AB4{stroke:#EDF0FD;} + .d2-2975714911 .stroke-AB5{stroke:#F7F8FE;} + .d2-2975714911 .background-color-N1{background-color:#0A0F25;} + .d2-2975714911 .background-color-N2{background-color:#676C7E;} + .d2-2975714911 .background-color-N3{background-color:#9499AB;} + .d2-2975714911 .background-color-N4{background-color:#CFD2DD;} + .d2-2975714911 .background-color-N5{background-color:#DEE1EB;} + .d2-2975714911 .background-color-N6{background-color:#EEF1F8;} + .d2-2975714911 .background-color-N7{background-color:#FFFFFF;} + .d2-2975714911 .background-color-B1{background-color:#0D32B2;} + .d2-2975714911 .background-color-B2{background-color:#0D32B2;} + .d2-2975714911 .background-color-B3{background-color:#E3E9FD;} + .d2-2975714911 .background-color-B4{background-color:#E3E9FD;} + .d2-2975714911 .background-color-B5{background-color:#EDF0FD;} + .d2-2975714911 .background-color-B6{background-color:#F7F8FE;} + .d2-2975714911 .background-color-AA2{background-color:#4A6FF3;} + .d2-2975714911 .background-color-AA4{background-color:#EDF0FD;} + .d2-2975714911 .background-color-AA5{background-color:#F7F8FE;} + .d2-2975714911 .background-color-AB4{background-color:#EDF0FD;} + .d2-2975714911 .background-color-AB5{background-color:#F7F8FE;} + .d2-2975714911 .color-N1{color:#0A0F25;} + .d2-2975714911 .color-N2{color:#676C7E;} + .d2-2975714911 .color-N3{color:#9499AB;} + .d2-2975714911 .color-N4{color:#CFD2DD;} + .d2-2975714911 .color-N5{color:#DEE1EB;} + .d2-2975714911 .color-N6{color:#EEF1F8;} + .d2-2975714911 .color-N7{color:#FFFFFF;} + .d2-2975714911 .color-B1{color:#0D32B2;} + .d2-2975714911 .color-B2{color:#0D32B2;} + .d2-2975714911 .color-B3{color:#E3E9FD;} + .d2-2975714911 .color-B4{color:#E3E9FD;} + .d2-2975714911 .color-B5{color:#EDF0FD;} + .d2-2975714911 .color-B6{color:#F7F8FE;} + .d2-2975714911 .color-AA2{color:#4A6FF3;} + .d2-2975714911 .color-AA4{color:#EDF0FD;} + .d2-2975714911 .color-AA5{color:#F7F8FE;} + .d2-2975714911 .color-AB4{color:#EDF0FD;} + .d2-2975714911 .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}@media screen and (prefers-color-scheme:dark){ + .d2-2975714911 .fill-N1{fill:#CDD6F4;} + .d2-2975714911 .fill-N2{fill:#BAC2DE;} + .d2-2975714911 .fill-N3{fill:#A6ADC8;} + .d2-2975714911 .fill-N4{fill:#585B70;} + .d2-2975714911 .fill-N5{fill:#45475A;} + .d2-2975714911 .fill-N6{fill:#313244;} + .d2-2975714911 .fill-N7{fill:#1E1E2E;} + .d2-2975714911 .fill-B1{fill:#CBA6f7;} + .d2-2975714911 .fill-B2{fill:#CBA6f7;} + .d2-2975714911 .fill-B3{fill:#6C7086;} + .d2-2975714911 .fill-B4{fill:#585B70;} + .d2-2975714911 .fill-B5{fill:#45475A;} + .d2-2975714911 .fill-B6{fill:#313244;} + .d2-2975714911 .fill-AA2{fill:#f38BA8;} + .d2-2975714911 .fill-AA4{fill:#45475A;} + .d2-2975714911 .fill-AA5{fill:#313244;} + .d2-2975714911 .fill-AB4{fill:#45475A;} + .d2-2975714911 .fill-AB5{fill:#313244;} + .d2-2975714911 .stroke-N1{stroke:#CDD6F4;} + .d2-2975714911 .stroke-N2{stroke:#BAC2DE;} + .d2-2975714911 .stroke-N3{stroke:#A6ADC8;} + .d2-2975714911 .stroke-N4{stroke:#585B70;} + .d2-2975714911 .stroke-N5{stroke:#45475A;} + .d2-2975714911 .stroke-N6{stroke:#313244;} + .d2-2975714911 .stroke-N7{stroke:#1E1E2E;} + .d2-2975714911 .stroke-B1{stroke:#CBA6f7;} + .d2-2975714911 .stroke-B2{stroke:#CBA6f7;} + .d2-2975714911 .stroke-B3{stroke:#6C7086;} + .d2-2975714911 .stroke-B4{stroke:#585B70;} + .d2-2975714911 .stroke-B5{stroke:#45475A;} + .d2-2975714911 .stroke-B6{stroke:#313244;} + .d2-2975714911 .stroke-AA2{stroke:#f38BA8;} + .d2-2975714911 .stroke-AA4{stroke:#45475A;} + .d2-2975714911 .stroke-AA5{stroke:#313244;} + .d2-2975714911 .stroke-AB4{stroke:#45475A;} + .d2-2975714911 .stroke-AB5{stroke:#313244;} + .d2-2975714911 .background-color-N1{background-color:#CDD6F4;} + .d2-2975714911 .background-color-N2{background-color:#BAC2DE;} + .d2-2975714911 .background-color-N3{background-color:#A6ADC8;} + .d2-2975714911 .background-color-N4{background-color:#585B70;} + .d2-2975714911 .background-color-N5{background-color:#45475A;} + .d2-2975714911 .background-color-N6{background-color:#313244;} + .d2-2975714911 .background-color-N7{background-color:#1E1E2E;} + .d2-2975714911 .background-color-B1{background-color:#CBA6f7;} + .d2-2975714911 .background-color-B2{background-color:#CBA6f7;} + .d2-2975714911 .background-color-B3{background-color:#6C7086;} + .d2-2975714911 .background-color-B4{background-color:#585B70;} + .d2-2975714911 .background-color-B5{background-color:#45475A;} + .d2-2975714911 .background-color-B6{background-color:#313244;} + .d2-2975714911 .background-color-AA2{background-color:#f38BA8;} + .d2-2975714911 .background-color-AA4{background-color:#45475A;} + .d2-2975714911 .background-color-AA5{background-color:#313244;} + .d2-2975714911 .background-color-AB4{background-color:#45475A;} + .d2-2975714911 .background-color-AB5{background-color:#313244;} + .d2-2975714911 .color-N1{color:#CDD6F4;} + .d2-2975714911 .color-N2{color:#BAC2DE;} + .d2-2975714911 .color-N3{color:#A6ADC8;} + .d2-2975714911 .color-N4{color:#585B70;} + .d2-2975714911 .color-N5{color:#45475A;} + .d2-2975714911 .color-N6{color:#313244;} + .d2-2975714911 .color-N7{color:#1E1E2E;} + .d2-2975714911 .color-B1{color:#CBA6f7;} + .d2-2975714911 .color-B2{color:#CBA6f7;} + .d2-2975714911 .color-B3{color:#6C7086;} + .d2-2975714911 .color-B4{color:#585B70;} + .d2-2975714911 .color-B5{color:#45475A;} + .d2-2975714911 .color-B6{color:#313244;} + .d2-2975714911 .color-AA2{color:#f38BA8;} + .d2-2975714911 .color-AA4{color:#45475A;} + .d2-2975714911 .color-AA5{color:#313244;} + .d2-2975714911 .color-AB4{color:#45475A;} + .d2-2975714911 .color-AB5{color:#313244;}.appendix text.text{fill:#CDD6F4}.md{--color-fg-default:#CDD6F4;--color-fg-muted:#BAC2DE;--color-fg-subtle:#A6ADC8;--color-canvas-default:#1E1E2E;--color-canvas-subtle:#313244;--color-border-default:#CBA6f7;--color-border-muted:#CBA6f7;--color-neutral-muted:#313244;--color-accent-fg:#CBA6f7;--color-accent-emphasis:#CBA6f7;--color-attention-subtle:#BAC2DE;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-B2{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-B3{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-B4{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-B5{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B6{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-AA2{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-AA4{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-AA5{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-AB5{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N1{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N2{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N5{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N6{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N7{fill:url(#streaks-darker);mix-blend-mode:lighten}.light-code{display: none}.dark-code{display: block}}]]>tomJERRY Hi + + + + diff --git a/static/img/screenshots/tala-direction.png b/static/img/screenshots/tala-direction.png index b2150b52b2ba0891c66ac750d666c5ccad53a886..2af2ad6e8326415272bf89b8861e4c2623291394 100644 GIT binary patch literal 22672 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
OWWq{7C&EL{0yYd z5yCy(_*Y`iT#)GU&A^nO#s9W@s0#v{!@$g4nQ&WA))+B|2CcDP0wYuQRgQ8HhITNw z1Om=@aRgeUU7a=lRUX#_nr~X~m-n-{1X@GvjK0@}7Oy~vymFdu|MM|NG0chN)DBt8 zvi??pwX9U9p8fd@to`5HY P4To3z(tY!S*{N{cL^(V}JAr&n4m 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 diff --git a/static/img/screenshots/text-2.png b/static/img/screenshots/text-2.png index b46cb991d02636a3eef3c1bb5a12ad7195315322..d016eb997742d1eeb527cc61b7eed1350af16998 100644 GIT binary patch literal 46896 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 Usc7+vJHSuwg_6{FNkjkt0a7Q%Y5)KL diff --git a/yarn.lock b/yarn.lock index a152f73e..90f50fb7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5430,6 +5430,11 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" +pako@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"