fix: further increase font sizes, icons, buttons, and spacing
This commit is contained in:
@@ -26,32 +26,32 @@ export default function FilterCard({ filter, liked, onLike, onDownload }: Filter
|
|||||||
|
|
||||||
{/* 预览占位 */}
|
{/* 预览占位 */}
|
||||||
<div className="h-20 bg-[#222] flex items-center justify-center border-b border-[#333]">
|
<div className="h-20 bg-[#222] flex items-center justify-center border-b border-[#333]">
|
||||||
<span className="material-symbols-outlined text-[20px] text-[#444]">image</span>
|
<span className="material-symbols-outlined text-[34px] text-[#444]">image</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 信息 */}
|
{/* 信息 */}
|
||||||
<div className="p-2 space-y-1">
|
<div className="p-2 space-y-1">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<h3 className="text-[12px] font-semibold tracking-[0.1em] uppercase text-[#e0e0e0] truncate">
|
<h3 className="text-[15px] font-semibold tracking-[0.1em] uppercase text-[#e0e0e0] truncate">
|
||||||
{filter.title}
|
{filter.title}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-[12px] font-mono text-[#555] truncate">{filter.author}</p>
|
<p className="text-[15px] font-mono text-[#555] truncate">{filter.author}</p>
|
||||||
|
|
||||||
<div className="flex items-center justify-between pt-1 border-t border-[#333]">
|
<div className="flex items-center justify-between pt-1 border-t border-[#333]">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<button
|
<button
|
||||||
onClick={() => onLike(filter.id)}
|
onClick={() => onLike(filter.id)}
|
||||||
className={`text-[12px] font-mono transition-colors duration-75
|
className={`text-[15px] font-mono transition-colors duration-75
|
||||||
${liked ? 'text-[#ff4500]' : 'text-[#555] hover:text-[#888]'}`}
|
${liked ? 'text-[#ff4500]' : 'text-[#555] hover:text-[#888]'}`}
|
||||||
>
|
>
|
||||||
♥ {filter.likes + (liked ? 1 : 0)}
|
♥ {filter.likes + (liked ? 1 : 0)}
|
||||||
</button>
|
</button>
|
||||||
<span className="text-[12px] font-mono text-[#555]">↓ {filter.downloads}</span>
|
<span className="text-[15px] font-mono text-[#555]">↓ {filter.downloads}</span>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={() => onDownload(filter.id)}
|
onClick={() => onDownload(filter.id)}
|
||||||
className="text-[12px] font-semibold tracking-[0.1em] uppercase text-[#888] border border-[#333] px-1.5 py-0.5
|
className="text-[15px] font-semibold tracking-[0.1em] uppercase text-[#888] border border-[#333] px-1.5 py-0.5
|
||||||
hover:border-[#ff4500] hover:text-[#ff4500] transition-colors duration-75"
|
hover:border-[#ff4500] hover:text-[#ff4500] transition-colors duration-75"
|
||||||
>
|
>
|
||||||
获取
|
获取
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ function SliderControl({ label, value, min, max, step, unit, onChange }: {
|
|||||||
}) {
|
}) {
|
||||||
const pct = ((value - min) / (max - min)) * 100;
|
const pct = ((value - min) / (max - min)) * 100;
|
||||||
return (
|
return (
|
||||||
<div className="flex items-center gap-2 py-1.5 border-b border-[#333] last:border-b-0">
|
<div className="flex items-center gap-2 py-2 border-b border-[#333] last:border-b-0">
|
||||||
<span className="text-[12px] font-mono text-[#555] w-16 shrink-0 uppercase tracking-wider">{label}</span>
|
<span className="text-[15px] font-mono text-[#555] w-16 shrink-0 uppercase tracking-wider">{label}</span>
|
||||||
<div className="flex-1 relative h-2 border border-[#333] bg-[#111]">
|
<div className="flex-1 relative h-2 border border-[#333] bg-[#111]">
|
||||||
<div className="absolute left-0 top-0 h-full bg-[#ff4500]" style={{ width: `${pct}%` }} />
|
<div className="absolute left-0 top-0 h-full bg-[#ff4500]" style={{ width: `${pct}%` }} />
|
||||||
<input
|
<input
|
||||||
@@ -45,7 +45,7 @@ function SliderControl({ label, value, min, max, step, unit, onChange }: {
|
|||||||
className="absolute inset-0 w-full h-full opacity-0 cursor-pointer"
|
className="absolute inset-0 w-full h-full opacity-0 cursor-pointer"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-[12px] font-mono text-[#888] w-12 text-right">{value.toFixed(step < 0.1 ? 2 : 1)}{unit}</span>
|
<span className="text-[15px] font-mono text-[#888] w-12 text-right">{value.toFixed(step < 0.1 ? 2 : 1)}{unit}</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -74,15 +74,15 @@ export default function FilterEditor({ initialParams, onSave, onCancel }: Filter
|
|||||||
<Card serial="FLT-EDIT">
|
<Card serial="FLT-EDIT">
|
||||||
<div className="p-2.5 space-y-2">
|
<div className="p-2.5 space-y-2">
|
||||||
<div className="flex items-center gap-2 border-b border-[#333] pb-1.5">
|
<div className="flex items-center gap-2 border-b border-[#333] pb-1.5">
|
||||||
<span className="material-symbols-outlined text-[14px] text-[#ff4500]">tune</span>
|
<span className="material-symbols-outlined text-[17px] text-[#ff4500]">tune</span>
|
||||||
<h2 className="text-[12px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">滤镜编辑器</h2>
|
<h2 className="text-[15px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">滤镜编辑器</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<input
|
<input
|
||||||
value={name}
|
value={name}
|
||||||
onChange={e => setName(e.target.value)}
|
onChange={e => setName(e.target.value)}
|
||||||
placeholder="滤镜名称"
|
placeholder="滤镜名称"
|
||||||
className="w-full border border-[#333] bg-[#111] text-[#e0e0e0] px-2 py-1.5 text-[12px] font-mono
|
className="w-full border border-[#333] bg-[#111] text-[#e0e0e0] px-2 py-2 text-[15px] font-mono
|
||||||
placeholder:text-[#444] outline-none focus:border-[#ff4500] transition-colors duration-75"
|
placeholder:text-[#444] outline-none focus:border-[#ff4500] transition-colors duration-75"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -91,7 +91,7 @@ export default function FilterEditor({ initialParams, onSave, onCancel }: Filter
|
|||||||
{/* Tone controls */}
|
{/* Tone controls */}
|
||||||
<Card serial="FLT-TONE">
|
<Card serial="FLT-TONE">
|
||||||
<div className="p-2.5">
|
<div className="p-2.5">
|
||||||
<h3 className="text-[12px] font-bold tracking-[0.15em] uppercase text-[#888] mb-1">色调</h3>
|
<h3 className="text-[15px] font-bold tracking-[0.15em] uppercase text-[#888] mb-1">色调</h3>
|
||||||
<SliderControl label="亮度" value={params.brightness} min={-100} max={100} step={1} unit="" onChange={update('brightness')} />
|
<SliderControl label="亮度" value={params.brightness} min={-100} max={100} step={1} unit="" onChange={update('brightness')} />
|
||||||
<SliderControl label="对比度" value={params.contrast} min={-100} max={100} step={1} unit="" onChange={update('contrast')} />
|
<SliderControl label="对比度" value={params.contrast} min={-100} max={100} step={1} unit="" onChange={update('contrast')} />
|
||||||
<SliderControl label="饱和度" value={params.saturation} min={-100} max={100} step={1} unit="" onChange={update('saturation')} />
|
<SliderControl label="饱和度" value={params.saturation} min={-100} max={100} step={1} unit="" onChange={update('saturation')} />
|
||||||
@@ -103,7 +103,7 @@ export default function FilterEditor({ initialParams, onSave, onCancel }: Filter
|
|||||||
{/* Color balance */}
|
{/* Color balance */}
|
||||||
<Card serial="FLT-RGB">
|
<Card serial="FLT-RGB">
|
||||||
<div className="p-2.5">
|
<div className="p-2.5">
|
||||||
<h3 className="text-[12px] font-bold tracking-[0.15em] uppercase text-[#888] mb-1">色彩平衡</h3>
|
<h3 className="text-[15px] font-bold tracking-[0.15em] uppercase text-[#888] mb-1">色彩平衡</h3>
|
||||||
<SliderControl label="R" value={params.rGain} min={0} max={2} step={0.01} unit="" onChange={update('rGain')} />
|
<SliderControl label="R" value={params.rGain} min={0} max={2} step={0.01} unit="" onChange={update('rGain')} />
|
||||||
<SliderControl label="G" value={params.gGain} min={0} max={2} step={0.01} unit="" onChange={update('gGain')} />
|
<SliderControl label="G" value={params.gGain} min={0} max={2} step={0.01} unit="" onChange={update('gGain')} />
|
||||||
<SliderControl label="B" value={params.bGain} min={0} max={2} step={0.01} unit="" onChange={update('bGain')} />
|
<SliderControl label="B" value={params.bGain} min={0} max={2} step={0.01} unit="" onChange={update('bGain')} />
|
||||||
@@ -114,7 +114,7 @@ export default function FilterEditor({ initialParams, onSave, onCancel }: Filter
|
|||||||
{/* Preview bar */}
|
{/* Preview bar */}
|
||||||
<Card serial="FLT-PREV">
|
<Card serial="FLT-PREV">
|
||||||
<div className="p-2.5 space-y-1">
|
<div className="p-2.5 space-y-1">
|
||||||
<h3 className="text-[12px] font-bold tracking-[0.15em] uppercase text-[#888]">预览</h3>
|
<h3 className="text-[15px] font-bold tracking-[0.15em] uppercase text-[#888]">预览</h3>
|
||||||
<div className="flex gap-1 h-16">
|
<div className="flex gap-1 h-16">
|
||||||
{/* Color gradient preview affected by params */}
|
{/* Color gradient preview affected by params */}
|
||||||
<div
|
<div
|
||||||
@@ -143,9 +143,9 @@ export default function FilterEditor({ initialParams, onSave, onCancel }: Filter
|
|||||||
|
|
||||||
{/* Actions */}
|
{/* Actions */}
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<Button variant="primary" size="sm" className="flex-1 text-[12px]" onClick={() => onSave?.(params)}>保存滤镜</Button>
|
<Button variant="primary" size="sm" className="flex-1 text-[15px]" onClick={() => onSave?.(params)}>保存滤镜</Button>
|
||||||
<Button variant="ghost" size="sm" className="text-[12px]" onClick={onCancel}>取消</Button>
|
<Button variant="ghost" size="sm" className="text-[15px]" onClick={onCancel}>取消</Button>
|
||||||
<Button variant="ghost" size="sm" className="text-[12px]" onClick={() => setParams({ ...DEFAULT_PARAMS })}>重置</Button>
|
<Button variant="ghost" size="sm" className="text-[15px]" onClick={() => setParams({ ...DEFAULT_PARAMS })}>重置</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ export default function FilterGrid({ filters, loading, likedIds, onLike, onDownl
|
|||||||
if (filters.length === 0) {
|
if (filters.length === 0) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col items-center justify-center py-12 gap-2 border border-[#333]">
|
<div className="flex flex-col items-center justify-center py-12 gap-2 border border-[#333]">
|
||||||
<span className="material-symbols-outlined text-[24px] text-[#444]">photo_library</span>
|
<span className="material-symbols-outlined text-[34px] text-[#444]">photo_library</span>
|
||||||
<p className="text-[10px] font-mono text-[#555]">暂无滤镜数据</p>
|
<p className="text-[34px] font-mono text-[#555]">暂无滤镜数据</p>
|
||||||
<span className="tech-sn">空状态 / 暂无数据</span>
|
<span className="tech-sn">空状态 / 暂无数据</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export default function FilterPreview({ filter, onClose }: FilterPreviewProps) {
|
|||||||
<Card className="max-w-2xl mx-auto p-5">
|
<Card className="max-w-2xl mx-auto p-5">
|
||||||
<div className="flex items-center justify-between mb-4">
|
<div className="flex items-center justify-between mb-4">
|
||||||
<h2 className="text-[15px] font-bold tracking-[0.12em]">{filter.title}</h2>
|
<h2 className="text-[15px] font-bold tracking-[0.12em]">{filter.title}</h2>
|
||||||
{onClose && <button onClick={onClose} className="text-tactical-textDim hover:text-tactical-text text-[14px]">✕</button>}
|
{onClose && <button onClick={onClose} className="text-tactical-textDim hover:text-tactical-text text-[17px]">✕</button>}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Preview image area */}
|
{/* Preview image area */}
|
||||||
@@ -21,13 +21,13 @@ export default function FilterPreview({ filter, onClose }: FilterPreviewProps) {
|
|||||||
) : (
|
) : (
|
||||||
<div className="flex flex-col items-center gap-2 text-tactical-textDim/50">
|
<div className="flex flex-col items-center gap-2 text-tactical-textDim/50">
|
||||||
<span className="material-symbols-outlined text-[48px]">image</span>
|
<span className="material-symbols-outlined text-[48px]">image</span>
|
||||||
<span className="text-[11px]">预览区域</span>
|
<span className="text-[17px]">预览区域</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{filter.description && (
|
{filter.description && (
|
||||||
<p className="text-[12px] text-tactical-textMuted/70 leading-relaxed">{filter.description}</p>
|
<p className="text-[15px] text-tactical-textMuted/70 leading-relaxed">{filter.description}</p>
|
||||||
)}
|
)}
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -25,14 +25,14 @@ export default function BottomDock({ items, currentPage, onNavigate, visible = t
|
|||||||
<button
|
<button
|
||||||
key={item.id}
|
key={item.id}
|
||||||
onClick={() => onNavigate(item.id)}
|
onClick={() => onNavigate(item.id)}
|
||||||
className={`relative px-3.5 py-2 text-[9px] font-semibold tracking-[0.12em] uppercase
|
className={`relative px-3.5 py-2 text-[15px] font-semibold tracking-[0.12em] uppercase
|
||||||
border-r border-[#333] last:border-r-0 transition-colors duration-75
|
border-r border-[#333] last:border-r-0 transition-colors duration-75
|
||||||
${isActive ? 'bg-[#ff4500]/10 text-[#ff4500]' : 'text-[#555] hover:text-[#e0e0e0] hover:bg-[#222]'}`}
|
${isActive ? 'bg-[#ff4500]/10 text-[#ff4500]' : 'text-[#555] hover:text-[#e0e0e0] hover:bg-[#222]'}`}
|
||||||
>
|
>
|
||||||
{isActive && (
|
{isActive && (
|
||||||
<span className="absolute top-0 left-0 right-0 h-[1px] bg-[#ff4500]" />
|
<span className="absolute top-0 left-0 right-0 h-[1px] bg-[#ff4500]" />
|
||||||
)}
|
)}
|
||||||
<span className="material-symbols-outlined text-[14px] mr-1.5 align-middle">{item.icon}</span>
|
<span className="material-symbols-outlined text-[17px] mr-1.5 align-middle">{item.icon}</span>
|
||||||
{item.label}
|
{item.label}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -26,22 +26,22 @@ export default function DesktopIcon({ icon, label, onClick, disabled, locked, vi
|
|||||||
X{index % 4}Y{Math.floor(index / 4)}
|
X{index % 4}Y{Math.floor(index / 4)}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span className={`material-symbols-outlined text-[28px] transition-colors duration-75
|
<span className={`material-symbols-outlined text-[34px] transition-colors duration-75
|
||||||
${isBlocked ? 'text-[#444]' : 'text-[#888] group-hover:text-[#ff4500]'}`}>
|
${isBlocked ? 'text-[#444]' : 'text-[#888] group-hover:text-[#ff4500]'}`}>
|
||||||
{icon}
|
{icon}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<div className="flex items-center gap-1.5">
|
<div className="flex items-center gap-1.5">
|
||||||
<span className={`text-[11px] font-semibold tracking-[0.12em] uppercase transition-colors duration-75
|
<span className={`text-[17px] font-semibold tracking-[0.12em] uppercase transition-colors duration-75
|
||||||
${isBlocked ? 'text-[#555]' : 'text-[#555] group-hover:text-[#e0e0e0]'}`}>
|
${isBlocked ? 'text-[#555]' : 'text-[#555] group-hover:text-[#e0e0e0]'}`}>
|
||||||
{label}
|
{label}
|
||||||
</span>
|
</span>
|
||||||
{isBlocked && <span className="text-[10px]">🔒</span>}
|
{isBlocked && <span className="text-[34px]">🔒</span>}
|
||||||
{vip && !isBlocked && <span className="text-[9px] text-[#ff4500]">✦</span>}
|
{vip && !isBlocked && <span className="text-[15px] text-[#ff4500]">✦</span>}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{isBlocked && (
|
{isBlocked && (
|
||||||
<span className="text-[8px] font-mono text-[#444] tracking-wider">{vip && locked ? 'VIP' : '登录后可用'}</span>
|
<span className="text-[17px] font-mono text-[#444] tracking-wider">{vip && locked ? 'VIP' : '登录后可用'}</span>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{!isBlocked && (
|
{!isBlocked && (
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export default function SubNavBar() {
|
|||||||
<button
|
<button
|
||||||
key={item.id}
|
key={item.id}
|
||||||
onClick={() => navigate('/' + item.id)}
|
onClick={() => navigate('/' + item.id)}
|
||||||
className={`relative px-4 py-2.5 text-[11px] font-semibold tracking-[0.1em] uppercase
|
className={`relative px-4 py-3 text-[17px] font-semibold tracking-[0.1em] uppercase
|
||||||
border-r border-[#333] last:border-r-0 transition-colors duration-75
|
border-r border-[#333] last:border-r-0 transition-colors duration-75
|
||||||
${isActive ? 'bg-[#ff4500]/10 text-[#ff4500]' : 'text-[#555] hover:text-[#888] hover:bg-[#222]'}`}
|
${isActive ? 'bg-[#ff4500]/10 text-[#ff4500]' : 'text-[#555] hover:text-[#888] hover:bg-[#222]'}`}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ export default function TopBar({
|
|||||||
{/* Left: Time + Compass */}
|
{/* Left: Time + Compass */}
|
||||||
<div className="flex items-center gap-3" style={{ WebkitAppRegion: 'no-drag' as any }}>
|
<div className="flex items-center gap-3" style={{ WebkitAppRegion: 'no-drag' as any }}>
|
||||||
<Compass className="w-5 h-5" />
|
<Compass className="w-5 h-5" />
|
||||||
<span className="text-[12px] font-semibold text-tactical-textMuted tracking-wider">
|
<span className="text-[15px] font-semibold text-tactical-textMuted tracking-wider">
|
||||||
{new Date().toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })}
|
{new Date().toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })}
|
||||||
</span>
|
</span>
|
||||||
<div className="flex items-center gap-1 text-[10px] text-tactical-textMuted">
|
<div className="flex items-center gap-1 text-[34px] text-tactical-textMuted">
|
||||||
<span className="w-1 h-1 rounded-full bg-tactical-army" />
|
<span className="w-1 h-1 rounded-full bg-tactical-army" />
|
||||||
<span>ONLINE</span>
|
<span>ONLINE</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -36,21 +36,21 @@ export default function TopBar({
|
|||||||
|
|
||||||
{/* Center: Hardware status */}
|
{/* Center: Hardware status */}
|
||||||
<div className="flex items-center gap-4" style={{ WebkitAppRegion: 'no-drag' as any }}>
|
<div className="flex items-center gap-4" style={{ WebkitAppRegion: 'no-drag' as any }}>
|
||||||
<div className="flex items-center gap-1.5 text-[11px]">
|
<div className="flex items-center gap-1.5 text-[17px]">
|
||||||
<span className="text-tactical-textDim">CPU</span>
|
<span className="text-tactical-textDim">CPU</span>
|
||||||
<span className="font-bold text-tactical-textMuted">{cpuTemp}°</span>
|
<span className="font-bold text-tactical-textMuted">{cpuTemp}°</span>
|
||||||
<div className="w-12 h-[3px] bg-tactical-dark/80 rounded-full overflow-hidden">
|
<div className="w-12 h-[3px] bg-tactical-dark/80 rounded-full overflow-hidden">
|
||||||
<div className="h-full bg-tactical-army transition-all" style={{ width: `${Math.min(cpuTemp, 100)}%` }} />
|
<div className="h-full bg-tactical-army transition-all" style={{ width: `${Math.min(cpuTemp, 100)}%` }} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-1.5 text-[11px]">
|
<div className="flex items-center gap-1.5 text-[17px]">
|
||||||
<span className="text-tactical-textDim">GPU</span>
|
<span className="text-tactical-textDim">GPU</span>
|
||||||
<span className="font-bold text-tactical-textMuted">{gpuTemp}°</span>
|
<span className="font-bold text-tactical-textMuted">{gpuTemp}°</span>
|
||||||
<div className="w-12 h-[3px] bg-tactical-dark/80 rounded-full overflow-hidden">
|
<div className="w-12 h-[3px] bg-tactical-dark/80 rounded-full overflow-hidden">
|
||||||
<div className="h-full bg-tactical-olive transition-all" style={{ width: `${Math.min(gpuTemp, 100)}%` }} />
|
<div className="h-full bg-tactical-olive transition-all" style={{ width: `${Math.min(gpuTemp, 100)}%` }} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-1.5 text-[11px]">
|
<div className="flex items-center gap-1.5 text-[17px]">
|
||||||
<span className="text-tactical-textDim">FPS</span>
|
<span className="text-tactical-textDim">FPS</span>
|
||||||
<span className="font-bold text-tactical-textMuted">{fps}</span>
|
<span className="font-bold text-tactical-textMuted">{fps}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -59,19 +59,19 @@ export default function TopBar({
|
|||||||
{/* Right: VIP + Network + Controls */}
|
{/* Right: VIP + Network + Controls */}
|
||||||
<div className="flex items-center gap-3" style={{ WebkitAppRegion: 'no-drag' as any }}>
|
<div className="flex items-center gap-3" style={{ WebkitAppRegion: 'no-drag' as any }}>
|
||||||
{isVip && (
|
{isVip && (
|
||||||
<div className="flex items-center gap-1 text-[10px] tracking-[0.15em] text-tactical-goldLight bg-tactical-gold/10 px-2 py-0.5 border border-tactical-gold/30">
|
<div className="flex items-center gap-1 text-[34px] tracking-[0.15em] text-tactical-goldLight bg-tactical-gold/10 px-2 py-0.5 border border-tactical-gold/30">
|
||||||
<span>✦ VIP</span>
|
<span>✦ VIP</span>
|
||||||
<span className="w-1.5 h-1.5 rounded-full bg-tactical-goldLight animate-pulse" />
|
<span className="w-1.5 h-1.5 rounded-full bg-tactical-goldLight animate-pulse" />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="flex items-center gap-1 text-[10px] text-tactical-army">
|
<div className="flex items-center gap-1 text-[34px] text-tactical-army">
|
||||||
<span className="w-1.5 h-1.5 rounded-full bg-tactical-army" />
|
<span className="w-1.5 h-1.5 rounded-full bg-tactical-army" />
|
||||||
{ping}ms
|
{ping}ms
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-1 ml-2">
|
<div className="flex items-center gap-1 ml-2">
|
||||||
<button onClick={onMinimize} className="text-tactical-textDim hover:text-tactical-textMuted text-[12px] px-1.5 py-0.5 transition-colors">━</button>
|
<button onClick={onMinimize} className="text-tactical-textDim hover:text-tactical-textMuted text-[15px] px-2 py-0.5 transition-colors">━</button>
|
||||||
<button onClick={onMaximize} className="text-tactical-textDim hover:text-tactical-textMuted text-[12px] px-1.5 py-0.5 transition-colors">☐</button>
|
<button onClick={onMaximize} className="text-tactical-textDim hover:text-tactical-textMuted text-[15px] px-2 py-0.5 transition-colors">☐</button>
|
||||||
<button onClick={onClose} className="text-tactical-textDim hover:text-tactical-warn text-[12px] px-1.5 py-0.5 transition-colors">✕</button>
|
<button onClick={onClose} className="text-tactical-textDim hover:text-tactical-warn text-[15px] px-2 py-0.5 transition-colors">✕</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,21 +13,21 @@ function callElectron(method: string) {
|
|||||||
|
|
||||||
export default function TopHud({ title = '码枪堂 2.0', subtitle, sections = [], onBack }: TopHudProps) {
|
export default function TopHud({ title = '码枪堂 2.0', subtitle, sections = [], onBack }: TopHudProps) {
|
||||||
return (
|
return (
|
||||||
<div className="flex items-center justify-between border-b border-[#333] bg-[#1a1a1a] px-4 py-1.5 select-none">
|
<div className="flex items-center justify-between border-b border-[#333] bg-[#1a1a1a] px-4 py-2 select-none">
|
||||||
<div className="flex items-center gap-2.5">
|
<div className="flex items-center gap-2.5">
|
||||||
{onBack && (
|
{onBack && (
|
||||||
<button
|
<button
|
||||||
onClick={onBack}
|
onClick={onBack}
|
||||||
className="text-[#555] hover:text-[#e0e0e0] text-[14px] px-1.5 py-0.5 border border-[#333] hover:border-[#555] transition-colors duration-75"
|
className="text-[#555] hover:text-[#e0e0e0] text-[17px] px-2 py-0.5 border border-[#333] hover:border-[#555] transition-colors duration-75"
|
||||||
>
|
>
|
||||||
←
|
←
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<span className="text-[#ff4500] text-[10px]">◆</span>
|
<span className="text-[#ff4500] text-[34px]">◆</span>
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">{title}</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">{title}</h1>
|
||||||
{subtitle && (
|
{subtitle && (
|
||||||
<>
|
<>
|
||||||
<span className="text-[#444] text-[10px]">|</span>
|
<span className="text-[#444] text-[34px]">|</span>
|
||||||
<span className="tech-sn">{subtitle}</span>
|
<span className="tech-sn">{subtitle}</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
@@ -35,30 +35,30 @@ export default function TopHud({ title = '码枪堂 2.0', subtitle, sections = [
|
|||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
{sections.map((s, i) => (
|
{sections.map((s, i) => (
|
||||||
<span key={i} className="flex items-center gap-1">
|
<span key={i} className="flex items-center gap-1">
|
||||||
<span className="text-[10px] tracking-[0.15em] uppercase text-[#555]">{s.label}</span>
|
<span className="text-[34px] tracking-[0.15em] uppercase text-[#555]">{s.label}</span>
|
||||||
<span className="text-[11px] font-mono text-[#e0e0e0]">{s.value}</span>
|
<span className="text-[17px] font-mono text-[#e0e0e0]">{s.value}</span>
|
||||||
</span>
|
</span>
|
||||||
))}
|
))}
|
||||||
<span className="w-px h-4 bg-[#333]" />
|
<span className="w-px h-4 bg-[#333]" />
|
||||||
<button
|
<button
|
||||||
onClick={() => callElectron('minimizeWindow')}
|
onClick={() => callElectron('minimizeWindow')}
|
||||||
className="text-[#555] hover:text-[#e0e0e0] text-[18px] leading-none px-1 transition-colors duration-75"
|
className="text-[#555] hover:text-[#e0e0e0] text-[34px] leading-none px-1 transition-colors duration-75"
|
||||||
>
|
>
|
||||||
─
|
─
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => callElectron('maximizeWindow')}
|
onClick={() => callElectron('maximizeWindow')}
|
||||||
className="text-[#555] hover:text-[#e0e0e0] text-[14px] leading-none px-1 transition-colors duration-75"
|
className="text-[#555] hover:text-[#e0e0e0] text-[17px] leading-none px-1 transition-colors duration-75"
|
||||||
>
|
>
|
||||||
☐
|
☐
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => callElectron('closeWindow')}
|
onClick={() => callElectron('closeWindow')}
|
||||||
className="text-[#555] hover:text-[#cc3300] text-[16px] leading-none px-1 transition-colors duration-75"
|
className="text-[#555] hover:text-[#cc3300] text-[34px] leading-none px-1 transition-colors duration-75"
|
||||||
>
|
>
|
||||||
✕
|
✕
|
||||||
</button>
|
</button>
|
||||||
<span className="text-[10px] font-mono text-[#444] ml-1">V0.2.1</span>
|
<span className="text-[34px] font-mono text-[#444] ml-1">V0.2.1</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -41,26 +41,26 @@ export default function OptimizeItem({ item, onToggle, disabled }: OptimizeItemP
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`border transition-colors duration-75 bg-[#1a1a1a]/60 ${statusStyles[item.status]}`}>
|
<div className={`border transition-colors duration-75 bg-[#1a1a1a]/60 ${statusStyles[item.status]}`}>
|
||||||
<div className="flex items-center gap-3 px-3 py-2.5">
|
<div className="flex items-center gap-4 px-4 py-2.5">
|
||||||
<div className={`w-1.5 h-1.5 shrink-0 rounded-full ${isOptimized ? 'bg-[#ff4500]' : 'bg-[#333]'}`} />
|
<div className={`w-1.5 h-1.5 shrink-0 rounded-full ${isOptimized ? 'bg-[#ff4500]' : 'bg-[#333]'}`} />
|
||||||
|
|
||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span className="material-symbols-outlined text-[14px] text-[#555]">{item.icon}</span>
|
<span className="material-symbols-outlined text-[17px] text-[#555]">{item.icon}</span>
|
||||||
<span className="text-[13px] font-semibold tracking-[0.1em] uppercase text-[#e0e0e0] truncate">
|
<span className="text-[34px] font-semibold tracking-[0.1em] uppercase text-[#e0e0e0] truncate">
|
||||||
{item.label}
|
{item.label}
|
||||||
</span>
|
</span>
|
||||||
<span className={`text-[12px] font-mono tracking-wider px-1.5 py-[1px] border ${statusTextStyles[item.status]} border-current/30`}>
|
<span className={`text-[15px] font-mono tracking-wider px-2 py-[1px] border ${statusTextStyles[item.status]} border-current/30`}>
|
||||||
{statusLabels[item.status]}
|
{statusLabels[item.status]}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-[12px] text-[#555] mt-0.5 truncate">{item.description}</p>
|
<p className="text-[15px] text-[#555] mt-0.5 truncate">{item.description}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => onToggle(item.id, isOptimized ? 'restore' : 'optimize')}
|
onClick={() => onToggle(item.id, isOptimized ? 'restore' : 'optimize')}
|
||||||
disabled={disabled || item.status === 'error'}
|
disabled={disabled || item.status === 'error'}
|
||||||
className={`w-[80px] shrink-0 py-2 text-[12px] font-semibold tracking-[0.1em] uppercase border transition-colors duration-75
|
className={`w-[80px] shrink-0 py-2 text-[15px] font-semibold tracking-[0.1em] uppercase border transition-colors duration-75
|
||||||
${isOptimized
|
${isOptimized
|
||||||
? 'border-[#555] text-[#555] hover:border-[#ff4500] hover:text-[#ff4500]'
|
? 'border-[#555] text-[#555] hover:border-[#ff4500] hover:text-[#ff4500]'
|
||||||
: 'border-[#555] text-[#888] hover:border-[#ff4500] hover:text-[#ff4500]'
|
: 'border-[#555] text-[#888] hover:border-[#ff4500] hover:text-[#ff4500]'
|
||||||
|
|||||||
@@ -11,24 +11,24 @@ export default function OptimizeResult({ success, message, details, onClose }: O
|
|||||||
return (
|
return (
|
||||||
<div className={`border p-2.5 ${success ? 'border-[#ff4500] bg-[#ff4500]/5' : 'border-[#cc3300] bg-[#cc3300]/5'}`}>
|
<div className={`border p-2.5 ${success ? 'border-[#ff4500] bg-[#ff4500]/5' : 'border-[#cc3300] bg-[#cc3300]/5'}`}>
|
||||||
<div className="flex items-start gap-2">
|
<div className="flex items-start gap-2">
|
||||||
<span className={`text-[14px] leading-none ${success ? 'text-[#ff4500]' : 'text-[#cc3300]'}`}>
|
<span className={`text-[17px] leading-none ${success ? 'text-[#ff4500]' : 'text-[#cc3300]'}`}>
|
||||||
{success ? '▸' : '✕'}
|
{success ? '▸' : '✕'}
|
||||||
</span>
|
</span>
|
||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
<h3 className="text-[12px] font-bold tracking-[0.12em] uppercase text-[#e0e0e0]">
|
<h3 className="text-[15px] font-bold tracking-[0.12em] uppercase text-[#e0e0e0]">
|
||||||
{success ? '优化完成' : '优化失败'}
|
{success ? '优化完成' : '优化失败'}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-[12px] font-mono text-[#888] mt-0.5">{message}</p>
|
<p className="text-[15px] font-mono text-[#888] mt-0.5">{message}</p>
|
||||||
{details && details.length > 0 && (
|
{details && details.length > 0 && (
|
||||||
<div className="mt-1.5 space-y-0.5">
|
<div className="mt-1.5 space-y-0.5">
|
||||||
{details.map((d, i) => (
|
{details.map((d, i) => (
|
||||||
<p key={i} className="text-[12px] font-mono text-[#555]">▸ {d}</p>
|
<p key={i} className="text-[15px] font-mono text-[#555]">▸ {d}</p>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
{onClose && (
|
{onClose && (
|
||||||
<button onClick={onClose} className="text-[#555] hover:text-[#e0e0e0] text-[12px] leading-none transition-colors duration-75">
|
<button onClick={onClose} className="text-[#555] hover:text-[#e0e0e0] text-[15px] leading-none transition-colors duration-75">
|
||||||
✕
|
✕
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ export default function CategoryTabs({ categories, activeCode, onSelect, classNa
|
|||||||
<button
|
<button
|
||||||
key={cat.code}
|
key={cat.code}
|
||||||
onClick={() => onSelect(cat.code)}
|
onClick={() => onSelect(cat.code)}
|
||||||
className={`relative px-2.5 py-1.5 text-[12px] font-semibold tracking-[0.08em] uppercase border-r border-[#333] last:border-r-0 transition-colors duration-75
|
className={`relative px-2.5 py-1.5 text-[15px] font-semibold tracking-[0.08em] uppercase border-r border-[#333] last:border-r-0 transition-colors duration-75
|
||||||
${activeCode === cat.code
|
${activeCode === cat.code
|
||||||
? 'text-[#ff4500] bg-[#ff4500]/10'
|
? 'text-[#ff4500] bg-[#ff4500]/10'
|
||||||
: 'text-[#555] hover:text-[#888] hover:bg-[#222]'
|
: 'text-[#555] hover:text-[#888] hover:bg-[#222]'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{cat.name}
|
{cat.name}
|
||||||
<span className="ml-1 text-[12px] text-[#444]">{cat.code}</span>
|
<span className="ml-1 text-[15px] text-[#444]">{cat.code}</span>
|
||||||
{activeCode === cat.code && (
|
{activeCode === cat.code && (
|
||||||
<span className="absolute bottom-0 left-1 right-1 h-[1px] bg-[#ff4500]" />
|
<span className="absolute bottom-0 left-1 right-1 h-[1px] bg-[#ff4500]" />
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -30,19 +30,19 @@ export default function SchemeCard({ scheme, isFavorited, onFavorite, onUse, onC
|
|||||||
<Card
|
<Card
|
||||||
hoverable
|
hoverable
|
||||||
onClick={() => onClick?.(scheme.id)}
|
onClick={() => onClick?.(scheme.id)}
|
||||||
className={`flex flex-col p-3 gap-2 ${className}`}
|
className={`flex flex-col p-4 gap-2 ${className}`}
|
||||||
serial={scheme.isOfficial ? 'OFFICIAL' : undefined}
|
serial={scheme.isOfficial ? 'OFFICIAL' : undefined}
|
||||||
>
|
>
|
||||||
{/* 标题 */}
|
{/* 标题 */}
|
||||||
<div className="flex items-start justify-between gap-2">
|
<div className="flex items-start justify-between gap-2">
|
||||||
<div className="min-w-0 flex-1">
|
<div className="min-w-0 flex-1">
|
||||||
<h3 className="text-[12px] font-bold tracking-[0.08em] uppercase text-[#e0e0e0] truncate">
|
<h3 className="text-[15px] font-bold tracking-[0.08em] uppercase text-[#e0e0e0] truncate">
|
||||||
{scheme.title || '未命名方案'}
|
{scheme.title || '未命名方案'}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-[12px] font-mono text-[#555] mt-0.5">{scheme.weaponName || scheme.category || '通用'}</p>
|
<p className="text-[15px] font-mono text-[#555] mt-0.5">{scheme.weaponName || scheme.category || '通用'}</p>
|
||||||
</div>
|
</div>
|
||||||
{scheme.isOfficial && (
|
{scheme.isOfficial && (
|
||||||
<span className="text-[12px] font-semibold tracking-[0.1em] uppercase text-[#ff4500] border border-[#ff4500]/30 px-1 py-0.5">
|
<span className="text-[15px] font-semibold tracking-[0.1em] uppercase text-[#ff4500] border border-[#ff4500]/30 px-1 py-0.5">
|
||||||
官方
|
官方
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
@@ -50,19 +50,19 @@ export default function SchemeCard({ scheme, isFavorited, onFavorite, onUse, onC
|
|||||||
|
|
||||||
{/* 作者 */}
|
{/* 作者 */}
|
||||||
{scheme.user?.username && (
|
{scheme.user?.username && (
|
||||||
<p className="text-[12px] font-mono text-[#555]">作者: {scheme.user.username}</p>
|
<p className="text-[15px] font-mono text-[#555]">作者: {scheme.user.username}</p>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* 价格 */}
|
{/* 价格 */}
|
||||||
{scheme.price > 0 && (
|
{scheme.price > 0 && (
|
||||||
<p className="text-[12px] font-mono text-[#555]">💰 {scheme.price}</p>
|
<p className="text-[15px] font-mono text-[#555]">💰 {scheme.price}</p>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* 操作按钮 */}
|
{/* 操作按钮 */}
|
||||||
<div className="flex items-center gap-2 mt-auto pt-1 border-t border-[#333]">
|
<div className="flex items-center gap-2 mt-auto pt-1 border-t border-[#333]">
|
||||||
<button
|
<button
|
||||||
onClick={e => { e.stopPropagation(); onFavorite?.(scheme.id); }}
|
onClick={e => { e.stopPropagation(); onFavorite?.(scheme.id); }}
|
||||||
className={`text-[12px] font-mono px-1.5 py-1 border transition-colors duration-75
|
className={`text-[15px] font-mono px-2 py-1 border transition-colors duration-75
|
||||||
${isFavorited
|
${isFavorited
|
||||||
? 'border-[#ff4500] text-[#ff4500]'
|
? 'border-[#ff4500] text-[#ff4500]'
|
||||||
: 'border-[#333] text-[#555] hover:border-[#555]'}`}
|
: 'border-[#333] text-[#555] hover:border-[#555]'}`}
|
||||||
@@ -71,7 +71,7 @@ export default function SchemeCard({ scheme, isFavorited, onFavorite, onUse, onC
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={e => { e.stopPropagation(); onUse?.(scheme.id); }}
|
onClick={e => { e.stopPropagation(); onUse?.(scheme.id); }}
|
||||||
className="ml-auto text-[12px] font-semibold tracking-[0.1em] uppercase text-[#888] border border-[#333] px-1.5 py-1
|
className="ml-auto text-[15px] font-semibold tracking-[0.1em] uppercase text-[#888] border border-[#333] px-2 py-1
|
||||||
hover:border-[#ff4500] hover:text-[#ff4500] transition-colors duration-75"
|
hover:border-[#ff4500] hover:text-[#ff4500] transition-colors duration-75"
|
||||||
>
|
>
|
||||||
使用
|
使用
|
||||||
@@ -79,7 +79,7 @@ export default function SchemeCard({ scheme, isFavorited, onFavorite, onUse, onC
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 统计数据 */}
|
{/* 统计数据 */}
|
||||||
<div className="flex items-center gap-3 text-[12px] font-mono text-[#555]">
|
<div className="flex items-center gap-4 text-[15px] font-mono text-[#555]">
|
||||||
<span>👁 {scheme.viewsCount}</span>
|
<span>👁 {scheme.viewsCount}</span>
|
||||||
<span>⬇ {scheme.downloadsCount}</span>
|
<span>⬇ {scheme.downloadsCount}</span>
|
||||||
<span>👍 {scheme.likesCount}</span>
|
<span>👍 {scheme.likesCount}</span>
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ export default function SchemeEditor() {
|
|||||||
return (
|
return (
|
||||||
<div className="flex flex-col items-center justify-center py-16 gap-3">
|
<div className="flex flex-col items-center justify-center py-16 gap-3">
|
||||||
<span className="material-symbols-outlined text-[40px] text-tactical-textDim">construction</span>
|
<span className="material-symbols-outlined text-[40px] text-tactical-textDim">construction</span>
|
||||||
<p className="text-[13px] text-tactical-textMuted tracking-wider">方案编辑器</p>
|
<p className="text-[34px] text-tactical-textMuted tracking-wider">方案编辑器</p>
|
||||||
<p className="text-[11px] text-tactical-textDim">开发中</p>
|
<p className="text-[17px] text-tactical-textDim">开发中</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export default function SchemeList({
|
|||||||
return (
|
return (
|
||||||
<div className={`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-1.5 ${className}`}>
|
<div className={`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-1.5 ${className}`}>
|
||||||
{Array.from({ length: 6 }).map((_, i) => (
|
{Array.from({ length: 6 }).map((_, i) => (
|
||||||
<div key={i} className="border border-[#333] bg-[#1a1a1a] p-3 animate-pulse">
|
<div key={i} className="border border-[#333] bg-[#1a1a1a] p-4 animate-pulse">
|
||||||
<div className="h-3 bg-[#222] w-3/4 mb-2" />
|
<div className="h-3 bg-[#222] w-3/4 mb-2" />
|
||||||
<div className="h-2.5 bg-[#222] w-1/2 mb-3" />
|
<div className="h-2.5 bg-[#222] w-1/2 mb-3" />
|
||||||
<div className="h-6 bg-[#222] w-full" />
|
<div className="h-6 bg-[#222] w-full" />
|
||||||
@@ -37,15 +37,15 @@ export default function SchemeList({
|
|||||||
if (!schemes.length) {
|
if (!schemes.length) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col items-center justify-center py-12 gap-2 border border-[#333]">
|
<div className="flex flex-col items-center justify-center py-12 gap-2 border border-[#333]">
|
||||||
<span className="text-[24px] text-[#444]">📭</span>
|
<span className="text-[34px] text-[#444]">📭</span>
|
||||||
<p className="text-[12px] font-mono text-[#555]">暂无方案数据</p>
|
<p className="text-[15px] font-mono text-[#555]">暂无方案数据</p>
|
||||||
<span className="tech-sn">EMPTY / 404</span>
|
<span className="tech-sn">EMPTY / 404</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`flex flex-col gap-3 ${className}`}>
|
<div className={`flex flex-col gap-4 ${className}`}>
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-1.5">
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-1.5">
|
||||||
{schemes.map(s => (
|
{schemes.map(s => (
|
||||||
<SchemeCard
|
<SchemeCard
|
||||||
@@ -65,7 +65,7 @@ export default function SchemeList({
|
|||||||
<button
|
<button
|
||||||
disabled={page <= 1}
|
disabled={page <= 1}
|
||||||
onClick={() => onPageChange(page - 1)}
|
onClick={() => onPageChange(page - 1)}
|
||||||
className="px-2 py-1 text-[12px] font-mono text-[#555] border border-[#333] disabled:opacity-30 hover:border-[#555]"
|
className="px-2 py-1 text-[15px] font-mono text-[#555] border border-[#333] disabled:opacity-30 hover:border-[#555]"
|
||||||
>
|
>
|
||||||
◀
|
◀
|
||||||
</button>
|
</button>
|
||||||
@@ -73,7 +73,7 @@ export default function SchemeList({
|
|||||||
<button
|
<button
|
||||||
key={i}
|
key={i}
|
||||||
onClick={() => onPageChange(i + 1)}
|
onClick={() => onPageChange(i + 1)}
|
||||||
className={`px-2 py-1 text-[12px] font-mono border transition-colors duration-75
|
className={`px-2 py-1 text-[15px] font-mono border transition-colors duration-75
|
||||||
${page === i + 1
|
${page === i + 1
|
||||||
? 'border-[#ff4500] text-[#ff4500] bg-[#ff4500]/10'
|
? 'border-[#ff4500] text-[#ff4500] bg-[#ff4500]/10'
|
||||||
: 'border-[#333] text-[#555] hover:border-[#555]'}`}
|
: 'border-[#333] text-[#555] hover:border-[#555]'}`}
|
||||||
@@ -84,7 +84,7 @@ export default function SchemeList({
|
|||||||
<button
|
<button
|
||||||
disabled={page >= totalPages}
|
disabled={page >= totalPages}
|
||||||
onClick={() => onPageChange(page + 1)}
|
onClick={() => onPageChange(page + 1)}
|
||||||
className="px-2 py-1 text-[12px] font-mono text-[#555] border border-[#333] disabled:opacity-30 hover:border-[#555]"
|
className="px-2 py-1 text-[15px] font-mono text-[#555] border border-[#333] disabled:opacity-30 hover:border-[#555]"
|
||||||
>
|
>
|
||||||
▶
|
▶
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ interface SchemePreviewerProps {
|
|||||||
export default function SchemePreviewer({ content, className = '' }: SchemePreviewerProps) {
|
export default function SchemePreviewer({ content, className = '' }: SchemePreviewerProps) {
|
||||||
if (!content) {
|
if (!content) {
|
||||||
return (
|
return (
|
||||||
<div className={`flex items-center justify-center py-8 text-[12px] text-tactical-textDim ${className}`}>
|
<div className={`flex items-center justify-center py-8 text-[15px] text-tactical-textDim ${className}`}>
|
||||||
暂无预览内容
|
暂无预览内容
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -18,7 +18,7 @@ export default function SchemePreviewer({ content, className = '' }: SchemePrevi
|
|||||||
const parsed = JSON.parse(content);
|
const parsed = JSON.parse(content);
|
||||||
return (
|
return (
|
||||||
<div className={`rounded-[4px] border border-tactical-gray/30 bg-tactical-dark/50 p-4 ${className}`}>
|
<div className={`rounded-[4px] border border-tactical-gray/30 bg-tactical-dark/50 p-4 ${className}`}>
|
||||||
<pre className="text-[11px] text-tactical-textMuted/80 leading-relaxed whitespace-pre-wrap break-all max-h-[400px] overflow-y-auto scrollbar-none">
|
<pre className="text-[17px] text-tactical-textMuted/80 leading-relaxed whitespace-pre-wrap break-all max-h-[400px] overflow-y-auto scrollbar-none">
|
||||||
{JSON.stringify(parsed, null, 2)}
|
{JSON.stringify(parsed, null, 2)}
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
@@ -26,7 +26,7 @@ export default function SchemePreviewer({ content, className = '' }: SchemePrevi
|
|||||||
} catch {
|
} catch {
|
||||||
return (
|
return (
|
||||||
<div className={`rounded-[4px] border border-tactical-gray/30 bg-tactical-dark/50 p-4 ${className}`}>
|
<div className={`rounded-[4px] border border-tactical-gray/30 bg-tactical-dark/50 p-4 ${className}`}>
|
||||||
<p className="text-[11px] text-tactical-textMuted/80 whitespace-pre-wrap break-all max-h-[400px] overflow-y-auto scrollbar-none">
|
<p className="text-[17px] text-tactical-textMuted/80 whitespace-pre-wrap break-all max-h-[400px] overflow-y-auto scrollbar-none">
|
||||||
{content}
|
{content}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ const styleMap: Record<BadgeVariant, string> = {
|
|||||||
|
|
||||||
export default function Badge({ children, variant = 'default', className = '' }: BadgeProps) {
|
export default function Badge({ children, variant = 'default', className = '' }: BadgeProps) {
|
||||||
return (
|
return (
|
||||||
<span className={`inline-block px-1.5 py-0.5 text-[8px] font-semibold tracking-[0.08em] uppercase border ${styleMap[variant]} ${className}`}>
|
<span className={`inline-block px-1.5 py-0.5 text-[17px] font-semibold tracking-[0.08em] uppercase border ${styleMap[variant]} ${className}`}>
|
||||||
{children}
|
{children}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ const variantStyles: Record<ButtonVariant, string> = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const sizeStyles: Record<ButtonSize, string> = {
|
const sizeStyles: Record<ButtonSize, string> = {
|
||||||
sm: 'px-4 py-2 text-[12px]',
|
sm: 'px-4 py-2 text-[15px]',
|
||||||
md: 'px-6 py-3 text-[13px]',
|
md: 'px-6 py-3 text-[34px]',
|
||||||
lg: 'px-8 py-4 text-[15px]',
|
lg: 'px-8 py-4 text-[15px]',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
|||||||
export default function Input({ label, className = '', ...props }: InputProps) {
|
export default function Input({ label, className = '', ...props }: InputProps) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-0.5">
|
<div className="flex flex-col gap-0.5">
|
||||||
{label && <span className="text-[8px] font-mono text-[#555] uppercase tracking-wider">{label}</span>}
|
{label && <span className="text-[17px] font-mono text-[#555] uppercase tracking-wider">{label}</span>}
|
||||||
<input
|
<input
|
||||||
className={`border border-[#333] bg-[#111] text-[#e0e0e0] px-2.5 py-2 text-[10px] font-mono outline-none
|
className={`border border-[#333] bg-[#111] text-[#e0e0e0] px-2.5 py-2 text-[34px] font-mono outline-none
|
||||||
placeholder:text-[#444] transition-colors duration-75
|
placeholder:text-[#444] transition-colors duration-75
|
||||||
focus:border-[#ff4500] focus:bg-[#1a1a1a]
|
focus:border-[#ff4500] focus:bg-[#1a1a1a]
|
||||||
${className}`}
|
${className}`}
|
||||||
|
|||||||
@@ -25,20 +25,20 @@ export default function Panel({
|
|||||||
<div className="absolute bottom-0 right-0 w-2 h-2 border-b border-r border-[#ff4500]/40 pointer-events-none z-10" />
|
<div className="absolute bottom-0 right-0 w-2 h-2 border-b border-r border-[#ff4500]/40 pointer-events-none z-10" />
|
||||||
|
|
||||||
<div
|
<div
|
||||||
className={`flex items-center justify-between px-3 py-3 border-b border-[#333] select-none
|
className={`flex items-center justify-between px-4 py-3 border-b border-[#333] select-none
|
||||||
${collapsible ? 'cursor-pointer hover:bg-[#222]' : ''}`}
|
${collapsible ? 'cursor-pointer hover:bg-[#222]' : ''}`}
|
||||||
onClick={() => collapsible && setOpen(!open)}
|
onClick={() => collapsible && setOpen(!open)}
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-2 min-w-0">
|
<div className="flex items-center gap-2 min-w-0">
|
||||||
<span className="text-[#555] text-[11px] font-mono">▌</span>
|
<span className="text-[#555] text-[17px] font-mono">▌</span>
|
||||||
<h3 className="text-[12px] font-semibold tracking-[0.12em] uppercase text-[#e0e0e0] truncate">
|
<h3 className="text-[15px] font-semibold tracking-[0.12em] uppercase text-[#e0e0e0] truncate">
|
||||||
{title}
|
{title}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
{serial && <span className="tech-sn">{serial}</span>}
|
{serial && <span className="tech-sn">{serial}</span>}
|
||||||
{collapsible && (
|
{collapsible && (
|
||||||
<span className={`text-[#555] text-[10px] transition-transform duration-75 ${open ? 'rotate-180' : ''}`}>
|
<span className={`text-[#555] text-[34px] transition-transform duration-75 ${open ? 'rotate-180' : ''}`}>
|
||||||
▼
|
▼
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export default function ProgressBar({ value, max = 100, label, className = '' }:
|
|||||||
const pct = Math.min((value / max) * 100, 100);
|
const pct = Math.min((value / max) * 100, 100);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`flex items-center gap-3 ${className}`}>
|
<div className={`flex items-center gap-4 ${className}`}>
|
||||||
<div className="flex-1 h-[6px] bg-tactical-dark/90 border border-tactical-gray/40 relative overflow-hidden">
|
<div className="flex-1 h-[6px] bg-tactical-dark/90 border border-tactical-gray/40 relative overflow-hidden">
|
||||||
<div
|
<div
|
||||||
className="h-full transition-all duration-500 ease-out relative"
|
className="h-full transition-all duration-500 ease-out relative"
|
||||||
@@ -23,7 +23,7 @@ export default function ProgressBar({ value, max = 100, label, className = '' }:
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{label && <span className="text-[11px] font-bold text-tactical-textMuted whitespace-nowrap">{label}</span>}
|
{label && <span className="text-[17px] font-bold text-tactical-textMuted whitespace-nowrap">{label}</span>}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export default function ToastContainer() {
|
|||||||
{toasts.map(t => (
|
{toasts.map(t => (
|
||||||
<div
|
<div
|
||||||
key={t.id}
|
key={t.id}
|
||||||
className={`border bg-[#1a1a1a] px-3 py-2 font-mono text-[10px] tracking-wider
|
className={`border bg-[#1a1a1a] px-4 py-2 font-mono text-[34px] tracking-wider
|
||||||
animate-in slide-in-from-right-2 ${typeColors[t.type]}`}
|
animate-in slide-in-from-right-2 ${typeColors[t.type]}`}
|
||||||
>
|
>
|
||||||
▸ {t.text}
|
▸ {t.text}
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ import Card from '../components/ui/Card';
|
|||||||
|
|
||||||
export default function Crosshair() {
|
export default function Crosshair() {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">游戏准星</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">游戏准星</h1>
|
||||||
<span className="tech-sn">DEV-01</span>
|
<span className="tech-sn">DEV-01</span>
|
||||||
</div>
|
</div>
|
||||||
<Card className="p-3" serial="WIP-01">
|
<Card className="p-3" serial="WIP-01">
|
||||||
<p className="text-[12px] font-mono text-[#555]">游戏准星开发中</p>
|
<p className="text-[15px] font-mono text-[#555]">游戏准星开发中</p>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -8,19 +8,19 @@ export default function Exposure() {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
{/* 标题 */}
|
{/* 标题 */}
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">画面滤镜</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">画面滤镜</h1>
|
||||||
<span className="tech-sn">PHASE-04 / DSP</span>
|
<span className="tech-sn">PHASE-04 / DSP</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 操作按钮 */}
|
{/* 操作按钮 */}
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<Button variant="primary" size="sm" onClick={() => navigate('/filter-community')} className="flex-1 text-[12px]">
|
<Button variant="primary" size="sm" onClick={() => navigate('/filter-community')} className="flex-1 text-[15px]">
|
||||||
浏览滤镜社区
|
浏览滤镜社区
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="ghost" size="sm" className="flex-1 text-[12px]">
|
<Button variant="ghost" size="sm" className="flex-1 text-[15px]">
|
||||||
导入 ICC
|
导入 ICC
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
@@ -28,23 +28,23 @@ export default function Exposure() {
|
|||||||
{/* 已应用滤镜 */}
|
{/* 已应用滤镜 */}
|
||||||
<Panel title="已应用滤镜" serial="FLT-01">
|
<Panel title="已应用滤镜" serial="FLT-01">
|
||||||
<div className="flex flex-col items-center justify-center py-8 gap-2">
|
<div className="flex flex-col items-center justify-center py-8 gap-2">
|
||||||
<span className="material-symbols-outlined text-[24px] text-[#444]">blur_on</span>
|
<span className="material-symbols-outlined text-[34px] text-[#444]">blur_on</span>
|
||||||
<p className="text-[12px] font-mono text-[#555]">暂无已应用的滤镜</p>
|
<p className="text-[15px] font-mono text-[#555]">暂无已应用的滤镜</p>
|
||||||
<p className="text-[12px] font-mono text-[#444]">从滤镜社区下载或导入 ICC 配置文件</p>
|
<p className="text-[15px] font-mono text-[#444]">从滤镜社区下载或导入 ICC 配置文件</p>
|
||||||
</div>
|
</div>
|
||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
{/* 本地滤镜 */}
|
{/* 本地滤镜 */}
|
||||||
<Panel title="本地滤镜" serial="FLT-02" defaultOpen={false}>
|
<Panel title="本地滤镜" serial="FLT-02" defaultOpen={false}>
|
||||||
<div className="flex flex-col items-center justify-center py-6 gap-2">
|
<div className="flex flex-col items-center justify-center py-6 gap-2">
|
||||||
<span className="material-symbols-outlined text-[24px] text-[#444]">folder</span>
|
<span className="material-symbols-outlined text-[34px] text-[#444]">folder</span>
|
||||||
<p className="text-[12px] font-mono text-[#555]">暂无本地滤镜</p>
|
<p className="text-[15px] font-mono text-[#555]">暂无本地滤镜</p>
|
||||||
</div>
|
</div>
|
||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
{/* 提示 */}
|
{/* 提示 */}
|
||||||
<Card className="p-2 mt-auto" serial="INFO-01">
|
<Card className="p-2 mt-auto" serial="INFO-01">
|
||||||
<p className="text-[12px] font-mono text-[#555] leading-relaxed">
|
<p className="text-[15px] font-mono text-[#555] leading-relaxed">
|
||||||
[提示] 滤镜使用 ICC 色彩配置文件进行显示校准。需要兼容的显示器和显卡驱动支持。
|
[提示] 滤镜使用 ICC 色彩配置文件进行显示校准。需要兼容的显示器和显卡驱动支持。
|
||||||
</p>
|
</p>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -41,10 +41,10 @@ export default function FilterCommunity() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
{/* 标题 */}
|
{/* 标题 */}
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">滤镜社区</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">滤镜社区</h1>
|
||||||
<span className="tech-sn">NET-01 / 公开</span>
|
<span className="tech-sn">NET-01 / 公开</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -52,14 +52,14 @@ export default function FilterCommunity() {
|
|||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<button
|
<button
|
||||||
onClick={() => setSort('likes')}
|
onClick={() => setSort('likes')}
|
||||||
className={`text-[12px] font-semibold tracking-[0.12em] uppercase transition-colors duration-75
|
className={`text-[15px] font-semibold tracking-[0.12em] uppercase transition-colors duration-75
|
||||||
${sort === 'likes' ? 'text-[#ff4500]' : 'text-[#555] hover:text-[#888]'}`}
|
${sort === 'likes' ? 'text-[#ff4500]' : 'text-[#555] hover:text-[#888]'}`}
|
||||||
>
|
>
|
||||||
▸ 热门
|
▸ 热门
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => setSort('new')}
|
onClick={() => setSort('new')}
|
||||||
className={`text-[12px] font-semibold tracking-[0.12em] uppercase transition-colors duration-75
|
className={`text-[15px] font-semibold tracking-[0.12em] uppercase transition-colors duration-75
|
||||||
${sort === 'new' ? 'text-[#ff4500]' : 'text-[#555] hover:text-[#888]'}`}
|
${sort === 'new' ? 'text-[#ff4500]' : 'text-[#555] hover:text-[#888]'}`}
|
||||||
>
|
>
|
||||||
▸ 最新
|
▸ 最新
|
||||||
@@ -72,7 +72,7 @@ export default function FilterCommunity() {
|
|||||||
<button
|
<button
|
||||||
key={cat.code}
|
key={cat.code}
|
||||||
onClick={() => setActiveCategory(cat.code)}
|
onClick={() => setActiveCategory(cat.code)}
|
||||||
className={`px-2 py-1 text-[12px] font-semibold tracking-[0.1em] uppercase border transition-colors duration-75
|
className={`px-2 py-1 text-[15px] font-semibold tracking-[0.1em] uppercase border transition-colors duration-75
|
||||||
${activeCategory === cat.code
|
${activeCategory === cat.code
|
||||||
? 'border-[#ff4500] text-[#ff4500] bg-[#ff4500]/10'
|
? 'border-[#ff4500] text-[#ff4500] bg-[#ff4500]/10'
|
||||||
: 'border-[#333] text-[#555] hover:border-[#555] hover:text-[#888]'}`}
|
: 'border-[#333] text-[#555] hover:border-[#555] hover:text-[#888]'}`}
|
||||||
@@ -89,7 +89,7 @@ export default function FilterCommunity() {
|
|||||||
|
|
||||||
{/* 提示 */}
|
{/* 提示 */}
|
||||||
<Card className="p-2 mt-auto" serial="INFO-02">
|
<Card className="p-2 mt-auto" serial="INFO-02">
|
||||||
<p className="text-[12px] font-mono text-[#555] leading-relaxed">
|
<p className="text-[15px] font-mono text-[#555] leading-relaxed">
|
||||||
[提示] 社区滤镜由用户创建的 ICC 配置文件。不同显示器效果可能不同,请谨慎使用。
|
[提示] 社区滤镜由用户创建的 ICC 配置文件。不同显示器效果可能不同,请谨慎使用。
|
||||||
</p>
|
</p>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ import Card from '../components/ui/Card';
|
|||||||
|
|
||||||
export default function ForbiddenForce() {
|
export default function ForbiddenForce() {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">嘉豪之力</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">嘉豪之力</h1>
|
||||||
<span className="tech-sn">DEV-02</span>
|
<span className="tech-sn">DEV-02</span>
|
||||||
</div>
|
</div>
|
||||||
<Card className="p-3" serial="WIP-02">
|
<Card className="p-3" serial="WIP-02">
|
||||||
<p className="text-[12px] font-mono text-[#555]">此功能开发中</p>
|
<p className="text-[15px] font-mono text-[#555]">此功能开发中</p>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ function GaugeArc({ value, max, label, unit, color }: { value: number; max: numb
|
|||||||
{value}
|
{value}
|
||||||
</text>
|
</text>
|
||||||
</svg>
|
</svg>
|
||||||
<span className="text-[12px] font-mono tracking-[0.08em] uppercase text-[#555]">{label} ({unit})</span>
|
<span className="text-[15px] font-mono tracking-[0.08em] uppercase text-[#555]">{label} ({unit})</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -80,8 +80,8 @@ function BarGauge({ value, max, label, unit, color }: { value: number; max: numb
|
|||||||
style={{ width: `${pct * 100}%`, backgroundColor: color }}
|
style={{ width: `${pct * 100}%`, backgroundColor: color }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-[12px] font-mono text-[#888] w-16 text-right">{value}{unit}</span>
|
<span className="text-[15px] font-mono text-[#888] w-16 text-right">{value}{unit}</span>
|
||||||
<span className="text-[12px] font-mono text-[#444] uppercase w-12">{label}</span>
|
<span className="text-[15px] font-mono text-[#444] uppercase w-12">{label}</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -99,10 +99,10 @@ export default function HardwareMonitor() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">硬件监控</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">硬件监控</h1>
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<span className="w-1.5 h-1.5 bg-[#ff4500] animate-pulse" />
|
<span className="w-1.5 h-1.5 bg-[#ff4500] animate-pulse" />
|
||||||
<span className="tech-sn">实时</span>
|
<span className="tech-sn">实时</span>
|
||||||
@@ -113,8 +113,8 @@ export default function HardwareMonitor() {
|
|||||||
<Card serial="CPU-01">
|
<Card serial="CPU-01">
|
||||||
<div className="p-2.5 space-y-3">
|
<div className="p-2.5 space-y-3">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span className="material-symbols-outlined text-[14px] text-[#ff4500]">memory</span>
|
<span className="material-symbols-outlined text-[17px] text-[#ff4500]">memory</span>
|
||||||
<h2 className="text-[12px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">CPU</h2>
|
<h2 className="text-[15px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">CPU</h2>
|
||||||
<span className="tech-sn">Intel Core i9-13900K</span>
|
<span className="tech-sn">Intel Core i9-13900K</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -130,8 +130,8 @@ export default function HardwareMonitor() {
|
|||||||
<Card serial="GPU-01">
|
<Card serial="GPU-01">
|
||||||
<div className="p-2.5 space-y-3">
|
<div className="p-2.5 space-y-3">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span className="material-symbols-outlined text-[14px] text-[#ff4500]">videocam</span>
|
<span className="material-symbols-outlined text-[17px] text-[#ff4500]">videocam</span>
|
||||||
<h2 className="text-[12px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">GPU</h2>
|
<h2 className="text-[15px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">GPU</h2>
|
||||||
<span className="tech-sn">NVIDIA RTX 4090</span>
|
<span className="tech-sn">NVIDIA RTX 4090</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -151,18 +151,18 @@ export default function HardwareMonitor() {
|
|||||||
<Card serial="RAM-01">
|
<Card serial="RAM-01">
|
||||||
<div className="p-2.5 space-y-2">
|
<div className="p-2.5 space-y-2">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span className="material-symbols-outlined text-[14px] text-[#ff4500]">storage</span>
|
<span className="material-symbols-outlined text-[17px] text-[#ff4500]">storage</span>
|
||||||
<h2 className="text-[12px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">内存</h2>
|
<h2 className="text-[15px] font-bold tracking-[0.15em] uppercase text-[#e0e0e0]">内存</h2>
|
||||||
<span className="tech-sn">DDR5 32GB</span>
|
<span className="tech-sn">DDR5 32GB</span>
|
||||||
</div>
|
</div>
|
||||||
<BarGauge value={data.ramUsage} max={data.ramTotal} label="" unit="GB" color="#ff4500" />
|
<BarGauge value={data.ramUsage} max={data.ramTotal} label="" unit="GB" color="#ff4500" />
|
||||||
<p className="text-[12px] font-mono text-[#555] text-right">{data.ramUsage} / {data.ramTotal} GB</p>
|
<p className="text-[15px] font-mono text-[#555] text-right">{data.ramUsage} / {data.ramTotal} GB</p>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
{/* Status footer */}
|
{/* Status footer */}
|
||||||
<Card className="p-2 mt-auto" serial="HWM-01">
|
<Card className="p-2 mt-auto" serial="HWM-01">
|
||||||
<p className="text-[12px] font-mono text-[#555] leading-relaxed">
|
<p className="text-[15px] font-mono text-[#555] leading-relaxed">
|
||||||
[INFO] 数据模拟中。对接 MaqiangTangHardwareMonitor.exe 后显示真实传感器数据。
|
[INFO] 数据模拟中。对接 MaqiangTangHardwareMonitor.exe 后显示真实传感器数据。
|
||||||
</p>
|
</p>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -29,18 +29,18 @@ export default function Home() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col flex-1 gap-3 p-3">
|
<div className="flex flex-col flex-1 gap-4 p-3">
|
||||||
{/* 状态条 */}
|
{/* 状态条 */}
|
||||||
<Card className="flex items-center justify-between px-3 py-2" serial="SYS-01A">
|
<Card className="flex items-center justify-between px-4 py-2" serial="SYS-01A">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span className="w-1.5 h-1.5 bg-[#ff4500]" />
|
<span className="w-1.5 h-1.5 bg-[#ff4500]" />
|
||||||
<span className="text-[12px] font-semibold tracking-[0.12em] uppercase text-[#e0e0e0]">
|
<span className="text-[15px] font-semibold tracking-[0.12em] uppercase text-[#e0e0e0]">
|
||||||
{user ? `用户: ${user.username}` : '未登录'}
|
{user ? `用户: ${user.username}` : '未登录'}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={() => navigate(user ? '/settings' : '/login')}
|
onClick={() => navigate(user ? '/settings' : '/login')}
|
||||||
className="text-[12px] font-mono text-[#555] hover:text-[#ff4500] transition-colors duration-75"
|
className="text-[15px] font-mono text-[#555] hover:text-[#ff4500] transition-colors duration-75"
|
||||||
>
|
>
|
||||||
{user ? '设置 ▸' : '登录 ▸'}
|
{user ? '设置 ▸' : '登录 ▸'}
|
||||||
</button>
|
</button>
|
||||||
@@ -62,22 +62,22 @@ export default function Home() {
|
|||||||
|
|
||||||
{/* 外部链接(对齐原版) */}
|
{/* 外部链接(对齐原版) */}
|
||||||
<div className="flex items-center justify-center gap-6 border border-[#333] p-2">
|
<div className="flex items-center justify-center gap-6 border border-[#333] p-2">
|
||||||
<a href="#" className="text-[12px] font-semibold tracking-[0.1em] uppercase text-[#555] hover:text-[#888] transition-colors duration-75">社区教程</a>
|
<a href="#" className="text-[15px] font-semibold tracking-[0.1em] uppercase text-[#555] hover:text-[#888] transition-colors duration-75">社区教程</a>
|
||||||
<a href="#" className="text-[12px] font-semibold tracking-[0.1em] uppercase text-[#555] hover:text-[#888] transition-colors duration-75">微信</a>
|
<a href="#" className="text-[15px] font-semibold tracking-[0.1em] uppercase text-[#555] hover:text-[#888] transition-colors duration-75">微信</a>
|
||||||
<a href="#" className="text-[12px] font-semibold tracking-[0.1em] uppercase text-[#555] hover:text-[#888] transition-colors duration-75">官网</a>
|
<a href="#" className="text-[15px] font-semibold tracking-[0.1em] uppercase text-[#555] hover:text-[#888] transition-colors duration-75">官网</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 底部启动按钮 */}
|
{/* 底部启动按钮 */}
|
||||||
<div className="flex gap-2 border border-[#333] p-2">
|
<div className="flex gap-2 border border-[#333] p-2">
|
||||||
<button
|
<button
|
||||||
onClick={() => {}}
|
onClick={() => {}}
|
||||||
className="flex-1 border border-[#333] py-2 text-[12px] font-semibold tracking-[0.1em] uppercase text-[#555] hover:text-[#e0e0e0] hover:border-[#555] transition-colors duration-75"
|
className="flex-1 border border-[#333] py-2 text-[15px] font-semibold tracking-[0.1em] uppercase text-[#555] hover:text-[#e0e0e0] hover:border-[#555] transition-colors duration-75"
|
||||||
>
|
>
|
||||||
启动硬件监控
|
启动硬件监控
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => {}}
|
onClick={() => {}}
|
||||||
className="flex-1 border border-[#ff4500]/30 py-2 text-[12px] font-semibold tracking-[0.1em] uppercase text-[#ff4500] hover:bg-[#ff4500]/10 transition-colors duration-75"
|
className="flex-1 border border-[#ff4500]/30 py-2 text-[15px] font-semibold tracking-[0.1em] uppercase text-[#ff4500] hover:bg-[#ff4500]/10 transition-colors duration-75"
|
||||||
>
|
>
|
||||||
启动码枪堂 2.0
|
启动码枪堂 2.0
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -57,14 +57,14 @@ export default function Login() {
|
|||||||
{/* 关闭按钮 */}
|
{/* 关闭按钮 */}
|
||||||
<button
|
<button
|
||||||
onClick={() => callElectron('closeWindow')}
|
onClick={() => callElectron('closeWindow')}
|
||||||
className="absolute top-3 right-3 text-[#555] hover:text-[#cc3300] text-[14px] px-2 py-1 border border-[#333] hover:border-[#cc3300] transition-colors duration-75"
|
className="absolute top-3 right-3 text-[#555] hover:text-[#cc3300] text-[17px] px-2 py-1 border border-[#333] hover:border-[#cc3300] transition-colors duration-75"
|
||||||
>
|
>
|
||||||
✕
|
✕
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div className="text-center mb-6">
|
<div className="text-center mb-6">
|
||||||
<h1 className="text-[14px] font-bold tracking-[0.2em] uppercase text-[#e0e0e0]">码枪堂 2.0</h1>
|
<h1 className="text-[17px] font-bold tracking-[0.2em] uppercase text-[#e0e0e0]">码枪堂 2.0</h1>
|
||||||
<p className="text-[12px] font-mono text-[#555] mt-1">用户认证系统</p>
|
<p className="text-[15px] font-mono text-[#555] mt-1">用户认证系统</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Card className="w-full max-w-xs" serial="AUTH-01">
|
<Card className="w-full max-w-xs" serial="AUTH-01">
|
||||||
@@ -73,7 +73,7 @@ export default function Login() {
|
|||||||
<button
|
<button
|
||||||
key={t}
|
key={t}
|
||||||
onClick={() => setTab(t)}
|
onClick={() => setTab(t)}
|
||||||
className={`flex-1 py-2 text-[12px] font-semibold tracking-[0.12em] uppercase transition-colors duration-75
|
className={`flex-1 py-2 text-[15px] font-semibold tracking-[0.12em] uppercase transition-colors duration-75
|
||||||
border-r border-[#333] last:border-r-0
|
border-r border-[#333] last:border-r-0
|
||||||
${tab === t ? 'bg-[#ff4500]/10 text-[#ff4500]' : 'text-[#555] hover:text-[#888]'}`}
|
${tab === t ? 'bg-[#ff4500]/10 text-[#ff4500]' : 'text-[#555] hover:text-[#888]'}`}
|
||||||
>
|
>
|
||||||
@@ -91,7 +91,7 @@ export default function Login() {
|
|||||||
onChange={e => setCardKey(e.target.value)}
|
onChange={e => setCardKey(e.target.value)}
|
||||||
style={{ borderRadius: 0, borderColor: '#333', background: '#111', color: '#e0e0e0', fontSize: 10 }}
|
style={{ borderRadius: 0, borderColor: '#333', background: '#111', color: '#e0e0e0', fontSize: 10 }}
|
||||||
/>
|
/>
|
||||||
<Button variant="primary" size="sm" className="w-full text-[12px]" onClick={handleActivateVip} loading={loading}>
|
<Button variant="primary" size="sm" className="w-full text-[15px]" onClick={handleActivateVip} loading={loading}>
|
||||||
激活 VIP
|
激活 VIP
|
||||||
</Button>
|
</Button>
|
||||||
</>
|
</>
|
||||||
@@ -118,25 +118,25 @@ export default function Login() {
|
|||||||
style={{ borderRadius: 0, borderColor: '#333', background: '#111', color: '#e0e0e0', fontSize: 10 }}
|
style={{ borderRadius: 0, borderColor: '#333', background: '#111', color: '#e0e0e0', fontSize: 10 }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<Button variant="primary" size="sm" className="w-full text-[12px]" onClick={handleLogin} loading={loading}>
|
<Button variant="primary" size="sm" className="w-full text-[15px]" onClick={handleLogin} loading={loading}>
|
||||||
{tab === 'login' ? '登录' : '注册'}
|
{tab === 'login' ? '登录' : '注册'}
|
||||||
</Button>
|
</Button>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{error && (
|
{error && (
|
||||||
<p className="text-[12px] font-mono text-[#cc3300] border border-[#cc3300]/30 p-1.5 bg-[#cc3300]/5">
|
<p className="text-[15px] font-mono text-[#cc3300] border border-[#cc3300]/30 p-1.5 bg-[#cc3300]/5">
|
||||||
✕ {error}
|
✕ {error}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<p className="text-[12px] font-mono text-[#444] text-center">SYS-AUTH v1.0</p>
|
<p className="text-[15px] font-mono text-[#444] text-center">SYS-AUTH v1.0</p>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => navigate('/')}
|
onClick={() => navigate('/')}
|
||||||
className="mt-4 text-[12px] font-mono text-[#555] hover:text-[#888] transition-colors duration-75"
|
className="mt-4 text-[15px] font-mono text-[#555] hover:text-[#888] transition-colors duration-75"
|
||||||
>
|
>
|
||||||
← 返回桌面
|
← 返回桌面
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -64,10 +64,10 @@ export default function Optimization() {
|
|||||||
const memoryItems = items.filter(i => i.category === 'memory');
|
const memoryItems = items.filter(i => i.category === 'memory');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
{/* 标题 */}
|
{/* 标题 */}
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">快速优化</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">快速优化</h1>
|
||||||
<span className="tech-sn">PHASE-05</span>
|
<span className="tech-sn">PHASE-05</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ export default function Optimization() {
|
|||||||
size="sm"
|
size="sm"
|
||||||
onClick={handleOneClick}
|
onClick={handleOneClick}
|
||||||
loading={running}
|
loading={running}
|
||||||
className="flex-1 text-[12px]"
|
className="flex-1 text-[15px]"
|
||||||
>
|
>
|
||||||
⚡ 一键优化 ({items.filter(i => i.status !== 'optimized').length})
|
⚡ 一键优化 ({items.filter(i => i.status !== 'optimized').length})
|
||||||
</Button>
|
</Button>
|
||||||
@@ -105,7 +105,7 @@ export default function Optimization() {
|
|||||||
|
|
||||||
{/* 提示 */}
|
{/* 提示 */}
|
||||||
<Card className="p-2 mt-auto" serial="HINT-01">
|
<Card className="p-2 mt-auto" serial="HINT-01">
|
||||||
<p className="text-[12px] font-mono text-[#555] leading-relaxed">
|
<p className="text-[15px] font-mono text-[#555] leading-relaxed">
|
||||||
[提示] 快速优化需要管理员权限。部分优化项重启后生效。
|
[提示] 快速优化需要管理员权限。部分优化项重启后生效。
|
||||||
</p>
|
</p>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -53,9 +53,9 @@ export default function SchemeDetail() {
|
|||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">方案详情</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">方案详情</h1>
|
||||||
<span className="tech-sn">LOADING...</span>
|
<span className="tech-sn">LOADING...</span>
|
||||||
</div>
|
</div>
|
||||||
<Card className="p-4"><div className="h-20 animate-pulse bg-[#222]" /></Card>
|
<Card className="p-4"><div className="h-20 animate-pulse bg-[#222]" /></Card>
|
||||||
@@ -65,36 +65,36 @@ export default function SchemeDetail() {
|
|||||||
|
|
||||||
if (!scheme) {
|
if (!scheme) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">方案详情</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">方案详情</h1>
|
||||||
<span className="tech-sn">404</span>
|
<span className="tech-sn">404</span>
|
||||||
</div>
|
</div>
|
||||||
<Card className="p-3" serial="ERR-01">
|
<Card className="p-3" serial="ERR-01">
|
||||||
<p className="text-[12px] font-mono text-[#555]">方案未找到或已删除</p>
|
<p className="text-[15px] font-mono text-[#555]">方案未找到或已删除</p>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">方案详情</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">方案详情</h1>
|
||||||
</div>
|
</div>
|
||||||
{scheme.isOfficial && <span className="text-[12px] font-semibold tracking-[0.1em] uppercase text-[#ff4500] border border-[#ff4500]/30 px-1 py-0.5">官方</span>}
|
{scheme.isOfficial && <span className="text-[15px] font-semibold tracking-[0.1em] uppercase text-[#ff4500] border border-[#ff4500]/30 px-1 py-0.5">官方</span>}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Card serial={`SCM-${scheme.id.slice(0, 4)}`}>
|
<Card serial={`SCM-${scheme.id.slice(0, 4)}`}>
|
||||||
<div className="p-3 space-y-2">
|
<div className="p-3 space-y-2">
|
||||||
<h2 className="text-[12px] font-bold tracking-[0.1em] uppercase">{scheme.title || '未命名方案'}</h2>
|
<h2 className="text-[15px] font-bold tracking-[0.1em] uppercase">{scheme.title || '未命名方案'}</h2>
|
||||||
{scheme.weaponName && <p className="text-[12px] font-mono text-[#555]">武器: {scheme.weaponName}</p>}
|
{scheme.weaponName && <p className="text-[15px] font-mono text-[#555]">武器: {scheme.weaponName}</p>}
|
||||||
{scheme.user?.username && <p className="text-[12px] font-mono text-[#555]">作者: {scheme.user.username}</p>}
|
{scheme.user?.username && <p className="text-[15px] font-mono text-[#555]">作者: {scheme.user.username}</p>}
|
||||||
{scheme.price > 0 && <p className="text-[12px] font-mono text-[#555]">价格: {scheme.price}</p>}
|
{scheme.price > 0 && <p className="text-[15px] font-mono text-[#555]">价格: {scheme.price}</p>}
|
||||||
|
|
||||||
<div className="flex items-center gap-3 text-[12px] font-mono text-[#555] border-t border-[#333] pt-2">
|
<div className="flex items-center gap-4 text-[15px] font-mono text-[#555] border-t border-[#333] pt-2">
|
||||||
<span>👁 浏览 {scheme.viewsCount}</span>
|
<span>👁 浏览 {scheme.viewsCount}</span>
|
||||||
<span>⬇ 下载 {scheme.downloadsCount}</span>
|
<span>⬇ 下载 {scheme.downloadsCount}</span>
|
||||||
<span>👍 点赞 {scheme.likesCount}</span>
|
<span>👍 点赞 {scheme.likesCount}</span>
|
||||||
@@ -104,8 +104,8 @@ export default function SchemeDetail() {
|
|||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<Button variant="primary" size="sm" className="flex-1 text-[12px]" onClick={handleUse}>使用方案</Button>
|
<Button variant="primary" size="sm" className="flex-1 text-[15px]" onClick={handleUse}>使用方案</Button>
|
||||||
<Button variant="ghost" size="sm" className="text-[12px]" onClick={handleFavorite}>
|
<Button variant="ghost" size="sm" className="text-[15px]" onClick={handleFavorite}>
|
||||||
{isFavorited ? '★ 已收藏' : '☆ 收藏'}
|
{isFavorited ? '★ 已收藏' : '☆ 收藏'}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,16 +3,16 @@ import Card from '../components/ui/Card';
|
|||||||
|
|
||||||
export default function Settings() {
|
export default function Settings() {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">设置</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">设置</h1>
|
||||||
<span className="tech-sn">CFG-01</span>
|
<span className="tech-sn">CFG-01</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Card serial="CFG-ACT">
|
<Card serial="CFG-ACT">
|
||||||
<div className="p-3">
|
<div className="p-3">
|
||||||
<h2 className="text-[12px] font-bold tracking-[0.12em] uppercase mb-2">账户</h2>
|
<h2 className="text-[15px] font-bold tracking-[0.12em] uppercase mb-2">账户</h2>
|
||||||
<div className="space-y-1.5 text-[12px] font-mono text-[#555]">
|
<div className="space-y-1.5 text-[15px] font-mono text-[#555]">
|
||||||
<p>用户状态: 未登录</p>
|
<p>用户状态: 未登录</p>
|
||||||
<p>VIP: 未激活</p>
|
<p>VIP: 未激活</p>
|
||||||
<p>设备ID: maqt-desktop-01</p>
|
<p>设备ID: maqt-desktop-01</p>
|
||||||
@@ -22,8 +22,8 @@ export default function Settings() {
|
|||||||
|
|
||||||
<Card serial="CFG-APP">
|
<Card serial="CFG-APP">
|
||||||
<div className="p-3">
|
<div className="p-3">
|
||||||
<h2 className="text-[12px] font-bold tracking-[0.12em] uppercase mb-2">应用</h2>
|
<h2 className="text-[15px] font-bold tracking-[0.12em] uppercase mb-2">应用</h2>
|
||||||
<div className="space-y-1.5 text-[12px] font-mono text-[#555]">
|
<div className="space-y-1.5 text-[15px] font-mono text-[#555]">
|
||||||
<p>版本: 0.2.1</p>
|
<p>版本: 0.2.1</p>
|
||||||
<p>API: 待配置</p>
|
<p>API: 待配置</p>
|
||||||
<p>代理: 无</p>
|
<p>代理: 无</p>
|
||||||
@@ -32,7 +32,7 @@ export default function Settings() {
|
|||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card className="p-2 mt-auto" serial="HINT-02">
|
<Card className="p-2 mt-auto" serial="HINT-02">
|
||||||
<p className="text-[12px] font-mono text-[#555] leading-relaxed">更多设置项开发中</p>
|
<p className="text-[15px] font-mono text-[#555] leading-relaxed">更多设置项开发中</p>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -77,16 +77,16 @@ export default function WeaponSchemes() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
{/* 标题 */}
|
{/* 标题 */}
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">改枪方案</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">改枪方案</h1>
|
||||||
<div className="flex gap-1">
|
<div className="flex gap-1">
|
||||||
{(['hot', 'new'] as const).map(s => (
|
{(['hot', 'new'] as const).map(s => (
|
||||||
<button
|
<button
|
||||||
key={s}
|
key={s}
|
||||||
onClick={() => { setSort(s); setPage(1); }}
|
onClick={() => { setSort(s); setPage(1); }}
|
||||||
className={`px-2 py-1 text-[12px] font-semibold tracking-[0.08em] uppercase border transition-colors duration-75
|
className={`px-2 py-1 text-[15px] font-semibold tracking-[0.08em] uppercase border transition-colors duration-75
|
||||||
${sort === s ? 'border-[#ff4500] text-[#ff4500] bg-[#ff4500]/10' : 'border-[#333] text-[#555] hover:border-[#555]'}`}
|
${sort === s ? 'border-[#ff4500] text-[#ff4500] bg-[#ff4500]/10' : 'border-[#333] text-[#555] hover:border-[#555]'}`}
|
||||||
>
|
>
|
||||||
{s === 'hot' ? '🔥 热门' : '🕐 最新'}
|
{s === 'hot' ? '🔥 热门' : '🕐 最新'}
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ import Card from '../components/ui/Card';
|
|||||||
|
|
||||||
export default function XixiHaha() {
|
export default function XixiHaha() {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 p-3 flex-1">
|
<div className="flex flex-col gap-4 p-4 flex-1">
|
||||||
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
<div className="flex items-center justify-between border-b border-[#333] pb-2">
|
||||||
<h1 className="text-[13px] font-bold tracking-[0.15em] uppercase">神秘力量</h1>
|
<h1 className="text-[34px] font-bold tracking-[0.15em] uppercase">神秘力量</h1>
|
||||||
<span className="tech-sn">DEV-03</span>
|
<span className="tech-sn">DEV-03</span>
|
||||||
</div>
|
</div>
|
||||||
<Card className="p-3" serial="WIP-03">
|
<Card className="p-3" serial="WIP-03">
|
||||||
<p className="text-[12px] font-mono text-[#555]">此功能开发中</p>
|
<p className="text-[15px] font-mono text-[#555]">此功能开发中</p>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
background: #1a1a1a;
|
background: #1a1a1a;
|
||||||
color: #e0e0e0;
|
color: #e0e0e0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-size: 14px;
|
font-size: 16px;
|
||||||
line-height: 1.6;
|
line-height: 1.65;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
font-family: 'Material Symbols Outlined';
|
font-family: 'Material Symbols Outlined';
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-size: 22px;
|
font-size: 24px;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
letter-spacing: normal;
|
letter-spacing: normal;
|
||||||
text-transform: none;
|
text-transform: none;
|
||||||
@@ -37,17 +37,17 @@
|
|||||||
word-wrap: normal;
|
word-wrap: normal;
|
||||||
direction: ltr;
|
direction: ltr;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
font-variation-settings: 'FILL' 0, 'wght' 300, 'GRAD' 0, 'opsz' 22;
|
font-variation-settings: 'FILL' 0, 'wght' 300, 'GRAD' 0, 'opsz' 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tech-tag {
|
.tech-tag {
|
||||||
@apply text-[11px] tracking-[0.15em] uppercase font-mono;
|
@apply text-[13px] tracking-[0.15em] uppercase font-mono;
|
||||||
color: #555;
|
color: #555;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tech-sn {
|
.tech-sn {
|
||||||
font-family: 'JetBrains Mono', monospace;
|
font-family: 'JetBrains Mono', monospace;
|
||||||
font-size: 10px;
|
font-size: 12px;
|
||||||
letter-spacing: 0.1em;
|
letter-spacing: 0.1em;
|
||||||
color: #444;
|
color: #444;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
|
|||||||
Reference in New Issue
Block a user