page Radiocomponent { seo { title = "Radio component" description = "Theme-aware, responsive radio component." } view {
W WRNexusJS
forms component

Radio

Theme-aware, responsive radio component.

@wrnexus/ui 0.5.025 props0 slots5 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Radio
  size="default"
  color="primary"
  id="id"
  name="name"
  label="Radio"
/>

Legacy mount name: data-component="Radio".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
idstringOptional""
namestringOptional""
labelstringOptional"Radio"
hiddenLabelbooleanOptionalfalse
placeholderstringOptional""
variantstringOptional"normal"
iconstringOptional""
iconPositionstringOptional"start"
valuestringOptional"on"
optionsstringOptional[]
checkedbooleanOptionalfalse
orientationstringOptional"vertical"
cardbooleanOptionalfalse
rightAlignedbooleanOptionalfalse
listbooleanOptionalfalse
helperTextstringOptional""
cornerHintstringOptional""
errorstringOptional""
inlinebooleanOptionalfalse
readonlybooleanOptionalfalse
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

  • input
  • change
  • focus
  • blur
  • invalid

Source contract

Installed source: components/Radio.wrn

component Radio {
  props {
    @event input = function
    @event change = function
    @event focus = function
    @event blur = function
    @event invalid = function
    size = "default"
    color = "primary"
    id = ""
    name = ""
    label = "Radio"
    hiddenLabel = false
    placeholder = ""
    variant = "normal"
    icon = ""
    iconPosition = "start"
    value = "on"
    options = []
    checked = false
    orientation = "vertical"
    card = false
    rightAligned = false
    list = false
    helperText = ""
    cornerHint = ""
    error = ""
    inline = false
    readonly = false
    disabled = false
    required = false
    class = ""
  }
  functions {
    function emitField(nameEvent, sourceEvent) { sourceEvent.stopPropagation(); $emit(nameEvent, { checked: sourceEvent.currentTarget.checked, value: sourceEvent.currentTarget.value, name: name, sourceEvent: sourceEvent }) }
    function preventReadonly(sourceEvent) { if (readonly) sourceEvent.preventDefault() }
  }
  view {
        <div {...attrs} class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--choice-field wire-next--radio-field {class}" data-inline="{inline}" data-invalid="{error ? 'true' : 'false'}" data-orientation="{orientation}" data-card="{card}" data-list="{list}" data-right-aligned="{rightAligned}">
        <div class="wire-next__field-heading">{#if options.length || cornerHint}<span class="{hiddenLabel ? 'wire-next__sr-only' : ''}">{label}</span>{#if cornerHint}<span class="wire-next__field-hint">{cornerHint}</span>{/if}{/if}</div>
      {#if options.length}
        <div class="wire-next__radio-group" role="radiogroup" aria-label="{hiddenLabel ? label : ''}" aria-invalid="{error ? 'true' : 'false'}">
          {#each options as option}
            <label class="wire-next__choice wire-next--radio" for="{id || name}-{option.value}" data-variant="{variant}" data-disabled="{disabled || option.disabled}">
        <input id="{id || name}-{option.value}" type="radio" name="{name}" value="{option.value}" checked="{option.value === value || option.checked}" disabled="{disabled || option.disabled}" required="{required}" readonly="{readonly}" @click="preventReadonly(event)" @input="emitField('input', event)" @change="emitField('change', event)" @focus="emitField('focus', event)" @blur="emitField('blur', event)" @invalid="emitField('invalid', event)" />
        <span class="wire-next__choice-copy">
        <strong>{option.label}</strong>{#if option.description}<small>{option.description}</small>{/if}</span>
        </label>
          {/each}
        </div>
      {:else}
        <label class="wire-next__choice wire-next--radio" for="{id || name}" data-variant="{variant}" data-icon-position="{iconPosition}">
        <input id="{id || name}" type="radio" name="{name}" value="{value}" checked="{checked}" disabled="{disabled}" required="{required}" readonly="{readonly}" aria-invalid="{error ? 'true' : 'false'}" @click="preventReadonly(event)" @input="emitField('input', event)" @change="emitField('change', event)" @focus="emitField('focus', event)" @blur="emitField('blur', event)" @invalid="emitField('invalid', event)" />{#if icon}<span class="{icon}" aria-hidden="true">
        </span>{/if}<span class="{hiddenLabel || cornerHint ? 'wire-next__sr-only' : ''}">{label}</span>
        </label>
      {/if}
      {#if helperText}<small class="wire-next__field-help">{helperText}</small>{/if}<small class="wire-next__field-error" data-error="{name}">{error}</small>
        </div>
    }
}
} }