Merge remote-tracking branch 'upstream/master' into wasm-options

This commit is contained in:
delfino 2025-02-19 21:59:15 +00:00
commit 8003616d53
No known key found for this signature in database
GPG key ID: CFE0DD6A770BF48C
26 changed files with 1698 additions and 25 deletions

View file

@ -20,7 +20,7 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets._GITHUB_TOKEN }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
if: always()
with:
name: d2chaos

View file

@ -4,7 +4,7 @@
A modern diagram scripting language that turns text to diagrams.
</h2>
[Docs](https://d2lang.com) | [Cheat sheet](./docs/assets/cheat_sheet.pdf) | [Comparisons](https://text-to-diagram.com) | [Playground](https://play.d2lang.com)
[Docs](https://d2lang.com) | [Cheat sheet](./docs/assets/cheat_sheet.pdf) | [Comparisons](https://text-to-diagram.com) | [Playground](https://play.d2lang.com) | [IDE](https://app.terrastruct.com)
[![ci](https://github.com/terrastruct/d2/actions/workflows/ci.yml/badge.svg)](https://github.com/terrastruct/d2/actions/workflows/ci.yml)
[![daily](https://github.com/terrastruct/d2/actions/workflows/daily.yml/badge.svg)](https://github.com/terrastruct/d2/actions/workflows/daily.yml)
@ -16,6 +16,9 @@
<a href="https://play.d2lang.com">
<img src="./docs/assets/playground_button.png" alt="D2 Playground button" width="200" />
</a>
<a href="https://app.terrastruct.com">
<img src="./docs/assets/studio_button.png" alt="D2 Studio button" width="200" />
</a>
https://user-images.githubusercontent.com/3120367/206125010-bd1fea8e-248a-43e7-8f85-0bbfca0c6e2a.mp4
@ -263,11 +266,13 @@ let us know and we'll be happy to include it here!
- **Remark Plugin**: [https://github.com/mech-a/remark-d2](https://github.com/mech-a/remark-d2)
- **VitePress Plugin**: [https://github.com/BadgerHobbs/vitepress-plugin-d2](https://github.com/BadgerHobbs/vitepress-plugin-d2)
- **Zed extension**: [https://github.com/gabeidx/zed-d2](https://github.com/gabeidx/zed-d2)
- **Hexo blog extension**: [https://github.com/leverimmy/hexo-d2](https://github.com/leverimmy/hexo-d2)
### Misc
- **Comparison site**: [https://github.com/terrastruct/text-to-diagram-site](https://github.com/terrastruct/text-to-diagram-site)
- **Playground**: [https://github.com/terrastruct/d2-playground](https://github.com/terrastruct/d2-playground)
- **IDE (paid)**: [https://app.terrastruct.com](https://app.terrastruct.com)
- **Language docs**: [https://github.com/terrastruct/d2-docs](https://github.com/terrastruct/d2-docs)
- **Hosted icons**: [https://icons.terrastruct.com](https://icons.terrastruct.com)

View file

@ -1,7 +1,13 @@
#### Features 🚀
- Icons: connections can include icons [#12](https://github.com/terrastruct/d2/issues/12)
#### Improvements 🧹
d2js: Support additional render options (`themeID`, `darkThemeID`, `center`, `pad`, `scale` and `forceAppendix`). Support `d2-config`. [#2343](https://github.com/terrastruct/d2/pull/2343)
#### Bugfixes ⛑️
- Compiler:
- fixes panic when `sql_shape` shape value had mixed casing [#2349](https://github.com/terrastruct/d2/pull/2349)
- fixes support for `center` in `d2-config` [#2360](https://github.com/terrastruct/d2/pull/2360)

View file

@ -50,7 +50,7 @@ import (
func Run(ctx context.Context, ms *xmain.State) (err error) {
ctx = log.WithDefault(ctx)
// These should be kept up-to-date with the d2 man page
watchFlag, err := ms.Opts.Bool("D2_WATCH", "watch", "w", false, "watch for changes to input and live reload. Use $HOST and $PORT to specify the listening address.\n(default localhost:0, which is will open on a randomly available local port).")
watchFlag, err := ms.Opts.Bool("D2_WATCH", "watch", "w", false, "watch for changes to input and live reload. Use $HOST and $PORT to specify the listening address.\n(default localhost:0, which will open on a randomly available local port).")
if err != nil {
return err
}

View file

@ -514,13 +514,14 @@ func (c *compiler) compileReserved(attrs *d2graph.Attributes, f *d2ir.Field) {
c.compileLabel(attrs, f)
c.compilePosition(attrs, f)
case "shape":
in := d2target.IsShape(scalar.ScalarString())
_, isArrowhead := d2target.Arrowheads[scalar.ScalarString()]
shapeVal := strings.ToLower(scalar.ScalarString())
in := d2target.IsShape(shapeVal)
_, isArrowhead := d2target.Arrowheads[shapeVal]
if !in && !isArrowhead {
c.errorf(scalar, "unknown shape %q", scalar.ScalarString())
return
}
attrs.Shape.Value = scalar.ScalarString()
attrs.Shape.Value = shapeVal
if strings.EqualFold(attrs.Shape.Value, d2target.ShapeCode) {
// Explicit code shape is plaintext.
attrs.Language = d2target.ShapeText
@ -596,11 +597,12 @@ func (c *compiler) compileReserved(attrs *d2graph.Attributes, f *d2ir.Field) {
attrs.Link.MapKey = f.LastPrimaryKey()
case "direction":
dirs := []string{"up", "down", "right", "left"}
if !go2.Contains(dirs, scalar.ScalarString()) {
val := strings.ToLower(scalar.ScalarString())
if !go2.Contains(dirs, val) {
c.errorf(scalar, `direction must be one of %v, got %q`, strings.Join(dirs, ", "), scalar.ScalarString())
return
}
attrs.Direction.Value = scalar.ScalarString()
attrs.Direction.Value = val
attrs.Direction.MapKey = f.LastPrimaryKey()
case "constraint":
if _, ok := scalar.(d2ast.String); !ok {
@ -1453,6 +1455,12 @@ func compileConfig(ir *d2ir.Map) (*d2target.Config, error) {
config.LayoutEngine = go2.Pointer(f.Primary().Value.ScalarString())
}
f = configMap.GetField(d2ast.FlatUnquotedString("center"))
if f != nil {
val, _ := strconv.ParseBool(f.Primary().Value.ScalarString())
config.Center = &val
}
f = configMap.GetField(d2ast.FlatUnquotedString("theme-overrides"))
if f != nil {
overrides, err := compileThemeOverrides(f.Map())

View file

@ -8,6 +8,7 @@ import (
"oss.terrastruct.com/util-go/go2"
"oss.terrastruct.com/d2/d2ast"
"oss.terrastruct.com/d2/d2graph"
"oss.terrastruct.com/d2/d2parser"
"oss.terrastruct.com/d2/d2renderers/d2fonts"
@ -15,6 +16,7 @@ import (
"oss.terrastruct.com/d2/d2themes"
"oss.terrastruct.com/d2/lib/color"
"oss.terrastruct.com/d2/lib/geo"
"oss.terrastruct.com/d2/lib/label"
)
func Export(ctx context.Context, g *d2graph.Graph, fontFamily *d2fonts.FontFamily) (*d2target.Diagram, error) {
@ -335,7 +337,14 @@ func toConnection(edge *d2graph.Edge, theme *d2themes.Theme) d2target.Connection
if edge.Tooltip != nil {
connection.Tooltip = edge.Tooltip.Value
}
connection.Icon = edge.Icon
if edge.Icon != nil {
connection.Icon = edge.Icon
if edge.IconPosition != nil {
connection.IconPosition = (d2ast.LabelPositionsMapping[edge.IconPosition.Value]).String()
} else {
connection.IconPosition = label.InsideMiddleCenter.String()
}
}
if edge.Style.Italic != nil {
connection.Italic, _ = strconv.ParseBool(edge.Style.Italic.Value)

View file

@ -1070,11 +1070,6 @@ func (c *compiler) compileLink(f *Field, refctx *RefContext) {
return
}
if linkIDA[0].ScalarString() == "root" && linkIDA[0].IsUnquoted() {
c.errorf(refctx.Key.Key, "cannot refer to root in link")
return
}
if !linkIDA[0].IsUnquoted() {
return
}

View file

@ -6115,6 +6115,28 @@ y
exp: `y
a -> b
c -> d
`,
},
{
name: "underscore_linked",
text: `k
layers: {
x: {
a
b: {link: _}
}
}
`,
key: `b`,
boardPath: []string{"x"},
exp: `k
layers: {
x: {
a
}
}
`,
},
{

View file

@ -587,16 +587,51 @@ func drawConnection(writer io.Writer, diagramHash string, connection d2target.Co
markerEnd = fmt.Sprintf(`marker-end="url(#%s)" `, id)
}
if connection.Icon != nil {
iconPos := connection.GetIconPosition()
if iconPos != nil {
fmt.Fprintf(writer, `<image href="%s" x="%f" y="%f" width="%d" height="%d" />`,
html.EscapeString(connection.Icon.String()),
iconPos.X,
iconPos.Y,
d2target.DEFAULT_ICON_SIZE,
d2target.DEFAULT_ICON_SIZE,
)
}
}
var labelTL *geo.Point
if connection.Label != "" {
labelTL = connection.GetLabelTopLeft()
labelTL.X = math.Round(labelTL.X)
labelTL.Y = math.Round(labelTL.Y)
maskTL := labelTL.Copy()
width := connection.LabelWidth
height := connection.LabelHeight
if connection.Icon != nil {
width += d2target.CONNECTION_ICON_LABEL_GAP + d2target.DEFAULT_ICON_SIZE
maskTL.X -= float64(d2target.CONNECTION_ICON_LABEL_GAP + d2target.DEFAULT_ICON_SIZE)
}
if label.FromString(connection.LabelPosition).IsOnEdge() {
labelMask = makeLabelMask(labelTL, connection.LabelWidth, connection.LabelHeight, 1)
labelMask = makeLabelMask(maskTL, width, height, 1)
} else {
labelMask = makeLabelMask(labelTL, connection.LabelWidth, connection.LabelHeight, 0.75)
labelMask = makeLabelMask(maskTL, width, height, 0.75)
}
} else if connection.Icon != nil {
iconPos := connection.GetIconPosition()
if iconPos != nil {
maskTL := &geo.Point{
X: iconPos.X,
Y: iconPos.Y,
}
if label.FromString(connection.IconPosition).IsOnEdge() {
labelMask = makeLabelMask(maskTL, d2target.DEFAULT_ICON_SIZE, d2target.DEFAULT_ICON_SIZE, 1)
} else {
labelMask = makeLabelMask(maskTL, d2target.DEFAULT_ICON_SIZE, d2target.DEFAULT_ICON_SIZE, 0.75)
}
}
}

View file

@ -34,6 +34,8 @@ const (
MIN_ARROWHEAD_STROKE_WIDTH = 2
ARROWHEAD_PADDING = 2.
CONNECTION_ICON_LABEL_GAP = 8
)
var BorderOffset = geo.NewVector(5, 5)
@ -609,13 +611,40 @@ type Connection struct {
Route []*geo.Point `json:"route"`
IsCurve bool `json:"isCurve,omitempty"`
Animated bool `json:"animated"`
Tooltip string `json:"tooltip"`
Icon *url.URL `json:"icon"`
Animated bool `json:"animated"`
Tooltip string `json:"tooltip"`
Icon *url.URL `json:"icon"`
IconPosition string `json:"iconPosition,omitempty"`
ZIndex int `json:"zIndex"`
}
func (c *Connection) GetIconPosition() *geo.Point {
if c.Icon == nil {
return nil
}
if c.Label != "" {
labelTL := c.GetLabelTopLeft()
if labelTL != nil {
// Position icon to the left of the label with a small gap
return &geo.Point{
X: labelTL.X - CONNECTION_ICON_LABEL_GAP - DEFAULT_ICON_SIZE,
Y: labelTL.Y + float64(c.LabelHeight)/2 - DEFAULT_ICON_SIZE/2,
}
}
}
point, _ := label.FromString(c.IconPosition).GetPointOnRoute(
c.Route,
float64(c.StrokeWidth),
-1,
float64(DEFAULT_ICON_SIZE),
float64(DEFAULT_ICON_SIZE),
)
return point
}
func BaseConnection() *Connection {
return &Connection{
SrcArrow: NoArrowhead,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -0,0 +1,306 @@
{
"name": "",
"config": {
"sketch": false,
"themeID": 0,
"darkThemeID": null,
"pad": null,
"center": null,
"layoutEngine": null
},
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "a",
"type": "rectangle",
"pos": {
"x": 0,
"y": 0
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B6",
"stroke": "B1",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "b",
"type": "rectangle",
"pos": {
"x": 186,
"y": 0
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B6",
"stroke": "B1",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "c",
"type": "rectangle",
"pos": {
"x": 339,
"y": 0
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B6",
"stroke": "B1",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "c",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
}
],
"connections": [
{
"id": "(a -> b)[0]",
"src": "a",
"srcArrow": "none",
"dst": "b",
"dstArrow": "triangle",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "hello",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 33,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"link": "",
"route": [
{
"x": 52.5,
"y": 33
},
{
"x": 106.0999984741211,
"y": 33
},
{
"x": 132.89999389648438,
"y": 33
},
{
"x": 186.5,
"y": 33
}
],
"isCurve": true,
"animated": false,
"tooltip": "",
"icon": {
"Scheme": "https",
"Opaque": "",
"User": null,
"Host": "icons.terrastruct.com",
"Path": "/essentials/213-alarm.svg",
"RawPath": "/essentials%2F213-alarm.svg",
"OmitHost": false,
"ForceQuery": false,
"RawQuery": "",
"Fragment": "",
"RawFragment": ""
},
"iconPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0
},
{
"id": "(b -> c)[0]",
"src": "b",
"srcArrow": "none",
"dst": "c",
"dstArrow": "triangle",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"link": "",
"route": [
{
"x": 239,
"y": 33
},
{
"x": 279,
"y": 33
},
{
"x": 299,
"y": 33
},
{
"x": 339,
"y": 33
}
],
"isCurve": true,
"animated": false,
"tooltip": "",
"icon": {
"Scheme": "https",
"Opaque": "",
"User": null,
"Host": "icons.terrastruct.com",
"Path": "/essentials/213-alarm.svg",
"RawPath": "/essentials%2F213-alarm.svg",
"OmitHost": false,
"ForceQuery": false,
"RawQuery": "",
"Fragment": "",
"RawFragment": ""
},
"iconPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0
}
],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

View file

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.6.9-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 394 68"><svg class="d2-502090661 d2-svg" width="394" height="68" viewBox="-1 -1 394 68"><rect x="-1.000000" y="-1.000000" width="394.000000" height="68.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-502090661 .text-bold {
font-family: "d2-502090661-font-bold";
}
@font-face {
font-family: d2-502090661-font-bold;
src: url("data:application/font-woff;base64,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");
}
.d2-502090661 .text-italic {
font-family: "d2-502090661-font-italic";
}
@font-face {
font-family: d2-502090661-font-italic;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-502090661 .fill-N1{fill:#0A0F25;}
.d2-502090661 .fill-N2{fill:#676C7E;}
.d2-502090661 .fill-N3{fill:#9499AB;}
.d2-502090661 .fill-N4{fill:#CFD2DD;}
.d2-502090661 .fill-N5{fill:#DEE1EB;}
.d2-502090661 .fill-N6{fill:#EEF1F8;}
.d2-502090661 .fill-N7{fill:#FFFFFF;}
.d2-502090661 .fill-B1{fill:#0D32B2;}
.d2-502090661 .fill-B2{fill:#0D32B2;}
.d2-502090661 .fill-B3{fill:#E3E9FD;}
.d2-502090661 .fill-B4{fill:#E3E9FD;}
.d2-502090661 .fill-B5{fill:#EDF0FD;}
.d2-502090661 .fill-B6{fill:#F7F8FE;}
.d2-502090661 .fill-AA2{fill:#4A6FF3;}
.d2-502090661 .fill-AA4{fill:#EDF0FD;}
.d2-502090661 .fill-AA5{fill:#F7F8FE;}
.d2-502090661 .fill-AB4{fill:#EDF0FD;}
.d2-502090661 .fill-AB5{fill:#F7F8FE;}
.d2-502090661 .stroke-N1{stroke:#0A0F25;}
.d2-502090661 .stroke-N2{stroke:#676C7E;}
.d2-502090661 .stroke-N3{stroke:#9499AB;}
.d2-502090661 .stroke-N4{stroke:#CFD2DD;}
.d2-502090661 .stroke-N5{stroke:#DEE1EB;}
.d2-502090661 .stroke-N6{stroke:#EEF1F8;}
.d2-502090661 .stroke-N7{stroke:#FFFFFF;}
.d2-502090661 .stroke-B1{stroke:#0D32B2;}
.d2-502090661 .stroke-B2{stroke:#0D32B2;}
.d2-502090661 .stroke-B3{stroke:#E3E9FD;}
.d2-502090661 .stroke-B4{stroke:#E3E9FD;}
.d2-502090661 .stroke-B5{stroke:#EDF0FD;}
.d2-502090661 .stroke-B6{stroke:#F7F8FE;}
.d2-502090661 .stroke-AA2{stroke:#4A6FF3;}
.d2-502090661 .stroke-AA4{stroke:#EDF0FD;}
.d2-502090661 .stroke-AA5{stroke:#F7F8FE;}
.d2-502090661 .stroke-AB4{stroke:#EDF0FD;}
.d2-502090661 .stroke-AB5{stroke:#F7F8FE;}
.d2-502090661 .background-color-N1{background-color:#0A0F25;}
.d2-502090661 .background-color-N2{background-color:#676C7E;}
.d2-502090661 .background-color-N3{background-color:#9499AB;}
.d2-502090661 .background-color-N4{background-color:#CFD2DD;}
.d2-502090661 .background-color-N5{background-color:#DEE1EB;}
.d2-502090661 .background-color-N6{background-color:#EEF1F8;}
.d2-502090661 .background-color-N7{background-color:#FFFFFF;}
.d2-502090661 .background-color-B1{background-color:#0D32B2;}
.d2-502090661 .background-color-B2{background-color:#0D32B2;}
.d2-502090661 .background-color-B3{background-color:#E3E9FD;}
.d2-502090661 .background-color-B4{background-color:#E3E9FD;}
.d2-502090661 .background-color-B5{background-color:#EDF0FD;}
.d2-502090661 .background-color-B6{background-color:#F7F8FE;}
.d2-502090661 .background-color-AA2{background-color:#4A6FF3;}
.d2-502090661 .background-color-AA4{background-color:#EDF0FD;}
.d2-502090661 .background-color-AA5{background-color:#F7F8FE;}
.d2-502090661 .background-color-AB4{background-color:#EDF0FD;}
.d2-502090661 .background-color-AB5{background-color:#F7F8FE;}
.d2-502090661 .color-N1{color:#0A0F25;}
.d2-502090661 .color-N2{color:#676C7E;}
.d2-502090661 .color-N3{color:#9499AB;}
.d2-502090661 .color-N4{color:#CFD2DD;}
.d2-502090661 .color-N5{color:#DEE1EB;}
.d2-502090661 .color-N6{color:#EEF1F8;}
.d2-502090661 .color-N7{color:#FFFFFF;}
.d2-502090661 .color-B1{color:#0D32B2;}
.d2-502090661 .color-B2{color:#0D32B2;}
.d2-502090661 .color-B3{color:#E3E9FD;}
.d2-502090661 .color-B4{color:#E3E9FD;}
.d2-502090661 .color-B5{color:#EDF0FD;}
.d2-502090661 .color-B6{color:#F7F8FE;}
.d2-502090661 .color-AA2{color:#4A6FF3;}
.d2-502090661 .color-AA4{color:#EDF0FD;}
.d2-502090661 .color-AA5{color:#F7F8FE;}
.d2-502090661 .color-AB4{color:#EDF0FD;}
.d2-502090661 .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-d2-502090661);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-502090661);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-502090661);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-502090661);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-502090661);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-502090661);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-502090661);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-502090661);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="YQ=="><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g class="Yg=="><g class="shape" ><rect x="186.000000" y="0.000000" width="53.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="212.500000" y="38.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g class="Yw=="><g class="shape" ><rect x="339.000000" y="0.000000" width="53.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="365.500000" y="38.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g class="KGEgLSZndDsgYilbMF0="><marker id="mk-d2-502090661-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#0D32B2" class="connection fill-B1" stroke-width="2" /> </marker><image href="https://icons.terrastruct.com/essentials%2F213-alarm.svg" x="63.000000" y="17.500000" width="32" height="32" /><path d="M 54.500000 33.000000 C 106.099998 33.000000 132.899994 33.000000 182.500000 33.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-502090661-3488378134)" mask="url(#d2-502090661)" /><text x="119.500000" y="39.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">hello</text></g><g class="KGIgLSZndDsgYylbMF0="><image href="https://icons.terrastruct.com/essentials%2F213-alarm.svg" x="273.000000" y="17.000000" width="32" height="32" /><path d="M 241.000000 33.000000 C 279.000000 33.000000 299.000000 33.000000 335.000000 33.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-502090661-3488378134)" mask="url(#d2-502090661)" /></g><mask id="d2-502090661" maskUnits="userSpaceOnUse" x="-1" y="-1" width="394" height="68">
<rect x="-1" y="-1" width="394" height="68" fill="white"></rect>
<rect x="22.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
<rect x="208.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
<rect x="361.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
<rect x="63.000000" y="23.000000" width="73" height="21" fill="black"></rect>
<rect x="273.000000" y="17.000000" width="32" height="32" fill="black"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,288 @@
{
"name": "",
"config": {
"sketch": false,
"themeID": 0,
"darkThemeID": null,
"pad": null,
"center": null,
"layoutEngine": null
},
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "a",
"type": "rectangle",
"pos": {
"x": 12,
"y": 12
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B6",
"stroke": "B1",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "b",
"type": "rectangle",
"pos": {
"x": 238,
"y": 12
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B6",
"stroke": "B1",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "c",
"type": "rectangle",
"pos": {
"x": 361,
"y": 12
},
"width": 53,
"height": 66,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "B6",
"stroke": "B1",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "c",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 8,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
}
],
"connections": [
{
"id": "(a -> b)[0]",
"src": "a",
"srcArrow": "none",
"dst": "b",
"dstArrow": "triangle",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "hello",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 33,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"link": "",
"route": [
{
"x": 65,
"y": 45
},
{
"x": 238,
"y": 45
}
],
"animated": false,
"tooltip": "",
"icon": {
"Scheme": "https",
"Opaque": "",
"User": null,
"Host": "icons.terrastruct.com",
"Path": "/essentials/213-alarm.svg",
"RawPath": "/essentials%2F213-alarm.svg",
"OmitHost": false,
"ForceQuery": false,
"RawQuery": "",
"Fragment": "",
"RawFragment": ""
},
"iconPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0
},
{
"id": "(b -> c)[0]",
"src": "b",
"srcArrow": "none",
"dst": "c",
"dstArrow": "triangle",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "B1",
"borderRadius": 10,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "N2",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"link": "",
"route": [
{
"x": 291,
"y": 45
},
{
"x": 361,
"y": 45
}
],
"animated": false,
"tooltip": "",
"icon": {
"Scheme": "https",
"Opaque": "",
"User": null,
"Host": "icons.terrastruct.com",
"Path": "/essentials/213-alarm.svg",
"RawPath": "/essentials%2F213-alarm.svg",
"OmitHost": false,
"ForceQuery": false,
"RawQuery": "",
"Fragment": "",
"RawFragment": ""
},
"iconPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0
}
],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

View file

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.6.9-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 404 68"><svg class="d2-364024125 d2-svg" width="404" height="68" viewBox="11 11 404 68"><rect x="11.000000" y="11.000000" width="404.000000" height="68.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-364024125 .text-bold {
font-family: "d2-364024125-font-bold";
}
@font-face {
font-family: d2-364024125-font-bold;
src: url("data:application/font-woff;base64,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");
}
.d2-364024125 .text-italic {
font-family: "d2-364024125-font-italic";
}
@font-face {
font-family: d2-364024125-font-italic;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-364024125 .fill-N1{fill:#0A0F25;}
.d2-364024125 .fill-N2{fill:#676C7E;}
.d2-364024125 .fill-N3{fill:#9499AB;}
.d2-364024125 .fill-N4{fill:#CFD2DD;}
.d2-364024125 .fill-N5{fill:#DEE1EB;}
.d2-364024125 .fill-N6{fill:#EEF1F8;}
.d2-364024125 .fill-N7{fill:#FFFFFF;}
.d2-364024125 .fill-B1{fill:#0D32B2;}
.d2-364024125 .fill-B2{fill:#0D32B2;}
.d2-364024125 .fill-B3{fill:#E3E9FD;}
.d2-364024125 .fill-B4{fill:#E3E9FD;}
.d2-364024125 .fill-B5{fill:#EDF0FD;}
.d2-364024125 .fill-B6{fill:#F7F8FE;}
.d2-364024125 .fill-AA2{fill:#4A6FF3;}
.d2-364024125 .fill-AA4{fill:#EDF0FD;}
.d2-364024125 .fill-AA5{fill:#F7F8FE;}
.d2-364024125 .fill-AB4{fill:#EDF0FD;}
.d2-364024125 .fill-AB5{fill:#F7F8FE;}
.d2-364024125 .stroke-N1{stroke:#0A0F25;}
.d2-364024125 .stroke-N2{stroke:#676C7E;}
.d2-364024125 .stroke-N3{stroke:#9499AB;}
.d2-364024125 .stroke-N4{stroke:#CFD2DD;}
.d2-364024125 .stroke-N5{stroke:#DEE1EB;}
.d2-364024125 .stroke-N6{stroke:#EEF1F8;}
.d2-364024125 .stroke-N7{stroke:#FFFFFF;}
.d2-364024125 .stroke-B1{stroke:#0D32B2;}
.d2-364024125 .stroke-B2{stroke:#0D32B2;}
.d2-364024125 .stroke-B3{stroke:#E3E9FD;}
.d2-364024125 .stroke-B4{stroke:#E3E9FD;}
.d2-364024125 .stroke-B5{stroke:#EDF0FD;}
.d2-364024125 .stroke-B6{stroke:#F7F8FE;}
.d2-364024125 .stroke-AA2{stroke:#4A6FF3;}
.d2-364024125 .stroke-AA4{stroke:#EDF0FD;}
.d2-364024125 .stroke-AA5{stroke:#F7F8FE;}
.d2-364024125 .stroke-AB4{stroke:#EDF0FD;}
.d2-364024125 .stroke-AB5{stroke:#F7F8FE;}
.d2-364024125 .background-color-N1{background-color:#0A0F25;}
.d2-364024125 .background-color-N2{background-color:#676C7E;}
.d2-364024125 .background-color-N3{background-color:#9499AB;}
.d2-364024125 .background-color-N4{background-color:#CFD2DD;}
.d2-364024125 .background-color-N5{background-color:#DEE1EB;}
.d2-364024125 .background-color-N6{background-color:#EEF1F8;}
.d2-364024125 .background-color-N7{background-color:#FFFFFF;}
.d2-364024125 .background-color-B1{background-color:#0D32B2;}
.d2-364024125 .background-color-B2{background-color:#0D32B2;}
.d2-364024125 .background-color-B3{background-color:#E3E9FD;}
.d2-364024125 .background-color-B4{background-color:#E3E9FD;}
.d2-364024125 .background-color-B5{background-color:#EDF0FD;}
.d2-364024125 .background-color-B6{background-color:#F7F8FE;}
.d2-364024125 .background-color-AA2{background-color:#4A6FF3;}
.d2-364024125 .background-color-AA4{background-color:#EDF0FD;}
.d2-364024125 .background-color-AA5{background-color:#F7F8FE;}
.d2-364024125 .background-color-AB4{background-color:#EDF0FD;}
.d2-364024125 .background-color-AB5{background-color:#F7F8FE;}
.d2-364024125 .color-N1{color:#0A0F25;}
.d2-364024125 .color-N2{color:#676C7E;}
.d2-364024125 .color-N3{color:#9499AB;}
.d2-364024125 .color-N4{color:#CFD2DD;}
.d2-364024125 .color-N5{color:#DEE1EB;}
.d2-364024125 .color-N6{color:#EEF1F8;}
.d2-364024125 .color-N7{color:#FFFFFF;}
.d2-364024125 .color-B1{color:#0D32B2;}
.d2-364024125 .color-B2{color:#0D32B2;}
.d2-364024125 .color-B3{color:#E3E9FD;}
.d2-364024125 .color-B4{color:#E3E9FD;}
.d2-364024125 .color-B5{color:#EDF0FD;}
.d2-364024125 .color-B6{color:#F7F8FE;}
.d2-364024125 .color-AA2{color:#4A6FF3;}
.d2-364024125 .color-AA4{color:#EDF0FD;}
.d2-364024125 .color-AA5{color:#F7F8FE;}
.d2-364024125 .color-AB4{color:#EDF0FD;}
.d2-364024125 .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-d2-364024125);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-364024125);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-364024125);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-364024125);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-364024125);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-364024125);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-364024125);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-364024125);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="YQ=="><g class="shape" ><rect x="12.000000" y="12.000000" width="53.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="38.500000" y="50.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g class="Yg=="><g class="shape" ><rect x="238.000000" y="12.000000" width="53.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="264.500000" y="50.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g class="Yw=="><g class="shape" ><rect x="361.000000" y="12.000000" width="53.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="387.500000" y="50.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g class="KGEgLSZndDsgYilbMF0="><marker id="mk-d2-364024125-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#0D32B2" class="connection fill-B1" stroke-width="2" /> </marker><image href="https://icons.terrastruct.com/essentials%2F213-alarm.svg" x="95.000000" y="29.500000" width="32" height="32" /><path d="M 67.000000 45.000000 L 234.000000 45.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-364024125-3488378134)" mask="url(#d2-364024125)" /><text x="151.500000" y="51.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">hello</text></g><g class="KGIgLSZndDsgYylbMF0="><image href="https://icons.terrastruct.com/essentials%2F213-alarm.svg" x="310.000000" y="29.000000" width="32" height="32" /><path d="M 293.000000 45.000000 L 357.000000 45.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-364024125-3488378134)" mask="url(#d2-364024125)" /></g><mask id="d2-364024125" maskUnits="userSpaceOnUse" x="11" y="11" width="404" height="68">
<rect x="11" y="11" width="404" height="68" fill="white"></rect>
<rect x="34.500000" y="34.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
<rect x="260.500000" y="34.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
<rect x="383.500000" y="34.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
<rect x="95.000000" y="35.000000" width="73" height="21" fill="black"></rect>
<rect x="310.000000" y="29.000000" width="32" height="32" fill="black"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,130 @@
{
"name": "",
"config": {
"sketch": false,
"themeID": 0,
"darkThemeID": null,
"pad": null,
"center": null,
"layoutEngine": null
},
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "asdf",
"type": "sql_table",
"pos": {
"x": 0,
"y": 0
},
"width": 87,
"height": 72,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "N1",
"stroke": "N7",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": [
{
"name": {
"label": "zxcv",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 37,
"labelHeight": 26
},
"type": {
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": null,
"reference": ""
}
],
"label": "asdf",
"fontSize": 20,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 46,
"labelHeight": 31,
"zIndex": 0,
"level": 1,
"primaryAccentColor": "B2",
"secondaryAccentColor": "AA2",
"neutralAccentColor": "N2"
}
],
"connections": [],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.6.9-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 89 74"><svg class="d2-4262245251 d2-svg" width="89" height="74" viewBox="-1 -1 89 74"><rect x="-1.000000" y="-1.000000" width="89.000000" height="74.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-4262245251 .text {
font-family: "d2-4262245251-font-regular";
}
@font-face {
font-family: d2-4262245251-font-regular;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-4262245251 .fill-N1{fill:#0A0F25;}
.d2-4262245251 .fill-N2{fill:#676C7E;}
.d2-4262245251 .fill-N3{fill:#9499AB;}
.d2-4262245251 .fill-N4{fill:#CFD2DD;}
.d2-4262245251 .fill-N5{fill:#DEE1EB;}
.d2-4262245251 .fill-N6{fill:#EEF1F8;}
.d2-4262245251 .fill-N7{fill:#FFFFFF;}
.d2-4262245251 .fill-B1{fill:#0D32B2;}
.d2-4262245251 .fill-B2{fill:#0D32B2;}
.d2-4262245251 .fill-B3{fill:#E3E9FD;}
.d2-4262245251 .fill-B4{fill:#E3E9FD;}
.d2-4262245251 .fill-B5{fill:#EDF0FD;}
.d2-4262245251 .fill-B6{fill:#F7F8FE;}
.d2-4262245251 .fill-AA2{fill:#4A6FF3;}
.d2-4262245251 .fill-AA4{fill:#EDF0FD;}
.d2-4262245251 .fill-AA5{fill:#F7F8FE;}
.d2-4262245251 .fill-AB4{fill:#EDF0FD;}
.d2-4262245251 .fill-AB5{fill:#F7F8FE;}
.d2-4262245251 .stroke-N1{stroke:#0A0F25;}
.d2-4262245251 .stroke-N2{stroke:#676C7E;}
.d2-4262245251 .stroke-N3{stroke:#9499AB;}
.d2-4262245251 .stroke-N4{stroke:#CFD2DD;}
.d2-4262245251 .stroke-N5{stroke:#DEE1EB;}
.d2-4262245251 .stroke-N6{stroke:#EEF1F8;}
.d2-4262245251 .stroke-N7{stroke:#FFFFFF;}
.d2-4262245251 .stroke-B1{stroke:#0D32B2;}
.d2-4262245251 .stroke-B2{stroke:#0D32B2;}
.d2-4262245251 .stroke-B3{stroke:#E3E9FD;}
.d2-4262245251 .stroke-B4{stroke:#E3E9FD;}
.d2-4262245251 .stroke-B5{stroke:#EDF0FD;}
.d2-4262245251 .stroke-B6{stroke:#F7F8FE;}
.d2-4262245251 .stroke-AA2{stroke:#4A6FF3;}
.d2-4262245251 .stroke-AA4{stroke:#EDF0FD;}
.d2-4262245251 .stroke-AA5{stroke:#F7F8FE;}
.d2-4262245251 .stroke-AB4{stroke:#EDF0FD;}
.d2-4262245251 .stroke-AB5{stroke:#F7F8FE;}
.d2-4262245251 .background-color-N1{background-color:#0A0F25;}
.d2-4262245251 .background-color-N2{background-color:#676C7E;}
.d2-4262245251 .background-color-N3{background-color:#9499AB;}
.d2-4262245251 .background-color-N4{background-color:#CFD2DD;}
.d2-4262245251 .background-color-N5{background-color:#DEE1EB;}
.d2-4262245251 .background-color-N6{background-color:#EEF1F8;}
.d2-4262245251 .background-color-N7{background-color:#FFFFFF;}
.d2-4262245251 .background-color-B1{background-color:#0D32B2;}
.d2-4262245251 .background-color-B2{background-color:#0D32B2;}
.d2-4262245251 .background-color-B3{background-color:#E3E9FD;}
.d2-4262245251 .background-color-B4{background-color:#E3E9FD;}
.d2-4262245251 .background-color-B5{background-color:#EDF0FD;}
.d2-4262245251 .background-color-B6{background-color:#F7F8FE;}
.d2-4262245251 .background-color-AA2{background-color:#4A6FF3;}
.d2-4262245251 .background-color-AA4{background-color:#EDF0FD;}
.d2-4262245251 .background-color-AA5{background-color:#F7F8FE;}
.d2-4262245251 .background-color-AB4{background-color:#EDF0FD;}
.d2-4262245251 .background-color-AB5{background-color:#F7F8FE;}
.d2-4262245251 .color-N1{color:#0A0F25;}
.d2-4262245251 .color-N2{color:#676C7E;}
.d2-4262245251 .color-N3{color:#9499AB;}
.d2-4262245251 .color-N4{color:#CFD2DD;}
.d2-4262245251 .color-N5{color:#DEE1EB;}
.d2-4262245251 .color-N6{color:#EEF1F8;}
.d2-4262245251 .color-N7{color:#FFFFFF;}
.d2-4262245251 .color-B1{color:#0D32B2;}
.d2-4262245251 .color-B2{color:#0D32B2;}
.d2-4262245251 .color-B3{color:#E3E9FD;}
.d2-4262245251 .color-B4{color:#E3E9FD;}
.d2-4262245251 .color-B5{color:#EDF0FD;}
.d2-4262245251 .color-B6{color:#F7F8FE;}
.d2-4262245251 .color-AA2{color:#4A6FF3;}
.d2-4262245251 .color-AA4{color:#EDF0FD;}
.d2-4262245251 .color-AA5{color:#F7F8FE;}
.d2-4262245251 .color-AB4{color:#EDF0FD;}
.d2-4262245251 .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-d2-4262245251);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-4262245251);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-4262245251);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-4262245251);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-4262245251);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-4262245251);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-4262245251);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-4262245251);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="YXNkZg=="><g class="shape" ><rect x="0.000000" y="0.000000" width="87.000000" height="72.000000" stroke="#0A0F25" fill="#FFFFFF" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="0.000000" y="0.000000" width="87.000000" height="36.000000" fill="#0A0F25" class="class_header fill-N1" /><text x="10.000000" y="25.750000" fill="#FFFFFF" class="text fill-N7" style="text-anchor:start;font-size:24px">asdf</text><text x="10.000000" y="59.000000" fill="#0D32B2" class="text fill-B2" style="text-anchor:start;font-size:20px">zxcv</text><text x="67.000000" y="59.000000" fill="#676C7E" class="text fill-N2" style="text-anchor:start;font-size:20px" /><text x="77.000000" y="59.000000" fill="#4A6FF3" class="text fill-AA2" style="text-anchor:end;font-size:20px" /><line x1="0.000000" x2="87.000000" y1="72.000000" y2="72.000000" stroke="#0A0F25" class=" stroke-N1" style="stroke-width:2" /></g></g><mask id="d2-4262245251" maskUnits="userSpaceOnUse" x="-1" y="-1" width="89" height="74">
<rect x="-1" y="-1" width="89" height="74" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,130 @@
{
"name": "",
"config": {
"sketch": false,
"themeID": 0,
"darkThemeID": null,
"pad": null,
"center": null,
"layoutEngine": null
},
"isFolderOnly": false,
"fontFamily": "SourceSansPro",
"shapes": [
{
"id": "asdf",
"type": "sql_table",
"pos": {
"x": 12,
"y": 12
},
"width": 87,
"height": 72,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "N1",
"stroke": "N7",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": [
{
"name": {
"label": "zxcv",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 37,
"labelHeight": 26
},
"type": {
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": null,
"reference": ""
}
],
"label": "asdf",
"fontSize": 20,
"fontFamily": "DEFAULT",
"language": "",
"color": "N1",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 46,
"labelHeight": 31,
"zIndex": 0,
"level": 1,
"primaryAccentColor": "B2",
"secondaryAccentColor": "AA2",
"neutralAccentColor": "N2"
}
],
"connections": [],
"root": {
"id": "",
"type": "",
"pos": {
"x": 0,
"y": 0
},
"width": 0,
"height": 0,
"opacity": 0,
"strokeDash": 0,
"strokeWidth": 0,
"borderRadius": 0,
"fill": "N7",
"stroke": "",
"animated": false,
"shadow": false,
"3d": false,
"multiple": false,
"double-border": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"zIndex": 0,
"level": 0
}
}

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.6.9-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 89 74"><svg class="d2-3082948363 d2-svg" width="89" height="74" viewBox="11 11 89 74"><rect x="11.000000" y="11.000000" width="89.000000" height="74.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-3082948363 .text {
font-family: "d2-3082948363-font-regular";
}
@font-face {
font-family: d2-3082948363-font-regular;
src: url("data:application/font-woff;base64,d09GRgABAAAAAAhgAAoAAAAADWwAAguFAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgXd/Vo2NtYXAAAAFUAAAAWAAAAG4BjAJcZ2x5ZgAAAawAAAK8AAADCP//bXtoZWFkAAAEaAAAADYAAAA2G4Ue32hoZWEAAASgAAAAJAAAACQKhAXLaG10eAAABMQAAAAkAAAAJBB5AV1sb2NhAAAE6AAAABQAAAAUA7wEam1heHAAAAT8AAAAIAAAACAAIQD2bmFtZQAABRwAAAMjAAAIFAbDVU1wb3N0AAAIQAAAAB0AAAAg/9EAMgADAgkBkAAFAAACigJYAAAASwKKAlgAAAFeADIBIwAAAgsFAwMEAwICBGAAAvcAAAADAAAAAAAAAABBREJPAEAAIP//Au7/BgAAA9gBESAAAZ8AAAAAAeYClAAAACAAA3icVMy5DQIxAAXRZ2yOgMAtcogGkBCiCEAUAHT6V3K0O+ELBkVVsNcc0XUVB2cXVzd3j2TIaS7555dvPnnnled4LCtWqmZtY2vHBAAA//8BAAD//6j0Fdx4nDyQz2sjZRjHn2eSzthN0jXNzLxJOvkx82ZnmkmaxMyPN01jup0kul12TWqoa9i1uOwhQlXY9VB6sQcV8SAV2pugB69C9dybIHoSBBEEjxIKerFE8NKJJLb9A57v5/N5YA4GAJzDHUMA5uEmLIIEYEXV6C3VMKjALMYoCTADo8IAf/c/Q9y0g64bfMH709s/OMDX3+eOL96ufzgcfr+zt+d/Ojrzq/jTGXBgT8b4LZ5DEnIARNMd22W2rlONFwzXtaqyFKUG5Xmj6jKH5yVR/u7FrcPPo4Vl824qqz2pD3ptIaBtybRJ9x9Xw5sbve1opkaz4qqcf+eh/2tdMT0t8/HNRjl/CxBKkzGe4DkoAHOaPsVNIUSYIafzVtVlhOdx8fZbjY3dZqWTMKVyqtgx+i2tLufUXrjxrPfqs4ZG3Fi8vF3rD1MiS6kAHJQnY/yN+xFikL1qmY0bjnUVwZxr0L8P3117zMxmNthvCwHlXuJ2I7OaNtb1l8If7Xffa6aT/dOL2qqS77R8hZT7tQdPACENgOvcL///nzrMsS/9qSZJlkSjb3peZ5OYzy8uKe3hEL9qzt2/+2BeWA/v3G/5bwAAgjIZ4wd4DubM0mDyNNqxdd0ocdd7U01JlGWS5iSR53+2d2g+2y5UKqq1pHnmoLvyirKccLOlQrqyRNsr+W7YUFhCXckkNHIjojr5tW6W2LG4qZCUFIqorGR4yzN+GAB/wBFEAKyAFZNlYrkui1mB05PtRyESCobIjUdbX+PI/yt3h9I7ORT9JCAsAOA3OIIEgMUMi1weMksg1ND16YcFYeHLo8FGKB4JhuTQ2mtHXwxejiQXgpF42PPPdmOmKJqx3b//eSoXJalAns58MgB4iCOYB7AcpI4qoSplEP7AexPA54q41yr6n7QA/gMAAP//AQAA///01J5vAAEAAAACC4Vk2uW7Xw889QADA+gAAAAA2F2goQAAAADdZi82/jr+2whvA8gAAAADAAIAAAAAAAAAAQAAA9j+7wAACJj+Ov46CG8AAQAAAAAAAAAAAAAAAAAAAAkCjQBZAfgANAHIAC4CKwAvASQAHgGjABwB0wAMAb4ADgGpAB8AAAAsAGQAkgDEAOYBJgFCAW4BhAABAAAACQCMAAwAZgAHAAEAAAAAAAAAAAAAAAAABAADeJyclN1OG1cUhT8H221UNRcVisgNOpdtlYzdCKIErkwJilWEU4/TH6mqNHjGP2I8M/IMUKo+QK/7Fn2LXPU5+hBVr6uzvA02qhSBELDOnL33WWevtQ+wyb9sUKs/BP5q/mC4xnZzz/ADHjWfGt7guPG34fpKTIO48ZvhJl82+oY/4n39D8Mfs1P/2fBDtupHhj/heX3T8Kcbjn8MP2KH9wtcg5f8brjGFoXhB2zyk+ENHmM1a3Ue0zbc4DO2DTfZBgZMqUiZkjHGMWLKmHPmJJSEJMyZMiIhxtGlQ0qlrxmRkGP8v18jQirmRKo4ocKREpISUTKxir8qK+etThxpNbe9DhUTIk6VcUZEhiNnTE5GwpnqVFQU7NGiRclQfAsqSgJKpqQE5MwZ06LHEccMmDClxHGkSp5ZSM6Iiksine8swndmSEJGaazOyYjF04lfouwuxzh6FIpdrXy8VuEpju+U7bnliv2KQL9uhdn6uUs2ERfqZ6qupNq5lIIT7fpzO3wrXLGHu1d/1pl8uEex/leqfMq59I+lVCYmGc5t0SGUg0L3BMeB1l1CdeR7ugx4Q493DLTu0KdPhxMGdHmt3B59HF/T44RDZXSFF3tHcswJP+L4hq5ifO3E+rNQLOEXCnN3KY5z3WNGoZ575oHumuiGd1fYz1C+5o5SOUPNkY900i/TnEWMzRWFGM7Uy6U3SutfbI6Y6S5e25t9Pw0XNnvLKb4i1wx7ty44eeUWjD6kanDLM5f6CYiIyTlVxJCcGS0qrsT7LRHnpDgO1b03mpKKznWOP+dKLkmYiUGXTHXmFPobmW9C4z5c872ztyRWvmd6dn2r+5zi1Ksbjd6pe8u90LqcrCjQMlXzFTcNxTUz7yeaqVX+oXJLvW45z+iTSPVUN7j9DjwnoM0Ou+wz0TlD7VzYG9HWO9HmFfvqwRmJokZydWIVdgl4wS67vOLFWs0OhxzQY/8OHBdZPQ54fWtnXadlFWd1/hSbtvg6nl2vXt5br8/v4MsvNFE3L2Nf2vhuX1i1G/+fEDHzXNzW6p3cE4L/AAAA//8BAAD//wdbTDAAeJxiYGYAg//nGIwYsAAAAAAA//8BAAD//y8BAgMAAAA=");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-3082948363 .fill-N1{fill:#0A0F25;}
.d2-3082948363 .fill-N2{fill:#676C7E;}
.d2-3082948363 .fill-N3{fill:#9499AB;}
.d2-3082948363 .fill-N4{fill:#CFD2DD;}
.d2-3082948363 .fill-N5{fill:#DEE1EB;}
.d2-3082948363 .fill-N6{fill:#EEF1F8;}
.d2-3082948363 .fill-N7{fill:#FFFFFF;}
.d2-3082948363 .fill-B1{fill:#0D32B2;}
.d2-3082948363 .fill-B2{fill:#0D32B2;}
.d2-3082948363 .fill-B3{fill:#E3E9FD;}
.d2-3082948363 .fill-B4{fill:#E3E9FD;}
.d2-3082948363 .fill-B5{fill:#EDF0FD;}
.d2-3082948363 .fill-B6{fill:#F7F8FE;}
.d2-3082948363 .fill-AA2{fill:#4A6FF3;}
.d2-3082948363 .fill-AA4{fill:#EDF0FD;}
.d2-3082948363 .fill-AA5{fill:#F7F8FE;}
.d2-3082948363 .fill-AB4{fill:#EDF0FD;}
.d2-3082948363 .fill-AB5{fill:#F7F8FE;}
.d2-3082948363 .stroke-N1{stroke:#0A0F25;}
.d2-3082948363 .stroke-N2{stroke:#676C7E;}
.d2-3082948363 .stroke-N3{stroke:#9499AB;}
.d2-3082948363 .stroke-N4{stroke:#CFD2DD;}
.d2-3082948363 .stroke-N5{stroke:#DEE1EB;}
.d2-3082948363 .stroke-N6{stroke:#EEF1F8;}
.d2-3082948363 .stroke-N7{stroke:#FFFFFF;}
.d2-3082948363 .stroke-B1{stroke:#0D32B2;}
.d2-3082948363 .stroke-B2{stroke:#0D32B2;}
.d2-3082948363 .stroke-B3{stroke:#E3E9FD;}
.d2-3082948363 .stroke-B4{stroke:#E3E9FD;}
.d2-3082948363 .stroke-B5{stroke:#EDF0FD;}
.d2-3082948363 .stroke-B6{stroke:#F7F8FE;}
.d2-3082948363 .stroke-AA2{stroke:#4A6FF3;}
.d2-3082948363 .stroke-AA4{stroke:#EDF0FD;}
.d2-3082948363 .stroke-AA5{stroke:#F7F8FE;}
.d2-3082948363 .stroke-AB4{stroke:#EDF0FD;}
.d2-3082948363 .stroke-AB5{stroke:#F7F8FE;}
.d2-3082948363 .background-color-N1{background-color:#0A0F25;}
.d2-3082948363 .background-color-N2{background-color:#676C7E;}
.d2-3082948363 .background-color-N3{background-color:#9499AB;}
.d2-3082948363 .background-color-N4{background-color:#CFD2DD;}
.d2-3082948363 .background-color-N5{background-color:#DEE1EB;}
.d2-3082948363 .background-color-N6{background-color:#EEF1F8;}
.d2-3082948363 .background-color-N7{background-color:#FFFFFF;}
.d2-3082948363 .background-color-B1{background-color:#0D32B2;}
.d2-3082948363 .background-color-B2{background-color:#0D32B2;}
.d2-3082948363 .background-color-B3{background-color:#E3E9FD;}
.d2-3082948363 .background-color-B4{background-color:#E3E9FD;}
.d2-3082948363 .background-color-B5{background-color:#EDF0FD;}
.d2-3082948363 .background-color-B6{background-color:#F7F8FE;}
.d2-3082948363 .background-color-AA2{background-color:#4A6FF3;}
.d2-3082948363 .background-color-AA4{background-color:#EDF0FD;}
.d2-3082948363 .background-color-AA5{background-color:#F7F8FE;}
.d2-3082948363 .background-color-AB4{background-color:#EDF0FD;}
.d2-3082948363 .background-color-AB5{background-color:#F7F8FE;}
.d2-3082948363 .color-N1{color:#0A0F25;}
.d2-3082948363 .color-N2{color:#676C7E;}
.d2-3082948363 .color-N3{color:#9499AB;}
.d2-3082948363 .color-N4{color:#CFD2DD;}
.d2-3082948363 .color-N5{color:#DEE1EB;}
.d2-3082948363 .color-N6{color:#EEF1F8;}
.d2-3082948363 .color-N7{color:#FFFFFF;}
.d2-3082948363 .color-B1{color:#0D32B2;}
.d2-3082948363 .color-B2{color:#0D32B2;}
.d2-3082948363 .color-B3{color:#E3E9FD;}
.d2-3082948363 .color-B4{color:#E3E9FD;}
.d2-3082948363 .color-B5{color:#EDF0FD;}
.d2-3082948363 .color-B6{color:#F7F8FE;}
.d2-3082948363 .color-AA2{color:#4A6FF3;}
.d2-3082948363 .color-AA4{color:#EDF0FD;}
.d2-3082948363 .color-AA5{color:#F7F8FE;}
.d2-3082948363 .color-AB4{color:#EDF0FD;}
.d2-3082948363 .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-d2-3082948363);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-3082948363);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-3082948363);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-3082948363);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-3082948363);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-3082948363);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-3082948363);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-3082948363);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="YXNkZg=="><g class="shape" ><rect x="12.000000" y="12.000000" width="87.000000" height="72.000000" stroke="#0A0F25" fill="#FFFFFF" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="12.000000" y="12.000000" width="87.000000" height="36.000000" fill="#0A0F25" class="class_header fill-N1" /><text x="22.000000" y="37.750000" fill="#FFFFFF" class="text fill-N7" style="text-anchor:start;font-size:24px">asdf</text><text x="22.000000" y="71.000000" fill="#0D32B2" class="text fill-B2" style="text-anchor:start;font-size:20px">zxcv</text><text x="79.000000" y="71.000000" fill="#676C7E" class="text fill-N2" style="text-anchor:start;font-size:20px" /><text x="89.000000" y="71.000000" fill="#4A6FF3" class="text fill-AA2" style="text-anchor:end;font-size:20px" /><line x1="12.000000" x2="99.000000" y1="84.000000" y2="84.000000" stroke="#0A0F25" class=" stroke-N1" style="stroke-width:2" /></g></g><mask id="d2-3082948363" maskUnits="userSpaceOnUse" x="11" y="11" width="89" height="74">
<rect x="11" y="11" width="89" height="74" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -759,3 +759,19 @@ b: {
a.b -> b.c
b.c -> a.a: {style.font-color: red; style.stroke: red; style.fill: mistyrose}
-- sql-casing-panic --
asdf:{
shape:sQl_table
zxcv
}
-- connection-icons --
direction: right
a -> b: hello {
icon: https://icons.terrastruct.com/essentials%2F213-alarm.svg
}
b -> c: {
icon: https://icons.terrastruct.com/essentials%2F213-alarm.svg
}

2
go.mod generated
View file

@ -29,7 +29,7 @@ require (
golang.org/x/tools v0.25.0
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da
gonum.org/v1/plot v0.14.0
oss.terrastruct.com/util-go v0.0.0-20241005222610-44c011a04896
oss.terrastruct.com/util-go v0.0.0-20250213174338-243d8661088a
)
require (

4
go.sum generated
View file

@ -205,7 +205,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
oss.terrastruct.com/util-go v0.0.0-20241005222610-44c011a04896 h1:g752s1ECv9FD8GunFOZRGWzjeR0cr/TZdSsjAnFEmL8=
oss.terrastruct.com/util-go v0.0.0-20241005222610-44c011a04896/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4=
oss.terrastruct.com/util-go v0.0.0-20250213174338-243d8661088a h1:UXF/Z9i9tOx/wqGUOn/T12wZeez1Gg0sAVKKl7YUDwM=
oss.terrastruct.com/util-go v0.0.0-20250213174338-243d8661088a/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4=
rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

View file

@ -219,7 +219,7 @@
},
"near_key": null,
"shape": {
"value": "Circle"
"value": "circle"
},
"direction": {
"value": ""

292
testdata/d2oracle/TestDelete/underscore_linked.exp.json generated vendored Normal file
View file

@ -0,0 +1,292 @@
{
"graph": {
"name": "",
"isFolderOnly": false,
"ast": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,0:0:0-7:0:32",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,0:0:0-0:1:1",
"key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,0:0:0-0:1:1",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,0:0:0-0:1:1",
"value": [
{
"string": "k",
"raw_string": "k"
}
]
}
}
]
},
"primary": {},
"value": {}
}
},
{
"map_key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,2:0:3-6:1:31",
"key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,2:0:3-2:6:9",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,2:0:3-2:6:9",
"value": [
{
"string": "layers",
"raw_string": "layers"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,2:8:11-6:1:31",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,3:2:15-5:3:29",
"key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,3:2:15-3:3:16",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,3:2:15-3:3:16",
"value": [
{
"string": "x",
"raw_string": "x"
}
]
}
}
]
},
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,3:5:18-5:3:29",
"nodes": [
{
"map_key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,4:4:24-4:5:25",
"key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,4:4:24-4:5:25",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,4:4:24-4:5:25",
"value": [
{
"string": "a",
"raw_string": "a"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
}
}
}
}
]
}
}
}
}
]
},
"root": {
"id": "",
"id_val": "",
"attributes": {
"label": {
"value": ""
},
"labelDimensions": {
"width": 0,
"height": 0
},
"style": {},
"near_key": null,
"shape": {
"value": ""
},
"direction": {
"value": ""
},
"constraint": null
},
"zIndex": 0
},
"edges": null,
"objects": [
{
"id": "k",
"id_val": "k",
"references": [
{
"key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,0:0:0-0:1:1",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,0:0:0-0:1:1",
"value": [
{
"string": "k",
"raw_string": "k"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "k"
},
"labelDimensions": {
"width": 0,
"height": 0
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": null
},
"zIndex": 0
}
],
"layers": [
{
"name": "x",
"isFolderOnly": false,
"ast": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,0:0:0-1:0:0",
"nodes": [
{
"map_key": {
"range": ",0:0:0-0:0:0",
"key": {
"range": ",0:0:0-0:0:0",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,4:4:24-4:5:25",
"value": [
{
"string": "a",
"raw_string": "a"
}
]
}
}
]
},
"primary": {},
"value": {}
}
}
]
},
"root": {
"id": "",
"id_val": "",
"attributes": {
"label": {
"value": ""
},
"labelDimensions": {
"width": 0,
"height": 0
},
"style": {},
"near_key": null,
"shape": {
"value": ""
},
"direction": {
"value": ""
},
"constraint": null
},
"zIndex": 0
},
"edges": null,
"objects": [
{
"id": "a",
"id_val": "a",
"references": [
{
"key": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,4:4:24-4:5:25",
"path": [
{
"unquoted_string": {
"range": "d2/testdata/d2oracle/TestDelete/underscore_linked.d2,4:4:24-4:5:25",
"value": [
{
"string": "a",
"raw_string": "a"
}
]
}
}
]
},
"key_path_index": 0,
"map_key_edge_index": -1
}
],
"attributes": {
"label": {
"value": "a"
},
"labelDimensions": {
"width": 0,
"height": 0
},
"style": {},
"near_key": null,
"shape": {
"value": "rectangle"
},
"direction": {
"value": ""
},
"constraint": null
},
"zIndex": 0
}
]
}
]
},
"err": "<nil>"
}