diff --git a/frontend/src/app/settings/page.tsx b/frontend/src/app/settings/page.tsx index 72f663b6..f925cd31 100644 --- a/frontend/src/app/settings/page.tsx +++ b/frontend/src/app/settings/page.tsx @@ -47,9 +47,9 @@ export default function SettingsPage() { }); return ( -
+
-
+
@@ -63,7 +63,7 @@ export default function SettingsPage() { Settings
-

+

Appearance, local AI, privacy, and retention.

@@ -88,7 +88,12 @@ export default function SettingsPage() {
-
+ {/* The single-column track must be minmax(0,1fr), not the implicit + `auto`. An auto track sizes to max-content, so one non-wrapping + value in the About card stretched the column to ~650px inside a + 358px container and pushed the whole page into horizontal scroll + on phones. */} +
@@ -122,7 +127,7 @@ export function AiRuntimeSettings({ onChange={(event) => onModeChange(event.target.value as "disabled" | "full" | "mock") } - className="mt-3 h-11 w-full rounded-xl border border-[color:var(--frost)] bg-[color:var(--void)] px-3 text-sm text-[color:var(--near-white)] outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--blue)] sm:max-w-xs" + className="mt-3 h-11 w-full rounded-xl border border-[color:var(--frost)] bg-[color:var(--void)] px-3 text-sm text-[color:var(--near-white)] outline-none transition hover:border-[color:var(--frost-strong)] focus-visible:ring-2 focus-visible:ring-[color:var(--blue)] disabled:cursor-wait disabled:opacity-60 sm:max-w-xs" > {mode && !supportedModes.includes(mode) && (
- + Change the installed build

diff --git a/frontend/src/components/appearance-settings.tsx b/frontend/src/components/appearance-settings.tsx index 0d40288e..bcab9152 100644 --- a/frontend/src/components/appearance-settings.tsx +++ b/frontend/src/components/appearance-settings.tsx @@ -26,9 +26,12 @@ export function AppearanceSettings() {

-

+

Appearance

@@ -39,7 +42,7 @@ export function AppearanceSettings() { {OPTIONS.map(({ value: option, label, icon: Icon }) => (

diff --git a/frontend/src/components/map-privacy-settings.tsx b/frontend/src/components/map-privacy-settings.tsx index 39fc3bb7..978b7759 100644 --- a/frontend/src/components/map-privacy-settings.tsx +++ b/frontend/src/components/map-privacy-settings.tsx @@ -49,12 +49,17 @@ export function MapPrivacySettings({ aria-checked={checked} disabled={enabled === undefined || pending} onClick={() => onChange(!checked)} - className="relative h-7 w-12 shrink-0 rounded-full border border-[color:var(--frost-strong)] bg-[color:var(--surface-hover)] transition disabled:cursor-wait disabled:opacity-50 aria-checked:border-[color:var(--near-white)] aria-checked:bg-[color:var(--near-white)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--blue)] focus-visible:ring-offset-2 focus-visible:ring-offset-[color:var(--void)]" + aria-busy={pending} + className="relative h-7 w-12 shrink-0 rounded-full border border-[color:var(--frost-strong)] bg-[color:var(--surface-hover)] transition before:absolute before:-inset-2 before:content-[''] hover:border-[color:var(--frost-strong)] active:scale-95 disabled:cursor-wait disabled:opacity-50 aria-checked:border-[color:var(--near-white)] aria-checked:bg-[color:var(--near-white)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--blue)] focus-visible:ring-offset-2 focus-visible:ring-offset-[color:var(--void)]" >
@@ -86,7 +91,7 @@ export function MapPrivacySettings({ {checked && ( Open map diff --git a/frontend/src/components/trash-retention-settings.tsx b/frontend/src/components/trash-retention-settings.tsx index 589f5c7e..1c6e05ac 100644 --- a/frontend/src/components/trash-retention-settings.tsx +++ b/frontend/src/components/trash-retention-settings.tsx @@ -1,6 +1,7 @@ "use client"; import { Clock3, Info } from "lucide-react"; +import { useId, useState } from "react"; interface TrashRetentionSettingsProps { value: number; @@ -15,6 +16,9 @@ export function TrashRetentionSettings({ pending, onChange, }: TrashRetentionSettingsProps) { + const [showInfo, setShowInfo] = useState(false); + const infoId = useId(); + return (
- +
@@ -53,7 +77,7 @@ export function TrashRetentionSettings({ disabled={pending} aria-pressed={value === days} onClick={() => onChange(days)} - className={`rounded-xl border px-4 py-2 text-sm transition ${ + className={`min-h-11 rounded-xl border px-4 py-2 text-sm font-medium outline-none transition active:scale-[0.98] focus-visible:ring-2 focus-visible:ring-[color:var(--blue)] disabled:cursor-wait disabled:opacity-60 ${ value === days ? "border-[color:var(--near-white)] bg-[color:var(--near-white)] text-[color:var(--void)]" : "border-[color:var(--frost)] text-[color:var(--silver)] hover:bg-[color:var(--surface-hover)]" @@ -62,7 +86,7 @@ export function TrashRetentionSettings({ {days === 0 ? "Never" : `${days} days`} ))} -