Review rodiny Select — 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
select(10 podkomponent) po dávce Forms & input, posouzená novým postupem (schválen 2. 9. 2026: inventura použití → stavová matice z kódu → story = port → design gate → web nelže → validator → tikety až po merge + AD). Ověřeno proti: acrmorigin/main4f9af7cb(klon/root/acrm-main), stories MR !2824 (větevpolish/ds-select-family-stories,b3bb971d, open,no-auto-merge), DS reposite/registry.json+docs/select/*(a6112aa), web:3777/ds/components/select/<sub>?tab=examples(screenshoty všech 10 stránek v/root/.claude/jobs/1ba41f0e/tmp/review-select-*.png).
0. Shrnutí
Rodina je dobře inventarizovaná (docs znají všech 20+ pickerů v appce a správně pojmenovávají duplicity), ale web dnes lže na všech deseti stránkách: registr odkazuje na 41 story id z MR !2824, které v buildu katalogu (main) neexistují — každá sekce Examples ukazuje Ladle „Story not found", a přitom coverage svítí „stories ✓". To je přesně to, co má bod 5 nového postupu zakázat. Vedle toho se opakuje D10 z Buttonu (legacy story vedle nové v Defaultu u 3 subů) a D4 (vypůjčená story components--select--dropdown-types jako „Composition" u Entity/Product pickeru).
Z 10 podkomponent jsou všechny použité (žádný kandidát bez použití), ale dvě jsou tenké (Multi-select 1 místo, Combobox 1 místo) a dvě nejsou prvky, ale duplicity pláště (Entity picker, Product picker = AddRefMenu nad kanonickými řádky Record selectu — docs to samy říkají). Stories: žádná Composition není port (0× soubor:řádek, 7 vymyšlených layoutů, 2 porušují pravidlo skládané komponenty), 6 variant/stavů ukazuje props, které appka nepoužívá, a Rail picker ukazuje stav „busy", který žádné CSS nemá (repríza ACRM-79).
V appce: tři field-triggery jedné rodiny mají tři různé stavové sady (Select má hover+error, Record select nemá hover ani error, Combobox nemá hover/error/disabled ani focus ring bez otevřeného seznamu), single Record select kreslí checkbox místo fajfky (F261 — kanon je jen v RailPickerMenu), poslední nativní <select> žije v ChannelsPopoverEditor, a 10 dropdown plášťů stojí mimo Popover/useAnchoredMenu.
1. Nálezy per podkomponenta (ověřeno v kódu)
Inventura použití = grep '<Komponenta' v apps/web/src bez testů a bez DsInputsPage (galerie není použití).
| Sub | Použití (soubory) | Příklady | Verdikt |
|---|---|---|---|
| Select | 79 | pages/AccountingInvoiceEditPage.tsx, pages/DocumentDetailPage.tsx | canon |
| Multi-select | 1 | components/person/PersonRail.tsx | canon, tenký (viz R2) |
| Combobox | 1 | components/accounting/ChartAccountDialogs.tsx | canon, tenký (viz R2) |
| Record select | 39 | pages/ProduktyPage.tsx, components/acl/TransferDialog.tsx | canon |
| Nav select | 15 | pages/AktivityPage.tsx, pages/PipelinePage.tsx | canon |
| Picker menu | 11 | pages/CompanyRecordPage.tsx, pages/CrmDashboardPage.tsx | canon |
| Check menu (app) | 2 | activity/CategoryFilterChip.tsx, record/LayoutMenu.tsx | canon by anatomy, app-side (R5) |
| Rail picker (app) | 2 | TagsEditor.tsx, record/OwnerPickerEditor.tsx | canon by anatomy, app-side (R5) |
| Entity picker (app) | 12 | pages/MeetingDetailPage.tsx, deal/DealDialog.tsx | duplicita pláště — není vlastní prvek (R1) |
| Product picker (app) | 2 | callwrapup/CallProducts.tsx, products/MeetingProductsSection.tsx | duplicita pláště — není vlastní prvek (R1) |
1.1 Select (packages/ui/src/components/Select.tsx)
- Stavová matice z CSS (
ds/inputs.css): trigger rest 227 · hover 244 (--surface-75) · placeholder 247 · open 262 (accent + halo) · error 266 (.is-error) · disabled 270 · ignored 278 (.is-select-ignored, 1 použití ImportPage) · focus = globální ringds.css:2805. Chybí:active,loading,readonly(žádný z nich appka nepotřebuje). Řádky.acrm-popover-item(ds.css:1929): rest · hover 1943 · disabled 1946 · selected.chk1997. - Použití stavů v appce:
disabled10 souborů ✓,<option disabled>2 ✓;className="is-error"0,placeholderprop 0,required0. Chyby formulářů jdou přesField errorpod polem, trigger se nikdy nečervená. - Story States ukazuje rest · placeholder · disabled · error · open. Error a placeholder = stavy, které CSS má, ale appka nepoužívá (D5).
.is-select-ignored(jediný app-only stav) ve story není. - Story Composition „Město / Země" + „Jazyk s hintem" — bez
soubor:řádek, vymyšleno (D4). - Replika open stavu (
select-shared.tsxMenuItem) emitujearia-checked, Select emitujearia-selected(D6). - Default na webu = legacy
components--inputs--select+ novácomponents--select--defaultvedle sebe — repríza D10 (D2). Story soubor to výslovně hájí („its visual baseline depends on it") — baseline se přesune, není to důvod.
1.2 Multi-select (MultiSelect.tsx)
- Matice: sdílený
.acrm-select-trigger(stavy jako Select); řádky.acrm-popover-item+.acrm-checkbox(inputs.css:660, on 683, mixed 687 — mixed komponenta neemituje). Listbox bezaria-multiselectable(A12). - Použití: 1 místo (PersonRail, s
placeholder);summary0,disabled0. - Story Variants „custom summary" = prop bez použití (D5). „≤2 joined / >2 count" ✓ z kódu 399–406.
- Story Composition „filter row Kanály/Období" — vymyšleno; filtry aktivit v appce dělá
CategoryFilterChip+ CheckMenu, ne MultiSelect (D4).
1.3 Combobox (Combobox.tsx)
- Matice (
inputs.css:323): pole rest · open 334 (accent + halo). Nic víc: žádný hover, error, disabled (komponenta nemádisabledprop, story to přiznává v Note), a input máoutline: none→ fokusované pole se zavřeným seznamem nemá žádný viditelný fokus (a11y.md to eviduje jako limit; je to A-bug, ne limit) (A1). Řádky.acrm-combobox-optrest ·.is-active383. - Použití: 1 místo (ChartAccountDialogs);
leadingIcon0,renderOption0,emptyText0 (přímo v<Combobox>). - Story Variants „custom renderOption (icon + label)" a celá sekce „With icon & kbd" (3× leadingIcon, kbd slot neexistuje) = props bez použití (D5, D8).
- Story Composition „address form" — vymyšleno; jediné reálné použití je účetní dialog (D4).
1.4 Record select (RecordSelect.tsx)
- Matice (
inputs.css:437): trigger rest (--fg-muted) · filled 454 · disabled 457 · open 475. Chybí:hover(Select trigger ho má) a.is-error— přitom Record select stojí ve 23 formulářích sclearable(assignee/owner) a 24×fullWidthve formulářích s validací (A1). Panel: search 490, list 530, řádek 538 · hover 550 ·.is-active551 (nikdo neemituje — mrtvý selektor, A5) ·.acrm-recordselect-ck588 (RecordSelect neemituje, jen RailPickerMenu — F261, A2) · empty 598. - Použití: 39 souborů;
multi2 (AiFormFields, ShareDialog),disabled4,clearable23,fullWidth24,searchPlaceholder14. - Story Sizes =
fullWidth(280 px vs 100 % kontejneru). To je layout prop, ne velikost — rodina nemá škálu velikostí (D9). - Story States ✓ (placeholder · filled · disabled · open · open-empty); hover chybí v CSS → správně není ve story. Note poctivě přiznává F261.
- Story Composition „deal form Vlastník/Firma" — vymyšleno;
DealDialog.tsx:584,642používáEntityPicker, ne RecordSelect (D4). - JSDoc komponenty: „Trigger otevíraný focusem" — kód otevírá jen
onClick(A7). Search input bezaria-label(RailPickerMenu ho má), fokus se po zavření nevrací na trigger (Select vrací) (A7).
1.5 Nav select (NavSelect.tsx)
- Matice (
ds.css:2650.tchip): rest · hover 2666 · open 2669 (--active-surface) · focus globální. Bez disabled (komponenta ani CSS), bez active. Menu = PickerMenu. - Použití: 15;
icon=14,align=4;descu options jsme v appce nenašli (0 v inlineoptions). - Story Variants „options with desc (count as tag)" = D5 (ověřit, zda
descněkdo plní; jinak sekci škrtnout). „With icon & kbd" = chip ikony (arrows-sort,filter) — ikony ✓ používané, kbd neexistuje → přejmenovat obsah sekce, ne vymýšlet. - Story Composition:
SectionTopBar„Aktivita" + 2 NavSelecty +Spacer+primaryAction„Nová aktivita". ReálnáAktivityPage.tsx:240–252:SectionTopBarTitle icon="inbox"· Spacer PŘED NavSelectem (chipy vpravo) · žádný primaryAction. Story navíc dává Spacer i primaryAction (SectionTopBar vkládá.vspacepřed primár sám,SectionTopBar.tsx:86) = dvě výplně (D4).
1.6 Picker menu (PickerMenu.tsx)
- Matice řádků
.acrm-popover-item: rest · hover · disabled (:disabled1946 — PickerItem nemádisabled, stav přes komponentu nedosažitelný) · selected.chk·.danger2019 ·.strong2010 (0 emitentů v rodině). Trigger je render-prop (stav open dodá volající:.tchip.open,.rvsw-btn.open— 2 soubory). - Použití: 11;
header7,dot(CrmDashboardPage, mail-glyphs) ✓,disabled1 (deal-parts),align1. - Story States „trigger disabled (menu does not open)":
PickerMenu.disabledjen odpojí klik a trigger musí být disabled sám (a11y.md: „does not disable the trigger visually or for AT") — story to zakrývá tím, že disabled dá Buttonu (A8). „row hover (--hover-surface) / danger row (static replica)": statická replika hover neukáže, popisek lže (D6). - Story Composition „kebab menu — actions with separator and danger row": usage.md téže podkomponenty říká „Actions… use
<Popover>directly… no check mark; Not: Picker menu". Kebab tedy patří rodině Popover; story porušuje pravidlo komponenty, kterou dokumentuje (D4). „Section title as switcher" ✓ odpovídáCompanyRecordPage/PipelinePage— chybísoubor:řádek. - „With icon & kbd" = tytéž ikonové řádky jako Variants + živý trigger s dot → duplikát (D8).
- Default na webu = legacy
components--popover-menu--picker-menu+ nová (D2).
1.7 Check menu (app, components/CheckMenu.tsx + ds/check-menu.css)
- Matice: řádky
.acrm-popover-item[menuitemcheckbox]+.acrm-checkbox; reorder.cm-reorder(grab/grabbing),.cm-dragging0.45,.cm-drop-line3 px.CheckMenuItemnemádisabled→ řádek disabled nedosažitelný (story ho nepoužívá ✓). - Použití: 2 (CategoryFilterChip, LayoutMenu s
onReorder). - Story Default/Composition chip: replika
.tchipmáfilter·.vlabel ·.kcount za hodnotou. ReálnýCategoryFilterChip.tsx:69–76:filter·.klabel ·.vsummary · chevron. Pořadí i význam slotů obráceně (D4). - Story Composition „⚙ layout menu": trigger
button.acrm-icobtnv ručně kresleném řádku sekce. ReálnýLayoutMenu.tsx:61–75:button.a.sb-cfg(tichá akce hlavičky,section-block.css:126, viditelná až po najetí na nadpis), ne icon button (D4). Popisek.kcount neexistuje. - Katalog nyní načítá
check-menu.css(v MR) ✓;section-block.cssne → i správně portovaný trigger by se nevykreslil (D7).
1.8 Rail picker (app, components/RailPickerMenu.tsx)
- Matice: panel
.acrm-recordselect-pop(bez vlastních stavů) ·aria-busy(žádné CSS — jediné[aria-busy]v appce jereservation.css) · loading/empty =.acrm-recordselect-empty· single.acrm-recordselect-ck· multi.acrm-checkbox· kotva.rr-ev.rpk-anchor(record-rail.css:1090,--hover-surface) · patička.rpk-foot/.rpk-create(record-rail.css:1094–1105). - Použití: 2 (OwnerPickerEditor
mode="single", TagsEditor multi + footer + loading + busy). - Story States „busy (aria-busy) — rows stay clickable" = vizuálně totéž co rest (žádné CSS) → repríza ACRM-79: story prezentuje neexistující stav (D6).
- Story Variants „with footer":
.rpk-foot/.rpk-createjsou vrecord-rail.css, kterou katalog nenačítá — story vykreslí patičku bez linky a bez accentu a v komentáři to přiznává. Patička je součást panelu, ne railu → patří doinputs.css§7 (A6), nebo katalog načterecord-rail.css(D7). - Composition záměrně chybí (kotva = řádek railu, rodina Record rail) ✓ — ale kotva
.rr-ev.rpk-anchorje v registru jako třída subu a na webu se nikde nekreslí.
1.9 Entity picker (app, EntityPicker.tsx + AddRefMenu.tsx)
- Fakt: 12 použití; plášť
.acrm-popover.eref-add-pop+useAnchoredPanel= druhá implementacePopover+useAnchoredMenu(scroll/resize repozicuje místo zavření, bez scrimu, bez návratu fokusu). Řádky kanonické (.acrm-recordselect-opts.mi-opt-icdlaždicí místo avataru — třetí anatomie řádku). Docs to popisují správně („duplicate shell — consolidation candidate MR 15"). - Registr: status
canon+ Composition = vypůjčenácomponents--select--dropdown-types, která EntityPicker vůbec nekreslí (panel D je popsán jako „RecordSelect multi / RailPickerMenu multi / TagsEditor"). Web ji přesto ukazuje jako jediný příklad Entity pickeru (D3). - Verdikt: není samostatný prvek — je to Record select
multis async options + tokenyEntityRef removable(rodina Entity reference). Do konsolidace vést jakodeprecated(cíl: Record select async), ne jako canon (R1).
1.10 Product picker (app, ProductPicker.tsx)
- Fakt: 2 použití; stejný plášť jako Entity picker; navíc řádek volného textu (P7) a stavová pilulka u draft produktů (P8).
multi={false}0 použití — docs ho popisují jako variantu. - Registr/web: stejný problém jako 1.9 (vypůjčená story, D3). Docs „group heading pending AD gate V2" — v kódu žádný heading není ✓.
- Verdikt: jako 1.9 — Product picker = Entity picker s
types=['product']+ volný text; jeden prvek, ne dva (R1).
1.11 Rodinová story „Dropdown types" (select.stories.tsx DropdownTypes)
- Čtyři panely A–D ze statických replik, popisky správně jmenují komponenty. Je to jediná story, která má smysl jako přehled rodiny — patří na stránku rodiny (
/ds/components/select), ne do Composition Selectu ani jako výpůjčka jinam (D3).
2. Bug list — DS (web, registr, stories, docs)
| # | Kde | Chyba | Oprava | Rozhoduje | ||
|---|---|---|---|---|---|---|
| D1 | registr + web | registr (232bed9) odkazuje na 41 story id z nemergnutého MR !2824 → všech 10 stránek ukazuje „Story not found" v každé sekci; coverage svítí „stories ✓" (počítá se z registru, ne z buildu) | web: story mimo meta.json nevkládá iframe (jen řádek „čeká na MR !2824" s odkazem na MR); cover.stories a baseline jen z id přítomných v buildu; proces: story id do registru až po merge (nebo pole pendingMr, které web zobrazí jako pending) | — | ||
| D2 | registr | legacy story v Default u Select (components--inputs--select), Nav select (components--popover-menu--nav-select), Picker menu (components--popover-menu--picker-menu) = repríza D10; story soubory to hájí baselinou | legacy id z registru pryč; baseline přesunout na novou Default; legacy story smazat v MR !2824 (forms.stories.tsx:29–43, overlays.stories.tsx:294–340) | — | ||
| D3 | registr | Entity picker a Product picker mají Composition = vypůjčená components--select--dropdown-types, která je nekreslí; táž story je i u Selectu jako Composition | u EP/PP story pryč (sekce se pak nevypíše); dropdown-types = přehled rodiny na /ds/components/select (nový slot family.stories), ne Composition subu | — | ||
| D4 | stories | 0 Composition má soubor:řádek; vymyšlené: Select (Město/Země), Multi-select (Kanály/Období), Combobox (adresa), Record select („deal form" — DealDialog používá EntityPicker), Nav select (Aktivita bar s primárem a Spacerem za chipy — AktivityPage.tsx:240 má Spacer před a bez primáru), Check menu (chip .k/.v obráceně vs CategoryFilterChip.tsx:69; trigger .acrm-icobtn místo .a.sb-cfg z LayoutMenu.tsx:61); Picker menu „kebab" = action menu rodiny Popover, vlastní usage.md ho zakazuje | každá Composition = 1:1 kopie jednoho místa appky s komentářem // port: apps/web/src/…tsx:NN; kebab pryč (patří Popoveru); Select → ShareDialog.tsx (Select úroveň + RecordSelect osoba); Record select → TransferDialog.tsx/MemberDialog.tsx; Multi-select → PersonRail.tsx; Combobox → ChartAccountDialogs.tsx; Nav select → AktivityPage.tsx:240; Check menu → CategoryFilterChip + LayoutMenu 1:1 | — | ||
| D5 | stories | varianty/stavy bez použití v appce: Select is-error (0), placeholder (0); Multi-select summary (0), disabled (0); Combobox renderOption (0), celá „With icon & kbd" = leadingIcon (0); Nav select desc tag (0 nalezeno) | story ukazuje jen to, co appka používá; nepoužité props = A5 (smazat nebo dát reálné místo) | AD u is-error (R3) | ||
| D6 | stories | stavy, které nic nekreslí: Rail picker „busy" (žádné CSS pro aria-busy) = rest; Picker menu „row hover" ve statické replice; MenuItem replika Selectu emituje aria-checked místo aria-selected | „busy" pryč (není vizuální stav); hover neslibovat, kde se nedá ukázat (nebo simulovat třídou jen tam, kde CSS má .is-active); replika 1:1 s emitovaným markupem | — | ||
| D7 | stories + katalog | Rail picker patička .rpk-foot/.rpk-create a kotva .rr-ev.rpk-anchor bez CSS (katalog nenačítá record-rail.css); Check menu trigger .a.sb-cfg by potřeboval section-block.css | po A6 patička v inputs.css; katalog načítá tytéž vrstvy jako main.tsx (pravidlo z .ladle/components.tsx už platí — jen ho dodržet) | — | ||
| D8 | stories | „With icon & kbd" u Picker menu = duplikát Variants (kbd slot neexistuje); u Combobox = nepoužité leadingIcon; u Nav select = chip ikony (ok obsah, špatný název sekce) | sekce jen tam, kde existuje slot ikony NEBO kbd v komponentě a appka ho používá: Nav select ano (icon= 14×), Picker menu ne (ikony jsou Variants), Combobox ne | — | ||
| D9 | stories | Record select „Sizes" = fullWidth (280 px → 100 %) — layout prop, ne velikost | sekci Sizes vynechat (rodina nemá škálu); fullWidth do Variants s popiskem „280 px / 100 %" | AD (R6) | ||
| D10 | registr | třídy, které sub nekreslí: Record select .acrm-recordselect-ck (jen RailPickerMenu), Picker menu .acrm-popover-empty (jen TemplateMenu), .acrm-recordselect-opt.is-active (nikdo) | registr = jen emitované třídy; .is-active smazat (A5); .acrm-recordselect-ck u Record selectu až po A2 | — | ||
| D11 | docs | check-menu.usage.md Stories: „states (on/off, disabled, reorder…)" — story disabled nemá; product-picker.usage.md popisuje multi={false} (0 použití); nav-select.usage.md slibuje desc → .tag (bez použití); combobox.a11y.md vede „no focus ring while closed" jako limit — je to bug (A1) | docs opravit po A1/A5; „Known limits" nesmí schovávat opravitelné chyby | — | ||
| D12 | web | coverage řádek „props ✓" u app-css subů (Check menu, Rail picker, Entity/Product picker) — react: [], ✓ je z classes (`cover.api = props \ | \ | classes`) | řádek pojmenovat „API" nebo rozdělit props/classes; ✓ jen za to, co je pravda | — |
| D13 | proces | registr + docs rodiny commitnuty do DS main před merge stories MR → web lže od 232bed9 (dnes) až do merge | DoD: registr story ids + coverage až po merge acrm MR; do té doby sub beta s viditelným „stories pending MR !NNNN" | AD |
3. Bug list — aplikace (kanon v kódu)
| # | Kde | Chyba | Oprava | Rozhoduje | |
|---|---|---|---|---|---|
| A1 | inputs.css .acrm-recordselect-trigger (437), .acrm-combobox (323) | tři field-triggery, tři stavové sady: Select má hover+open+error+disabled; Record select bez hover a error; Combobox bez hover, error, disabled a bez fokusu se zavřeným seznamem (input{outline:none}, ring jen .is-open) | jedna sada pro všechny tři: rest · hover --surface-75 · focus/open accent+halo · error --critical · disabled --surface-75; Combobox dostane disabled prop + :focus-within ring | AD potvrdí sadu (R4) | |
| A2 | RecordSelect.tsx:270, :139 | single kreslí .acrm-checkbox (slibuje multi) místo .acrm-recordselect-ck (F261); filtr toLowerCase bez diakritiky (RailPickerMenu má foldText) | multi ? .acrm-checkbox : .acrm-recordselect-ck; foldText do @acrm/ui (nebo sdílený util) | — | |
| A3 | ChannelsPopoverEditor.tsx:626 | poslední nativní <select class="phe-type"> (ds-ok komentář: „box do řádku nepatří") | tichý trigger typu A (text + chevron, bez boxu) nad PickerMenu; validator select-native-prefer-component warn → hard po opravě | — | |
| A4 | 10 pláštů mimo Popover/useAnchoredMenu | AddRefMenu+useAnchoredPanel (EntityPicker, ProductPicker, RecordSearchSelect), .rcpt-menu (RecipientInput, AssignPicker), .itm-ac-pop (deal-parts), .sgb-ac-pop/.prof-pop (PruvodcePage, PruvodceFirmyPage), .ac-pop (segment builder), .segpick-pop (SegmentBuilder), .file-menu (SubjectFilesTab, AttachmentsSection), .tl-rowmenu (TimelineRowMenu), .phe-pop+.phe-ccrow (DialCodePicker, EntityRowsPopoverEditor) | plán PLAN-dropdown-sjednoceni.md MR 7/10/15 + doplnit ty, které plán nezná (.file-menu, .tl-rowmenu, .segpick-pop, .sgb-ac-pop, .prof-pop); validator: nová třída *-pop/*-menu s `position: fixed\ | absolute mimo .acrm-` = warn, po vlně hard | — |
| A5 | mrtvé / nepoužité | .acrm-select (ds.css:131, box pro nativní select, 0 použití); .acrm-recordselect-opt.is-active (0 emitentů); .acrm-popover-item.strong (0 v rodině); Select.placeholder prop, Select.is-error, MultiSelect.summary, Combobox.leadingIcon/renderOption, PickerMenu.disabled (1, viz A8), NavOption.desc (0 nalezeno) | CSS smazat; props buď dostanou reálné místo (viz R3), nebo se z API škrtnou — komponenta bez mrtvých větví | AD u is-error (R3) | |
| A6 | record-rail.css:1094–1105 | .rpk-foot, .rpk-create = patička panelu Record select, žije v CSS railu → každý konzument mimo rail (katalog, budoucí dialog) ji kreslí nestylovanou | přesunout do inputs.css §7 jako .acrm-recordselect-foot / .acrm-recordselect-opt.is-create; .rr-ev.rpk-anchor zůstává v railu (je to stav řádku) | — | |
| A7 | RecordSelect.tsx | JSDoc „trigger otevíraný focusem" ≠ kód (jen klik); šipky neotvírají; fokus se po zavření nevrací na trigger (Select vrací); search input bez aria-label (RailPickerMenu má) | sjednotit s Selectem: ArrowDown/Enter/Space otvírá, Esc/pick vrací fokus, aria-label={searchPlaceholder}; JSDoc opravit | — | |
| A8 | PickerMenu.tsx:265 | disabled jen odpojí klik na kotvě; trigger zůstává aktivní pro klávesnici a AT (a11y.md to přiznává); .acrm-popover-item:disabled existuje, ale PickerItem/CheckMenuItem nemají disabled | buď disabled = komponenta klonuje trigger s disabled+aria-disabled, nebo prop smazat (1 použití deal-parts to zvládne na Buttonu); disabled položky přidat jen s reálným místem | AD (R7) | |
| A9 | PickerMenu, CheckMenu, NavSelect, MultiSelect, RecordSelect | menu bez šipkové navigace / Home/End / návratu fokusu — jen Select to umí (Select.tsx:182–227) | klávesovou logiku Selectu vytáhnout do useMenuKeys v @acrm/ui a použít ve všech menu typu A/C/B | — | |
| A10 | listboxy multi | MultiSelect, RecordSelect multi, RailPickerMenu multi bez aria-multiselectable="true" (docs to vedou jako limit) | doplnit atribut (Popover dostane multiselectable prop) | — | |
| A11 | MultiSelect, Combobox | 1 reálné použití každý; typ C v appce dělá CheckMenu (FilterBar, CategoryFilterChip, LayoutMenu) — dvě implementace typu C | R2: buď MultiSelect = CheckMenu na .acrm-select-trigger (jedna implementace), nebo CheckMenu do balíčku a MultiSelect nad ním | AD | |
| A12 | EntityPicker, ProductPicker, RecordSearchSelect | tři komponenty = Record select s async options + tokeny; třetí anatomie řádku (.mi-opt-ic dlaždice místo avataru) | RecordSelect dostane loadOptions (async) + renderLeading (avatar \ | dlaždice typu); EP/PP = tenké obaly (tokeny + RecordSelect), AddRefMenu a useAnchoredPanel smazat; RecordSearchSelect smazat | AD (R1) |
4. Rozhodnutí pro AD
| # | Otázka | Návrh |
|---|---|---|
| R1 | Entity picker a Product picker v registru jako canon podkomponenty, nebo jako deprecated s cílem Record select async (A12)? | deprecated (status v registru, stránka zůstane s odkazem na cíl); po A12 smazat. Product picker = Entity picker types=['product'] + volný text — jeden prvek. |
| R2 | Multi-select a Combobox mají po 1 použití; typ C v appce = CheckMenu. Dvě implementace typu C? | CheckMenu do @acrm/ui, MultiSelect = CheckMenu s .acrm-select-trigger (jedna logika, dva triggery). Combobox ponechat (ARES/adresa mají přijít), ale opravit A1. |
| R3 | Chybový stav triggeru (.is-error, --critical rámeček) — má existovat? Dnes ho nikdo nepoužívá, chyby jdou textem pod pole. | Buď jednotně rámeček + text u všech tří triggerů (pak Field error nastaví třídu sám, ne volající), nebo .is-error smazat. Nedoporučuji stav, který má jen jeden trigger a nikdo ho nevolá. |
| R4 | Jedna stavová sada pro Select/Record select/Combobox trigger (A1): rest · hover · focus/open · error · disabled — potvrdit hodnoty (hover --surface-75, halo 16 %). | Ano; sada se zapíše do index.usage.md jako pravidlo rodiny a do validatoru (nový .acrm-*-trigger musí mít všech 5). |
| R5 | CheckMenu a RailPickerMenu žijí app-side; katalog ukazuje repliky, ne komponenty. Povýšit do balíčku? | Ano (obě jsou kanonické anatomií a mají 2 konzumenty) — pak stories skládají živou komponentu a sourceNote z registru zmizí. |
| R6 | Sekce „Sizes" u Record select (fullWidth) — nechat jako velikost? | Ne; rodina nemá škálu velikostí. fullWidth do Variants. |
| R7 | PickerMenu.disabled — opravit (trigger skutečně zablokovat), nebo smazat? | Smazat; disabled patří triggeru (Button/.tchip), menu se bez klikatelného triggeru neotevře. |
| R8 | „With icon & kbd" u rodiny Select: jen Nav select (chip ikony)? | Ano; u Picker menu ikony = Variants, u Combobox/Select/Record select/Multi-select slot neexistuje. |
5. Co teď
- Web (bez AD, dnes): D1 (iframe jen pro story v buildu, coverage z buildu, pending hint s odkazem na MR), D12 (řádek „API" místo „props"). Restart
element-inbox.service. - Registr + docs (bez AD, dnes): D2 legacy id pryč, D3 vypůjčené story pryč +
dropdown-typesjako rodinová story, D10 třídy, D11 docs; sub statusy zůstávajíbetado AD. - MR !2824 (zůstává
no-auto-merge): D4 Compositions přepsat jako porty ssoubor:řádek, D5/D6/D8/D9 škrty, D7 vrstvy katalogu, legacy stories smazat + baseline přesunout,pnpm visual:updatejen pro změněné. Brány: typecheck · lint · format:check · ds:validate:strict · ds:validate:usage. - acrm MR „select family — states & canon" (bez AD kromě R3/R4): A2, A5 mrtvé CSS, A6, A7, A10; validator:
select-native-prefer-component→ hard (po A3), nové pravidlodropdown-shell-bespoke(warn). A1/A3/A8/A9/A11/A12 po odpovědích R1–R7. - AD kolo: R1–R8 jedna otázka po druhé (viz pravidlo one decision at a time); tikety rodiny se zavírají až po merge obou MR a potvrzení na
:3777/ds/components/select.
Source: docs/REVIEW-select-family.md · GitLab