copy: the thinking-field placeholders, the brief round (release polish 5)

Four placeholders rewritten per the owner's set (2026-10-07): the
thinking fields are an invitation to stream-of-consciousness transfer,
and everything else is implied by the field's existence — no "the
teacher reads all of this", no mechanism, no em dashes, nothing that
wraps. The reading field's placeholder no longer breaks to a second
line.

  quiz:     "Why this answer? Whatever comes to mind."
  reading:  "Whatever comes to mind as you read."
  practice: "Work here, think out loud."
  pause:    "Ask anything, or press Enter for the next one."

The answer-field placeholders ("Type your answer…") stay: brief and
functional already (owner ruling). Quiz placeholder pin updated.

1428 tests, tsc, lint, build green.
This commit is contained in:
amosblomqvist
2026-10-07 11:03:54 +03:00
parent f979e35f57
commit bab0d3f94d
5 changed files with 5 additions and 5 deletions
+1 -1
View File
@@ -1574,7 +1574,7 @@ export function Chat({
// applies. // applies.
nextProblem={nextReady} nextProblem={nextReady}
onNext={sendNext} onNext={sendNext}
placeholder={nextReady ? "Ask about this problem — or press Enter for the next one…" : undefined} placeholder={nextReady ? "Ask anything, or press Enter for the next one." : undefined}
/> />
} }
onSubmitAnswer={(output) => { onSubmitAnswer={(output) => {
+1 -1
View File
@@ -143,7 +143,7 @@ export function PracticeDock({ problemCallId, input, expanded, onExpand, onSubmi
submit(); submit();
} }
}} }}
placeholder="Work here — say as much of your thinking as you have." placeholder="Work here, think out loud."
rows={4} rows={4}
className={cn( className={cn(
"field-sizing-content lh-input max-h-64 min-h-16 w-full resize-none bg-transparent px-2.5 pb-2 outline-none placeholder:text-muted-foreground", "field-sizing-content lh-input max-h-64 min-h-16 w-full resize-none bg-transparent px-2.5 pb-2 outline-none placeholder:text-muted-foreground",
+1 -1
View File
@@ -853,7 +853,7 @@ function QuestionDockForm({
submit(); submit();
} }
}} }}
placeholder="Why this answer? What are you unsure about? Say as much as you like — the teacher reads all of this." placeholder="Why this answer? Whatever comes to mind."
rows={1} rows={1}
className={cn( className={cn(
"field-sizing-content lh-input max-h-48 w-full resize-none bg-transparent px-2.5 py-2 outline-none placeholder:text-muted-foreground/70", "field-sizing-content lh-input max-h-48 w-full resize-none bg-transparent px-2.5 py-2 outline-none placeholder:text-muted-foreground/70",
+1 -1
View File
@@ -85,7 +85,7 @@ export function ReadingThinkingField({
e.currentTarget.blur(); e.currentTarget.blur();
} }
}} }}
placeholder="What are you thinking as you read? Say as much as you like — it rides your next check answer to the teacher." placeholder="Whatever comes to mind as you read."
rows={1} rows={1}
className="field-sizing-content lh-input max-h-40 w-full resize-none bg-transparent outline-none placeholder:text-muted-foreground/70" className="field-sizing-content lh-input max-h-40 w-full resize-none bg-transparent outline-none placeholder:text-muted-foreground/70"
/> />
+1 -1
View File
@@ -143,7 +143,7 @@ describe("render smoke tests", () => {
// INSIDE the dock — never called optional, inviting the dump. // INSIDE the dock — never called optional, inviting the dump.
assert.ok(html.includes('data-testid="thinking-field"'), "thinking field present"); assert.ok(html.includes('data-testid="thinking-field"'), "thinking field present");
assert.match(html, /YOUR THINKING/, "labeled as the learner's voice (all caps, owner round 3)"); assert.match(html, /YOUR THINKING/, "labeled as the learner's voice (all caps, owner round 3)");
assert.match(html, /Why this answer\? What are you unsure about\?/, "placeholder invites, not apologizes"); assert.match(html, /Why this answer\? Whatever comes to mind/, "placeholder invites, not apologizes (owner, placeholder round 2026-10-07)");
assert.ok(!html.includes("optional"), "the field is never called optional"); assert.ok(!html.includes("optional"), "the field is never called optional");
assert.match(html, /Submit answer/, "send becomes Submit answer"); assert.match(html, /Submit answer/, "send becomes Submit answer");
assert.match(html, /↵ submits · ⇧↵ newline/, "the standard chord is discoverable (owner round 5)"); assert.match(html, /↵ submits · ⇧↵ newline/, "the standard chord is discoverable (owner round 5)");