style(copy): fix remaining punctuation violations and make check:copy strict

Auto-fix of 602 string literals across 74 files (half-width punctuation next to
Chinese, parenthesised Chinese, quotes); biome reflow; e2/e6 assertions follow
the new full-width summaries. check:copy now runs with --strict in ci.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-28 21:34:51 +08:00
1 parent 0fccfe257d
commit fb84a71f80
76 files changed
+582 -570

No files matched your search

@@ -45,13 +45,13 @@ function QrCode({ value }: { value: string }) {
/** 恢复码展示:只此一次;可复制、下载 */
function RecoveryCodes({ codes, onDone }: { codes: string[]; onDone: () => void }) {
const text = `UHD Media Tool 恢复码(每个只能用一次)\n\n${codes.join("\n")}\n`;
const text = `UHD Media Tool 恢复码(每个只能用一次)\n\n${codes.join("\n")}\n`;
const copy = async () => {
try {
await navigator.clipboard.writeText(codes.join("\n"));
toast.success("恢复码已复制");
} catch {
toast.error("复制失败,手动选中复制");
toast.error("复制失败,手动选中复制");
}
};
const download = () => {
@@ -65,8 +65,8 @@ function RecoveryCodes({ codes, onDone }: { codes: string[]; onDone: () => void
return (
<div className="grid max-w-md gap-3">
<p className="text-caption">
验证器丢了就用恢复码登录,每个只能用一次。
<span className="text-muted-foreground">它们只显示这一次,存到密码管理器里。</span>
验证器丢了就用恢复码登录,每个只能用一次。
<span className="text-muted-foreground">它们只显示这一次,存到密码管理器里。</span>
</p>
<ol className="grid grid-cols-2 gap-x-6 gap-y-1 rounded-lg bg-muted px-4 py-3 font-mono text-sm select-all">
{codes.map((c) => (
@@ -173,7 +173,7 @@ export function TotpBlock({ disabled }: { disabled: boolean }) {
const grouped = setup.data?.secret.replace(/(.{4})/g, "$1 ").trim();
let body: React.ReactNode;
if (disabled) body = <p className="text-caption text-muted-foreground">当前用 API Key 访问,登录会话才能修改。</p>;
if (disabled) body = <p className="text-caption text-muted-foreground">当前用 API Key 访问,登录会话才能修改。</p>;
else if (mode === "codes") body = <RecoveryCodes codes={codes} onDone={() => reset()} />;
else if (mode === "setup")
body = setup.isPending ? (
@@ -190,9 +190,11 @@ export function TotpBlock({ disabled }: { disabled: boolean }) {
<form onSubmit={enable} noValidate className="grid gap-4 sm:grid-cols-[auto_minmax(0,1fr)] sm:items-start">
<QrCode value={setup.data.otpauthUri} />
<div className="grid max-w-md gap-2">
<p className="text-caption">用验证器(1Password、Google Authenticator 等)扫码,再输入它显示的 6 位验证码。</p>
<p className="text-caption">
用验证器(1Password、Google Authenticator 等)扫码,再输入它显示的 6 位验证码。
</p>
<details className="text-meta text-muted-foreground">
<summary className="cursor-pointer select-none">扫不了码?手动输入密钥</summary>
<summary className="cursor-pointer select-none">扫不了码?手动输入密钥</summary>
<code className="mt-1.5 block rounded-lg bg-muted px-2 py-1.5 font-mono text-sm break-all text-foreground select-all">
{grouped}
</code>
@@ -261,7 +263,7 @@ export function TotpBlock({ disabled }: { disabled: boolean }) {
body = (
<div className="grid justify-items-start gap-3">
<p className={left <= 2 ? "text-caption text-warning" : "text-caption text-muted-foreground"}>
还剩 {left} 个恢复码(共 {RECOVERY_CODE_COUNT} 个)。{left <= 2 ? "快用完了,重新生成一组。" : ""}
还剩 {left} 个恢复码(共 {RECOVERY_CODE_COUNT} 个)。{left <= 2 ? "快用完了,重新生成一组。" : ""}
</p>
<div className="flex flex-wrap gap-2">
<Button size="sm" variant="outline" onClick={() => reset("regenerate")}>
@@ -290,7 +292,7 @@ export function TotpBlock({ disabled }: { disabled: boolean }) {
description={
enabled
? "登录时除了密码还要输入验证器里的 6 位验证码。关闭需要当前密码。"
: "开启后登录还要输入验证器里的 6 位验证码,同时生成 8 个一次性恢复码。"
: "开启后登录还要输入验证器里的 6 位验证码,同时生成 8 个一次性恢复码。"
}
actions={
disabled || status.isPending ? null : (