mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-08-04 19:45:34 +08:00
fix(ui): improve dark mode text contrast for form labels
Replace hardcoded Tailwind color classes with design system CSS variables to improve text visibility in dark mode: - text-gray-900 dark:text-gray-100 → text-foreground - text-gray-500/600 dark:text-gray-400 → text-muted-foreground - bg-white dark:bg-gray-800 → bg-background
This commit is contained in:
+2
-2
@@ -191,11 +191,11 @@ export function EnvWarningBanner({
|
|||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
<label
|
<label
|
||||||
htmlFor={key}
|
htmlFor={key}
|
||||||
className="block text-sm font-medium text-gray-900 dark:text-gray-100 cursor-pointer"
|
className="block text-sm font-medium text-foreground cursor-pointer"
|
||||||
>
|
>
|
||||||
{conflict.varName}
|
{conflict.varName}
|
||||||
</label>
|
</label>
|
||||||
<p className="text-xs text-gray-600 dark:text-gray-400 mt-1 break-all">
|
<p className="text-xs text-muted-foreground mt-1 break-all">
|
||||||
{t("env.field.value")}: {conflict.varValue}
|
{t("env.field.value")}: {conflict.varValue}
|
||||||
</p>
|
</p>
|
||||||
<p className="text-xs text-muted-foreground mt-1">
|
<p className="text-xs text-muted-foreground mt-1">
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
<div className="flex-1 overflow-y-auto px-6 py-4 space-y-4">
|
<div className="flex-1 overflow-y-auto px-6 py-4 space-y-4">
|
||||||
{/* Hint */}
|
{/* Hint */}
|
||||||
<div className="rounded-lg border border-border-default bg-gray-100/50 dark:bg-gray-800/50 p-3">
|
<div className="rounded-lg border border-border-default bg-gray-100/50 dark:bg-gray-800/50 p-3">
|
||||||
<p className="text-sm text-gray-500 dark:text-gray-400">
|
<p className="text-sm text-muted-foreground">
|
||||||
{t("mcp.wizard.hint")}
|
{t("mcp.wizard.hint")}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -248,7 +248,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
<div className="space-y-4 min-h-[400px]">
|
<div className="space-y-4 min-h-[400px]">
|
||||||
{/* Type */}
|
{/* Type */}
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-2 block text-sm font-medium text-gray-900 dark:text-gray-100">
|
<label className="mb-2 block text-sm font-medium text-foreground">
|
||||||
{t("mcp.wizard.type")} <span className="text-red-500">*</span>
|
{t("mcp.wizard.type")} <span className="text-red-500">*</span>
|
||||||
</label>
|
</label>
|
||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
@@ -262,7 +262,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
}
|
}
|
||||||
className="w-4 h-4 accent-blue-500"
|
className="w-4 h-4 accent-blue-500"
|
||||||
/>
|
/>
|
||||||
<span className="text-sm text-gray-900 dark:text-gray-100">
|
<span className="text-sm text-foreground">
|
||||||
{t("mcp.wizard.typeStdio")}
|
{t("mcp.wizard.typeStdio")}
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
@@ -276,7 +276,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
}
|
}
|
||||||
className="w-4 h-4 accent-blue-500"
|
className="w-4 h-4 accent-blue-500"
|
||||||
/>
|
/>
|
||||||
<span className="text-sm text-gray-900 dark:text-gray-100">
|
<span className="text-sm text-foreground">
|
||||||
{t("mcp.wizard.typeHttp")}
|
{t("mcp.wizard.typeHttp")}
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
@@ -290,7 +290,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
}
|
}
|
||||||
className="w-4 h-4 accent-blue-500"
|
className="w-4 h-4 accent-blue-500"
|
||||||
/>
|
/>
|
||||||
<span className="text-sm text-gray-900 dark:text-gray-100">
|
<span className="text-sm text-foreground">
|
||||||
{t("mcp.wizard.typeSse")}
|
{t("mcp.wizard.typeSse")}
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
@@ -299,7 +299,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
|
|
||||||
{/* Title */}
|
{/* Title */}
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1 block text-sm font-medium text-gray-900 dark:text-gray-100">
|
<label className="mb-1 block text-sm font-medium text-foreground">
|
||||||
{t("mcp.form.title")} <span className="text-red-500">*</span>
|
{t("mcp.form.title")} <span className="text-red-500">*</span>
|
||||||
</label>
|
</label>
|
||||||
<Input
|
<Input
|
||||||
@@ -317,7 +317,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
<>
|
<>
|
||||||
{/* Command */}
|
{/* Command */}
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1 block text-sm font-medium text-gray-900 dark:text-gray-100">
|
<label className="mb-1 block text-sm font-medium text-foreground">
|
||||||
{t("mcp.wizard.command")}{" "}
|
{t("mcp.wizard.command")}{" "}
|
||||||
<span className="text-red-500">*</span>
|
<span className="text-red-500">*</span>
|
||||||
</label>
|
</label>
|
||||||
@@ -333,7 +333,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
|
|
||||||
{/* Args */}
|
{/* Args */}
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1 block text-sm font-medium text-gray-900 dark:text-gray-100">
|
<label className="mb-1 block text-sm font-medium text-foreground">
|
||||||
{t("mcp.wizard.args")}
|
{t("mcp.wizard.args")}
|
||||||
</label>
|
</label>
|
||||||
<textarea
|
<textarea
|
||||||
@@ -341,13 +341,13 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
onChange={(e) => setWizardArgs(e.target.value)}
|
onChange={(e) => setWizardArgs(e.target.value)}
|
||||||
placeholder={t("mcp.wizard.argsPlaceholder")}
|
placeholder={t("mcp.wizard.argsPlaceholder")}
|
||||||
rows={3}
|
rows={3}
|
||||||
className="w-full rounded-md border border-border-default bg-white dark:bg-gray-800 px-3 py-2 text-sm font-mono text-gray-900 dark:text-gray-100 placeholder:text-gray-400 dark:placeholder:text-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 resize-y"
|
className="w-full rounded-md border border-border-default bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-blue-500/20 resize-y"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Env */}
|
{/* Env */}
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1 block text-sm font-medium text-gray-900 dark:text-gray-100">
|
<label className="mb-1 block text-sm font-medium text-foreground">
|
||||||
{t("mcp.wizard.env")}
|
{t("mcp.wizard.env")}
|
||||||
</label>
|
</label>
|
||||||
<textarea
|
<textarea
|
||||||
@@ -355,7 +355,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
onChange={(e) => setWizardEnv(e.target.value)}
|
onChange={(e) => setWizardEnv(e.target.value)}
|
||||||
placeholder={t("mcp.wizard.envPlaceholder")}
|
placeholder={t("mcp.wizard.envPlaceholder")}
|
||||||
rows={3}
|
rows={3}
|
||||||
className="w-full rounded-md border border-border-default bg-white dark:bg-gray-800 px-3 py-2 text-sm font-mono text-gray-900 dark:text-gray-100 placeholder:text-gray-400 dark:placeholder:text-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 resize-y"
|
className="w-full rounded-md border border-border-default bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-blue-500/20 resize-y"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
@@ -366,7 +366,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
<>
|
<>
|
||||||
{/* URL */}
|
{/* URL */}
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1 block text-sm font-medium text-gray-900 dark:text-gray-100">
|
<label className="mb-1 block text-sm font-medium text-foreground">
|
||||||
{t("mcp.wizard.url")}{" "}
|
{t("mcp.wizard.url")}{" "}
|
||||||
<span className="text-red-500">*</span>
|
<span className="text-red-500">*</span>
|
||||||
</label>
|
</label>
|
||||||
@@ -382,7 +382,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
|
|
||||||
{/* Headers */}
|
{/* Headers */}
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1 block text-sm font-medium text-gray-900 dark:text-gray-100">
|
<label className="mb-1 block text-sm font-medium text-foreground">
|
||||||
{t("mcp.wizard.headers")}
|
{t("mcp.wizard.headers")}
|
||||||
</label>
|
</label>
|
||||||
<textarea
|
<textarea
|
||||||
@@ -390,7 +390,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
onChange={(e) => setWizardHeaders(e.target.value)}
|
onChange={(e) => setWizardHeaders(e.target.value)}
|
||||||
placeholder={t("mcp.wizard.headersPlaceholder")}
|
placeholder={t("mcp.wizard.headersPlaceholder")}
|
||||||
rows={3}
|
rows={3}
|
||||||
className="w-full rounded-md border border-border-default bg-white dark:bg-gray-800 px-3 py-2 text-sm font-mono text-gray-900 dark:text-gray-100 placeholder:text-gray-400 dark:placeholder:text-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 resize-y"
|
className="w-full rounded-md border border-border-default bg-background px-3 py-2 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-blue-500/20 resize-y"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
@@ -404,7 +404,7 @@ const McpWizardModal: React.FC<McpWizardModalProps> = ({
|
|||||||
wizardUrl ||
|
wizardUrl ||
|
||||||
wizardHeaders) && (
|
wizardHeaders) && (
|
||||||
<div className="space-y-2 border-t border-border-default pt-4">
|
<div className="space-y-2 border-t border-border-default pt-4">
|
||||||
<h3 className="text-sm font-medium text-gray-900 dark:text-gray-100">
|
<h3 className="text-sm font-medium text-foreground">
|
||||||
{t("mcp.wizard.preview")}
|
{t("mcp.wizard.preview")}
|
||||||
</h3>
|
</h3>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-gray-100 dark:bg-gray-800 p-3 text-xs font-mono text-gray-700 dark:text-gray-300">
|
<pre className="overflow-x-auto rounded-lg bg-gray-100 dark:bg-gray-800 p-3 text-xs font-mono text-gray-700 dark:text-gray-300">
|
||||||
|
|||||||
@@ -31,14 +31,14 @@ const ApiKeyInput: React.FC<ApiKeyInputProps> = ({
|
|||||||
const inputClass = `w-full px-3 py-2 pr-10 border rounded-lg text-sm transition-colors ${
|
const inputClass = `w-full px-3 py-2 pr-10 border rounded-lg text-sm transition-colors ${
|
||||||
disabled
|
disabled
|
||||||
? "bg-muted border-border-default text-muted-foreground cursor-not-allowed"
|
? "bg-muted border-border-default text-muted-foreground cursor-not-allowed"
|
||||||
: "border-border-default dark:bg-gray-800 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:focus:ring-blue-400/20"
|
: "border-border-default bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:focus:ring-blue-400/20"
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<label
|
<label
|
||||||
htmlFor={id}
|
htmlFor={id}
|
||||||
className="block text-sm font-medium text-gray-900 dark:text-gray-100"
|
className="block text-sm font-medium text-foreground"
|
||||||
>
|
>
|
||||||
{label} {required && "*"}
|
{label} {required && "*"}
|
||||||
</label>
|
</label>
|
||||||
@@ -58,7 +58,7 @@ const ApiKeyInput: React.FC<ApiKeyInputProps> = ({
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={toggleShowKey}
|
onClick={toggleShowKey}
|
||||||
className="absolute inset-y-0 right-0 flex items-center pr-3 text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"
|
className="absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors"
|
||||||
aria-label={showKey ? t("apiKeyInput.hide") : t("apiKeyInput.show")}
|
aria-label={showKey ? t("apiKeyInput.hide") : t("apiKeyInput.show")}
|
||||||
>
|
>
|
||||||
{showKey ? <EyeOff size={16} /> : <Eye size={16} />}
|
{showKey ? <EyeOff size={16} /> : <Eye size={16} />}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export const CodexAuthSection: React.FC<CodexAuthSectionProps> = ({
|
|||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<label
|
<label
|
||||||
htmlFor="codexAuth"
|
htmlFor="codexAuth"
|
||||||
className="block text-sm font-medium text-gray-900 dark:text-gray-100"
|
className="block text-sm font-medium text-foreground"
|
||||||
>
|
>
|
||||||
{t("codexConfig.authJson")}
|
{t("codexConfig.authJson")}
|
||||||
</label>
|
</label>
|
||||||
@@ -67,7 +67,7 @@ export const CodexAuthSection: React.FC<CodexAuthSectionProps> = ({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{!error && (
|
{!error && (
|
||||||
<p className="text-xs text-gray-500 dark:text-gray-400">
|
<p className="text-xs text-muted-foreground">
|
||||||
{t("codexConfig.authJsonHint")}
|
{t("codexConfig.authJsonHint")}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
@@ -120,12 +120,12 @@ export const CodexConfigSection: React.FC<CodexConfigSectionProps> = ({
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<label
|
<label
|
||||||
htmlFor="codexConfig"
|
htmlFor="codexConfig"
|
||||||
className="block text-sm font-medium text-gray-900 dark:text-gray-100"
|
className="block text-sm font-medium text-foreground"
|
||||||
>
|
>
|
||||||
{t("codexConfig.configToml")}
|
{t("codexConfig.configToml")}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label className="inline-flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 cursor-pointer">
|
<label className="inline-flex items-center gap-2 text-sm text-muted-foreground cursor-pointer">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={useCommonConfig}
|
checked={useCommonConfig}
|
||||||
@@ -167,7 +167,7 @@ export const CodexConfigSection: React.FC<CodexConfigSectionProps> = ({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{!configError && (
|
{!configError && (
|
||||||
<p className="text-xs text-gray-500 dark:text-gray-400">
|
<p className="text-xs text-muted-foreground">
|
||||||
{t("codexConfig.configTomlHint")}
|
{t("codexConfig.configTomlHint")}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ export function CodexFormFields({
|
|||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<label
|
<label
|
||||||
htmlFor="codexModelName"
|
htmlFor="codexModelName"
|
||||||
className="block text-sm font-medium text-gray-900 dark:text-gray-100"
|
className="block text-sm font-medium text-foreground"
|
||||||
>
|
>
|
||||||
{t("codexConfig.modelName", { defaultValue: "模型名称" })}
|
{t("codexConfig.modelName", { defaultValue: "模型名称" })}
|
||||||
</label>
|
</label>
|
||||||
@@ -110,9 +110,9 @@ export function CodexFormFields({
|
|||||||
placeholder={t("codexConfig.modelNamePlaceholder", {
|
placeholder={t("codexConfig.modelNamePlaceholder", {
|
||||||
defaultValue: "例如: gpt-5-codex",
|
defaultValue: "例如: gpt-5-codex",
|
||||||
})}
|
})}
|
||||||
className="w-full px-3 py-2 border border-border-default dark:bg-gray-800 dark:text-gray-100 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:focus:ring-blue-400/20 transition-colors"
|
className="w-full px-3 py-2 border border-border-default bg-background text-foreground rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:focus:ring-blue-400/20 transition-colors"
|
||||||
/>
|
/>
|
||||||
<p className="text-xs text-gray-500 dark:text-gray-400">
|
<p className="text-xs text-muted-foreground">
|
||||||
{t("codexConfig.modelNameHint", {
|
{t("codexConfig.modelNameHint", {
|
||||||
defaultValue: "指定使用的模型,将自动更新到 config.toml 中",
|
defaultValue: "指定使用的模型,将自动更新到 config.toml 中",
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export const GeminiEnvSection: React.FC<GeminiEnvSectionProps> = ({
|
|||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<label
|
<label
|
||||||
htmlFor="geminiEnv"
|
htmlFor="geminiEnv"
|
||||||
className="block text-sm font-medium text-gray-900 dark:text-gray-100"
|
className="block text-sm font-medium text-foreground"
|
||||||
>
|
>
|
||||||
{t("geminiConfig.envFile", { defaultValue: "环境变量 (.env)" })}
|
{t("geminiConfig.envFile", { defaultValue: "环境变量 (.env)" })}
|
||||||
</label>
|
</label>
|
||||||
@@ -69,7 +69,7 @@ GEMINI_MODEL=gemini-3-pro-preview`}
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{!error && (
|
{!error && (
|
||||||
<p className="text-xs text-gray-500 dark:text-gray-400">
|
<p className="text-xs text-muted-foreground">
|
||||||
{t("geminiConfig.envFileHint", {
|
{t("geminiConfig.envFileHint", {
|
||||||
defaultValue: "使用 .env 格式配置 Gemini 环境变量",
|
defaultValue: "使用 .env 格式配置 Gemini 环境变量",
|
||||||
})}
|
})}
|
||||||
@@ -124,14 +124,14 @@ export const GeminiConfigSection: React.FC<GeminiConfigSectionProps> = ({
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<label
|
<label
|
||||||
htmlFor="geminiConfig"
|
htmlFor="geminiConfig"
|
||||||
className="block text-sm font-medium text-gray-900 dark:text-gray-100"
|
className="block text-sm font-medium text-foreground"
|
||||||
>
|
>
|
||||||
{t("geminiConfig.configJson", {
|
{t("geminiConfig.configJson", {
|
||||||
defaultValue: "配置文件 (config.json)",
|
defaultValue: "配置文件 (config.json)",
|
||||||
})}
|
})}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label className="inline-flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 cursor-pointer">
|
<label className="inline-flex items-center gap-2 text-sm text-muted-foreground cursor-pointer">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={useCommonConfig}
|
checked={useCommonConfig}
|
||||||
@@ -180,7 +180,7 @@ export const GeminiConfigSection: React.FC<GeminiConfigSectionProps> = ({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{!configError && (
|
{!configError && (
|
||||||
<p className="text-xs text-gray-500 dark:text-gray-400">
|
<p className="text-xs text-muted-foreground">
|
||||||
{t("geminiConfig.configJsonHint", {
|
{t("geminiConfig.configJsonHint", {
|
||||||
defaultValue: "使用 JSON 格式配置 Gemini 扩展参数(可选)",
|
defaultValue: "使用 JSON 格式配置 Gemini 扩展参数(可选)",
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export function EndpointField({
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={onManageClick}
|
onClick={onManageClick}
|
||||||
className="flex items-center gap-1 text-xs text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"
|
className="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors"
|
||||||
>
|
>
|
||||||
<Zap className="h-3.5 w-3.5" />
|
<Zap className="h-3.5 w-3.5" />
|
||||||
{manageButtonLabel || defaultManageLabel}
|
{manageButtonLabel || defaultManageLabel}
|
||||||
|
|||||||
@@ -231,10 +231,10 @@ export const SkillsPage = forwardRef<SkillsPageHandle, SkillsPageProps>(
|
|||||||
</div>
|
</div>
|
||||||
) : skills.length === 0 ? (
|
) : skills.length === 0 ? (
|
||||||
<div className="flex flex-col items-center justify-center h-64 text-center">
|
<div className="flex flex-col items-center justify-center h-64 text-center">
|
||||||
<p className="text-lg font-medium text-gray-900 dark:text-gray-100">
|
<p className="text-lg font-medium text-foreground">
|
||||||
{t("skills.empty")}
|
{t("skills.empty")}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-2 text-sm text-gray-500 dark:text-gray-400">
|
<p className="mt-2 text-sm text-muted-foreground">
|
||||||
{t("skills.emptyDescription")}
|
{t("skills.emptyDescription")}
|
||||||
</p>
|
</p>
|
||||||
<Button
|
<Button
|
||||||
@@ -306,10 +306,10 @@ export const SkillsPage = forwardRef<SkillsPageHandle, SkillsPageProps>(
|
|||||||
{/* 技能列表或无结果提示 */}
|
{/* 技能列表或无结果提示 */}
|
||||||
{filteredSkills.length === 0 ? (
|
{filteredSkills.length === 0 ? (
|
||||||
<div className="flex flex-col items-center justify-center h-48 text-center">
|
<div className="flex flex-col items-center justify-center h-48 text-center">
|
||||||
<p className="text-lg font-medium text-gray-900 dark:text-gray-100">
|
<p className="text-lg font-medium text-foreground">
|
||||||
{t("skills.noResults")}
|
{t("skills.noResults")}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-2 text-sm text-gray-500 dark:text-gray-400">
|
<p className="mt-2 text-sm text-muted-foreground">
|
||||||
{t("skills.emptyDescription")}
|
{t("skills.emptyDescription")}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user