Rail

canon

The record panel: context actions, 34px key-value rows edited in place (several values = several rows), tags, description and relations.

Merged 14 September 2026 (AD, RD-1): Key-value row, Editable field and Multi-value were separate pages; they are parts of this one card. The app copy of the row (KeyValueRow, .pr-row) is being replaced by the rail row and deleted. A value with href/onOpen never opens the editor on click and keeps a permanently visible pencil (AD FA10-re); errors are the caller’s toast. The multi-value editor popover lives in the app (components/multivalue/*, ds/multi-value.css). Mobile sheet merged 15 September 2026 (MR !3539): below 720px `MultiValuePopover` renders as a bottom sheet instead of an anchored popover (`.phe-scrim`, `.phe-grab`, `.phe-sheethead`, `.phe-sheetfoot` in `ds/responsive.css`) so it can be closed and confirmed without a keyboard — see "Mobile" in rail.usage.md / rail.a11y.md. Stories rebuilt from the real person rail 15 September 2026 (acrm !3544): four quiet icon actions, Detail záznamu / Procesy / Seznamy, no empty section header; the rail has no shortcuts, so its „With icon & kbd" story and both its baselines are gone. Meeting attendees composition (owner 25.–27. Sep 2026, acrm !4014/!3985, all in `apps/web/src/ds/meeting-record.css` — not yet ported into record-rail.css): field `type: 'number'` for a small bounded count paired with `useConfirm` (speaker count, range 1–20 per the diarization service, raised from 10 on acrm !3985); a relation row's right-aligned talk-share bar (56px `--line-200` track, 4ch tabular-nums percentage) — candidate for a named "share bar" element; an unassigned-voice row with `--sp-3` icon-to-text / `--sp-4` name-to-action spacing; and a scoped exception (`.rr-list--attendees`) that keeps the removable reference's × contextual on touch instead of the global `ds.css` always-visible rule, so it never sits permanently over the share bar. Touch (AD 28 Sep 2026, acrm !4111): the description measures its real clamp (.rr-desc-v.is-clamped, ResizeObserver) and shows the chevron only then; on hover: none copy and the chevron are always visible with 44px hit areas, and copy ↔ pencil keep a 30px gap so two 44px targets never overlap (the rule beats --sp-2). Overrides live in apps/web/src/ds/responsive.css. Registry repaired 17 Oct 2026 (review F4/F11): attached css detail-field.css.

Used in 29 files · 20 areas · 79× — components/PersonaProfilePanel, components/clen-tymu, components/company, components/deal, components/decisions, components/dialer …

Default

Telefon+420 800 737 373
Firma
Poziceobchodní ředitel
MěstoPraha
Petr Zeman
Fáze
Produkty
components--rail--defaultOpen standalone ↗Code
Inventární čísloNB-2026-014
DruhNotebook
Sériové čísloPF4K2M9X
Pořízeno12. 3. 2025
fields — the same RRField shape as RecordRail.fields; read-only without onSave
components--record-rail-rows--defaultOpen standalone ↗Code
Detail záznamu
RoleMajitel firmy
components--editable-field--defaultOpen standalone ↗Code
Detail záznamu
Telefon+420 605 123 456mobil+420 541 220 111práce
components--multi-value--defaultOpen standalone ↗Code

Variants

Telefon+420 800 737 373
Firma
Poziceobchodní ředitel
MěstoPraha
Petr Zeman
Fáze
Produkty
page — plain column, no card (PersonRail.tsx:1315: variant „page“ returns the rail bez obalu)
drawer — same rail, wrapped in the preview drawer chrome (.pdr-rail); Procesy section is dropped here (F216) and Seznamy never reaches the drawer at all
Telefon+420 800 737 373+420 541 220 111práce
řádek s více hodnotami — every value is a full 34px row (.rr-vals/.rr-val); label, icon and pencil belong to the first value, the rest are dimmed (port: ChannelsField.tsx:251-271, used e.g. PersonRail.tsx:531-541)
Nahrávky2 části · 48 min
Přepisčeština · 3 řečníci
sekce polí s počtem — `count` kreslí `span.cnt` za titulkem, TÝŽ prvek jako u relace; tady sekce Nahrávky ze schůzky (MeetingLeftRail, FA198)
řádek s odkazem a trvalou tužkou — hodnota vede jinam, takže klik needituje; tužka je TRVALE vidět (.rr-ev.act), ne jen na hover (RecordRail.tsx:66-79). Dnešní raily appky tenhle tvar zrovna nemají na žádném poli (channels jdou přes display, ne href) — je to zdokumentovaná schopnost komponenty, ne vymyšlený prvek.
components--rail--variantsOpen standalone ↗Code
Podmínka zvýhodněné cenyOdběr min. 12 měsíců, platba předem
Účinnost smlouvy1. 10. 2026
Fakturační obdobíMěsíčně
wide — a section in the main column: key column 160 px, long keys are not cut
Doba trvání povinnosti mlčenlivosti5 let od skončení smlouvy
Sankce za předčasné ukončeníZaplatit standardní cenu za poskytnuté služby zpětně za celou dobu trvání smlouvy
Měsíční cena služby715,- Kč
wide — a data key longer than the column wraps (2 lines, phone 3); key and value start on one top line
Podmínka zvýhodněné cenyOdběr min. 12 měsíců, platba předem
Účinnost smlouvy1. 10. 2026
rail (default) — the same keys in the 108 px rail column cut with an ellipsis
components--record-rail-rows--variantsOpen standalone ↗Code
Detail záznamu
JménoJosef Novák
Telefon+420 605 123 456
text, e-mail, phone — one-line editors; the type decides the keyboard and the validation, not the look
Detail záznamu
Objem1250000
Rok výroby2019
number — grouped by thousands while editing; turn grouping off for years and numeric identifiers, where „2 019“ would be a bug
Detail záznamu
FázeJednání
select — a closed list; the empty value shows as „—“
Detail záznamu
Termín2026-08-26
date — the canonical date field, never the browser's native picker
Detail záznamu
PoznámkaPreferuje volání odpoledne, v červnu řešil refinancování.
multi-line — a description edits in a textarea and keeps the two-line clamp when closed
components--editable-field--variantsOpen standalone ↗Code
Detail záznamu
Telefon+420 605 123 456mobil+420 541 220 111práce
two values — the label, the icon and the pencil belong to the first row; the second value is dimmed
Detail záznamu
Telefon+420 605 123 456mobil
one value — a multi-value field with a single value looks exactly like a plain row; nothing announces the difference until you edit it
+420 605 123 456
+420 541 220 111
the editor — grip to reorder, the type next to the value, ✕ to remove, and the bare add row at the bottom (canon F186/F187)
components--multi-value--variantsOpen standalone ↗Code

States

PopisKancelář ve 2. patře: IT sklad a technika, archiv smluv 2019–2024 ve dvou uzamčených skříních, klíče u recepce. Šanony se zapůjčují přes knihu výpůjček.
dlouhý popis — 2řádkový clamp; RecordRail měří skutečné zkrácení (.is-clamped). Na dotyku (hover: none) je u zkráceného textu chevron „Zobrazit celý popis“ vidět trvale s cílem 44 px, na desktopu na hover
TelefonDoplnit…
E-mailDoplnit…
MěstoPraha
prázdná hodnota — „Nastavit hodnotu…“ (labels.setValue default, RecordRail.tsx:252) je afordance ke kliknutí, ne mrtvá pomlčka
Poziceobchodní ředitel
úprava otevřená — klik do hodnoty aktivuje .rr-edit (rámeček + ring); zkuste kliknout na Pozici
MěstoPraha
uloženo ✓ — Enter/blur potvrdí krátkou zelenou fajfkou (.rr-saved, fade ~1,1 s); upravte Město a potvrďte
Telefon+420 800 737 373
chyba uložení — řádek žádný vizuální stav chyby nemá (34px na to není místo); hodnota se vrátí na původní, chybu toastuje appka mimo rail (RecordRail.tsx:16-20)
Telefon+420 800 737 373
Firma
Poziceobchodní ředitel
MěstoPraha
„Zobrazit vše“ — prvních importantCount polí je nejdůležitějších, zbytek za odkazem
loading — rail nahradí skeleton, dokud záznam nedorazí (appka to dělá stejně)
components--rail--statesOpen standalone ↗Code
Přidělená osoba—
Datum předání—
empty value — the canonical placeholder „—“ (.v.ph), never a hand-typed dash
Změna podmínekSplatnost 14 dní → 30 dní od doručení faktury, sleva za platbu předem 2 % → 3 %
wrap — the value may break onto more lines (old → new, descriptions); the row aligns to the top
Navazuje naSM-2026-031 · Rámcová smlouva
actions — revealed on hover / focus of the row (always visible on touch); the space is reserved
components--record-rail-rows--statesOpen standalone ↗Code
Detail záznamu
RoleMajitel firmy
idle → editing → saved: click the value, change it, press Enter — the green check confirms and fades
Detail záznamu
E-mailDoplnit…
empty — the placeholder is the affordance; clicking it opens the editor on an empty value
Detail záznamu
VlastníkŠtěpán Svoboda
slow save — the commit is awaited, so the value updates only when the caller's promise settles (switch it on and edit the row)
Detail záznamu
Telefon+420 605 123 456
failed save — the value goes back to what it was; the row shows nothing, the screen is expected to toast (a 34px row has no room for an error)
Detail záznamu
value that leads elsewhere — clicking it calls the action, so the pencil stays visible for the people who cannot hover
components--editable-field--statesOpen standalone ↗Code
Detail záznamu
Telefon+420 605 123 456mobil+420 541 220 111práce+420 800 100 200ústředna+420 777 654 321soukromé
many values — every one keeps its full 34px row; the stack is never compressed
Detail záznamu
Telefon—
empty — a multi-value field with nothing in it is still a row with a placeholder
+420 605 123 456
editor with one row left — the add row stays, so there is always somewhere to type
editor, empty — only the add row; this is what a field with no values offers
components--multi-value--statesOpen standalone ↗Code

Composition

Telefon+420 800 737 373
Firma
Poziceobchodní ředitel
MěstoPraha
Petr Zeman
Fáze
Produkty
Přehled · E-maily · Schůzky · Produkty …
obsah stránky (taby, karty, osa aktivity — mimo rodinu Rail)
components--rail--compositionOpen standalone ↗Code
Předání
Stav předáníPodepsáno
Podepsáno dne2. 10. 2026
Podepsaný protokolpredavaci-protokol-NB-2026-014.pdf
Převzal—
a detail's main column — SectionBlock with RailRows wide (asset handover, as in AssetDetailPage)
components--record-rail-rows--compositionOpen standalone ↗Code
FázeJednání
used outside the rail — the same field in a process list row; behaviour and keys are identical
components--editable-field--compositionOpen standalone ↗Code
Detail záznamu
Telefon+420 605 123 456mobil+420 541 220 111práce
VlastníkŠtěpán Svoboda
In a real rail the multi-value rows sit among ordinary ones — the rhythm of 34px is what keeps them from reading as a nested list.
components--multi-value--compositionOpen standalone ↗Code