From 9e081891dfb5190de0314fdf72edd5a631ce7265 Mon Sep 17 00:00:00 2001 From: hyper Date: Fri, 7 Aug 2026 12:13:40 +0800 Subject: [PATCH] feat(md-deck): Add fallback copy dialog for clipboard failure --- src/components/md-deck/DeckHeader.tsx | 113 ++++++++++++++++------ src/components/md-deck/hooks/deckStore.ts | 12 ++- 2 files changed, 94 insertions(+), 31 deletions(-) diff --git a/src/components/md-deck/DeckHeader.tsx b/src/components/md-deck/DeckHeader.tsx index 5c7a0ff..d7ba752 100644 --- a/src/components/md-deck/DeckHeader.tsx +++ b/src/components/md-deck/DeckHeader.tsx @@ -1,3 +1,5 @@ +import { Show, createSignal, onMount } from "solid-js"; +import { Portal } from "solid-js/web"; import type { DeckStore } from "./hooks/deckStore"; export interface DeckHeaderProps { @@ -9,36 +11,93 @@ export interface DeckHeaderProps { */ export function DeckHeader(props: DeckHeaderProps) { const { store } = props; + const [showCopyFallback, setShowCopyFallback] = createSignal(false); + const [fallbackCode, setFallbackCode] = createSignal(""); + let textareaRef: HTMLTextAreaElement | undefined; + + onMount(() => { + if (showCopyFallback() && textareaRef) { + textareaRef.focus(); + textareaRef.select(); + } + }); + + const handleCopy = () => { + store.actions.copyCode((code) => { + setFallbackCode(code); + setShowCopyFallback(true); + }); + }; + + const closeFallback = () => setShowCopyFallback(false); return ( -
- {/* 编辑按钮 */} - + <> +
+ {/* 编辑按钮 */} + - {/* 导出 PDF 按钮 */} - + {/* 导出 PDF 按钮 */} + - {/* 复制代码按钮 */} - -
+ {/* 复制代码按钮 */} + +
+ + {/* 剪贴板不可用时的手动复制弹窗 */} + + +
+
e.stopPropagation()} + > +

复制代码

+

+ 自动复制失败(当前站点可能不是 HTTPS),请手动复制下面的代码: +

+