UI components

Production-ready building blocks for website pages. Each example includes when to use it and the stable class or JavaScript API for agents.

Actions

Use the primary action once per decision area. Secondary actions are for reversible or lower-priority operations. Reserve the alert modifier for destructive actions.

c-form__button · c-form__button-secondary · c-form__button-secondary_alert

Settings fields

Use these rows for standard settings forms. A label is required; add a short hint only when the choice needs explanation.

c-form__row · c-form__label · c-form__input-text · c-form__select
Show a Latin transcription below text written in another script.

Composed settings field

Use a composed row when one field has a closely related action. The main control grows; the action keeps its natural size.

c-form__row-compose · v-settings__button-play

Settings notices

Use the plain notice for required context. Use the linked version only when the whole notice leads to the next step. The alert modifier marks a warning; top alignment supports longer copy.

c-form__label-info · c-form__label-info__inner · c-form__label-info_link · c-form__label-info_alert · c-form__label-info_align-top
Install a compatible system voice to enable audio previews.
Verify your email to choose this study source.
Some imported items need attention before they can be saved.

Settings text actions

Use a solid link for navigation and a dotted action for an inline behaviour. Secondary navigation below a field belongs in a subaction container.

c-form__link · c-form__action · c-form__subaction-container

Settings feedback

Overlay an autosaving field while its request is pending. Use the green message for success and the red message for errors.

c-form__field-status_visible · c-form__msg · c-form__error
Saving…
Your settings were saved.

Settings source cards

Use these cards for a visual choice with a title and short description. Clearly mark the selected state; disabled premium choices keep their badge.

c-form__popup-items · c-form__popup-item_selected · c-form__popup-item_disabled
Travel phrases
Vocabulary · English → German · 18 items
Business
Vocabulary for work and meetings
Premium

Limited fields

Use the form-kit field when text has a hard length limit. It adds the required visible counter; use standard settings fields otherwise.

app.ui.formKit.field(options)

Optional fields

Use progressive chips when a form has one required field and several uncommon additions. Every chip needs a two-line tooltip: a plain explanation followed by a concrete example. Tooltips open below and automatically flip above when the visible scroll area would clip them. Revealed fields stay before the remaining chip row. The shared wiring removes the selected chip, then reveals and focuses its field.

c-ui-optional-fields · app.ui.formKit.optionalFields(options) · app.ui.formKit.wireOptionalFields(container)

Segmented control

Use for two or three mutually exclusive choices that should stay visible. Pass disabled: true when a saved value is immutable.

app.ui.formKit.segmented(options)

Editor structure

Compose larger editors from these neutral layout elements. Use the workspace surface for a routed editor, stack page regions, group related controls in a section, and wrap a focused nested editor in the item-panel boundary to prevent horizontal overflow.

c-ui-workspace · c-ui-stack · c-ui-inline · c-ui-section · c-ui-section__head · c-ui-section__title · c-ui-item-panel · c-ui-panel · c-ui-fieldset · c-ui-hint · c-ui-tag · c-ui-form-grid

Items

Keep short supporting text next to the title it explains.

deck.apkg
Prompt side

Fields for the text shown first.

Learning side

Fields for the answer.

Drop action

Add the dropzone class to a secondary button when the same action accepts click selection and drag and drop. Wrap a page workspace in the drop-surface class and reveal its overlay while a compatible file is over it.

c-ui-dropzone · c-ui-dropzone_active · c-ui-drop-surface · c-ui-drop-surface_active · c-ui-drop-surface__overlay

Loading

Use the shared loader for a page or panel waiting for data. For a popup action, call the pending API so the action is disabled, announced, and restored consistently.

c-loader · a-breathe-opacity · app.ui.popup.setActionPending(true, 'Saving…')
Loading

Counters

Show current use and the hard limit together. Place the counter near the collection it describes.

app.ui.formKit.counter(current, limit, label)

Editable item rows

Use one full-width row per item, with both cells truncated by an ellipsis. Long collections use 100-row pages without a nested scrollbar. Keep arrow pagination beside the heading and below the rows.

c-ui-badge-list_rows · c-ui-badge_invalid · app.ui.formKit.badge(options)

Entity list

Use for named objects with repeated metadata. The whole row opens the object; destructive actions remain separate. Add the empty modifier only when the list contains an empty-state card.

c-ui-entity-list__row · c-ui-entity-list__button · c-ui-entity-list_empty

Empty state

Explain what is missing and the single next action. Keep it inside the collection area. Pass an action option when the whole state should perform that action; use the wide option inside a grid.

app.ui.formKit.emptyState(title, description, { action: 'create-pack', wide: true }) · c-ui-empty-state_wide