@xbeeant/form-engine-react 0.0.3 → 0.0.4

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.
Files changed (142) hide show
  1. package/dist/cjs/components/FormController.cjs +1 -1
  2. package/dist/cjs/components/NexusField.cjs +1 -1
  3. package/dist/cjs/components/NexusForm.cjs +1 -1
  4. package/dist/cjs/components/form-controller.cjs +1 -0
  5. package/dist/cjs/components/nexus-field.cjs +1 -0
  6. package/dist/cjs/components/nexus-form-provider.cjs +1 -0
  7. package/dist/cjs/components/nexus-form.cjs +1 -0
  8. package/dist/cjs/components/nexus-layout.cjs +1 -0
  9. package/dist/cjs/components/nexus-object.cjs +1 -0
  10. package/dist/cjs/contexts/field-inherit-context.cjs +1 -0
  11. package/dist/cjs/contexts/grid-context.cjs +1 -0
  12. package/dist/cjs/contexts/layout-config-context.cjs +1 -0
  13. package/dist/cjs/contexts/nexus-context.cjs +1 -0
  14. package/dist/cjs/hooks/index.cjs +1 -1
  15. package/dist/cjs/hooks/use-engine.cjs +1 -0
  16. package/dist/cjs/hooks/use-field-state.cjs +1 -0
  17. package/dist/cjs/hooks/use-field-validator.cjs +1 -0
  18. package/dist/cjs/hooks/use-field-value.cjs +1 -0
  19. package/dist/cjs/hooks/use-form-config.cjs +1 -0
  20. package/dist/cjs/hooks/use-form-data.cjs +1 -0
  21. package/dist/cjs/hooks/use-form-submitting.cjs +1 -0
  22. package/dist/cjs/hooks/use-form.cjs +1 -0
  23. package/dist/cjs/hooks/use-nexus-context.cjs +1 -0
  24. package/dist/cjs/hooks/use-watch-all.cjs +1 -0
  25. package/dist/cjs/hooks/use-watch-multiple.cjs +1 -0
  26. package/dist/cjs/hooks/use-watch-state.cjs +1 -0
  27. package/dist/cjs/hooks/use-watch.cjs +1 -0
  28. package/dist/cjs/hooks/useFormData.cjs +1 -1
  29. package/dist/cjs/hooks/useFormSubmitting.cjs +1 -0
  30. package/dist/cjs/index.cjs +1 -1
  31. package/dist/cjs/styles.css +1 -1
  32. package/dist/cjs/utils/omit-nil.cjs +1 -0
  33. package/dist/cjs/utils/omitNil.cjs +1 -0
  34. package/dist/cjs/utils/persist.cjs +1 -0
  35. package/dist/cjs/utils/render-tree-node.cjs +1 -0
  36. package/dist/cjs/utils/resolve-col-span.cjs +1 -0
  37. package/dist/es/components/FormController.d.ts +73 -19
  38. package/dist/es/components/FormController.js +222 -71
  39. package/dist/es/components/NexusField.js +25 -21
  40. package/dist/es/components/NexusForm.d.ts +33 -3
  41. package/dist/es/components/NexusForm.js +143 -96
  42. package/dist/es/components/form-controller.d.ts +129 -0
  43. package/dist/es/components/form-controller.js +310 -0
  44. package/dist/es/components/nexus-field.d.ts +9 -0
  45. package/dist/es/components/nexus-field.js +131 -0
  46. package/dist/es/components/nexus-form-provider.d.ts +12 -0
  47. package/dist/es/components/nexus-form-provider.js +18 -0
  48. package/dist/es/components/nexus-form.d.ts +114 -0
  49. package/dist/es/components/nexus-form.js +174 -0
  50. package/dist/es/components/nexus-layout.d.ts +9 -0
  51. package/dist/es/components/nexus-layout.js +48 -0
  52. package/dist/es/components/nexus-object.d.ts +16 -0
  53. package/dist/es/components/nexus-object.js +64 -0
  54. package/dist/es/contexts/NexusContext.d.ts +2 -0
  55. package/dist/es/contexts/field-inherit-context.d.ts +18 -0
  56. package/dist/es/contexts/field-inherit-context.js +5 -0
  57. package/dist/es/contexts/grid-context.d.ts +5 -0
  58. package/dist/es/contexts/grid-context.js +5 -0
  59. package/dist/es/contexts/layout-config-context.d.ts +4 -0
  60. package/dist/es/contexts/layout-config-context.js +5 -0
  61. package/dist/es/contexts/nexus-context.d.ts +29 -0
  62. package/dist/es/contexts/nexus-context.js +12 -0
  63. package/dist/es/hooks/index.d.ts +12 -11
  64. package/dist/es/hooks/index.js +20 -18
  65. package/dist/es/hooks/use-engine.d.ts +2 -0
  66. package/dist/es/hooks/use-engine.js +8 -0
  67. package/dist/es/hooks/use-field-state.d.ts +7 -0
  68. package/dist/es/hooks/use-field-state.js +13 -0
  69. package/dist/es/hooks/use-field-validator.d.ts +40 -0
  70. package/dist/es/hooks/use-field-validator.js +35 -0
  71. package/dist/es/hooks/use-field-value.d.ts +6 -0
  72. package/dist/es/hooks/use-field-value.js +13 -0
  73. package/dist/es/hooks/use-form-config.d.ts +5 -0
  74. package/dist/es/hooks/use-form-config.js +8 -0
  75. package/dist/es/hooks/use-form-data.d.ts +6 -0
  76. package/dist/es/hooks/use-form-data.js +13 -0
  77. package/dist/es/hooks/use-form-submitting.d.ts +7 -0
  78. package/dist/es/hooks/use-form-submitting.js +11 -0
  79. package/dist/es/hooks/use-form.d.ts +22 -0
  80. package/dist/es/hooks/use-form.js +12 -0
  81. package/dist/es/hooks/use-nexus-context.d.ts +11 -0
  82. package/dist/es/hooks/use-nexus-context.js +12 -0
  83. package/dist/es/hooks/use-watch-all.d.ts +19 -0
  84. package/dist/es/hooks/use-watch-all.js +29 -0
  85. package/dist/es/hooks/use-watch-multiple.d.ts +20 -0
  86. package/dist/es/hooks/use-watch-multiple.js +29 -0
  87. package/dist/es/hooks/use-watch-state.d.ts +18 -0
  88. package/dist/es/hooks/use-watch-state.js +19 -0
  89. package/dist/es/hooks/use-watch.d.ts +25 -0
  90. package/dist/es/hooks/use-watch.js +20 -0
  91. package/dist/es/hooks/useForm.d.ts +11 -4
  92. package/dist/es/hooks/useFormData.js +9 -9
  93. package/dist/es/hooks/useFormSubmitting.d.ts +7 -0
  94. package/dist/es/hooks/useFormSubmitting.js +11 -0
  95. package/dist/es/index.d.ts +26 -24
  96. package/dist/es/index.js +36 -32
  97. package/dist/es/styles.css +1 -1
  98. package/dist/es/utils/omit-nil.d.ts +9 -0
  99. package/dist/es/utils/omit-nil.js +14 -0
  100. package/dist/es/utils/omitNil.d.ts +9 -0
  101. package/dist/es/utils/omitNil.js +14 -0
  102. package/dist/es/utils/persist.d.ts +24 -0
  103. package/dist/es/utils/persist.js +43 -0
  104. package/dist/es/utils/render-tree-node.d.ts +6 -0
  105. package/dist/es/utils/render-tree-node.js +17 -0
  106. package/dist/es/utils/resolve-col-span.d.ts +5 -0
  107. package/dist/es/utils/resolve-col-span.js +9 -0
  108. package/dist/umd/index.css +1 -1
  109. package/dist/umd/index.umd.cjs +1 -1
  110. package/package.json +5 -4
  111. package/src/components/form-controller.ts +584 -0
  112. package/src/components/{NexusField.tsx → nexus-field.tsx} +57 -6
  113. package/src/components/{NexusFormProvider.tsx → nexus-form-provider.tsx} +3 -3
  114. package/src/components/{NexusForm.tsx → nexus-form.tsx} +135 -18
  115. package/src/components/{NexusLayout.tsx → nexus-layout.tsx} +5 -5
  116. package/src/components/{NexusObject.tsx → nexus-object.tsx} +3 -3
  117. package/src/contexts/{NexusContext.ts → nexus-context.ts} +3 -1
  118. package/src/hooks/index.ts +12 -11
  119. package/src/hooks/{useEngine.ts → use-engine.ts} +1 -1
  120. package/src/hooks/{useFieldState.ts → use-field-state.ts} +1 -1
  121. package/src/hooks/{useFieldValidator.ts → use-field-validator.ts} +1 -1
  122. package/src/hooks/{useFieldValue.ts → use-field-value.ts} +1 -1
  123. package/src/hooks/{useFormConfig.ts → use-form-config.ts} +2 -2
  124. package/src/hooks/{useFormData.ts → use-form-data.ts} +4 -4
  125. package/src/hooks/use-form-submitting.ts +16 -0
  126. package/src/hooks/{useForm.ts → use-form.ts} +12 -5
  127. package/src/hooks/{useNexusContext.ts → use-nexus-context.ts} +2 -2
  128. package/src/index.ts +26 -24
  129. package/src/utils/omit-nil.ts +24 -0
  130. package/src/utils/persist.ts +88 -0
  131. package/src/utils/{renderTreeNode.tsx → render-tree-node.tsx} +3 -3
  132. package/src/utils/{resolveColSpan.ts → resolve-col-span.ts} +1 -1
  133. package/dist/cjs/tailwind.css +0 -1
  134. package/dist/es/tailwind.css +0 -1
  135. package/src/components/FormController.ts +0 -278
  136. /package/src/contexts/{FieldInheritContext.ts → field-inherit-context.ts} +0 -0
  137. /package/src/contexts/{GridContext.ts → grid-context.ts} +0 -0
  138. /package/src/contexts/{LayoutConfigContext.ts → layout-config-context.ts} +0 -0
  139. /package/src/hooks/{useWatchAll.ts → use-watch-all.ts} +0 -0
  140. /package/src/hooks/{useWatchMultiple.ts → use-watch-multiple.ts} +0 -0
  141. /package/src/hooks/{useWatchState.ts → use-watch-state.ts} +0 -0
  142. /package/src/hooks/{useWatch.ts → use-watch.ts} +0 -0
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("@xbeeant/form-engine");class o{engine;formElementRef;getOnFinish;getOnFinishFailed;removeHiddenData=!0;watchers=new Map;globalWatcher=null;constructor(e){this.engine=e??new l.NexusEngine,this.engine.hasPlugin("async-validator")||this.engine.use(new l.AsyncValidatorPlugin(this.engine)),this.formElementRef={current:null},this.getOnFinish=()=>()=>{},this.getOnFinishFailed=()=>()=>{}}_bind(e,t,i){this.formElementRef.current=e,this.getOnFinish=t,this.getOnFinishFailed=i,this.engine.registerOnFieldValueChange((n,r)=>this._onFieldValueChange(n,r))}_syncConfig(e){if(e.removeHiddenData!==void 0&&(this.removeHiddenData=e.removeHiddenData),e.watch){this.watchers.clear(),this.globalWatcher=null;for(const[t,i]of Object.entries(e.watch))t==="#"?this.globalWatcher=i:this.watchers.set(t,i)}}_onFieldValueChange(e,t){const i=this.engine.getFormData(),n=this.removeHiddenData?i:this.engine.getAllFormData();this.globalWatcher&&this.globalWatcher(n,n,e);const r=this.watchers.get(e);r&&r(t,n)}_getEngine(){return this.engine}getEngine(){return this.engine}async submit(){const e=await this.engine.validate();if(e.size>0){this.focusFirstError(e),this.getOnFinishFailed()?.(e);return}const t=this.removeHiddenData?this.engine.getFormData():this.engine.getAllFormData();await this.getOnFinish()?.(t)}focusFirstError(e){const t=this.formElementRef.current;if(!t||e.size===0)return;const i=new Set(e.keys());requestAnimationFrame(()=>{const r=t.querySelectorAll("[data-nexus-field]");for(const s of Array.from(r)){const a=s.getAttribute("data-nexus-field");if(!a||!i.has(a))continue;s.scrollIntoView({behavior:"smooth",block:"center"}),s.querySelector('input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')?.focus();return}})}resetFields(){this.engine.reset()}setErrorFields(e){this.engine.setErrorFields(e)}setValues(e){this.engine.setFieldValues(e)}setValueByPath(e,t){this.engine.setFieldValue(e,t)}setSchemaByPath(e,t){this.engine.setSchemaByPath(e,t)}setSchema(e){this.engine.setSchema(e)}getValues(e){return this.engine.getFormData(e)}getHiddenValues(){return this.engine.getHiddenValues()}getAllValues(){return this.engine.getAllFormData()}getValueByPath(e){return this.engine.getFieldValue(e)}registerValidator(e,t){this.engine.registerFieldValidator(e,t)}unregisterValidator(e,t){this.engine.unregisterFieldValidator(e,t)}revalidateField(e){this.engine.validateField(e,{trigger:"change"})}getSchema(){return this.engine.getSchema()}removeErrorField(e){this.engine.removeErrorField(e)}scrollToPath(e){this.formElementRef.current?.querySelector(`[data-nexus-field="${e}"]`)?.scrollIntoView({behavior:"smooth",block:"center"})}getFieldError(e){return this.engine.getFieldError(e)}getFieldsError(){return this.engine.getFieldsError()}validateFields(e){return this.engine.validate(e)}getFieldState(e){return this.engine.getFieldState(e)}}exports.FormController=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@xbeeant/form-engine"),f=require("../utils/omitNil.cjs"),u=new WeakSet;class g{engine;submitting=!1;submittingListeners=new Set;views=new Map;instanceBindings=new Map;instanceConfigs=new Map;constructor(e){this.engine=e??new c.NexusEngine,this.engine.hasPlugin("async-validator")||this.engine.use(new c.AsyncValidatorPlugin(this.engine))}_useInstance(e){let t=this.views.get(e);return t||(this.views.size===0&&!u.has(this.engine)?(u.add(this.engine),t=this.engine):t=this.engine.instance(e),this.views.set(e,t),this.instanceConfigs.set(e,{removeHiddenData:!0,omitNil:!1,watchers:new Map,globalWatcher:null,onValuesChange:null})),t}resolveViews(){const e=Array.from(this.views.values());return e.length>0?e:[this.engine]}getPrimaryFormEl(){return this.instanceBindings.values().next().value?.formEl??null}_bind(e,t,s,n){this.instanceBindings.set(e,{formEl:t,getOnFinish:s,getOnFinishFailed:n}),this._useInstance(e).registerOnFieldValueChange((o,r)=>this._onFieldValueChange(e,o,r))}_syncConfig(e,t){const s=this.instanceConfigs.get(e)??{removeHiddenData:!0,omitNil:!1,watchers:new Map,globalWatcher:null,onValuesChange:null};if(t.removeHiddenData!==void 0&&(s.removeHiddenData=t.removeHiddenData),t.omitNil!==void 0&&(s.omitNil=t.omitNil),t.onValuesChange!==void 0&&(s.onValuesChange=t.onValuesChange),t.watch){s.watchers.clear(),s.globalWatcher=null;for(const[n,i]of Object.entries(t.watch))n==="#"?s.globalWatcher=i:s.watchers.set(n,i)}this.instanceConfigs.set(e,s)}_onFieldValueChange(e,t,s){const n=this.views.get(e),i=this.instanceConfigs.get(e);if(!n||!i)return;const o=n.getFormData(),r=i.removeHiddenData?o:n.getAllFormData();i.globalWatcher&&i.globalWatcher(r,r,t),i.onValuesChange&&i.onValuesChange(s,r,t);const a=i.watchers.get(t);a&&a(s,r)}_getEngine(){return this.engine}getEngine(){return this.engine}async submit(e){this.setSubmitting(!0);try{await this.runSubmit(e)}finally{this.setSubmitting(!1)}}getSubmitting(){return this.submitting}onSubmittingChange(e){return this.submittingListeners.add(e),()=>{this.submittingListeners.delete(e)}}setSubmitting(e){if(this.submitting!==e){this.submitting=e;for(const t of this.submittingListeners)t()}}async runSubmit(e){const t=this.resolveViews(),s=new Map;let n;for(const i of t){const o=await i.validate(void 0,{validateFirst:e?.validateFirst});if(o.size>0){for(const[r,a]of o)s.set(r,a);n??=this.instanceBindings.get(this.findInstanceId(i))}}if(s.size>0){this.focusFirstError(s,n?.formEl??null),n?.getOnFinishFailed()?.(s);return}for(const i of t){const o=this.findInstanceId(i),r=this.instanceConfigs.get(o)??{removeHiddenData:!0,omitNil:!1},a=r.removeHiddenData?i.getFormData():i.getAllFormData(),l=e?.omitNil??r.omitNil??!1?f.omitNilDeep(a):a;await i.submit(l)&&await this.instanceBindings.get(o)?.getOnFinish()?.(l)}}findInstanceId(e){for(const[t,s]of this.views)if(s===e)return t;return"default"}focusFirstError(e,t){if(!t||e.size===0)return;const s=new Set(e.keys());requestAnimationFrame(()=>{const i=t.querySelectorAll("[data-nexus-field]");for(const o of Array.from(i)){const r=o.getAttribute("data-nexus-field");if(!r||!s.has(r))continue;typeof o.scrollIntoView=="function"&&o.scrollIntoView({behavior:"smooth",block:"center"}),o.querySelector('input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')?.focus();return}})}resetFields(){for(const e of this.resolveViews())e.reset()}setErrorFields(e){for(const t of this.resolveViews())t.setErrorFields(e)}setValues(e){for(const t of this.resolveViews())t.setFieldValues(e)}setValueByPath(e,t){for(const s of this.resolveViews())s.setFieldValue(e,t)}setSchemaByPath(e,t){for(const s of this.resolveViews())s.setSchemaByPath(e,t)}setSchema(e){for(const t of this.resolveViews())t.setSchema(e)}getValues(e,t){const s={};for(const n of this.resolveViews()){const i=n.getFormData(e);t?.omitNil?Object.assign(s,f.omitNilDeep(i)):Object.assign(s,i)}return s}getHiddenValues(){const e={};for(const t of this.resolveViews())Object.assign(e,t.getHiddenValues());return e}getAllValues(){const e={};for(const t of this.resolveViews())Object.assign(e,t.getAllFormData());return e}getValueByPath(e){for(const t of this.resolveViews()){const s=t.getFieldValue(e);if(s!==void 0)return s}}registerValidator(e,t){for(const s of this.resolveViews())s.registerFieldValidator(e,t)}unregisterValidator(e,t){for(const s of this.resolveViews())s.unregisterFieldValidator(e,t)}revalidateField(e){for(const t of this.resolveViews())t.validateField(e,{trigger:"change"})}getSchema(){return this.resolveViews()[0]?.getSchema()??null}removeErrorField(e){for(const t of this.resolveViews())t.removeErrorField(e)}scrollToPath(e){this.getPrimaryFormEl()?.querySelector(`[data-nexus-field="${e}"]`)?.scrollIntoView({behavior:"smooth",block:"center"})}getFieldError(e){for(const t of this.resolveViews()){const s=t.getFieldError(e);if(s.length>0)return s}return[]}getFieldsError(){const e=new Map;for(const t of this.resolveViews())for(const[s,n]of t.getFieldsError())e.set(s,n);return e}validateFields(e,t){const s=this.resolveViews();return s.length===1?s[0].validate(e,t):Promise.all(s.map(n=>n.validate(e,t))).then(n=>{const i=new Map;for(const o of n)for(const[r,a]of o)i.set(r,a);return i})}getFieldState(e){for(const t of this.resolveViews()){const s=t.getFieldState(e);if(s)return s}}reloadRemoteData(e){for(const t of this.resolveViews())t.reloadRemoteData(e)}}exports.FormController=g;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),s=require("react"),_=require("../contexts/FieldInheritContext.cjs"),k=require("../contexts/GridContext.cjs"),L=require("../contexts/LayoutConfigContext.cjs"),M=require("../contexts/NexusContext.cjs"),B=require("../utils/resolveColSpan.cjs");function G({dataPath:t,layoutKey:u}){const{engine:n,config:l,form:b}=M.useNexusContext();s.useSyncExternalStore(i=>n.subscribeField(t,i),()=>n.getFieldVersion(t),()=>n.getFieldVersion(t));const e=n.getFieldState(t),F=s.useContext(k.GridContext),h=s.useContext(L.LayoutConfigContext),c=s.useContext(_.FieldInheritContext),v=s.useCallback(i=>{n.setFieldValue(t,i)},[n,t]),W=s.useCallback(i=>{i.currentTarget.contains(i.relatedTarget)||n.validateField(t,{trigger:"blur"})},[n,t]),w=s.useMemo(()=>e?.meta.enum?e.meta.enum.map((i,d)=>({value:i,label:e.meta.enumNames?.[d]??String(i)})):e?.props.options,[e?.meta.enum,e?.meta.enumNames,e?.props.options]),S=s.useMemo(()=>{const i={};if(e?.reactions){for(const d of e.reactions)if(d.dependencies)for(const y of d.dependencies)i[y]=n.getFieldValue(y)}return i},[e?.reactions,n]);if(!e)return n.getSnapshot()>0&&console.warn(`[NexusField] Field not found: ${t}`),null;if(c.visible===!1||!e.visible)return h.removeHidden===!0?null:o.jsx("div",{className:"hidden","data-nexus-hidden":t});const m=l.readOnly||c.readOnly===!0||e.readOnly,N=c.disabled===!0||e.disabled,p=m&&!!e.meta.readOnlyWidget,j=p?e.meta.readOnlyWidget:e.meta.widget;let r=n.getWidget(j);if(!r&&p&&(r=n.getWidget(e.meta.widget)),!r)return o.jsxs("div",{className:"text-xs text-red-500","data-nexus-field":t,children:['⚠️ Widget "',e.meta.widget,'" 未注册 (path: ',t,")"]});const q=e.meta.displayType??l.displayType,O=e.meta.labelWidth??l.labelWidth,T=e.meta.column??l.column,g=B.resolveColSpan(e.meta.colSpan,F),x={...e.meta.width?{width:e.meta.width,flexShrink:0}:{},...g?{gridColumn:`span ${g}`}:{}},f=n.getFieldWrapper(),V={label:e.meta.label,title:e.meta.title,description:e.meta.description,errors:e.errors,required:e.required,extra:e.meta.extra,width:e.meta.width,displayType:q,labelWidth:O,column:T},C={dataPath:t,path:t,value:e.value,onChange:v,disabled:N,readOnly:m,loading:e.loading,placeholder:e.meta.placeholder,options:w,form:b,dependValues:S,items:e.meta.items,...e.props};let a;return f?a=o.jsx(f,{...V,children:o.jsx(r,{...C})},u):a=o.jsx(r,{...C},u),o.jsx("div",{"data-nexus-field":t,onBlur:W,style:Object.keys(x).length>0?x:void 0,children:a})}exports.NexusField=G;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),o=require("react"),_=require("../contexts/FieldInheritContext.cjs"),k=require("../contexts/GridContext.cjs"),L=require("../contexts/LayoutConfigContext.cjs"),M=require("../contexts/NexusContext.cjs"),R=require("../utils/resolveColSpan.cjs");function B({dataPath:t,layoutKey:u}){const{engine:n,config:l,form:b}=M.useNexusContext();o.useSyncExternalStore(i=>n.subscribeField(t,i),()=>n.getFieldVersion(t),()=>n.getFieldVersion(t));const e=n.getFieldState(t),h=o.useContext(k.GridContext),F=o.useContext(L.LayoutConfigContext),a=o.useContext(_.FieldInheritContext),v=o.useCallback(i=>{n.setFieldValue(t,i)},[n,t]),W=o.useCallback(i=>{i.currentTarget.contains(i.relatedTarget)||n.validateField(t,{trigger:"blur"})},[n,t]),w=o.useMemo(()=>e?.meta.enum?e.meta.enum.map((i,d)=>({value:i,label:e.meta.enumNames?.[d]??String(i)})):e?.props.options,[e?.meta.enum,e?.meta.enumNames,e?.props.options]),S=o.useMemo(()=>{const i={};if(e?.reactions){for(const d of e.reactions)if(d.dependencies)for(const y of d.dependencies)i[y]=n.getFieldValue(y)}return i},[e?.reactions,n]);if(!e)return n.getSnapshot()>0&&console.warn(`[NexusField] Field not found: ${t}`),null;if(a.visible===!1||!e.visible)return F.removeHidden===!0?null:s.jsx("div",{className:"hidden","data-nexus-hidden":t});const m=l.readOnly||a.readOnly===!0||e.readOnly,N=a.disabled===!0||e.disabled,p=m&&!!e.meta.readOnlyWidget,j=p?e.meta.readOnlyWidget:e.meta.widget;let r=n.getWidget(j);if(!r&&p&&(r=n.getWidget(e.meta.widget)),!r)return s.jsxs("div",{className:"text-xs text-red-500","data-nexus-field":t,children:['⚠️ Widget "',e.meta.widget,'" 未注册 (path: ',t,")"]});const q=e.meta.displayType??l.displayType,O=e.meta.labelWidth??l.labelWidth,T=e.meta.column??l.column,g=R.resolveColSpan(e.meta.colSpan,h),x={...e.meta.width?{width:e.meta.width,flexShrink:0}:{},...g?{gridColumn:`span ${g}`}:{}},f=n.getFieldWrapper(),V={label:e.meta.label,title:e.meta.title,description:e.meta.description,tooltip:e.meta.tooltip,errors:e.errors,required:e.required,extra:e.meta.extra,width:e.meta.width,displayType:q,labelWidth:O,column:T},C={dataPath:t,path:t,value:e.value,onChange:v,disabled:N,readOnly:m,loading:e.loading,placeholder:e.meta.placeholder,options:w,form:b,dependValues:S,items:e.meta.items,schema:e.meta.schema,remoteVersion:n.getRemoteDataVersion(t),...e.props};let c;return f?c=s.jsx(f,{...V,children:s.jsx(r,{...C})},u):c=s.jsx(r,{...C},u),s.jsx("div",{"data-nexus-field":t,onBlur:W,style:Object.keys(x).length>0?x:void 0,children:c})}exports.NexusField=B;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),e=require("react"),Q=require("../utils/renderTreeNode.cjs"),U=require("./NexusFormProvider.cjs");function o(){}function X({form:r,schema:n,initialValues:h,widgets:l,layouts:c,onFinish:k,onFinishFailed:q,onMount:b,footer:f=!1,className:L,style:O,children:W,labelCol:a,labelWidth:P,colon:D,label:V,displayType:$,readOnly:y,column:I,watch:g,removeHiddenData:R=!0}){const t=r._getEngine(),x=e.useRef(null),F=$??n?.displayType??"row",S=V??n?.label??!0,j=D??n?.colon,s=P??n?.labelWidth,E=y??n?.readOnly??!1,i=I??n?.column;e.useEffect(()=>{l&&t.registerWidgets(l),c&&t.registerLayouts(c)},[t,l,c]);const T=e.useRef(!0),w=e.useRef(h);e.useEffect(()=>{n&&(T.current?(t.init(n,w.current),T.current=!1):t.init(n,t.getFormData()))},[t,n]);const m=e.useRef(b);m.current=b;const C=e.useRef(!1),N=!n||typeof n=="object"&&Object.keys(n).length===0;e.useEffect(()=>{C.current||N||(C.current=!0,m.current?.())},[N]);const v=e.useRef(o),_=e.useRef(o);v.current=k??o,_.current=q??o,e.useEffect(()=>{r._bind(x.current,()=>v.current,()=>_.current)},[r]),e.useEffect(()=>{r._syncConfig({removeHiddenData:R,watch:g})},[r,R,g]);const z=e.useSyncExternalStore(t.subscribeStore,t.getSnapshot,t.getSnapshot),A=e.useMemo(()=>t.getRenderTree(),[t,z]),B=e.useCallback(async p=>{p.preventDefault(),await r.submit()},[r]),G=e.useCallback(()=>{r.resetFields()},[r]);let d=null;f===!0?d=u.jsxs("div",{className:"mt-4",children:[u.jsx("button",{type:"submit",children:"提交"})," ",u.jsx("button",{type:"button",onClick:G,children:"重置"})]}):f&&(d=f);const M=e.useMemo(()=>{if(a)return a;if(s)return{style:{width:typeof s=="number"?`${s}px`:s}}},[a,s]),J=e.useMemo(()=>({labelCol:M,labelWidth:s,colon:j,label:S,displayType:F,readOnly:E,column:i}),[M,s,j,S,F,E,i]);return u.jsx(U.NexusFormProvider,{engine:t,config:J,form:r,children:u.jsxs("form",{ref:x,onSubmit:B,className:L,style:{...O,...i&&i>1?{display:"grid",gridTemplateColumns:`repeat(${i}, 1fr)`,gap:"0 16px"}:{}},noValidate:!0,children:[A.map((p,K)=>Q.renderTreeNode(p,K)),!y&&d,W]})})}exports.NexusForm=X;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),e=require("react");require("../contexts/NexusContext.cjs");require("@xbeeant/form-engine");const ce=require("../hooks/useFormSubmitting.cjs"),F=require("../utils/persist.cjs"),le=require("../utils/renderTreeNode.cjs"),ae=require("./NexusFormProvider.cjs");function S(){}function fe({form:u,schema:r,initialValues:z,widgets:d,layouts:b,fieldWrapper:g,onFinish:A,onFinishFailed:B,onMount:x,footer:R=!1,className:G,style:J,children:Q,labelCol:p,labelWidth:U,colon:X,label:Y,displayType:Z,readOnly:T,column:H,watch:j,onValuesChange:v,removeHiddenData:C=!0,omitNil:E=!1,locale:ee,persist:c}){const o=e.useId(),t=e.useMemo(()=>u._useInstance(o),[u,o]),q=e.useRef(null),l=e.useRef(c);l.current=c;const _=Z??r?.displayType??"row",N=Y??r?.label??!0,k=X??r?.colon,i=U??r?.labelWidth,L=T??r?.readOnly??!1,a=H??r?.column,M=ee??r?.locale??t.getLocale();e.useEffect(()=>{d&&t.registerWidgets(d),g&&t.registerFieldWrapper(g),b&&t.registerLayouts(b)},[t,d,b,g]);const P=e.useRef(!0),te=e.useRef(z);e.useEffect(()=>{if(r)if(P.current){const n=l.current?F.loadPersisted(l.current):void 0;t.init(r,n??te.current),P.current=!1}else t.init(r,t.getFormData())},[t,r]);const h=c?`${c.storage??"localStorage"}:${c.key}`:null;e.useEffect(()=>{const n=h?l.current:void 0;if(!n)return;let s=null;const m=n.debounce??300,oe=t.subscribeStore(()=>{s&&clearTimeout(s),s=setTimeout(()=>{F.savePersisted(n,t.getFormData())},m)});return()=>{s&&clearTimeout(s),oe()}},[t,h]);const O=e.useRef(x);O.current=x;const I=e.useRef(!1),$=!r||typeof r=="object"&&Object.keys(r).length===0;e.useEffect(()=>{I.current||$||(I.current=!0,O.current?.())},[$]);const D=e.useRef(S),V=e.useRef(S);D.current=n=>{const s=l.current;return s&&s.clearOnSubmit!==!1&&F.clearPersisted(s),A?.(n)},V.current=B??S,e.useEffect(()=>{u._bind(o,q.current,()=>D.current,()=>V.current)},[u,o]);const W=e.useRef(v);W.current=v,e.useEffect(()=>{u._syncConfig(o,{removeHiddenData:C,omitNil:E,watch:j,onValuesChange:(n,s,m)=>W.current?.(n,s,m)})},[u,o,C,E,j]);const ne=e.useSyncExternalStore(n=>t.subscribeRender(n),()=>t.getRenderSnapshot(),()=>t.getRenderSnapshot()),re=e.useMemo(()=>t.getRenderTree(),[t,ne]),se=e.useCallback(async n=>{n.preventDefault(),await u.submit()},[u]),ue=e.useCallback(()=>{u.resetFields()},[u]),K=ce.useFormSubmitting(u);let y=null;R===!0?y=f.jsxs("div",{className:"mt-4",children:[f.jsx("button",{type:"submit",disabled:K,children:K?"提交中...":"提交"})," ",f.jsx("button",{type:"button",onClick:ue,children:"重置"})]}):R&&(y=R);const w=e.useMemo(()=>{if(p)return p;if(i)return{style:{width:typeof i=="number"?`${i}px`:i}}},[p,i]),ie=e.useMemo(()=>({labelCol:w,labelWidth:i,colon:k,label:N,displayType:_,readOnly:L,column:a,locale:M}),[w,i,k,N,_,L,a,M]);return f.jsx(ae.NexusFormProvider,{engine:t,config:ie,form:u,children:f.jsxs("form",{ref:q,onSubmit:se,className:G,style:{...J,...a&&a>1?{display:"grid",gridTemplateColumns:`repeat(${a}, 1fr)`,gap:"0 16px"}:{}},noValidate:!0,children:[re.map((n,s)=>le.renderTreeNode(n,s)),!T&&y,Q]})})}exports.NexusForm=fe;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@xbeeant/form-engine"),f=require("../utils/omit-nil.cjs"),u=new WeakSet;class g{engine;submitting=!1;submittingListeners=new Set;views=new Map;instanceBindings=new Map;instanceConfigs=new Map;constructor(e){this.engine=e??new c.NexusEngine,this.engine.hasPlugin("async-validator")||this.engine.use(new c.AsyncValidatorPlugin(this.engine))}_useInstance(e){let t=this.views.get(e);return t||(this.views.size===0&&!u.has(this.engine)?(u.add(this.engine),t=this.engine):t=this.engine.instance(e),this.views.set(e,t),this.instanceConfigs.set(e,{removeHiddenData:!0,omitNil:!1,watchers:new Map,globalWatcher:null,onValuesChange:null})),t}resolveViews(){const e=Array.from(this.views.values());return e.length>0?e:[this.engine]}getPrimaryFormEl(){return this.instanceBindings.values().next().value?.formEl??null}_bind(e,t,s,n){this.instanceBindings.set(e,{formEl:t,getOnFinish:s,getOnFinishFailed:n}),this._useInstance(e).registerOnFieldValueChange((o,r)=>this._onFieldValueChange(e,o,r))}_syncConfig(e,t){const s=this.instanceConfigs.get(e)??{removeHiddenData:!0,omitNil:!1,watchers:new Map,globalWatcher:null,onValuesChange:null};if(t.removeHiddenData!==void 0&&(s.removeHiddenData=t.removeHiddenData),t.omitNil!==void 0&&(s.omitNil=t.omitNil),t.onValuesChange!==void 0&&(s.onValuesChange=t.onValuesChange),t.watch){s.watchers.clear(),s.globalWatcher=null;for(const[n,i]of Object.entries(t.watch))n==="#"?s.globalWatcher=i:s.watchers.set(n,i)}this.instanceConfigs.set(e,s)}_onFieldValueChange(e,t,s){const n=this.views.get(e),i=this.instanceConfigs.get(e);if(!n||!i)return;const o=n.getFormData(),r=i.removeHiddenData?o:n.getAllFormData();i.globalWatcher&&i.globalWatcher(r,r,t),i.onValuesChange&&i.onValuesChange(s,r,t);const a=i.watchers.get(t);a&&a(s,r)}_getEngine(){return this.engine}getEngine(){return this.engine}async submit(e){this.setSubmitting(!0);try{await this.runSubmit(e)}finally{this.setSubmitting(!1)}}getSubmitting(){return this.submitting}onSubmittingChange(e){return this.submittingListeners.add(e),()=>{this.submittingListeners.delete(e)}}setSubmitting(e){if(this.submitting!==e){this.submitting=e;for(const t of this.submittingListeners)t()}}async runSubmit(e){const t=this.resolveViews(),s=new Map;let n;for(const i of t){const o=await i.validate(void 0,{validateFirst:e?.validateFirst});if(o.size>0){for(const[r,a]of o)s.set(r,a);n??=this.instanceBindings.get(this.findInstanceId(i))}}if(s.size>0){this.focusFirstError(s,n?.formEl??null),n?.getOnFinishFailed()?.(s);return}for(const i of t){const o=this.findInstanceId(i),r=this.instanceConfigs.get(o)??{removeHiddenData:!0,omitNil:!1},a=r.removeHiddenData?i.getFormData():i.getAllFormData(),l=e?.omitNil??r.omitNil??!1?f.omitNilDeep(a):a;await i.submit(l)&&await this.instanceBindings.get(o)?.getOnFinish()?.(l)}}findInstanceId(e){for(const[t,s]of this.views)if(s===e)return t;return"default"}focusFirstError(e,t){if(!t||e.size===0)return;const s=new Set(e.keys());requestAnimationFrame(()=>{const i=t.querySelectorAll("[data-nexus-field]");for(const o of Array.from(i)){const r=o.getAttribute("data-nexus-field");if(!r||!s.has(r))continue;typeof o.scrollIntoView=="function"&&o.scrollIntoView({behavior:"smooth",block:"center"}),o.querySelector('input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')?.focus();return}})}resetFields(){for(const e of this.resolveViews())e.reset()}setErrorFields(e){for(const t of this.resolveViews())t.setErrorFields(e)}setValues(e){for(const t of this.resolveViews())t.setFieldValues(e)}setValueByPath(e,t){for(const s of this.resolveViews())s.setFieldValue(e,t)}setSchemaByPath(e,t){for(const s of this.resolveViews())s.setSchemaByPath(e,t)}setSchema(e){for(const t of this.resolveViews())t.setSchema(e)}getValues(e,t){const s={};for(const n of this.resolveViews()){const i=n.getFormData(e);t?.omitNil?Object.assign(s,f.omitNilDeep(i)):Object.assign(s,i)}return s}getHiddenValues(){const e={};for(const t of this.resolveViews())Object.assign(e,t.getHiddenValues());return e}getAllValues(){const e={};for(const t of this.resolveViews())Object.assign(e,t.getAllFormData());return e}getValueByPath(e){for(const t of this.resolveViews()){const s=t.getFieldValue(e);if(s!==void 0)return s}}registerValidator(e,t){for(const s of this.resolveViews())s.registerFieldValidator(e,t)}unregisterValidator(e,t){for(const s of this.resolveViews())s.unregisterFieldValidator(e,t)}revalidateField(e){for(const t of this.resolveViews())t.validateField(e,{trigger:"change"})}getSchema(){return this.resolveViews()[0]?.getSchema()??null}removeErrorField(e){for(const t of this.resolveViews())t.removeErrorField(e)}scrollToPath(e){this.getPrimaryFormEl()?.querySelector(`[data-nexus-field="${e}"]`)?.scrollIntoView({behavior:"smooth",block:"center"})}getFieldError(e){for(const t of this.resolveViews()){const s=t.getFieldError(e);if(s.length>0)return s}return[]}getFieldsError(){const e=new Map;for(const t of this.resolveViews())for(const[s,n]of t.getFieldsError())e.set(s,n);return e}validateFields(e,t){const s=this.resolveViews();return s.length===1?s[0].validate(e,t):Promise.all(s.map(n=>n.validate(e,t))).then(n=>{const i=new Map;for(const o of n)for(const[r,a]of o)i.set(r,a);return i})}getFieldState(e){for(const t of this.resolveViews()){const s=t.getFieldState(e);if(s)return s}}reloadRemoteData(e){for(const t of this.resolveViews())t.reloadRemoteData(e)}}exports.FormController=g;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),o=require("react"),k=require("../contexts/field-inherit-context.cjs"),D=require("../contexts/grid-context.cjs"),R=require("../contexts/layout-config-context.cjs"),L=require("../contexts/nexus-context.cjs"),$=require("../utils/resolve-col-span.cjs");function E({dataPath:t,layoutKey:f}){const{engine:s,config:m,form:i}=L.useNexusContext();o.useSyncExternalStore(n=>s.subscribeField(t,n),()=>s.getFieldVersion(t),()=>s.getFieldVersion(t));const e=s.getFieldState(t),F=o.useContext(D.GridContext),S=o.useContext(R.LayoutConfigContext),g=o.useContext(k.FieldInheritContext),V=o.useCallback(n=>{s.setFieldValue(t,n)},[s,t]),w=o.useCallback(n=>{n.currentTarget.contains(n.relatedTarget)||s.validateField(t,{trigger:"blur"})},[s,t]),W=o.useMemo(()=>e?.meta.enum?e.meta.enum.map((n,d)=>({value:n,label:e.meta.enumNames?.[d]??String(n)})):e?.props.options,[e?.meta.enum,e?.meta.enumNames,e?.props.options]),N=o.useMemo(()=>{const n={};if(e?.reactions){for(const d of e.reactions)if(d.dependencies)for(const u of d.dependencies)n[u]=s.getFieldValue(u)}return n},[e?.reactions,s]),O=o.useMemo(()=>{const n=e?.meta.itemOf,u=!!n?t.match(/\[(\d+)\]/):void 0,_=u?Number(u[1]):void 0;return{get formData(){return i.getValues()},get rootValue(){return i.getValues()},value:e?.value,dataPath:t,path:t,index:_,parentValues:n?i.getValueByPath(n):void 0,getValue:l=>i.getValueByPath(l),setValue:(l,c)=>i.setValueByPath(l,c),onItemChange:(l,c)=>i.setValueByPath(l,c),validate:async l=>{l?await i.validateFields([l]):await i.validateFields([t])},validateFields:async l=>{await i.validateFields(l)},submit:()=>i.submit(),resetFields:()=>i.resetFields(),setSchema:l=>i.setSchema(l),setSchemaByPath:(l,c)=>i.setSchemaByPath(l,c),getSchema:()=>i.getSchema()}},[i,t,e?.value,e?.meta.itemOf]);if(!e)return s.getSnapshot()>0&&console.warn(`[NexusField] Field not found: ${t}`),null;if(g.visible===!1||!e.visible)return S.removeHidden===!0?null:r.jsx("div",{className:"hidden","data-nexus-hidden":t});const p=m.readOnly||g.readOnly===!0||e.readOnly,j=g.disabled===!0||e.disabled,y=p&&!!e.meta.readOnlyWidget,q=y?e.meta.readOnlyWidget:e.meta.widget;let a=s.getWidget(q);if(!a&&y&&(a=s.getWidget(e.meta.widget)),!a)return r.jsxs("div",{className:"text-xs text-red-500","data-nexus-field":t,children:['⚠️ Widget "',e.meta.widget,'" 未注册 (path: ',t,")"]});const B=e.meta.displayType??m.displayType,T=e.meta.labelWidth??m.labelWidth,I=e.meta.column??m.column,v=$.resolveColSpan(e.meta.colSpan,F),h={...e.meta.width?{width:e.meta.width,flexShrink:0}:{},...v?{gridColumn:`span ${v}`}:{}},C=s.getFieldWrapper(),M={label:e.meta.label,title:e.meta.title,description:e.meta.description,tooltip:e.meta.tooltip,errors:e.errors,required:e.required,extra:e.meta.extra,displayType:B,labelWidth:T,column:I},b={dataPath:t,path:t,value:e.value,onChange:V,disabled:j,readOnly:p,loading:e.loading,placeholder:e.meta.placeholder,options:W,form:i,addons:O,dependValues:N,items:e.meta.items,schema:e.meta.schema,remoteVersion:s.getRemoteDataVersion(t),...e.props};let x;return C?x=r.jsx(C,{...M,children:r.jsx(a,{...b})},f):x=r.jsx(a,{...b},f),r.jsx("div",{"data-nexus-field":t,className:p?"nexus-field-readonly":void 0,onBlur:w,style:Object.keys(h).length>0?h:void 0,children:x})}exports.NexusField=E;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),n=require("react"),i=require("../contexts/nexus-context.cjs");function x({engine:e,config:r,form:t,children:o}){const u=n.useMemo(()=>({engine:e,config:r,form:t}),[e,r,t]);return s.jsx(i.NexusContext.Provider,{value:u,children:o})}exports.NexusFormProvider=x;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),e=require("react");require("../contexts/nexus-context.cjs");require("@xbeeant/form-engine");const ce=require("../hooks/use-form-submitting.cjs"),F=require("../utils/persist.cjs"),le=require("../utils/render-tree-node.cjs"),ae=require("./nexus-form-provider.cjs");function S(){}function fe({form:u,schema:r,initialValues:z,widgets:d,layouts:b,fieldWrapper:g,onFinish:A,onFinishFailed:B,onMount:x,footer:R=!1,className:G,style:J,children:Q,labelCol:p,labelWidth:U,colon:X,label:Y,displayType:Z,readOnly:T,column:H,watch:j,onValuesChange:v,removeHiddenData:C=!0,omitNil:E=!1,locale:ee,persist:c}){const o=e.useId(),t=e.useMemo(()=>u._useInstance(o),[u,o]),q=e.useRef(null),l=e.useRef(c);l.current=c;const _=Z??r?.displayType??"row",k=Y??r?.label??!0,L=X??r?.colon,i=U??r?.labelWidth,M=T??r?.readOnly??!1,a=H??r?.column,N=ee??r?.locale??t.getLocale();e.useEffect(()=>{d&&t.registerWidgets(d),g&&t.registerFieldWrapper(g),b&&t.registerLayouts(b)},[t,d,b,g]);const P=e.useRef(!0),te=e.useRef(z);e.useEffect(()=>{if(r)if(P.current){const n=l.current?F.loadPersisted(l.current):void 0;t.init(r,n??te.current),P.current=!1}else t.init(r,t.getFormData())},[t,r]);const h=c?`${c.storage??"localStorage"}:${c.key}`:null;e.useEffect(()=>{const n=h?l.current:void 0;if(!n)return;let s=null;const m=n.debounce??300,oe=t.subscribeStore(()=>{s&&clearTimeout(s),s=setTimeout(()=>{F.savePersisted(n,t.getFormData())},m)});return()=>{s&&clearTimeout(s),oe()}},[t,h]);const O=e.useRef(x);O.current=x;const I=e.useRef(!1),$=!r||typeof r=="object"&&Object.keys(r).length===0;e.useEffect(()=>{I.current||$||(I.current=!0,O.current?.())},[$]);const D=e.useRef(S),V=e.useRef(S);D.current=n=>{const s=l.current;return s&&s.clearOnSubmit!==!1&&F.clearPersisted(s),A?.(n)},V.current=B??S,e.useEffect(()=>{u._bind(o,q.current,()=>D.current,()=>V.current)},[u,o]);const W=e.useRef(v);W.current=v,e.useEffect(()=>{u._syncConfig(o,{removeHiddenData:C,omitNil:E,watch:j,onValuesChange:(n,s,m)=>W.current?.(n,s,m)})},[u,o,C,E,j]);const ne=e.useSyncExternalStore(n=>t.subscribeRender(n),()=>t.getRenderSnapshot(),()=>t.getRenderSnapshot()),re=e.useMemo(()=>t.getRenderTree(),[t,ne]),se=e.useCallback(async n=>{n.preventDefault(),await u.submit()},[u]),ue=e.useCallback(()=>{u.resetFields()},[u]),K=ce.useFormSubmitting(u);let y=null;R===!0?y=f.jsxs("div",{className:"mt-4",children:[f.jsx("button",{type:"submit",disabled:K,children:K?"提交中...":"提交"})," ",f.jsx("button",{type:"button",onClick:ue,children:"重置"})]}):R&&(y=R);const w=e.useMemo(()=>{if(p)return p;if(i)return{style:{width:typeof i=="number"?`${i}px`:i}}},[p,i]),ie=e.useMemo(()=>({labelCol:w,labelWidth:i,colon:L,label:k,displayType:_,readOnly:M,column:a,locale:N}),[w,i,L,k,_,M,a,N]);return f.jsx(ae.NexusFormProvider,{engine:t,config:ie,form:u,children:f.jsxs("form",{ref:q,onSubmit:se,className:G,style:{...J,...a&&a>1?{display:"grid",gridTemplateColumns:`repeat(${a}, 1fr)`,gap:"0 16px"}:{}},noValidate:!0,children:[re.map((n,s)=>le.renderTreeNode(n,s)),!T&&y,Q]})})}exports.NexusForm=fe;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),l=require("react"),y=require("../contexts/grid-context.cjs"),u=require("../contexts/layout-config-context.cjs"),C=require("../contexts/nexus-context.cjs"),v=require("../utils/render-tree-node.cjs"),h=require("../utils/resolve-col-span.cjs");function g({node:e}){const{engine:c}=C.useNexusContext(),r=c.getLayout(e.type),s=e.children.map((d,x)=>v.renderTreeNode(d,x)),a=l.useContext(y.GridContext),n=h.resolveColSpan(e.props.colSpan,a),o={...n?{gridColumn:`span ${n}`}:{},...e.props.width?{width:e.props.width,flexShrink:0}:{}},i=l.useMemo(()=>({removeHidden:e.props.removeHidden}),[e.props.removeHidden]);if(!r)return t.jsx(u.LayoutConfigContext.Provider,{value:i,children:t.jsxs("div",{"data-nexus-layout":e.type,className:"mb-4",style:Object.keys(o).length>0?o:void 0,children:[e.title&&t.jsx("div",{className:"mb-2 font-bold",children:e.title}),s]})});const{displayType:m,labelWidth:f,colSpan:j,width:S,...p}=e.props;return t.jsx(u.LayoutConfigContext.Provider,{value:i,children:t.jsx("div",{style:Object.keys(o).length>0?o:void 0,children:t.jsx(r,{...p,node:e,title:e.title,children:s})})})}exports.NexusLayout=g;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),o=require("react"),h=require("../contexts/field-inherit-context.cjs"),v=require("../contexts/nexus-context.cjs"),m=require("../utils/render-tree-node.cjs");function f({node:e}){const{engine:s,config:a}=v.useNexusContext(),n=o.useContext(h.FieldInheritContext);o.useSyncExternalStore(i=>s.subscribeField(e.dataPath,i),()=>s.getFieldVersion(e.dataPath),()=>s.getFieldVersion(e.dataPath));const r=s.getFieldState(e.dataPath),[l,x]=o.useState(!1),d=(a.column??1)>1,c=d?{gridTemplateColumns:`repeat(${a.column}, 1fr)`}:{},u={disabled:n.disabled??(r?.disabled===!0?!0:void 0),readOnly:n.readOnly??(r?.readOnly===!0?!0:void 0),visible:n.visible===!1||r?.visible===!1?!1:void 0},b=u.visible===!1,g=()=>x(i=>!i);return t.jsx(h.FieldInheritContext.Provider,{value:u,children:t.jsxs("div",{"data-nexus-object":e.dataPath,className:`mb-4 ${b?"hidden":""}`,children:[e.title&&t.jsxs("div",{onClick:g,className:"flex gap-1 mb-2 cursor-pointer select-none border-none bg-transparent p-0 font-bold",children:[t.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:`align-middle transition-transform duration-200 ease-in-out ${l?"rotate-0":"rotate-90"}`,"aria-hidden":"true",children:t.jsx("polyline",{points:"9 18 15 12 9 6"})}),e.title]}),t.jsx("div",{className:`${d?"grid gap-x-4":""} ${l?"hidden":""}`,style:Object.keys(c).length>0?c:void 0,children:e.children.map((i,p)=>m.renderTreeNode(i,p))})]})})}exports.NexusObject=f;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react"),t=e.createContext({});exports.FieldInheritContext=t;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),e=t.createContext(null);exports.GridContext=e;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),e=t.createContext({});exports.LayoutConfigContext=e;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),o=t.createContext(null);function u(){const e=t.useContext(o);if(!e)throw new Error("[NexusField] Must be used within <NexusFormProvider>");return e}exports.NexusContext=o;exports.useNexusContext=u;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useEngine.cjs"),s=require("./useFieldState.cjs"),u=require("./useFieldValidator.cjs"),o=require("./useFieldValue.cjs"),t=require("./useForm.cjs"),r=require("./useFormConfig.cjs"),a=require("./useFormData.cjs"),i=require("./useWatch.cjs"),l=require("./useWatchAll.cjs"),c=require("./useWatchMultiple.cjs"),h=require("./useWatchState.cjs");exports.useEngine=e.useEngine;exports.useFieldState=s.useFieldState;exports.useFieldValidator=u.useFieldValidator;exports.useFieldValue=o.useFieldValue;exports.useForm=t.useForm;exports.useFormConfig=r.useFormConfig;exports.useFormData=a.useFormData;exports.useWatch=i.useWatch;exports.useWatchAll=l.useWatchAll;exports.useWatchMultiple=c.useWatchMultiple;exports.useWatchState=h.useWatchState;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./use-engine.cjs"),s=require("./use-field-state.cjs"),u=require("./use-field-validator.cjs"),o=require("./use-field-value.cjs"),t=require("./use-form.cjs"),r=require("./use-form-config.cjs"),i=require("./use-form-data.cjs"),a=require("./use-form-submitting.cjs"),l=require("./use-watch.cjs"),c=require("./use-watch-all.cjs"),n=require("./use-watch-multiple.cjs"),h=require("./use-watch-state.cjs");exports.useEngine=e.useEngine;exports.useFieldState=s.useFieldState;exports.useFieldValidator=u.useFieldValidator;exports.useFieldValue=o.useFieldValue;exports.useForm=t.useForm;exports.useFormConfig=r.useFormConfig;exports.useFormData=i.useFormData;exports.useFormSubmitting=a.useFormSubmitting;exports.useWatch=l.useWatch;exports.useWatchAll=c.useWatchAll;exports.useWatchMultiple=n.useWatchMultiple;exports.useWatchState=h.useWatchState;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("../contexts/nexus-context.cjs");function t(){const{engine:e}=n.useNexusContext();return e}exports.useEngine=t;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react"),r=require("../contexts/nexus-context.cjs");function s(e){const{engine:t}=r.useNexusContext();return i.useSyncExternalStore(n=>t.subscribeField(e,n),()=>t.getFieldVersion(e),()=>t.getFieldVersion(e)),t.getFieldState(e)}exports.useFieldState=s;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react"),g=require("../contexts/nexus-context.cjs");function b(n,e,i,u){const{engine:d}=g.useNexusContext(),o=s.useRef(i);o.current=i;const t=s.useRef(u?.dependsOn);t.current=u?.dependsOn;const l=u?.deps;s.useEffect(()=>{if(!n||!e)return;const r=o.current;return n.registerValidator(e,r),()=>{n.unregisterValidator(e,r)}},[n,e,...l??[]]),s.useEffect(()=>{if(!e||!t.current||t.current.length===0)return;const r=d;if(!r)return;const f=e,a=t.current.map(c=>r.subscribeField(c,()=>{n?.revalidateField(f)}));return()=>{for(const c of a)c()}},[d,n,e])}exports.useFieldValidator=b;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),u=require("./use-engine.cjs");function s(e){const i=u.useEngine();return r.useSyncExternalStore(n=>i.subscribeField(e,n),()=>i.getFieldVersion(e),()=>i.getFieldVersion(e)),i.getFieldValue(e)}exports.useFieldValue=s;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../contexts/nexus-context.cjs");function o(){const{config:e}=t.useNexusContext();return e}exports.useFormConfig=o;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),r=require("./use-engine.cjs");function s(){const e=r.useEngine(),n=t.useSyncExternalStore(o=>e.subscribeStore(o),()=>e.getSnapshot(),()=>e.getSnapshot());return t.useMemo(()=>e.getFormData(),[e,n])}exports.useFormData=s;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react");function n(t){return i.useSyncExternalStore(e=>t.onSubmittingChange(e),()=>t.getSubmitting(),()=>t.getSubmitting())}exports.useFormSubmitting=n;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("@xbeeant/form-engine"),t=require("react"),u=require("../components/form-controller.cjs");function c(r,n){const e=t.useRef(null);return e.current||(e.current=new u.FormController(n??(r?new o.NexusEngine({formId:r}):void 0))),[e.current]}exports.useForm=c;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),o=t.createContext(null);function u(){const e=t.useContext(o);if(!e)throw new Error("[NexusField] Must be used within <NexusFormProvider>");return e}exports.NexusContext=o;exports.useNexusContext=u;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react");function R(t,i,b){const{deep:l=!1}=b||{},e=s.useRef({}),c=s.useRef({}),u=s.useRef(i);return u.current=i,s.useEffect(()=>{if(!t)return;const f=t.getFormData();e.current=f,c.current=f,u.current(f);const d=t.subscribeAll(r=>{if(l)JSON.stringify(r)!==JSON.stringify(e.current)&&(e.current=r,c.current=r,u.current(r));else{let n=!1;for(const o in r)if(r[o]!==e.current[o]){n=!0;break}n&&(e.current=r,c.current=r,u.current(r))}});return()=>{d()}},[t,l]),c.current}exports.useWatchAll=R;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react");function h(r,n,a,d){const{deep:l=!1}=d||{},o=t.useRef({}),u=t.useRef({}),f=t.useRef(a);f.current=a;const i=t.useRef(n);i.current=n;const y=[...n].sort().join(",");return t.useEffect(()=>{if(!r)return;const R=i.current,c={};for(const e of R)c[e]=r.getFieldValue(e);o.current=c,u.current=c,f.current(c);const V=R.map(e=>r.subscribe(e,g=>{const s=g.value,b=o.current[e];(l?JSON.stringify(s)!==JSON.stringify(b):s!==b)&&(o.current[e]=s,u.current={[e]:s},f.current(u.current))}));return()=>{for(const e of V)e()}},[r,l,y]),u.current}exports.useWatchMultiple=h;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react");function i(t,e,n){const r=s.useRef(void 0),u=s.useRef(n);return u.current=n,s.useEffect(()=>{if(!t)return;const c=t.getFieldState(e);r.current=c,c&&u.current(c);const f=t.subscribe(e,o=>{r.current=o,u.current(o)});return()=>{f()}},[t,e]),r.current||{}}exports.useWatchState=i;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react");function d(t,c,i,l){const{deep:s=!1}=l||{},e=o.useRef(void 0),n=o.useRef(i);return n.current=i,o.useEffect(()=>{if(!t)return;const r=t.getFieldValue(c);e.current===void 0&&(e.current=r),(s?JSON.stringify(r)!==JSON.stringify(e.current):r!==e.current)&&(e.current=r,n.current(r));const f=t.subscribe(c,a=>{const u=a.value;(s?JSON.stringify(u)!==JSON.stringify(e.current):u!==e.current)&&(e.current=u,n.current(u))});return()=>{f()}},[t,c,s]),e.current}exports.useWatch=d;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),o=require("./useEngine.cjs");function r(){const e=o.useEngine(),n=t.useSyncExternalStore(e.subscribeStore,e.getSnapshot,e.getSnapshot);return t.useMemo(()=>e.getFormData(),[e,n])}exports.useFormData=r;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),r=require("./useEngine.cjs");function s(){const e=r.useEngine(),n=t.useSyncExternalStore(o=>e.subscribeStore(o),()=>e.getSnapshot(),()=>e.getSnapshot());return t.useMemo(()=>e.getFormData(),[e,n])}exports.useFormData=s;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react");function n(t){return i.useSyncExternalStore(e=>t.onSubmittingChange(e),()=>t.getSubmitting(),()=>t.getSubmitting())}exports.useFormSubmitting=n;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./styles.css');;/* empty css */const e=require("./components/FormController.cjs"),o=require("./components/NexusField.cjs"),t=require("./components/NexusForm.cjs"),s=require("./components/NexusFormProvider.cjs"),r=require("./components/NexusLayout.cjs"),u=require("./components/NexusObject.cjs"),n=require("./contexts/FieldInheritContext.cjs"),i=require("./contexts/GridContext.cjs"),c=require("./contexts/LayoutConfigContext.cjs"),l=require("./hooks/useEngine.cjs"),a=require("./hooks/useFieldState.cjs"),F=require("./hooks/useFieldValidator.cjs"),x=require("./hooks/useFieldValue.cjs"),d=require("./hooks/useForm.cjs"),h=require("./hooks/useFormConfig.cjs"),m=require("./hooks/useFormData.cjs"),q=require("./hooks/useWatch.cjs"),_=require("./hooks/useWatchAll.cjs"),C=require("./hooks/useWatchMultiple.cjs"),N=require("./hooks/useWatchState.cjs");exports.FormController=e.FormController;exports.NexusField=o.NexusField;exports.NexusForm=t.NexusForm;exports.NexusFormProvider=s.NexusFormProvider;exports.NexusLayout=r.NexusLayout;exports.NexusObject=u.NexusObject;exports.FieldInheritContext=n.FieldInheritContext;exports.GridContext=i.GridContext;exports.LayoutConfigContext=c.LayoutConfigContext;exports.useEngine=l.useEngine;exports.useFieldState=a.useFieldState;exports.useFieldValidator=F.useFieldValidator;exports.useFieldValue=x.useFieldValue;exports.useForm=d.useForm;exports.useFormConfig=h.useFormConfig;exports.useFormData=m.useFormData;exports.useWatch=q.useWatch;exports.useWatchAll=_.useWatchAll;exports.useWatchMultiple=C.useWatchMultiple;exports.useWatchState=N.useWatchState;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./styles.css');;/* empty css */const e=require("./components/form-controller.cjs"),o=require("./components/nexus-field.cjs"),t=require("./components/nexus-form.cjs"),s=require("./components/nexus-form-provider.cjs"),u=require("./components/nexus-layout.cjs"),r=require("./components/nexus-object.cjs"),n=require("./contexts/field-inherit-context.cjs"),i=require("./contexts/grid-context.cjs"),c=require("./contexts/layout-config-context.cjs"),l=require("./contexts/nexus-context.cjs"),a=require("./hooks/use-engine.cjs"),x=require("./hooks/use-field-state.cjs"),F=require("./hooks/use-field-validator.cjs"),m=require("./hooks/use-field-value.cjs"),h=require("./hooks/use-form.cjs"),d=require("./hooks/use-form-config.cjs"),q=require("./hooks/use-form-data.cjs"),_=require("./hooks/use-form-submitting.cjs"),C=require("./hooks/use-watch.cjs"),g=require("./hooks/use-watch-all.cjs"),k=require("./hooks/use-watch-multiple.cjs"),N=require("./hooks/use-watch-state.cjs");exports.FormController=e.FormController;exports.NexusField=o.NexusField;exports.NexusForm=t.NexusForm;exports.NexusFormProvider=s.NexusFormProvider;exports.NexusLayout=u.NexusLayout;exports.NexusObject=r.NexusObject;exports.FieldInheritContext=n.FieldInheritContext;exports.GridContext=i.GridContext;exports.LayoutConfigContext=c.LayoutConfigContext;exports.NexusContext=l.NexusContext;exports.useEngine=a.useEngine;exports.useFieldState=x.useFieldState;exports.useFieldValidator=F.useFieldValidator;exports.useFieldValue=m.useFieldValue;exports.useForm=h.useForm;exports.useFormConfig=d.useFormConfig;exports.useFormData=q.useFormData;exports.useFormSubmitting=_.useFormSubmitting;exports.useWatch=C.useWatch;exports.useWatchAll=g.useWatchAll;exports.useWatchMultiple=k.useWatchMultiple;exports.useWatchState=N.useWatchState;
@@ -1 +1 @@
1
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}:root,:host{--color-red-500:oklch(63.7% .237 25.331);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--font-weight-bold:700;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}.visible{visibility:visible}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.cursor-pointer{cursor:pointer}.gap-1{gap:var(--spacing)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.border-none{--tw-border-style:none;border-style:none}.bg-transparent{background-color:#0000}.p-0{padding:0}.align-middle{vertical-align:middle}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.text-red-500{color:var(--color-red-500)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}:root,:host{--color-red-500:oklch(63.7% .237 25.331);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--font-weight-bold:700;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}.visible{visibility:visible}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.cursor-pointer{cursor:pointer}.gap-1{gap:var(--spacing)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.border-none{--tw-border-style:none;border-style:none}.bg-transparent{background-color:#0000}.p-0{padding:0}.align-middle{vertical-align:middle}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.text-red-500{color:var(--color-red-500)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function i(t){if(Array.isArray(t))return t.map(e=>i(e));if(t!==null&&typeof t=="object"){const e={};for(const[o,r]of Object.entries(t))r==null||r===""||(e[o]=i(r));return e}return t}exports.omitNilDeep=i;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function i(t){if(Array.isArray(t))return t.map(e=>i(e));if(t!==null&&typeof t=="object"){const e={};for(const[o,r]of Object.entries(t))r==null||r===""||(e[o]=i(r));return e}return t}exports.omitNilDeep=i;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function o(t){if(!(typeof window>"u"))try{const e=t==="sessionStorage"?window.sessionStorage:window.localStorage;return e.setItem("__nexus_persist_probe__","1"),e.removeItem("__nexus_persist_probe__"),e}catch{return}}function n(t){const e=o(t.storage);if(e)try{const r=e.getItem(t.key);if(!r)return;const s=JSON.parse(r);return typeof s=="object"&&s!==null?s:void 0}catch{return}}function i(t,e){const r=o(t.storage);if(r)try{r.setItem(t.key,JSON.stringify(e))}catch{}}function a(t){const e=o(t.storage);if(e)try{e.removeItem(t.key)}catch{}}exports.clearPersisted=a;exports.loadPersisted=n;exports.savePersisted=i;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),r=require("../components/nexus-field.cjs"),s=require("../components/nexus-layout.cjs"),a=require("../components/nexus-object.cjs");function o(e,u){return e.type==="field"?t.jsx(r.NexusField,{dataPath:e.dataPath,layoutKey:e.layoutKey},e.layoutKey||e.dataPath):e.type==="object"?t.jsx(a.NexusObject,{node:e},`object-${e.layoutKey}-${u}`):t.jsx(s.NexusLayout,{node:e},`layout-${e.type}-${u}`)}exports.renderTreeNode=o;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function n(o,e){if(o!==void 0)return o;if(e&&e.column>0)return Math.max(1,Math.round(e.column/24))}exports.resolveColSpan=n;
@@ -1,35 +1,79 @@
1
1
  import { FieldState, NexusFormInstance, NexusSchema, NexusEngine } from '@xbeeant/form-engine';
2
2
  /**
3
- * FormController — 包裹 Engine,暴露 Form 实例 API
3
+ * FormController — 包裹引擎宿主,暴露 Form 实例 API
4
+ *
5
+ * 一个 form 可承载多个 NexusForm 挂载(每个挂载一份 schema,schema 与状态互相独立)。
6
+ * 实例标识由 NexusForm 内部生成(React useId),用户侧不感知任何 instanceId:
7
+ * - 同一 form 引用 = 同一引擎宿主:插件/组件注册/跨表单联动等引擎级能力共享
8
+ * - 每个 NexusForm 挂载自动获得独立实例:schema/值/校验/订阅互不影响
9
+ * - form 的 API(getValues/setValues/submit/resetFields...)聚合作用于全部实例
10
+ * - 引擎本身是独立实体,可单独创建或跨 form 复用(useForm(formId, engine))
4
11
  */
5
12
  export declare class FormController implements NexusFormInstance {
6
13
  private engine;
7
- private formElementRef;
8
- /** 稳定的 getter:每次 submit 执行时从外部 ref 读取最新的 onFinish/onFinishFailed 回调 */
9
- private getOnFinish;
10
- private getOnFinishFailed;
11
- private removeHiddenData;
12
- private watchers;
13
- private globalWatcher;
14
+ /** 提交中状态(校验 + onFinish 全流程,formily submitting 对齐) */
15
+ private submitting;
16
+ /** 提交状态监听器(供 useSyncExternalStore 消费) */
17
+ private submittingListeners;
18
+ /** 实例标识(内部)→ 实例视图引擎(同一 form 挂载的多个 NexusForm 各自独立) */
19
+ private views;
20
+ /** 实例标识 → 该实例的 DOM / 回调绑定(onFinish/onFinishFailed 按实例独立) */
21
+ private instanceBindings;
22
+ /** 实例标识 → watch / removeHiddenData / onValuesChange / omitNil 配置(按实例独立) */
23
+ private instanceConfigs;
14
24
  constructor(engine?: NexusEngine);
15
- /** 内部:首次绑定表单 DOM + 回调 getter(由 NexusForm 在挂载时调用一次) */
16
- _bind(formEl: HTMLFormElement | null, getOnFinish: () => (data: Record<string, unknown>) => void | Promise<void>, getOnFinishFailed: () => (errors: Map<string, string[]>) => void): void;
17
- /** 内部:同步 watch / removeHiddenData 配置(由 NexusForm 在它们变化时调用) */
18
- _syncConfig(config: {
25
+ /**
26
+ * 获取(或创建)指定实例的引擎视图
27
+ *
28
+ * 同一 form 挂载多个 NexusForm 时各自独立:schema/值/订阅互不影响。
29
+ * 实例标识由 NexusForm 内部分配(React useId),用户不感知。
30
+ *
31
+ * @param instanceId - 实例标识(内部)
32
+ * @returns 定向到该实例的引擎视图
33
+ */
34
+ _useInstance(instanceId: string): NexusEngine;
35
+ /**
36
+ * 内部:解析方法作用的目标实例视图(聚合全部实例,无实例时回退宿主引擎)
37
+ */
38
+ private resolveViews;
39
+ /** 内部:首次绑定的实例 DOM(兼容既有 scrollToPath/focusFirstError 单实例行为) */
40
+ private getPrimaryFormEl;
41
+ /**
42
+ * 内部:绑定实例 DOM + 回调 getter(由 NexusForm 在挂载时按实例调用)
43
+ * 回调以 getter 传入:submit 时读取最新闭包,而非绑定时刻的快照
44
+ */
45
+ _bind(instanceId: string, formEl: HTMLFormElement | null, getOnFinish: () => (data: Record<string, unknown>) => void | Promise<void>, getOnFinishFailed: () => (errors: Map<string, string[]>) => void): void;
46
+ /** 内部:同步 watch / removeHiddenData / onValuesChange 配置(由 NexusForm 在它们变化时按实例调用) */
47
+ _syncConfig(instanceId: string, config: {
19
48
  removeHiddenData?: boolean;
49
+ /** 提交/取值时递归移除空值(undefined/null/'',ProForm omitNil 对齐) */
50
+ omitNil?: boolean;
20
51
  watch?: {
21
52
  [path: string]: (value: unknown, allValues: Record<string, unknown>, changedPath?: string) => void;
22
53
  };
54
+ onValuesChange?: (changedValue: unknown, allValues: Record<string, unknown>, changedPath: string) => void;
23
55
  }): void;
24
- /** 内部:值变更时调用(由 Engine 通知) */
25
- _onFieldValueChange(path: string, value: unknown): void;
26
- /** 内部:获取 Engine 实例 */
56
+ /** 内部:值变更时调用(由 Engine 通知,携带实例标识路由到对应实例的 watcher) */
57
+ _onFieldValueChange(instanceId: string, path: string, value: unknown): void;
58
+ /** 内部:获取引擎宿主实例 */
27
59
  _getEngine(): NexusEngine;
28
60
  /**
29
- * 获取底层 Engine 实例(用于跨表单联动:linkForm / setFormId 等)
61
+ * 获取底层引擎宿主实例(用于跨表单联动:linkForm / setFormId / registerAntdUI 等;
62
+ * 宿主上的组件/插件注册对全部实例生效)
30
63
  */
31
64
  getEngine(): NexusEngine;
32
- submit(): Promise<void>;
65
+ submit(options?: {
66
+ validateFirst?: boolean;
67
+ omitNil?: boolean;
68
+ }): Promise<void>;
69
+ /** 提交中状态(formily submitting 对齐,供提交按钮 loading) */
70
+ getSubmitting(): boolean;
71
+ /** 订阅提交状态变化(返回取消订阅函数,供 useSyncExternalStore 使用) */
72
+ onSubmittingChange(callback: () => void): () => void;
73
+ private setSubmitting;
74
+ private runSubmit;
75
+ /** 内部:反查实例视图对应的实例标识 */
76
+ private findInstanceId;
33
77
  /**
34
78
  * 定位到第一个校验失败的字段:按 DOM 渲染顺序查找(保证视觉上的"第一个"),
35
79
  * 滚动入视并聚焦其内部可交互控件。
@@ -44,7 +88,9 @@ export declare class FormController implements NexusFormInstance {
44
88
  setValueByPath(path: string, value: unknown): void;
45
89
  setSchemaByPath(path: string, patch: Record<string, unknown>): void;
46
90
  setSchema(schema: NexusSchema): void;
47
- getValues(paths?: string[]): Record<string, unknown>;
91
+ getValues(paths?: string[], options?: {
92
+ omitNil?: boolean;
93
+ }): Record<string, unknown>;
48
94
  getHiddenValues(): Record<string, unknown>;
49
95
  /** 获取所有字段值(含 hidden) */
50
96
  getAllValues(): Record<string, unknown>;
@@ -70,6 +116,14 @@ export declare class FormController implements NexusFormInstance {
70
116
  scrollToPath(path: string): void;
71
117
  getFieldError(path: string): string[];
72
118
  getFieldsError(): Map<string, string[]>;
73
- validateFields(paths?: string[]): Promise<Map<string, string[]>>;
119
+ validateFields(paths?: string[], options?: {
120
+ validateFirst?: boolean;
121
+ }): Promise<Map<string, string[]>>;
74
122
  getFieldState(path: string): FieldState | undefined;
123
+ /**
124
+ * 重载远程选项数据(x-render reloadRemoteData 对齐)
125
+ * 传入 path 仅重载该字段的远程数据;缺省时重载全部远程数据字段。
126
+ * 作用于全部实例视图。
127
+ */
128
+ reloadRemoteData(path?: string): void;
75
129
  }