ui-ingredients 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
@@ -25,6 +25,7 @@ export function createField(props) {
|
|
25
25
|
readOnly: props.readOnly ?? false,
|
26
26
|
};
|
27
27
|
});
|
28
|
+
let focused = $state(false);
|
28
29
|
let hasErrorText = $state(false);
|
29
30
|
let hasHelperText = $state(false);
|
30
31
|
const ariaDescribedby = $derived.by(() => {
|
@@ -37,19 +38,6 @@ export function createField(props) {
|
|
37
38
|
}
|
38
39
|
return l.join(' ');
|
39
40
|
});
|
40
|
-
$effect(() => {
|
41
|
-
const rootNode = environment?.getRootNode() ?? document;
|
42
|
-
const doc = getDocument(rootNode);
|
43
|
-
const win = getWindow(rootNode);
|
44
|
-
function handler() {
|
45
|
-
hasErrorText = invalid && doc.getElementById(ids.errorText) !== null;
|
46
|
-
hasHelperText = doc.getElementById(ids.helperText) !== null;
|
47
|
-
}
|
48
|
-
handler();
|
49
|
-
const observer = new win.MutationObserver(handler);
|
50
|
-
observer.observe(rootNode, { childList: true, subtree: true });
|
51
|
-
return () => observer.disconnect();
|
52
|
-
});
|
53
41
|
function getRootProps() {
|
54
42
|
return {
|
55
43
|
...parts.root.attrs,
|
@@ -59,6 +47,7 @@ export function createField(props) {
|
|
59
47
|
'data-disabled': dataAttr(disabled),
|
60
48
|
'data-required': dataAttr(required),
|
61
49
|
'data-readonly': dataAttr(readOnly),
|
50
|
+
'data-focus': dataAttr(focused),
|
62
51
|
};
|
63
52
|
}
|
64
53
|
function getLabelProps() {
|
@@ -70,6 +59,18 @@ export function createField(props) {
|
|
70
59
|
'data-disabled': dataAttr(disabled),
|
71
60
|
'data-required': dataAttr(required),
|
72
61
|
'data-readonly': dataAttr(readOnly),
|
62
|
+
'data-focus': dataAttr(focused),
|
63
|
+
};
|
64
|
+
}
|
65
|
+
function getRequiredIndicatorProps() {
|
66
|
+
return {
|
67
|
+
...parts.requiredIndicator.attrs,
|
68
|
+
hidden: !required,
|
69
|
+
'aria-hidden': true,
|
70
|
+
'data-invalid': dataAttr(invalid),
|
71
|
+
'data-disabled': dataAttr(disabled),
|
72
|
+
'data-readonly': dataAttr(readOnly),
|
73
|
+
'data-focus': dataAttr(focused),
|
73
74
|
};
|
74
75
|
}
|
75
76
|
function getErrorTextProps() {
|
@@ -82,6 +83,7 @@ export function createField(props) {
|
|
82
83
|
'data-disabled': dataAttr(disabled),
|
83
84
|
'data-required': dataAttr(required),
|
84
85
|
'data-readonly': dataAttr(readOnly),
|
86
|
+
'data-focus': dataAttr(focused),
|
85
87
|
};
|
86
88
|
}
|
87
89
|
function getHelperTextProps() {
|
@@ -92,68 +94,74 @@ export function createField(props) {
|
|
92
94
|
'data-disabled': dataAttr(disabled),
|
93
95
|
'data-required': dataAttr(required),
|
94
96
|
'data-readonly': dataAttr(readOnly),
|
97
|
+
'data-focus': dataAttr(focused),
|
95
98
|
};
|
96
99
|
}
|
97
|
-
function
|
100
|
+
function onfocus() {
|
101
|
+
focused = true;
|
102
|
+
}
|
103
|
+
function onblur() {
|
104
|
+
focused = false;
|
105
|
+
}
|
106
|
+
function getControlProps() {
|
98
107
|
return {
|
99
|
-
...parts.input.attrs,
|
100
108
|
id: ids.control,
|
109
|
+
onfocus,
|
110
|
+
onblur,
|
101
111
|
disabled,
|
102
112
|
required,
|
103
|
-
readonly: readOnly,
|
104
|
-
'aria-invalid': ariaAttr(invalid),
|
105
113
|
'aria-describedby': ariaDescribedby,
|
114
|
+
'aria-invalid': ariaAttr(invalid),
|
115
|
+
'aria-disabled': ariaAttr(disabled),
|
116
|
+
'aria-required': ariaAttr(required),
|
117
|
+
'aria-readonly': ariaAttr(readOnly),
|
106
118
|
'data-invalid': dataAttr(invalid),
|
107
119
|
'data-disabled': dataAttr(disabled),
|
108
120
|
'data-required': dataAttr(required),
|
109
121
|
'data-readonly': dataAttr(readOnly),
|
122
|
+
'data-focus': dataAttr(focused),
|
110
123
|
};
|
111
124
|
}
|
112
|
-
function
|
125
|
+
function getInputProps() {
|
113
126
|
return {
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
required,
|
118
|
-
'aria-invalid': ariaAttr(invalid),
|
119
|
-
'aria-readonly': ariaAttr(readOnly),
|
120
|
-
'aria-describedby': ariaDescribedby,
|
121
|
-
'data-invalid': dataAttr(invalid),
|
122
|
-
'data-disabled': dataAttr(disabled),
|
123
|
-
'data-required': dataAttr(required),
|
124
|
-
'data-readonly': dataAttr(readOnly),
|
127
|
+
readonly: readOnly,
|
128
|
+
...getControlProps(),
|
129
|
+
...parts.input.attrs,
|
125
130
|
};
|
126
131
|
}
|
127
132
|
function getTextareaProps() {
|
128
133
|
return {
|
129
|
-
...parts.textarea.attrs,
|
130
|
-
id: ids.control,
|
131
|
-
disabled,
|
132
|
-
required,
|
133
134
|
readonly: readOnly,
|
134
|
-
|
135
|
-
|
136
|
-
'data-disabled': dataAttr(disabled),
|
137
|
-
'data-required': dataAttr(required),
|
138
|
-
'data-readonly': dataAttr(readOnly),
|
135
|
+
...getControlProps(),
|
136
|
+
...parts.textarea.attrs,
|
139
137
|
};
|
140
138
|
}
|
141
|
-
function
|
139
|
+
function getSelectProps() {
|
142
140
|
return {
|
143
|
-
...
|
144
|
-
|
145
|
-
'aria-hidden': true,
|
146
|
-
'data-invalid': dataAttr(invalid),
|
147
|
-
'data-disabled': dataAttr(disabled),
|
148
|
-
'data-readonly': dataAttr(readOnly),
|
141
|
+
...getControlProps(),
|
142
|
+
...parts.select.attrs,
|
149
143
|
};
|
150
144
|
}
|
145
|
+
$effect(() => {
|
146
|
+
const rootNode = environment?.getRootNode() ?? document;
|
147
|
+
const doc = getDocument(rootNode);
|
148
|
+
const win = getWindow(rootNode);
|
149
|
+
function handler() {
|
150
|
+
hasErrorText = invalid && doc.getElementById(ids.errorText) !== null;
|
151
|
+
hasHelperText = doc.getElementById(ids.helperText) !== null;
|
152
|
+
}
|
153
|
+
handler();
|
154
|
+
const observer = new win.MutationObserver(handler);
|
155
|
+
observer.observe(rootNode, { childList: true, subtree: true });
|
156
|
+
return () => observer.disconnect();
|
157
|
+
});
|
151
158
|
return reflect(() => ({
|
152
159
|
ids,
|
153
160
|
disabled,
|
154
161
|
required,
|
155
162
|
readOnly,
|
156
163
|
invalid,
|
164
|
+
focused,
|
157
165
|
'aria-describedby': ariaDescribedby,
|
158
166
|
getRootProps,
|
159
167
|
getLabelProps,
|