@@ -12,16 +12,19 @@ export let rows = 8
12
12
export let maxlength = undefined
13
13
export let autofocus = false
14
14
export let rtl = false
15
+ export let required = false
15
16
16
17
const labelID = generateRandomID (' textarea-label-' )
17
18
18
19
let element = {}
19
20
let textarea = {}
20
21
let height = ' '
22
+ let hasFocused = false
21
23
22
24
$: hasExceededMaxLength = maxlength && value .length > maxlength
23
25
$: error = hasExceededMaxLength
24
- $: value && value !== ' ' && addOrRemoveInvalidClass (error, element)
26
+ $: valueIsEmpty = value === ' ' || ! value
27
+ $: ! valueIsEmpty && addOrRemoveInvalidClass (error, element)
25
28
26
29
onMount (() => {
27
30
resize ()
@@ -81,6 +84,7 @@ label {
81
84
aria-describedby =" {labelID }-helper-id"
82
85
{rows }
83
86
maxlength =" 524288"
87
+ {required }
84
88
{placeholder }
85
89
bind:value
86
90
use:focus
@@ -89,6 +93,7 @@ label {
89
93
on:input ={resize }
90
94
on:keydown
91
95
on:focus
96
+ on:focus ={() => (hasFocused = true )}
92
97
on:blur
93
98
/>
94
99
{#if maxlength }
@@ -109,7 +114,10 @@ label {
109
114
</span >
110
115
</label >
111
116
<div class =" mdc-text-field-helper-line" >
112
- <div class ="mdc-text-field-helper-text" id =" {labelID }-helper-id" aria-hidden =" true" >
117
+ <div class ="mdc-text-field-helper-text" class:opacity 1={required } id =" {labelID }-helper-id" aria-hidden =" true" >
118
+ {#if required && valueIsEmpty }
119
+ <span class ="required" class:error ={hasFocused }>*Required</span >
120
+ {/if }
113
121
{#if hasExceededMaxLength }
114
122
<span class ="error" >Maximum {maxlength } characters</span >
115
123
{/if }
0 commit comments