ui: round 6 — Enter submits from anywhere; model dashes ACTUALLY kept; dumbbell right

- ENTER SUBMITS REGARDLESS OF FOCUS (owner): dictation means the dock
  fields are rarely focused. New useEnterSubmits hook — a window-level
  listener inside both docks (mounted only while a problem/question is
  active). Plain Enter anywhere outside a typing surface submits the
  practice thinking / the teaching answer; typing surfaces keep their
  own handlers, buttons keep their click-activation (the collapsed
  Problem bar still expands on Enter), modified Enters untouched.
  Teaching sessions get the same law as practice — one standard.
- MODEL DASHES: the round-5 join("-") edit never landed (the batch
  script aborted on an earlier assert before reaching it) — the source
  still joined with spaces while the commit message claimed otherwise.
  Now actually joined with dashes: 'glm-5.3-flash' everywhere (picker,
  setup dialog, stats bar); pins updated to match.
- SIDEBAR: the practice dumbbell moves to the far right of the session
  row — titles sit flush with teaching rows, cleaner list.
This commit is contained in:
amosblomqvist
2026-10-05 05:18:26 +03:00
parent a2cddb4dca
commit f4775ebc93
7 changed files with 80 additions and 18 deletions
+7
View File
@@ -5,6 +5,7 @@ import { ChevronRightIcon } from "lucide-react";
import { MessageResponse } from "@/components/ai-elements/message";
import { Button } from "@/components/ui/button";
import { joinDictation, useDictationTarget } from "@/components/dictation";
import { useEnterSubmits } from "@/components/enter-submits";
import { cn } from "@/lib/utils";
/**
@@ -69,6 +70,12 @@ export function PracticeDock({ problemCallId, input, expanded, onExpand, onSubmi
onSubmit(text);
};
/* ENTER SUBMITS FROM ANYWHERE (owner round 6, 2026-10-05): dictation
* means the field is often never focused — the window-level Enter
* (typing surfaces and buttons excluded) submits the trace. Mounted
* while the dock is — collapsed bar included (the trace survives). */
useEnterSubmits(submit);
/* ── the collapsed bar ── */
if (!expanded) {
return (