|
1 | 1 | <script lang="ts"> |
| 2 | + import { DefaultNode } from 'svelte-tree-view' |
| 3 | +
|
2 | 4 | import type { NodeProps } from 'svelte-tree-view' |
3 | 5 |
|
4 | | - let { |
5 | | - node, |
6 | | - TreeViewNode, |
7 | | - getTreeContext, |
8 | | - handleLogNode, |
9 | | - handleCopyNodeToClipboard, |
10 | | - handleToggleCollapse |
11 | | - }: NodeProps = $props() |
| 6 | + let props: NodeProps = $props() |
| 7 | +
|
12 | 8 | const { |
13 | | - propsStore: { props: propsObj, formatValue } |
14 | | - } = getTreeContext() |
15 | | - let hasChildren = $derived(node.children.length > 0) |
16 | | - let descend = $derived(!node.collapsed && hasChildren) |
17 | | - let value = $derived(node.getValue()) |
| 9 | + propsStore: { formatValue } |
| 10 | + } = props.getTreeContext() |
18 | 11 |
|
19 | 12 | function replaceSpacesWithNonBreakingSpace(value: string) { |
20 | 13 | return value.replace(/\s/gm, ' ') |
|
46 | 39 | } |
47 | 40 | </script> |
48 | 41 |
|
49 | | -<li class="row" class:collapsed={node.collapsed && hasChildren} data-tree-id={node.id}> |
50 | | - {#if hasChildren} |
51 | | - <button class={`arrow-btn ${node.collapsed ? 'collapsed' : ''}`} onclick={handleToggleCollapse}> |
52 | | - ▶ |
53 | | - </button> |
54 | | - {/if} |
55 | | - <div |
56 | | - class="node-key" |
57 | | - class:has-children={hasChildren} |
58 | | - class:p-left={!hasChildren} |
59 | | - onclick={handleToggleCollapse} |
60 | | - role="presentation" |
61 | | - > |
62 | | - {node.key}: |
63 | | - </div> |
64 | | - <div |
65 | | - class="node-value" |
66 | | - data-type={node.type} |
67 | | - class:expanded={!node.collapsed && hasChildren} |
68 | | - class:has-children={hasChildren} |
69 | | - onclick={handleToggleCollapse} |
70 | | - role="presentation" |
71 | | - > |
| 42 | +<DefaultNode {...props}> |
| 43 | + {#snippet value(node)} |
72 | 44 | {#if Array.isArray(value)} |
73 | 45 | <!-- The why https://github.com/benjamine/jsondiffpatch/blob/master/docs/deltas.md --> |
74 | 46 | {#if value.length === 1} |
|
97 | 69 | {:else} |
98 | 70 | {formatValue(value, node)} |
99 | 71 | {/if} |
100 | | - </div> |
101 | | - <div class="buttons"> |
102 | | - {#if $propsObj.showLogButton} |
103 | | - <button class="log-copy-button" onclick={handleLogNode}>log</button> |
104 | | - {/if} |
105 | | - {#if $propsObj.showCopyButton} |
106 | | - <button class="log-copy-button" onclick={handleCopyNodeToClipboard}>copy</button> |
107 | | - {/if} |
108 | | - </div> |
109 | | -</li> |
110 | | -{#if descend} |
111 | | - <li class="row"> |
112 | | - <ul> |
113 | | - {#each node.children as id} |
114 | | - <TreeViewNode {id} /> |
115 | | - {/each} |
116 | | - </ul> |
117 | | - </li> |
118 | | -{/if} |
| 72 | + {/snippet} |
| 73 | +</DefaultNode> |
119 | 74 |
|
120 | 75 | <style lang="postcss"> |
121 | 76 | .added { |
|
146 | 101 | .arrow { |
147 | 102 | color: #87cc86; |
148 | 103 | } |
149 | | -
|
150 | | - ul { |
151 | | - display: flex; |
152 | | - flex-direction: column; |
153 | | - height: max-content; |
154 | | - list-style: none; |
155 | | - padding: 0; |
156 | | - padding-left: var(--tree-view-left-indent); |
157 | | - margin: 0; |
158 | | - width: 100%; |
159 | | - } |
160 | | - li { |
161 | | - align-items: baseline; |
162 | | - display: flex; |
163 | | - height: max-content; |
164 | | - line-height: var(--tree-view-line-height); |
165 | | - list-style: none; |
166 | | - width: 100%; |
167 | | - } |
168 | | - li + li { |
169 | | - margin-top: 0.25em; |
170 | | - } |
171 | | - .empty-block { |
172 | | - visibility: hidden; |
173 | | - } |
174 | | - .node-key { |
175 | | - color: var(--tree-view-base0D); |
176 | | - margin-right: var(--tree-view-key-margin-right); |
177 | | - &.has-children { |
178 | | - cursor: pointer; |
179 | | - } |
180 | | - &.p-left { |
181 | | - padding-left: 1.1em; |
182 | | - } |
183 | | - } |
184 | | - .node-value { |
185 | | - color: var(--tree-view-base0B); |
186 | | - margin-right: 0.5em; |
187 | | - word-break: break-all; |
188 | | - &[data-type='number'], |
189 | | - &[data-type='boolean'] { |
190 | | - color: var(--tree-view-base09); |
191 | | - } |
192 | | - &[data-type='null'], |
193 | | - &[data-type='undefined'] { |
194 | | - color: var(--tree-view-base08); |
195 | | - } |
196 | | - &.expanded { |
197 | | - color: var(--tree-view-base03); |
198 | | - } |
199 | | - &.has-children { |
200 | | - cursor: pointer; |
201 | | - } |
202 | | - } |
203 | | - .arrow-btn { |
204 | | - background: transparent; |
205 | | - border: 0; |
206 | | - color: var(--tree-view-base0D); |
207 | | - cursor: pointer; |
208 | | - margin-right: 0.7em; |
209 | | - padding: 0; |
210 | | - transition: all 150ms ease 0s; |
211 | | - transform: rotateZ(90deg); |
212 | | - transform-origin: 47% 43%; |
213 | | - position: relative; |
214 | | - line-height: 1.1em; |
215 | | - font-size: 0.75em; |
216 | | - &.collapsed { |
217 | | - transform: rotateZ(0deg); |
218 | | - } |
219 | | - } |
220 | | - .buttons { |
221 | | - display: flex; |
222 | | - flex-wrap: wrap; |
223 | | - } |
224 | | - .log-copy-button { |
225 | | - background: transparent; |
226 | | - border: 0; |
227 | | - color: var(--tree-view-base0D); |
228 | | - cursor: pointer; |
229 | | - margin: 0; |
230 | | - padding: 0 0.5em; |
231 | | - &:hover { |
232 | | - background: rgba(rgb(255, 162, 177), 0.4); |
233 | | - border-radius: 2px; |
234 | | - color: var(--tree-view-base07); |
235 | | - } |
236 | | - } |
237 | 104 | </style> |
0 commit comments