← All @molecule/* packages · App templates
@molecule/app-tag-input-reactFeature · tag-input · App (browser) · v1.0.1 · Apache-2.0
React tags/labels/keywords input — a tag-token (chip) input and tag-chip display component
npm install @molecule/app-tag-input-react@molecule/app-tag-input-react is a ready-made tag-input feature for the app (browser) side. It composes the core interfaces it needs, so it works with whichever providers your app has bonded.
import { useState } from 'react'
import { TagChip, TagInput } from '@molecule/app-tag-input-react'
function TagEditor() {
const [tags, setTags] = useState<string[]>(['react'])
return (
<>
<TagInput value={tags} onChange={setTags} placeholder="Add a tag…" maxTags={10} />
<TagChip onRemove={() => setTags(tags.filter((t) => t !== 'react'))}>react</TagChip>
</>
)
}Works with: @molecule/app-react, @molecule/app-ui, @molecule/app-ui-react
Auto-generated, AI-first package reference for the molecule.dev ecosystem. It is written to be read by coding agents as much as by people, and is generated from this package's source — edit
src/index.tsJSDoc, not this file.
React tag-token input and tag-chip display.
Exports:
<TagChip> — standalone labeled chip with optional remove button.<TagInput> — controlled tokenizer: Enter, comma, or Tab adds the
draft; blur commits a non-empty draft; Backspace on an empty field
removes the last token.import { useState } from 'react'
import { TagChip, TagInput } from '@molecule/app-tag-input-react'
function TagEditor() {
const [tags, setTags] = useState<string[]>(['react'])
return (
<>
<TagInput value={tags} onChange={setTags} placeholder="Add a tag…" maxTags={10} />
<TagChip onRemove={() => setTags(tags.filter((t) => t !== 'react'))}>react</TagChip>
</>
)
}
feature
npm install @molecule/app-tag-input-react @molecule/app-react @molecule/app-ui @molecule/app-ui-react react
npm install -D @types/react
TagChipPropsProps for the {@link TagChip} component.
interface TagChipProps {
/** Visible tag text. */
children: ReactNode
/** Optional remove callback — renders an `×` button when provided. */
onRemove?: () => void
/** Optional click callback for the chip body. */
onClick?: () => void
/** Extra classes. */
className?: string
}
TagInputPropsProps for the {@link TagInput} component.
interface TagInputProps {
/** Controlled list of tag values. */
value: string[]
/** Called whenever the tag list changes. */
onChange: (next: string[]) => void
/** Placeholder shown in the text input when no tokens exist yet. */
placeholder?: string
/**
* Validate/transform an input before adding. Return `null` to reject.
* Default trims whitespace and rejects empty + duplicate entries.
*/
normalize?: (raw: string, current: string[]) => string | null
/** Max tags allowed. When reached, further input is ignored. */
maxTags?: number
/** Extra classes on the outer wrapper. */
className?: string
}
TagChip(props)Small labeled chip with an optional close button. Used inside
<TagInput> but also usable standalone as a label display element.
function TagChip({ children, onRemove, onClick, className }: TagChipProps): JSX.Element
props — Component props (see {@link TagChipProps}).TagInput(props)Tokenized tag-input with chip display. Commits the draft on Enter, comma, or Tab AND on blur (clicking away with a non-empty draft adds a tag); Backspace on an empty field removes the last token.
Controlled component — callers own the value array.
function TagInput({
value,
onChange,
placeholder,
normalize = defaultNormalize,
maxTags,
className,
}: TagInputProps): JSX.Element
props — Component props (see {@link TagInputProps}).Peer dependencies:
@molecule/app-react ^1.0.1@molecule/app-ui ^1.0.1@molecule/app-ui-react ^1.0.1react ^18.0.0 || ^19.0.0@molecule/app-react
@molecule/app-ui
@molecule/app-ui-react
react
Must render inside the app's i18n provider and with a ClassMap bond
wired (useTranslation() / getClassMap() throw otherwise).
Committing happens on Enter/comma/Tab AND on blur — clicking away with a non-empty draft adds a tag; keep that in mind in forms.
Default normalize trims whitespace and rejects empties +
duplicates; pass your own to lowercase, validate, or map values
(return null to reject).
When maxTags is reached further input is silently discarded (the
draft clears, no error UI).
<TagChip> ships no background surface of its own — add one via
className if bare text chips are too subtle in your theme.
Translation strings are provided by @molecule/app-locales-tag-input.