Audit tlačítek — 100 % shoda s kanonem rodiny Button (26. 9. 2026)

Zadání: zadavatel 26. 9. 2026 — „proveď audit v app a ujisti se, že všechna tlačítka a jejich varianty odpovídají DS kanonu … tvým úkolem je zajistit naprostou shodu". Stav měřen na origin/main (zrcadlo /root/acrm-main). Vlastník rodiny Button: session „ds web verification" (d1322dc8). Spouštěče nabídek (kebaby, výběry hodnot) vede session „DS: Dialogy" (vlny A/C/D od ArtDirectora) — v téhle inventuře jen odkazem.

Kanon (jediné povolené podoby)

PodobaKomponentaTřída
Tlačítko s popiskem`<Button variant="primary\default\ghost\danger"> (+ kbd, loading, compact`).acrm-btn
Ikonové tlačítko<IconButton> (sm, framed).acrm-icobtn
Nabídka akcí bez výchozí akce<MenuButton>—
Výchozí akce + varianty<SplitButton> (!3903).acrm-split

Compact (24 px) jen v řádcích tabulek a seznamů. Nabídka lícuje s levou hranou tlačítka, k pravé se překlopí jen když se nevejde.

Nálezy (stav mainu 26. 9.)

#OblastRozsahCíl
1Legacy alias .btn~226 míst / ~90 souborů<Button>
2Syrové acrm-btn na <button>/<a>93 míst / 35 souborů (asistent ~34)<Button>
3.sm na tlačítku17 míst / 9 souborů<Button compact> + smazat alias
4Vlastní třídy tlačítek (živé).au-btn 16, .mc-tbtn 9, .acrm-dialog-wbtn 9, .mr-note-tb .tbtn 12, .icobtn 5, .eml-icobtn 5, .linkbtn 5, .pipe-btn 5, .as-*btn 6, .aichat-hbtn 4, .rvsw-btn 2, .dlr-simbtn 2, .toast-btn 1, .sr-ch-mark-btn 1, .cal-kind-btn/.cal-label-btn 2<Button>/<IconButton>; zvláštní (toolbar B/I, chrome kalendáře) k rozhodnutí AD
5Mrtvé aliasy (0 použití).dlr-cbtn, .aktivity-page .ibtn, ClenTymu .back, .wf-desc-btn, .acrm-tabsbtnsmazat
6Syrové acrm-icobtnProjectTaskRow.tsx:205, ReservationControl.tsx:178 (statický span)<IconButton>
7Scopované přestylování .acrm-btntask-dialog.css:54, deal-dialog.css:18,38, responsive.css:571, record-rail.css:45 (.btn.icononly 32 px), person-record.css:75,132, record-drawer.css:482 (34 px, radius-md), mail.css:100kanonická podoba; 44 px dotykové CTA na telefonu = chybí kanon → rozhodnutí
8Holá akční tlačítka~18 (.fb-reset, .fb-save, .sgb-clearall, .dlg-gen, .mc-send, .gsp-cancel, .sigpad-clear, …)<Button> (ghost/default)
9Ruční spouštěče nabídek46 × aria-haspopup="menu"vede DS: Dialogy; ComposeForm.tsx:3601 „Odeslat hned/s odkladem" → <SplitButton> (tady)

Vlny (≤ 8 souborů na MR) — stav 27. 9. 2026

VlnaObsahStav
0Button compact + SplitButton + nabídka lícuje vlevo (place.ts)✅ !3903
0bIconButton pressed + nástroje psaní mailu na IconButton (mc-tbtn zaniká)✅ !3936
0c<Button href> (link button) + 5 odkazů✅ !3938
1.sm → <Button compact> (17 míst / 9 souborů, legacy btn … sm taky), smazat alias✅ !3940 (alias smazat po převodu odkazů a.btn)
2Mrtvé klony smazat (.dlr-cbtn, .aktivity-page .ibtn, ClenTymu .back, .wf-desc-btn, celá lišta .mr-note-tb)✅ !3937 (+ neuzavřený komentář meeting-record.css)
3ComposeForm „Odeslat hned/s odkladem" → <SplitButton>po !3903
4Asistent: syrové acrm-btn → <Button> (32×)MR !3914
5aHR/kancelář (28×)✅ !3915
5bZbytek syrových acrm-btn (9×)MR !3918
6aLegacy .btn → <Button>: Import, produkt, tým, faktura, dokument (37×)✅ !3920
6bLegacy .btn v detailech osoby/firmy/obchodu (24×) + scopovaná pravidlaMR !3923 (zrcadlo: classAlias btn→acrm-btn)
6fObjednávky a finance (+ fakturace .acrm-optchips)✅ !3943
6gSchůzky, hovory, lidé, AI zaměstnanci (15×); Hovory filtr → Segmented + Switch, statistika období → Segmented; smazání AI zaměstnance → useConfirmMR !3945
LPřepis popisku při načítání → loading: dokument (!3948), AI zaměstnanci (!3945), Telegram (!3914)zbývá: CompanyRecord trigger nabídky (session Dialogy), .linkbtn/.ga (čeká AD), .au-btn (vlna 17)
6c…Legacy .btn zbytek (~165 míst) po 8 souborech, pak smazat alias .btn
AIJediná AI ikona sparkles-2 (AD) — A úkoly/schůzky, B asistent/compose + HARD pravidlo ai-icon-sparkles-2MR !3912, větev polish/ai-ikona-sparkles-2-b
T<Button touch> 44 px na telefonu, převod 3 scopovaných míst (AD)po !3903
KKalendář: prev/Dnes/next → IconButton, měsíc → interaktivní SectionTopBarTitle, rok → IconButton sm, Nová schůzka → Button (AD)✅ !3942
Gmail-glyphs.tsx (Gi) zaniká → ds-icons (AD)
16Vlastní ikonová tlačítka → <IconButton> (.icobtn, .eml-icobtn, .as-icobtn, .aichat-hbtn)
17.au-btn → <Button className="w-full"> (auth)

Rozhodnutí AD (26.–27. 9. 2026)

  • Dotykové CTA 44 px = <Button touch> (jen v ds/button.css pod mobilním zlomem), 3 scopované kopie zaniknou.
  • Formátovací lišty = <IconButton pressed> (aria-pressed, --active-surface, při hoveru nezhasne); open vzhled jen se aria-haspopup (disclosure = glyf).
  • Link button = <Button href> (ne samostatná komponenta); jen externí/OAuth/deep link, uvnitř appky router.
  • Jediná ikona AI = sparkles-2; notifikace „system" (ne AI) = bell.
  • Scopovaná .btn pravidla: přestylování (akcent glyfu, padding, gap, 34 px, zelené .unlocked, 32 px, segment příloh) smazat → kanon; rozmísťovací převést na .acrm-btn.
  • .pdr-foot .btn (34 px, radius-md, .unlocked) čeká na migraci DrawerForm → form-less dialog (18 call sites) — patří kartě drawer-form.html, zanikne s ní.

Opravy auditu po ověření

  • .acrm-tabsbtn NENÍ mrtvý — šipky posunu záložek v Tabs (packages/ui) → kandidát na IconButton.
  • .mr-note-tb .tbtn a .tbtn v calendar.css mají 0 použití (audit je napočítal přes podřetězec mc-tbtn) → mrtvé.
  • HovoryStatistikaPage už sparkles-2 používá.

Řada tlačítek „vybraná = primary" (AD 27. 9. 2026)

Pravidlo: primary = jediná hlavní akce kontejneru, nikdy stav. Pevná sada 2–4 voleb → Segmented; seznam z dat → ItemList active nebo NavSelect; filtr → FilterBar / Switch; zapnutí funkce → Switch; pressed jen IconButton.

MístoCílStav
Náklady „jen nevypořádané"Switch!3915
Produkt Interview (lišta)Switch!3920
Produkt průvodce „Zeptat se asistenta"Button default bez stavu!3920
Majetek Toggle (dodavatel, faktura)Segmented, komponenta smazána!3931
Štítky Kontakty / FirmySegmented!3931
Role, sady oprávněnínávrh A ItemList active \editor · B NavSelect — jediné zbývající místo, rozhoduje zadavatelprototyp http://192.168.230.131:3777/preview/opravneni-role.html

Stav 27. 9. 2026 (odpoledne)

MRObsahStav
!3945schůzky/hovory/lidé/AI zaměstnanci; AI zaměstnanci smazání → useConfirm✅
!3948 / !3949 / !3952loading místo label-swapu (dokument) · odkazy a.btn → Button href (12×)✅
!3953SplitButton: volba režimu (radio checked), moreDisabled, hlavní akce přes Button✅
!3951textové akce: profil → Button default, sync kalendáře → IconButton refresh, „Použít návrh" z věty ven, .linkbtn pryčotevřen
!3955psaní mailu: Odeslat → Button/SplitButton (chování F68/M5-B beze změny), .mc-send* pryčotevřen
!3959 / !3962 / !3963 / !3966legacy .btn vlny 6h–6k (+ pokladna vklad/výdaj → Segmented grow, výběr souboru label → Button)otevřeny
!3960Gi → ds-icons (+ arrow-back-up-double) — výpis, čtečka, vlákno, doručeníotevřen
!3971<Button touch> (44 px + plná šířka ≤ 720 px)otevřen

Čeká na zadavatele (náhledy):

  • Přihlášení/onboarding .au-btn → Button — telefon 14 → 13 px, „Nahrát foto" 44 → 30 px: :3777/preview/auth-tlacitka.html
  • Zkratky v patičkách .tk-kb → Button kbd (rámeček klávesy): :3777/preview/kbd-paticky.html; skrytí zkratek na telefonu v kánonu (AD ano)
  • Kanonická příloha A (chip všude) / B (chip + dlaždice): :3777/preview/prilohy-kanon.html
  • Role v Nastavení — varianta A (seznam | editor), „Nová role" jako Button ghost pod výpisem: :3777/preview/opravneni-role.html

Čeká na AD: vlna 16 ikonových rodin (.as-icobtn 32, .icobtn 32, .eml-icobtn 22, .aichat-hbtn 26 → IconButton 30/24). Po merge: přílohy čtečky varianta C + jedna komponenta MailAttachmentChip (po !3960); Gi v ComposeForm + smazání mail-glyphs.tsx (po !3955); .mr-ico (po !3910 Dialogů); SegmentScreen .sgb-ck → Checkbox (po C4 Dialogů); .pdr-foot (po migraci DrawerForm). Zbývající legacy .btn na mainu: AssistantTrigger .as-ai-btn, IdentityImageDialog (!3939 jiné session), .mv-att (varianta C), .pdr-foot, SegmentScreen.

Kandidáti mimo rodinu Button

  • Hovory → FilterBar (výsledek + „jen s nahrávkou" jako chipy) — změna rozložení seznamu, kandidát rolloutu FilterBaru (AD 27. 9.); !3945 zatím Segmented + Switch.

Textové akce (AD 27. 9. 2026, po snímcích) — MR !3951

  • Žádná varianta „link". Odkaz ve vzhledu tlačítka = <Button href> (!3949, 10 odkazů).
  • Profil (fotka, obličej) → Button default pod jménem, lícuje s jeho levou hranou.
  • Kalendář Google sync → IconButton sm refresh + spin; stav zůstává textem.
  • Akce uprostřed věty nápovědy („Použít návrh") → z věty ven, za nápovědu jako Button ghost výchozí velikosti.
  • compact jen v řádcích tabulek a výpisů.
  • Destruktivní akce s varováním → spouštěč bez barvy + kanonický useConfirm (danger v dialogu), žádný dvoukrokový přepis na místě (AI zaměstnanci, !3945).
  • .linkbtn zaniká (!3951).

Výjimky

  • Kalendář „Vše/Nic" (.rr-sec-h .ga) — sazba je rozhodnutí zadavatele (ACRM-110).
  • Kalendář trojice ‹●› — ACRM-91/97/103.
  • SegmentScreen výběr řádků .sgb-ck → <Checkbox> (@acrm/ui): nejdřív změřit shodu vzhledu, převod až po C4 Dialogů (týž soubor). Story _segment-table do té doby drží port s ds-ok.

Stav 27. 9. 2026 odpoledne (po konsolidaci !3997)

  • V konsolidaci !3997 (CTO): vlna 16, kbd v patičkách, UX-2, Role a sady, DS.Attachment + čtečka. Opravy review na mou část: fix/prilohy-ukladani-po-id (98ca71d15 savingId, 9107ddcd1 IconButton href ref, 19f368d6a zrcadlo .mv-atts) ke cherry-picku.
  • Samostatně běží: !3971 Button touch, !3988 tlačítka přihlášení (konflikty s mainem vyřešeny).
  • Připraveno k MR po merge !3997:
  • refactor/prilohy-psani — 93397259f velikost přílohy jedním algoritmem (viditelné, revertovatelné zvlášť) + c1e036efe psaní/šablony/úkol → Attachment (smazány mail-glyphs.tsx, AttachmentTile, .mc-att*, .pv-att-auto, .tk-att*).
  • refactor/eml-row-iconbutton — řádek Pošty .eml-icobtn → IconButton sm + přehrávač přepisu .mr-ico → IconButton (AD: kánon, ne nový vizuál).
  • ZAMÍTNUTO zadavatelem: sekce Nastavení profilu jako TabStrip (dvě úrovně tabů nepřípustné; osobní nastavení nepatří do detailu uživatele). Čeká na nové zadání AD (vzor z Mobbinu).

Závěrečná vlna (27. 9. 2026 večer) — UZAVŘENO 28. 9.

Ověřeno na origin/main: legacy .btn 0× v JSX i CSS, alias .sm 0×, .rvsw-btn 0×; .dlr-simbtn žije jen jako modifikátor šířky na <Button> (dialer.css).

  • !4038: poslední <button className="btn …"> → <Button> (segment, doklad, asistent, přehrávač, RecordRail); alias .sm smazán (0 volání); zrcadlo Record detail rail .btn → .acrm-btn.
  • ✅ !4050 (merged 28. 9.): patička šuplíku .pdr-foot → <Button> (DrawerForm, Dokumenty), 21 selektorů .btn z ds.css pryč, Dialer .dlr-simbtn → <Button> (klon z ds.css pryč). Tím legacy .btn v appce končí.
  • Rozhodnutí AD k posledním vlastním tvarům:
  • Zvonek (.icobtn, NotifBell) a „Nahrát teď“ (.as-icobtn) v horní liště = VÝJIMKA, chrome app shellu: 32 px lícuje s hledacím polem; kryje je token --field-h: 32px (vlna dluhu DS). Ne dluh.
  • .rvsw-btn (přepínač pohledu osoba/firma) → ✅ !4044 PŘEVEDENO: v liště sekce = .tchip s chevronem + nabídka (RULES §8), jinde MenuButton compact 24 px. Samostatný polish MR se snímky před/po.
  • Součást kanonických komponent (OK): .acrm-dialog-wbtn (Dialog), .pipe-btn (SectionTopBar), .toast-btn (Toast), .sr-ch-mark-btn (bod grafu), .ga Vše/Nic (ACRM-110).

Dluh mimo tlačítka

  • Nabídka přepínače pohledu (osoba/firma): položky nesou vysvětlivky („Práce s kontaktem“, „Investigativní pohled z Datamartu“) — proti pravidlu žádných vysvětlivek v UI; stačí název + ikona. ✅ !4051 (merged 28. 9.).
  • Šablony zápisu: v Nastavení jen čtecí seznam (název · účel · Vyzkoušet), správa přes agenta — ZÁMĚR, ne dluh (zadavatel 17. 9. 2026; AD 27. 9. stáhlo rozhodnutí 7).
  • Moje šablony / Uložené prompty: dva odstavce vysvětlivek pod akcí — proti pravidlu „žádné vysvětlivky v UI". Přibalit k další vlně v Nastavení (AD 27. 9.).

Nastavení — přeskupení menu (návrh 27. 9. 2026, proto/nastaveni-osobni)

  • Menu 34 → 30 položek, 6 skupin (Osobní · Firma · Šablony · AI a automatizace · Data · Přehledy); sloučené: Profil+Jazyk, Připojení, Schůzky, Přístup, E-mailové šablony (Moje | Firemní). Sloupec .scol na střed panelu. Čeká na „schváleno“.
  • Dluh zjištěný při přeskupení (mimo návrh):
  • Připojení: věta „spravuje ho administrátor v Nastavení → Mailové šablony“ — přepsat na E-mailové šablony › Firemní.
  • Schůzky: vysvětlivky pod nadpisy bloků; zapnutí nahrávání = Button „✕ Vypnuto“ místo Switch.
  • Firma › Obecné: Jazyk organizace → Segmented (dohodnuto do dodávky), vysvětlivky.
  • AI a spotřeba: tabulka Routing modelů přetéká vodorovně (i na devu) — oprava zvlášť.

Nastavení — dodáno !4018 (27. 9. 2026), dluh do další vlny v Nastavení

  • a11y: SettingsLayout po přepnutí sekce nepřesouvá fokus → fokus na nadpis lišty stránky (tabIndex -1) po změně sekce; na telefonu i po „zpět“ na položku menu (AD, zjištěno při zápisu vzoru settings-page).
  • Firemní e-mailové šablony: inline editor u každé šablony vs. seznam u Moje → sjednotit na seznam + editor po otevření. → SCHVÁLENO zadavatelem 27. 9. ~22:05 (návrh v5); DODÁVÁ !4040 (session 1ba41f0e, DS consolidation, převzato z proto/firemni-sablony-seznam).
  • Firma › Obecné: vysvětlivky pod nadpisy bloků.

Druhá inventura — nativní <button> mimo Button/IconButton (28. 9. 2026) — UZAVŘENO

Matice: docs/button/INVENTURA-nativni-button-2026-09-28.md (480 tlačítek · 192 tříd → A 45 · B 128 · C 18). Každá skupina = náhled před/po na :3777/preview → OK AD → jeden MR.

VlnaCoMR
1hodnoty 1:1 kánonu (.gsp-act, .cd-ctl, .acrm-bulkbar-close), vizuál beze změny!4057
2aikonová ×/⋮ 20/26/28 px → IconButton sm!4059
2btlumené ikonové akce → IconButton (šuplík ▲▼⋮↗✕, RecordActionsMenu bez triggerClass, AI, schůzky)!4064
2ctextové akce → Button ghost (compact jen v řádku), hromadné Smazat ghost, Vše \Přírůstky → Segmented s počtem!4066
2d+2eřádkové akce tiché sm, návrhy = Button compact (obě plochy), odeslání AI primary .icon, Postupně/Paralelně → Switch; Button výchozí type="button"!4067
CUložit pro všechny, spouštěč šablony (tvar MenuButton), Vygenerovat, zámek dialeru, .tl-addrow jako jediný tichý přidávací řádek, zavření panelu kalendáře!4068
fixakce návrhů na dotyku vždy vidět, 44 px!4069

Nechané záměrně (AD): dlr-dial (doménová zelená dialeru), chrome app shellu (as-modebtn/acctbtn/search, as-navtoggle/icobtn, zvonek — --field-h), gsp-foot, phe-x/phe-copy (karta Multi-value), dropzone importu, ‹●› zoom kalendáře, ouško panelu kalendáře (část panelu), toast-x, tbar-mark (identita). Dluh DS: 597 → 495 nálezů.

Box křížku na tokenu glyfu (vlny F, zapsáno 28. 9. 2026)

  • Ve vlnách F1/F2 dostaly BOXY klikacích křížků rozměr z tokenu glyfu --ico-sm (16 px): .eref-x (odebrání entity reference), .acrm-pill .x (odebrání pilulky) — .mr-tag .rm (štítek schůzky) mezitím smazán jako mrtvý kód (acrm !4058, 28. 9. 2026; téma schůzky dnes .acrm-pill). Hodnota sedí, význam ne — --ico-* je glyf, ne tlačítko (AD 28. 9. 2026). NEVRACET natvrdo (churn bez užitku); opraví se výměnou za kanonický prvek — vlna IconButton / primitiv pilulky.
  • Stejná kategorie, zatím viditelný dluh bez tokenu: .acrm-recordselect-clear (20), .acrm-fchip-x (20), .nastaveni-page .chip .x (18) — ovládací prvky mimo škálu ovládání.
  • Nález pro design: radio 18 px vs. checkbox 16 px — nekonzistentní rozměr sourozenců.

Nález pro design tokeny (28. 9. 2026)

  • --fg-secondary je pod AA 4,5:1 pro běžný text. ink-500 #7d8184 na --surface-100 (#fff) = 3,93:1 (změřeno výpočtem WCAG). Týká se všech sekundárních textů DS (meta, popisky, nápovědy) i nového Button tone="muted" („Vymazat filtry", acrm !4088). Mezi ink-500 (3,93:1) a ink-600 (#4a4b4f, 8,9:1) jiný token není.
  • Rozhodnutí AD: tlačítko drží --fg-secondary (nesmí být výjimkou). Případný posun ink-500 předkládá AD zadavateli zvlášť s náhledem — systémová změna palety, ne oprava jednoho prvku.

Source: docs/button/AUDIT-tlacitka-2026-09-26.md · GitLab