formio-react-native 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +384 -0
  2. package/lib/commonjs/components/CheckboxField.js +2 -0
  3. package/lib/commonjs/components/DataGrid.js +2 -0
  4. package/lib/commonjs/components/DatePicker.js +2 -0
  5. package/lib/commonjs/components/EditGrid.js +2 -0
  6. package/lib/commonjs/components/FileUpload.js +2 -0
  7. package/lib/commonjs/components/FormioField.js +2 -0
  8. package/lib/commonjs/components/FormioForm.js +2 -0
  9. package/lib/commonjs/components/ResourceSelect.js +2 -0
  10. package/lib/commonjs/components/Wizard.js +2 -0
  11. package/lib/commonjs/components/renderers/CheckboxRenderer.js +2 -0
  12. package/lib/commonjs/components/renderers/EmailRenderer.js +2 -0
  13. package/lib/commonjs/components/renderers/FallbackRenderer.js +2 -0
  14. package/lib/commonjs/components/renderers/NumberRenderer.js +2 -0
  15. package/lib/commonjs/components/renderers/PasswordRenderer.js +2 -0
  16. package/lib/commonjs/components/renderers/PhoneNumberRenderer.js +2 -0
  17. package/lib/commonjs/components/renderers/RadioRenderer.js +2 -0
  18. package/lib/commonjs/components/renderers/SelectRenderer.js +2 -0
  19. package/lib/commonjs/components/renderers/SelectboxesRenderer.js +2 -0
  20. package/lib/commonjs/components/renderers/TextAreaRenderer.js +2 -0
  21. package/lib/commonjs/components/renderers/TextfieldRenderer.js +2 -0
  22. package/lib/commonjs/components/renderers/URLRenderer.js +2 -0
  23. package/lib/commonjs/components/renderers/index.js +2 -0
  24. package/lib/commonjs/constants/colors.js +2 -0
  25. package/lib/commonjs/constants/componentTypes.js +2 -0
  26. package/lib/commonjs/constants/index.js +2 -0
  27. package/lib/commonjs/constants/spacing.js +2 -0
  28. package/lib/commonjs/constants/typography.js +2 -0
  29. package/lib/commonjs/constants/validationMessages.js +2 -0
  30. package/lib/commonjs/context/FormioContext.js +2 -0
  31. package/lib/commonjs/errors/ErrorBoundary.js +2 -0
  32. package/lib/commonjs/errors/FormioError.js +2 -0
  33. package/lib/commonjs/errors/errorUtils.js +2 -0
  34. package/lib/commonjs/errors/index.js +2 -0
  35. package/lib/commonjs/hooks/useTheme.js +2 -0
  36. package/lib/commonjs/i18n/I18nContext.js +2 -0
  37. package/lib/commonjs/i18n/locales/ar/index.js +2 -0
  38. package/lib/commonjs/i18n/locales/fr/index.js +2 -0
  39. package/lib/commonjs/i18n/messages.js +2 -0
  40. package/lib/commonjs/i18n/translations/en.js +2 -0
  41. package/lib/commonjs/i18n/types.js +2 -0
  42. package/lib/commonjs/index.js +2 -0
  43. package/lib/commonjs/package.json +1 -0
  44. package/lib/commonjs/registry/ComponentRegistry.js +2 -0
  45. package/lib/commonjs/registry/index.js +2 -0
  46. package/lib/commonjs/types.js +2 -0
  47. package/lib/commonjs/utils/a11yUtils.js +2 -0
  48. package/lib/commonjs/utils/componentUtils.js +2 -0
  49. package/lib/commonjs/utils/index.js +2 -0
  50. package/lib/commonjs/utils/logger.js +2 -0
  51. package/lib/commonjs/utils/performanceUtils.js +2 -0
  52. package/lib/commonjs/utils/rtlUtils.js +2 -0
  53. package/lib/commonjs/utils/safeEval.js +21 -0
  54. package/lib/commonjs/utils/styleUtils.js +2 -0
  55. package/lib/commonjs/validation.js +2 -0
  56. package/lib/module/components/CheckboxField.js +2 -0
  57. package/lib/module/components/DataGrid.js +2 -0
  58. package/lib/module/components/DatePicker.js +2 -0
  59. package/lib/module/components/EditGrid.js +2 -0
  60. package/lib/module/components/FileUpload.js +2 -0
  61. package/lib/module/components/FormioField.js +2 -0
  62. package/lib/module/components/FormioForm.js +2 -0
  63. package/lib/module/components/ResourceSelect.js +2 -0
  64. package/lib/module/components/Wizard.js +2 -0
  65. package/lib/module/components/renderers/CheckboxRenderer.js +2 -0
  66. package/lib/module/components/renderers/EmailRenderer.js +2 -0
  67. package/lib/module/components/renderers/FallbackRenderer.js +2 -0
  68. package/lib/module/components/renderers/NumberRenderer.js +2 -0
  69. package/lib/module/components/renderers/PasswordRenderer.js +2 -0
  70. package/lib/module/components/renderers/PhoneNumberRenderer.js +2 -0
  71. package/lib/module/components/renderers/RadioRenderer.js +2 -0
  72. package/lib/module/components/renderers/SelectRenderer.js +2 -0
  73. package/lib/module/components/renderers/SelectboxesRenderer.js +2 -0
  74. package/lib/module/components/renderers/TextAreaRenderer.js +2 -0
  75. package/lib/module/components/renderers/TextfieldRenderer.js +2 -0
  76. package/lib/module/components/renderers/URLRenderer.js +2 -0
  77. package/lib/module/components/renderers/index.js +2 -0
  78. package/lib/module/constants/colors.js +2 -0
  79. package/lib/module/constants/componentTypes.js +2 -0
  80. package/lib/module/constants/index.js +2 -0
  81. package/lib/module/constants/spacing.js +2 -0
  82. package/lib/module/constants/typography.js +2 -0
  83. package/lib/module/constants/validationMessages.js +2 -0
  84. package/lib/module/context/FormioContext.js +2 -0
  85. package/lib/module/errors/ErrorBoundary.js +2 -0
  86. package/lib/module/errors/FormioError.js +2 -0
  87. package/lib/module/errors/errorUtils.js +2 -0
  88. package/lib/module/errors/index.js +2 -0
  89. package/lib/module/hooks/useTheme.js +2 -0
  90. package/lib/module/i18n/I18nContext.js +2 -0
  91. package/lib/module/i18n/locales/ar/index.js +2 -0
  92. package/lib/module/i18n/locales/fr/index.js +2 -0
  93. package/lib/module/i18n/messages.js +2 -0
  94. package/lib/module/i18n/translations/en.js +2 -0
  95. package/lib/module/i18n/types.js +2 -0
  96. package/lib/module/index.js +2 -0
  97. package/lib/module/package.json +1 -0
  98. package/lib/module/registry/ComponentRegistry.js +2 -0
  99. package/lib/module/registry/index.js +2 -0
  100. package/lib/module/types.js +2 -0
  101. package/lib/module/utils/a11yUtils.js +2 -0
  102. package/lib/module/utils/componentUtils.js +2 -0
  103. package/lib/module/utils/index.js +2 -0
  104. package/lib/module/utils/logger.js +2 -0
  105. package/lib/module/utils/performanceUtils.js +2 -0
  106. package/lib/module/utils/rtlUtils.js +2 -0
  107. package/lib/module/utils/safeEval.js +21 -0
  108. package/lib/module/utils/styleUtils.js +2 -0
  109. package/lib/module/validation.js +2 -0
  110. package/lib/typescript/commonjs/components/CheckboxField.d.ts +11 -0
  111. package/lib/typescript/commonjs/components/DataGrid.d.ts +20 -0
  112. package/lib/typescript/commonjs/components/DatePicker.d.ts +25 -0
  113. package/lib/typescript/commonjs/components/EditGrid.d.ts +18 -0
  114. package/lib/typescript/commonjs/components/FileUpload.d.ts +35 -0
  115. package/lib/typescript/commonjs/components/FormioField.d.ts +11 -0
  116. package/lib/typescript/commonjs/components/FormioForm.d.ts +4 -0
  117. package/lib/typescript/commonjs/components/ResourceSelect.d.ts +38 -0
  118. package/lib/typescript/commonjs/components/Wizard.d.ts +31 -0
  119. package/lib/typescript/commonjs/components/renderers/CheckboxRenderer.d.ts +4 -0
  120. package/lib/typescript/commonjs/components/renderers/EmailRenderer.d.ts +4 -0
  121. package/lib/typescript/commonjs/components/renderers/FallbackRenderer.d.ts +4 -0
  122. package/lib/typescript/commonjs/components/renderers/NumberRenderer.d.ts +4 -0
  123. package/lib/typescript/commonjs/components/renderers/PasswordRenderer.d.ts +4 -0
  124. package/lib/typescript/commonjs/components/renderers/PhoneNumberRenderer.d.ts +4 -0
  125. package/lib/typescript/commonjs/components/renderers/RadioRenderer.d.ts +4 -0
  126. package/lib/typescript/commonjs/components/renderers/SelectRenderer.d.ts +4 -0
  127. package/lib/typescript/commonjs/components/renderers/SelectboxesRenderer.d.ts +4 -0
  128. package/lib/typescript/commonjs/components/renderers/TextAreaRenderer.d.ts +4 -0
  129. package/lib/typescript/commonjs/components/renderers/TextfieldRenderer.d.ts +4 -0
  130. package/lib/typescript/commonjs/components/renderers/URLRenderer.d.ts +4 -0
  131. package/lib/typescript/commonjs/components/renderers/index.d.ts +27 -0
  132. package/lib/typescript/commonjs/constants/colors.d.ts +18 -0
  133. package/lib/typescript/commonjs/constants/componentTypes.d.ts +42 -0
  134. package/lib/typescript/commonjs/constants/index.d.ts +53 -0
  135. package/lib/typescript/commonjs/constants/spacing.d.ts +10 -0
  136. package/lib/typescript/commonjs/constants/typography.d.ts +24 -0
  137. package/lib/typescript/commonjs/constants/validationMessages.d.ts +17 -0
  138. package/lib/typescript/commonjs/context/FormioContext.d.ts +151 -0
  139. package/lib/typescript/commonjs/errors/ErrorBoundary.d.ts +23 -0
  140. package/lib/typescript/commonjs/errors/FormioError.d.ts +28 -0
  141. package/lib/typescript/commonjs/errors/errorUtils.d.ts +8 -0
  142. package/lib/typescript/commonjs/errors/index.d.ts +5 -0
  143. package/lib/typescript/commonjs/hooks/useTheme.d.ts +10 -0
  144. package/lib/typescript/commonjs/i18n/I18nContext.d.ts +10 -0
  145. package/lib/typescript/commonjs/i18n/locales/ar/index.d.ts +3 -0
  146. package/lib/typescript/commonjs/i18n/locales/fr/index.d.ts +3 -0
  147. package/lib/typescript/commonjs/i18n/messages.d.ts +10 -0
  148. package/lib/typescript/commonjs/i18n/translations/en.d.ts +4 -0
  149. package/lib/typescript/commonjs/i18n/types.d.ts +12 -0
  150. package/lib/typescript/commonjs/index.d.ts +35 -0
  151. package/lib/typescript/commonjs/package.json +1 -0
  152. package/lib/typescript/commonjs/registry/ComponentRegistry.d.ts +32 -0
  153. package/lib/typescript/commonjs/registry/index.d.ts +3 -0
  154. package/lib/typescript/commonjs/types.d.ts +142 -0
  155. package/lib/typescript/commonjs/utils/a11yUtils.d.ts +31 -0
  156. package/lib/typescript/commonjs/utils/index.d.ts +9 -0
  157. package/lib/typescript/commonjs/utils/logger.d.ts +25 -0
  158. package/lib/typescript/commonjs/utils/rtlUtils.d.ts +18 -0
  159. package/lib/typescript/commonjs/utils/safeEval.d.ts +20 -0
  160. package/lib/typescript/commonjs/utils/styleUtils.d.ts +13 -0
  161. package/lib/typescript/commonjs/validation.d.ts +8 -0
  162. package/package.json +80 -0
@@ -0,0 +1,2 @@
1
+ import React,{createContext,useContext,useState,useCallback}from'react';import{I18nProvider}from'../i18n/I18nContext';import{createRegistryWithComponents}from'../registry';import{DEFAULT_RENDERERS}from'../components/renderers';const FormioContext=createContext(undefined);export const useFormioContext=()=>{const context=useContext(FormioContext);return context;};export const useRegistry=()=>{const context=useContext(FormioContext);return context==null?void 0:context.registry;};const defaultTheme={colors:{primary:'#007AFF',secondary:'#5856D6',error:'#FF3B30',success:'#34C759',warning:'#FF9500',info:'#5AC8FA',background:'#FFFFFF',surface:'#F2F2F7',text:'#000000',textSecondary:'#8E8E93',border:'#C7C7CC',borderFocus:'#007AFF',disabled:'#F2F2F7',placeholder:'#C7C7CC'},spacing:{xs:4,sm:8,md:16,lg:24,xl:32},typography:{fontSize:{xs:12,sm:14,md:16,lg:18,xl:20},fontWeight:{light:'300',normal:'400',medium:'500',bold:'600'},lineHeight:{tight:1.2,normal:1.4,relaxed:1.6}},borderRadius:{none:0,sm:4,md:8,lg:12,full:9999},components:{input:{borderRadius:8,borderWidth:1,padding:12,fontSize:16,minHeight:44},label:{fontSize:16,fontWeight:'500',marginBottom:8},error:{fontSize:14,marginTop:4},button:{borderRadius:8,padding:12,fontSize:16,fontWeight:'600',minHeight:44},container:{padding:16,marginBottom:16}}};const getNestedValue=(obj,path,fallback)=>{var _path$split$reduce;return(_path$split$reduce=path.split('.').reduce((current,key)=>current==null?void 0:current[key],obj))!=null?_path$split$reduce:fallback;};const mergeTheme=(base,override)=>{var _base$typography,_override$typography,_base$typography2,_override$typography2,_base$typography3,_override$typography3,_base$components,_override$components,_base$components2,_override$components2,_base$components3,_override$components3,_base$components4,_override$components4,_base$components5,_override$components5;if(!override)return base;return{colors:{...base.colors,...override.colors},spacing:{...base.spacing,...override.spacing},typography:{...base.typography,...override.typography,fontSize:{...((_base$typography=base.typography)==null?void 0:_base$typography.fontSize),...((_override$typography=override.typography)==null?void 0:_override$typography.fontSize)},fontWeight:{...((_base$typography2=base.typography)==null?void 0:_base$typography2.fontWeight),...((_override$typography2=override.typography)==null?void 0:_override$typography2.fontWeight)},lineHeight:{...((_base$typography3=base.typography)==null?void 0:_base$typography3.lineHeight),...((_override$typography3=override.typography)==null?void 0:_override$typography3.lineHeight)}},borderRadius:{...base.borderRadius,...override.borderRadius},shadows:{...base.shadows,...override.shadows},components:{...base.components,...override.components,input:{...((_base$components=base.components)==null?void 0:_base$components.input),...((_override$components=override.components)==null?void 0:_override$components.input)},label:{...((_base$components2=base.components)==null?void 0:_base$components2.label),...((_override$components2=override.components)==null?void 0:_override$components2.label)},error:{...((_base$components3=base.components)==null?void 0:_base$components3.error),...((_override$components3=override.components)==null?void 0:_override$components3.error)},button:{...((_base$components4=base.components)==null?void 0:_base$components4.button),...((_override$components4=override.components)==null?void 0:_override$components4.button)},container:{...((_base$components5=base.components)==null?void 0:_base$components5.container),...((_override$components5=override.components)==null?void 0:_override$components5.container)}}};};export const FormioProvider=({children,components:initialComponents,theme:userTheme,i18n})=>{const[componentOverrides,setComponentOverrides]=useState(initialComponents||{});const theme=mergeTheme(defaultTheme,userTheme);const registry=React.useMemo(()=>{const reg=createRegistryWithComponents(DEFAULT_RENDERERS);if(initialComponents){Object.entries(initialComponents).forEach(([t,override])=>{if(override&&typeof override==='function'){reg.register(t,props=>{return override(props.component,{value:props.value,onChange:props.onChange,error:props.error,disabled:props.disabled,readOnly:props.readOnly,formData:props.formData,validationErrors:props.validationErrors});});}});}return reg;},[]);const registerComponent=useCallback((type,renderer)=>{setComponentOverrides(prev=>({...prev,[type]:renderer}));if(registry){registry.register(type,props=>{return renderer(props.component,{value:props.value,onChange:props.onChange,error:props.error,disabled:props.disabled,readOnly:props.readOnly,formData:props.formData,validationErrors:props.validationErrors});});}},[registry]);const getThemeValue=useCallback((path,fallback)=>getNestedValue(theme,path,fallback),[theme]);const value={componentOverrides,theme,registerComponent,getThemeValue,registry};return React.createElement(FormioContext.Provider,{value:value},React.createElement(I18nProvider,{config:i18n},children));};
2
+ //# sourceMappingURL=FormioContext.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{View,Text,TouchableOpacity,StyleSheet}from'react-native';import{DEFAULT_COLORS}from'../constants/colors';import{SPACING}from'../constants/spacing';import{FONT_SIZES}from'../constants/typography';export class ErrorBoundary extends React.Component{constructor(props){super(props);this.handleReset=()=>{this.setState({hasError:false,error:undefined});};this.state={hasError:false};}static getDerivedStateFromError(error){return{hasError:true,error};}componentDidCatch(error,errorInfo){const{onError}=this.props;if(onError){onError(error,errorInfo);}if(__DEV__){console.error('ErrorBoundary caught an error:',error,errorInfo);}}render(){const{hasError,error}=this.state;const{children,fallback}=this.props;if(!hasError){return children;}if(fallback){if(typeof fallback==='function'){return fallback(error,this.handleReset);}return fallback;}return React.createElement(DefaultErrorUI,{error:error,onReset:this.handleReset});}}const DefaultErrorUI=({error,onReset})=>React.createElement(View,{style:styles.container},React.createElement(View,{style:styles.errorBox},React.createElement(Text,{style:styles.errorTitle},"\u26A0\uFE0F Something went wrong"),React.createElement(Text,{style:styles.errorMessage},(error==null?void 0:error.message)||'An unexpected error occurred'),__DEV__&&(error==null?void 0:error.stack)&&React.createElement(Text,{style:styles.errorStack},error.stack),React.createElement(TouchableOpacity,{style:styles.resetButton,onPress:onReset},React.createElement(Text,{style:styles.resetButtonText},"Try Again"))));const styles=StyleSheet.create({container:{flex:1,justifyContent:'center',alignItems:'center',padding:SPACING.LG,backgroundColor:DEFAULT_COLORS.BACKGROUND},errorBox:{backgroundColor:'#FFF3CD',borderColor:DEFAULT_COLORS.WARNING,borderWidth:1,borderRadius:8,padding:SPACING.LG,maxWidth:400},errorTitle:{fontSize:FONT_SIZES.LG,fontWeight:'600',color:'#856404',marginBottom:SPACING.MD},errorMessage:{fontSize:FONT_SIZES.MD,color:'#856404',marginBottom:SPACING.MD,lineHeight:1.5},errorStack:{fontSize:FONT_SIZES.XS,color:'#856404',fontFamily:'Courier New',marginBottom:SPACING.MD,maxHeight:200},resetButton:{backgroundColor:DEFAULT_COLORS.PRIMARY,paddingVertical:SPACING.SM,paddingHorizontal:SPACING.MD,borderRadius:6,alignItems:'center',marginTop:SPACING.MD},resetButtonText:{color:DEFAULT_COLORS.BACKGROUND,fontSize:FONT_SIZES.MD,fontWeight:'600'}});
2
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1,2 @@
1
+ export class FormioError extends Error{constructor(message){super(message);this.name='FormioError';Object.setPrototypeOf(this,FormioError.prototype);}}export class InvalidSchemaError extends FormioError{constructor(message,schema){super(message);this.schema=schema;this.name='InvalidSchemaError';Object.setPrototypeOf(this,InvalidSchemaError.prototype);}}export class MissingComponentError extends FormioError{constructor(componentType){super(`Component type "${componentType}" is not registered`);this.componentType=componentType;this.name='MissingComponentError';Object.setPrototypeOf(this,MissingComponentError.prototype);}}export class ComponentRenderError extends FormioError{constructor(message,componentKey,originalError){super(message);this.componentKey=componentKey;this.originalError=originalError;this.name='ComponentRenderError';Object.setPrototypeOf(this,ComponentRenderError.prototype);}}export class ValidationError extends FormioError{constructor(field,message,code){super(message);this.field=field;this.code=code;this.name='ValidationError';Object.setPrototypeOf(this,ValidationError.prototype);}}export class SubmissionError extends FormioError{constructor(message,errors){super(message);this.errors=errors;this.name='SubmissionError';Object.setPrototypeOf(this,SubmissionError.prototype);}}export function isFormioError(error){return error instanceof FormioError;}export function isValidationError(error){return error instanceof ValidationError;}
2
+ //# sourceMappingURL=FormioError.js.map
@@ -0,0 +1,2 @@
1
+ import{Logger}from'../utils/logger';import{FormioError,ValidationError}from'./FormioError';const logger=new Logger('errorUtils');export function handleError(error,context){const err=normalizeError(error);if(context){logger.error(`Error in ${context}:`,err);}else{logger.error('An error occurred:',err);}return err;}export function normalizeError(error){if(error instanceof Error){return error;}if(typeof error==='string'){return new Error(error);}if(error&&typeof error==='object'&&'message'in error){return new Error(String(error.message));}return new Error(String(error));}export function createValidationError(field,message,code){return new ValidationError(field,message,code);}export function isError(value){return value instanceof Error;}export function isFormioError(value){return value instanceof FormioError;}export function getErrorMessage(error){if(error instanceof Error){return error.message;}if(typeof error==='string'){return error;}return'An unknown error occurred';}
2
+ //# sourceMappingURL=errorUtils.js.map
@@ -0,0 +1,2 @@
1
+ export{FormioError,InvalidSchemaError,MissingComponentError,ComponentRenderError,SubmissionError,isFormioError,isValidationError}from'./FormioError';export{ErrorBoundary}from'./ErrorBoundary';export{handleError,normalizeError,createValidationError,isError,isFormioError as isFormioErrorUtil,getErrorMessage}from'./errorUtils';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ import{useFormioContext}from'../context/FormioContext';import{StyleSheet}from'react-native';export const useTheme=()=>{const context=useFormioContext();if(!context){throw new Error('useTheme must be used within FormioProvider');}const{theme,getThemeValue}=context;const createStyles=styleFactory=>{return StyleSheet.create(styleFactory(theme));};const getColor=(colorKey,fallback)=>{return getThemeValue(`colors.${colorKey}`,fallback);};const getSpacing=(spacingKey,fallback)=>{return getThemeValue(`spacing.${spacingKey}`,fallback);};const getTypography=(typographyPath,fallback)=>{return getThemeValue(`typography.${typographyPath}`,fallback);};const getComponent=(componentPath,fallback)=>{return getThemeValue(`components.${componentPath}`,fallback);};return{theme,getThemeValue,createStyles,getColor,getSpacing,getTypography,getComponent};};
2
+ //# sourceMappingURL=useTheme.js.map
@@ -0,0 +1,2 @@
1
+ import React,{createContext,useContext,useState}from'react';import DEFAULT_TRANSLATIONS from'./translations/en';const I18nContext=createContext(undefined);const DEFAULT_RTL_LANGUAGES=['ar','he','fa','ur'];export const I18nProvider=({children,config})=>{const[language,setLanguage]=useState((config==null?void 0:config.language)||'en');const translations=(config==null?void 0:config.translations)||DEFAULT_TRANSLATIONS;const rtlLanguages=(config==null?void 0:config.rtlLanguages)||DEFAULT_RTL_LANGUAGES;const isRTL=rtlLanguages.includes(language);const translate=(key,fallback)=>{const langMap=translations[language];if(!langMap)return fallback||key;return langMap[key]||fallback||key;};const value={language,isRTL,translate,setLanguage};return React.createElement(I18nContext.Provider,{value:value},children);};export const useI18n=()=>{const context=useContext(I18nContext);if(!context){return{language:'en',isRTL:false,translate:(key,fallback)=>fallback||key,setLanguage:()=>{}};}return context;};
2
+ //# sourceMappingURL=I18nContext.js.map
@@ -0,0 +1,2 @@
1
+ export const AR_TRANSLATIONS={'validation.REQUIRED':'هذا الحقل مطلوب','validation.MIN_LENGTH':'الحد الأدنى للطول هو {min}','validation.MAX_LENGTH':'الحد الأقصى للطول هو {max}','validation.PATTERN':'صيغة غير صحيحة','validation.MIN_VALUE':'القيمة الدنيا هي {min}','validation.MAX_VALUE':'القيمة العليا هي {max}','validation.INVALID_EMAIL':'عنوان بريد إلكتروني غير صحيح','validation.INVALID_URL':'عنوان URL غير صحيح','validation.INVALID_PHONE':'رقم هاتف غير صحيح','validation.INVALID_DATE':'تاريخ غير صحيح','validation.FILE_TYPE_INVALID':'نوع ملف غير صحيح','validation.FILE_SIZE_TOO_LARGE':'الملف كبير جداً','validation.CUSTOM_ERROR':'هذا الحقل غير صحيح','Submit':'إرسال','Previous':'السابق','Next':'التالي','Finish':'إنهاء','Loading...':'جاري التحميل...','Search...':'بحث...','No options available':'لا توجد خيارات متاحة','Select...':'اختر...','No wizard pages found':'لم يتم العثور على صفحات معالج','First Name':'الاسم الأول','Last Name':'اسم العائلة','Email':'البريد الإلكتروني','Phone':'الهاتف','Address':'العنوان','City':'المدينة','State':'الولاية','Zip Code':'الرمز البريدي','Country':'الدولة','Message':'الرسالة','Comments':'التعليقات','Agree':'أوافق','Yes':'نعم','No':'لا','OK':'حسناً','Cancel':'إلغاء','Delete':'حذف','Edit':'تعديل','Add':'إضافة','Remove':'إزالة','Save':'حفظ','Close':'إغلاق','Done':'تم'};export default AR_TRANSLATIONS;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export const FR_TRANSLATIONS={'validation.REQUIRED':'Ce champ est obligatoire','validation.MIN_LENGTH':'La longueur minimale est {min}','validation.MAX_LENGTH':'La longueur maximale est {max}','validation.PATTERN':'Format invalide','validation.MIN_VALUE':'La valeur minimale est {min}','validation.MAX_VALUE':'La valeur maximale est {max}','validation.INVALID_EMAIL':'Adresse e-mail invalide','validation.INVALID_URL':'URL invalide','validation.INVALID_PHONE':'Numéro de téléphone invalide','validation.INVALID_DATE':'Date invalide','validation.FILE_TYPE_INVALID':'Type de fichier invalide','validation.FILE_SIZE_TOO_LARGE':'Le fichier est trop volumineux','validation.CUSTOM_ERROR':'Ce champ est invalide','Submit':'Soumettre','Previous':'Précédent','Next':'Suivant','Finish':'Terminer','Loading...':'Chargement...','Search...':'Rechercher...','No options available':'Aucune option disponible','Select...':'Sélectionner...','No wizard pages found':'Aucune page d\'assistant trouvée','First Name':'Prénom','Last Name':'Nom de famille','Email':'E-mail','Phone':'Téléphone','Address':'Adresse','City':'Ville','State':'État','Zip Code':'Code postal','Country':'Pays','Message':'Message','Comments':'Commentaires','Agree':'J\'accepte','Yes':'Oui','No':'Non','OK':'OK','Cancel':'Annuler','Delete':'Supprimer','Edit':'Modifier','Add':'Ajouter','Remove':'Retirer','Save':'Enregistrer','Close':'Fermer','Done':'Fait'};export default FR_TRANSLATIONS;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ import{VALIDATION_MESSAGES}from'../constants/validationMessages';function formatMessage(template,params){if(!params)return template;return template.replace(/\{(\w+)\}/g,(_,key)=>{const val=params[key];return val!==undefined&&val!==null?String(val):'';});}export function getValidationMessage(key,params,translate){const templateKey=`validation.${key}`;const translated=translate?translate(templateKey,VALIDATION_MESSAGES[key]):undefined;const template=translated||VALIDATION_MESSAGES[key];return formatMessage(template,params);}export default{formatMessage,getValidationMessage};
2
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1,2 @@
1
+ export const DEFAULT_EN_TRANSLATIONS={'validation.REQUIRED':'This field is required','validation.MIN_LENGTH':'Minimum length is {min}','validation.MAX_LENGTH':'Maximum length is {max}','validation.PATTERN':'Invalid format','validation.MIN_VALUE':'Minimum value is {min}','validation.MAX_VALUE':'Maximum value is {max}','validation.INVALID_EMAIL':'Invalid email address','validation.INVALID_URL':'Invalid URL','validation.INVALID_PHONE':'Invalid phone number','validation.INVALID_DATE':'Invalid date','validation.FILE_TYPE_INVALID':'Invalid file type','validation.FILE_SIZE_TOO_LARGE':'File is too large','validation.CUSTOM_ERROR':'This field is invalid','Submit':'Submit','Previous':'Previous','Next':'Next','Finish':'Finish','Loading...':'Loading...','Search...':'Search...','No options available':'No options available','Select...':'Select...','No wizard pages found':'No wizard pages found','First Name':'First Name','Last Name':'Last Name','Email':'Email','Phone':'Phone','Address':'Address','City':'City','State':'State','Zip Code':'Zip Code','Country':'Country','Message':'Message','Comments':'Comments','Agree':'I Agree','Yes':'Yes','No':'No','OK':'OK','Cancel':'Cancel','Delete':'Delete','Edit':'Edit','Add':'Add','Remove':'Remove','Save':'Save','Close':'Close','Done':'Done'};import AR_TRANSLATIONS from'../locales/ar';import FR_TRANSLATIONS from'../locales/fr';export const DEFAULT_TRANSLATIONS={en:DEFAULT_EN_TRANSLATIONS,ar:AR_TRANSLATIONS,fr:FR_TRANSLATIONS};export default DEFAULT_TRANSLATIONS;
2
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1,2 @@
1
+ export{};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,2 @@
1
+ export{FormioForm}from'./components/FormioForm';export{FormioField}from'./components/FormioField';export{CheckboxField}from'./components/CheckboxField';export{DatePicker}from'./components/DatePicker';export{FileUpload}from'./components/FileUpload';export{ResourceSelect}from'./components/ResourceSelect';export{DataGrid}from'./components/DataGrid';export{EditGrid}from'./components/EditGrid';export{Wizard}from'./components/Wizard';export{TextfieldRenderer}from'./components/renderers/TextfieldRenderer';export{EmailRenderer}from'./components/renderers/EmailRenderer';export{NumberRenderer}from'./components/renderers/NumberRenderer';export{CheckboxRenderer}from'./components/renderers/CheckboxRenderer';export{RadioRenderer}from'./components/renderers/RadioRenderer';export{SelectRenderer}from'./components/renderers/SelectRenderer';export{SelectboxesRenderer}from'./components/renderers/SelectboxesRenderer';export{TextAreaRenderer}from'./components/renderers/TextAreaRenderer';export{PasswordRenderer}from'./components/renderers/PasswordRenderer';export{URLRenderer}from'./components/renderers/URLRenderer';export{PhoneNumberRenderer}from'./components/renderers/PhoneNumberRenderer';export{FallbackRenderer}from'./components/renderers/FallbackRenderer';export{DEFAULT_RENDERERS}from'./components/renderers';export{ComponentRegistry,createDefaultRegistry,createRegistryWithComponents}from'./registry/ComponentRegistry';export{validateForm,validateField}from'./validation';export{FormioProvider,useFormioContext,useRegistry}from'./context/FormioContext';export{useTheme}from'./hooks/useTheme';export{useI18n}from'./i18n/I18nContext';export*from'./types';export*from'./utils';export*from'./constants';export*from'./errors';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,2 @@
1
+ import{Logger}from'../utils/logger';const logger=new Logger('ComponentRegistry');export class ComponentRegistry{constructor(){this.renderers=new Map();}register(type,renderer){if(!type||typeof type!=='string'){logger.warn('Invalid component type for registration');return;}if(typeof renderer!=='function'){logger.warn(`Invalid renderer for component type: ${type}`);return;}this.renderers.set(type,renderer);logger.debug(`Registered component: ${type}`);}registerBatch(components){Object.entries(components).forEach(([type,renderer])=>{this.register(type,renderer);});logger.debug(`Registered ${Object.keys(components).length} components`);}unregister(type){const existed=this.renderers.has(type);this.renderers.delete(type);if(existed){logger.debug(`Unregistered component: ${type}`);}return existed;}get(type){return this.renderers.get(type)||null;}has(type){return this.renderers.has(type);}list(){return Array.from(this.renderers.keys());}count(){return this.renderers.size;}clear(){this.renderers.clear();logger.debug('Cleared all registered components');}override(type,renderer){if(!this.has(type)){logger.warn(`Cannot override non-existent component: ${type}`);return false;}this.register(type,renderer);logger.debug(`Overrode component: ${type}`);return true;}getStats(){return{totalRegistered:this.renderers.size,types:this.list()};}}export function createDefaultRegistry(){const registry=new ComponentRegistry();logger.debug('Created default registry');return registry;}export function createRegistryWithComponents(components){const registry=createDefaultRegistry();registry.registerBatch(components);return registry;}
2
+ //# sourceMappingURL=ComponentRegistry.js.map
@@ -0,0 +1,2 @@
1
+ export{ComponentRegistry,createDefaultRegistry,createRegistryWithComponents}from'./ComponentRegistry';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export{};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,2 @@
1
+ export function getFieldAriaAttributes(label,error,required=false,disabled=false,hint){const attributes={accessible:true,accessibilityRole:'none'};if(label){attributes.accessibilityLabel=label;}if(error){attributes.accessibilityHint=error;}else if(hint){attributes.accessibilityHint=hint;}if(required){attributes.accessibilityHint=(attributes.accessibilityHint||'')+' Required field';}if(disabled){attributes.editable=false;}return attributes;}export function getButtonAriaAttributes(label,disabled=false,hint){return{accessible:true,accessibilityRole:'button',accessibilityLabel:label,accessibilityHint:hint,accessibilityState:{disabled}};}export function getCheckboxAriaAttributes(label,checked,disabled=false,hint){return{accessible:true,accessibilityRole:'checkbox',accessibilityLabel:label,accessibilityHint:hint,accessibilityState:{checked,disabled}};}export function getRadioAriaAttributes(label,selected,disabled=false,hint){return{accessible:true,accessibilityRole:'radio',accessibilityLabel:label,accessibilityHint:hint,accessibilityState:{selected,disabled}};}export function getSelectAriaAttributes(label,selectedValue,disabled=false,error,hint){const attributes={accessible:true,accessibilityRole:'combobox',accessibilityLabel:label,accessibilityState:{disabled,expanded:false}};if(selectedValue){attributes.accessibilityValue={text:selectedValue};}if(error){attributes.accessibilityHint=error;}else if(hint){attributes.accessibilityHint=hint;}return attributes;}export function getTextInputAriaAttributes(label,value,disabled=false,error,hint,required=false){const attributes={accessible:true,accessibilityRole:'none',accessibilityLabel:label};if(value){attributes.accessibilityValue={text:value};}let hintText='';if(error){hintText=error;}else if(hint){hintText=hint;}if(required){hintText+=' Required field';}if(hintText){attributes.accessibilityHint=hintText;}return attributes;}export function getFormAriaAttributes(title,description){return{accessible:true,accessibilityRole:'form',accessibilityLabel:title,accessibilityHint:description};}export function getErrorAriaAttributes(message){return{accessible:true,accessibilityRole:'alert',accessibilityLabel:'Error',accessibilityHint:message,accessibilityLiveRegion:'polite'};}export function getLoadingAriaAttributes(message='Loading'){return{accessible:true,accessibilityRole:'progressbar',accessibilityLabel:message,accessibilityLiveRegion:'polite'};}export function getModalAriaAttributes(title,description){return{accessible:true,accessibilityRole:'dialog',accessibilityLabel:title,accessibilityHint:description};}export function getListItemAriaAttributes(label,index,total){return{accessible:true,accessibilityRole:'option',accessibilityLabel:label,accessibilityHint:`Item ${index+1} of ${total}`};}export function getTabAriaAttributes(label,selected,index){return{accessible:true,accessibilityRole:'tab',accessibilityLabel:label,accessibilityState:{selected},accessibilityHint:`Tab ${index+1}`};}export function combineAriaAttributes(...attributes){const combined={};for(const attr of attributes){Object.assign(combined,attr);}return combined;}export function createAccessibleLabel(label,required=false,error=false){let text=label;if(required)text+=', required';if(error)text+=', error';return text;}export function getKeyboardHint(componentType){const hints={checkbox:'Double tap to toggle',radio:'Double tap to select',button:'Double tap to activate',select:'Double tap to open options',textfield:'Type to enter text',textarea:'Type to enter text, use return for new line'};return hints[componentType]||'Double tap to interact';}export function isAccessibilityEnabled(){return true;}export function announceToScreenReader(message){console.log('[A11y Announcement]:',message);}export function getHeadingAriaAttributes(level,text){return{accessible:true,accessibilityRole:'header',accessibilityLabel:text,accessibilityHint:`Heading level ${level}`};}
2
+ //# sourceMappingURL=a11yUtils.js.map
@@ -0,0 +1,2 @@
1
+ import{Logger}from'./logger';const logger=new Logger('componentUtils');export function isEmpty(val){return val===undefined||val===null||val===''||Array.isArray(val)&&val.length===0;}export function traverseComponents(components,callback){const walk=(component,path='')=>{callback(component,undefined,path);if(component.components){component.components.forEach((child,index)=>{walk(child,`${path}[${index}]`);});}if(component.type==='columns'&&Array.isArray(component.columns)){component.columns.forEach((col,colIndex)=>{if(Array.isArray(col.components)){col.components.forEach((child,index)=>{walk(child,`${path}.columns[${colIndex}][${index}]`);});}});}};components.forEach((component,index)=>{walk(component,`[${index}]`);});}export function flattenComponents(components){const flattened=[];traverseComponents(components,component=>{flattened.push(component);});return flattened;}export function findComponentByKey(components,key){let found;traverseComponents(components,component=>{if(component.key===key){found=component;}});return found;}export function filterComponents(components,predicate){const filtered=[];traverseComponents(components,component=>{if(predicate(component)){filtered.push(component);}});return filtered;}export function getInputComponents(components){return filterComponents(components,c=>c.input!==false&&c.key);}export function initializeFormData(components,initialData={}){const data={...initialData};const inputComponents=getInputComponents(components);inputComponents.forEach(component=>{if(component.key&&data[component.key]===undefined){if(component.defaultValue!==undefined){data[component.key]=component.defaultValue;}}});logger.debug('Initialized form data',data);return data;}export function getVisibleComponents(components,data){return filterComponents(components,c=>!c.hidden&&c.type!=='hidden');}export function isComponentHidden(component,data,evaluator){var _component$conditiona;if(component.hidden){return true;}if((_component$conditiona=component.conditional)!=null&&_component$conditiona.when){const{when,eq,show=true}=component.conditional;const whenValue=data[when];const match=whenValue===eq;return show?!match:match;}if(component.customConditional&&evaluator){try{const result=evaluator(component.customConditional,{data,value:data[component.key]});return!result;}catch(error){logger.warn(`Failed to evaluate customConditional for ${component.key}`,error);return false;}}return false;}export function getRequiredFields(components){return filterComponents(components,c=>{var _c$validate;return(c.required||((_c$validate=c.validate)==null?void 0:_c$validate.required))&&c.key&&c.input!==false;}).map(c=>c.key);}export function countComponentsByType(components,type){return filterComponents(components,c=>c.type===type).length;}export function getComponentStats(components){const all=flattenComponents(components);const inputs=getInputComponents(components);const types=new Map();all.forEach(c=>{types.set(c.type,(types.get(c.type)||0)+1);});return{total:all.length,inputCount:inputs.length,typeDistribution:Object.fromEntries(types)};}
2
+ //# sourceMappingURL=componentUtils.js.map
@@ -0,0 +1,2 @@
1
+ export{safeEval,safeEvalConditional,safeEvalValidation,safeEvalValue}from'./safeEval';export function isEmpty(val){return val===undefined||val===null||val===''||Array.isArray(val)&&val.length===0;}export{Logger,configureLogger,getLoggerConfig,globalLogger}from'./logger';export{LogLevel}from'./logger';export{createStyleUtilities,createPlatformStyles}from'./styleUtils';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export let LogLevel=function(LogLevel){LogLevel["DEBUG"]="debug";LogLevel["INFO"]="info";LogLevel["WARN"]="warn";LogLevel["ERROR"]="error";return LogLevel;}({});let globalLoggerConfig={enabled:__DEV__||false,level:LogLevel.DEBUG,prefix:true,colors:false};export function configureLogger(config){globalLoggerConfig={...globalLoggerConfig,...config};}export function getLoggerConfig(){return{...globalLoggerConfig};}export class Logger{constructor(namespace){this.namespace=void 0;this.namespace=namespace;}debug(message,...args){this._log(LogLevel.DEBUG,message,args);}info(message,...args){this._log(LogLevel.INFO,message,args);}warn(message,...args){this._log(LogLevel.WARN,message,args);}error(message,error,...args){this._log(LogLevel.ERROR,message,[error,...args]);}_log(level,message,args){const config=globalLoggerConfig;if(!config.enabled){return;}const levelPriority={debug:0,info:1,warn:2,error:3};if(levelPriority[level]<levelPriority[config.level||LogLevel.DEBUG]){return;}const prefix=config.prefix?`[${this.namespace}]`:'';const logFn=console.log;if(args.length>0){logFn(prefix,`[${level.toUpperCase()}]`,message,...args);}else{logFn(prefix,`[${level.toUpperCase()}]`,message);}}}export const globalLogger=new Logger('Formio');
2
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1,2 @@
1
+ import{useCallback,useMemo,useRef,useEffect}from'react';export function debounce(func,wait){let timeout=null;return function executedFunction(...args){const later=()=>{timeout=null;func(...args);};if(timeout){clearTimeout(timeout);}timeout=setTimeout(later,wait);};}export function throttle(func,limit){let inThrottle;return function executedFunction(...args){if(!inThrottle){func(...args);inThrottle=true;setTimeout(()=>inThrottle=false,limit);}};}export function useDebouncedValue(value,delay){const[debouncedValue,setDebouncedValue]=React.useState(value);useEffect(()=>{const handler=setTimeout(()=>{setDebouncedValue(value);},delay);return()=>clearTimeout(handler);},[value,delay]);return debouncedValue;}export function useDebouncedCallback(callback,delay,deps){const timeoutRef=useRef(null);useEffect(()=>{return()=>{if(timeoutRef.current){clearTimeout(timeoutRef.current);}};},[]);return useCallback((...args)=>{if(timeoutRef.current){clearTimeout(timeoutRef.current);}timeoutRef.current=setTimeout(()=>{callback(...args);},delay);},[callback,delay,...deps]);}export function useThrottledCallback(callback,delay,deps){const lastRunRef=useRef(Date.now());return useCallback((...args)=>{const now=Date.now();if(now-lastRunRef.current>=delay){callback(...args);lastRunRef.current=now;}},[callback,delay,...deps]);}export function memoize(func){const cache=new Map();return(...args)=>{const key=JSON.stringify(args);if(cache.has(key)){return cache.get(key);}const result=func(...args);cache.set(key,result);return result;};}export function useMemoizedValue(value,isEqual){const prevRef=useRef(value);const[memoized,setMemoized]=React.useState(value);useEffect(()=>{if(!isEqual(prevRef.current,value)){prevRef.current=value;setMemoized(value);}},[value,isEqual]);return memoized;}export class PerformanceMonitor{constructor(){this.marks=new Map();this.measures=new Map();}start(label){this.marks.set(label,performance.now());}end(label){const startTime=this.marks.get(label);if(!startTime){console.warn(`Performance mark "${label}" not found`);return 0;}const duration=performance.now()-startTime;this.measures.set(label,duration);this.marks.delete(label);return duration;}getMeasure(label){return this.measures.get(label);}getAllMeasures(){return Object.fromEntries(this.measures);}clear(){this.marks.clear();this.measures.clear();}log(){console.log('[Performance Metrics]',this.getAllMeasures());}}export function usePerformanceMonitor(){return useMemo(()=>new PerformanceMonitor(),[]);}export function batchUpdates(callback){callback();}export function lazy(importFunc){return React.lazy(importFunc);}export function getVisibleItems(scrollOffset,containerHeight,itemHeight,items){const startIndex=Math.floor(scrollOffset/itemHeight);const endIndex=Math.ceil((scrollOffset+containerHeight)/itemHeight);return{startIndex,endIndex:Math.min(endIndex,items.length),visibleItems:items.slice(startIndex,endIndex)};}export function measureRenderTime(renderFunc){const start=performance.now();renderFunc();return performance.now()-start;}export function hasSignificantChange(prev,next,threshold=0.1){if(typeof prev!=='number'||typeof next!=='number'){return prev!==next;}const percentChange=Math.abs((next-prev)/prev);return percentChange>threshold;}import React from'react';
2
+ //# sourceMappingURL=performanceUtils.js.map
@@ -0,0 +1,2 @@
1
+ import{I18nManager}from'react-native';export function getTextAlign(isRTL){return isRTL?'right':'left';}export function getFlexDirection(isRTL){return isRTL?'row-reverse':'row';}export function getTextDirection(isRTL){return isRTL?'rtl':'ltr';}export function swapMargins(style,isRTL){if(!isRTL)return style;const swapped={...style};if('marginLeft'in swapped&&'marginRight'in swapped){[swapped.marginLeft,swapped.marginRight]=[swapped.marginRight,swapped.marginLeft];}else if('marginLeft'in swapped){swapped.marginRight=swapped.marginLeft;delete swapped.marginLeft;}else if('marginRight'in swapped){swapped.marginLeft=swapped.marginRight;delete swapped.marginRight;}if('marginStart'in swapped&&'marginEnd'in swapped){[swapped.marginStart,swapped.marginEnd]=[swapped.marginEnd,swapped.marginStart];}return swapped;}export function swapPadding(style,isRTL){if(!isRTL)return style;const swapped={...style};if('paddingLeft'in swapped&&'paddingRight'in swapped){[swapped.paddingLeft,swapped.paddingRight]=[swapped.paddingRight,swapped.paddingLeft];}else if('paddingLeft'in swapped){swapped.paddingRight=swapped.paddingLeft;delete swapped.paddingLeft;}else if('paddingRight'in swapped){swapped.paddingLeft=swapped.paddingRight;delete swapped.paddingRight;}if('paddingStart'in swapped&&'paddingEnd'in swapped){[swapped.paddingStart,swapped.paddingEnd]=[swapped.paddingEnd,swapped.paddingStart];}return swapped;}export function swapBorderRadius(style,isRTL){if(!isRTL)return style;const swapped={...style};if('borderTopLeftRadius'in swapped&&'borderTopRightRadius'in swapped){[swapped.borderTopLeftRadius,swapped.borderTopRightRadius]=[swapped.borderTopRightRadius,swapped.borderTopLeftRadius];}if('borderBottomLeftRadius'in swapped&&'borderBottomRightRadius'in swapped){[swapped.borderBottomLeftRadius,swapped.borderBottomRightRadius]=[swapped.borderBottomRightRadius,swapped.borderBottomLeftRadius];}return swapped;}export function applyRTLStyle(style,isRTL){if(!isRTL)return style;let transformed={...style};transformed=swapMargins(transformed,true);transformed=swapPadding(transformed,true);transformed=swapBorderRadius(transformed,true);if('textAlign'in transformed){if(transformed.textAlign==='left'){transformed.textAlign='right';}else if(transformed.textAlign==='right'){transformed.textAlign='left';}}return transformed;}export function createRTLStyle(ltrStyle,rtlStyle,isRTL){const shouldUseRTL=isRTL!=null?isRTL:I18nManager.isRTL;if(!shouldUseRTL){return ltrStyle;}if(rtlStyle){return{...ltrStyle,...rtlStyle};}return applyRTLStyle(ltrStyle,true);}export function getIconRotation(isRTL,defaultRotation=0){return isRTL?defaultRotation+180:defaultRotation;}export function getIconFlipTransform(isRTL){return[{scaleX:isRTL?-1:1}];}export function isSystemRTL(){return I18nManager.isRTL;}export function getAlignSelf(isRTL,alignment){if(alignment==='center')return'center';if(isRTL){return alignment==='flex-start'?'flex-end':'flex-start';}return alignment;}export function getJustifyContent(isRTL,justify){if(justify==='center'||justify==='space-between'||justify==='space-around'){return justify;}if(isRTL){return justify==='flex-start'?'flex-end':'flex-start';}return justify;}export function createRTLAwareStyle(style,isRTL){return applyRTLStyle(style,isRTL);}
2
+ //# sourceMappingURL=rtlUtils.js.map
@@ -0,0 +1,21 @@
1
+ import{Logger}from'./logger';const logger=new Logger('safeEval');export function safeEval(code,ctx,options={}){if(!code||typeof code!=='string'){logger.debug('Empty or invalid code provided to safeEval');return undefined;}try{const{data,row,value,util,show,valid,input}=ctx;const{debug=false}=options;if(debug){logger.debug('Executing code:',code,'with context:',ctx);}const fn=new Function('data','row','value','input','util','show','valid',`
2
+ var _initialValid = valid;
3
+ var _initialShow = show;
4
+ var _initialValue = value;
5
+ ${code}
6
+ // Check if valid was explicitly set (for validation contexts)
7
+ if (typeof valid !== 'undefined' && valid !== _initialValid) {
8
+ return valid;
9
+ }
10
+ // Check if show was explicitly set (for conditional contexts)
11
+ if (typeof show !== 'undefined' && show !== _initialShow) {
12
+ return show;
13
+ }
14
+ // Check if value was modified (for calculated value contexts)
15
+ if (typeof value !== 'undefined' && value !== _initialValue) {
16
+ return value;
17
+ }
18
+ // Return undefined if nothing was set
19
+ return undefined;
20
+ `);const result=fn(data,row!=null?row:data,value,input!=null?input:value,util!=null?util:{},show,valid);if(debug){logger.debug('Evaluation result:',result);}return result;}catch(error){const errorMessage=error instanceof Error?error.message:String(error);logger.warn(`Failed to evaluate code: ${errorMessage}\nCode: ${code}`);return undefined;}}export function safeEvalConditional(code,ctx,options={}){const result=safeEval(code,ctx,options);if(typeof result==='boolean'){return result;}if(result!==undefined){return Boolean(result);}return false;}export function safeEvalValidation(code,ctx,options={}){const result=safeEval(code,ctx,options);if(typeof result==='boolean'){return result;}if(typeof result==='string'&&result.length>0){return result;}return true;}export function safeEvalValue(code,ctx,options={}){return safeEval(code,ctx,options);}
21
+ //# sourceMappingURL=safeEval.js.map
@@ -0,0 +1,2 @@
1
+ import{StyleSheet,Platform,I18nManager}from'react-native';export function createStyleUtilities(theme){const isRTL=I18nManager.isRTL;const getColor=(key,fallback)=>{const parts=key.split('.');let value=theme==null?void 0:theme.colors;for(const part of parts){var _value;value=(_value=value)==null?void 0:_value[part];}return value||fallback;};const getSpacing=(key,fallback)=>{const parts=key.split('.');let value=theme==null?void 0:theme.spacing;for(const part of parts){var _value2;value=(_value2=value)==null?void 0:_value2[part];}return value||fallback;};const getFont=(key,fallback)=>{var _theme$typography;const parts=key.split('.');let value=theme==null||(_theme$typography=theme.typography)==null?void 0:_theme$typography.fontSize;for(const part of parts){var _value3;value=(_value3=value)==null?void 0:_value3[part];}return value||fallback;};const getComponentValue=(path,fallback)=>{const parts=path.split('.');let value=theme==null?void 0:theme.components;for(const part of parts){var _value4;value=(_value4=value)==null?void 0:_value4[part];}return value!=null?value:fallback;};const createStyles=callback=>{const styles=callback(theme||{});return StyleSheet.create(styles);};const createRTLStyles=(ltrStyle,rtlStyle)=>{if(!isRTL){return ltrStyle;}if(rtlStyle){return{...ltrStyle,...rtlStyle};}const reversed={...ltrStyle};if(reversed.flexDirection==='row'){reversed.flexDirection='row-reverse';}if(reversed.marginRight!==undefined&&reversed.marginLeft===undefined){reversed.marginLeft=reversed.marginRight;delete reversed.marginRight;}if(reversed.marginLeft!==undefined&&reversed.marginRight===undefined){reversed.marginRight=reversed.marginLeft;delete reversed.marginLeft;}if(reversed.paddingRight!==undefined&&reversed.paddingLeft===undefined){reversed.paddingLeft=reversed.paddingRight;delete reversed.paddingRight;}if(reversed.paddingLeft!==undefined&&reversed.paddingRight===undefined){reversed.paddingRight=reversed.paddingLeft;delete reversed.paddingLeft;}if(reversed.borderTopRightRadius!==undefined){[reversed.borderTopLeftRadius,reversed.borderTopRightRadius]=[reversed.borderTopRightRadius,reversed.borderTopLeftRadius];}if(reversed.borderBottomRightRadius!==undefined){[reversed.borderBottomLeftRadius,reversed.borderBottomRightRadius]=[reversed.borderBottomRightRadius,reversed.borderBottomLeftRadius];}if(reversed.textAlign==='left'){reversed.textAlign='right';}else if(reversed.textAlign==='right'){reversed.textAlign='left';}return reversed;};return{getColor,getSpacing,getFont,getComponentValue,createStyles,createRTLStyles};}export function createPlatformStyles(iosStyle,androidStyle){return Platform.select({ios:iosStyle,android:androidStyle||iosStyle,default:iosStyle});}
2
+ //# sourceMappingURL=styleUtils.js.map
@@ -0,0 +1,2 @@
1
+ import{getValidationMessage}from'./i18n/messages';import{isEmpty,safeEvalValidation}from'./utils';export const validateField=(component,value,fullData={},options)=>{const errors=[];const{key,validate={},required,label}=component;if(required||validate.required){if(isEmpty(value)){const msg=options!=null&&options.translate?options.translate('validation.REQUIRED',`${label||key} is required`):getValidationMessage('REQUIRED');errors.push({field:key,message:msg});return errors;}}if(!isEmpty(value)&&typeof value==='string'){if(validate.minLength!==undefined&&value.length<validate.minLength){errors.push({field:key,message:getValidationMessage('MIN_LENGTH',{min:validate.minLength},options==null?void 0:options.translate)});}if(validate.maxLength!==undefined&&value.length>validate.maxLength){errors.push({field:key,message:getValidationMessage('MAX_LENGTH',{max:validate.maxLength},options==null?void 0:options.translate)});}if(validate.pattern&&!new RegExp(validate.pattern).test(value)){const msg=validate.customMessage||(options!=null&&options.translate?options.translate('validation.PATTERN','Invalid format'):getValidationMessage('PATTERN'));errors.push({field:key,message:msg});}}if(!isEmpty(value)&&typeof value==='number'){if(validate.min!==undefined&&value<validate.min){errors.push({field:key,message:getValidationMessage('MIN_VALUE',{min:validate.min},options==null?void 0:options.translate)});}if(validate.max!==undefined&&value>validate.max){errors.push({field:key,message:getValidationMessage('MAX_VALUE',{max:validate.max},options==null?void 0:options.translate)});}}if(validate&&validate.custom){const res=safeEvalValidation(validate.custom,{value,data:fullData,row:fullData,util:{}});if(res===false){const msg=validate.customMessage||(options!=null&&options.translate?options.translate('validation.CUSTOM_ERROR',`${label||key} is invalid`):getValidationMessage('CUSTOM_ERROR'));errors.push({field:key,message:msg});}else if(typeof res==='string'&&res.length>0){errors.push({field:key,message:res});}}return errors;};export const validateForm=(components,data,options)=>{const errors=[];const traverse=component=>{if(component.input!==false&&!component.hidden){const fieldErrors=validateField(component,data[component.key],data,options);errors.push(...fieldErrors);}if(component.components)component.components.forEach(traverse);if(component.type==='columns'&&Array.isArray(component.columns)){component.columns.forEach(col=>{if(Array.isArray(col.components))col.components.forEach(traverse);});}};components.forEach(traverse);return errors;};
2
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{View,Text,TouchableOpacity,StyleSheet}from'react-native';import{useI18n}from'../i18n/I18nContext';export const CheckboxField=({label,value,onChange,required,error})=>{const{translate,isRTL}=useI18n();return React.createElement(View,{style:styles.container},React.createElement(TouchableOpacity,{style:styles.checkboxContainer,onPress:()=>onChange(!value)},React.createElement(View,{style:[styles.checkbox,value&&styles.checkboxChecked]},value&&React.createElement(Text,{style:styles.checkmark},"\u2713")),React.createElement(Text,{style:[styles.label,{textAlign:isRTL?'right':'left'}]},translate(label,label),required&&React.createElement(Text,{style:styles.required}," *"))),error&&React.createElement(Text,{style:[styles.errorText,{textAlign:isRTL?'right':'left'}]},translate(error,error)));};const styles=StyleSheet.create({container:{marginBottom:16},checkboxContainer:{flexDirection:'row',alignItems:'center'},checkbox:{width:20,height:20,borderWidth:2,borderColor:'#ddd',borderRadius:4,marginRight:12,alignItems:'center',justifyContent:'center',backgroundColor:'#fff'},checkboxChecked:{backgroundColor:'#007bff',borderColor:'#007bff'},checkmark:{color:'#fff',fontSize:14,fontWeight:'bold'},label:{fontSize:16,color:'#333',flex:1},required:{color:'#e74c3c'},errorText:{color:'#e74c3c',fontSize:14,marginTop:4,marginLeft:32}});
2
+ //# sourceMappingURL=CheckboxField.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{View,Text,TouchableOpacity,StyleSheet}from'react-native';import{FormioField}from'./FormioField';export const DataGrid=({component,value=[],disabled,readOnly,error,onChange})=>{const addRow=()=>{const row={};component.components.forEach(c=>{var _c$defaultValue;if(c.key)row[c.key]=(_c$defaultValue=c.defaultValue)!=null?_c$defaultValue:undefined;});onChange([...value,row]);};const removeRow=index=>{const next=value.filter((_,i)=>i!==index);onChange(next);};const updateCell=(rowIndex,key,cellValue)=>{const next=value.map((row,i)=>i===rowIndex?{...row,[key]:cellValue}:row);onChange(next);};return React.createElement(View,null,value.map((row,rIdx)=>React.createElement(View,{key:rIdx,style:styles.row},component.components.map(col=>React.createElement(View,{key:col.key,style:styles.cell},React.createElement(FormioField,{component:col,value:row[col.key],onChange:(k,v)=>updateCell(rIdx,col.key,v),error:undefined}))),!disabled&&!readOnly&&React.createElement(TouchableOpacity,{style:styles.removeBtn,onPress:()=>removeRow(rIdx)},React.createElement(Text,{style:styles.removeText},"Remove")))),!disabled&&!readOnly&&React.createElement(TouchableOpacity,{style:styles.addBtn,onPress:addRow},React.createElement(Text,{style:styles.addText},"Add Row")),error?React.createElement(Text,{style:styles.errorText},error):null);};const styles=StyleSheet.create({row:{borderWidth:1,borderColor:'#ddd',borderRadius:8,padding:8,marginBottom:8,backgroundColor:'#fff'},cell:{marginBottom:8},removeBtn:{alignSelf:'flex-end'},removeText:{color:'#e74c3c'},addBtn:{backgroundColor:'#007bff',padding:10,borderRadius:8,alignItems:'center'},addText:{color:'#fff',fontSize:14},errorText:{color:'#e74c3c',fontSize:14,marginTop:4}});
2
+ //# sourceMappingURL=DataGrid.js.map
@@ -0,0 +1,2 @@
1
+ import React,{useState}from'react';import{View,Text,TouchableOpacity,StyleSheet,Modal,ScrollView}from'react-native';import{useI18n}from'../i18n/I18nContext';export const DatePicker=({component,value,disabled,readOnly,error,onChange})=>{const[opened,setOpened]=useState(false);const[inputValue,setInputValue]=useState(value||'');const{translate}=useI18n();const handleConfirm=()=>{onChange(inputValue||null);setOpened(false);};const handleCancel=()=>{setInputValue(value||'');setOpened(false);};const getPlaceholder=()=>{switch(component.type){case'time':return'HH:mm';case'datetime':return'yyyy-MM-dd HH:mm';case'date':default:return'yyyy-MM-dd';}};return React.createElement(View,null,React.createElement(TouchableOpacity,{style:[styles.input,error&&styles.inputError,(disabled||readOnly)&&styles.disabled],onPress:()=>!disabled&&!readOnly&&setOpened(true),disabled:disabled||readOnly},React.createElement(Text,{style:[styles.valueText,!value&&styles.placeholder]},value||getPlaceholder())),error?React.createElement(Text,{style:styles.errorText},error):null,React.createElement(Modal,{visible:opened&&!disabled&&!readOnly,transparent:true,animationType:"slide"},React.createElement(View,{style:styles.modalOverlay},React.createElement(View,{style:styles.modalContent},React.createElement(View,{style:styles.modalHeader},React.createElement(Text,{style:styles.modalTitle},translate(component.label||'Select Date',component.label||'Select Date'))),React.createElement(ScrollView,{style:styles.modalBody},React.createElement(Text,{style:styles.instructionText},translate('Enter date in format:','Enter date in format:')," ",getPlaceholder()),React.createElement(Text,{style:styles.exampleText},translate('Example:','Example:')," ",getExampleDate(component.type))),React.createElement(View,{style:styles.modalFooter},React.createElement(TouchableOpacity,{style:[styles.button,styles.cancelButton],onPress:handleCancel},React.createElement(Text,{style:styles.buttonText},translate('Cancel','Cancel'))),React.createElement(TouchableOpacity,{style:[styles.button,styles.confirmButton],onPress:handleConfirm},React.createElement(Text,{style:styles.buttonText},translate('OK','OK'))))))));};function getExampleDate(type){const now=new Date();const year=now.getFullYear();const month=String(now.getMonth()+1).padStart(2,'0');const day=String(now.getDate()).padStart(2,'0');const hours=String(now.getHours()).padStart(2,'0');const minutes=String(now.getMinutes()).padStart(2,'0');switch(type){case'time':return`${hours}:${minutes}`;case'datetime':return`${year}-${month}-${day} ${hours}:${minutes}`;case'date':default:return`${year}-${month}-${day}`;}}const styles=StyleSheet.create({input:{borderWidth:1,borderColor:'#ddd',borderRadius:8,padding:12,backgroundColor:'#fff',marginBottom:8},inputError:{borderColor:'#e74c3c'},disabled:{backgroundColor:'#f0f0f0',opacity:0.6},valueText:{fontSize:16,color:'#333'},placeholder:{color:'#999'},errorText:{color:'#e74c3c',fontSize:14,marginTop:4},modalOverlay:{flex:1,backgroundColor:'rgba(0, 0, 0, 0.5)',justifyContent:'flex-end'},modalContent:{backgroundColor:'#fff',borderTopLeftRadius:12,borderTopRightRadius:12,maxHeight:'80%'},modalHeader:{paddingHorizontal:16,paddingVertical:12,borderBottomWidth:1,borderBottomColor:'#eee'},modalTitle:{fontSize:18,fontWeight:'600',color:'#333'},modalBody:{paddingHorizontal:16,paddingVertical:12},instructionText:{fontSize:14,color:'#666',marginBottom:8},exampleText:{fontSize:14,color:'#999',fontStyle:'italic'},modalFooter:{flexDirection:'row',justifyContent:'flex-end',paddingHorizontal:16,paddingVertical:12,borderTopWidth:1,borderTopColor:'#eee',gap:8},button:{paddingHorizontal:16,paddingVertical:10,borderRadius:6,minWidth:80,alignItems:'center'},cancelButton:{backgroundColor:'#f0f0f0'},confirmButton:{backgroundColor:'#007bff'},buttonText:{fontSize:14,fontWeight:'600',color:'#333'}});
2
+ //# sourceMappingURL=DatePicker.js.map
@@ -0,0 +1,2 @@
1
+ import React,{useState}from'react';import{View,Text,TouchableOpacity,StyleSheet}from'react-native';import{FormioField}from'./FormioField';export const EditGrid=({component,value=[],disabled,readOnly,error,onChange})=>{const[editing,setEditing]=useState(null);const addRow=()=>{const row={};component.components.forEach(c=>{var _c$defaultValue;if(c.key)row[c.key]=(_c$defaultValue=c.defaultValue)!=null?_c$defaultValue:undefined;});onChange([...value,row]);setEditing(value.length);};const removeRow=index=>{const next=value.filter((_,i)=>i!==index);onChange(next);};const updateCell=(rowIndex,key,cellValue)=>{const next=value.map((row,i)=>i===rowIndex?{...row,[key]:cellValue}:row);onChange(next);};const finalizeRow=()=>setEditing(null);return React.createElement(View,null,value.map((row,rIdx)=>React.createElement(View,{key:rIdx,style:styles.row},component.components.map(col=>React.createElement(View,{key:col.key,style:styles.cell},React.createElement(FormioField,{component:col,value:row[col.key],onChange:(k,v)=>updateCell(rIdx,col.key,v),error:undefined}))),!disabled&&!readOnly&&React.createElement(View,{style:styles.rowActions},editing===rIdx?React.createElement(TouchableOpacity,{onPress:finalizeRow},React.createElement(Text,{style:styles.actionText},"Done")):React.createElement(TouchableOpacity,{onPress:()=>setEditing(rIdx)},React.createElement(Text,{style:styles.actionText},"Edit")),React.createElement(TouchableOpacity,{onPress:()=>removeRow(rIdx)},React.createElement(Text,{style:[styles.actionText,styles.delete]},"Delete"))))),!disabled&&!readOnly&&React.createElement(TouchableOpacity,{style:styles.addBtn,onPress:addRow},React.createElement(Text,{style:styles.addText},"Add Row")),error?React.createElement(Text,{style:styles.errorText},error):null);};const styles=StyleSheet.create({row:{borderWidth:1,borderColor:'#ddd',borderRadius:8,padding:8,marginBottom:8,backgroundColor:'#fff'},cell:{marginBottom:8},rowActions:{flexDirection:'row',justifyContent:'flex-end',gap:16},actionText:{color:'#007bff'},delete:{color:'#e74c3c'},addBtn:{backgroundColor:'#007bff',padding:10,borderRadius:8,alignItems:'center'},addText:{color:'#fff',fontSize:14},errorText:{color:'#e74c3c',fontSize:14,marginTop:4}});
2
+ //# sourceMappingURL=EditGrid.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{View,Text,Image,TouchableOpacity,StyleSheet}from'react-native';import{useI18n}from'../i18n/I18nContext';export const FileUpload=({component,value=[],disabled,readOnly,error,onChange,onPickFile})=>{const{translate}=useI18n();const pickFile=async()=>{if(disabled||readOnly||!onPickFile)return;try{const newFiles=await onPickFile();const next=component.multiple?[...value,...newFiles]:newFiles;onChange(next);}catch(err){console.warn('File pick error:',err);}};const removeFile=index=>{const next=value.filter((_,i)=>i!==index);onChange(next);};return React.createElement(View,{style:styles.container},value.length>0&&React.createElement(View,{style:styles.filesRow},value.map((file,idx)=>React.createElement(View,{key:idx,style:styles.fileItem},file.url||file.base64?React.createElement(Image,{source:{uri:file.url||file.base64},style:styles.thumbnail}):React.createElement(View,{style:styles.thumbnailPlaceholder},React.createElement(Text,{style:styles.fileIcon},"\uD83D\uDCC4")),React.createElement(Text,{style:styles.fileName,numberOfLines:1},file.name),!disabled&&!readOnly&&React.createElement(TouchableOpacity,{onPress:()=>removeFile(idx),style:styles.removeButton},React.createElement(Text,{style:styles.removeText},translate('Remove','Remove')))))),!disabled&&!readOnly&&React.createElement(TouchableOpacity,{onPress:pickFile,style:styles.addButton},React.createElement(Text,{style:styles.addButtonText},translate(component.multiple?'Add Files':'Add File',component.multiple?'Add Files':'Add File'))),error?React.createElement(Text,{style:styles.errorText},error):null);};const styles=StyleSheet.create({container:{marginBottom:16},filesRow:{flexDirection:'row',flexWrap:'wrap',gap:12,marginBottom:12},fileItem:{width:100,alignItems:'center'},thumbnail:{width:80,height:80,borderRadius:8,backgroundColor:'#f5f5f5'},thumbnailPlaceholder:{width:80,height:80,borderRadius:8,backgroundColor:'#eee',justifyContent:'center',alignItems:'center'},fileIcon:{fontSize:32},fileName:{marginTop:6,fontSize:12,color:'#333'},removeButton:{marginTop:4},removeText:{color:'#e74c3c',fontSize:12},addButton:{padding:10,backgroundColor:'#007bff',borderRadius:8,alignItems:'center'},addButtonText:{color:'#fff',fontSize:14},errorText:{color:'#e74c3c',fontSize:14,marginTop:4}});
2
+ //# sourceMappingURL=FileUpload.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{View,Text,StyleSheet}from'react-native';import{useTheme}from'../hooks/useTheme';import{useI18n}from'../i18n/I18nContext';import{useFormioContext}from'../context/FormioContext';import{createRegistryWithComponents}from'../registry';import{DEFAULT_RENDERERS,FallbackRenderer}from'../components/renderers';let Picker=null;try{Picker=require('@react-native-picker/picker').Picker;}catch(e){Picker=null;}const getOptions=component=>{const ds=component.data;if(!ds)return[];if(ds.values)return ds.values;if(ds.json&&Array.isArray(ds.json))return ds.json;return[];};export const FormioField=({component,value,onChange,error})=>{const{type,key,label,placeholder,required,disabled}=component;const{createStyles,getColor,getComponent}=useTheme();const{translate,isRTL}=useI18n();const formioContext=useFormioContext();const translatedLabel=translate(label||'',label);const translatedPlaceholder=translate(placeholder||'',placeholder);const translatedError=translate(error||'',error);const themedStyles=createStyles(theme=>({fieldContainer:{marginBottom:getComponent('container.marginBottom',16)},label:{fontSize:getComponent('label.fontSize',16),fontWeight:getComponent('label.fontWeight','500'),marginBottom:getComponent('label.marginBottom',8),color:getComponent('label.color')||getColor('text','#333'),textAlign:isRTL?'right':'left'},input:{borderWidth:getComponent('input.borderWidth',1),borderColor:error?getColor('error','#e74c3c'):getColor('border','#ddd'),borderRadius:getComponent('input.borderRadius',8),padding:getComponent('input.padding',12),fontSize:getComponent('input.fontSize',16),minHeight:getComponent('input.minHeight',44),backgroundColor:disabled?getColor('disabled','#f0f0f0'):getColor('background','#fff'),textAlign:isRTL?'right':'left',writingDirection:isRTL?'rtl':'ltr'},errorText:{color:getColor('error','#e74c3c'),fontSize:getComponent('error.fontSize',14),marginTop:getComponent('error.marginTop',4)}}));const registry=React.useMemo(()=>{const reg=createRegistryWithComponents(DEFAULT_RENDERERS);const overrides=formioContext==null?void 0:formioContext.componentOverrides;if(overrides){Object.entries(overrides).forEach(([t,override])=>{if(override&&typeof override==='function'){reg.register(t,props=>{return override(props.component,{value:props.value,onChange:props.onChange,error:props.error,disabled:props.disabled,readOnly:props.readOnly,formData:props.formData,validationErrors:props.validationErrors});});}});}return reg;},[formioContext==null?void 0:formioContext.componentOverrides]);const renderField=()=>{const renderer=registry.get(type);if(renderer){return React.createElement(React.Fragment,null,renderer({component,value,onChange:val=>onChange(key,val),error:translatedError,disabled,readOnly:!!component.readOnly}));}return React.createElement(FallbackRenderer,{component:component,value:value,onChange:v=>onChange(key,v),error:translatedError,disabled:disabled});};if(component.input===false)return null;if(type==='checkbox'){return renderField();}return React.createElement(View,{style:themedStyles.fieldContainer},translatedLabel&&React.createElement(Text,{style:themedStyles.label},translatedLabel,required&&React.createElement(Text,{style:[styles.required,{color:getColor('error')}]}," *")),renderField(),component.description?React.createElement(Text,{style:[styles.description,{color:getColor('textSecondary'),textAlign:isRTL?'right':'left'}]},translate(component.description,component.description)):null,translatedError&&React.createElement(Text,{style:themedStyles.errorText},translatedError));};const styles=StyleSheet.create({fieldContainer:{marginBottom:16},label:{fontSize:16,fontWeight:'500',marginBottom:8,color:'#333'},required:{color:'#e74c3c'},input:{borderWidth:1,borderColor:'#ddd',borderRadius:8,padding:12,fontSize:16,backgroundColor:'#fff'},disabled:{backgroundColor:'#f0f0f0',color:'#999'},textarea:{height:100,textAlignVertical:'top'},selectPlaceholder:{padding:12,fontSize:16,color:'#999',fontStyle:'italic'},inputError:{borderColor:'#e74c3c'},description:{color:'#666',fontSize:13,marginTop:4},errorText:{color:'#e74c3c',fontSize:14,marginTop:4},pickerWrapper:{borderWidth:1,borderColor:'#ddd',borderRadius:8,overflow:'hidden',backgroundColor:'#fff'},radioGroup:{gap:8},radioItem:{fontSize:16,paddingVertical:6},switchRow:{flexDirection:'row',alignItems:'center',gap:8},switchLabel:{fontSize:16}});
2
+ //# sourceMappingURL=FormioField.js.map
@@ -0,0 +1,2 @@
1
+ import React,{useState,useEffect}from'react';import{ScrollView,View,Text,TouchableOpacity,StyleSheet}from'react-native';import{useI18n}from'../i18n/I18nContext';import{FormioField}from'./FormioField';import{DatePicker}from'./DatePicker';import{FileUpload}from'./FileUpload';import{ResourceSelect}from'./ResourceSelect';import{DataGrid}from'./DataGrid';import{EditGrid}from'./EditGrid';import{Wizard}from'./Wizard';import{validateForm}from'../validation';import{useFormioContext}from'../context/FormioContext';import{safeEvalConditional,safeEvalValue}from'../utils';const traverseComponents=(components,cb)=>{const walk=comp=>{cb(comp);if(comp.components)comp.components.forEach(walk);if(comp.type==='columns'&&Array.isArray(comp.columns)){comp.columns.forEach(col=>{if(Array.isArray(col.components))col.components.forEach(walk);});}};components.forEach(walk);};const flatten=components=>{const out=[];traverseComponents(components,c=>out.push(c));return out;};const initDefaults=(components,data)=>{const flat=flatten(components);const next={...data};for(const c of flat){if(c.input!==false&&c.key&&next[c.key]===undefined){if(c.defaultValue!==undefined)next[c.key]=c.defaultValue;}}return next;};const isHidden=(component,data)=>{if(component.hidden)return true;const value=data[component.key];if(component.customConditional){const res=safeEvalConditional(component.customConditional,{data,value,row:data,util:{}});return!res;}if(component.conditional&&component.conditional.when){const whenVal=data[component.conditional.when];const eq=component.conditional.eq;const show=component.conditional.show!==false;const match=whenVal===eq;return show?!match:match;}return false;};const applyCalculations=(components,data)=>{const flat=flatten(components);let changed=true;let guard=0;let next={...data};while(changed&&guard<5){changed=false;guard++;for(const c of flat){if(c.calculateValue){const current=next[c.key];const calc=safeEvalValue(c.calculateValue,{data:next,value:current,row:next,util:{}});if(calc!==undefined&&calc!==current){next={...next,[c.key]:calc};changed=true;}}}}return next;};export const FormioForm=({form,data:initialData={},options,components:propComponents,onSubmit,onChange,onValidation})=>{const context=useFormioContext();const{translate,isRTL}=useI18n();const componentOverrides={...(context==null?void 0:context.componentOverrides),...propComponents};const theme=context==null?void 0:context.theme;const[formData,setFormData]=useState(initialData);const[errors,setErrors]=useState([]);if(form.display==='wizard'){return React.createElement(ScrollView,{style:styles.form},form.title&&React.createElement(Text,{style:styles.title},form.title),React.createElement(Wizard,{form:form,component:{type:'wizard',key:'wizard',pages:form.components},data:formData,setData:setFormData,errors:errors,onValidation:setErrors,onFinish:()=>{const validationErrors=validateForm(form.components,formData,{translate});if(validationErrors.length===0){onSubmit==null||onSubmit(formData);}else{setErrors(validationErrors);}}}));}useEffect(()=>{let next=initDefaults(form.components,initialData);next=applyCalculations(form.components,next);setFormData(next);const validationErrors=validateForm(form.components,next,{translate});setErrors(validationErrors);onValidation==null||onValidation(validationErrors);},[form]);useEffect(()=>{const validationErrors=validateForm(form.components,formData,{translate});setErrors(validationErrors);onValidation==null||onValidation(validationErrors);},[formData]);const handleFieldChange=(key,value)=>{let next={...formData,[key]:value};next=applyCalculations(form.components,next);setFormData(next);onChange==null||onChange(next);};const handleSubmit=()=>{const validationErrors=validateForm(form.components,formData,{translate});if(validationErrors.length===0){onSubmit==null||onSubmit(formData);}else{setErrors(validationErrors);}};const getFieldError=key=>{var _errors$find;return(_errors$find=errors.find(e=>e.field===key))==null?void 0:_errors$find.message;};const renderComponent=component=>{if(isHidden(component,formData))return null;const customRenderer=(componentOverrides==null?void 0:componentOverrides[component.type])||(componentOverrides==null?void 0:componentOverrides[component.key]);if(customRenderer){return customRenderer(component,{value:formData[component.key],onChange:value=>handleFieldChange(component.key,value),error:getFieldError(component.key),disabled:component.disabled||false,readOnly:(options==null?void 0:options.readOnly)||false,formData});}if(component.type==='button'&&component.key==='submit'){var _theme$colors;return React.createElement(TouchableOpacity,{key:component.key,style:[styles.submitButton,(theme==null||(_theme$colors=theme.colors)==null?void 0:_theme$colors.primary)&&{backgroundColor:theme.colors.primary}],onPress:handleSubmit},React.createElement(Text,{style:styles.submitButtonText},translate(component.label||'Submit',component.label||'Submit')));}if(component.type==='wizard'||form.display==='wizard'){const wizardPages=component.pages||form.components||[];return React.createElement(Wizard,{key:component.key||'wizard',form:form,component:{...component,pages:wizardPages,type:'wizard'},data:formData,setData:d=>setFormData(d),errors:errors,onFinish:handleSubmit});}if(component.type==='columns'&&Array.isArray(component.columns)){const cols=component.columns;const shouldShowLabel=component.label&&!component.hideLabel;return React.createElement(View,{key:component.key,style:styles.columnsContainer},shouldShowLabel?React.createElement(Text,{style:[styles.containerLabel,{textAlign:isRTL?'right':'left'}]},translate(component.label,component.label)):null,React.createElement(View,{style:styles.columnsRow},cols.map((col,i)=>React.createElement(View,{key:`${component.key}-col-${i}`,style:styles.column},Array.isArray(col.components)?col.components.map(renderComponent):null))));}if(component.components&&component.components.length&&component.type!=='wizard'){const children=component.components.map(renderComponent).filter(Boolean);if(children.length===0)return null;const displayText=component.title||component.label;const shouldShowLabel=displayText&&!component.hideLabel;return React.createElement(View,{key:component.key,style:styles.container},shouldShowLabel?React.createElement(Text,{style:[styles.containerLabel,{textAlign:isRTL?'right':'left'}]},translate(displayText,displayText)):null,children);}if(component.input===false)return null;switch(component.type){case'date':case'datetime':case'time':return React.createElement(DatePicker,{key:component.key,component:component,value:formData[component.key],onChange:val=>handleFieldChange(component.key,val),error:getFieldError(component.key),disabled:component.disabled,readOnly:options==null?void 0:options.readOnly});case'file':return React.createElement(FileUpload,{key:component.key,component:component,value:formData[component.key],onChange:val=>handleFieldChange(component.key,val),error:getFieldError(component.key),disabled:component.disabled,readOnly:options==null?void 0:options.readOnly});case'datagrid':return React.createElement(DataGrid,{key:component.key,component:component,value:formData[component.key],onChange:val=>handleFieldChange(component.key,val),error:getFieldError(component.key),disabled:component.disabled,readOnly:options==null?void 0:options.readOnly});case'editgrid':return React.createElement(EditGrid,{key:component.key,component:component,value:formData[component.key],onChange:val=>handleFieldChange(component.key,val),error:getFieldError(component.key),disabled:component.disabled,readOnly:options==null?void 0:options.readOnly});case'select':{return React.createElement(ResourceSelect,{key:component.key,component:component,value:formData[component.key],onChange:val=>handleFieldChange(component.key,val),error:getFieldError(component.key),disabled:component.disabled,readOnly:options==null?void 0:options.readOnly});}case'PlatformFileInput':return React.createElement(FileUpload,{key:component.key,component:component,value:formData[component.key],onChange:val=>handleFieldChange(component.key,val),error:getFieldError(component.key),disabled:component.disabled,readOnly:options==null?void 0:options.readOnly});}return React.createElement(FormioField,{key:component.key,component:component,value:formData[component.key],onChange:handleFieldChange,error:getFieldError(component.key)});};return React.createElement(ScrollView,{style:[styles.form,{direction:isRTL?'rtl':'ltr'}]},form.components.map((c,index)=>React.createElement(React.Fragment,{key:c.key||index},renderComponent(c))));};const styles=StyleSheet.create({form:{flex:1,padding:16,backgroundColor:'#f5f5f5'},title:{fontSize:24,fontWeight:'bold',marginBottom:24,textAlign:'center',color:'#333'},container:{marginBottom:16},columnsContainer:{marginBottom:16},columnsRow:{flexDirection:'row',gap:12},column:{flex:1},containerLabel:{fontSize:18,fontWeight:'600',marginBottom:12,color:'#333'},submitButton:{backgroundColor:'#007bff',padding:16,borderRadius:8,alignItems:'center',marginTop:24},submitButtonText:{color:'#fff',fontSize:16,fontWeight:'600'}});
2
+ //# sourceMappingURL=FormioForm.js.map
@@ -0,0 +1,2 @@
1
+ import React,{useState,useEffect}from'react';import{View,Text,TouchableOpacity,FlatList,TextInput,StyleSheet,ActivityIndicator}from'react-native';import{useI18n}from'../i18n/I18nContext';export const ResourceSelect=({component,value,disabled,readOnly,error,onChange,fetcher})=>{var _component$searchEnab;const[items,setItems]=useState([]);const[search,setSearch]=useState('');const[showList,setShowList]=useState(false);const[loading,setLoading]=useState(false);const{translate,isRTL}=useI18n();const getOptions=()=>{const data=component.data;if(!data)return[];if(data.values)return data.values;if(data.json&&Array.isArray(data.json))return data.json;return items;};useEffect(()=>{const data=component.data;if(data&&(data.dataSrc==='url'||data.dataSrc==='resource'||data.url)){setLoading(true);const doFetch=async()=>{try{var _data$url;let base=(_data$url=data.url)!=null?_data$url:'';let labelProp=data.labelProperty||'title';let valueProp=data.valueProperty||'id';let sep=base.includes('?')?'&':'?';let q=search?`${sep}${data.searchField||'search'}=${encodeURIComponent(search)}`:'';let url=`${base}${q}`;const res=fetcher?await fetcher(url):await fetch(url).then(r=>r.json());const dataArray=Array.isArray(res)?res:res.data||res.items||[];const mapped=dataArray.map(item=>{const originalLabel=item[labelProp]||item.name||item.label||item.title||item._id||item.id||String(item);return{label:translate(originalLabel,originalLabel),value:item[valueProp]||item._id||item.id||item.value||item};});setItems(mapped);}catch(err){setItems([]);}finally{setLoading(false);}};doFetch();}else{setItems(getOptions());}},[component.data,search,fetcher]);const options=getOptions();const filteredItems=options&&Array.isArray(options)?options.filter(item=>(item.label||'').toLowerCase().includes((search||'').toLowerCase())):[];const selectedItem=options.find(item=>item.value===value);if(disabled||readOnly){return React.createElement(View,{style:styles.container},React.createElement(Text,{style:[styles.label,{textAlign:isRTL?'right':'left'}]},translate(component.label||'',component.label)),React.createElement(View,{style:[styles.selector,styles.disabled]},React.createElement(Text,{style:styles.selectorText},(selectedItem==null?void 0:selectedItem.label)||component.placeholder||'Select...')),error&&React.createElement(Text,{style:styles.error},error));}const useSearch=((_component$searchEnab=component.searchEnabled)!=null?_component$searchEnab:true)&&options.length>5;return React.createElement(View,{style:styles.container},React.createElement(Text,{style:[styles.label,{textAlign:isRTL?'right':'left'}]},translate(component.label||'',component.label),component.required&&React.createElement(Text,{style:styles.required}," *")),React.createElement(TouchableOpacity,{style:[styles.selector,error&&styles.selectorError],onPress:()=>setShowList(!showList),disabled:disabled||readOnly},React.createElement(Text,{style:[styles.selectorText,!selectedItem&&styles.placeholder,{textAlign:isRTL?'right':'left'}]},loading?translate('Loading...','Loading...'):(selectedItem==null?void 0:selectedItem.label)||translate(component.placeholder||'Select...',component.placeholder||'Select...')),React.createElement(Text,{style:styles.arrow},showList?'▲':'▼')),showList&&React.createElement(View,{style:styles.dropdownWrapper},React.createElement(View,{style:styles.dropdown},useSearch&&React.createElement(TextInput,{style:[styles.searchInput,{textAlign:isRTL?'right':'left'}],placeholder:translate('Search...','Search...'),value:search,onChangeText:setSearch,autoFocus:true,editable:!disabled&&!readOnly}),loading?React.createElement(ActivityIndicator,{style:{margin:12}}):React.createElement(FlatList,{data:filteredItems,keyExtractor:item=>{var _item$label;const v=typeof item.value==='object'?JSON.stringify(item.value):String(item.value);const l=String((_item$label=item.label)!=null?_item$label:'');return`${v}-${l}`;},renderItem:({item})=>React.createElement(TouchableOpacity,{key:(_item$label2=>{const v=typeof item.value==='object'?JSON.stringify(item.value):String(item.value);const l=String((_item$label2=item.label)!=null?_item$label2:'');return`${v}-${l}`;})(),style:[styles.item,item.value===value&&styles.selectedItem],onPress:()=>{onChange(item.value);setShowList(false);setSearch('');}},React.createElement(Text,{style:[styles.itemText,item.value===value&&styles.selectedText]},item.label)),ListEmptyComponent:React.createElement(Text,{style:[styles.emptyText,{textAlign:isRTL?'right':'left'}]},loading?translate('Loading...','Loading...'):translate('No options available','No options available')),keyboardShouldPersistTaps:"handled",style:styles.flatList,contentContainerStyle:{flexGrow:1},nestedScrollEnabled:true}))),error&&React.createElement(Text,{style:[styles.error,{textAlign:isRTL?'right':'left'}]},translate(error,error)));};const styles=StyleSheet.create({container:{marginBottom:16},label:{fontSize:16,fontWeight:'600',marginBottom:8,color:'#333'},required:{color:'#e74c3c'},selector:{borderWidth:1,borderColor:'#ddd',borderRadius:8,padding:12,backgroundColor:'#fff',flexDirection:'row',justifyContent:'space-between',alignItems:'center'},selectorError:{borderColor:'#e74c3c'},disabled:{backgroundColor:'#f5f5f5',opacity:0.6},selectorText:{fontSize:16,color:'#333',flex:1},placeholder:{color:'#999'},arrow:{fontSize:12,color:'#666'},dropdownWrapper:{position:'relative',zIndex:1000},dropdown:{borderWidth:1,borderColor:'#ddd',borderRadius:8,backgroundColor:'#fff',maxHeight:200,minHeight:10,marginTop:4,overflow:'hidden'},flatList:{flexGrow:1},searchInput:{borderBottomWidth:1,borderBottomColor:'#eee',padding:12,fontSize:16},item:{padding:12,borderBottomWidth:1,borderBottomColor:'#eee'},selectedItem:{backgroundColor:'#e3f2fd'},itemText:{fontSize:16,color:'#333'},selectedText:{fontWeight:'600',color:'#1976d2'},emptyText:{padding:12,textAlign:'center',color:'#999',fontStyle:'italic'},error:{color:'#e74c3c',fontSize:14,marginTop:4}});
2
+ //# sourceMappingURL=ResourceSelect.js.map
@@ -0,0 +1,2 @@
1
+ import React,{useState,useEffect}from'react';import{View,Text,TouchableOpacity}from'react-native';import{FormioField}from'./FormioField';import{validateForm}from'../validation';import{useTheme}from'../hooks/useTheme';import{useI18n}from'../i18n/I18nContext';const safeEval=(code,ctx)=>{try{var _ctx$row,_ctx$util;const fn=new Function('data','row','value','util','show',`return (function(){\n${code}\nreturn typeof show !== 'undefined' ? show : undefined;\n})();`);return fn(ctx.data,(_ctx$row=ctx.row)!=null?_ctx$row:ctx.data,ctx.value,(_ctx$util=ctx.util)!=null?_ctx$util:{},undefined);}catch(e){return undefined;}};const isHidden=(component,data)=>{if(component.hidden)return true;const value=data[component.key];if(component.customConditional){const res=safeEval(component.customConditional,{data,value,row:data,util:{}});if(typeof res==='boolean')return!res;if(res!==undefined)return!Boolean(res);}if(component.conditional&&component.conditional.when){const whenVal=data[component.conditional.when];const eq=component.conditional.eq;const show=component.conditional.show!==false;const match=whenVal===eq;return show?!match:match;}return false;};const applyCalculations=(components,data)=>{let changed=true;let guard=0;let next={...data};while(changed&&guard<5){changed=false;guard++;for(const c of components){if(c.calculateValue){const current=next[c.key];const calc=safeEval(c.calculateValue,{data:next,value:current,row:next,util:{}});if(calc!==undefined&&calc!==current){next={...next,[c.key]:calc};changed=true;}}}}return next;};export const Wizard=({form,component,data,setData,errors,onValidation,onNext,onPrev,onFinish})=>{const[currentPage,setCurrentPage]=useState(0);const{createStyles,getColor,getComponent}=useTheme();const{translate,isRTL}=useI18n();const pages=component.pages||[];const currentPageData=pages[currentPage];const getError=key=>{var _errors$find;return(_errors$find=errors.find(e=>e.field===key))==null?void 0:_errors$find.message;};const handleChange=(key,value)=>{let next={...data,[key]:value};const allComponents=pages.flatMap(p=>p.components||[]);next=applyCalculations(allComponents,next);setData(next);};useEffect(()=>{if(currentPageData!=null&&currentPageData.components){const allComponents=pages.flatMap(p=>p.components||[]);const allErrors=validateForm(allComponents,data,{translate});onValidation==null||onValidation(allErrors);}},[data,currentPageData,pages,onValidation]);const nextPage=()=>{if(currentPage<pages.length-1){setCurrentPage(currentPage+1);onNext==null||onNext();}else{onFinish==null||onFinish();}};const prevPage=()=>{if(currentPage>0){setCurrentPage(currentPage-1);onPrev==null||onPrev();}};if(!currentPageData||pages.length===0){return React.createElement(Text,null,"No wizard pages found");}const themedStyles=createStyles(()=>({wizardContainer:{flex:1},pageIndicator:{alignItems:'center',marginBottom:getComponent('container.marginBottom',16)},pageText:{fontSize:getComponent('label.fontSize',14),color:getColor('textSecondary','#666')},pageTitle:{fontSize:getComponent('button.fontSize',20),fontWeight:getComponent('button.fontWeight','bold'),marginBottom:getComponent('container.marginBottom',16),textAlign:'center',color:getColor('text','#333')},pageContent:{flex:1,marginBottom:getComponent('container.marginBottom',20)},navRow:{flexDirection:'row',justifyContent:'space-between',paddingTop:getComponent('container.padding',16),borderTopWidth:1,borderTopColor:getColor('border','#eee')},navBtn:{padding:getComponent('button.padding',12),borderRadius:getComponent('button.borderRadius',8),minWidth:100,alignItems:'center',minHeight:getComponent('button.minHeight',44)},prevBtn:{backgroundColor:getColor('textSecondary','#6c757d')},nextBtn:{backgroundColor:getColor('primary','#007bff')},navText:{color:getColor('background','#fff'),fontWeight:getComponent('button.fontWeight','600'),fontSize:getComponent('button.fontSize',16)},disabled:{opacity:0.4}}));return React.createElement(View,{style:themedStyles.wizardContainer},React.createElement(View,{style:themedStyles.pageIndicator},React.createElement(Text,{style:themedStyles.pageText},"Page ",currentPage+1," of ",pages.length)),currentPageData.title&&React.createElement(Text,{style:[themedStyles.pageTitle,{textAlign:isRTL?'right':'left'}]},translate(currentPageData.title,currentPageData.title)),React.createElement(View,{style:themedStyles.pageContent},(currentPageData.components||[]).map(c=>{if(isHidden(c,data))return null;return React.createElement(FormioField,{key:c.key,component:c,value:data[c.key],onChange:handleChange,error:getError(c.key)});})),React.createElement(View,{style:themedStyles.navRow},React.createElement(TouchableOpacity,{onPress:prevPage,style:[themedStyles.navBtn,themedStyles.prevBtn,currentPage===0&&themedStyles.disabled],disabled:currentPage===0},React.createElement(Text,{style:themedStyles.navText},translate('Previous','Previous'))),React.createElement(TouchableOpacity,{onPress:nextPage,style:[themedStyles.navBtn,themedStyles.nextBtn]},React.createElement(Text,{style:themedStyles.navText},currentPage<pages.length-1?translate('Next','Next'):translate('Finish','Finish')))));};
2
+ //# sourceMappingURL=Wizard.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{Switch,StyleSheet,View,Text}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';import{useI18n}from'../../i18n/I18nContext';import{getTextAlign,getFlexDirection}from'../../utils/rtlUtils';import{getCheckboxAriaAttributes}from'../../utils/a11yUtils';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},checkboxContainer:{flexDirection:'row',alignItems:'center',paddingVertical:SPACING.sm},label:{fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,marginLeft:SPACING.sm,flex:1},labelDisabled:{color:COLORS.disabled},errorText:{color:COLORS.error,fontSize:TYPOGRAPHY.fontSize.xs,marginTop:SPACING.xs}});const CheckboxRendererComponent=({component,value,onChange,error,disabled=false,readOnly=false})=>{const{label}=component;const{isRTL}=useI18n();const isChecked=Boolean(value);return React.createElement(View,{style:styles.container},React.createElement(View,{style:[styles.checkboxContainer,{flexDirection:getFlexDirection(isRTL)}]},React.createElement(View,getCheckboxAriaAttributes(label||'',isChecked,disabled||readOnly),React.createElement(Switch,{value:isChecked,onValueChange:onChange,disabled:disabled||readOnly,trackColor:{false:COLORS.border,true:COLORS.primary},thumbColor:isChecked?COLORS.primary:COLORS.disabled})),label&&React.createElement(Text,{style:[styles.label,(disabled||readOnly)&&styles.labelDisabled,{textAlign:getTextAlign(isRTL)}]},label)),error&&React.createElement(Text,{style:[styles.errorText,{textAlign:getTextAlign(isRTL)}]},error));};export const CheckboxRenderer=React.memo(CheckboxRendererComponent);
2
+ //# sourceMappingURL=CheckboxRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{TextInput,StyleSheet,View}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},input:{borderWidth:1,borderColor:COLORS.border,borderRadius:4,paddingHorizontal:SPACING.sm,paddingVertical:SPACING.sm,fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,minHeight:40},inputFocused:{borderColor:COLORS.primary},inputError:{borderColor:COLORS.error},inputDisabled:{backgroundColor:COLORS.disabled,color:COLORS.disabled}});export const EmailRenderer=({component,value,onChange,error,disabled=false,readOnly=false})=>{const[state,setState]=React.useState({isFocused:false});const{placeholder}=component;const inputStyle=[styles.input,state.isFocused&&styles.inputFocused,error&&styles.inputError,disabled&&styles.inputDisabled];return React.createElement(View,{style:styles.container},React.createElement(TextInput,{style:inputStyle,placeholder:placeholder||'Enter email address',placeholderTextColor:COLORS.placeholder,value:String(value||''),onChangeText:onChange,editable:!disabled&&!readOnly,onFocus:()=>setState({isFocused:true}),onBlur:()=>setState({isFocused:false}),keyboardType:"email-address",autoCapitalize:"none",autoCorrect:false,autoComplete:"email"}));};
2
+ //# sourceMappingURL=EmailRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{StyleSheet,View,Text}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';import{Logger}from'../../utils/logger';const logger=new Logger('FallbackRenderer');const styles=StyleSheet.create({container:{marginBottom:SPACING.md,padding:SPACING.md,backgroundColor:COLORS.warningLight,borderLeftWidth:4,borderLeftColor:COLORS.warning,borderRadius:4},title:{fontSize:TYPOGRAPHY.fontSize.md,fontWeight:TYPOGRAPHY.fontWeight.semibold,color:COLORS.warning,marginBottom:SPACING.xs},message:{fontSize:TYPOGRAPHY.fontSize.sm,color:COLORS.text,marginBottom:SPACING.sm},details:{fontSize:TYPOGRAPHY.fontSize.xs,color:COLORS.textSecondary,backgroundColor:COLORS.background,padding:SPACING.sm,borderRadius:3,fontFamily:'monospace'}});export const FallbackRenderer=({component})=>{const{type,label,key}=component;React.useEffect(()=>{logger.warn(`Unknown component type: "${type}" (${label||key||'unknown'})`);},[type,label,key]);return React.createElement(View,{style:styles.container},React.createElement(Text,{style:styles.title},"Unsupported Component Type"),React.createElement(Text,{style:styles.message},"Component type \"",type,"\" is not supported or not registered."),label&&React.createElement(Text,{style:styles.message},"Label: ",label),React.createElement(Text,{style:styles.details},key||'no-key'));};
2
+ //# sourceMappingURL=FallbackRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{TextInput,StyleSheet,View}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},input:{borderWidth:1,borderColor:COLORS.border,borderRadius:4,paddingHorizontal:SPACING.sm,paddingVertical:SPACING.sm,fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,minHeight:40},inputFocused:{borderColor:COLORS.primary},inputError:{borderColor:COLORS.error},inputDisabled:{backgroundColor:COLORS.disabled,color:COLORS.disabled}});export const NumberRenderer=({component,value,onChange,error,disabled=false,readOnly=false})=>{const[state,setState]=React.useState({isFocused:false});const{placeholder,min,max}=component;const inputStyle=[styles.input,state.isFocused&&styles.inputFocused,error&&styles.inputError,disabled&&styles.inputDisabled];const handleChange=text=>{if(text===''){onChange(null);return;}const numValue=parseFloat(text);if(!isNaN(numValue)){let constrainedValue=numValue;if(min!==undefined&&constrainedValue<min){constrainedValue=min;}if(max!==undefined&&constrainedValue>max){constrainedValue=max;}onChange(constrainedValue);}};return React.createElement(View,{style:styles.container},React.createElement(TextInput,{style:inputStyle,placeholder:placeholder||'Enter a number',placeholderTextColor:COLORS.placeholder,value:value!==null&&value!==undefined?String(value):'',onChangeText:handleChange,editable:!disabled&&!readOnly,onFocus:()=>setState({isFocused:true}),onBlur:()=>setState({isFocused:false}),keyboardType:"decimal-pad"}));};
2
+ //# sourceMappingURL=NumberRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React,{useState}from'react';import{TextInput,StyleSheet,View,Text,TouchableOpacity}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},inputWrapper:{flexDirection:'row',alignItems:'center',borderWidth:1,borderColor:COLORS.border,borderRadius:4,paddingHorizontal:SPACING.sm,backgroundColor:COLORS.background},inputWrapperFocused:{borderColor:COLORS.primary},inputWrapperError:{borderColor:COLORS.error},inputWrapperDisabled:{backgroundColor:COLORS.disabled},input:{flex:1,paddingVertical:SPACING.sm,fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,minHeight:40},toggleButton:{padding:SPACING.xs,marginLeft:SPACING.xs},toggleText:{fontSize:18,color:COLORS.primary}});export const PasswordRenderer=({component,value,onChange,error,disabled=false,readOnly=false})=>{const[state,setState]=useState({isFocused:false,showPassword:false});const{placeholder}=component;const inputWrapperStyle=[styles.inputWrapper,state.isFocused&&styles.inputWrapperFocused,error&&styles.inputWrapperError,disabled&&styles.inputWrapperDisabled];return React.createElement(View,{style:styles.container},React.createElement(View,{style:inputWrapperStyle},React.createElement(TextInput,{style:styles.input,placeholder:placeholder||'Enter password',placeholderTextColor:COLORS.placeholder,value:String(value||''),onChangeText:onChange,editable:!disabled&&!readOnly,onFocus:()=>setState(prev=>({...prev,isFocused:true})),onBlur:()=>setState(prev=>({...prev,isFocused:false})),secureTextEntry:!state.showPassword,autoCapitalize:"none",autoCorrect:false}),React.createElement(TouchableOpacity,{style:styles.toggleButton,onPress:()=>setState(prev=>({...prev,showPassword:!prev.showPassword})),disabled:disabled||readOnly},React.createElement(Text,{style:styles.toggleText},state.showPassword?'🐵':'🙈'))));};
2
+ //# sourceMappingURL=PasswordRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{TextInput,StyleSheet,View}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},input:{borderWidth:1,borderColor:COLORS.border,borderRadius:4,paddingHorizontal:SPACING.sm,paddingVertical:SPACING.sm,fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,minHeight:40},inputFocused:{borderColor:COLORS.primary},inputError:{borderColor:COLORS.error},inputDisabled:{backgroundColor:COLORS.disabled,color:COLORS.disabled}});export const PhoneNumberRenderer=({component,value,onChange,error,disabled=false,readOnly=false})=>{const[state,setState]=React.useState({isFocused:false});const{placeholder}=component;const inputStyle=[styles.input,state.isFocused&&styles.inputFocused,error&&styles.inputError,disabled&&styles.inputDisabled];return React.createElement(View,{style:styles.container},React.createElement(TextInput,{style:inputStyle,placeholder:placeholder||'Enter phone number',placeholderTextColor:COLORS.placeholder,value:String(value||''),onChangeText:onChange,editable:!disabled&&!readOnly,onFocus:()=>setState({isFocused:true}),onBlur:()=>setState({isFocused:false}),keyboardType:"phone-pad",autoCapitalize:"none",autoCorrect:false}));};
2
+ //# sourceMappingURL=PhoneNumberRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import _extends from"@babel/runtime/helpers/esm/extends";import React from'react';import{View,Text,TouchableOpacity,StyleSheet}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';import{useI18n}from'../../i18n/I18nContext';import{getTextAlign,getFlexDirection}from'../../utils/rtlUtils';import{getRadioAriaAttributes}from'../../utils/a11yUtils';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},radioGroup:{gap:SPACING.sm},radioItem:{flexDirection:'row',alignItems:'center',paddingVertical:SPACING.xs},radioButton:{width:20,height:20,borderRadius:10,borderWidth:2,borderColor:COLORS.border,justifyContent:'center',alignItems:'center',marginRight:SPACING.sm},radioButtonSelected:{borderColor:COLORS.primary,backgroundColor:COLORS.primary},radioButtonDisabled:{borderColor:COLORS.disabled,backgroundColor:COLORS.disabled},radioInner:{width:8,height:8,borderRadius:4,backgroundColor:COLORS.background},radioLabel:{fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,flex:1},radioLabelDisabled:{color:COLORS.disabled}});const RadioRendererComponent=({component,value,onChange,error,disabled=false,readOnly=false})=>{var _component$data;const{isRTL}=useI18n();const options=parseOptions(((_component$data=component.data)==null?void 0:_component$data.values)||component.values||[]);return React.createElement(View,{style:styles.container},React.createElement(View,{style:[styles.radioGroup,{flexDirection:getFlexDirection(isRTL)}]},options.map((option,index)=>React.createElement(TouchableOpacity,_extends({key:String(option.value),style:styles.radioItem,onPress:()=>!disabled&&!readOnly&&onChange(option.value),disabled:disabled||readOnly},getRadioAriaAttributes(option.label,value===option.value,disabled||readOnly)),React.createElement(View,{style:[styles.radioButton,value===option.value&&styles.radioButtonSelected,(disabled||readOnly)&&styles.radioButtonDisabled]},value===option.value&&React.createElement(View,{style:styles.radioInner})),React.createElement(Text,{style:[styles.radioLabel,(disabled||readOnly)&&styles.radioLabelDisabled,{textAlign:getTextAlign(isRTL)}]},option.label)))));};function parseOptions(data){if(!Array.isArray(data)){return[];}return data.map(item=>{if(typeof item==='string'){return{label:item,value:item};}if(typeof item==='object'&&item!==null){return{label:item.label||String(item.value),value:item.value};}return{label:String(item),value:item};});}export const RadioRenderer=React.memo(RadioRendererComponent);
2
+ //# sourceMappingURL=RadioRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{StyleSheet,View,Text,TouchableOpacity,Modal,FlatList}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},label:{fontSize:TYPOGRAPHY.fontSize.sm,fontWeight:TYPOGRAPHY.fontWeight.semibold,color:COLORS.text,marginBottom:SPACING.xs},selectButton:{borderWidth:1,borderColor:COLORS.border,borderRadius:4,paddingHorizontal:SPACING.sm,paddingVertical:SPACING.sm,minHeight:40,justifyContent:'center'},selectButtonFocused:{borderColor:COLORS.primary},selectButtonError:{borderColor:COLORS.error},selectButtonDisabled:{backgroundColor:COLORS.disabled},selectText:{fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text},selectTextPlaceholder:{color:COLORS.placeholder},selectTextDisabled:{color:COLORS.disabled},modalOverlay:{flex:1,backgroundColor:'rgba(0, 0, 0, 0.5)',justifyContent:'flex-end'},modalContent:{backgroundColor:COLORS.background,borderTopLeftRadius:12,borderTopRightRadius:12,maxHeight:'80%'},modalHeader:{paddingHorizontal:SPACING.md,paddingVertical:SPACING.md,borderBottomWidth:1,borderBottomColor:COLORS.border,flexDirection:'row',justifyContent:'space-between',alignItems:'center'},modalTitle:{fontSize:TYPOGRAPHY.fontSize.lg,fontWeight:TYPOGRAPHY.fontWeight.bold,color:COLORS.text},closeButton:{padding:SPACING.sm},closeButtonText:{fontSize:TYPOGRAPHY.fontSize.lg,color:COLORS.primary,fontWeight:TYPOGRAPHY.fontWeight.bold},optionItem:{paddingHorizontal:SPACING.md,paddingVertical:SPACING.md,borderBottomWidth:1,borderBottomColor:COLORS.border},optionItemSelected:{backgroundColor:COLORS.primaryLight},optionText:{fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text},optionTextSelected:{fontWeight:TYPOGRAPHY.fontWeight.semibold,color:COLORS.primary},errorText:{color:COLORS.error,fontSize:TYPOGRAPHY.fontSize.xs,marginTop:SPACING.xs}});export const SelectRenderer=({component,value,onChange,error,disabled=false,readOnly=false})=>{var _component$data;const[state,setState]=React.useState({isOpen:false,isFocused:false,options:parseOptions(((_component$data=component.data)==null?void 0:_component$data.values)||component.values||[])});const{label,placeholder}=component;const selectedOption=state.options.find(opt=>opt.value===value);const displayText=(selectedOption==null?void 0:selectedOption.label)||placeholder||'Select an option';const selectButtonStyle=[styles.selectButton,state.isFocused&&styles.selectButtonFocused,error&&styles.selectButtonError,(disabled||readOnly)&&styles.selectButtonDisabled];const selectTextStyle=[styles.selectText,!selectedOption&&styles.selectTextPlaceholder,(disabled||readOnly)&&styles.selectTextDisabled];const handleSelect=selectedValue=>{onChange(selectedValue);setState(prev=>({...prev,isOpen:false}));};const handleOpenClose=()=>{if(!disabled&&!readOnly){setState(prev=>({...prev,isOpen:!prev.isOpen,isFocused:!prev.isOpen}));}};return React.createElement(View,{style:styles.container},label&&React.createElement(Text,{style:styles.label},label),React.createElement(TouchableOpacity,{style:selectButtonStyle,onPress:handleOpenClose,disabled:disabled||readOnly},React.createElement(Text,{style:selectTextStyle},displayText)),React.createElement(Modal,{visible:state.isOpen&&!disabled&&!readOnly,transparent:true,animationType:"slide"},React.createElement(View,{style:styles.modalOverlay},React.createElement(View,{style:styles.modalContent},React.createElement(View,{style:styles.modalHeader},React.createElement(Text,{style:styles.modalTitle},label||'Select'),React.createElement(TouchableOpacity,{style:styles.closeButton,onPress:handleOpenClose},React.createElement(Text,{style:styles.closeButtonText},"Done"))),React.createElement(FlatList,{data:state.options,keyExtractor:(item,idx)=>String(idx),renderItem:({item})=>React.createElement(TouchableOpacity,{style:[styles.optionItem,item.value===value&&styles.optionItemSelected],onPress:()=>handleSelect(item.value)},React.createElement(Text,{style:[styles.optionText,item.value===value&&styles.optionTextSelected]},item.label))})))),error&&React.createElement(Text,{style:styles.errorText},error));};function parseOptions(data){if(!Array.isArray(data)){return[];}return data.map(item=>{if(typeof item==='string'){return{label:item,value:item};}if(typeof item==='object'&&item!==null){return{label:item.label||String(item.value),value:item.value};}return{label:String(item),value:item};});}
2
+ //# sourceMappingURL=SelectRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{View,Text,TouchableOpacity,StyleSheet}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},label:{fontSize:TYPOGRAPHY.fontSize.sm,fontWeight:TYPOGRAPHY.fontWeight.semibold,color:COLORS.text,marginBottom:SPACING.sm},checkboxGroup:{gap:SPACING.sm},checkboxItem:{flexDirection:'row',alignItems:'center',paddingVertical:SPACING.xs},checkbox:{width:20,height:20,borderRadius:3,borderWidth:2,borderColor:COLORS.border,justifyContent:'center',alignItems:'center',marginRight:SPACING.sm},checkboxSelected:{borderColor:COLORS.primary,backgroundColor:COLORS.primary},checkboxDisabled:{borderColor:COLORS.disabled,backgroundColor:COLORS.disabled},checkmark:{fontSize:14,color:COLORS.background,fontWeight:'bold'},checkboxLabel:{fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,flex:1},checkboxLabelDisabled:{color:COLORS.disabled},errorText:{color:COLORS.error,fontSize:TYPOGRAPHY.fontSize.xs,marginTop:SPACING.sm}});export const SelectboxesRenderer=({component,value={},onChange,error,disabled=false,readOnly=false})=>{var _component$data;const{label}=component;const options=parseOptions(((_component$data=component.data)==null?void 0:_component$data.values)||component.values||[]);const selectedValues=value||{};const handleToggle=optionValue=>{if(disabled||readOnly)return;const newValue={...selectedValues,[String(optionValue)]:!selectedValues[String(optionValue)]};onChange(newValue);};return React.createElement(View,{style:styles.container},label&&React.createElement(Text,{style:styles.label},label),React.createElement(View,{style:styles.checkboxGroup},options.map(option=>{const isSelected=selectedValues[String(option.value)];return React.createElement(TouchableOpacity,{key:String(option.value),style:styles.checkboxItem,onPress:()=>handleToggle(option.value),disabled:disabled||readOnly},React.createElement(View,{style:[styles.checkbox,isSelected&&styles.checkboxSelected,(disabled||readOnly)&&styles.checkboxDisabled]},isSelected&&React.createElement(Text,{style:styles.checkmark},"\u2713")),React.createElement(Text,{style:[styles.checkboxLabel,(disabled||readOnly)&&styles.checkboxLabelDisabled]},option.label));})),error&&React.createElement(Text,{style:styles.errorText},error));};function parseOptions(data){if(!Array.isArray(data)){return[];}return data.map(item=>{if(typeof item==='string'){return{label:item,value:item};}if(typeof item==='object'&&item!==null){return{label:item.label||String(item.value),value:item.value};}return{label:String(item),value:item};});}
2
+ //# sourceMappingURL=SelectboxesRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{TextInput,StyleSheet,View,Text}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},label:{fontSize:TYPOGRAPHY.fontSize.sm,fontWeight:TYPOGRAPHY.fontWeight.semibold,color:COLORS.text,marginBottom:SPACING.xs},input:{borderWidth:1,borderColor:COLORS.border,borderRadius:4,paddingHorizontal:SPACING.sm,paddingVertical:SPACING.sm,fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,minHeight:100,textAlignVertical:'top'},inputFocused:{borderColor:COLORS.primary},inputError:{borderColor:COLORS.error},inputDisabled:{backgroundColor:COLORS.disabled,color:COLORS.disabled},errorText:{color:COLORS.error,fontSize:TYPOGRAPHY.fontSize.xs,marginTop:SPACING.xs},charCount:{fontSize:TYPOGRAPHY.fontSize.xs,color:COLORS.textSecondary,marginTop:SPACING.xs}});export const TextAreaRenderer=({component,value,onChange,error,disabled=false,readOnly=false})=>{const[state,setState]=React.useState({isFocused:false});const{label,placeholder,maxLength}=component;const currentLength=String(value||'').length;const inputStyle=[styles.input,state.isFocused&&styles.inputFocused,error&&styles.inputError,disabled&&styles.inputDisabled];return React.createElement(View,{style:styles.container},label&&React.createElement(Text,{style:styles.label},label),React.createElement(TextInput,{style:inputStyle,placeholder:placeholder,placeholderTextColor:COLORS.placeholder,value:String(value||''),onChangeText:onChange,editable:!disabled&&!readOnly,onFocus:()=>setState({isFocused:true}),onBlur:()=>setState({isFocused:false}),multiline:true,numberOfLines:4,maxLength:maxLength}),maxLength&&React.createElement(Text,{style:styles.charCount},currentLength," / ",maxLength),error&&React.createElement(Text,{style:styles.errorText},error));};
2
+ //# sourceMappingURL=TextAreaRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{TextInput,StyleSheet,View}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},input:{borderWidth:1,borderColor:COLORS.border,borderRadius:4,paddingHorizontal:SPACING.sm,paddingVertical:SPACING.sm,fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,minHeight:40},inputFocused:{borderColor:COLORS.primary},inputError:{borderColor:COLORS.error},inputDisabled:{backgroundColor:COLORS.disabled,color:COLORS.disabled}});export const TextfieldRenderer=({component,value,onChange,error,disabled=false,readOnly=false})=>{const[state,setState]=React.useState({isFocused:false});const{placeholder,type='text'}=component;const inputStyle=[styles.input,state.isFocused&&styles.inputFocused,error&&styles.inputError,disabled&&styles.inputDisabled];return React.createElement(View,{style:styles.container},React.createElement(TextInput,{style:inputStyle,placeholder:placeholder,placeholderTextColor:COLORS.placeholder,value:String(value||''),onChangeText:onChange,editable:!disabled&&!readOnly,onFocus:()=>setState({isFocused:true}),onBlur:()=>setState({isFocused:false}),keyboardType:getKeyboardType(type),secureTextEntry:type==='password',autoCapitalize:getAutoCapitalize(type),autoCorrect:type!=='email'&&type!=='url'}));};function getKeyboardType(type){const keyboardMap={email:'email-address',url:'url',number:'numeric',tel:'phone-pad',text:'default'};return keyboardMap[type]||'default';}function getAutoCapitalize(type){const capitalizeMap={email:'none',url:'none',text:'sentences'};return capitalizeMap[type]||'none';}
2
+ //# sourceMappingURL=TextfieldRenderer.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{TextInput,StyleSheet,View}from'react-native';import{COLORS,SPACING,TYPOGRAPHY}from'../../constants';const styles=StyleSheet.create({container:{marginBottom:SPACING.md},input:{borderWidth:1,borderColor:COLORS.border,borderRadius:4,paddingHorizontal:SPACING.sm,paddingVertical:SPACING.sm,fontSize:TYPOGRAPHY.fontSize.md,color:COLORS.text,minHeight:40},inputFocused:{borderColor:COLORS.primary},inputError:{borderColor:COLORS.error},inputDisabled:{backgroundColor:COLORS.disabled,color:COLORS.disabled}});export const URLRenderer=({component,value,onChange,error,disabled=false,readOnly=false})=>{const[state,setState]=React.useState({isFocused:false});const{label,placeholder}=component;const inputStyle=[styles.input,state.isFocused&&styles.inputFocused,error&&styles.inputError,disabled&&styles.inputDisabled];return React.createElement(View,{style:styles.container},React.createElement(TextInput,{style:inputStyle,placeholder:placeholder||'Enter URL',placeholderTextColor:COLORS.placeholder,value:String(value||''),onChangeText:onChange,editable:!disabled&&!readOnly,onFocus:()=>setState({isFocused:true}),onBlur:()=>setState({isFocused:false}),keyboardType:"default",autoCapitalize:"none",autoCorrect:false}));};
2
+ //# sourceMappingURL=URLRenderer.js.map
@@ -0,0 +1,2 @@
1
+ export{TextfieldRenderer}from'./TextfieldRenderer';export{EmailRenderer}from'./EmailRenderer';export{NumberRenderer}from'./NumberRenderer';export{CheckboxRenderer}from'./CheckboxRenderer';export{RadioRenderer}from'./RadioRenderer';export{SelectRenderer}from'./SelectRenderer';export{SelectboxesRenderer}from'./SelectboxesRenderer';export{TextAreaRenderer}from'./TextAreaRenderer';export{PasswordRenderer}from'./PasswordRenderer';export{URLRenderer}from'./URLRenderer';export{PhoneNumberRenderer}from'./PhoneNumberRenderer';export{FallbackRenderer}from'./FallbackRenderer';export const DEFAULT_RENDERERS={textfield:require('./TextfieldRenderer').TextfieldRenderer,text:require('./TextfieldRenderer').TextfieldRenderer,email:require('./EmailRenderer').EmailRenderer,number:require('./NumberRenderer').NumberRenderer,checkbox:require('./CheckboxRenderer').CheckboxRenderer,radio:require('./RadioRenderer').RadioRenderer,select:require('./SelectRenderer').SelectRenderer,selectboxes:require('./SelectboxesRenderer').SelectboxesRenderer,textarea:require('./TextAreaRenderer').TextAreaRenderer,password:require('./PasswordRenderer').PasswordRenderer,url:require('./URLRenderer').URLRenderer,phoneNumber:require('./PhoneNumberRenderer').PhoneNumberRenderer};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export const DEFAULT_COLORS={PRIMARY:'#007AFF',SECONDARY:'#5856D6',ERROR:'#FF3B30',SUCCESS:'#34C759',WARNING:'#FF9500',INFO:'#00B0FF',BACKGROUND:'#FFFFFF',SURFACE:'#F2F2F7',TEXT:'#333333',TEXT_SECONDARY:'#8E8E93',BORDER:'#C7C7CC',BORDER_FOCUS:'#007AFF',DISABLED:'#F0F0F0',PLACEHOLDER:'#C7C7CC'};
2
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1,2 @@
1
+ export const COMPONENT_TYPES={TEXTFIELD:'textfield',EMAIL:'email',PASSWORD:'password',NUMBER:'number',TEXTAREA:'textarea',URL:'url',PHONE_NUMBER:'phoneNumber',SELECT:'select',CHECKBOX:'checkbox',RADIO:'radio',SELECTBOXES:'selectboxes',DATE:'date',DATETIME:'datetime',TIME:'time',DAY:'day',FILE:'file',PANEL:'panel',CONTAINER:'container',COLUMNS:'columns',FIELDSET:'fieldset',WELL:'well',TABS:'tabs',TABLE:'table',BUTTON:'button',HTML:'html',LABEL:'label',HIDDEN:'hidden',CONTENT:'content',DATAGRID:'datagrid',EDITGRID:'editgrid',TREE:'tree',WIZARD:'wizard',SIGNATURE:'signature',RESOURCE:'resource',CUSTOM:'custom'};export const INPUT_COMPONENT_TYPES=[COMPONENT_TYPES.TEXTFIELD,COMPONENT_TYPES.EMAIL,COMPONENT_TYPES.PASSWORD,COMPONENT_TYPES.NUMBER,COMPONENT_TYPES.TEXTAREA,COMPONENT_TYPES.URL,COMPONENT_TYPES.PHONE_NUMBER,COMPONENT_TYPES.SELECT,COMPONENT_TYPES.CHECKBOX,COMPONENT_TYPES.RADIO,COMPONENT_TYPES.SELECTBOXES,COMPONENT_TYPES.DATE,COMPONENT_TYPES.DATETIME,COMPONENT_TYPES.TIME,COMPONENT_TYPES.DAY,COMPONENT_TYPES.FILE,COMPONENT_TYPES.DATAGRID,COMPONENT_TYPES.EDITGRID];export const CONTAINER_COMPONENT_TYPES=[COMPONENT_TYPES.PANEL,COMPONENT_TYPES.CONTAINER,COMPONENT_TYPES.COLUMNS,COMPONENT_TYPES.FIELDSET,COMPONENT_TYPES.WELL,COMPONENT_TYPES.TABS,COMPONENT_TYPES.TABLE];export const DISPLAY_COMPONENT_TYPES=[COMPONENT_TYPES.BUTTON,COMPONENT_TYPES.HTML,COMPONENT_TYPES.LABEL,COMPONENT_TYPES.HIDDEN,COMPONENT_TYPES.CONTENT];
2
+ //# sourceMappingURL=componentTypes.js.map
@@ -0,0 +1,2 @@
1
+ import{DEFAULT_COLORS}from'./colors';import{FONT_SIZES,FONT_WEIGHTS}from'./typography';export{DEFAULT_COLORS}from'./colors';export const SPACING={xs:4,sm:8,md:12,lg:16,xl:24,xxl:32};export{FONT_SIZES,FONT_WEIGHTS,LINE_HEIGHTS}from'./typography';export{COMPONENT_TYPES,INPUT_COMPONENT_TYPES,CONTAINER_COMPONENT_TYPES,DISPLAY_COMPONENT_TYPES}from'./componentTypes';export{VALIDATION_MESSAGES}from'./validationMessages';export const COLORS={primary:DEFAULT_COLORS.PRIMARY,secondary:DEFAULT_COLORS.SECONDARY,error:DEFAULT_COLORS.ERROR,success:DEFAULT_COLORS.SUCCESS,warning:DEFAULT_COLORS.WARNING,info:DEFAULT_COLORS.INFO,background:DEFAULT_COLORS.BACKGROUND,surface:DEFAULT_COLORS.SURFACE,text:DEFAULT_COLORS.TEXT,textSecondary:DEFAULT_COLORS.TEXT_SECONDARY,border:DEFAULT_COLORS.BORDER,borderFocus:DEFAULT_COLORS.BORDER_FOCUS,disabled:DEFAULT_COLORS.DISABLED,placeholder:DEFAULT_COLORS.PLACEHOLDER,warningLight:'#FFF3CD',primaryLight:'#E3F2FD'};export const TYPOGRAPHY={fontSize:{xs:FONT_SIZES.XS,sm:FONT_SIZES.SM,md:FONT_SIZES.MD,lg:FONT_SIZES.LG,xl:FONT_SIZES.XL,xxl:FONT_SIZES.XXL},fontWeight:{light:FONT_WEIGHTS.LIGHT,normal:FONT_WEIGHTS.NORMAL,medium:FONT_WEIGHTS.MEDIUM,semibold:FONT_WEIGHTS.SEMI_BOLD,bold:FONT_WEIGHTS.BOLD}};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export const SPACING={XS:4,SM:8,MD:12,LG:16,XL:24,XXL:32};
2
+ //# sourceMappingURL=spacing.js.map
@@ -0,0 +1,2 @@
1
+ export const FONT_SIZES={XS:12,SM:14,MD:16,LG:18,XL:20,XXL:24};export const FONT_WEIGHTS={LIGHT:'300',NORMAL:'400',MEDIUM:'500',SEMI_BOLD:'600',BOLD:'700'};export const LINE_HEIGHTS={TIGHT:1.2,NORMAL:1.5,RELAXED:1.8};
2
+ //# sourceMappingURL=typography.js.map
@@ -0,0 +1,2 @@
1
+ export const VALIDATION_MESSAGES={REQUIRED:'This field is required',MIN_LENGTH:'Minimum length is {min}',MAX_LENGTH:'Maximum length is {max}',PATTERN:'Invalid format',MIN_VALUE:'Minimum value is {min}',MAX_VALUE:'Maximum value is {max}',INVALID_EMAIL:'Invalid email address',INVALID_URL:'Invalid URL',INVALID_PHONE:'Invalid phone number',INVALID_DATE:'Invalid date',FILE_TYPE_INVALID:'Invalid file type',FILE_SIZE_TOO_LARGE:'File is too large',CUSTOM_ERROR:'This field is invalid'};
2
+ //# sourceMappingURL=validationMessages.js.map
@@ -0,0 +1,2 @@
1
+ import React,{createContext,useContext,useState,useCallback}from'react';import{I18nProvider}from'../i18n/I18nContext';import{createRegistryWithComponents}from'../registry';import{DEFAULT_RENDERERS}from'../components/renderers';const FormioContext=createContext(undefined);export const useFormioContext=()=>{const context=useContext(FormioContext);return context;};export const useRegistry=()=>{const context=useContext(FormioContext);return context==null?void 0:context.registry;};const defaultTheme={colors:{primary:'#007AFF',secondary:'#5856D6',error:'#FF3B30',success:'#34C759',warning:'#FF9500',info:'#5AC8FA',background:'#FFFFFF',surface:'#F2F2F7',text:'#000000',textSecondary:'#8E8E93',border:'#C7C7CC',borderFocus:'#007AFF',disabled:'#F2F2F7',placeholder:'#C7C7CC'},spacing:{xs:4,sm:8,md:16,lg:24,xl:32},typography:{fontSize:{xs:12,sm:14,md:16,lg:18,xl:20},fontWeight:{light:'300',normal:'400',medium:'500',bold:'600'},lineHeight:{tight:1.2,normal:1.4,relaxed:1.6}},borderRadius:{none:0,sm:4,md:8,lg:12,full:9999},components:{input:{borderRadius:8,borderWidth:1,padding:12,fontSize:16,minHeight:44},label:{fontSize:16,fontWeight:'500',marginBottom:8},error:{fontSize:14,marginTop:4},button:{borderRadius:8,padding:12,fontSize:16,fontWeight:'600',minHeight:44},container:{padding:16,marginBottom:16}}};const getNestedValue=(obj,path,fallback)=>{var _path$split$reduce;return(_path$split$reduce=path.split('.').reduce((current,key)=>current==null?void 0:current[key],obj))!=null?_path$split$reduce:fallback;};const mergeTheme=(base,override)=>{var _base$typography,_override$typography,_base$typography2,_override$typography2,_base$typography3,_override$typography3,_base$components,_override$components,_base$components2,_override$components2,_base$components3,_override$components3,_base$components4,_override$components4,_base$components5,_override$components5;if(!override)return base;return{colors:{...base.colors,...override.colors},spacing:{...base.spacing,...override.spacing},typography:{...base.typography,...override.typography,fontSize:{...((_base$typography=base.typography)==null?void 0:_base$typography.fontSize),...((_override$typography=override.typography)==null?void 0:_override$typography.fontSize)},fontWeight:{...((_base$typography2=base.typography)==null?void 0:_base$typography2.fontWeight),...((_override$typography2=override.typography)==null?void 0:_override$typography2.fontWeight)},lineHeight:{...((_base$typography3=base.typography)==null?void 0:_base$typography3.lineHeight),...((_override$typography3=override.typography)==null?void 0:_override$typography3.lineHeight)}},borderRadius:{...base.borderRadius,...override.borderRadius},shadows:{...base.shadows,...override.shadows},components:{...base.components,...override.components,input:{...((_base$components=base.components)==null?void 0:_base$components.input),...((_override$components=override.components)==null?void 0:_override$components.input)},label:{...((_base$components2=base.components)==null?void 0:_base$components2.label),...((_override$components2=override.components)==null?void 0:_override$components2.label)},error:{...((_base$components3=base.components)==null?void 0:_base$components3.error),...((_override$components3=override.components)==null?void 0:_override$components3.error)},button:{...((_base$components4=base.components)==null?void 0:_base$components4.button),...((_override$components4=override.components)==null?void 0:_override$components4.button)},container:{...((_base$components5=base.components)==null?void 0:_base$components5.container),...((_override$components5=override.components)==null?void 0:_override$components5.container)}}};};export const FormioProvider=({children,components:initialComponents,theme:userTheme,i18n})=>{const[componentOverrides,setComponentOverrides]=useState(initialComponents||{});const theme=mergeTheme(defaultTheme,userTheme);const registry=React.useMemo(()=>{const reg=createRegistryWithComponents(DEFAULT_RENDERERS);if(initialComponents){Object.entries(initialComponents).forEach(([t,override])=>{if(override&&typeof override==='function'){reg.register(t,props=>{return override(props.component,{value:props.value,onChange:props.onChange,error:props.error,disabled:props.disabled,readOnly:props.readOnly,formData:props.formData,validationErrors:props.validationErrors});});}});}return reg;},[]);const registerComponent=useCallback((type,renderer)=>{setComponentOverrides(prev=>({...prev,[type]:renderer}));if(registry){registry.register(type,props=>{return renderer(props.component,{value:props.value,onChange:props.onChange,error:props.error,disabled:props.disabled,readOnly:props.readOnly,formData:props.formData,validationErrors:props.validationErrors});});}},[registry]);const getThemeValue=useCallback((path,fallback)=>getNestedValue(theme,path,fallback),[theme]);const value={componentOverrides,theme,registerComponent,getThemeValue,registry};return React.createElement(FormioContext.Provider,{value:value},React.createElement(I18nProvider,{config:i18n},children));};
2
+ //# sourceMappingURL=FormioContext.js.map
@@ -0,0 +1,2 @@
1
+ import React from'react';import{View,Text,TouchableOpacity,StyleSheet}from'react-native';import{DEFAULT_COLORS}from'../constants/colors';import{SPACING}from'../constants/spacing';import{FONT_SIZES}from'../constants/typography';export class ErrorBoundary extends React.Component{constructor(props){super(props);this.handleReset=()=>{this.setState({hasError:false,error:undefined});};this.state={hasError:false};}static getDerivedStateFromError(error){return{hasError:true,error};}componentDidCatch(error,errorInfo){const{onError}=this.props;if(onError){onError(error,errorInfo);}if(__DEV__){console.error('ErrorBoundary caught an error:',error,errorInfo);}}render(){const{hasError,error}=this.state;const{children,fallback}=this.props;if(!hasError){return children;}if(fallback){if(typeof fallback==='function'){return fallback(error,this.handleReset);}return fallback;}return React.createElement(DefaultErrorUI,{error:error,onReset:this.handleReset});}}const DefaultErrorUI=({error,onReset})=>React.createElement(View,{style:styles.container},React.createElement(View,{style:styles.errorBox},React.createElement(Text,{style:styles.errorTitle},"\u26A0\uFE0F Something went wrong"),React.createElement(Text,{style:styles.errorMessage},(error==null?void 0:error.message)||'An unexpected error occurred'),__DEV__&&(error==null?void 0:error.stack)&&React.createElement(Text,{style:styles.errorStack},error.stack),React.createElement(TouchableOpacity,{style:styles.resetButton,onPress:onReset},React.createElement(Text,{style:styles.resetButtonText},"Try Again"))));const styles=StyleSheet.create({container:{flex:1,justifyContent:'center',alignItems:'center',padding:SPACING.LG,backgroundColor:DEFAULT_COLORS.BACKGROUND},errorBox:{backgroundColor:'#FFF3CD',borderColor:DEFAULT_COLORS.WARNING,borderWidth:1,borderRadius:8,padding:SPACING.LG,maxWidth:400},errorTitle:{fontSize:FONT_SIZES.LG,fontWeight:'600',color:'#856404',marginBottom:SPACING.MD},errorMessage:{fontSize:FONT_SIZES.MD,color:'#856404',marginBottom:SPACING.MD,lineHeight:1.5},errorStack:{fontSize:FONT_SIZES.XS,color:'#856404',fontFamily:'Courier New',marginBottom:SPACING.MD,maxHeight:200},resetButton:{backgroundColor:DEFAULT_COLORS.PRIMARY,paddingVertical:SPACING.SM,paddingHorizontal:SPACING.MD,borderRadius:6,alignItems:'center',marginTop:SPACING.MD},resetButtonText:{color:DEFAULT_COLORS.BACKGROUND,fontSize:FONT_SIZES.MD,fontWeight:'600'}});
2
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1,2 @@
1
+ export class FormioError extends Error{constructor(message){super(message);this.name='FormioError';Object.setPrototypeOf(this,FormioError.prototype);}}export class InvalidSchemaError extends FormioError{constructor(message,schema){super(message);this.schema=schema;this.name='InvalidSchemaError';Object.setPrototypeOf(this,InvalidSchemaError.prototype);}}export class MissingComponentError extends FormioError{constructor(componentType){super(`Component type "${componentType}" is not registered`);this.componentType=componentType;this.name='MissingComponentError';Object.setPrototypeOf(this,MissingComponentError.prototype);}}export class ComponentRenderError extends FormioError{constructor(message,componentKey,originalError){super(message);this.componentKey=componentKey;this.originalError=originalError;this.name='ComponentRenderError';Object.setPrototypeOf(this,ComponentRenderError.prototype);}}export class ValidationError extends FormioError{constructor(field,message,code){super(message);this.field=field;this.code=code;this.name='ValidationError';Object.setPrototypeOf(this,ValidationError.prototype);}}export class SubmissionError extends FormioError{constructor(message,errors){super(message);this.errors=errors;this.name='SubmissionError';Object.setPrototypeOf(this,SubmissionError.prototype);}}export function isFormioError(error){return error instanceof FormioError;}export function isValidationError(error){return error instanceof ValidationError;}
2
+ //# sourceMappingURL=FormioError.js.map
@@ -0,0 +1,2 @@
1
+ import{Logger}from'../utils/logger';import{FormioError,ValidationError}from'./FormioError';const logger=new Logger('errorUtils');export function handleError(error,context){const err=normalizeError(error);if(context){logger.error(`Error in ${context}:`,err);}else{logger.error('An error occurred:',err);}return err;}export function normalizeError(error){if(error instanceof Error){return error;}if(typeof error==='string'){return new Error(error);}if(error&&typeof error==='object'&&'message'in error){return new Error(String(error.message));}return new Error(String(error));}export function createValidationError(field,message,code){return new ValidationError(field,message,code);}export function isError(value){return value instanceof Error;}export function isFormioError(value){return value instanceof FormioError;}export function getErrorMessage(error){if(error instanceof Error){return error.message;}if(typeof error==='string'){return error;}return'An unknown error occurred';}
2
+ //# sourceMappingURL=errorUtils.js.map
@@ -0,0 +1,2 @@
1
+ export{FormioError,InvalidSchemaError,MissingComponentError,ComponentRenderError,SubmissionError,isFormioError,isValidationError}from'./FormioError';export{ErrorBoundary}from'./ErrorBoundary';export{handleError,normalizeError,createValidationError,isError,isFormioError as isFormioErrorUtil,getErrorMessage}from'./errorUtils';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ import{useFormioContext}from'../context/FormioContext';import{StyleSheet}from'react-native';export const useTheme=()=>{const context=useFormioContext();if(!context){throw new Error('useTheme must be used within FormioProvider');}const{theme,getThemeValue}=context;const createStyles=styleFactory=>{return StyleSheet.create(styleFactory(theme));};const getColor=(colorKey,fallback)=>{return getThemeValue(`colors.${colorKey}`,fallback);};const getSpacing=(spacingKey,fallback)=>{return getThemeValue(`spacing.${spacingKey}`,fallback);};const getTypography=(typographyPath,fallback)=>{return getThemeValue(`typography.${typographyPath}`,fallback);};const getComponent=(componentPath,fallback)=>{return getThemeValue(`components.${componentPath}`,fallback);};return{theme,getThemeValue,createStyles,getColor,getSpacing,getTypography,getComponent};};
2
+ //# sourceMappingURL=useTheme.js.map
@@ -0,0 +1,2 @@
1
+ import React,{createContext,useContext,useState}from'react';import DEFAULT_TRANSLATIONS from'./translations/en';const I18nContext=createContext(undefined);const DEFAULT_RTL_LANGUAGES=['ar','he','fa','ur'];export const I18nProvider=({children,config})=>{const[language,setLanguage]=useState((config==null?void 0:config.language)||'en');const translations=(config==null?void 0:config.translations)||DEFAULT_TRANSLATIONS;const rtlLanguages=(config==null?void 0:config.rtlLanguages)||DEFAULT_RTL_LANGUAGES;const isRTL=rtlLanguages.includes(language);const translate=(key,fallback)=>{const langMap=translations[language];if(!langMap)return fallback||key;return langMap[key]||fallback||key;};const value={language,isRTL,translate,setLanguage};return React.createElement(I18nContext.Provider,{value:value},children);};export const useI18n=()=>{const context=useContext(I18nContext);if(!context){return{language:'en',isRTL:false,translate:(key,fallback)=>fallback||key,setLanguage:()=>{}};}return context;};
2
+ //# sourceMappingURL=I18nContext.js.map
@@ -0,0 +1,2 @@
1
+ export const AR_TRANSLATIONS={'validation.REQUIRED':'هذا الحقل مطلوب','validation.MIN_LENGTH':'الحد الأدنى للطول هو {min}','validation.MAX_LENGTH':'الحد الأقصى للطول هو {max}','validation.PATTERN':'صيغة غير صحيحة','validation.MIN_VALUE':'القيمة الدنيا هي {min}','validation.MAX_VALUE':'القيمة العليا هي {max}','validation.INVALID_EMAIL':'عنوان بريد إلكتروني غير صحيح','validation.INVALID_URL':'عنوان URL غير صحيح','validation.INVALID_PHONE':'رقم هاتف غير صحيح','validation.INVALID_DATE':'تاريخ غير صحيح','validation.FILE_TYPE_INVALID':'نوع ملف غير صحيح','validation.FILE_SIZE_TOO_LARGE':'الملف كبير جداً','validation.CUSTOM_ERROR':'هذا الحقل غير صحيح','Submit':'إرسال','Previous':'السابق','Next':'التالي','Finish':'إنهاء','Loading...':'جاري التحميل...','Search...':'بحث...','No options available':'لا توجد خيارات متاحة','Select...':'اختر...','No wizard pages found':'لم يتم العثور على صفحات معالج','First Name':'الاسم الأول','Last Name':'اسم العائلة','Email':'البريد الإلكتروني','Phone':'الهاتف','Address':'العنوان','City':'المدينة','State':'الولاية','Zip Code':'الرمز البريدي','Country':'الدولة','Message':'الرسالة','Comments':'التعليقات','Agree':'أوافق','Yes':'نعم','No':'لا','OK':'حسناً','Cancel':'إلغاء','Delete':'حذف','Edit':'تعديل','Add':'إضافة','Remove':'إزالة','Save':'حفظ','Close':'إغلاق','Done':'تم'};export default AR_TRANSLATIONS;
2
+ //# sourceMappingURL=index.js.map