de7da9f1db
- 在 tailwind.config.js 中启用 darkMode: 'class' 并扩展语义化颜色变量 - 将全项目硬编码颜色(bg-white、text-gray-*、border-gray-* 等)替换为语义化类名 - 修复 popup/index.html 硬编码浅色背景色 - 同步更新相关单元测试中的类名断言
65 lines
2.0 KiB
TypeScript
65 lines
2.0 KiB
TypeScript
import type { StorageCleanerOptions } from '@/types/storage';
|
|
import OptionItem from './OptionItem';
|
|
import { useLazyTranslation } from '@/utils/useLazyTranslation';
|
|
|
|
interface StorageOptionsGridProps {
|
|
options: StorageCleanerOptions;
|
|
sizes: Record<string, number>;
|
|
allSelected: boolean;
|
|
someSelected: boolean;
|
|
onOptionChange: (key: keyof StorageCleanerOptions) => void;
|
|
onSelectAll: (checked: boolean) => void;
|
|
}
|
|
|
|
export default function StorageOptionsGrid({
|
|
options,
|
|
sizes,
|
|
allSelected,
|
|
someSelected: _someSelected,
|
|
onOptionChange,
|
|
onSelectAll,
|
|
}: StorageOptionsGridProps) {
|
|
const { t } = useLazyTranslation('storageCleaner');
|
|
|
|
const optionKeys: { key: keyof StorageCleanerOptions; isCount?: boolean }[] = [
|
|
{ key: 'localStorage' },
|
|
{ key: 'sessionStorage' },
|
|
{ key: 'indexedDB' },
|
|
{ key: 'cookies' },
|
|
{ key: 'cacheStorage', isCount: true },
|
|
{ key: 'serviceWorkers', isCount: true },
|
|
];
|
|
|
|
return (
|
|
<div className="mb-3 border rounded-lg bg-background shadow-sm overflow-hidden transition-all hover:shadow-md">
|
|
<div className="p-3">
|
|
<div className="grid grid-cols-2 gap-3">
|
|
{optionKeys.map(({ key, isCount }) => (
|
|
<div key={key}>
|
|
<OptionItem
|
|
labelKey={`storageCleaner:options.${key}`}
|
|
checked={options[key]}
|
|
size={sizes[key]}
|
|
isCount={isCount}
|
|
onChange={() => onOptionChange(key)}
|
|
/>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
<div className="border-t" />
|
|
<div className="flex justify-between items-center px-5 py-2 transition-colors hover:bg-muted rounded-b-lg">
|
|
<span className="text-xs font-bold text-muted-foreground">
|
|
{t('storageCleaner:selectAll')}
|
|
</span>
|
|
<input
|
|
type="checkbox"
|
|
checked={allSelected}
|
|
onChange={(e) => onSelectAll(e.target.checked)}
|
|
className="h-4 w-4 rounded border-input text-amber-500 focus:ring-amber-500"
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|