Review rodiny Choice — nálezy, bug list, rozhodnutí pro AD

Datum: 2. 9. 2026 večer · reviewer: Claude (jako senior UX/UI) · zadal Štěpán (AD) Předmět: rodina Choice (checkbox · radio · switch · segmented-control · option-chips) po stories MR !2823 (mergnuto). Provedeno novým postupem (schválen 2. 9. 2026): inventura použití → stavová matice z kódu → story jako port → docs proti kódu. Každý nález ověřen proti origin/main acrm (4f9af7cb4, klon /root/acrm-main), stránkám /ds/components/choice/*?tab=examples (screenshoty review-choice-<sub>.png) a validatoru ds:validate:usage.

0. Shrnutí

Všech pět podkomponent má reálné použití v appce (22 · 4 · 8 · 25 · 9 souborů), takže rodina nemá „mrtvou" podkomponentu jako Button (Kbd hint, Save, Split). Problém je o vrstvu níž: stories a docs kanonizují části, které appka nepoužívá (.acrm-check-row + .acrm-check-input, .is-mixed, indeterminate — 0 míst mimo katalogovou DsInputsPage), a naopak nezachycují, co appka dělá většinově (radio s popisem nese inline styl ve 3 ze 4 míst; vybraný option chip má trailing „×" v 6 z 9 souborů; switch se v appce vždy píše role="switch" + aria-checked, story píše aria-pressed).

Kompozice jsou z větší části vymyšlené, ne portované: „Calendar · Month/Week · New meeting" v Section top baru neexistuje (Kalendář jede na legacy .cbar s přepínačem vpravo; Úkoly dávají přepínač do pravého clusteru a primár vědomě mimo slot), „settings list" se switchi neexistuje, „menu rows" u checkboxu jsou divy s inline styly místo button.acrm-popover-item z CheckMenu, „own value" u chipů kombinuje prvky, které v PruvodceFirmyPage stojí jinak.

Stavová matice ukázala tři chybějící stavy v kódu, které appka reálně potřebuje: .acrm-switch nemá :disabled (7 z 8 použití disabled posílá), .acrm-radio nemá disabled (dialer si ho dopisuje per-page), .acrm-check-label nemá disabled (story „disabled" ukazuje browser default + nezměněný popisek). K tomu v appce běží druhý switch (.tk-more .sw, 30×17), dvě segmented CSS (.dp-seg živé, .sgb-seg mrtvé), dva emitory .acrm-segmented mimo komponentu (PostaPage, SegmentBuilder Seg), šest obalů checkboxu (.sgb-check, .aichat-check, .asg-check, .dlr-check, .tk-check, .tl-rcheck), radio kreslené třídou checkboxu (2 místa) a 7 živých WARN nálezů validatoru na main, protože pravidla pro checkbox/radio jsou jen WARN a mají výjimky ck/cb/sgb-ck.

Web po opravách z Button review nelže: legacy story se do coverage nepočítá, status je beta bez AD schválení. Dvě věci zůstaly: legacy stories (components--inputs--checkboxes, components--segmented-app-only-) se pořád zobrazují vedle nové Default, a auto-výška iframů (D5) na těchto stránkách nefunguje (1–3 řádky obsahu + ~250 px bílé).

Bilance: 5 podkomponent, všechny canon-eligible; 4 části kandidát (bez použití); 19 D-bugů, 19 A-bugů, 8 rozhodnutí AD.

1. Nálezy per podkomponenta (ověřeno v kódu)

1.1 Checkbox — <Checkbox> · .acrm-check · .acrm-check-label · .acrm-checkbox

Inventura použití

PrvekSoubory (app)Příklady
<Checkbox> (packages/ui/src/components/Checkbox.tsx)22apps/web/src/components/acl/TransferDialog.tsx:175, apps/web/src/components/segment/ManageSegmentDialog.tsx:267
raw input.acrm-check mimo komponentu5apps/web/src/pages/NastaveniPage.tsx:2943, apps/web/src/pages/MeetingDetailPage.tsx:2761 (+ 2× na radiu, viz A6)
styled .acrm-checkbox (inputs.css §9)6 + 2 v balíčkuapps/web/src/components/CheckMenu.tsx:224, packages/ui/src/components/MultiSelect.tsx
.acrm-check-row + .acrm-check-input0 (jen DsInputsPage)—
.is-mixed / indeterminate0 (jen DsInputsPage)—
raw <input type="checkbox"> bez DS třídy6 místAssignPopup.tsx:149,156, SegmentScreen.tsx:938,1072, PruvodcePage.tsx:1151, packages/ui/…/DateTimeRangeField.tsx:229

Stavová matice z kódu (ds.css:168–187, inputs.css:660–716, foundation ring ds.css:2795)

StavNative .acrm-checkStyled .acrm-checkboxStory ukazuje
rest / checkedbrowser + accent-color.is-on (683)✓
hover———
active———
focusbrowser ring (foundation :where(button…) inputy vynechává).acrm-check-input:focus-visible + .acrm-checkbox (711) — v appce nedosažitelné, .acrm-check-input má 0 použití; hostitel (button.acrm-popover-item) dostane ring na celý řádektext
disabledbrowser box; .acrm-check-label nic (popisek plný, cursor pointer)—✓ „disabled" = stav, který CSS nemá (A1)
indeterminate / mixedDOM property.is-mixed (687)✓ — 0 použití (R1)
error / readonly———

Story audit

  • Default: vedle nové Default se zobrazuje legacy components--inputs--checkboxes (české popisky, 4 položky) — týž vzor jako D10 u Buttonu (D1).
  • Variants: „styled box — .acrm-check-row" = markup, který appka nepoužívá; skutečný styled výskyt je uvnitř button.acrm-popover-item[role=menuitemcheckbox] (CheckMenu.tsx:198–227) (D2).
  • States: „indeterminate" a „styled — mixed" = 0 použití; „disabled" ukazuje browser default (D4).
  • Composition: „option group under a field label" bez file:line, popisky vymyšlené (reálně TransferDialog.tsx:173–195: .dlg-label + 4 Checkbox kaskáda); „menu rows (CheckMenu anatomy)" = divy s inline border/borderRadius/padding/height místo CheckMenu (D3).
  • Inline styly mimo chrome: minWidth 240, border, borderRadius, padding, height: var(--control-h) na „menu" (D3).

Duplicity v appce (A7, A8): .sgb-check (builder-panels.css:302 — a to je zdroj, ze kterého byl .acrm-check-label portován), .aichat-check (assistant.css:163, 3 soubory — obaluje <Checkbox> vlastním labelem), .asg-check (mail.css:1521), .dlr-check (dialer.css:559), .dp-allday (packages/ui, ds-ok), .tk-check (task-dialog.css:71, 18 px) a .tl-rcheck (task-list.css:146, 18 px pill) — poslední dva jsou „stav úkolu", ne volba (R8).

Docs vs kód: usage/a11y popisují .acrm-check-row + .acrm-check-input jako kanon a slibují focus ring styled boxu přes .acrm-check-input — v appce neexistuje (D12). Validator popsán jako WARN — pravda, ale pravidlo checkbox-native-no-ds akceptuje i ck, cb, sgb-ck a skenuje jen apps/web/src (D17, A7).

1.2 Radio — .acrm-radio-group · .acrm-radio · .acrm-radio-input · .acrm-radio-dot

Inventura použití: 4 soubory — NastaveniPage.tsx:3022–3042, SouhlasPripojeniPage.tsx:130–148, settings/AccessPresets.tsx:98–113, company/CompanyMergeTable.tsx:259–272, 322–327. 3 ze 4 (vše kromě merge tabulky) používají layout s popisem a nesou stejný inline styl style={{ marginTop: 'var(--sp-1)' }} na tečce + alignItems: flex-start (A5). Merge tabulka používá radio vodorovně v buňkách (mgt-cell acrm-radio).

Radiogroupy mimo kanon: callwrapup/FollowupMail.tsx:46–56 (role=radiogroup + input[type=radio].acrm-check v .dlr-check — radio kreslené jako checkbox), products/MeetingProductsSection.tsx:204–210 (totéž), deal/DealDialog.tsx:597 (.dl-primary radiogroup z tlačítek), callwrapup/QualGate.tsx:122 (radiogroup z .acrm-optchip[role=radio]), segment/OwnerFilter.tsx:48 (single-choice chipy bez role) (A6, A15).

Stavová matice z kódu (inputs.css:608–655)

StavKódStory
rest / selected.is-on na labelu (640–645) — třída, ne :checked; každý ze 4 souborů synchronizuje ručně (A4)✓
hover / active——
focus.acrm-radio-input:focus-visible + .acrm-radio-dot ring (652)text
disabled— (dialer si dopisuje .dlr-check.dis .acrm-check, dialer.css:577)— (A3)
s popisemjen inline styl ve 3 souborech✓ (kopíruje inline styl)

Story audit: States „off/on" = holé <span class="acrm-radio"> bez inputu (nefokusovatelný, nekanonický markup) a duplikát Defaultu; Default/Composition popisky vymyšlené („All companies…", „Formatted / Plain text"), bez file:line — reálný port: SouhlasPripojeniPage:130 (volba s popisem) nebo AccessPresets:98 (D5).

Docs vs kód: usage.md kanonizuje inline styl jako anatomii („margin-top: var(--sp-1) on the dot — NastaveniPage pattern"), seznam použití neúplný (chybí AccessPresets, CompanyMergeTable), „no horizontal radio rows" odporuje merge tabulce (D13). a11y.md sedí s CSS.

1.3 Switch — .acrm-switch-row · .acrm-switch

Inventura použití: 8 souborů, 26 tlačítek — ImportPage.tsx:704, settings/StitkyTab.tsx:305, settings/TypyCiselTab.tsx:160, settings/TelephonySection.tsx:188,205, settings/VztahyTab.tsx:233, settings/VendorAccessSection.tsx:83,98, settings/WorkflowsSection.tsx:139,215, mail/ComposeForm.tsx:3485. 8/8 píší role="switch" + aria-checked; 7/8 posílají disabled={busy…}. Popisek: text za tlačítkem (Import, Stitky, Telephony, VendorAccess), jen aria-label v řádku tabulky (TypyCisel, Vztahy, Workflows), text před tlačítkem (ComposeForm .mc-track-lbl, weight 400).

Stavová matice z kódu (inputs.css:758–797)

StavKódStory
rest / on.is-on (777)✓
hover / active——
focus.acrm-switch:focus-visible ring (794)text
disabled— přes 7/8 použití (A2)—
knob#fff literál (786)—

Story audit: States používá aria-pressed (story není port — appka 8/8 role="switch"; validator switch-not-acrm klíčuje na role="switch", story mu proklouzne) (D6). Composition „stacked options" bez file:line (reálně VendorAccessSection:83–110, TelephonySection:188–215); „settings list — --row-h + borderBottom" v appce neexistuje — řádky v TypyCisel/Vztahy jsou řádky tabulky s ghost tlačítky + switch, Workflows má .stat pilulku + switch (D7). Varianta „popisek vlevo" (ComposeForm) chybí.

Duplicita: .tk-more .sw (task-dialog.css:374–399; TaskDialog.tsx:1142–1148) = druhý switch 30×17 řízený skrytým checkboxem .tk-more-input, aria-hidden — bez role=switch, takže validator ho nevidí (A9).

Docs vs kód: usage.md „the story uses aria-pressed — both are accepted" legitimizuje odchylku (D14); a11y.md „set aria-label on the button (all app usages do)" nepravda — ComposeForm:3487 má jen title (D14, A18).

1.4 Segmented control — <Segmented> · .acrm-segmented

Inventura použití: <Segmented> 25 souborů (KalendarPage:1476, TasksPage:700, JournalPage:174,184, HovoryPage:610, NastaveniPage:2806, ContactLogDialog:606…); grow 8× (NakladyPage:456, DialerPage:1683, PortfolioBuilderPage:538, PortfolioFields:155,175, AccountingEntityDialog:397, InvoicePaymentDialog:177, ContactLogDialog:606); icon 3× (DialerPage:1688, InvoicePaymentDialog:182, ContactLogDialog:494). Raw .acrm-segmented mimo komponentu: PostaPage.tsx:560, segment/SegmentBuilder.tsx:58–85 (vlastní Seg, role=group bez jména) (A10). Duplicitní CSS: .dp-seg (orders.css:276; DiscussionSection.tsx:177 — rámeček --border, ikony, .on), .sgb-seg (builder-panels.css:113 — 0 použití v tsx) (A11). .pr-seg, .fin-stack-seg, .seg-ic jsou jiné věci (řádek segmentu v railu, sloupec grafu, ikona segmentu) — ne duplicity.

Stavová matice z kódu (ds.css:221–260, Segmented.tsx)

StavKódStory
rest / selected.on + aria-pressed (241)✓
hover— (transition na background/color deklarována, :hover pravidlo chybí → mrtvá transition) (A12)—
active——
focusfoundation ring (button)—
disabled / loadingžádný prop, žádné CSS—
[aria-selected='true'] alias (242)komponenta ho neemituje, appka nepoužívá—

Story audit: Default zobrazuje i legacy components--segmented-app-only- (české „Uživateli/Týmu" s ikonami, bez ariaLabel — porušuje vlastní docs) (D1, D9). With icon: ikony user/users-group, calendar/calendar-week vymyšlené — reálná místa DialerPage:1683 (phone-off/voicemail, grow ve Field) a InvoicePaymentDialog:177 (building-bank/wallet, grow) (D9). Composition „Calendar · Month/Week u titulu · New meeting primaryAction": nikde. KalendarPage = legacy .cbar + Segmented za .sp (vpravo) + .acrm-btn primary; TasksPage:693–710 = SectionTopBarSpacer · Segmented · primár jako poslední child, vědomě ne slot primaryAction (komentář: slot vkládá výplň a rozdělil by cluster); JournalPage:173–190 = titul · Segmented · Segmented · picker, bez primáru. Story sloučila dva reálné layouty do třetího (D8, R4, A19). „form field — grow" ≈ PortfolioFields:172 (Kvalifikovaný investor Ano/Ne), popisky „Visible to User/Team" vymyšlené.

Docs vs kód: usage.md „the registry lists .acrm-btn under this sub … drop it" — registr .acrm-btn nevede (věta zastaralá); „Put the control next to the title; the primary stays on the right" — appka má oba layouty (D15, R4). a11y.md sedí (Segmented.tsx:33 role=group + aria-label; Icon bez labelu dává aria-hidden, ds-icons.tsx:266).

1.5 Option chips — .acrm-optchips · .acrm-optchip

Inventura použití: 9 souborů — PruvodcePage.tsx:323,342, PruvodceFirmyPage.tsx:286,304,364, segment/TagFilter.tsx:50, segment/DealStageFilter.tsx:48, segment/OwnerFilter.tsx:48, segment/InteractionFilter.tsx:69, callwrapup/WrapupBand.tsx:45, callwrapup/QualGate.tsx:43. Kontejner .acrm-optchips používá jen WrapupBand; ostatních 6 používá .sgb-opts (builder-panels.css:73 — totožný flex/wrap/gap) (A13). Trailing „×" ve vybraném chipu: 6 souborů (Pruvodce, PruvodceFirmy, TagFilter, DealStageFilter, OwnerFilter, InteractionFilter) bez opory v CSS (A14, R2). aria-pressed chybí ve 3 (PruvodcePage, PruvodceFirmyPage, OwnerFilter). Single-choice chipy: OwnerFilter (bez role), QualGate (role=radio + aria-checked, roving tabindex, klávesová zkratka .kbd uvnitř chipu — dialer.css:10) (A15, R3). „Add" chip (PruvodceFirmyPage:364) = akce v šatech toggle, vedle input.sgb-input; uložené hodnoty jsou .acrm-tag, ne chipy (R5).

Stavová matice z kódu (inputs.css:718–753, dialer.css:462–476)

StavKódStory
rest / on.is-on rámeček + inset ring + --accent-ink (745)✓
hover--hover-surface (737)text
active——
focusfoundation ringtext
disabled——
ikona vlevo> svg 15 px, muted → accent (740–752)✓
ikona „×" vpravožádné pravidlo (dědí accent z > svg) — 6 souborů—
kbd uvnitř.kbd jen v dialer.css (QualGate)— (story tvrdí „kbd není součást")

Story audit: States off/on = duplikát Defaultu. With icon ≈ InteractionFilter:66–76 (kanály), ale bez × a bez file:line (D10). Composition „wizard step" mění kontejner (.sgb-opts → .acrm-optchips) a hint (.sgb-hint → Field hint) oproti PruvodcePage:962; „own value — trailing add chip" ukazuje kombinaci option chipy + Add, která v PruvodceFirmyPage:355–367 nestojí (tam je input + Add, hodnoty jako .acrm-tag) (D10). Kbd v chipech existuje (QualGate:52), story říká opak (D11).

Docs vs kód: usage.md „PruvodceFirmyPage adds a trailing × — page-level extra" (ve skutečnosti 6 souborů); a11y.md „Chips without aria-pressed (PruvodceFirmyPage)" (ve skutečnosti 3); „Don't: chips as single-choice" vs 2 reálná místa, z toho QualGate ratifikovaný AD 13. 8. (D16, R3).

1.6 Napříč rodinou

  • Popisek volby má čtyři sazby a tři barvy: .acrm-check-label --small (500 12px) / --fg-secondary; .acrm-radio a .acrm-switch-row literál 500 13px / --ink-800; .acrm-check-row 500 13px / --ink-700; .acrm-optchip 500 12.5px / --ink-700. Žádná přes token (AD 25. 8.: popisek pole = --label) (A17, R6).
  • Disabled: index.usage.md to vede jako „known limit across the family". Podle nové metody to není limit, ale A-bug — appka disabled reálně posílá (switch 7/8, radio dialer, checkbox 6×) (A1–A3, D17).
  • Validator: switch-not-acrm HARD, checkbox-native-no-ds a radio-native-no-ds WARN → na main dnes 7 živých nálezů (FollowupMail:49, AssignPopup:149/156, MeetingProductsSection:204, SegmentScreen:937/1071, PruvodcePage:1150) a nikoho nezastaví. Segmented a option chips nemají pravidlo žádné (A7, A10, A13).
  • Web: legacy stories se stále zobrazují jako první příklad Default (D1); auto-výška iframů (D5 z Button review) na těchto stránkách nefunguje — screenshoty ukazují 1–3 řádky obsahu + ~250 px bílé (D18); věty „Focus: …" uvnitř stories jsou prose v plátně (D19).

2. Bug list — DS (registr, stories, docs, web)

#KdeChybaOpravaRozhoduje
D1registrlegacy components--inputs--checkboxes a components--segmented-app-only- v stories.Default → zobrazují se vedle nové Defaultodstranit z registru (baseline u story souboru zůstává, jako D10 Button)—
D2stories Checkbox Variants„styled box — .acrm-check-row" = markup s 0 použitímVariants = native s popiskem · native holý (řádek výběru) · styled box uvnitř button.acrm-popover-item (port CheckMenu.tsx:198–227)R1
D3stories Checkbox Composition„menu rows" = divy s inline styly místo CheckMenu; „option group" bez file:lineport TransferDialog.tsx:173–195 a CheckMenu (nebo <CheckMenu> přímo); file:line v komentáři—
D4stories Checkbox States„disabled" ukazuje browser default + nezměněný popisek (stav, který CSS nemá); „indeterminate"/„styled — mixed" 0 použitípo A1 rest · checked · disabled (s utlumeným popiskem); mixed/indeterminate jen po R1R1
D5stories RadioStates = holé <span> bez inputu, duplikát Defaultu; popisky vymyšlenéStates zrušit (stav je v Default); Default = port AccessPresets:98; Composition = port SouhlasPripojeniPage:130 (s popisem)—
D6stories Switcharia-pressed místo app konvence role="switch" + aria-checked (8/8)přepsat na role="switch" + aria-checked—
D7stories Switch Composition„settings list" (--row-h + borderBottom) v appce neexistuje; „stacked" bez file:lineport VendorAccessSection:83–110 (stack), WorkflowsSection:215 (řádek s pilulkou stavu), ComposeForm:3485 (popisek vlevo)—
D8stories Segmented Composition„Calendar · Month/Week u titulu · New meeting primaryAction" nikde neexistuje; mix dvou reálných layoutůport 1:1 JournalPage:173–190 (u titulu, bez primáru) a/nebo TasksPage:693–710 (Spacer · Segmented · primár) — dle R4R4
D9stories Segmented With icon + legacyikony vymyšlené; legacy story bez ariaLabelport DialerPage:1683 (grow ve Field, phone-off/voicemail) nebo InvoicePaymentDialog:177—
D10stories Option chipsWith icon bez ×/aria-pressed (InteractionFilter má obojí); Composition „own value" = kombinace, která neexistuje; „wizard step" mění kontejner i hintport InteractionFilter:66–76; „own value" zrušit nebo port PruvodceFirmyPage:355–367 1:1 (input + Add + .acrm-tag) — dle R5; wizard = port PruvodcePage:962R2, R5
D11stories Option chipskbd v chipu existuje (QualGate:52, dialer.css:10), story/komentář tvrdí opak; single-choice mód (role=radio) nezachycenpo R3: story „single choice (role=radio) s kbd" jako port QualGate:36–53, nebo nicR3
D12docs checkbox.usage/a11y.acrm-check-row/.acrm-check-input popsané jako kanon; focus ring styled boxu „via .acrm-check-input" v appce nedosažitelnýpřepsat anatomii na skutečná místa (native + styled uvnitř položky menu); focus popsat přes hostiteleR1
D13docs radio.usageinline styl kanonizován jako anatomie; seznam použití neúplný; „no horizontal rows" vs CompanyMergeTablepo A5 popsat CSS modifikátor; doplnit AccessPresets, CompanyMergeTable; výjimku tabulky pojmenovat—
D14docs switch.usage/a11y„aria-pressed both accepted" legitimizuje odchylku; „all app usages set aria-label" nepravda (ComposeForm:3487)jen role="switch" + aria-checked; větu o aria-label opravit (po A18 bude pravdivá)—
D15docs segmented.usagevěta o .acrm-btn v registru zastaralá; „control next to the title" — appka má oba layoutyvětu smazat; polohu přepínače napsat až po R4R4
D16docs option-chips.usage/a11y„×" jen PruvodceFirmyPage (6 souborů); aria-pressed chybí ve 3 (ne 1); „Don't single-choice" vs 2 místaopravit fakta; pravidla po R2/R3R2, R3
D17docs index.usage„Disabled = known limit across the family"; validator popsán jako zámek, ale je WARN s výjimkami a 7 živými nálezydisabled = A1–A3, ne limit; validator popsat pravdivě a po A7 HARD—
D18webauto-výška iframů (D5) na stránkách Choice nefunguje — ~250 px bílé pod 1–3 řádkyměřit výšku obsahu story (.ladle-main/první potomek), ne documentElement.scrollHeight (Ladle preview má min-height viewportu)—
D19stories (všechny)věty „Focus: … No disabled style exists…" v plátně story = vysvětlivky v UIodstranit; patří do a11y tabu (pravidlo „žádné vysvětlivky v UI")—

3. Bug list — aplikace (kanon v kódu)

#KdeChybaOpravaRozhoduje
A1ds.css:168–187 .acrm-check / .acrm-check-labelžádný disabled styl popisku (plná barva, cursor: pointer).acrm-check-label:has(> .acrm-check:disabled) → --fg-muted, cursor: not-allowed—
A2inputs.css:765 .acrm-switchchybí :disabled při 7/8 použitích disabled:disabled = track --line-200/opacity, cursor: not-allowed, bez focus ringu změny—
A3inputs.css:608–655 .acrm-radiochybí disabled; dialer si dopisuje .dlr-check.dis (dialer.css:577).acrm-radio:has(> .acrm-radio-input:disabled) → --fg-muted, not-allowed; .dlr-check.dis smazat—
A4inputs.css:640 .acrm-radio.is-onstav je třída, ne :checked — 4 soubory synchronizují ručně.acrm-radio-input:checked + .acrm-radio-dot (a totéž pro .acrm-check-input:checked + .acrm-checkbox); .is-on ponechat jen pro hostitele bez inputu—
A5NastaveniPage:3042, SouhlasPripojeniPage:148, AccessPresets:1133/4 použití nesou inline marginTop: var(--sp-1) + alignItems: flex-start (volba s popisem)modifikátor .acrm-radio.has-desc (nebo default align-items: flex-start + .acrm-radio-desc), inline styly smazat—
A6FollowupMail.tsx:49–56, MeetingProductsSection.tsx:204–210type="radio" s třídou .acrm-check (radio kreslené jako checkbox).acrm-radio-group / .acrm-radio; validator radio-native-no-ds → HARD—
A7AssignPopup.tsx:149,156, SegmentScreen.tsx:938,1072, PruvodcePage.tsx:1151, packages/ui/…/DateTimeRangeField.tsx:229nativní checkbox bez DS třídy<Checkbox> / .acrm-check; validator: zrušit výjimky ck/cb/sgb-ck, přidat packages/ui/src do scanu, HARD—
A8.sgb-check (builder-panels.css:302), .aichat-check (assistant.css:163, 3 soubory), .asg-check (mail.css:1521), .dlr-check (dialer.css:559)čtyři obaly checkboxu s vlastním popiskem<Checkbox label> / .acrm-check-label; třídy smazat; validator check-label-bespoke—
A9task-dialog.css:374–399 .tk-more .sw, TaskDialog.tsx:1142–1148druhý switch (30×17, skrytý checkbox, aria-hidden) bez role=switchbutton.acrm-switch[role=switch]; validator: pill toggle bez role (.sw, .toggle)—
A10PostaPage.tsx:560, SegmentBuilder.tsx:58–85 (Seg).acrm-segmented emitovaný mimo <Segmented> (Seg bez aria-label)<Segmented>; validator segmented-raw (HARD)—
A11orders.css:276 .dp-seg (DiscussionSection.tsx:177), builder-panels.css:113 .sgb-seg (0 použití)duplicitní segmented CSS.dp-seg → <Segmented> s icon; .sgb-seg smazat—
A12ds.css:228–240 .acrm-segmented > buttontransition deklarována, :hover pravidlo chybí (mrtvá transition)buď :hover (--hover-surface jako option chip), nebo transition smazatAD (R7)
A13builder-panels.css:73 .sgb-opts (6 souborů) vs .acrm-optchips (1)dva kontejnery pro tutéž řadu chipů.acrm-optchips všude; .sgb-opts smazat; validator—
A14PruvodcePage, PruvodceFirmyPage, TagFilter, DealStageFilter, OwnerFilter, InteractionFiltertrailing × ve vybraném chipu bez CSS opory; aria-pressed chybí ve 3 souborechpo R2: buď .acrm-optchip.is-on > .x v CSS + docs, nebo × smazat; aria-pressed doplnit vždyAD (R2)
A15OwnerFilter.tsx:48 (bez role), QualGate.tsx:36–53 (role=radio)option chipy jako single-choicepo R3: mód role=radio v kanonu (QualGate = vzor), nebo OwnerFilter → Segmented/RadioAD (R3)
A16PruvodceFirmyPage.tsx:364„Add" = akce v šatech option chipu<Button variant="ghost"> s plus, nebo Tag inputAD (R5)
A17ds.css:178, inputs.css:613, 697, 733, 758čtyři sazby a tři barvy popisku volby, žádný tokenjedna sazba přes token (--label nebo --cell) a jedna barvaAD (R6)
A18ComposeForm.tsx:3487switch bez aria-label (jen title); .mc-track-lbl přebíjí weightaria-label="Sledovat otevření"; popisek vlevo jako kanonická varianta řádku (.acrm-switch-row.lbl-left)—
A19SectionTopBar.tsx slot primaryAction vs TasksPage:706slot vkládá výplň, takže stránky s přepínačem v pravém clusteru dávají primár mimo slotslot vkládat výplň jen když před ním je obsah bez Spaceru, nebo pravidlo „view switch = pravý cluster"AD (R4)

4. Rozhodnutí pro AD

#OtázkaVariantyDopad
R1.acrm-check-row + .acrm-check-input, .is-mixed, indeterminate — 0 použití v appce(a) vyřadit z kanonu → kandidát; (b) dát reálné místo: „Vybrat vše" v tabulce (SegmentScreen:938) je přesně ten případ pro mixedD2, D4, D12
R2Trailing „×" ve vybraném option chipu (6 z 9 souborů)(a) kanon → CSS + story + docs; (b) pryč ze 6 souborů (rámeček + accent text stačí)A14, D10, D16
R3Option chipy jako single-choice (role=radio; QualGate ratifikován 13. 8., OwnerFilter)(a) povolit mód „single" (radio sémantika, kbd) v kanonu; (b) OwnerFilter → Segmented, QualGate jako výjimka s ds-okA15, D11, D16
R4Poloha přepínače pohledu v Section top baru(a) u titulu (Journal); (b) pravý cluster u primáru (Tasks, Kalendář); (c) oba, s pravidlem kdy coD8, D15, A19
R5„Add" chip vedle pole pro vlastní hodnotu(a) Button ghost + plus; (b) Tag input (rodina Chips) místo optchip + inputA16, D10
R6Jedna sazba popisku volby(a) --label (500 12px/22px display) dle AD 25. 8.; (b) --cell (500 13px/22px sans); barva --fg vs --fg-secondaryA17
R7Hover u segmentu(a) doplnit --hover-surface (jako chip); (b) bez hoveru, smazat transitionA12
R8.tk-check / .tl-rcheck (18 px stav úkolu, 4 soubory)(a) vlastní kanonický prvek „Task check" v rodině Records; (b) <Checkbox> 16 pxA8

5. Co teď

  1. Bez dotazů (follow-up MR do acrm + DS): D1, D3, D5–D7, D9, D13, D14, D17–D19; A1–A11, A13 (kontejner), A18. Pořadí: nejdřív A1–A3 (stavy v CSS), pak stories States (D4, D6), pak kompozice jako porty s file:line, pak docs. Validator: radio-native-no-ds a checkbox-native-no-ds na HARD bez výjimek + scan packages/ui/src; nová pravidla segmented-raw, optchips-container, switch-pill-no-role, check-label-bespoke (bod 6 metody).
  2. Čeká na AD: R1–R8 (jedno po druhém). Do rozhodnutí zůstávají stories Checkbox Variants/States (mixed), Option chips With icon/Composition a Segmented Composition ve stavu beta; nic z rodiny se neoznačuje approved.
  3. Stories k odstranění nebo přepracování: z registru components--inputs--checkboxes, components--segmented-app-only-; zrušit components--radio--states, components--option-chips--states (duplikáty Defaultu); přepracovat components--checkbox--variants, components--checkbox--states, components--checkbox--composition, components--switch--states, components--switch--composition, components--segmented-control--with-icon-kbd, components--segmented-control--composition, components--option-chips--with-icon-kbd, components--option-chips--composition.
  4. Ticket rodiny se nezavírá — až po merge oprav a AD potvrzení na webu (bod 7 metody).

Source: docs/REVIEW-choice-family.md · GitLab