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

Datum: 4. 9. 2026 · zdroj pravdy: origin/main acrm (/root/acrm-main, ea77d2cdb) · web: <http://192.168.230.131:3777/ds/components/filter/filter-bar?preview=ds-filter-family-stories>

0. Shrnutí

Rodina má tři podkomponenty. Dvě z nich (Filter bar, Filter chip) jsou skutečný kanon: jednu implementaci, jasně zdokumentovanou přímo v CSS, s doloženými rozhodnutími (ACRM-43/49/50/51, F257, D6). Třetí — Removable chip — nemá v celé aplikaci jediné použití: existuje jen jako CSS a jako ukázka na vývojářské stránce /ds/inputs. Vedle toho v repozitáři žije šest nezávislých „chip" rodin pro to, co design popisuje jako jeden opakující se vzor.

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

1.1 Filter bar (apps/web/src/components/FilterBar.tsx, ds/filter-bar.css)

  • Jediná implementace, 1104 řádků, sama sebe dokumentuje v hlavičce CSS. Není v packages/ui — je to aplikační komponenta, takže do katalogu se dostane jen jako markup (stories ji staví 1:1).
  • Stavy v CSS: :hover (chip, spojka, add/reset/save, opt, clear), .open, .or, .set, .on, :focus-within (jen .fb-search). Focus ring není chyba — všechny prvky jsou <button>, takže berou základní ring z ds.css (:where(button, [role='menuitem'], …):focus-visible).
  • disabled vzhled přepínacího chipu ale bydlí v CIZÍM sheetu — .lst-toggle:disabled v ds/list-view.css. Chip mimo výpis tedy žádný disabled vzhled nemá.

1.2 Filter chip + menu (ChipMenu tamtéž)

  • Menu je vnitřek kanonického .acrm-popover; hledání je kanonický .acrm-recordselect-search (po F257 už NE vlastní kopie se sticky offsetem) — to je správně a je to vzor pro ostatní.
  • .fb-empty slouží zároveň jako prázdný i jako načítací stav (mění se jen věta). Žádný spinner.
  • Chybí přechod klávesnicí do menu — společná vada s Popoverem (viz REVIEW-popover-family.md).

1.3 Removable chip (ds/inputs.css §14)

  • Nula produktových použití. Jediný výskyt .acrm-rmchip* v repu je apps/web/src/pages/DsInputsPage.tsx (dev katalog, trasa /ds/inputs).
  • Překrývá se s Tag inputem (.acrm-tag, 24px, radius-sm), který se v appce reálně používá (AiZamestnanciPage, ProduktDetailPage, PruvodceFirmyPage) a má i story.
  • Odebírací tlačítko má 17px — pod doporučeným minimem cíle.

1.4 Šest „chip" rodin na jednu práci

třídakde je definovanáreálné použití
.fb-chipds/filter-bar.cssFilterBar (filtr výpisů)
.tchipnemá základní pravidlo — jen .plpage .tchip, .acc-page .tchip, .tlx-bar .tchipSection top bar, CheckMenu, timeline
.acrm-fchipds/inputs.css §13 (32px)SegmentBuilder
.acrm-optchipds/inputs.css (přepínací)8 souborů (segmenty, call wrap-up)
.acrm-tagds/inputs.css §12 (24px)Tag input
.acrm-rmchipds/inputs.css §14 (26px)0

.fb-chip sám v komentáři říká „metriky 1:1 s .tchip" — a .tchip přitom nemá kde být definovaný jednou.

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

#NálezStav
D1Rodina Filter neměla žádnou story — 0 ukázek na webuOPRAVENO (MR: 3 story soubory, 14 stories)
D2Registr popisoval Filter chip jako „click edits, x removes" — chip v liště žádný ✕ nemá, hodnotu ruší řádek „Vymazat filtr" v menuOPRAVENO (summary přepsáno)
D3Chyběly usage.md a a11y.md pro všechny tři podkomponentyOPRAVENO (6 souborů)
D4Registr neřekl, že React implementace je v appce, ne v @acrm/uiOPRAVENO (pole notes)
D5Katalog Ladle nenačítal filter-bar.css ani list-view.css, takže .fb-* nešlo v katalogu vůbec ukázatOPRAVENO (provider)

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

#NálezNávrhKdo rozhodne
A1.tchip nemá základní pravidlo; tři stránky si ho deklarují po svémzavést jedno pravidlo .tchip v ds.css a scoped kopie zrušitAD + FE
A2disabled chipu je v ds/list-view.css (.lst-toggle:disabled)přesunout do filter-bar.css k chipu, kterého se týkáFE (bez vizuální změny)
A3.acrm-rmchip* bez použitíviz rozhodnutí F3AD
A4.acrm-fchip (segment builder) není v registru DS vůbeczapsat jako podkomponentu, nebo sjednotit s .fb-chipAD
A5.fb-empty nese i „načítám"ponechat (jedna vrstva, žádný spinner) — jen zdokumentováno—

4. Rozhodnutí pro AD

  • F1 — Filter bar a Filter chip jako kanon. Prohlásit obojí za schválené (approvedAt) na základě ukázek na webu. Doporučuji ano — implementace je jedna a je dobře odůvodněná.
  • F2 — .tchip jedním pravidlem (A1). Sjednotit metriky chipu na jednom místě a zrušit tři scoped kopie. Doporučuji ano, je to tichá oprava bez vizuální změny.
  • F3 — osud Removable chipu. Buď (a) označit deprecated s náhradou Tag input a CSS §14 i ukázku z /ds/inputs odstranit, nebo (b) nechat jako kanon a najít mu první použití. Doporučuji (a) — mrtvý vzor v DS je horší než chybějící: svádí k tomu, aby ho někdo použil místo Tag inputu, a pak budeme mít dva chipy na totéž.
  • F4 — .acrm-fchip (A4). Zapsat segmentový chip do registru jako vlastní podkomponentu, nebo ho sjednotit s Filter chipem. Doporučuji zapsat teď a sjednocení řešit s rodinou Segment.

5. Co teď

  1. MR do acrm polish/ds-filter-family-stories — stories + zpřístupnění CSS katalogu, se zámkem no-auto-merge, dokud rodinu neschválíš na webu.
  2. DS repo: registr, usage.md, a11y.md, tenhle review.
  3. Po schválení: approvedAt do registru a teprve pak F2/F3/F4 jako samostatné MR.

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