@lssm/lib.design-system 0.0.0-canary-20251221132705 → 0.0.0-canary-20251221153314

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.
@@ -1,4 +1,4 @@
1
- import { buildZodWithRelations, evalPredicate } from "../../forms.js";
1
+ import { buildZodWithRelations, evalPredicate } from "../../forms/forms.js";
2
2
  import React, { useEffect, useMemo, useState } from "react";
3
3
  import { Controller, useFieldArray, useForm } from "react-hook-form";
4
4
  import { zodResolver } from "@hookform/resolvers/zod";
@@ -1 +1 @@
1
- {"version":3,"file":"form-render.js","names":[],"sources":["../../../../../../contracts/dist/client/react/form-render.js"],"sourcesContent":["import { buildZodWithRelations, evalPredicate } from \"../../forms.js\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { Controller, useFieldArray, useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\n\n//#region src/client/react/form-render.tsx\nfunction toOptionsArray(src) {\n\tif (!src) return void 0;\n\tif (Array.isArray(src)) return {\n\t\tkind: \"static\",\n\t\toptions: src\n\t};\n\treturn src;\n}\nfunction getAtPath(values, path) {\n\tif (!path) return void 0;\n\tconst segs = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\tlet cur = values;\n\tfor (const s of segs) {\n\t\tif (cur == null) return void 0;\n\t\tcur = cur[s];\n\t}\n\treturn cur;\n}\nfunction makeDepsKey(values, deps) {\n\tif (!deps || deps.length === 0) return \"[]\";\n\ttry {\n\t\treturn JSON.stringify(deps.map((d) => getAtPath(values, d)));\n\t} catch {\n\t\treturn \"[]\";\n\t}\n}\nfunction useResolvedOptions(values, source, resolvers) {\n\tconst [opts, setOpts] = useState([]);\n\tuseEffect(() => {\n\t\tlet mounted = true;\n\t\tconst run = async () => {\n\t\t\tif (!source) return setOpts([]);\n\t\t\tif (source.kind === \"static\") return setOpts([...source.options ?? []]);\n\t\t\tconst fn = resolvers?.[source.resolverKey];\n\t\t\tif (!fn) return setOpts([]);\n\t\t\tconst res = await fn(values, source.args);\n\t\t\tif (mounted) setOpts([...res ?? []]);\n\t\t};\n\t\trun();\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t};\n\t}, [useMemo(() => {\n\t\tif (!source) return \"nil\";\n\t\tif (source.kind === \"static\") return JSON.stringify(source.options ?? []);\n\t\treturn makeDepsKey(values, source.deps);\n\t}, [source, values]), source && source.kind === \"resolver\" ? source.resolverKey : void 0]);\n\treturn opts;\n}\nfunction fieldPath(parent, name, arrayIndex) {\n\tif (!name) return parent ?? \"\";\n\tconst child = typeof arrayIndex === \"number\" ? `${name.replace(/^\\$index$/, String(arrayIndex))}` : name;\n\treturn parent ? `${parent}${typeof arrayIndex === \"number\" ? `.${arrayIndex}` : \"\"}.${child}`.replace(/\\.+/g, \".\") : child;\n}\nfunction createFormRenderer(base) {\n\tconst conf = base;\n\tconst { driver } = conf;\n\tfunction InternalForm(props) {\n\t\tconst { spec, options, merged } = props;\n\t\tconst baseZod = useMemo(() => buildZodWithRelations(spec), [spec]);\n\t\tconst form = useForm({\n\t\t\t...merged.formOptions,\n\t\t\tresolver: zodResolver(baseZod),\n\t\t\tdefaultValues: options?.defaultValues\n\t\t});\n\t\tconst values = form.watch();\n\t\tconst renderOne = (f, parent, arrayIndex) => {\n\t\t\tconst DriverField = driver.Field;\n\t\t\tconst DriverLabel = driver.FieldLabel;\n\t\t\tconst DriverDesc = driver.FieldDescription;\n\t\t\tconst DriverError = driver.FieldError;\n\t\t\tconst name = fieldPath(parent, f.name, arrayIndex);\n\t\t\tconst visible = evalPredicate(values, f.visibleWhen);\n\t\t\tconst enabled = evalPredicate(values, f.enabledWhen);\n\t\t\tconst invalid = Boolean(form.getFieldState(name)?.invalid);\n\t\t\tif (!visible) return null;\n\t\t\tconst id = name?.replace(/\\./g, \"-\");\n\t\t\tconst commonWrapProps = {\n\t\t\t\t\"data-invalid\": invalid,\n\t\t\t\thidden: !visible,\n\t\t\t\tdisabled: !enabled\n\t\t\t};\n\t\t\tconst labelNode = f.labelI18n ? /* @__PURE__ */ jsx(DriverLabel, {\n\t\t\t\thtmlFor: id,\n\t\t\t\tchildren: f.labelI18n\n\t\t\t}) : null;\n\t\t\tconst descNode = f.descriptionI18n ? /* @__PURE__ */ jsx(DriverDesc, { children: f.descriptionI18n }) : null;\n\t\t\tif (f.kind === \"group\") {\n\t\t\t\tconst children = f.fields.map((c, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderOne(c, name, arrayIndex) }, `${name}-${i}`));\n\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\tchildren,\n\t\t\t\t\t\tdescNode\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (f.kind === \"array\") return renderArray(f, parent);\n\t\t\treturn /* @__PURE__ */ jsx(Controller, {\n\t\t\t\tname,\n\t\t\t\tcontrol: form.control,\n\t\t\t\trender: ({ field, fieldState }) => {\n\t\t\t\t\tconst err = fieldState.error ? [fieldState.error] : [];\n\t\t\t\t\tconst ariaInvalid = fieldState.invalid || void 0;\n\t\t\t\t\tif (f.kind === \"text\") {\n\t\t\t\t\t\tconst textField = f;\n\t\t\t\t\t\tconst Input = driver.Input;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Input, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tplaceholder: f.placeholderI18n,\n\t\t\t\t\t\t\t\t\tautoComplete: textField.autoComplete,\n\t\t\t\t\t\t\t\t\tinputMode: textField.inputMode,\n\t\t\t\t\t\t\t\t\tmaxLength: textField.maxLength,\n\t\t\t\t\t\t\t\t\tminLength: textField.minLength,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\t...field,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"textarea\") {\n\t\t\t\t\t\tconst textareaField = f;\n\t\t\t\t\t\tconst Textarea = driver.Textarea;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Textarea, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tplaceholder: f.placeholderI18n,\n\t\t\t\t\t\t\t\t\trows: textareaField.rows,\n\t\t\t\t\t\t\t\t\tmaxLength: textareaField.maxLength,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\t...field,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"select\") {\n\t\t\t\t\t\tconst selectField = f;\n\t\t\t\t\t\tconst Select = driver.Select;\n\t\t\t\t\t\tconst opts = useResolvedOptions(values, toOptionsArray(selectField.options), merged.resolvers);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Select, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tvalue: field.value,\n\t\t\t\t\t\t\t\t\tonChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"checkbox\") {\n\t\t\t\t\t\tconst Checkbox = driver.Checkbox;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Checkbox, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tchecked: !!field.value,\n\t\t\t\t\t\t\t\t\tonCheckedChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"radio\") {\n\t\t\t\t\t\tconst radioField = f;\n\t\t\t\t\t\tconst RadioGroup = driver.RadioGroup;\n\t\t\t\t\t\tconst opts = useResolvedOptions(values, toOptionsArray(radioField.options), merged.resolvers);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(RadioGroup, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tvalue: field.value,\n\t\t\t\t\t\t\t\t\tonValueChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"switch\") {\n\t\t\t\t\t\tconst Switch = driver.Switch;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Switch, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tchecked: !!field.value,\n\t\t\t\t\t\t\t\t\tonCheckedChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn /* @__PURE__ */ jsx(Fragment, {});\n\t\t\t\t}\n\t\t\t}, name);\n\t\t};\n\t\tconst renderArray = (f, parent) => {\n\t\t\tconst name = fieldPath(parent, f.name);\n\t\t\tconst { fields, append, remove } = useFieldArray({\n\t\t\t\tcontrol: form.control,\n\t\t\t\tname\n\t\t\t});\n\t\t\tconst canAdd = f.max == null || fields.length < f.max;\n\t\t\tconst canRemove = (idx) => (f.min == null ? fields.length > 0 : fields.length > f.min) && idx >= 0;\n\t\t\tconst Button$1 = driver.Button;\n\t\t\tconst Label = driver.FieldLabel;\n\t\t\treturn /* @__PURE__ */ jsxs(\"div\", { children: [\n\t\t\t\tf.labelI18n ? /* @__PURE__ */ jsx(Label, { children: f.labelI18n }) : null,\n\t\t\t\tfields.map((row, idx) => /* @__PURE__ */ jsxs(\"div\", { children: [renderOne(f.of, name, idx), canRemove(idx) ? /* @__PURE__ */ jsx(Button$1, {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tvariant: \"ghost\",\n\t\t\t\t\tsize: \"sm\",\n\t\t\t\t\tonClick: () => remove(idx),\n\t\t\t\t\tchildren: \"Remove\"\n\t\t\t\t}) : null] }, row.id ?? idx)),\n\t\t\t\tcanAdd ? /* @__PURE__ */ jsx(Button$1, {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tvariant: \"outline\",\n\t\t\t\t\tsize: \"sm\",\n\t\t\t\t\tonClick: () => append({}),\n\t\t\t\t\tchildren: \"Add\"\n\t\t\t\t}) : null\n\t\t\t] }, name);\n\t\t};\n\t\tconst onSubmit = async (data) => {\n\t\t\tconst actionKey = spec.actions?.[0]?.key ?? \"submit\";\n\t\t\tif (merged.onSubmitOverride) return merged.onSubmitOverride(data, actionKey);\n\t\t};\n\t\tconst Button = driver.Button;\n\t\treturn /* @__PURE__ */ jsxs(\"form\", {\n\t\t\tonSubmit: form.handleSubmit(onSubmit),\n\t\t\tchildren: [(spec.fields || []).map((f, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderOne(f) }, i)), spec.actions && spec.actions.length ? /* @__PURE__ */ jsx(\"div\", { children: spec.actions.map((a) => /* @__PURE__ */ jsx(Button, {\n\t\t\t\ttype: \"submit\",\n\t\t\t\tchildren: a.labelI18n\n\t\t\t}, a.key)) }) : null]\n\t\t});\n\t}\n\treturn { render: (spec, options) => /* @__PURE__ */ jsx(InternalForm, {\n\t\tspec,\n\t\toptions,\n\t\tmerged: {\n\t\t\t...conf,\n\t\t\t...options?.overrides ?? {}\n\t\t}\n\t}) };\n}\n\n//#endregion\nexport { createFormRenderer };"],"mappings":"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"}
1
+ {"version":3,"file":"form-render.js","names":[],"sources":["../../../../../../contracts/dist/client/react/form-render.js"],"sourcesContent":["import { buildZodWithRelations, evalPredicate } from \"../../forms/forms.js\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { Controller, useFieldArray, useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\n\n//#region src/client/react/form-render.tsx\nfunction toOptionsArray(src) {\n\tif (!src) return void 0;\n\tif (Array.isArray(src)) return {\n\t\tkind: \"static\",\n\t\toptions: src\n\t};\n\treturn src;\n}\nfunction getAtPath(values, path) {\n\tif (!path) return void 0;\n\tconst segs = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\tlet cur = values;\n\tfor (const s of segs) {\n\t\tif (cur == null) return void 0;\n\t\tcur = cur[s];\n\t}\n\treturn cur;\n}\nfunction makeDepsKey(values, deps) {\n\tif (!deps || deps.length === 0) return \"[]\";\n\ttry {\n\t\treturn JSON.stringify(deps.map((d) => getAtPath(values, d)));\n\t} catch {\n\t\treturn \"[]\";\n\t}\n}\nfunction useResolvedOptions(values, source, resolvers) {\n\tconst [opts, setOpts] = useState([]);\n\tuseEffect(() => {\n\t\tlet mounted = true;\n\t\tconst run = async () => {\n\t\t\tif (!source) return setOpts([]);\n\t\t\tif (source.kind === \"static\") return setOpts([...source.options ?? []]);\n\t\t\tconst fn = resolvers?.[source.resolverKey];\n\t\t\tif (!fn) return setOpts([]);\n\t\t\tconst res = await fn(values, source.args);\n\t\t\tif (mounted) setOpts([...res ?? []]);\n\t\t};\n\t\trun();\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t};\n\t}, [useMemo(() => {\n\t\tif (!source) return \"nil\";\n\t\tif (source.kind === \"static\") return JSON.stringify(source.options ?? []);\n\t\treturn makeDepsKey(values, source.deps);\n\t}, [source, values]), source && source.kind === \"resolver\" ? source.resolverKey : void 0]);\n\treturn opts;\n}\nfunction fieldPath(parent, name, arrayIndex) {\n\tif (!name) return parent ?? \"\";\n\tconst child = typeof arrayIndex === \"number\" ? `${name.replace(/^\\$index$/, String(arrayIndex))}` : name;\n\treturn parent ? `${parent}${typeof arrayIndex === \"number\" ? `.${arrayIndex}` : \"\"}.${child}`.replace(/\\.+/g, \".\") : child;\n}\nfunction createFormRenderer(base) {\n\tconst conf = base;\n\tconst { driver } = conf;\n\tfunction InternalForm(props) {\n\t\tconst { spec, options, merged } = props;\n\t\tconst baseZod = useMemo(() => buildZodWithRelations(spec), [spec]);\n\t\tconst form = useForm({\n\t\t\t...merged.formOptions,\n\t\t\tresolver: zodResolver(baseZod),\n\t\t\tdefaultValues: options?.defaultValues\n\t\t});\n\t\tconst values = form.watch();\n\t\tconst renderOne = (f, parent, arrayIndex) => {\n\t\t\tconst DriverField = driver.Field;\n\t\t\tconst DriverLabel = driver.FieldLabel;\n\t\t\tconst DriverDesc = driver.FieldDescription;\n\t\t\tconst DriverError = driver.FieldError;\n\t\t\tconst name = fieldPath(parent, f.name, arrayIndex);\n\t\t\tconst visible = evalPredicate(values, f.visibleWhen);\n\t\t\tconst enabled = evalPredicate(values, f.enabledWhen);\n\t\t\tconst invalid = Boolean(form.getFieldState(name)?.invalid);\n\t\t\tif (!visible) return null;\n\t\t\tconst id = name?.replace(/\\./g, \"-\");\n\t\t\tconst commonWrapProps = {\n\t\t\t\t\"data-invalid\": invalid,\n\t\t\t\thidden: !visible,\n\t\t\t\tdisabled: !enabled\n\t\t\t};\n\t\t\tconst labelNode = f.labelI18n ? /* @__PURE__ */ jsx(DriverLabel, {\n\t\t\t\thtmlFor: id,\n\t\t\t\tchildren: f.labelI18n\n\t\t\t}) : null;\n\t\t\tconst descNode = f.descriptionI18n ? /* @__PURE__ */ jsx(DriverDesc, { children: f.descriptionI18n }) : null;\n\t\t\tif (f.kind === \"group\") {\n\t\t\t\tconst children = f.fields.map((c, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderOne(c, name, arrayIndex) }, `${name}-${i}`));\n\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\tchildren,\n\t\t\t\t\t\tdescNode\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (f.kind === \"array\") return renderArray(f, parent);\n\t\t\treturn /* @__PURE__ */ jsx(Controller, {\n\t\t\t\tname,\n\t\t\t\tcontrol: form.control,\n\t\t\t\trender: ({ field, fieldState }) => {\n\t\t\t\t\tconst err = fieldState.error ? [fieldState.error] : [];\n\t\t\t\t\tconst ariaInvalid = fieldState.invalid || void 0;\n\t\t\t\t\tif (f.kind === \"text\") {\n\t\t\t\t\t\tconst textField = f;\n\t\t\t\t\t\tconst Input = driver.Input;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Input, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tplaceholder: f.placeholderI18n,\n\t\t\t\t\t\t\t\t\tautoComplete: textField.autoComplete,\n\t\t\t\t\t\t\t\t\tinputMode: textField.inputMode,\n\t\t\t\t\t\t\t\t\tmaxLength: textField.maxLength,\n\t\t\t\t\t\t\t\t\tminLength: textField.minLength,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\t...field,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"textarea\") {\n\t\t\t\t\t\tconst textareaField = f;\n\t\t\t\t\t\tconst Textarea = driver.Textarea;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Textarea, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tplaceholder: f.placeholderI18n,\n\t\t\t\t\t\t\t\t\trows: textareaField.rows,\n\t\t\t\t\t\t\t\t\tmaxLength: textareaField.maxLength,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\t...field,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"select\") {\n\t\t\t\t\t\tconst selectField = f;\n\t\t\t\t\t\tconst Select = driver.Select;\n\t\t\t\t\t\tconst opts = useResolvedOptions(values, toOptionsArray(selectField.options), merged.resolvers);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Select, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\"aria-invalid\": ariaInvalid,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tvalue: field.value,\n\t\t\t\t\t\t\t\t\tonChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"checkbox\") {\n\t\t\t\t\t\tconst Checkbox = driver.Checkbox;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Checkbox, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tchecked: !!field.value,\n\t\t\t\t\t\t\t\t\tonCheckedChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"radio\") {\n\t\t\t\t\t\tconst radioField = f;\n\t\t\t\t\t\tconst RadioGroup = driver.RadioGroup;\n\t\t\t\t\t\tconst opts = useResolvedOptions(values, toOptionsArray(radioField.options), merged.resolvers);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(RadioGroup, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tvalue: field.value,\n\t\t\t\t\t\t\t\t\tonValueChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (f.kind === \"switch\") {\n\t\t\t\t\t\tconst Switch = driver.Switch;\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(DriverField, {\n\t\t\t\t\t\t\t...commonWrapProps,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\tlabelNode,\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(Switch, {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tdisabled: !enabled,\n\t\t\t\t\t\t\t\t\tchecked: !!field.value,\n\t\t\t\t\t\t\t\t\tonCheckedChange: (v) => field.onChange(v),\n\t\t\t\t\t\t\t\t\t...f.uiProps\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tdescNode,\n\t\t\t\t\t\t\t\tfieldState.invalid ? /* @__PURE__ */ jsx(DriverError, { errors: err }) : null\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn /* @__PURE__ */ jsx(Fragment, {});\n\t\t\t\t}\n\t\t\t}, name);\n\t\t};\n\t\tconst renderArray = (f, parent) => {\n\t\t\tconst name = fieldPath(parent, f.name);\n\t\t\tconst { fields, append, remove } = useFieldArray({\n\t\t\t\tcontrol: form.control,\n\t\t\t\tname\n\t\t\t});\n\t\t\tconst canAdd = f.max == null || fields.length < f.max;\n\t\t\tconst canRemove = (idx) => (f.min == null ? fields.length > 0 : fields.length > f.min) && idx >= 0;\n\t\t\tconst Button$1 = driver.Button;\n\t\t\tconst Label = driver.FieldLabel;\n\t\t\treturn /* @__PURE__ */ jsxs(\"div\", { children: [\n\t\t\t\tf.labelI18n ? /* @__PURE__ */ jsx(Label, { children: f.labelI18n }) : null,\n\t\t\t\tfields.map((row, idx) => /* @__PURE__ */ jsxs(\"div\", { children: [renderOne(f.of, name, idx), canRemove(idx) ? /* @__PURE__ */ jsx(Button$1, {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tvariant: \"ghost\",\n\t\t\t\t\tsize: \"sm\",\n\t\t\t\t\tonClick: () => remove(idx),\n\t\t\t\t\tchildren: \"Remove\"\n\t\t\t\t}) : null] }, row.id ?? idx)),\n\t\t\t\tcanAdd ? /* @__PURE__ */ jsx(Button$1, {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tvariant: \"outline\",\n\t\t\t\t\tsize: \"sm\",\n\t\t\t\t\tonClick: () => append({}),\n\t\t\t\t\tchildren: \"Add\"\n\t\t\t\t}) : null\n\t\t\t] }, name);\n\t\t};\n\t\tconst onSubmit = async (data) => {\n\t\t\tconst actionKey = spec.actions?.[0]?.key ?? \"submit\";\n\t\t\tif (merged.onSubmitOverride) return merged.onSubmitOverride(data, actionKey);\n\t\t};\n\t\tconst Button = driver.Button;\n\t\treturn /* @__PURE__ */ jsxs(\"form\", {\n\t\t\tonSubmit: form.handleSubmit(onSubmit),\n\t\t\tchildren: [(spec.fields || []).map((f, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderOne(f) }, i)), spec.actions && spec.actions.length ? /* @__PURE__ */ jsx(\"div\", { children: spec.actions.map((a) => /* @__PURE__ */ jsx(Button, {\n\t\t\t\ttype: \"submit\",\n\t\t\t\tchildren: a.labelI18n\n\t\t\t}, a.key)) }) : null]\n\t\t});\n\t}\n\treturn { render: (spec, options) => /* @__PURE__ */ jsx(InternalForm, {\n\t\tspec,\n\t\toptions,\n\t\tmerged: {\n\t\t\t...conf,\n\t\t\t...options?.overrides ?? {}\n\t\t}\n\t}) };\n}\n\n//#endregion\nexport { createFormRenderer };"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import "./registry-utils.js";
1
+ import "../registry-utils.js";
2
2
 
3
- //#region ../contracts/dist/forms.js
3
+ //#region ../contracts/dist/forms/forms.js
4
4
  function getAtPath(values, path) {
5
5
  if (!path) return void 0;
6
6
  const segs = path.replace(/\[(\d+)\]/g, ".$1").split(".").filter(Boolean);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","names":[],"sources":["../../../../../contracts/dist/forms/forms.js"],"sourcesContent":["import { __toCommonJS } from \"../_virtual/rolldown_runtime.js\";\nimport { init_registry_utils, registry_utils_exports } from \"../registry-utils.js\";\n\n//#region src/forms/forms.ts\nfunction formKey(meta) {\n\treturn `${meta.key}.v${meta.version}`;\n}\nvar FormRegistry = class {\n\titems = /* @__PURE__ */ new Map();\n\tregister(spec) {\n\t\tconst key = formKey(spec.meta);\n\t\tif (this.items.has(key)) throw new Error(`Duplicate form ${key}`);\n\t\tthis.items.set(key, spec);\n\t\treturn this;\n\t}\n\tlist() {\n\t\treturn [...this.items.values()];\n\t}\n\tget(key, version) {\n\t\tif (version != null) return this.items.get(`${key}.v${version}`);\n\t\tlet candidate;\n\t\tlet max = -Infinity;\n\t\tfor (const [k, v] of this.items.entries()) {\n\t\t\tif (!k.startsWith(`${key}.v`)) continue;\n\t\t\tif (v.meta.version > max) {\n\t\t\t\tmax = v.meta.version;\n\t\t\t\tcandidate = v;\n\t\t\t}\n\t\t}\n\t\treturn candidate;\n\t}\n\t/** Filter forms by criteria. */\n\tfilter(criteria) {\n\t\tconst { filterBy } = (init_registry_utils(), __toCommonJS(registry_utils_exports));\n\t\treturn filterBy(this.list(), criteria);\n\t}\n\t/** List forms with specific tag. */\n\tlistByTag(tag) {\n\t\treturn this.list().filter((f) => f.meta.tags?.includes(tag));\n\t}\n\t/** List forms by owner. */\n\tlistByOwner(owner) {\n\t\treturn this.list().filter((f) => f.meta.owners?.includes(owner));\n\t}\n\t/** Group forms by key function. */\n\tgroupBy(keyFn) {\n\t\tconst { groupBy } = (init_registry_utils(), __toCommonJS(registry_utils_exports));\n\t\treturn groupBy(this.list(), keyFn);\n\t}\n\t/** Get unique tags from all forms. */\n\tgetUniqueTags() {\n\t\tconst { getUniqueTags } = (init_registry_utils(), __toCommonJS(registry_utils_exports));\n\t\treturn getUniqueTags(this.list());\n\t}\n};\nfunction getAtPath(values, path) {\n\tif (!path) return void 0;\n\tconst segs = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\tlet cur = values;\n\tfor (const s of segs) {\n\t\tif (cur == null) return void 0;\n\t\tif (cur && typeof cur === \"object\" && s in cur) cur = cur[s];\n\t\telse return;\n\t}\n\treturn cur;\n}\nfunction evalPredicate(values, pred) {\n\tif (!pred) return true;\n\tif (pred.not) return !evalPredicate(values, pred.not);\n\tif (pred.all && pred.all.length) return pred.all.every((p) => evalPredicate(values, p));\n\tif (pred.anyOf && pred.anyOf.length) return pred.anyOf.some((p) => evalPredicate(values, p));\n\tif (pred.when) {\n\t\tconst { path, op = \"truthy\", value } = pred.when;\n\t\tconst v = getAtPath(values, path);\n\t\tswitch (op) {\n\t\t\tcase \"equals\": return v === value;\n\t\t\tcase \"notEquals\": return v !== value;\n\t\t\tcase \"in\": return Array.isArray(value) && value.includes(v);\n\t\t\tcase \"notIn\": return Array.isArray(value) && !value.includes(v);\n\t\t\tcase \"gt\": return Number(v) > Number(value);\n\t\t\tcase \"gte\": return Number(v) >= Number(value);\n\t\t\tcase \"lt\": return Number(v) < Number(value);\n\t\t\tcase \"lte\": return Number(v) <= Number(value);\n\t\t\tcase \"empty\": return v == null || (Array.isArray(v) ? v.length === 0 : String(v).length === 0);\n\t\t\tcase \"lengthGt\": return (Array.isArray(v) || typeof v === \"string\") && v.length > Number(value ?? 0);\n\t\t\tcase \"lengthGte\": return (Array.isArray(v) || typeof v === \"string\") && v.length >= Number(value ?? 0);\n\t\t\tcase \"lengthLt\": return (Array.isArray(v) || typeof v === \"string\") && v.length < Number(value ?? 0);\n\t\t\tcase \"lengthLte\": return (Array.isArray(v) || typeof v === \"string\") && v.length <= Number(value ?? 0);\n\t\t\tcase \"truthy\":\n\t\t\tdefault: return Boolean(v);\n\t\t}\n\t}\n\treturn true;\n}\n/**\n* Wrap the base zod schema with relation-driven refinements (requiredWhen, array min/max)\n* and optional custom constraints. Call this when wiring RHF resolver.\n*/\nfunction buildZodWithRelations(spec, handlers) {\n\treturn spec.model.getZod().superRefine((values, ctx) => {\n\t\tconst visit = (field, parentPath) => {\n\t\t\tconst path = field.name ? parentPath ? `${parentPath}.${field.name}` : field.name : parentPath ?? \"\";\n\t\t\tif (field.requiredWhen) {\n\t\t\t\tif (evalPredicate(values, field.requiredWhen)) {\n\t\t\t\t\tconst v = getAtPath(values, path);\n\t\t\t\t\tif (v == null || typeof v === \"string\" && v.trim().length === 0 || Array.isArray(v) && v.length === 0) ctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\t\tmessage: \"required\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (field.kind === \"array\") {\n\t\t\t\tconst arr = getAtPath(values, path);\n\t\t\t\tif (field.min != null && Array.isArray(arr) && arr.length < field.min) ctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\tmessage: `min:${field.min}`\n\t\t\t\t});\n\t\t\t\tif (field.max != null && Array.isArray(arr) && arr.length > field.max) ctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\tmessage: `max:${field.max}`\n\t\t\t\t});\n\t\t\t\tvisit(field.of, path);\n\t\t\t} else if (field.kind === \"group\") for (const child of field.fields) visit(child, path);\n\t\t};\n\t\tfor (const f of spec.fields) visit(f);\n\t\tif (spec.constraints && handlers) for (const c of spec.constraints) {\n\t\t\tconst fn = handlers[c.key];\n\t\t\tif (!fn) continue;\n\t\t\tconst res = fn(values, c.paths, c.args);\n\t\t\tif (!res.ok) ctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tpath: (res.path ?? c.paths[0] ?? \"\").split(\".\").filter(Boolean),\n\t\t\t\tmessage: res.message ?? c.messageI18n\n\t\t\t});\n\t\t}\n\t});\n}\nfunction defineFormSpec(spec) {\n\treturn spec;\n}\n\n//#endregion\nexport { FormRegistry, buildZodWithRelations, defineFormSpec, evalPredicate };"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import * as react_jsx_runtime108 from "react/jsx-runtime";
2
2
  import * as _lssm_lib_schema0 from "@lssm/lib.schema";
3
- import * as _lssm_lib_contracts_forms0 from "@lssm/lib.contracts/forms";
3
+ import * as _lssm_lib_contracts_forms_forms0 from "@lssm/lib.contracts/forms/forms";
4
4
  import * as _lssm_lib_contracts_client_react_form_render0 from "@lssm/lib.contracts/client/react/form-render";
5
5
 
6
6
  //#region src/renderers/form-contract.d.ts
7
7
  declare const formRenderer: {
8
- render: (spec: _lssm_lib_contracts_forms0.FormSpec<_lssm_lib_schema0.AnySchemaModel>, options?: _lssm_lib_contracts_client_react_form_render0.RenderOptions<Record<string, any>> | undefined) => react_jsx_runtime108.JSX.Element;
8
+ render: (spec: _lssm_lib_contracts_forms_forms0.FormSpec<_lssm_lib_schema0.AnySchemaModel>, options?: _lssm_lib_contracts_client_react_form_render0.RenderOptions<Record<string, any>> | undefined) => react_jsx_runtime108.JSX.Element;
9
9
  };
10
10
  //#endregion
11
11
  export { formRenderer };
@@ -1 +1 @@
1
- {"version":3,"file":"form-contract.d.ts","names":[],"sources":["../../src/renderers/form-contract.tsx"],"sourcesContent":[],"mappings":";;;;;;cA+Fa;qDAsBX,iBAAA,CAAA,cAAA"}
1
+ {"version":3,"file":"form-contract.d.ts","names":[],"sources":["../../src/renderers/form-contract.tsx"],"sourcesContent":[],"mappings":";;;;;;cA+Fa;2DAsBX,iBAAA,CAAA,cAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/lib.design-system",
3
- "version": "0.0.0-canary-20251221132705",
3
+ "version": "0.0.0-canary-20251221153314",
4
4
  "scripts": {
5
5
  "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
6
6
  "publish:pkg:canary": "bun publish:pkg --tag canary",
@@ -21,10 +21,10 @@
21
21
  "tree-shake": true,
22
22
  "dependencies": {
23
23
  "@hookform/resolvers": "5.2.2",
24
- "@lssm/lib.ai-agent": "0.0.0-canary-20251221132705",
25
- "@lssm/lib.contracts": "0.0.0-canary-20251221132705",
26
- "@lssm/lib.ui-kit": "0.0.0-canary-20251221132705",
27
- "@lssm/lib.ui-kit-web": "0.0.0-canary-20251221132705",
24
+ "@lssm/lib.ai-agent": "0.0.0-canary-20251221153314",
25
+ "@lssm/lib.contracts": "0.0.0-canary-20251221153314",
26
+ "@lssm/lib.ui-kit": "0.0.0-canary-20251221153314",
27
+ "@lssm/lib.ui-kit-web": "0.0.0-canary-20251221153314",
28
28
  "class-variance-authority": "^0.7.1",
29
29
  "clsx": "^2.1.1",
30
30
  "lucide-react": "^0.535.0",
@@ -36,8 +36,8 @@
36
36
  "next": "16.1.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@lssm/tool.typescript": "0.0.0-canary-20251221132705",
40
- "@lssm/tool.tsdown": "0.0.0-canary-20251221132705",
39
+ "@lssm/tool.typescript": "0.0.0-canary-20251221153314",
40
+ "@lssm/tool.tsdown": "0.0.0-canary-20251221153314",
41
41
  "@types/node": "^24.9.0",
42
42
  "@types/react-dom": "^19.0.14",
43
43
  "postcss": "^8.5",
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms.js","names":[],"sources":["../../../../contracts/dist/forms.js"],"sourcesContent":["import { __toCommonJS } from \"./_virtual/rolldown_runtime.js\";\nimport { init_registry_utils, registry_utils_exports } from \"./registry-utils.js\";\n\n//#region src/forms.ts\nfunction formKey(meta) {\n\treturn `${meta.key}.v${meta.version}`;\n}\nvar FormRegistry = class {\n\titems = /* @__PURE__ */ new Map();\n\tregister(spec) {\n\t\tconst key = formKey(spec.meta);\n\t\tif (this.items.has(key)) throw new Error(`Duplicate form ${key}`);\n\t\tthis.items.set(key, spec);\n\t\treturn this;\n\t}\n\tlist() {\n\t\treturn [...this.items.values()];\n\t}\n\tget(key, version) {\n\t\tif (version != null) return this.items.get(`${key}.v${version}`);\n\t\tlet candidate;\n\t\tlet max = -Infinity;\n\t\tfor (const [k, v] of this.items.entries()) {\n\t\t\tif (!k.startsWith(`${key}.v`)) continue;\n\t\t\tif (v.meta.version > max) {\n\t\t\t\tmax = v.meta.version;\n\t\t\t\tcandidate = v;\n\t\t\t}\n\t\t}\n\t\treturn candidate;\n\t}\n\t/** Filter forms by criteria. */\n\tfilter(criteria) {\n\t\tconst { filterBy } = (init_registry_utils(), __toCommonJS(registry_utils_exports));\n\t\treturn filterBy(this.list(), criteria);\n\t}\n\t/** List forms with specific tag. */\n\tlistByTag(tag) {\n\t\treturn this.list().filter((f) => f.meta.tags?.includes(tag));\n\t}\n\t/** List forms by owner. */\n\tlistByOwner(owner) {\n\t\treturn this.list().filter((f) => f.meta.owners?.includes(owner));\n\t}\n\t/** Group forms by key function. */\n\tgroupBy(keyFn) {\n\t\tconst { groupBy } = (init_registry_utils(), __toCommonJS(registry_utils_exports));\n\t\treturn groupBy(this.list(), keyFn);\n\t}\n\t/** Get unique tags from all forms. */\n\tgetUniqueTags() {\n\t\tconst { getUniqueTags } = (init_registry_utils(), __toCommonJS(registry_utils_exports));\n\t\treturn getUniqueTags(this.list());\n\t}\n};\nfunction getAtPath(values, path) {\n\tif (!path) return void 0;\n\tconst segs = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\tlet cur = values;\n\tfor (const s of segs) {\n\t\tif (cur == null) return void 0;\n\t\tif (cur && typeof cur === \"object\" && s in cur) cur = cur[s];\n\t\telse return;\n\t}\n\treturn cur;\n}\nfunction evalPredicate(values, pred) {\n\tif (!pred) return true;\n\tif (pred.not) return !evalPredicate(values, pred.not);\n\tif (pred.all && pred.all.length) return pred.all.every((p) => evalPredicate(values, p));\n\tif (pred.anyOf && pred.anyOf.length) return pred.anyOf.some((p) => evalPredicate(values, p));\n\tif (pred.when) {\n\t\tconst { path, op = \"truthy\", value } = pred.when;\n\t\tconst v = getAtPath(values, path);\n\t\tswitch (op) {\n\t\t\tcase \"equals\": return v === value;\n\t\t\tcase \"notEquals\": return v !== value;\n\t\t\tcase \"in\": return Array.isArray(value) && value.includes(v);\n\t\t\tcase \"notIn\": return Array.isArray(value) && !value.includes(v);\n\t\t\tcase \"gt\": return Number(v) > Number(value);\n\t\t\tcase \"gte\": return Number(v) >= Number(value);\n\t\t\tcase \"lt\": return Number(v) < Number(value);\n\t\t\tcase \"lte\": return Number(v) <= Number(value);\n\t\t\tcase \"empty\": return v == null || (Array.isArray(v) ? v.length === 0 : String(v).length === 0);\n\t\t\tcase \"lengthGt\": return (Array.isArray(v) || typeof v === \"string\") && v.length > Number(value ?? 0);\n\t\t\tcase \"lengthGte\": return (Array.isArray(v) || typeof v === \"string\") && v.length >= Number(value ?? 0);\n\t\t\tcase \"lengthLt\": return (Array.isArray(v) || typeof v === \"string\") && v.length < Number(value ?? 0);\n\t\t\tcase \"lengthLte\": return (Array.isArray(v) || typeof v === \"string\") && v.length <= Number(value ?? 0);\n\t\t\tcase \"truthy\":\n\t\t\tdefault: return Boolean(v);\n\t\t}\n\t}\n\treturn true;\n}\n/**\n* Wrap the base zod schema with relation-driven refinements (requiredWhen, array min/max)\n* and optional custom constraints. Call this when wiring RHF resolver.\n*/\nfunction buildZodWithRelations(spec, handlers) {\n\treturn spec.model.getZod().superRefine((values, ctx) => {\n\t\tconst visit = (field, parentPath) => {\n\t\t\tconst path = field.name ? parentPath ? `${parentPath}.${field.name}` : field.name : parentPath ?? \"\";\n\t\t\tif (field.requiredWhen) {\n\t\t\t\tif (evalPredicate(values, field.requiredWhen)) {\n\t\t\t\t\tconst v = getAtPath(values, path);\n\t\t\t\t\tif (v == null || typeof v === \"string\" && v.trim().length === 0 || Array.isArray(v) && v.length === 0) ctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\t\tmessage: \"required\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (field.kind === \"array\") {\n\t\t\t\tconst arr = getAtPath(values, path);\n\t\t\t\tif (field.min != null && Array.isArray(arr) && arr.length < field.min) ctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\tmessage: `min:${field.min}`\n\t\t\t\t});\n\t\t\t\tif (field.max != null && Array.isArray(arr) && arr.length > field.max) ctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tpath: path.split(\".\"),\n\t\t\t\t\tmessage: `max:${field.max}`\n\t\t\t\t});\n\t\t\t\tvisit(field.of, path);\n\t\t\t} else if (field.kind === \"group\") for (const child of field.fields) visit(child, path);\n\t\t};\n\t\tfor (const f of spec.fields) visit(f);\n\t\tif (spec.constraints && handlers) for (const c of spec.constraints) {\n\t\t\tconst fn = handlers[c.key];\n\t\t\tif (!fn) continue;\n\t\t\tconst res = fn(values, c.paths, c.args);\n\t\t\tif (!res.ok) ctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tpath: (res.path ?? c.paths[0] ?? \"\").split(\".\").filter(Boolean),\n\t\t\t\tmessage: res.message ?? c.messageI18n\n\t\t\t});\n\t\t}\n\t});\n}\nfunction defineFormSpec(spec) {\n\treturn spec;\n}\n\n//#endregion\nexport { FormRegistry, buildZodWithRelations, defineFormSpec, evalPredicate };"],"mappings":"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"}