Skip to content

Copy to Clipboard ​

Every node has a copy button that copies its value as formatted JSON.

How It Works ​

Hover over any row to reveal the copy button, then click it. The value is serialized with JSON.stringify(value, null, 2) and written to the clipboard.

obj{
"user":obj{
"name": "Ada",
"email": "ada@example.com"
},
"roles":2[
"admin",
"editor"
]
}

Visual Feedback ​

  1. Before copy — a clipboard icon.
  2. After a successful copy — a checkmark ✓.
  3. Auto-reset — back to the clipboard icon after 1.5 seconds.

The icon changes only when the copy actually succeeds.

Robust by Default ​

Copying is designed never to throw and to work in as many environments as possible:

  • Uses the async Clipboard API (navigator.clipboard.writeText) when available.
  • Falls back to document.execCommand('copy') when the Clipboard API is missing or rejects — so it also works in non-secure (http://) contexts and older browsers.
  • If the value can't be serialized (for example a circular reference), the copy fails gracefully: no icon change, no copy event, no thrown error.

The copy Event ​

A successful copy emits a typed copy event so you can audit or react to it:

vue
<script setup lang="ts">
  import { JsonViewer } from '@anilkumarthakur/vue3-json-viewer';
  import '@anilkumarthakur/vue3-json-viewer/styles.css';
  import type { CopyEventPayload } from '@anilkumarthakur/vue3-json-viewer';

  const data = { name: 'John Doe', age: 30 };

  const onCopy = (e: CopyEventPayload) => {
    // { path: '$.name', key: 'name', value: 'John Doe' }
    console.log('copied', e.path, e.value);
  };
</script>

<template>
  <JsonViewer
    :data="data"
    @copy="onCopy"
  />
</template>

What Gets Copied ​

NodeClipboard contents
Objectthe object, pretty-printed
Arraythe array, pretty-printed
String"Hello World"
Number42
Booleantrue

Values that JSON.stringify drops (like undefined or functions at the top level) fall back to their String() form.

Styling the Copy Button ​

The button uses the jv-copy-btn class (with jv-copy-btn-dark / jv-copy-btn-light variants). It's hidden until you hover the row — to always show it:

css
.jv-copy-btn {
  opacity: 0.4 !important;
}
.jv-copy-btn:hover {
  opacity: 1 !important;
}

See Custom Styling for the full class reference.

Released under the MIT License.