treege 3.0.0-beta.26 → 3.0.0-beta.27

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 (54) hide show
  1. package/README.md +188 -24
  2. package/dist/ThemeContext-Cc71SvqK.js +410 -0
  3. package/dist/{TreegeEditor-WqTXkYl3.js → TreegeEditor-PuRxHufZ.js} +198 -197
  4. package/dist/TreegeRenderer-COBf5Nh3.js +1047 -0
  5. package/dist/editor.js +2 -2
  6. package/dist/main.js +54 -52
  7. package/dist/node-gfy3ym4p.js +340 -0
  8. package/dist/renderer/features/TreegeRenderer/native/TreegeRenderer.d.ts +20 -11
  9. package/dist/renderer/features/TreegeRenderer/native/components/DefaultFormWrapper.d.ts +7 -7
  10. package/dist/renderer/features/TreegeRenderer/native/components/DefaultGroup.d.ts +7 -7
  11. package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputs.d.ts +26 -15
  12. package/dist/renderer/features/TreegeRenderer/native/components/DefaultSubmitButton.d.ts +9 -7
  13. package/dist/renderer/features/TreegeRenderer/native/components/DefaultSubmitButtonWrapper.d.ts +11 -0
  14. package/dist/renderer/features/TreegeRenderer/native/components/DefaultUI.d.ts +8 -7
  15. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultAddressInput.d.ts +3 -0
  16. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultAutocompleteInput.d.ts +3 -0
  17. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultCheckboxInput.d.ts +3 -0
  18. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultDateInput.d.ts +3 -0
  19. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultDateRangeInput.d.ts +3 -0
  20. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultFileInput.d.ts +3 -0
  21. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultHiddenInput.d.ts +3 -0
  22. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultHttpInput.d.ts +3 -0
  23. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultNumberInput.d.ts +3 -0
  24. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultPasswordInput.d.ts +3 -0
  25. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultRadioInput.d.ts +3 -0
  26. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultSelectInput.d.ts +3 -0
  27. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultSwitchInput.d.ts +3 -0
  28. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTextInput.d.ts +3 -0
  29. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTextareaInput.d.ts +3 -0
  30. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTimeInput.d.ts +3 -0
  31. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTimeRangeInput.d.ts +3 -0
  32. package/dist/renderer/features/TreegeRenderer/useTreegeRenderer.d.ts +81 -23
  33. package/dist/renderer/features/TreegeRenderer/web/TreegeRenderer.d.ts +1 -1
  34. package/dist/renderer/hooks/useRenderNode.d.ts +55 -0
  35. package/dist/renderer/index.d.ts +1 -0
  36. package/dist/renderer/index.native.d.ts +19 -0
  37. package/dist/renderer/types/renderer.d.ts +20 -4
  38. package/dist/renderer/utils/sanitize.native.d.ts +69 -0
  39. package/dist/renderer/utils/submit.d.ts +1 -1
  40. package/dist/renderer-native.d.ts +2 -0
  41. package/dist/renderer-native.js +2979 -0
  42. package/dist/renderer.js +49 -47
  43. package/dist/shared/locales/ar.json.d.ts +13 -5
  44. package/dist/shared/locales/de.json.d.ts +13 -5
  45. package/dist/shared/locales/en.json.d.ts +13 -5
  46. package/dist/shared/locales/es.json.d.ts +13 -5
  47. package/dist/shared/locales/fr.json.d.ts +13 -5
  48. package/dist/shared/locales/it.json.d.ts +13 -5
  49. package/dist/shared/locales/pt.json.d.ts +13 -5
  50. package/dist/shared/types/node.d.ts +2 -2
  51. package/dist/useRenderNode-B9cpomOv.js +863 -0
  52. package/package.json +24 -1
  53. package/dist/ThemeContext-BIT4DHqC.js +0 -764
  54. package/dist/TreegeRenderer-BSR_ez96.js +0 -1812
@@ -1,15 +1,26 @@
1
- /**
2
- * Default Input Components for React Native
3
- *
4
- * TODO: Implement React Native versions of all input renderers
5
- * This should mirror the web version but use React Native components:
6
- * - TextInput instead of <input>
7
- * - Picker instead of <select>
8
- * - Switch instead of <input type="checkbox">
9
- * - etc.
10
- *
11
- * Should export:
12
- * - defaultInputRenderers object with all input types
13
- * - Individual input components (DefaultTextInput, DefaultNumberInput, etc.)
14
- */
15
- export {};
1
+ import { default as DefaultAddressInput } from './inputs/DefaultAddressInput';
2
+ import { default as DefaultAutocompleteInput } from './inputs/DefaultAutocompleteInput';
3
+ import { default as DefaultCheckboxInput } from './inputs/DefaultCheckboxInput';
4
+ import { default as DefaultDateInput } from './inputs/DefaultDateInput';
5
+ import { default as DefaultDateRangeInput } from './inputs/DefaultDateRangeInput';
6
+ import { default as DefaultFileInput } from './inputs/DefaultFileInput';
7
+ import { default as DefaultHiddenInput } from './inputs/DefaultHiddenInput';
8
+ import { default as DefaultHttpInput } from './inputs/DefaultHttpInput';
9
+ import { default as DefaultNumberInput } from './inputs/DefaultNumberInput';
10
+ import { default as DefaultPasswordInput } from './inputs/DefaultPasswordInput';
11
+ import { default as DefaultRadioInput } from './inputs/DefaultRadioInput';
12
+ import { default as DefaultSelectInput } from './inputs/DefaultSelectInput';
13
+ import { default as DefaultSwitchInput } from './inputs/DefaultSwitchInput';
14
+ import { default as DefaultTextareaInput } from './inputs/DefaultTextareaInput';
15
+ import { default as DefaultTextInput } from './inputs/DefaultTextInput';
16
+ import { default as DefaultTimeInput } from './inputs/DefaultTimeInput';
17
+ import { default as DefaultTimeRangeInput } from './inputs/DefaultTimeRangeInput';
18
+ import { InputRenderers, InputRenderProps } from '../../../../types/renderer';
19
+ export { DefaultTextInput, DefaultNumberInput, DefaultPasswordInput, DefaultTextareaInput };
20
+ export { DefaultCheckboxInput, DefaultSwitchInput, DefaultRadioInput, DefaultSelectInput };
21
+ export { DefaultHiddenInput };
22
+ export { DefaultAddressInput, DefaultAutocompleteInput, DefaultHttpInput };
23
+ export { DefaultDateInput, DefaultDateRangeInput, DefaultTimeInput, DefaultTimeRangeInput };
24
+ export { DefaultFileInput };
25
+ export declare const DefaultSubmitInput: ({ node }: InputRenderProps<"submit">) => import("react/jsx-runtime").JSX.Element;
26
+ export declare const defaultInputRenderers: InputRenderers;
@@ -1,7 +1,9 @@
1
- /**
2
- * Default Submit Button for React Native
3
- *
4
- * TODO: Implement React Native version of SubmitButton
5
- * Should use Pressable or TouchableOpacity component
6
- */
7
- export {};
1
+ import { ReactNode } from 'react';
2
+ export interface DefaultSubmitButtonProps {
3
+ children?: ReactNode;
4
+ disabled?: boolean;
5
+ isSubmitting?: boolean;
6
+ onPress?: () => void;
7
+ }
8
+ declare const DefaultSubmitButton: ({ children, disabled, isSubmitting, onPress }: DefaultSubmitButtonProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default DefaultSubmitButton;
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from 'react';
2
+ export interface SubmitButtonWrapperProps {
3
+ children: ReactNode;
4
+ missingFields?: string[];
5
+ }
6
+ /**
7
+ * Default submit button wrapper for React Native
8
+ * Simple wrapper that renders children (no tooltip like web version)
9
+ */
10
+ declare const DefaultSubmitButtonWrapper: ({ children }: SubmitButtonWrapperProps) => ReactNode;
11
+ export default DefaultSubmitButtonWrapper;
@@ -1,7 +1,8 @@
1
- /**
2
- * Default UI Components for React Native
3
- *
4
- * TODO: Implement React Native versions of UI components (Title, Description, Divider, etc.)
5
- * Should use Text, View and other React Native components
6
- */
7
- export {};
1
+ import { UiRenderProps } from '../../../../types/renderer';
2
+ declare const DefaultTitleUI: ({ node }: UiRenderProps) => import("react/jsx-runtime").JSX.Element;
3
+ declare const DefaultDividerUI: () => import("react/jsx-runtime").JSX.Element;
4
+ export { DefaultTitleUI, DefaultDividerUI };
5
+ export declare const defaultUI: {
6
+ divider: () => import("react/jsx-runtime").JSX.Element;
7
+ title: ({ node }: UiRenderProps) => import("react/jsx-runtime").JSX.Element;
8
+ };
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultAddressInput: ({ node, value, setValue, error, label, placeholder, helperText, id: _id, name: _name, }: InputRenderProps<"address">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultAddressInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultAutocompleteInput: ({ node, value, setValue, error, label, placeholder, helperText }: InputRenderProps<"autocomplete">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultAutocompleteInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultCheckboxInput: ({ node, value, setValue, error, label, helperText }: InputRenderProps<"checkbox">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultCheckboxInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultDateInput: ({ node, value, setValue, error, label, placeholder, helperText }: InputRenderProps<"date">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultDateInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultDateRangeInput: ({ node, value, setValue, error, label, helperText }: InputRenderProps<"daterange">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultDateRangeInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultFileInput: ({ node, value, setValue, error, label, helperText }: InputRenderProps<"file">) => import("react/jsx-runtime").JSX.Element | null;
3
+ export default DefaultFileInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultHiddenInput: (_props: InputRenderProps<"hidden">) => null;
3
+ export default DefaultHiddenInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultHttpInput: ({ node, value, setValue, error, label, placeholder, helperText, id: _id, name: _name, }: InputRenderProps<"http">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultHttpInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultNumberInput: ({ node, value, setValue, error, label, placeholder, helperText, name }: InputRenderProps<"number">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultNumberInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultPasswordInput: ({ node, value, setValue, error, label, placeholder, helperText, name }: InputRenderProps<"password">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultPasswordInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultRadioInput: ({ node, value, setValue, error, label, helperText }: InputRenderProps<"radio">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultRadioInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultSelectInput: ({ node, value, setValue, error, label, placeholder, helperText }: InputRenderProps<"select">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultSelectInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultSwitchInput: ({ node, value, setValue, error, label, helperText }: InputRenderProps<"switch">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultSwitchInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultTextInput: ({ node, value, setValue, error, label, placeholder, helperText, name }: InputRenderProps<"text">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultTextInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultTextareaInput: ({ node, value, setValue, error, label, placeholder, helperText, name }: InputRenderProps<"textarea">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultTextareaInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultTimeInput: ({ node, value, setValue, error, label, placeholder, helperText }: InputRenderProps<"time">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultTimeInput;
@@ -0,0 +1,3 @@
1
+ import { InputRenderProps } from '../../../../../types/renderer';
2
+ declare const DefaultTimeRangeInput: ({ node, value, setValue, error, label, helperText }: InputRenderProps<"timerange">) => import("react/jsx-runtime").JSX.Element;
3
+ export default DefaultTimeRangeInput;
@@ -1,44 +1,97 @@
1
1
  import { Node } from '@xyflow/react';
2
- import { FormValues } from '../../types/renderer';
3
- import { Flow, TreegeNodeData } from '../../../shared/types/node';
2
+ import { FormValues, TreegeRendererProps } from '../../types/renderer';
3
+ import { TreegeNodeData } from '../../../shared/types/node';
4
4
  /**
5
- * PURE STATE LOGIC HOOK
5
+ * Main TreegeRenderer hook
6
6
  *
7
- * This hook manages the internal form state and visibility logic.
8
- * It contains NO side effects (no useEffect).
9
- * All state is keyed by nodeId for uniqueness.
7
+ * Manages all form state, configuration, validation, and submission logic.
8
+ * Can be used directly in custom components for headless mode.
10
9
  *
11
10
  * Responsibilities:
11
+ * - Config merging (props + global provider)
12
12
  * - Form values state (keyed by nodeId)
13
13
  * - Errors state
14
14
  * - Node visibility calculation (progressive rendering)
15
- * - Form validation (built-in: required, pattern)
16
- * - Submit button state (combines end-of-path detection + form validity)
15
+ * - Form validation (built-in: required, pattern + custom validation)
16
+ * - Submit handling (with HTTP integration support)
17
+ * - Side effects (onChange callbacks, validation modes, reference field sync)
17
18
  *
18
- * NOT responsible for:
19
- * - Export/conversion to external format (done in component)
20
- * - Side effects like onChange callbacks (done in component)
21
- * - Custom validation (passed to component)
19
+ * @param props - Configuration props (flows, initialValues, callbacks, etc.)
20
+ * @returns Complete form state and control methods
22
21
  */
23
- /**
24
- * Custom hook for TreegeRenderer - Pure state logic only
25
- *
26
- * @param flows - Flow or array of flows (can be null/undefined)
27
- * @param initialValues - Initial form values (will be merged with node defaults)
28
- * @param language - Preferred language for translations (defaults to 'en')
29
- * @returns Pure state and computed values (no side effects)
30
- */
31
- export declare const useTreegeRenderer: (flows: Flow | Flow[] | null | undefined, initialValues?: FormValues, language?: string) => {
22
+ export declare const useTreegeRenderer: ({ components, flows, googleApiKey, initialValues, language, onChange, onSubmit, theme, validate, validationMode, }: Pick<TreegeRendererProps, "components" | "flows" | "googleApiKey" | "initialValues" | "language" | "onChange" | "onSubmit" | "theme" | "validate" | "validationMode">) => {
32
23
  canSubmit: boolean;
24
+ clearSubmitMessage: () => void;
25
+ config: {
26
+ components: {
27
+ form: ((props: {
28
+ children: import('react').ReactNode;
29
+ onSubmit: (e: import('react').FormEvent) => void;
30
+ }) => import('react').ReactNode) | undefined;
31
+ group: ((props: import('../../types/renderer').NodeRenderProps & {
32
+ children?: import('react').ReactNode;
33
+ }) => import('react').ReactNode) | undefined;
34
+ inputs: {
35
+ number?: ((props: import('../../types/renderer').InputRenderProps<"number">) => import('react').ReactNode) | undefined;
36
+ address?: ((props: import('../../types/renderer').InputRenderProps<"address">) => import('react').ReactNode) | undefined;
37
+ autocomplete?: ((props: import('../../types/renderer').InputRenderProps<"autocomplete">) => import('react').ReactNode) | undefined;
38
+ checkbox?: ((props: import('../../types/renderer').InputRenderProps<"checkbox">) => import('react').ReactNode) | undefined;
39
+ date?: ((props: import('../../types/renderer').InputRenderProps<"date">) => import('react').ReactNode) | undefined;
40
+ daterange?: ((props: import('../../types/renderer').InputRenderProps<"daterange">) => import('react').ReactNode) | undefined;
41
+ file?: ((props: import('../../types/renderer').InputRenderProps<"file">) => import('react').ReactNode) | undefined;
42
+ hidden?: ((props: import('../../types/renderer').InputRenderProps<"hidden">) => import('react').ReactNode) | undefined;
43
+ http?: ((props: import('../../types/renderer').InputRenderProps<"http">) => import('react').ReactNode) | undefined;
44
+ password?: ((props: import('../../types/renderer').InputRenderProps<"password">) => import('react').ReactNode) | undefined;
45
+ radio?: ((props: import('../../types/renderer').InputRenderProps<"radio">) => import('react').ReactNode) | undefined;
46
+ select?: ((props: import('../../types/renderer').InputRenderProps<"select">) => import('react').ReactNode) | undefined;
47
+ submit?: ((props: import('../../types/renderer').InputRenderProps<"submit">) => import('react').ReactNode) | undefined;
48
+ switch?: ((props: import('../../types/renderer').InputRenderProps<"switch">) => import('react').ReactNode) | undefined;
49
+ text?: ((props: import('../../types/renderer').InputRenderProps<"text">) => import('react').ReactNode) | undefined;
50
+ textarea?: ((props: import('../../types/renderer').InputRenderProps<"textarea">) => import('react').ReactNode) | undefined;
51
+ time?: ((props: import('../../types/renderer').InputRenderProps<"time">) => import('react').ReactNode) | undefined;
52
+ timerange?: ((props: import('../../types/renderer').InputRenderProps<"timerange">) => import('react').ReactNode) | undefined;
53
+ };
54
+ submitButton: ((props: {
55
+ label?: string;
56
+ disabled?: boolean;
57
+ [key: string]: unknown;
58
+ } | {
59
+ children?: import('react').ReactNode;
60
+ disabled?: boolean;
61
+ isSubmitting?: boolean;
62
+ onPress?: () => void;
63
+ [key: string]: unknown;
64
+ }) => import('react').ReactNode) | undefined;
65
+ submitButtonWrapper: ((props: {
66
+ children: import('react').ReactNode;
67
+ missingFields?: string[];
68
+ }) => import('react').ReactNode) | undefined;
69
+ ui: {
70
+ divider?: ((props: import('../../types/renderer').NodeRenderProps) => import('react').ReactNode) | undefined;
71
+ title?: ((props: import('../../types/renderer').NodeRenderProps) => import('react').ReactNode) | undefined;
72
+ };
73
+ };
74
+ googleApiKey: string | undefined;
75
+ language: string;
76
+ theme: "dark" | "light";
77
+ validationMode: "onChange" | "onSubmit";
78
+ };
79
+ firstErrorFieldId: string | undefined;
33
80
  formErrors: Record<string, string>;
34
81
  formValues: FormValues;
82
+ handleSubmit: () => Promise<boolean>;
35
83
  inputNodes: Node<import('../../../shared/types/node').InputNodeData>[];
36
- mergedFlow: Flow;
84
+ isSubmitting: boolean;
85
+ mergedFlow: import('../../../shared/types/node').Flow;
37
86
  missingRequiredFields: string[];
38
87
  prevFormValuesRef: import('react').RefObject<FormValues>;
88
+ setFieldErrors: import('react').Dispatch<import('react').SetStateAction<Record<string, string>>>;
39
89
  setFieldValue: (fieldName: string, value: unknown) => void;
40
- setFormErrors: import('react').Dispatch<import('react').SetStateAction<Record<string, string>>>;
41
90
  setMultipleFieldValues: (updates: FormValues) => void;
91
+ submitMessage: {
92
+ type: "success" | "error";
93
+ message: string;
94
+ } | null;
42
95
  t: (key?: import('../../../main').Translatable | string) => string;
43
96
  validateForm: (customValidate?: (values: FormValues, visibleNodesList: Node<TreegeNodeData>[]) => Record<string, string>) => {
44
97
  errors: {
@@ -50,3 +103,8 @@ export declare const useTreegeRenderer: (flows: Flow | Flow[] | null | undefined
50
103
  visibleNodes: Node<TreegeNodeData>[];
51
104
  visibleRootNodes: Node<TreegeNodeData>[];
52
105
  };
106
+ /**
107
+ * Type for the return value of useTreegeRenderer
108
+ * Useful for TypeScript users building custom components
109
+ */
110
+ export type UseTreegeRendererReturn = ReturnType<typeof useTreegeRenderer>;
@@ -1,3 +1,3 @@
1
1
  import { TreegeRendererProps } from '../../../types/renderer';
2
- declare const TreegeRenderer: ({ components, flows, googleApiKey, language, onChange, onSubmit, theme, validate, validationMode, initialValues, }: TreegeRendererProps) => import("react/jsx-runtime").JSX.Element;
2
+ declare const TreegeRenderer: ({ components, className, flows, googleApiKey, language, onChange, onSubmit, theme, validate, validationMode, initialValues, }: TreegeRendererProps) => import("react/jsx-runtime").JSX.Element;
3
3
  export default TreegeRenderer;
@@ -0,0 +1,55 @@
1
+ import { Node } from '@xyflow/react';
2
+ import { ComponentType, ReactNode } from 'react';
3
+ import { FormValues, InputRenderers, TreegeRendererComponents } from '../types/renderer';
4
+ import { TreegeNodeData } from '../../shared/types/node';
5
+ type AnyComponent = ComponentType<any>;
6
+ type UseRenderNodeParams = {
7
+ config: {
8
+ components: TreegeRendererComponents;
9
+ language: string;
10
+ };
11
+ DefaultFormWrapper: AnyComponent;
12
+ DefaultGroup: AnyComponent;
13
+ DefaultSubmitButton: AnyComponent;
14
+ DefaultSubmitButtonWrapper?: AnyComponent;
15
+ defaultInputRenderers: InputRenderers;
16
+ defaultUI: Record<string, AnyComponent>;
17
+ formErrors: Record<string, string>;
18
+ formValues: FormValues;
19
+ missingRequiredFields: string[];
20
+ setFieldValue: (fieldId: string, value: unknown) => void;
21
+ visibleNodes: Node<TreegeNodeData>[];
22
+ };
23
+ /**
24
+ * Hook that returns rendering utilities for TreegeRenderer
25
+ * Shared between web and native TreegeRenderer
26
+ *
27
+ * Returns:
28
+ * - renderNode: Function to render individual nodes
29
+ * - FormWrapper: Form wrapper component with fallback
30
+ * - SubmitButton: Submit button component with fallback
31
+ * - SubmitButtonWrapper: Submit button wrapper component with fallback (web only, undefined for native)
32
+ */
33
+ export declare const useRenderNode: ({ DefaultFormWrapper, DefaultGroup, DefaultSubmitButton, DefaultSubmitButtonWrapper, config, defaultInputRenderers, defaultUI, formErrors, formValues, missingRequiredFields, setFieldValue, visibleNodes, }: UseRenderNodeParams) => {
34
+ FormWrapper: ((props: {
35
+ children: ReactNode;
36
+ onSubmit: (e: import('react').FormEvent) => void;
37
+ }) => ReactNode) | AnyComponent;
38
+ renderNode: (node: Node<TreegeNodeData>) => ReactNode;
39
+ SubmitButton: ((props: {
40
+ label?: string;
41
+ disabled?: boolean;
42
+ [key: string]: unknown;
43
+ } | {
44
+ children?: ReactNode;
45
+ disabled?: boolean;
46
+ isSubmitting?: boolean;
47
+ onPress?: () => void;
48
+ [key: string]: unknown;
49
+ }) => ReactNode) | AnyComponent;
50
+ SubmitButtonWrapper: ((props: {
51
+ children: ReactNode;
52
+ missingFields?: string[];
53
+ }) => ReactNode) | AnyComponent;
54
+ };
55
+ export {};
@@ -1,4 +1,5 @@
1
1
  export { TreegeConfigProvider, useTreegeConfig } from './context/TreegeConfigContext';
2
+ export type { UseTreegeRendererReturn } from './features/TreegeRenderer/useTreegeRenderer';
2
3
  export { useTreegeRenderer } from './features/TreegeRenderer/useTreegeRenderer';
3
4
  export * from './features/TreegeRenderer/web/components/DefaultFormWrapper';
4
5
  export * from './features/TreegeRenderer/web/components/DefaultGroup';
@@ -0,0 +1,19 @@
1
+ export { TreegeConfigProvider, useTreegeConfig } from './context/TreegeConfigContext';
2
+ export * from './features/TreegeRenderer/native/components/DefaultFormWrapper';
3
+ export * from './features/TreegeRenderer/native/components/DefaultGroup';
4
+ export * from './features/TreegeRenderer/native/components/DefaultInputs';
5
+ export * from './features/TreegeRenderer/native/components/DefaultSubmitButton';
6
+ export * from './features/TreegeRenderer/native/components/DefaultSubmitButtonWrapper';
7
+ export * from './features/TreegeRenderer/native/components/DefaultUI';
8
+ export type { TreegeRendererNativeProps } from './features/TreegeRenderer/native/TreegeRenderer';
9
+ export { default as TreegeRenderer } from './features/TreegeRenderer/native/TreegeRenderer';
10
+ export type { UseTreegeRendererReturn } from './features/TreegeRenderer/useTreegeRenderer';
11
+ export { useTreegeRenderer } from './features/TreegeRenderer/useTreegeRenderer';
12
+ export type { TreegeRendererConfig } from './types/renderer';
13
+ export * from './types/renderer';
14
+ export * from './utils/conditions';
15
+ export * from './utils/file';
16
+ export * from './utils/flow';
17
+ export * from './utils/form';
18
+ export * from './utils/sanitize.native';
19
+ export { getTranslatedText } from '../shared/utils/translations';
@@ -120,7 +120,9 @@ export type TreegeRendererComponents = {
120
120
  /**
121
121
  * Custom group container renderer
122
122
  */
123
- group?: (props: NodeRenderProps) => ReactNode;
123
+ group?: (props: NodeRenderProps & {
124
+ children?: ReactNode;
125
+ }) => ReactNode;
124
126
  /**
125
127
  * Custom form wrapper
126
128
  */
@@ -129,10 +131,20 @@ export type TreegeRendererComponents = {
129
131
  onSubmit: (e: FormEvent) => void;
130
132
  }) => ReactNode;
131
133
  /**
132
- * Custom submit button (pure button without wrapper)
134
+ * Custom submit button (supports both web and native variants)
135
+ * Web variant: { label?: string; disabled?: boolean; ...otherHTMLAttributes }
136
+ * Native variant: { children?: ReactNode; disabled?: boolean; isSubmitting?: boolean; onPress?: () => void }
133
137
  */
134
138
  submitButton?: (props: {
135
139
  label?: string;
140
+ disabled?: boolean;
141
+ [key: string]: unknown;
142
+ } | {
143
+ children?: ReactNode;
144
+ disabled?: boolean;
145
+ isSubmitting?: boolean;
146
+ onPress?: () => void;
147
+ [key: string]: unknown;
136
148
  }) => ReactNode;
137
149
  /**
138
150
  * Custom submit button wrapper (e.g., for tooltip with missing fields)
@@ -175,7 +187,11 @@ export type TreegeRendererConfig = {
175
187
  /**
176
188
  * Props for the TreegeRenderer component
177
189
  */
178
- export type TreegeRendererProps = {
190
+ export interface TreegeRendererProps {
191
+ /**
192
+ * Additional class name for the renderer container
193
+ */
194
+ className?: string;
179
195
  /**
180
196
  * Custom component renderers
181
197
  */
@@ -222,4 +238,4 @@ export type TreegeRendererProps = {
222
238
  * Validation mode
223
239
  */
224
240
  validationMode?: "onChange" | "onSubmit";
225
- };
241
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * React Native implementation of sanitization utilities
3
+ * Does not use DOMPurify as it depends on browser DOM
4
+ */
5
+ /**
6
+ * Configuration for sanitization
7
+ */
8
+ interface SanitizeOptions {
9
+ /**
10
+ * Allow only plain text (strip all HTML tags)
11
+ * @default true
12
+ */
13
+ plainTextOnly?: boolean;
14
+ /**
15
+ * Custom allowed tags (when plainTextOnly is false)
16
+ * Note: In React Native, HTML tags are always stripped
17
+ */
18
+ allowedTags?: string[];
19
+ /**
20
+ * Custom allowed attributes (when plainTextOnly is false)
21
+ * Note: In React Native, attributes are not applicable
22
+ */
23
+ allowedAttributes?: string[];
24
+ }
25
+ /**
26
+ * Sanitizes user input to prevent XSS attacks
27
+ *
28
+ * React Native implementation that strips all HTML tags and decodes entities.
29
+ * Since React Native doesn't render HTML, we focus on cleaning text content.
30
+ *
31
+ * @param input - The string to sanitize
32
+ * @param options - Sanitization options (maintained for API compatibility)
33
+ * @returns Sanitized string safe for rendering
34
+ *
35
+ * @example
36
+ * sanitize('<script>alert("xss")</script>Hello')
37
+ * // => 'Hello'
38
+ *
39
+ * @example
40
+ * sanitize('<b>Bold text</b><script>alert("xss")</script>')
41
+ * // => 'Bold text'
42
+ */
43
+ export declare const sanitize: (input: string | undefined | null, _options?: SanitizeOptions) => string;
44
+ /**
45
+ * Sanitizes data from HTTP responses
46
+ *
47
+ * This function recursively sanitizes all string values in an object or array.
48
+ * Useful for cleaning data received from external APIs before displaying it.
49
+ *
50
+ * Protection against:
51
+ * - Circular references: Uses WeakSet to detect and handle circular objects
52
+ * - Deep nesting attacks: Limits recursion depth to prevent DoS
53
+ * - XSS attacks: Sanitizes all string values
54
+ *
55
+ * @param data - The data to sanitize (can be any type)
56
+ * @param options - Sanitization options
57
+ * @param depth - Current recursion depth (internal use)
58
+ * @param seen - WeakSet to track visited objects (internal use)
59
+ * @returns Sanitized data with same structure
60
+ *
61
+ * @example
62
+ * sanitizeHttpResponse({
63
+ * name: 'John <script>xss</script>',
64
+ * nested: { title: 'Hello <b>world</b>' }
65
+ * })
66
+ * // => { name: 'John ', nested: { title: 'Hello world' } }
67
+ */
68
+ export declare const sanitizeHttpResponse: (data: unknown, options?: SanitizeOptions, depth?: number, seen?: WeakSet<object>) => unknown;
69
+ export {};
@@ -33,7 +33,7 @@ export interface SubmitResult {
33
33
  *
34
34
  * @param config - Submit configuration from the submit button node
35
35
  * @param formValues - Current form values
36
- * @param inputNodes - All input nodes (required when sendFormData is true)
36
+ * @param inputNodes - All input nodes (required when sendAllFormValues is true)
37
37
  * @returns Promise with submission result
38
38
  */
39
39
  export declare const submitFormData: (config: SubmitConfig, formValues: FormValues, inputNodes: Node<InputNodeData>[]) => Promise<SubmitResult>;
@@ -0,0 +1,2 @@
1
+ export * from './renderer/index.native'
2
+ export {}