- 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.
25 lines
1 KiB
TypeScript
25 lines
1 KiB
TypeScript
"use client";
|
|
|
|
import { useI18n } from "@/lib/i18n";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
/**
|
|
* The faint "AI can make mistakes" note for surfaces that show model output:
|
|
* under the chat composer, next to the generation buttons and results of the
|
|
* homework and deck wizards, and under AI grading feedback. One component so
|
|
* the copy, the style and the translations stay in one place.
|
|
*
|
|
* --text-subtle is the muted helper token and is documented at 5.6:1 (light)
|
|
* and 8.6:1 (dark), so the note stays readable at this size.
|
|
*/
|
|
export function AiDisclaimer({ className, plain = false }: { className?: string; plain?: boolean }) {
|
|
const { t } = useI18n();
|
|
return (
|
|
// hint-line: Aero gives this its own glass chip (it sits on the wallpaper).
|
|
// Where the note already sits on a glass panel (the chat composer), `plain`
|
|
// keeps it plain centered text like the other themes.
|
|
<p className={cn(!plain && "hint-line", "text-center text-[11.5px] leading-snug text-[var(--text-subtle)]", className)}>
|
|
{t("common.aiDisclaimer")}
|
|
</p>
|
|
);
|
|
}
|