2021-01-26 09:55:44 +01:00
|
|
|
<script>
|
|
|
|
import "@spectrum-css/textfield/dist/index-vars.css"
|
2021-01-27 11:59:05 +01:00
|
|
|
import "@spectrum-css/actionbutton/dist/index-vars.css"
|
|
|
|
import "@spectrum-css/stepper/dist/index-vars.css"
|
2021-01-26 09:55:44 +01:00
|
|
|
import { getContext } from "svelte"
|
2021-01-27 11:59:05 +01:00
|
|
|
import SpectrumField from "./SpectrumField.svelte"
|
2021-01-26 09:55:44 +01:00
|
|
|
|
|
|
|
export let field
|
|
|
|
export let label
|
|
|
|
export let placeholder
|
2021-01-26 15:40:44 +01:00
|
|
|
export let type = "text"
|
2021-01-26 09:55:44 +01:00
|
|
|
|
|
|
|
// Register this field with its form
|
2021-01-27 11:59:05 +01:00
|
|
|
const { formApi } = getContext("form") ?? {}
|
|
|
|
const formField = formApi?.registerField(field) ?? {}
|
2021-01-26 09:55:44 +01:00
|
|
|
const { fieldApi, fieldState } = formField
|
|
|
|
|
2021-01-27 11:59:05 +01:00
|
|
|
$: numeric = type === "number"
|
|
|
|
|
2021-01-26 09:55:44 +01:00
|
|
|
// Update value on blur only
|
|
|
|
const onBlur = event => {
|
|
|
|
fieldApi.setValue(event.target.value)
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
2021-01-27 11:59:05 +01:00
|
|
|
<SpectrumField {label} {field}>
|
|
|
|
<div class:spectrum-Stepper={type === 'number'}>
|
|
|
|
<div
|
|
|
|
class="spectrum-Textfield"
|
|
|
|
class:spectrum-Stepper-textfield={numeric}
|
|
|
|
class:is-invalid={!$fieldState.valid}>
|
2021-01-26 09:55:44 +01:00
|
|
|
{#if !$fieldState.valid}
|
|
|
|
<svg
|
|
|
|
class="spectrum-Icon spectrum-Icon--sizeM spectrum-Textfield-validationIcon"
|
|
|
|
focusable="false"
|
|
|
|
aria-hidden="true">
|
|
|
|
<use xlink:href="#spectrum-icon-18-Alert" />
|
|
|
|
</svg>
|
|
|
|
{/if}
|
|
|
|
<input
|
2021-01-27 11:59:05 +01:00
|
|
|
id={$fieldState.fieldId}
|
2021-01-26 09:55:44 +01:00
|
|
|
value={$fieldState.value || ''}
|
|
|
|
placeholder={placeholder || ''}
|
|
|
|
on:blur={onBlur}
|
2021-01-26 15:40:44 +01:00
|
|
|
{type}
|
2021-01-27 11:59:05 +01:00
|
|
|
class="spectrum-Textfield-input"
|
|
|
|
class:spectrum-Stepper-input={numeric} />
|
2021-01-26 09:55:44 +01:00
|
|
|
</div>
|
2021-01-27 11:59:05 +01:00
|
|
|
{#if numeric}
|
|
|
|
<span class="spectrum-Stepper-buttons">
|
|
|
|
<button
|
|
|
|
class="spectrum-ActionButton spectrum-ActionButton--sizeM spectrum-Stepper-stepUp"
|
|
|
|
tabindex="-1">
|
|
|
|
<svg
|
|
|
|
class="spectrum-Icon spectrum-UIIcon-ChevronUp75 spectrum-Stepper-stepUpIcon"
|
|
|
|
focusable="false"
|
|
|
|
aria-hidden="true">
|
|
|
|
<use xlink:href="#spectrum-css-icon-Chevron75" />
|
|
|
|
</svg>
|
|
|
|
</button>
|
|
|
|
<button
|
|
|
|
class="spectrum-ActionButton spectrum-ActionButton--sizeM spectrum-Stepper-stepDown"
|
|
|
|
tabindex="-1">
|
|
|
|
<svg
|
|
|
|
class="spectrum-Icon spectrum-UIIcon-ChevronDown75 spectrum-Stepper-stepDownIcon"
|
|
|
|
focusable="false"
|
|
|
|
aria-hidden="true">
|
|
|
|
<use xlink:href="#spectrum-css-icon-Chevron75" />
|
|
|
|
</svg>
|
|
|
|
</button>
|
|
|
|
</span>
|
|
|
|
{/if}
|
2021-01-26 09:55:44 +01:00
|
|
|
{#if $fieldState.error}
|
2021-01-27 11:59:05 +01:00
|
|
|
<div class="error">{$fieldState.error}</div>
|
2021-01-26 09:55:44 +01:00
|
|
|
{/if}
|
|
|
|
</div>
|
2021-01-27 11:59:05 +01:00
|
|
|
</SpectrumField>
|
2021-01-26 09:55:44 +01:00
|
|
|
|
|
|
|
<style>
|
2021-01-27 11:59:05 +01:00
|
|
|
.error {
|
2021-01-26 09:55:44 +01:00
|
|
|
color: var(
|
|
|
|
--spectrum-semantic-negative-color-default,
|
|
|
|
var(--spectrum-global-color-red-500)
|
|
|
|
) !important;
|
|
|
|
}
|
|
|
|
</style>
|