diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 945fe06..210b949 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -3,6 +3,26 @@ import { router } from './router' import App from './App.vue' import './style.css' +// Clipboard polyfill: on nodes the app is served over plain HTTP (non-secure +// context), where navigator.clipboard does not exist — every copy button would +// throw "Cannot read properties of undefined (reading 'writeText')". +if (!navigator.clipboard) { + Object.defineProperty(navigator, 'clipboard', { + value: { + async writeText(text: string) { + const ta = document.createElement('textarea') + ta.value = text + ta.style.cssText = 'position:fixed;opacity:0' + document.body.appendChild(ta) + ta.select() + document.execCommand('copy') + document.body.removeChild(ta) + }, + async readText() { return '' }, + }, + }) +} + const app = createApp(App) app.use(router) app.mount('#app')