@letar/forms 1.1.0 → 1.2.0
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/CHANGELOG.md +308 -0
- package/README.md +9 -9
- package/README.ru.md +115 -30
- package/analytics.js +3 -0
- package/analytics.js.map +1 -0
- package/chunk-2PSXYC3I.js +1782 -0
- package/chunk-2PSXYC3I.js.map +1 -0
- package/chunk-5D6S6EGF.js +206 -0
- package/chunk-5D6S6EGF.js.map +1 -0
- package/{chunk-6QOPSQ3Z.js → chunk-6E7VJAJT.js} +3 -3
- package/{chunk-6QOPSQ3Z.js.map → chunk-6E7VJAJT.js.map} +1 -1
- package/chunk-CGXKRCSM.js +117 -0
- package/chunk-CGXKRCSM.js.map +1 -0
- package/{chunk-M2PNAAIR.js → chunk-DQUVUMCX.js} +30 -19
- package/chunk-DQUVUMCX.js.map +1 -0
- package/chunk-K3J4L26K.js +345 -0
- package/chunk-K3J4L26K.js.map +1 -0
- package/{chunk-PJETA6YN.js → chunk-MAYUFA5K.js} +5 -4
- package/chunk-MAYUFA5K.js.map +1 -0
- package/{chunk-4V6WBJ76.js → chunk-MVGXZNHP.js} +2 -2
- package/{chunk-4V6WBJ76.js.map → chunk-MVGXZNHP.js.map} +1 -1
- package/{chunk-XKKJKYWZ.js → chunk-MZDTJSF7.js} +3 -3
- package/{chunk-XKKJKYWZ.js.map → chunk-MZDTJSF7.js.map} +1 -1
- package/{chunk-KUNT5MSU.js → chunk-Q5EOF36Y.js} +3 -3
- package/chunk-Q5EOF36Y.js.map +1 -0
- package/{chunk-7FEQFDJ7.js → chunk-R2RTCKXY.js} +2 -2
- package/{chunk-7FEQFDJ7.js.map → chunk-R2RTCKXY.js.map} +1 -1
- package/{chunk-HWVOFWAT.js → chunk-XFWLD5EO.js} +225 -26
- package/chunk-XFWLD5EO.js.map +1 -0
- package/fields/boolean.js +3 -3
- package/fields/datetime.js +3 -3
- package/fields/number.js +3 -3
- package/fields/selection.js +3 -3
- package/fields/specialized.js +3 -3
- package/fields/text.js +3 -3
- package/hcaptcha-U4XIT3HS.js +64 -0
- package/hcaptcha-U4XIT3HS.js.map +1 -0
- package/i18n.js +1 -1
- package/index.js +3268 -51
- package/index.js.map +1 -1
- package/offline.js +1 -1
- package/package.json +33 -4
- package/recaptcha-PKAUAY2S.js +56 -0
- package/recaptcha-PKAUAY2S.js.map +1 -0
- package/server-errors.js +3 -0
- package/server-errors.js.map +1 -0
- package/turnstile-7FXTBSLW.js +36 -0
- package/turnstile-7FXTBSLW.js.map +1 -0
- package/validators/ru.js +73 -0
- package/validators/ru.js.map +1 -0
- package/chunk-GOELIS6T.js +0 -849
- package/chunk-GOELIS6T.js.map +0 -1
- package/chunk-HWVOFWAT.js.map +0 -1
- package/chunk-KUNT5MSU.js.map +0 -1
- package/chunk-M2PNAAIR.js.map +0 -1
- package/chunk-PJETA6YN.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useFormI18n, getLocalizedValue, useLocalizedOptions } from './chunk-
|
|
2
|
-
import { createContext, memo, useContext, useState, useEffect, useMemo, Component } from 'react';
|
|
1
|
+
import { useFormI18n, getLocalizedValue, useLocalizedOptions } from './chunk-R2RTCKXY.js';
|
|
2
|
+
import { createContext, memo, useContext, useState, useEffect, useMemo, useRef, useCallback, Component } from 'react';
|
|
3
3
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
import { Field, HStack, Tooltip, Circle, Portal, VStack, Text, Box, createListCollection } from '@chakra-ui/react';
|
|
5
5
|
import { LuCircleHelp } from 'react-icons/lu';
|
|
@@ -508,6 +508,93 @@ function getFieldErrors(field) {
|
|
|
508
508
|
const errorMessage = hasError ? formatFieldErrors(errors) : "";
|
|
509
509
|
return { errors, hasError, errorMessage };
|
|
510
510
|
}
|
|
511
|
+
function getAsyncValidateFromSchema(schema, fieldPath) {
|
|
512
|
+
if (!schema) return void 0;
|
|
513
|
+
try {
|
|
514
|
+
const unwrapped = unwrapSchema(schema);
|
|
515
|
+
if (!unwrapped?._zod?.def?.shape) return void 0;
|
|
516
|
+
const parts = fieldPath.split(".");
|
|
517
|
+
let current = unwrapped._zod.def.shape;
|
|
518
|
+
for (const part of parts) {
|
|
519
|
+
if (/^\d+$/.test(part)) continue;
|
|
520
|
+
const fieldSchema = current[part];
|
|
521
|
+
if (!fieldSchema) return void 0;
|
|
522
|
+
const fieldUnwrapped = unwrapSchema(fieldSchema);
|
|
523
|
+
const fieldType = fieldUnwrapped?._zod?.def?.type;
|
|
524
|
+
if (fieldType === "object" && fieldUnwrapped._zod.def.shape) {
|
|
525
|
+
current = fieldUnwrapped._zod.def.shape;
|
|
526
|
+
continue;
|
|
527
|
+
}
|
|
528
|
+
if (fieldType === "array" && fieldUnwrapped._zod.def.element) {
|
|
529
|
+
const elementUnwrapped = unwrapSchema(fieldUnwrapped._zod.def.element);
|
|
530
|
+
if (elementUnwrapped?._zod?.def?.shape) {
|
|
531
|
+
current = elementUnwrapped._zod.def.shape;
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (fieldSchema?.meta) {
|
|
536
|
+
const meta = fieldSchema.meta();
|
|
537
|
+
if (meta?.asyncValidate && typeof meta.asyncValidate === "function") {
|
|
538
|
+
return {
|
|
539
|
+
asyncValidate: meta.asyncValidate,
|
|
540
|
+
asyncDebounce: meta.asyncDebounce,
|
|
541
|
+
asyncTrigger: meta.asyncTrigger
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
return void 0;
|
|
546
|
+
}
|
|
547
|
+
} catch {
|
|
548
|
+
return void 0;
|
|
549
|
+
}
|
|
550
|
+
return void 0;
|
|
551
|
+
}
|
|
552
|
+
function useAsyncFieldValidation(schema, fieldPath, propsConfig) {
|
|
553
|
+
const abortRef = useRef(null);
|
|
554
|
+
const cacheRef = useRef(/* @__PURE__ */ new Map());
|
|
555
|
+
const schemaConfig = useMemo(
|
|
556
|
+
() => getAsyncValidateFromSchema(schema, fieldPath),
|
|
557
|
+
[schema, fieldPath]
|
|
558
|
+
);
|
|
559
|
+
const asyncFn = propsConfig?.asyncValidate ?? schemaConfig?.asyncValidate;
|
|
560
|
+
const debounce = propsConfig?.asyncDebounce ?? schemaConfig?.asyncDebounce ?? 500;
|
|
561
|
+
const trigger = propsConfig?.asyncTrigger ?? schemaConfig?.asyncTrigger ?? "onBlur";
|
|
562
|
+
const wrappedAsyncFn = useCallback(
|
|
563
|
+
async ({ value }) => {
|
|
564
|
+
if (!asyncFn) return void 0;
|
|
565
|
+
if (typeof navigator !== "undefined" && !navigator.onLine) return void 0;
|
|
566
|
+
const cacheKey = String(value);
|
|
567
|
+
if (cacheRef.current.has(cacheKey)) {
|
|
568
|
+
return cacheRef.current.get(cacheKey);
|
|
569
|
+
}
|
|
570
|
+
abortRef.current?.abort();
|
|
571
|
+
const controller = new AbortController();
|
|
572
|
+
abortRef.current = controller;
|
|
573
|
+
try {
|
|
574
|
+
const result = await asyncFn(value);
|
|
575
|
+
if (controller.signal.aborted) return void 0;
|
|
576
|
+
cacheRef.current.set(cacheKey, result);
|
|
577
|
+
return result;
|
|
578
|
+
} catch (err) {
|
|
579
|
+
if (err instanceof DOMException && err.name === "AbortError") return void 0;
|
|
580
|
+
return void 0;
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
[asyncFn]
|
|
584
|
+
);
|
|
585
|
+
const validators = useMemo(() => {
|
|
586
|
+
if (!asyncFn) return void 0;
|
|
587
|
+
if (trigger === "onChange") {
|
|
588
|
+
return { onChangeAsync: wrappedAsyncFn };
|
|
589
|
+
}
|
|
590
|
+
return { onBlurAsync: wrappedAsyncFn };
|
|
591
|
+
}, [asyncFn, trigger, wrappedAsyncFn]);
|
|
592
|
+
return {
|
|
593
|
+
validators,
|
|
594
|
+
asyncDebounceMs: asyncFn ? debounce : void 0,
|
|
595
|
+
hasAsyncValidation: !!asyncFn
|
|
596
|
+
};
|
|
597
|
+
}
|
|
511
598
|
|
|
512
599
|
// src/lib/declarative/constraint-hints.ts
|
|
513
600
|
var EN_TRANSLATIONS = {
|
|
@@ -681,6 +768,73 @@ function generateArrayHint(constraints, locale, t) {
|
|
|
681
768
|
return void 0;
|
|
682
769
|
}
|
|
683
770
|
|
|
771
|
+
// src/lib/declarative/form-fields/base/autocomplete-map.ts
|
|
772
|
+
var AUTOCOMPLETE_MAP = {
|
|
773
|
+
// Идентификация
|
|
774
|
+
email: "email",
|
|
775
|
+
"e-mail": "email",
|
|
776
|
+
username: "username",
|
|
777
|
+
// Имя
|
|
778
|
+
name: "name",
|
|
779
|
+
fullName: "name",
|
|
780
|
+
full_name: "name",
|
|
781
|
+
firstName: "given-name",
|
|
782
|
+
first_name: "given-name",
|
|
783
|
+
lastName: "family-name",
|
|
784
|
+
last_name: "family-name",
|
|
785
|
+
surname: "family-name",
|
|
786
|
+
middleName: "additional-name",
|
|
787
|
+
middle_name: "additional-name",
|
|
788
|
+
patronymic: "additional-name",
|
|
789
|
+
// Телефон
|
|
790
|
+
phone: "tel",
|
|
791
|
+
tel: "tel",
|
|
792
|
+
mobile: "tel",
|
|
793
|
+
telephone: "tel",
|
|
794
|
+
// Пароль
|
|
795
|
+
password: "current-password",
|
|
796
|
+
newPassword: "new-password",
|
|
797
|
+
new_password: "new-password",
|
|
798
|
+
confirmPassword: "new-password",
|
|
799
|
+
confirm_password: "new-password",
|
|
800
|
+
// Адрес
|
|
801
|
+
address: "street-address",
|
|
802
|
+
street: "street-address",
|
|
803
|
+
city: "address-level2",
|
|
804
|
+
state: "address-level1",
|
|
805
|
+
region: "address-level1",
|
|
806
|
+
zip: "postal-code",
|
|
807
|
+
postal: "postal-code",
|
|
808
|
+
postalCode: "postal-code",
|
|
809
|
+
postal_code: "postal-code",
|
|
810
|
+
zipCode: "postal-code",
|
|
811
|
+
zip_code: "postal-code",
|
|
812
|
+
country: "country-name",
|
|
813
|
+
// Организация
|
|
814
|
+
company: "organization",
|
|
815
|
+
organization: "organization",
|
|
816
|
+
companyName: "organization",
|
|
817
|
+
company_name: "organization",
|
|
818
|
+
jobTitle: "organization-title",
|
|
819
|
+
job_title: "organization-title",
|
|
820
|
+
// Платёжные данные
|
|
821
|
+
cardNumber: "cc-number",
|
|
822
|
+
card_number: "cc-number",
|
|
823
|
+
cardName: "cc-name",
|
|
824
|
+
card_name: "cc-name",
|
|
825
|
+
expiry: "cc-exp",
|
|
826
|
+
cvv: "cc-csc",
|
|
827
|
+
cvc: "cc-csc"
|
|
828
|
+
};
|
|
829
|
+
function resolveAutoComplete(fieldName, metaAutocomplete, propAutocomplete) {
|
|
830
|
+
if (metaAutocomplete !== void 0) {
|
|
831
|
+
return metaAutocomplete;
|
|
832
|
+
}
|
|
833
|
+
const lastSegment = fieldName.split(".").pop() ?? fieldName;
|
|
834
|
+
const cleanName = lastSegment.replace(/\[\d+\]/g, "");
|
|
835
|
+
return AUTOCOMPLETE_MAP[cleanName];
|
|
836
|
+
}
|
|
837
|
+
|
|
684
838
|
// src/lib/declarative/form-fields/base/use-resolved-field-props.ts
|
|
685
839
|
function useResolvedFieldProps(name, props) {
|
|
686
840
|
const {
|
|
@@ -717,14 +871,29 @@ function useResolvedFieldProps(name, props) {
|
|
|
717
871
|
// Constraints for additional component configuration
|
|
718
872
|
constraints,
|
|
719
873
|
// Options with i18n translations
|
|
720
|
-
options: localizedOptions
|
|
874
|
+
options: localizedOptions,
|
|
875
|
+
// HTML autocomplete (авто-определение по имени + meta override)
|
|
876
|
+
autocomplete: resolveAutoComplete(fullPath, meta?.autocomplete)
|
|
721
877
|
};
|
|
722
878
|
}
|
|
723
879
|
function createField(options) {
|
|
724
880
|
const { displayName, render } = options;
|
|
725
881
|
const useFieldState = options.useFieldState ?? (() => ({}));
|
|
726
882
|
function FieldComponent(props) {
|
|
727
|
-
const {
|
|
883
|
+
const {
|
|
884
|
+
name,
|
|
885
|
+
label,
|
|
886
|
+
placeholder,
|
|
887
|
+
helperText,
|
|
888
|
+
required,
|
|
889
|
+
disabled,
|
|
890
|
+
readOnly,
|
|
891
|
+
tooltip,
|
|
892
|
+
asyncValidate,
|
|
893
|
+
asyncDebounce,
|
|
894
|
+
asyncTrigger,
|
|
895
|
+
...componentProps
|
|
896
|
+
} = props;
|
|
728
897
|
const { form, fullPath, ...resolvedRest } = useResolvedFieldProps(name, {
|
|
729
898
|
label,
|
|
730
899
|
placeholder,
|
|
@@ -743,25 +912,42 @@ function createField(options) {
|
|
|
743
912
|
disabled: resolvedRest.disabled,
|
|
744
913
|
readOnly: resolvedRest.readOnly,
|
|
745
914
|
constraints: resolvedRest.constraints,
|
|
746
|
-
options: resolvedRest.options
|
|
915
|
+
options: resolvedRest.options,
|
|
916
|
+
autocomplete: resolvedRest.autocomplete
|
|
747
917
|
};
|
|
748
918
|
const fieldState = useFieldState(componentProps, resolved);
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
919
|
+
const declarativeCtx = useDeclarativeFormOptional();
|
|
920
|
+
const asyncValidation = useAsyncFieldValidation(
|
|
921
|
+
declarativeCtx?.schema,
|
|
922
|
+
fullPath,
|
|
923
|
+
asyncValidate ? { asyncValidate, asyncDebounce, asyncTrigger } : void 0
|
|
924
|
+
);
|
|
925
|
+
return /* @__PURE__ */ jsx(FieldErrorBoundary, { fieldName: fullPath, children: /* @__PURE__ */ jsx(
|
|
926
|
+
form.Field,
|
|
927
|
+
{
|
|
928
|
+
name: fullPath,
|
|
929
|
+
...asyncValidation.validators ? { validators: asyncValidation.validators } : {},
|
|
930
|
+
...asyncValidation.asyncDebounceMs ? { asyncDebounceMs: asyncValidation.asyncDebounceMs } : {},
|
|
931
|
+
children: (field) => {
|
|
932
|
+
const errors = field.state.meta.errors;
|
|
933
|
+
const isTouched = field.state.meta.isTouched;
|
|
934
|
+
const hasError = isTouched && hasFieldErrors(errors);
|
|
935
|
+
const errorMessage = hasError ? formatFieldErrors(errors) : "";
|
|
936
|
+
const isValidating = !!field.state.meta.isValidating;
|
|
937
|
+
return render({
|
|
938
|
+
field,
|
|
939
|
+
value: field.state.value,
|
|
940
|
+
fullPath,
|
|
941
|
+
resolved,
|
|
942
|
+
hasError,
|
|
943
|
+
errorMessage,
|
|
944
|
+
isValidating,
|
|
945
|
+
fieldState,
|
|
946
|
+
componentProps
|
|
947
|
+
});
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
) });
|
|
765
951
|
}
|
|
766
952
|
FieldComponent.displayName = displayName;
|
|
767
953
|
return FieldComponent;
|
|
@@ -769,8 +955,12 @@ function createField(options) {
|
|
|
769
955
|
function FieldError({
|
|
770
956
|
hasError,
|
|
771
957
|
errorMessage,
|
|
772
|
-
helperText
|
|
958
|
+
helperText,
|
|
959
|
+
isValidating
|
|
773
960
|
}) {
|
|
961
|
+
if (isValidating) {
|
|
962
|
+
return /* @__PURE__ */ jsx(Field.HelperText, { color: "blue.500", children: "\u27F3 \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u044E..." });
|
|
963
|
+
}
|
|
774
964
|
if (hasError) {
|
|
775
965
|
return /* @__PURE__ */ jsx(Field.ErrorText, { children: errorMessage });
|
|
776
966
|
}
|
|
@@ -783,6 +973,7 @@ var FieldWrapper = memo(function FieldWrapper2({
|
|
|
783
973
|
resolved,
|
|
784
974
|
hasError,
|
|
785
975
|
errorMessage,
|
|
976
|
+
isValidating,
|
|
786
977
|
children
|
|
787
978
|
}) {
|
|
788
979
|
return /* @__PURE__ */ jsxs(
|
|
@@ -795,7 +986,15 @@ var FieldWrapper = memo(function FieldWrapper2({
|
|
|
795
986
|
children: [
|
|
796
987
|
/* @__PURE__ */ jsx(FieldLabel, { label: resolved.label, tooltip: resolved.tooltip, required: resolved.required }),
|
|
797
988
|
children,
|
|
798
|
-
/* @__PURE__ */ jsx(
|
|
989
|
+
/* @__PURE__ */ jsx(
|
|
990
|
+
FieldError,
|
|
991
|
+
{
|
|
992
|
+
hasError,
|
|
993
|
+
errorMessage,
|
|
994
|
+
helperText: resolved.helperText,
|
|
995
|
+
isValidating
|
|
996
|
+
}
|
|
997
|
+
)
|
|
799
998
|
]
|
|
800
999
|
}
|
|
801
1000
|
);
|
|
@@ -841,6 +1040,6 @@ function useGroupedOptions(options) {
|
|
|
841
1040
|
return { collection, groups };
|
|
842
1041
|
}
|
|
843
1042
|
|
|
844
|
-
export { DeclarativeFormContext, FieldError, FieldLabel, FieldTooltip, FieldWrapper, FormGroup, SelectionFieldLabel, createField, getFieldErrors, getOptionLabel, getZodConstraints, unwrapSchema, useAsyncSearch, useDebounce, useDeclarativeField, useDeclarativeForm, useDeclarativeFormOptional, useFormGroup, useGroupedOptions, useResolvedFieldProps };
|
|
845
|
-
//# sourceMappingURL=chunk-
|
|
846
|
-
//# sourceMappingURL=chunk-
|
|
1043
|
+
export { DeclarativeFormContext, FieldError, FieldLabel, FieldTooltip, FieldWrapper, FormGroup, SelectionFieldLabel, createField, formatFieldErrors, getFieldErrors, getOptionLabel, getZodConstraints, hasFieldErrors, unwrapSchema, useAsyncSearch, useDebounce, useDeclarativeField, useDeclarativeForm, useDeclarativeFormOptional, useFormGroup, useGroupedOptions, useResolvedFieldProps };
|
|
1044
|
+
//# sourceMappingURL=chunk-XFWLD5EO.js.map
|
|
1045
|
+
//# sourceMappingURL=chunk-XFWLD5EO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/form-group.tsx","../src/lib/declarative/form-context.tsx","../src/lib/declarative/form-fields/base/field-tooltip.tsx","../src/lib/declarative/form-fields/base/field-label.tsx","../src/lib/declarative/zod-utils.ts","../src/lib/declarative/schema-constraints.ts","../src/lib/declarative/schema-meta.ts","../src/lib/declarative/form-fields/base/base-field.tsx","../src/lib/declarative/form-fields/base/use-debounce.ts","../src/lib/declarative/form-fields/base/use-async-search.ts","../src/lib/declarative/form-fields/base/field-error-boundary.tsx","../src/lib/declarative/form-fields/base/field-utils.ts","../src/lib/declarative/form-fields/base/use-async-field-validation.ts","../src/lib/declarative/constraint-hints.ts","../src/lib/declarative/form-fields/base/autocomplete-map.ts","../src/lib/declarative/form-fields/base/use-resolved-field-props.ts","../src/lib/declarative/form-fields/base/create-field.tsx","../src/lib/declarative/form-fields/base/field-wrapper.tsx","../src/lib/declarative/form-fields/base/selection-field-label.tsx","../src/lib/declarative/form-fields/base/use-grouped-options.ts"],"names":["createContext","useContext","ChakraTooltip","jsx","jsxs","getSchemaAtPath","useState","Box","Text","Field","FieldWrapper","HStack","useMemo"],"mappings":"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","file":"chunk-XFWLD5EO.js","sourcesContent":["'use client'\n\nimport { createContext, type ReactNode, useContext } from 'react'\n\n/**\n * Context value providing form field naming information\n */\nexport interface FormGroupContextValue {\n /** Original name prop passed to this FormGroup */\n originalName: string\n /** Full dotted path including all parent FormGroup names */\n name: string\n}\n\nconst FormGroupContext = createContext<FormGroupContextValue | null>(null)\n\nexport interface FormGroupProps {\n /** Field name for this group. Will be concatenated with parent names using dot notation */\n name: string\n children: ReactNode\n}\n\n/**\n * FormGroup component for building nested form field names\n *\n * @example\n * ```tsx\n * <FormGroup name=\"user\">\n * <FormGroup name=\"address\">\n * <FormGroup name=\"street\">\n * // useFormGroup() returns { originalName: 'street', name: 'user.address.street' }\n * </FormGroup>\n * </FormGroup>\n * </FormGroup>\n * ```\n */\nexport function FormGroup({ name, children }: FormGroupProps) {\n const parentContext = useContext(FormGroupContext)\n\n const contextValue: FormGroupContextValue = {\n originalName: name,\n name: parentContext ? `${parentContext.name}.${name}` : name,\n }\n\n return <FormGroupContext.Provider value={contextValue}>{children}</FormGroupContext.Provider>\n}\n\n/**\n * Hook to access current FormGroup context\n *\n * @returns FormGroup context value with originalName and full dotted path name,\n * or null if not inside a FormGroup\n *\n * @example\n * ```tsx\n * function MyField() {\n * const formGroup = useFormGroup();\n * const fieldName = formGroup?.name || 'defaultName';\n * return <input name={fieldName} />;\n * }\n * ```\n */\nexport function useFormGroup(): FormGroupContextValue | null {\n return useContext(FormGroupContext)\n}\n","'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { DeclarativeFormContextValue } from './types'\n\n/**\n * Context for declarative form API\n * Provides access to form instance and primitive array index\n */\nexport const DeclarativeFormContext = createContext<DeclarativeFormContextValue | null>(null)\n\n/**\n * Hook to access declarative form context\n * @throws Error if used outside of Form component\n */\nexport function useDeclarativeForm(): DeclarativeFormContextValue {\n const context = useContext(DeclarativeFormContext)\n if (!context) {\n throw new Error('useDeclarativeForm must be used inside a Form component')\n }\n return context\n}\n\n/**\n * Hook to access declarative form context (nullable)\n * @returns Context or null if outside Form\n */\nexport function useDeclarativeFormOptional(): DeclarativeFormContextValue | null {\n return useContext(DeclarativeFormContext)\n}\n","'use client'\n\nimport { Box, Tooltip as ChakraTooltip, Circle, Portal, Text, VStack } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { LuCircleHelp } from 'react-icons/lu'\nimport type { FieldTooltipMeta } from '../../types'\n\nexport type FieldTooltipProps = FieldTooltipMeta\n\n/**\n * Tooltip component for form fields.\n * Shows a \"?\" icon with a popup hint on hover.\n *\n * @example\n * ```tsx\n * <FieldTooltip\n * description=\"Specify the brand of your training car\"\n * example=\"Hyundai, Kia, Volkswagen\"\n * impact=\"Students often search for instructor by car brand\"\n * />\n * ```\n */\nexport function FieldTooltip({ title, description, example, impact }: FieldTooltipProps): ReactElement {\n return (\n <ChakraTooltip.Root openDelay={200} positioning={{ placement: 'top' }}>\n <ChakraTooltip.Trigger asChild>\n <Circle\n size=\"5\"\n cursor=\"help\"\n color=\"fg.muted\"\n _hover={{ color: 'colorPalette.fg' }}\n transition=\"color 0.2s\"\n display=\"inline-flex\"\n >\n <LuCircleHelp size={16} />\n </Circle>\n </ChakraTooltip.Trigger>\n <Portal>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content>\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n <VStack align=\"start\" gap={2} maxW=\"280px\" p={1}>\n {title && (\n <Text fontWeight=\"semibold\" fontSize=\"sm\">\n {title}\n </Text>\n )}\n <Text fontSize=\"sm\">{description}</Text>\n {example && (\n <Box bg=\"bg.emphasized\" px={2} py={1} borderRadius=\"md\" w=\"full\">\n <Text fontSize=\"xs\" color=\"fg.muted\">\n Example:\n </Text>\n <Text fontSize=\"sm\" fontStyle=\"italic\">\n "{example}"\n </Text>\n </Box>\n )}\n {impact && (\n <Text fontSize=\"xs\" color=\"green.fg\">\n {impact}\n </Text>\n )}\n </VStack>\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n )\n}\n","'use client'\n\nimport { Field, HStack } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { FieldTooltipMeta } from '../../types'\nimport { FieldTooltip } from './field-tooltip'\n\nexport interface FieldLabelProps {\n /** Label text (can be ReactNode for complex labels with links) */\n label?: ReactNode\n /** Tooltip for hint next to label */\n tooltip?: FieldTooltipMeta\n /** Show required field indicator */\n required?: boolean\n}\n\n/**\n * Label component for form fields with tooltip support.\n *\n * If tooltip is provided, renders HStack with label and hint icon.\n * Otherwise renders a simple Field.Label.\n *\n * @example\n * ```tsx\n * // Simple label\n * <FieldLabel label=\"Title\" required />\n *\n * // Label with tooltip\n * <FieldLabel\n * label=\"Car Brand\"\n * tooltip={{ description: 'Specify the brand', example: 'Hyundai' }}\n * required\n * />\n * ```\n */\nexport function FieldLabel({ label, tooltip, required }: FieldLabelProps): ReactElement | null {\n if (!label) {\n return null\n }\n\n return (\n <Field.Label>\n {tooltip ? (\n <HStack gap={1}>\n <span>{label}</span>\n <FieldTooltip {...tooltip} />\n </HStack>\n ) : (\n label\n )}\n {required && <Field.RequiredIndicator />}\n </Field.Label>\n )\n}\n","/**\n * Utilities for working with Zod v4 schemaми\n *\n * Общие features для разворачивания обёрток схемы\n * (optional, nullable, default) и получения базовой схемы.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Result разворачивания схемы с инformцией об обязательности\n */\nexport interface UnwrapResult {\n /** Развёрнутая schema (без optional/nullable/default обёрток) */\n schema: any\n /** Является the field обязательным (false if было optional/nullable) */\n required: boolean\n}\n\n/**\n * Разворачивает обёртки optional/nullable/default и returns базовую схему\n *\n * Supports как Zod v4 (inner), так и возможные различия в API.\n *\n * @example\n * ```ts\n * const innerSchema = unwrapSchema(z.string().optional())\n * // innerSchema will z.string()\n * ```\n */\nexport function unwrapSchema(schema: any): any {\n if (!schema?._zod?.def) {\n return schema\n }\n\n const type = schema._zod.def.type\n\n // Разворачиваем wrapper-typeы\n // Zod v4 uses inner или innerType depending on версии\n if (type === 'optional' || type === 'nullable' || type === 'default') {\n const inner = schema._zod.def.inner ?? schema._zod.def.innerType\n if (inner) {\n return unwrapSchema(inner)\n }\n }\n\n return schema\n}\n\n/**\n * Разворачивает схему и returns инformцию об обязательности поля\n *\n * В отличие от `unwrapSchema`, also отслеживает была ли schema optional/nullable.\n *\n * @example\n * ```ts\n * const { schema, required } = unwrapSchemaWithRequired(z.string().optional())\n * // schema = z.string()\n * // required = false\n * ```\n */\nexport function unwrapSchemaWithRequired(schema: any): UnwrapResult {\n if (!schema?._zod?.def) {\n return { schema, required: true }\n }\n\n const type = schema._zod.def.type\n\n // Разворачиваем обёртки, чтобы получить внутреннюю схему\n if (type === 'optional' || type === 'nullable') {\n const inner = schema._zod.def.inner ?? schema._zod.def.innerType\n if (inner) {\n const result = unwrapSchemaWithRequired(inner)\n return { schema: result.schema, required: false } // optional/nullable = НЕ обязательно\n }\n }\n\n if (type === 'default') {\n // default() делает field необязательным для HTML form — value подставится automatically\n const inner = schema._zod.def.inner ?? schema._zod.def.innerType\n if (inner) {\n const result = unwrapSchemaWithRequired(inner)\n return { schema: result.schema, required: false }\n }\n }\n\n return { schema, required: true }\n}\n\n/**\n * Получает type Zod схемы\n */\nexport function getZodType(schema: any): string | undefined {\n return schema?._zod?.def?.type\n}\n\n/**\n * Checks, is ли schema optional\n */\nexport function isOptionalSchema(schema: any): boolean {\n const type = getZodType(schema)\n return type === 'optional' || type === 'nullable'\n}\n\n/**\n * Checks, имеет ли schema default value\n */\nexport function hasDefaultValue(schema: any): boolean {\n return getZodType(schema) === 'default'\n}\n","'use client'\n\nimport { unwrapSchema } from './zod-utils'\n\n/**\n * Constraint extraction from Zod v4 schemas for automatic form field configuration\n *\n * Supports:\n * - Strings: minLength, maxLength, email, url, regex\n * - Numbers: min, max, step (int, multipleOf), positive/negative\n * - Dates: min, max\n * - Arrays: minItems, maxItems\n *\n * Zod v4 structure:\n * - Checks are stored in `schema._zod.def.checks[]`\n * - Each check has `_zod.def` with type and parameters\n */\n\n// =============================================================================\n// Constraint types\n// =============================================================================\n\n/** Constraints for string fields */\nexport interface ZodStringConstraints {\n minLength?: number\n maxLength?: number\n /** Automatically input type based on Zod checks (email, url) */\n inputType?: 'text' | 'email' | 'url' | 'tel'\n /** HTML5 pattern from regex */\n pattern?: string\n}\n\n/** Constraints for number fields */\nexport interface ZodNumberConstraints {\n min?: number\n max?: number\n step?: number\n isInteger?: boolean\n}\n\n/** Constraints for date fields */\nexport interface ZodDateConstraints {\n /** Minimum date in YYYY-MM-DD format */\n min?: string\n /** Maximum date in YYYY-MM-DD format */\n max?: string\n}\n\n/** Constraints for arrays */\nexport interface ZodArrayConstraints {\n minItems?: number\n maxItems?: number\n}\n\n/** Result of constraint extraction from schema */\nexport interface ZodConstraints {\n string?: ZodStringConstraints\n number?: ZodNumberConstraints\n date?: ZodDateConstraints\n array?: ZodArrayConstraints\n /** Schema type to determine which constraints to apply */\n schemaType?: 'string' | 'number' | 'date' | 'array' | 'boolean' | 'enum' | 'unknown'\n}\n\n// =============================================================================\n// Main function\n// =============================================================================\n\n/**\n * Extracts constraints from Zod schema by field path\n *\n * @example\n * ```tsx\n * const schema = z.object({\n * title: z.string().min(2).max(100),\n * rating: z.number().min(1).max(10),\n * birthday: z.date().min(new Date('1900-01-01')),\n * tags: z.array(z.string()).max(5),\n * })\n *\n * getZodConstraints(schema, 'title')\n * // { schemaType: 'string', string: { minLength: 2, maxLength: 100 } }\n *\n * getZodConstraints(schema, 'rating')\n * // { schemaType: 'number', number: { min: 1, max: 10 } }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getZodConstraints(schema: any, path: string): ZodConstraints {\n if (!schema) {\n return { schemaType: 'unknown' }\n }\n\n const fieldSchema = getSchemaAtPath(schema, path)\n if (!fieldSchema) {\n return { schemaType: 'unknown' }\n }\n\n const def = fieldSchema._zod?.def\n if (!def) {\n return { schemaType: 'unknown' }\n }\n\n const type = def.type\n const checks = def.checks || []\n\n switch (type) {\n case 'string':\n return {\n schemaType: 'string',\n string: extractStringConstraints(checks),\n }\n\n case 'number':\n return {\n schemaType: 'number',\n number: extractNumberConstraints(checks),\n }\n\n case 'date':\n return {\n schemaType: 'date',\n date: extractDateConstraints(checks),\n }\n\n case 'array':\n return {\n schemaType: 'array',\n array: extractArrayConstraints(checks),\n }\n\n case 'boolean':\n return { schemaType: 'boolean' }\n\n case 'enum':\n return { schemaType: 'enum' }\n\n default:\n return { schemaType: 'unknown' }\n }\n}\n\n// =============================================================================\n// Constraint extraction by types (Zod v4 structure)\n// =============================================================================\n\n/**\n * Handler type for a check\n * Receives constraints object and checkDef, modifies constraints\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CheckHandler<T> = (constraints: T, checkDef: any) => void\n\n/**\n * Generic function to extract constraints from Zod checks\n *\n * The handler pattern avoids duplicating iteration logic.\n * Each type (string, number, date, array) defines its own handlers.\n *\n * @param checks - Array of Zod checks from schema\n * @param handlers - Object with handlers for each check type\n * @returns Constraints object populated by handlers\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractConstraints<T extends object>(checks: any[], handlers: Record<string, CheckHandler<T>>): T {\n const constraints = {} as T\n\n for (const check of checks) {\n const checkDef = check._zod?.def\n if (!checkDef) {\n continue\n }\n\n const handler = handlers[checkDef.check]\n if (handler) {\n handler(constraints, checkDef)\n }\n }\n\n return constraints\n}\n\n// =============================================================================\n// Handlers for string constraints\n// =============================================================================\n\nconst stringConstraintHandlers: Record<string, CheckHandler<ZodStringConstraints>> = {\n min_length: (c, def) => {\n c.minLength = def.minimum\n },\n max_length: (c, def) => {\n c.maxLength = def.maximum\n },\n length_equals: (c, def) => {\n // Exact length = both min and max\n c.minLength = def.length\n c.maxLength = def.length\n },\n string_format: (c, def) => {\n // email(), url() and other formats\n if (def.format === 'email') {\n c.inputType = 'email'\n } else if (def.format === 'url') {\n c.inputType = 'url'\n } else if (def.format === 'regex' && def.pattern?.source) {\n c.pattern = def.pattern.source\n }\n },\n}\n\n/**\n * Extracts constraints from string checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractStringConstraints(checks: any[]): ZodStringConstraints {\n return extractConstraints(checks, stringConstraintHandlers)\n}\n\n// =============================================================================\n// Handlers for number constraints\n// =============================================================================\n\nconst numberConstraintHandlers: Record<string, CheckHandler<ZodNumberConstraints>> = {\n greater_than: (c, def) => {\n // min() creates inclusive: true, gt() creates inclusive: false\n c.min = def.value\n },\n less_than: (c, def) => {\n // max() creates inclusive: true, lt() creates inclusive: false\n c.max = def.value\n },\n number_format: (c, def) => {\n // int() creates format: 'safeint'\n if (def.format === 'safeint') {\n c.isInteger = true\n c.step = 1\n }\n },\n multiple_of: (c, def) => {\n c.step = def.value\n },\n}\n\n/**\n * Extracts constraints from number checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractNumberConstraints(checks: any[]): ZodNumberConstraints {\n return extractConstraints(checks, numberConstraintHandlers)\n}\n\n// =============================================================================\n// Handlers for date constraints\n// =============================================================================\n\nconst dateConstraintHandlers: Record<string, CheckHandler<ZodDateConstraints>> = {\n greater_than: (c, def) => {\n // min() for dates\n if (def.value) {\n c.min = formatDateToISO(def.value)\n }\n },\n less_than: (c, def) => {\n // max() for dates\n if (def.value) {\n c.max = formatDateToISO(def.value)\n }\n },\n}\n\n/**\n * Extracts constraints from date checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractDateConstraints(checks: any[]): ZodDateConstraints {\n return extractConstraints(checks, dateConstraintHandlers)\n}\n\n// =============================================================================\n// Handlers for array constraints\n// =============================================================================\n\nconst arrayConstraintHandlers: Record<string, CheckHandler<ZodArrayConstraints>> = {\n min_length: (c, def) => {\n c.minItems = def.minimum\n },\n max_length: (c, def) => {\n c.maxItems = def.maximum\n },\n length: (c, def) => {\n c.minItems = def.length\n c.maxItems = def.length\n },\n}\n\n/**\n * Extracts constraints from array checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractArrayConstraints(checks: any[]): ZodArrayConstraints {\n return extractConstraints(checks, arrayConstraintHandlers)\n}\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Navigate to schema by path (reuses logic from schema-meta.ts)\n * Supports nested objects, arrays, optional/nullable\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSchemaAtPath(schema: any, path: string): any {\n if (!schema || !path) {\n return schema\n }\n\n const parts = path.split('.')\n let current = schema\n\n for (const part of parts) {\n current = unwrapSchema(current)\n\n if (!current) {\n return undefined\n }\n\n // Skip numeric indices (for arrays we use element schema)\n if (/^\\d+$/.test(part)) {\n if (current._zod?.def?.type === 'array') {\n current = current._zod.def.element\n }\n continue\n }\n\n // Navigate into object shape\n if (current._zod?.def?.type === 'object') {\n const shape = current._zod.def.shape\n if (shape && part in shape) {\n current = shape[part]\n } else {\n return undefined\n }\n } else {\n return undefined\n }\n }\n\n return unwrapSchema(current)\n}\n\n/**\n * Formats a date to YYYY-MM-DD string for HTML input[type=\"date\"]\n * Accepts Date, ISO string or timestamp\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction formatDateToISO(value: any): string {\n let date: Date\n\n if (value instanceof Date) {\n date = value\n } else if (typeof value === 'string') {\n date = new Date(value)\n } else if (typeof value === 'number') {\n date = new Date(value)\n } else {\n return ''\n }\n\n if (isNaN(date.getTime())) {\n return ''\n }\n\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n","'use client'\n\nimport type { FieldUIMeta } from './types'\nimport { unwrapSchemaWithRequired } from './zod-utils'\n\n/**\n * Result анализа схемы поля\n */\nexport interface FieldSchemaInfo {\n /** UI metadata из .meta({ ui: {...} }) */\n ui?: FieldUIMeta\n /** Обязательно the field (не optional/nullable) */\n required: boolean\n}\n\n/**\n * Extracts UI metadata и статус обязательности from Zod schema по пути поля\n *\n * Supports вложенные пути вроде \"info.base.rating\" и пути arrayов вроде \"components.0.title\"\n *\n * @example\n * ```tsx\n * const schema = z.object({\n * title: z.string().meta({ ui: { title: 'Название' } }), // обязательно\n * subtitle: z.string().optional(), // optional\n * })\n *\n * getFieldMeta(schema, 'title') // { ui: { title: 'Название' }, required: true }\n * getFieldMeta(schema, 'subtitle') // { ui: undefined, required: false }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getFieldMeta(schema: any, path: string): FieldSchemaInfo {\n if (!schema) {\n return { required: false }\n }\n\n const result = getSchemaAtPath(schema, path)\n if (!result.schema) {\n return { required: false }\n }\n\n // Zod v4: meta is stored in globalRegistry, accessed via .meta() method\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fieldSchema = result.schema as any\n const meta = typeof fieldSchema?.meta === 'function' ? fieldSchema.meta() : undefined\n\n return {\n ui: meta?.ui as FieldUIMeta | undefined,\n required: result.required,\n }\n}\n\ninterface SchemaPathResult {\n /** Схема поля ДО финального unwrap (для извлечения мета) */\n schema: unknown\n /** Обязательность поля after анализа всей цепочки */\n required: boolean\n}\n\n/**\n * Разворачивает wrapper-typeы схемы (effects, pipeline, transform) до базовой схемы\n * Сохраняет optional/nullable обёртки для корректного определения required\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction unwrapToBaseSchema(schema: any): any {\n if (!schema?._zod?.def) {\n return schema\n }\n\n const type = schema._zod.def.type\n\n // Zod v4: effects (от superRefine, refine) имеют inner схему\n if (type === 'effects' || type === 'transform' || type === 'preprocess') {\n const inner = schema._zod.def.inner ?? schema._zod.def.schema\n if (inner) {\n return unwrapToBaseSchema(inner)\n }\n }\n\n // Zod v4: pipeline (от pipe) имеет in и out схемы\n if (type === 'pipeline') {\n const inner = schema._zod.def.in\n if (inner) {\n return unwrapToBaseSchema(inner)\n }\n }\n\n return schema\n}\n\n/**\n * Навигация к схеме по заданному пути\n * Обрабатывает objectы, arrayы и обёртки optional/nullable/effects/pipeline\n * Returns и схему, и статус обязательности\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSchemaAtPath(schema: any, path: string): SchemaPathResult {\n if (!schema || !path) {\n return { schema, required: true }\n }\n\n const parts = path.split('.')\n let current = schema\n let isRequired = true\n\n for (const part of parts) {\n // Сначала разворачиваем effects/pipeline/transform до базовой схемы\n current = unwrapToBaseSchema(current)\n\n const unwrapped = unwrapSchemaWithRequired(current)\n current = unwrapped.schema\n // Отслеживаем, встретили ли optional/nullable\n if (!unwrapped.required) {\n isRequired = false\n }\n\n if (!current) {\n return { schema: undefined, required: false }\n }\n\n // Снова разворачиваем after unwrap (effects могут быть inside optional)\n current = unwrapToBaseSchema(current)\n\n // Пропускаем numberвые индексы (elementы arrayа используют схему elementа)\n if (/^\\d+$/.test(part)) {\n // For arrays get element schema\n if (current._zod?.def?.type === 'array') {\n current = current._zod.def.element\n }\n continue\n }\n\n // Transitionим в shape objectа\n if (current._zod?.def?.type === 'object') {\n const shape = current._zod.def.shape\n if (shape && part in shape) {\n current = shape[part]\n } else {\n return { schema: undefined, required: false }\n }\n } else {\n return { schema: undefined, required: false }\n }\n }\n\n // Разворачиваем only effects/pipeline, сохраняя default/optional для мета\n current = unwrapToBaseSchema(current)\n\n // Определяем required based on typeа обёртки, но возвращаем схему ДО unwrap\n // чтобы can было получить мета из .meta()\n const finalUnwrap = unwrapSchemaWithRequired(current)\n\n return {\n // Возвращаем схему ДО unwrap — на ней can быть мета (.default().meta())\n schema: current,\n required: isRequired && finalUnwrap.required,\n }\n}\n","'use client'\n\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport { getZodConstraints, type ZodConstraints } from '../../schema-constraints'\nimport { getFieldMeta } from '../../schema-meta'\nimport type { FieldUIMeta } from '../../types'\n\n/**\n * Hook to get full field path, form instance, UI meta, required status, and constraints for declarative fields\n *\n * Handles both regular fields and primitive array fields (without name)\n */\nexport function useDeclarativeField(name?: string): {\n form: ReturnType<typeof useDeclarativeForm>['form']\n fullPath: string\n name: string\n meta: FieldUIMeta | undefined\n /** Whether field is required (from Zod schema - not optional/nullable) */\n required: boolean\n /** Global disabled state from Form */\n formDisabled: boolean\n /** Global readOnly state from Form */\n formReadOnly: boolean\n /** Automatic constraints from Zod schema (min, max, minLength, maxLength etc.) */\n constraints: ZodConstraints\n} {\n const { form, schema, primitiveArrayIndex, disabled, readOnly } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Build full path\n let fullPath: string\n\n if (name) {\n // Regular field with name\n fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n } else if (parentGroup) {\n // Primitive array: FormGroup already includes the index in path (e.g., \"tags.0\")\n fullPath = parentGroup.name\n } else {\n throw new Error('Field must have a name prop or be inside Form.Group.List for primitive arrays')\n }\n\n // Extract UI metadata and required status from schema\n const schemaInfo = getFieldMeta(schema, fullPath)\n\n // Extract constraints from schema (min, max, minLength, maxLength, etc.)\n const constraints = getZodConstraints(schema, fullPath)\n\n return {\n form,\n fullPath,\n name: name ?? String(primitiveArrayIndex),\n meta: schemaInfo.ui,\n required: schemaInfo.required,\n formDisabled: disabled ?? false,\n formReadOnly: readOnly ?? false,\n constraints,\n }\n}\n","'use client'\n\nimport { useEffect, useState } from 'react'\n\n/**\n * Hook for debouncing a value\n *\n * Delays value update by the specified time.\n * Useful for search fields, autocomplete and other cases\n * when you need to limit request frequency.\n *\n * @param value - Value to debounce\n * @param delay - Delay in milliseconds (default 300)\n * @returns Debounced value\n *\n * @example\n * ```tsx\n * const [inputValue, setInputValue] = useState('')\n * const debouncedValue = useDebounce(inputValue, 300)\n *\n * useEffect(() => {\n * // Executes only when user stops typing\n * searchAPI(debouncedValue)\n * }, [debouncedValue])\n * ```\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay)\n return () => clearTimeout(timer)\n }, [value, delay])\n\n return debouncedValue\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { useDebounce } from './use-debounce'\n\n/**\n * Async request result (compatible with TanStack Query and ZenStack hooks)\n */\nexport interface AsyncQueryResult<TData = unknown> {\n data?: TData[]\n isLoading?: boolean\n error?: Error | null\n}\n\n/**\n * Async request function for loading options\n * @param search - Search string (empty if request not started)\n */\nexport type AsyncQueryFn<TData = unknown> = (search: string) => AsyncQueryResult<TData>\n\n/**\n * Options for useAsyncSearch\n */\nexport interface UseAsyncSearchOptions<TData = unknown> {\n /**\n * Async request function (returns { data, isLoading, error })\n */\n useQuery?: AsyncQueryFn<TData>\n\n /**\n * Debounce delay in milliseconds\n * @default 300\n */\n debounce?: number\n\n /**\n * Minimum characters to start searching\n * @default 1\n */\n minChars?: number\n\n /**\n * Initial input value\n * @default ''\n */\n initialValue?: string\n}\n\n/**\n * Result useAsyncSearch\n */\nexport interface UseAsyncSearchResult<TData = unknown> {\n /** Current value input */\n inputValue: string\n\n /** Function for changing input value */\n setInputValue: (value: string) => void\n\n /** Debounced value for query */\n debouncedSearch: string\n\n /** Whether the request should be triggered (enough characters) */\n shouldQuery: boolean\n\n /** Whether loading is in progress */\n isLoading: boolean\n\n /** Request result (data array) */\n data: TData[] | undefined\n\n /** Error request */\n error: Error | null | undefined\n}\n\n/**\n * Hook for async search with debounce\n *\n * Combines common input management, debounce and async request logic\n * for Combobox and Autocomplete components.\n *\n * @example Usage with ZenStack hook\n * ```tsx\n * const {\n * inputValue,\n * setInputValue,\n * shouldQuery,\n * isLoading,\n * data,\n * } = useAsyncSearch({\n * useQuery: (search) => useFindManyUser({\n * where: { name: { contains: search, mode: 'insensitive' } },\n * take: 20,\n * }),\n * debounce: 300,\n * minChars: 2,\n * })\n * ```\n *\n * @example Usage for local filtering\n * ```tsx\n * const { inputValue, setInputValue, debouncedSearch } = useAsyncSearch({\n * debounce: 200,\n * minChars: 1,\n * })\n *\n * const filteredOptions = useMemo(() => {\n * return options.filter(opt => opt.label.includes(debouncedSearch))\n * }, [options, debouncedSearch])\n * ```\n */\nexport function useAsyncSearch<TData = unknown>(\n options: UseAsyncSearchOptions<TData> = {}\n): UseAsyncSearchResult<TData> {\n const { useQuery, debounce = 300, minChars = 1, initialValue = '' } = options\n\n // State input\n const [inputValue, setInputValue] = useState(initialValue)\n\n // Debounced value for query\n const debouncedSearch = useDebounce(inputValue, debounce)\n\n // Should the request be triggered?\n const shouldQuery = debouncedSearch.length >= minChars\n\n // Call useQuery (if provided)\n // Pass empty string if we shouldn't query, so the hook is always called\n const queryResult = useQuery?.(shouldQuery ? debouncedSearch : '')\n\n // Extract results\n const { data, isLoading = false, error } = queryResult ?? {}\n\n return {\n inputValue,\n setInputValue,\n debouncedSearch,\n shouldQuery,\n isLoading,\n data,\n error,\n }\n}\n","'use client'\n\nimport { Box, Text } from '@chakra-ui/react'\nimport { Component, type ErrorInfo, type ReactNode } from 'react'\n\ninterface FieldErrorBoundaryProps {\n /** Имя поля для отображения в сообщении об ошибке */\n fieldName: string\n children: ReactNode\n}\n\ninterface FieldErrorBoundaryState {\n hasError: boolean\n error: Error | null\n}\n\n/**\n * ErrorBoundary для field-компонентов.\n *\n * Перехватывает ошибки рендеринга внутри отдельного поля формы,\n * показывает fallback вместо краша всей формы.\n * Особенно полезен для кастомных полей через createForm({ extraFields }).\n */\nexport class FieldErrorBoundary extends Component<FieldErrorBoundaryProps, FieldErrorBoundaryState> {\n constructor(props: FieldErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false, error: null }\n }\n\n static getDerivedStateFromError(error: Error): FieldErrorBoundaryState {\n return { hasError: true, error }\n }\n\n override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(`[Form] Ошибка в поле \"${this.props.fieldName}\":`, error, errorInfo)\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <Box p={3} borderWidth=\"1px\" borderColor=\"red.500\" borderRadius=\"md\" bg=\"red.50\" _dark={{ bg: 'red.950' }}>\n <Text color=\"red.600\" _dark={{ color: 'red.300' }} fontSize=\"sm\">\n Ошибка в поле "{this.props.fieldName}": {this.state.error?.message}\n </Text>\n </Box>\n )\n }\n\n return this.props.children\n }\n}\n","'use client'\n\nimport type { ValidationError } from '@tanstack/react-form'\n\n/**\n * Formats validation errors into a string for display\n *\n * Handles various error formats:\n * - Strings (returned as-is)\n * - Objects with `message` (StandardSchemaV1Issue, ZodIssue)\n * - Objects with `issues` array (ZodError)\n * - Nested error structures\n *\n * @example\n * ```tsx\n * const errors = field.state.meta.errors\n * {hasFieldErrors(errors) && (\n * <Field.ErrorText>{formatFieldErrors(errors)}</Field.ErrorText>\n * )}\n * ```\n */\nexport function formatFieldErrors(errors: ValidationError[]): string {\n return errors\n .map((e) => extractErrorMessage(e))\n .filter(Boolean)\n .join(', ')\n}\n\n/**\n * Extracts error message from various formats\n *\n * @internal\n */\nfunction extractErrorMessage(e: ValidationError): string {\n // String error\n if (typeof e === 'string') {\n return e\n }\n\n // Null/undefined\n if (e === null || e === undefined) {\n return ''\n }\n\n // Object with error\n if (typeof e === 'object') {\n // Array of errors (Zod issues from superRefine, array of strings etc.)\n if (Array.isArray(e)) {\n return e\n .map((item: unknown) => {\n // Element with message (ZodIssue)\n if (typeof item === 'object' && item && 'message' in item) {\n return (item as { message: string }).message\n }\n // String\n if (typeof item === 'string') {\n return item\n }\n return ''\n })\n .filter(Boolean)\n .join(', ')\n }\n\n // Standard format: { message: string }\n if ('message' in e && typeof e.message === 'string') {\n return e.message\n }\n\n // Zod format with issues array: { issues: Array<{ message: string }> }\n if ('issues' in e && Array.isArray(e.issues)) {\n return e.issues\n .map((issue: unknown) => {\n if (typeof issue === 'object' && issue && 'message' in issue) {\n return (issue as { message: string }).message\n }\n return ''\n })\n .filter(Boolean)\n .join(', ')\n }\n\n // Zod flat errors: { fieldErrors: Record<string, string[]> }\n if ('fieldErrors' in e && typeof e.fieldErrors === 'object' && e.fieldErrors) {\n const fieldErrors = e.fieldErrors as Record<string, string[]>\n return Object.values(fieldErrors).flat().filter(Boolean).join(', ')\n }\n\n // Zod format errors: { _errors: string[] }\n if ('_errors' in e && Array.isArray(e._errors)) {\n return (e._errors as string[]).filter(Boolean).join(', ')\n }\n\n // Fallback: try JSON.stringify for debugging\n // This is better than [object Object], can detect unknown formats\n try {\n const json = JSON.stringify(e)\n // If JSON is too long or empty object, don't show\n if (json === '{}' || json.length > 200) {\n return ''\n }\n // Log in dev mode for debugging unknown formats\n if (process.env.NODE_ENV === 'development') {\n console.warn('[form-components] Unknown error format:', e)\n }\n return json\n } catch {\n return ''\n }\n }\n\n // Other types (number, boolean) — unlikely, but handled\n return String(e)\n}\n\n/**\n * Checks for the presence of validation errors\n *\n * @example\n * ```tsx\n * const errors = field.state.meta.errors\n * const hasError = hasFieldErrors(errors)\n * ```\n */\nexport function hasFieldErrors(errors: ValidationError[] | undefined): errors is ValidationError[] {\n return Boolean(errors && errors.length > 0)\n}\n\n/**\n * Interface for useFieldErrors result\n */\nexport interface FieldErrorsResult {\n /** Validation errors */\n errors: ValidationError[]\n /** Whether there are errors */\n hasError: boolean\n /** Formatted error message */\n errorMessage: string\n}\n\n/**\n * Extracts error information from field API\n *\n * Simplifies error retrieval in manual Field components\n * that do not use the createField factory.\n *\n * @example\n * ```tsx\n * <form.Field name={fullPath}>\n * {(field: AnyFieldApi) => {\n * const { hasError, errorMessage } = getFieldErrors(field)\n * return (\n * <Field.Root invalid={hasError}>\n * ...\n * <FieldError hasError={hasError} errorMessage={errorMessage} />\n * </Field.Root>\n * )\n * }}\n * </form.Field>\n * ```\n */\nexport function getFieldErrors(field: { state: { meta: { errors?: ValidationError[] } } }): FieldErrorsResult {\n const errors = field.state.meta.errors ?? []\n const hasError = hasFieldErrors(errors)\n const errorMessage = hasError ? formatFieldErrors(errors) : ''\n return { errors, hasError, errorMessage }\n}\n","'use client'\n\nimport { useCallback, useMemo, useRef } from 'react'\nimport { unwrapSchema } from '../../zod-utils'\n\n/**\n * Конфигурация async-валидации из .meta() или props.\n */\nexport interface AsyncValidateConfig {\n /** Async-функция валидации. Возвращает строку ошибки или undefined. */\n asyncValidate: (value: unknown) => Promise<string | undefined>\n /** Задержка перед запросом (мс). По умолчанию 500. */\n asyncDebounce?: number\n /** Триггер: 'onBlur' (по умолчанию) или 'onChange'. */\n asyncTrigger?: 'onBlur' | 'onChange'\n}\n\n/**\n * Результат хука — validators объект для form.Field + asyncDebounceMs.\n */\nexport interface AsyncFieldValidators {\n /** Validators prop для form.Field */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n validators: Record<string, any> | undefined\n /** asyncDebounceMs prop для form.Field */\n asyncDebounceMs: number | undefined\n /** Есть ли async-валидация */\n hasAsyncValidation: boolean\n}\n\n/**\n * Извлечь async-валидацию из Zod schema .meta().\n *\n * Ожидаемый формат:\n * ```ts\n * z.string().meta({\n * asyncValidate: async (value) => { ... },\n * asyncDebounce: 500,\n * asyncTrigger: 'onBlur',\n * })\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getAsyncValidateFromSchema(schema: any, fieldPath: string): AsyncValidateConfig | undefined {\n if (!schema) return undefined\n\n try {\n const unwrapped = unwrapSchema(schema)\n if (!unwrapped?._zod?.def?.shape) return undefined\n\n // Навигация по dot-path к нужному полю\n const parts = fieldPath.split('.')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = unwrapped._zod.def.shape\n for (const part of parts) {\n // Пропускаем числовые индексы массива\n if (/^\\d+$/.test(part)) continue\n const fieldSchema = current[part]\n if (!fieldSchema) return undefined\n\n const fieldUnwrapped = unwrapSchema(fieldSchema)\n const fieldType = fieldUnwrapped?._zod?.def?.type\n\n if (fieldType === 'object' && fieldUnwrapped._zod.def.shape) {\n current = fieldUnwrapped._zod.def.shape\n continue\n }\n\n if (fieldType === 'array' && fieldUnwrapped._zod.def.element) {\n const elementUnwrapped = unwrapSchema(fieldUnwrapped._zod.def.element)\n if (elementUnwrapped?._zod?.def?.shape) {\n current = elementUnwrapped._zod.def.shape\n continue\n }\n }\n\n // Конечное поле — проверяем meta\n if (fieldSchema?.meta) {\n const meta = fieldSchema.meta()\n if (meta?.asyncValidate && typeof meta.asyncValidate === 'function') {\n return {\n asyncValidate: meta.asyncValidate,\n asyncDebounce: meta.asyncDebounce,\n asyncTrigger: meta.asyncTrigger,\n }\n }\n }\n\n return undefined\n }\n } catch {\n return undefined\n }\n\n return undefined\n}\n\n/**\n * Хук для создания async validators из Zod meta или props.\n *\n * Приоритет: props > meta.\n *\n * @param schema - Zod schema формы\n * @param fieldPath - Полный путь к полю\n * @param propsConfig - Конфиг из props поля (приоритетнее meta)\n */\nexport function useAsyncFieldValidation(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema: any,\n fieldPath: string,\n propsConfig?: Partial<AsyncValidateConfig>,\n): AsyncFieldValidators {\n // AbortController для отмены предыдущего запроса\n const abortRef = useRef<AbortController | null>(null)\n // Кэш результатов\n const cacheRef = useRef<Map<string, string | undefined>>(new Map())\n\n // Извлекаем конфиг из schema meta\n const schemaConfig = useMemo(\n () => getAsyncValidateFromSchema(schema, fieldPath),\n [schema, fieldPath],\n )\n\n // Мержим: props > schema meta\n const asyncFn = propsConfig?.asyncValidate ?? schemaConfig?.asyncValidate\n const debounce = propsConfig?.asyncDebounce ?? schemaConfig?.asyncDebounce ?? 500\n const trigger = propsConfig?.asyncTrigger ?? schemaConfig?.asyncTrigger ?? 'onBlur'\n\n // Обёрнутая async-функция с abort + cache + offline check\n const wrappedAsyncFn = useCallback(\n async ({ value }: { value: unknown }): Promise<string | undefined> => {\n if (!asyncFn) return undefined\n\n // Пропускаем в офлайне\n if (typeof navigator !== 'undefined' && !navigator.onLine) return undefined\n\n // Кэш\n const cacheKey = String(value)\n if (cacheRef.current.has(cacheKey)) {\n return cacheRef.current.get(cacheKey)\n }\n\n // Отмена предыдущего запроса\n abortRef.current?.abort()\n const controller = new AbortController()\n abortRef.current = controller\n\n try {\n const result = await asyncFn(value)\n // Проверяем не был ли запрос отменён\n if (controller.signal.aborted) return undefined\n\n cacheRef.current.set(cacheKey, result)\n return result\n } catch (err) {\n // Отменённый запрос — не ошибка\n if (err instanceof DOMException && err.name === 'AbortError') return undefined\n return undefined\n }\n },\n [asyncFn],\n )\n\n // Собираем validators\n const validators = useMemo(() => {\n if (!asyncFn) return undefined\n\n if (trigger === 'onChange') {\n return { onChangeAsync: wrappedAsyncFn }\n }\n return { onBlurAsync: wrappedAsyncFn }\n }, [asyncFn, trigger, wrappedAsyncFn])\n\n return {\n validators,\n asyncDebounceMs: asyncFn ? debounce : undefined,\n hasAsyncValidation: !!asyncFn,\n }\n}\n","'use client'\n\nimport type {\n ZodArrayConstraints,\n ZodConstraints,\n ZodDateConstraints,\n ZodNumberConstraints,\n ZodStringConstraints,\n} from './schema-constraints'\n\n// =============================================================================\n// Translation types\n// =============================================================================\n\n/**\n * String templates for constraint hints.\n * Placeholders: {n}, {min}, {max}, {chars}, {items}, {suffix}\n */\nexport type ConstraintHintTranslations = {\n string_exact: string\n string_range: string\n string_max: string\n string_min: string\n number_range: string\n number_max: string\n number_min: string\n number_integer: string\n number_integer_suffix: string\n date_range: string\n date_after: string\n date_before: string\n array_exact: string\n array_range: string\n array_max: string\n array_min: string\n}\n\n// =============================================================================\n// Built-in translations (en, ru)\n// =============================================================================\n\nconst EN_TRANSLATIONS: ConstraintHintTranslations = {\n string_exact: 'Exactly {n} {chars}',\n string_range: 'From {min} to {max} characters',\n string_max: 'Maximum {n} {chars}',\n string_min: 'Minimum {n} {chars}',\n number_range: 'From {min} to {max}{suffix}',\n number_max: 'Maximum {max}{suffix}',\n number_min: 'Minimum {min}{suffix}',\n number_integer: 'Integer',\n number_integer_suffix: ' (integer)',\n date_range: 'From {min} to {max}',\n date_after: 'Not before {min}',\n date_before: 'Not after {max}',\n array_exact: 'Exactly {n} {items}',\n array_range: 'From {min} to {max} items',\n array_max: 'Maximum {n} {items}',\n array_min: 'Minimum {n} {items}',\n}\n\nconst RU_TRANSLATIONS: ConstraintHintTranslations = {\n string_exact: 'Ровно {n} {chars}',\n string_range: 'От {min} до {max} символов',\n string_max: 'Максимум {n} {chars}',\n string_min: 'Минимум {n} {chars}',\n number_range: 'От {min} до {max}{suffix}',\n number_max: 'Максимум {max}{suffix}',\n number_min: 'Минимум {min}{suffix}',\n number_integer: 'Целое число',\n number_integer_suffix: ' (целое)',\n date_range: 'С {min} по {max}',\n date_after: 'Не ранее {min}',\n date_before: 'Не позднее {max}',\n array_exact: 'Ровно {n} {items}',\n array_range: 'От {min} до {max} элементов',\n array_max: 'Максимум {n} {items}',\n array_min: 'Минимум {n} {items}',\n}\n\nconst BUILTIN_TRANSLATIONS: Record<string, ConstraintHintTranslations> = {\n en: EN_TRANSLATIONS,\n ru: RU_TRANSLATIONS,\n}\n\n// =============================================================================\n// Pluralization via Intl.PluralRules\n// =============================================================================\n\ntype PluralForms = { one: string; few?: string; many?: string; other: string }\n\nconst CHAR_PLURALS: Record<string, PluralForms> = {\n en: { one: 'character', other: 'characters' },\n ru: { one: 'символ', few: 'символа', many: 'символов', other: 'символов' },\n}\n\nconst ITEM_PLURALS: Record<string, PluralForms> = {\n en: { one: 'item', other: 'items' },\n ru: { one: 'элемент', few: 'элемента', many: 'элементов', other: 'элементов' },\n}\n\nfunction pluralizeWord(n: number, locale: string, plurals: Record<string, PluralForms>): string {\n const lang = locale.split('-')[0]!\n const forms = plurals[lang] ?? plurals.en!\n const rule = new Intl.PluralRules(locale).select(n)\n return (forms as Record<string, string>)[rule] ?? forms.other\n}\n\n// =============================================================================\n// Formatting via Intl\n// =============================================================================\n\nfunction formatNumber(n: number, locale: string): string {\n if (Number.isInteger(n)) {\n return new Intl.NumberFormat(locale).format(n)\n }\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)\n}\n\nfunction formatDate(dateStr: string, locale: string): string {\n try {\n const date = new Date(dateStr)\n return new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(date)\n } catch {\n return dateStr\n }\n}\n\n// =============================================================================\n// Template engine\n// =============================================================================\n\nfunction template(str: string, vars: Record<string, string | number>): string {\n return str.replace(/\\{(\\w+)\\}/g, (_, key) => String(vars[key] ?? ''))\n}\n\n// =============================================================================\n// Translation resolution\n// =============================================================================\n\nfunction getTranslations(locale: string, custom?: Partial<ConstraintHintTranslations>): ConstraintHintTranslations {\n const lang = locale.split('-')[0]!\n const base = BUILTIN_TRANSLATIONS[lang] ?? BUILTIN_TRANSLATIONS[locale] ?? EN_TRANSLATIONS\n if (custom) {\n return { ...base, ...custom }\n }\n return base\n}\n\n// =============================================================================\n// Main API\n// =============================================================================\n\n/**\n * Generates a human-readable hint from constraints.\n *\n * Supports i18n via locale parameter (en, ru built-in).\n * For other languages, pass customTranslations.\n *\n * @param constraints - constraints from Zod schema\n * @param locale - locale (default 'en')\n * @param customTranslations - custom string templates\n *\n * @example\n * ```tsx\n * generateConstraintHint(constraints) // → \"Minimum 2 characters\"\n * generateConstraintHint(constraints, 'ru') // -> \"Минимум 2 символа\"\n * ```\n */\nexport function generateConstraintHint(\n constraints: ZodConstraints | undefined,\n locale: string = 'en',\n customTranslations?: Partial<ConstraintHintTranslations>\n): string | undefined {\n if (!constraints) {\n return undefined\n }\n\n const t = getTranslations(locale, customTranslations)\n\n switch (constraints.schemaType) {\n case 'string':\n return generateStringHint(constraints.string, locale, t)\n case 'number':\n return generateNumberHint(constraints.number, locale, t)\n case 'date':\n return generateDateHint(constraints.date, locale, t)\n case 'array':\n return generateArrayHint(constraints.array, locale, t)\n default:\n return undefined\n }\n}\n\n// =============================================================================\n// Type-specific generators\n// =============================================================================\n\nfunction generateStringHint(\n constraints: ZodStringConstraints | undefined,\n locale: string,\n t: ConstraintHintTranslations\n): string | undefined {\n if (!constraints) return undefined\n\n const { minLength, maxLength, inputType } = constraints\n\n // Special types - only maxLength\n if (inputType === 'email' || inputType === 'url') {\n if (maxLength) {\n return template(t.string_max, { n: maxLength, chars: pluralizeWord(maxLength, locale, CHAR_PLURALS) })\n }\n return undefined\n }\n\n if (minLength !== undefined && maxLength !== undefined) {\n if (minLength === maxLength) {\n return template(t.string_exact, { n: minLength, chars: pluralizeWord(minLength, locale, CHAR_PLURALS) })\n }\n return template(t.string_range, { min: minLength, max: maxLength })\n }\n\n if (maxLength !== undefined) {\n return template(t.string_max, { n: maxLength, chars: pluralizeWord(maxLength, locale, CHAR_PLURALS) })\n }\n\n if (minLength !== undefined) {\n return template(t.string_min, { n: minLength, chars: pluralizeWord(minLength, locale, CHAR_PLURALS) })\n }\n\n return undefined\n}\n\nfunction generateNumberHint(\n constraints: ZodNumberConstraints | undefined,\n locale: string,\n t: ConstraintHintTranslations\n): string | undefined {\n if (!constraints) return undefined\n\n const { min, max, isInteger } = constraints\n const suffix = isInteger ? t.number_integer_suffix : ''\n\n if (min !== undefined && max !== undefined) {\n return template(t.number_range, { min: formatNumber(min, locale), max: formatNumber(max, locale), suffix })\n }\n\n if (max !== undefined) {\n return template(t.number_max, { max: formatNumber(max, locale), suffix })\n }\n\n if (min !== undefined) {\n return template(t.number_min, { min: formatNumber(min, locale), suffix })\n }\n\n if (isInteger) {\n return t.number_integer\n }\n\n return undefined\n}\n\nfunction generateDateHint(\n constraints: ZodDateConstraints | undefined,\n locale: string,\n t: ConstraintHintTranslations\n): string | undefined {\n if (!constraints) return undefined\n\n const { min, max } = constraints\n\n if (min && max) {\n return template(t.date_range, { min: formatDate(min, locale), max: formatDate(max, locale) })\n }\n\n if (min) {\n return template(t.date_after, { min: formatDate(min, locale) })\n }\n\n if (max) {\n return template(t.date_before, { max: formatDate(max, locale) })\n }\n\n return undefined\n}\n\nfunction generateArrayHint(\n constraints: ZodArrayConstraints | undefined,\n locale: string,\n t: ConstraintHintTranslations\n): string | undefined {\n if (!constraints) return undefined\n\n const { minItems, maxItems } = constraints\n\n if (minItems !== undefined && maxItems !== undefined) {\n if (minItems === maxItems) {\n return template(t.array_exact, { n: minItems, items: pluralizeWord(minItems, locale, ITEM_PLURALS) })\n }\n return template(t.array_range, { min: minItems, max: maxItems })\n }\n\n if (maxItems !== undefined) {\n return template(t.array_max, { n: maxItems, items: pluralizeWord(maxItems, locale, ITEM_PLURALS) })\n }\n\n if (minItems !== undefined) {\n return template(t.array_min, { n: minItems, items: pluralizeWord(minItems, locale, ITEM_PLURALS) })\n }\n\n return undefined\n}\n","/**\n * Маппинг имени поля → HTML autocomplete атрибут.\n *\n * Автоматическое проставление autocomplete на основе имени поля\n * улучшает конверсию форм на 30% (Google) и соответствует WCAG 1.3.5.\n *\n * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofilling-form-controls\n */\n\n/** Маппинг имени поля (последний сегмент dot-path) → autocomplete значение */\nconst AUTOCOMPLETE_MAP: Record<string, string> = {\n // Идентификация\n email: 'email',\n 'e-mail': 'email',\n username: 'username',\n\n // Имя\n name: 'name',\n fullName: 'name',\n full_name: 'name',\n firstName: 'given-name',\n first_name: 'given-name',\n lastName: 'family-name',\n last_name: 'family-name',\n surname: 'family-name',\n middleName: 'additional-name',\n middle_name: 'additional-name',\n patronymic: 'additional-name',\n\n // Телефон\n phone: 'tel',\n tel: 'tel',\n mobile: 'tel',\n telephone: 'tel',\n\n // Пароль\n password: 'current-password',\n newPassword: 'new-password',\n new_password: 'new-password',\n confirmPassword: 'new-password',\n confirm_password: 'new-password',\n\n // Адрес\n address: 'street-address',\n street: 'street-address',\n city: 'address-level2',\n state: 'address-level1',\n region: 'address-level1',\n zip: 'postal-code',\n postal: 'postal-code',\n postalCode: 'postal-code',\n postal_code: 'postal-code',\n zipCode: 'postal-code',\n zip_code: 'postal-code',\n country: 'country-name',\n\n // Организация\n company: 'organization',\n organization: 'organization',\n companyName: 'organization',\n company_name: 'organization',\n jobTitle: 'organization-title',\n job_title: 'organization-title',\n\n // Платёжные данные\n cardNumber: 'cc-number',\n card_number: 'cc-number',\n cardName: 'cc-name',\n card_name: 'cc-name',\n expiry: 'cc-exp',\n cvv: 'cc-csc',\n cvc: 'cc-csc',\n}\n\n/**\n * Определяет autocomplete атрибут для поля.\n *\n * Приоритет:\n * 1. Явный prop `autoComplete` (наивысший)\n * 2. Значение из Zod `.meta({ autocomplete: '...' })`\n * 3. Авто-определение по имени поля\n *\n * Если любой источник вернул `'off'` — автозаполнение отключается.\n *\n * @param fieldName - Имя поля (последний сегмент dot-path, без индексов массива)\n * @param metaAutocomplete - Значение из `.meta({ autocomplete })`\n * @param propAutocomplete - Явный prop autoComplete\n * @returns HTML autocomplete значение или undefined\n */\nexport function resolveAutoComplete(\n fieldName: string,\n metaAutocomplete?: string,\n propAutocomplete?: string\n): string | undefined {\n // 1. Prop имеет наивысший приоритет\n if (propAutocomplete !== undefined) {\n return propAutocomplete\n }\n\n // 2. Meta override\n if (metaAutocomplete !== undefined) {\n return metaAutocomplete\n }\n\n // 3. Авто-определение по имени поля\n // Берём последний сегмент dot-path и убираем индексы массива\n const lastSegment = fieldName.split('.').pop() ?? fieldName\n const cleanName = lastSegment.replace(/\\[\\d+\\]/g, '')\n\n return AUTOCOMPLETE_MAP[cleanName]\n}\n","'use client'\n\nimport type { ReactNode } from 'react'\nimport { getLocalizedValue, useFormI18n, useLocalizedOptions } from '../../../i18n'\nimport { generateConstraintHint } from '../../constraint-hints'\nimport type { ZodConstraints } from '../../schema-constraints'\nimport type { BaseFieldProps, FieldOptionMeta, FieldTooltipMeta } from '../../types'\nimport { resolveAutoComplete } from './autocomplete-map'\nimport { useDeclarativeField } from './base-field'\n\n/**\n * Resolves all field props considering schema and form-level settings\n *\n * Priority:\n * 1. Component props (highest)\n * 2. Zod schema meta (ui: { title, placeholder, description, tooltip })\n * 3. Automatically generated hint from constraints (if helperText not set)\n * 4. Form-level settings (disabled, readOnly)\n *\n * @example\n * ```tsx\n * function FieldString({ name, label, placeholder, helperText, required, disabled, readOnly, tooltip }: StringFieldProps) {\n * const {\n * form, fullPath,\n * label: resolvedLabel,\n * placeholder: resolvedPlaceholder,\n * helperText: resolvedHelperText,\n * required: resolvedRequired,\n * disabled: resolvedDisabled,\n * readOnly: resolvedReadOnly,\n * tooltip: resolvedTooltip,\n * constraints,\n * } = useResolvedFieldProps(name, { label, placeholder, helperText, required, disabled, readOnly, tooltip })\n * // ...\n * }\n * ```\n */\nexport function useResolvedFieldProps(\n name: string | undefined,\n props: BaseFieldProps\n): {\n form: ReturnType<typeof useDeclarativeField>['form']\n fullPath: string\n label: ReactNode\n placeholder: string | undefined\n helperText: ReactNode\n tooltip: FieldTooltipMeta | undefined\n required: boolean | undefined\n disabled: boolean | undefined\n readOnly: boolean | undefined\n /** Automatic constraints from Zod schema (min, max, minLength, maxLength etc.) */\n constraints: ZodConstraints\n /** Options for select fields (from meta.options with i18n translations) */\n options: FieldOptionMeta[] | undefined\n /** HTML autocomplete атрибут (авто-определение по имени поля + meta override) */\n autocomplete: string | undefined\n} {\n const {\n form,\n fullPath,\n meta,\n required: schemaRequired,\n formDisabled,\n formReadOnly,\n constraints,\n } = useDeclarativeField(name)\n\n // Get i18n context (can be null)\n const i18n = useFormI18n()\n const i18nKey = meta?.i18nKey\n\n // Resolve translated values\n // Priority: props > i18n translation > meta fallback\n const resolvedTitle = getLocalizedValue(i18n, i18nKey, 'title', meta?.title)\n const resolvedPlaceholder = getLocalizedValue(i18n, i18nKey, 'placeholder', meta?.placeholder)\n const resolvedDescription = getLocalizedValue(i18n, i18nKey, 'description', meta?.description)\n\n // Automatic hint from constraints (if helperText not explicitly set)\n // Priority: props.helperText > i18n description > meta.description > auto-generated hint\n const autoHint = generateConstraintHint(constraints, i18n?.locale ?? 'en')\n const helperText = props.helperText ?? resolvedDescription ?? autoHint\n\n // Localize options from meta (for select/enum fields)\n const localizedOptions = useLocalizedOptions(meta?.options)\n\n return {\n form,\n fullPath,\n // Props override i18n override schema meta\n label: props.label ?? resolvedTitle,\n placeholder: props.placeholder ?? resolvedPlaceholder,\n helperText,\n // Tooltip from props or schema meta\n tooltip: (props.tooltip ?? meta?.tooltip) as FieldTooltipMeta | undefined,\n // Required from schema or prop\n required: props.required ?? schemaRequired,\n // Form-level + local props (local wins)\n disabled: props.disabled ?? formDisabled,\n readOnly: props.readOnly ?? formReadOnly,\n // Constraints for additional component configuration\n constraints,\n // Options with i18n translations\n options: localizedOptions,\n // HTML autocomplete (авто-определение по имени + meta override)\n autocomplete: resolveAutoComplete(fullPath, meta?.autocomplete),\n }\n}\n","'use client'\n\nimport { Field } from '@chakra-ui/react'\nimport type { AnyFieldApi } from '@tanstack/react-form'\nimport type { ReactElement, ReactNode } from 'react'\nimport { useDeclarativeFormOptional } from '../../form-context'\nimport type { ZodConstraints } from '../../schema-constraints'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { FieldErrorBoundary } from './field-error-boundary'\nimport { FieldLabel } from './field-label'\nimport { formatFieldErrors, hasFieldErrors } from './field-utils'\nimport { useAsyncFieldValidation } from './use-async-field-validation'\nimport { useResolvedFieldProps } from './use-resolved-field-props'\n\n/**\n * Resolved props after applying schema meta and form-level settings\n */\nexport interface ResolvedFieldProps {\n /** Label (from props or schema meta) */\n label: ReactNode\n /** Placeholder */\n placeholder: string | undefined\n /** Helper text below field (can be automatically generated from constraints) */\n helperText: ReactNode\n /** Tooltip with icon */\n tooltip: FieldTooltipMeta | undefined\n /** Required field (from props or schema) */\n required: boolean | undefined\n /** Field disabled (from props or form-level) */\n disabled: boolean | undefined\n /** Read only (from props or form-level) */\n readOnly: boolean | undefined\n /** Automatic constraints from Zod schema (min, max, minLength, maxLength etc.) */\n constraints: ZodConstraints\n /** Options for select fields (from meta.options with i18n translations) */\n options: Array<{ value: string | number; label: string; disabled?: boolean; i18nKey?: string }> | undefined\n /** HTML autocomplete атрибут (авто-определение по имени поля + meta override) */\n autocomplete: string | undefined\n}\n\n/**\n * Props passed to the render function\n */\nexport interface FieldRenderProps<TValue = unknown, TState = Record<string, never>> {\n /** TanStack Form field API */\n field: AnyFieldApi\n /** Typed field value */\n value: TValue\n /** Full path to the field (for example, \"user.address.city\") */\n fullPath: string\n /** Resolved props (label, placeholder, etc.) */\n resolved: ResolvedFieldProps\n /** Whether there are validation errors */\n hasError: boolean\n /** Formatted error message */\n errorMessage: string\n /** Async-валидация в процессе */\n isValidating: boolean\n /** Local component state (from useFieldState) */\n fieldState: TState\n}\n\n/**\n * Render function for createField\n *\n * Receives field API, resolved props, local state and must return full JSX\n * including Field.Root wrapper and error display.\n */\nexport type FieldRenderFn<P extends BaseFieldProps, TValue = unknown, TState = Record<string, never>> = (\n props: FieldRenderProps<TValue, TState> & { componentProps: Omit<P, keyof BaseFieldProps> },\n) => ReactElement\n\n/**\n * Options for createField\n *\n * @template P - Component props type (extends BaseFieldProps)\n * @template TValue - Field value type\n * @template TState - Local state type (from useFieldState)\n */\nexport interface CreateFieldOptions<P extends BaseFieldProps, TValue = unknown, TState = Record<string, never>> {\n /** Name for React DevTools */\n displayName: string\n\n /**\n * Hook for local component state\n *\n * Called at the top level of the component, BEFORE form.Field.\n * Can use useState, useEffect, useCallback, useMemo and other hooks.\n *\n * @param props - Component props (without BaseFieldProps)\n * @param resolved - Resolved props (label, placeholder, etc.)\n * @returns State object that will be passed to render as fieldState\n *\n * @example\n * ```tsx\n * useFieldState: (props) => {\n * const [visible, setVisible] = useState(props.defaultVisible ?? false)\n * return { visible, toggle: () => setVisible((v) => !v) }\n * }\n * ```\n */\n useFieldState?: (componentProps: Omit<P, keyof BaseFieldProps>, resolved: ResolvedFieldProps) => TState\n\n /** Render function (full control over JSX) */\n render: FieldRenderFn<P, TValue, TState>\n}\n\n/**\n * Factory function for creating Field components with minimal boilerplate\n *\n * Automatically:\n * - Resolves props from schema meta and form-level settings\n * - Creates form.Field wrapper\n * - Computes hasError and errorMessage\n * - Calls useFieldState for local state (if provided)\n *\n * @example Simple field (Input, Textarea)\n * ```tsx\n * export const FieldString = createField<StringFieldProps, string>({\n * displayName: 'FieldString',\n * render: ({ field, resolved, hasError, errorMessage }) => (\n * <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage}>\n * <Input\n * value={field.state.value ?? ''}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * />\n * </FieldWrapper>\n * ),\n * })\n * ```\n *\n * @example Field with local state (Password with toggle)\n * ```tsx\n * export const FieldPassword = createField<PasswordFieldProps, string, { visible: boolean; toggle: () => void }>({\n * displayName: 'FieldPassword',\n * useFieldState: (props) => {\n * const [visible, setVisible] = useState(props.defaultVisible ?? false)\n * return { visible, toggle: () => setVisible((v) => !v) }\n * },\n * render: ({ field, resolved, hasError, errorMessage, fieldState }) => (\n * <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage}>\n * <InputGroup endElement={<IconButton onClick={fieldState.toggle}>...</IconButton>}>\n * <Input type={fieldState.visible ? 'text' : 'password'} ... />\n * </InputGroup>\n * </FieldWrapper>\n * ),\n * })\n * ```\n *\n * @example Checkbox with custom label\n * ```tsx\n * export const FieldCheckbox = createField<CheckboxFieldProps, boolean>({\n * displayName: 'FieldCheckbox',\n * render: ({ field, resolved, hasError, errorMessage, componentProps }) => (\n * <Field.Root invalid={hasError} required={resolved.required} disabled={resolved.disabled}>\n * <Checkbox.Root\n * checked={!!field.state.value}\n * onCheckedChange={(e) => field.handleChange(!!e.checked)}\n * colorPalette={componentProps.colorPalette}\n * >\n * <Checkbox.HiddenInput onBlur={field.handleBlur} />\n * <Checkbox.Control />\n * {resolved.label && <Checkbox.Label>{resolved.label}</Checkbox.Label>}\n * </Checkbox.Root>\n * <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n * </Field.Root>\n * ),\n * })\n * ```\n */\nexport function createField<P extends BaseFieldProps, TValue = unknown, TState = Record<string, never>>(\n options: CreateFieldOptions<P, TValue, TState>,\n): (props: P) => ReactElement {\n const { displayName, render } = options\n // Use no-op hook by default so the call is always unconditional\n const useFieldState = options.useFieldState ?? (() => ({}) as TState)\n\n function FieldComponent(props: P): ReactElement {\n const {\n name,\n label,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n tooltip,\n asyncValidate,\n asyncDebounce,\n asyncTrigger,\n ...componentProps\n } = props\n\n const { form, fullPath, ...resolvedRest } = useResolvedFieldProps(name, {\n label,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n tooltip,\n })\n\n const resolved: ResolvedFieldProps = {\n label: resolvedRest.label,\n placeholder: resolvedRest.placeholder,\n helperText: resolvedRest.helperText,\n tooltip: resolvedRest.tooltip,\n required: resolvedRest.required,\n disabled: resolvedRest.disabled,\n readOnly: resolvedRest.readOnly,\n constraints: resolvedRest.constraints,\n options: resolvedRest.options,\n autocomplete: resolvedRest.autocomplete,\n }\n\n // Call useFieldState at the top level (before form.Field)\n // This allows using hooks inside useFieldState\n const fieldState = useFieldState(componentProps as Omit<P, keyof BaseFieldProps>, resolved)\n\n // Async validation (from props or schema meta)\n const declarativeCtx = useDeclarativeFormOptional()\n const asyncValidation = useAsyncFieldValidation(\n declarativeCtx?.schema,\n fullPath,\n asyncValidate ? { asyncValidate, asyncDebounce, asyncTrigger } : undefined,\n )\n\n return (\n <FieldErrorBoundary fieldName={fullPath}>\n <form.Field\n name={fullPath}\n {...(asyncValidation.validators ? { validators: asyncValidation.validators } : {})}\n {...(asyncValidation.asyncDebounceMs ? { asyncDebounceMs: asyncValidation.asyncDebounceMs } : {})}\n >\n {(field: AnyFieldApi) => {\n const errors = field.state.meta.errors\n const isTouched = field.state.meta.isTouched\n // Show errors only if field was touched (after blur or programmatic validation)\n const hasError = isTouched && hasFieldErrors(errors)\n const errorMessage = hasError ? formatFieldErrors(errors) : ''\n\n // Async validation в процессе\n const isValidating = !!field.state.meta.isValidating\n\n return render({\n field,\n value: field.state.value as TValue,\n fullPath,\n resolved,\n hasError,\n errorMessage,\n isValidating,\n fieldState,\n componentProps: componentProps as Omit<P, keyof BaseFieldProps>,\n })\n }}\n </form.Field>\n </FieldErrorBoundary>\n )\n }\n\n FieldComponent.displayName = displayName\n return FieldComponent\n}\n\n/**\n * Component for displaying errors or hints\n *\n * Helper component for use inside createField render functions.\n * Shows error if present, otherwise helperText.\n *\n * @example\n * ```tsx\n * <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n * ```\n */\nexport function FieldError({\n hasError,\n errorMessage,\n helperText,\n isValidating,\n}: {\n hasError: boolean\n errorMessage: string\n helperText: ReactNode\n isValidating?: boolean\n}): ReactElement | null {\n if (isValidating) {\n return <Field.HelperText color=\"blue.500\">⟳ Проверяю...</Field.HelperText>\n }\n if (hasError) {\n return <Field.ErrorText>{errorMessage}</Field.ErrorText>\n }\n if (helperText) {\n return <Field.HelperText>{helperText}</Field.HelperText>\n }\n return null\n}\n\n// Re-export for convenience\nexport { FieldLabel }\n","'use client'\n\nimport { Field } from '@chakra-ui/react'\nimport { memo, type ReactElement, type ReactNode } from 'react'\nimport type { ResolvedFieldProps } from './create-field'\nimport { FieldError } from './create-field'\nimport { FieldLabel } from './field-label'\n\nexport interface FieldWrapperProps {\n /** Resolved props from createField */\n resolved: ResolvedFieldProps\n /** Whether there are validation errors */\n hasError: boolean\n /** Formatted error message */\n errorMessage: string\n /** Full path for data-field-name attribute */\n fullPath: string\n /** Async-валидация в процессе */\n isValidating?: boolean\n /** Field content (Input, Textarea, etc.) */\n children: ReactNode\n}\n\n/**\n * Standard wrapper for simple fields\n *\n * Provides:\n * - Field.Root with invalid/required/disabled/readOnly props\n * - FieldLabel with support for tooltip\n * - FieldError with fallback to helperText\n *\n * Use inside createField render functions for simple Input-like fields\n * with standard layout: Label → Control → Error/Helper\n *\n * @example\n * ```tsx\n * export const FieldString = createField<StringFieldProps, string>({\n * displayName: 'FieldString',\n * render: ({ field, fullPath, resolved, hasError, errorMessage }) => (\n * <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n * <Input\n * value={field.state.value ?? ''}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * placeholder={resolved.placeholder}\n * data-field-name={fullPath}\n * />\n * </FieldWrapper>\n * ),\n * })\n * ```\n */\nexport const FieldWrapper = memo(function FieldWrapper({\n resolved,\n hasError,\n errorMessage,\n isValidating,\n children,\n}: FieldWrapperProps): ReactElement {\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n {children}\n <FieldError\n hasError={hasError}\n errorMessage={errorMessage}\n helperText={resolved.helperText}\n isValidating={isValidating}\n />\n </Field.Root>\n )\n})\n","'use client'\n\nimport { Field, HStack } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { FieldTooltipMeta } from '../../types'\nimport { FieldTooltip } from './field-tooltip'\n\n/**\n * Props for SelectionFieldLabel\n */\nexport interface SelectionFieldLabelProps {\n /** Label text */\n label: ReactNode\n /** Data for tooltip hint */\n tooltip?: FieldTooltipMeta\n /** Show required field indicator */\n required?: boolean\n}\n\n/**\n * Unified label for selection fields (Select, Combobox, Listbox, Autocomplete).\n * Avoids duplicating the HStack + FieldTooltip pattern across 12+ files.\n *\n * @example\n * ```tsx\n * <Select.Label>\n * <SelectionFieldLabel\n * label={resolved.label}\n * tooltip={resolved.tooltip}\n * required={resolved.required}\n * />\n * </Select.Label>\n * ```\n */\nexport function SelectionFieldLabel({ label, tooltip, required }: SelectionFieldLabelProps): ReactElement {\n return (\n <>\n {tooltip ? (\n <HStack gap={1}>\n <span>{label}</span>\n <FieldTooltip {...tooltip} />\n </HStack>\n ) : (\n label\n )}\n {required && <Field.RequiredIndicator />}\n </>\n )\n}\n","'use client'\n\nimport { createListCollection } from '@chakra-ui/react'\nimport type { ReactNode } from 'react'\nimport { useMemo } from 'react'\nimport type { GroupableOption } from '../../types'\n\n/**\n * Result of useGroupedOptions hook\n */\nexport interface GroupedOptionsResult<T = string> {\n /** Collection for Chakra components (Select, Combobox, Listbox) */\n collection: ReturnType<typeof createListCollection<GroupableOption<T>>>\n /** Map groups with options (null if no grouping) */\n groups: Map<string, GroupableOption<T>[]> | null\n}\n\n/**\n * Function to get label from an option\n * Used for itemToString in collection and text rendering\n *\n * @example\n * ```tsx\n * // In collection itemToString\n * createListCollection({ items, itemToString: getOptionLabel })\n *\n * // In rendering\n * <Select.ItemText>{getOptionLabel(option)}</Select.ItemText>\n * ```\n */\nexport function getOptionLabel<T>(item: { label?: string | ReactNode; value: T }): string {\n return typeof item.label === 'string' ? item.label : String(item.value)\n}\n\n/**\n * Hook for creating a collection with optional grouping\n *\n * Encapsulates common logic:\n * - Creating Chakra ListCollection from options\n * - Determining group presence\n * - Grouping options into a Map for rendering\n *\n * @example Usage in Listbox\n * ```tsx\n * const { collection, groups } = useGroupedOptions(options)\n *\n * return (\n * <Listbox.Root collection={collection}>\n * {groups\n * ? Array.from(groups.entries()).map(([name, opts]) => (\n * <Listbox.ItemGroup key={name}>\n * <Listbox.ItemGroupLabel>{name}</Listbox.ItemGroupLabel>\n * {opts.map(opt => <Listbox.Item key={opt.value} item={opt} />)}\n * </Listbox.ItemGroup>\n * ))\n * : options.map(opt => <Listbox.Item key={opt.value} item={opt} />)\n * }\n * </Listbox.Root>\n * )\n * ```\n */\nexport function useGroupedOptions<T = string>(options: GroupableOption<T>[]): GroupedOptionsResult<T> {\n // Create collection with optional grouping\n const collection = useMemo(() => {\n const hasGroups = options.some((opt) => opt.group)\n\n return createListCollection({\n items: options,\n itemToString: getOptionLabel,\n itemToValue: (item) => item.value as string,\n isItemDisabled: (item: GroupableOption<T>) => item.disabled ?? false,\n ...(hasGroups && {\n groupBy: (item: GroupableOption<T>) => item.group ?? '',\n }),\n })\n }, [options])\n\n // Check for groups and create Map\n const groups = useMemo(() => {\n const hasGroups = options.some((opt) => opt.group)\n if (!hasGroups) {\n return null\n }\n\n const groupMap = new Map<string, GroupableOption<T>[]>()\n for (const opt of options) {\n const group = opt.group ?? ''\n const existing = groupMap.get(group) ?? []\n groupMap.set(group, [...existing, opt])\n }\n return groupMap\n }, [options])\n\n return { collection, groups }\n}\n"]}
|
package/fields/boolean.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { FieldCheckbox, FieldSwitch } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { FieldCheckbox, FieldSwitch } from '../chunk-6E7VJAJT.js';
|
|
2
|
+
import '../chunk-XFWLD5EO.js';
|
|
3
|
+
import '../chunk-R2RTCKXY.js';
|
|
4
4
|
//# sourceMappingURL=boolean.js.map
|
|
5
5
|
//# sourceMappingURL=boolean.js.map
|
package/fields/datetime.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { FieldDate, FieldDateRange, FieldDateTimePicker, FieldDuration, FieldSchedule, FieldTime } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { FieldDate, FieldDateRange, FieldDateTimePicker, FieldDuration, FieldSchedule, FieldTime } from '../chunk-Q5EOF36Y.js';
|
|
2
|
+
import '../chunk-XFWLD5EO.js';
|
|
3
|
+
import '../chunk-R2RTCKXY.js';
|
|
4
4
|
//# sourceMappingURL=datetime.js.map
|
|
5
5
|
//# sourceMappingURL=datetime.js.map
|
package/fields/number.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { FieldCurrency, FieldNumber, FieldNumberInput, FieldPercentage, FieldRating, FieldSlider } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { FieldCurrency, FieldNumber, FieldNumberInput, FieldPercentage, FieldRating, FieldSlider } from '../chunk-MZDTJSF7.js';
|
|
2
|
+
import '../chunk-XFWLD5EO.js';
|
|
3
|
+
import '../chunk-R2RTCKXY.js';
|
|
4
4
|
//# sourceMappingURL=number.js.map
|
|
5
5
|
//# sourceMappingURL=number.js.map
|