fix(ui): 修复 text-base 与色板 token base 撞名

色板里定义了颜色 token base, Tailwind 的 text-base 因此生成 color 规则
(文字被涂成 --base 背景色) 而非 16px 字号 —— 标题字号丢失, accent 底按钮
文字与底色同色不可见。全量替换: 字号意图改写 text-[16px] leading-6,
accent 底按钮文字改写 text-white; tailwind.config.ts 注释禁用 text-base。
This commit is contained in:
shy3130
2026-09-25 14:45:58 +08:00
parent 1908173bee
commit e8f7026adb
35 changed files with 65 additions and 63 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ export function EmptyState({ icon: Icon = Construction, title, hint }: Props) {
<div className="h-full grid place-items-center px-8 py-16"> <div className="h-full grid place-items-center px-8 py-16">
<div className="text-center max-w-md"> <div className="text-center max-w-md">
<Icon className="mx-auto h-10 w-10 text-muted" strokeWidth={1.5} /> <Icon className="mx-auto h-10 w-10 text-muted" strokeWidth={1.5} />
<h2 className="mt-4 text-base font-medium text-foreground">{title}</h2> <h2 className="mt-4 text-[16px] leading-6 font-medium text-foreground">{title}</h2>
{hint && <p className="mt-2 text-sm text-secondary leading-relaxed">{hint}</p>} {hint && <p className="mt-2 text-sm text-secondary leading-relaxed">{hint}</p>}
</div> </div>
</div> </div>
@@ -385,7 +385,7 @@ export function ExtDimensionAnalysis({
<div className="px-5 py-4 border-b border-border flex items-center justify-between gap-4"> <div className="px-5 py-4 border-b border-border flex items-center justify-between gap-4">
<div> <div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<h3 className="text-base font-semibold text-foreground">{menu?.template === 'table' || menu?.template === 'ranking' ? '明细列表' : currentGroup?.key ?? `选择${activeKindLabel}`}</h3> <h3 className="text-[16px] leading-6 font-semibold text-foreground">{menu?.template === 'table' || menu?.template === 'ranking' ? '明细列表' : currentGroup?.key ?? `选择${activeKindLabel}`}</h3>
<span className="rounded-full bg-accent/10 px-2 py-0.5 text-[10px] text-accent">{tableRows.length} 条</span> <span className="rounded-full bg-accent/10 px-2 py-0.5 text-[10px] text-accent">{tableRows.length} 条</span>
</div> </div>
<p className="mt-1 text-xs text-muted">列来自菜单 detail_columns:{displayColumns.map(f => f.label || f.field).join(' / ') || '暂无字段'}</p> <p className="mt-1 text-xs text-muted">列来自菜单 detail_columns:{displayColumns.map(f => f.label || f.field).join(' / ') || '暂无字段'}</p>
@@ -98,7 +98,7 @@ export function StockIntradayChart({
<div className="text-xs text-muted">暂无分钟数据</div> <div className="text-xs text-muted">暂无分钟数据</div>
<button <button
onClick={() => setMinuteDismissed(false)} onClick={() => setMinuteDismissed(false)}
className="px-4 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent transition-colors duration-150" className="px-4 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent transition-colors duration-150"
> >
获取分钟K 获取分钟K
</button> </button>
@@ -109,7 +109,7 @@ export function StockIntradayChart({
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<button <button
onClick={() => fetchMinute.mutate()} onClick={() => fetchMinute.mutate()}
className="px-4 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent transition-colors duration-150" className="px-4 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent transition-colors duration-150"
> >
确定 确定
</button> </button>
+1 -1
View File
@@ -479,7 +479,7 @@ export function PresetFetchState({
<div className="h-full grid place-items-center px-8 py-16"> <div className="h-full grid place-items-center px-8 py-16">
<div className="text-center max-w-md"> <div className="text-center max-w-md">
<DownloadCloud className="mx-auto h-10 w-10 text-muted" strokeWidth={1.5} /> <DownloadCloud className="mx-auto h-10 w-10 text-muted" strokeWidth={1.5} />
<h2 className="mt-4 text-base font-medium text-foreground">{title}</h2> <h2 className="mt-4 text-[16px] leading-6 font-medium text-foreground">{title}</h2>
<p className="mt-2 text-sm text-secondary leading-relaxed">{hint}</p> <p className="mt-2 text-sm text-secondary leading-relaxed">{hint}</p>
<button <button
onClick={onFetch} onClick={onFetch}
@@ -86,7 +86,7 @@ export function ActiveJobCard({ job }: { job: PipelineJob }) {
</div> </div>
{!isDone && ( {!isDone && (
<div className="font-mono text-2xl font-bold tracking-tight"> <div className="font-mono text-2xl font-bold tracking-tight">
{job.progress}<span className="text-base text-muted">%</span> {job.progress}<span className="text-[16px] leading-6 text-muted">%</span>
</div> </div>
)} )}
</div> </div>
@@ -126,7 +126,7 @@ export function EnrichedRebuildPanel({
<button <button
onClick={() => rebuild.mutate()} onClick={() => rebuild.mutate()}
disabled={!canRebuild || isRunning || rebuild.isPending} disabled={!canRebuild || isRunning || rebuild.isPending}
className="w-full inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent disabled:opacity-40 disabled:pointer-events-none transition-colors duration-150" className="w-full inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent disabled:opacity-40 disabled:pointer-events-none transition-colors duration-150"
> >
{rebuild.isPending ? ( {rebuild.isPending ? (
<><Loader2 className="h-3 w-3 animate-spin" />计算中…</> <><Loader2 className="h-3 w-3 animate-spin" />计算中…</>
@@ -78,7 +78,7 @@ export function ExtendHistoryPanel({ hasCap, isRunning, earliestDate, onStart }:
<button <button
onClick={() => extend.mutate()} onClick={() => extend.mutate()}
disabled={!hasBatchCap || isRunning || extend.isPending || !earliestDate} disabled={!hasBatchCap || isRunning || extend.isPending || !earliestDate}
className="w-full inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent disabled:opacity-40 disabled:pointer-events-none transition-colors duration-150" className="w-full inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent disabled:opacity-40 disabled:pointer-events-none transition-colors duration-150"
> >
{extend.isPending ? ( {extend.isPending ? (
<> <>
@@ -87,7 +87,7 @@ export function RepairDailyPanel({ hasCap, isRunning, latestDate, onStart }: {
<button <button
onClick={() => repair.mutate()} onClick={() => repair.mutate()}
disabled={!canSubmit} disabled={!canSubmit}
className="w-full inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent disabled:opacity-40 disabled:pointer-events-none transition-colors duration-150" className="w-full inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent disabled:opacity-40 disabled:pointer-events-none transition-colors duration-150"
> >
{repair.isPending ? ( {repair.isPending ? (
<> <>
@@ -324,7 +324,7 @@ export function CreateExtDialog({ onClose }: { onClose: () => void }) {
<div className="px-6 pt-5 pb-4"> <div className="px-6 pt-5 pb-4">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div> <div>
<h3 className="text-base font-semibold text-foreground">新增扩展数据</h3> <h3 className="text-[16px] leading-6 font-semibold text-foreground">新增扩展数据</h3>
<p className="text-[11px] mt-1 inline-flex items-center gap-1 bg-amber-500/10 text-amber-400 px-2 py-0.5 rounded-md font-medium"> <p className="text-[11px] mt-1 inline-flex items-center gap-1 bg-amber-500/10 text-amber-400 px-2 py-0.5 rounded-md font-medium">
接入自有数据,与标的自动关联(第三方接口或 CSV/Excel),支持概念、人气、资金流、舆情、研报评分标签等场景 接入自有数据,与标的自动关联(第三方接口或 CSV/Excel),支持概念、人气、资金流、舆情、研报评分标签等场景
</p> </p>
@@ -452,7 +452,7 @@ export function CreateExtDialog({ onClose }: { onClose: () => void }) {
<button <button
onClick={handleDetectUrl} onClick={handleDetectUrl}
disabled={detecting || !url.trim()} disabled={detecting || !url.trim()}
className="h-8 inline-flex items-center gap-1.5 rounded-lg bg-accent px-3 text-xs font-medium text-base hover:bg-accent/90 disabled:opacity-40 transition-colors" className="h-8 inline-flex items-center gap-1.5 rounded-lg bg-accent px-3 text-xs font-medium text-white hover:bg-accent/90 disabled:opacity-40 transition-colors"
> >
{detecting ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <RefreshCw className="h-3.5 w-3.5" />} {detecting ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <RefreshCw className="h-3.5 w-3.5" />}
测试识别 测试识别
@@ -656,7 +656,7 @@ export function CreateExtDialog({ onClose }: { onClose: () => void }) {
<div className="text-[11px] text-muted">手动添加字段后即可创建空表结构</div> <div className="text-[11px] text-muted">手动添加字段后即可创建空表结构</div>
<button <button
onClick={addField} onClick={addField}
className="inline-flex items-center gap-1 rounded-lg bg-accent px-3 py-1.5 text-xs font-medium text-base hover:bg-accent/90 transition-colors" className="inline-flex items-center gap-1 rounded-lg bg-accent px-3 py-1.5 text-xs font-medium text-white hover:bg-accent/90 transition-colors"
> >
<Plus className="h-3.5 w-3.5" /> <Plus className="h-3.5 w-3.5" />
添加字段 添加字段
@@ -788,7 +788,7 @@ export function CreateExtDialog({ onClose }: { onClose: () => void }) {
<button <button
onClick={() => create.mutate()} onClick={() => create.mutate()}
disabled={!valid || create.isPending} disabled={!valid || create.isPending}
className="px-5 py-2 rounded-lg bg-accent text-base text-xs font-medium hover:bg-accent/90 disabled:opacity-40 transition-colors shadow-sm shadow-accent/20" className="px-5 py-2 rounded-lg bg-accent text-white text-xs font-medium hover:bg-accent/90 disabled:opacity-40 transition-colors shadow-sm shadow-accent/20"
> >
{create.isPending ? '创建中…' : '创建'} {create.isPending ? '创建中…' : '创建'}
</button> </button>
@@ -243,7 +243,7 @@ export function EditExtDialog({ config, onClose }: { config: ExtDataConfig; onCl
<button <button
onClick={() => update.mutate()} onClick={() => update.mutate()}
disabled={!valid || update.isPending} disabled={!valid || update.isPending}
className="px-4 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent disabled:opacity-40 transition-colors" className="px-4 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent disabled:opacity-40 transition-colors"
> >
{update.isPending ? '保存中…' : '保存'} {update.isPending ? '保存中…' : '保存'}
</button> </button>
@@ -475,7 +475,7 @@ export function ExtDataPullPanel({ config, onSaved }: {
<button <button
onClick={handleRun} onClick={handleRun}
disabled={running || !url} disabled={running || !url}
className="inline-flex items-center justify-center gap-1 px-2 py-2 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent disabled:opacity-40 transition-colors" className="inline-flex items-center justify-center gap-1 px-2 py-2 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent disabled:opacity-40 transition-colors"
> >
{running ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Zap className="h-3.5 w-3.5" />} {running ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Zap className="h-3.5 w-3.5" />}
立即执行 立即执行
@@ -484,7 +484,7 @@ export function ExtDataPullPanel({ config, onSaved }: {
<button <button
onClick={() => handleSave(false)} onClick={() => handleSave(false)}
disabled={saving || !url} disabled={saving || !url}
className="w-full inline-flex items-center justify-center gap-1 py-2 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent disabled:opacity-40 transition-colors" className="w-full inline-flex items-center justify-center gap-1 py-2 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent disabled:opacity-40 transition-colors"
> >
{saving ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Check className="h-3.5 w-3.5" />} {saving ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Check className="h-3.5 w-3.5" />}
保存配置 保存配置
@@ -513,7 +513,7 @@ export function ExtDataPullPanel({ config, onSaved }: {
onClick={handleBackfill} onClick={handleBackfill}
disabled={bfRunning || !dateParam.trim() || !bfStart || !bfEnd} disabled={bfRunning || !dateParam.trim() || !bfStart || !bfEnd}
title="按本地交易日逐日拉取写入历史分区; 已有分区自动跳过, 可重复执行" title="按本地交易日逐日拉取写入历史分区; 已有分区自动跳过, 可重复执行"
className="shrink-0 inline-flex items-center gap-1 px-2.5 py-1.5 rounded-btn bg-accent/90 text-base text-[10px] font-medium hover:bg-accent disabled:opacity-40 transition-colors" className="shrink-0 inline-flex items-center gap-1 px-2.5 py-1.5 rounded-btn bg-accent/90 text-white text-[10px] font-medium hover:bg-accent disabled:opacity-40 transition-colors"
> >
{bfRunning ? <Loader2 className="h-3 w-3 animate-spin" /> : <History className="h-3 w-3" />} {bfRunning ? <Loader2 className="h-3 w-3 animate-spin" /> : <History className="h-3 w-3" />}
回补 回补
@@ -301,7 +301,7 @@ export function ExtDataStatCard({ config, onDelete, deleting, onEdit }: {
<button <button
onClick={() => { onDelete(); setShowDelete(false) }} onClick={() => { onDelete(); setShowDelete(false) }}
disabled={deleting} disabled={deleting}
className="px-3 py-1.5 rounded-btn bg-danger/90 text-base text-sm font-medium hover:bg-danger disabled:opacity-50 transition-colors" className="px-3 py-1.5 rounded-btn bg-danger/90 text-white text-sm font-medium hover:bg-danger disabled:opacity-50 transition-colors"
> >
{deleting ? '删除中…' : '确认删除'} {deleting ? '删除中…' : '确认删除'}
</button> </button>
@@ -137,7 +137,7 @@ export function MarkdownRenderer({ content }: { content: string }) {
if (hMatch) { if (hMatch) {
const level = hMatch[1].length const level = hMatch[1].length
const text = hMatch[2] const text = hMatch[2]
const sizeCls = level === 1 ? 'text-base' : level === 2 ? 'text-sm' : 'text-xs' const sizeCls = level === 1 ? 'text-[16px] leading-6' : level === 2 ? 'text-sm' : 'text-xs'
const mtCls = level <= 2 ? 'mt-6' : 'mt-5' const mtCls = level <= 2 ? 'mt-6' : 'mt-5'
blocks.push( blocks.push(
<div key={key++} className={`${sizeCls} ${mtCls} mb-3 font-semibold text-foreground flex items-center gap-1.5`}> <div key={key++} className={`${sizeCls} ${mtCls} mb-3 font-semibold text-foreground flex items-center gap-1.5`}>
@@ -544,7 +544,7 @@ export function RuleEditor({ rule, preset, simple, onClose, onSaved }: Props) {
<div className="flex justify-end gap-2"> <div className="flex justify-end gap-2">
<button onClick={onClose} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs cursor-pointer">取消</button> <button onClick={onClose} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs cursor-pointer">取消</button>
<button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-accent text-base text-xs font-medium disabled:opacity-50 cursor-pointer"> <button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-accent text-white text-xs font-medium disabled:opacity-50 cursor-pointer">
<Save className="h-3.5 w-3.5" />加入监控 <Save className="h-3.5 w-3.5" />加入监控
</button> </button>
</div> </div>
@@ -1615,7 +1615,7 @@ export function RuleEditor({ rule, preset, simple, onClose, onSaved }: Props) {
<div className="flex justify-end gap-2"> <div className="flex justify-end gap-2">
<button onClick={onClose} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs cursor-pointer">取消</button> <button onClick={onClose} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs cursor-pointer">取消</button>
<button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-accent text-base text-xs font-medium disabled:opacity-50 cursor-pointer"> <button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-accent text-white text-xs font-medium disabled:opacity-50 cursor-pointer">
<Save className="h-3.5 w-3.5" />保存 <Save className="h-3.5 w-3.5" />保存
</button> </button>
</div> </div>
@@ -50,7 +50,7 @@ export function StrategyStoreDialog({ open, onClose }: Props) {
</div> </div>
</div> </div>
<h3 className="text-base font-semibold text-foreground mb-1.5"> <h3 className="text-[16px] leading-6 font-semibold text-foreground mb-1.5">
不定时更新更多策略 不定时更新更多策略
</h3> </h3>
<p className="text-sm text-muted leading-relaxed max-w-[380px]"> <p className="text-sm text-muted leading-relaxed max-w-[380px]">
@@ -254,7 +254,7 @@ export function CustomSignalDialog({ open, signal, defaultKind = 'exit', onClose
<button <button
onClick={generateByAI} onClick={generateByAI}
disabled={aiLoading} disabled={aiLoading}
className="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-btn bg-amber-500/90 text-base text-xs font-medium disabled:opacity-50 cursor-pointer" className="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-btn bg-amber-500/90 text-white text-xs font-medium disabled:opacity-50 cursor-pointer"
> >
{aiLoading ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Sparkles className="h-3.5 w-3.5" />} {aiLoading ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Sparkles className="h-3.5 w-3.5" />}
{aiLoading ? '生成中…' : '生成条件'} {aiLoading ? '生成中…' : '生成条件'}
@@ -274,7 +274,7 @@ export function CustomSignalDialog({ open, signal, defaultKind = 'exit', onClose
<div className="flex justify-end gap-2 border-t border-border/50 px-5 py-4"> <div className="flex justify-end gap-2 border-t border-border/50 px-5 py-4">
<button onClick={onClose} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs">取消</button> <button onClick={onClose} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs">取消</button>
<button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-amber-500/90 text-base text-xs font-medium disabled:opacity-50"> <button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-amber-500/90 text-white text-xs font-medium disabled:opacity-50">
<Save className="h-3.5 w-3.5" />保存 <Save className="h-3.5 w-3.5" />保存
</button> </button>
</div> </div>
+2 -2
View File
@@ -189,7 +189,7 @@ function AuctionView({ onOpenStock }: {
</p> </p>
<Link <Link
to="/settings?tab=data-sources" to="/settings?tab=data-sources"
className="mt-5 inline-flex h-9 items-center gap-2 rounded-btn bg-accent px-4 text-xs font-medium text-base transition-colors hover:bg-accent/90" className="mt-5 inline-flex h-9 items-center gap-2 rounded-btn bg-accent px-4 text-xs font-medium text-white transition-colors hover:bg-accent/90"
> >
前往配置数据源 前往配置数据源
<ChevronRight className="h-3.5 w-3.5" /> <ChevronRight className="h-3.5 w-3.5" />
@@ -711,7 +711,7 @@ function DeviationView({ onPreview }: {
<button <button
type="button" type="button"
onClick={() => toggleEnabled(true)} onClick={() => toggleEnabled(true)}
className="mt-5 inline-flex h-9 items-center gap-2 rounded-btn bg-accent px-4 text-xs font-medium text-base" className="mt-5 inline-flex h-9 items-center gap-2 rounded-btn bg-accent px-4 text-xs font-medium text-white"
> >
<Power className="h-4 w-4" /> <Power className="h-4 w-4" />
开启监控 开启监控
+2 -2
View File
@@ -135,7 +135,7 @@ export function Analysis() {
right={ right={
<button <button
onClick={() => { resetForm(); setShowCreate(v => !v) }} onClick={() => { resetForm(); setShowCreate(v => !v) }}
className="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent transition-colors" className="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent transition-colors"
> >
<Plus className="h-3.5 w-3.5" /> <Plus className="h-3.5 w-3.5" />
新建菜单 新建菜单
@@ -230,7 +230,7 @@ export function Analysis() {
<div className="flex justify-end gap-2"> <div className="flex justify-end gap-2">
<button onClick={() => setShowCreate(false)} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs">取消</button> <button onClick={() => setShowCreate(false)} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs">取消</button>
<button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium disabled:opacity-50"> <button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium disabled:opacity-50">
<Save className="h-3.5 w-3.5" />保存 <Save className="h-3.5 w-3.5" />保存
</button> </button>
</div> </div>
+4 -4
View File
@@ -35,7 +35,7 @@ const VARIANTS: Variant[] = [
hint: '脉冲星、雷达波纹 — 青绿强调色,字重黑体,中等字距', hint: '脉冲星、雷达波纹 — 青绿强调色,字重黑体,中等字距',
icon: RadioTower, icon: RadioTower,
iconAccent: 'text-[#3DD68C]', iconAccent: 'text-[#3DD68C]',
nameClass: 'font-sans font-black text-base tracking-[0.10em]', nameClass: 'font-sans font-black text-[16px] leading-6 tracking-[0.10em]',
glow: '#3DD68C', glow: '#3DD68C',
}, },
{ {
@@ -45,7 +45,7 @@ const VARIANTS: Variant[] = [
hint: 'Vantablack — 纯白单色,字重最重,字距最宽,monochrome 高级感', hint: 'Vantablack — 纯白单色,字重最重,字距最宽,monochrome 高级感',
icon: Square, icon: Square,
iconAccent: 'text-[#FAFAFA]', iconAccent: 'text-[#FAFAFA]',
nameClass: 'font-sans font-black text-base tracking-[0.18em]', nameClass: 'font-sans font-black text-[16px] leading-6 tracking-[0.18em]',
glow: '#FAFAFA', glow: '#FAFAFA',
}, },
{ {
@@ -55,7 +55,7 @@ const VARIANTS: Variant[] = [
hint: 'DNA 螺旋 — 紫色强调,等宽字体,赛博朋克经典意象', hint: 'DNA 螺旋 — 紫色强调,等宽字体,赛博朋克经典意象',
icon: GitFork, icon: GitFork,
iconAccent: 'text-[#8B5CF6]', iconAccent: 'text-[#8B5CF6]',
nameClass: 'font-mono font-bold text-base tracking-[0.08em]', nameClass: 'font-mono font-bold text-[16px] leading-6 tracking-[0.08em]',
glow: '#8B5CF6', glow: '#8B5CF6',
}, },
{ {
@@ -65,7 +65,7 @@ const VARIANTS: Variant[] = [
hint: '极光 — 青色强调,细字优雅,适中字距,与涨跌语义色不冲突', hint: '极光 — 青色强调,细字优雅,适中字距,与涨跌语义色不冲突',
icon: Sparkles, icon: Sparkles,
iconAccent: 'text-[#22D3EE]', iconAccent: 'text-[#22D3EE]',
nameClass: 'font-sans font-light text-base tracking-[0.12em]', nameClass: 'font-sans font-light text-[16px] leading-6 tracking-[0.12em]',
glow: '#22D3EE', glow: '#22D3EE',
}, },
] ]
+3 -3
View File
@@ -718,7 +718,7 @@ export function Dashboard() {
<div className="flex h-full items-center justify-center bg-base p-6"> <div className="flex h-full items-center justify-center bg-base p-6">
<div className="rounded-card border border-border bg-surface p-6 text-center"> <div className="rounded-card border border-border bg-surface p-6 text-center">
<div className="text-sm text-danger">看板加载失败</div> <div className="text-sm text-danger">看板加载失败</div>
<button onClick={() => overview.refetch()} className="mt-3 rounded-btn bg-accent px-3 py-1.5 text-xs font-medium text-base">重试</button> <button onClick={() => overview.refetch()} className="mt-3 rounded-btn bg-accent px-3 py-1.5 text-xs font-medium text-white">重试</button>
</div> </div>
</div> </div>
) )
@@ -771,7 +771,7 @@ export function Dashboard() {
<div className="pointer-events-none absolute left-0 top-0 h-full w-1 bg-gradient-to-b from-accent to-accent/20" aria-hidden /> <div className="pointer-events-none absolute left-0 top-0 h-full w-1 bg-gradient-to-b from-accent to-accent/20" aria-hidden />
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Gauge className="h-4 w-4 text-accent" /> <Gauge className="h-4 w-4 text-accent" />
<h1 className="text-base font-semibold text-foreground">市场看板</h1> <h1 className="text-[16px] leading-6 font-semibold text-foreground">市场看板</h1>
<span <span
className="rounded-full border px-2 py-0.5 text-[10px] font-medium" className="rounded-full border px-2 py-0.5 text-[10px] font-medium"
style={{ style={{
@@ -1064,7 +1064,7 @@ function WelcomeFetchModal({
> >
<Sparkles className="h-7 w-7 text-accent" /> <Sparkles className="h-7 w-7 text-accent" />
</motion.div> </motion.div>
<h3 className="mt-4 text-base font-semibold text-foreground">首次使用,需先获取行情数据</h3> <h3 className="mt-4 text-[16px] leading-6 font-semibold text-foreground">首次使用,需先获取行情数据</h3>
<p className="mt-2 text-xs text-secondary leading-relaxed"> <p className="mt-2 text-xs text-secondary leading-relaxed">
{isTickflowProvider {isTickflowProvider
? '可通过 TickFlow 免费服务器拉取近 1 年全 A 股日K' ? '可通过 TickFlow 免费服务器拉取近 1 年全 A 股日K'
+3 -3
View File
@@ -1149,7 +1149,7 @@ export function Data() {
<button <button
onClick={() => syncIndexDaily.mutate()} onClick={() => syncIndexDaily.mutate()}
disabled={!hasDailyBatchCap || !!activeJobId || syncIndexDaily.isPending} disabled={!hasDailyBatchCap || !!activeJobId || syncIndexDaily.isPending}
className="w-full inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium hover:bg-accent disabled:opacity-40 disabled:pointer-events-none transition-colors duration-150" className="w-full inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium hover:bg-accent disabled:opacity-40 disabled:pointer-events-none transition-colors duration-150"
> >
{syncIndexDaily.isPending ? ( {syncIndexDaily.isPending ? (
<> <>
@@ -1225,7 +1225,7 @@ export function Data() {
<button <button
onClick={() => stopSync.mutate()} onClick={() => stopSync.mutate()}
disabled={stopSync.isPending} disabled={stopSync.isPending}
className="px-3 py-1.5 rounded-btn bg-danger/90 text-base text-sm font-medium hover:bg-danger disabled:opacity-50 transition-colors" className="px-3 py-1.5 rounded-btn bg-danger/90 text-white text-sm font-medium hover:bg-danger disabled:opacity-50 transition-colors"
> >
{stopSync.isPending ? '停止中…' : '确认停止'} {stopSync.isPending ? '停止中…' : '确认停止'}
</button> </button>
@@ -1289,7 +1289,7 @@ export function Data() {
<button <button
onClick={() => clearData.mutate()} onClick={() => clearData.mutate()}
disabled={clearData.isPending} disabled={clearData.isPending}
className="px-3 py-1.5 rounded-btn bg-danger/90 text-base text-sm font-medium hover:bg-danger disabled:opacity-50 transition-colors" className="px-3 py-1.5 rounded-btn bg-danger/90 text-white text-sm font-medium hover:bg-danger disabled:opacity-50 transition-colors"
> >
{clearData.isPending ? '清除中…' : '清除数据'} {clearData.isPending ? '清除中…' : '清除数据'}
</button> </button>
+4 -4
View File
@@ -96,7 +96,7 @@ function MinuteProbePanel() {
<button <button
onClick={runProbe} onClick={runProbe}
disabled={loading || !symbol.trim()} disabled={loading || !symbol.trim()}
className="flex items-center gap-1.5 rounded-btn bg-accent px-4 py-1.5 text-sm font-medium text-base hover:bg-accent/90 disabled:opacity-50 cursor-pointer" className="flex items-center gap-1.5 rounded-btn bg-accent px-4 py-1.5 text-sm font-medium text-white hover:bg-accent/90 disabled:opacity-50 cursor-pointer"
> >
{loading ? <Loader2 className="h-4 w-4 animate-spin" /> : <Search className="h-4 w-4" />} {loading ? <Loader2 className="h-4 w-4 animate-spin" /> : <Search className="h-4 w-4" />}
{loading ? '探测中…' : '开始探测'} {loading ? '探测中…' : '开始探测'}
@@ -263,7 +263,7 @@ function SeedPanel() {
<button <button
onClick={() => seedMut.mutate()} onClick={() => seedMut.mutate()}
disabled={seedMut.isPending} disabled={seedMut.isPending}
className="flex items-center gap-1.5 rounded-btn bg-accent px-4 py-1.5 text-sm font-medium text-base hover:bg-accent/90 disabled:opacity-50 cursor-pointer" className="flex items-center gap-1.5 rounded-btn bg-accent px-4 py-1.5 text-sm font-medium text-white hover:bg-accent/90 disabled:opacity-50 cursor-pointer"
> >
{seedMut.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <FlaskConical className="h-4 w-4" />} {seedMut.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <FlaskConical className="h-4 w-4" />}
生成演示数据 生成演示数据
@@ -295,7 +295,7 @@ function SeedPanel() {
<button <button
onClick={() => ruleSeedMut.mutate()} onClick={() => ruleSeedMut.mutate()}
disabled={ruleSeedMut.isPending} disabled={ruleSeedMut.isPending}
className="flex items-center gap-1.5 rounded-btn bg-accent px-4 py-1.5 text-sm font-medium text-base hover:bg-accent/90 disabled:opacity-50 cursor-pointer" className="flex items-center gap-1.5 rounded-btn bg-accent px-4 py-1.5 text-sm font-medium text-white hover:bg-accent/90 disabled:opacity-50 cursor-pointer"
> >
{ruleSeedMut.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <FlaskConical className="h-4 w-4" />} {ruleSeedMut.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <FlaskConical className="h-4 w-4" />}
生成演示规则 生成演示规则
@@ -359,7 +359,7 @@ function LadderTestPanel() {
<button <button
onClick={() => testMut.mutate()} onClick={() => testMut.mutate()}
disabled={testMut.isPending} disabled={testMut.isPending}
className="flex items-center gap-1.5 rounded-btn bg-accent px-4 py-1.5 text-sm font-medium text-base hover:bg-accent/90 disabled:opacity-50 cursor-pointer" className="flex items-center gap-1.5 rounded-btn bg-accent px-4 py-1.5 text-sm font-medium text-white hover:bg-accent/90 disabled:opacity-50 cursor-pointer"
> >
{testMut.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <Bell className="h-4 w-4" />} {testMut.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <Bell className="h-4 w-4" />}
模拟触发 模拟触发
+2 -2
View File
@@ -74,13 +74,13 @@ export function Financials() {
<div className="mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-warning/10"> <div className="mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-warning/10">
<Lock className="h-6 w-6 text-warning" /> <Lock className="h-6 w-6 text-warning" />
</div> </div>
<h3 className="mt-4 text-base font-semibold text-foreground">财务数据不可用</h3> <h3 className="mt-4 text-[16px] leading-6 font-semibold text-foreground">财务数据不可用</h3>
<p className="mt-2 text-xs leading-relaxed text-secondary"> <p className="mt-2 text-xs leading-relaxed text-secondary">
当前数据源未提供财务数据。配置提供财务数据的数据源后,此页自动显示财务数据面板。 当前数据源未提供财务数据。配置提供财务数据的数据源后,此页自动显示财务数据面板。
</p> </p>
<Link <Link
to="/settings?tab=data-sources" to="/settings?tab=data-sources"
className="mt-4 inline-flex items-center gap-1.5 rounded-btn bg-accent/90 px-3.5 py-1.5 text-xs font-medium text-base hover:bg-accent transition-colors" className="mt-4 inline-flex items-center gap-1.5 rounded-btn bg-accent/90 px-3.5 py-1.5 text-xs font-medium text-white hover:bg-accent transition-colors"
> >
前往数据源配置 前往数据源配置
</Link> </Link>
+1 -1
View File
@@ -184,7 +184,7 @@ export function Indices() {
<button <button
onClick={() => syncDaily.mutate()} onClick={() => syncDaily.mutate()}
disabled={syncDaily.isPending} disabled={syncDaily.isPending}
className="inline-flex items-center gap-1.5 rounded-btn bg-accent px-3 py-1.5 text-xs font-medium text-base hover:bg-accent/90 disabled:opacity-50" className="inline-flex items-center gap-1.5 rounded-btn bg-accent px-3 py-1.5 text-xs font-medium text-white hover:bg-accent/90 disabled:opacity-50"
> >
{syncDaily.isPending ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <RefreshCw className="h-3.5 w-3.5" />} {syncDaily.isPending ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <RefreshCw className="h-3.5 w-3.5" />}
同步指数日K 同步指数日K
+2 -2
View File
@@ -1091,7 +1091,7 @@ function ConfirmDialog({ open, title, message, confirmText, danger, pending, onC
disabled={pending} disabled={pending}
className={cn( className={cn(
'px-3 py-1.5 rounded-btn text-xs font-medium disabled:opacity-50 cursor-pointer', 'px-3 py-1.5 rounded-btn text-xs font-medium disabled:opacity-50 cursor-pointer',
danger ? 'bg-danger text-base' : 'bg-accent text-base', danger ? 'bg-danger text-white' : 'bg-accent text-white',
)} )}
> >
{confirmText ?? '确定'} {confirmText ?? '确定'}
@@ -1163,7 +1163,7 @@ function MonitorExtConfigDialog({ open, fields, onClose }: {
</div> </div>
<div className="mt-5 flex justify-end gap-2"> <div className="mt-5 flex justify-end gap-2">
<button onClick={onClose} className="px-3 py-1.5 rounded-btn text-xs text-secondary hover:text-foreground transition-colors cursor-pointer">取消</button> <button onClick={onClose} className="px-3 py-1.5 rounded-btn text-xs text-secondary hover:text-foreground transition-colors cursor-pointer">取消</button>
<button onClick={handleSave} className="px-3 py-1.5 rounded-btn text-xs font-medium bg-accent text-base cursor-pointer">保存</button> <button onClick={handleSave} className="px-3 py-1.5 rounded-btn text-xs font-medium bg-accent text-white cursor-pointer">保存</button>
</div> </div>
</motion.div> </motion.div>
</motion.div> </motion.div>
+1 -1
View File
@@ -661,7 +661,7 @@ export function Regime() {
<div className="absolute left-0 top-0 h-full w-1 bg-gradient-to-b from-accent to-accent/20" /> <div className="absolute left-0 top-0 h-full w-1 bg-gradient-to-b from-accent to-accent/20" />
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<Activity className="h-5 w-5 text-accent" /> <Activity className="h-5 w-5 text-accent" />
<h1 className="text-base font-semibold text-foreground">市场环境</h1> <h1 className="text-[16px] leading-6 font-semibold text-foreground">市场环境</h1>
<span className="text-xs text-muted"> <span className="text-xs text-muted">
{view === 'phase' ? '涨停情绪 · 市场阶段 · 主线脉络' : '每日环境状态 · 赚钱效应 · 趋势分析'} {view === 'phase' ? '涨停情绪 · 市场阶段 · 主线脉络' : '每日环境状态 · 赚钱效应 · 趋势分析'}
</span> </span>
+2 -2
View File
@@ -756,7 +756,7 @@ function ReportPanel({
<Sparkles className="absolute -right-1 -top-1 h-5 w-5 text-accent" /> <Sparkles className="absolute -right-1 -top-1 h-5 w-5 text-accent" />
</div> </div>
<div className="text-center"> <div className="text-center">
<div className="text-base font-semibold text-foreground">AI 大盘复盘</div> <div className="text-[16px] leading-6 font-semibold text-foreground">AI 大盘复盘</div>
<p className="mx-auto mt-2 max-w-sm text-xs leading-relaxed text-secondary"> <p className="mx-auto mt-2 max-w-sm text-xs leading-relaxed text-secondary">
一键生成今日盘后复盘报告 —— 从一句话定调到明日交易计划, 一键生成今日盘后复盘报告 —— 从一句话定调到明日交易计划,
结构化输出可直接指导次日仓位与节奏。 结构化输出可直接指导次日仓位与节奏。
@@ -774,7 +774,7 @@ function ReportPanel({
{ icon: '⚠️', label: '风险提示' }, { icon: '⚠️', label: '风险提示' },
].map((s) => ( ].map((s) => (
<div key={s.label} className="flex flex-col items-center gap-1 rounded-btn bg-elevated/40 px-2 py-2"> <div key={s.label} className="flex flex-col items-center gap-1 rounded-btn bg-elevated/40 px-2 py-2">
<span className="text-base">{s.icon}</span> <span className="text-[16px] leading-6">{s.icon}</span>
<span className="text-[10px] text-secondary">{s.label}</span> <span className="text-[10px] text-secondary">{s.label}</span>
</div> </div>
))} ))}
+1 -1
View File
@@ -990,7 +990,7 @@ export function Screener() {
<Filter className="h-3 w-3" /> <Filter className="h-3 w-3" />
筛选 筛选
{filterActive(filter) && ( {filterActive(filter) && (
<span className="bg-accent text-base rounded-full min-w-4 h-4 px-1 flex items-center justify-center text-[10px] font-bold leading-none"> <span className="bg-accent text-white rounded-full min-w-4 h-4 px-1 flex items-center justify-center text-[10px] font-bold leading-none">
{countActiveFilters(filter)} {countActiveFilters(filter)}
</span> </span>
)} )}
+1 -1
View File
@@ -228,7 +228,7 @@ function StockAnalysisBoard({ symbol }: { symbol: string }) {
<span className="text-[10px] text-muted">{rows.length} 个交易日</span> <span className="text-[10px] text-muted">{rows.length} 个交易日</span>
<span className="text-[10px] text-muted/60">·</span> <span className="text-[10px] text-muted/60">·</span>
<span className="text-[10px] text-muted">当前价</span> <span className="text-[10px] text-muted">当前价</span>
<span className={`text-base font-mono font-bold ${isUp ? 'text-bull' : 'text-bear'}`}> <span className={`text-[16px] leading-6 font-mono font-bold ${isUp ? 'text-bull' : 'text-bear'}`}>
{curClose?.toFixed(2) ?? '—'} {curClose?.toFixed(2) ?? '—'}
</span> </span>
</div> </div>
@@ -185,7 +185,7 @@ export function AddFactorSignalDialog({
type="button" type="button"
onClick={() => save.mutate()} onClick={() => save.mutate()}
disabled={save.isPending || !selected || !thresholdValid || !name.trim()} disabled={save.isPending || !selected || !thresholdValid || !name.trim()}
className="inline-flex items-center gap-1.5 rounded-btn bg-amber-500/90 px-3 py-1.5 text-xs font-medium text-base transition-colors hover:bg-amber-500 disabled:cursor-not-allowed disabled:opacity-50" className="inline-flex items-center gap-1.5 rounded-btn bg-amber-500/90 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-amber-500 disabled:cursor-not-allowed disabled:opacity-50"
> >
<Zap className="h-3.5 w-3.5" /> <Zap className="h-3.5 w-3.5" />
{save.isPending ? '保存中…' : '保存信号'} {save.isPending ? '保存中…' : '保存信号'}
@@ -686,7 +686,7 @@ function Stat({ label, value, color }: { label: ReactNode; value: string; color?
<div className="min-w-0 rounded-btn border border-border/70 bg-elevated/70 px-3 py-2"> <div className="min-w-0 rounded-btn border border-border/70 bg-elevated/70 px-3 py-2">
<div className="text-[11px] text-secondary">{label}</div> <div className="text-[11px] text-secondary">{label}</div>
<div <div
className={`mt-1 break-words font-mono font-semibold leading-tight tracking-tight num ${compact ? 'text-xs xl:text-sm' : 'text-sm xl:text-base'}`} className={`mt-1 break-words font-mono font-semibold leading-tight tracking-tight num ${compact ? 'text-xs xl:text-sm' : 'text-sm xl:text-[16px] xl:leading-6'}`}
style={{ color: color ?? 'inherit' }} style={{ color: color ?? 'inherit' }}
title={value} title={value}
> >
+2 -2
View File
@@ -1015,7 +1015,7 @@ function PluginDetail({ plugin, isActive, matrixCaps, servingSet }: {
</div> </div>
<div className="flex-1 min-w-0"> <div className="flex-1 min-w-0">
<div className="flex items-center gap-2 mb-1 flex-wrap"> <div className="flex items-center gap-2 mb-1 flex-wrap">
<h3 className="text-base font-semibold text-foreground">{plugin.display_name}</h3> <h3 className="text-[16px] leading-6 font-semibold text-foreground">{plugin.display_name}</h3>
<span className="text-[10px] text-muted/50 uppercase tracking-wider">插件 · {plugin.runtime}</span> <span className="text-[10px] text-muted/50 uppercase tracking-wider">插件 · {plugin.runtime}</span>
<span className="rounded bg-warning/15 px-1 py-0.5 text-[9px] font-medium leading-none text-warning">第三方</span> <span className="rounded bg-warning/15 px-1 py-0.5 text-[9px] font-medium leading-none text-warning">第三方</span>
{isActive && ( {isActive && (
@@ -1164,7 +1164,7 @@ function TickFlowDetail({ active, matrix }: { active: boolean; matrix?: Capabili
</div> </div>
<div className="flex-1 min-w-0"> <div className="flex-1 min-w-0">
<div className="flex items-center gap-2 flex-wrap"> <div className="flex items-center gap-2 flex-wrap">
<h2 className="text-base font-semibold text-foreground">TickFlow</h2> <h2 className="text-[16px] leading-6 font-semibold text-foreground">TickFlow</h2>
<span className="rounded bg-warning/15 px-1.5 py-0.5 text-[10px] font-medium text-warning">第三方</span> <span className="rounded bg-warning/15 px-1.5 py-0.5 text-[10px] font-medium text-warning">第三方</span>
<AllTiersBadge /> <AllTiersBadge />
{active && ( {active && (
+2 -2
View File
@@ -141,7 +141,7 @@ export function SettingsExtPagesPanel() {
</div> </div>
<button <button
onClick={() => { resetForm(); setShowForm(true) }} onClick={() => { resetForm(); setShowForm(true) }}
className="inline-flex items-center justify-center gap-1.5 rounded-btn bg-accent/90 px-3 py-1.5 text-xs font-medium text-base hover:bg-accent transition-colors" className="inline-flex items-center justify-center gap-1.5 rounded-btn bg-accent/90 px-3 py-1.5 text-xs font-medium text-white hover:bg-accent transition-colors"
> >
<Plus className="h-3.5 w-3.5" /> <Plus className="h-3.5 w-3.5" />
新建页面 新建页面
@@ -241,7 +241,7 @@ export function SettingsExtPagesPanel() {
<div className="flex justify-end gap-2"> <div className="flex justify-end gap-2">
<button onClick={() => { setShowForm(false); setError('') }} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs">取消</button> <button onClick={() => { setShowForm(false); setError('') }} className="px-4 py-1.5 rounded-btn bg-elevated text-secondary text-xs">取消</button>
<button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-accent/90 text-base text-xs font-medium disabled:opacity-50"> <button onClick={() => save.mutate()} disabled={save.isPending} className="inline-flex items-center gap-1.5 px-4 py-1.5 rounded-btn bg-accent/90 text-white text-xs font-medium disabled:opacity-50">
<Save className="h-3.5 w-3.5" />保存 <Save className="h-3.5 w-3.5" />保存
</button> </button>
</div> </div>
+5 -5
View File
@@ -625,7 +625,7 @@ export function SettingsMonitoringPanel({ highlight }: { highlight?: string } =
<button <button
onClick={submitFeishu} onClick={submitFeishu}
disabled={saveFeishuWebhook.isPending || (feishuDraft.trim() === feishuWebhookUrl && feishuSecretDraft.trim() === feishuWebhookSecret)} disabled={saveFeishuWebhook.isPending || (feishuDraft.trim() === feishuWebhookUrl && feishuSecretDraft.trim() === feishuWebhookSecret)}
className="px-3 py-1.5 rounded-btn bg-accent text-base text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors" className="px-3 py-1.5 rounded-btn bg-accent text-white text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors"
> >
{saveFeishuWebhook.isPending ? '保存中…' : '保存'} {saveFeishuWebhook.isPending ? '保存中…' : '保存'}
</button> </button>
@@ -701,7 +701,7 @@ export function SettingsMonitoringPanel({ highlight }: { highlight?: string } =
<button <button
onClick={submitWecom} onClick={submitWecom}
disabled={saveWecomWebhook.isPending || wecomDraft.trim() === wecomWebhookUrl} disabled={saveWecomWebhook.isPending || wecomDraft.trim() === wecomWebhookUrl}
className="px-3 py-1.5 rounded-btn bg-accent text-base text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors" className="px-3 py-1.5 rounded-btn bg-accent text-white text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors"
> >
{saveWecomWebhook.isPending ? '保存中…' : '保存'} {saveWecomWebhook.isPending ? '保存中…' : '保存'}
</button> </button>
@@ -783,7 +783,7 @@ export function SettingsMonitoringPanel({ highlight }: { highlight?: string } =
<button <button
onClick={submitCustom} onClick={submitCustom}
disabled={saveCustomWebhook.isPending || (customDraft.trim() === customWebhookUrl && !customSecretDraft)} disabled={saveCustomWebhook.isPending || (customDraft.trim() === customWebhookUrl && !customSecretDraft)}
className="px-3 py-1.5 rounded-btn bg-accent text-base text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors" className="px-3 py-1.5 rounded-btn bg-accent text-white text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors"
> >
{saveCustomWebhook.isPending ? '保存中…' : '保存'} {saveCustomWebhook.isPending ? '保存中…' : '保存'}
</button> </button>
@@ -866,7 +866,7 @@ export function SettingsMonitoringPanel({ highlight }: { highlight?: string } =
</div> </div>
{emailError && <div className="mt-2 text-[11px] text-danger">{emailError}</div>} {emailError && <div className="mt-2 text-[11px] text-danger">{emailError}</div>}
<div className="mt-2 flex items-center gap-2"> <div className="mt-2 flex items-center gap-2">
<button onClick={submitEmail} disabled={saveEmailSmtp.isPending} className="px-3 py-1.5 rounded-btn bg-accent text-base text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors"> <button onClick={submitEmail} disabled={saveEmailSmtp.isPending} className="px-3 py-1.5 rounded-btn bg-accent text-white text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors">
{saveEmailSmtp.isPending ? '保存中…' : '保存'} {saveEmailSmtp.isPending ? '保存中…' : '保存'}
</button> </button>
<TestSendButton test={testEmail} configured={emailConfigured} /> <TestSendButton test={testEmail} configured={emailConfigured} />
@@ -938,7 +938,7 @@ export function SettingsMonitoringPanel({ highlight }: { highlight?: string } =
<button <button
onClick={submitBot} onClick={submitBot}
disabled={saveWecomBot.isPending || (botIdDraft.trim() === wecomBotId && botSecretDraft.trim() === wecomBotSecret)} disabled={saveWecomBot.isPending || (botIdDraft.trim() === wecomBotId && botSecretDraft.trim() === wecomBotSecret)}
className="px-3 py-1.5 rounded-btn bg-accent text-base text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors" className="px-3 py-1.5 rounded-btn bg-accent text-white text-xs font-medium disabled:opacity-50 cursor-pointer hover:bg-accent/90 transition-colors"
> >
{saveWecomBot.isPending ? '保存中…' : '保存并连接'} {saveWecomBot.isPending ? '保存中…' : '保存并连接'}
</button> </button>
+2
View File
@@ -10,6 +10,8 @@ export default {
extend: { extend: {
colors: { colors: {
// §6.0.1 色板 — CSS variables 见 src/index.css // §6.0.1 色板 — CSS variables 见 src/index.css
// 注意: base 与字号 token 撞名, text-base 会生成 color 规则 (文字变背景色)。
// 字号 16px 一律写 text-[16px] leading-6, 禁用 text-base。
base: 'hsl(var(--base) / <alpha-value>)', base: 'hsl(var(--base) / <alpha-value>)',
surface: 'hsl(var(--surface) / <alpha-value>)', surface: 'hsl(var(--surface) / <alpha-value>)',
elevated: 'hsl(var(--elevated) / <alpha-value>)', elevated: 'hsl(var(--elevated) / <alpha-value>)',