Design pass (all themes + chat UI), model picker, reduce-motion toggle
- Aero: blue gradients back on the active segment and every primary
(Review due, the card's Study button, the composer's send button); a
frosted backing behind the page heading and the All decks label; a
bottom-weighted rail tint; chat header/composer/welcome panels; calmer
orbs; stronger card veil + a stronger blur bake.
- Dark/Light: a dedicated --track token makes progress bars read (the
first attempt shifted --surface-sunken and the pixel scan caught the
sheet-contrast regression); brighter dark secondary text; darker light
segmented labels and difficulty tints; stronger light card border and
shadow.
- Chat UI: friendly model chip ("Gemma 4 31B") with the raw name in a
tooltip, larger chips, plain centered disclaimer, vertically centered
welcome panel, distinct chat-plus icon for new chat.
- Chat models: every chat-capable model from the server's /api/tags is
selectable (favourites first, search field when long, live-list
validation in the route); default CHAT_MODEL_DEFAULT or gemma4:31b.
- Reduce motion: Settings toggle (default off) that parks the scene,
collapses CSS animations and drives framer-motion's calm mode.
- Folders hint, "New" badge on fresh decks.
Contrast: 0 findings, axe clean, mobile 126/126, chat 102/102, wizard
95/95, regression 44/44, i18n 13/13, native 33/33.
Version 0.4.6, SW -> freezmo-v71.
This commit is contained in:
parent
b70b0e83cf
commit
6635b5d405
29 changed files with 468 additions and 90 deletions
|
|
@ -13,6 +13,7 @@ import { ModelErrorActions } from "@/components/ModelErrorActions";
|
|||
import { DataSection } from "@/components/DataSection";
|
||||
import { LearningSection } from "@/components/LearningSection";
|
||||
import { ThemeSection } from "@/components/ThemeSection";
|
||||
import { useReducedMotionPref } from "@/lib/motion-pref";
|
||||
import { SyncSection } from "@/components/SyncSection";
|
||||
import { clearApiKey, saveSettings, settingsStore } from "@/lib/settings";
|
||||
import { useBackClose } from "@/lib/use-back-close";
|
||||
|
|
@ -54,6 +55,7 @@ export function SettingsDialog({
|
|||
focusField?: { field: "key"; nonce: number } | null;
|
||||
}) {
|
||||
const { health, loading, error, refresh, apiKey, checkedAt } = useHealth();
|
||||
const { reduced: reducedMotion, setReduced: setReducedMotion } = useReducedMotionPref();
|
||||
const installAvailable = useInstallAvailable();
|
||||
const { locale, setLocale, t, plural } = useI18n();
|
||||
const version = useVersion();
|
||||
|
|
@ -411,6 +413,19 @@ export function SettingsDialog({
|
|||
{/* ------------------------------------------- theme */}
|
||||
<ThemeSection />
|
||||
|
||||
{/* --------------------------------------- motion */}
|
||||
<section className="mb-4 space-y-2 rounded-2xl border border-[var(--hairline)] bg-[var(--surface-sunken)] p-3">
|
||||
<ToggleRow
|
||||
label={t("settings.reduceMotion")}
|
||||
note={t("settings.reduceMotionNote")}
|
||||
checked={reducedMotion}
|
||||
onChange={() => {
|
||||
setReducedMotion(!reducedMotion);
|
||||
haptic("toggle");
|
||||
}}
|
||||
/>
|
||||
</section>
|
||||
|
||||
{/* ----------------------------------------- learning */}
|
||||
<LearningSection level={3} />
|
||||
|
||||
|
|
@ -773,6 +788,19 @@ export function SettingsDialog({
|
|||
{/* ------------------------------------------- theme */}
|
||||
<ThemeSection />
|
||||
|
||||
{/* --------------------------------------- motion */}
|
||||
<section className="mb-4 space-y-2 rounded-2xl border border-[var(--hairline)] bg-[var(--surface-sunken)] p-3">
|
||||
<ToggleRow
|
||||
label={t("settings.reduceMotion")}
|
||||
note={t("settings.reduceMotionNote")}
|
||||
checked={reducedMotion}
|
||||
onChange={() => {
|
||||
setReducedMotion(!reducedMotion);
|
||||
haptic("toggle");
|
||||
}}
|
||||
/>
|
||||
</section>
|
||||
|
||||
{/* ----------------------------------------- learning */}
|
||||
<LearningSection level={3} />
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue