Spaces:
Runtime error
Runtime error
| <script> | |
| /** @type {*} - object or array to display */ | |
| export let json | |
| /** @type {number} - initial expansion depth */ | |
| export let depth = Infinity | |
| export let _cur = 0 | |
| export let _last = true | |
| /** @type {*[]} */ | |
| let items | |
| let isArray = false | |
| let brackets = ['', ''] | |
| let collapsed = false | |
| /** | |
| * @param {*} i | |
| * @returns {string} | |
| */ | |
| function getType(i) { | |
| if (i === null) return 'null' | |
| return typeof i | |
| } | |
| /** | |
| * @param {*} i | |
| * @returns {string} | |
| */ | |
| function format(i) { | |
| const t = getType(i) | |
| if (t === 'string') return `"${i}"` | |
| if (t === 'function') return 'f () {...}' | |
| if (t === 'symbol') return i.toString() | |
| return i | |
| } | |
| function clicked() { | |
| collapsed = !collapsed | |
| } | |
| /** | |
| * @param {Event} e | |
| */ | |
| function pressed(e) { | |
| if (e instanceof KeyboardEvent && ['Enter', ' '].includes(e.key)) clicked() | |
| } | |
| $: { | |
| items = getType(json) === 'object' ? Object.keys(json) : [] | |
| isArray = Array.isArray(json) | |
| brackets = isArray ? ['[', ']'] : ['{', '}'] | |
| } | |
| $: collapsed = depth < _cur | |
| </script> | |
| {#if !items.length} | |
| <span class="_jsonBkt empty" class:isArray>{brackets[0]}{brackets[1]}</span>{#if !_last}<span | |
| class="_jsonSep">,</span | |
| >{/if} | |
| {:else if collapsed} | |
| <span | |
| class="_jsonBkt" | |
| class:isArray | |
| role="button" | |
| tabindex="0" | |
| on:click={clicked} | |
| on:keydown={pressed}>{brackets[0]}...{brackets[1]}</span | |
| >{#if !_last && collapsed}<span class="_jsonSep">,</span>{/if} | |
| {:else} | |
| <span | |
| class="_jsonBkt" | |
| class:isArray | |
| role="button" | |
| tabindex="0" | |
| on:click={clicked} | |
| on:keydown={pressed}>{brackets[0]}</span | |
| > | |
| <ul class="_jsonList"> | |
| {#each items as i, idx} | |
| <li> | |
| {#if !isArray} | |
| <span class="_jsonKey">"{i}"</span><span class="_jsonSep">:</span> | |
| {/if} | |
| {#if getType(json[i]) === 'object'} | |
| <svelte:self json={json[i]} {depth} _cur={_cur + 1} _last={idx === items.length - 1} /> | |
| {:else} | |
| <span class="_jsonVal {getType(json[i])}">{format(json[i])}</span | |
| >{#if idx < items.length - 1}<span class="_jsonSep">,</span>{/if} | |
| {/if} | |
| </li> | |
| {/each} | |
| </ul> | |
| <span | |
| class="_jsonBkt" | |
| class:isArray | |
| role="button" | |
| tabindex="0" | |
| on:click={clicked} | |
| on:keydown={pressed}>{brackets[1]}</span | |
| >{#if !_last}<span class="_jsonSep">,</span>{/if} | |
| {/if} | |
| <style> | |
| :where(._jsonList) { | |
| list-style: none; | |
| margin: 0; | |
| padding: 0; | |
| padding-left: var(--jsonPaddingLeft, 1rem); | |
| border-left: var(--jsonBorderLeft, 1px dotted); | |
| } | |
| :where(._jsonBkt) { | |
| color: var(--jsonBracketColor, currentcolor); | |
| } | |
| :where(._jsonBkt):not(.empty):hover { | |
| cursor: pointer; | |
| background: var(--jsonBracketHoverBackground, #e5e7eb); | |
| } | |
| :where(._jsonSep) { | |
| color: var(--jsonSeparatorColor, currentcolor); | |
| } | |
| :where(._jsonKey) { | |
| color: var(--jsonKeyColor, currentcolor); | |
| } | |
| :where(._jsonVal) { | |
| color: var(--jsonValColor, #9ca3af); | |
| } | |
| :where(._jsonVal).string { | |
| color: var(--jsonValStringColor, #059669); | |
| } | |
| :where(._jsonVal).number { | |
| color: var(--jsonValNumberColor, #d97706); | |
| } | |
| :where(._jsonVal).boolean { | |
| color: var(--jsonValBooleanColor, #2563eb); | |
| } | |
| </style> | |