@qwickapps/react-framework 1.5.13 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/components/Scaffold.d.ts +2 -2
  2. package/dist/components/Scaffold.d.ts.map +1 -1
  3. package/dist/components/forms/Captcha.d.ts +33 -28
  4. package/dist/components/forms/Captcha.d.ts.map +1 -1
  5. package/dist/components/forms/FormCheckbox.d.ts +15 -12
  6. package/dist/components/forms/FormCheckbox.d.ts.map +1 -1
  7. package/dist/components/forms/FormField.d.ts +20 -23
  8. package/dist/components/forms/FormField.d.ts.map +1 -1
  9. package/dist/components/forms/FormSelect.d.ts +16 -15
  10. package/dist/components/forms/FormSelect.d.ts.map +1 -1
  11. package/dist/contexts/QwickAppContext.d.ts +1 -1
  12. package/dist/contexts/QwickAppContext.d.ts.map +1 -1
  13. package/dist/hooks/useBaseProps.d.ts +27 -1172
  14. package/dist/hooks/useBaseProps.d.ts.map +1 -1
  15. package/dist/index.css +1 -1
  16. package/dist/index.esm.css +1 -1
  17. package/dist/index.esm.js +393 -160
  18. package/dist/index.js +393 -159
  19. package/dist/palettes/PaletteBoutique.d.ts +10 -0
  20. package/dist/palettes/PaletteBoutique.d.ts.map +1 -0
  21. package/dist/palettes/index.d.ts +1 -0
  22. package/dist/palettes/index.d.ts.map +1 -1
  23. package/dist/palettes/manifest.json +33 -19
  24. package/dist/palettes/{palette-autumn.1.5.13.css → palette-autumn.1.7.0.css} +3 -1
  25. package/dist/palettes/palette-autumn.1.7.0.min.css +1 -0
  26. package/dist/palettes/palette-autumn.latest.css +3 -1
  27. package/dist/palettes/palette-autumn.latest.min.css +1 -1
  28. package/dist/palettes/palette-boutique.1.7.0.css +176 -0
  29. package/dist/palettes/palette-boutique.1.7.0.min.css +1 -0
  30. package/dist/palettes/palette-boutique.latest.css +176 -0
  31. package/dist/palettes/palette-boutique.latest.min.css +1 -0
  32. package/dist/palettes/{palette-cosmic.1.5.13.css → palette-cosmic.1.7.0.css} +3 -1
  33. package/dist/palettes/palette-cosmic.1.7.0.min.css +1 -0
  34. package/dist/palettes/palette-cosmic.latest.css +3 -1
  35. package/dist/palettes/palette-cosmic.latest.min.css +1 -1
  36. package/dist/palettes/{palette-ocean.1.5.13.css → palette-ocean.1.7.0.css} +3 -1
  37. package/dist/palettes/palette-ocean.1.7.0.min.css +1 -0
  38. package/dist/palettes/palette-ocean.latest.css +3 -1
  39. package/dist/palettes/palette-ocean.latest.min.css +1 -1
  40. package/dist/palettes/{palette-spring.1.5.13.css → palette-spring.1.7.0.css} +3 -1
  41. package/dist/palettes/palette-spring.1.7.0.min.css +1 -0
  42. package/dist/palettes/palette-spring.latest.css +3 -1
  43. package/dist/palettes/palette-spring.latest.min.css +1 -1
  44. package/dist/palettes/{palette-winter.1.5.13.css → palette-winter.1.7.0.css} +3 -1
  45. package/dist/palettes/palette-winter.1.7.0.min.css +1 -0
  46. package/dist/palettes/palette-winter.latest.css +3 -1
  47. package/dist/palettes/palette-winter.latest.min.css +1 -1
  48. package/dist/schemas/CaptchaSchema.d.ts +16 -0
  49. package/dist/schemas/CaptchaSchema.d.ts.map +1 -0
  50. package/dist/schemas/FormCheckboxSchema.d.ts +16 -0
  51. package/dist/schemas/FormCheckboxSchema.d.ts.map +1 -0
  52. package/dist/schemas/FormFieldSchema.d.ts +23 -0
  53. package/dist/schemas/FormFieldSchema.d.ts.map +1 -0
  54. package/dist/schemas/FormSelectSchema.d.ts +20 -0
  55. package/dist/schemas/FormSelectSchema.d.ts.map +1 -0
  56. package/dist/schemas/index.d.ts +4 -0
  57. package/dist/schemas/index.d.ts.map +1 -1
  58. package/dist/schemas/transformers/ComponentTransformer.d.ts +1 -0
  59. package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -1
  60. package/package.json +2 -1
  61. package/src/components/QwickApp.css +22 -0
  62. package/src/components/Scaffold.css +5 -0
  63. package/src/components/Scaffold.tsx +5 -3
  64. package/src/components/forms/Captcha.tsx +57 -63
  65. package/src/components/forms/FormCheckbox.tsx +35 -43
  66. package/src/components/forms/FormField.tsx +50 -66
  67. package/src/components/forms/FormSelect.tsx +41 -49
  68. package/src/contexts/QwickAppContext.tsx +1 -1
  69. package/src/hooks/useBaseProps.ts +34 -1
  70. package/src/palettes/PaletteAutumn.css +3 -1
  71. package/src/palettes/PaletteBoutique.css +176 -0
  72. package/src/palettes/PaletteBoutique.ts +16 -0
  73. package/src/palettes/PaletteCosmic.css +3 -1
  74. package/src/palettes/PaletteOcean.css +3 -1
  75. package/src/palettes/PaletteSpring.css +3 -1
  76. package/src/palettes/PaletteWinter.css +3 -1
  77. package/src/palettes/index.ts +3 -0
  78. package/src/palettes/manifest.json +12 -1
  79. package/src/schemas/CaptchaSchema.ts +65 -0
  80. package/src/schemas/FormCheckboxSchema.ts +65 -0
  81. package/src/schemas/FormFieldSchema.ts +140 -0
  82. package/src/schemas/FormSelectSchema.ts +108 -0
  83. package/src/schemas/index.ts +4 -0
  84. package/src/schemas/transformers/ComponentTransformer.ts +32 -2
  85. package/dist/palettes/palette-autumn.1.5.13.min.css +0 -1
  86. package/dist/palettes/palette-cosmic.1.5.13.min.css +0 -1
  87. package/dist/palettes/palette-ocean.1.5.13.min.css +0 -1
  88. package/dist/palettes/palette-spring.1.5.13.min.css +0 -1
  89. package/dist/palettes/palette-winter.1.5.13.min.css +0 -1
  90. /package/dist/palettes/{palette-default.1.5.13.css → palette-default.1.7.0.css} +0 -0
  91. /package/dist/palettes/{palette-default.1.5.13.min.css → palette-default.1.7.0.min.css} +0 -0
@@ -61,12 +61,14 @@ html[data-palette="cosmic"][data-theme="light"] {
61
61
  --palette-error-main: #ef4444;
62
62
  --palette-error-light: #fee2e2;
63
63
  --palette-error-dark: #b91c1c;
64
+ --palette-on-error: #ffffff;
64
65
  --palette-error-border: #fecaca;
65
-
66
+
66
67
  /* Warning palette - Solar flare */
67
68
  --palette-warning-main: #f59e0b;
68
69
  --palette-warning-light: #fef3c7;
69
70
  --palette-warning-dark: #b45309;
71
+ --palette-on-warning: #000000;
70
72
  --palette-warning-border: #fde68a;
71
73
 
72
74
  /* Info palette - Cosmic blue */
@@ -61,12 +61,14 @@ html[data-palette="ocean"][data-theme="light"] {
61
61
  --palette-error-main: #ef4444;
62
62
  --palette-error-light: #fee2e2;
63
63
  --palette-error-dark: #7f1d1d;
64
+ --palette-on-error: #ffffff;
64
65
  --palette-error-border: #fecaca;
65
-
66
+
66
67
  /* Warning palette - Sandy yellow */
67
68
  --palette-warning-main: #f59e0b;
68
69
  --palette-warning-light: #fef3c7;
69
70
  --palette-warning-dark: #78350f;
71
+ --palette-on-warning: #000000;
70
72
  --palette-warning-border: #fde68a;
71
73
 
72
74
  /* Info palette - Crystal blue */
@@ -55,12 +55,14 @@ html[data-palette="spring"][data-theme="light"] {
55
55
  --palette-error-main: #f43f5e;
56
56
  --palette-error-light: #ffe4e6;
57
57
  --palette-error-dark: #881337;
58
+ --palette-on-error: #ffffff;
58
59
  --palette-error-border: #fecdd3;
59
-
60
+
60
61
  /* Warning palette - Daffodil */
61
62
  --palette-warning-main: #eab308;
62
63
  --palette-warning-light: #fefce8;
63
64
  --palette-warning-dark: #713f12;
65
+ --palette-on-warning: #000000;
64
66
  --palette-warning-border: #fef08a;
65
67
 
66
68
  /* Info palette - Sky blue */
@@ -61,12 +61,14 @@ html[data-palette="winter"][data-theme="light"] {
61
61
  --palette-error-main: #dc2626;
62
62
  --palette-error-light: #fee2e2;
63
63
  --palette-error-dark: #7f1d1d;
64
+ --palette-on-error: #ffffff;
64
65
  --palette-error-border: #fecaca;
65
-
66
+
66
67
  /* Warning palette - Amber frost */
67
68
  --palette-warning-main: #d97706;
68
69
  --palette-warning-light: #fef3c7;
69
70
  --palette-warning-dark: #92400e;
71
+ --palette-on-warning: #000000;
70
72
  --palette-warning-border: #fde68a;
71
73
 
72
74
  /* Info palette - Arctic blue */
@@ -6,6 +6,7 @@
6
6
 
7
7
  export { default as PaletteDefault } from './PaletteDefault';
8
8
  export { default as PaletteAutumn } from './PaletteAutumn';
9
+ export { default as PaletteBoutique } from './PaletteBoutique';
9
10
  export { default as PaletteOcean } from './PaletteOcean';
10
11
  export { default as PaletteSpring } from './PaletteSpring';
11
12
  export { default as PaletteWinter } from './PaletteWinter';
@@ -14,6 +15,7 @@ export { default as PaletteCosmic } from './PaletteCosmic';
14
15
  // Export all palette configs as an array
15
16
  import PaletteDefault from './PaletteDefault';
16
17
  import PaletteAutumn from './PaletteAutumn';
18
+ import PaletteBoutique from './PaletteBoutique';
17
19
  import PaletteOcean from './PaletteOcean';
18
20
  import PaletteSpring from './PaletteSpring';
19
21
  import PaletteWinter from './PaletteWinter';
@@ -21,6 +23,7 @@ import PaletteCosmic from './PaletteCosmic';
21
23
 
22
24
  export const AllPalettes = [
23
25
  PaletteDefault,
26
+ PaletteBoutique,
24
27
  PaletteOcean,
25
28
  PaletteCosmic,
26
29
  PaletteWinter,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "./manifest.schema.json",
3
- "version": "1.4.9",
3
+ "version": "1.5.14",
4
4
  "palettes": [
5
5
  {
6
6
  "id": "default",
@@ -24,6 +24,17 @@
24
24
  "primaryColor": "#ea580c",
25
25
  "inlined": false
26
26
  },
27
+ {
28
+ "id": "boutique",
29
+ "name": "Boutique",
30
+ "description": "Sophisticated teal, bronze, and navy - perfect for premium retail and fashion brands",
31
+ "author": "QwickApps",
32
+ "license": "PolyForm-Shield-1.0.0",
33
+ "version": "1.0.0",
34
+ "file": "PaletteBoutique.css",
35
+ "primaryColor": "#3ca6b6",
36
+ "inlined": false
37
+ },
27
38
  {
28
39
  "id": "cosmic",
29
40
  "name": "Cosmic",
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Schema for Captcha component - Universal CAPTCHA widget
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { IsIn, IsOptional, IsString } from 'class-validator';
8
+ import 'reflect-metadata';
9
+ import { Editor, Field, Schema, FieldType } from '@qwickapps/schema';
10
+ import ViewSchema from './ViewSchema';
11
+
12
+ @Schema('Captcha', '1.0.0')
13
+ export class CaptchaModel extends ViewSchema {
14
+ @Field()
15
+ @Editor({
16
+ field_type: FieldType.SELECT,
17
+ label: 'CAPTCHA Provider',
18
+ description: 'Which CAPTCHA service to use'
19
+ })
20
+ @IsIn(['recaptcha-v2', 'recaptcha-v3', 'hcaptcha', 'turnstile'])
21
+ provider!: 'recaptcha-v2' | 'recaptcha-v3' | 'hcaptcha' | 'turnstile';
22
+
23
+ @Field()
24
+ @Editor({
25
+ field_type: FieldType.TEXT,
26
+ label: 'Site Key',
27
+ description: 'Public site key from CAPTCHA provider',
28
+ placeholder: 'Enter site key...'
29
+ })
30
+ @IsString()
31
+ siteKey!: string;
32
+
33
+ @Field({ defaultValue: 'light' })
34
+ @Editor({
35
+ field_type: FieldType.SELECT,
36
+ label: 'Theme',
37
+ description: 'CAPTCHA widget theme'
38
+ })
39
+ @IsOptional()
40
+ @IsIn(['light', 'dark'])
41
+ theme?: 'light' | 'dark';
42
+
43
+ @Field({ defaultValue: 'normal' })
44
+ @Editor({
45
+ field_type: FieldType.SELECT,
46
+ label: 'Size',
47
+ description: 'CAPTCHA widget size'
48
+ })
49
+ @IsOptional()
50
+ @IsIn(['normal', 'compact', 'invisible'])
51
+ size?: 'normal' | 'compact' | 'invisible';
52
+
53
+ @Field({ defaultValue: 'submit' })
54
+ @Editor({
55
+ field_type: FieldType.TEXT,
56
+ label: 'Action',
57
+ description: 'reCAPTCHA v3 action name',
58
+ placeholder: 'submit'
59
+ })
60
+ @IsOptional()
61
+ @IsString()
62
+ action?: string;
63
+ }
64
+
65
+ export default CaptchaModel;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Schema for FormCheckbox component - Themed checkbox input
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { IsBoolean, IsOptional, IsString } from 'class-validator';
8
+ import 'reflect-metadata';
9
+ import { Editor, Field, Schema, FieldType } from '@qwickapps/schema';
10
+ import ViewSchema from './ViewSchema';
11
+
12
+ @Schema('FormCheckbox', '1.0.0')
13
+ export class FormCheckboxModel extends ViewSchema {
14
+ @Field()
15
+ @Editor({
16
+ field_type: FieldType.TEXT,
17
+ label: 'Label',
18
+ description: 'Label text for the checkbox',
19
+ placeholder: 'Enter label...'
20
+ })
21
+ @IsString()
22
+ label!: string;
23
+
24
+ @Field({ defaultValue: false })
25
+ @Editor({
26
+ field_type: FieldType.BOOLEAN,
27
+ label: 'Checked',
28
+ description: 'Checkbox checked state'
29
+ })
30
+ @IsBoolean()
31
+ checked!: boolean;
32
+
33
+ @Field()
34
+ @Editor({
35
+ field_type: FieldType.TEXT,
36
+ label: 'Helper Text',
37
+ description: 'Helper text displayed below the checkbox',
38
+ placeholder: 'Enter helper text...'
39
+ })
40
+ @IsOptional()
41
+ @IsString()
42
+ helperText?: string;
43
+
44
+ @Field({ defaultValue: false })
45
+ @Editor({
46
+ field_type: FieldType.BOOLEAN,
47
+ label: 'Required',
48
+ description: 'Mark checkbox as required'
49
+ })
50
+ @IsOptional()
51
+ @IsBoolean()
52
+ required?: boolean;
53
+
54
+ @Field({ defaultValue: false })
55
+ @Editor({
56
+ field_type: FieldType.BOOLEAN,
57
+ label: 'Disabled',
58
+ description: 'Disable the checkbox'
59
+ })
60
+ @IsOptional()
61
+ @IsBoolean()
62
+ disabled?: boolean;
63
+ }
64
+
65
+ export default FormCheckboxModel;
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Schema for FormField component - Themed text/number input field
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { IsBoolean, IsIn, IsInt, IsOptional, IsString, Min } from 'class-validator';
8
+ import 'reflect-metadata';
9
+ import { Editor, Field, Schema, FieldType } from '@qwickapps/schema';
10
+ import ViewSchema from './ViewSchema';
11
+
12
+ @Schema('FormField', '1.0.0')
13
+ export class FormFieldModel extends ViewSchema {
14
+ @Field()
15
+ @Editor({
16
+ field_type: FieldType.TEXT,
17
+ label: 'Label',
18
+ description: 'Label text for the input field',
19
+ placeholder: 'Enter label...'
20
+ })
21
+ @IsString()
22
+ label!: string;
23
+
24
+ @Field()
25
+ @Editor({
26
+ field_type: FieldType.TEXT,
27
+ label: 'Value',
28
+ description: 'Current input value',
29
+ placeholder: ''
30
+ })
31
+ @IsString()
32
+ value!: string | number;
33
+
34
+ @Field({ defaultValue: 'text' })
35
+ @Editor({
36
+ field_type: FieldType.SELECT,
37
+ label: 'Input Type',
38
+ description: 'Type of input field'
39
+ })
40
+ @IsOptional()
41
+ @IsIn(['text', 'number', 'password', 'email', 'tel'])
42
+ type?: 'text' | 'number' | 'password' | 'email' | 'tel';
43
+
44
+ @Field()
45
+ @Editor({
46
+ field_type: FieldType.TEXT,
47
+ label: 'Helper Text',
48
+ description: 'Helper text displayed below the input',
49
+ placeholder: 'Enter helper text...'
50
+ })
51
+ @IsOptional()
52
+ @IsString()
53
+ helperText?: string;
54
+
55
+ @Field({ defaultValue: false })
56
+ @Editor({
57
+ field_type: FieldType.BOOLEAN,
58
+ label: 'Required',
59
+ description: 'Mark field as required'
60
+ })
61
+ @IsOptional()
62
+ @IsBoolean()
63
+ required?: boolean;
64
+
65
+ @Field({ defaultValue: false })
66
+ @Editor({
67
+ field_type: FieldType.BOOLEAN,
68
+ label: 'Read Only',
69
+ description: 'Make field read-only'
70
+ })
71
+ @IsOptional()
72
+ @IsBoolean()
73
+ readOnly?: boolean;
74
+
75
+ @Field({ defaultValue: false })
76
+ @Editor({
77
+ field_type: FieldType.BOOLEAN,
78
+ label: 'Disabled',
79
+ description: 'Disable the input field'
80
+ })
81
+ @IsOptional()
82
+ @IsBoolean()
83
+ disabled?: boolean;
84
+
85
+ @Field()
86
+ @Editor({
87
+ field_type: FieldType.TEXT,
88
+ label: 'Disabled Color',
89
+ description: 'Custom color for disabled state (CSS color value)',
90
+ placeholder: 'var(--theme-text-disabled)'
91
+ })
92
+ @IsOptional()
93
+ @IsString()
94
+ disabledColor?: string;
95
+
96
+ @Field({ defaultValue: true })
97
+ @Editor({
98
+ field_type: FieldType.BOOLEAN,
99
+ label: 'Full Width',
100
+ description: 'Make input take full width of container'
101
+ })
102
+ @IsOptional()
103
+ @IsBoolean()
104
+ fullWidth?: boolean;
105
+
106
+ @Field({ defaultValue: false })
107
+ @Editor({
108
+ field_type: FieldType.BOOLEAN,
109
+ label: 'Multiline',
110
+ description: 'Enable multiline textarea mode'
111
+ })
112
+ @IsOptional()
113
+ @IsBoolean()
114
+ multiline?: boolean;
115
+
116
+ @Field()
117
+ @Editor({
118
+ field_type: FieldType.TEXT,
119
+ label: 'Rows',
120
+ description: 'Number of rows for multiline textarea',
121
+ placeholder: '4'
122
+ })
123
+ @IsOptional()
124
+ @IsInt()
125
+ @Min(1)
126
+ rows?: number;
127
+
128
+ @Field()
129
+ @Editor({
130
+ field_type: FieldType.TEXT,
131
+ label: 'Placeholder',
132
+ description: 'Placeholder text',
133
+ placeholder: 'Enter text...'
134
+ })
135
+ @IsOptional()
136
+ @IsString()
137
+ placeholder?: string;
138
+ }
139
+
140
+ export default FormFieldModel;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Schema for FormSelect component - Themed dropdown select input
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import { IsBoolean, IsIn, IsOptional, IsString } from 'class-validator';
8
+ import 'reflect-metadata';
9
+ import { Editor, Field, Schema, FieldType } from '@qwickapps/schema';
10
+ import ViewSchema from './ViewSchema';
11
+
12
+ @Schema('FormSelect', '1.0.0')
13
+ export class FormSelectModel extends ViewSchema {
14
+ @Field()
15
+ @Editor({
16
+ field_type: FieldType.TEXT,
17
+ label: 'Label',
18
+ description: 'Label text for the select field',
19
+ placeholder: 'Enter label...'
20
+ })
21
+ @IsOptional()
22
+ @IsString()
23
+ label?: string;
24
+
25
+ @Field()
26
+ @Editor({
27
+ field_type: FieldType.TEXT,
28
+ label: 'Value',
29
+ description: 'Current selected value',
30
+ placeholder: ''
31
+ })
32
+ @IsString()
33
+ value!: string | number;
34
+
35
+ @Field()
36
+ @Editor({
37
+ field_type: FieldType.TEXTAREA,
38
+ label: 'Options',
39
+ description: 'Select options as JSON array: [{"value": "1", "label": "Option 1"}]',
40
+ placeholder: '[{"value": "1", "label": "Option 1"}]'
41
+ })
42
+ @IsString()
43
+ options!: string; // JSON string of FormSelectOption[]
44
+
45
+ @Field()
46
+ @Editor({
47
+ field_type: FieldType.TEXT,
48
+ label: 'Helper Text',
49
+ description: 'Helper text displayed below the select',
50
+ placeholder: 'Enter helper text...'
51
+ })
52
+ @IsOptional()
53
+ @IsString()
54
+ helperText?: string;
55
+
56
+ @Field({ defaultValue: false })
57
+ @Editor({
58
+ field_type: FieldType.BOOLEAN,
59
+ label: 'Required',
60
+ description: 'Mark field as required'
61
+ })
62
+ @IsOptional()
63
+ @IsBoolean()
64
+ required?: boolean;
65
+
66
+ @Field({ defaultValue: false })
67
+ @Editor({
68
+ field_type: FieldType.BOOLEAN,
69
+ label: 'Disabled',
70
+ description: 'Disable the select field'
71
+ })
72
+ @IsOptional()
73
+ @IsBoolean()
74
+ disabled?: boolean;
75
+
76
+ @Field({ defaultValue: true })
77
+ @Editor({
78
+ field_type: FieldType.BOOLEAN,
79
+ label: 'Full Width',
80
+ description: 'Make select take full width of container'
81
+ })
82
+ @IsOptional()
83
+ @IsBoolean()
84
+ fullWidth?: boolean;
85
+
86
+ @Field({ defaultValue: 'small' })
87
+ @Editor({
88
+ field_type: FieldType.SELECT,
89
+ label: 'Size',
90
+ description: 'Size variant of the select field'
91
+ })
92
+ @IsOptional()
93
+ @IsIn(['small', 'medium'])
94
+ size?: 'small' | 'medium';
95
+
96
+ @Field()
97
+ @Editor({
98
+ field_type: FieldType.TEXT,
99
+ label: 'Placeholder',
100
+ description: 'Placeholder text when no value is selected',
101
+ placeholder: 'Select an option...'
102
+ })
103
+ @IsOptional()
104
+ @IsString()
105
+ placeholder?: string;
106
+ }
107
+
108
+ export default FormSelectModel;
@@ -28,6 +28,10 @@ export * from './FeatureGridSchema';
28
28
  export * from './FeatureItemSchema';
29
29
  export * from './FooterItemSchema';
30
30
  export * from './FormBlockSchema';
31
+ export * from './FormSelectSchema';
32
+ export * from './FormFieldSchema';
33
+ export * from './FormCheckboxSchema';
34
+ export * from './CaptchaSchema';
31
35
  export * from './FooterSchema';
32
36
  export * from './FooterSectionSchema';
33
37
  export * from './GridCellSchema';
@@ -14,6 +14,19 @@ import { SerializableConstructor } from '../types/Serializable';
14
14
  import { ReactNodeTransformer } from './ReactNodeTransformer';
15
15
  import SafeSpan from '../../components/SafeSpan';
16
16
 
17
+ // Import linkedom for server-side HTML parsing
18
+ let parseHTML: ((html: string) => Document) | null = null;
19
+ if (typeof window === 'undefined') {
20
+ // Server-side: use linkedom
21
+ try {
22
+ const { parseHTML: parse } = require('linkedom');
23
+ parseHTML = (html: string) => parse(html).document;
24
+ } catch (e) {
25
+ // linkedom not available, will fall back to client-only rendering
26
+ console.warn('linkedom not available for SSR HTML parsing');
27
+ }
28
+ }
29
+
17
30
  /**
18
31
  * Registry for component classes that support serialization
19
32
  */
@@ -370,13 +383,30 @@ export class ComponentTransformer {
370
383
 
371
384
  /**
372
385
  * Transform HTML string to React nodes using registered patterns
386
+ * Supports both server-side (linkedom) and client-side (DOMParser) rendering
373
387
  * @param html - HTML string to transform
374
388
  * @returns Array of React nodes
375
389
  */
376
390
  static transformHTML(html: string): ReactNode[] {
377
391
  if (!html.trim()) return [];
378
- const parser = new DOMParser();
379
- const doc = parser.parseFromString(html, 'text/html');
392
+
393
+ let doc: Document;
394
+
395
+ // Server-side: use linkedom if available
396
+ if (typeof window === 'undefined') {
397
+ if (parseHTML) {
398
+ doc = parseHTML(html);
399
+ } else {
400
+ // linkedom not available, return empty for client-side rendering
401
+ console.warn('SSR HTML parsing unavailable - content will render client-side only');
402
+ return [];
403
+ }
404
+ } else {
405
+ // Client-side: use DOMParser
406
+ const parser = new DOMParser();
407
+ doc = parser.parseFromString(html, 'text/html');
408
+ }
409
+
380
410
  return Array.from(doc.body.children).map((element, index) =>
381
411
  ComponentTransformer.transformElement(element, `element-${index}`)
382
412
  );
@@ -1 +0,0 @@
1
- html[data-palette="autumn"]:not([data-theme="dark"]),html[data-palette="autumn"][data-theme="light"]{--palette-primary-main:#ea580c;--palette-primary-light:#fb923c;--palette-primary-dark:#c2410c;--palette-on-primary:#ffffff;--palette-secondary-main:#b45309;--palette-secondary-light:#d97706;--palette-secondary-dark:#92400e;--palette-on-secondary:#ffffff;--palette-surface-main:#fffbeb;--palette-surface-variant:#fef3c7;--palette-surface-elevated:#ffffff;--palette-on-surface:#451a03;--palette-background-main:#fefce8;--palette-background-dark:#fef3c7;--palette-background-overlay:rgba(254,252,232,0.95);--palette-on-background:#78350f;--palette-header-bg-start:rgba(254,252,232,0.98);--palette-header-bg-end:rgba(254,252,232,0.95);--palette-header-collapsed-bg-start:rgba(254,252,232,0.99);--palette-header-collapsed-bg-end:rgba(254,252,232,0.96);--palette-text-primary:#451a03;--palette-text-secondary:#78350f;--palette-text-disabled:rgba(69,26,3,0.38);--palette-text-inverted:#ffffff;--palette-border-main:#d4d4aa;--palette-border-light:rgba(69,26,3,0.12);--palette-border-lighter:rgba(69,26,3,0.05);--palette-border-medium:#a8a29e;--palette-success-main:#16a34a;--palette-success-light:#dcfce7;--palette-success-dark:#14532d;--palette-success-border:#bbf7d0;--palette-error-main:#dc2626;--palette-error-light:#fee2e2;--palette-error-dark:#7f1d1d;--palette-error-border:#fecaca;--palette-warning-main:#f59e0b;--palette-warning-light:#fef3c7;--palette-warning-dark:#78350f;--palette-warning-border:#fde68a;--palette-info-main:#0891b2;--palette-info-light:#e6fffa;--palette-info-dark:#164e63;--palette-on-info:#ffffff;--palette-info-border:#67e8f9;--palette-accent-main:#dc2626;--palette-accent-light:#f87171;--palette-accent-dark:#991b1b;--palette-on-accent:#ffffff;--palette-control-main:#451a03;--palette-control-light:#78350f;--palette-control-text:#fef3c7;--palette-control-border:#92400e}html[data-palette="autumn"][data-theme="dark"]{--palette-primary-main:#fb923c;--palette-primary-light:#fdba74;--palette-primary-dark:#ea580c;--palette-on-primary:#1c1917;--palette-secondary-main:#fbbf24;--palette-secondary-light:#fcd34d;--palette-secondary-dark:#f59e0b;--palette-on-secondary:#1c1917;--palette-surface-main:#231f1d;--palette-surface-variant:#302a27;--palette-surface-elevated:#44403c;--palette-on-surface:#fef3c7;--palette-background-main:#0a0807;--palette-background-dark:#151210;--palette-background-overlay:rgba(28,25,23,0.95);--palette-on-background:#d6d3d1;--palette-header-bg-start:rgba(10,8,7,0.98);--palette-header-bg-end:rgba(10,8,7,0.95);--palette-header-collapsed-bg-start:rgba(10,8,7,0.99);--palette-header-collapsed-bg-end:rgba(10,8,7,0.96);--palette-text-primary:#fef3c7;--palette-text-secondary:#d6d3d1;--palette-text-disabled:rgba(254,243,199,0.38);--palette-text-inverted:#0c0a09;--palette-border-main:#78716c;--palette-border-light:rgba(254,243,199,0.12);--palette-border-lighter:rgba(254,243,199,0.05);--palette-border-medium:#57534e;--palette-success-main:#4ade80;--palette-success-light:#14532d;--palette-success-dark:#22c55e;--palette-success-border:#166534;--palette-error-main:#f87171;--palette-error-light:#7f1d1d;--palette-error-dark:#ef4444;--palette-error-border:#991b1b;--palette-warning-main:#eab308;--palette-warning-light:#78350f;--palette-warning-dark:#ca8a04;--palette-warning-border:#a16207;--palette-info-main:#22d3ee;--palette-info-light:#164e63;--palette-info-dark:#06b6d4;--palette-on-info:#0c0a09;--palette-info-border:#0891b2;--palette-accent-main:#b91c1c;--palette-accent-light:#dc2626;--palette-accent-dark:#7f1d1d;--palette-on-accent:#fef3c7;--palette-control-main:#292524;--palette-control-light:#44403c;--palette-control-text:#f5f5f4;--palette-control-border:#57534e}
@@ -1 +0,0 @@
1
- html[data-palette="cosmic"]:not([data-theme="dark"]),html[data-palette="cosmic"][data-theme="light"]{--palette-primary-main:#8b5cf6;--palette-primary-light:#a78bfa;--palette-primary-dark:#7c3aed;--palette-on-primary:#ffffff;--palette-secondary-main:#8b5cf6;--palette-secondary-light:#c4b5fd;--palette-secondary-dark:#6d28d9;--palette-on-secondary:#ffffff;--palette-surface-main:#faf7ff;--palette-surface-variant:#f3e8ff;--palette-surface-elevated:#ffffff;--palette-on-surface:#4c1d95;--palette-background-main:#fef7ff;--palette-background-dark:#fae8ff;--palette-background-overlay:rgba(254,247,255,0.95);--palette-on-background:#6b21a8;--palette-header-bg-start:rgba(254,247,255,0.98);--palette-header-bg-end:rgba(254,247,255,0.95);--palette-header-collapsed-bg-start:rgba(254,247,255,0.99);--palette-header-collapsed-bg-end:rgba(254,247,255,0.96);--palette-text-primary:#4c1d95;--palette-text-secondary:#7c3aed;--palette-text-disabled:rgba(76,29,149,0.38);--palette-text-inverted:#ffffff;--palette-border-main:#c4b5fd;--palette-border-light:rgba(76,29,149,0.12);--palette-border-lighter:rgba(76,29,149,0.05);--palette-border-medium:#a78bfa;--palette-success-main:#10b981;--palette-success-light:#d1fae5;--palette-success-dark:#047857;--palette-success-border:#6ee7b7;--palette-error-main:#ef4444;--palette-error-light:#fee2e2;--palette-error-dark:#b91c1c;--palette-error-border:#fecaca;--palette-warning-main:#f59e0b;--palette-warning-light:#fef3c7;--palette-warning-dark:#b45309;--palette-warning-border:#fde68a;--palette-info-main:#3b82f6;--palette-info-light:#dbeafe;--palette-info-dark:#1d4ed8;--palette-on-info:#ffffff;--palette-info-border:#93c5fd;--palette-accent-main:#ec4899;--palette-accent-light:#f472b6;--palette-accent-dark:#be185d;--palette-on-accent:#ffffff;--palette-control-main:#1e1b4b;--palette-control-light:#3730a3;--palette-control-text:#e0e7ff;--palette-control-border:#8b5cf6}html[data-palette="cosmic"][data-theme="dark"]{--palette-primary-main:#a78bfa;--palette-primary-light:#c4b5fd;--palette-primary-dark:#8b5cf6;--palette-on-primary:#1e1b4b;--palette-secondary-main:#c4b5fd;--palette-secondary-light:#ddd6fe;--palette-secondary-dark:#a78bfa;--palette-on-secondary:#1e1b4b;--palette-surface-main:#252059;--palette-surface-variant:#312e81;--palette-surface-elevated:#3730a3;--palette-on-surface:#e0e7ff;--palette-background-main:#0a0818;--palette-background-dark:#12101f;--palette-background-overlay:rgba(10,8,24,0.95);--palette-on-background:#c4b5fd;--palette-header-bg-start:rgba(10,8,24,0.98);--palette-header-bg-end:rgba(10,8,24,0.95);--palette-header-collapsed-bg-start:rgba(10,8,24,0.99);--palette-header-collapsed-bg-end:rgba(10,8,24,0.96);--palette-text-primary:#e0e7ff;--palette-text-secondary:#c4b5fd;--palette-text-disabled:rgba(224,231,255,0.38);--palette-text-inverted:#0f0c29;--palette-border-main:#4338ca;--palette-border-light:rgba(224,231,255,0.12);--palette-border-lighter:rgba(224,231,255,0.05);--palette-border-medium:#312e81;--palette-success-main:#34d399;--palette-success-light:#047857;--palette-success-dark:#10b981;--palette-success-border:#065f46;--palette-error-main:#f87171;--palette-error-light:#b91c1c;--palette-error-dark:#ef4444;--palette-error-border:#991b1b;--palette-warning-main:#fb7185;--palette-warning-light:#881337;--palette-warning-dark:#e11d48;--palette-warning-border:#be123c;--palette-info-main:#60a5fa;--palette-info-light:#1d4ed8;--palette-info-dark:#3b82f6;--palette-on-info:#0f0c29;--palette-info-border:#2563eb;--palette-accent-main:#f472b6;--palette-accent-light:#f9a8d4;--palette-accent-dark:#ec4899;--palette-on-accent:#0f0c29;--palette-control-main:#312e81;--palette-control-light:#4338ca;--palette-control-text:#f3f4f6;--palette-control-border:#4338ca}
@@ -1 +0,0 @@
1
- html[data-palette="ocean"]:not([data-theme="dark"]),html[data-palette="ocean"][data-theme="light"]{--palette-primary-main:#0891b2;--palette-primary-light:#22d3ee;--palette-primary-dark:#164e63;--palette-on-primary:#ffffff;--palette-secondary-main:#0f766e;--palette-secondary-light:#14b8a6;--palette-secondary-dark:#134e4a;--palette-on-secondary:#ffffff;--palette-surface-main:#f0fdfa;--palette-surface-variant:#ccfbf1;--palette-surface-elevated:#ffffff;--palette-on-surface:#164e63;--palette-background-main:#ecfeff;--palette-background-dark:#cffafe;--palette-background-overlay:rgba(236,254,255,0.95);--palette-on-background:#0f766e;--palette-header-bg-start:rgba(236,254,255,0.98);--palette-header-bg-end:rgba(236,254,255,0.95);--palette-header-collapsed-bg-start:rgba(236,254,255,0.99);--palette-header-collapsed-bg-end:rgba(236,254,255,0.96);--palette-text-primary:#164e63;--palette-text-secondary:#0891b2;--palette-text-disabled:rgba(22,78,99,0.38);--palette-text-inverted:#ffffff;--palette-border-main:#a7f3d0;--palette-border-light:rgba(22,78,99,0.12);--palette-border-lighter:rgba(22,78,99,0.05);--palette-border-medium:#67e8f9;--palette-success-main:#059669;--palette-success-light:#d1fae5;--palette-success-dark:#065f46;--palette-success-border:#a7f3d0;--palette-error-main:#ef4444;--palette-error-light:#fee2e2;--palette-error-dark:#7f1d1d;--palette-error-border:#fecaca;--palette-warning-main:#f59e0b;--palette-warning-light:#fef3c7;--palette-warning-dark:#78350f;--palette-warning-border:#fde68a;--palette-info-main:#0ea5e9;--palette-info-light:#e0f2fe;--palette-info-dark:#0c4a6e;--palette-on-info:#ffffff;--palette-info-border:#7dd3fc;--palette-accent-main:#f97316;--palette-accent-light:#fb923c;--palette-accent-dark:#ea580c;--palette-on-accent:#ffffff;--palette-control-main:#0c4a6e;--palette-control-light:#075985;--palette-control-text:#cffafe;--palette-control-border:#0891b2}html[data-palette="ocean"][data-theme="dark"]{--palette-primary-main:#22d3ee;--palette-primary-light:#67e8f9;--palette-primary-dark:#0891b2;--palette-on-primary:#0a1a1f;--palette-secondary-main:#5eead4;--palette-secondary-light:#99f6e4;--palette-secondary-dark:#14b8a6;--palette-on-secondary:#0a1a1f;--palette-surface-main:#122830;--palette-surface-variant:#1a3a45;--palette-surface-elevated:#0e7490;--palette-on-surface:#cffafe;--palette-background-main:#040a0d;--palette-background-dark:#0a1418;--palette-background-overlay:rgba(10,26,31,0.95);--palette-on-background:#5eead4;--palette-header-bg-start:rgba(4,10,13,0.98);--palette-header-bg-end:rgba(4,10,13,0.95);--palette-header-collapsed-bg-start:rgba(4,10,13,0.99);--palette-header-collapsed-bg-end:rgba(4,10,13,0.96);--palette-text-primary:#cffafe;--palette-text-secondary:#a5f3fc;--palette-text-disabled:rgba(207,250,254,0.38);--palette-text-inverted:#020617;--palette-border-main:#155e75;--palette-border-light:rgba(207,250,254,0.12);--palette-border-lighter:rgba(207,250,254,0.05);--palette-border-medium:#0c4a6e;--palette-success-main:#34d399;--palette-success-light:#065f46;--palette-success-dark:#10b981;--palette-success-border:#047857;--palette-error-main:#f87171;--palette-error-light:#7f1d1d;--palette-error-dark:#ef4444;--palette-error-border:#991b1b;--palette-warning-main:#fb7185;--palette-warning-light:#881337;--palette-warning-dark:#e11d48;--palette-warning-border:#be123c;--palette-info-main:#0ea5e9;--palette-info-light:#0c4a6e;--palette-info-dark:#38bdf8;--palette-on-info:#020617;--palette-info-border:#0284c7;--palette-accent-main:#ea580c;--palette-accent-light:#fb923c;--palette-accent-dark:#c2410c;--palette-on-accent:#cffafe;--palette-control-main:#164e63;--palette-control-light:#0e7490;--palette-control-text:#ecfeff;--palette-control-border:#155e75}
@@ -1 +0,0 @@
1
- html[data-palette="spring"]:not([data-theme="dark"]),html[data-palette="spring"][data-theme="light"]{--palette-primary-main:#16a34a;--palette-primary-light:#4ade80;--palette-primary-dark:#15803d;--palette-on-primary:#ffffff;--palette-secondary-main:#ec4899;--palette-secondary-light:#f472b6;--palette-secondary-dark:#be185d;--palette-on-secondary:#ffffff;--palette-surface-main:#f7fee7;--palette-surface-variant:#d9f7be;--palette-surface-elevated:#ffffff;--palette-on-surface:#14532d;--palette-background-main:#f0fdf4;--palette-background-dark:#dcfce7;--palette-background-overlay:rgba(240,253,244,0.95);--palette-on-background:#166534;--palette-text-primary:#14532d;--palette-text-secondary:#166534;--palette-text-disabled:rgba(20,83,45,0.38);--palette-text-inverted:#ffffff;--palette-border-main:#bbf7d0;--palette-border-light:rgba(20,83,45,0.12);--palette-border-lighter:rgba(20,83,45,0.05);--palette-border-medium:#86efac;--palette-success-main:#22c55e;--palette-success-light:#dcfce7;--palette-success-dark:#15803d;--palette-success-border:#bbf7d0;--palette-error-main:#f43f5e;--palette-error-light:#ffe4e6;--palette-error-dark:#881337;--palette-error-border:#fecdd3;--palette-warning-main:#eab308;--palette-warning-light:#fefce8;--palette-warning-dark:#713f12;--palette-warning-border:#fef08a;--palette-info-main:#0ea5e9;--palette-info-light:#e0f2fe;--palette-info-dark:#0c4a6e;--palette-on-info:#14532d;--palette-info-border:#7dd3fc;--palette-accent-main:#ec4899;--palette-accent-light:#fce7f3;--palette-accent-dark:#be185d;--palette-on-accent:#ffffff;--palette-control-main:#365314;--palette-control-light:#4d7c0f;--palette-control-text:#ecfdf5;--palette-control-border:#65a30d}html[data-palette="spring"][data-theme="dark"]{--palette-primary-main:#4ade80;--palette-primary-light:#86efac;--palette-primary-dark:#16a34a;--palette-on-primary:#0f1f0f;--palette-secondary-main:#f472b6;--palette-secondary-light:#f9a8d4;--palette-secondary-dark:#ec4899;--palette-on-secondary:#0f1f0f;--palette-surface-main:#162816;--palette-surface-variant:#1f351f;--palette-surface-elevated:#2d4a2d;--palette-on-surface:#dcfce7;--palette-background-main:#060b06;--palette-background-dark:#0c140c;--palette-background-overlay:rgba(6,11,6,0.95);--palette-on-background:#bbf7d0;--palette-header-bg-start:rgba(6,11,6,0.98);--palette-header-bg-end:rgba(6,11,6,0.95);--palette-header-collapsed-bg-start:rgba(6,11,6,0.99);--palette-header-collapsed-bg-end:rgba(6,11,6,0.96);--palette-text-primary:#dcfce7;--palette-text-secondary:#bbf7d0;--palette-text-disabled:rgba(220,252,231,0.38);--palette-text-inverted:#0a120a;--palette-border-main:#166534;--palette-border-light:rgba(220,252,231,0.12);--palette-border-lighter:rgba(220,252,231,0.05);--palette-border-medium:#14532d;--palette-success-main:#22c55e;--palette-success-light:#14532d;--palette-success-dark:#4ade80;--palette-success-border:#166534;--palette-error-main:#f472b6;--palette-error-light:#881337;--palette-error-dark:#ec4899;--palette-error-border:#be185d;--palette-warning-main:#facc15;--palette-warning-light:#713f12;--palette-warning-dark:#eab308;--palette-warning-border:#a16207;--palette-info-main:#06b6d4;--palette-info-light:#164e63;--palette-info-dark:#22d3ee;--palette-on-info:#0a120a;--palette-info-border:#0891b2;--palette-accent-main:#f472b6;--palette-accent-light:#fce7f3;--palette-accent-dark:#db2777;--palette-on-accent:#dcfce7;--palette-control-main:#1a2e1a;--palette-control-light:#2d4a2d;--palette-control-text:#dcfce7;--palette-control-border:#166534}
@@ -1 +0,0 @@
1
- html[data-palette="winter"]:not([data-theme="dark"]),html[data-palette="winter"][data-theme="light"]{--palette-primary-main:#0077be;--palette-primary-light:#5ba3d0;--palette-primary-dark:#005082;--palette-on-primary:#ffffff;--palette-secondary-main:#4682b4;--palette-secondary-light:#7ba7cc;--palette-secondary-dark:#2e5984;--palette-on-secondary:#ffffff;--palette-surface-main:#fafbfc;--palette-surface-variant:#e2e8f0;--palette-surface-elevated:#ffffff;--palette-on-surface:#0f172a;--palette-background-main:#f8fafc;--palette-background-dark:#f1f5f9;--palette-background-overlay:rgba(248,250,252,0.95);--palette-on-background:#475569;--palette-header-bg-start:rgba(248,250,252,0.98);--palette-header-bg-end:rgba(248,250,252,0.95);--palette-header-collapsed-bg-start:rgba(248,250,252,0.99);--palette-header-collapsed-bg-end:rgba(248,250,252,0.96);--palette-text-primary:#0f172a;--palette-text-secondary:#475569;--palette-text-disabled:rgba(15,23,42,0.38);--palette-text-inverted:#ffffff;--palette-border-main:#cbd5e1;--palette-border-light:rgba(15,23,42,0.12);--palette-border-lighter:rgba(15,23,42,0.05);--palette-border-medium:#94a3b8;--palette-success-main:#059669;--palette-success-light:#d1fae5;--palette-success-dark:#064e3b;--palette-success-border:#a7f3d0;--palette-error-main:#dc2626;--palette-error-light:#fee2e2;--palette-error-dark:#7f1d1d;--palette-error-border:#fecaca;--palette-warning-main:#d97706;--palette-warning-light:#fef3c7;--palette-warning-dark:#92400e;--palette-warning-border:#fde68a;--palette-info-main:#0284c7;--palette-info-light:#e0f2fe;--palette-info-dark:#0c4a6e;--palette-on-info:#ffffff;--palette-info-border:#7dd3fc;--palette-accent-main:#ec4899;--palette-accent-light:#fce7f3;--palette-accent-dark:#be185d;--palette-on-accent:#ffffff;--palette-control-main:#1e293b;--palette-control-light:#334155;--palette-control-text:#e2e8f0;--palette-control-border:#475569}html[data-palette="winter"][data-theme="dark"]{--palette-primary-main:#7dd3fc;--palette-primary-light:#bae6fd;--palette-primary-dark:#0369a1;--palette-on-primary:#020617;--palette-secondary-main:#94a3b8;--palette-secondary-light:#cbd5e1;--palette-secondary-dark:#64748b;--palette-on-secondary:#020617;--palette-surface-main:#172033;--palette-surface-variant:#1e293b;--palette-surface-elevated:#334155;--palette-on-surface:#f8fafc;--palette-background-main:#04080f;--palette-background-dark:#0a1018;--palette-background-overlay:rgba(15,23,42,0.95);--palette-on-background:#cbd5e1;--palette-header-bg-start:rgba(4,8,15,0.98);--palette-header-bg-end:rgba(4,8,15,0.95);--palette-header-collapsed-bg-start:rgba(4,8,15,0.99);--palette-header-collapsed-bg-end:rgba(4,8,15,0.96);--palette-text-primary:#f8fafc;--palette-text-secondary:#cbd5e1;--palette-text-disabled:rgba(248,250,252,0.38);--palette-text-inverted:#020617;--palette-border-main:#475569;--palette-border-light:rgba(248,250,252,0.12);--palette-border-lighter:rgba(248,250,252,0.05);--palette-border-medium:#334155;--palette-success-main:#34d399;--palette-success-light:#064e3b;--palette-success-dark:#10b981;--palette-success-border:#065f46;--palette-error-main:#f87171;--palette-error-light:#7f1d1d;--palette-error-dark:#ef4444;--palette-error-border:#991b1b;--palette-warning-main:#fb923c;--palette-warning-light:#9a3412;--palette-warning-dark:#f97316;--palette-warning-border:#c2410c;--palette-info-main:#38bdf8;--palette-info-light:#0c4a6e;--palette-info-dark:#0ea5e9;--palette-on-info:#020617;--palette-info-border:#0284c7;--palette-accent-main:#f472b6;--palette-accent-light:#fce7f3;--palette-accent-dark:#db2777;--palette-on-accent:#f8fafc;--palette-control-main:#1e293b;--palette-control-light:#334155;--palette-control-text:#e2e8f0;--palette-control-border:#475569}