@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.
- package/dist/components/Scaffold.d.ts +2 -2
- package/dist/components/Scaffold.d.ts.map +1 -1
- package/dist/components/forms/Captcha.d.ts +33 -28
- package/dist/components/forms/Captcha.d.ts.map +1 -1
- package/dist/components/forms/FormCheckbox.d.ts +15 -12
- package/dist/components/forms/FormCheckbox.d.ts.map +1 -1
- package/dist/components/forms/FormField.d.ts +20 -23
- package/dist/components/forms/FormField.d.ts.map +1 -1
- package/dist/components/forms/FormSelect.d.ts +16 -15
- package/dist/components/forms/FormSelect.d.ts.map +1 -1
- package/dist/contexts/QwickAppContext.d.ts +1 -1
- package/dist/contexts/QwickAppContext.d.ts.map +1 -1
- package/dist/hooks/useBaseProps.d.ts +27 -1172
- package/dist/hooks/useBaseProps.d.ts.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +393 -160
- package/dist/index.js +393 -159
- package/dist/palettes/PaletteBoutique.d.ts +10 -0
- package/dist/palettes/PaletteBoutique.d.ts.map +1 -0
- package/dist/palettes/index.d.ts +1 -0
- package/dist/palettes/index.d.ts.map +1 -1
- package/dist/palettes/manifest.json +33 -19
- package/dist/palettes/{palette-autumn.1.5.13.css → palette-autumn.1.7.0.css} +3 -1
- package/dist/palettes/palette-autumn.1.7.0.min.css +1 -0
- package/dist/palettes/palette-autumn.latest.css +3 -1
- package/dist/palettes/palette-autumn.latest.min.css +1 -1
- package/dist/palettes/palette-boutique.1.7.0.css +176 -0
- package/dist/palettes/palette-boutique.1.7.0.min.css +1 -0
- package/dist/palettes/palette-boutique.latest.css +176 -0
- package/dist/palettes/palette-boutique.latest.min.css +1 -0
- package/dist/palettes/{palette-cosmic.1.5.13.css → palette-cosmic.1.7.0.css} +3 -1
- package/dist/palettes/palette-cosmic.1.7.0.min.css +1 -0
- package/dist/palettes/palette-cosmic.latest.css +3 -1
- package/dist/palettes/palette-cosmic.latest.min.css +1 -1
- package/dist/palettes/{palette-ocean.1.5.13.css → palette-ocean.1.7.0.css} +3 -1
- package/dist/palettes/palette-ocean.1.7.0.min.css +1 -0
- package/dist/palettes/palette-ocean.latest.css +3 -1
- package/dist/palettes/palette-ocean.latest.min.css +1 -1
- package/dist/palettes/{palette-spring.1.5.13.css → palette-spring.1.7.0.css} +3 -1
- package/dist/palettes/palette-spring.1.7.0.min.css +1 -0
- package/dist/palettes/palette-spring.latest.css +3 -1
- package/dist/palettes/palette-spring.latest.min.css +1 -1
- package/dist/palettes/{palette-winter.1.5.13.css → palette-winter.1.7.0.css} +3 -1
- package/dist/palettes/palette-winter.1.7.0.min.css +1 -0
- package/dist/palettes/palette-winter.latest.css +3 -1
- package/dist/palettes/palette-winter.latest.min.css +1 -1
- package/dist/schemas/CaptchaSchema.d.ts +16 -0
- package/dist/schemas/CaptchaSchema.d.ts.map +1 -0
- package/dist/schemas/FormCheckboxSchema.d.ts +16 -0
- package/dist/schemas/FormCheckboxSchema.d.ts.map +1 -0
- package/dist/schemas/FormFieldSchema.d.ts +23 -0
- package/dist/schemas/FormFieldSchema.d.ts.map +1 -0
- package/dist/schemas/FormSelectSchema.d.ts +20 -0
- package/dist/schemas/FormSelectSchema.d.ts.map +1 -0
- package/dist/schemas/index.d.ts +4 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/transformers/ComponentTransformer.d.ts +1 -0
- package/dist/schemas/transformers/ComponentTransformer.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/components/QwickApp.css +22 -0
- package/src/components/Scaffold.css +5 -0
- package/src/components/Scaffold.tsx +5 -3
- package/src/components/forms/Captcha.tsx +57 -63
- package/src/components/forms/FormCheckbox.tsx +35 -43
- package/src/components/forms/FormField.tsx +50 -66
- package/src/components/forms/FormSelect.tsx +41 -49
- package/src/contexts/QwickAppContext.tsx +1 -1
- package/src/hooks/useBaseProps.ts +34 -1
- package/src/palettes/PaletteAutumn.css +3 -1
- package/src/palettes/PaletteBoutique.css +176 -0
- package/src/palettes/PaletteBoutique.ts +16 -0
- package/src/palettes/PaletteCosmic.css +3 -1
- package/src/palettes/PaletteOcean.css +3 -1
- package/src/palettes/PaletteSpring.css +3 -1
- package/src/palettes/PaletteWinter.css +3 -1
- package/src/palettes/index.ts +3 -0
- package/src/palettes/manifest.json +12 -1
- package/src/schemas/CaptchaSchema.ts +65 -0
- package/src/schemas/FormCheckboxSchema.ts +65 -0
- package/src/schemas/FormFieldSchema.ts +140 -0
- package/src/schemas/FormSelectSchema.ts +108 -0
- package/src/schemas/index.ts +4 -0
- package/src/schemas/transformers/ComponentTransformer.ts +32 -2
- package/dist/palettes/palette-autumn.1.5.13.min.css +0 -1
- package/dist/palettes/palette-cosmic.1.5.13.min.css +0 -1
- package/dist/palettes/palette-ocean.1.5.13.min.css +0 -1
- package/dist/palettes/palette-spring.1.5.13.min.css +0 -1
- package/dist/palettes/palette-winter.1.5.13.min.css +0 -1
- /package/dist/palettes/{palette-default.1.5.13.css → palette-default.1.7.0.css} +0 -0
- /package/dist/palettes/{palette-default.1.5.13.min.css → palette-default.1.7.0.min.css} +0 -0
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - Supports FormControlLabel for proper label positioning
|
|
7
7
|
* - Handles required and disabled states
|
|
8
8
|
* - Helper text support
|
|
9
|
-
* -
|
|
9
|
+
* - Schema-driven architecture with serialization support
|
|
10
10
|
*
|
|
11
11
|
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
12
12
|
*/
|
|
@@ -18,31 +18,32 @@ import {
|
|
|
18
18
|
Checkbox,
|
|
19
19
|
FormHelperText,
|
|
20
20
|
} from '@mui/material';
|
|
21
|
-
import {
|
|
21
|
+
import type { SchemaProps } from '@qwickapps/schema';
|
|
22
|
+
import FormCheckboxModel from '../../schemas/FormCheckboxSchema';
|
|
23
|
+
import { ViewProps } from '../shared/viewProps';
|
|
24
|
+
import { createSerializableView, SerializableComponent } from '../shared/createSerializableView';
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Props interface for FormCheckbox component
|
|
28
|
+
* Combines schema props with callback handler
|
|
29
|
+
*/
|
|
30
|
+
export interface FormCheckboxProps extends ViewProps, SchemaProps<typeof FormCheckboxModel> {
|
|
31
|
+
/** Callback when checkbox state changes */
|
|
26
32
|
onChange: (checked: boolean) => void;
|
|
27
|
-
helperText?: string;
|
|
28
|
-
required?: boolean;
|
|
29
|
-
disabled?: boolean;
|
|
30
33
|
}
|
|
31
34
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
} = restProps as FormCheckboxBaseProps;
|
|
45
|
-
|
|
35
|
+
/**
|
|
36
|
+
* FormCheckboxView - Pure view component that renders the checkbox
|
|
37
|
+
*/
|
|
38
|
+
function FormCheckboxView({
|
|
39
|
+
label,
|
|
40
|
+
checked,
|
|
41
|
+
onChange,
|
|
42
|
+
helperText,
|
|
43
|
+
required = false,
|
|
44
|
+
disabled = false,
|
|
45
|
+
...restProps
|
|
46
|
+
}: FormCheckboxProps) {
|
|
46
47
|
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
47
48
|
onChange(e.target.checked);
|
|
48
49
|
};
|
|
@@ -65,29 +66,15 @@ export const FormCheckbox = React.forwardRef<HTMLDivElement, FormCheckboxProps>(
|
|
|
65
66
|
'& .MuiFormControlLabel-label.Mui-disabled': {
|
|
66
67
|
color: 'var(--theme-text-disabled)',
|
|
67
68
|
},
|
|
68
|
-
...styleProps.sx,
|
|
69
69
|
};
|
|
70
70
|
|
|
71
71
|
const helperTextStyles = {
|
|
72
72
|
color: 'var(--theme-secondary)',
|
|
73
|
-
marginLeft: '32px',
|
|
73
|
+
marginLeft: '32px',
|
|
74
74
|
};
|
|
75
75
|
|
|
76
76
|
return (
|
|
77
|
-
<FormControl
|
|
78
|
-
ref={ref}
|
|
79
|
-
{...htmlProps}
|
|
80
|
-
{...styleProps}
|
|
81
|
-
// Store grid props as data attributes for ColumnLayout to pick up
|
|
82
|
-
{...(gridProps && {
|
|
83
|
-
'data-grid-span': gridProps.span,
|
|
84
|
-
'data-grid-xs': gridProps.xs,
|
|
85
|
-
'data-grid-sm': gridProps.sm,
|
|
86
|
-
'data-grid-md': gridProps.md,
|
|
87
|
-
'data-grid-lg': gridProps.lg,
|
|
88
|
-
'data-grid-xl': gridProps.xl,
|
|
89
|
-
})}
|
|
90
|
-
>
|
|
77
|
+
<FormControl {...restProps}>
|
|
91
78
|
<FormControlLabel
|
|
92
79
|
control={
|
|
93
80
|
<Checkbox
|
|
@@ -106,11 +93,16 @@ export const FormCheckbox = React.forwardRef<HTMLDivElement, FormCheckboxProps>(
|
|
|
106
93
|
)}
|
|
107
94
|
</FormControl>
|
|
108
95
|
);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
FormCheckbox.displayName = 'FormCheckbox';
|
|
96
|
+
}
|
|
112
97
|
|
|
113
|
-
|
|
114
|
-
|
|
98
|
+
/**
|
|
99
|
+
* Create FormCheckbox component using the factory pattern
|
|
100
|
+
*/
|
|
101
|
+
export const FormCheckbox: SerializableComponent<FormCheckboxProps> = createSerializableView<FormCheckboxProps>({
|
|
102
|
+
tagName: 'FormCheckbox',
|
|
103
|
+
version: '1.0.0',
|
|
104
|
+
role: 'input',
|
|
105
|
+
View: FormCheckboxView,
|
|
106
|
+
});
|
|
115
107
|
|
|
116
108
|
export default FormCheckbox;
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Features:
|
|
5
5
|
* - Uses QwickApps CSS theme variables for consistent styling
|
|
6
6
|
* - Supports text, number, password, and email input types
|
|
7
|
-
* - Integrated with MUI FormControl, Input
|
|
7
|
+
* - Integrated with MUI FormControl, Input
|
|
8
8
|
* - Handles readonly, disabled, and required states
|
|
9
9
|
* - Support for adornments and helper text
|
|
10
|
-
* -
|
|
10
|
+
* - Schema-driven architecture with serialization support
|
|
11
11
|
*
|
|
12
12
|
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
13
13
|
*/
|
|
@@ -20,63 +20,54 @@ import {
|
|
|
20
20
|
FormHelperText,
|
|
21
21
|
InputAdornment,
|
|
22
22
|
} from '@mui/material';
|
|
23
|
-
import {
|
|
23
|
+
import type { SchemaProps } from '@qwickapps/schema';
|
|
24
|
+
import FormFieldModel from '../../schemas/FormFieldSchema';
|
|
25
|
+
import { ViewProps } from '../shared/viewProps';
|
|
26
|
+
import { createSerializableView, SerializableComponent } from '../shared/createSerializableView';
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
label: string;
|
|
32
|
-
value: string | number;
|
|
28
|
+
/**
|
|
29
|
+
* Props interface for FormField component
|
|
30
|
+
* Combines schema props with callback handlers and adornments
|
|
31
|
+
*/
|
|
32
|
+
export interface FormFieldProps extends ViewProps, SchemaProps<typeof FormFieldModel> {
|
|
33
|
+
/** Callback when value changes */
|
|
33
34
|
onChange?: (value: string | number) => void;
|
|
35
|
+
/** Raw change handler with event */
|
|
34
36
|
onChangeRaw?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
35
|
-
|
|
36
|
-
helperText?: string;
|
|
37
|
-
required?: boolean;
|
|
38
|
-
readOnly?: boolean;
|
|
39
|
-
disabled?: boolean;
|
|
40
|
-
disabledColor?: string;
|
|
41
|
-
fullWidth?: boolean;
|
|
42
|
-
multiline?: boolean;
|
|
43
|
-
rows?: number;
|
|
44
|
-
placeholder?: string;
|
|
37
|
+
/** Start adornment (icon, text, etc.) */
|
|
45
38
|
startAdornment?: React.ReactNode;
|
|
39
|
+
/** End adornment (icon, text, etc.) */
|
|
46
40
|
endAdornment?: React.ReactNode;
|
|
41
|
+
/** Additional input props */
|
|
47
42
|
inputProps?: unknown;
|
|
48
43
|
}
|
|
49
44
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
} = restProps as FormFieldBaseProps;
|
|
74
|
-
|
|
75
|
-
// Generate a unique ID for the input field
|
|
45
|
+
/**
|
|
46
|
+
* FormFieldView - Pure view component that renders the input field
|
|
47
|
+
*/
|
|
48
|
+
function FormFieldView({
|
|
49
|
+
label,
|
|
50
|
+
value,
|
|
51
|
+
onChange,
|
|
52
|
+
onChangeRaw,
|
|
53
|
+
type = 'text',
|
|
54
|
+
helperText,
|
|
55
|
+
required = false,
|
|
56
|
+
readOnly = false,
|
|
57
|
+
disabled = false,
|
|
58
|
+
disabledColor,
|
|
59
|
+
fullWidth = true,
|
|
60
|
+
multiline = false,
|
|
61
|
+
rows,
|
|
62
|
+
placeholder,
|
|
63
|
+
startAdornment,
|
|
64
|
+
endAdornment,
|
|
65
|
+
inputProps,
|
|
66
|
+
...restProps
|
|
67
|
+
}: FormFieldProps) {
|
|
76
68
|
const fieldId = React.useId();
|
|
77
69
|
|
|
78
70
|
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
|
79
|
-
// If onChangeRaw is provided, use it instead
|
|
80
71
|
if (onChangeRaw) {
|
|
81
72
|
onChangeRaw(e);
|
|
82
73
|
return;
|
|
@@ -107,7 +98,6 @@ export const FormField = React.forwardRef<HTMLDivElement, FormFieldProps>((props
|
|
|
107
98
|
color: disabledColor,
|
|
108
99
|
WebkitTextFillColor: disabledColor,
|
|
109
100
|
} : undefined,
|
|
110
|
-
...styleProps.sx,
|
|
111
101
|
};
|
|
112
102
|
|
|
113
103
|
const labelStyles = {
|
|
@@ -122,19 +112,8 @@ export const FormField = React.forwardRef<HTMLDivElement, FormFieldProps>((props
|
|
|
122
112
|
|
|
123
113
|
return (
|
|
124
114
|
<FormControl
|
|
125
|
-
ref={ref}
|
|
126
115
|
fullWidth={fullWidth}
|
|
127
|
-
{...
|
|
128
|
-
{...styleProps}
|
|
129
|
-
// Store grid props as data attributes for ColumnLayout to pick up
|
|
130
|
-
{...(gridProps && {
|
|
131
|
-
'data-grid-span': gridProps.span,
|
|
132
|
-
'data-grid-xs': gridProps.xs,
|
|
133
|
-
'data-grid-sm': gridProps.sm,
|
|
134
|
-
'data-grid-md': gridProps.md,
|
|
135
|
-
'data-grid-lg': gridProps.lg,
|
|
136
|
-
'data-grid-xl': gridProps.xl,
|
|
137
|
-
})}
|
|
116
|
+
{...restProps}
|
|
138
117
|
>
|
|
139
118
|
<InputLabel htmlFor={fieldId} sx={labelStyles} shrink>
|
|
140
119
|
{label}
|
|
@@ -170,11 +149,16 @@ export const FormField = React.forwardRef<HTMLDivElement, FormFieldProps>((props
|
|
|
170
149
|
)}
|
|
171
150
|
</FormControl>
|
|
172
151
|
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
FormField.displayName = 'FormField';
|
|
152
|
+
}
|
|
176
153
|
|
|
177
|
-
|
|
178
|
-
|
|
154
|
+
/**
|
|
155
|
+
* Create FormField component using the factory pattern
|
|
156
|
+
*/
|
|
157
|
+
export const FormField: SerializableComponent<FormFieldProps> = createSerializableView<FormFieldProps>({
|
|
158
|
+
tagName: 'FormField',
|
|
159
|
+
version: '1.0.0',
|
|
160
|
+
role: 'input',
|
|
161
|
+
View: FormFieldView,
|
|
162
|
+
});
|
|
179
163
|
|
|
180
164
|
export default FormField;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - Simplified select-only interface (use FormField for mixed inputs)
|
|
7
7
|
* - Support for placeholder, size variants, and helper text
|
|
8
8
|
* - Integrated with MUI FormControl and Select
|
|
9
|
-
* -
|
|
9
|
+
* - Schema-driven architecture with serialization support
|
|
10
10
|
*
|
|
11
11
|
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
12
12
|
*/
|
|
@@ -19,46 +19,45 @@ import {
|
|
|
19
19
|
MenuItem,
|
|
20
20
|
FormHelperText,
|
|
21
21
|
} from '@mui/material';
|
|
22
|
-
import {
|
|
22
|
+
import type { SchemaProps } from '@qwickapps/schema';
|
|
23
|
+
import FormSelectModel from '../../schemas/FormSelectSchema';
|
|
24
|
+
import { ViewProps } from '../shared/viewProps';
|
|
25
|
+
import { createSerializableView, SerializableComponent } from '../shared/createSerializableView';
|
|
23
26
|
|
|
24
27
|
export interface FormSelectOption {
|
|
25
28
|
value: string | number;
|
|
26
29
|
label: string;
|
|
27
30
|
}
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Props interface for FormSelect component
|
|
34
|
+
* Combines schema props with callback handlers
|
|
35
|
+
*/
|
|
36
|
+
export interface FormSelectProps extends ViewProps, SchemaProps<typeof FormSelectModel> {
|
|
37
|
+
/** Callback when value changes */
|
|
32
38
|
onChange: (value: string | number) => void;
|
|
39
|
+
/** Options array (runtime prop, overrides schema) */
|
|
33
40
|
options: FormSelectOption[];
|
|
34
|
-
helperText?: string;
|
|
35
|
-
required?: boolean;
|
|
36
|
-
disabled?: boolean;
|
|
37
|
-
fullWidth?: boolean;
|
|
38
|
-
size?: 'small' | 'medium';
|
|
39
|
-
placeholder?: string;
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const handleChange = (e: unknown) => {
|
|
61
|
-
onChange(e.target.value);
|
|
43
|
+
/**
|
|
44
|
+
* FormSelectView - Pure view component that renders the select field
|
|
45
|
+
*/
|
|
46
|
+
function FormSelectView({
|
|
47
|
+
label,
|
|
48
|
+
value,
|
|
49
|
+
onChange,
|
|
50
|
+
options,
|
|
51
|
+
helperText,
|
|
52
|
+
required = false,
|
|
53
|
+
disabled = false,
|
|
54
|
+
fullWidth = true,
|
|
55
|
+
size = 'small',
|
|
56
|
+
placeholder,
|
|
57
|
+
...restProps
|
|
58
|
+
}: FormSelectProps) {
|
|
59
|
+
const handleChange = (e: { target: { value: unknown } }) => {
|
|
60
|
+
onChange(e.target.value as string | number);
|
|
62
61
|
};
|
|
63
62
|
|
|
64
63
|
const selectStyles = {
|
|
@@ -69,7 +68,6 @@ export const FormSelect = React.forwardRef<HTMLDivElement, FormSelectProps>((pro
|
|
|
69
68
|
borderColor: 'var(--theme-surface)',
|
|
70
69
|
color: 'var(--theme-text-primary)',
|
|
71
70
|
borderRadius: 1,
|
|
72
|
-
...styleProps.sx,
|
|
73
71
|
};
|
|
74
72
|
|
|
75
73
|
const labelStyles = {
|
|
@@ -84,20 +82,9 @@ export const FormSelect = React.forwardRef<HTMLDivElement, FormSelectProps>((pro
|
|
|
84
82
|
|
|
85
83
|
return (
|
|
86
84
|
<FormControl
|
|
87
|
-
ref={ref}
|
|
88
85
|
fullWidth={fullWidth}
|
|
89
86
|
size={size}
|
|
90
|
-
{...
|
|
91
|
-
{...styleProps}
|
|
92
|
-
// Store grid props as data attributes for ColumnLayout to pick up
|
|
93
|
-
{...(gridProps && {
|
|
94
|
-
'data-grid-span': gridProps.span,
|
|
95
|
-
'data-grid-xs': gridProps.xs,
|
|
96
|
-
'data-grid-sm': gridProps.sm,
|
|
97
|
-
'data-grid-md': gridProps.md,
|
|
98
|
-
'data-grid-lg': gridProps.lg,
|
|
99
|
-
'data-grid-xl': gridProps.xl,
|
|
100
|
-
})}
|
|
87
|
+
{...restProps}
|
|
101
88
|
>
|
|
102
89
|
{label && (
|
|
103
90
|
<InputLabel sx={labelStyles} shrink>
|
|
@@ -130,11 +117,16 @@ export const FormSelect = React.forwardRef<HTMLDivElement, FormSelectProps>((pro
|
|
|
130
117
|
)}
|
|
131
118
|
</FormControl>
|
|
132
119
|
);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
FormSelect.displayName = 'FormSelect';
|
|
120
|
+
}
|
|
136
121
|
|
|
137
|
-
|
|
138
|
-
|
|
122
|
+
/**
|
|
123
|
+
* Create FormSelect component using the factory pattern
|
|
124
|
+
*/
|
|
125
|
+
export const FormSelect: SerializableComponent<FormSelectProps> = createSerializableView<FormSelectProps>({
|
|
126
|
+
tagName: 'FormSelect',
|
|
127
|
+
version: '1.0.0',
|
|
128
|
+
role: 'input',
|
|
129
|
+
View: FormSelectView,
|
|
130
|
+
});
|
|
139
131
|
|
|
140
132
|
export default FormSelect;
|
|
@@ -28,7 +28,7 @@ export interface QwickAppProps {
|
|
|
28
28
|
enableScaffolding?: boolean;
|
|
29
29
|
/** Primary navigation items for scaffolding */
|
|
30
30
|
navigationItems?: MenuItem[];
|
|
31
|
-
/** App bar configuration for scaffolding */
|
|
31
|
+
/** App bar configuration for scaffolding - use render function for actions to cross server/client boundaries safely */
|
|
32
32
|
appBar?: ScaffoldProps['appBar'];
|
|
33
33
|
/** Whether to show app bar when scaffolding is enabled (default: true) */
|
|
34
34
|
showAppBar?: boolean;
|
|
@@ -82,10 +82,43 @@ export interface BaseComponentProps {
|
|
|
82
82
|
*/
|
|
83
83
|
export const QWICKAPP_COMPONENT = Symbol('QwickAppComponent');
|
|
84
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Return type for useBaseProps hook
|
|
87
|
+
*/
|
|
88
|
+
export interface BasePropsResult<T extends BaseComponentProps> {
|
|
89
|
+
gridProps: {
|
|
90
|
+
span?: number | 'auto' | 'grow';
|
|
91
|
+
xs?: number | 'auto';
|
|
92
|
+
sm?: number | 'auto';
|
|
93
|
+
md?: number | 'auto';
|
|
94
|
+
lg?: number | 'auto';
|
|
95
|
+
xl?: number | 'auto';
|
|
96
|
+
} | null;
|
|
97
|
+
styleProps: {
|
|
98
|
+
className?: string;
|
|
99
|
+
sx?: SxProps<Theme>;
|
|
100
|
+
style?: React.CSSProperties;
|
|
101
|
+
};
|
|
102
|
+
htmlProps: {
|
|
103
|
+
id?: string;
|
|
104
|
+
role?: string;
|
|
105
|
+
'aria-label'?: string;
|
|
106
|
+
'aria-labelledby'?: string;
|
|
107
|
+
'aria-describedby'?: string;
|
|
108
|
+
'data-testid'?: string;
|
|
109
|
+
onClick?: React.MouseEventHandler<unknown>;
|
|
110
|
+
onMouseEnter?: React.MouseEventHandler<unknown>;
|
|
111
|
+
onMouseLeave?: React.MouseEventHandler<unknown>;
|
|
112
|
+
onFocus?: React.FocusEventHandler<unknown>;
|
|
113
|
+
onBlur?: React.FocusEventHandler<unknown>;
|
|
114
|
+
};
|
|
115
|
+
restProps: Omit<T, keyof BaseComponentProps>;
|
|
116
|
+
}
|
|
117
|
+
|
|
85
118
|
/**
|
|
86
119
|
* Hook to process base component props
|
|
87
120
|
*/
|
|
88
|
-
export function useBaseProps<T extends BaseComponentProps>(props: T) {
|
|
121
|
+
export function useBaseProps<T extends BaseComponentProps>(props: T): BasePropsResult<T> {
|
|
89
122
|
const {
|
|
90
123
|
// Grid props
|
|
91
124
|
span,
|
|
@@ -61,12 +61,14 @@ html[data-palette="autumn"][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 */
|
|
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 - Teal */
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boutique Color Palette
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Sophisticated teal, bronze, and navy - perfect for premium retail and fashion brands
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* ===== BOUTIQUE PALETTE - LIGHT THEME ===== */
|
|
10
|
+
html[data-palette="boutique"]:not([data-theme="dark"]),
|
|
11
|
+
html[data-palette="boutique"][data-theme="light"] {
|
|
12
|
+
/* Primary palette - Teal */
|
|
13
|
+
--palette-primary-main: #3ca6b6;
|
|
14
|
+
--palette-primary-light: #6bc4d1;
|
|
15
|
+
--palette-primary-dark: #2a7a86;
|
|
16
|
+
--palette-on-primary: #ffffff;
|
|
17
|
+
|
|
18
|
+
/* Secondary palette - Bronze */
|
|
19
|
+
--palette-secondary-main: #be765e;
|
|
20
|
+
--palette-secondary-light: #d4987e;
|
|
21
|
+
--palette-secondary-dark: #9a5742;
|
|
22
|
+
--palette-on-secondary: #ffffff;
|
|
23
|
+
|
|
24
|
+
/* Surface palette - Warm ivory */
|
|
25
|
+
--palette-surface-main: #fefcf8;
|
|
26
|
+
--palette-surface-variant: #f5f0ea;
|
|
27
|
+
--palette-surface-elevated: #ffffff;
|
|
28
|
+
--palette-on-surface: #2c2520;
|
|
29
|
+
|
|
30
|
+
/* Background palette - Soft cream */
|
|
31
|
+
--palette-background-main: #fffdf9;
|
|
32
|
+
--palette-background-dark: #f8f4ed;
|
|
33
|
+
--palette-background-overlay: rgba(255, 253, 249, 0.95);
|
|
34
|
+
--palette-on-background: #3d3530;
|
|
35
|
+
|
|
36
|
+
/* Header background with transparency */
|
|
37
|
+
--palette-header-bg-start: rgba(255, 253, 249, 0.98);
|
|
38
|
+
--palette-header-bg-end: rgba(255, 253, 249, 0.95);
|
|
39
|
+
--palette-header-collapsed-bg-start: rgba(255, 253, 249, 0.99);
|
|
40
|
+
--palette-header-collapsed-bg-end: rgba(255, 253, 249, 0.96);
|
|
41
|
+
|
|
42
|
+
/* Text palette - Deep brown */
|
|
43
|
+
--palette-text-primary: #2c2520;
|
|
44
|
+
--palette-text-secondary: #5d5349;
|
|
45
|
+
--palette-text-disabled: rgba(44, 37, 32, 0.38);
|
|
46
|
+
--palette-text-inverted: #ffffff;
|
|
47
|
+
|
|
48
|
+
/* Border palette - Soft taupe */
|
|
49
|
+
--palette-border-main: #d4cdc4;
|
|
50
|
+
--palette-border-light: rgba(44, 37, 32, 0.12);
|
|
51
|
+
--palette-border-lighter: rgba(44, 37, 32, 0.05);
|
|
52
|
+
--palette-border-medium: #b8afa4;
|
|
53
|
+
|
|
54
|
+
/* Success palette - Emerald */
|
|
55
|
+
--palette-success-main: #10b981;
|
|
56
|
+
--palette-success-light: #d1fae5;
|
|
57
|
+
--palette-success-dark: #047857;
|
|
58
|
+
--palette-success-border: #a7f3d0;
|
|
59
|
+
|
|
60
|
+
/* Error palette - Rose */
|
|
61
|
+
--palette-error-main: #f43f5e;
|
|
62
|
+
--palette-error-light: #ffe4e6;
|
|
63
|
+
--palette-error-dark: #9f1239;
|
|
64
|
+
--palette-on-error: #ffffff;
|
|
65
|
+
--palette-error-border: #fecdd3;
|
|
66
|
+
|
|
67
|
+
/* Warning palette - Amber */
|
|
68
|
+
--palette-warning-main: #f59e0b;
|
|
69
|
+
--palette-warning-light: #fef3c7;
|
|
70
|
+
--palette-warning-dark: #d97706;
|
|
71
|
+
--palette-on-warning: #000000;
|
|
72
|
+
--palette-warning-border: #fde68a;
|
|
73
|
+
|
|
74
|
+
/* Info palette - Sky blue */
|
|
75
|
+
--palette-info-main: #0284c7;
|
|
76
|
+
--palette-info-light: #e0f2fe;
|
|
77
|
+
--palette-info-dark: #075985;
|
|
78
|
+
--palette-on-info: #ffffff;
|
|
79
|
+
--palette-info-border: #7dd3fc;
|
|
80
|
+
|
|
81
|
+
/* Accent palette - Navy */
|
|
82
|
+
--palette-accent-main: #0a1a3e;
|
|
83
|
+
--palette-accent-light: #1e3a73;
|
|
84
|
+
--palette-accent-dark: #050d1f;
|
|
85
|
+
--palette-on-accent: #ffffff;
|
|
86
|
+
|
|
87
|
+
/* Control palette - Deep teal */
|
|
88
|
+
--palette-control-main: #2a7a86;
|
|
89
|
+
--palette-control-light: #3ca6b6;
|
|
90
|
+
--palette-control-text: #ffffff;
|
|
91
|
+
--palette-control-border: #217380;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* ===== BOUTIQUE PALETTE - DARK THEME ===== */
|
|
95
|
+
html[data-palette="boutique"][data-theme="dark"] {
|
|
96
|
+
/* Primary palette - Bright teal */
|
|
97
|
+
--palette-primary-main: #6bc4d1;
|
|
98
|
+
--palette-primary-light: #8fd5de;
|
|
99
|
+
--palette-primary-dark: #3ca6b6;
|
|
100
|
+
--palette-on-primary: #0a1a1d;
|
|
101
|
+
|
|
102
|
+
/* Secondary palette - Warm bronze */
|
|
103
|
+
--palette-secondary-main: #d4987e;
|
|
104
|
+
--palette-secondary-light: #e3b9a4;
|
|
105
|
+
--palette-secondary-dark: #be765e;
|
|
106
|
+
--palette-on-secondary: #1a1210;
|
|
107
|
+
|
|
108
|
+
/* Surface palette - Charcoal */
|
|
109
|
+
--palette-surface-main: #1a1614;
|
|
110
|
+
--palette-surface-variant: #252220;
|
|
111
|
+
--palette-surface-elevated: #332f2c;
|
|
112
|
+
--palette-on-surface: #f5f0ea;
|
|
113
|
+
|
|
114
|
+
/* Background palette - Deep slate */
|
|
115
|
+
--palette-background-main: #0f0d0c;
|
|
116
|
+
--palette-background-dark: #1a1614;
|
|
117
|
+
--palette-background-overlay: rgba(26, 22, 20, 0.95);
|
|
118
|
+
--palette-on-background: #e8e4de;
|
|
119
|
+
|
|
120
|
+
/* Header background with transparency */
|
|
121
|
+
--palette-header-bg-start: rgba(15, 13, 12, 0.98);
|
|
122
|
+
--palette-header-bg-end: rgba(15, 13, 12, 0.95);
|
|
123
|
+
--palette-header-collapsed-bg-start: rgba(15, 13, 12, 0.99);
|
|
124
|
+
--palette-header-collapsed-bg-end: rgba(15, 13, 12, 0.96);
|
|
125
|
+
|
|
126
|
+
/* Text palette - Warm light */
|
|
127
|
+
--palette-text-primary: #f5f0ea;
|
|
128
|
+
--palette-text-secondary: #cdc5bc;
|
|
129
|
+
--palette-text-disabled: rgba(245, 240, 234, 0.38);
|
|
130
|
+
--palette-text-inverted: #0f0d0c;
|
|
131
|
+
|
|
132
|
+
/* Border palette - Warm gray */
|
|
133
|
+
--palette-border-main: #4a4440;
|
|
134
|
+
--palette-border-light: rgba(245, 240, 234, 0.12);
|
|
135
|
+
--palette-border-lighter: rgba(245, 240, 234, 0.05);
|
|
136
|
+
--palette-border-medium: #3d3833;
|
|
137
|
+
|
|
138
|
+
/* Success palette - Bright emerald */
|
|
139
|
+
--palette-success-main: #34d399;
|
|
140
|
+
--palette-success-light: #064e3b;
|
|
141
|
+
--palette-success-dark: #10b981;
|
|
142
|
+
--palette-success-border: #065f46;
|
|
143
|
+
|
|
144
|
+
/* Error palette - Bright rose */
|
|
145
|
+
--palette-error-main: #fb7185;
|
|
146
|
+
--palette-error-light: #4c0519;
|
|
147
|
+
--palette-error-dark: #f43f5e;
|
|
148
|
+
--palette-on-error: #ffffff;
|
|
149
|
+
--palette-error-border: #881337;
|
|
150
|
+
|
|
151
|
+
/* Warning palette - Bright amber */
|
|
152
|
+
--palette-warning-main: #fbbf24;
|
|
153
|
+
--palette-warning-light: #451a03;
|
|
154
|
+
--palette-warning-dark: #f59e0b;
|
|
155
|
+
--palette-on-warning: #1c1917;
|
|
156
|
+
--palette-warning-border: #78350f;
|
|
157
|
+
|
|
158
|
+
/* Info palette - Bright sky */
|
|
159
|
+
--palette-info-main: #38bdf8;
|
|
160
|
+
--palette-info-light: #0c4a6e;
|
|
161
|
+
--palette-info-dark: #0284c7;
|
|
162
|
+
--palette-on-info: #ffffff;
|
|
163
|
+
--palette-info-border: #075985;
|
|
164
|
+
|
|
165
|
+
/* Accent palette - Bright navy */
|
|
166
|
+
--palette-accent-main: #3b5ba3;
|
|
167
|
+
--palette-accent-light: #5a7cc4;
|
|
168
|
+
--palette-accent-dark: #1e3a73;
|
|
169
|
+
--palette-on-accent: #ffffff;
|
|
170
|
+
|
|
171
|
+
/* Control palette - Teal glow */
|
|
172
|
+
--palette-control-main: #6bc4d1;
|
|
173
|
+
--palette-control-light: #8fd5de;
|
|
174
|
+
--palette-control-text: #0a1a1d;
|
|
175
|
+
--palette-control-border: #3ca6b6;
|
|
176
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boutique Palette Configuration
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
import "./PaletteBoutique.css";
|
|
7
|
+
import type { PaletteConfig } from '../contexts/PaletteContext';
|
|
8
|
+
|
|
9
|
+
export const PaletteBoutique: PaletteConfig = {
|
|
10
|
+
id: 'boutique',
|
|
11
|
+
name: 'Boutique',
|
|
12
|
+
description: 'Sophisticated teal, bronze, and navy - perfect for premium retail and fashion brands',
|
|
13
|
+
primaryColor: '#3ca6b6',
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default PaletteBoutique;
|