dont-copy
v0.4.0
Published
A Vue 3 component that discourages copy/paste on HTML inputs and emits audit events when someone tries
Maintainers
Readme
dont-copy
A Vue 3 component that discourages casual copy/paste on HTML inputs and textareas — and tells you when someone tries.
Think of it less as a lock and more as a door that's slightly inconvenient to open, with a bell that rings when someone pushes it.
What it actually does
- Blocks
Ctrl+C,Ctrl+V, and right-click on child inputs (configurable) - Emits audit events with the field's
nameandidso you know exactly what was targeted - Watches for dynamically added inputs via MutationObserver
- Cleans up after itself — no memory leaks
What it doesn't do
It won't stop someone who opens DevTools, disables JavaScript, or inspects the DOM. If you need actual content security, this isn't the tool. If you need discouragement with a paper trail, read on.
Install
npm i dont-copyUsage
import DontCopy from "dont-copy";
// Register globally (optional)
app.use(DontCopy);Basic — discourage everything
<DontCopy>
<input type="text" name="ssn" value="123-45-6789" />
</DontCopy>Selective — allow paste but flag copy attempts
<DontCopy :disable-paste="false">
<input type="text" name="answer" />
</DontCopy>The audit trail — log every attempt
<DontCopy
@copy-attempted="logAttempt"
@paste-attempted="logAttempt"
@contextmenu-attempted="logAttempt"
>
<input type="text" name="ssn" id="ssn-field" />
</DontCopy>const logAttempt = ({ name, id, event }) => {
console.warn(`Copy attempt on field "${name || id}" at ${new Date().toISOString()}`);
// Send to your analytics, flag the session, show a warning, etc.
};Props
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| disableCopy | Boolean | true | Block Ctrl+C / copy |
| disablePaste | Boolean | true | Block Ctrl+V / paste |
| disableContextMenu | Boolean | true | Block right-click |
Events
Each event payload includes event (the original DOM event), name (the input's name attribute), and id (the input's id attribute).
| Event | Payload | Fires when |
|-------|---------|------------|
| copy-attempted | { event, name, id } | Someone tries to copy |
| paste-attempted | { event, name, id } | Someone tries to paste |
| contextmenu-attempted | { event, name, id } | Someone right-clicks |
License
ISC © Umair Khan 📬 [email protected]
