Tag input
canonInput that turns typed values into removable tags.
Registry repaired 17 Oct 2026 (review F3): mapped existing Ladle stories. 19 Oct 2026 (owner, proto/mail-konverzace-chat-poradi@828a56aa0): clamp toggle moves INTO the bubble as the optional `more` prop (text button .cht-more "Show all" / "Show less", aria-expanded, white underlined on the accent bubble); the meta-row "Full message" action is removed; e-mail conversation order is oldest at top, newest at bottom, view anchored to the end of the thread.
Used in 4 files · 4 areas · 10× — components/assistant, pages/AiZamestnanciPage, pages/ProduktDetailPage, pages/PruvodceFirmyPage
Default
fintechpragueenterprise
export const Default = () => (
<div style={{ width: 360 }}>
<TagInput initial={['fintech', 'prague', 'enterprise']} placeholder="Add tag…" />
</div>
);PrahaBrno
export const Default = () => <Chips initial={['Praha', 'Brno']} />;Variants
PrahaBrno
with the dashed add chip — the user may keep adding valuesPrahaBrnoOstrava
read-only set — values can only be taken back, not addedexport const Variants = () => (
<div style={{ display: 'grid', gap: 'var(--sp-6)', justifyItems: 'start' }}>
<Labeled text="with the dashed add chip — the user may keep adding values">
<Chips initial={['Praha', 'Brno']} />
</Labeled>
<Labeled text="read-only set — values can only be taken back, not added">
<Chips initial={['Praha', 'Brno', 'Ostrava']} add={false} />
</Labeled>
</div>
);States
empty
fintechprague
filledfintechpragueenterprisedecision makerseries bpartner
wrapping to a second rowexport const States = () => (
<div style={grid}>
<Labeled label="empty">
<TagInput initial={[]} placeholder="Add tag…" />
</Labeled>
<Labeled label="filled">
<TagInput initial={['fintech', 'prague']} placeholder="Add tag…" />
</Labeled>
<Labeled label="wrapping to a second row">
<TagInput
initial={['fintech', 'prague', 'enterprise', 'decision maker', 'series b', 'partner']}
placeholder="Add tag…"
/>
</Labeled>
<span style={{ color: 'var(--fg-muted)', font: 'var(--small)' }}>
Focus-within: border turns --accent with a 3px translucent ring (16 %); hover on the x fills
--active-surface.
</span>
</div>
);empty — nothing chosen yet, only the add chip is left
Praha
one valuePrahaBrnoOstravaPlzeňLiberecOlomoucZlín
export const States = () => (
<div style={{ display: 'grid', gap: 'var(--sp-6)', justifyItems: 'start' }}>
<Labeled text="empty — nothing chosen yet, only the add chip is left">
<Chips initial={[]} />
</Labeled>
<Labeled text="one value">
<Chips initial={['Praha']} />
</Labeled>
<Labeled text="many values — the row wraps, there is no „+N more“ fold">
<div style={{ width: 260 }}>
<Chips initial={POOL} />
</div>
</Labeled>
</div>
);Composition
fintechprague
Enter adds a keyword, Backspace removes the last one.export const Composition = () => (
<div style={{ width: 360 }}>
<Field label="Keywords" hint="Enter adds a keyword, Backspace removes the last one.">
<TagInput initial={['fintech', 'prague']} placeholder="Add keyword…" />
</Field>
</div>
);PrahaBrno
Vyber kraje, ve kterých firma působí.export const Composition = () => (
<div style={{ width: 320 }}>
<Field label="Kraje" hint="Vyber kraje, ve kterých firma působí.">
<Chips initial={['Praha', 'Brno']} />
</Field>
</div>
);