duration & time input: input visual invalidation

This commit is contained in:
Elijah Duffy
2025-12-11 16:00:41 -08:00
parent df1dd238e2
commit 9d0f10f0fd
2 changed files with 12 additions and 2 deletions

View File

@@ -80,7 +80,7 @@
/** Whether the input is required */ /** Whether the input is required */
required?: boolean; required?: boolean;
/** Message to show when the input is invalid */ /** Message to show when the input is invalid */
invalidMessage?: string; invalidMessage?: string | null;
/** Whether to use compact styling */ /** Whether to use compact styling */
compact?: boolean; compact?: boolean;
/** Additional classes are applied to the root container (div element) */ /** Additional classes are applied to the root container (div element) */
@@ -96,7 +96,7 @@
value = $bindable(null), value = $bindable(null),
formattedValue = $bindable(''), formattedValue = $bindable(''),
required = false, required = false,
invalidMessage = 'Please enter a duration', invalidMessage = null,
compact, compact,
class: classValue, class: classValue,
onchange onchange
@@ -280,6 +280,7 @@
placeholder={opts.placeholder} placeholder={opts.placeholder}
validate={{ pattern: opts.pattern }} validate={{ pattern: opts.pattern }}
use={(n) => liveValidator(n, keydownValidatorOpts)} use={(n) => liveValidator(n, keydownValidatorOpts)}
forceInvalid={!valid}
onkeydown={opts.onkeydown} onkeydown={opts.onkeydown}
oninput={opts.oninput} oninput={opts.oninput}
onblur={opts.onblur} onblur={opts.onblur}
@@ -296,4 +297,12 @@
{/if} {/if}
{/each} {/each}
</div> </div>
{#if !valid && invalidMessage}
<div class={['opacity-0 transition-opacity', !valid && 'opacity-100']}>
<Label for={id} error={true}>
{invalidMessage}
</Label>
</div>
{/if}
</div> </div>

View File

@@ -266,6 +266,7 @@
min={0} min={0}
validate={{ pattern: opts.pattern }} validate={{ pattern: opts.pattern }}
use={(n) => liveValidator(n, keydownValidatorOpts)} use={(n) => liveValidator(n, keydownValidatorOpts)}
forceInvalid={!valid}
onkeydown={opts.onkeydown} onkeydown={opts.onkeydown}
oninput={opts.oninput} oninput={opts.oninput}
onblur={opts.onblur} onblur={opts.onblur}