pdyform 2.2.0 → 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) {
@@ -167,6 +169,8 @@ async function validateForm(fields, values, resolver, customMessages) {
167
169
  }
168
170
  const validationPromises = fields.map(async (field) => {
169
171
  if (errors[field.name]) return;
172
+ const isHidden = typeof field.hidden === "function" ? field.hidden(values) : field.hidden;
173
+ if (isHidden) return;
170
174
  const error = await validateField(get(values, field.name), field, customMessages);
171
175
  if (error) errors[field.name] = error;
172
176
  });
@@ -181,71 +185,103 @@ function getDefaultValues(fields) {
181
185
  }
182
186
 
183
187
  // src/formState.ts
184
- var import_vanilla = require("zustand/vanilla");
185
- function createFormStore(fields, resolver, errorMessages) {
186
- 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({
187
208
  values: getDefaultValues(fields),
188
209
  errors: {},
189
210
  validatingFields: [],
190
- isSubmitting: false,
191
- setFieldValue: async (name, rawValue) => {
192
- const field = fields.find((f) => f.name === name);
193
- const normalizedValue = field ? normalizeFieldValue(field, rawValue) : rawValue;
194
- set2((state) => ({
195
- values: set(state.values, name, normalizedValue),
196
- 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]
197
225
  }));
198
226
  try {
199
- const currentValues = getStore().values;
227
+ const currentValues = getState().values;
200
228
  const error = await validateFieldByName(fields, name, normalizedValue, resolver, currentValues, errorMessages);
201
- set2((state) => ({
202
- errors: { ...state.errors, [name]: error || "" },
203
- validatingFields: state.validatingFields.filter((f) => f !== name)
229
+ setState((s) => ({
230
+ errors: { ...s.errors, [name]: error || "" },
231
+ validatingFields: s.validatingFields.filter((f) => f !== name)
204
232
  }));
205
- } catch (err) {
206
- set2((state) => ({
207
- validatingFields: state.validatingFields.filter((f) => f !== name)
233
+ } catch {
234
+ setState((s) => ({
235
+ validatingFields: s.validatingFields.filter((f) => f !== name)
208
236
  }));
209
237
  }
210
- },
211
- setFieldBlur: async (name) => {
212
- set2((state) => ({
213
- validatingFields: [...state.validatingFields, name]
238
+ }
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)
214
255
  }));
215
- try {
216
- const currentValues = getStore().values;
217
- const value = get(currentValues, name);
218
- const error = await validateFieldByName(fields, name, value, resolver, currentValues, errorMessages);
219
- set2((state) => ({
220
- errors: { ...state.errors, [name]: error || "" },
221
- validatingFields: state.validatingFields.filter((f) => f !== name)
222
- }));
223
- } catch (err) {
224
- set2((state) => ({
225
- validatingFields: state.validatingFields.filter((f) => f !== name)
226
- }));
227
- }
228
- },
229
- setSubmitting: (isSubmitting) => set2({ isSubmitting }),
230
- runSubmitValidation: async () => {
231
- set2({ isSubmitting: true });
232
- const state = getStore();
233
- const errors = await validateForm(fields, state.values, resolver, errorMessages);
234
- const hasError = Object.keys(errors).length > 0;
235
- set2({
236
- errors,
237
- isSubmitting: false
238
- });
239
- return {
240
- state: getStore(),
241
- hasError
242
- };
243
256
  }
244
- }));
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
+ };
245
280
  }
246
281
  // Annotate the CommonJS export names for ESM import in node:
247
282
  0 && (module.exports = {
248
- createFormStore,
283
+ createFormEngine,
284
+ createStore,
249
285
  defaultErrorMessages,
250
286
  get,
251
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-REHKL5VH.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-KA6QUMVR.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) {
@@ -164,6 +165,8 @@ async function validateForm(fields, values, resolver, customMessages) {
164
165
  }
165
166
  const validationPromises = fields.map(async (field) => {
166
167
  if (errors[field.name]) return;
168
+ const isHidden = typeof field.hidden === "function" ? field.hidden(values) : field.hidden;
169
+ if (isHidden) return;
167
170
  const error = await validateField(get(values, field.name), field, customMessages);
168
171
  if (error) errors[field.name] = error;
169
172
  });
@@ -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-KA6QUMVR.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 q=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)q(e,r,{get:t[r],enumerable:!0})},le=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ee(t))!Me.call(e,o)&&o!==r&&q(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)):{},le(t||!e||!e.__esModule?q(r,"default",{value:e,enumerable:!0}):r,e)),$e=e=>le(q({},"__esModule",{value:!0}),e);var Ke={};Be(Ke,{Checkbox:()=>G,CheckboxRenderer:()=>Y,DateRenderer:()=>_,DynamicForm:()=>Je,FormFieldRenderer:()=>ne,Input:()=>w,InputRenderer:()=>R,Label:()=>b,RadioGroup:()=>B,RadioGroupItem:()=>$,RadioRenderer:()=>Z,Select:()=>O,SelectContent:()=>A,SelectGroup:()=>J,SelectItem:()=>W,SelectRenderer:()=>X,SelectTrigger:()=>D,SelectValue:()=>K,Switch:()=>L,SwitchRenderer:()=>j,Textarea:()=>T,TextareaRenderer:()=>Q,defaultComponentMap:()=>ee,useForm:()=>se});module.exports=$e(Ke);var Ne=require("pdyform-core");var ce=u(require("react"),1);var de=require("clsx"),me=require("tailwind-merge");function l(...e){return(0,me.twMerge)((0,de.clsx)(e))}var pe=require("react/jsx-runtime"),w=ce.forwardRef(({className:e,type:t,...r},i)=>(0,pe.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}));w.displayName="Input";var fe=u(require("react"),1);var ue=require("react/jsx-runtime"),T=fe.forwardRef(({className:e,...t},r)=>(0,ue.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 be=u(require("react"),1),V=u(require("@radix-ui/react-checkbox"),1),Re=require("lucide-react");var H=require("react/jsx-runtime"),G=be.forwardRef(({className:e,...t},r)=>(0,H.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,H.jsx)(V.Indicator,{className:l("flex items-center justify-center text-current"),children:(0,H.jsx)(Re.Check,{className:"h-4 w-4"})})}));G.displayName=V.Root.displayName;var ve=u(require("react"),1),E=u(require("@radix-ui/react-switch"),1);var re=require("react/jsx-runtime"),L=ve.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),x=u(require("@radix-ui/react-radio-group"),1),ge=require("lucide-react");var M=require("react/jsx-runtime"),B=oe.forwardRef(({className:e,...t},r)=>(0,M.jsx)(x.Root,{className:l("grid gap-2",e),...t,ref:r}));B.displayName=x.Root.displayName;var $=oe.forwardRef(({className:e,...t},r)=>(0,M.jsx)(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:(0,M.jsx)(x.Indicator,{className:"flex items-center justify-center",children:(0,M.jsx)(ge.Circle,{className:"h-2.5 w-2.5 fill-current text-current"})})}));$.displayName=x.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 W=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})]}));W.displayName=a.Item.displayName;var xe=u(require("react"),1),ie=u(require("@radix-ui/react-label"),1),ye=require("class-variance-authority");var he=require("react/jsx-runtime"),De=(0,ye.cva)("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),b=xe.forwardRef(({className:e,...t},r)=>(0,he.jsx)(ie.Root,{ref:r,className:l(De(),e),...t}));b.displayName=ie.Root.displayName;var Se=require("pdyform-core");var Ce=require("react/jsx-runtime"),Ae=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:n,ariaRequired:s,ariaDescribedBy:d})=>{let c=p=>{r((0,Se.normalizeFieldValue)(e,p))};return(0,Ce.jsx)(w,{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":n,"aria-required":s,"aria-describedby":d})},R=Ae;var Fe=require("react/jsx-runtime"),We=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>(0,Fe.jsx)(T,{id:o,placeholder:e.placeholder,value:t??"",onChange:n=>r(n.target.value),onBlur:i,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name}),Q=We;var y=require("react/jsx-runtime"),qe=({field:e,value:t,onChange:r,onBlur:i,fieldId:o})=>(0,y.jsxs)(O,{value:t!=null?String(t):"",onValueChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,children:[(0,y.jsx)(D,{id:o,onBlur:i,children:(0,y.jsx)(K,{placeholder:e.placeholder||"Select an option"})}),(0,y.jsx)(A,{children:(0,y.jsx)(J,{children:e.options?.map(n=>(0,y.jsx)(W,{value:String(n.value),children:n.label},n.value))})})]}),X=qe;var N=require("react/jsx-runtime"),He=({field:e,value:t,onChange:r,onBlur:i})=>(0,N.jsx)("div",{className:"flex flex-wrap gap-4",children:e.options?.map(o=>{let n=Array.isArray(t)&&t.includes(o.value);return(0,N.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,N.jsx)(G,{id:`checkbox-${e.name}-${o.value}`,checked:n,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,onCheckedChange:s=>{let d=Array.isArray(t)?[...t]:[];if(s)d.push(o.value);else{let c=d.indexOf(o.value);c>-1&&d.splice(c,1)}r(d)},onBlur:i}),(0,N.jsx)(b,{htmlFor:`checkbox-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value)})}),Y=He;var I=require("react/jsx-runtime"),Ue=({field:e,value:t,onChange:r,onBlur:i})=>(0,I.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,I.jsxs)("div",{className:"flex items-center space-x-2",children:[(0,I.jsx)($,{value:String(o.value),id:`radio-${e.name}-${o.value}`,onBlur:i}),(0,I.jsx)(b,{htmlFor:`radio-${e.name}-${o.value}`,className:"font-normal",children:o.label})]},o.value))}),Z=Ue;var Pe=require("react/jsx-runtime"),ze=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:n,ariaRequired:s,ariaDescribedBy:d})=>(0,Pe.jsx)(w,{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":n,"aria-required":s,"aria-describedby":d}),_=ze;var ae=require("react/jsx-runtime"),Oe=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:n,ariaRequired:s,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":n,"aria-required":s,"aria-describedby":d})}),j=Oe;var ee={text:R,number:R,password:R,email:R,textarea:Q,select:X,checkbox:Y,radio:Z,date:_,switch:j};var h=require("react/jsx-runtime"),ne=({field:e,value:t,onChange:r,onBlur:i,error:o,componentMap:n})=>{let{label:s,description:d,name:c,type:p,validations:m}=e,v=`field-${c}`,F=`${v}-description`,P=`${v}-error`,g=m?.some(Te=>Te.type==="required"),Ie=(n?{...ee,...n}:ee)[p]??R,ke=[d?F:null,o?P:null].filter(Boolean).join(" ");return(0,h.jsxs)("div",{className:`space-y-2 ${e.className||""}`,children:[s&&(0,h.jsxs)(b,{htmlFor:v,className:g?"flex items-center gap-1":"",children:[s,g&&(0,h.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,h.jsx)(Ie,{field:e,value:t,onChange:r,onBlur:i,fieldId:v,errorId:P,descriptionId:F,ariaInvalid:!!o,ariaRequired:g,ariaDescribedBy:ke||void 0}),d&&(0,h.jsx)("p",{id:F,className:"text-[0.8rem] text-muted-foreground",children:d}),o&&(0,h.jsx)("p",{id:P,className:"text-[0.8rem] font-medium text-destructive",children:o})]})};var S=require("react"),we=require("zustand"),te=require("pdyform-core");function se({schema:e}){let t=(0,S.useMemo)(()=>(0,te.createFormStore)(e.fields,e.resolver,e.errorMessages),[e]),r=(0,we.useStore)(t),i=(0,S.useCallback)(async(c,p)=>{await t.getState().setFieldValue(c,p)},[t]),o=(0,S.useCallback)(c=>(0,te.get)(t.getState().values,c),[t]),n=(0,S.useCallback)((c,p)=>{t.setState(m=>({errors:{...m.errors,[c]:p}}))},[t]),s=(0,S.useCallback)(async()=>{let{hasError:c,state:p}=await t.getState().runSubmitValidation();return{hasError:c,values:p.values,state:p}},[t]),d=(0,S.useCallback)(()=>{t.setState({values:{},errors:{},isSubmitting:!1})},[t]);return{store:t,state:r,setValue:i,getValue:o,setError:n,validate:s,reset:d}}var C=require("react/jsx-runtime"),Je=({schema:e,onSubmit:t,className:r,form:i})=>{let o=se({schema:e}),n=i||o,{state:s,store:d}=n,c=async m=>{m.preventDefault();let{hasError:v,values:F,state:P}=await n.validate();if(v){let g=e.fields.find(k=>P.errors[k.name]);if(g){let k=document.getElementById(`field-${g.name}`);k?.focus(),k?.scrollIntoView({behavior:"smooth",block:"center"})}return}t(F)},p=s.validatingFields.length>0;return(0,C.jsxs)("form",{onSubmit:c,className:`space-y-6 ${r||""}`,children:[e.title&&(0,C.jsx)("h2",{className:"text-2xl font-bold tracking-tight",children:e.title}),e.description&&(0,C.jsx)("p",{className:"text-muted-foreground",children:e.description}),(0,C.jsx)("div",{className:"space-y-4",children:e.fields.map(m=>{let v=typeof m.hidden=="function"?m.hidden(s.values):m.hidden,F=typeof m.disabled=="function"?m.disabled(s.values):m.disabled,P=s.validatingFields.includes(m.name);return!v&&(0,C.jsx)(ne,{field:{...m,disabled:F||P},value:(0,Ne.get)(s.values,m.name),onChange:g=>d.getState().setFieldValue(m.name,g),onBlur:()=>d.getState().setFieldBlur(m.name),error:s.errors[m.name]},m.name)})}),(0,C.jsx)("button",{type:"submit",disabled:s.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:s.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 ee 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 h=ee.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}));h.displayName="Input";import*as te from"react";import{jsx as ve}from"react/jsx-runtime";var I=te.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 re 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=re.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 ie from"react";import*as F from"@radix-ui/react-switch";import{jsx as oe}from"react/jsx-runtime";var T=ie.forwardRef(({className:e,...t},r)=>oe(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:oe(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 W from"react";import*as R from"@radix-ui/react-radio-group";import{Circle as xe}from"lucide-react";import{jsx as V}from"react/jsx-runtime";var G=W.forwardRef(({className:e,...t},r)=>V(R.Root,{className:l("grid gap-2",e),...t,ref:r}));G.displayName=R.Root.displayName;var E=W.forwardRef(({className:e,...t},r)=>V(R.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(R.Indicator,{className:"flex items-center justify-center",children:V(xe,{className:"h-2.5 w-2.5 fill-current text-current"})})}));E.displayName=R.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 f,jsxs as ae}from"react/jsx-runtime";var q=a.Root,H=a.Group,U=a.Value,M=L.forwardRef(({className:e,children:t,...r},i)=>ae(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,f(a.Icon,{asChild:!0,children:f(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)=>f(a.Portal,{children:f(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:f(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)=>ae(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:[f("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:f(a.ItemIndicator,{children:f(ye,{className:"h-4 w-4"})})}),f(a.ItemText,{children:t})]}));$.displayName=a.Item.displayName;import*as ne 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"),v=ne.forwardRef(({className:e,...t},r)=>Fe(z.Root,{ref:r,className:l(Ce(),e),...t}));v.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:n,ariaRequired:s,ariaDescribedBy:d})=>{let c=p=>{r(Pe(e,p))};return Ne(h,{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":n,"aria-required":s,"aria-describedby":d})},g=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:n=>r(n.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(q,{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(H,{children:e.options?.map(n=>P($,{value:String(n.value),children:n.label},n.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 n=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:n,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,onCheckedChange:s=>{let d=Array.isArray(t)?[...t]:[];if(s)d.push(o.value);else{let c=d.indexOf(o.value);c>-1&&d.splice(c,1)}r(d)},onBlur:i}),K(v,{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(v,{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:n,ariaRequired:s,ariaDescribedBy:d})=>$e(h,{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":n,"aria-required":s,"aria-describedby":d}),Z=Be;import{jsx as se}from"react/jsx-runtime";var De=({field:e,value:t,onChange:r,onBlur:i,fieldId:o,ariaInvalid:n,ariaRequired:s,ariaDescribedBy:d})=>se("div",{className:"flex items-center space-x-2",children:se(T,{id:o,checked:!!t,onCheckedChange:r,disabled:typeof e.disabled=="boolean"?e.disabled:void 0,name:e.name,"aria-invalid":n,"aria-required":s,"aria-describedby":d})}),_=De;var j={text:g,number:g,password:g,email:g,textarea:O,select:J,checkbox:Q,radio:Y,date:Z,switch:_};import{jsx as D,jsxs as le}from"react/jsx-runtime";var de=({field:e,value:t,onChange:r,onBlur:i,error:o,componentMap:n})=>{let{label:s,description:d,name:c,type:p,validations:m}=e,u=`field-${c}`,x=`${u}-description`,y=`${u}-error`,b=m?.some(fe=>fe.type==="required"),ce=(n?{...j,...n}:j)[p]??g,pe=[d?x:null,o?y:null].filter(Boolean).join(" ");return le("div",{className:`space-y-2 ${e.className||""}`,children:[s&&le(v,{htmlFor:u,className:b?"flex items-center gap-1":"",children:[s,b&&D("span",{className:"text-destructive",children:"*"})]}),D(ce,{field:e,value:t,onChange:r,onBlur:i,fieldId:u,errorId:y,descriptionId:x,ariaInvalid:!!o,ariaRequired:b,ariaDescribedBy:pe||void 0}),d&&D("p",{id:x,className:"text-[0.8rem] text-muted-foreground",children:d}),o&&D("p",{id:y,className:"text-[0.8rem] font-medium text-destructive",children:o})]})};import{useMemo as Ae,useCallback as w}from"react";import{useStore as We}from"zustand";import{createFormStore as qe,get as He}from"pdyform-core";function me({schema:e}){let t=Ae(()=>qe(e.fields,e.resolver,e.errorMessages),[e]),r=We(t),i=w(async(c,p)=>{await t.getState().setFieldValue(c,p)},[t]),o=w(c=>He(t.getState().values,c),[t]),n=w((c,p)=>{t.setState(m=>({errors:{...m.errors,[c]:p}}))},[t]),s=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:n,validate:s,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=me({schema:e}),n=i||o,{state:s,store:d}=n,c=async m=>{m.preventDefault();let{hasError:u,values:x,state:y}=await n.validate();if(u){let b=e.fields.find(S=>y.errors[S.name]);if(b){let S=document.getElementById(`field-${b.name}`);S?.focus(),S?.scrollIntoView({behavior:"smooth",block:"center"})}return}t(x)},p=s.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 u=typeof m.hidden=="function"?m.hidden(s.values):m.hidden,x=typeof m.disabled=="function"?m.disabled(s.values):m.disabled,y=s.validatingFields.includes(m.name);return!u&&N(de,{field:{...m,disabled:x||y},value:Ue(s.values,m.name),onChange:b=>d.getState().setFieldValue(m.name,b),onBlur:()=>d.getState().setFieldBlur(m.name),error:s.errors[m.name]},m.name)})}),N("button",{type:"submit",disabled:s.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:s.isSubmitting?"Submitting...":p?"Validating...":e.submitButtonText||"Submit"})]})};export{k as Checkbox,Q as CheckboxRenderer,Z as DateRenderer,Ir as DynamicForm,de as FormFieldRenderer,h as Input,g as InputRenderer,v as Label,G as RadioGroup,E as RadioGroupItem,Y as RadioRenderer,q as Select,B as SelectContent,H 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,me 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};