"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 (
);
}
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) => (
onChange(opt.value)}
className={cn(
"min-w-[64px] px-3 py-1 text-xs font-mono transition-colors text-center",
value === opt.value
? "bg-[var(--color-cyan)]/20 text-[var(--color-cyan)]"
: "bg-[var(--color-glass)] text-[var(--color-fg-dim)] hover:text-[var(--color-fg)]",
)}
>
{opt.label}
))}
);
}
function ToggleRow({
label,
description,
value,
onChange,
}: {
label: string;
description?: string;
value: boolean;
onChange: (v: boolean) => void;
}) {
return (
{label}
{description && (
{description}
)}
onChange(!value)}
className={cn(
"relative w-11 h-6 rounded-full border transition-colors flex-shrink-0",
value
? "bg-[var(--color-cyan)]/30 border-[var(--color-cyan)]"
: "bg-[var(--color-glass)] border-[var(--color-glass-border-strong)]"
)}
>
);
}