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)
| Podoba | Komponenta | Tří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.)
| # | Oblast | Rozsah | Cíl |
|---|---|---|---|
| 1 | Legacy alias .btn | ~226 míst / ~90 souborů | <Button> |
| 2 | Syrové acrm-btn na <button>/<a> | 93 míst / 35 souborů (asistent ~34) | <Button> |
| 3 | .sm na tlačítku | 17 míst / 9 souborů | <Button compact> + smazat alias |
| 4 | Vlastní 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 |
| 5 | Mrtvé aliasy (0 použití) | .dlr-cbtn, .aktivity-page .ibtn, ClenTymu .back, .wf-desc-btn, .acrm-tabsbtn | smazat |
| 6 | Syrové acrm-icobtn | ProjectTaskRow.tsx:205, ReservationControl.tsx:178 (statický span) | <IconButton> |
| 7 | Scopované přestylování .acrm-btn | task-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:100 | kanonická podoba; 44 px dotykové CTA na telefonu = chybí kanon → rozhodnutí |
| 8 | Holá akční tlačítka | ~18 (.fb-reset, .fb-save, .sgb-clearall, .dlg-gen, .mc-send, .gsp-cancel, .sigpad-clear, …) | <Button> (ghost/default) |
| 9 | Ruční spouštěče nabídek | 46 × aria-haspopup="menu" | vede DS: Dialogy; ComposeForm.tsx:3601 „Odeslat hned/s odkladem" → <SplitButton> (tady) |
Vlny (≤ 8 souborů na MR) — stav 27. 9. 2026
| Vlna | Obsah | Stav |
|---|---|---|
| 0 | Button compact + SplitButton + nabídka lícuje vlevo (place.ts) | ✅ !3903 |
| 0b | IconButton 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) |
| 2 | Mrtvé 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) |
| 3 | ComposeForm „Odeslat hned/s odkladem" → <SplitButton> | po !3903 |
| 4 | Asistent: syrové acrm-btn → <Button> (32×) | MR !3914 |
| 5a | HR/kancelář (28×) | ✅ !3915 |
| 5b | Zbytek syrových acrm-btn (9×) | MR !3918 |
| 6a | Legacy .btn → <Button>: Import, produkt, tým, faktura, dokument (37×) | ✅ !3920 |
| 6b | Legacy .btn v detailech osoby/firmy/obchodu (24×) + scopovaná pravidla | MR !3923 (zrcadlo: classAlias btn→acrm-btn) |
| 6f | Objednávky a finance (+ fakturace .acrm-optchips) | ✅ !3943 |
| 6g | Schůzky, hovory, lidé, AI zaměstnanci (15×); Hovory filtr → Segmented + Switch, statistika období → Segmented; smazání AI zaměstnance → useConfirm | MR !3945 |
| L | Př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 | |
| AI | Jediná AI ikona sparkles-2 (AD) — A úkoly/schůzky, B asistent/compose + HARD pravidlo ai-icon-sparkles-2 | MR !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 |
| K | Kalendář: prev/Dnes/next → IconButton, měsíc → interaktivní SectionTopBarTitle, rok → IconButton sm, Nová schůzka → Button (AD) | ✅ !3942 |
| G | mail-glyphs.tsx (Gi) zaniká → ds-icons (AD) | |
| 16 | Vlastní 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 searia-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á
.btnpravidla: 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-tabsbtnNENÍ mrtvý — šipky posunu záložek vTabs(packages/ui) → kandidát na IconButton..mr-note-tb .tbtna.tbtnv calendar.css mají 0 použití (audit je napočítal přes podřetězecmc-tbtn) → mrtvé.HovoryStatistikaPageužsparkles-2použí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ísto | Cíl | Stav | |
|---|---|---|---|
| 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 / Firmy | Segmented | !3931 | |
| Role, sady oprávnění | návrh A ItemList active \ | editor · B NavSelect — jediné zbývající místo, rozhoduje zadavatel | prototyp http://192.168.230.131:3777/preview/opravneni-role.html |
Stav 27. 9. 2026 (odpoledne)
| MR | Obsah | Stav |
|---|---|---|
| !3945 | schůzky/hovory/lidé/AI zaměstnanci; AI zaměstnanci smazání → useConfirm | ✅ |
| !3948 / !3949 / !3952 | loading místo label-swapu (dokument) · odkazy a.btn → Button href (12×) | ✅ |
| !3953 | SplitButton: volba režimu (radio checked), moreDisabled, hlavní akce přes Button | ✅ |
| !3951 | textové akce: profil → Button default, sync kalendáře → IconButton refresh, „Použít návrh" z věty ven, .linkbtn pryč | otevřen |
| !3955 | psaní mailu: Odeslat → Button/SplitButton (chování F68/M5-B beze změny), .mc-send* pryč | otevřen |
| !3959 / !3962 / !3963 / !3966 | legacy .btn vlny 6h–6k (+ pokladna vklad/výdaj → Segmented grow, výběr souboru label → Button) | otevřeny |
| !3960 | Gi → 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 defaultpod 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 ghostvýchozí velikosti. compactjen 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). .linkbtnzaniká (!3951).
Výjimky
- Kalendář „Vše/Nic" (
.rr-sec-h .ga) — sazba je rozhodnutí zadavatele (ACRM-110). - Kalendář trojice ‹●› — ACRM-91/97/103.
Navazující (mimo rodinu Button)
SegmentScreenvýběr řádků.sgb-ck→<Checkbox>(@acrm/ui): nejdřív změřit shodu vzhledu, převod až po C4 Dialogů (týž soubor). Story_segment-tabledo té doby drží port sds-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.smsmazá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ů.btnz ds.css pryč, Dialer.dlr-simbtn→<Button>(klon z ds.css pryč). Tím legacy.btnv 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 =.tchips 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),.gaVš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.
| Vlna | Co | MR | |
|---|---|---|---|
| 1 | hodnoty 1:1 kánonu (.gsp-act, .cd-ctl, .acrm-bulkbar-close), vizuál beze změny | !4057 | |
| 2a | ikonová ×/⋮ 20/26/28 px → IconButton sm | !4059 | |
| 2b | tlumené ikonové akce → IconButton (šuplík ▲▼⋮↗✕, RecordActionsMenu bez triggerClass, AI, schůzky) | !4064 | |
| 2c | textové 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 | |
| C | Ulož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 | |
| fix | akce 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-secondaryje pod AA 4,5:1 pro běžný text. ink-500#7d8184na--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éhoButton 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.