From cec6620c0039af0e544f5f3f76937daddbfedd86 Mon Sep 17 00:00:00 2001 From: mptyl Date: Fri, 3 Jul 2026 18:15:48 +0200 Subject: [PATCH] =?UTF-8?q?feat(widgets):=20redesign=20gate=20widgets=20?= =?UTF-8?q?=E2=80=94=20readable=20hierarchy,=20prominent=20select-all,=20s?= =?UTF-8?q?tyled=20controls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Titles + intro read as a clear prompt (comfortable line length), options as spaced choice rows, Other/Back/Exit as discreet secondary controls under a divider. Multiselect gets a prominent Select all/Deselect all at the head of the list with a live count. Co-Authored-By: Claude Opus 4.8 --- frontend/src/widgets/FreetextWidget.tsx | 23 +++++-- frontend/src/widgets/MultiselectWidget.tsx | 77 +++++++++++++--------- frontend/src/widgets/ReservedControls.tsx | 13 ++-- frontend/src/widgets/SelectWidget.tsx | 38 +++++++++-- 4 files changed, 102 insertions(+), 49 deletions(-) diff --git a/frontend/src/widgets/FreetextWidget.tsx b/frontend/src/widgets/FreetextWidget.tsx index ae1d1655..ea403fc0 100644 --- a/frontend/src/widgets/FreetextWidget.tsx +++ b/frontend/src/widgets/FreetextWidget.tsx @@ -1,12 +1,27 @@ import { useState } from "react"; import type { WidgetProps } from "./types"; + export function FreetextWidget({ descriptor, onRespond }: WidgetProps) { const [text, setText] = useState(""); return ( -
- {descriptor.title &&

{descriptor.title}

} -