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 zds.css(:where(button, [role='menuitem'], …):focus-visible). disabledvzhled přepínacího chipu ale bydlí v CIZÍM sheetu —.lst-toggle:disabledvds/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-emptyslouží 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 jeapps/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řída | kde je definovaná | reálné použití |
|---|---|---|
.fb-chip | ds/filter-bar.css | FilterBar (filtr výpisů) |
.tchip | nemá základní pravidlo — jen .plpage .tchip, .acc-page .tchip, .tlx-bar .tchip | Section top bar, CheckMenu, timeline |
.acrm-fchip | ds/inputs.css §13 (32px) | SegmentBuilder |
.acrm-optchip | ds/inputs.css (přepínací) | 8 souborů (segmenty, call wrap-up) |
.acrm-tag | ds/inputs.css §12 (24px) | Tag input |
.acrm-rmchip | ds/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ález | Stav |
|---|---|---|
| D1 | Rodina Filter neměla žádnou story — 0 ukázek na webu | OPRAVENO (MR: 3 story soubory, 14 stories) |
| D2 | Registr popisoval Filter chip jako „click edits, x removes" — chip v liště žádný ✕ nemá, hodnotu ruší řádek „Vymazat filtr" v menu | OPRAVENO (summary přepsáno) |
| D3 | Chyběly usage.md a a11y.md pro všechny tři podkomponenty | OPRAVENO (6 souborů) |
| D4 | Registr neřekl, že React implementace je v appce, ne v @acrm/ui | OPRAVENO (pole notes) |
| D5 | Katalog Ladle nenačítal filter-bar.css ani list-view.css, takže .fb-* nešlo v katalogu vůbec ukázat | OPRAVENO (provider) |
3. Bug list — aplikace (kanon v kódu)
| # | Nález | Návrh | Kdo rozhodne |
|---|---|---|---|
| A1 | .tchip nemá základní pravidlo; tři stránky si ho deklarují po svém | zavést jedno pravidlo .tchip v ds.css a scoped kopie zrušit | AD + FE |
| A2 | disabled 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í F3 | AD |
| A4 | .acrm-fchip (segment builder) není v registru DS vůbec | zapsat jako podkomponentu, nebo sjednotit s .fb-chip | AD |
| 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 —
.tchipjední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
deprecateds náhradou Tag input a CSS §14 i ukázku z/ds/inputsodstranit, 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ď
- MR do acrm
polish/ds-filter-family-stories— stories + zpřístupnění CSS katalogu, se zámkemno-auto-merge, dokud rodinu neschválíš na webu. - DS repo: registr,
usage.md,a11y.md, tenhle review. - Po schválení:
approvedAtdo registru a teprve pak F2/F3/F4 jako samostatné MR.
Source: docs/REVIEW-filter-family.md · GitLab