Plášť je kanon. .acrm-dialog + modifikátor .deal, střední 640, v Reactu <Dialog size="m"> z @acrm/ui. Roste s obsahem do 80vh, pak scrolluje tělo. Mezera mezi akčními tlačítky v patičce = vždy var(--sp-3).
Jeden dialog pro celou app. Jediný host v AppShellu + openDeal({ subjects, stageId, pipelineId }). NewCompanyDealDialog, NewDealDialog i NewDealForm v šuplíku .pdr zanikají — s nimi tři různé sady polí pro tentýž objekt.
Jedno pole. Název je jediný povinný vstup a jediný, který má vizuální váhu. Vše ostatní je meta chip v patičce nebo opt-in blok. Žádné labely nad poli, žádná hvězdička u povinného.
Povinnost nese primár. Bez názvu je „Vytvořit“ neaktivní. Žádná hvězdička v labelu, žádná červená hláška po odeslání — uživatel se o chybě nedozvídá až po pokusu.
Meta lišta bez labelů. Při zakládání jen Fáze · Vlastník — dva chipy, které mají vždy default (podle místa založení, resp. „já“), takže nikdy nejsou prázdné. Objem a Uzavření se při vytváření nezobrazují — v 99 % je obchodník nezná; doplňují se až na obchodu a chip se ukáže, jen když hodnotu nese (viz vyplněná instance). Víc než čtyři meta pole je signál, že pole patří na obchod, ne do zakládání.
Objem, ne „Očekávaný obrat (Kč, nepovinné)“. Jeden název pro jedno pole v celé app. Měnu nese overlay — závorky v labelu mizí. Částka je v dialogu vždy plná; zkracuje se až v railu a na kartách obchodu.
Poznámka je opt-in, a je to obsah. Většina obchodů vzniká bez ní — trvale otevřené velké pole by ubíralo váhu názvu. Proto je afordancí v těle („Přidat poznámku“), ne meta chipem v patičce: meta popisuje obchod, poznámka je samostatný záznam. Prázdná se při zavření sama sbalí. Uvnitř platí @ zmínky a autoformát jako v poznámce na záznamu.
Dvě volání, dva stavy. Obchod vzniká první, poznámka druhá. Jakmile obchod existuje, dialog se zavírá jako při úspěchu — obchod se hned objeví na kartě i na nástěnce — a selhání poznámky nese kanonický DS.toast.error s akcí „Uložit znovu“. Dialog se kvůli poznámce znovu neotevírá a primár se nepřejmenovává: jakmile je obchod založený, tenhle dialog už není formulář na zakládání a nechat ho otevřený by znamenalo lhát o tom, co je. Akce v toastu musí nést text poznámky s sebou — jinak slibuje uložení něčeho, co už uživatel nemá. Nikdy nevznikne druhý obchod.
Ikona entity = businessplan. Jedna ikona obchodu v celé app — v hlavičce dialogu, v railu, v našeptávači i v notifikacích. briefcase na kartě firmy je odchylka a patří kariéře, ne obchodu.
Zakládání není šuplík. Šuplík .pdr je plocha pro čtení a editaci existujícího záznamu. Nový obchod je commit — patří do dialogu, na nástěnce stejně jako všude jinde.
Overlaye portálované, bez nadpisů. Subjekt, objem, fáze, vlastník i datum žijí nad dialogem — jinak je ořízne overflow pláště (.acrm-popover 101 nad dialogem 80/90; bez portálu by ho ořízl overflow). Dropdown nikdy nemá nadpis nad položkami.
Jeden i18n namespace. Dnes je týž dialog přeložený třikrát (company-record.deals, person-record.deals, pipeline.form) a názvy polí se rozcházejí. Kanon má vlastní namespace deal a jediné znění.
Kebab v patičce = vedlejší cesty založení. „Vytvořit a odeslat“ založí obchod s příznakem sendOffer a workflow engine sám zařadí nabídku (mail ze šablony) do fronty „K odeslání“ a založí follow-up úkol +7 dní. Žádný composer se neotevírá — mail jde do odeslání zrušit nebo upravit; toast po založení řekne, že nabídka je ve frontě. „Přidat produkty“ přidá do těla další blok s multiselectem produktů (stejný opt-in vzor jako poznámka). Obě jsou menšinové, proto kebab a ne třetí tlačítko — patička drží jeden primár.
Datum podle konvence. Uzavření se píše „30. 9.“, rok jen když je potřeba, vždy přes i18n/dates.ts. Žádné tabular-nums u data.
Mobil = šuplík ze spoda. Pod 720 px podle kanonu z karty Dialog úkolu: plná šířka, grabber, meta chipy nad jediným velkým CTA, „Vytvořit další“ jen na desktopu. Gesto dolů / scrim = Esc, rozepsaný obchod se ptá.