@qwickapps/react-framework 1.3.3 → 1.3.5

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 (43) hide show
  1. package/README.md +227 -0
  2. package/dist/components/blocks/Content.d.ts.map +1 -1
  3. package/dist/components/blocks/ProductCard.d.ts.map +1 -1
  4. package/dist/components/forms/FormBlock.d.ts +1 -1
  5. package/dist/components/forms/FormBlock.d.ts.map +1 -1
  6. package/dist/components/input/SwitchInputField.d.ts +28 -0
  7. package/dist/components/input/SwitchInputField.d.ts.map +1 -0
  8. package/dist/components/input/index.d.ts +2 -0
  9. package/dist/components/input/index.d.ts.map +1 -1
  10. package/dist/components/layout/CollapsibleLayout/CollapsibleLayout.d.ts +34 -0
  11. package/dist/components/layout/CollapsibleLayout/CollapsibleLayout.d.ts.map +1 -0
  12. package/dist/components/layout/CollapsibleLayout/index.d.ts +9 -0
  13. package/dist/components/layout/CollapsibleLayout/index.d.ts.map +1 -0
  14. package/dist/components/layout/index.d.ts +2 -0
  15. package/dist/components/layout/index.d.ts.map +1 -1
  16. package/dist/contexts/ThemeContext.d.ts.map +1 -1
  17. package/dist/index.esm.js +963 -105
  18. package/dist/index.js +967 -101
  19. package/dist/schemas/CollapsibleLayoutSchema.d.ts +31 -0
  20. package/dist/schemas/CollapsibleLayoutSchema.d.ts.map +1 -0
  21. package/dist/schemas/SwitchInputFieldSchema.d.ts +18 -0
  22. package/dist/schemas/SwitchInputFieldSchema.d.ts.map +1 -0
  23. package/dist/types/CollapsibleLayout.d.ts +142 -0
  24. package/dist/types/CollapsibleLayout.d.ts.map +1 -0
  25. package/dist/types/index.d.ts +1 -0
  26. package/dist/types/index.d.ts.map +1 -1
  27. package/package.json +1 -1
  28. package/src/components/blocks/Content.tsx +25 -77
  29. package/src/components/blocks/ProductCard.tsx +50 -51
  30. package/src/components/forms/FormBlock.tsx +2 -2
  31. package/src/components/input/SwitchInputField.tsx +165 -0
  32. package/src/components/input/index.ts +2 -0
  33. package/src/components/layout/CollapsibleLayout/CollapsibleLayout.tsx +554 -0
  34. package/src/components/layout/CollapsibleLayout/__tests__/CollapsibleLayout.test.tsx +1469 -0
  35. package/src/components/layout/CollapsibleLayout/index.tsx +17 -0
  36. package/src/components/layout/index.ts +4 -1
  37. package/src/components/pages/FormPage.tsx +1 -1
  38. package/src/contexts/ThemeContext.tsx +1 -2
  39. package/src/schemas/CollapsibleLayoutSchema.ts +276 -0
  40. package/src/schemas/SwitchInputFieldSchema.ts +99 -0
  41. package/src/stories/CollapsibleLayout.stories.tsx +1566 -0
  42. package/src/types/CollapsibleLayout.ts +231 -0
  43. package/src/types/index.ts +1 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CollapsibleLayout Component Exports
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ export { default } from './CollapsibleLayout';
8
+ export {
9
+ CollapsibleLayout,
10
+ CollapsibleLayoutView,
11
+ useCollapsibleState,
12
+ } from './CollapsibleLayout';
13
+ export type {
14
+ CollapsibleLayoutProps,
15
+ CollapsibleLayoutViewProps,
16
+ UseCollapsibleLayoutState,
17
+ } from './CollapsibleLayout';
@@ -10,4 +10,7 @@ export { GridLayout } from './GridLayout';
10
10
  export type { GridLayoutProps } from './GridLayout';
11
11
 
12
12
  export { GridCell } from './GridCell';
13
- export type { GridCellProps } from './GridCell';
13
+ export type { GridCellProps } from './GridCell';
14
+
15
+ export { CollapsibleLayout, CollapsibleLayoutView, useCollapsibleState } from './CollapsibleLayout';
16
+ export type { CollapsibleLayoutProps, CollapsibleLayoutViewProps, UseCollapsibleLayoutState } from './CollapsibleLayout';
@@ -93,7 +93,7 @@ export const FormPage: React.FC<FormPageProps> = ({
93
93
  title={title}
94
94
  description={description}
95
95
  coverImage={coverImage}
96
- form={form}
96
+ children={form}
97
97
  footer={footer}
98
98
  status={status}
99
99
  message={message}
@@ -302,8 +302,7 @@ export const ThemeProvider: React.FC<ThemeProviderProps> = ({
302
302
  },
303
303
  },
304
304
  },
305
- });
306
- // eslint-disable-next-line react-hooks/exhaustive-deps
305
+ });
307
306
  }, [actualThemeMode, paletteChangeCounter]); // paletteChangeCounter is needed to force theme rebuild // Re-create theme when palette changes
308
307
 
309
308
  // Theme preference management methods
@@ -0,0 +1,276 @@
1
+ /**
2
+ * CollapsibleLayout Schema - Data model for collapsible layout component
3
+ *
4
+ * Advanced expandable/collapsible container with header controls, animations,
5
+ * content management, and state persistence capabilities.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+
10
+ import {
11
+ Schema,
12
+ Field,
13
+ Editor,
14
+ Model,
15
+ FieldType
16
+ } from '@qwickapps/schema';
17
+ import { IsOptional, IsString, IsBoolean, IsIn } from 'class-validator';
18
+
19
+ @Schema('CollapsibleLayout', '1.0.0')
20
+ export class CollapsibleLayoutModel extends Model {
21
+
22
+ // ========================================
23
+ // Core Collapse Control
24
+ // ========================================
25
+
26
+ @Field({ defaultValue: false })
27
+ @Editor({
28
+ field_type: FieldType.BOOLEAN,
29
+ label: 'Collapsed',
30
+ description: 'Whether the layout is currently collapsed'
31
+ })
32
+ @IsOptional()
33
+ @IsBoolean()
34
+ collapsed?: boolean;
35
+
36
+ @Field({ defaultValue: false })
37
+ @Editor({
38
+ field_type: FieldType.BOOLEAN,
39
+ label: 'Default Collapsed',
40
+ description: 'Initial collapsed state for uncontrolled usage'
41
+ })
42
+ @IsOptional()
43
+ @IsBoolean()
44
+ defaultCollapsed?: boolean;
45
+
46
+ // ========================================
47
+ // Enhanced Header Configuration
48
+ // ========================================
49
+
50
+ @Field()
51
+ @Editor({
52
+ field_type: FieldType.TEXT,
53
+ label: 'Title',
54
+ description: 'Main title displayed in the header',
55
+ placeholder: 'Enter title...'
56
+ })
57
+ @IsOptional()
58
+ @IsString()
59
+ title?: string;
60
+
61
+ @Field()
62
+ @Editor({
63
+ field_type: FieldType.TEXT,
64
+ label: 'Subtitle',
65
+ description: 'Secondary text displayed below the title',
66
+ placeholder: 'Enter subtitle...'
67
+ })
68
+ @IsOptional()
69
+ @IsString()
70
+ subtitle?: string;
71
+
72
+ @Field()
73
+ @Editor({
74
+ field_type: FieldType.TEXT,
75
+ label: 'Lead Icon',
76
+ description: 'Icon displayed before the title (icon identifier or HTML)',
77
+ placeholder: 'Icon identifier...'
78
+ })
79
+ @IsOptional()
80
+ @IsString()
81
+ leadIcon?: string;
82
+
83
+ @Field()
84
+ @Editor({
85
+ field_type: FieldType.TEXTAREA,
86
+ label: 'Header Actions',
87
+ description: 'Additional controls displayed in header (HTML/React content)',
88
+ placeholder: 'Enter header actions HTML...'
89
+ })
90
+ @IsOptional()
91
+ @IsString()
92
+ headerActions?: string;
93
+
94
+ // ========================================
95
+ // Content Management
96
+ // ========================================
97
+
98
+ @Field()
99
+ @Editor({
100
+ field_type: FieldType.TEXTAREA,
101
+ label: 'Collapsed View',
102
+ description: 'Summary content shown when collapsed (HTML supported)',
103
+ placeholder: 'Enter collapsed view content...'
104
+ })
105
+ @IsOptional()
106
+ @IsString()
107
+ collapsedView?: string;
108
+
109
+ @Field()
110
+ @Editor({
111
+ field_type: FieldType.TEXTAREA,
112
+ label: 'Content',
113
+ description: 'Main content shown when expanded (HTML supported)',
114
+ placeholder: 'Enter main content...'
115
+ })
116
+ @IsOptional()
117
+ @IsString()
118
+ children?: string;
119
+
120
+ @Field()
121
+ @Editor({
122
+ field_type: FieldType.TEXTAREA,
123
+ label: 'Footer View',
124
+ description: 'Always visible footer content (HTML supported)',
125
+ placeholder: 'Enter footer content...'
126
+ })
127
+ @IsOptional()
128
+ @IsString()
129
+ footerView?: string;
130
+
131
+ // ========================================
132
+ // Advanced Features
133
+ // ========================================
134
+
135
+ @Field({ defaultValue: 'header' })
136
+ @Editor({
137
+ field_type: FieldType.SELECT,
138
+ label: 'Trigger Area',
139
+ description: 'Area that responds to clicks for toggle functionality',
140
+ validation: {
141
+ options: [
142
+ { label: 'Button Only', value: 'button' },
143
+ { label: 'Header Area', value: 'header' },
144
+ { label: 'Button and Header', value: 'both' }
145
+ ]
146
+ }
147
+ })
148
+ @IsOptional()
149
+ @IsIn(['button', 'header', 'both'])
150
+ triggerArea?: 'button' | 'header' | 'both';
151
+
152
+ @Field({ defaultValue: 'slide' })
153
+ @Editor({
154
+ field_type: FieldType.SELECT,
155
+ label: 'Animation Style',
156
+ description: 'Animation variant for expand/collapse transitions',
157
+ validation: {
158
+ options: [
159
+ { label: 'Fade', value: 'fade' },
160
+ { label: 'Slide', value: 'slide' },
161
+ { label: 'Scale', value: 'scale' }
162
+ ]
163
+ }
164
+ })
165
+ @IsOptional()
166
+ @IsIn(['fade', 'slide', 'scale'])
167
+ animationStyle?: 'fade' | 'slide' | 'scale';
168
+
169
+ @Field({ defaultValue: false })
170
+ @Editor({
171
+ field_type: FieldType.BOOLEAN,
172
+ label: 'Persist State',
173
+ description: 'Save collapse state in local storage'
174
+ })
175
+ @IsOptional()
176
+ @IsBoolean()
177
+ persistState?: boolean;
178
+
179
+ // ========================================
180
+ // Icons Configuration
181
+ // ========================================
182
+
183
+ @Field()
184
+ @Editor({
185
+ field_type: FieldType.TEXT,
186
+ label: 'Collapsed Icon',
187
+ description: 'Icon shown when content is collapsed (default: VisibilityIcon)',
188
+ placeholder: 'Icon identifier...'
189
+ })
190
+ @IsOptional()
191
+ @IsString()
192
+ collapsedIcon?: string;
193
+
194
+ @Field()
195
+ @Editor({
196
+ field_type: FieldType.TEXT,
197
+ label: 'Expanded Icon',
198
+ description: 'Icon shown when content is expanded (default: VisibilityOffIcon)',
199
+ placeholder: 'Icon identifier...'
200
+ })
201
+ @IsOptional()
202
+ @IsString()
203
+ expandedIcon?: string;
204
+
205
+ // ========================================
206
+ // Layout Configuration
207
+ // ========================================
208
+
209
+ @Field({ defaultValue: true })
210
+ @Editor({
211
+ field_type: FieldType.BOOLEAN,
212
+ label: 'Show Divider',
213
+ description: 'Show divider lines between header, content, and footer sections'
214
+ })
215
+ @IsOptional()
216
+ @IsBoolean()
217
+ showDivider?: boolean;
218
+
219
+ // ========================================
220
+ // Framework Integration
221
+ // ========================================
222
+
223
+ @Field({ defaultValue: 'default' })
224
+ @Editor({
225
+ field_type: FieldType.SELECT,
226
+ label: 'Variant',
227
+ description: 'Visual style variant for the layout container',
228
+ validation: {
229
+ options: [
230
+ { label: 'Default', value: 'default' },
231
+ { label: 'Outlined', value: 'outlined' },
232
+ { label: 'Elevated', value: 'elevated' },
233
+ { label: 'Filled', value: 'filled' }
234
+ ]
235
+ }
236
+ })
237
+ @IsOptional()
238
+ @IsIn(['default', 'outlined', 'elevated', 'filled'])
239
+ variant?: 'default' | 'outlined' | 'elevated' | 'filled';
240
+
241
+ @Field({ defaultValue: 'comfortable' })
242
+ @Editor({
243
+ field_type: FieldType.SELECT,
244
+ label: 'Header Spacing',
245
+ description: 'Padding/spacing within the header area',
246
+ validation: {
247
+ options: [
248
+ { label: 'Compact', value: 'compact' },
249
+ { label: 'Comfortable', value: 'comfortable' },
250
+ { label: 'Spacious', value: 'spacious' }
251
+ ]
252
+ }
253
+ })
254
+ @IsOptional()
255
+ @IsIn(['compact', 'comfortable', 'spacious'])
256
+ headerSpacing?: 'compact' | 'comfortable' | 'spacious';
257
+
258
+ @Field({ defaultValue: 'comfortable' })
259
+ @Editor({
260
+ field_type: FieldType.SELECT,
261
+ label: 'Content Spacing',
262
+ description: 'Padding/spacing within the content area',
263
+ validation: {
264
+ options: [
265
+ { label: 'Compact', value: 'compact' },
266
+ { label: 'Comfortable', value: 'comfortable' },
267
+ { label: 'Spacious', value: 'spacious' }
268
+ ]
269
+ }
270
+ })
271
+ @IsOptional()
272
+ @IsIn(['compact', 'comfortable', 'spacious'])
273
+ contentSpacing?: 'compact' | 'comfortable' | 'spacious';
274
+ }
275
+
276
+ export default CollapsibleLayoutModel;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * SwitchInputField Schema - Data model for switch input field component
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+
7
+ import {
8
+ Schema,
9
+ Field,
10
+ Editor,
11
+ Model,
12
+ FieldType
13
+ } from '@qwickapps/schema';
14
+ import { IsOptional, IsString, IsBoolean } from 'class-validator';
15
+
16
+ @Schema('SwitchInputField', '1.0.0')
17
+ export class SwitchInputFieldModel extends Model {
18
+ @Field()
19
+ @Editor({
20
+ field_type: FieldType.TEXT,
21
+ label: 'Label',
22
+ description: 'The label text for the switch'
23
+ })
24
+ @IsOptional()
25
+ @IsString()
26
+ label?: string;
27
+
28
+ @Field({ defaultValue: false })
29
+ @Editor({
30
+ field_type: FieldType.BOOLEAN,
31
+ label: 'Checked',
32
+ description: 'Whether the switch is checked'
33
+ })
34
+ @IsOptional()
35
+ @IsBoolean()
36
+ checked?: boolean;
37
+
38
+ @Field({ defaultValue: false })
39
+ @Editor({
40
+ field_type: FieldType.BOOLEAN,
41
+ label: 'Required',
42
+ description: 'Whether the field is required'
43
+ })
44
+ @IsOptional()
45
+ @IsBoolean()
46
+ required?: boolean;
47
+
48
+ @Field({ defaultValue: false })
49
+ @Editor({
50
+ field_type: FieldType.BOOLEAN,
51
+ label: 'Disabled',
52
+ description: 'Whether the field is disabled'
53
+ })
54
+ @IsOptional()
55
+ @IsBoolean()
56
+ disabled?: boolean;
57
+
58
+ @Field()
59
+ @Editor({
60
+ field_type: FieldType.TEXT,
61
+ label: 'Error',
62
+ description: 'Error message to display'
63
+ })
64
+ @IsOptional()
65
+ @IsString()
66
+ error?: string;
67
+
68
+ @Field()
69
+ @Editor({
70
+ field_type: FieldType.TEXT,
71
+ label: 'Helper Text',
72
+ description: 'Helper text to display below the switch'
73
+ })
74
+ @IsOptional()
75
+ @IsString()
76
+ helperText?: string;
77
+
78
+ @Field({ defaultValue: 'medium' })
79
+ @Editor({
80
+ field_type: FieldType.SELECT,
81
+ label: 'Size',
82
+ description: 'Size of the switch'
83
+ })
84
+ @IsOptional()
85
+ @IsString()
86
+ size?: 'small' | 'medium';
87
+
88
+ @Field({ defaultValue: 'primary' })
89
+ @Editor({
90
+ field_type: FieldType.SELECT,
91
+ label: 'Color',
92
+ description: 'Color theme of the switch'
93
+ })
94
+ @IsOptional()
95
+ @IsString()
96
+ color?: 'default' | 'primary' | 'secondary' | 'error' | 'info' | 'success' | 'warning';
97
+ }
98
+
99
+ export default SwitchInputFieldModel;