diff --git a/docs/branch-review-records/f6bc87b54552154ddb96185d4bf0f13acd31d9593bdb3a4654fdeaa67a98fd07.record.md b/docs/branch-review-records/f6bc87b54552154ddb96185d4bf0f13acd31d9593bdb3a4654fdeaa67a98fd07.record.md new file mode 100644 index 0000000000..05046a4009 --- /dev/null +++ b/docs/branch-review-records/f6bc87b54552154ddb96185d4bf0f13acd31d9593bdb3a4654fdeaa67a98fd07.record.md @@ -0,0 +1 @@ +| 2026-08-23 | 2316 | 28cbce0630dc7bc2f9cf9f48989186cf9a9840fa | dictionary catalogue control row and CI failure | fixed | design-system-contract,design-system-adoption,format-changed,vitest-focused,merge-tree | diff --git a/src/components/dictionary/dictionary-catalogue-pages.tsx b/src/components/dictionary/dictionary-catalogue-pages.tsx index 97496639bd..b2059fb584 100644 --- a/src/components/dictionary/dictionary-catalogue-pages.tsx +++ b/src/components/dictionary/dictionary-catalogue-pages.tsx @@ -121,9 +121,13 @@ function catalogueNoun(scope: DictionaryCatalogueScope, count: number) { * a hard constraint with committed tests behind it. * * The phone control row is sized to its own labels rather than to the viewport. - * It keeps the complete “Abbreviations” and “Filter” wordmarks, with tighter - * phone-only horizontal padding so the idle controls remain one balanced row at - * common phone widths and wrap, rather than clip, on compact screens. + * The Terms / Abbreviations switch is a joined two-cell toggle (one border, no + * gap), compact in type and height so it does not compete with Filter. Counts + * sit beside the labels with an explicit accessible name ("Terms (2)") so they + * do not concatenate. Filter stays on this row at every breakpoint — including + * during a search — rather than moving into the query ribbon. Idle controls + * remain one balanced row at common phone widths and wrap, rather than clip, + * on compact screens. */ export function DictionaryCataloguePage() { const { searchParams, replace, setOne, toggleMany } = useDictionaryUrl(); @@ -285,48 +289,49 @@ export function DictionaryCataloguePage() { })), ]; - /* Sized to its own labels, not to the viewport, and joined into one border - with no gap. The counts sit inline, so the row needs no summary line of its - own while browsing. */ + /* Joined two-cell toggle: one border, no gap, sized to its own labels. + Compact (28px, 11px type) so the row stays a control strip rather than a + second header. `aria-label` keeps the accessible name "Terms (2)" rather + than the concatenated "Terms2" jammed digits produced. Focus uses an inset + outline because the joined track clips an outset ring. */ const scopeToggle = (
{scopeOptions.map((option) => { const active = params.scope === option.value; + const count = scopeCounts[option.value]; return ( ); })}
); - /* The phone's whole alphabet in one 63px control. 27 chips cost a band and a + /* The phone's whole alphabet in one chip. 27 chips cost a band and a horizontal scroll; the rail below is the same control at a width that can - afford it. */ + afford it. Keep the 48px tap floor (`min-h-tap min-w-tap`) so this control + matches Filter on both axes; the compact toggle stays visually smaller. */ const letterChip = (