174 lines
5.0 KiB
Plaintext
174 lines
5.0 KiB
Plaintext
component Checkbox {
|
|
props {
|
|
@event input = function
|
|
@event change = function
|
|
@event focus = function
|
|
@event blur = function
|
|
@event invalid = function
|
|
size = "default"
|
|
color = "primary"
|
|
id = ""
|
|
name = ""
|
|
label = "Checkbox"
|
|
hiddenLabel = false
|
|
placeholder = ""
|
|
variant = "normal"
|
|
icon = ""
|
|
iconPosition = "start"
|
|
value = "on"
|
|
values = []
|
|
options = []
|
|
checked = false
|
|
indeterminate = 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, values: values, 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--checkbox-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__checkbox-group"
|
|
role="group"
|
|
aria-label="{hiddenLabel ? label : ''}"
|
|
aria-invalid="{error ? 'true' : 'false'}"
|
|
>
|
|
{#each options as option}
|
|
<label
|
|
class="wire-next__choice wire-next--checkbox"
|
|
for="{id || name}-{option.value}"
|
|
data-variant="{variant}"
|
|
data-disabled="{disabled || option.disabled}"
|
|
>
|
|
<input
|
|
id="{id || name}-{option.value}"
|
|
type="checkbox"
|
|
name="{name}"
|
|
value="{option.value}"
|
|
checked="{values.includes(option.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}
|
|
<div
|
|
class="wire-next__checkbox-content"
|
|
>
|
|
<label
|
|
class="wire-next__choice wire-next--checkbox"
|
|
for="{id || name}"
|
|
data-variant="{variant}"
|
|
data-icon-position="{iconPosition}"
|
|
>
|
|
<input
|
|
id="{id || name}"
|
|
type="checkbox"
|
|
name="{name}"
|
|
value="{value}"
|
|
checked="{checked}"
|
|
disabled="{disabled}"
|
|
required="{required}"
|
|
readonly="{readonly}"
|
|
aria-checked="{indeterminate ? 'mixed' : (checked ? 'true' : 'false')}"
|
|
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>
|
|
<div
|
|
class="wire-next__checkbox-slot"
|
|
>
|
|
<slot></slot>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
{/if}
|
|
{#if helperText}
|
|
<small
|
|
class="wire-next__field-help"
|
|
>
|
|
{helperText}
|
|
</small>
|
|
{/if}
|
|
<small
|
|
class="wire-next__field-error"
|
|
data-error="{name}"
|
|
>
|
|
{error}
|
|
</small>
|
|
</div>
|
|
}
|
|
}
|