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 protiorigin/mainacrm (4f9af7cb4, klon/root/acrm-main), stránkám/ds/components/choice/*?tab=examples(screenshotyreview-choice-<sub>.png) a validatoruds: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í
| Prvek | Soubory (app) | Příklady |
|---|---|---|
<Checkbox> (packages/ui/src/components/Checkbox.tsx) | 22 | apps/web/src/components/acl/TransferDialog.tsx:175, apps/web/src/components/segment/ManageSegmentDialog.tsx:267 |
raw input.acrm-check mimo komponentu | 5 | apps/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íčku | apps/web/src/components/CheckMenu.tsx:224, packages/ui/src/components/MultiSelect.tsx |
.acrm-check-row + .acrm-check-input | 0 (jen DsInputsPage) | — |
.is-mixed / indeterminate | 0 (jen DsInputsPage) | — |
raw <input type="checkbox"> bez DS třídy | 6 míst | AssignPopup.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)
| Stav | Native .acrm-check | Styled .acrm-checkbox | Story ukazuje |
|---|---|---|---|
| rest / checked | browser + accent-color | .is-on (683) | ✓ |
| hover | — | — | — |
| active | — | — | — |
| focus | browser 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ý řádek | text |
| disabled | browser box; .acrm-check-label nic (popisek plný, cursor pointer) | — | ✓ „disabled" = stav, který CSS nemá (A1) |
| indeterminate / mixed | DOM 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 inlineborder/borderRadius/padding/heightmí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)
| Stav | Kód | Story |
|---|---|---|
| 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 popisem | jen 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)
| Stav | Kód | Story |
|---|---|---|
| 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)
| Stav | Kód | Story |
|---|---|---|
| rest / selected | .on + aria-pressed (241) | ✓ |
| hover | — (transition na background/color deklarována, :hover pravidlo chybí → mrtvá transition) (A12) | — |
| active | — | — |
| focus | foundation 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)
| Stav | Kód | Story |
|---|---|---|
| rest / on | .is-on rámeček + inset ring + --accent-ink (745) | ✓ |
| hover | --hover-surface (737) | text |
| active | — | — |
| focus | foundation ring | text |
| 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-radioa.acrm-switch-rowliterál500 13px/--ink-800;.acrm-check-row500 13px/--ink-700;.acrm-optchip500 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-acrmHARD,checkbox-native-no-dsaradio-native-no-dsWARN → 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)
| # | Kde | Chyba | Oprava | Rozhoduje |
|---|---|---|---|---|
| D1 | registr | legacy components--inputs--checkboxes a components--segmented-app-only- v stories.Default → zobrazují se vedle nové Default | odstranit z registru (baseline u story souboru zůstává, jako D10 Button) | — |
| D2 | stories Checkbox Variants | „styled box — .acrm-check-row" = markup s 0 použitím | Variants = native s popiskem · native holý (řádek výběru) · styled box uvnitř button.acrm-popover-item (port CheckMenu.tsx:198–227) | R1 |
| D3 | stories Checkbox Composition | „menu rows" = divy s inline styly místo CheckMenu; „option group" bez file:line | port TransferDialog.tsx:173–195 a CheckMenu (nebo <CheckMenu> přímo); file:line v komentáři | — |
| D4 | stories 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 R1 | R1 |
| D5 | stories Radio | States = 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) | — |
| D6 | stories Switch | aria-pressed místo app konvence role="switch" + aria-checked (8/8) | přepsat na role="switch" + aria-checked | — |
| D7 | stories Switch Composition | „settings list" (--row-h + borderBottom) v appce neexistuje; „stacked" bez file:line | port VendorAccessSection:83–110 (stack), WorkflowsSection:215 (řádek s pilulkou stavu), ComposeForm:3485 (popisek vlevo) | — |
| D8 | stories 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 R4 | R4 |
| D9 | stories Segmented With icon + legacy | ikony vymyšlené; legacy story bez ariaLabel | port DialerPage:1683 (grow ve Field, phone-off/voicemail) nebo InvoicePaymentDialog:177 | — |
| D10 | stories Option chips | With icon bez ×/aria-pressed (InteractionFilter má obojí); Composition „own value" = kombinace, která neexistuje; „wizard step" mění kontejner i hint | port InteractionFilter:66–76; „own value" zrušit nebo port PruvodceFirmyPage:355–367 1:1 (input + Add + .acrm-tag) — dle R5; wizard = port PruvodcePage:962 | R2, R5 |
| D11 | stories Option chips | kbd v chipu existuje (QualGate:52, dialer.css:10), story/komentář tvrdí opak; single-choice mód (role=radio) nezachycen | po R3: story „single choice (role=radio) s kbd" jako port QualGate:36–53, nebo nic | R3 |
| D12 | docs 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 hostitele | R1 |
| D13 | docs radio.usage | inline styl kanonizován jako anatomie; seznam použití neúplný; „no horizontal rows" vs CompanyMergeTable | po A5 popsat CSS modifikátor; doplnit AccessPresets, CompanyMergeTable; výjimku tabulky pojmenovat | — |
| D14 | docs 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á) | — |
| D15 | docs segmented.usage | věta o .acrm-btn v registru zastaralá; „control next to the title" — appka má oba layouty | větu smazat; polohu přepínače napsat až po R4 | R4 |
| D16 | docs option-chips.usage/a11y | „×" jen PruvodceFirmyPage (6 souborů); aria-pressed chybí ve 3 (ne 1); „Don't single-choice" vs 2 místa | opravit fakta; pravidla po R2/R3 | R2, R3 |
| D17 | docs 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álezy | disabled = A1–A3, ne limit; validator popsat pravdivě a po A7 HARD | — |
| D18 | web | auto-výška iframů (D5) na stránkách Choice nefunguje — ~250 px bílé pod 1–3 řádky | měřit výšku obsahu story (.ladle-main/první potomek), ne documentElement.scrollHeight (Ladle preview má min-height viewportu) | — |
| D19 | stories (všechny) | věty „Focus: … No disabled style exists…" v plátně story = vysvětlivky v UI | odstranit; patří do a11y tabu (pravidlo „žádné vysvětlivky v UI") | — |
3. Bug list — aplikace (kanon v kódu)
| # | Kde | Chyba | Oprava | Rozhoduje |
|---|---|---|---|---|
| A1 | ds.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 | — |
| A2 | inputs.css:765 .acrm-switch | chybí :disabled při 7/8 použitích disabled | :disabled = track --line-200/opacity, cursor: not-allowed, bez focus ringu změny | — |
| A3 | inputs.css:608–655 .acrm-radio | chybí 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 | — |
| A4 | inputs.css:640 .acrm-radio.is-on | stav 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 | — |
| A5 | NastaveniPage:3042, SouhlasPripojeniPage:148, AccessPresets:113 | 3/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 | — |
| A6 | FollowupMail.tsx:49–56, MeetingProductsSection.tsx:204–210 | type="radio" s třídou .acrm-check (radio kreslené jako checkbox) | .acrm-radio-group / .acrm-radio; validator radio-native-no-ds → HARD | — |
| A7 | AssignPopup.tsx:149,156, SegmentScreen.tsx:938,1072, PruvodcePage.tsx:1151, packages/ui/…/DateTimeRangeField.tsx:229 | nativní 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 | — |
| A9 | task-dialog.css:374–399 .tk-more .sw, TaskDialog.tsx:1142–1148 | druhý switch (30×17, skrytý checkbox, aria-hidden) bez role=switch | button.acrm-switch[role=switch]; validator: pill toggle bez role (.sw, .toggle) | — |
| A10 | PostaPage.tsx:560, SegmentBuilder.tsx:58–85 (Seg) | .acrm-segmented emitovaný mimo <Segmented> (Seg bez aria-label) | <Segmented>; validator segmented-raw (HARD) | — |
| A11 | orders.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 | — |
| A12 | ds.css:228–240 .acrm-segmented > button | transition deklarována, :hover pravidlo chybí (mrtvá transition) | buď :hover (--hover-surface jako option chip), nebo transition smazat | AD (R7) |
| A13 | builder-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 | — |
| A14 | PruvodcePage, PruvodceFirmyPage, TagFilter, DealStageFilter, OwnerFilter, InteractionFilter | trailing × ve vybraném chipu bez CSS opory; aria-pressed chybí ve 3 souborech | po R2: buď .acrm-optchip.is-on > .x v CSS + docs, nebo × smazat; aria-pressed doplnit vždy | AD (R2) |
| A15 | OwnerFilter.tsx:48 (bez role), QualGate.tsx:36–53 (role=radio) | option chipy jako single-choice | po R3: mód role=radio v kanonu (QualGate = vzor), nebo OwnerFilter → Segmented/Radio | AD (R3) |
| A16 | PruvodceFirmyPage.tsx:364 | „Add" = akce v šatech option chipu | <Button variant="ghost"> s plus, nebo Tag input | AD (R5) |
| A17 | ds.css:178, inputs.css:613, 697, 733, 758 | čtyři sazby a tři barvy popisku volby, žádný token | jedna sazba přes token (--label nebo --cell) a jedna barva | AD (R6) |
| A18 | ComposeForm.tsx:3487 | switch bez aria-label (jen title); .mc-track-lbl přebíjí weight | aria-label="Sledovat otevření"; popisek vlevo jako kanonická varianta řádku (.acrm-switch-row.lbl-left) | — |
| A19 | SectionTopBar.tsx slot primaryAction vs TasksPage:706 | slot vkládá výplň, takže stránky s přepínačem v pravém clusteru dávají primár mimo slot | slot 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ázka | Varianty | Dopad |
|---|---|---|---|
| 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 mixed | D2, D4, D12 |
| R2 | Trailing „×" 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 |
| R3 | Option 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-ok | A15, D11, D16 |
| R4 | Poloha 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 co | D8, D15, A19 |
| R5 | „Add" chip vedle pole pro vlastní hodnotu | (a) Button ghost + plus; (b) Tag input (rodina Chips) místo optchip + input | A16, D10 |
| R6 | Jedna sazba popisku volby | (a) --label (500 12px/22px display) dle AD 25. 8.; (b) --cell (500 13px/22px sans); barva --fg vs --fg-secondary | A17 |
| R7 | Hover u segmentu | (a) doplnit --hover-surface (jako chip); (b) bez hoveru, smazat transition | A12 |
| R8 | .tk-check / .tl-rcheck (18 px stav úkolu, 4 soubory) | (a) vlastní kanonický prvek „Task check" v rodině Records; (b) <Checkbox> 16 px | A8 |
5. Co teď
- 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-dsacheckbox-native-no-dsna HARD bez výjimek + scanpackages/ui/src; nová pravidlasegmented-raw,optchips-container,switch-pill-no-role,check-label-bespoke(bod 6 metody). - Č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. - Stories k odstranění nebo přepracování: z registru
components--inputs--checkboxes,components--segmented-app-only-; zrušitcomponents--radio--states,components--option-chips--states(duplikáty Defaultu); přepracovatcomponents--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. - Ticket rodiny se nezavírá — až po merge oprav a AD potvrzení na webu (bod 7 metody).
Source: docs/REVIEW-choice-family.md · GitLab