@syncfusion/ej2-react-form-renderer 0.1.1-beta → 34.2.2

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 (173) hide show
  1. package/README.md +86 -110
  2. package/diConfig.json +85 -0
  3. package/dist/ej2-react-form-renderer.min.js +10 -0
  4. package/dist/ej2-react-form-renderer.umd.min.js +11 -0
  5. package/dist/ej2-react-form-renderer.umd.min.js.map +1 -0
  6. package/dist/es6/ej2-react-form-renderer.es2015.js +37 -0
  7. package/dist/es6/ej2-react-form-renderer.es2015.js.map +1 -0
  8. package/form-renderer.d.ts +4 -0
  9. package/form-renderer.js +4 -0
  10. package/index.d.ts +2 -4
  11. package/index.js +2 -4
  12. package/license +6 -13
  13. package/package.json +19 -38
  14. package/src/form-renderer/formrenderer.component.d.ts +34 -0
  15. package/src/form-renderer/formrenderer.component.js +49 -0
  16. package/src/form-renderer/index.d.ts +1 -0
  17. package/src/form-renderer/index.js +1 -0
  18. package/src/global.js +1 -0
  19. package/src/index.d.ts +2 -6
  20. package/src/index.js +2 -6
  21. package/styles/bds-lite.css +1 -0
  22. package/styles/bds-lite.scss +1 -0
  23. package/styles/bds.css +1 -0
  24. package/styles/bds.scss +1 -0
  25. package/styles/bootstrap-dark-lite.css +1 -0
  26. package/styles/bootstrap-dark-lite.scss +1 -0
  27. package/styles/bootstrap-dark.css +1 -26
  28. package/styles/bootstrap-dark.scss +1 -0
  29. package/styles/bootstrap-lite.css +1 -0
  30. package/styles/bootstrap-lite.scss +1 -0
  31. package/styles/bootstrap.css +1 -26
  32. package/styles/bootstrap.scss +1 -0
  33. package/styles/bootstrap4-lite.css +1 -0
  34. package/styles/bootstrap4-lite.scss +1 -0
  35. package/styles/bootstrap4.css +1 -26
  36. package/styles/bootstrap4.scss +1 -0
  37. package/styles/bootstrap5-dark-lite.css +1 -0
  38. package/styles/bootstrap5-dark-lite.scss +1 -0
  39. package/styles/bootstrap5-dark.css +1 -26
  40. package/styles/bootstrap5-dark.scss +1 -0
  41. package/styles/bootstrap5-lite.css +1 -0
  42. package/styles/bootstrap5-lite.scss +1 -0
  43. package/styles/bootstrap5.3-lite.css +1 -0
  44. package/styles/bootstrap5.3-lite.scss +1 -0
  45. package/styles/bootstrap5.3.css +1 -26
  46. package/styles/bootstrap5.3.scss +1 -0
  47. package/styles/bootstrap5.css +1 -26
  48. package/styles/bootstrap5.scss +1 -0
  49. package/styles/fabric-dark-lite.css +1 -0
  50. package/styles/fabric-dark-lite.scss +1 -0
  51. package/styles/fabric-dark.css +1 -0
  52. package/styles/fabric-dark.scss +1 -0
  53. package/styles/fabric-lite.css +1 -0
  54. package/styles/fabric-lite.scss +1 -0
  55. package/styles/fabric.css +1 -0
  56. package/styles/fabric.scss +1 -0
  57. package/styles/fluent-dark-lite.css +1 -0
  58. package/styles/fluent-dark-lite.scss +1 -0
  59. package/styles/fluent-dark.css +1 -26
  60. package/styles/fluent-dark.scss +1 -0
  61. package/styles/fluent-lite.css +1 -0
  62. package/styles/fluent-lite.scss +1 -0
  63. package/styles/fluent.css +1 -26
  64. package/styles/fluent.scss +1 -0
  65. package/styles/fluent2-lite.css +1 -0
  66. package/styles/fluent2-lite.scss +1 -0
  67. package/styles/fluent2.css +1 -26
  68. package/styles/fluent2.scss +1 -0
  69. package/styles/form-renderer/bds.css +1 -0
  70. package/styles/form-renderer/bds.scss +1 -0
  71. package/styles/form-renderer/bootstrap-dark.css +1 -0
  72. package/styles/form-renderer/bootstrap-dark.scss +1 -0
  73. package/styles/form-renderer/bootstrap.css +1 -0
  74. package/styles/form-renderer/bootstrap.scss +1 -0
  75. package/styles/form-renderer/bootstrap4.css +1 -0
  76. package/styles/form-renderer/bootstrap4.scss +1 -0
  77. package/styles/form-renderer/bootstrap5-dark.css +1 -0
  78. package/styles/form-renderer/bootstrap5-dark.scss +1 -0
  79. package/styles/form-renderer/bootstrap5.3.css +1 -0
  80. package/styles/form-renderer/bootstrap5.3.scss +1 -0
  81. package/styles/form-renderer/bootstrap5.css +1 -0
  82. package/styles/form-renderer/bootstrap5.scss +1 -0
  83. package/styles/form-renderer/fabric-dark.css +1 -0
  84. package/styles/form-renderer/fabric-dark.scss +1 -0
  85. package/styles/form-renderer/fabric.css +1 -0
  86. package/styles/form-renderer/fabric.scss +1 -0
  87. package/styles/form-renderer/fluent-dark.css +1 -0
  88. package/styles/form-renderer/fluent-dark.scss +1 -0
  89. package/styles/form-renderer/fluent.css +1 -0
  90. package/styles/form-renderer/fluent.scss +1 -0
  91. package/styles/form-renderer/fluent2.css +1 -0
  92. package/styles/form-renderer/fluent2.scss +1 -0
  93. package/styles/form-renderer/highcontrast-light.css +1 -0
  94. package/styles/form-renderer/highcontrast-light.scss +1 -0
  95. package/styles/form-renderer/highcontrast.css +1 -0
  96. package/styles/form-renderer/highcontrast.scss +1 -0
  97. package/styles/form-renderer/material-dark.css +1 -0
  98. package/styles/form-renderer/material-dark.scss +1 -0
  99. package/styles/form-renderer/material.css +1 -0
  100. package/styles/form-renderer/material.scss +1 -0
  101. package/styles/form-renderer/material3-dark.css +1 -0
  102. package/styles/form-renderer/material3-dark.scss +1 -0
  103. package/styles/form-renderer/material3.css +1 -0
  104. package/styles/form-renderer/material3.scss +1 -0
  105. package/styles/form-renderer/tailwind-dark.css +1 -0
  106. package/styles/form-renderer/tailwind-dark.scss +1 -0
  107. package/styles/form-renderer/tailwind.css +1 -0
  108. package/styles/form-renderer/tailwind.scss +1 -0
  109. package/styles/form-renderer/tailwind3.css +1 -0
  110. package/styles/form-renderer/tailwind3.scss +1 -0
  111. package/styles/highcontrast-light-lite.css +1 -0
  112. package/styles/highcontrast-light-lite.scss +1 -0
  113. package/styles/highcontrast-light.css +1 -0
  114. package/styles/highcontrast-light.scss +1 -0
  115. package/styles/highcontrast-lite.css +1 -0
  116. package/styles/highcontrast-lite.scss +1 -0
  117. package/styles/highcontrast.css +1 -0
  118. package/styles/highcontrast.scss +1 -0
  119. package/styles/material-dark-lite.css +1 -0
  120. package/styles/material-dark-lite.scss +1 -0
  121. package/styles/material-dark.css +1 -26
  122. package/styles/material-dark.scss +1 -0
  123. package/styles/material-lite.css +1 -0
  124. package/styles/material-lite.scss +1 -0
  125. package/styles/material.css +1 -26
  126. package/styles/material.scss +1 -0
  127. package/styles/material3-dark-lite.css +1 -0
  128. package/styles/material3-dark-lite.scss +1 -0
  129. package/styles/material3-dark.css +1 -26
  130. package/styles/material3-dark.scss +1 -0
  131. package/styles/material3-lite.css +1 -0
  132. package/styles/material3-lite.scss +1 -0
  133. package/styles/material3.css +1 -26
  134. package/styles/material3.scss +1 -0
  135. package/styles/tailwind-dark-lite.css +1 -0
  136. package/styles/tailwind-dark-lite.scss +1 -0
  137. package/styles/tailwind-dark.css +1 -26
  138. package/styles/tailwind-dark.scss +1 -0
  139. package/styles/tailwind-lite.css +1 -0
  140. package/styles/tailwind-lite.scss +1 -0
  141. package/styles/tailwind.css +1 -26
  142. package/styles/tailwind.scss +1 -0
  143. package/styles/tailwind3-lite.css +1 -0
  144. package/styles/tailwind3-lite.scss +1 -0
  145. package/styles/tailwind3.css +1 -26
  146. package/styles/tailwind3.scss +1 -0
  147. package/src/CheckboxGroup.d.ts +0 -12
  148. package/src/CheckboxGroup.js +0 -48
  149. package/src/ConditionalRuleEngine.d.ts +0 -253
  150. package/src/ConditionalRuleEngine.js +0 -489
  151. package/src/CustomTabComponent.d.ts +0 -13
  152. package/src/CustomTabComponent.js +0 -35
  153. package/src/DataGridComponent.d.ts +0 -28
  154. package/src/DataGridComponent.js +0 -144
  155. package/src/FormRenderer.d.ts +0 -90
  156. package/src/FormRenderer.js +0 -649
  157. package/src/FormValidator.d.ts +0 -479
  158. package/src/FormValidator.js +0 -579
  159. package/src/StaticHtmlRenderer.d.ts +0 -8
  160. package/src/StaticHtmlRenderer.js +0 -21
  161. package/src/json-converter.d.ts +0 -180
  162. package/src/json-converter.js +0 -1329
  163. package/src/parser.d.ts +0 -99
  164. package/src/parser.js +0 -750
  165. package/src/renderFormField.d.ts +0 -20
  166. package/src/renderFormField.js +0 -203
  167. package/src/types/FormSchema.d.ts +0 -205
  168. package/src/types/FormSchema.js +0 -1
  169. package/src/utils.js +0 -146
  170. package/styles/bootstrap5.3-dark.css +0 -26
  171. package/styles/fluent2-dark.css +0 -26
  172. package/styles/form-renderer.base.css +0 -489
  173. package/styles/tailwind3-dark.css +0 -10
@@ -1,20 +0,0 @@
1
- /**
2
- * Standalone Form Field Renderer
3
- * Renders individual form components based on FormComponent schema
4
- */
5
- import React from 'react';
6
- import { type FormComponent } from './types/FormSchema';
7
- export interface RenderFormFieldProps {
8
- component: FormComponent;
9
- value?: any;
10
- onChange: (value: any) => void;
11
- onBlur?: () => void;
12
- onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
13
- ref?: any;
14
- hasError?: boolean;
15
- locale: string;
16
- }
17
- /**
18
- * Renders a single form field component
19
- */
20
- export declare const renderFormField: ({ component, value, onChange, onBlur, ref, hasError, onClick, locale }: RenderFormFieldProps) => React.ReactNode;
@@ -1,203 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { TextBoxComponent, NumericTextBoxComponent, MaskedTextBoxComponent, UploaderComponent, TextAreaComponent } from '@syncfusion/ej2-react-inputs';
3
- import { CheckBoxComponent, RadioButtonComponent, SwitchComponent, ButtonComponent, } from '@syncfusion/ej2-react-buttons';
4
- import { SplitButtonComponent } from '@syncfusion/ej2-react-splitbuttons';
5
- import { CheckBoxSelection, DropDownListComponent, MultiSelectComponent, } from '@syncfusion/ej2-react-dropdowns';
6
- import { DatePickerComponent, DateTimePickerComponent, TimePickerComponent, DateRangePickerComponent, Inject, Islamic, } from '@syncfusion/ej2-react-calendars';
7
- import { SliderComponent } from '@syncfusion/ej2-react-inputs';
8
- import { ColorPickerComponent } from '@syncfusion/ej2-react-inputs';
9
- import { RatingComponent } from '@syncfusion/ej2-react-inputs';
10
- import { SignatureComponent } from '@syncfusion/ej2-react-inputs';
11
- import { MessageComponent } from '@syncfusion/ej2-react-notifications';
12
- import { ImageEditorComponent } from '@syncfusion/ej2-react-image-editor';
13
- import { DataGridComponent } from './DataGridComponent';
14
- import { RichTextEditorComponent, Toolbar, HtmlEditor, Inject as RTEInject, Link, QuickToolbar } from '@syncfusion/ej2-react-richtexteditor';
15
- import { mapButtonStyleToClass, mapPositionToJustifyContent, resolveButtonType } from './utils';
16
- import CheckboxGroup from './CheckboxGroup';
17
- /**
18
- * Converts htmlAttributes from array format to object format
19
- */
20
- const normalizeAttributes = (attributes) => {
21
- if (!attributes)
22
- return {};
23
- if (Array.isArray(attributes)) {
24
- return attributes.reduce((acc, item) => {
25
- if (item.key && item.value !== undefined) {
26
- acc[item.key] = item.value;
27
- }
28
- return acc;
29
- }, {});
30
- }
31
- return attributes;
32
- };
33
- /**
34
- * Renders a single form field component
35
- */
36
- export const renderFormField = ({ component, value, onChange, onBlur, ref, hasError = false, onClick, locale }) => {
37
- const commonProps = {
38
- floatLabelType: (component.floatLabelType || 'Never'),
39
- placeholder: component.placeholder || '',
40
- enabled: !component.disabled,
41
- };
42
- const createValidationHandlers = (getValue) => {
43
- const validateOn = component.validateOn || 'Change';
44
- const handlers = {};
45
- // If validateOn is 'Change' or undefined, add change and blur handlers
46
- if (!validateOn || validateOn === 'Change') {
47
- handlers.onChange = (args) => onChange(getValue(args));
48
- handlers.onBlur = () => onBlur?.();
49
- }
50
- // If validateOn is 'Blur', add change and blur handlers
51
- if (validateOn === 'Blur') {
52
- handlers.change = (args) => onChange(getValue(args));
53
- handlers.blur = () => onBlur?.();
54
- }
55
- return handlers;
56
- };
57
- const htmlAttrs = normalizeAttributes(component.htmlAttributes);
58
- const errorClass = hasError ? 'e-error' : '';
59
- const cssClass = `${component.cssClass || ''} ${errorClass} ${component.size === 'Small' ? ' e-small' : component.size === 'Bigger' ? ' e-bigger' : ''}`.trim();
60
- switch (component.type) {
61
- case 'textbox':
62
- return (_jsx(TextBoxComponent, { id: component.id, type: component.multiline ? 'hidden' : component.textboxType ? component.textboxType : 'text', name: component.id, locale: locale, ...commonProps, value: value !== undefined ? value : (component.defaultValue || ''), multiline: component.multiline, showClearButton: component.showClearButton, autocomplete: component.autocomplete === false ? 'off' : 'on', readonly: component.readOnly || false, cssClass: cssClass, htmlAttributes: htmlAttrs, appendTemplate: component.suffix, prependTemplate: component.prefix, ...createValidationHandlers((args) => args.value || ''), ref: ref }, component.id));
63
- case 'textarea':
64
- return (_jsx(TextAreaComponent, { id: component.id, name: component.id, locale: locale, ...commonProps, value: value !== undefined ? value : (component.defaultValue || ''), cols: component.cols || 200, rows: component.textareaRows || 4, showClearButton: component.showClearButton || false, readonly: component.readOnly || false, maxLength: component?.maxLength || 255, cssClass: cssClass, htmlAttributes: htmlAttrs, appendTemplate: component.suffix, prependTemplate: component.prefix, resizeMode: 'Vertical', ...createValidationHandlers((args) => args.value || ''), ref: ref }, component.id));
65
- case 'number':
66
- return (_jsx(NumericTextBoxComponent, { id: component.id, name: component.id, locale: locale, ...commonProps, value: value !== undefined ? value : (component.defaultValue || 0), decimals: component.decimals || 2, currency: component.currency, format: component.numberFormat || 'n2', step: component.step || 1, min: component.minValue || undefined, max: component.maxValue || undefined, readonly: component.readOnly || false, showClearButton: component.showClearButton || false, cssClass: cssClass, htmlAttributes: htmlAttrs, appendTemplate: component.suffix, prependTemplate: component.prefix, ...createValidationHandlers((args) => args.value || ''), ref: ref }, component.id));
67
- case 'checkbox':
68
- const checkboxLabel = component.label && component.required
69
- ? `${component.label} *`
70
- : component.label;
71
- return (_jsx(CheckBoxComponent, { id: component.id, locale: locale, name: component.id, label: checkboxLabel, labelPosition: component.checkboxLabelPosition, checked: component.defaultValue ?? (component.checked ?? false), indeterminate: component.indeterminate || false, disabled: component.disabled, cssClass: cssClass, htmlAttributes: htmlAttrs, change: (args) => onChange(args.checked), ref: ref }, component.id));
72
- case 'checkboxGroup':
73
- return (_jsx(CheckboxGroup, { component: component, value: value, onChange: (v) => onChange(v), optionRef: ref }, component.id));
74
- case 'radio':
75
- return (_jsx("div", { id: `${component.id}-group`, className: `e-radio-group ${errorClass}`, children: (component.options || ['Option 1']).map((option, idx) => {
76
- const optionValue = option;
77
- const optionText = option;
78
- return (_jsx("div", { style: { marginBottom: '8px' }, children: _jsx(RadioButtonComponent, { id: `${component.id}_${idx}_${optionValue}`, name: component.id, label: optionText, locale: locale, disabled: component.disabled, value: optionValue, htmlAttributes: htmlAttrs, labelPosition: component.fieldLabelPosition, checked: component.defaultValue === optionValue, cssClass: cssClass, change: (args) => {
79
- if (args.value === optionValue) {
80
- onChange(optionValue);
81
- }
82
- }, ref: ref ? (el) => ref(el, idx) : undefined }, component.id) }, idx));
83
- }) }));
84
- case 'dropdown':
85
- return (_jsx(DropDownListComponent, { id: component.id, name: component.id, ...commonProps, locale: locale, cssClass: cssClass, dataSource: component.options || ["Option 1"], value: value !== undefined ? value : (component.defaultValue ?? null), showClearButton: component.showClearButton || false, readonly: component.readOnly || false, enableVirtualization: component.enableVirtualization || false, popupHeight: component.popupHeight || '300px', popupWidth: component.popupWidth || '100%', htmlAttributes: htmlAttrs, ...createValidationHandlers((args) => args.value || ''), ref: ref }, component.id));
86
- case 'multiselect':
87
- return (_jsx(MultiSelectComponent, { id: component.id, name: component.id, locale: locale, ...commonProps, value: value !== undefined ? value : (component.defaultValue ?? null), placeholder: component.placeholder, dataSource: component.options || ["Option 1"], fields: { text: 'text', value: 'value' }, showClearButton: component.showClearButton || false, readonly: component.readOnly || false, allowCustomValue: component.allowCustomValue || false, addTagOnBlur: component.addTagOnBlur || false, delimiterChar: component.delimiterChar || ',', showSelectAll: component.showSelectAll || false, mode: component.showSelectAll ? 'CheckBox' : undefined, selectAllText: component.selectAllText, unSelectAllText: component.unSelectAllText, showDropDownIcon: component.showDropDownIcon !== false, enableVirtualization: component.enableVirtualization || false, popupHeight: component.popupHeight || '300px', popupWidth: component.popupWidth || '100%', cssClass: cssClass, htmlAttributes: htmlAttrs, ...createValidationHandlers((args) => args.value || ''), ref: ref, children: _jsx(Inject, { services: [CheckBoxSelection] }) }, component.id));
88
- case 'date':
89
- return (_jsx(DatePickerComponent, { ...commonProps, id: component.id, name: component.id, locale: locale, value: value !== undefined ? value : (component.defaultValue ?? null), floatLabelType: component.floatLabelType || 'Never', format: component.format || 'MM/dd/yyyy', placeholder: component.placeholder || '', readOnly: component.readOnly || false, showClearButton: component.showClearButton !== false ? true : false, showTodayButton: component.showTodayButton !== false ? true : false, calendarMode: component.calendarMode || 'Gregorian', dayHeaderFormat: component.dayHeaderFormat || 'Short', depth: component.depth || 'Month', start: component.start || 'Month', firstDayOfWeek: component.firstDayOfWeek || 0, min: component?.minDate ? new Date(component.minDate) : undefined, max: component?.maxDate ? new Date(component.maxDate) : undefined, cssClass: cssClass, htmlAttributes: htmlAttrs, ...createValidationHandlers((args) => args.value || ''), ref: ref, children: _jsx(Inject, { services: [Islamic] }) }, component.id));
90
- case 'dateTime':
91
- return (_jsx(DateTimePickerComponent, { ...commonProps, id: component.id, locale: locale, name: component.id, floatLabelType: component.floatLabelType || 'Never', dayHeaderFormat: component.dayHeaderFormat || 'Short', value: value !== undefined ? value : (component.defaultValue ?? null), format: component.format || 'MM/dd/yyyy hh:mm a', showClearButton: component.showClearButton !== false, showTodayButton: component.showTodayButton !== false ? true : false, depth: component.depth || 'Month', start: component.start || 'Month', step: component.step || 1, readonly: component.readOnly || false, min: component?.minDate ? new Date(component.minDate) : undefined, max: component?.maxDate ? new Date(component.maxDate) : undefined, minTime: component?.minTime ? new Date(`2000-01-01 ${component.minTime}`) : undefined, maxTime: component?.maxTime ? new Date(`2000-01-01 ${component.maxTime}`) : undefined, enableMask: false, cssClass: cssClass, htmlAttributes: htmlAttrs, ...createValidationHandlers((args) => args.value || ''), ref: ref, children: _jsx(Inject, { services: [Islamic] }) }, component.id));
92
- case 'time':
93
- return (_jsx(TimePickerComponent, { id: component.id, locale: locale, name: component.id, floatLabelType: component.floatLabelType || 'Never', placeholder: component.placeholder || '', enabled: !component.disabled, value: value !== undefined ? value : (component.defaultValue ?? null), format: component.format || 'hh:mm a', showClearButton: component.showClearButton !== false, step: component.step || 30, readonly: component.readOnly || false, min: component?.minTime ? new Date(`2000-01-01 ${component.minTime}`) : undefined, max: component?.maxTime ? new Date(`2000-01-01 ${component.maxTime}`) : undefined, enableMask: false, cssClass: cssClass, htmlAttributes: htmlAttrs, ...createValidationHandlers((args) => args.value || ''), ref: ref }, component.id));
94
- case 'dateRange':
95
- return (_jsx(DateRangePickerComponent, { id: component.id, locale: locale, name: component.id, floatLabelType: component.floatLabelType || 'Never', dayHeaderFormat: component.dayHeaderFormat || 'Short', placeholder: component.placeholder || '', enabled: !component.disabled, value: value !== undefined ? value : (component.defaultValue ?? null), depth: component.depth || 'Month', start: component.start || 'Month', min: component?.minDate ? new Date(component.minDate) : undefined, max: component?.maxDate ? new Date(component.maxDate) : undefined, format: component.format || 'MM/dd/yyyy', separator: component.separator || ' - ', showClearButton: component.showClearButton !== false, readonly: component.readOnly || false, cssClass: cssClass, htmlAttributes: htmlAttrs, ...createValidationHandlers((args) => args.value || ''), ref: ref }, component.id));
96
- case 'switch':
97
- return (_jsx(SwitchComponent, { id: component.id, locale: locale, value: component.defaultValue, name: component.id, checked: component.defaultValue ?? (component.checked ?? false), disabled: component.disabled, onLabel: component.onLabel || '', offLabel: component.offLabel || '', cssClass: cssClass, htmlAttributes: htmlAttrs, change: (args) => onChange(args.checked), ref: ref }, component.id));
98
- case 'button':
99
- // If buttonsGroups is provided, render a button group in-place of a single button
100
- const groupButtons = (component.buttonsGroups || component.buttons || []);
101
- if (groupButtons && groupButtons.length > 0) {
102
- const groupStyleObj = {
103
- display: 'flex',
104
- flexWrap: 'wrap',
105
- alignItems: 'center',
106
- gap: component.gap || '8px',
107
- justifyContent: mapPositionToJustifyContent(component.position),
108
- width: component.width || undefined,
109
- };
110
- return (_jsx("div", { id: component.id, role: "group", "aria-label": component.label || 'Button Group', className: cssClass, style: groupStyleObj, children: groupButtons.map((btn, idx) => {
111
- const btnId = `${component.id}_${idx}`;
112
- const btnCssClass = [
113
- mapButtonStyleToClass(btn.style)
114
- ].filter(Boolean).join(' ');
115
- return (_jsx(ButtonComponent, { id: String(btnId), name: String(btnId), locale: locale, type: resolveButtonType(btn.type), cssClass: btnCssClass, disabled: btn.disabled || false, content: btn.label || `Button ${idx + 1}`, iconCss: btn.iconCss, iconPosition: btn.iconPosition, onClick: (event) => {
116
- if (onClick) {
117
- onClick(event);
118
- }
119
- }, ref: (el) => {
120
- if (ref && typeof ref === 'function') {
121
- ref(el, idx);
122
- }
123
- } }, String(btnId)));
124
- }) }, `form-${component.type}-${component.id}`));
125
- }
126
- // Fallback: render a single ButtonComponent when no group is configured
127
- const resolvedButtonType = resolveButtonType(component.buttonType);
128
- const buttonCssClassList = [
129
- mapButtonStyleToClass(component.style),
130
- resolvedButtonType === 'submit' ? 'submit-btn form-submit-type' : '',
131
- resolvedButtonType === 'reset' ? 'form-reset-type' : '',
132
- component.cssClass || 'e-primary',
133
- component.size === 'Small' ? ' e-small' : component.size === 'Bigger' ? ' e-bigger' : ''
134
- ].filter(Boolean).join(' ') || 'e-primary';
135
- const buttonContainerStyle = {
136
- display: 'flex',
137
- justifyContent: mapPositionToJustifyContent(component.position),
138
- width: component.width || '100%',
139
- };
140
- return (_jsx("div", { id: `${component.id}-container`, style: buttonContainerStyle, children: _jsx(ButtonComponent, { id: component.id, type: resolvedButtonType, locale: locale, cssClass: buttonCssClassList, disabled: component.disabled, iconCss: component.iconCss, iconPosition: component.iconPosition, onClick: (event) => {
141
- if (onClick) {
142
- onClick(event);
143
- }
144
- }, ref: ref, children: component.label }, component.id) }, `form-${component.type}-${component.id}`));
145
- case 'splitButton':
146
- const splitButtonCssClassList = [
147
- component.style === 'primary' ? 'e-primary' : '',
148
- component.style === 'flat' ? '' : '',
149
- component.style === 'information' ? 'e-info' : '',
150
- component.style === 'error' ? 'e-danger' : '',
151
- component.style === 'success' ? 'e-success' : '',
152
- component.style === 'warning' ? 'e-warning' : '',
153
- component.cssClass || ''
154
- ].filter(Boolean).join(' ') || undefined;
155
- const splitButtonContainerStyle = {
156
- display: 'flex',
157
- justifyContent: mapPositionToJustifyContent(component.position)
158
- };
159
- return (_jsx("div", { id: `${component.id}-container`, "aria-label": 'Splitbutton', style: splitButtonContainerStyle, children: _jsx(SplitButtonComponent, { id: component.id, locale: locale, content: component.label || 'Split Button', items: component.options?.map((option, index) => ({
160
- text: option,
161
- id: `${component.id}_option_${index}`
162
- })) || [{ text: 'Option 1', id: `${component.id}_option_0` }], cssClass: splitButtonCssClassList, disabled: component.disabled, iconCss: component.iconCss, iconPosition: component.iconPosition || 'Left', onClick: (event) => {
163
- if (onClick) {
164
- onClick({ ...event, buttonId: component.id, buttonLabel: component.label });
165
- }
166
- }, select: (event) => {
167
- if (onClick) {
168
- onClick({ ...event, selectedItem: event.item?.properties?.text, buttonId: component.id, buttonLabel: component.label });
169
- }
170
- }, ref: ref }, component.id) }, `form-${component.type}-${component.id}`));
171
- case 'signature':
172
- return (_jsx(SignatureComponent, { id: component.id, className: cssClass, locale: locale, backgroundColor: component.backgroundColor || '', strokeColor: component.strokeColor || '', maxStrokeWidth: component.maxValue, minStrokeWidth: component.minValue, velocity: component.velocity, disabled: component.disabled, change: (args) => onChange(args.value), ref: ref }, component.id));
173
- case 'rating':
174
- return (_jsx(RatingComponent, { id: component.id, name: component.id, locale: locale, value: value !== undefined ? value : (component.defaultValue || 0), disabled: component.disabled, cssClass: cssClass, allowReset: component.allowReset, itemsCount: component.itemsCount, min: component?.minValue, precision: component.precision, readOnly: component.readOnly, showTooltip: component.showRatingTooltip || false, showLabel: component.showRatingLabel, labelPosition: component.showRatingLabel ? component.ratingLabelPosition : undefined, valueChanged: (args) => onChange(args.value), ref: ref }, component.id));
175
- case 'colorPicker':
176
- return (_jsx(ColorPickerComponent, { id: component.id, locale: locale, value: value !== undefined ? value : (component.defaultValue || ''), disabled: component.disabled, enableOpacity: component.enableOpacity, showButtons: component.showButtons, showRecentColors: component.showRecentColors, noColor: component.showNoColor, cssClass: cssClass, change: (args) => onChange(args.value), ref: ref }, component.id));
177
- case 'inputMask':
178
- return (_jsx(MaskedTextBoxComponent, { id: component.id, name: component.id, ...commonProps, locale: locale, value: value !== undefined ? value : (component.defaultValue || ''), floatLabelType: component.floatLabelType || 'Never', placeholder: component.placeholder || '', enabled: !component.disabled, mask: component.mask || '000-000-0000', promptChar: component.promptChar || '_', customCharacters: component.customCharacters, readOnly: component.readOnly || false, showClearButton: component.showClearButton !== false, cssClass: cssClass, htmlAttributes: htmlAttrs, appendTemplate: component.suffix, prependTemplate: component.prefix, ...createValidationHandlers((args) => args.value || ''), ref: ref }, component.id));
179
- case 'rangeSlider':
180
- return (_jsx(SliderComponent, { id: component.id, locale: locale, value: value !== undefined ? value : (component.defaultValue ?? 0), min: component.minValue || 0, max: component.maxValue || 100, step: component.step || 1, disabled: component.disabled, cssClass: cssClass, enabled: !component.disabled, showButtons: component.showButtons, change: (args) => onChange(args.value), ref: ref }, component.id));
181
- case 'fileUpload':
182
- return (_jsx(UploaderComponent, { id: component.id, name: component.id, locale: locale, type: 'file', enabled: !component.disabled, allowedExtensions: component.allowExtensions, asyncSettings: { saveUrl: component.saveUrl, removeUrl: component.removeUrl }, buttons: component.buttons || {
183
- "browse": "Choose File",
184
- "clear": "Clear All",
185
- "upload": "Upload All"
186
- }, maxFileSize: component?.maxValue, minFileSize: component?.minValue, multiple: component.allowMultiple, showFileList: component.showFileList, htmlAttributes: htmlAttrs, cssClass: cssClass, change: (args) => onChange(args.filesData), ref: ref }, component.id));
187
- case 'imageEditor':
188
- return (_jsx(ImageEditorComponent, { id: component.id, locale: locale, disabled: component.disabled, cssClass: cssClass, height: (component.height || '350px').toString(), width: (component.width || '100%').toString(), ref: ref }, component.id));
189
- case 'message':
190
- return (_jsx(MessageComponent, { id: component.id, locale: locale, severity: component.severity || component.messageType || 'info', variant: component.variant, content: component.content || 'Message', showCloseIcon: component.showCloseIcon, showIcon: (component.showIcon === undefined ? false : component.showIcon) || false, disabled: component.disabled, cssClass: cssClass, ref: ref }, component.id));
191
- case 'dataGrid':
192
- const dg = component;
193
- return (_jsx("div", { id: dg.id, className: dg.cssClass, children: _jsx(DataGridComponent, { id: dg.id, type: 'dataGrid', locale: locale, label: dg.label || '', name: dg.name || '', columns: dg.columns || [], dataSource: value !== undefined ? value : (dg.dataSource ?? dg.dataSource ?? []), height: dg.height || '200px', width: dg.width || '100%', pageSize: dg.pageSize || 6, allowPaging: dg.allowPaging !== false, allowAdding: dg.allowAdding !== false, allowEditing: dg.allowEditing !== false, allowDeleting: dg.allowDeleting !== false, onDataChange: (data) => onChange(data), cssClass: cssClass, ref: ref }) }, dg.id));
194
- case 'richTextEditor':
195
- const toolbarSettings = {
196
- items: ['Undo', 'Redo', '|', 'Bold', 'Italic', 'Underline', 'StrikeThrough', 'InlineCode', '|', 'CreateLink', 'Blockquote', '|', 'BulletFormatList', 'NumberFormatList', '|', 'Formats', 'Alignments', '|', 'Outdent', 'Indent', '|',
197
- 'FontColor', 'BackgroundColor', 'FontName', 'FontSize', '|', 'LowerCase', 'UpperCase', '|', 'SourceCode']
198
- };
199
- return (_jsx(RichTextEditorComponent, { id: component.id, locale: locale, name: component.id, toolbarSettings: toolbarSettings, value: value !== undefined ? value : (component.defaultValue || ''), placeholder: component.placeholder || '', enabled: !component.disabled, readonly: component.readOnly || false, maxLength: component.maxLength || 1000, cssClass: cssClass || undefined, height: component.height || '300px', width: component.width || '100%', htmlAttributes: htmlAttrs, ref: ref, children: _jsx(RTEInject, { services: [Toolbar, Link, HtmlEditor, QuickToolbar] }) }, `${component.id}`));
200
- default:
201
- return (_jsxs("div", { className: "unsupported-component", children: ["Unsupported component type: ", component.type] }));
202
- }
203
- };
@@ -1,205 +0,0 @@
1
- /**
2
- * Form Schema Type Definitions
3
- * Copied from builder for standalone renderer
4
- */
5
- import type { visualMode } from "@syncfusion/ej2-react-dropdowns";
6
- export interface ButtonClickEventArgs {
7
- buttonId: string;
8
- buttonLabel: string;
9
- event: React.MouseEvent<HTMLButtonElement>;
10
- }
11
- export type ConditionalOperator = 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'in' | 'notIn' | 'contains' | 'notContains';
12
- export interface ConditionalRule {
13
- field: string;
14
- operator: ConditionalOperator;
15
- value: any;
16
- }
17
- export interface CompositeConditionalRule {
18
- condition: 'and' | 'or';
19
- rules: (ConditionalRule | CompositeConditionalRule)[];
20
- }
21
- export type ConditionType = ConditionalRule | CompositeConditionalRule;
22
- export interface FormComponentConditions {
23
- visibleWhen?: ConditionType;
24
- hideWhen?: ConditionType;
25
- readOnlyWhen?: ConditionType;
26
- disabledWhen?: ConditionType;
27
- requiredWhen?: ConditionType;
28
- setValueWhen?: {
29
- condition: ConditionType;
30
- value: any;
31
- };
32
- }
33
- export interface FormSchema {
34
- version: string;
35
- theme: string;
36
- components: FormComponent[];
37
- }
38
- export interface FormComponent {
39
- id: string;
40
- type: 'textbox' | 'textarea' | 'number' | 'email' | 'url' | 'phone' | 'password' | 'checkbox' | 'checkboxGroup' | 'radio' | 'dropdown' | 'multiselect' | 'button' | 'date' | 'dateTime' | 'time' | 'dateRange' | 'switch' | 'signature' | 'rating' | 'imageEditor' | 'fileUpload' | 'rangeSlider' | 'colorPicker' | 'inputMask' | 'message' | 'panel' | 'table' | 'tabs' | 'dataGrid' | 'card' | 'splitButton' | 'richTextEditor' | 'staticHtml';
41
- textboxType?: string;
42
- label: string;
43
- name: string;
44
- description?: string | undefined;
45
- prefix?: string | undefined;
46
- suffix?: string | undefined;
47
- placeholder?: string;
48
- defaultValue?: any;
49
- disabled?: boolean;
50
- visible?: boolean;
51
- tooltip?: string;
52
- hideBorders?: boolean;
53
- hideLabel?: boolean;
54
- cssClass?: string;
55
- multiline?: boolean;
56
- showClearButton?: boolean;
57
- showCloseIcon?: boolean;
58
- showIcon?: boolean;
59
- variant?: string;
60
- severity?: string;
61
- content?: string;
62
- showTodayButton?: boolean;
63
- htmlAttributes?: Record<string, any>;
64
- labelPosition?: 'Top' | 'Bottom' | 'Left' | 'Right';
65
- position?: 'center' | 'left' | 'right';
66
- fieldLabelPosition?: 'After' | 'Before';
67
- labelWidth?: string;
68
- floatLabelType?: 'Never' | 'Always' | 'Auto';
69
- readOnly?: boolean;
70
- autocomplete?: boolean;
71
- cols?: number;
72
- textareaRows?: number;
73
- checked?: boolean;
74
- indeterminate?: boolean;
75
- offLabel?: string;
76
- onLabel?: string;
77
- buttonType?: 'button' | 'submit' | 'reset';
78
- iconCss?: string;
79
- iconPosition?: 'Left' | 'Right';
80
- style?: string;
81
- buttonsGroups?: ButtonDefinition[];
82
- gap?: string;
83
- onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
84
- decimals?: number;
85
- currency?: string;
86
- format?: string;
87
- numberFormat?: string;
88
- allowReset?: boolean;
89
- itemsCount?: number;
90
- precision?: number | string;
91
- showRatingTooltip?: boolean;
92
- showRatingLabel?: boolean;
93
- ratingLabelPosition?: 'Top' | 'Bottom' | 'Left' | 'Right';
94
- height?: number | null;
95
- width?: number | null;
96
- backgroundColor?: string;
97
- strokeColor?: string;
98
- maximumStrokeWidth?: number;
99
- minimumStrokeWidth?: number;
100
- velocity?: number;
101
- enableOpacity?: boolean;
102
- showNoColor?: boolean;
103
- showButtons?: boolean;
104
- showRecentColors?: boolean;
105
- orientation?: 'Horizontal' | 'Vertical';
106
- allowExtensions?: string;
107
- saveUrl?: string;
108
- removeUrl?: string;
109
- buttons?: {};
110
- allowMultiple?: boolean;
111
- showFileList?: boolean;
112
- calendarMode?: string;
113
- dayHeaderFormat?: string;
114
- depth?: string;
115
- firstDayOfWeek?: number;
116
- start?: string;
117
- allowEdit?: boolean;
118
- enabled?: boolean;
119
- timeFormat?: string;
120
- step?: number;
121
- startDate?: string;
122
- endDate?: string;
123
- separator?: string;
124
- mask?: string;
125
- customCharacters?: Record<string, string>;
126
- promptChar?: string;
127
- allowCustomValue?: boolean;
128
- addTagOnBlur?: boolean;
129
- delimiterChar?: string;
130
- visualMode?: visualMode;
131
- showSelectAll?: boolean;
132
- selectAllText?: string;
133
- unSelectAllText?: string;
134
- showDropDownIcon?: boolean;
135
- validateOn?: 'Change' | 'Blur';
136
- pageSize?: number;
137
- size?: string;
138
- allowPaging?: boolean;
139
- allowAdding?: boolean;
140
- allowEditing?: boolean;
141
- allowDeleting?: boolean;
142
- required?: boolean;
143
- minLength?: number | null;
144
- maxLength?: number | null;
145
- min?: number | null;
146
- minimum?: number | null;
147
- max?: number | null;
148
- minDate?: string;
149
- maxDate?: string;
150
- minValue?: number | null;
151
- maxValue?: number | null;
152
- minTime?: string;
153
- maxTime?: string;
154
- regex?: string;
155
- validationMessage?: string;
156
- options?: string[];
157
- checkboxLabelPosition?: 'Before' | 'After';
158
- layoutDirection?: 'row' | 'column';
159
- enableHtmlSanitizer?: boolean;
160
- fields?: Record<string, any>;
161
- enableVirtualization?: boolean;
162
- popupHeight?: string;
163
- popupWidth?: string;
164
- children?: FormComponent[];
165
- rows?: number;
166
- columns?: number;
167
- messageType?: 'info' | 'success' | 'warning' | 'error';
168
- messageContent?: string;
169
- legend?: string;
170
- cardTitle?: string;
171
- cardSubtitle?: string;
172
- columnWidths?: {
173
- columns: number;
174
- widths: number[];
175
- };
176
- tabItems?: Array<{
177
- header: string;
178
- content?: FormComponent[];
179
- }>;
180
- tableCells?: FormComponent[][][];
181
- parentPath?: string;
182
- properties?: Record<string, any>;
183
- conditions?: FormComponentConditions;
184
- _configured?: boolean;
185
- }
186
- export interface ValidationRules {
187
- [fieldName: string]: {
188
- required?: [boolean, string];
189
- minLength?: [number, string];
190
- maxLength?: [number, string];
191
- min?: [number, string];
192
- max?: [number, string];
193
- regex?: [string, string];
194
- date?: [string, string];
195
- [key: string]: any;
196
- };
197
- }
198
- export interface ButtonDefinition {
199
- label: string;
200
- type?: 'submit' | 'reset' | 'button';
201
- style?: 'primary' | 'flat' | 'information' | 'error' | 'success' | 'warning';
202
- iconCss?: string;
203
- iconPosition?: 'Left' | 'Right';
204
- disabled?: boolean;
205
- }
@@ -1 +0,0 @@
1
- export {};
package/src/utils.js DELETED
@@ -1,146 +0,0 @@
1
- import { Internationalization } from '@syncfusion/ej2-base';
2
- /**
3
- * Maps button style to Syncfusion CSS classes
4
- * @param style - Button style ('primary' | 'flat' | 'information' | 'error' | 'success' | 'warning')
5
- * @returns Space-separated CSS class string
6
- */
7
- export const mapButtonStyleToClass = (style) => {
8
- const styleMap = {
9
- 'primary': 'e-primary',
10
- 'flat': 'e-flat',
11
- 'information': 'e-info',
12
- 'error': 'e-danger',
13
- 'success': 'e-success',
14
- 'warning': 'e-warning'
15
- };
16
- return styleMap[style || 'primary'] || 'e-primary';
17
- };
18
- /**
19
- * Resolves button type to valid HTML button type
20
- * @param type - Button type ('submit' | 'reset' | 'button')
21
- * @returns Resolved button type
22
- */
23
- export const resolveButtonType = (type) => {
24
- return (type === 'submit' || type === 'reset') ? type : 'button';
25
- };
26
- /**
27
- * Maps button position to CSS justifyContent value
28
- * @param position - Button position ('Left' | 'Right' | 'Center')
29
- * @returns CSS justifyContent value
30
- */
31
- export const mapPositionToJustifyContent = (position) => {
32
- const positionMap = {
33
- 'Left': 'flex-start',
34
- 'Right': 'flex-end',
35
- 'Center': 'center'
36
- };
37
- return positionMap[position || 'Left'] || 'flex-start';
38
- };
39
- export function splitWidths(input) {
40
- const result = input.map(v => (v === null ? NaN : Number(v)));
41
- const sumKnown = result.reduce((s, v) => s + (isNaN(v) ? 0 : v), 0);
42
- // If knowns already >= 100, unknowns become 0
43
- const remainingInt = Math.max(0, Math.round(100 - sumKnown));
44
- const unknownIndexes = result.map((v, i) => (isNaN(v) ? i : -1)).filter(i => i >= 0);
45
- const k = unknownIndexes.length;
46
- if (k === 0) {
47
- // nothing to split; just clamp/round knowns so they sum to 100 if you prefer, but return as-is
48
- return result.map(v => Math.round(v));
49
- }
50
- // Distribute integer percentage points to avoid fractional rounding problems
51
- const base = Math.floor(remainingInt / k);
52
- let remainder = remainingInt - base * k;
53
- // Fill unknowns with base + 1 for first `remainder` items
54
- unknownIndexes.forEach((idx) => {
55
- const add = remainder > 0 ? base + 1 : base;
56
- result[idx] = add;
57
- remainder = Math.max(0, remainder - 1);
58
- });
59
- // Convert any NaN (shouldn't remain) to 0 and round knowns
60
- return result.map(v => (isNaN(v) ? 0 : Math.round(v)));
61
- }
62
- export function extractAllDescendantIds(component) {
63
- const childIds = [];
64
- function traverse(comps) {
65
- for (const comp of comps) {
66
- childIds.push(comp.id);
67
- // Recursively traverse nested structures
68
- if (comp.children && Array.isArray(comp.children)) {
69
- traverse(comp.children);
70
- }
71
- // Handle table cells
72
- if (comp.tableCells && Array.isArray(comp.tableCells)) {
73
- comp.tableCells.forEach((row) => {
74
- if (Array.isArray(row)) {
75
- row.forEach((cell) => {
76
- if (Array.isArray(cell)) {
77
- traverse(cell);
78
- }
79
- });
80
- }
81
- });
82
- }
83
- // Handle tab items
84
- if (comp.tabItems && Array.isArray(comp.tabItems)) {
85
- comp.tabItems.forEach((tabItem) => {
86
- if (tabItem.content && Array.isArray(tabItem.content)) {
87
- traverse(tabItem.content);
88
- }
89
- });
90
- }
91
- }
92
- }
93
- // Start with direct children
94
- if (component.children && Array.isArray(component.children)) {
95
- traverse(component.children);
96
- }
97
- // Handle table cells
98
- if (component.tableCells && Array.isArray(component.tableCells)) {
99
- component.tableCells.forEach((row) => {
100
- if (Array.isArray(row)) {
101
- row.forEach((cell) => {
102
- if (Array.isArray(cell)) {
103
- traverse(cell);
104
- }
105
- });
106
- }
107
- });
108
- }
109
- // Handle tab items
110
- if (component.tabItems && Array.isArray(component.tabItems)) {
111
- component.tabItems.forEach((tabItem) => {
112
- if (tabItem.content && Array.isArray(tabItem.content)) {
113
- traverse(tabItem.content);
114
- }
115
- });
116
- }
117
- return childIds;
118
- }
119
- export function formatDateValues(component, value) {
120
- let intl = new Internationalization();
121
- let dFormatter = intl.getDateFormat({
122
- format: 'MM/dd/yyyy',
123
- type: 'date'
124
- });
125
- if (component.type === 'date') {
126
- value = dFormatter(new Date(value));
127
- }
128
- if (component.type === 'time') {
129
- dFormatter = intl.getDateFormat({
130
- format: 'hh:mm a',
131
- type: 'time'
132
- });
133
- value = dFormatter(new Date(value));
134
- }
135
- if (component.type === 'dateTime') {
136
- dFormatter = intl.getDateFormat({
137
- format: 'MM/dd/yyyy hh:mm a',
138
- type: 'dateTime'
139
- });
140
- value = dFormatter(new Date(value));
141
- }
142
- if (component.type === 'dateRange' && Array.isArray(value)) {
143
- value = value.map(date => date ? dFormatter(new Date(date)) : null);
144
- }
145
- return value;
146
- }
@@ -1,26 +0,0 @@
1
- @import '@syncfusion/ej2-base/styles/bootstrap5.3.css';
2
- @import '@syncfusion/ej2-buttons/styles/bootstrap5.3.css';
3
- @import '@syncfusion/ej2-inputs/styles/bootstrap5.3.css';
4
- @import '@syncfusion/ej2-dropdowns/styles/bootstrap5.3.css';
5
- @import '@syncfusion/ej2-calendars/styles/bootstrap5.3.css';
6
- @import '@syncfusion/ej2-react-calendars/styles/bootstrap5.3.css';
7
- @import '@syncfusion/ej2-navigations/styles/bootstrap5.3.css';
8
- @import '@syncfusion/ej2-notifications/styles/bootstrap5.3.css';
9
- @import '@syncfusion/ej2-popups/styles/bootstrap5.3.css';
10
- @import '@syncfusion/ej2-lists/styles/bootstrap5.3.css';
11
- @import '@syncfusion/ej2-splitbuttons/styles/bootstrap5.3.css';
12
- @import "@syncfusion/ej2-react-popups/styles/bootstrap5.3.css";
13
- @import "@syncfusion/ej2-react-grids/styles/bootstrap5.3.css";
14
- @import "@syncfusion/ej2-splitbuttons/styles/bootstrap5.3.css";
15
- @import "@syncfusion/ej2-image-editor/styles/bootstrap5.3.css";
16
- @import "@syncfusion/ej2-layouts/styles/bootstrap5.3.css";
17
- @import '@syncfusion/ej2-richtexteditor/styles/bootstrap5.3.css';
18
- @import 'form-renderer.base.css';
19
-
20
- :root {
21
- --sf-bg-color: #212529;
22
- --sf-font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', arial, 'Noto Sans', 'Liberation Sans', sans-serif, 'apple color emoji', 'Segoe UI emoji', 'Segoe UI Symbol', 'Noto color emoji';
23
- --sf-text-color: #dee2e6;
24
- --sf-tooltip-text-color: #adb5bd;
25
- --sf-layout-border-color: #495057;
26
- }
@@ -1,26 +0,0 @@
1
- @import '@syncfusion/ej2-base/styles/fluent2.css';
2
- @import '@syncfusion/ej2-buttons/styles/fluent2.css';
3
- @import '@syncfusion/ej2-inputs/styles/fluent2.css';
4
- @import '@syncfusion/ej2-dropdowns/styles/fluent2.css';
5
- @import '@syncfusion/ej2-calendars/styles/fluent2.css';
6
- @import '@syncfusion/ej2-react-calendars/styles/fluent2.css';
7
- @import '@syncfusion/ej2-navigations/styles/fluent2.css';
8
- @import '@syncfusion/ej2-notifications/styles/fluent2.css';
9
- @import '@syncfusion/ej2-popups/styles/fluent2.css';
10
- @import '@syncfusion/ej2-lists/styles/fluent2.css';
11
- @import '@syncfusion/ej2-splitbuttons/styles/fluent2.css';
12
- @import "@syncfusion/ej2-react-popups/styles/fluent2.css";
13
- @import "@syncfusion/ej2-react-grids/styles/fluent2.css";
14
- @import "@syncfusion/ej2-splitbuttons/styles/fluent2.css";
15
- @import "@syncfusion/ej2-image-editor/styles/fluent2.css";
16
- @import "@syncfusion/ej2-layouts/styles/fluent2.css";
17
- @import '@syncfusion/ej2-richtexteditor/styles/fluent2.css';
18
- @import 'form-renderer.base.css';
19
-
20
- :root {
21
- --sf-bg-color: #1f1f1f;
22
- --sf-font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif;
23
- --sf-text-color: #fff;
24
- --sf-tooltip-text-color: #d6d6d6;
25
- --sf-layout-border-color: #525252;
26
- }