Form Inputs

code-input

#existingsource

A controlled single-line input for machine-shaped values. The monospace face and the disabled spell-check / autocomplete / autocapitalize / autocorrect attributes are baked in, not opt-in: a slug or token must round-trip exactly as typed. The caller owns the value signal and receives keystrokes via `on_input`; no internal state, disposal-safe.

Readiness
complete
Preview
live
Props
5
Examples
2
Code
implementation mapped

When to use

  • Element slugs, resource identifiers, branch names
  • API keys, tokens, hashes, hex colour values
  • Any field where browser auto-correction would corrupt the value

When not to use

  • Human prose or names — use Input
  • Multi-line code or config — use TextArea
  • Multi-value tag entry — use TokenInput

Accessibility

Role: textbox

  • Tab — Focus to / from the input

Screen reader: A standard text input; announced as an edit field. Callers should provide an `aria-label` or wrap with `field` so the expected format is communicated. `aria-invalid=true` is set in the error state.

Notes: Disabling autocorrect/autocapitalize also helps screen-reader users on mobile who would otherwise hear auto-substituted text.

Props

NameTypeDefaultDescription
valuestring
on_inputstring
placeholderstring
errorbooleanfalse
disabledbooleanfalse

Examples

Slug

Element slug entry bound to state.

YAML
type: code-input
props:
  value: ${state.slug}
  on_input: ${actions.set_slug}
  placeholder: my-element-slug
Invalid key

API key field in an error state.

YAML
type: code-input
props:
  value: sk-not-a-valid-key
  on_input: ${actions.set_key}
  placeholder: sk-…
  error: true
Edit YAML

color-input

#existingsource

A controlled colour field. A native `<input type=color>` swatch opens the OS picker; a monospace hex readout sits beside it so the value is visible and copyable. The value is the native `#rrggbb` string. The caller owns the value signal; changes arrive via `on_change`. No internal state, disposal-safe.

Readiness
complete
Preview
live
Props
3
Examples
2
Code
implementation mapped

When to use

  • Choosing a single solid colour (brand accent, tag colour, label)
  • Where the OS-native colour picker is the right affordance
  • Colour fields that must round-trip a stable hex value

When not to use

  • Gradients or multi-stop palettes — out of scope
  • A small fixed swatch set — use RadioCardGroup of swatches
  • Alpha / HSL editing — needs a dedicated colour-picker pattern

Accessibility

Role: button

  • Enter — Open the native colour picker
  • Space — Open the native colour picker

Screen reader: The swatch carries an explicit `aria-label` ('Choose colour'); the hex readout is plain text adjacent to it. Callers should add a `field` wrapper naming what the colour applies to.

Notes: The hex value beside the swatch means the choice is not conveyed by colour alone — colourblind users can read and copy the exact value.

Props

NameTypeDefaultDescription
valuestring
on_changestring
disabledbooleanfalse

Examples

Accent

Brand accent colour bound to state.

#71c9ec
YAML
type: color-input
props:
  value: '#71c9ec'
  on_change: ${actions.set_accent}
Tag colour

Tag colour picker.

#a78bfa
YAML
type: color-input
props:
  value: '#a78bfa'
  on_change: ${actions.set_tag_color}
Edit YAML

date-input

#existingsource

A controlled date field. The value is the native `<input type=date>` contract — an ISO-8601 `YYYY-MM-DD` string — so it serialises cleanly and round-trips through APIs without locale ambiguity. Optional `min` / `max` bound the selectable range. The caller owns the value signal; changes arrive via `on_change`. No internal state, disposal-safe.

Readiness
complete
Preview
live
Props
5
Examples
2
Code
implementation mapped

When to use

  • A single calendar date (due date, start date, birthday)
  • Date fields where the OS-native picker is the right affordance
  • Bounded date selection via min / max

When not to use

  • Date + time together — pair DateInput with TimeInput
  • Free-form relative phrases ('next Tuesday') — use a parsed Input
  • Date ranges — compose two DateInputs in a form row

Accessibility

Role: textbox

  • ArrowDown — Open the native picker popup
  • ArrowUp — Step the focused date segment

Screen reader: The native date control is announced segment-by-segment by the platform. Callers should still provide an `aria-label` (or wrap with `field`) naming the date being entered.

Notes: `color-scheme: dark` is set so the native picker chrome matches the dark theme; the picker indicator is keyboard reachable.

Props

NameTypeDefaultDescription
valuestring
on_changestring
minstring
maxstring
disabledbooleanfalse

Examples

Due date

Due-date field bound to state.

YAML
type: date-input
props:
  value: 2026-06-01
  on_change: ${actions.set_due_date}
Bounded

Bounded date selection within a quarter.

YAML
type: date-input
props:
  value: 2026-05-17
  on_change: ${actions.set_date}
  min: 2026-04-01
  max: 2026-06-30
Edit YAML

email-input

#existingsource

An email field that specialises `<Input>` with built-in email-format validation surfaced as an inline helper/error message, so login/signup/settings forms stop reimplementing the same regex + error wiring. It lives portal-side today (`portal/src/components/form.rs`) with this catalog entry as the stable contract.

Readiness
complete
Preview
live
Props
4
Examples
2
Code
implementation mapped

When to use

  • Any email field — login, signup, invite, contact, settings.
  • Where inline format feedback (not just browser-native) improves the flow.
  • Forms that should share one consistent email-validation UX.

When not to use

  • A generic text field — use `<Input>`.
  • Server-side-only validation with no inline feedback — a plain `<Input type=email>` suffices.
  • Multi-recipient / tag-style entry — that needs a tokenised input, not this.

Accessibility

Role: textbox

  • Tab — Focus to/from the input.

Screen reader: The validation message must be associated via `aria-describedby` and the field marked `aria-invalid` when invalid, so SR users hear the error tied to the field — not just a visually-adjacent red line.

Notes: `portal::components::form::EmailInput` is the current home. Inline validation complements, never replaces, server-side validation.

Props

NameTypeDefaultDescription
labelstringEmailField label.
placeholderstringyou@example.comInput placeholder.
requiredbooleantrueWhether the field is required (drives required-validation).
show_validationbooleantrueWhether inline format-validation feedback renders. Off → relies on native/server validation only.

Examples

Login email

Login email field — labelled, required, inline validation on.

YAML
type: stack
props:
  direction: column
  gap: sm
children:
- type: text
  slots:
    default: Email
- type: input
  props:
    placeholder: you@example.com
    value: ''
Invalid email

Invalid state — inline error tied to the field.

YAML
type: stack
props:
  direction: column
  gap: sm
children:
- type: input
  props:
    placeholder: you@example.com
    value: not-an-email
- type: text
  slots:
    default: Enter a valid email address
Edit YAML

file-picker

#existingsource

The reusable substrate of IdentityPicker. A visually-hidden `<input type=file>` keeps the native file dialog and form semantics; a styled trigger button proxies its click so the affordance matches the design system; a live `aria-live` list previews selected file names. The selection-name signal is component-scoped (created at the component owner, never inside a `<Show>`/`<For>`) and the only DOM handle is a `NodeRef` Leptos cleans up — disposal-safe. Selected names are emitted via `on_files`.

Readiness
complete
Preview
live
Props
5
Examples
2
Code
implementation mapped

When to use

  • Any file upload where the native button styling is off-brand
  • Single or multiple file selection with a name preview
  • Building blocks for richer upload patterns (drag-drop, avatars)

When not to use

  • Drag-and-drop dropzones — compose on top of FilePicker
  • Direct-to-storage resumable uploads — needs an upload pattern
  • Non-file data entry — use the matching input primitive

Accessibility

Role: button

  • Enter — Open the system file picker (trigger button)
  • Space — Open the system file picker (trigger button)
  • Tab — Focus the trigger button

Screen reader: The real `<input type=file>` is visually hidden but remains in the accessibility tree and focus order; the trigger is a real button. The preview list is an `aria-live=polite` region so a new selection is announced. Callers should label the trigger for context.

Notes: Hiding the input uses the clip pattern (not display:none) so it stays keyboard- and screen-reader-reachable.

Props

NameTypeDefaultDescription
on_filesstring
labelstringChoose file…
multiplebooleanfalse
acceptstring
disabledbooleanfalse

Examples

Attach file

Single-file attachment picker.

YAML
type: file-picker
props:
  label: Attach a file
  on_files: ${actions.set_attachment}
Upload images

Multiple image upload restricted by accept.

YAML
type: file-picker
props:
  label: Upload images
  on_files: ${actions.set_images}
  multiple: true
  accept: image/*
Edit YAML

inline-edit

#existingsource

InlineEdit lets a label become editable in place. It is best for short, low-risk values such as names, titles, and labels where opening a full form would slow the workflow.

Readiness
complete
Preview
live
Props
3
Examples
1
Code
implementation mapped

When to use

  • Renaming elements, boards, files, or saved views
  • Short text values where the display state and edit state occupy the same space
  • Low-risk edits with immediate save or local draft handling

When not to use

  • Long-form content, code, markdown, or multiline text
  • Fields that require validation explanation before editing
  • Destructive or audited changes that need explicit confirmation

Accessibility

Role: textbox

  • Enter — Saves the current value
  • Escape — Cancels editing
  • Tab — Moves focus out of the inline editor

Screen reader: Display state should be introduced by surrounding label or row context.

Notes: Use clear row context so the editable value is not announced in isolation.

Props

NameTypeDefaultDescription
valuestringCurrent display value.
placeholderstringClick to editText shown when value is empty.
on_savestring

Examples

Element name edit

Rename an element without leaving the current row.

Daily contact sync
YAML
type: inline-edit
props:
  value: Daily contact sync
  placeholder: Name this element
Edit YAML

input

#existingsource

Single-line text input with consistent focus, disabled, and error visual treatment. Use `input_type: password` for secrets. Wrap with `field` for labelled forms.

Readiness
complete
Preview
live
Props
9
Examples
3
Code
implementation mapped

When to use

  • Single-line text entry (name, username, search, etc.)
  • Password fields (`input_type: password`)
  • Email/URL/tel/number inputs (browser-native keyboard hints)
  • Inline editable values (use with InlineEdit pattern)

When not to use

  • Multi-line text — use TextArea
  • Choosing from a fixed list — use Select or NativeSelect
  • Date/time entry — use DateInput / TimeInput (when they land)
  • Color picking — use ColorInput (when it lands)
  • Range / numeric drag — use Slider (when it lands)
  • Single labelled field — wrap with `field` so label + helper + error are consistent

Accessibility

Role: textbox

  • Tab — Focus to/from the input
  • Enter — Submits the wrapping form (if input_type != textarea)
  • Escape — Blurs the input (browser default)

Screen reader: `placeholder` is NOT a label — pair with `field` for proper association. `error: true` adds `aria-invalid=true`. `disabled` removes from focus order. `required: true` adds `aria-required=true`.

Notes: `auto_focus: true` should be used on at most one input per modal — the audit fails if multiple auto_focus inputs are mounted simultaneously.

Props

NameTypeDefaultDescription
valuestringCurrent text value. v1 binding language: pass `${state.username}` to bind; the engine wires read + write paths to a shared signal.
on_inputstringAction reference fired on every keystroke with the new value. v1 binding language: `${actions.set_username}`.
input_typeenum: text | password | email | number | search | url | teltextNative HTML input type. Drives keyboard / autofill.
placeholderstring
disabledbooleanfalse
requiredbooleanfalse
errorbooleanfalseToggles the error visual (red border, red focus ring). The error message itself is rendered by the wrapping `field` component.
namestringHTML name attribute — used by form-submit semantics.
auto_focusbooleanfalseFocuses the input on first render. Use sparingly — only one input per modal should auto-focus.

Examples

Username (signal-bound)

Username field bound to a signal.

YAML
type: input
props:
  value: ${state.username}
  on_input: ${actions.set_username}
  placeholder: Username
  auto_focus: true
Password with error

Password field with error state (drops the inline rgba in PasswordLoginForm).

YAML
type: input
props:
  value: ${state.password}
  on_input: ${actions.set_password}
  input_type: password
  placeholder: Password
  error: ${state.has_error}
All input types

All input types side-by-side for visual comparison.

YAML
type: stack
props:
  gap: sm
  direction: column
children:
- type: input
  props:
    input_type: text
    placeholder: text
- type: input
  props:
    input_type: password
    placeholder: password
- type: input
  props:
    input_type: email
    placeholder: email@example.com
- type: input
  props:
    input_type: number
    placeholder: number
- type: input
  props:
    input_type: search
    placeholder: search
- type: input
  props:
    input_type: url
    placeholder: https://...
- type: input
  props:
    input_type: tel
    placeholder: +1 555 0100
Edit YAML

number-stepper

#existingsource

A controlled numeric input with explicit decrement / increment buttons. The caller owns the value signal; the buttons compute the next clamped value from the current signal and emit it via `on_change`, so the component holds no internal state and is disposal-safe. Values are clamped to `[min, max]` on every change, whether typed or stepped.

Readiness
complete
Preview
live
Props
6
Examples
2
Code
implementation mapped

When to use

  • Small integer quantities (cart count, retry limit, replica count)
  • Discrete numeric entry where ± buttons aid touch / discoverability
  • Bounded numeric fields where typed input must still be clamped

When not to use

  • Bounded continuous values — use Slider
  • Free-form text or identifiers — use Input or CodeInput
  • A small fixed option set — use SegmentedControl

Accessibility

Role: spinbutton

  • ArrowUp — Increment value by step (native field)
  • ArrowDown — Decrement value by step (native field)
  • Tab — Move between the − button, field, and + button

Screen reader: The wrapper exposes `role=spinbutton` with `aria-valuenow` mirrored from the current value; the ± buttons carry explicit `aria-label`s. Callers should add an `aria-label` describing what is being counted.

Notes: Disabled state dims the control and blocks both the buttons and the field.

Props

NameTypeDefaultDescription
valuenumber1
on_changestring
minnumber0
maxnumber100
stepnumber1
disabledbooleanfalse

Examples

Quantity

Quantity selector clamped to 1–10.

YAML
type: number-stepper
props:
  value: 2
  on_change: ${actions.set_quantity}
  min: 1
  max: 10
  step: 1
Retry limit

Retry-limit field stepping by 5.

YAML
type: number-stepper
props:
  value: 15
  on_change: ${actions.set_retries}
  min: 0
  max: 60
  step: 5
Edit YAML

password-input

#existingsource

A password field that specialises `<Input>` with a show/hide eye toggle, so login/signup/change-password forms stop reimplementing the masked-state UX (and the a11y of the toggle) every time. It lives portal-side today (`portal/src/components/form.rs`) with this catalog entry as the stable contract.

Readiness
complete
Preview
live
Props
4
Examples
2
Code
implementation mapped

When to use

  • Any password entry — login, signup, change-password, re-auth.
  • Where a reveal toggle reduces typo-driven failed logins.
  • Forms that should share one consistent masked-input + toggle UX.

When not to use

  • Non-secret text — use `<Input>`.
  • A masked config/secret display (not entry) — use `<KeyValue masked>`.
  • One-time codes / OTP — use a segmented code input, not a password field.

Accessibility

Role: textbox

  • Tab — Focus to/from the input, then to the show/hide toggle.
  • Enter — Submits the form (does not toggle visibility).

Screen reader: The eye toggle MUST announce its state — "Show password" / "Hide password" — and be a real focusable button, not a click-only icon. Toggling visibility must not move focus out of the field.

Notes: `portal::components::form::PasswordInput` is the current home. Reveal is a convenience, not a security downgrade — never auto-reveal on focus.

Props

NameTypeDefaultDescription
placeholderstringInput placeholder.
requiredbooleantrueWhether the field is required.
show_labelbooleantrueWhether the field label renders (off for compact inline forms).
revealablebooleantrueWhether the show/hide eye toggle renders. Off → permanently masked (e.g. high-security contexts).

Examples

Login password (masked)

Login password field — masked, with reveal toggle.

YAML
type: stack
props:
  direction: row
  gap: sm
children:
- type: input
  props:
    placeholder: Password
    value: ••••••••
- type: icon-button
  props:
    icon: visibility
    aria_label: Show password
Password revealed

Revealed state — eye toggled, label says 'Hide password'.

YAML
type: stack
props:
  direction: row
  gap: sm
children:
- type: input
  props:
    placeholder: Password
    value: hunter2
- type: icon-button
  props:
    icon: visibility_off
    aria_label: Hide password
Edit YAML

search-input

#existingsource

A text input specialised for search queries. The magnifier icon prefix and clear-affordance (× appears once the user has typed) are structural, not opt-in props. Pair with debouncing in the caller via `${actions.x}` or use `use_debounced` from the hooks module.

Readiness
complete
Preview
live
Props
5
Examples
2
Code
implementation mapped

When to use

  • Filter / search query box atop a list (table, file tree, results)
  • Type-to-narrow inputs in popovers or palettes
  • RailFilter-like usage in panels
  • Anywhere the user is typing a query rather than a structured value

When not to use

  • Free-form text input — use Input (no magnifier, no clear)
  • Combobox with picker — use Combobox when it lands
  • Compound search with filters — use a Toolbar + SearchInput composition

Accessibility

Role: searchbox

  • Tab — Focus to/from the input
  • Enter — Submits the query
  • Escape — Clears the input (when value is non-empty)

Screen reader: Sets `role=searchbox`. Caller should provide an aria-label or wrap with `field` so SR users know what is being searched.

Notes: Clear affordance is announced as a button — pair with the Clear icon glyph to avoid screen-reader confusion.

Props

NameTypeDefaultDescription
valuestring
on_inputstring
placeholderstringSearch
disabledbooleanfalse
auto_focusbooleanfalse

Examples

Agent filter

Filter row above a list of agents.

YAML
type: search-input
props:
  value: ${state.filter_query}
  on_input: ${actions.set_filter_query}
  placeholder: Search agents...
Palette query

Auto-focused palette query.

YAML
type: search-input
props:
  value: ${state.palette_query}
  on_input: ${actions.set_palette_query}
  placeholder: Type to search commands...
  auto_focus: true
Edit YAML

slider

#existingsource

A controlled bounded-numeric drag input. The caller owns the value signal and receives every change via `on_change`; the component holds no internal state, so it is disposal-safe inside showcase `<Show>`/`<For>` scopes. Use Slider when the value is continuous and both bounds are known (e.g. 0–100 opacity). The optional live readout shows the current value without the caller wiring a separate label.

Readiness
complete
Preview
live
Props
7
Examples
2
Code
implementation mapped

When to use

  • Bounded continuous values where approximate selection is fine (opacity, volume, zoom)
  • Threshold tuning where the user benefits from seeing the value move
  • Compact numeric control in a toolbar or properties panel

When not to use

  • Unbounded or precision numeric entry — use NumberStepper
  • A small discrete option set — use SegmentedControl or RadioGroup
  • Boolean on/off — use Switch

Accessibility

Role: slider

  • ArrowLeft — Decrement value by step
  • ArrowRight — Increment value by step
  • Home — Set to minimum
  • End — Set to maximum

Screen reader: Backed by a native `<input type=range>` with `role=slider` and `aria-valuemin` / `aria-valuemax` / `aria-valuenow` mirrored from the bounds and current value. Callers should provide an `aria-label` (or wrap with `field`) so the value's meaning is announced.

Notes: The thumb hover/scale animation is suppressed under `prefers-reduced-motion: reduce`.

Props

NameTypeDefaultDescription
valuenumber50
on_changestring
minnumber0
maxnumber100
stepnumber1
show_valuebooleantrue
disabledbooleanfalse

Examples

Opacity

Opacity control bound to a state signal.

70
YAML
type: slider
props:
  value: 70
  on_change: ${actions.set_opacity}
  min: 0
  max: 100
  step: 1
Quarter steps

Stepped slider without the numeric readout.

YAML
type: slider
props:
  value: 50
  on_change: ${actions.set_value}
  min: 0
  max: 100
  step: 25
  show_value: false
Edit YAML

textarea

#existingsource

Multi-line text entry with consistent focus, disabled, and error treatment. Use for multi-paragraph content (descriptions, comments, prompts). Pair with `field` for labelled forms; rely on `placeholder` only for ephemeral hint text. Auto-grow via the `rows` prop is the fixed canonical mechanism for variable height.

Readiness
complete
Preview
live
Props
7
Examples
3
Code
implementation mapped

When to use

  • Multi-line text content (descriptions, comments, prompts)
  • User-generated long-form input (release notes, agent instructions)
  • Free-form notes that may span paragraphs
  • Code-style content where Input would forbid Enter

When not to use

  • Single-line text — use Input
  • Code with mono font + no spell-check — use CodeInput when it lands
  • Markdown editors with preview — wrap with a higher-level Markdown editor primitive

Accessibility

Role: textbox

  • Tab — Focus to/from the textarea (does NOT insert tab character)
  • Enter — Inserts a newline
  • Escape — Blurs (browser default)

Screen reader: `placeholder` is NOT a label — pair with `field` for proper association. `error: true` adds `aria-invalid=true`. `disabled` removes from focus order. `aria-multiline=true` is implicit.

Notes: `auto_focus: true` should be used on at most one textarea per modal. Set `rows` >= 3 for usable content height.

Props

NameTypeDefaultDescription
valuestringCurrent text value. Bind `${state.x}` for reactive content.
on_inputstringAction reference fired on keystroke. `${actions.set_x}`.
placeholderstring
rowsinteger3Visible rows. Caller controls vertical size.
disabledbooleanfalse
errorbooleanfalse
auto_focusbooleanfalse

Examples

Description

Description field with helper text.

YAML
type: field
props:
  label: Description
  field_id: desc
slots:
  default:
  - type: textarea
    props:
      value: ${state.description}
      on_input: ${actions.set_description}
      placeholder: Tell us about this circle...
      rows: 5
With error

Error state.

YAML
type: textarea
props:
  value: ${state.feedback}
  on_input: ${actions.set_feedback}
  error: true
  rows: 4
Sizes

Different row counts side-by-side.

YAML
type: stack
props:
  gap: md
  direction: column
children:
- type: textarea
  props:
    rows: 2
    placeholder: rows=2
- type: textarea
  props:
    rows: 4
    placeholder: rows=4
- type: textarea
  props:
    rows: 8
    placeholder: rows=8
Edit YAML

time-input

#existingsource

A controlled time field. The value is the native `<input type=time>` contract — an `HH:MM` 24-hour string — so it serialises cleanly and is locale-stable. Optional `step` (in seconds) controls granularity, e.g. `60` for minute steps or `1` to expose seconds. The caller owns the value signal; changes arrive via `on_change`. No internal state, disposal-safe.

Readiness
complete
Preview
live
Props
4
Examples
2
Code
implementation mapped

When to use

  • A time-of-day (reminder time, daily schedule slot)
  • Time fields where the OS-native picker is the right affordance
  • Granularity control via the step prop (minutes vs seconds)

When not to use

  • Date + time together — pair with DateInput
  • Durations rather than clock times — use NumberStepper or a Duration field
  • Free-form relative phrases — use a parsed Input

Accessibility

Role: textbox

  • ArrowDown — Open the native picker popup
  • ArrowUp — Step the focused time segment

Screen reader: The native time control is announced segment-by-segment by the platform. Callers should provide an `aria-label` (or wrap with `field`) naming the time being entered.

Notes: `color-scheme: dark` keeps the native picker chrome on-theme.

Props

NameTypeDefaultDescription
valuestring
on_changestring
stepinteger60
disabledbooleanfalse

Examples

Reminder

Reminder time bound to state.

YAML
type: time-input
props:
  value: 08:00
  on_change: ${actions.set_reminder_time}
Seconds

Second-precision time field.

YAML
type: time-input
props:
  value: 12:30
  on_change: ${actions.set_time}
  step: 1
Edit YAML

token-input

#existingsource

A controlled multi-value field. Committed tokens render as removable chips driven by the caller-owned `tokens` signal; Enter commits the trimmed draft (de-duplicated), Backspace on an empty field removes the last chip, and each chip has a × remove button. The in-progress draft is a component-scoped signal (created at the component owner, never inside a `<Show>`/`<For>`), so it is disposal-safe. The full list is emitted via `on_change` on every mutation.

Readiness
complete
Preview
live
Props
4
Examples
2
Code
implementation mapped

When to use

  • Free-form tags, labels, or keywords
  • Email-recipient-style entry where each value becomes a chip
  • Any open-vocabulary multi-value field

When not to use

  • A fixed option set — use a multi-select / SelectMulti
  • Single value — use Input or CodeInput
  • Read-only display of values — use a row of Badges

Accessibility

Role: combobox

  • Enter — Commit the current text as a chip
  • Backspace — Remove the last chip when the field is empty
  • Tab — Focus to / from the draft field

Screen reader: The wrapper is a labelled group; each chip's remove control has an `aria-label`. Callers should wrap with `field` (or provide an `aria-label`) so the field's purpose is announced; committed tokens are read as part of the group.

Notes: Chip add/remove is reflected immediately in the DOM so assistive tech tracks the current set; the remove-button hover transition is suppressed under `prefers-reduced-motion: reduce`.

Props

NameTypeDefaultDescription
tokensarray
on_changestring
placeholderstring
disabledbooleanfalse

Examples

Tags

Tag entry bound to a state list.

rustleptos
YAML
type: token-input
props:
  tokens:
  - rust
  - leptos
  on_change: ${actions.set_tags}
  placeholder: Add a tag…
Recipients

Email-recipient style entry.

ops@triform.ai
YAML
type: token-input
props:
  tokens:
  - ops@triform.ai
  on_change: ${actions.set_recipients}
  placeholder: Add a recipient…
Edit YAML