diff --git a/pages/Jwt/index.tsx b/pages/Jwt/index.tsx
index 929f37a..b79ca9f 100644
--- a/pages/Jwt/index.tsx
+++ b/pages/Jwt/index.tsx
@@ -1,4 +1,4 @@
-import { useCallback, useMemo, useState } from 'react';
+import { useCallback, useEffect, useMemo, useState } from 'react';
import { Key } from 'lucide-react';
import PageHeader from '@/components/PageHeader';
import { parseJwt, stringifyJson } from '@/utils/jwt';
@@ -6,32 +6,36 @@ import CopyButton from '@/components/CopyButton';
import TextInputArea from '@/components/TextInputArea';
import { useLazyTranslation } from '@/utils/useLazyTranslation';
import { useContextMenuData } from '@/utils/useContextMenuData';
+import { cn } from '@/lib/utils';
interface SectionProps {
title: string;
content: unknown;
- color: string;
+ colorClass: string; // 💡 1. 废除硬编码十六进制色值,改用语义化的 Tailwind 类名
+ bgClass: string;
+ borderClass: string;
}
-const Section = ({ title, content, color }: SectionProps) => {
+const Section = ({ title, content, colorClass, bgClass, borderClass }: SectionProps) => {
const { t } = useLazyTranslation('jwt');
return (
-
-
+
-
+ {/* 💡 排版微距精雕:
+ - 彻底移除 border-black/5 这种非暗黑模式友好的硬隔离。
+ - 统一收拢为标准的 bg-muted/40 配合 font-mono text-xs
+ */}
+
{content ? stringifyJson(content) : t('jwt:invalidFormat')}
@@ -39,9 +43,19 @@ const Section = ({ title, content, color }: SectionProps) => {
};
export default function Index() {
- const { t } = useLazyTranslation('jwt');
+ const { t } = useLazyTranslation(['jwt', 'jsonFormat']);
const [jwtInput, setJwtInput] = useState('');
+ // 2. 防抖中转管道:切断高频键盘敲击时的红色语法闪烁
+ const [debouncedInput, setDebouncedInput] = useState('');
+
+ useEffect(() => {
+ const handle = setTimeout(() => {
+ setDebouncedInput(jwtInput);
+ }, 200);
+ return () => clearTimeout(handle);
+ }, [jwtInput]);
+
const handleContextMenuData = useCallback((payload: string) => {
const cleaned = payload.replace(/^Bearer\s*/i, '').trim();
setJwtInput(cleaned);
@@ -49,59 +63,86 @@ export default function Index() {
useContextMenuData({ featureKey: 'jwt', onData: handleContextMenuData });
+ // 3. 贯彻方案 A:衍生变量流。直接消费防抖后的文本
const result = useMemo(() => {
- if (!jwtInput.trim()) {
+ if (!debouncedInput.trim()) {
return null;
}
- return parseJwt(jwtInput);
- }, [jwtInput]);
+ return parseJwt(debouncedInput);
+ }, [debouncedInput]);
return (
-
-
-
} />
+
+
} // 💡 规范锁死 Icon 宽高,抹杀闪烁
+ />
-
- {/* Input Area */}
-
{
- const cleaned = val.replace(/^Bearer\s*/i, '').trim();
- setJwtInput(cleaned);
- }}
- allowCopy={true}
- showClear={true}
- externalError={result?.error}
- />
+
+ {/* 输入终端 */}
+
{
+ const cleaned = val.replace(/^Bearer\s*/i, '').trim();
+ setJwtInput(cleaned);
+ }}
+ allowCopy={true}
+ showClear={true}
+ externalError={result?.error || undefined}
+ onClear={() => setJwtInput('')}
+ />
- {result && !result.error && (
-
-
-
-
-
-
- {t('jwt:signatureTitle')}
-
-
-
-
- {result.signature || t('jwt:noSignature')}
+ {/* 解码看板结果展现 */}
+ {result && !result.error && (
+
+ {/* Header 分区:完美致敬 JWT.io 的鲜艳色彩,同时实现黑夜暗化自适应 */}
+
+
+ {/* Payload 分区 */}
+
+
+ {/* Signature 签名区:完全对齐标准的 shadcn 骨架阶度 */}
+
+
+
+ {t('jwt:signatureTitle')}
+
+
+ {result.signature || t('jwt:noSignature')}
+
- )}
-
+
+ )}
+
+ {/* 当解析错误时的干净中性引导拦截 */}
+ {result?.error && (
+
+
+ {t('jsonFormat:invalidJson')}
+
+
+ )}
);