@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
@@ -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
- * - Base props support for grid behavior and styling
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 { useBaseProps, WithBaseProps, QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
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
- interface FormCheckboxBaseProps {
24
- label: string;
25
- checked: boolean;
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
- export interface FormCheckboxProps extends WithBaseProps<FormCheckboxBaseProps> {}
33
-
34
- export const FormCheckbox = React.forwardRef<HTMLDivElement, FormCheckboxProps>((props, ref) => {
35
- const { gridProps, styleProps, htmlProps, restProps } = useBaseProps(props);
36
-
37
- const {
38
- label,
39
- checked,
40
- onChange,
41
- helperText,
42
- required = false,
43
- disabled = false,
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', // Align with checkbox + label
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
- // Mark as QwickApp component
114
- Object.assign(FormCheckbox, { [QWICKAPP_COMPONENT]: true });
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, and Select
7
+ * - Integrated with MUI FormControl, Input
8
8
  * - Handles readonly, disabled, and required states
9
9
  * - Support for adornments and helper text
10
- * - Base props support for grid behavior and styling
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 { useBaseProps, WithBaseProps, QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
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
- export interface FormFieldOption {
26
- value: string | number;
27
- label: string;
28
- }
29
-
30
- interface FormFieldBaseProps {
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
- type?: 'text' | 'number' | 'password' | 'email' | 'tel';
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
- export interface FormFieldProps extends WithBaseProps<FormFieldBaseProps> {}
51
-
52
- export const FormField = React.forwardRef<HTMLDivElement, FormFieldProps>((props, ref) => {
53
- const { gridProps, styleProps, htmlProps, restProps } = useBaseProps(props);
54
-
55
- const {
56
- label,
57
- value,
58
- onChange,
59
- onChangeRaw,
60
- type = 'text',
61
- helperText,
62
- required = false,
63
- readOnly = false,
64
- disabled = false,
65
- disabledColor,
66
- fullWidth = true,
67
- multiline = false,
68
- rows,
69
- placeholder,
70
- startAdornment,
71
- endAdornment,
72
- inputProps,
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
- {...htmlProps}
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
- // Mark as QwickApp component
178
- Object.assign(FormField, { [QWICKAPP_COMPONENT]: true });
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
- * - Base props support for grid behavior and styling
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 { useBaseProps, WithBaseProps, QWICKAPP_COMPONENT } from '../../hooks/useBaseProps';
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
- interface FormSelectBaseProps {
30
- label?: string;
31
- value: string | number;
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
- export interface FormSelectProps extends WithBaseProps<FormSelectBaseProps> {}
43
-
44
- export const FormSelect = React.forwardRef<HTMLDivElement, FormSelectProps>((props, ref) => {
45
- const { gridProps, styleProps, htmlProps, restProps } = useBaseProps(props);
46
-
47
- const {
48
- label,
49
- value,
50
- onChange,
51
- options,
52
- helperText,
53
- required = false,
54
- disabled = false,
55
- fullWidth = true,
56
- size = 'small',
57
- placeholder,
58
- } = restProps as FormSelectBaseProps;
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
- {...htmlProps}
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
- // Mark as QwickApp component
138
- Object.assign(FormSelect, { [QWICKAPP_COMPONENT]: true });
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;