import { LitElement, html, css } from "lit"; import { customElement, property } from "lit/decorators.js"; import { copyToClipboard } from "~/utils/common-utils"; import FontStyles from "~/styles/font-styles"; import BorderStyles from "~/styles/border-styles"; import InputStyles from "~/styles/input-styles"; import CustomStyles from "~/styles/custom-styles"; @customElement("json-tree") export default class JsonTree extends LitElement { @property({ type: Object }) data = null; @property({ type: String, attribute: "render-style" }) renderStyle = ""; static get styles() { return [ FontStyles, BorderStyles, InputStyles, css` :host { display: flex; } :where(button, input[type='checkbox'], [tabindex='0']):focus-visible { box-shadow: var(--focus-shadow); } :where(input[type='text'], input[type='password'], select, textarea):focus-visible { border-color: var(--primary); } .json-tree { position: relative; font-family: var(--font-mono); font-size: var(--font-size-small); display: inline-block; overflow: hidden; word-break: break-all; flex: 1; line-height: calc(var(--font-size-small) + 6px); min-height: 40px; direction: ltr; text-align: left; } .open-bracket { display: inline-block; padding: 0 20px 0 0; cursor: pointer; border: 1px solid transparent; border-radius: min(var(--radius), 0.5rem); &:hover { color: var(--primary); border: 1px solid var(--border); } &.expanded:hover ~ .inside-bracket { border-left: 1px solid var(--muted-foreground); } &.expanded:hover ~ .close-bracket { color: var(--primary); } &.collapsed + .inside-bracket, &.collapsed + .inside-bracket + .close-bracket { display: none; } &.expanded .open-bracket-collapsed { display: none; } &.collapsed .open-bracket-expanded { display: none; } } .close-bracket { border: 1px solid transparent; border-radius: min(var(--radius), 0.5rem); display: inline-block; } .inside-bracket { padding-left: 12px; overflow: hidden; border-left: 1px dotted var(--border); } .string { color: var(--green); } .number { color: var(--blue); } .null { color: var(--destructive); } .boolean { color: var(--purple); } .object { color: var(--foreground); } .toolbar { position: absolute; top: 5px; right: 6px; display: flex; padding: 2px; align-items: center; } `, CustomStyles, ]; } render() { return html`