extended-dynamic-forms 0.3.9 → 0.3.11

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.
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- html,body{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,*:before,*:after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}body{margin:0}[tabindex="-1"]:focus{outline:none}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[title],abbr[data-original-title]{-webkit-text-decoration:underline dotted;text-decoration:underline;text-decoration:underline dotted;border-bottom:0;cursor:help}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=text],input[type=password],input[type=number],textarea{-webkit-appearance:none}ol,ul,dl{margin-top:0;margin-bottom:1em}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}pre,code,kbd,samp{font-size:1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}a,area,button,[role=button],input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;text-align:left;caption-side:bottom}input,button,select,optgroup,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{display:block;width:100%;max-width:100%;margin-bottom:.5em;padding:0;color:inherit;font-size:1.5em;line-height:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}.rjsf-form{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.vertical-form-item .ant-form-item-label{padding-bottom:0!important;margin-bottom:0}.vertical-form-item .ant-form-item-label>label{margin-bottom:0}.ant-form-item-has-error .ant-form-item-label>label{color:#ff4d4f}.ant-form-item-required:before{display:inline-block;margin-right:4px;color:#ff4d4f;font-size:14px;font-family:SimSun,sans-serif;line-height:1;content:"*"}.edf-choice-widget{position:relative;width:100%}.edf-choice-widget--small{font-size:12px}.edf-choice-widget--middle{font-size:14px}.edf-choice-widget--large{font-size:16px}.edf-choice-widget--disabled{opacity:.6;cursor:not-allowed}.edf-choice-widget--readonly{pointer-events:none}.edf-choice-widget__loading{display:flex;align-items:center;gap:8px;padding:8px;color:#666}.edf-choice-widget__loading-spinner{display:inline-block;width:16px;height:16px;border:2px solid #f3f3f3;border-top:2px solid #1890ff;border-radius:50%;animation:edf-spin 1s linear infinite}.edf-choice-widget__loading-message{font-size:14px}.edf-choice-widget__loading-progress{width:100%;height:4px;background-color:#f0f0f0;border-radius:2px;overflow:hidden;margin-top:4px}.edf-choice-widget__loading-progress-bar{height:100%;background-color:#1890ff;transition:width .3s ease}.edf-choice-widget__error{display:flex;align-items:center;gap:8px;padding:8px;color:#ff4d4f;background-color:#fff2f0;border:1px solid #ffccc7;border-radius:4px;margin-top:4px}.edf-choice-widget__error-icon{font-size:16px;flex-shrink:0}.edf-choice-widget__error-message{font-size:14px;flex:1}.edf-choice-widget__error-hint{font-size:12px;color:#8c8c8c;font-style:italic}.edf-choice-widget__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px;color:#8c8c8c;text-align:center}.edf-choice-widget__empty-icon{font-size:32px;margin-bottom:8px;opacity:.5}.edf-choice-widget__empty-message{font-size:14px}@keyframes edf-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.edf-choice-widget--dropdown .edf-choice-widget__wrapper{position:relative}.edf-choice-widget--dropdown .edf-choice-widget__loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#ffffffe6;display:flex;align-items:center;justify-content:center;z-index:10;border-radius:4px}.edf-choice-widget--dropdown .edf-choice-widget__option-icon{margin-right:4px;display:inline-flex;align-items:center}.edf-choice-widget--dropdown .edf-choice-widget__option-label{flex:1}.edf-choice-widget--dropdown .edf-choice-widget__option-description{display:block;font-size:12px;color:#8c8c8c;margin-top:2px;white-space:normal}.edf-choice-widget--dropdown.has-error .ant-select-selector{border-color:#ff4d4f!important}.edf-choice-widget--dropdown.has-error .ant-select-focused .ant-select-selector{border-color:#ff7875!important;box-shadow:0 0 0 2px #ff4d4f33}.edf-choice-widget--radio .edf-choice-widget__wrapper{position:relative}.edf-choice-widget--radio .edf-choice-widget__radio-content{display:flex;flex-direction:column;gap:2px}.edf-choice-widget--radio .edf-choice-widget__radio-main{display:flex;align-items:center;gap:4px}.edf-choice-widget--radio .edf-choice-widget__option-icon{display:inline-flex;align-items:center;font-size:16px}.edf-choice-widget--radio .edf-choice-widget__option-label{font-weight:500}.edf-choice-widget--radio .edf-choice-widget__option-description{margin-left:24px;font-size:12px;color:#8c8c8c;line-height:1.5}.edf-choice-widget--radio .edf-choice-widget__radio-group-label{font-weight:600;color:#595959;margin-bottom:8px;margin-top:16px;padding-bottom:4px;border-bottom:1px solid #f0f0f0}.edf-choice-widget--radio .edf-choice-widget__radio-group-label:first-child{margin-top:0}.edf-choice-widget--radio .edf-choice-widget__radio-divider{height:1px;background-color:#f0f0f0;margin:12px 0}.edf-choice-widget--radio.has-error .ant-radio-group{border:1px solid #ff4d4f;border-radius:4px;padding:8px}.edf-choice-widget--radio .ant-radio-wrapper{margin-bottom:8px;display:flex;align-items:flex-start}.edf-choice-widget--radio .ant-radio-wrapper:last-child{margin-bottom:0}.edf-choice-widget--radio .ant-radio-wrapper-disabled{cursor:not-allowed;opacity:.6}.edf-choice-widget--radio .ant-space-horizontal .ant-radio-wrapper{margin-bottom:0;margin-right:16px}.edf-choice-widget--radio .ant-space-horizontal .ant-radio-wrapper:last-child{margin-right:0}
1
+ html,body{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,*:before,*:after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}body{margin:0}[tabindex="-1"]:focus{outline:none}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[title],abbr[data-original-title]{-webkit-text-decoration:underline dotted;text-decoration:underline;text-decoration:underline dotted;border-bottom:0;cursor:help}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=text],input[type=password],input[type=number],textarea{-webkit-appearance:none}ol,ul,dl{margin-top:0;margin-bottom:1em}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}pre,code,kbd,samp{font-size:1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}a,area,button,[role=button],input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;text-align:left;caption-side:bottom}input,button,select,optgroup,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{display:block;width:100%;max-width:100%;margin-bottom:.5em;padding:0;color:inherit;font-size:1.5em;line-height:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}.rjsf-form{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.vertical-form-item .ant-form-item-label{padding-bottom:0!important;margin-bottom:0}.vertical-form-item .ant-form-item-label>label{margin-bottom:0}.vertical-form-item .edf-field-description,.vertical-form-item .edf-field-help{color:#8c8c8c;font-size:13px;line-height:1.5}.vertical-form-item .edf-field-description{margin-bottom:8px}.vertical-form-item .edf-field-help{margin-top:4px}.vertical-form-item.ant-form-item-has-error .edf-field-help{color:#8c8c8c}.vertical-form-item .edf-field-help-container{display:flex;flex-direction:column;gap:4px}.vertical-form-item .edf-field-error{margin-top:4px;color:#ff4d4f;font-size:13px;line-height:1.5}.vertical-form-item .ant-form-item-explain{transition:none!important}.ant-form-item-has-error .ant-form-item-label>label{color:#ff4d4f}.ant-form-item-required:before{display:inline-block;margin-right:4px;color:#ff4d4f;font-size:14px;font-family:SimSun,sans-serif;line-height:1;content:"*"}.edf-choice-widget{position:relative;width:100%}.edf-choice-widget--small{font-size:12px}.edf-choice-widget--middle{font-size:14px}.edf-choice-widget--large{font-size:16px}.edf-choice-widget--disabled{opacity:.6;cursor:not-allowed}.edf-choice-widget--readonly{pointer-events:none}.edf-choice-widget__loading{display:flex;align-items:center;gap:8px;padding:8px;color:#666}.edf-choice-widget__loading-spinner{display:inline-block;width:16px;height:16px;border:2px solid #f3f3f3;border-top:2px solid #1890ff;border-radius:50%;animation:edf-spin 1s linear infinite}.edf-choice-widget__loading-message{font-size:14px}.edf-choice-widget__loading-progress{width:100%;height:4px;background-color:#f0f0f0;border-radius:2px;overflow:hidden;margin-top:4px}.edf-choice-widget__loading-progress-bar{height:100%;background-color:#1890ff;transition:width .3s ease}.edf-choice-widget__error{display:flex;align-items:center;gap:8px;padding:8px;color:#ff4d4f;background-color:#fff2f0;border:1px solid #ffccc7;border-radius:4px;margin-top:4px}.edf-choice-widget__error-icon{font-size:16px;flex-shrink:0}.edf-choice-widget__error-message{font-size:14px;flex:1}.edf-choice-widget__error-hint{font-size:12px;color:#8c8c8c;font-style:italic}.edf-choice-widget__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px;color:#8c8c8c;text-align:center}.edf-choice-widget__empty-icon{font-size:32px;margin-bottom:8px;opacity:.5}.edf-choice-widget__empty-message{font-size:14px}@keyframes edf-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.edf-choice-widget--dropdown .edf-choice-widget__wrapper{position:relative}.edf-choice-widget--dropdown .edf-choice-widget__loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#ffffffe6;display:flex;align-items:center;justify-content:center;z-index:10;border-radius:4px}.edf-choice-widget--dropdown .edf-choice-widget__option-icon{margin-right:4px;display:inline-flex;align-items:center}.edf-choice-widget--dropdown .edf-choice-widget__option-label{flex:1}.edf-choice-widget--dropdown .edf-choice-widget__option-description{display:block;font-size:12px;color:#8c8c8c;margin-top:2px;white-space:normal}.edf-choice-widget--dropdown.has-error .ant-select-selector{border-color:#ff4d4f!important}.edf-choice-widget--dropdown.has-error .ant-select-focused .ant-select-selector{border-color:#ff7875!important;box-shadow:0 0 0 2px #ff4d4f33}.edf-choice-widget--radio .edf-choice-widget__wrapper{position:relative}.edf-choice-widget--radio .edf-choice-widget__radio-content{display:flex;flex-direction:column;gap:2px}.edf-choice-widget--radio .edf-choice-widget__radio-main{display:flex;align-items:center;gap:4px}.edf-choice-widget--radio .edf-choice-widget__option-icon{display:inline-flex;align-items:center;font-size:16px}.edf-choice-widget--radio .edf-choice-widget__option-label{font-weight:500}.edf-choice-widget--radio .edf-choice-widget__option-description{margin-left:24px;font-size:12px;color:#8c8c8c;line-height:1.5}.edf-choice-widget--radio .edf-choice-widget__radio-group-label{font-weight:600;color:#595959;margin-bottom:8px;margin-top:16px;padding-bottom:4px;border-bottom:1px solid #f0f0f0}.edf-choice-widget--radio .edf-choice-widget__radio-group-label:first-child{margin-top:0}.edf-choice-widget--radio .edf-choice-widget__radio-divider{height:1px;background-color:#f0f0f0;margin:12px 0}.edf-choice-widget--radio.has-error .ant-radio-group{border:1px solid #ff4d4f;border-radius:4px;padding:8px}.edf-choice-widget--radio .ant-radio-wrapper{margin-bottom:8px;display:flex;align-items:flex-start}.edf-choice-widget--radio .ant-radio-wrapper:last-child{margin-bottom:0}.edf-choice-widget--radio .ant-radio-wrapper-disabled{cursor:not-allowed;opacity:.6}.edf-choice-widget--radio .ant-space-horizontal .ant-radio-wrapper{margin-bottom:0;margin-right:16px}.edf-choice-widget--radio .ant-space-horizontal .ant-radio-wrapper:last-child{margin-right:0}
@@ -39,6 +39,7 @@ export interface ExtendedFormProps extends Omit<FormProps, 'validator'>, FormEve
39
39
  onWebhookStart?: (webhook: WebhookConfig, event: any) => void;
40
40
  onWebhookComplete?: (webhook: WebhookConfig, event: any, response: any) => void;
41
41
  onWebhookError?: (webhook: WebhookConfig, event: any, error: Error) => void;
42
+ enableDynamicBinding?: boolean;
42
43
  }
43
44
  export interface CustomWidgetProps {
44
45
  label?: string;
@@ -2,4 +2,5 @@ export { formDataUtils } from './formDataUtils';
2
2
  export { schemaUtils } from './schemaUtils';
3
3
  export { validationUtils } from './validationUtils';
4
4
  export * from './pathHelpers';
5
+ export * from './templateEngine';
5
6
  export declare function deepEquals(obj1: any, obj2: any): boolean;
@@ -0,0 +1,24 @@
1
+ export interface TemplateError {
2
+ path: string;
3
+ template: string;
4
+ error: string;
5
+ availableBindings: string[];
6
+ }
7
+ export interface ApplyTemplateBindingsOptions {
8
+ escape?: boolean;
9
+ isDev?: boolean;
10
+ }
11
+ export interface ApplyTemplateBindingsResult<T> {
12
+ result: T;
13
+ errors: TemplateError[];
14
+ }
15
+ interface TemplateStats {
16
+ cacheHits: number;
17
+ compiled: number;
18
+ }
19
+ declare global {
20
+ var __EDF_TEMPLATE_STATS__: TemplateStats | undefined;
21
+ }
22
+ export declare function applyTemplateBindings<T>(value: T, bindings: Record<string, unknown>, options?: ApplyTemplateBindingsOptions): ApplyTemplateBindingsResult<T>;
23
+ export declare function clearTemplateCache(): void;
24
+ export {};
@@ -1,5 +1,11 @@
1
+ import { CSSProperties, ReactNode } from 'react';
1
2
  import { WidgetProps } from '@rjsf/utils';
3
+ import { TitleProps } from 'antd/es/typography/Title';
4
+ import { TextProps } from 'antd/es/typography/Text';
5
+ import { ParagraphProps } from 'antd/es/typography/Paragraph';
6
+ import { DividerProps } from 'antd/es/divider';
2
7
 
8
+ type MarkdownToJSXOptions = import('markdown-to-jsx').MarkdownToJSX.Options;
3
9
  /**
4
10
  * Base interface for all enhanced widgets
5
11
  */
@@ -13,8 +19,8 @@ export interface AntInputOptions {
13
19
  placeholder?: string;
14
20
  autoFocus?: boolean;
15
21
  autoComplete?: string;
16
- prefix?: React.ReactNode;
17
- suffix?: React.ReactNode;
22
+ prefix?: ReactNode;
23
+ suffix?: ReactNode;
18
24
  prefixIconName?: string;
19
25
  suffixIconName?: string;
20
26
  allowClear?: boolean;
@@ -27,13 +33,13 @@ export interface AntInputOptions {
27
33
  value: string;
28
34
  count: number;
29
35
  maxLength?: number;
30
- }) => React.ReactNode;
36
+ }) => ReactNode;
31
37
  };
32
38
  status?: 'error' | 'warning';
33
- style?: React.CSSProperties;
39
+ style?: CSSProperties;
34
40
  className?: string;
35
- addonBefore?: React.ReactNode;
36
- addonAfter?: React.ReactNode;
41
+ addonBefore?: ReactNode;
42
+ addonAfter?: ReactNode;
37
43
  addonBeforeIconName?: string;
38
44
  addonAfterIconName?: string;
39
45
  emptyValue?: any;
@@ -52,7 +58,7 @@ export interface AntTextAreaOptions extends AntInputOptions {
52
58
  value: string;
53
59
  count: number;
54
60
  maxLength?: number;
55
- }) => React.ReactNode;
61
+ }) => ReactNode;
56
62
  };
57
63
  }
58
64
  /**
@@ -74,9 +80,9 @@ export interface AntDatePickerOptions {
74
80
  size?: 'large' | 'middle' | 'small';
75
81
  bordered?: boolean;
76
82
  variant?: 'outlined' | 'borderless' | 'filled';
77
- suffixIcon?: React.ReactNode;
83
+ suffixIcon?: ReactNode;
78
84
  suffixIconName?: string;
79
- style?: React.CSSProperties;
85
+ style?: CSSProperties;
80
86
  className?: string;
81
87
  status?: 'error' | 'warning';
82
88
  emptyValue?: any;
@@ -88,7 +94,7 @@ export interface AntDatePickerOptions {
88
94
  export interface AntInputNumberOptions {
89
95
  size?: 'large' | 'middle' | 'small';
90
96
  placeholder?: string;
91
- prefix?: React.ReactNode;
97
+ prefix?: ReactNode;
92
98
  prefixIconName?: string;
93
99
  addonBeforeIconName?: string;
94
100
  addonAfterIconName?: string;
@@ -104,16 +110,16 @@ export interface AntInputNumberOptions {
104
110
  parser?: (value: string | undefined) => number;
105
111
  keyboard?: boolean;
106
112
  controls?: boolean | {
107
- upIcon?: React.ReactNode;
108
- downIcon?: React.ReactNode;
113
+ upIcon?: ReactNode;
114
+ downIcon?: ReactNode;
109
115
  };
110
116
  bordered?: boolean;
111
117
  variant?: 'outlined' | 'borderless' | 'filled';
112
- style?: React.CSSProperties;
118
+ style?: CSSProperties;
113
119
  className?: string;
114
120
  status?: 'error' | 'warning';
115
- addonBefore?: React.ReactNode;
116
- addonAfter?: React.ReactNode;
121
+ addonBefore?: ReactNode;
122
+ addonAfter?: ReactNode;
117
123
  emptyValue?: any;
118
124
  }
119
125
  /**
@@ -127,15 +133,15 @@ export interface AntSliderOptions {
127
133
  draggableTrack?: boolean;
128
134
  };
129
135
  dots?: boolean;
130
- marks?: Record<number, React.ReactNode> | boolean;
136
+ marks?: Record<number, ReactNode> | boolean;
131
137
  included?: boolean;
132
138
  vertical?: boolean;
133
139
  reverse?: boolean;
134
140
  tooltip?: any;
135
- trackStyle?: React.CSSProperties | React.CSSProperties[];
136
- handleStyle?: React.CSSProperties | React.CSSProperties[];
137
- railStyle?: React.CSSProperties;
138
- style?: React.CSSProperties;
141
+ trackStyle?: CSSProperties | CSSProperties[];
142
+ handleStyle?: CSSProperties | CSSProperties[];
143
+ railStyle?: CSSProperties;
144
+ style?: CSSProperties;
139
145
  className?: string;
140
146
  keyboard?: boolean;
141
147
  disabled?: boolean;
@@ -147,13 +153,13 @@ export interface AntRateOptions {
147
153
  allowHalf?: boolean;
148
154
  allowClear?: boolean;
149
155
  autoFocus?: boolean;
150
- character?: React.ReactNode | ((props: {
156
+ character?: ReactNode | ((props: {
151
157
  index: number;
152
- }) => React.ReactNode);
158
+ }) => ReactNode);
153
159
  count?: number;
154
160
  tooltips?: string[];
155
161
  iconName?: string;
156
- style?: React.CSSProperties;
162
+ style?: CSSProperties;
157
163
  className?: string;
158
164
  }
159
165
  /**
@@ -172,7 +178,7 @@ export interface AntTimePickerOptions {
172
178
  variant?: 'outlined' | 'borderless' | 'filled';
173
179
  status?: 'error' | 'warning';
174
180
  suffixIconName?: string;
175
- style?: React.CSSProperties;
181
+ style?: CSSProperties;
176
182
  className?: string;
177
183
  [key: string]: any;
178
184
  }
@@ -184,11 +190,11 @@ export interface AntColorPickerOptions {
184
190
  onFormatChange?: (format: string) => void;
185
191
  disabledAlpha?: boolean;
186
192
  presets?: any[];
187
- showText?: boolean | ((color: any) => React.ReactNode);
193
+ showText?: boolean | ((color: any) => ReactNode);
188
194
  placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight';
189
195
  size?: 'large' | 'middle' | 'small';
190
196
  allowClear?: boolean;
191
- style?: React.CSSProperties;
197
+ style?: CSSProperties;
192
198
  className?: string;
193
199
  [key: string]: any;
194
200
  }
@@ -196,14 +202,14 @@ export interface AntColorPickerOptions {
196
202
  * Ant Design Switch component options
197
203
  */
198
204
  export interface AntSwitchOptions {
199
- checkedChildren?: React.ReactNode;
200
- unCheckedChildren?: React.ReactNode;
205
+ checkedChildren?: ReactNode;
206
+ unCheckedChildren?: ReactNode;
201
207
  checkedIconName?: string;
202
208
  unCheckedIconName?: string;
203
209
  size?: 'small' | 'default';
204
210
  loading?: boolean;
205
211
  autoFocus?: boolean;
206
- style?: React.CSSProperties;
212
+ style?: CSSProperties;
207
213
  className?: string;
208
214
  [key: string]: any;
209
215
  }
@@ -220,7 +226,7 @@ export interface AntImageOptions {
220
226
  visible?: boolean;
221
227
  onVisibleChange?: (visible: boolean) => void;
222
228
  };
223
- placeholder?: React.ReactNode;
229
+ placeholder?: ReactNode;
224
230
  crossOrigin?: '' | 'anonymous' | 'use-credentials';
225
231
  decoding?: 'async' | 'auto' | 'sync';
226
232
  loading?: 'eager' | 'lazy';
@@ -228,14 +234,14 @@ export interface AntImageOptions {
228
234
  sizes?: string;
229
235
  srcSet?: string;
230
236
  draggable?: boolean;
231
- previewMask?: React.ReactNode;
237
+ previewMask?: ReactNode;
232
238
  rootClassName?: string;
233
239
  wrapperClassName?: string;
234
- wrapperStyle?: React.CSSProperties;
240
+ wrapperStyle?: CSSProperties;
235
241
  onClick?: (e: any) => void;
236
242
  onLoad?: () => void;
237
243
  onError?: (e: any) => void;
238
- style?: React.CSSProperties;
244
+ style?: CSSProperties;
239
245
  className?: string;
240
246
  [key: string]: any;
241
247
  }
@@ -243,21 +249,83 @@ export interface AntImageOptions {
243
249
  * Ant Design Alert component options
244
250
  */
245
251
  export interface AntAlertOptions {
246
- message?: React.ReactNode;
247
- description?: React.ReactNode;
252
+ message?: ReactNode;
253
+ description?: ReactNode;
248
254
  type?: 'success' | 'info' | 'warning' | 'error';
249
255
  showIcon?: boolean;
250
256
  iconName?: string;
251
257
  banner?: boolean;
252
258
  closable?: boolean;
253
- closeText?: React.ReactNode;
254
- action?: React.ReactNode;
255
- icon?: React.ReactNode;
256
- style?: React.CSSProperties;
259
+ closeText?: ReactNode;
260
+ action?: ReactNode;
261
+ icon?: ReactNode;
262
+ style?: CSSProperties;
257
263
  className?: string;
258
264
  afterClose?: () => void;
259
265
  [key: string]: any;
260
266
  }
267
+ /**
268
+ * Typography-based heading/title options
269
+ */
270
+ export interface TitleWidgetOptions {
271
+ text?: string;
272
+ renderAs?: 'title' | 'text' | 'paragraph';
273
+ align?: 'left' | 'center' | 'right' | 'justify';
274
+ prefix?: ReactNode;
275
+ suffix?: ReactNode;
276
+ prefixIconName?: string;
277
+ suffixIconName?: string;
278
+ level?: TitleProps['level'];
279
+ type?: TextProps['type'];
280
+ mark?: TextProps['mark'];
281
+ code?: TextProps['code'];
282
+ keyboard?: TextProps['keyboard'];
283
+ underline?: TextProps['underline'];
284
+ delete?: TextProps['delete'];
285
+ strong?: TextProps['strong'];
286
+ italic?: TextProps['italic'];
287
+ disabled?: TextProps['disabled'];
288
+ copyable?: TextProps['copyable'];
289
+ editable?: TextProps['editable'];
290
+ ellipsis?: ParagraphProps['ellipsis'];
291
+ style?: CSSProperties;
292
+ className?: string;
293
+ }
294
+ /**
295
+ * Rich-content display options (HTML/Markdown)
296
+ */
297
+ export interface HtmlWidgetOptions {
298
+ content?: string;
299
+ format?: 'html' | 'markdown' | 'text';
300
+ sanitizeHtml?: boolean;
301
+ markdownOptions?: MarkdownToJSXOptions;
302
+ renderAs?: 'paragraph' | 'text';
303
+ align?: 'left' | 'center' | 'right' | 'justify';
304
+ preserveWhitespace?: boolean;
305
+ style?: CSSProperties;
306
+ className?: string;
307
+ }
308
+ /**
309
+ * Spacer widget visual configuration
310
+ */
311
+ export interface SpacerWidgetOptions {
312
+ size?: 'small' | 'middle' | 'large' | number;
313
+ direction?: 'vertical' | 'horizontal';
314
+ fullWidth?: boolean;
315
+ fullHeight?: boolean;
316
+ inline?: boolean;
317
+ className?: string;
318
+ style?: CSSProperties;
319
+ ariaLabel?: string;
320
+ }
321
+ /**
322
+ * Ant Design Divider options with icon support
323
+ */
324
+ export interface AntDividerOptions extends Partial<DividerProps> {
325
+ text?: ReactNode;
326
+ iconName?: string;
327
+ icon?: ReactNode;
328
+ }
261
329
  /**
262
330
  * Type mapping for widget options
263
331
  */
@@ -278,6 +346,12 @@ export type WidgetOptionsMap = {
278
346
  switch?: AntSwitchOptions;
279
347
  image?: AntImageOptions;
280
348
  alert?: AntAlertOptions;
349
+ title?: TitleWidgetOptions;
350
+ heading?: TitleWidgetOptions;
351
+ html?: HtmlWidgetOptions;
352
+ markdown?: HtmlWidgetOptions;
353
+ spacer?: SpacerWidgetOptions;
354
+ divider?: AntDividerOptions;
281
355
  file: any;
282
356
  };
283
357
  /**
@@ -297,3 +371,4 @@ export interface CommonWidgetProps {
297
371
  rawErrors?: string[];
298
372
  schema: any;
299
373
  }
374
+ export {};
@@ -1,7 +1,12 @@
1
+ import { default as React } from 'react';
1
2
  import { InputProps, TextAreaProps } from 'antd/es/input';
2
3
  import { DatePickerProps } from 'antd/es/date-picker';
3
4
  import { InputNumberProps } from 'antd/es/input-number';
4
- import { AntInputOptions, AntTextAreaOptions, AntDatePickerOptions, AntInputNumberOptions, AntSliderOptions, AntRateOptions, AntTimePickerOptions, AntColorPickerOptions, AntSwitchOptions, AntImageOptions, AntAlertOptions } from './types';
5
+ import { TitleProps } from 'antd/es/typography/Title';
6
+ import { TextProps } from 'antd/es/typography/Text';
7
+ import { ParagraphProps } from 'antd/es/typography/Paragraph';
8
+ import { DividerProps } from 'antd/es/divider';
9
+ import { AntInputOptions, AntTextAreaOptions, AntDatePickerOptions, AntInputNumberOptions, AntSliderOptions, AntRateOptions, AntTimePickerOptions, AntColorPickerOptions, AntSwitchOptions, AntImageOptions, AntAlertOptions, TitleWidgetOptions, HtmlWidgetOptions, SpacerWidgetOptions, AntDividerOptions } from './types';
5
10
  import { SliderSingleProps } from 'antd/es/slider';
6
11
  import { RateProps } from 'antd/es/rate';
7
12
  import { TimePickerProps } from 'antd/es/time-picker';
@@ -54,6 +59,44 @@ export declare const getAntImageProps: (options?: AntImageOptions) => Partial<Im
54
59
  * Extract Ant Design Alert props from uiSchema options
55
60
  */
56
61
  export declare const getAntAlertProps: (options?: AntAlertOptions) => Partial<AlertProps>;
62
+ /**
63
+ * Extract typography display props for Title widget
64
+ */
65
+ export declare const getTitleDisplayProps: (options?: TitleWidgetOptions) => {
66
+ text?: string;
67
+ renderAs: "title" | "text" | "paragraph";
68
+ align?: "left" | "center" | "right" | "justify";
69
+ prefixNode?: React.ReactNode;
70
+ suffixNode?: React.ReactNode;
71
+ typographyProps: Partial<TitleProps & TextProps & ParagraphProps>;
72
+ };
73
+ /**
74
+ * Extract rich content display props for HTML/Markdown widget
75
+ */
76
+ export declare const getHtmlDisplayProps: (options?: HtmlWidgetOptions) => {
77
+ content?: string;
78
+ format: "html" | "markdown" | "text";
79
+ sanitizeHtml: boolean;
80
+ renderAs: "paragraph" | "text";
81
+ align?: "left" | "center" | "right" | "justify";
82
+ preserveWhitespace?: boolean;
83
+ markdownOptions?: HtmlWidgetOptions["markdownOptions"];
84
+ className?: string;
85
+ style?: React.CSSProperties;
86
+ };
87
+ export declare const getSpacerProps: (options?: SpacerWidgetOptions) => {
88
+ className?: string;
89
+ ariaLabel?: string;
90
+ style: React.CSSProperties;
91
+ };
92
+ /**
93
+ * Extract Ant Design Divider props with optional icon mapping
94
+ */
95
+ export declare const getAntDividerProps: (options?: AntDividerOptions) => {
96
+ dividerProps: Partial<DividerProps>;
97
+ content?: React.ReactNode;
98
+ iconNode?: React.ReactNode;
99
+ };
57
100
  /**
58
101
  * Check if the widget has validation errors
59
102
  */
@@ -252,10 +252,40 @@ export interface WebSocketDataSourceConfig {
252
252
  /** Cache configuration (for offline support) */
253
253
  cache?: CacheConfig;
254
254
  }
255
+ export interface FormDataFilterConfig {
256
+ /** Path within the resolved data item to evaluate */
257
+ path: string;
258
+ /** Value that must equal the resolved field */
259
+ equals?: unknown;
260
+ /** Value that must differ from the resolved field */
261
+ notEquals?: unknown;
262
+ /** Value that must be included within the resolved field (array/string) */
263
+ includes?: unknown;
264
+ }
265
+ export interface FormDataSortConfig {
266
+ /** Path within the resolved data item to sort by */
267
+ path: string;
268
+ /** Sort order */
269
+ order?: 'asc' | 'desc';
270
+ /** Treat values as numeric for comparison */
271
+ numeric?: boolean;
272
+ }
273
+ export interface FormDataDataSourceConfig {
274
+ /** Type identifier for formData data source */
275
+ type: 'formData';
276
+ /** Path (dot/bracket syntax) to the array within binding data */
277
+ path: string;
278
+ /** Mapper configuration reused from API data sources */
279
+ mapper?: ResponseMapperConfig;
280
+ /** Optional filter configuration */
281
+ filter?: FormDataFilterConfig;
282
+ /** Optional sort configuration */
283
+ sort?: FormDataSortConfig;
284
+ }
255
285
  /**
256
286
  * Union type for all data source configurations
257
287
  */
258
- export type DataSourceConfig = StaticDataSourceConfig | ApiDataSourceConfig | WebSocketDataSourceConfig;
288
+ export type DataSourceConfig = StaticDataSourceConfig | ApiDataSourceConfig | WebSocketDataSourceConfig | FormDataDataSourceConfig;
259
289
  /**
260
290
  * Validation configuration for selected values
261
291
  */
@@ -498,6 +528,7 @@ export declare function isApiDataSource(dataSource: DataSourceConfig): dataSourc
498
528
  * Type guard to check if a data source is WebSocket-based
499
529
  */
500
530
  export declare function isWebSocketDataSource(dataSource: DataSourceConfig): dataSource is WebSocketDataSourceConfig;
531
+ export declare function isFormDataDataSource(dataSource: DataSourceConfig): dataSource is FormDataDataSourceConfig;
501
532
  /**
502
533
  * Type guard to check if widget supports multiple selections
503
534
  */
@@ -0,0 +1,9 @@
1
+ import { ChoiceOption, ErrorState, FormDataDataSourceConfig, LoadingState } from '../ChoiceWidget.types';
2
+ import { DataSourceMetrics } from '../providers/DataSourceProvider';
3
+
4
+ export declare const useFormDataSource: (config: FormDataDataSourceConfig | undefined, bindingData: unknown) => {
5
+ options: ChoiceOption[];
6
+ loading: LoadingState;
7
+ error: ErrorState;
8
+ metrics: DataSourceMetrics;
9
+ };
@@ -14,6 +14,9 @@ interface DebounceConfig {
14
14
  /** Whether to execute on trailing edge */
15
15
  trailing?: boolean;
16
16
  }
17
+ /**
18
+ * Response mapper utility for transforming API responses
19
+ */
17
20
  /**
18
21
  * API Data Source Provider
19
22
  *
@@ -0,0 +1,4 @@
1
+ import { ChoiceOption, ResponseMapperConfig } from '../ChoiceWidget.types';
2
+
3
+ export declare const getNestedValue: (obj: unknown, path: string) => unknown;
4
+ export declare const mapResponseData: (data: unknown, config: ResponseMapperConfig) => ChoiceOption[];
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { WidgetProps } from '@rjsf/utils';
3
+
4
+ declare const DividerWidget: FC<WidgetProps>;
5
+ export default DividerWidget;
6
+ export { DividerWidget };
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { WidgetProps } from '@rjsf/utils';
3
+
4
+ declare const HtmlWidget: FC<WidgetProps>;
5
+ export default HtmlWidget;
6
+ export { HtmlWidget };
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { WidgetProps } from '@rjsf/utils';
3
+
4
+ declare const SpacerWidget: FC<WidgetProps>;
5
+ export default SpacerWidget;
6
+ export { SpacerWidget };
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { WidgetProps } from '@rjsf/utils';
3
+
4
+ declare const TitleWidget: FC<WidgetProps>;
5
+ export default TitleWidget;
6
+ export { TitleWidget };
@@ -0,0 +1,4 @@
1
+ export { TitleWidget } from './TitleWidget';
2
+ export { HtmlWidget } from './HtmlWidget';
3
+ export { SpacerWidget } from './SpacerWidget';
4
+ export { DividerWidget } from './DividerWidget';
@@ -11,10 +11,12 @@ import { PasswordWidget } from './text/PasswordWidget';
11
11
  import { DateWidget, EnhancedDateWidget, DateTimeWidget } from './date';
12
12
  import { FileWidget } from './file/FileWidget';
13
13
  import { FileUploadWidget } from './file/FileUploadWidget';
14
+ import { TitleWidget, HtmlWidget, SpacerWidget, DividerWidget } from './display';
14
15
  import { ChoiceWidget } from './choice';
15
16
 
16
17
  export * from './choice';
17
18
  export * from './text';
19
+ export * from './display';
18
20
  export declare const customWidgets: {
19
21
  choice: import('react').FC<import('./choice').ChoiceWidgetProps>;
20
22
  color: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
@@ -45,6 +47,18 @@ export declare const customWidgets: {
45
47
  ImageWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
46
48
  alert: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
47
49
  AlertWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
50
+ title: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
51
+ heading: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
52
+ TitleWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
53
+ HeadingWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
54
+ html: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
55
+ HtmlWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
56
+ markdown: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
57
+ MarkdownWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
58
+ spacer: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
59
+ SpacerWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
60
+ divider: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
61
+ DividerWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
48
62
  date: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
49
63
  DateWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
50
64
  'datetime-local': import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
@@ -56,4 +70,4 @@ export declare const customWidgets: {
56
70
  fileUpload: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
57
71
  FileUploadWidget: import('react').FC<import('@rjsf/utils').WidgetProps<any, import('@rjsf/utils').RJSFSchema, any>>;
58
72
  };
59
- export { ChoiceWidget, ColorWidget, RangeWidget, RatingWidget, TextWidget, TextareaWidget, PasswordWidget, NumberWidget, TelephoneWidget, EmailWidget, URLWidget, DateWidget, EnhancedDateWidget, DateTimeWidget, FileWidget, FileUploadWidget, };
73
+ export { ChoiceWidget, ColorWidget, RangeWidget, RatingWidget, TextWidget, TextareaWidget, PasswordWidget, NumberWidget, TelephoneWidget, EmailWidget, URLWidget, DateWidget, EnhancedDateWidget, DateTimeWidget, FileWidget, FileUploadWidget, TitleWidget, HtmlWidget, SpacerWidget, DividerWidget, };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extended-dynamic-forms",
3
- "version": "0.3.9",
3
+ "version": "0.3.11",
4
4
  "description": "Extended React JSON Schema Form (RJSF) v6 with custom components, widgets, templates, layouts, and form events",
5
5
  "main": "dist/index.umd.js",
6
6
  "module": "dist/index.es.js",
@@ -65,25 +65,22 @@
65
65
  },
66
66
  "peerDependencies": {
67
67
  "antd": "^5.24.0",
68
+ "dayjs": "^1.11.13",
68
69
  "react": "^18.0.0 || ^19.0.0",
69
- "react-dom": "^18.0.0 || ^19.0.0",
70
- "dayjs": "^1.11.13"
70
+ "react-dom": "^18.0.0 || ^19.0.0"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@rjsf/antd": "6.0.0-beta.17",
74
74
  "@rjsf/core": "6.0.0-beta.17",
75
75
  "@rjsf/utils": "6.0.0-beta.17",
76
76
  "@rjsf/validator-ajv8": "6.0.0-beta.17",
77
- "@testing-library/dom": "^10.4.0",
78
- "@testing-library/jest-dom": "^6.6.3",
79
- "@testing-library/react": "^16.3.0",
80
- "@testing-library/user-event": "^14.6.1",
81
77
  "@types/node": "^24.0.1",
82
78
  "@types/react": "^18.2.43",
83
79
  "@types/react-dom": "^18.2.17",
84
80
  "@typescript-eslint/eslint-plugin": "^6.14.0",
85
81
  "@typescript-eslint/parser": "^6.14.0",
86
82
  "@vitejs/plugin-react": "^4.2.1",
83
+ "@vitest/coverage-v8": "^2.1.9",
87
84
  "antd": "^5.26.0",
88
85
  "clsx": "^2.1.1",
89
86
  "dotenv": "^16.3.1",
@@ -92,7 +89,6 @@
92
89
  "eslint-plugin-prettier": "^5.4.1",
93
90
  "eslint-plugin-react-hooks": "^4.6.0",
94
91
  "eslint-plugin-react-refresh": "^0.4.5",
95
- "jsdom": "^26.1.0",
96
92
  "plop": "^4.0.1",
97
93
  "prettier": "^3.5.3",
98
94
  "react": "^18.2.0",
@@ -101,14 +97,15 @@
101
97
  "typescript": "^5.2.2",
102
98
  "vite": "^5.0.8",
103
99
  "vite-plugin-dts": "^3.7.0",
104
- "vitest": "^1.0.0"
100
+ "vitest": "^2.1.9"
105
101
  },
106
102
  "dependencies": {
107
103
  "@types/json-logic-js": "^2.0.8",
108
104
  "date-fns": "^4.1.0",
109
- "lucide-react": "^0.452.0",
110
105
  "json-logic-js": "^2.0.5",
111
- "json-rules-engine-simplified": "^0.2.0"
106
+ "json-rules-engine-simplified": "^0.2.0",
107
+ "lucide-react": "^0.452.0",
108
+ "handlebars": "^4.7.8"
112
109
  },
113
110
  "type": "module"
114
111
  }