|
22 | 22 |
|
23 | 23 | let list_item_el = $state() as HTMLLIElement; |
24 | 24 |
|
25 | | - let is_root = $derived(path_nodes[0] === value); |
26 | 25 | let is_leaf = $derived(path_nodes[path_nodes.length - 1] === value); |
27 | | - let is_ast_array = $derived(Array.isArray(value)); |
28 | | - let is_collapsable = $derived(value && typeof value === 'object'); |
| 26 | + let is_array = $derived(Array.isArray(value)); |
| 27 | + let is_primitive = $derived(value === null || typeof value !== 'object'); |
29 | 28 | let is_markable = $derived( |
30 | | - is_collapsable && |
| 29 | + !is_primitive && |
31 | 30 | 'start' in value && |
32 | 31 | 'end' in value && |
33 | 32 | typeof value.start === 'number' && |
|
38 | 37 | let preview_text = $state(''); |
39 | 38 |
|
40 | 39 | $effect(() => { |
41 | | - if (!is_collapsable || !collapsed) return; |
| 40 | + if (is_primitive || !collapsed) return; |
42 | 41 |
|
43 | | - if (is_ast_array) { |
| 42 | + if (is_array) { |
44 | 43 | if (!('length' in value)) return; |
45 | 44 |
|
46 | 45 | preview_text = `[ ${value.length} element${value.length === 1 ? '' : 's'} ]`; |
|
91 | 90 |
|
92 | 91 | <li |
93 | 92 | bind:this={list_item_el} |
94 | | - class:marked={!is_root && is_leaf} |
| 93 | + class:marked={!root && is_leaf} |
95 | 94 | onmouseover={handle_mark_text} |
96 | 95 | onfocus={handle_mark_text} |
97 | 96 | onmouseleave={handle_unmark_text} |
98 | 97 | > |
99 | | - {#if !is_root && is_collapsable} |
| 98 | + {#if !root && !is_primitive} |
100 | 99 | <button class="ast-toggle" class:open={!collapsed} onclick={() => (collapsed = !collapsed)}> |
101 | 100 | {key_text} |
102 | 101 | </button> |
103 | 102 | {:else if key_text} |
104 | 103 | <span>{key_text}</span> |
105 | 104 | {/if} |
106 | | - {#if is_collapsable} |
107 | | - {#if collapsed && !is_root} |
108 | | - <button class="preview" onclick={() => (collapsed = !collapsed)}> |
109 | | - {preview_text} |
110 | | - </button> |
111 | | - {:else} |
112 | | - <span>{is_ast_array ? '[' : '{'}</span> |
113 | | - <ul> |
114 | | - {#each Object.entries(value) as [k, v]} |
115 | | - <AstNode key={is_ast_array ? '' : k} value={v} {path_nodes} {autoscroll} /> |
116 | | - {/each} |
117 | | - </ul> |
118 | | - <span>{is_ast_array ? ']' : '}'}</span> |
119 | | - {/if} |
120 | | - {:else} |
| 105 | + |
| 106 | + {#if is_primitive} |
121 | 107 | <span class="token {typeof value}"> |
122 | 108 | {JSON.stringify(value)} |
123 | 109 | </span> |
| 110 | + {:else if collapsed && !root} |
| 111 | + <button class="preview" onclick={() => (collapsed = !collapsed)}> |
| 112 | + {preview_text} |
| 113 | + </button> |
| 114 | + {:else} |
| 115 | + <span>{is_array ? '[' : '{'}</span> |
| 116 | + <ul> |
| 117 | + {#each Object.entries(value) as [k, v]} |
| 118 | + <AstNode key={is_array ? '' : k} value={v} {path_nodes} {autoscroll} /> |
| 119 | + {/each} |
| 120 | + </ul> |
| 121 | + <span>{is_array ? ']' : '}'}</span> |
124 | 122 | {/if} |
125 | 123 | </li> |
126 | 124 |
|
|
0 commit comments