@sprawlify/solid 0.0.13 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-C4aQI7lE.jsx +18 -0
- package/dist/chunk-CKcAJnC7.js +18 -0
- package/dist/collapsible-Cg7zPadX.js +129 -0
- package/dist/collapsible-CjuC6xYl.jsx +117 -0
- package/dist/collection-BiyRTWsX.js +219 -0
- package/dist/collection-BlnS2UQy.jsx +219 -0
- package/dist/components/accordion/index.d.ts +69 -0
- package/dist/components/accordion/index.js +183 -0
- package/dist/components/accordion/index.jsx +157 -0
- package/dist/components/angle-slider/index.d.ts +74 -0
- package/dist/components/angle-slider/index.js +155 -0
- package/dist/components/angle-slider/index.jsx +144 -0
- package/dist/components/avatar/index.d.ts +49 -0
- package/dist/components/avatar/index.js +95 -0
- package/dist/components/avatar/index.jsx +88 -0
- package/dist/components/bottom-sheet/index.d.ts +80 -0
- package/dist/components/bottom-sheet/index.js +218 -0
- package/dist/components/bottom-sheet/index.jsx +177 -0
- package/dist/components/carousel/index.d.ts +98 -0
- package/dist/components/carousel/index.js +207 -0
- package/dist/components/carousel/index.jsx +192 -0
- package/dist/components/checkbox/index.d.ts +138 -0
- package/dist/components/checkbox/index.js +265 -0
- package/dist/components/checkbox/index.jsx +247 -0
- package/dist/components/client-only/index.d.ts +10 -0
- package/dist/components/client-only/index.js +24 -0
- package/dist/components/client-only/index.jsx +15 -0
- package/dist/components/clipboard/index.d.ts +72 -0
- package/dist/components/clipboard/index.js +149 -0
- package/dist/components/clipboard/index.jsx +132 -0
- package/dist/components/collapsible/index.d.ts +60 -0
- package/dist/components/collapsible/index.js +8 -0
- package/dist/components/collapsible/index.jsx +8 -0
- package/dist/components/collection/index.d.ts +3 -0
- package/dist/components/collection/index.js +4 -0
- package/dist/components/collection/index.jsx +4 -0
- package/dist/components/field/index.d.ts +201 -0
- package/dist/components/field/index.js +9 -0
- package/dist/components/field/index.jsx +9 -0
- package/dist/components/fieldset/index.d.ts +109 -0
- package/dist/components/fieldset/index.js +8 -0
- package/dist/components/fieldset/index.jsx +8 -0
- package/dist/components/presence/index.d.ts +5 -0
- package/dist/components/presence/index.js +8 -0
- package/dist/components/presence/index.jsx +8 -0
- package/dist/components/select/index.d.ts +134 -0
- package/dist/components/select/index.js +361 -0
- package/dist/components/select/index.jsx +310 -0
- package/dist/compose-refs-CzyOb8yH.jsx +20 -0
- package/dist/compose-refs-vsrTrt13.js +20 -0
- package/dist/create-context-PS2j4mEo.js +29 -0
- package/dist/create-context-h3cXiEld.jsx +29 -0
- package/dist/create-split-props-CQVsvhvg.jsx +41 -0
- package/dist/factory-B6RK6SH4.d.ts +14 -0
- package/dist/factory-CEdj72aS.js +47 -0
- package/dist/field-C_WuoXOj.js +287 -0
- package/dist/field-CphvciGc.jsx +259 -0
- package/dist/fieldset-BG-0ZqWT.jsx +167 -0
- package/dist/fieldset-D1BO0LmU.js +182 -0
- package/dist/index-B0YoIRC4.d.ts +14 -0
- package/dist/index-C3ATynHc.d.ts +23 -0
- package/dist/index-DXheKbqg.d.ts +76 -0
- package/dist/index-NWiNyxpL.d.ts +38 -0
- package/dist/index-vSwYtc2L.d.ts +38 -0
- package/dist/index.d.ts +40 -19
- package/dist/index.js +5 -415
- package/dist/index.jsx +5 -415
- package/dist/presence-Bfjusgm3.js +79 -0
- package/dist/presence-arWh1hVd.jsx +66 -0
- package/dist/providers-CHqGPEsc.jsx +82 -0
- package/dist/providers-CQkAUunr.js +96 -0
- package/dist/render-strategy-COrlrUuR.js +12 -0
- package/dist/render-strategy-CZDG_yDi.jsx +12 -0
- package/dist/render-strategy-CtRkdWei.d.ts +9 -0
- package/dist/run-if-fn-DRWB51JE.jsx +421 -0
- package/dist/run-if-fn-eYlaegHy.js +421 -0
- package/dist/types-bQRbEioA.d.ts +9 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.jsx +4 -0
- package/dist/utils-DYer-9SY.js +0 -0
- package/dist/utils-DrvO4Hk3.jsx +0 -0
- package/package.json +62 -2
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { t as __export } from "./chunk-CKcAJnC7.js";
|
|
2
|
+
import { i as mergeProps$2 } from "./run-if-fn-eYlaegHy.js";
|
|
3
|
+
import { t as createContext$1 } from "./create-context-PS2j4mEo.js";
|
|
4
|
+
import { o as useEnvironmentContext } from "./providers-CQkAUunr.js";
|
|
5
|
+
import { n as createSplitProps, t as sprawlify } from "./factory-CEdj72aS.js";
|
|
6
|
+
import { t as composeRefs } from "./compose-refs-vsrTrt13.js";
|
|
7
|
+
import { u as useFieldsetContext } from "./fieldset-D1BO0LmU.js";
|
|
8
|
+
import { Show, createMemo, createSignal, createUniqueId, mergeProps, onCleanup, onMount, splitProps } from "solid-js";
|
|
9
|
+
import { createComponent, mergeProps as mergeProps$1 } from "solid-js/web";
|
|
10
|
+
import { ariaAttr, dataAttr } from "@sprawlify/primitives/dom-query";
|
|
11
|
+
import { createAnatomy } from "@sprawlify/primitives/anatomy";
|
|
12
|
+
import { autoresizeTextarea } from "@sprawlify/primitives/auto-resize";
|
|
13
|
+
|
|
14
|
+
//#region src/components/field/use-field-context.ts
|
|
15
|
+
const [FieldProvider, useFieldContext] = createContext$1({
|
|
16
|
+
hookName: "useFieldContext",
|
|
17
|
+
providerName: "<FieldProvider />",
|
|
18
|
+
strict: false
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/components/field/field-context.tsx
|
|
23
|
+
const FieldContext = (props) => props.children(useFieldContext());
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/components/field/field-error-text.tsx
|
|
27
|
+
const FieldErrorText = (props) => {
|
|
28
|
+
const field = useFieldContext();
|
|
29
|
+
const mergedProps = mergeProps$2(() => field().getErrorTextProps(), props);
|
|
30
|
+
return createComponent(Show, {
|
|
31
|
+
get when() {
|
|
32
|
+
return field?.().invalid;
|
|
33
|
+
},
|
|
34
|
+
get children() {
|
|
35
|
+
return createComponent(sprawlify.span, mergedProps);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/components/field/field-helper-text.tsx
|
|
42
|
+
const FieldHelperText = (props) => {
|
|
43
|
+
const field = useFieldContext();
|
|
44
|
+
const mergedProps = mergeProps$2(() => field().getHelperTextProps(), props);
|
|
45
|
+
return createComponent(sprawlify.span, mergedProps);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/components/field/field-input.tsx
|
|
50
|
+
const FieldInput = (props) => {
|
|
51
|
+
const field = useFieldContext();
|
|
52
|
+
const mergedProps = mergeProps$2(() => field?.().getInputProps(), props);
|
|
53
|
+
return createComponent(sprawlify.input, mergedProps);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region src/components/field/field-label.tsx
|
|
58
|
+
const FieldLabel = (props) => {
|
|
59
|
+
const field = useFieldContext();
|
|
60
|
+
const mergedProps = mergeProps$2(() => field?.().getLabelProps(), props);
|
|
61
|
+
return createComponent(sprawlify.label, mergedProps);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/components/field/field-required-indicator.tsx
|
|
66
|
+
const FieldRequiredIndicator = (props) => {
|
|
67
|
+
const field = useFieldContext();
|
|
68
|
+
const mergedProps = mergeProps$2(() => field().getRequiredIndicatorProps(), props);
|
|
69
|
+
return createComponent(Show, {
|
|
70
|
+
get when() {
|
|
71
|
+
return field().required;
|
|
72
|
+
},
|
|
73
|
+
get fallback() {
|
|
74
|
+
return props.fallback;
|
|
75
|
+
},
|
|
76
|
+
get children() {
|
|
77
|
+
return createComponent(sprawlify.span, mergeProps$1(mergedProps, { get children() {
|
|
78
|
+
return props.children ?? "*";
|
|
79
|
+
} }));
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/components/field/field-anatomy.ts
|
|
86
|
+
const fieldAnatomy = createAnatomy("field").parts("root", "errorText", "helperText", "input", "label", "select", "textarea", "requiredIndicator");
|
|
87
|
+
const parts = fieldAnatomy.build();
|
|
88
|
+
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/components/field/use-field.ts
|
|
91
|
+
const useField = (props) => {
|
|
92
|
+
const fieldset = useFieldsetContext();
|
|
93
|
+
const env = useEnvironmentContext();
|
|
94
|
+
const fieldProps = mergeProps({
|
|
95
|
+
disabled: Boolean(fieldset?.().disabled),
|
|
96
|
+
required: false,
|
|
97
|
+
invalid: false,
|
|
98
|
+
readOnly: false
|
|
99
|
+
}, props);
|
|
100
|
+
const [hasErrorText, setHasErrorText] = createSignal(false);
|
|
101
|
+
const [hasHelperText, setHasHelperText] = createSignal(false);
|
|
102
|
+
const id = fieldProps.id ?? createUniqueId();
|
|
103
|
+
const [rootRef, setRootRef] = createSignal(void 0);
|
|
104
|
+
const rootId = fieldProps.ids?.control ?? `field::${id}`;
|
|
105
|
+
const errorTextId = fieldProps.ids?.errorText ?? `field::${id}::error-text`;
|
|
106
|
+
const helperTextId = fieldProps.ids?.helperText ?? `field::${id}::helper-text`;
|
|
107
|
+
const labelId = fieldProps.ids?.label ?? `field::${id}::label`;
|
|
108
|
+
onMount(() => {
|
|
109
|
+
const rootNode = rootRef();
|
|
110
|
+
if (!rootNode) return;
|
|
111
|
+
const checkTextElements = () => {
|
|
112
|
+
const docOrShadowRoot = env().getRootNode();
|
|
113
|
+
setHasErrorText(!!docOrShadowRoot.getElementById(errorTextId));
|
|
114
|
+
setHasHelperText(!!docOrShadowRoot.getElementById(helperTextId));
|
|
115
|
+
};
|
|
116
|
+
checkTextElements();
|
|
117
|
+
const observer = new (env().getWindow()).MutationObserver(checkTextElements);
|
|
118
|
+
observer.observe(rootNode, {
|
|
119
|
+
childList: true,
|
|
120
|
+
subtree: true
|
|
121
|
+
});
|
|
122
|
+
onCleanup(() => observer.disconnect());
|
|
123
|
+
});
|
|
124
|
+
const getRootProps = () => ({
|
|
125
|
+
...parts.root.attrs,
|
|
126
|
+
id: rootId,
|
|
127
|
+
role: "group",
|
|
128
|
+
"data-disabled": dataAttr(fieldProps.disabled),
|
|
129
|
+
"data-invalid": dataAttr(fieldProps.invalid),
|
|
130
|
+
"data-readonly": dataAttr(fieldProps.readOnly)
|
|
131
|
+
});
|
|
132
|
+
const getLabelProps = () => ({
|
|
133
|
+
...parts.label.attrs,
|
|
134
|
+
id: labelId,
|
|
135
|
+
"data-disabled": dataAttr(fieldProps.disabled),
|
|
136
|
+
"data-invalid": dataAttr(fieldProps.invalid),
|
|
137
|
+
"data-readonly": dataAttr(fieldProps.readOnly),
|
|
138
|
+
"data-required": dataAttr(fieldProps.required),
|
|
139
|
+
htmlFor: id
|
|
140
|
+
});
|
|
141
|
+
const labelIds = createMemo(() => {
|
|
142
|
+
const ids = [];
|
|
143
|
+
if (hasErrorText() && fieldProps.invalid) ids.push(errorTextId);
|
|
144
|
+
if (hasHelperText()) ids.push(helperTextId);
|
|
145
|
+
return ids;
|
|
146
|
+
});
|
|
147
|
+
const getControlProps = () => ({
|
|
148
|
+
"aria-describedby": labelIds().join(" ") || void 0,
|
|
149
|
+
"aria-invalid": ariaAttr(fieldProps.invalid),
|
|
150
|
+
"data-invalid": dataAttr(fieldProps.invalid),
|
|
151
|
+
"data-required": dataAttr(fieldProps.required),
|
|
152
|
+
"data-readonly": dataAttr(fieldProps.readOnly),
|
|
153
|
+
id,
|
|
154
|
+
required: fieldProps.required,
|
|
155
|
+
disabled: fieldProps.disabled,
|
|
156
|
+
readOnly: fieldProps.readOnly || void 0
|
|
157
|
+
});
|
|
158
|
+
const getInputProps = () => ({
|
|
159
|
+
...getControlProps(),
|
|
160
|
+
...parts.input.attrs
|
|
161
|
+
});
|
|
162
|
+
const getTextareaProps = () => ({
|
|
163
|
+
...getControlProps(),
|
|
164
|
+
...parts.textarea.attrs
|
|
165
|
+
});
|
|
166
|
+
const getSelectProps = () => ({
|
|
167
|
+
...getControlProps(),
|
|
168
|
+
...parts.select.attrs
|
|
169
|
+
});
|
|
170
|
+
const getHelperTextProps = () => ({
|
|
171
|
+
id: helperTextId,
|
|
172
|
+
...parts.helperText.attrs,
|
|
173
|
+
"data-disabled": dataAttr(fieldProps.disabled)
|
|
174
|
+
});
|
|
175
|
+
const getErrorTextProps = () => ({
|
|
176
|
+
id: errorTextId,
|
|
177
|
+
...parts.errorText.attrs,
|
|
178
|
+
"aria-live": "polite"
|
|
179
|
+
});
|
|
180
|
+
const getRequiredIndicatorProps = () => ({
|
|
181
|
+
"aria-hidden": true,
|
|
182
|
+
...parts.requiredIndicator.attrs
|
|
183
|
+
});
|
|
184
|
+
return createMemo(() => ({
|
|
185
|
+
ariaDescribedby: labelIds().join(" "),
|
|
186
|
+
ids: {
|
|
187
|
+
control: id,
|
|
188
|
+
label: labelId,
|
|
189
|
+
errorText: errorTextId,
|
|
190
|
+
helperText: helperTextId
|
|
191
|
+
},
|
|
192
|
+
refs: { rootRef: setRootRef },
|
|
193
|
+
disabled: fieldProps.disabled,
|
|
194
|
+
invalid: fieldProps.invalid,
|
|
195
|
+
readOnly: fieldProps.readOnly,
|
|
196
|
+
required: fieldProps.required,
|
|
197
|
+
getLabelProps,
|
|
198
|
+
getRootProps,
|
|
199
|
+
getInputProps,
|
|
200
|
+
getTextareaProps,
|
|
201
|
+
getSelectProps,
|
|
202
|
+
getHelperTextProps,
|
|
203
|
+
getErrorTextProps,
|
|
204
|
+
getRequiredIndicatorProps
|
|
205
|
+
}));
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
//#endregion
|
|
209
|
+
//#region src/components/field/field-root.tsx
|
|
210
|
+
const FieldRoot = (props) => {
|
|
211
|
+
const [useFieldProps, localProps] = createSplitProps()(props, [
|
|
212
|
+
"id",
|
|
213
|
+
"ids",
|
|
214
|
+
"disabled",
|
|
215
|
+
"invalid",
|
|
216
|
+
"readOnly",
|
|
217
|
+
"required"
|
|
218
|
+
]);
|
|
219
|
+
const field = useField(useFieldProps);
|
|
220
|
+
const mergedProps = mergeProps$2(() => field().getRootProps(), localProps);
|
|
221
|
+
return createComponent(FieldProvider, {
|
|
222
|
+
value: field,
|
|
223
|
+
get children() {
|
|
224
|
+
return createComponent(sprawlify.div, mergeProps$1(mergedProps, { ref(r$) {
|
|
225
|
+
var _ref$ = composeRefs(field().refs.rootRef, props.ref);
|
|
226
|
+
typeof _ref$ === "function" && _ref$(r$);
|
|
227
|
+
} }));
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
//#endregion
|
|
233
|
+
//#region src/components/field/field-root-provider.tsx
|
|
234
|
+
const FieldRootProvider = (props) => {
|
|
235
|
+
const [{ value: field }, localProps] = createSplitProps()(props, ["value"]);
|
|
236
|
+
const mergedProps = mergeProps$2(() => field().getRootProps(), localProps);
|
|
237
|
+
return createComponent(FieldProvider, {
|
|
238
|
+
value: field,
|
|
239
|
+
get children() {
|
|
240
|
+
return createComponent(sprawlify.div, mergedProps);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region src/components/field/field-select.tsx
|
|
247
|
+
const FieldSelect = (props) => {
|
|
248
|
+
const field = useFieldContext();
|
|
249
|
+
const mergedProps = mergeProps$2(() => field?.().getSelectProps(), props);
|
|
250
|
+
return createComponent(sprawlify.select, mergedProps);
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
//#endregion
|
|
254
|
+
//#region src/components/field/field-textarea.tsx
|
|
255
|
+
const FieldTextarea = (props) => {
|
|
256
|
+
const field = useFieldContext();
|
|
257
|
+
let textareaRef;
|
|
258
|
+
const [autoresizeProps, textareaProps] = splitProps(props, ["autoresize"]);
|
|
259
|
+
const mergedProps = mergeProps$2(() => field?.().getTextareaProps(), () => ({ style: { resize: autoresizeProps.autoresize ? "none" : void 0 } }), textareaProps);
|
|
260
|
+
onMount(() => {
|
|
261
|
+
if (!autoresizeProps.autoresize) return;
|
|
262
|
+
const cleanup = autoresizeTextarea(textareaRef);
|
|
263
|
+
onCleanup(() => cleanup?.());
|
|
264
|
+
});
|
|
265
|
+
return createComponent(sprawlify.textarea, mergeProps$1(mergedProps, { ref(r$) {
|
|
266
|
+
var _ref$ = composeRefs((el) => textareaRef = el, props.ref);
|
|
267
|
+
typeof _ref$ === "function" && _ref$(r$);
|
|
268
|
+
} }));
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
//#endregion
|
|
272
|
+
//#region src/components/field/field.ts
|
|
273
|
+
var field_exports = /* @__PURE__ */ __export({
|
|
274
|
+
Context: () => FieldContext,
|
|
275
|
+
ErrorText: () => FieldErrorText,
|
|
276
|
+
HelperText: () => FieldHelperText,
|
|
277
|
+
Input: () => FieldInput,
|
|
278
|
+
Label: () => FieldLabel,
|
|
279
|
+
RequiredIndicator: () => FieldRequiredIndicator,
|
|
280
|
+
Root: () => FieldRoot,
|
|
281
|
+
RootProvider: () => FieldRootProvider,
|
|
282
|
+
Select: () => FieldSelect,
|
|
283
|
+
Textarea: () => FieldTextarea
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
//#endregion
|
|
287
|
+
export { FieldRoot as a, FieldRequiredIndicator as c, FieldHelperText as d, FieldErrorText as f, FieldRootProvider as i, FieldLabel as l, useFieldContext as m, FieldTextarea as n, useField as o, FieldContext as p, FieldSelect as r, fieldAnatomy as s, field_exports as t, FieldInput as u };
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { t as __export } from "./chunk-C4aQI7lE.jsx";
|
|
2
|
+
import { i as mergeProps$1 } from "./run-if-fn-DRWB51JE.jsx";
|
|
3
|
+
import { t as createContext$1 } from "./create-context-h3cXiEld.jsx";
|
|
4
|
+
import { o as useEnvironmentContext } from "./providers-CHqGPEsc.jsx";
|
|
5
|
+
import { n as sprawlify, t as createSplitProps } from "./create-split-props-CQVsvhvg.jsx";
|
|
6
|
+
import { t as composeRefs } from "./compose-refs-CzyOb8yH.jsx";
|
|
7
|
+
import { u as useFieldsetContext } from "./fieldset-BG-0ZqWT.jsx";
|
|
8
|
+
import { Show, createMemo, createSignal, createUniqueId, mergeProps, onCleanup, onMount, splitProps } from "solid-js";
|
|
9
|
+
import { ariaAttr, dataAttr } from "@sprawlify/primitives/dom-query";
|
|
10
|
+
import { createAnatomy } from "@sprawlify/primitives/anatomy";
|
|
11
|
+
import { autoresizeTextarea } from "@sprawlify/primitives/auto-resize";
|
|
12
|
+
|
|
13
|
+
//#region src/components/field/use-field-context.ts
|
|
14
|
+
const [FieldProvider, useFieldContext] = createContext$1({
|
|
15
|
+
hookName: "useFieldContext",
|
|
16
|
+
providerName: "<FieldProvider />",
|
|
17
|
+
strict: false
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/components/field/field-context.tsx
|
|
22
|
+
const FieldContext = (props) => props.children(useFieldContext());
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/components/field/field-error-text.tsx
|
|
26
|
+
const FieldErrorText = (props) => {
|
|
27
|
+
const field = useFieldContext();
|
|
28
|
+
const mergedProps = mergeProps$1(() => field().getErrorTextProps(), props);
|
|
29
|
+
return <Show when={field?.().invalid}>
|
|
30
|
+
<sprawlify.span {...mergedProps} />
|
|
31
|
+
</Show>;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/components/field/field-helper-text.tsx
|
|
36
|
+
const FieldHelperText = (props) => {
|
|
37
|
+
const field = useFieldContext();
|
|
38
|
+
const mergedProps = mergeProps$1(() => field().getHelperTextProps(), props);
|
|
39
|
+
return <sprawlify.span {...mergedProps} />;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region src/components/field/field-input.tsx
|
|
44
|
+
const FieldInput = (props) => {
|
|
45
|
+
const field = useFieldContext();
|
|
46
|
+
const mergedProps = mergeProps$1(() => field?.().getInputProps(), props);
|
|
47
|
+
return <sprawlify.input {...mergedProps} />;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/components/field/field-label.tsx
|
|
52
|
+
const FieldLabel = (props) => {
|
|
53
|
+
const field = useFieldContext();
|
|
54
|
+
const mergedProps = mergeProps$1(() => field?.().getLabelProps(), props);
|
|
55
|
+
return <sprawlify.label {...mergedProps} />;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src/components/field/field-required-indicator.tsx
|
|
60
|
+
const FieldRequiredIndicator = (props) => {
|
|
61
|
+
const field = useFieldContext();
|
|
62
|
+
const mergedProps = mergeProps$1(() => field().getRequiredIndicatorProps(), props);
|
|
63
|
+
return <Show when={field().required} fallback={props.fallback}>
|
|
64
|
+
<sprawlify.span {...mergedProps}>{props.children ?? "*"}</sprawlify.span>
|
|
65
|
+
</Show>;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region src/components/field/field-anatomy.ts
|
|
70
|
+
const fieldAnatomy = createAnatomy("field").parts("root", "errorText", "helperText", "input", "label", "select", "textarea", "requiredIndicator");
|
|
71
|
+
const parts = fieldAnatomy.build();
|
|
72
|
+
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/components/field/use-field.ts
|
|
75
|
+
const useField = (props) => {
|
|
76
|
+
const fieldset = useFieldsetContext();
|
|
77
|
+
const env = useEnvironmentContext();
|
|
78
|
+
const fieldProps = mergeProps({
|
|
79
|
+
disabled: Boolean(fieldset?.().disabled),
|
|
80
|
+
required: false,
|
|
81
|
+
invalid: false,
|
|
82
|
+
readOnly: false
|
|
83
|
+
}, props);
|
|
84
|
+
const [hasErrorText, setHasErrorText] = createSignal(false);
|
|
85
|
+
const [hasHelperText, setHasHelperText] = createSignal(false);
|
|
86
|
+
const id = fieldProps.id ?? createUniqueId();
|
|
87
|
+
const [rootRef, setRootRef] = createSignal(void 0);
|
|
88
|
+
const rootId = fieldProps.ids?.control ?? `field::${id}`;
|
|
89
|
+
const errorTextId = fieldProps.ids?.errorText ?? `field::${id}::error-text`;
|
|
90
|
+
const helperTextId = fieldProps.ids?.helperText ?? `field::${id}::helper-text`;
|
|
91
|
+
const labelId = fieldProps.ids?.label ?? `field::${id}::label`;
|
|
92
|
+
onMount(() => {
|
|
93
|
+
const rootNode = rootRef();
|
|
94
|
+
if (!rootNode) return;
|
|
95
|
+
const checkTextElements = () => {
|
|
96
|
+
const docOrShadowRoot = env().getRootNode();
|
|
97
|
+
setHasErrorText(!!docOrShadowRoot.getElementById(errorTextId));
|
|
98
|
+
setHasHelperText(!!docOrShadowRoot.getElementById(helperTextId));
|
|
99
|
+
};
|
|
100
|
+
checkTextElements();
|
|
101
|
+
const observer = new (env().getWindow()).MutationObserver(checkTextElements);
|
|
102
|
+
observer.observe(rootNode, {
|
|
103
|
+
childList: true,
|
|
104
|
+
subtree: true
|
|
105
|
+
});
|
|
106
|
+
onCleanup(() => observer.disconnect());
|
|
107
|
+
});
|
|
108
|
+
const getRootProps = () => ({
|
|
109
|
+
...parts.root.attrs,
|
|
110
|
+
id: rootId,
|
|
111
|
+
role: "group",
|
|
112
|
+
"data-disabled": dataAttr(fieldProps.disabled),
|
|
113
|
+
"data-invalid": dataAttr(fieldProps.invalid),
|
|
114
|
+
"data-readonly": dataAttr(fieldProps.readOnly)
|
|
115
|
+
});
|
|
116
|
+
const getLabelProps = () => ({
|
|
117
|
+
...parts.label.attrs,
|
|
118
|
+
id: labelId,
|
|
119
|
+
"data-disabled": dataAttr(fieldProps.disabled),
|
|
120
|
+
"data-invalid": dataAttr(fieldProps.invalid),
|
|
121
|
+
"data-readonly": dataAttr(fieldProps.readOnly),
|
|
122
|
+
"data-required": dataAttr(fieldProps.required),
|
|
123
|
+
htmlFor: id
|
|
124
|
+
});
|
|
125
|
+
const labelIds = createMemo(() => {
|
|
126
|
+
const ids = [];
|
|
127
|
+
if (hasErrorText() && fieldProps.invalid) ids.push(errorTextId);
|
|
128
|
+
if (hasHelperText()) ids.push(helperTextId);
|
|
129
|
+
return ids;
|
|
130
|
+
});
|
|
131
|
+
const getControlProps = () => ({
|
|
132
|
+
"aria-describedby": labelIds().join(" ") || void 0,
|
|
133
|
+
"aria-invalid": ariaAttr(fieldProps.invalid),
|
|
134
|
+
"data-invalid": dataAttr(fieldProps.invalid),
|
|
135
|
+
"data-required": dataAttr(fieldProps.required),
|
|
136
|
+
"data-readonly": dataAttr(fieldProps.readOnly),
|
|
137
|
+
id,
|
|
138
|
+
required: fieldProps.required,
|
|
139
|
+
disabled: fieldProps.disabled,
|
|
140
|
+
readOnly: fieldProps.readOnly || void 0
|
|
141
|
+
});
|
|
142
|
+
const getInputProps = () => ({
|
|
143
|
+
...getControlProps(),
|
|
144
|
+
...parts.input.attrs
|
|
145
|
+
});
|
|
146
|
+
const getTextareaProps = () => ({
|
|
147
|
+
...getControlProps(),
|
|
148
|
+
...parts.textarea.attrs
|
|
149
|
+
});
|
|
150
|
+
const getSelectProps = () => ({
|
|
151
|
+
...getControlProps(),
|
|
152
|
+
...parts.select.attrs
|
|
153
|
+
});
|
|
154
|
+
const getHelperTextProps = () => ({
|
|
155
|
+
id: helperTextId,
|
|
156
|
+
...parts.helperText.attrs,
|
|
157
|
+
"data-disabled": dataAttr(fieldProps.disabled)
|
|
158
|
+
});
|
|
159
|
+
const getErrorTextProps = () => ({
|
|
160
|
+
id: errorTextId,
|
|
161
|
+
...parts.errorText.attrs,
|
|
162
|
+
"aria-live": "polite"
|
|
163
|
+
});
|
|
164
|
+
const getRequiredIndicatorProps = () => ({
|
|
165
|
+
"aria-hidden": true,
|
|
166
|
+
...parts.requiredIndicator.attrs
|
|
167
|
+
});
|
|
168
|
+
return createMemo(() => ({
|
|
169
|
+
ariaDescribedby: labelIds().join(" "),
|
|
170
|
+
ids: {
|
|
171
|
+
control: id,
|
|
172
|
+
label: labelId,
|
|
173
|
+
errorText: errorTextId,
|
|
174
|
+
helperText: helperTextId
|
|
175
|
+
},
|
|
176
|
+
refs: { rootRef: setRootRef },
|
|
177
|
+
disabled: fieldProps.disabled,
|
|
178
|
+
invalid: fieldProps.invalid,
|
|
179
|
+
readOnly: fieldProps.readOnly,
|
|
180
|
+
required: fieldProps.required,
|
|
181
|
+
getLabelProps,
|
|
182
|
+
getRootProps,
|
|
183
|
+
getInputProps,
|
|
184
|
+
getTextareaProps,
|
|
185
|
+
getSelectProps,
|
|
186
|
+
getHelperTextProps,
|
|
187
|
+
getErrorTextProps,
|
|
188
|
+
getRequiredIndicatorProps
|
|
189
|
+
}));
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region src/components/field/field-root.tsx
|
|
194
|
+
const FieldRoot = (props) => {
|
|
195
|
+
const [useFieldProps, localProps] = createSplitProps()(props, [
|
|
196
|
+
"id",
|
|
197
|
+
"ids",
|
|
198
|
+
"disabled",
|
|
199
|
+
"invalid",
|
|
200
|
+
"readOnly",
|
|
201
|
+
"required"
|
|
202
|
+
]);
|
|
203
|
+
const field = useField(useFieldProps);
|
|
204
|
+
const mergedProps = mergeProps$1(() => field().getRootProps(), localProps);
|
|
205
|
+
return <FieldProvider value={field}>
|
|
206
|
+
<sprawlify.div {...mergedProps} ref={composeRefs(field().refs.rootRef, props.ref)} />
|
|
207
|
+
</FieldProvider>;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region src/components/field/field-root-provider.tsx
|
|
212
|
+
const FieldRootProvider = (props) => {
|
|
213
|
+
const [{ value: field }, localProps] = createSplitProps()(props, ["value"]);
|
|
214
|
+
const mergedProps = mergeProps$1(() => field().getRootProps(), localProps);
|
|
215
|
+
return <FieldProvider value={field}>
|
|
216
|
+
<sprawlify.div {...mergedProps} />
|
|
217
|
+
</FieldProvider>;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
//#endregion
|
|
221
|
+
//#region src/components/field/field-select.tsx
|
|
222
|
+
const FieldSelect = (props) => {
|
|
223
|
+
const field = useFieldContext();
|
|
224
|
+
const mergedProps = mergeProps$1(() => field?.().getSelectProps(), props);
|
|
225
|
+
return <sprawlify.select {...mergedProps} />;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region src/components/field/field-textarea.tsx
|
|
230
|
+
const FieldTextarea = (props) => {
|
|
231
|
+
const field = useFieldContext();
|
|
232
|
+
let textareaRef;
|
|
233
|
+
const [autoresizeProps, textareaProps] = splitProps(props, ["autoresize"]);
|
|
234
|
+
const mergedProps = mergeProps$1(() => field?.().getTextareaProps(), () => ({ style: { resize: autoresizeProps.autoresize ? "none" : void 0 } }), textareaProps);
|
|
235
|
+
onMount(() => {
|
|
236
|
+
if (!autoresizeProps.autoresize) return;
|
|
237
|
+
const cleanup = autoresizeTextarea(textareaRef);
|
|
238
|
+
onCleanup(() => cleanup?.());
|
|
239
|
+
});
|
|
240
|
+
return <sprawlify.textarea {...mergedProps} ref={composeRefs((el) => textareaRef = el, props.ref)} />;
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
//#endregion
|
|
244
|
+
//#region src/components/field/field.ts
|
|
245
|
+
var field_exports = /* @__PURE__ */ __export({
|
|
246
|
+
Context: () => FieldContext,
|
|
247
|
+
ErrorText: () => FieldErrorText,
|
|
248
|
+
HelperText: () => FieldHelperText,
|
|
249
|
+
Input: () => FieldInput,
|
|
250
|
+
Label: () => FieldLabel,
|
|
251
|
+
RequiredIndicator: () => FieldRequiredIndicator,
|
|
252
|
+
Root: () => FieldRoot,
|
|
253
|
+
RootProvider: () => FieldRootProvider,
|
|
254
|
+
Select: () => FieldSelect,
|
|
255
|
+
Textarea: () => FieldTextarea
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
//#endregion
|
|
259
|
+
export { FieldRoot as a, FieldRequiredIndicator as c, FieldHelperText as d, FieldErrorText as f, FieldRootProvider as i, FieldLabel as l, useFieldContext as m, FieldTextarea as n, useField as o, FieldContext as p, FieldSelect as r, fieldAnatomy as s, field_exports as t, FieldInput as u };
|