diff --git a/src/styles/images/plus.svg b/src/styles/images/plus.svg
new file mode 100644
index 00000000..cab0b033
--- /dev/null
+++ b/src/styles/images/plus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/styles/images/trash.svg b/src/styles/images/trash.svg
new file mode 100644
index 00000000..d3dc8942
--- /dev/null
+++ b/src/styles/images/trash.svg
@@ -0,0 +1 @@
+
diff --git a/src/styles/nodes.css b/src/styles/nodes.css
index 58afc3b9..a030afa8 100644
--- a/src/styles/nodes.css
+++ b/src/styles/nodes.css
@@ -1,30 +1,158 @@
-.list-entry:not(:last-child),
-.map-entry:not(:last-child),
-.object-node:not(:last-child) > .object-fields {
- margin-bottom: 0.3rem;
+.tree > .object-node > .node-body {
+ border-left: none;
+ padding-left: 0;
}
-.list-entry,
-.map-entry,
-.object-fields {
+.node {
+ margin: 2px 0;
+}
+
+.node-body > .node:first-child {
+ margin-top: 4px;
+}
+
+.list-node:last-child,
+.map-node:last-child,
+.object-node:last-child {
+ margin-bottom: 0;
+}
+
+.list-node > .node-body,
+.map-node > .node-body,
+.object-node > .node-body {
+ border-left: 3px solid;
+}
+
+.node-header > label,
+.node-header > button {
+ user-select: none;
+}
+.object-node > .node-header > label.collapse {
+ cursor: pointer;
+}
+
+.node input,
+.node select {
+ font-size: 18px;
+}
+
+.node-header {
+ display: inline-flex;
+ align-items: center;
+ max-width: 100%;
+}
+
+.node-header > * {
+ height: 24px;
+ border: 1px solid;
+}
+
+.node-header > button {
+ cursor: pointer;
+}
+
+.node-header > input {
+ padding-left: 4px;
+}
+
+.node-header > label,
+.node-header > button {
+ padding: 0 3px;
+}
+
+.node-header > *:first-child {
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+.node-header > *:last-child {
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+
+.node-header > *:not(:last-child) {
+ margin-right: -1px;
+}
+
+.object-node > .node-header > *:first-child,
+.map-node > .node-header > *:first-child,
+.list-node > .node-header > *:first-child {
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 0;
+}
+
+.node-header > label.collapse.closed {
+ border-bottom-left-radius: 3px;
+}
+
+label.collapse::before {
+ padding-right: 5px;
+ position: relative;
+ top: 3px;
+}
+
+label.collapse.closed::before,
+button.add::after {
+ content: url('./images/plus.svg')
+}
+
+label.collapse.open::before,
+button.remove::before {
+ content: url('./images/trash.svg');
+}
+
+.node-body {
+ display: flex;
+ flex-direction: column;
padding-left: 0.7rem;
}
-.list-entry {
- border-left: 2px solid #0b552a;
+.node-entry {
+ display: flex;
+ flex-direction: column;
+ margin-top: 2px;
}
-.map-fields {
- border-left: 2px solid #066fb4;
+/* COLORS */
+
+.node-header > * {
+ border-color: #bcbfc3;
}
-.object-fields {
- border-left: 2px solid #b9b9b9;
+.node-header > label {
+ background-color: #e4e4e4;
}
-.object-node > label {
- user-select: none;
+
+.node-header > button.add {
+ border-color: #54911b;
+ background-color: #add38a;
}
-.object-node > label.collapse {
- cursor: pointer;
+
+.node-header > button.selected {
+ background-color: #f0e65e;
+ border-color: #b9a327
+}
+
+.node-header > label.collapse.closed {
+ border-color: #54911b;
+ background-color: #add38a;
+}
+
+.node-header > label.collapse.open,
+button.remove {
+ border-color: #be4b2e;
+ background-color: #e2917c;
+}
+
+.list-node > .node-body {
+ border-color: #72a543;
+}
+
+.map-node > .node-body {
+ border-color: #066fb4;
+}
+
+.object-node > .node-body {
+ border-color: #b9b9b9;
}