pdyform 2.2.1 → 2.3.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.
@@ -20,7 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- createFormStore: () => createFormStore,
23
+ createFormEngine: () => createFormEngine,
24
+ createStore: () => createStore,
24
25
  defaultErrorMessages: () => defaultErrorMessages,
25
26
  get: () => get,
26
27
  getDefaultValues: () => getDefaultValues,
@@ -48,6 +49,7 @@ var defaultErrorMessages = {
48
49
  custom: "Invalid value"
49
50
  };
50
51
  function formatMessage(template, field, rule) {
52
+ if (!template) return "";
51
53
  return template.replace("{label}", field.label).replace("{value}", String(rule.value || ""));
52
54
  }
53
55
  function get(obj, path, defaultValue) {
@@ -183,77 +185,103 @@ function getDefaultValues(fields) {
183
185
  }
184
186
 
185
187
  // src/formState.ts
186
- var import_vanilla = require("zustand/vanilla");
187
- function createFormStore(fields, resolver, errorMessages) {
188
- return (0, import_vanilla.createStore)()((set2, getStore) => ({
188
+ function createStore(initialState) {
189
+ let state = initialState;
190
+ const listeners = /* @__PURE__ */ new Set();
191
+ const getState = () => state;
192
+ const setState = (partial) => {
193
+ const nextState = typeof partial === "function" ? partial(state) : partial;
194
+ if (!Object.is(nextState, state)) {
195
+ const prevState = state;
196
+ state = { ...state, ...nextState };
197
+ listeners.forEach((listener) => listener(state, prevState));
198
+ }
199
+ };
200
+ const subscribe = (listener) => {
201
+ listeners.add(listener);
202
+ return () => listeners.delete(listener);
203
+ };
204
+ return { getState, setState, subscribe };
205
+ }
206
+ function createFormEngine(fields, resolver, errorMessages) {
207
+ const store = createStore({
189
208
  values: getDefaultValues(fields),
190
209
  errors: {},
191
210
  validatingFields: [],
192
- isSubmitting: false,
193
- setFieldValue: async (name, rawValue) => {
194
- const field = fields.find((f) => f.name === name);
195
- const normalizedValue = field ? normalizeFieldValue(field, rawValue) : rawValue;
196
- set2((state) => ({
197
- values: set(state.values, name, normalizedValue)
198
- }));
199
- const hasExistingError = !!getStore().errors[name];
200
- const shouldValidateImmediately = field && ["select", "checkbox", "radio", "switch", "date"].includes(field.type);
201
- if (shouldValidateImmediately || hasExistingError) {
202
- set2((state) => ({
203
- validatingFields: [...state.validatingFields, name]
204
- }));
205
- try {
206
- const currentValues = getStore().values;
207
- const error = await validateFieldByName(fields, name, normalizedValue, resolver, currentValues, errorMessages);
208
- set2((state) => ({
209
- errors: { ...state.errors, [name]: error || "" },
210
- validatingFields: state.validatingFields.filter((f) => f !== name)
211
- }));
212
- } catch (err) {
213
- set2((state) => ({
214
- validatingFields: state.validatingFields.filter((f) => f !== name)
215
- }));
216
- }
217
- }
218
- },
219
- setFieldBlur: async (name) => {
220
- set2((state) => ({
221
- validatingFields: [...state.validatingFields, name]
211
+ isSubmitting: false
212
+ });
213
+ const { getState, setState } = store;
214
+ const setFieldValue = async (name, rawValue) => {
215
+ const field = fields.find((f) => f.name === name);
216
+ const normalizedValue = field ? normalizeFieldValue(field, rawValue) : rawValue;
217
+ setState((s) => ({
218
+ values: set(s.values, name, normalizedValue)
219
+ }));
220
+ const hasExistingError = !!getState().errors[name];
221
+ const shouldValidateImmediately = field && ["select", "checkbox", "radio", "switch", "date"].includes(field.type);
222
+ if (shouldValidateImmediately || hasExistingError) {
223
+ setState((s) => ({
224
+ validatingFields: [...s.validatingFields, name]
222
225
  }));
223
226
  try {
224
- const currentValues = getStore().values;
225
- const value = get(currentValues, name);
226
- const error = await validateFieldByName(fields, name, value, resolver, currentValues, errorMessages);
227
- set2((state) => ({
228
- errors: { ...state.errors, [name]: error || "" },
229
- validatingFields: state.validatingFields.filter((f) => f !== name)
227
+ const currentValues = getState().values;
228
+ const error = await validateFieldByName(fields, name, normalizedValue, resolver, currentValues, errorMessages);
229
+ setState((s) => ({
230
+ errors: { ...s.errors, [name]: error || "" },
231
+ validatingFields: s.validatingFields.filter((f) => f !== name)
230
232
  }));
231
- } catch (err) {
232
- set2((state) => ({
233
- validatingFields: state.validatingFields.filter((f) => f !== name)
233
+ } catch {
234
+ setState((s) => ({
235
+ validatingFields: s.validatingFields.filter((f) => f !== name)
234
236
  }));
235
237
  }
236
- },
237
- setSubmitting: (isSubmitting) => set2({ isSubmitting }),
238
- runSubmitValidation: async () => {
239
- set2({ isSubmitting: true });
240
- const state = getStore();
241
- const errors = await validateForm(fields, state.values, resolver, errorMessages);
242
- const hasError = Object.keys(errors).length > 0;
243
- set2({
244
- errors,
245
- isSubmitting: false
246
- });
247
- return {
248
- state: getStore(),
249
- hasError
250
- };
251
238
  }
252
- }));
239
+ };
240
+ const setFieldBlur = async (name) => {
241
+ setState((s) => ({
242
+ validatingFields: [...s.validatingFields, name]
243
+ }));
244
+ try {
245
+ const currentValues = getState().values;
246
+ const value = get(currentValues, name);
247
+ const error = await validateFieldByName(fields, name, value, resolver, currentValues, errorMessages);
248
+ setState((s) => ({
249
+ errors: { ...s.errors, [name]: error || "" },
250
+ validatingFields: s.validatingFields.filter((f) => f !== name)
251
+ }));
252
+ } catch {
253
+ setState((s) => ({
254
+ validatingFields: s.validatingFields.filter((f) => f !== name)
255
+ }));
256
+ }
257
+ };
258
+ const setSubmitting = (isSubmitting) => setState({ isSubmitting });
259
+ const runSubmitValidation = async () => {
260
+ setState({ isSubmitting: true });
261
+ const currentValues = getState().values;
262
+ const errors = await validateForm(fields, currentValues, resolver, errorMessages);
263
+ const hasError = Object.keys(errors).length > 0;
264
+ setState({
265
+ errors,
266
+ isSubmitting: false
267
+ });
268
+ return {
269
+ state: getState(),
270
+ hasError
271
+ };
272
+ };
273
+ return {
274
+ store,
275
+ setFieldValue,
276
+ setFieldBlur,
277
+ setSubmitting,
278
+ runSubmitValidation
279
+ };
253
280
  }
254
281
  // Annotate the CommonJS export names for ESM import in node:
255
282
  0 && (module.exports = {
256
- createFormStore,
283
+ createFormEngine,
284
+ createStore,
257
285
  defaultErrorMessages,
258
286
  get,
259
287
  getDefaultValues,
@@ -1,4 +1,3 @@
1
1
  export { ErrorMessageTemplates, FieldType, FormField, FormResolver, FormSchema, FormState, Option, ValidationRule } from './types.cjs';
2
2
  export { defaultErrorMessages, get, getDefaultValues, normalizeFieldValue, set, validateField, validateFieldByName, validateForm } from './utils.cjs';
3
- export { FormRuntimeState, FormStore, createFormStore } from './formState.cjs';
4
- import 'zustand/vanilla';
3
+ export { FormEngine, FormRuntimeState, StoreListener, VanillaStore, createFormEngine, createStore } from './formState.cjs';
@@ -1,4 +1,3 @@
1
1
  export { ErrorMessageTemplates, FieldType, FormField, FormResolver, FormSchema, FormState, Option, ValidationRule } from './types.js';
2
2
  export { defaultErrorMessages, get, getDefaultValues, normalizeFieldValue, set, validateField, validateFieldByName, validateForm } from './utils.js';
3
- export { FormRuntimeState, FormStore, createFormStore } from './formState.js';
4
- import 'zustand/vanilla';
3
+ export { FormEngine, FormRuntimeState, StoreListener, VanillaStore, createFormEngine, createStore } from './formState.js';
@@ -1,6 +1,7 @@
1
1
  import {
2
- createFormStore
3
- } from "./chunk-J6ESJZ4U.js";
2
+ createFormEngine,
3
+ createStore
4
+ } from "./chunk-V4VK2GZU.js";
4
5
  import "./chunk-6F4PWJZI.js";
5
6
  import {
6
7
  defaultErrorMessages,
@@ -11,9 +12,10 @@ import {
11
12
  validateField,
12
13
  validateFieldByName,
13
14
  validateForm
14
- } from "./chunk-B7OMM2UC.js";
15
+ } from "./chunk-T3LQTNYY.js";
15
16
  export {
16
- createFormStore,
17
+ createFormEngine,
18
+ createStore,
17
19
  defaultErrorMessages,
18
20
  get,
19
21
  getDefaultValues,
@@ -1,9 +1,9 @@
1
1
  type FieldType = 'text' | 'number' | 'email' | 'password' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'date' | 'switch';
2
2
  interface ValidationRule {
3
3
  type: 'required' | 'min' | 'max' | 'pattern' | 'email' | 'custom';
4
- value?: any;
4
+ value?: unknown;
5
5
  message?: string;
6
- validator?: (value: any) => boolean | string | Promise<boolean | string>;
6
+ validator?: (value: unknown) => boolean | string | Promise<boolean | string>;
7
7
  }
8
8
  interface Option {
9
9
  label: string;
@@ -16,14 +16,14 @@ interface FormField {
16
16
  type: FieldType;
17
17
  placeholder?: string;
18
18
  description?: string;
19
- defaultValue?: any;
19
+ defaultValue?: unknown;
20
20
  options?: Option[];
21
21
  validations?: ValidationRule[];
22
- hidden?: boolean | ((values: any) => boolean);
23
- disabled?: boolean | ((values: any) => boolean);
22
+ hidden?: boolean | ((values: Record<string, unknown>) => boolean);
23
+ disabled?: boolean | ((values: Record<string, unknown>) => boolean);
24
24
  className?: string;
25
25
  }
26
- type FormResolver = (values: any) => Record<string, string> | Promise<Record<string, string>>;
26
+ type FormResolver = (values: Record<string, unknown>) => Record<string, string> | Promise<Record<string, string>>;
27
27
  type ErrorMessageTemplates = {
28
28
  required?: string;
29
29
  min?: string;
@@ -41,7 +41,7 @@ interface FormSchema {
41
41
  errorMessages?: ErrorMessageTemplates;
42
42
  }
43
43
  interface FormState {
44
- values: Record<string, any>;
44
+ values: Record<string, unknown>;
45
45
  errors: Record<string, string>;
46
46
  validatingFields: string[];
47
47
  isSubmitting: boolean;
@@ -1,9 +1,9 @@
1
1
  type FieldType = 'text' | 'number' | 'email' | 'password' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'date' | 'switch';
2
2
  interface ValidationRule {
3
3
  type: 'required' | 'min' | 'max' | 'pattern' | 'email' | 'custom';
4
- value?: any;
4
+ value?: unknown;
5
5
  message?: string;
6
- validator?: (value: any) => boolean | string | Promise<boolean | string>;
6
+ validator?: (value: unknown) => boolean | string | Promise<boolean | string>;
7
7
  }
8
8
  interface Option {
9
9
  label: string;
@@ -16,14 +16,14 @@ interface FormField {
16
16
  type: FieldType;
17
17
  placeholder?: string;
18
18
  description?: string;
19
- defaultValue?: any;
19
+ defaultValue?: unknown;
20
20
  options?: Option[];
21
21
  validations?: ValidationRule[];
22
- hidden?: boolean | ((values: any) => boolean);
23
- disabled?: boolean | ((values: any) => boolean);
22
+ hidden?: boolean | ((values: Record<string, unknown>) => boolean);
23
+ disabled?: boolean | ((values: Record<string, unknown>) => boolean);
24
24
  className?: string;
25
25
  }
26
- type FormResolver = (values: any) => Record<string, string> | Promise<Record<string, string>>;
26
+ type FormResolver = (values: Record<string, unknown>) => Record<string, string> | Promise<Record<string, string>>;
27
27
  type ErrorMessageTemplates = {
28
28
  required?: string;
29
29
  min?: string;
@@ -41,7 +41,7 @@ interface FormSchema {
41
41
  errorMessages?: ErrorMessageTemplates;
42
42
  }
43
43
  interface FormState {
44
- values: Record<string, any>;
44
+ values: Record<string, unknown>;
45
45
  errors: Record<string, string>;
46
46
  validatingFields: string[];
47
47
  isSubmitting: boolean;
@@ -45,6 +45,7 @@ var defaultErrorMessages = {
45
45
  custom: "Invalid value"
46
46
  };
47
47
  function formatMessage(template, field, rule) {
48
+ if (!template) return "";
48
49
  return template.replace("{label}", field.label).replace("{value}", String(rule.value || ""));
49
50
  }
50
51
  function get(obj, path, defaultValue) {
@@ -7,15 +7,15 @@ declare const defaultErrorMessages: Required<ErrorMessageTemplates>;
7
7
  /**
8
8
  * Simple get utility for nested objects
9
9
  */
10
- declare function get(obj: any, path: string, defaultValue?: any): any;
10
+ declare function get(obj: Record<string, unknown> | null | undefined, path: string, defaultValue?: unknown): unknown;
11
11
  /**
12
12
  * Simple set utility for nested objects that returns a new object (immutable)
13
13
  */
14
- declare function set(obj: any, path: string, value: any): any;
14
+ declare function set(obj: Record<string, unknown> | null | undefined, path: string, value: unknown): Record<string, unknown>;
15
15
  declare function normalizeFieldValue(field: FormField, value: unknown): unknown;
16
- declare function validateField(value: any, field: FormField, customMessages?: ErrorMessageTemplates): Promise<string | null>;
17
- declare function validateFieldByName(fields: FormField[], name: string, value: unknown, resolver?: FormResolver, allValues?: any, customMessages?: ErrorMessageTemplates): Promise<string | null>;
18
- declare function validateForm(fields: FormField[], values: Record<string, any>, resolver?: FormResolver, customMessages?: ErrorMessageTemplates): Promise<Record<string, string>>;
19
- declare function getDefaultValues(fields: FormField[]): Record<string, any>;
16
+ declare function validateField(value: unknown, field: FormField, customMessages?: ErrorMessageTemplates): Promise<string | null>;
17
+ declare function validateFieldByName(fields: FormField[], name: string, value: unknown, resolver?: FormResolver, allValues?: Record<string, unknown>, customMessages?: ErrorMessageTemplates): Promise<string | null>;
18
+ declare function validateForm(fields: FormField[], values: Record<string, unknown>, resolver?: FormResolver, customMessages?: ErrorMessageTemplates): Promise<Record<string, string>>;
19
+ declare function getDefaultValues(fields: FormField[]): Record<string, unknown>;
20
20
 
21
21
  export { defaultErrorMessages, get, getDefaultValues, normalizeFieldValue, set, validateField, validateFieldByName, validateForm };
@@ -7,15 +7,15 @@ declare const defaultErrorMessages: Required<ErrorMessageTemplates>;
7
7
  /**
8
8
  * Simple get utility for nested objects
9
9
  */
10
- declare function get(obj: any, path: string, defaultValue?: any): any;
10
+ declare function get(obj: Record<string, unknown> | null | undefined, path: string, defaultValue?: unknown): unknown;
11
11
  /**
12
12
  * Simple set utility for nested objects that returns a new object (immutable)
13
13
  */
14
- declare function set(obj: any, path: string, value: any): any;
14
+ declare function set(obj: Record<string, unknown> | null | undefined, path: string, value: unknown): Record<string, unknown>;
15
15
  declare function normalizeFieldValue(field: FormField, value: unknown): unknown;
16
- declare function validateField(value: any, field: FormField, customMessages?: ErrorMessageTemplates): Promise<string | null>;
17
- declare function validateFieldByName(fields: FormField[], name: string, value: unknown, resolver?: FormResolver, allValues?: any, customMessages?: ErrorMessageTemplates): Promise<string | null>;
18
- declare function validateForm(fields: FormField[], values: Record<string, any>, resolver?: FormResolver, customMessages?: ErrorMessageTemplates): Promise<Record<string, string>>;
19
- declare function getDefaultValues(fields: FormField[]): Record<string, any>;
16
+ declare function validateField(value: unknown, field: FormField, customMessages?: ErrorMessageTemplates): Promise<string | null>;
17
+ declare function validateFieldByName(fields: FormField[], name: string, value: unknown, resolver?: FormResolver, allValues?: Record<string, unknown>, customMessages?: ErrorMessageTemplates): Promise<string | null>;
18
+ declare function validateForm(fields: FormField[], values: Record<string, unknown>, resolver?: FormResolver, customMessages?: ErrorMessageTemplates): Promise<Record<string, string>>;
19
+ declare function getDefaultValues(fields: FormField[]): Record<string, unknown>;
20
20
 
21
21
  export { defaultErrorMessages, get, getDefaultValues, normalizeFieldValue, set, validateField, validateFieldByName, validateForm };
@@ -7,7 +7,7 @@ import {
7
7
  validateField,
8
8
  validateFieldByName,
9
9
  validateForm
10
- } from "./chunk-B7OMM2UC.js";
10
+ } from "./chunk-T3LQTNYY.js";
11
11
  export {
12
12
  defaultErrorMessages,
13
13
  get,
@@ -1 +1 @@
1
- "use strict";var Ve=Object.create;var W=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Le=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Be=(e,t)=>{for(var r in t)W(e,r,{get:t[r],enumerable:!0})},de=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ee(t))!Me.call(e,o)&&o!==r&&W(e,o,{get:()=>t[o],enumerable:!(i=Ge(t,o))||i.enumerable});return e};var u=(e,t,r)=>(r=e!=null?Ve(Le(e)):{},de(t||!e||!e.__esModule?W(r,"default",{value:e,enumerable:!0}):r,e)),$e=e=>de(W({},"__esModule",{value:!0}),e);var Ke={};Be(Ke,{Checkbox:()=>G,CheckboxRenderer:()=>Y,DateRenderer:()=>_,DynamicForm:()=>Je,FormFieldRenderer:()=>ne,Input:()=>N,InputRenderer:()=>v,Label:()=>R,RadioGroup:()=>B,RadioGroupItem:()=>$,RadioRenderer:()=>Z,Select:()=>O,SelectContent:()=>A,SelectGroup:()=>J,SelectItem:()=>H,SelectRenderer:()=>X,SelectTrigger:()=>D,SelectValue:()=>K,Switch:()=>L,SwitchRenderer:()=>j,Textarea:()=>T,TextareaRenderer:()=>Q,defaultComponentMap:()=>ee,useForm:()=>se});module.exports=$e(Ke);var Ie=require("pdyform-core");var pe=u(require("react"),1);var me=require("clsx"),ce=require("tailwind-merge");function l(...e){return(0,ce.twMerge)((0,me.clsx)(e))}var fe=require("react/jsx-runtime"),N=pe.forwardRef(({className:e,type:t,...r},i)=>(0,fe.jsx)("input",{type:t,className:l("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:i,...r}));N.displayName="Input";var ue=u(require("react"),1);var be=require("react/jsx-runtime"),T=ue.forwardRef(({className:e,...t},r)=>(0,be.jsx)("textarea",{className:l("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...t}));T.displayName="Textarea";var Re=u(require("react"),1),V=u(require("@radix-ui/react-checkbox"),1),ve=require("lucide-react");var q=require("react/jsx-runtime"),G=Re.forwardRef(({className:e,...t},r)=>(0,q.jsx)(V.Root,{ref:r,className:l("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:(0,q.jsx)(V.Indicator,{className:l("flex items-center justify-center text-current"),children:(0,q.jsx)(ve.Check,{className:"h-4 w-4"})})}));G.displayName=V.Root.displayName;var ge=u(require("react"),1),E=u(require("@radix-ui/react-switch"),1);var re=require("react/jsx-runtime"),L=ge.forwardRef(({className:e,...t},r)=>(0,re.jsx)(E.Root,{className:l("peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:r,children:(0,re.jsx)(E.Thumb,{className:l("pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0")})}));L.displayName=E.Root.displayName;var oe=u(require("react"),1),S=u(require("@radix-ui/react-radio-group"),1),xe=require("lucide-react");var M=require("react/jsx-runtime"),B=oe.forwardRef(({className:e,...t},r)=>(0,M.jsx)(S.Root,{className:l("grid gap-2",e),...t,ref:r}));B.displayName=S.Root.displayName;var $=oe.forwardRef(({className:e,...t},r)=>(0,M.jsx)(S.Item,{ref:r,className:l("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...t,children:(0,M.jsx)(S.Indicator,{className:"flex items-center justify-center",children:(0,M.jsx)(xe.Circle,{className:"h-2.5 w-2.5 fill-current text-current"})})}));$.displayName=S.Item.displayName;var U=u(require("react"),1),a=u(require("@radix-ui/react-select"),1),z=require("lucide-react");var f=require("react/jsx-runtime"),O=a.Root,J=a.Group,K=a.Value,D=U.forwardRef(({className:e,children:t,...r},i)=>(0,f.jsxs)(a.Trigger,{ref:i,className:l("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...r,children:[t,(0,f.jsx)(a.Icon,{asChild:!0,children:(0,f.jsx)(z.ChevronDown,{className:"h-4 w-4 opacity-50"})})]}));D.displayName=a.Trigger.displayName;var A=U.forwardRef(({className:e,children:t,position:r="popper",...i},o)=>(0,f.jsx)(a.Portal,{children:(0,f.jsx)(a.Content,{ref:o,className:l("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",r==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:r,...i,children:(0,f.jsx)(a.Viewport,{className:l("p-1",r==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t})})}));A.displayName=a.Content.displayName;var H=U.forwardRef(({className:e,children:t,...r},i)=>(0,f.jsxs)(a.Item,{ref:i,className:l("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...r,children:[(0,f.jsx)("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:(0,f.jsx)(a.ItemIndicator,{children:(0,f.jsx)(z.Check,{className:"h-4 w-4"})})}),(0,f.jsx)(a.ItemText,{children:t})]}));H.displayName=a.Item.displayName;var ye=u(require("react"),1),ie=u(require("@radix-ui/react-label"),1),he=require("class-variance-authority");var Se=require("react/jsx-runtime"),De=(0,he.cva)("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),R=ye.forwardRef(({className:e,...t},r)=>(0,Se.jsx)(ie.Root,{ref:r,className:l(De(),e),...t}));R.displayName=ie.Root.displayName;var Ce=require("pdyform-core");var Fe=require("react/jsx-runtime"),Ae=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:s,ariaRequired:n,ariaDescribedBy:d})=>{let c=p=>{r((0,Ce.normalizeFieldValue)(e,p))};return(0,Fe.jsx)(N,{id:o,type:e.type,placeholder:e.placeholder,value:t??"",onChange:p=>c(p.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":s,"aria-required":n,"aria-describedby":d})},v=Ae;var Pe=require("react/jsx-runtime"),He=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>(0,Pe.jsx)(T,{id:o,placeholder:e.placeholder,value:t??"",onChange:s=>r(s.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name}),Q=He;var C=require("react/jsx-runtime"),We=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>(0,C.jsxs)(O,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,children:[(0,C.jsx)(D,{id:o,onBlur:i,children:(0,C.jsx)(K,{placeholder:e.placeholder||"Select an option"})}),(0,C.jsx)(A,{children:(0,C.jsx)(J,{children:e.options?.map(s=>(0,C.jsx)(H,{value:String(s.value),children:s.label},s.value))})})]}),X=We;var I=require("react/jsx-runtime"),qe=({field:e,value:t,onChange:r,onBlur:i})=>(0,I.jsx)("div",{className:"flex flex-wrap gap-4",children:e.options?.map(o=>{let s=Array.isArray(t)&&t.includes(o.value);return(0,I.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,I.jsx)(G,{id:`checkbox-${e.name}-${o.value}`,checked:s,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,onCheckedChange:n=>{let d=Array.isArray(t)?[...t]:[];if(n)d.push(o.value);else{let c=d.indexOf(o.value);c>-1&&d.splice(c,1)}r(d)},onBlur:i}),(0,I.jsx)(R,{htmlFor:`checkbox-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value)})}),Y=qe;var k=require("react/jsx-runtime"),Ue=({field:e,value:t,onChange:r,onBlur:i})=>(0,k.jsx)(B,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,className:"flex flex-wrap gap-4",children:e.options?.map(o=>(0,k.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,k.jsx)($,{value:String(o.value),id:`radio-${e.name}-${o.value}`,onBlur:i}),(0,k.jsx)(R,{htmlFor:`radio-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value))}),Z=Ue;var we=require("react/jsx-runtime"),ze=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:s,ariaRequired:n,ariaDescribedBy:d})=>(0,we.jsx)(N,{id:o,type:"date",value:t??"",onChange:c=>r(c.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":s,"aria-required":n,"aria-describedby":d}),_=ze;var ae=require("react/jsx-runtime"),Oe=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:s,ariaRequired:n,ariaDescribedBy:d})=>(0,ae.jsx)("div",{className:"flex items-center space-x-2",children:(0,ae.jsx)(L,{id:o,checked:!!t,onCheckedChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":s,"aria-required":n,"aria-describedby":d})}),j=Oe;var ee={text:v,number:v,password:v,email:v,textarea:Q,select:X,checkbox:Y,radio:Z,date:_,switch:j};var F=require("react/jsx-runtime"),ne=({field:e,value:t,onChange:r,onBlur:i,error:o,componentMap:s})=>{let{label:n,description:d,name:c,type:p,validations:m}=e,b=`field-${c}`,g=`${b}-description`,x=`${b}-error`,y=m?.some(Te=>Te.type==="required"),le=(s?{...ee,...s}:ee)[p]??v,ke=[d?g:null,o?x:null].filter(Boolean).join(" ");return(0,F.jsxs)("div",{className:`space-y-2 ${e.className||""}`,children:[n&&(0,F.jsxs)(R,{htmlFor:b,className:y?"flex items-center gap-1":"",children:[n,y&&(0,F.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,F.jsx)(le,{field:e,value:t,onChange:r,onBlur:i,fieldId:b,errorId:x,descriptionId:g,ariaInvalid:!!o,ariaRequired:y,ariaDescribedBy:ke||void 0}),d&&(0,F.jsx)("p",{id:g,className:"text-[0.8rem] text-muted-foreground",children:d}),o&&(0,F.jsx)("p",{id:x,className:"text-[0.8rem] font-medium text-destructive",children:o})]})};var P=require("react"),Ne=require("zustand"),te=require("pdyform-core");function se({schema:e}){let t=(0,P.useMemo)(()=>(0,te.createFormStore)(e.fields,e.resolver,e.errorMessages),[e]),r=(0,Ne.useStore)(t),i=(0,P.useCallback)(async(c,p)=>{await t.getState().setFieldValue(c,p)},[t]),o=(0,P.useCallback)(c=>(0,te.get)(t.getState().values,c),[t]),s=(0,P.useCallback)((c,p)=>{t.setState(m=>({errors:{...m.errors,[c]:p}}))},[t]),n=(0,P.useCallback)(async()=>{let{hasError:c,state:p}=await t.getState().runSubmitValidation();return{hasError:c,values:p.values,state:p}},[t]),d=(0,P.useCallback)(()=>{t.setState({values:{},errors:{},isSubmitting:!1})},[t]);return{store:t,state:r,setValue:i,getValue:o,setError:s,validate:n,reset:d}}var w=require("react/jsx-runtime"),Je=({schema:e,onSubmit:t,className:r,form:i})=>{let o=se({schema:e}),s=i||o,{state:n,store:d}=s,c=async m=>{m.preventDefault();try{let{hasError:b,values:g,state:x}=await s.validate();if(console.log("has error =>",b,g,x),b){let y=e.fields.find(h=>!(typeof h.hidden=="function"?h.hidden(n.values):h.hidden)&&x.errors[h.name]);if(y){let h=document.getElementById(`field-${y.name}`);h?.focus(),h?.scrollIntoView({behavior:"smooth",block:"center"})}return}await t(g)}catch(b){console.error("Submission error:",b)}},p=n.validatingFields.length>0;return(0,w.jsxs)("form",{onSubmit:c,className:`space-y-6 ${r||""}`,children:[e.title&&(0,w.jsx)("h2",{className:"text-2xl font-bold tracking-tight",children:e.title}),e.description&&(0,w.jsx)("p",{className:"text-muted-foreground",children:e.description}),(0,w.jsx)("div",{className:"space-y-4",children:e.fields.map(m=>{let b=typeof m.hidden=="function"?m.hidden(n.values):m.hidden,g=typeof m.disabled=="function"?m.disabled(n.values):m.disabled,x=n.validatingFields.includes(m.name);return!b&&(0,w.jsx)(ne,{field:{...m,disabled:g||x},value:(0,Ie.get)(n.values,m.name),onChange:y=>d.getState().setFieldValue(m.name,y),onBlur:()=>d.getState().setFieldBlur(m.name),error:n.errors[m.name]},m.name)})}),(0,w.jsx)("button",{type:"submit",disabled:n.isSubmitting||p,className:"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2 w-full",children:n.isSubmitting?"Submitting...":p?"Validating...":e.submitButtonText||"Submit"})]})};0&&(module.exports={Checkbox,CheckboxRenderer,DateRenderer,DynamicForm,FormFieldRenderer,Input,InputRenderer,Label,RadioGroup,RadioGroupItem,RadioRenderer,Select,SelectContent,SelectGroup,SelectItem,SelectRenderer,SelectTrigger,SelectValue,Switch,SwitchRenderer,Textarea,TextareaRenderer,defaultComponentMap,useForm});
1
+ "use strict";var Te=Object.create;var q=Object.defineProperty;var Ve=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Ge=Object.getPrototypeOf,Le=Object.prototype.hasOwnProperty;var Me=(e,t)=>{for(var r in t)q(e,r,{get:t[r],enumerable:!0})},de=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ee(t))!Le.call(e,o)&&o!==r&&q(e,o,{get:()=>t[o],enumerable:!(i=Ve(t,o))||i.enumerable});return e};var b=(e,t,r)=>(r=e!=null?Te(Ge(e)):{},de(t||!e||!e.__esModule?q(r,"default",{value:e,enumerable:!0}):r,e)),Be=e=>de(q({},"__esModule",{value:!0}),e);var Je={};Me(Je,{Checkbox:()=>E,CheckboxRenderer:()=>Z,DateRenderer:()=>j,DynamicForm:()=>Oe,FormFieldRenderer:()=>ne,Input:()=>N,InputRenderer:()=>g,Label:()=>v,RadioGroup:()=>B,RadioGroupItem:()=>$,RadioRenderer:()=>_,Select:()=>J,SelectContent:()=>W,SelectGroup:()=>K,SelectItem:()=>A,SelectRenderer:()=>Y,SelectTrigger:()=>D,SelectValue:()=>Q,Switch:()=>L,SwitchRenderer:()=>ee,Textarea:()=>T,TextareaRenderer:()=>X,defaultComponentMap:()=>te,useForm:()=>se});module.exports=Be(Je);var Ne=require("pdyform-core");var pe=b(require("react"),1);var me=require("clsx"),ce=require("tailwind-merge");function m(...e){return(0,ce.twMerge)((0,me.clsx)(e))}var ue=require("react/jsx-runtime"),N=pe.forwardRef(({className:e,type:t,...r},i)=>(0,ue.jsx)("input",{type:t,className:m("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:i,...r}));N.displayName="Input";var fe=b(require("react"),1);var be=require("react/jsx-runtime"),T=fe.forwardRef(({className:e,...t},r)=>(0,be.jsx)("textarea",{className:m("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...t}));T.displayName="Textarea";var Re=b(require("react"),1),V=b(require("@radix-ui/react-checkbox"),1),ve=require("lucide-react");var U=require("react/jsx-runtime"),E=Re.forwardRef(({className:e,...t},r)=>(0,U.jsx)(V.Root,{ref:r,className:m("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:(0,U.jsx)(V.Indicator,{className:m("flex items-center justify-center text-current"),children:(0,U.jsx)(ve.Check,{className:"h-4 w-4"})})}));E.displayName=V.Root.displayName;var ge=b(require("react"),1),G=b(require("@radix-ui/react-switch"),1);var re=require("react/jsx-runtime"),L=ge.forwardRef(({className:e,...t},r)=>(0,re.jsx)(G.Root,{className:m("peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:r,children:(0,re.jsx)(G.Thumb,{className:m("pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0")})}));L.displayName=G.Root.displayName;var oe=b(require("react"),1),C=b(require("@radix-ui/react-radio-group"),1),ye=require("lucide-react");var M=require("react/jsx-runtime"),B=oe.forwardRef(({className:e,...t},r)=>(0,M.jsx)(C.Root,{className:m("grid gap-2",e),...t,ref:r}));B.displayName=C.Root.displayName;var $=oe.forwardRef(({className:e,...t},r)=>(0,M.jsx)(C.Item,{ref:r,className:m("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...t,children:(0,M.jsx)(C.Indicator,{className:"flex items-center justify-center",children:(0,M.jsx)(ye.Circle,{className:"h-2.5 w-2.5 fill-current text-current"})})}));$.displayName=C.Item.displayName;var z=b(require("react"),1),n=b(require("@radix-ui/react-select"),1),O=require("lucide-react");var u=require("react/jsx-runtime"),J=n.Root,K=n.Group,Q=n.Value,D=z.forwardRef(({className:e,children:t,...r},i)=>(0,u.jsxs)(n.Trigger,{ref:i,className:m("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...r,children:[t,(0,u.jsx)(n.Icon,{asChild:!0,children:(0,u.jsx)(O.ChevronDown,{className:"h-4 w-4 opacity-50"})})]}));D.displayName=n.Trigger.displayName;var W=z.forwardRef(({className:e,children:t,position:r="popper",...i},o)=>(0,u.jsx)(n.Portal,{children:(0,u.jsx)(n.Content,{ref:o,className:m("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",r==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:r,...i,children:(0,u.jsx)(n.Viewport,{className:m("p-1",r==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t})})}));W.displayName=n.Content.displayName;var A=z.forwardRef(({className:e,children:t,...r},i)=>(0,u.jsxs)(n.Item,{ref:i,className:m("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...r,children:[(0,u.jsx)("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:(0,u.jsx)(n.ItemIndicator,{children:(0,u.jsx)(O.Check,{className:"h-4 w-4"})})}),(0,u.jsx)(n.ItemText,{children:t})]}));A.displayName=n.Item.displayName;var xe=b(require("react"),1),ie=b(require("@radix-ui/react-label"),1),he=require("class-variance-authority");var Se=require("react/jsx-runtime"),$e=(0,he.cva)("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),v=xe.forwardRef(({className:e,...t},r)=>(0,Se.jsx)(ie.Root,{ref:r,className:m($e(),e),...t}));v.displayName=ie.Root.displayName;var Ce=require("pdyform-core");var Fe=require("react/jsx-runtime"),De=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:l,ariaRequired:s,ariaDescribedBy:c})=>{let f=d=>{r((0,Ce.normalizeFieldValue)(e,d))};return(0,Fe.jsx)(N,{id:o,type:e.type,placeholder:e.placeholder,value:t??"",onChange:d=>f(d.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":l,"aria-required":s,"aria-describedby":c})},g=De;var Pe=require("react/jsx-runtime"),We=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>(0,Pe.jsx)(T,{id:o,placeholder:e.placeholder,value:t??"",onChange:l=>r(l.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name}),X=We;var F=require("react/jsx-runtime"),Ae=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>(0,F.jsxs)(J,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,children:[(0,F.jsx)(D,{id:o,onBlur:i,children:(0,F.jsx)(Q,{placeholder:e.placeholder||"Select an option"})}),(0,F.jsx)(W,{children:(0,F.jsx)(K,{children:e.options?.map(l=>(0,F.jsx)(A,{value:String(l.value),children:l.label},l.value))})})]}),Y=Ae;var I=require("react/jsx-runtime"),He=({field:e,value:t,onChange:r,onBlur:i})=>(0,I.jsx)("div",{className:"flex flex-wrap gap-4",children:e.options?.map(o=>{let l=Array.isArray(t)&&t.includes(o.value);return(0,I.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,I.jsx)(E,{id:`checkbox-${e.name}-${o.value}`,checked:l,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,onCheckedChange:s=>{let c=Array.isArray(t)?[...t]:[];if(s)c.push(o.value);else{let f=c.indexOf(o.value);f>-1&&c.splice(f,1)}r(c)},onBlur:i}),(0,I.jsx)(v,{htmlFor:`checkbox-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value)})}),Z=He;var k=require("react/jsx-runtime"),qe=({field:e,value:t,onChange:r,onBlur:i})=>(0,k.jsx)(B,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,className:"flex flex-wrap gap-4",children:e.options?.map(o=>(0,k.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,k.jsx)($,{value:String(o.value),id:`radio-${e.name}-${o.value}`,onBlur:i}),(0,k.jsx)(v,{htmlFor:`radio-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value))}),_=qe;var we=require("react/jsx-runtime"),Ue=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:l,ariaRequired:s,ariaDescribedBy:c})=>(0,we.jsx)(N,{id:o,type:"date",value:t??"",onChange:f=>r(f.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":l,"aria-required":s,"aria-describedby":c}),j=Ue;var ae=require("react/jsx-runtime"),ze=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:l,ariaRequired:s,ariaDescribedBy:c})=>(0,ae.jsx)("div",{className:"flex items-center space-x-2",children:(0,ae.jsx)(L,{id:o,checked:!!t,onCheckedChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":l,"aria-required":s,"aria-describedby":c})}),ee=ze;var te={text:g,number:g,password:g,email:g,textarea:X,select:Y,checkbox:Z,radio:_,date:j,switch:ee};var P=require("react/jsx-runtime"),ne=({field:e,value:t,onChange:r,onBlur:i,error:o,componentMap:l})=>{let{label:s,description:c,name:f,type:d,validations:a}=e,p=`field-${f}`,y=`${p}-description`,x=`${p}-error`,h=a?.some(ke=>ke.type==="required"),le=(l?{...te,...l}:te)[d]??g,Ie=[c?y:null,o?x:null].filter(Boolean).join(" ");return(0,P.jsxs)("div",{className:`space-y-2 ${e.className||""}`,children:[s&&(0,P.jsxs)(v,{htmlFor:p,className:h?"flex items-center gap-1":"",children:[s,h&&(0,P.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,P.jsx)(le,{field:e,value:t,onChange:r,onBlur:i,fieldId:p,errorId:x,descriptionId:y,ariaInvalid:!!o,ariaRequired:h,ariaDescribedBy:Ie||void 0}),c&&(0,P.jsx)("p",{id:y,className:"text-[0.8rem] text-muted-foreground",children:c}),o&&(0,P.jsx)("p",{id:x,className:"text-[0.8rem] font-medium text-destructive",children:o})]})};var R=require("react"),H=require("pdyform-core");function se({schema:e}){let t=(0,R.useMemo)(()=>(0,H.createFormEngine)(e.fields,e.resolver,e.errorMessages),[e]),r=(0,R.useSyncExternalStore)(d=>t.store.subscribe(d),t.store.getState),i=(0,R.useCallback)(d=>(0,R.useSyncExternalStore)(a=>t.store.subscribe(a),()=>(0,H.get)(t.store.getState().values,d)),[t]),o=(0,R.useCallback)(async(d,a)=>{await t.setFieldValue(d,a)},[t]),l=(0,R.useCallback)(d=>(0,H.get)(t.store.getState().values,d),[t]),s=(0,R.useCallback)((d,a)=>{t.store.setState(p=>({errors:{...p.errors,[d]:a}}))},[t]),c=(0,R.useCallback)(async()=>{let{hasError:d,state:a}=await t.runSubmitValidation();return{hasError:d,values:a.values,state:a}},[t]),f=(0,R.useCallback)(()=>{t.store.setState({values:{},errors:{},isSubmitting:!1})},[t]);return{engine:t,state:r,setValue:o,getValue:l,setError:s,validate:c,reset:f,useWatch:i}}var w=require("react/jsx-runtime"),Oe=({schema:e,onSubmit:t,className:r,form:i})=>{let o=se({schema:e}),l=i||o,{state:s,engine:c}=l,f=async a=>{a.preventDefault();try{let{hasError:p,values:y,state:x}=await l.validate();if(console.log("has error =>",p,y,x),p){let h=e.fields.find(S=>!(typeof S.hidden=="function"?S.hidden(s.values):S.hidden)&&x.errors[S.name]);if(h){let S=document.getElementById(`field-${h.name}`);S?.focus(),S?.scrollIntoView({behavior:"smooth",block:"center"})}return}await t(y)}catch(p){console.error("Submission error:",p)}},d=s.validatingFields.length>0;return(0,w.jsxs)("form",{onSubmit:f,className:`space-y-6 ${r||""}`,children:[e.title&&(0,w.jsx)("h2",{className:"text-2xl font-bold tracking-tight",children:e.title}),e.description&&(0,w.jsx)("p",{className:"text-muted-foreground",children:e.description}),(0,w.jsx)("div",{className:"space-y-4",children:e.fields.map(a=>{let p=typeof a.hidden=="function"?a.hidden(s.values):a.hidden,y=typeof a.disabled=="function"?a.disabled(s.values):a.disabled,x=s.validatingFields.includes(a.name);return!p&&(0,w.jsx)(ne,{field:{...a,disabled:y||x},value:(0,Ne.get)(s.values,a.name),onChange:h=>c.setFieldValue(a.name,h),onBlur:()=>c.setFieldBlur(a.name),error:s.errors[a.name]},a.name)})}),(0,w.jsx)("button",{type:"submit",disabled:s.isSubmitting||d,className:"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2 w-full",children:s.isSubmitting?"Submitting...":d?"Validating...":e.submitButtonText||"Submit"})]})};0&&(module.exports={Checkbox,CheckboxRenderer,DateRenderer,DynamicForm,FormFieldRenderer,Input,InputRenderer,Label,RadioGroup,RadioGroupItem,RadioRenderer,Select,SelectContent,SelectGroup,SelectItem,SelectRenderer,SelectTrigger,SelectValue,Switch,SwitchRenderer,Textarea,TextareaRenderer,defaultComponentMap,useForm});
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import React__default from 'react';
3
- import { createFormStore, FormStore, FormRuntimeState, FormSchema, FormField } from 'pdyform-core';
3
+ import { FormEngine, FormRuntimeState, FormSchema, FormField } from 'pdyform-core';
4
4
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
5
5
  import * as class_variance_authority_types from 'class-variance-authority/types';
6
6
  import * as LabelPrimitive from '@radix-ui/react-label';
@@ -13,8 +13,8 @@ interface UseFormOptions {
13
13
  schema: FormSchema;
14
14
  }
15
15
  interface UseFormReturn {
16
- store: ReturnType<typeof createFormStore>;
17
- state: FormStore;
16
+ engine: FormEngine;
17
+ state: FormRuntimeState;
18
18
  setValue: (name: string, value: any) => Promise<void>;
19
19
  getValue: (name: string) => any;
20
20
  setError: (name: string, error: string) => void;
@@ -24,6 +24,7 @@ interface UseFormReturn {
24
24
  state: FormRuntimeState;
25
25
  }>;
26
26
  reset: () => void;
27
+ useWatch: (name: string) => any;
27
28
  }
28
29
  declare function useForm({ schema }: UseFormOptions): UseFormReturn;
29
30
 
@@ -35,12 +36,10 @@ interface DynamicFormProps {
35
36
  }
36
37
  declare const DynamicForm: React__default.FC<DynamicFormProps>;
37
38
 
38
- interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
39
- }
39
+ type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
40
40
  declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
41
41
 
42
- interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
43
- }
42
+ type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>;
44
43
  declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
45
44
 
46
45
  declare const Checkbox: React.ForwardRefExoticComponent<Omit<CheckboxPrimitive.CheckboxProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import React__default from 'react';
3
- import { createFormStore, FormStore, FormRuntimeState, FormSchema, FormField } from 'pdyform-core';
3
+ import { FormEngine, FormRuntimeState, FormSchema, FormField } from 'pdyform-core';
4
4
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
5
5
  import * as class_variance_authority_types from 'class-variance-authority/types';
6
6
  import * as LabelPrimitive from '@radix-ui/react-label';
@@ -13,8 +13,8 @@ interface UseFormOptions {
13
13
  schema: FormSchema;
14
14
  }
15
15
  interface UseFormReturn {
16
- store: ReturnType<typeof createFormStore>;
17
- state: FormStore;
16
+ engine: FormEngine;
17
+ state: FormRuntimeState;
18
18
  setValue: (name: string, value: any) => Promise<void>;
19
19
  getValue: (name: string) => any;
20
20
  setError: (name: string, error: string) => void;
@@ -24,6 +24,7 @@ interface UseFormReturn {
24
24
  state: FormRuntimeState;
25
25
  }>;
26
26
  reset: () => void;
27
+ useWatch: (name: string) => any;
27
28
  }
28
29
  declare function useForm({ schema }: UseFormOptions): UseFormReturn;
29
30
 
@@ -35,12 +36,10 @@ interface DynamicFormProps {
35
36
  }
36
37
  declare const DynamicForm: React__default.FC<DynamicFormProps>;
37
38
 
38
- interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
39
- }
39
+ type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
40
40
  declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
41
41
 
42
- interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
43
- }
42
+ type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>;
44
43
  declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
45
44
 
46
45
  declare const Checkbox: React.ForwardRefExoticComponent<Omit<CheckboxPrimitive.CheckboxProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
@@ -1 +1 @@
1
- import{get as Ue}from"pdyform-core";import*as te from"react";import{clsx as ue}from"clsx";import{twMerge as be}from"tailwind-merge";function l(...e){return be(ue(e))}import{jsx as Re}from"react/jsx-runtime";var S=te.forwardRef(({className:e,type:t,...r},i)=>Re("input",{type:t,className:l("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:i,...r}));S.displayName="Input";import*as re from"react";import{jsx as ve}from"react/jsx-runtime";var I=re.forwardRef(({className:e,...t},r)=>ve("textarea",{className:l("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...t}));I.displayName="Textarea";import*as oe from"react";import*as C from"@radix-ui/react-checkbox";import{Check as ge}from"lucide-react";import{jsx as A}from"react/jsx-runtime";var k=oe.forwardRef(({className:e,...t},r)=>A(C.Root,{ref:r,className:l("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:A(C.Indicator,{className:l("flex items-center justify-center text-current"),children:A(ge,{className:"h-4 w-4"})})}));k.displayName=C.Root.displayName;import*as ae from"react";import*as F from"@radix-ui/react-switch";import{jsx as ie}from"react/jsx-runtime";var T=ae.forwardRef(({className:e,...t},r)=>ie(F.Root,{className:l("peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:r,children:ie(F.Thumb,{className:l("pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0")})}));T.displayName=F.Root.displayName;import*as H from"react";import*as x from"@radix-ui/react-radio-group";import{Circle as xe}from"lucide-react";import{jsx as V}from"react/jsx-runtime";var G=H.forwardRef(({className:e,...t},r)=>V(x.Root,{className:l("grid gap-2",e),...t,ref:r}));G.displayName=x.Root.displayName;var E=H.forwardRef(({className:e,...t},r)=>V(x.Item,{ref:r,className:l("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...t,children:V(x.Indicator,{className:"flex items-center justify-center",children:V(xe,{className:"h-2.5 w-2.5 fill-current text-current"})})}));E.displayName=x.Item.displayName;import*as L from"react";import*as a from"@radix-ui/react-select";import{Check as ye,ChevronDown as he}from"lucide-react";import{jsx as u,jsxs as ne}from"react/jsx-runtime";var W=a.Root,q=a.Group,U=a.Value,M=L.forwardRef(({className:e,children:t,...r},i)=>ne(a.Trigger,{ref:i,className:l("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...r,children:[t,u(a.Icon,{asChild:!0,children:u(he,{className:"h-4 w-4 opacity-50"})})]}));M.displayName=a.Trigger.displayName;var B=L.forwardRef(({className:e,children:t,position:r="popper",...i},o)=>u(a.Portal,{children:u(a.Content,{ref:o,className:l("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",r==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:r,...i,children:u(a.Viewport,{className:l("p-1",r==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t})})}));B.displayName=a.Content.displayName;var $=L.forwardRef(({className:e,children:t,...r},i)=>ne(a.Item,{ref:i,className:l("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...r,children:[u("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:u(a.ItemIndicator,{children:u(ye,{className:"h-4 w-4"})})}),u(a.ItemText,{children:t})]}));$.displayName=a.Item.displayName;import*as se from"react";import*as z from"@radix-ui/react-label";import{cva as Se}from"class-variance-authority";import{jsx as Fe}from"react/jsx-runtime";var Ce=Se("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),y=se.forwardRef(({className:e,...t},r)=>Fe(z.Root,{ref:r,className:l(Ce(),e),...t}));y.displayName=z.Root.displayName;import{normalizeFieldValue as Pe}from"pdyform-core";import{jsx as Ne}from"react/jsx-runtime";var we=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:s,ariaRequired:n,ariaDescribedBy:d})=>{let c=p=>{r(Pe(e,p))};return Ne(S,{id:o,type:e.type,placeholder:e.placeholder,value:t??"",onChange:p=>c(p.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":s,"aria-required":n,"aria-describedby":d})},h=we;import{jsx as ke}from"react/jsx-runtime";var Ie=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>ke(I,{id:o,placeholder:e.placeholder,value:t??"",onChange:s=>r(s.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name}),O=Ie;import{jsx as P,jsxs as Ve}from"react/jsx-runtime";var Te=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>Ve(W,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,children:[P(M,{id:o,onBlur:i,children:P(U,{placeholder:e.placeholder||"Select an option"})}),P(B,{children:P(q,{children:e.options?.map(s=>P($,{value:String(s.value),children:s.label},s.value))})})]}),J=Te;import{jsx as K,jsxs as Ee}from"react/jsx-runtime";var Ge=({field:e,value:t,onChange:r,onBlur:i})=>K("div",{className:"flex flex-wrap gap-4",children:e.options?.map(o=>{let s=Array.isArray(t)&&t.includes(o.value);return Ee("div",{className:"flex items-center space-x-2",children:[K(k,{id:`checkbox-${e.name}-${o.value}`,checked:s,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,onCheckedChange:n=>{let d=Array.isArray(t)?[...t]:[];if(n)d.push(o.value);else{let c=d.indexOf(o.value);c>-1&&d.splice(c,1)}r(d)},onBlur:i}),K(y,{htmlFor:`checkbox-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value)})}),Q=Ge;import{jsx as X,jsxs as Me}from"react/jsx-runtime";var Le=({field:e,value:t,onChange:r,onBlur:i})=>X(G,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,className:"flex flex-wrap gap-4",children:e.options?.map(o=>Me("div",{className:"flex items-center space-x-2",children:[X(E,{value:String(o.value),id:`radio-${e.name}-${o.value}`,onBlur:i}),X(y,{htmlFor:`radio-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value))}),Y=Le;import{jsx as $e}from"react/jsx-runtime";var Be=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:s,ariaRequired:n,ariaDescribedBy:d})=>$e(S,{id:o,type:"date",value:t??"",onChange:c=>r(c.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":s,"aria-required":n,"aria-describedby":d}),Z=Be;import{jsx as le}from"react/jsx-runtime";var De=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:s,ariaRequired:n,ariaDescribedBy:d})=>le("div",{className:"flex items-center space-x-2",children:le(T,{id:o,checked:!!t,onCheckedChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":s,"aria-required":n,"aria-describedby":d})}),_=De;var j={text:h,number:h,password:h,email:h,textarea:O,select:J,checkbox:Q,radio:Y,date:Z,switch:_};import{jsx as D,jsxs as de}from"react/jsx-runtime";var me=({field:e,value:t,onChange:r,onBlur:i,error:o,componentMap:s})=>{let{label:n,description:d,name:c,type:p,validations:m}=e,f=`field-${c}`,b=`${f}-description`,R=`${f}-error`,v=m?.some(fe=>fe.type==="required"),ee=(s?{...j,...s}:j)[p]??h,pe=[d?b:null,o?R:null].filter(Boolean).join(" ");return de("div",{className:`space-y-2 ${e.className||""}`,children:[n&&de(y,{htmlFor:f,className:v?"flex items-center gap-1":"",children:[n,v&&D("span",{className:"text-destructive",children:"*"})]}),D(ee,{field:e,value:t,onChange:r,onBlur:i,fieldId:f,errorId:R,descriptionId:b,ariaInvalid:!!o,ariaRequired:v,ariaDescribedBy:pe||void 0}),d&&D("p",{id:b,className:"text-[0.8rem] text-muted-foreground",children:d}),o&&D("p",{id:R,className:"text-[0.8rem] font-medium text-destructive",children:o})]})};import{useMemo as Ae,useCallback as w}from"react";import{useStore as He}from"zustand";import{createFormStore as We,get as qe}from"pdyform-core";function ce({schema:e}){let t=Ae(()=>We(e.fields,e.resolver,e.errorMessages),[e]),r=He(t),i=w(async(c,p)=>{await t.getState().setFieldValue(c,p)},[t]),o=w(c=>qe(t.getState().values,c),[t]),s=w((c,p)=>{t.setState(m=>({errors:{...m.errors,[c]:p}}))},[t]),n=w(async()=>{let{hasError:c,state:p}=await t.getState().runSubmitValidation();return{hasError:c,values:p.values,state:p}},[t]),d=w(()=>{t.setState({values:{},errors:{},isSubmitting:!1})},[t]);return{store:t,state:r,setValue:i,getValue:o,setError:s,validate:n,reset:d}}import{jsx as N,jsxs as ze}from"react/jsx-runtime";var Ir=({schema:e,onSubmit:t,className:r,form:i})=>{let o=ce({schema:e}),s=i||o,{state:n,store:d}=s,c=async m=>{m.preventDefault();try{let{hasError:f,values:b,state:R}=await s.validate();if(console.log("has error =>",f,b,R),f){let v=e.fields.find(g=>!(typeof g.hidden=="function"?g.hidden(n.values):g.hidden)&&R.errors[g.name]);if(v){let g=document.getElementById(`field-${v.name}`);g?.focus(),g?.scrollIntoView({behavior:"smooth",block:"center"})}return}await t(b)}catch(f){console.error("Submission error:",f)}},p=n.validatingFields.length>0;return ze("form",{onSubmit:c,className:`space-y-6 ${r||""}`,children:[e.title&&N("h2",{className:"text-2xl font-bold tracking-tight",children:e.title}),e.description&&N("p",{className:"text-muted-foreground",children:e.description}),N("div",{className:"space-y-4",children:e.fields.map(m=>{let f=typeof m.hidden=="function"?m.hidden(n.values):m.hidden,b=typeof m.disabled=="function"?m.disabled(n.values):m.disabled,R=n.validatingFields.includes(m.name);return!f&&N(me,{field:{...m,disabled:b||R},value:Ue(n.values,m.name),onChange:v=>d.getState().setFieldValue(m.name,v),onBlur:()=>d.getState().setFieldBlur(m.name),error:n.errors[m.name]},m.name)})}),N("button",{type:"submit",disabled:n.isSubmitting||p,className:"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2 w-full",children:n.isSubmitting?"Submitting...":p?"Validating...":e.submitButtonText||"Submit"})]})};export{k as Checkbox,Q as CheckboxRenderer,Z as DateRenderer,Ir as DynamicForm,me as FormFieldRenderer,S as Input,h as InputRenderer,y as Label,G as RadioGroup,E as RadioGroupItem,Y as RadioRenderer,W as Select,B as SelectContent,q as SelectGroup,$ as SelectItem,J as SelectRenderer,M as SelectTrigger,U as SelectValue,T as Switch,_ as SwitchRenderer,I as Textarea,O as TextareaRenderer,j as defaultComponentMap,ce as useForm};
1
+ import{get as Ue}from"pdyform-core";import*as te from"react";import{clsx as Re}from"clsx";import{twMerge as ve}from"tailwind-merge";function m(...e){return ve(Re(e))}import{jsx as ge}from"react/jsx-runtime";var S=te.forwardRef(({className:e,type:t,...r},i)=>ge("input",{type:t,className:m("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:i,...r}));S.displayName="Input";import*as re from"react";import{jsx as ye}from"react/jsx-runtime";var I=re.forwardRef(({className:e,...t},r)=>ye("textarea",{className:m("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...t}));I.displayName="Textarea";import*as oe from"react";import*as F from"@radix-ui/react-checkbox";import{Check as xe}from"lucide-react";import{jsx as W}from"react/jsx-runtime";var k=oe.forwardRef(({className:e,...t},r)=>W(F.Root,{ref:r,className:m("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:W(F.Indicator,{className:m("flex items-center justify-center text-current"),children:W(xe,{className:"h-4 w-4"})})}));k.displayName=F.Root.displayName;import*as ae from"react";import*as P from"@radix-ui/react-switch";import{jsx as ie}from"react/jsx-runtime";var T=ae.forwardRef(({className:e,...t},r)=>ie(P.Root,{className:m("peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:r,children:ie(P.Thumb,{className:m("pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0")})}));T.displayName=P.Root.displayName;import*as A from"react";import*as y from"@radix-ui/react-radio-group";import{Circle as he}from"lucide-react";import{jsx as V}from"react/jsx-runtime";var E=A.forwardRef(({className:e,...t},r)=>V(y.Root,{className:m("grid gap-2",e),...t,ref:r}));E.displayName=y.Root.displayName;var G=A.forwardRef(({className:e,...t},r)=>V(y.Item,{ref:r,className:m("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...t,children:V(y.Indicator,{className:"flex items-center justify-center",children:V(he,{className:"h-2.5 w-2.5 fill-current text-current"})})}));G.displayName=y.Item.displayName;import*as L from"react";import*as n from"@radix-ui/react-select";import{Check as Se,ChevronDown as Ce}from"lucide-react";import{jsx as f,jsxs as ne}from"react/jsx-runtime";var H=n.Root,q=n.Group,U=n.Value,M=L.forwardRef(({className:e,children:t,...r},i)=>ne(n.Trigger,{ref:i,className:m("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),...r,children:[t,f(n.Icon,{asChild:!0,children:f(Ce,{className:"h-4 w-4 opacity-50"})})]}));M.displayName=n.Trigger.displayName;var B=L.forwardRef(({className:e,children:t,position:r="popper",...i},o)=>f(n.Portal,{children:f(n.Content,{ref:o,className:m("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",r==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:r,...i,children:f(n.Viewport,{className:m("p-1",r==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t})})}));B.displayName=n.Content.displayName;var $=L.forwardRef(({className:e,children:t,...r},i)=>ne(n.Item,{ref:i,className:m("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...r,children:[f("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f(n.ItemIndicator,{children:f(Se,{className:"h-4 w-4"})})}),f(n.ItemText,{children:t})]}));$.displayName=n.Item.displayName;import*as se from"react";import*as z from"@radix-ui/react-label";import{cva as Fe}from"class-variance-authority";import{jsx as we}from"react/jsx-runtime";var Pe=Fe("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),x=se.forwardRef(({className:e,...t},r)=>we(z.Root,{ref:r,className:m(Pe(),e),...t}));x.displayName=z.Root.displayName;import{normalizeFieldValue as Ne}from"pdyform-core";import{jsx as ke}from"react/jsx-runtime";var Ie=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:l,ariaRequired:s,ariaDescribedBy:c})=>{let u=d=>{r(Ne(e,d))};return ke(S,{id:o,type:e.type,placeholder:e.placeholder,value:t??"",onChange:d=>u(d.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":l,"aria-required":s,"aria-describedby":c})},h=Ie;import{jsx as Ve}from"react/jsx-runtime";var Te=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>Ve(I,{id:o,placeholder:e.placeholder,value:t??"",onChange:l=>r(l.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name}),O=Te;import{jsx as w,jsxs as Ge}from"react/jsx-runtime";var Ee=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>Ge(H,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,children:[w(M,{id:o,onBlur:i,children:w(U,{placeholder:e.placeholder||"Select an option"})}),w(B,{children:w(q,{children:e.options?.map(l=>w($,{value:String(l.value),children:l.label},l.value))})})]}),J=Ee;import{jsx as K,jsxs as Me}from"react/jsx-runtime";var Le=({field:e,value:t,onChange:r,onBlur:i})=>K("div",{className:"flex flex-wrap gap-4",children:e.options?.map(o=>{let l=Array.isArray(t)&&t.includes(o.value);return Me("div",{className:"flex items-center space-x-2",children:[K(k,{id:`checkbox-${e.name}-${o.value}`,checked:l,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,onCheckedChange:s=>{let c=Array.isArray(t)?[...t]:[];if(s)c.push(o.value);else{let u=c.indexOf(o.value);u>-1&&c.splice(u,1)}r(c)},onBlur:i}),K(x,{htmlFor:`checkbox-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value)})}),Q=Le;import{jsx as X,jsxs as $e}from"react/jsx-runtime";var Be=({field:e,value:t,onChange:r,onBlur:i})=>X(E,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,className:"flex flex-wrap gap-4",children:e.options?.map(o=>$e("div",{className:"flex items-center space-x-2",children:[X(G,{value:String(o.value),id:`radio-${e.name}-${o.value}`,onBlur:i}),X(x,{htmlFor:`radio-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value))}),Y=Be;import{jsx as We}from"react/jsx-runtime";var De=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:l,ariaRequired:s,ariaDescribedBy:c})=>We(S,{id:o,type:"date",value:t??"",onChange:u=>r(u.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":l,"aria-required":s,"aria-describedby":c}),Z=De;import{jsx as le}from"react/jsx-runtime";var Ae=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:l,ariaRequired:s,ariaDescribedBy:c})=>le("div",{className:"flex items-center space-x-2",children:le(T,{id:o,checked:!!t,onCheckedChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":l,"aria-required":s,"aria-describedby":c})}),_=Ae;var j={text:h,number:h,password:h,email:h,textarea:O,select:J,checkbox:Q,radio:Y,date:Z,switch:_};import{jsx as D,jsxs as de}from"react/jsx-runtime";var me=({field:e,value:t,onChange:r,onBlur:i,error:o,componentMap:l})=>{let{label:s,description:c,name:u,type:d,validations:a}=e,p=`field-${u}`,b=`${p}-description`,R=`${p}-error`,v=a?.some(be=>be.type==="required"),ee=(l?{...j,...l}:j)[d]??h,fe=[c?b:null,o?R:null].filter(Boolean).join(" ");return de("div",{className:`space-y-2 ${e.className||""}`,children:[s&&de(x,{htmlFor:p,className:v?"flex items-center gap-1":"",children:[s,v&&D("span",{className:"text-destructive",children:"*"})]}),D(ee,{field:e,value:t,onChange:r,onBlur:i,fieldId:p,errorId:R,descriptionId:b,ariaInvalid:!!o,ariaRequired:v,ariaDescribedBy:fe||void 0}),c&&D("p",{id:b,className:"text-[0.8rem] text-muted-foreground",children:c}),o&&D("p",{id:R,className:"text-[0.8rem] font-medium text-destructive",children:o})]})};import{useMemo as He,useCallback as C,useSyncExternalStore as ce}from"react";import{createFormEngine as qe,get as pe}from"pdyform-core";function ue({schema:e}){let t=He(()=>qe(e.fields,e.resolver,e.errorMessages),[e]),r=ce(d=>t.store.subscribe(d),t.store.getState),i=C(d=>ce(a=>t.store.subscribe(a),()=>pe(t.store.getState().values,d)),[t]),o=C(async(d,a)=>{await t.setFieldValue(d,a)},[t]),l=C(d=>pe(t.store.getState().values,d),[t]),s=C((d,a)=>{t.store.setState(p=>({errors:{...p.errors,[d]:a}}))},[t]),c=C(async()=>{let{hasError:d,state:a}=await t.runSubmitValidation();return{hasError:d,values:a.values,state:a}},[t]),u=C(()=>{t.store.setState({values:{},errors:{},isSubmitting:!1})},[t]);return{engine:t,state:r,setValue:o,getValue:l,setError:s,validate:c,reset:u,useWatch:i}}import{jsx as N,jsxs as ze}from"react/jsx-runtime";var Nr=({schema:e,onSubmit:t,className:r,form:i})=>{let o=ue({schema:e}),l=i||o,{state:s,engine:c}=l,u=async a=>{a.preventDefault();try{let{hasError:p,values:b,state:R}=await l.validate();if(console.log("has error =>",p,b,R),p){let v=e.fields.find(g=>!(typeof g.hidden=="function"?g.hidden(s.values):g.hidden)&&R.errors[g.name]);if(v){let g=document.getElementById(`field-${v.name}`);g?.focus(),g?.scrollIntoView({behavior:"smooth",block:"center"})}return}await t(b)}catch(p){console.error("Submission error:",p)}},d=s.validatingFields.length>0;return ze("form",{onSubmit:u,className:`space-y-6 ${r||""}`,children:[e.title&&N("h2",{className:"text-2xl font-bold tracking-tight",children:e.title}),e.description&&N("p",{className:"text-muted-foreground",children:e.description}),N("div",{className:"space-y-4",children:e.fields.map(a=>{let p=typeof a.hidden=="function"?a.hidden(s.values):a.hidden,b=typeof a.disabled=="function"?a.disabled(s.values):a.disabled,R=s.validatingFields.includes(a.name);return!p&&N(me,{field:{...a,disabled:b||R},value:Ue(s.values,a.name),onChange:v=>c.setFieldValue(a.name,v),onBlur:()=>c.setFieldBlur(a.name),error:s.errors[a.name]},a.name)})}),N("button",{type:"submit",disabled:s.isSubmitting||d,className:"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2 w-full",children:s.isSubmitting?"Submitting...":d?"Validating...":e.submitButtonText||"Submit"})]})};export{k as Checkbox,Q as CheckboxRenderer,Z as DateRenderer,Nr as DynamicForm,me as FormFieldRenderer,S as Input,h as InputRenderer,x as Label,E as RadioGroup,G as RadioGroupItem,Y as RadioRenderer,H as Select,B as SelectContent,q as SelectGroup,$ as SelectItem,J as SelectRenderer,M as SelectTrigger,U as SelectValue,T as Switch,_ as SwitchRenderer,I as Textarea,O as TextareaRenderer,j as defaultComponentMap,ue as useForm};