From 13f3129c78b4289f51a8f6fb13bc7e82c3327629 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 9 Sep 2026 15:43:11 +0200 Subject: [PATCH] fix: clipboard copy fallback via execCommand (iframe blocks navigator.clipboard) --- src/ui.tsx | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/ui.tsx b/src/ui.tsx index 2f5f5d7..40ba797 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -89,6 +89,8 @@ function Plugin () { } // Копирует все debug-значения (RAW + расчёт) в буфер обмена как текст. + // Важно: в iframe плагина Figma navigator.clipboard часто недоступен (или его + // промис тихо reject'ится), поэтому обязателен fallback через document.execCommand('copy'). function copyInfo () { if (windowInfo == null) return const i = windowInfo @@ -110,11 +112,46 @@ function Plugin () { `center.y = ${i.center.y} (y + h / 2)` ] const text = lines.join('\n') + + function markCopied () { + setCopied(true) + setTimeout(function () { setCopied(false) }, 1200) + } + + // Путь 1: современный async Clipboard API (если доступен и сработал) if (navigator.clipboard != null && navigator.clipboard.writeText != null) { - navigator.clipboard.writeText(text).then(function () { - setCopied(true) - setTimeout(function () { setCopied(false) }, 1200) - }).catch(function () { /* тихо */ }) + const apiResult = navigator.clipboard.writeText(text) + if (apiResult != null && typeof apiResult.then === 'function') { + apiResult.then(function () { markCopied() }).catch(function () { + // тихо — переходим к fallback + fallbackCopy(text, markCopied) + }) + return + } + } + // Путь 2: синхронный fallback для iframe/небезопасных контекстов + fallbackCopy(text, markCopied) + } + + // Fallback-копирование через временный