@tamagui/form 2.7.7 → 3.0.0-beta.643.1
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/cjs/Form.cjs +223 -67
- package/dist/cjs/Form.native.cjs +347 -0
- package/dist/cjs/Form.native.js +326 -68
- package/dist/cjs/Form.native.js.map +1 -1
- package/dist/cjs/index.cjs +10 -11
- package/dist/cjs/index.native.cjs +21 -0
- package/dist/cjs/index.native.js +10 -10
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/esm/Form.mjs +200 -49
- package/dist/esm/Form.mjs.map +1 -1
- package/dist/esm/Form.native.js +303 -51
- package/dist/esm/Form.native.js.map +1 -1
- package/dist/esm/index.js +1 -2
- package/dist/esm/index.mjs +1 -2
- package/dist/esm/index.native.js +1 -2
- package/dist/jsx/Form.mjs +200 -49
- package/dist/jsx/Form.mjs.map +1 -1
- package/dist/jsx/Form.native.cjs +347 -0
- package/dist/jsx/Form.native.js +326 -68
- package/dist/jsx/Form.native.js.map +1 -1
- package/dist/jsx/index.js +1 -2
- package/dist/jsx/index.mjs +1 -2
- package/dist/jsx/index.native.cjs +21 -0
- package/dist/jsx/index.native.js +10 -10
- package/dist/jsx/index.native.js.map +1 -1
- package/package.json +5 -4
- package/src/Form.tsx +318 -47
- package/types/Form.d.ts +63 -16
- package/types/Form.d.ts.map +1 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/index.mjs.map +0 -1
- package/dist/esm/index.native.js.map +0 -1
- package/dist/jsx/index.js.map +0 -1
- package/dist/jsx/index.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["jsx","_jsx","View","createStyledContext","styled","composeEventHandlers","withStaticProperties","FORM_NAME","FormFrame","name","render","FormContext","onSubmit","useStyledContext","useFormContext","Provider","FormProvider","FormTriggerFrame","FormTrigger","styleable","props","forwardedRef","scope","children","onPress","triggerProps","context","role","ref","FormComponent","Form","param","e","preventDefault","Form2","Trigger"],"sources":["../../src/Form.tsx"],"sourcesContent":[null],"mappings":"AACA,SAASA,GAAA,IAAMC,IAAA,2BAAqB;AACpC,SAASC,IAAA,EAAAC,mBAAsB,EAAAC,MAAA,uBAA4B;AA+CrD,SAAAC,oBAAA,EAAAC,oBAAA;AA7CN,IAAAC,SAAM,SAAY;AAEX,IAAAC,SAAM,GAAAJ,MAAY,CAAAF,IAAO;EAC9BO,IAAA,EAAMF,SAAA;EACNG,MAAA,EAAQ;AACV,CAAC;AAUM,IAAAC,WAAM,GAAAR,mBAAc;EACzBS,QAAA,EAAU;AACZ,CAAqB;AAEd;EAAMC,gBAAE,EAAAC,cAAkB;EAAAC,QAAgB,EAAAC;AAAU,IAAaL,WAAI;AAY5E,IAAAM,gBAAM,GAAAb,MAAmB,CAAAF,IAAO;EAC9BO,IAAA,EAAM;AACR,CAAC;AAMM,IAAAS,WAAM,GAAAD,gBAAc,CAAAE,SAAiB,WAAAC,KAAA,EAAAC,YAAA;EAC1C,IAAC;IAAAC,KAAO;IAAAC,QAAA;IAAAC,OAAiB;IAAA,GAAAC;EAAA,IAAAL,KAAA;EACvB,IAAAM,OAAQ,GAAAZ,cAAiB,CAAAQ,KAAA;EACzB,sBAAgBrB,IAAA,CAAAgB,gBAAoB;IAEpCU,IAAA,UACE;IAAA,GAACF,YAAA;IAAAG,GAAA,EAAAP,YAAA;IAAAG,OACC,EAAAnB,oBAAK,CAAAmB,OAAA,EAAAE,OAAA,CAAAd,QAAA;IAAAW;EACD;AACC;AACkD,IAAAM,aAEtD,GAAArB,SAAA,CAAAW,SAAA,UAAAW,KAAAC,KAAA,EAAAH,GAAA;EAAA;IAAAN,KAAA;IAAAV,QAAA;IAAA,GAAAQ;EAAA,IAAAW,KAAA;EAAA,OACH,eAAA9B,IAAA,CAAAe,YAAA;IAEJM,KAAA;IACFV,QAAA;IAMAW,QAAM,iBAAgBtB,IAAU,CAAAO,SAA0B;MAIxDoB,GACE;MACG,GAAAR,KAAA;MAAAR,QAAA,WAAAA,CAAAoB,CAAA;QACCA,CAAA,CAAAC,cAAA;QACCrB,QAAI,aAAAA,QAAA,uBAAAA,QAAA;MACL;IACE;EACA;AAAW;AACb,IAAAsB,KAAA,GAAA5B,oBAAA,CAAAuB,aAAA;EACFM,OACF,EAAAjB;AAEJ,CAAC;AAEM,SACLgB,KAAA,IAASJ,IAAA,EACVnB,WAAA,E","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Form.native.js","names":[],"sources":["esm/Form.native.js"],"sourcesContent":["import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createStyledContext, createStyledHOC, isWeb, styled, View } from \"@tamagui/core\";\nimport { focusFocusable } from \"@tamagui/focusable\";\nimport { composeEventHandlers, withStaticProperties } from \"@tamagui/helpers\";\nimport * as React from \"react\";\nvar FORM_NAME = \"Form\";\nvar EMPTY_ERRORS = {};\nvar defaultSubmitAttemptedRef = {\n current: false\n};\nvar defaultFormElementRef = {\n current: null\n};\nvar FormRegistryContext = /* @__PURE__ */ React.createContext({\n validationMode: \"onSubmit\",\n errors: EMPTY_ERRORS,\n formElementRef: defaultFormElementRef,\n submitAttemptedRef: defaultSubmitAttemptedRef,\n clearErrors: function() {\n },\n getValues: function() {\n return {};\n },\n registerField: function() {\n return function() {\n };\n }\n});\nvar useFormRegistryContext = function() {\n return React.useContext(FormRegistryContext);\n};\nvar FormContext = createStyledContext({\n onSubmit: void 0\n});\nvar { useStyledContext: useFormContext, Provider: FormProvider } = FormContext;\nvar FormFrame = styled(View, {\n displayName: FORM_NAME,\n render: \"form\"\n});\nvar FormTriggerFrame = styled(View, {\n displayName: \"FormTrigger\"\n});\nvar FormTrigger = createStyledHOC(FormTriggerFrame, function(props, forwardedRef) {\n var { scope, children, onPress, ...triggerProps } = props;\n var context = useFormContext(scope);\n return /* @__PURE__ */ _jsx(FormTriggerFrame, {\n role: \"button\",\n ...triggerProps,\n ref: forwardedRef,\n onPress: composeEventHandlers(onPress, context.onSubmit),\n children\n });\n});\nfunction hasError(errors, name) {\n if (!name || !Object.hasOwn(errors, name)) {\n return false;\n }\n var error = errors[name];\n return Array.isArray(error) ? error.length > 0 : Boolean(error);\n}\nvar FormComponent = createStyledHOC(FormFrame, function Form(param, forwardedRef) {\n var { scope, validationMode = \"onSubmit\", errors: externalErrors, actionsRef, onSubmit, ...props } = param;\n var registryRef = React.useRef(/* @__PURE__ */ new Map());\n var formElementRef = React.useRef(null);\n var submittedRef = React.useRef(false);\n var submitAttemptedRef = React.useRef(false);\n var pendingSubmitDetailsRef = React.useRef(null);\n var onSubmitRef = React.useRef(onSubmit);\n onSubmitRef.current = onSubmit;\n var [errors, setErrors] = React.useState(externalErrors !== null && externalErrors !== void 0 ? externalErrors : EMPTY_ERRORS);\n var errorsRef = React.useRef(errors);\n errorsRef.current = errors;\n React.useEffect(function() {\n var next = externalErrors !== null && externalErrors !== void 0 ? externalErrors : EMPTY_ERRORS;\n errorsRef.current = next;\n setErrors(next);\n }, [\n externalErrors\n ]);\n var registerField = React.useCallback(function(id, registration) {\n registryRef.current.set(id, registration);\n return function() {\n if (registryRef.current.get(id) === registration) {\n registryRef.current.delete(id);\n }\n };\n }, []);\n var getValues = React.useCallback(function() {\n var values = {};\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = registryRef.current.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var field = _step.value;\n if (field.name) {\n values[field.name] = field.getValue();\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return values;\n }, []);\n var clearErrors = React.useCallback(function(name) {\n if (!name || !hasError(errorsRef.current, name)) {\n return;\n }\n var next = {\n ...errorsRef.current\n };\n delete next[name];\n errorsRef.current = next;\n setErrors(next);\n }, []);\n var focusFirstInvalid = React.useCallback(function() {\n var hasInvalid = false;\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = registryRef.current.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var field = _step.value;\n if (!hasError(errorsRef.current, field.name) && field.validityData.state.valid !== false) {\n continue;\n }\n hasInvalid = true;\n var control = field.controlRef.current;\n if (isWeb && (control === null || control === void 0 ? void 0 : control.focus)) {\n control.focus();\n if (control.tagName === \"INPUT\" || control.tagName === \"TEXTAREA\") {\n var _control_select;\n (_control_select = control.select) === null || _control_select === void 0 ? void 0 : _control_select.call(control);\n }\n return true;\n }\n if (!isWeb && field.controlId) {\n focusFocusable(field.controlId);\n return true;\n }\n if (control === null || control === void 0 ? void 0 : control.focus) {\n control.focus();\n return true;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return hasInvalid;\n }, []);\n var performSubmit = React.useCallback(function(details) {\n var _onSubmitRef_current;\n submitAttemptedRef.current = true;\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = registryRef.current.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var field = _step.value;\n field.validate();\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n if (focusFirstInvalid()) {\n return;\n }\n submittedRef.current = true;\n void ((_onSubmitRef_current = onSubmitRef.current) === null || _onSubmitRef_current === void 0 ? void 0 : _onSubmitRef_current.call(onSubmitRef, getValues(), details));\n }, [\n focusFirstInvalid,\n getValues\n ]);\n var requestSubmit = React.useCallback(function(event) {\n var _event_preventDefault, _formElementRef_current;\n event === null || event === void 0 ? void 0 : (_event_preventDefault = event.preventDefault) === null || _event_preventDefault === void 0 ? void 0 : _event_preventDefault.call(event);\n var _event_nativeEvent;\n var details = {\n reason: \"trigger-press\",\n event: (_event_nativeEvent = event === null || event === void 0 ? void 0 : event.nativeEvent) !== null && _event_nativeEvent !== void 0 ? _event_nativeEvent : event,\n trigger: event === null || event === void 0 ? void 0 : event.currentTarget\n };\n if (isWeb && ((_formElementRef_current = formElementRef.current) === null || _formElementRef_current === void 0 ? void 0 : _formElementRef_current.requestSubmit)) {\n pendingSubmitDetailsRef.current = details;\n formElementRef.current.requestSubmit();\n return;\n }\n performSubmit(details);\n }, [\n performSubmit\n ]);\n React.useEffect(function() {\n if (!submittedRef.current) {\n return;\n }\n submittedRef.current = false;\n focusFirstInvalid();\n }, [\n errors,\n focusFirstInvalid\n ]);\n React.useImperativeHandle(actionsRef, function() {\n return {\n validate(fieldName) {\n if (fieldName) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = registryRef.current.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var field = _step.value;\n if (field.name === fieldName) {\n field.validate();\n return;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return;\n }\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;\n try {\n for (var _iterator1 = registryRef.current.values()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {\n var field1 = _step1.value;\n field1.validate();\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally {\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n };\n }, []);\n var registryContext = React.useMemo(function() {\n return {\n validationMode,\n errors,\n formElementRef,\n submitAttemptedRef,\n clearErrors,\n getValues,\n registerField\n };\n }, [\n clearErrors,\n errors,\n getValues,\n registerField,\n validationMode\n ]);\n return /* @__PURE__ */ _jsx(FormRegistryContext.Provider, {\n value: registryContext,\n children: /* @__PURE__ */ _jsx(FormProvider, {\n scope,\n onSubmit: requestSubmit,\n children: /* @__PURE__ */ _jsx(FormFrame, {\n ...props,\n ref: function(element) {\n formElementRef.current = element;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(element);\n } else if (forwardedRef) {\n forwardedRef.current = element;\n }\n },\n noValidate: true,\n onSubmit: function(event) {\n var _event_nativeEvent;\n event.preventDefault();\n var pendingDetails = pendingSubmitDetailsRef.current;\n pendingSubmitDetailsRef.current = null;\n var _event_nativeEvent1;\n performSubmit(pendingDetails !== null && pendingDetails !== void 0 ? pendingDetails : {\n reason: \"submit\",\n event: (_event_nativeEvent1 = event.nativeEvent) !== null && _event_nativeEvent1 !== void 0 ? _event_nativeEvent1 : event,\n trigger: (_event_nativeEvent = event.nativeEvent) === null || _event_nativeEvent === void 0 ? void 0 : _event_nativeEvent.submitter\n });\n }\n })\n })\n });\n});\nvar Form2 = withStaticProperties(FormComponent, {\n Trigger: FormTrigger\n});\nexport {\n Form2 as Form,\n FormContext,\n FormFrame,\n FormProvider,\n FormRegistryContext,\n FormTrigger,\n useFormContext,\n useFormRegistryContext\n};\n//# sourceMappingURL=Form.js.map\n"],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export * from "./Form.mjs"
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export * from "./Form.mjs"
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export * from "./Form.mjs"
|
|
2
|
-
//# sourceMappingURL=index.mjs.map
|
|
1
|
+
export * from "./Form.mjs"
|
package/dist/esm/index.native.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export * from "./Form.native.js"
|
|
2
|
-
//# sourceMappingURL=index.native.js.map
|
|
1
|
+
export * from "./Form.native.js"
|
package/dist/jsx/Form.mjs
CHANGED
|
@@ -1,57 +1,208 @@
|
|
|
1
|
-
import { View, createStyledContext, styled } from "@tamagui/core";
|
|
1
|
+
import { View, createStyledContext, createStyledHOC, isWeb, styled } from "@tamagui/core";
|
|
2
|
+
import { focusFocusable } from "@tamagui/focusable";
|
|
2
3
|
import { composeEventHandlers, withStaticProperties } from "@tamagui/helpers";
|
|
4
|
+
import * as React from "react";
|
|
3
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
|
|
4
7
|
const FORM_NAME = "Form";
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const EMPTY_ERRORS = {};
|
|
9
|
+
const defaultSubmitAttemptedRef = { current: false };
|
|
10
|
+
const defaultFormElementRef = { current: null };
|
|
11
|
+
const FormRegistryContext = React.createContext({
|
|
12
|
+
validationMode: "onSubmit",
|
|
13
|
+
errors: EMPTY_ERRORS,
|
|
14
|
+
formElementRef: defaultFormElementRef,
|
|
15
|
+
submitAttemptedRef: defaultSubmitAttemptedRef,
|
|
16
|
+
clearErrors: () => {},
|
|
17
|
+
getValues: () => ({}),
|
|
18
|
+
registerField: () => () => {}
|
|
11
19
|
});
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
});
|
|
19
|
-
const FormTrigger = FormTriggerFrame.styleable((props, forwardedRef) => {
|
|
20
|
-
const {
|
|
21
|
-
scope,
|
|
22
|
-
children,
|
|
23
|
-
onPress,
|
|
24
|
-
...triggerProps
|
|
25
|
-
} = props;
|
|
26
|
-
const context = useFormContext(scope);
|
|
27
|
-
return /* @__PURE__ */jsx(FormTriggerFrame, {
|
|
28
|
-
role: "button",
|
|
29
|
-
...triggerProps,
|
|
30
|
-
ref: forwardedRef,
|
|
31
|
-
onPress: composeEventHandlers(onPress, context.onSubmit),
|
|
32
|
-
children
|
|
33
|
-
});
|
|
20
|
+
const useFormRegistryContext = () => React.useContext(FormRegistryContext);
|
|
21
|
+
const FormContext = createStyledContext({ onSubmit: void 0 });
|
|
22
|
+
const { useStyledContext: useFormContext, Provider: FormProvider } = FormContext;
|
|
23
|
+
const FormFrame = styled(View, {
|
|
24
|
+
displayName: FORM_NAME,
|
|
25
|
+
render: "form"
|
|
34
26
|
});
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
onSubmit: e => {
|
|
47
|
-
e.preventDefault();
|
|
48
|
-
onSubmit?.();
|
|
49
|
-
}
|
|
50
|
-
})
|
|
51
|
-
});
|
|
27
|
+
const FormTriggerFrame = styled(View, { displayName: "FormTrigger" });
|
|
28
|
+
const FormTrigger = createStyledHOC(FormTriggerFrame, (props, forwardedRef) => {
|
|
29
|
+
const { scope, children, onPress, ...triggerProps } = props;
|
|
30
|
+
const context = useFormContext(scope);
|
|
31
|
+
return /* @__PURE__ */ jsx(FormTriggerFrame, {
|
|
32
|
+
role: "button",
|
|
33
|
+
...triggerProps,
|
|
34
|
+
ref: forwardedRef,
|
|
35
|
+
onPress: composeEventHandlers(onPress, context.onSubmit),
|
|
36
|
+
children
|
|
37
|
+
});
|
|
52
38
|
});
|
|
53
|
-
|
|
54
|
-
|
|
39
|
+
function hasError(errors, name) {
|
|
40
|
+
if (!name || !Object.hasOwn(errors, name)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const error = errors[name];
|
|
44
|
+
return Array.isArray(error) ? error.length > 0 : Boolean(error);
|
|
45
|
+
}
|
|
46
|
+
const FormComponent = createStyledHOC(FormFrame, function Form({ scope, validationMode = "onSubmit", errors: externalErrors, actionsRef, onSubmit, ...props }, forwardedRef) {
|
|
47
|
+
const registryRef = React.useRef(/* @__PURE__ */ new Map());
|
|
48
|
+
const formElementRef = React.useRef(null);
|
|
49
|
+
const submittedRef = React.useRef(false);
|
|
50
|
+
const submitAttemptedRef = React.useRef(false);
|
|
51
|
+
const pendingSubmitDetailsRef = React.useRef(null);
|
|
52
|
+
const onSubmitRef = React.useRef(onSubmit);
|
|
53
|
+
onSubmitRef.current = onSubmit;
|
|
54
|
+
const [errors, setErrors] = React.useState(externalErrors ?? EMPTY_ERRORS);
|
|
55
|
+
const errorsRef = React.useRef(errors);
|
|
56
|
+
errorsRef.current = errors;
|
|
57
|
+
React.useEffect(() => {
|
|
58
|
+
const next = externalErrors ?? EMPTY_ERRORS;
|
|
59
|
+
errorsRef.current = next;
|
|
60
|
+
setErrors(next);
|
|
61
|
+
}, [externalErrors]);
|
|
62
|
+
const registerField = React.useCallback((id, registration) => {
|
|
63
|
+
registryRef.current.set(id, registration);
|
|
64
|
+
return () => {
|
|
65
|
+
if (registryRef.current.get(id) === registration) {
|
|
66
|
+
registryRef.current.delete(id);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}, []);
|
|
70
|
+
const getValues = React.useCallback(() => {
|
|
71
|
+
const values = {};
|
|
72
|
+
for (const field of registryRef.current.values()) {
|
|
73
|
+
if (field.name) {
|
|
74
|
+
values[field.name] = field.getValue();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return values;
|
|
78
|
+
}, []);
|
|
79
|
+
const clearErrors = React.useCallback((name) => {
|
|
80
|
+
if (!name || !hasError(errorsRef.current, name)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const next = { ...errorsRef.current };
|
|
84
|
+
delete next[name];
|
|
85
|
+
errorsRef.current = next;
|
|
86
|
+
setErrors(next);
|
|
87
|
+
}, []);
|
|
88
|
+
const focusFirstInvalid = React.useCallback(() => {
|
|
89
|
+
let hasInvalid = false;
|
|
90
|
+
for (const field of registryRef.current.values()) {
|
|
91
|
+
if (!hasError(errorsRef.current, field.name) && field.validityData.state.valid !== false) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
hasInvalid = true;
|
|
95
|
+
const control = field.controlRef.current;
|
|
96
|
+
if (isWeb && control?.focus) {
|
|
97
|
+
control.focus();
|
|
98
|
+
if (control.tagName === "INPUT" || control.tagName === "TEXTAREA") {
|
|
99
|
+
control.select?.();
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
if (!isWeb && field.controlId) {
|
|
104
|
+
focusFocusable(field.controlId);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
if (control?.focus) {
|
|
108
|
+
control.focus();
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return hasInvalid;
|
|
113
|
+
}, []);
|
|
114
|
+
const performSubmit = React.useCallback((details) => {
|
|
115
|
+
submitAttemptedRef.current = true;
|
|
116
|
+
for (const field of registryRef.current.values()) {
|
|
117
|
+
field.validate();
|
|
118
|
+
}
|
|
119
|
+
if (focusFirstInvalid()) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
submittedRef.current = true;
|
|
123
|
+
void onSubmitRef.current?.(getValues(), details);
|
|
124
|
+
}, [focusFirstInvalid, getValues]);
|
|
125
|
+
const requestSubmit = React.useCallback((event) => {
|
|
126
|
+
event?.preventDefault?.();
|
|
127
|
+
const details = {
|
|
128
|
+
reason: "trigger-press",
|
|
129
|
+
event: event?.nativeEvent ?? event,
|
|
130
|
+
trigger: event?.currentTarget
|
|
131
|
+
};
|
|
132
|
+
if (isWeb && formElementRef.current?.requestSubmit) {
|
|
133
|
+
pendingSubmitDetailsRef.current = details;
|
|
134
|
+
formElementRef.current.requestSubmit();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
performSubmit(details);
|
|
138
|
+
}, [performSubmit]);
|
|
139
|
+
React.useEffect(() => {
|
|
140
|
+
if (!submittedRef.current) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
submittedRef.current = false;
|
|
144
|
+
focusFirstInvalid();
|
|
145
|
+
}, [errors, focusFirstInvalid]);
|
|
146
|
+
React.useImperativeHandle(actionsRef, () => ({ validate(fieldName) {
|
|
147
|
+
if (fieldName) {
|
|
148
|
+
for (const field of registryRef.current.values()) {
|
|
149
|
+
if (field.name === fieldName) {
|
|
150
|
+
field.validate();
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
for (const field of registryRef.current.values()) {
|
|
157
|
+
field.validate();
|
|
158
|
+
}
|
|
159
|
+
} }), []);
|
|
160
|
+
const registryContext = React.useMemo(() => ({
|
|
161
|
+
validationMode,
|
|
162
|
+
errors,
|
|
163
|
+
formElementRef,
|
|
164
|
+
submitAttemptedRef,
|
|
165
|
+
clearErrors,
|
|
166
|
+
getValues,
|
|
167
|
+
registerField
|
|
168
|
+
}), [
|
|
169
|
+
clearErrors,
|
|
170
|
+
errors,
|
|
171
|
+
getValues,
|
|
172
|
+
registerField,
|
|
173
|
+
validationMode
|
|
174
|
+
]);
|
|
175
|
+
return /* @__PURE__ */ jsx(FormRegistryContext.Provider, {
|
|
176
|
+
value: registryContext,
|
|
177
|
+
children: /* @__PURE__ */ jsx(FormProvider, {
|
|
178
|
+
scope,
|
|
179
|
+
onSubmit: requestSubmit,
|
|
180
|
+
children: /* @__PURE__ */ jsx(FormFrame, {
|
|
181
|
+
...props,
|
|
182
|
+
ref: (element) => {
|
|
183
|
+
formElementRef.current = element;
|
|
184
|
+
if (typeof forwardedRef === "function") {
|
|
185
|
+
forwardedRef(element);
|
|
186
|
+
} else if (forwardedRef) {
|
|
187
|
+
forwardedRef.current = element;
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
noValidate: true,
|
|
191
|
+
onSubmit: (event) => {
|
|
192
|
+
event.preventDefault();
|
|
193
|
+
const pendingDetails = pendingSubmitDetailsRef.current;
|
|
194
|
+
pendingSubmitDetailsRef.current = null;
|
|
195
|
+
performSubmit(pendingDetails ?? {
|
|
196
|
+
reason: "submit",
|
|
197
|
+
event: event.nativeEvent ?? event,
|
|
198
|
+
trigger: event.nativeEvent?.submitter
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
})
|
|
203
|
+
});
|
|
55
204
|
});
|
|
56
|
-
|
|
205
|
+
const Form2 = withStaticProperties(FormComponent, { Trigger: FormTrigger });
|
|
206
|
+
|
|
207
|
+
export { Form2 as Form, FormContext, FormFrame, FormProvider, FormRegistryContext, FormTrigger, useFormContext, useFormRegistryContext };
|
|
57
208
|
//# sourceMappingURL=Form.mjs.map
|
package/dist/jsx/Form.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["View","createStyledContext","styled","composeEventHandlers","withStaticProperties","jsx","FORM_NAME","FormFrame","name","render","FormContext","onSubmit","useStyledContext","useFormContext","Provider","FormProvider","FormTriggerFrame","FormTrigger","styleable","props","forwardedRef","scope","children","onPress","triggerProps","context","role","ref","FormComponent","Form","e","preventDefault","Form2","Trigger"],"sources":["../../src/Form.tsx"],"sourcesContent":[null],"mappings":"AACA,SAASA,IAAA,EAAMC,mBAAA,EAAqBC,MAAA,QAAc;AAClD,SAASC,oBAAA,EAAsBC,oBAAA,QAA4B;AA+CrD,SAAAC,GAAA;AA7CN,MAAMC,SAAA,GAAY;AAEX,MAAMC,SAAA,GAAYL,MAAA,CAAOF,IAAA,EAAM;EACpCQ,IAAA,EAAMF,SAAA;EACNG,MAAA,EAAQ;AACV,CAAC;AAUM,MAAMC,WAAA,GAAcT,mBAAA,CAAsC;EAC/DU,QAAA,EAAU;AACZ,CAAqB;AAEd,MAAM;EAAEC,gBAAA,EAAkBC,cAAA;EAAgBC,QAAA,EAAUC;AAAa,IAAIL,WAAA;AAY5E,MAAMM,gBAAA,GAAmBd,MAAA,CAAOF,IAAA,EAAM;EACpCQ,IAAA,EAAM;AACR,CAAC;AAMM,MAAMS,WAAA,GAAcD,gBAAA,CAAiBE,SAAA,CAC1C,CAACC,KAAA,EAAOC,YAAA,KAAiB;EACvB,MAAM;IAAEC,KAAA;IAAOC,QAAA;IAAUC,OAAA;IAAS,GAAGC;EAAa,IAAIL,KAAA;EACtD,MAAMM,OAAA,GAAUZ,cAAA,CAAeQ,KAAK;EAEpC,OACE,eAAAhB,GAAA,CAACW,gBAAA;IACCU,IAAA,EAAK;IACJ,GAAGF,YAAA;IACJG,GAAA,EAAKP,YAAA;IACLG,OAAA,EAASpB,oBAAA,CAAqBoB,OAAA,EAASE,OAAA,CAAQd,QAAQ;IAEtDW;EAAA,CACH;AAEJ,CACF;AAMA,MAAMM,aAAA,GAAgBrB,SAAA,CAAUW,SAAA,CAA0B,SAASW,KACjE;EAAER,KAAA;EAAOV,QAAA;EAAU,GAAGQ;AAAM,GAC5BQ,GAAA,EACA;EACA,OACE,eAAAtB,GAAA,CAACU,YAAA;IAAaM,KAAA;IAAcV,QAAA;IAC1BW,QAAA,iBAAAjB,GAAA,CAACE,SAAA;MACCoB,GAAA;MACC,GAAIR,KAAA;MACLR,QAAA,EAAWmB,CAAA,IAAW;QACpBA,CAAA,CAAEC,cAAA,CAAe;QACjBpB,QAAA,GAAW;MACb;IAAA,CACF;EAAA,CACF;AAEJ,CAAC;AAEM,MAAMqB,KAAA,GAAO5B,oBAAA,CAAqBwB,aAAA,EAAe;EACtDK,OAAA,EAAShB;AACX,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Form.js","names":[],"sources":["jsx/Form.js"],"sourcesContent":["import { createStyledContext, createStyledHOC, isWeb, styled, View } from \"@tamagui/core\";\nimport { focusFocusable } from \"@tamagui/focusable\";\nimport { composeEventHandlers, withStaticProperties } from \"@tamagui/helpers\";\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nconst FORM_NAME = \"Form\";\nconst EMPTY_ERRORS = {};\nconst defaultSubmitAttemptedRef = { current: false };\nconst defaultFormElementRef = { current: null };\nconst FormRegistryContext = React.createContext({\n validationMode: \"onSubmit\",\n errors: EMPTY_ERRORS,\n formElementRef: defaultFormElementRef,\n submitAttemptedRef: defaultSubmitAttemptedRef,\n clearErrors: () => {\n },\n getValues: () => ({}),\n registerField: () => () => {\n }\n});\nconst useFormRegistryContext = () => React.useContext(FormRegistryContext);\nconst FormContext = createStyledContext({\n onSubmit: void 0\n});\nconst { useStyledContext: useFormContext, Provider: FormProvider } = FormContext;\nconst FormFrame = styled(View, {\n displayName: FORM_NAME,\n render: \"form\"\n});\nconst FormTriggerFrame = styled(View, {\n displayName: \"FormTrigger\"\n});\nconst FormTrigger = createStyledHOC(\n FormTriggerFrame,\n (props, forwardedRef) => {\n const { scope, children, onPress, ...triggerProps } = props;\n const context = useFormContext(scope);\n return /* @__PURE__ */ jsx(\n FormTriggerFrame,\n {\n role: \"button\",\n ...triggerProps,\n ref: forwardedRef,\n onPress: composeEventHandlers(onPress, context.onSubmit),\n children\n }\n );\n }\n);\nfunction hasError(errors, name) {\n if (!name || !Object.hasOwn(errors, name)) {\n return false;\n }\n const error = errors[name];\n return Array.isArray(error) ? error.length > 0 : Boolean(error);\n}\nconst FormComponent = createStyledHOC(\n FormFrame,\n function Form({\n scope,\n validationMode = \"onSubmit\",\n errors: externalErrors,\n actionsRef,\n onSubmit,\n ...props\n }, forwardedRef) {\n const registryRef = React.useRef(/* @__PURE__ */ new Map());\n const formElementRef = React.useRef(null);\n const submittedRef = React.useRef(false);\n const submitAttemptedRef = React.useRef(false);\n const pendingSubmitDetailsRef = React.useRef(null);\n const onSubmitRef = React.useRef(onSubmit);\n onSubmitRef.current = onSubmit;\n const [errors, setErrors] = React.useState(externalErrors ?? EMPTY_ERRORS);\n const errorsRef = React.useRef(errors);\n errorsRef.current = errors;\n React.useEffect(() => {\n const next = externalErrors ?? EMPTY_ERRORS;\n errorsRef.current = next;\n setErrors(next);\n }, [externalErrors]);\n const registerField = React.useCallback(\n (id, registration) => {\n registryRef.current.set(id, registration);\n return () => {\n if (registryRef.current.get(id) === registration) {\n registryRef.current.delete(id);\n }\n };\n },\n []\n );\n const getValues = React.useCallback(() => {\n const values = {};\n for (const field of registryRef.current.values()) {\n if (field.name) {\n values[field.name] = field.getValue();\n }\n }\n return values;\n }, []);\n const clearErrors = React.useCallback((name) => {\n if (!name || !hasError(errorsRef.current, name)) {\n return;\n }\n const next = { ...errorsRef.current };\n delete next[name];\n errorsRef.current = next;\n setErrors(next);\n }, []);\n const focusFirstInvalid = React.useCallback(() => {\n let hasInvalid = false;\n for (const field of registryRef.current.values()) {\n if (!hasError(errorsRef.current, field.name) && field.validityData.state.valid !== false) {\n continue;\n }\n hasInvalid = true;\n const control = field.controlRef.current;\n if (isWeb && control?.focus) {\n control.focus();\n if (control.tagName === \"INPUT\" || control.tagName === \"TEXTAREA\") {\n control.select?.();\n }\n return true;\n }\n if (!isWeb && field.controlId) {\n focusFocusable(field.controlId);\n return true;\n }\n if (control?.focus) {\n control.focus();\n return true;\n }\n }\n return hasInvalid;\n }, []);\n const performSubmit = React.useCallback(\n (details) => {\n submitAttemptedRef.current = true;\n for (const field of registryRef.current.values()) {\n field.validate();\n }\n if (focusFirstInvalid()) {\n return;\n }\n submittedRef.current = true;\n void onSubmitRef.current?.(getValues(), details);\n },\n [focusFirstInvalid, getValues]\n );\n const requestSubmit = React.useCallback(\n (event) => {\n event?.preventDefault?.();\n const details = {\n reason: \"trigger-press\",\n event: event?.nativeEvent ?? event,\n trigger: event?.currentTarget\n };\n if (isWeb && formElementRef.current?.requestSubmit) {\n pendingSubmitDetailsRef.current = details;\n formElementRef.current.requestSubmit();\n return;\n }\n performSubmit(details);\n },\n [performSubmit]\n );\n React.useEffect(() => {\n if (!submittedRef.current) {\n return;\n }\n submittedRef.current = false;\n focusFirstInvalid();\n }, [errors, focusFirstInvalid]);\n React.useImperativeHandle(\n actionsRef,\n () => ({\n validate(fieldName) {\n if (fieldName) {\n for (const field of registryRef.current.values()) {\n if (field.name === fieldName) {\n field.validate();\n return;\n }\n }\n return;\n }\n for (const field of registryRef.current.values()) {\n field.validate();\n }\n }\n }),\n []\n );\n const registryContext = React.useMemo(\n () => ({\n validationMode,\n errors,\n formElementRef,\n submitAttemptedRef,\n clearErrors,\n getValues,\n registerField\n }),\n [clearErrors, errors, getValues, registerField, validationMode]\n );\n return /* @__PURE__ */ jsx(FormRegistryContext.Provider, { value: registryContext, children: /* @__PURE__ */ jsx(FormProvider, { scope, onSubmit: requestSubmit, children: /* @__PURE__ */ jsx(\n FormFrame,\n {\n ...props,\n ref: (element) => {\n formElementRef.current = element;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(element);\n } else if (forwardedRef) {\n forwardedRef.current = element;\n }\n },\n noValidate: true,\n onSubmit: (event) => {\n event.preventDefault();\n const pendingDetails = pendingSubmitDetailsRef.current;\n pendingSubmitDetailsRef.current = null;\n performSubmit(\n pendingDetails ?? {\n reason: \"submit\",\n event: event.nativeEvent ?? event,\n trigger: event.nativeEvent?.submitter\n }\n );\n }\n }\n ) }) });\n }\n);\nconst Form2 = withStaticProperties(FormComponent, {\n Trigger: FormTrigger\n});\nexport {\n Form2 as Form,\n FormContext,\n FormFrame,\n FormProvider,\n FormRegistryContext,\n FormTrigger,\n useFormContext,\n useFormRegistryContext\n};\n//# sourceMappingURL=Form.js.map\n"],"mappings":";;;;;;;AAKA,MAAM,YAAY;AAClB,MAAM,eAAe,CAAC;AACtB,MAAM,4BAA4B,EAAE,SAAS,MAAM;AACnD,MAAM,wBAAwB,EAAE,SAAS,KAAK;AAC9C,MAAM,sBAAsB,MAAM,cAAc;CAC9C,gBAAgB;CAChB,QAAQ;CACR,gBAAgB;CAChB,oBAAoB;CACpB,mBAAmB,CACnB;CACA,kBAAkB,CAAC;CACnB,2BAA2B,CAC3B;AACF,CAAC;AACD,MAAM,+BAA+B,MAAM,WAAW,mBAAmB;AACzE,MAAM,cAAc,oBAAoB,EACtC,UAAU,KAAK,EACjB,CAAC;AACD,MAAM,EAAE,kBAAkB,gBAAgB,UAAU,iBAAiB;AACrE,MAAM,YAAY,OAAO,MAAM;CAC7B,aAAa;CACb,QAAQ;AACV,CAAC;AACD,MAAM,mBAAmB,OAAO,MAAM,EACpC,aAAa,cACf,CAAC;AACD,MAAM,cAAc,gBAClB,mBACC,OAAO,iBAAiB;CACvB,MAAM,EAAE,OAAO,UAAU,SAAS,GAAG,iBAAiB;CACtD,MAAM,UAAU,eAAe,KAAK;CACpC,OAAuB,oBACrB,kBACA;EACE,MAAM;EACN,GAAG;EACH,KAAK;EACL,SAAS,qBAAqB,SAAS,QAAQ,QAAQ;EACvD;CACF,CACF;AACF,CACF;AACA,SAAS,SAAS,QAAQ,MAAM;CAC9B,IAAI,CAAC,QAAQ,CAAC,OAAO,OAAO,QAAQ,IAAI,GAAG;EACzC,OAAO;CACT;CACA,MAAM,QAAQ,OAAO;CACrB,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,IAAI,QAAQ,KAAK;AAChE;AACA,MAAM,gBAAgB,gBACpB,WACA,SAAS,KAAK,EACZ,OACA,iBAAiB,YACjB,QAAQ,gBACR,YACA,UACA,GAAG,SACF,cAAc;CACf,MAAM,cAAc,MAAM,uBAAuB,IAAI,IAAI,CAAC;CAC1D,MAAM,iBAAiB,MAAM,OAAO,IAAI;CACxC,MAAM,eAAe,MAAM,OAAO,KAAK;CACvC,MAAM,qBAAqB,MAAM,OAAO,KAAK;CAC7C,MAAM,0BAA0B,MAAM,OAAO,IAAI;CACjD,MAAM,cAAc,MAAM,OAAO,QAAQ;CACzC,YAAY,UAAU;CACtB,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,kBAAkB,YAAY;CACzE,MAAM,YAAY,MAAM,OAAO,MAAM;CACrC,UAAU,UAAU;CACpB,MAAM,gBAAgB;EACpB,MAAM,OAAO,kBAAkB;EAC/B,UAAU,UAAU;EACpB,UAAU,IAAI;CAChB,GAAG,CAAC,cAAc,CAAC;CACnB,MAAM,gBAAgB,MAAM,aACzB,IAAI,iBAAiB;EACpB,YAAY,QAAQ,IAAI,IAAI,YAAY;EACxC,aAAa;GACX,IAAI,YAAY,QAAQ,IAAI,EAAE,MAAM,cAAc;IAChD,YAAY,QAAQ,OAAO,EAAE;GAC/B;EACF;CACF,GACA,CAAC,CACH;CACA,MAAM,YAAY,MAAM,kBAAkB;EACxC,MAAM,SAAS,CAAC;EAChB,KAAK,MAAM,SAAS,YAAY,QAAQ,OAAO,GAAG;GAChD,IAAI,MAAM,MAAM;IACd,OAAO,MAAM,QAAQ,MAAM,SAAS;GACtC;EACF;EACA,OAAO;CACT,GAAG,CAAC,CAAC;CACL,MAAM,cAAc,MAAM,aAAa,SAAS;EAC9C,IAAI,CAAC,QAAQ,CAAC,SAAS,UAAU,SAAS,IAAI,GAAG;GAC/C;EACF;EACA,MAAM,OAAO,EAAE,GAAG,UAAU,QAAQ;EACpC,OAAO,KAAK;EACZ,UAAU,UAAU;EACpB,UAAU,IAAI;CAChB,GAAG,CAAC,CAAC;CACL,MAAM,oBAAoB,MAAM,kBAAkB;EAChD,IAAI,aAAa;EACjB,KAAK,MAAM,SAAS,YAAY,QAAQ,OAAO,GAAG;GAChD,IAAI,CAAC,SAAS,UAAU,SAAS,MAAM,IAAI,KAAK,MAAM,aAAa,MAAM,UAAU,OAAO;IACxF;GACF;GACA,aAAa;GACb,MAAM,UAAU,MAAM,WAAW;GACjC,IAAI,SAAS,SAAS,OAAO;IAC3B,QAAQ,MAAM;IACd,IAAI,QAAQ,YAAY,WAAW,QAAQ,YAAY,YAAY;KACjE,QAAQ,SAAS;IACnB;IACA,OAAO;GACT;GACA,IAAI,CAAC,SAAS,MAAM,WAAW;IAC7B,eAAe,MAAM,SAAS;IAC9B,OAAO;GACT;GACA,IAAI,SAAS,OAAO;IAClB,QAAQ,MAAM;IACd,OAAO;GACT;EACF;EACA,OAAO;CACT,GAAG,CAAC,CAAC;CACL,MAAM,gBAAgB,MAAM,aACzB,YAAY;EACX,mBAAmB,UAAU;EAC7B,KAAK,MAAM,SAAS,YAAY,QAAQ,OAAO,GAAG;GAChD,MAAM,SAAS;EACjB;EACA,IAAI,kBAAkB,GAAG;GACvB;EACF;EACA,aAAa,UAAU;EACvB,KAAK,YAAY,UAAU,UAAU,GAAG,OAAO;CACjD,GACA,CAAC,mBAAmB,SAAS,CAC/B;CACA,MAAM,gBAAgB,MAAM,aACzB,UAAU;EACT,OAAO,iBAAiB;EACxB,MAAM,UAAU;GACd,QAAQ;GACR,OAAO,OAAO,eAAe;GAC7B,SAAS,OAAO;EAClB;EACA,IAAI,SAAS,eAAe,SAAS,eAAe;GAClD,wBAAwB,UAAU;GAClC,eAAe,QAAQ,cAAc;GACrC;EACF;EACA,cAAc,OAAO;CACvB,GACA,CAAC,aAAa,CAChB;CACA,MAAM,gBAAgB;EACpB,IAAI,CAAC,aAAa,SAAS;GACzB;EACF;EACA,aAAa,UAAU;EACvB,kBAAkB;CACpB,GAAG,CAAC,QAAQ,iBAAiB,CAAC;CAC9B,MAAM,oBACJ,mBACO,EACL,SAAS,WAAW;EAClB,IAAI,WAAW;GACb,KAAK,MAAM,SAAS,YAAY,QAAQ,OAAO,GAAG;IAChD,IAAI,MAAM,SAAS,WAAW;KAC5B,MAAM,SAAS;KACf;IACF;GACF;GACA;EACF;EACA,KAAK,MAAM,SAAS,YAAY,QAAQ,OAAO,GAAG;GAChD,MAAM,SAAS;EACjB;CACF,EACF,IACA,CAAC,CACH;CACA,MAAM,kBAAkB,MAAM,eACrB;EACL;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA;EAAC;EAAa;EAAQ;EAAW;EAAe;CAAc,CAChE;CACA,OAAuB,oBAAI,oBAAoB,UAAU;EAAE,OAAO;EAAiB,UAA0B,oBAAI,cAAc;GAAE;GAAO,UAAU;GAAe,UAA0B,oBACzL,WACA;IACE,GAAG;IACH,MAAM,YAAY;KAChB,eAAe,UAAU;KACzB,IAAI,OAAO,iBAAiB,YAAY;MACtC,aAAa,OAAO;KACtB,OAAO,IAAI,cAAc;MACvB,aAAa,UAAU;KACzB;IACF;IACA,YAAY;IACZ,WAAW,UAAU;KACnB,MAAM,eAAe;KACrB,MAAM,iBAAiB,wBAAwB;KAC/C,wBAAwB,UAAU;KAClC,cACE,kBAAkB;MAChB,QAAQ;MACR,OAAO,MAAM,eAAe;MAC5B,SAAS,MAAM,aAAa;KAC9B,CACF;IACF;GACF,CACF;EAAE,CAAC;CAAE,CAAC;AACR,CACF;AACA,MAAM,QAAQ,qBAAqB,eAAe,EAChD,SAAS,YACX,CAAC"}
|