"use client"; import { useSettings } from "./SettingsProvider"; import { PurgeOrphansButton } from "./PurgeOrphansButton"; import { ReorganizeButton } from "./ReorganizeButton"; import { RegenThumbnailsButton } from "./RegenThumbnailsButton"; import { UndersizedCoversButton } from "./UndersizedCoversButton"; import { NearDupesButton } from "./NearDupesButton"; import { ReparseCodesButton } from "./ReparseCodesButton"; import { ClearCacheButton } from "./ClearCacheButton"; import { BackupButtons } from "./BackupButtons"; import { cn } from "@/lib/utils"; /** Display group: grid columns + fade transitions. */ export function DisplayGroup() { const { settings, set } = useSettings(); return (
set("gridColumns", v)} format={(v) => `${v} per row`} /> set("gridColumnsPortrait", v)} format={(v) => `${v} per row`} /> set("coverPageSize", v)} format={(v) => `${v} per page`} /> set("paginationMode", v as "url" | "scroll")} /> set("fadeTransitions", v)} /> {settings.fadeTransitions && ( set("fadeDurationMs", v)} format={(v) => (v >= 1000 ? `${(v / 1000).toFixed(2)}s` : `${v}ms`)} /> )}
); } /** Trash & deletion group. */ export function TrashGroup() { const { settings, set } = useSettings(); return (
set("useRecycleBin", v)} /> {settings.useRecycleBin && ( set("trashRetentionDays", v)} format={(v) => v === 0 ? "Forever" : `${v} day${v === 1 ? "" : "s"}`} /> )} set("purgeFilesOnDelete", v)} /> set("supersededRetentionDays", v)} format={(v) => v === 0 ? "Forever" : `${v} day${v === 1 ? "" : "s"}`} />
); } /** Maintenance buttons group. */ export function MaintenanceGroup() { return (
); } /** Backup group. */ export function BackupGroup() { return (
); } /** Legacy combined view — preserved for any caller still rendering all * groups inline. The new SettingsPanel layouts use the individual * exports above. */ export function SettingsToggles() { return (
); } function Group({ title, children }: { title: string; children: React.ReactNode }) { return (
{title}
{children}
); } function SliderRow({ label, description, min, max, step, value, onChange, format, }: { label: string; description?: string; min: number; max: number; step: number; value: number; onChange: (v: number) => void; format?: (v: number) => string; }) { return (
{label}
{description && (
{description}
)}
{format ? format(value) : value}
onChange(Number(e.target.value))} className="w-full accent-[var(--color-cyan)]" />
); } function SegmentedRow({ label, description, value, options, onChange, }: { label: string; description?: string; value: T; options: ReadonlyArray<{ value: T; label: string }>; onChange: (v: T) => void; }) { return (
{label}
{description && (
{description}
)}
{options.map((opt) => ( ))}
); } function ToggleRow({ label, description, value, onChange, }: { label: string; description?: string; value: boolean; onChange: (v: boolean) => void; }) { return (
{label}
{description && (
{description}
)}
); }